From 3026dc8a28ed81d58447e46ce8384e3717e8489b Mon Sep 17 00:00:00 2001 From: Jonathan Leitschuh Date: Tue, 11 Feb 2020 09:13:18 -0500 Subject: [PATCH 001/662] Use HTTPS instead of HTTP to resolve dependencies This fixes a security vulnerability in this project where the `pom.xml` files were configuring Maven to resolve dependencies over HTTP instead of HTTPS. Signed-off-by: Jonathan Leitschuh --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 75680581b..9b75cbdaa 100755 --- a/pom.xml +++ b/pom.xml @@ -149,7 +149,7 @@ sk89q-repo - http://maven.sk89q.com/repo/ + https://maven.sk89q.com/repo/ From bffabb4a05400d50b1750ab7a16d50d05889c549 Mon Sep 17 00:00:00 2001 From: Felix Bergmann Date: Tue, 7 Apr 2020 09:27:28 +0200 Subject: [PATCH 002/662] Fix BlockStoreConversion bug on folder check If dataDir.exists() is true, dataDir.isDirectory() will always also be true. You probably wanted to check whether it is a folder. This bug could lead to a critical bug when a file with the name of the folder exists. --- .../util/blockmeta/conversion/BlockStoreConversionMain.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 index 9558e429e..96b2f6b16 100755 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/conversion/BlockStoreConversionMain.java +++ b/src/main/java/com/gmail/nossr50/util/blockmeta/conversion/BlockStoreConversionMain.java @@ -75,7 +75,7 @@ public class BlockStoreConversionMain implements Runnable { public void softStop() { stop(); - if (this.dataDir.exists() || this.dataDir.isDirectory()) { + if (this.dataDir.exists() && this.dataDir.isDirectory()) { start(); return; } From 8dc955542d8ec28050307898888f3596e7115c42 Mon Sep 17 00:00:00 2001 From: Felix Bergmann Date: Tue, 7 Apr 2020 09:45:18 +0200 Subject: [PATCH 003/662] Introduce buffering in HashChunkletManager Improve the performance by introducing buffering. The current usage of FileInputStream and ObjectInputStream don't use buffering. --- .../com/gmail/nossr50/util/blockmeta/HashChunkletManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gmail/nossr50/util/blockmeta/HashChunkletManager.java b/src/main/java/com/gmail/nossr50/util/blockmeta/HashChunkletManager.java index f591cdafa..0302f5de3 100755 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/HashChunkletManager.java +++ b/src/main/java/com/gmail/nossr50/util/blockmeta/HashChunkletManager.java @@ -346,7 +346,7 @@ public class HashChunkletManager implements ChunkletManager { try { fileIn = new FileInputStream(location); - objIn = new ObjectInputStream(fileIn); + objIn = new ObjectInputStream(new BufferedInputStream(fileIn)); storeIn = (ChunkletStore) objIn.readObject(); } catch (IOException ex) { From 877ef153747b28a9cd7dc60917eca03acdbe0572 Mon Sep 17 00:00:00 2001 From: Felix Bergmann Date: Tue, 7 Apr 2020 09:54:57 +0200 Subject: [PATCH 004/662] Close resources in UUIDFetcher Resource leak by not closing the InputStreamReader --- src/main/java/com/gmail/nossr50/util/uuid/UUIDFetcher.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/gmail/nossr50/util/uuid/UUIDFetcher.java b/src/main/java/com/gmail/nossr50/util/uuid/UUIDFetcher.java index 995a11513..1da4ddd16 100644 --- a/src/main/java/com/gmail/nossr50/util/uuid/UUIDFetcher.java +++ b/src/main/java/com/gmail/nossr50/util/uuid/UUIDFetcher.java @@ -49,7 +49,9 @@ public class UUIDFetcher implements Callable> { String body = array.toString(); writeBody(connection, body); - JsonObject[] jsonStreamArray = gson.fromJson(new InputStreamReader(connection.getInputStream()), JsonObject[].class); + InputStreamReader tempStream = new InputStreamReader(connection.getInputStream()); + JsonObject[] jsonStreamArray = gson.fromJson(tempStream, JsonObject[].class); + tempStream.close(); for (JsonObject jsonProfile : jsonStreamArray) { String id = jsonProfile.get("id").getAsString(); From 69a4ec80cd66a12259202210d69796d4aa4a69c8 Mon Sep 17 00:00:00 2001 From: Felix Bergmann Date: Tue, 7 Apr 2020 10:02:22 +0200 Subject: [PATCH 005/662] Fix resource leak on exception When an exception is hit in the try statement, the readers will never get closed and leak resources --- .../java/com/gmail/nossr50/config/WorldBlacklist.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/config/WorldBlacklist.java b/src/main/java/com/gmail/nossr50/config/WorldBlacklist.java index a37b89b3e..76181377f 100644 --- a/src/main/java/com/gmail/nossr50/config/WorldBlacklist.java +++ b/src/main/java/com/gmail/nossr50/config/WorldBlacklist.java @@ -54,15 +54,15 @@ public class WorldBlacklist { if(!blacklist.contains(currentLine)) blacklist.add(currentLine); } - - //Close readers - bufferedReader.close(); - fileReader.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); + } finally { + //Close readers + if(bufferedReader != null) bufferedReader.close(); + if(fileReader != null) fileReader.close(); } plugin.getLogger().info(blacklist.size()+" entries in mcMMO World Blacklist"); From 6f79a43e1585f1269a62cc1556d328789cd6d8ca Mon Sep 17 00:00:00 2001 From: GwonHeeJun Date: Sat, 18 Apr 2020 02:37:57 +0900 Subject: [PATCH 006/662] [UPDATE] XpBar Translation in English to Korean - Changes the top experience bar to Korean for easier use by Korean users --- .../resources/locale/locale_ko.properties | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/main/resources/locale/locale_ko.properties b/src/main/resources/locale/locale_ko.properties index a06114f3b..ddb2ebec1 100644 --- a/src/main/resources/locale/locale_ko.properties +++ b/src/main/resources/locale/locale_ko.properties @@ -896,6 +896,27 @@ 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 +# XP BAR +XPBar.Template={0} +XPBar.Template.EarlyGameBoost=[[GOLD]]Learning a new skill... +XPBar.Acrobatics=\uACE1\uC608 Lv.[[GOLD]]{0} +XPBar.Alchemy=\uC5F0\uAE08\uC220 Lv.[[GOLD]]{0} +XPBar.Archery=\uAD81\uC220 Lv.[[GOLD]]{0} +XPBar.Axes=\uBD80\uC220 Lv.[[GOLD]]{0} +XPBar.Excavation=\uBC1C\uAD74 Lv.[[GOLD]]{0} +XPBar.Fishing=\uB09A\uC2DC Lv.[[GOLD]]{0} +XPBar.Herbalism=\uC57D\uCD08\uD559 Lv.[[GOLD]]{0} +XPBar.Mining=\uCC44\uAD11 Lv.[[GOLD]]{0} +XPBar.Repair=\uC218\uB9AC Lv.[[GOLD]]{0} +XPBar.Salvage=\uD68C\uC218 Lv.[[GOLD]]{0} +XPBar.Smelting=\uC81C\uB828 Lv.[[GOLD]]{0} +XPBar.Swords=\uAC80\uC220 Lv.[[GOLD]]{0} +XPBar.Taming=\uC870\uB828 Lv.[[GOLD]]{0} +XPBar.Unarmed=\uBE44\uBB34\uC7A5 Lv.[[GOLD]]{0} +XPBar.Woodcutting=\uBC8C\uBAA9 Lv.[[GOLD]]{0} +XPBar.Complex.Template={0} [[DARK_AQUA]] {4}[[WHITE]]% [[DARK_AQUA]]([[WHITE]]{1}[[DARK_AQUA]]/[[WHITE]]{2}[[DARK_AQUA]]) + + #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 From 0897aefbeeafefda0d8865a03d39f0235e7c38f2 Mon Sep 17 00:00:00 2001 From: GwonHeeJun Date: Sat, 18 Apr 2020 03:03:57 +0900 Subject: [PATCH 007/662] [UPDATE] Add a phrase translation that appears when you first learn a skill --- src/main/resources/locale/locale_ko.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/locale/locale_ko.properties b/src/main/resources/locale/locale_ko.properties index ddb2ebec1..7626a7794 100644 --- a/src/main/resources/locale/locale_ko.properties +++ b/src/main/resources/locale/locale_ko.properties @@ -898,7 +898,7 @@ MOTD.Website=[[GOLD]][mcMMO] [[GREEN]]{0}[[YELLOW]] - mcMMO \uC6F9\uC0AC\uC774\u # XP BAR XPBar.Template={0} -XPBar.Template.EarlyGameBoost=[[GOLD]]Learning a new skill... +XPBar.Template.EarlyGameBoost=[[GOLD]]\uC0C8\uB85C\uC6B4\u0020\uC2A4\uD0AC\uC744\u0020\uBC30\uC6B0\uB294\u0020\uC911... XPBar.Acrobatics=\uACE1\uC608 Lv.[[GOLD]]{0} XPBar.Alchemy=\uC5F0\uAE08\uC220 Lv.[[GOLD]]{0} XPBar.Archery=\uAD81\uC220 Lv.[[GOLD]]{0} From 401e3121e668bac3a21b5c4b65ee03af708b4b7c Mon Sep 17 00:00:00 2001 From: GwonHeeJun Date: Sat, 18 Apr 2020 03:22:57 +0900 Subject: [PATCH 008/662] [UPDATE] Add Korean translations of phrases that appear during level-up --- src/main/resources/locale/locale_ko.properties | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/main/resources/locale/locale_ko.properties b/src/main/resources/locale/locale_ko.properties index 7626a7794..be68ad4f1 100644 --- a/src/main/resources/locale/locale_ko.properties +++ b/src/main/resources/locale/locale_ko.properties @@ -990,3 +990,20 @@ Profile.Loading.Success=[[GREEN]]\uB2F9\uC2E0\uC758 mcMMO \uD504\uB85C\uD30C\uC7 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. +#OVERHAULs +Overhaul.Levelup=[[BOLD]]{0} [[RESET]]\u0028\uC774\u0029\uAC00\u0020\uB808\uBCA8\u0020 [[RESET]][[GREEN]][[BOLD]]{2}[[RESET]][[WHITE]]\u0020\uB85C\u0020\uC131\uC7A5\u0020\uD588\uC2B5\uB2C8\uB2E4. +Overhaul.Name.Acrobatics=\uACE1\uC608 +Overhaul.Name.Alchemy=\uC5F0\uAE08\uC220 +Overhaul.Name.Archery=\uAD81\uC220 +Overhaul.Name.Axes=\uBD80\uC220 +Overhaul.Name.Excavation=\uBC1C\uAD74 +Overhaul.Name.Fishing=\uB09A\uC2DC +Overhaul.Name.Herbalism=\uC57D\uCD08\uD559 +Overhaul.Name.Mining=\uCC44\uAD11 +Overhaul.Name.Repair=\uC218\uB9AC +Overhaul.Name.Salvage=\uD68C\uC218 +Overhaul.Name.Smelting=\uC81C\uB828 +Overhaul.Name.Swords=\uAC80\uC220 +Overhaul.Name.Taming=\uC870\uB828 +Overhaul.Name.Unarmed=\uBE44\uBB34\uC7A5 +Overhaul.Name.Woodcutting=\uBC8C\uBAA9 From 76536f0a18e1cfb807cd5d9dff002e2b1af01b87 Mon Sep 17 00:00:00 2001 From: "Mads U. Jensen" Date: Sat, 25 Apr 2020 19:32:39 +0200 Subject: [PATCH 009/662] Update EntityListener.java (#4169) Remove debug broadcasts --- src/main/java/com/gmail/nossr50/listeners/EntityListener.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java index 3ae137164..ce6eb0b87 100644 --- a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java @@ -290,7 +290,6 @@ public class EntityListener implements Listener { if(WorldGuardUtils.isWorldGuardLoaded()) { if(attacker instanceof Player) { - Bukkit.broadcastMessage("(Player attacked something) EntityDamageEvent fired!"); if(!WorldGuardManager.getInstance().hasMainFlag((Player) attacker)) return; From 9a3b261f07fdced160759c906c5efbd85f914199 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20Marczink=C3=B3?= Date: Sun, 26 Apr 2020 17:55:01 +0200 Subject: [PATCH 010/662] Update locale_hu_HU.properties --- src/main/resources/locale/locale_hu_HU.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/locale/locale_hu_HU.properties b/src/main/resources/locale/locale_hu_HU.properties index fc239ba87..64241af72 100644 --- a/src/main/resources/locale/locale_hu_HU.properties +++ b/src/main/resources/locale/locale_hu_HU.properties @@ -894,7 +894,7 @@ Guides.Fishing.Section.0=[[DARK_AQUA]]A Horg\u00E1szatr\u00F3l:\n[[YELLOW]]Ezzel 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.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 lehet\u0151s\u00E9g van ezzel olyan \u00E9l\u0151l\u00E9ny fejeket is szerezni, amelyeket \u00E1ltal\u00E1ban 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. ##Herbalism From 145b2432e0d43afe2e1c86f95ed14f846402395d Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 27 Apr 2020 17:04:01 -0700 Subject: [PATCH 011/662] Combat fix --- Changelog.txt | 2 +- .../nossr50/util/skills/CombatUtils.java | 28 +++++++++---------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index c9fec6109..40d152a7d 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -14,7 +14,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/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java b/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java index edfbbca93..cb14dd20f 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java @@ -301,8 +301,9 @@ 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(EntityDamageByEntityEvent event, Entity painSourceRoot, LivingEntity target) { + Entity painSource = event.getDamager(); + EntityType entityType = painSource.getType(); if (target instanceof Player) { if (Misc.isNPCEntityExcludingVillagers(target)) { @@ -318,7 +319,7 @@ 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())) { @@ -328,25 +329,24 @@ public final class CombatUtils { 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); @@ -390,10 +390,10 @@ public final class CombatUtils { } 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 && PrimarySkillType.TAMING.shouldProcess(target)) { Player master = (Player) tamer; if (!Misc.isNPCEntityExcludingVillagers(master) && PrimarySkillType.TAMING.getPermissions(master)) { @@ -402,10 +402,10 @@ public final class CombatUtils { } } 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 && PrimarySkillType.ARCHERY.shouldProcess(target)) { Player player = (Player) projectileSource; if (!Misc.isNPCEntityExcludingVillagers(player) && PrimarySkillType.ARCHERY.getPermissions(player)) { From 34fe19e35c229962925506336e4ad835fb5dd3c5 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 27 Apr 2020 17:28:27 -0700 Subject: [PATCH 012/662] Less verbose unsupported material warnings --- Changelog.txt | 1 + .../config/skills/repair/RepairConfig.java | 30 +++++++++++++++---- .../config/skills/salvage/SalvageConfig.java | 30 +++++++++++++++---- .../util/compat/CompatibilityManager.java | 1 + .../nossr50/util/skills/CombatUtils.java | 2 +- 5 files changed, 52 insertions(+), 12 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 40d152a7d..1d3a5d572 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -3,6 +3,7 @@ Version 2.1.126 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. Fixed an exploit involving fishing rods + mcMMO is now less verbose about unsupported materials found in configs 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. 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..ef55f073a 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 @@ -11,15 +11,15 @@ 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 { private List repairables; + private HashSet notSupported; public RepairConfig(String fileName) { super(fileName); + notSupported = new HashSet<>(); loadKeys(); } @@ -48,7 +48,8 @@ public class RepairConfig extends ConfigLoader { 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; } @@ -95,7 +96,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; } @@ -152,6 +153,25 @@ 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() { 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..a5a6fbfd1 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 @@ -12,16 +12,15 @@ 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.util.*; public class SalvageConfig extends ConfigLoader { private List salvageables; + private HashSet notSupported; public SalvageConfig(String fileName) { super(fileName); + notSupported = new HashSet<>(); loadKeys(); } @@ -45,7 +44,7 @@ public class SalvageConfig extends ConfigLoader { 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; } @@ -94,7 +93,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; } @@ -153,6 +152,25 @@ 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() { 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..416ba2d78 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/CompatibilityManager.java +++ b/src/main/java/com/gmail/nossr50/util/compat/CompatibilityManager.java @@ -71,6 +71,7 @@ public class CompatibilityManager { } + //TODO: move to text manager public void reportCompatibilityStatus(CommandSender commandSender) { if(isFullyCompatibleServerSoftware) { commandSender.sendMessage(LocaleLoader.getString("mcMMO.Template.Prefix", 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 cb14dd20f..8f0feb6f0 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java @@ -274,7 +274,7 @@ public final class CombatUtils { } 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()) { From 2325c4eb6b308af6a50695f55afe56725f4addfe Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 27 Apr 2020 19:01:40 -0700 Subject: [PATCH 013/662] New Command mmoxpbar --- Changelog.txt | 6 + .../nossr50/commands/player/XPBarCommand.java | 104 ++++++++++++++++++ .../nossr50/datatypes/player/McMMOPlayer.java | 4 + .../nossr50/listeners/EntityListener.java | 1 - .../commands/CommandRegistrationManager.java | 8 ++ .../util/experience/ExperienceBarManager.java | 91 +++++++++++++-- .../resources/locale/locale_cs_CZ.properties | 2 + .../resources/locale/locale_cy.properties | 2 + .../resources/locale/locale_da.properties | 2 + .../resources/locale/locale_de.properties | 2 + .../resources/locale/locale_en_US.properties | 4 + .../resources/locale/locale_es.properties | 2 + .../resources/locale/locale_fi.properties | 2 + .../resources/locale/locale_fr.properties | 2 + .../resources/locale/locale_hu_HU.properties | 2 + .../resources/locale/locale_it.properties | 2 + .../resources/locale/locale_ja_JP.properties | 4 +- .../resources/locale/locale_ko.properties | 2 + .../resources/locale/locale_lt_LT.properties | 2 + .../resources/locale/locale_nl.properties | 2 + .../resources/locale/locale_pl.properties | 2 + .../resources/locale/locale_pt_BR.properties | 2 + .../resources/locale/locale_ru.properties | 2 + .../resources/locale/locale_sv.properties | 2 + .../resources/locale/locale_th_TH.properties | 2 + .../resources/locale/locale_zh_CN.properties | 2 + .../resources/locale/locale_zh_TW.properties | 2 + src/main/resources/plugin.yml | 3 + 28 files changed, 251 insertions(+), 12 deletions(-) create mode 100644 src/main/java/com/gmail/nossr50/commands/player/XPBarCommand.java diff --git a/Changelog.txt b/Changelog.txt index 1d3a5d572..be4b284e9 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -2,11 +2,17 @@ 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 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 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..0029f4844 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/commands/player/XPBarCommand.java @@ -0,0 +1,104 @@ +package com.gmail.nossr50.commands.player; + +import com.gmail.nossr50.datatypes.player.McMMOPlayer; +import com.gmail.nossr50.datatypes.skills.PrimarySkillType; +import com.gmail.nossr50.util.experience.ExperienceBarManager; +import com.gmail.nossr50.util.player.UserManager; +import com.gmail.nossr50.util.skills.SkillUtils; +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) { + sender.sendMessage("Your mcMMO data has not loaded yet! Try again in a few moments."); + 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 { + return false; + } + + //Per skill Settings path + } else if (args.length == 2) { + String skillName = args[1]; + + if(SkillUtils.isSkill(skillName)) { + + PrimarySkillType targetSkill = PrimarySkillType.getSkill(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; + } + + 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(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], PrimarySkillType.SKILL_NAMES, new ArrayList(PrimarySkillType.SKILL_NAMES.size())); + default: + return ImmutableList.of(); + } + } +} 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..a90280805 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java +++ b/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java @@ -207,6 +207,10 @@ public class McMMOPlayer { return (currentXP / maxXP); } + public ExperienceBarManager getExperienceBarManager() { + return experienceBarManager; + } + public AcrobaticsManager getAcrobaticsManager() { return (AcrobaticsManager) skillManagers.get(PrimarySkillType.ACROBATICS); } diff --git a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java index ce6eb0b87..5b79227ba 100644 --- a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java @@ -28,7 +28,6 @@ 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.OfflinePlayer; import org.bukkit.block.Block; 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..819ba26b7 100644 --- a/src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java +++ b/src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java @@ -429,8 +429,16 @@ public final class CommandRegistrationManager { 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.formatString("Commands.Usage.1", "mmoxpbar", "", "")); + command.setExecutor(new XPBarCommand()); + } + public static void registerCommands() { // Generic Commands + registerXPBarCommand(); registerMmoInfoCommand(); registerMmoDebugCommand(); registerMcImportCommand(); 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..bc7b8b649 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,15 +67,17 @@ 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); } @@ -70,4 +90,55 @@ public class ExperienceBarManager { { experienceBarHideTaskHashMap.remove(primarySkillType); } + + 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: + //Hide all currently permanent bars + for(PrimarySkillType permanent : alwaysVisible) { + hideExperienceBar(permanent); + } + + alwaysVisible.clear(); + disabledBars.clear(); + + break; + } + + informPlayer(settingTarget, skillType); + + } + + private void informPlayer(@NotNull ExperienceBarManager.@NotNull XPBarSettingTarget settingTarget, @Nullable PrimarySkillType skillType) { + //Inform player of setting change + if(settingTarget != XPBarSettingTarget.RESET) { + NotificationManager.sendPlayerInformationChatOnlyPrefixed(mcMMOPlayer.getPlayer(), "Commands.XPBar.SettingChanged", skillType.getName(), settingTarget.toString()); + } else { + NotificationManager.sendPlayerInformationChatOnlyPrefixed(mcMMOPlayer.getPlayer(), "Commands.XPBar.Reset"); + } + } + + public enum XPBarSettingTarget { SHOW, HIDE, RESET } } diff --git a/src/main/resources/locale/locale_cs_CZ.properties b/src/main/resources/locale/locale_cs_CZ.properties index bba15218e..afbb75542 100644 --- a/src/main/resources/locale/locale_cs_CZ.properties +++ b/src/main/resources/locale/locale_cs_CZ.properties @@ -645,3 +645,5 @@ Scoreboard.Misc.Level=Level Scoreboard.Misc.CurrentXP=Aktualn\u00ed XP Scoreboard.Misc.RemainingXP=Zb\u00fdvaj\u00edc\u00ed XP Scoreboard.Misc.Overall=Celkov\u011b +Commands.XPBar.Usage=Proper usage is /mmoxpbar +Commands.Description.mmoxpbar=Player settings for mcMMO XP bars diff --git a/src/main/resources/locale/locale_cy.properties b/src/main/resources/locale/locale_cy.properties index dd6fc8bd6..a7093305e 100644 --- a/src/main/resources/locale/locale_cy.properties +++ b/src/main/resources/locale/locale_cy.properties @@ -465,3 +465,5 @@ MOTD.Version=[[GOLD]][mcMMO] Running version [[DARK_AQUA]]{0} MOTD.Website=[[GOLD]][mcMMO] [[GREEN]]{0}[[YELLOW]] - mcMMO Website Skills.AbilityGateRequirementFail= Smelting.SubSkill.UnderstandingTheArt.Name= +Commands.XPBar.Usage=Proper usage is /mmoxpbar +Commands.Description.mmoxpbar=Player settings for mcMMO XP bars diff --git a/src/main/resources/locale/locale_da.properties b/src/main/resources/locale/locale_da.properties index 087f11d89..f61c86c9b 100644 --- a/src/main/resources/locale/locale_da.properties +++ b/src/main/resources/locale/locale_da.properties @@ -464,3 +464,5 @@ MOTD.Hardcore.Vampirism.Stats=[[GOLD]][mcMMO] [[DARK_AQUA]Vampyr Statistik Igle: MOTD.PerksPrefix=[mcMMO Frynsegoder] MOTD.Version=[[GOLD]][mcMMO] K\u00f8rer version [[DARK_AQUA]]{0} MOTD.Website=[[GOLD]][mcMMO] [[GREEN]]{0}[[YELLOW]] - mcMMO Hjemmeside +Commands.XPBar.Usage=Proper usage is /mmoxpbar +Commands.Description.mmoxpbar=Player settings for mcMMO XP bars diff --git a/src/main/resources/locale/locale_de.properties b/src/main/resources/locale/locale_de.properties index 4a1fb3f96..7156c0c06 100644 --- a/src/main/resources/locale/locale_de.properties +++ b/src/main/resources/locale/locale_de.properties @@ -1032,3 +1032,5 @@ 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. +Commands.XPBar.Usage=Proper usage is /mmoxpbar +Commands.Description.mmoxpbar=Player settings for mcMMO XP bars diff --git a/src/main/resources/locale/locale_en_US.properties b/src/main/resources/locale/locale_en_US.properties index 9d2b3ca7a..802288f64 100644 --- a/src/main/resources/locale/locale_en_US.properties +++ b/src/main/resources/locale/locale_en_US.properties @@ -699,6 +699,8 @@ Commands.Scoreboard.Help.2=[[DARK_AQUA]]/mcscoreboard[[AQUA]] keep [[WHITE]] - k 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.XPBar.Reset=[[GOLD]]XP Bar settings for mcMMO have been reset. +Commands.XPBar.SettingChanged=[[GOLD]]XP Bar setting for [[GREEN]]{0}[[GOLD]] is now set to [[GREEN]]{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-- @@ -1108,3 +1110,5 @@ Locale.Reloaded=[[GREEN]]Locale 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. +Commands.XPBar.Usage=Proper usage is /mmoxpbar +Commands.Description.mmoxpbar=Player settings for mcMMO XP bars diff --git a/src/main/resources/locale/locale_es.properties b/src/main/resources/locale/locale_es.properties index ef38d8b78..9cd35df70 100644 --- a/src/main/resources/locale/locale_es.properties +++ b/src/main/resources/locale/locale_es.properties @@ -673,3 +673,5 @@ 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 diff --git a/src/main/resources/locale/locale_fi.properties b/src/main/resources/locale/locale_fi.properties index 16ced7dab..f56261299 100644 --- a/src/main/resources/locale/locale_fi.properties +++ b/src/main/resources/locale/locale_fi.properties @@ -197,3 +197,5 @@ Stats.Header.Combat=[[GOLD]]-=TAISTELUTAIDOT=- Stats.Header.Gathering=[[GOLD]]-=Resurssinkeruutaidot=- Stats.Header.Misc=[[GOLD]]-=SEKALAISET TAIDOT=- Stats.Own.Stats=[[GREEN]][mcMMO] Tilastot +Commands.XPBar.Usage=Proper usage is /mmoxpbar +Commands.Description.mmoxpbar=Player settings for mcMMO XP bars diff --git a/src/main/resources/locale/locale_fr.properties b/src/main/resources/locale/locale_fr.properties index 8c6eb9a26..cee540aea 100644 --- a/src/main/resources/locale/locale_fr.properties +++ b/src/main/resources/locale/locale_fr.properties @@ -863,3 +863,5 @@ 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. +Commands.XPBar.Usage=Proper usage is /mmoxpbar +Commands.Description.mmoxpbar=Player settings for mcMMO XP bars diff --git a/src/main/resources/locale/locale_hu_HU.properties b/src/main/resources/locale/locale_hu_HU.properties index fc239ba87..f50315c1d 100644 --- a/src/main/resources/locale/locale_hu_HU.properties +++ b/src/main/resources/locale/locale_hu_HU.properties @@ -1108,3 +1108,5 @@ Locale.Reloaded=[[GREEN]]Ford\u00EDt\u00E1s \u00FAjrat\u00F6ltve! #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. +Commands.XPBar.Usage=Proper usage is /mmoxpbar +Commands.Description.mmoxpbar=Player settings for mcMMO XP bars diff --git a/src/main/resources/locale/locale_it.properties b/src/main/resources/locale/locale_it.properties index 7fc89d026..cb5786395 100644 --- a/src/main/resources/locale/locale_it.properties +++ b/src/main/resources/locale/locale_it.properties @@ -1139,3 +1139,5 @@ Locale.Reloaded=[[GREEN]]Traduzioni 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. +Commands.XPBar.Usage=Proper usage is /mmoxpbar +Commands.Description.mmoxpbar=Player settings for mcMMO XP bars diff --git a/src/main/resources/locale/locale_ja_JP.properties b/src/main/resources/locale/locale_ja_JP.properties index 87771d5d3..71f1ddec2 100644 --- a/src/main/resources/locale/locale_ja_JP.properties +++ b/src/main/resources/locale/locale_ja_JP.properties @@ -1124,4 +1124,6 @@ Locale.Reloaded=[[GREEN]]\u30ed\u30b1\u30fc\u30eb \u30ea\u30ed\u30fc\u30c9\uff01 # 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.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 +Commands.XPBar.Usage=Proper usage is /mmoxpbar +Commands.Description.mmoxpbar=Player settings for mcMMO XP bars \ 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..bffa20558 100644 --- a/src/main/resources/locale/locale_ko.properties +++ b/src/main/resources/locale/locale_ko.properties @@ -968,4 +968,6 @@ Scoreboard.Misc.Overall=[[GOLD]]\uC885\uD569 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. +Commands.XPBar.Usage=Proper usage is /mmoxpbar +Commands.Description.mmoxpbar=Player settings for mcMMO XP bars diff --git a/src/main/resources/locale/locale_lt_LT.properties b/src/main/resources/locale/locale_lt_LT.properties index 03296ff8a..6952e727b 100644 --- a/src/main/resources/locale/locale_lt_LT.properties +++ b/src/main/resources/locale/locale_lt_LT.properties @@ -1108,3 +1108,5 @@ Locale.Reloaded=[[GREEN]]Kalbos 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. +Commands.XPBar.Usage=Proper usage is /mmoxpbar +Commands.Description.mmoxpbar=Player settings for mcMMO XP bars diff --git a/src/main/resources/locale/locale_nl.properties b/src/main/resources/locale/locale_nl.properties index 83479f641..3c4bb7f19 100644 --- a/src/main/resources/locale/locale_nl.properties +++ b/src/main/resources/locale/locale_nl.properties @@ -429,3 +429,5 @@ 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 diff --git a/src/main/resources/locale/locale_pl.properties b/src/main/resources/locale/locale_pl.properties index ea44c55fc..3a2d5422f 100644 --- a/src/main/resources/locale/locale_pl.properties +++ b/src/main/resources/locale/locale_pl.properties @@ -573,3 +573,5 @@ Commands.Description.mcnotify=Wlacza/wylacza informacje na temat umiejetnosci mc 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. +Commands.XPBar.Usage=Proper usage is /mmoxpbar +Commands.Description.mmoxpbar=Player settings for mcMMO XP bars diff --git a/src/main/resources/locale/locale_pt_BR.properties b/src/main/resources/locale/locale_pt_BR.properties index 95c800825..292fc5b58 100644 --- a/src/main/resources/locale/locale_pt_BR.properties +++ b/src/main/resources/locale/locale_pt_BR.properties @@ -576,3 +576,5 @@ Scoreboard.Misc.Overall=[[GOLD]]Geral 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. +Commands.XPBar.Usage=Proper usage is /mmoxpbar +Commands.Description.mmoxpbar=Player settings for mcMMO XP bars diff --git a/src/main/resources/locale/locale_ru.properties b/src/main/resources/locale/locale_ru.properties index 2710d8151..d9b502e3c 100644 --- a/src/main/resources/locale/locale_ru.properties +++ b/src/main/resources/locale/locale_ru.properties @@ -1164,3 +1164,5 @@ Locale.Reloaded=[[GREEN]]\u041b\u043e\u043a\u0430\u043b\u044c \u043f\u0435\u0440 #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. +Commands.XPBar.Usage=Proper usage is /mmoxpbar +Commands.Description.mmoxpbar=Player settings for mcMMO XP bars diff --git a/src/main/resources/locale/locale_sv.properties b/src/main/resources/locale/locale_sv.properties index 8e4ed3028..37ec6b2cd 100644 --- a/src/main/resources/locale/locale_sv.properties +++ b/src/main/resources/locale/locale_sv.properties @@ -149,3 +149,5 @@ 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 +Commands.XPBar.Usage=Proper usage is /mmoxpbar +Commands.Description.mmoxpbar=Player settings for mcMMO XP bars diff --git a/src/main/resources/locale/locale_th_TH.properties b/src/main/resources/locale/locale_th_TH.properties index 003fd5246..8b4f6f353 100644 --- a/src/main/resources/locale/locale_th_TH.properties +++ b/src/main/resources/locale/locale_th_TH.properties @@ -633,3 +633,5 @@ Commands.Description.xplock=\u0e25\u0e47\u0e2d\u0e04 mcMMO \u0e1a\u0e32\u0e23\u0 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 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 diff --git a/src/main/resources/locale/locale_zh_CN.properties b/src/main/resources/locale/locale_zh_CN.properties index f1473c859..a1d6bc175 100644 --- a/src/main/resources/locale/locale_zh_CN.properties +++ b/src/main/resources/locale/locale_zh_CN.properties @@ -1108,3 +1108,5 @@ Locale.Reloaded=[[GREEN]]\u8bed\u8a00\u914d\u7f6e\u5df2\u91cd\u65b0\u52a0\u8f7d\ #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. +Commands.XPBar.Usage=Proper usage is /mmoxpbar +Commands.Description.mmoxpbar=Player settings for mcMMO XP bars diff --git a/src/main/resources/locale/locale_zh_TW.properties b/src/main/resources/locale/locale_zh_TW.properties index 85b97acea..e75749afe 100644 --- a/src/main/resources/locale/locale_zh_TW.properties +++ b/src/main/resources/locale/locale_zh_TW.properties @@ -775,3 +775,5 @@ Recovery.Notice=\u6ce8\u610f: mcMMO[[DARK_RED]]\u7121\u6cd5\u8f09\u5165\u4f60\u7 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. +Commands.XPBar.Usage=Proper usage is /mmoxpbar +Commands.Description.mmoxpbar=Player settings for mcMMO XP bars diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index c8f1c2afa..0de7167d5 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -19,6 +19,9 @@ load: POSTWORLD api-version: 1.13 commands: + 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: From 92c4ddce87626c9383de110466f2eeec06c5903c Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 27 Apr 2020 19:09:37 -0700 Subject: [PATCH 014/662] NPE fix --- .../gmail/nossr50/util/experience/ExperienceBarManager.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 bc7b8b649..a36799895 100644 --- a/src/main/java/com/gmail/nossr50/util/experience/ExperienceBarManager.java +++ b/src/main/java/com/gmail/nossr50/util/experience/ExperienceBarManager.java @@ -83,7 +83,8 @@ public class ExperienceBarManager { public void hideExperienceBar(PrimarySkillType primarySkillType) { - experienceBars.get(primarySkillType).hideExperienceBar(); + if(experienceBars.containsKey(primarySkillType)) + experienceBars.get(primarySkillType).hideExperienceBar(); } public void clearTask(PrimarySkillType primarySkillType) From 666729cadc51718fbdb51929bf9f8d87fdff15b8 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 27 Apr 2020 19:13:24 -0700 Subject: [PATCH 015/662] Localize more things --- .../nossr50/commands/experience/ExperienceCommand.java | 4 +++- .../com/gmail/nossr50/commands/player/XPBarCommand.java | 6 ++++-- .../nossr50/util/commands/CommandRegistrationManager.java | 2 +- src/main/resources/locale/locale_cs_CZ.properties | 1 + src/main/resources/locale/locale_cy.properties | 1 + src/main/resources/locale/locale_da.properties | 1 + src/main/resources/locale/locale_de.properties | 1 + src/main/resources/locale/locale_en_US.properties | 1 + src/main/resources/locale/locale_es.properties | 1 + src/main/resources/locale/locale_fi.properties | 1 + src/main/resources/locale/locale_fr.properties | 1 + src/main/resources/locale/locale_hu_HU.properties | 1 + src/main/resources/locale/locale_it.properties | 1 + src/main/resources/locale/locale_ja_JP.properties | 3 ++- src/main/resources/locale/locale_ko.properties | 1 + src/main/resources/locale/locale_lt_LT.properties | 1 + src/main/resources/locale/locale_nl.properties | 1 + src/main/resources/locale/locale_pl.properties | 1 + src/main/resources/locale/locale_pt_BR.properties | 1 + src/main/resources/locale/locale_ru.properties | 1 + src/main/resources/locale/locale_sv.properties | 1 + src/main/resources/locale/locale_th_TH.properties | 1 + src/main/resources/locale/locale_zh_CN.properties | 1 + src/main/resources/locale/locale_zh_TW.properties | 1 + 24 files changed, 30 insertions(+), 5 deletions(-) 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..42b2ec06b 100644 --- a/src/main/java/com/gmail/nossr50/commands/experience/ExperienceCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/experience/ExperienceCommand.java @@ -31,7 +31,9 @@ public abstract class ExperienceCommand implements TabExecutor { } if (!permissionsCheckSelf(sender)) { - sender.sendMessage(command.getPermissionMessage()); + if(command.getPermissionMessage() != null) + sender.sendMessage(command.getPermissionMessage()); + sender.sendMessage("(mcMMO) No permission!"); return true; } diff --git a/src/main/java/com/gmail/nossr50/commands/player/XPBarCommand.java b/src/main/java/com/gmail/nossr50/commands/player/XPBarCommand.java index 0029f4844..1d933df03 100644 --- a/src/main/java/com/gmail/nossr50/commands/player/XPBarCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/player/XPBarCommand.java @@ -2,7 +2,9 @@ package com.gmail.nossr50.commands.player; import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; +import com.gmail.nossr50.util.StringUtils; 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.google.common.collect.ImmutableList; @@ -24,7 +26,7 @@ public class XPBarCommand implements TabExecutor { if(sender instanceof Player) { McMMOPlayer mmoPlayer = UserManager.getPlayer((Player) sender); if(mmoPlayer == null) { - sender.sendMessage("Your mcMMO data has not loaded yet! Try again in a few moments."); + NotificationManager.sendPlayerInformationChatOnlyPrefixed(mmoPlayer.getPlayer(), "Profile.PendingLoad"); return false; } @@ -90,7 +92,7 @@ public class XPBarCommand implements TabExecutor { List options = new ArrayList<>(); for(ExperienceBarManager.XPBarSettingTarget settingTarget : ExperienceBarManager.XPBarSettingTarget.values()) { - options.add(settingTarget.toString()); + options.add(StringUtils.getCapitalized(settingTarget.toString())); } return StringUtil.copyPartialMatches(args[0], options, new ArrayList<>(ExperienceBarManager.XPBarSettingTarget.values().length)); 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 819ba26b7..36dd2f5f4 100644 --- a/src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java +++ b/src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java @@ -424,7 +424,7 @@ public final class CommandRegistrationManager { 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.setDescription(LocaleLoader.getString("Commands.Description.mmocompat")); command.setUsage(LocaleLoader.formatString("Commands.Usage.0", "mmocompat")); command.setExecutor(new CompatibilityCommand()); } diff --git a/src/main/resources/locale/locale_cs_CZ.properties b/src/main/resources/locale/locale_cs_CZ.properties index afbb75542..ca8bda4b3 100644 --- a/src/main/resources/locale/locale_cs_CZ.properties +++ b/src/main/resources/locale/locale_cs_CZ.properties @@ -647,3 +647,4 @@ Scoreboard.Misc.RemainingXP=Zb\u00fdvaj\u00edc\u00ed XP Scoreboard.Misc.Overall=Celkov\u011b 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 a7093305e..4fe1e9a58 100644 --- a/src/main/resources/locale/locale_cy.properties +++ b/src/main/resources/locale/locale_cy.properties @@ -467,3 +467,4 @@ 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 f61c86c9b..e4cdc1d53 100644 --- a/src/main/resources/locale/locale_da.properties +++ b/src/main/resources/locale/locale_da.properties @@ -466,3 +466,4 @@ MOTD.Version=[[GOLD]][mcMMO] K\u00f8rer version [[DARK_AQUA]]{0} MOTD.Website=[[GOLD]][mcMMO] [[GREEN]]{0}[[YELLOW]] - 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 7156c0c06..e15da3188 100644 --- a/src/main/resources/locale/locale_de.properties +++ b/src/main/resources/locale/locale_de.properties @@ -1034,3 +1034,4 @@ Reminder.Squelched=&7Erinnerung: Du erhälst aktuell keinerlei Benachrichtigunge 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. 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_en_US.properties b/src/main/resources/locale/locale_en_US.properties index 802288f64..9a2d107af 100644 --- a/src/main/resources/locale/locale_en_US.properties +++ b/src/main/resources/locale/locale_en_US.properties @@ -1112,3 +1112,4 @@ LevelCap.PowerLevel=[[GOLD]]([[GREEN]]mcMMO[[GOLD]]) [[YELLOW]]You have reached 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. 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_es.properties b/src/main/resources/locale/locale_es.properties index 9cd35df70..73b616f15 100644 --- a/src/main/resources/locale/locale_es.properties +++ b/src/main/resources/locale/locale_es.properties @@ -675,3 +675,4 @@ 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 f56261299..461bbf5d9 100644 --- a/src/main/resources/locale/locale_fi.properties +++ b/src/main/resources/locale/locale_fi.properties @@ -199,3 +199,4 @@ Stats.Header.Misc=[[GOLD]]-=SEKALAISET TAIDOT=- Stats.Own.Stats=[[GREEN]][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 cee540aea..20740e130 100644 --- a/src/main/resources/locale/locale_fr.properties +++ b/src/main/resources/locale/locale_fr.properties @@ -865,3 +865,4 @@ Profile.Loading.Failure=McMMO ne peut toujours pas charger vos donn\u00e9es. Vou 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. 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_hu_HU.properties b/src/main/resources/locale/locale_hu_HU.properties index f50315c1d..cbbd2a57e 100644 --- a/src/main/resources/locale/locale_hu_HU.properties +++ b/src/main/resources/locale/locale_hu_HU.properties @@ -1110,3 +1110,4 @@ LevelCap.PowerLevel=[[GOLD]]([[GREEN]]mcMMO[[GOLD]]) [[YELLOW]]El\u00E9rted ezt 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. 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_it.properties b/src/main/resources/locale/locale_it.properties index cb5786395..2f23681c3 100644 --- a/src/main/resources/locale/locale_it.properties +++ b/src/main/resources/locale/locale_it.properties @@ -1141,3 +1141,4 @@ LevelCap.PowerLevel=[[GOLD]]([[GREEN]]mcMMO[[GOLD]]) [[YELLOW]]Hai raggiunto il 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. 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 71f1ddec2..efaa25b8f 100644 --- a/src/main/resources/locale/locale_ja_JP.properties +++ b/src/main/resources/locale/locale_ja_JP.properties @@ -1126,4 +1126,5 @@ Locale.Reloaded=[[GREEN]]\u30ed\u30b1\u30fc\u30eb \u30ea\u30ed\u30fc\u30c9\uff01 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 Commands.XPBar.Usage=Proper usage is /mmoxpbar -Commands.Description.mmoxpbar=Player settings for mcMMO XP bars \ No newline at end of file +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. \ 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 bffa20558..dc86ce286 100644 --- a/src/main/resources/locale/locale_ko.properties +++ b/src/main/resources/locale/locale_ko.properties @@ -970,4 +970,5 @@ Profile.Loading.Failure=mcMMO\uB294 \uC5EC\uC804\uD788 \uB2F9\uC2E0\uC758 \uB370 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. 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_lt_LT.properties b/src/main/resources/locale/locale_lt_LT.properties index 6952e727b..6a4aa83a9 100644 --- a/src/main/resources/locale/locale_lt_LT.properties +++ b/src/main/resources/locale/locale_lt_LT.properties @@ -1110,3 +1110,4 @@ LevelCap.PowerLevel=[[GOLD]]([[GREEN]]mcMMO[[GOLD]]) [[YELLOW]]You have reached 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. 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_nl.properties b/src/main/resources/locale/locale_nl.properties index 3c4bb7f19..9ecb48cad 100644 --- a/src/main/resources/locale/locale_nl.properties +++ b/src/main/resources/locale/locale_nl.properties @@ -431,3 +431,4 @@ 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 3a2d5422f..b7390a125 100644 --- a/src/main/resources/locale/locale_pl.properties +++ b/src/main/resources/locale/locale_pl.properties @@ -575,3 +575,4 @@ UpdateChecker.Outdated=Uzywasz przestarzalej wersji mcMMO! UpdateChecker.NewAvailable=Dostepna jest nowa wersja na 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_pt_BR.properties b/src/main/resources/locale/locale_pt_BR.properties index 292fc5b58..044af17af 100644 --- a/src/main/resources/locale/locale_pt_BR.properties +++ b/src/main/resources/locale/locale_pt_BR.properties @@ -578,3 +578,4 @@ Profile.Loading.Failure=[[RED]]mcMMO still cannot load your data. You may want t 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. 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_ru.properties b/src/main/resources/locale/locale_ru.properties index d9b502e3c..7e327c4cd 100644 --- a/src/main/resources/locale/locale_ru.properties +++ b/src/main/resources/locale/locale_ru.properties @@ -1166,3 +1166,4 @@ LevelCap.PowerLevel=[[GOLD]]([[GREEN]]mcMMO[[GOLD]]) [[YELLOW]]\u0412\u044b \u04 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. 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_sv.properties b/src/main/resources/locale/locale_sv.properties index 37ec6b2cd..255a11f74 100644 --- a/src/main/resources/locale/locale_sv.properties +++ b/src/main/resources/locale/locale_sv.properties @@ -151,3 +151,4 @@ Stats.Header.Misc=[[GOLD]]-=Varierande F\u00e4rdogheter=- Stats.Own.Stats=[[GREEN]][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 8b4f6f353..af688ec3a 100644 --- a/src/main/resources/locale/locale_th_TH.properties +++ b/src/main/resources/locale/locale_th_TH.properties @@ -635,3 +635,4 @@ 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 a1d6bc175..fe57cca0e 100644 --- a/src/main/resources/locale/locale_zh_CN.properties +++ b/src/main/resources/locale/locale_zh_CN.properties @@ -1110,3 +1110,4 @@ LevelCap.PowerLevel=[[GOLD]]([[GREEN]]mcMMO[[GOLD]]) [[YELLOW]]\u4f60\u5df2\u7ec 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. 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_TW.properties b/src/main/resources/locale/locale_zh_TW.properties index e75749afe..8eea0a70c 100644 --- a/src/main/resources/locale/locale_zh_TW.properties +++ b/src/main/resources/locale/locale_zh_TW.properties @@ -777,3 +777,4 @@ Recovery.Failure=mcMMO\u7121\u6cd5\u8f09\u5165\u4f60\u7684\u8cc7\u6599,\u4f60\u5 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. 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. From 4a7b43c560682e0d2120c146072fc98c05b43a39 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 27 Apr 2020 19:15:53 -0700 Subject: [PATCH 016/662] update log --- Changelog.txt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Changelog.txt b/Changelog.txt index be4b284e9..fd69d559a 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -7,6 +7,13 @@ Version 2.1.126 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 + + 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 From 07b838db0f245620ccd6a95580c7c85c180d8426 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 27 Apr 2020 19:31:22 -0700 Subject: [PATCH 017/662] 2.1.126 --- Changelog.txt | 2 ++ pom.xml | 2 +- .../com/gmail/nossr50/util/compat/CompatibilityManager.java | 2 +- src/main/resources/locale/locale_en_US.properties | 2 ++ 4 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index fd69d559a..2fe5d0ca7 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -12,6 +12,8 @@ Version 2.1.126 Commands.Description.mmocompat Commands.XPBar.Reset Commands.XPBar.SettingChanged + Compatibility.Layer.Unsupported + Compatibility.Layer.PartialSupport Notes: diff --git a/pom.xml b/pom.xml index 4b55d2149..d3b3b65ae 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.126 mcMMO https://github.com/mcMMO-Dev/mcMMO 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 416ba2d78..7c687797a 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/CompatibilityManager.java +++ b/src/main/java/com/gmail/nossr50/util/compat/CompatibilityManager.java @@ -81,7 +81,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())))); } } } diff --git a/src/main/resources/locale/locale_en_US.properties b/src/main/resources/locale/locale_en_US.properties index 9a2d107af..be987166e 100644 --- a/src/main/resources/locale/locale_en_US.properties +++ b/src/main/resources/locale/locale_en_US.properties @@ -1113,3 +1113,5 @@ LevelCap.Skill=[[GOLD]]([[GREEN]]mcMMO[[GOLD]]) [[YELLOW]]You have reached the l 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=[[GOLD]]Compatibility for [[GREEN]]{0}[[GOLD]] is not supported by this version of Minecraft. +Compatibility.Layer.PartialSupport=[[GOLD]]Compatibility for [[GREEN]]{0}[[GOLD]] is not fully supported by this version of Minecraft, but mcMMO is running a secondary system to emulate some of the missing features. From e6289a05487223ca28185a259d9a0ba8cfc34029 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 27 Apr 2020 19:47:50 -0700 Subject: [PATCH 018/662] back to work --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index d3b3b65ae..37ec0d4d6 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.126 + 2.1.127-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO From 239200a3d2abd7aca92a4c22c3d96a20847faf16 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 28 Apr 2020 13:47:33 -0700 Subject: [PATCH 019/662] child skills can have their xp bars turned on --- Changelog.txt | 6 +++++ .../nossr50/datatypes/player/McMMOPlayer.java | 9 ++++---- .../datatypes/player/PlayerProfile.java | 9 ++++++++ .../util/experience/ExperienceBarManager.java | 22 ++++++++++++------- 4 files changed, 33 insertions(+), 13 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 2fe5d0ca7..7e73011da 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,9 @@ +Version 2.1.127 + Child Skills now have XP bars, they are hidden by default + + 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 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 a90280805..6fcae8bdd 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java +++ b/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java @@ -190,17 +190,16 @@ 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(primarySkillType.isChildSkill()) { + return 1.0D; + } + double currentXP = profile.getSkillXpLevel(primarySkillType); double maxXP = profile.getXpToLevel(primarySkillType); 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..d58a872c7 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/player/PlayerProfile.java +++ b/src/main/java/com/gmail/nossr50/datatypes/player/PlayerProfile.java @@ -12,6 +12,7 @@ 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.SkillUtils; import com.google.common.collect.ImmutableMap; import java.util.HashMap; @@ -266,6 +267,10 @@ public class PlayerProfile { } public int getSkillXpLevel(PrimarySkillType skill) { + if(skill.isChildSkill()) { + return 0; + } + return (int) Math.floor(getSkillXpLevelRaw(skill)); } @@ -415,6 +420,10 @@ public class PlayerProfile { * @return the total amount of Xp until next level */ public int getXpToLevel(PrimarySkillType primarySkillType) { + if(primarySkillType.isChildSkill()) { + return 0; + } + int level = (ExperienceConfig.getInstance().getCumulativeCurveEnabled()) ? UserManager.getPlayer(playerName).getPowerLevel() : skills.get(primarySkillType); FormulaType formulaType = ExperienceConfig.getInstance().getFormulaType(); 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 a36799895..9bd52cd57 100644 --- a/src/main/java/com/gmail/nossr50/util/experience/ExperienceBarManager.java +++ b/src/main/java/com/gmail/nossr50/util/experience/ExperienceBarManager.java @@ -117,19 +117,25 @@ public class ExperienceBarManager { hideExperienceBar(skillType); break; case RESET: - //Hide all currently permanent bars - for(PrimarySkillType permanent : alwaysVisible) { - hideExperienceBar(permanent); - } - - alwaysVisible.clear(); - disabledBars.clear(); - + 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 skillType) { From 6c5f438099f78c6fbad1a5f1e29d86f8b656bbd6 Mon Sep 17 00:00:00 2001 From: draycia Date: Wed, 29 Apr 2020 01:06:53 -0700 Subject: [PATCH 020/662] Use logger instead of sysout --- src/main/java/com/gmail/nossr50/config/AdvancedConfig.java | 2 +- .../com/gmail/nossr50/listeners/InteractionManager.java | 2 +- src/main/java/com/gmail/nossr50/mcMMO.java | 2 +- .../com/gmail/nossr50/worldguard/WorldGuardManager.java | 7 ++++--- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java b/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java index dccd1a4c8..296d95cff 100644 --- a/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java +++ b/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java @@ -796,7 +796,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; } diff --git a/src/main/java/com/gmail/nossr50/listeners/InteractionManager.java b/src/main/java/com/gmail/nossr50/listeners/InteractionManager.java index 43705073a..0a25c37b3 100644 --- a/src/main/java/com/gmail/nossr50/listeners/InteractionManager.java +++ b/src/main/java/com/gmail/nossr50/listeners/InteractionManager.java @@ -54,7 +54,7 @@ public class InteractionManager { if(subSkillNameMap.get(lowerCaseName) == null) subSkillNameMap.put(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/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index 74a7b7aa7..706c9e7ee 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -560,7 +560,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(); diff --git a/src/main/java/com/gmail/nossr50/worldguard/WorldGuardManager.java b/src/main/java/com/gmail/nossr50/worldguard/WorldGuardManager.java index cf4d83d15..30c59f89f 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; @@ -93,17 +94,17 @@ 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 // to print a message to let the server admin know of the conflict } } catch (NoClassDefFoundError e) { - System.out.println("[mcMMO] Could not register WG Flags!"); //Don't use the Logger here + mcMMO.p.getLogger().warning("Could not register WG Flags!"); //Don't use the Logger here } } From 25389429aec4e19cba56e96d99d41c6d3111acbf Mon Sep 17 00:00:00 2001 From: draycia Date: Wed, 29 Apr 2020 01:10:55 -0700 Subject: [PATCH 021/662] Don't use the Logger here --- .../java/com/gmail/nossr50/worldguard/WorldGuardManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gmail/nossr50/worldguard/WorldGuardManager.java b/src/main/java/com/gmail/nossr50/worldguard/WorldGuardManager.java index 30c59f89f..51ccc8605 100644 --- a/src/main/java/com/gmail/nossr50/worldguard/WorldGuardManager.java +++ b/src/main/java/com/gmail/nossr50/worldguard/WorldGuardManager.java @@ -104,7 +104,7 @@ public class WorldGuardManager { // to print a message to let the server admin know of the conflict } } catch (NoClassDefFoundError e) { - mcMMO.p.getLogger().warning("Could not register WG Flags!"); //Don't use the Logger here + System.out.println("[mcMMO] Could not register WG Flags!"); //Don't use the Logger here } } From 7615ff472dc1cdb6659950a9b008dd5fdf9fefe7 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 1 May 2020 14:32:56 -0700 Subject: [PATCH 022/662] Update changelog --- Changelog.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Changelog.txt b/Changelog.txt index 7e73011da..3fa80fa81 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,5 +1,10 @@ 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 From 7114ff02e53e24d120ce607b640f49d15978a8ee Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 1 May 2020 14:38:58 -0700 Subject: [PATCH 023/662] Fix compile issue --- .../gmail/nossr50/config/WorldBlacklist.java | 27 +++++++++++++------ 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/config/WorldBlacklist.java b/src/main/java/com/gmail/nossr50/config/WorldBlacklist.java index 76181377f..d9bd04b68 100644 --- a/src/main/java/com/gmail/nossr50/config/WorldBlacklist.java +++ b/src/main/java/com/gmail/nossr50/config/WorldBlacklist.java @@ -40,9 +40,11 @@ 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; @@ -54,20 +56,29 @@ public class WorldBlacklist { if(!blacklist.contains(currentLine)) blacklist.add(currentLine); } - } catch (FileNotFoundException e) { - e.printStackTrace(); - } catch (IOException e) - { + + + } catch (IOException e) { e.printStackTrace(); } finally { //Close readers - if(bufferedReader != null) bufferedReader.close(); - if(fileReader != null) fileReader.close(); + closeRead(bufferedReader); + closeRead(fileReader); } plugin.getLogger().info(blacklist.size()+" entries in mcMMO World Blacklist"); } + private void closeRead(Reader reader) { + if(reader != null) { + try { + reader.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + public static boolean isWorldBlacklisted(World world) { From d023b891897cca217c3ebdc7e74a085a9ccad2c8 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 1 May 2020 14:43:48 -0700 Subject: [PATCH 024/662] Declare p right away --- src/main/java/com/gmail/nossr50/mcMMO.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index 706c9e7ee..ec7f5df41 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -137,14 +137,16 @@ public class mcMMO extends JavaPlugin { public static FixedMetadataValue metadataValue; + public mcMMO() { + p = this; + } + /** * Things to be run when the plugin is enabled. */ @Override public void onEnable() { try { - p = this; - //Platform Manager platformManager = new PlatformManager(); From a3612b6ae3aad884cf44684e573ec15793750f23 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 1 May 2020 14:46:57 -0700 Subject: [PATCH 025/662] 2.1.127 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 37ec0d4d6..57bb4a4f2 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.127-SNAPSHOT + 2.1.127 mcMMO https://github.com/mcMMO-Dev/mcMMO From ca3509e509e669f31b5e04e0c0775ba5e3cabfc8 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 5 May 2020 19:01:45 -0700 Subject: [PATCH 026/662] Dev mode --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 57bb4a4f2..ebcf4102a 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.127 + 2.1.128-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO From 74f8c2901d85f0349187368a3c015d6571ab14c7 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 5 May 2020 19:08:55 -0700 Subject: [PATCH 027/662] Iron Arm Rank 1 Nerf --- Changelog.txt | 4 ++++ .../java/com/gmail/nossr50/skills/unarmed/UnarmedManager.java | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index 3fa80fa81..d19d4a7b2 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,7 @@ +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) + + Version 2.1.127 Child Skills now have XP bars, they are hidden by default Updated hu_HU locale (thanks andris155) 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..92408bab9 100644 --- a/src/main/java/com/gmail/nossr50/skills/unarmed/UnarmedManager.java +++ b/src/main/java/com/gmail/nossr50/skills/unarmed/UnarmedManager.java @@ -159,7 +159,7 @@ public class UnarmedManager extends SkillManager { if(rank == 1) { - return 4; + return 1.5; } else { return 3 + (rank * 2); } From c5ce7bd23bf15b7904918b6ec150d27fbbbb522c Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 5 May 2020 19:19:20 -0700 Subject: [PATCH 028/662] Revert blast mining nerf --- Changelog.txt | 1 + .../nossr50/skills/mining/MiningManager.java | 15 ++++++++------- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index d19d4a7b2..1ad2b0df8 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,5 +1,6 @@ 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 Version 2.1.127 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..73b5f4eb3 100644 --- a/src/main/java/com/gmail/nossr50/skills/mining/MiningManager.java +++ b/src/main/java/com/gmail/nossr50/skills/mining/MiningManager.java @@ -161,12 +161,12 @@ public class MiningManager extends SkillManager { List ores = new ArrayList(); - List notOres = new ArrayList<>(); +// List notOres = new ArrayList<>(); for (Block targetBlock : event.blockList()) { //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 { + if (ExperienceConfig.getInstance().getXp(PrimarySkillType.MINING, targetBlock) != 0 + && !(targetBlock instanceof Container) + && !mcMMO.getPlaceStore().isTrue(targetBlock)) { ores.add(targetBlock.getState()); } } @@ -181,14 +181,15 @@ public class MiningManager extends SkillManager { // float debrisYield = yield - debrisReduction; for (BlockState blockState : ores) { - if (RandomUtils.nextInt(ores.size()) >= (ores.size() / 2)) { + if (RandomUtils.nextFloat() >= (yield + getOreBonus())) { xp += Mining.getBlockXp(blockState); Misc.dropItem(Misc.getBlockCenter(blockState), new ItemStack(blockState.getType())); // Initial block that would have been dropped - for (int i = 1; i < dropMultiplier; i++) { - if(RandomUtils.nextInt(100) >= 75) + if (!mcMMO.getPlaceStore().isTrue(blockState)) { + for (int i = 1; i < dropMultiplier; i++) { Mining.handleSilkTouchDrops(blockState); // Bonus drops - should drop the block & not the items + } } } } From 9f455f5a0d3af3f0715086bae1a47a7bfed8b9cb Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 5 May 2020 19:23:55 -0700 Subject: [PATCH 029/662] Fix some locale errors --- Changelog.txt | 2 +- .../nossr50/util/commands/CommandRegistrationManager.java | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 1ad2b0df8..bb7643d84 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,7 +1,7 @@ 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 few locale errors with commands Version 2.1.127 Child Skills now have XP bars, they are hidden by default 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 36dd2f5f4..19034f36f 100644 --- a/src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java +++ b/src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java @@ -418,21 +418,22 @@ 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(LocaleLoader.getString("Commands.Description.mmocompat")); - command.setUsage(LocaleLoader.formatString("Commands.Usage.0", "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.formatString("Commands.Usage.1", "mmoxpbar", "", "")); + command.setUsage(LocaleLoader.getString("Commands.Usage.1", "mmoxpbar", "")); + command.setUsage(command.getUsage() +"\n" + LocaleLoader.getString("Commands.Usage.2", "", "")); command.setExecutor(new XPBarCommand()); } From d1116418bea60882b7204d9ba27b2a030b06bed2 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 5 May 2020 19:30:26 -0700 Subject: [PATCH 030/662] whoops --- .../java/com/gmail/nossr50/skills/mining/MiningManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 73b5f4eb3..e67386529 100644 --- a/src/main/java/com/gmail/nossr50/skills/mining/MiningManager.java +++ b/src/main/java/com/gmail/nossr50/skills/mining/MiningManager.java @@ -181,7 +181,7 @@ public class MiningManager extends SkillManager { // float debrisYield = yield - debrisReduction; for (BlockState blockState : ores) { - if (RandomUtils.nextFloat() >= (yield + getOreBonus())) { + if (RandomUtils.nextFloat() < (yield + getOreBonus())) { xp += Mining.getBlockXp(blockState); Misc.dropItem(Misc.getBlockCenter(blockState), new ItemStack(blockState.getType())); // Initial block that would have been dropped From 15e4dbfd92ed0d693a92dc8bb979f164b135153b Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 5 May 2020 19:32:22 -0700 Subject: [PATCH 031/662] Another oopsie --- .../gmail/nossr50/util/commands/CommandRegistrationManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 19034f36f..594431af0 100644 --- a/src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java +++ b/src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java @@ -433,7 +433,7 @@ public final class CommandRegistrationManager { 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", "", "")); + command.setUsage(command.getUsage() +"\n" + LocaleLoader.getString("Commands.Usage.2", "mmoxpbar", "", "")); command.setExecutor(new XPBarCommand()); } From fe2b7a8d6195f3b48b0aa1394880e87e0c11b190 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 5 May 2020 19:45:56 -0700 Subject: [PATCH 032/662] Add ExperienceAPI::addCombatXP --- Changelog.txt | 1 + .../com/gmail/nossr50/api/ExperienceAPI.java | 31 +++++++++++++++++++ .../nossr50/util/skills/CombatUtils.java | 24 +++++++++----- 3 files changed, 48 insertions(+), 8 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index bb7643d84..afd3d6298 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -2,6 +2,7 @@ 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 few locale errors with commands + (API) Added ExperienceAPI::addCombatXP for adding combat XP to players, signature may change so its deprecated for now Version 2.1.127 Child Skills now have XP bars, they are hidden by default diff --git a/src/main/java/com/gmail/nossr50/api/ExperienceAPI.java b/src/main/java/com/gmail/nossr50/api/ExperienceAPI.java index 6a800fb23..69a4e1e28 100644 --- a/src/main/java/com/gmail/nossr50/api/ExperienceAPI.java +++ b/src/main/java/com/gmail/nossr50/api/ExperienceAPI.java @@ -12,7 +12,9 @@ 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 org.bukkit.block.BlockState; +import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import java.util.ArrayList; @@ -35,6 +37,35 @@ public final class ExperienceAPI { return PrimarySkillType.getSkill(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); + } + /** * Returns whether the given skill type string is both valid and not a * child skill. (Child skills have no XP of their own, and their level is 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 8f0feb6f0..7f38a45ae 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java @@ -87,7 +87,7 @@ public final class CombatUtils { } applyScaledModifiers(initialDamage, finalDamage, event); - startGainXp(mcMMOPlayer, target, PrimarySkillType.SWORDS); + processCombatXP(mcMMOPlayer, target, PrimarySkillType.SWORDS); } // public static void strengthDebug(Player player) { @@ -162,7 +162,7 @@ public final class CombatUtils { } applyScaledModifiers(initialDamage, finalDamage, event); - startGainXp(mcMMOPlayer, target, PrimarySkillType.AXES); + processCombatXP(mcMMOPlayer, target, PrimarySkillType.AXES); } private static void processUnarmedCombat(LivingEntity target, Player player, EntityDamageByEntityEvent event) { @@ -205,7 +205,7 @@ public final class CombatUtils { } applyScaledModifiers(initialDamage, finalDamage, event); - startGainXp(mcMMOPlayer, target, PrimarySkillType.UNARMED); + processCombatXP(mcMMOPlayer, target, PrimarySkillType.UNARMED); } private static void processTamingCombat(LivingEntity target, Player master, Wolf wolf, EntityDamageByEntityEvent event) { @@ -237,7 +237,7 @@ public final class CombatUtils { } applyScaledModifiers(initialDamage, finalDamage, event); - startGainXp(mcMMOPlayer, target, PrimarySkillType.TAMING); + processCombatXP(mcMMOPlayer, target, PrimarySkillType.TAMING); } } @@ -293,7 +293,7 @@ public final class CombatUtils { forceMultiplier = arrow.getMetadata(mcMMO.bowForceKey).get(0).asDouble(); applyScaledModifiers(initialDamage, finalDamage, event); - startGainXp(mcMMOPlayer, target, PrimarySkillType.ARCHERY, forceMultiplier * distanceMultiplier); + processCombatXP(mcMMOPlayer, target, PrimarySkillType.ARCHERY, forceMultiplier * distanceMultiplier); } /** @@ -688,8 +688,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(McMMOPlayer mcMMOPlayer, LivingEntity target, PrimarySkillType primarySkillType) { + processCombatXP(mcMMOPlayer, target, primarySkillType, 1.0); } /** @@ -698,8 +705,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(McMMOPlayer mcMMOPlayer, LivingEntity target, PrimarySkillType primarySkillType, double multiplier) { double baseXP = 0; XPGainReason xpGainReason; From 402283806d70e0ee51bd8e91189467795219a4f1 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 5 May 2020 19:51:53 -0700 Subject: [PATCH 033/662] Database choice is now logged --- Changelog.txt | 1 + .../com/gmail/nossr50/database/DatabaseManagerFactory.java | 3 +++ 2 files changed, 4 insertions(+) diff --git a/Changelog.txt b/Changelog.txt index afd3d6298..0dd806454 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -3,6 +3,7 @@ Version 2.1.128 Blast Mining nerf reverted 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 Version 2.1.127 Child Skills now have XP bars, they are hidden by default diff --git a/src/main/java/com/gmail/nossr50/database/DatabaseManagerFactory.java b/src/main/java/com/gmail/nossr50/database/DatabaseManagerFactory.java index 1fb6555dc..24013a3a8 100644 --- a/src/main/java/com/gmail/nossr50/database/DatabaseManagerFactory.java +++ b/src/main/java/com/gmail/nossr50/database/DatabaseManagerFactory.java @@ -59,13 +59,16 @@ public class DatabaseManagerFactory { public static DatabaseManager createDatabaseManager(DatabaseType type) { switch (type) { case FLATFILE: + mcMMO.p.getLogger().info("Using FlatFile Database"); return new FlatfileDatabaseManager(); 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) { From 4a0d6bf2b7f44ab780b9d7666ac7385c5ff16361 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 5 May 2020 19:56:38 -0700 Subject: [PATCH 034/662] add notes --- Changelog.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Changelog.txt b/Changelog.txt index 0dd806454..cd6cf8aeb 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -5,6 +5,8 @@ Version 2.1.128 (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 + 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. + Version 2.1.127 Child Skills now have XP bars, they are hidden by default Updated hu_HU locale (thanks andris155) From ede5b3fd31289da35d2c608e82c75483e1335642 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 5 May 2020 20:15:46 -0700 Subject: [PATCH 035/662] Blast Mining debris yield bugfix --- Changelog.txt | 1 + .../nossr50/skills/mining/MiningManager.java | 25 ++++++++++++++----- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index cd6cf8aeb..75674e2d6 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,6 +1,7 @@ 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 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 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 e67386529..bd8a1c6fa 100644 --- a/src/main/java/com/gmail/nossr50/skills/mining/MiningManager.java +++ b/src/main/java/com/gmail/nossr50/skills/mining/MiningManager.java @@ -18,6 +18,7 @@ import com.gmail.nossr50.util.random.RandomChanceUtil; import com.gmail.nossr50.util.skills.RankUtils; import com.gmail.nossr50.util.skills.SkillUtils; import org.apache.commons.lang.math.RandomUtils; +import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.BlockState; @@ -161,33 +162,45 @@ public class MiningManager extends SkillManager { 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)) { - ores.add(targetBlock.getState()); + if(BlockUtils.isOre(blockState)) { + ores.add(blockState); + } else { + notOres.add(blockState); + } } } int xp = 0; -// float oreBonus = (float) (getOreBonus() / 100); + float oreBonus = (float) (getOreBonus() / 100); //TODO: Pretty sure something is fucked with debrisReduction stuff -// float debrisReduction = (float) (getDebrisReduction() / 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(RandomUtils.nextFloat() < debrisYield) { + Misc.dropItem(Misc.getBlockCenter(blockState), new ItemStack(blockState.getType())); // Initial block that would have been dropped + } + } for (BlockState blockState : ores) { - if (RandomUtils.nextFloat() < (yield + getOreBonus())) { + 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 if (!mcMMO.getPlaceStore().isTrue(blockState)) { for (int i = 1; i < dropMultiplier; i++) { +// Bukkit.broadcastMessage("Bonus Drop on Ore: "+blockState.getType().toString()); Mining.handleSilkTouchDrops(blockState); // Bonus drops - should drop the block & not the items } } From dce9a3b58d8eee44f6949f2caa163eab19dd3ccd Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 5 May 2020 20:28:37 -0700 Subject: [PATCH 036/662] More Blast Mining bugfixes --- Changelog.txt | 2 + .../gmail/nossr50/skills/mining/Mining.java | 143 ------------------ .../nossr50/skills/mining/MiningManager.java | 2 +- src/main/resources/experience.yml | 1 + 4 files changed, 4 insertions(+), 144 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 75674e2d6..2a06835b1 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -2,9 +2,11 @@ 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. 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..029879356 100644 --- a/src/main/java/com/gmail/nossr50/skills/mining/Mining.java +++ b/src/main/java/com/gmail/nossr50/skills/mining/Mining.java @@ -24,147 +24,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 bd8a1c6fa..a4d5394dc 100644 --- a/src/main/java/com/gmail/nossr50/skills/mining/MiningManager.java +++ b/src/main/java/com/gmail/nossr50/skills/mining/MiningManager.java @@ -201,7 +201,7 @@ public class MiningManager extends SkillManager { if (!mcMMO.getPlaceStore().isTrue(blockState)) { for (int i = 1; i < dropMultiplier; i++) { // Bukkit.broadcastMessage("Bonus Drop on Ore: "+blockState.getType().toString()); - Mining.handleSilkTouchDrops(blockState); // Bonus drops - should drop the block & not the items + Misc.dropItem(Misc.getBlockCenter(blockState), new ItemStack(blockState.getType())); // Initial block that would have been dropped } } } diff --git a/src/main/resources/experience.yml b/src/main/resources/experience.yml index 1172932b7..148ce5a82 100644 --- a/src/main/resources/experience.yml +++ b/src/main/resources/experience.yml @@ -531,4 +531,5 @@ Experience_Values: Hoglin: 4.0 Zombie_Pigman: 3.0 Zombified_Piglin: 3.0 + Strider: 1.2 From b63311596b893d756338a8b8d210a024affa6052 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 5 May 2020 20:31:49 -0700 Subject: [PATCH 037/662] 2.1.128 --- Changelog.txt | 1 + pom.xml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index 2a06835b1..301cc60b4 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -9,6 +9,7 @@ Version 2.1.128 (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 diff --git a/pom.xml b/pom.xml index ebcf4102a..405d8ee3a 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.128-SNAPSHOT + 2.1.128 mcMMO https://github.com/mcMMO-Dev/mcMMO From f584783490d68acd1b183285dee5854aeb21151e Mon Sep 17 00:00:00 2001 From: nossr50 Date: Wed, 6 May 2020 09:04:57 -0700 Subject: [PATCH 038/662] dev mode --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 405d8ee3a..f34ba2db2 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.128 + 2.1.129-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO From 899a0152badf00869048a3ebd60053ec9f9c2aa6 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Wed, 6 May 2020 09:19:17 -0700 Subject: [PATCH 039/662] Add /mmoxpbar disable --- 1 | 11 ----------- Changelog.txt | 4 ++++ .../gmail/nossr50/commands/player/XPBarCommand.java | 5 +++++ .../nossr50/util/experience/ExperienceBarManager.java | 10 +++++++++- src/main/resources/locale/locale_en_US.properties | 1 + 5 files changed, 19 insertions(+), 12 deletions(-) delete mode 100644 1 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 301cc60b4..07fe2bc73 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,7 @@ +Version 2.1.129 + Added new subcommand /mmoxpbar disable - Hides all mcMMO XP bars + New locale string 'Commands.XPBar.DisableAll' + 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 diff --git a/src/main/java/com/gmail/nossr50/commands/player/XPBarCommand.java b/src/main/java/com/gmail/nossr50/commands/player/XPBarCommand.java index 1d933df03..99b6a6afb 100644 --- a/src/main/java/com/gmail/nossr50/commands/player/XPBarCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/player/XPBarCommand.java @@ -38,6 +38,9 @@ public class XPBarCommand implements TabExecutor { 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; } @@ -80,6 +83,8 @@ public class XPBarCommand implements TabExecutor { return ExperienceBarManager.XPBarSettingTarget.SHOW; case "reset": return ExperienceBarManager.XPBarSettingTarget.RESET; + case "disable": + return ExperienceBarManager.XPBarSettingTarget.DISABLE; } return null; 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 9bd52cd57..7a49a1260 100644 --- a/src/main/java/com/gmail/nossr50/util/experience/ExperienceBarManager.java +++ b/src/main/java/com/gmail/nossr50/util/experience/ExperienceBarManager.java @@ -92,6 +92,14 @@ public class ExperienceBarManager { 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: @@ -147,5 +155,5 @@ public class ExperienceBarManager { } } - public enum XPBarSettingTarget { SHOW, HIDE, RESET } + public enum XPBarSettingTarget { SHOW, HIDE, RESET, DISABLE } } diff --git a/src/main/resources/locale/locale_en_US.properties b/src/main/resources/locale/locale_en_US.properties index be987166e..869b99c3e 100644 --- a/src/main/resources/locale/locale_en_US.properties +++ b/src/main/resources/locale/locale_en_US.properties @@ -1115,3 +1115,4 @@ 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=[[GOLD]]Compatibility for [[GREEN]]{0}[[GOLD]] is not supported by this version of Minecraft. Compatibility.Layer.PartialSupport=[[GOLD]]Compatibility for [[GREEN]]{0}[[GOLD]] 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=[[GOLD]] All mcMMO XP bars are now disabled, use /mmoxpbar reset to restore default settings. \ No newline at end of file From 23cf9edf9c60ef4477c9943b885f25d9c0bc178e Mon Sep 17 00:00:00 2001 From: Draycia Date: Wed, 27 May 2020 01:17:10 -0700 Subject: [PATCH 040/662] Don't handle activation when player can't use skill --- .../java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java | 4 ++++ 1 file changed, 4 insertions(+) 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 6fcae8bdd..d848d98d9 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java +++ b/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java @@ -933,6 +933,10 @@ public class McMMOPlayer { } public void processAbilityActivation(PrimarySkillType skill) { + if (!skill.getPermissions(getPlayer())) { + return; + } + if (Config.getInstance().getAbilitiesOnlyActivateWhenSneaking() && !player.isSneaking()) { return; } From 4b803039286e824c14ccab5b06e2894eb08ec03f Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sat, 20 Jun 2020 21:01:49 -0700 Subject: [PATCH 041/662] Add blackstone to mining XP --- src/main/resources/experience.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/resources/experience.yml b/src/main/resources/experience.yml index 148ce5a82..fa0875e70 100644 --- a/src/main/resources/experience.yml +++ b/src/main/resources/experience.yml @@ -367,6 +367,7 @@ Experience_Values: Lily_Of_The_Valley: 150 Wither_Rose: 500 Mining: + Blackstone: 55 Warped_Nylium: 5 Crimson_Nylium: 5 Ancient_Debris: 7777 From a159368a3d1678240dfb8a07c8130af6eba366af Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sat, 20 Jun 2020 21:06:57 -0700 Subject: [PATCH 042/662] Add chain XP --- Changelog.txt | 2 ++ src/main/resources/experience.yml | 1 + 2 files changed, 3 insertions(+) diff --git a/Changelog.txt b/Changelog.txt index 07fe2bc73..79008f1df 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,6 +1,8 @@ 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 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) diff --git a/src/main/resources/experience.yml b/src/main/resources/experience.yml index fa0875e70..bb712a3a8 100644 --- a/src/main/resources/experience.yml +++ b/src/main/resources/experience.yml @@ -367,6 +367,7 @@ Experience_Values: Lily_Of_The_Valley: 150 Wither_Rose: 500 Mining: + Chain: 100 Blackstone: 55 Warped_Nylium: 5 Crimson_Nylium: 5 From 4025fd94cb5c2cdf9c215c3e2534d0e4f774848b Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sat, 20 Jun 2020 21:51:55 -0700 Subject: [PATCH 043/662] Add cracked nether brick xp --- Changelog.txt | 1 + src/main/resources/experience.yml | 1 + 2 files changed, 2 insertions(+) diff --git a/Changelog.txt b/Changelog.txt index 79008f1df..4ebd2b745 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -3,6 +3,7 @@ Version 2.1.129 New locale string 'Commands.XPBar.DisableAll' Added Blackstone to Mining experience tables Added Chain to Mining experience tables + Added Cracked Nether Bricks to Mining experience tables 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) diff --git a/src/main/resources/experience.yml b/src/main/resources/experience.yml index bb712a3a8..c1b0d2d31 100644 --- a/src/main/resources/experience.yml +++ b/src/main/resources/experience.yml @@ -383,6 +383,7 @@ Experience_Values: Diamond_Ore: 2400 Emerald_Ore: 1000 End_Bricks: 50 + Cracked_Nether_Bricks: 50 Nether_Bricks: 50 End_Stone: 15 Glowstone: 15 From 1f26d8e054095e49a2c4e0cc8279899023f013b0 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sat, 20 Jun 2020 21:54:31 -0700 Subject: [PATCH 044/662] Add chiseled nether brick XP --- Changelog.txt | 1 + src/main/resources/experience.yml | 1 + 2 files changed, 2 insertions(+) diff --git a/Changelog.txt b/Changelog.txt index 4ebd2b745..9f57050d0 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -4,6 +4,7 @@ Version 2.1.129 Added Blackstone to Mining experience tables Added Chain to Mining experience tables Added Cracked Nether Bricks to Mining experience tables + Added Chiseled Nether Bricks to Mining experience tables 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) diff --git a/src/main/resources/experience.yml b/src/main/resources/experience.yml index c1b0d2d31..d22fc1dc7 100644 --- a/src/main/resources/experience.yml +++ b/src/main/resources/experience.yml @@ -383,6 +383,7 @@ Experience_Values: Diamond_Ore: 2400 Emerald_Ore: 1000 End_Bricks: 50 + Chiseled_Nether_Bricks: 50 Cracked_Nether_Bricks: 50 Nether_Bricks: 50 End_Stone: 15 From d874b2df39973ad9f65992db8997c9ec8f4c0b70 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sat, 20 Jun 2020 22:19:29 -0700 Subject: [PATCH 045/662] Add crying obsidian XP --- Changelog.txt | 3 +++ src/main/resources/experience.yml | 1 + 2 files changed, 4 insertions(+) diff --git a/Changelog.txt b/Changelog.txt index 9f57050d0..3a141228a 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -5,6 +5,9 @@ Version 2.1.129 Added Chain 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 + + Edit your experience.yml or delete it to generate a new one 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) diff --git a/src/main/resources/experience.yml b/src/main/resources/experience.yml index d22fc1dc7..a52afb6c8 100644 --- a/src/main/resources/experience.yml +++ b/src/main/resources/experience.yml @@ -367,6 +367,7 @@ Experience_Values: Lily_Of_The_Valley: 150 Wither_Rose: 500 Mining: + Crying_Obsidian: 3000 Chain: 100 Blackstone: 55 Warped_Nylium: 5 From 4460d3df6728415333055150d9032888a21072d8 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sat, 20 Jun 2020 22:21:27 -0700 Subject: [PATCH 046/662] Add gilded blackstone XP --- Changelog.txt | 1 + src/main/resources/experience.yml | 1 + 2 files changed, 2 insertions(+) diff --git a/Changelog.txt b/Changelog.txt index 3a141228a..30d1548af 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -6,6 +6,7 @@ Version 2.1.129 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 Edit your experience.yml or delete it to generate a new one diff --git a/src/main/resources/experience.yml b/src/main/resources/experience.yml index a52afb6c8..5dc1dcca9 100644 --- a/src/main/resources/experience.yml +++ b/src/main/resources/experience.yml @@ -391,6 +391,7 @@ Experience_Values: Glowstone: 15 Gold_Ore: 1300 Nether_Gold_Ore: 1300 + Gilded_Blackstone: 1300 Terracotta: 30 Iron_Ore: 900 Lapis_Ore: 800 From 2f650a4789a54ce9b93f7c8d0c1d466c0000b657 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 22 Jun 2020 02:19:23 -0700 Subject: [PATCH 047/662] Tweak gilded blackstone XP --- src/main/resources/experience.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/experience.yml b/src/main/resources/experience.yml index 5dc1dcca9..10cf3898b 100644 --- a/src/main/resources/experience.yml +++ b/src/main/resources/experience.yml @@ -391,7 +391,7 @@ Experience_Values: Glowstone: 15 Gold_Ore: 1300 Nether_Gold_Ore: 1300 - Gilded_Blackstone: 1300 + Gilded_Blackstone: 200 Terracotta: 30 Iron_Ore: 900 Lapis_Ore: 800 From 0a26f7122a6460714633a488e9f4e43f69c1fe00 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 22 Jun 2020 02:23:29 -0700 Subject: [PATCH 048/662] Add hyphae to woodcutting xp --- Changelog.txt | 4 ++++ src/main/resources/experience.yml | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/Changelog.txt b/Changelog.txt index 30d1548af..d7403b360 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -7,6 +7,10 @@ Version 2.1.129 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 Edit your experience.yml or delete it to generate a new one diff --git a/src/main/resources/experience.yml b/src/main/resources/experience.yml index 10cf3898b..4446b6eb0 100644 --- a/src/main/resources/experience.yml +++ b/src/main/resources/experience.yml @@ -249,6 +249,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 From c60fbf17612b75b0f1584828e959aa24ea240e43 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 22 Jun 2020 02:25:41 -0700 Subject: [PATCH 049/662] Add lodestone to ability / tool blacklists --- Changelog.txt | 1 + src/main/java/com/gmail/nossr50/util/MaterialMapStore.java | 2 ++ 2 files changed, 3 insertions(+) diff --git a/Changelog.txt b/Changelog.txt index d7403b360..e412fb987 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -11,6 +11,7 @@ Version 2.1.129 Added Stripped Crimson Hyphae to Woodcutting experience tables Added Warped Hyphae to Woodcutting experience tables Added Stripped Warped Hyphae to Woodcutting experience tables + Lodestone will now be ignored for activating abilities Edit your experience.yml or delete it to generate a new one diff --git a/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java b/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java index ef5e6891d..e7db2f768 100644 --- a/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java +++ b/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java @@ -944,6 +944,7 @@ public class MaterialMapStore { abilityBlackList.add("blast_furnace"); abilityBlackList.add("campfire"); abilityBlackList.add("composter"); + abilityBlackList.add("lodestone"); } private void fillToolBlackList() @@ -1080,6 +1081,7 @@ public class MaterialMapStore { toolBlackList.add("loom"); toolBlackList.add("smoker"); toolBlackList.add("stonecutter"); + toolBlackList.add("lodestone"); } public int getTier(Material material) { From 3fe0b44ce8462bcc85f694c534973c863fa681f1 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 22 Jun 2020 02:28:56 -0700 Subject: [PATCH 050/662] Add respawn anchors to blacklist --- Changelog.txt | 1 + src/main/java/com/gmail/nossr50/util/MaterialMapStore.java | 2 ++ 2 files changed, 3 insertions(+) diff --git a/Changelog.txt b/Changelog.txt index e412fb987..3dc08820b 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -12,6 +12,7 @@ Version 2.1.129 Added Warped Hyphae to Woodcutting experience tables Added Stripped Warped Hyphae to Woodcutting experience tables Lodestone will now be ignored for activating abilities + Respawn Anchor will now be ignored for activating abilities Edit your experience.yml or delete it to generate a new one diff --git a/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java b/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java index e7db2f768..76faca867 100644 --- a/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java +++ b/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java @@ -945,6 +945,7 @@ public class MaterialMapStore { abilityBlackList.add("campfire"); abilityBlackList.add("composter"); abilityBlackList.add("lodestone"); + abilityBlackList.add("respawn_anchor"); } private void fillToolBlackList() @@ -1082,6 +1083,7 @@ public class MaterialMapStore { toolBlackList.add("smoker"); toolBlackList.add("stonecutter"); toolBlackList.add("lodestone"); + toolBlackList.add("respawn_anchor"); } public int getTier(Material material) { From 369251fb6b58ea825d56cee0306b6cb01046ce67 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 22 Jun 2020 02:30:46 -0700 Subject: [PATCH 051/662] Add shroomlight to herbalism XP tables --- Changelog.txt | 1 + src/main/resources/experience.yml | 1 + 2 files changed, 2 insertions(+) diff --git a/Changelog.txt b/Changelog.txt index 3dc08820b..b98817758 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -11,6 +11,7 @@ Version 2.1.129 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 Lodestone will now be ignored for activating abilities Respawn Anchor will now be ignored for activating abilities diff --git a/src/main/resources/experience.yml b/src/main/resources/experience.yml index 4446b6eb0..b564daeec 100644 --- a/src/main/resources/experience.yml +++ b/src/main/resources/experience.yml @@ -293,6 +293,7 @@ Experience_Values: Nether_Sprouts: 10 Crimson_Fungus: 50 Warped_Fungus: 50 + Shroomlight: 250 Bee_Nest: 200 Sweet_Berry_Bush: 50 Seagrass: 10 From 795b1ffff592970f08633b211df75e46c1dcd49e Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 22 Jun 2020 02:32:45 -0700 Subject: [PATCH 052/662] Ignore soul campfires when activating abilities --- Changelog.txt | 1 + src/main/java/com/gmail/nossr50/util/MaterialMapStore.java | 2 ++ 2 files changed, 3 insertions(+) diff --git a/Changelog.txt b/Changelog.txt index b98817758..b1f5d40b8 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -14,6 +14,7 @@ Version 2.1.129 Added Shroomlight to Herbalism experience tables 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 diff --git a/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java b/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java index 76faca867..df51f1d42 100644 --- a/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java +++ b/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java @@ -943,6 +943,7 @@ 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"); @@ -1075,6 +1076,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"); From c37a8e10d522c405d422031dc1ca4d3066b30ce5 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 22 Jun 2020 02:45:29 -0700 Subject: [PATCH 053/662] Add zoglin XP --- Changelog.txt | 1 + src/main/resources/experience.yml | 1 + 2 files changed, 2 insertions(+) diff --git a/Changelog.txt b/Changelog.txt index b1f5d40b8..e99bef945 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -12,6 +12,7 @@ Version 2.1.129 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 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 diff --git a/src/main/resources/experience.yml b/src/main/resources/experience.yml index b564daeec..faccc212a 100644 --- a/src/main/resources/experience.yml +++ b/src/main/resources/experience.yml @@ -543,4 +543,5 @@ Experience_Values: Zombie_Pigman: 3.0 Zombified_Piglin: 3.0 Strider: 1.2 + Zoglin: 1.3 From 382a9a77a7dd73ead235c38da13de0e67635a56d Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 22 Jun 2020 02:49:26 -0700 Subject: [PATCH 054/662] Add Bone Block mining xp --- Changelog.txt | 1 + src/main/resources/experience.yml | 1 + 2 files changed, 2 insertions(+) diff --git a/Changelog.txt b/Changelog.txt index e99bef945..2b86bbbdf 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -3,6 +3,7 @@ Version 2.1.129 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 diff --git a/src/main/resources/experience.yml b/src/main/resources/experience.yml index faccc212a..d7896e4da 100644 --- a/src/main/resources/experience.yml +++ b/src/main/resources/experience.yml @@ -372,6 +372,7 @@ Experience_Values: Lily_Of_The_Valley: 150 Wither_Rose: 500 Mining: + Bone_Block: 500 Crying_Obsidian: 3000 Chain: 100 Blackstone: 55 From 41139e93f576dbbc8143fb109473a5241b1df68d Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 22 Jun 2020 02:49:52 -0700 Subject: [PATCH 055/662] Tweak zoglin XP --- src/main/resources/experience.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/experience.yml b/src/main/resources/experience.yml index d7896e4da..b70891392 100644 --- a/src/main/resources/experience.yml +++ b/src/main/resources/experience.yml @@ -544,5 +544,5 @@ Experience_Values: Zombie_Pigman: 3.0 Zombified_Piglin: 3.0 Strider: 1.2 - Zoglin: 1.3 + Zoglin: 2.5 From 36d0df1c544812da2641e1c709a0c7b87c2ae98c Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 22 Jun 2020 03:01:28 -0700 Subject: [PATCH 056/662] Add Redstone Dust to bonus drops --- Changelog.txt | 2 ++ src/main/resources/config.yml | 1 + 2 files changed, 3 insertions(+) diff --git a/Changelog.txt b/Changelog.txt index 2b86bbbdf..6c9e8b53f 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -14,11 +14,13 @@ Version 2.1.129 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 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) diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 9f1a35414..539a48505 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -496,6 +496,7 @@ Bonus_Drops: Nether_Quartz: true Redstone_Ore: true Redstone: true + Redstone_Dust: true Sandstone: true Stone: true Cobblestone: true From 7ba65499fea359fb996f4f60cc69ba7630ce4bf5 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 22 Jun 2020 03:21:30 -0700 Subject: [PATCH 057/662] 2.1.129 --- Changelog.txt | 2 ++ pom.xml | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index 6c9e8b53f..b5885c5c5 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -22,6 +22,8 @@ Version 2.1.129 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 diff --git a/pom.xml b/pom.xml index f34ba2db2..1b4cc1fe4 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.129-SNAPSHOT + 2.1.129 mcMMO https://github.com/mcMMO-Dev/mcMMO From c84c428fde06eb82f209be03624908e09bc65f57 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 22 Jun 2020 03:31:00 -0700 Subject: [PATCH 058/662] dev mode --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1b4cc1fe4..27da2a59f 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.129 + 2.1.130-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO From dd011c94c65c0ff042728353bbd7cc4abb1d0dba Mon Sep 17 00:00:00 2001 From: darbyjack Date: Mon, 22 Jun 2020 17:10:29 -0500 Subject: [PATCH 059/662] Implemented PlayerItemDamageEvent on TreeFeller --- .../skills/woodcutting/WoodcuttingManager.java | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) 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..f7f809355 100644 --- a/src/main/java/com/gmail/nossr50/skills/woodcutting/WoodcuttingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/woodcutting/WoodcuttingManager.java @@ -17,11 +17,13 @@ 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 java.util.ArrayList; @@ -112,7 +114,7 @@ public class WoodcuttingManager extends SkillManager { } // 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(); @@ -200,9 +202,10 @@ 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(Set treeFellerBlocks, ItemStack inHand, Player player) { //Treat the NBT tag for unbreakable and the durability enchant differently if(inHand.getItemMeta() != null && inHand.getItemMeta().isUnbreakable()) { return true; @@ -217,6 +220,14 @@ public class WoodcuttingManager extends SkillManager { } } + // Call PlayerItemDamageEvent first to make sure it's not cancelled + 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())); } From 83617b73b70f09a0b014fae2989e7e636df283db Mon Sep 17 00:00:00 2001 From: nossr50 Date: Wed, 24 Jun 2020 23:39:14 -0700 Subject: [PATCH 060/662] Fix repair --- Changelog.txt | 6 ++++++ pom.xml | 2 +- .../gmail/nossr50/config/skills/repair/RepairConfig.java | 2 ++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index b5885c5c5..2a92cb047 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,9 @@ +Version 2.1.130 + Fixed a bug that prevented Repair from working on the new Netherite weapons/armors + + NOTES: + 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' diff --git a/pom.xml b/pom.xml index 27da2a59f..dcaca0707 100755 --- a/pom.xml +++ b/pom.xml @@ -167,7 +167,7 @@ org.spigotmc spigot-api - 1.15.2-R0.1-SNAPSHOT + 1.16.1-R0.1-SNAPSHOT provided 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 ef55f073a..5c2f78dac 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 @@ -80,6 +80,8 @@ public class RepairConfig extends ConfigLoader { } else if (ItemUtils.isDiamondArmor(repairItem) || ItemUtils.isDiamondTool(repairItem)) { repairMaterialType = MaterialType.DIAMOND; + } else if (ItemUtils.isNetheriteArmor(repairItem) || ItemUtils.isNetheriteTool(repairItem)) { + repairMaterialType = MaterialType.NETHER; } } else { From dab255254cedee40690226cde793d48b9aa30658 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 26 Jun 2020 14:45:26 -0700 Subject: [PATCH 061/662] Automatic spelling mistake correction on repair/salvage configs for previously misspelled netherite materials --- Changelog.txt | 3 + .../skills/repair/RepairConfigManager.java | 9 +++ .../skills/salvage/SalvageConfigManager.java | 10 ++++ .../datatypes/database/UpgradeType.java | 2 + .../datatypes/player/PlayerProfile.java | 1 - .../gmail/nossr50/skills/mining/Mining.java | 3 - .../nossr50/skills/mining/MiningManager.java | 1 - .../util/FixSpellingNetheriteUtil.java | 60 +++++++++++++++++++ src/main/resources/upgrades.yml | 2 + 9 files changed, 86 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/gmail/nossr50/util/FixSpellingNetheriteUtil.java diff --git a/Changelog.txt b/Changelog.txt index 2a92cb047..d83a69412 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,7 +1,10 @@ Version 2.1.130 Fixed a bug that prevented Repair from working on the new Netherite weapons/armors + mcMMO will now run a script to fix a misspelling of netherite in repair/salvage configs (script only runs once and then never again) + 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 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..40dd249ba 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 @@ -1,7 +1,9 @@ package com.gmail.nossr50.config.skills.repair; +import com.gmail.nossr50.datatypes.database.UpgradeType; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.skills.repair.repairables.Repairable; +import com.gmail.nossr50.util.FixSpellingNetheriteUtil; import java.io.File; import java.util.ArrayList; @@ -31,6 +33,13 @@ public class RepairConfigManager { continue; } + + if(mcMMO.getUpgradeManager().shouldUpgrade(UpgradeType.FIX_SPELLING_NETHERITE_REPAIR)) { + //Check spelling mistakes (early versions of 1.16 support had Netherite misspelled) + plugin.getLogger().info("Checking for certain invalid material names in Repair config..."); + FixSpellingNetheriteUtil.processFileCheck(mcMMO.p, fileName, UpgradeType.FIX_SPELLING_NETHERITE_REPAIR); + } + RepairConfig rConfig = new RepairConfig(fileName); repairables.addAll(rConfig.getLoadedRepairables()); } 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..39ba3b463 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 @@ -1,7 +1,9 @@ package com.gmail.nossr50.config.skills.salvage; +import com.gmail.nossr50.datatypes.database.UpgradeType; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.skills.salvage.salvageables.Salvageable; +import com.gmail.nossr50.util.FixSpellingNetheriteUtil; import java.io.File; import java.util.ArrayList; @@ -31,6 +33,14 @@ public class SalvageConfigManager { continue; } + + if(mcMMO.getUpgradeManager().shouldUpgrade(UpgradeType.FIX_SPELLING_NETHERITE_SALVAGE)) { + //Check spelling mistakes (early versions of 1.16 support had Netherite misspelled) + plugin.getLogger().info("Checking for certain invalid material names in Salvage config..."); + FixSpellingNetheriteUtil.processFileCheck(mcMMO.p, fileName, UpgradeType.FIX_SPELLING_NETHERITE_SALVAGE); + } + + SalvageConfig salvageConfig = new SalvageConfig(fileName); salvageables.addAll(salvageConfig.getLoadedSalvageables()); } 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..cb20350df 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,6 @@ public enum UpgradeType { DROP_NAME_UNIQUENESS, ADD_SKILL_TOTAL, ADD_UNIQUE_PLAYER_DATA, + FIX_SPELLING_NETHERITE_SALVAGE, + FIX_SPELLING_NETHERITE_REPAIR } 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 d58a872c7..ceefb54d3 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/player/PlayerProfile.java +++ b/src/main/java/com/gmail/nossr50/datatypes/player/PlayerProfile.java @@ -12,7 +12,6 @@ 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.SkillUtils; import com.google.common.collect.ImmutableMap; import java.util.HashMap; 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 029879356..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 { 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 a4d5394dc..c72811472 100644 --- a/src/main/java/com/gmail/nossr50/skills/mining/MiningManager.java +++ b/src/main/java/com/gmail/nossr50/skills/mining/MiningManager.java @@ -18,7 +18,6 @@ import com.gmail.nossr50.util.random.RandomChanceUtil; import com.gmail.nossr50.util.skills.RankUtils; import com.gmail.nossr50.util.skills.SkillUtils; import org.apache.commons.lang.math.RandomUtils; -import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.BlockState; 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/resources/upgrades.yml b/src/main/resources/upgrades.yml index 3858dfe0c..12345b4da 100644 --- a/src/main/resources/upgrades.yml +++ b/src/main/resources/upgrades.yml @@ -7,3 +7,5 @@ Upgrades_Finished: DROP_SQL_PARTY_NAMES: false DROP_SPOUT: false ADD_ALCHEMY: false + FIX_SPELLING_NETHERITE_SALVAGE: false + FIX_SPELLING_NETHERITE_REPAIR: false From 6b340838eea8bca50a1b8ff5e332c495809acf40 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 26 Jun 2020 15:00:52 -0700 Subject: [PATCH 062/662] Use the correct default repair material for netherite gear --- Changelog.txt | 2 ++ .../com/gmail/nossr50/datatypes/skills/MaterialType.java | 6 +++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index d83a69412..64fe2acc2 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,6 +1,8 @@ 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 ItemDamageEvent before damaging axes in Tree Feller execution NOTES: 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..27369419b 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/skills/MaterialType.java +++ b/src/main/java/com/gmail/nossr50/datatypes/skills/MaterialType.java @@ -37,10 +37,10 @@ public enum MaterialType { return Material.DIAMOND; case NETHER: - if(Material.getMaterial("netherite_scrap") != null) - return Material.getMaterial("netherite_scrap"); + if(Material.getMaterial("NETHERITE_SCRAP") != null) + return Material.getMaterial("NETHERITE_SCRAP"); else - return Material.GOLD_INGOT; + return Material.DIAMOND; case OTHER: default: From ed69f843aa944b5e5cbc4aed40cb7f4152620e0c Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 26 Jun 2020 15:04:03 -0700 Subject: [PATCH 063/662] 2.1.130 --- Changelog.txt | 2 +- pom.xml | 2 +- .../gmail/nossr50/skills/woodcutting/WoodcuttingManager.java | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 64fe2acc2..b5460fe06 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -2,7 +2,7 @@ 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 ItemDamageEvent before damaging axes in Tree Feller execution + mcMMO will produce a fake PlayerItemDamageEvent before damaging axes in Tree Feller execution NOTES: diff --git a/pom.xml b/pom.xml index dcaca0707..a002cac80 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.130-SNAPSHOT + 2.1.130 mcMMO https://github.com/mcMMO-Dev/mcMMO 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 f7f809355..8c6ce621e 100644 --- a/src/main/java/com/gmail/nossr50/skills/woodcutting/WoodcuttingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/woodcutting/WoodcuttingManager.java @@ -221,6 +221,7 @@ public class WoodcuttingManager extends SkillManager { } // 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); From 6dd5510cd8cf55ae026fb9f5cc341faf050bbfdf Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 30 Jun 2020 07:27:52 -0700 Subject: [PATCH 064/662] dev mode --- Changelog.txt | 2 ++ pom.xml | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index b5460fe06..4088acf26 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,5 @@ +Version 2.1.131 + 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) diff --git a/pom.xml b/pom.xml index a002cac80..bd3350dd2 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.130 + 2.1.131-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO From 4638f22ade84983476305dabfd4affd7490f330c Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 30 Jun 2020 09:17:48 -0700 Subject: [PATCH 065/662] Missing 1.16 bonus drop entries --- Changelog.txt | 30 ++++++++++++++++++++++++++++++ src/main/resources/config.yml | 24 ++++++++++++++++++++++++ src/main/resources/experience.yml | 1 + 3 files changed, 55 insertions(+) diff --git a/Changelog.txt b/Changelog.txt index 4088acf26..23c477add 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,4 +1,34 @@ Version 2.1.131 + 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) + + NOTES: + + This update adds an array of 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 diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 539a48505..9306f5d8f 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -427,6 +427,15 @@ Skills: ### Bonus_Drops: Herbalism: + 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 +476,17 @@ Bonus_Drops: Peony: true Lily_Of_The_Valley: true Mining: + 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 @@ -501,6 +521,10 @@ Bonus_Drops: Stone: true Cobblestone: true Woodcutting: + Crimson_Hyphae: true + Warped_Hyphae: true + Stripped_Crimson_Hyphae: true + Stripped_Warped_Hyphae: true Shroomlight: true Crimson_Stem: true Warped_Stem: true diff --git a/src/main/resources/experience.yml b/src/main/resources/experience.yml index b70891392..3600c29ce 100644 --- a/src/main/resources/experience.yml +++ b/src/main/resources/experience.yml @@ -393,6 +393,7 @@ Experience_Values: Chiseled_Nether_Bricks: 50 Cracked_Nether_Bricks: 50 Nether_Bricks: 50 + Red_Nether_Bricks: 50 End_Stone: 15 Glowstone: 15 Gold_Ore: 1300 From b0ce6fb1703b871ec5b67e2ea4fb1bec9eb5d07f Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 30 Jun 2020 09:35:47 -0700 Subject: [PATCH 066/662] Missing permission nodes + missing repair XP --- Changelog.txt | 8 +++++++- .../gmail/nossr50/config/skills/repair/RepairConfig.java | 2 +- .../nossr50/config/skills/salvage/SalvageConfig.java | 2 +- .../com/gmail/nossr50/datatypes/skills/MaterialType.java | 4 ++-- src/main/resources/experience.yml | 1 + src/main/resources/plugin.yml | 6 ++++++ 6 files changed, 18 insertions(+), 5 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 23c477add..55252c529 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,4 +1,8 @@ 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 + 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) @@ -24,10 +28,12 @@ Version 2.1.131 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) NOTES: - This update adds an array of missing entries for bonus drops, without these entries double drops on these items/blocks will not happen. + This update adds quite a few missing entries for bonus drops, without these entries double drops on these items/blocks will not happen. + You should not need to edit your configs to receive these changes. Version 2.1.130 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 5c2f78dac..8449faf2b 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 @@ -81,7 +81,7 @@ public class RepairConfig extends ConfigLoader { else if (ItemUtils.isDiamondArmor(repairItem) || ItemUtils.isDiamondTool(repairItem)) { repairMaterialType = MaterialType.DIAMOND; } else if (ItemUtils.isNetheriteArmor(repairItem) || ItemUtils.isNetheriteTool(repairItem)) { - repairMaterialType = MaterialType.NETHER; + repairMaterialType = MaterialType.NETHERITE; } } else { 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 a5a6fbfd1..0b56f9061 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 @@ -76,7 +76,7 @@ public class SalvageConfig extends ConfigLoader { 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 { 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 27369419b..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,7 +36,7 @@ public enum MaterialType { case DIAMOND: return Material.DIAMOND; - case NETHER: + case NETHERITE: if(Material.getMaterial("NETHERITE_SCRAP") != null) return Material.getMaterial("NETHERITE_SCRAP"); else diff --git a/src/main/resources/experience.yml b/src/main/resources/experience.yml index 3600c29ce..739789b93 100644 --- a/src/main/resources/experience.yml +++ b/src/main/resources/experience.yml @@ -450,6 +450,7 @@ Experience_Values: Iron: 2.5 Gold: 0.3 Diamond: 5.0 + Netherite: 6.0 Leather: 1.6 String: 1.8 Other: 1.5 diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 0de7167d5..e9f96d960 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -465,6 +465,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 @@ -481,6 +482,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: @@ -517,6 +520,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 @@ -532,6 +536,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: From 78eb367b86771514be9e2180758f82974639368d Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 30 Jun 2020 10:03:37 -0700 Subject: [PATCH 067/662] Repair / Salvage fixes --- Changelog.txt | 4 +++ .../config/skills/salvage/SalvageConfig.java | 23 ++++++++++++- .../datatypes/database/UpgradeType.java | 3 +- .../gmail/nossr50/util/MaterialMapStore.java | 9 +++++ src/main/resources/salvage.vanilla.yml | 34 +++++++++---------- src/main/resources/upgrades.yml | 1 + 6 files changed, 55 insertions(+), 19 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 55252c529..de462ca8c 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -29,9 +29,13 @@ Version 2.1.131 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) + Changed Salvage maximum quantity values to 4 for all Netherite gear + + Netherite now requires 100 Salvage skill (by default configs) in order to salvage NOTES: + 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. You should not need to edit your configs to receive these changes. 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 0b56f9061..a9823ceba 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,17 +1,20 @@ package com.gmail.nossr50.config.skills.salvage; import com.gmail.nossr50.config.ConfigLoader; +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; import com.gmail.nossr50.skills.salvage.salvageables.Salvageable; import com.gmail.nossr50.skills.salvage.salvageables.SalvageableFactory; import com.gmail.nossr50.util.ItemUtils; +import com.gmail.nossr50.util.MaterialMapStore; import com.gmail.nossr50.util.skills.SkillUtils; import org.bukkit.Material; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.inventory.ItemStack; +import java.io.IOException; import java.util.*; public class SalvageConfig extends ConfigLoader { @@ -36,6 +39,24 @@ 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); + } + + 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(); @@ -131,7 +152,7 @@ public class SalvageConfig extends ConfigLoader { } // 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); 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 cb20350df..412af6fbc 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/database/UpgradeType.java +++ b/src/main/java/com/gmail/nossr50/datatypes/database/UpgradeType.java @@ -15,5 +15,6 @@ public enum UpgradeType { ADD_SKILL_TOTAL, ADD_UNIQUE_PLAYER_DATA, FIX_SPELLING_NETHERITE_SALVAGE, - FIX_SPELLING_NETHERITE_REPAIR + FIX_SPELLING_NETHERITE_REPAIR, + FIX_NETHERITE_SALVAGE_QUANTITIES } diff --git a/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java b/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java index df51f1d42..15f52fcbc 100644 --- a/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java +++ b/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java @@ -1088,6 +1088,15 @@ public class MaterialMapStore { toolBlackList.add("respawn_anchor"); } + public HashSet getNetheriteArmor() { + return netheriteArmor; + } + + public HashSet getNetheriteTools() { + return netheriteTools; + } + + public int getTier(Material material) { return getTier(material.getKey().getKey()); } 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/upgrades.yml b/src/main/resources/upgrades.yml index 12345b4da..7e392e7f0 100644 --- a/src/main/resources/upgrades.yml +++ b/src/main/resources/upgrades.yml @@ -9,3 +9,4 @@ Upgrades_Finished: ADD_ALCHEMY: false FIX_SPELLING_NETHERITE_SALVAGE: false FIX_SPELLING_NETHERITE_REPAIR: false + FIX_NETHERITE_SALVAGE_QUANTITIES: false From 6d6efa3442aa471a7b2e826dadfbf9dc601879a6 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 30 Jun 2020 10:05:35 -0700 Subject: [PATCH 068/662] add to changelog --- Changelog.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Changelog.txt b/Changelog.txt index de462ca8c..5d58761cf 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -2,6 +2,7 @@ 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 + 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) @@ -35,6 +36,7 @@ Version 2.1.131 NOTES: + 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. You should not need to edit your configs to receive these changes. From 420477149e88fad6b6b647893d08426d0cf34d35 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 30 Jun 2020 11:15:10 -0700 Subject: [PATCH 069/662] Add Piglin Brute XP --- Changelog.txt | 6 ++++-- src/main/resources/experience.yml | 1 + 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 5d58761cf..3ed607cb7 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -2,6 +2,7 @@ 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) @@ -30,16 +31,17 @@ Version 2.1.131 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) - Changed Salvage maximum quantity values to 4 for all Netherite gear + 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 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. - You should not need to edit your configs to receive these changes. Version 2.1.130 diff --git a/src/main/resources/experience.yml b/src/main/resources/experience.yml index 739789b93..e36f00ab4 100644 --- a/src/main/resources/experience.yml +++ b/src/main/resources/experience.yml @@ -542,6 +542,7 @@ 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 From 75f404f387cbaf51ea77e246eb9e66a01c3526d9 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 30 Jun 2020 11:35:36 -0700 Subject: [PATCH 070/662] Wire missing NMS --- Changelog.txt | 1 + .../gmail/nossr50/config/skills/salvage/SalvageConfig.java | 1 - .../layers/PlayerAttackCooldownExploitPreventionLayer.java | 3 +++ src/main/java/com/gmail/nossr50/util/nms/NMSConstants.java | 4 ++-- src/main/java/com/gmail/nossr50/util/nms/NMSVersion.java | 2 +- 5 files changed, 7 insertions(+), 4 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 3ed607cb7..79363e0f9 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -35,6 +35,7 @@ Version 2.1.131 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: 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 a9823ceba..bd1fd9819 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 @@ -8,7 +8,6 @@ import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.skills.salvage.salvageables.Salvageable; import com.gmail.nossr50.skills.salvage.salvageables.SalvageableFactory; import com.gmail.nossr50.util.ItemUtils; -import com.gmail.nossr50.util.MaterialMapStore; import com.gmail.nossr50.util.skills.SkillUtils; import org.bukkit.Material; import org.bukkit.configuration.ConfigurationSection; 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 index e21182d2c..46769536f 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/layers/PlayerAttackCooldownExploitPreventionLayer.java +++ b/src/main/java/com/gmail/nossr50/util/compat/layers/PlayerAttackCooldownExploitPreventionLayer.java @@ -56,6 +56,7 @@ public class PlayerAttackCooldownExploitPreventionLayer extends AbstractCompatib case NMS_1_13_2: case NMS_1_14_4: case NMS_1_15_2: + case NMS_1_16_1: return true; default: return false; @@ -189,6 +190,8 @@ public class PlayerAttackCooldownExploitPreventionLayer extends AbstractCompatib return wireNMS("dY", "s", "dZ", "getHandle"); case NMS_1_15_2: return wireNMS("ex", "s", "ey", "getHandle"); + case NMS_1_16_1: + return wireNMS("eR", "getAttackCooldown", "resetAttackCooldown", "getHandle"); default: break; } 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..6f740e084 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,8 @@ 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 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..51251c47a 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,7 @@ public enum NMSVersion { NMS_1_15_2("1.15.2"), //1.16 - NMS_1_16("1.16"), + NMS_1_16_1("1.16.1"), //Version not known to this build of mcMMO UNSUPPORTED("unsupported"); From 254e1a10714b518d0ed4d919d1be39da5505dec8 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 30 Jun 2020 11:51:46 -0700 Subject: [PATCH 071/662] 2.1.131 --- Changelog.txt | 1 - pom.xml | 2 +- .../gmail/nossr50/config/skills/salvage/SalvageConfig.java | 3 ++- .../com/gmail/nossr50/util/compat/CompatibilityManager.java | 5 +++++ src/main/resources/config.yml | 6 ------ 5 files changed, 8 insertions(+), 9 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 79363e0f9..9ca00e66f 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -33,7 +33,6 @@ Version 2.1.131 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...) diff --git a/pom.xml b/pom.xml index bd3350dd2..fa11cc956 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.131-SNAPSHOT + 2.1.131 mcMMO https://github.com/mcMMO-Dev/mcMMO 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 bd1fd9819..28bee3198 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 @@ -39,6 +39,7 @@ public class SalvageConfig extends ConfigLoader { 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()) { @@ -47,7 +48,7 @@ public class SalvageConfig extends ConfigLoader { try { config.save(getFile()); -// mcMMO.getUpgradeManager().setUpgradeCompleted(UpgradeType.FIX_NETHERITE_SALVAGE_QUANTITIES); + 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."); 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 7c687797a..e5d3a481a 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/CompatibilityManager.java +++ b/src/main/java/com/gmail/nossr50/util/compat/CompatibilityManager.java @@ -113,6 +113,11 @@ public class CompatibilityManager { return NMSVersion.NMS_1_14_4; case 15: return NMSVersion.NMS_1_15_2; + case 16: + switch(minecraftGameVersion.getPatchVersion().asInt()) { + case 1: + return NMSVersion.NMS_1_16_1; + } } } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 9306f5d8f..4fe07127c 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -336,10 +336,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,7 +351,6 @@ Skills: Mining: Level_Cap: 0 Detonator_Name: FLINT_AND_STEEL - Ability_Activation_Level_Gate: 10 Repair: Level_Cap: 0 Anvil_Messages: true @@ -376,7 +373,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 +405,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,7 +415,6 @@ Skills: Woodcutting: Tree_Feller_Sounds: true Level_Cap: 0 - Ability_Activation_Level_Gate: 10 # # Settings for Double Drops From ce03e6613fdc2066aaa41ef95e19bf2fc2ce2753 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 2 Jul 2020 20:53:57 -0700 Subject: [PATCH 072/662] Dev mode --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index fa11cc956..f20958d18 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.131 + 2.1.132-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO From 900a534edb92984b70aaedf865da28e022150ac6 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 2 Jul 2020 21:04:06 -0700 Subject: [PATCH 073/662] Inventory NPE fix --- Changelog.txt | 3 +++ .../java/com/gmail/nossr50/listeners/InventoryListener.java | 5 +++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 9ca00e66f..1f547c3f4 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,6 @@ +Version 2.1.132 + Fixed a NPE that could happen when players swapped items from their hotbar + Version 2.1.131 New permission node 'mcmmo.ability.repair.netheriterepair' which is included in the mcmmo.defaults permission package diff --git a/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java b/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java index 064f799c3..161baacf8 100644 --- a/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java @@ -435,8 +435,9 @@ public class InventoryListener implements Listener { @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onInventoryClickEvent(InventoryClickEvent event) { SkillUtils.removeAbilityBuff(event.getCurrentItem()); - if (event.getAction() == InventoryAction.HOTBAR_SWAP) { - SkillUtils.removeAbilityBuff(event.getWhoClicked().getInventory().getItem(event.getHotbarButton())); + if (event.getAction() == InventoryAction.HOTBAR_SWAP) {\ + if(event.getWhoClicked().getInventory().getItem(event.getHotbarButton()) != null) + SkillUtils.removeAbilityBuff(event.getWhoClicked().getInventory().getItem(event.getHotbarButton())); } } From 2fc1ba44d82794726f41023769d6589415632efc Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 2 Jul 2020 21:06:19 -0700 Subject: [PATCH 074/662] Oopsie --- .../java/com/gmail/nossr50/listeners/InventoryListener.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java b/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java index 161baacf8..b64246df2 100644 --- a/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java @@ -435,7 +435,7 @@ public class InventoryListener implements Listener { @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onInventoryClickEvent(InventoryClickEvent event) { SkillUtils.removeAbilityBuff(event.getCurrentItem()); - if (event.getAction() == InventoryAction.HOTBAR_SWAP) {\ + if (event.getAction() == InventoryAction.HOTBAR_SWAP) { if(event.getWhoClicked().getInventory().getItem(event.getHotbarButton()) != null) SkillUtils.removeAbilityBuff(event.getWhoClicked().getInventory().getItem(event.getHotbarButton())); } From f05c4121d246d701eacb9d3ed2797e014e5d1aef Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 3 Jul 2020 13:14:33 -0700 Subject: [PATCH 075/662] Temporary Spigot bug fix --- Changelog.txt | 4 ++++ src/main/java/com/gmail/nossr50/config/Config.java | 8 +++++++- .../nossr50/config/experience/ExperienceConfig.java | 12 ++++++++---- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 1f547c3f4..d2c0faedf 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,6 +1,10 @@ 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 diff --git a/src/main/java/com/gmail/nossr50/config/Config.java b/src/main/java/com/gmail/nossr50/config/Config.java index 69e0dc30a..2be3484c7 100644 --- a/src/main/java/com/gmail/nossr50/config/Config.java +++ b/src/main/java/com/gmail/nossr50/config/Config.java @@ -462,7 +462,13 @@ public class Config extends AutoUpdateConfigLoader { /* * SKILL SETTINGS */ - public boolean getDoubleDropsEnabled(PrimarySkillType skill, Material material) { return config.getBoolean("Bonus_Drops." + StringUtils.getCapitalized(skill.toString()) + "." + StringUtils.getPrettyItemString(material).replace(" ", "_")); } + 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().contains("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()); 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..3160283fa 100644 --- a/src/main/java/com/gmail/nossr50/config/experience/ExperienceConfig.java +++ b/src/main/java/com/gmail/nossr50/config/experience/ExperienceConfig.java @@ -206,16 +206,20 @@ public class ExperienceConfig extends AutoUpdateConfigLoader { 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().contains("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; From 7267b1501b4fdcccb1103f29b15c3cb784826253 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 3 Jul 2020 13:16:17 -0700 Subject: [PATCH 076/662] Why did I use contains() :thonk: --- src/main/java/com/gmail/nossr50/config/Config.java | 2 +- .../com/gmail/nossr50/config/experience/ExperienceConfig.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/config/Config.java b/src/main/java/com/gmail/nossr50/config/Config.java index 2be3484c7..1099cc4db 100644 --- a/src/main/java/com/gmail/nossr50/config/Config.java +++ b/src/main/java/com/gmail/nossr50/config/Config.java @@ -464,7 +464,7 @@ public class Config extends AutoUpdateConfigLoader { */ 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().contains("LILY_PAD")) + if(material.toString().equalsIgnoreCase("LILY_PAD")) return false; return config.getBoolean("Bonus_Drops." + StringUtils.getCapitalized(skill.toString()) + "." + StringUtils.getPrettyItemString(material).replace(" ", "_")); 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 3160283fa..a18a8b870 100644 --- a/src/main/java/com/gmail/nossr50/config/experience/ExperienceConfig.java +++ b/src/main/java/com/gmail/nossr50/config/experience/ExperienceConfig.java @@ -209,7 +209,7 @@ public class ExperienceConfig extends AutoUpdateConfigLoader { 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().contains("LILY_PAD")) + if(material.toString().equalsIgnoreCase("LILY_PAD")) return 0; String baseString = "Experience_Values." + StringUtils.getCapitalized(skill.toString()) + "."; From 919907f46a1bc508628e16f72ea3273cdb0aa459 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 3 Jul 2020 16:02:26 -0700 Subject: [PATCH 077/662] 2.1.132 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f20958d18..f46788bc8 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.132-SNAPSHOT + 2.1.132 mcMMO https://github.com/mcMMO-Dev/mcMMO From 005f8c547836144a1054264f74b8eb95e72cbf0e Mon Sep 17 00:00:00 2001 From: Elikill58 Date: Tue, 7 Jul 2020 15:50:47 +0200 Subject: [PATCH 078/662] Update french translation - begin with skills --- .../resources/locale/locale_fr.properties | 387 +++++++++++++----- 1 file changed, 279 insertions(+), 108 deletions(-) diff --git a/src/main/resources/locale/locale_fr.properties b/src/main/resources/locale/locale_fr.properties index 20740e130..405981b3a 100644 --- a/src/main/resources/locale/locale_fr.properties +++ b/src/main/resources/locale/locale_fr.properties @@ -1,62 +1,205 @@ + + +#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\u00e9tails +JSON.Type.Passive=Passive +JSON.Type.Active=Active +JSON.Type.SuperAbility=Super Abilit\u00e9 +JSON.Locked=-=[FERM\u00c9]=- +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=[[GOLD]]Lucky Perks +JSON.JWrapper.Perks.Lucky={0}% de chance suppl\u00e9mentaire +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\u00e9paration +JSON.Salvage=R\u00e9cup\u00e9ration +JSON.Swords=\u00c9p\u00e9e +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=[[GOLD]][ mcMMO[[YELLOW]] @[[DARK_AQUA]]{0} [[GOLD]]Grade [[DARK_AQUA]]{1}[[GOLD]] D\u00e9bloqu\u00e9! ] +JSON.Hover.Rank=&e&lGrade:&r &f{0} +JSON.Hover.NextRank=&7&oProchaine am\u00e9lioration 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=[[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]]@ + +#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=Si vous êtes accroupi lorsque vous tombez, vous \u00e9viterez de prendre des d\u00e9g\u00e2ts ! +Anvil.SingleItemStack=[[RED]]Vous ne pouvas pas r\u00e9cup\u00e9rer ou r\u00e9parer un item plus d\'un item à la fois, d\u00e9stackez 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=[[GOLD]]([[GREEN]]mcMMO[[GOLD]]) [[GRAY]]{0} +# BEGIN STYLING +Ability.Generic.Refresh=[[GREEN]]**ABILIT\u00c9S RECHARG\u00c9!** +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=EFFECTS +Effects.SubSkills.Overhaul=Sous-capacit\u00e9 +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=Statistiques +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 - R\u00e9visions [[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]]] +# 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.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\u00e9paration +Overhaul.Name.Salvage=R\u00e9cup\u00e9ration +Overhaul.Name.Smelting=Fonte +Overhaul.Name.Swords=\u00c9p\u00e9e +Overhaul.Name.Taming=Apprivoisement +Overhaul.Name.Unarmed=Poings +Overhaul.Name.Woodcutting=B\u00fbcheronnage +# style pour les commandes /mcMMO +Commands.mcc.Header=[[RED]]---[][[GREEN]]mcMMO Commandes[[RED]][]--- +Commands.Other=[[RED]]---[][[GREEN]]COMMANDES SP\u00c9CIALES[[RED]][]--- +Commands.Party.Header=[[RED]]-----[][[GREEN]]PARTIE[[RED]][]----- +Commands.Party.Features.Header=[[RED]]-----[][[GREEN]]FONCTIONNALIT\u00c9S[[RED]][]----- +# XP BAR accepte les variables -- {0} Niveau de comp\u00e9tence, {1} XP actuelle, {2} XP n\u00e9cessaire pour le niveau suivant, {3} Niveau de puissance, {4} Pourcentage du niveau +# Soyez s\u00fbr d\'avoir activ\u00e9 Experience_Bars.ThisMayCauseLag.AlwaysUpdateTitlesWhenXPIsGained si vous voulez la barre d\'XP à chaque fois que le joueur en gagne ! +XPBar.Template={0} +XPBar.Template.EarlyGameBoost=[[GOLD]]Apprentissage d\'une nouvelle comp\u00e9tence ... +XPBar.Acrobatics=Acrobatiques Lv.[[GOLD]]{0} +XPBar.Alchemy=Alchemie Lv.[[GOLD]]{0} +XPBar.Archery=Archerie Lv.[[GOLD]]{0} +XPBar.Axes=Haches Lv.[[GOLD]]{0} +XPBar.Excavation=Fouille Lv.[[GOLD]]{0} +XPBar.Fishing=Pêche Lv.[[GOLD]]{0} +XPBar.Herbalism=Herboristerie Lv.[[GOLD]]{0} +XPBar.Mining=Minage Lv.[[GOLD]]{0} +XPBar.Repair=R\u00e9paration Lv.[[GOLD]]{0} +XPBar.Salvage=R\u00e9cup\u00e9ration Lv.[[GOLD]]{0} +XPBar.Smelting=Fonte Lv.[[GOLD]]{0} +XPBar.Swords=\u00c9p\u00e9e Lv.[[GOLD]]{0} +XPBar.Taming=Apprivoisement Lv.[[GOLD]]{0} +XPBar.Unarmed=Poings Lv.[[GOLD]]{0} +XPBar.Woodcutting=B\u00fbcheronnage Lv.[[GOLD]]{0} +# Ceci n\'est qu\'un exemple qui peut être utilis\u00e9 quand l\'option 'ExtraDetails' dans experience.yml est activ\u00e9 (d\u00e9sactiv\u00e9 par d\u00e9faut), vous pouvez l\'ignor\u00e9 et juste modifier le message au dessus +XPBar.Complex.Template={0} [[DARK_AQUA]] {4}[[WHITE]]% [[DARK_AQUA]]([[WHITE]]{1}[[DARK_AQUA]]/[[WHITE]]{2}[[DARK_AQUA]]) +# XP BAR accepte les variables -- {0} Niveau de comp\u00e9tence, {1} XP actuelle, {2} XP n\u00e9cessaire pour le niveau suivant, {3} Niveau de puissance, {4} Pourcentage du niveau +# Soyez s\u00fbr d\'avoir activ\u00e9 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=[[GREEN]]**Atterrissage gracieux** Acrobatics.Combat.Proc=[[GREEN]]**Esquiv\u00e9** -Acrobatics.DodgeChance=Probabilit\u00e9 d\'esquive : [[YELLOW]]{0} +Acrobatics.SubSkill.Roll.Stats=[[GOLD]]Roll Chance [[YELLOW]]{0}%[[GOLD]] Graceful Roll Chance[[YELLOW]] {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.Chance=Chance d\'une roulade: [[YELLOW]]{0} +Acrobatics.SubSkill.Roll.GraceChance=Chance d\'une roulade gracieuse: [[YELLOW]]{0} +Acrobatics.SubSkill.Roll.Mechanics=[[GRAY]]La roulade est une sous-capacit\u00e9 avec une partie passive.\nLorsque vous prenez des d\u00e9g\u00e2ts de ch\u00fbtes, vous avez une chance de ne rien prendre, en fonction de votre niveau de comp\u00e9tence. Au niveau 50, vous avez [[YELLOW]]{0}%[[GRAY]] de chance de ne pas prendre de d\u00e9g\u00e2ts, et [[YELLOW]]{1}%[[GRAY]] si vous activ\u00e9 la roulade gracieuse.\nLa chance pour la r\u00e9ussite est calcul\u00e9 gr\u00e2ce à votre niveau de comp\u00e9tence, avec une courbe lin\u00e9aire jusqu\'au niveau [[YELLOW]]{2}[[GRAY]] son maximum. Tous les niveaux d\'acrobaties vous donnent [[YELLOW]]{3}%[[GRAY]] de chance de succ\u00e8s.\nEn s'accroupissant, vous pouvez doubler votre chance de ne pas prendre les d\u00e9g\u00e2ts de ch\u00fbte ! En sneakant, vous transformerez une roulade normal en une roulade gracieuse.\nUne roulade empêche jusqu\'à [[RED]]{4}[[GRAY]] d\u00e9g\u00e2ts. Une roulade gracieuse en empêche jusqu\'à [[GREEN]]{5}[[GRAY]]. 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.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=[[ITALIC]]**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.SubSkill.Concoctions.Stat=Classement des confectionneurs de potions: [[YELLOW]]{0}/{1} +Alchemy.SubSkill.Concoctions.Stat.Extra=Ingr\u00e9dients [[[YELLOW]]{0}[[RED]]]: [[YELLOW]]{1} +Alchemy.Listener=Alchemie: Alchemy.Ability.Locked.0=Bloqu\u00e9 jusqu\'\u00e0 {0}+ niveaux de talent (CATALYSE) -Alchemy.Catalysis.Speed=Vitesse de confection des poitions : [[YELLOW]]{0} -Alchemy.Concoctions.Rank=Classement des confectionneurs de potions: [[YELLOW]]{0}/{1} -Alchemy.Concoctions.Ingredients=Ingr\u00e9dients [[[YELLOW]]{0}[[RED]]]: [[YELLOW]]{1} Alchemy.SkillName=ALCHIMIE -Alchemy.Skillup=Le talent Alchimie augmente de {0}. Total ({1}) -Archery.Combat.DazeChance=Probabilit\u00e9 de d\u00e9sorienter : [[YELLOW]]{0} -Archery.Combat.RetrieveChance=Probabilit\u00e9 de r\u00e9cup\u00e9rer des fl\u00e8ches : [[YELLOW]]{0} -Archery.Combat.SkillshotBonus=Tir pr\u00e9cis, bonus de d\u00e9g\u00e2ts : [[YELLOW]]{0} + + +#ARCHERIE 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.SkillShot.Stat=Bonus de d\u00e9g\u00e2ts lors des tirs +Archery.SubSkill.Daze.Name=D\u00e9sorienter Archery.SubSkill.Daze.Description=D\u00e9soriente les adversaires en leur faisant {0} dommages +Archery.SubSkill.Daze.Stat=Chance de d\u00e9soriente Archery.SubSkill.ArrowRetrieval.Name=R\u00e9cup\u00e9ration de fl\u00e8che Archery.SubSkill.ArrowRetrieval.Description=Probabilit\u00e9 de r\u00e9cup\u00e9rer des fl\u00e8ches sur les corps +Archery.SubSkill.ArrowRetrieval.Stat=Chance de r\u00e9cup\u00e9ration de fl\u00e8che +Archery.SubSkill.ArcheryLimitBreak.Name=Limitation de d\u00e9g\u00e2ts d\'archerie +Archery.SubSkill.ArcheryLimitBreak.Description=Casse les limites. Augmente les d\u00e9g\u00e2ts face aux ennemis. Pr\u00e9vu pour le PvP, il peut être configur\u00e9 pour le PvE. +Archery.SubSkill.ArcheryLimitBreak.Stat=D\u00e9g\u00e2ts maximum Archery.Listener=Archerie : Archery.SkillName=ARCHERIE -Archery.Skillup=Le talent Archerie augmente de {0}. Total ({1}) +#HACHES 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.2=Impact d\'armure Axes.Ability.Bonus.3=Inflige {0} de d\u00e9g\u00e2ts \u00e0 l\'armure Axes.Ability.Bonus.4=Impact puissant Axes.Ability.Bonus.5=Inflige {0} de d\u00e9g\u00e2ts en plus aux ennemis sans armure Axes.Ability.Lower=[[GRAY]]**VOUS ABAISSEZ VOTRE HACHE** Axes.Ability.Ready=[[GREEN]]**VOUS LEVEZ VOTRE HACHE** Axes.Combat.CritStruck=[[DARK_RED]]Vous avez re\u00e7u un coup critique ! -Axes.Combat.CritChance=Chance d\'infliger un coup critique : [[YELLOW]]{0}% Axes.Combat.CriticalHit=COUP CRITIQUE ! Axes.Combat.GI.Proc=[[GREEN]]**FRAPP\u00c9 D\'UNE VIOLENTE INOU\u00cfE** Axes.Combat.GI.Struck=**TOUCH\u00c9 PAR UN IMPACT PUISSANT** Axes.Combat.SS.Struck=[[DARK_RED]]Bloqu\u00e9 par TRANCHE-CR\u00c2NE ! -Axes.Combat.SS.Length=Dur\u00e9e de Tranche-cr\u00e2ne : [[YELLOW]]{0}s Axes.SubSkill.SkullSplitter.Name=Tranche-cr\u00e2ne (Comp\u00e9tence) Axes.SubSkill.SkullSplitter.Description=Inflige des d\u00e9g\u00e2ts de zone +Axes.SubSkill.SkullSplitter.Stat=Dur\u00e9e du tranche-cr\u00e2ne Axes.SubSkill.CriticalStrikes.Name=Coup critique Axes.SubSkill.CriticalStrikes.Description=D\u00e9g\u00e2ts doubl\u00e9s +Axes.SubSkill.CriticalStrikes.Stat=Chance de coup critique Axes.SubSkill.AxeMastery.Name=Ma\u00eetrise des haches Axes.SubSkill.AxeMastery.Description=Ajoute des d\u00e9g\u00e2ts +Axes.SubSkill.AxesLimitBreak.Name=Limitation de d\u00e9g\u00e2ts de la hache +Axes.SubSkill.AxesLimitBreak.Description=Casse les limites. Augmente les d\u00e9g\u00e2ts face aux ennemis. Pr\u00e9vu pour le PvP, il peut être configur\u00e9 pour le PvE. +Axes.SubSkill.AxesLimitBreak.Stat=D\u00e9g\u00e2ts 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 @@ -68,83 +211,85 @@ 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 - +#FOUILLE Excavation.Ability.Lower=[[GRAY]]**VOUS ABAISSEZ VOTRE PELLE** Excavation.Ability.Ready=[[GREEN]]**VOUS LEVEZ VOTRE PELLE** Excavation.SubSkill.GigaDrillBreaker.Name=Foreur (Comp\u00e9tence) Excavation.SubSkill.GigaDrillBreaker.Description=Drops x3, XP x3, plus rapide -Excavation.SubSkill.TreasureHunter.Name=Chasseur de tr\u00e9sors -Excavation.SubSkill.TreasureHunter.Description=Capacit\u00e9 \u00e0 d\u00e9terrer des tr\u00e9sors -Excavation.Effect.Length=Dur\u00e9e de Foreur : [[YELLOW]]{0}s -Excavation.Listener=Excavation: -Excavation.SkillName=EXCAVATION +Excavation.SubSkill.GigaDrillBreaker.Stat=Dur\u00e9e du foreur +Excavation.SubSkill.Archaeology.Name=Arch\u00e9ologie +Excavation.SubSkill.Archaeology.Description=D\u00e9terrez les secrets du monde ! De haut niveaux de comp\u00e9tences augmente vos chances de trouvez de l\'exp\u00e9rience dans un tr\u00e9sor ! +Excavation.SubSkill.Archaeology.Stat=Chance d\'exp arch\u00e9ologique +Excavation.SubSkill.Archaeology.Stat.Extra=Quantit\u00e9 d\'exp\u00e9rience arch\u00e9ologique +Excavation.Listener=Fouille: +Excavation.SkillName=FOUILLE 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} +#PÊCHE +Fishing.ScarcityTip=[[YELLOW]]&oCette zone a souffert d\'une surexploitation ... Utilisez votre canne à p\u00e2che autre part, à au moins {0} blocs de distance. +Fishing.Scared=[[GRAY]]&oDes mouvements chaotique effrait les poissons ! +Fishing.Exhausting=[[RED]]&oUne mauvaise utilisation de la canne à pêche vous fatigue et use la canne ! +Fishing.LowResourcesTip=[[GRAY]]Vous sentez qu\'il n\'y a plus beaucoup de poisson par ici. Allez essayez {0} blocs plus loin. Fishing.Ability.Info=P\u00eache magique : [[GRAY]] **S\'am\u00e9liore via Chasseur de tr\u00e9sors** Fishing.Ability.Locked.0=BLOCKE JUSQU\'A {0}+ COMPETENCE (SHAKE) Fishing.Ability.Locked.1=Bloqu\u00e9 jusqu\'\u00e0 {0}+ niveaux de talent (PECHEUR SUR GLACE) Fishing.Ability.Locked.2=Bloqu\u00e9 jusqu\'\u00e0 {0}+ niveau(x) (Ma\u00eetre P\u00eacheur) -Fishing.Ability.Rank=Chasseur de tr\u00e9sors : [[YELLOW]]{0}/{1} -Fishing.Ability.TH.DropRate= Taux de Loot: [[DARK_RED]]Pi\u00e8ge: [[YELLOW]]{0} [[GRAY]]Commun: [[YELLOW]]{1} [[GREEN]]Non commun: [[YELLOW]]{2}\n[[BLUE]]Rare: [[YELLOW]]{3} [[LIGHT_PURPLE]]\u00c9pique: [[YELLOW]]{4} [[GOLD]]L\u00e9gendaire: [[YELLOW]]{5} [[AQUA]]Record: [[YELLOW]]{6} -Fishing.Ability.TH.MagicRate=Chasse magique: [[YELLOW]]{0} -Fishing.Ability.Shake=Chance d\'esquive : [[YELLOW]]{0} -Fishing.Ability.IceFishing=P\u00eache sur Glace: Allez p\u00eacher sur de la glace -Fishing.Ability.FD=R\u00e9gime de p\u00e9cheur: [[YELLOW]]Classement {0} Fishing.SubSkill.TreasureHunter.Name=Chasseur de tr\u00e9sors Fishing.SubSkill.TreasureHunter.Description=Remonte des objets inhabituels +Fishing.SubSkill.TreasureHunter.Stat=Grade de chasseur de tr\u00e9sor: [[GREEN]]{0}[[DARK_AQUA]]/[[GREEN]]{1} +Fishing.SubSkill.TreasureHunter.Stat.Extra=Ratio de drop: [[GRAY]]Commun: [[YELLOW]]{0} [[GREEN]]Non-commun: [[YELLOW]]{1}\n[[BLUE]]Rare: [[YELLOW]]{2} [[LIGHT_PURPLE]]Epique: [[YELLOW]]{3} [[GOLD]]Legendaire: [[YELLOW]]{4} [[AQUA]]Record: [[YELLOW]]{5} Fishing.SubSkill.MagicHunter.Name=P\u00eache magique Fishing.SubSkill.MagicHunter.Description=Remonte des objets magiques +Fishing.SubSkill.MagicHunter.Stat=Chance du chasseur de tr\u00e9sor 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.Shake.Stat=Chance d\'esquive Fishing.SubSkill.FishermansDiet.Name=R\u00e9gime de fermier Fishing.SubSkill.FishermansDiet.Description=Am\u00e9liore la nutrition des produits de la ferme +Fishing.SubSkill.FishermansDiet.Stat=R\u00e9gime de fermier:[[GREEN]] Grade {0} 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.MasterAngler.Stat=Plus de chance de mordre ou vous êtes: [[GREEN]]+{0} Fishing.SubSkill.IceFishing.Name=P\u00eache sur Glace Fishing.SubSkill.IceFishing.Description=Vous permet de p\u00eacher dans les biomes glac\u00e9s +Fishing.SubSkill.IceFishing.Stat=P\u00eache sur Glace 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 +#HERBORISTERIE Herbalism.Ability.GTe.NeedMore=Vous avez besoin de plus de graines pour r\u00e9pandre la terre verte -Herbalism.Ability.GTh.Chance=Chances de Mains Vertes: [[YELLOW]]{0} Herbalism.Ability.GTh.Fail=**MAINS VERTES \u00c9CHOU\u00c9ES** -Herbalism.Ability.GTh.Stage= Vos sens de jardinier vous indique que [[YELLOW]] Ce champ est en train de pousser {0} Herbalism.Ability.GTh=[[GREEN]]**DOIGTS VERTS** -Herbalism.Ability.HylianLuck=Probabilit\u00e9 de chance d\'Hylian: [[YELLOW]]{0} Herbalism.Ability.Lower=[[GRAY]]**VOUS ABAISSEZ VOTRE HOUE** Herbalism.Ability.Ready=[[GREEN]]**VOUS LEVEZ VOTRE HOUE** -Herbalism.Ability.ShroomThumb.Chance=Doigts \u00e0 Champignons, Chance: [[YELLOW]]{0} Herbalism.Ability.ShroomThumb.Fail=**DOIGTS VERTS \u00c9CHOU\u00c9** Herbalism.SubSkill.GreenTerra.Name=Main verte (Comp\u00e9tence) Herbalism.SubSkill.GreenTerra.Description=Propage les plantes / triple drops +Herbalism.SubSkill.GreenTerra.Stat=Dur\u00e9e de la main verte Herbalism.SubSkill.GreenThumb.Name=Mains Vertes (Bl\u00e9) Herbalism.SubSkill.GreenThumb.Description=Plantation automatique apres recolte du champ +Herbalism.SubSkill.GreenThumb.Stat=Chance de plantation automatique apr\u00e8s r\u00e9colte +Herbalism.SubSkill.GreenThumb.Stat.Extra=Plantation automatique: [[GREEN]] 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.Stat=R\u00e9gime de fermier: [[GREEN]]Grade {0} Herbalism.SubSkill.DoubleDrops.Name=Double drops Herbalism.SubSkill.DoubleDrops.Description=Double la quantit\u00e9 r\u00e9colt\u00e9e +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.HylianLuck.Description=Donne une petite chance de trouver de rares +Herbalism.SubSkill.HylianLuck.Stat=Chance d\'Hylian Herbalism.SubSkill.ShroomThumb.Name=Doigts \u00e0 Champignons Herbalism.SubSkill.ShroomThumb.Description=Etend le mycelium sur la terre et l\'herbe +Herbalism.SubSkill.ShroomThumb.Stat=Chance extension du mycelium Herbalism.HylianLuck=[[GREEN]]la chance d\'Hyrule est avec vous aujourd\'hui ! Herbalism.Listener=Herboristerie : Herbalism.SkillName=HERBORISTERIE @@ -153,8 +298,7 @@ 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 +#MINAGE 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) @@ -162,16 +306,20 @@ Mining.Ability.Lower=[[GRAY]]**VOUS ABAISSEZ VOTRE PIOCHE** Mining.Ability.Ready=[[GREEN]]**VOUS LEVEZ VOTRE PIOCHE** Mining.SubSkill.SuperBreaker.Name=Broyeur (Comp\u00e9tence) Mining.SubSkill.SuperBreaker.Description=Plus rapide, chance de triple drops +Mining.SubSkill.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.Stat=Chance de double drop Mining.SubSkill.BlastMining.Name=Minage explosif Mining.SubSkill.BlastMining.Description=Bonus au minage \u00e0 l\'explosif +Mining.SubSkill.BlastMining.Stat=Minage explosif:[[GREEN]] Grade {0}/{1} [[GRAY]]({2}) +Mining.SubSkill.BlastMining.Stat.Extra=Rayon du minage explosif: [[GREEN]]+{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.Stat=Baisse des d\u00e9g\u00e2ts de destruction + Mining.Listener=Minage : Mining.SkillName=MINAGE Mining.Skills.SuperBreaker.Off=**Votre comp\u00e9tence Broyeur est termin\u00e9e** @@ -179,13 +327,13 @@ 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}) +# MINAGE EXPLOSIF Mining.Blast.Boom=[[GRAY]]**BOUM** +Mining.Blast.Cooldown= 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 ! +# R\u00c9PARATION Repair.SubSkill.Repair.Name=R\u00e9paration Repair.SubSkill.Repair.Description=R\u00e9parer Outils & Armures Repair.SubSkill.GoldRepair.Name=R\u00e9paration d\'Or ({0}+ SKILL) @@ -196,15 +344,18 @@ 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.RepairMastery.Stat=Repair Mastery: [[GREEN]]Extra {0} durability restored Repair.SubSkill.SuperRepair.Name=Superbe r\u00e9paration Repair.SubSkill.SuperRepair.Description=Double l\'efficacit\u00e9 +Repair.SubSkill.SuperRepair.Stat=Super Repair Chance Repair.SubSkill.DiamondRepair.Name=R\u00e9paration du diamant (talent {0}+) Repair.SubSkill.DiamondRepair.Description=R\u00e9pare les outils et armures en diamant Repair.SubSkill.ArcaneForging.Name=Forge arcanique Repair.SubSkill.ArcaneForging.Description=R\u00e9pare les objets magiques +Repair.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 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. @@ -214,29 +365,27 @@ Repair.Skills.AdeptStone=[[DARK_RED]]Vous n\'\u00eates pas suffisamment comp\u00 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}% +# Force arcanique 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 +# 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.SubSkill.UnderstandingTheArt.Name=Compr\u00e9hension 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\u00e9cup\u00e9ration. +Salvage.SubSkill.ScrapCollector.Name=Collection de fragment +Salvage.SubSkill.ScrapCollector.Description=R\u00e9cup\u00e9ration de materiel depuis un item, une r\u00e9cup\u00e9ration parfaite en accord avec vos comp\u00e9tences et votre chance. +Salvage.SubSkill.ScrapCollector.Stat=Collection de fragment: [[GREEN]]R\u00e9cup\u00e9ration de [[YELLOW]]{0}[[GREEN]] items. Un peu de chance y est impliqu\u00e9. +Salvage.SubSkill.ArcaneSalvage.Name=Recyclage Arcanique +Salvage.SubSkill.ArcaneSalvage.Description=Extrait les enchantements des objets +Salvage.SubSkill.ArcaneSalvage.Stat=Recyclage Arcanique: [[YELLOW]]Grade {0}/{1} 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.Arcane.ExtractFull=[[GRAY]]AS Full-Enchant Chance +Salvage.Arcane.ExtractPartial=[[GRAY]]AS Partial-Enchant Chance 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} @@ -247,26 +396,39 @@ Salvage.Skills.ArcaneSuccess=[[GREEN]]Vous avez \u00e9t\u00e9 capable d\'extrair Salvage.Listener.Anvil=[[DARK_RED]]Vous avez plac\u00e9 une enclume de r\u00e9paration, utilisez-la pour recycler vos outils et vos armures. Salvage.Listener=Recyclage: Salvage.SkillName=RECYCLAGE +Salvage.Skills.Lottery.Normal=[[GOLD]]Vous êtes capable de r\u00e9cup\u00e9rer [[DARK_AQUA]]{0}[[GOLD]] mat\u00e9riel de [[YELLOW]]{1}[[GOLD]]. +Salvage.Skills.Lottery.Perfect=[[GREEN]][[BOLD]]Parfait ![[RESET]][[GOLD]] Vous avez r\u00e9cup\u00e9r\u00e9 [[DARK_AQUA]]{1}[[GOLD]] sans effort et retrouv\u00e9 [[DARK_AQUA]]{0}[[GOLD]] mat\u00e9riel. +Salvage.Skills.Lottery.Untrained=[[GRAY]]Vous n\'êtes pas assez qualifi\u00e9 dans la r\u00e9cup\u00e9ration. Vous ne pouvez retrouver que [[RED]]{0}[[GRAY]] mat\u00e9riel depuis [[GREEN]]{1}[[GRAY]]. +#Enclume (Partag\u00e9 entre RECYCLAGE et R\u00c9PARATION) +Anvil.Unbreakable=Cet item est incassable ! +#\u00c9P\u00c9E 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.Rupture.Note=[[GRAY]]NOTE: [[YELLOW]]1 Tick correspond à 0.5 seconds! +Swords.Combat.Bleeding.Started=[[DARK_RED]] Tu saignes ! Swords.Combat.Bleeding.Stopped=[[GRAY]]Le saignement s\'est [[GREEN]]arr\u00eat\u00e9[[GRAY]] ! Swords.Combat.Bleeding=[[GREEN]]**L\'ENNEMI SAIGNE** -Swords.Combat.Counter.Chance=Chance de Contre Attaque: [[YELLOW]]{0} Swords.Combat.Counter.Hit=[[DARK_RED]]Touch\u00e9 par une contre-attaque ! Swords.Combat.Countered=[[GREEN]]**CONTRE-ATTAQUE** Swords.Combat.SS.Struck=[[DARK_RED]]Frapp\u00e9 par ATTAQUE D\u00c9CHIRANTE ! Swords.SubSkill.CounterAttack.Name=Contre-attaque Swords.SubSkill.CounterAttack.Description=Renvoie {0} des dommages pris en bloquant +Swords.SubSkill.CounterAttack.Stat=Chance de contre-attaque Swords.SubSkill.SerratedStrikes.Name=Attaque D\u00e9chirante (Capacit\u00e9) Swords.SubSkill.SerratedStrikes.Description={0} DMG AoE, Saignement+ AoE -Swords.Effect.4=Saignement d\'Attaque d\u00e9chirante +Swords.SubSkill.SerratedStrikes.Stat=Puissance de l\'attaque d\u00e9chirante +Swords.SubSkill.Rupture.Name=H\u00e9morragie +Swords.SubSkill.Rupture.Description=Un h\u00e9morragie puissant ! +Swords.SubSkill.Stab.Name=Poignarder +Swords.SubSkill.Stab.Description=Ajoute plus de d\u00e9gâts à vos attaques. +Swords.SubSkill.Stab.Stat=D\u00e9gâts du poing supppl\u00e9mentaire +Swords.SubSkill.SwordsLimitBreak.Name=Limitation des d\u00e9g\u00e2ts de l\'\u00e9p\u00e9e +Swords.SubSkill.SwordsLimitBreak.Description=Casse les limites. Augmente les d\u00e9g\u00e2ts face aux ennemis. Pr\u00e9vu pour le PvP, il peut être configur\u00e9 pour le PvE. +Swords.SubSkill.SwordsLimitBreak.Stat=D\u00e9g\u00e2ts maximum +Swords.SubSkill.Rupture.Stat=Chance d\'h\u00e9morragie +Swords.SubSkill.Rupture.Stat.Extra=H\u00e9morragie: [[GREEN]]{0} ticks [{1} DMG vs Joueur] [{2} DMG vs Monstre] +Swords.Effect.4=H\u00e9morragie d\'Attaque d\u00e9chirante Swords.Effect.5={0} Intervale entre les saignements -Swords.SubSkill.Bleed.Name=Saignement -Swords.SubSkill.Bleed.Description=Applique un saignement Swords.Listener=\u00c9p\u00e9es : Swords.SkillName=\u00c9P\u00c9ES Swords.Skills.SS.Off=**Votre comp\u00e9tence Attaque d\u00e9chirante est termin\u00e9e** @@ -274,8 +436,7 @@ 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 +#APPRIVOISEMENT Taming.Ability.Bonus.0=Attentif \u00e0 l\'environnement Taming.Ability.Bonus.1=Les loups \u00e9vitent les dangers Taming.Ability.Bonus.2=Fourrure \u00e9paisse @@ -294,9 +455,7 @@ 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.Combat.Chance.Gore=Chance Gore Taming.SubSkill.BeastLore.Name=Connaissances des b\u00eates Taming.SubSkill.BeastLore.Description=Bone-whacking inspects wolves & ocelots Taming.SubSkill.ShockProof.Name=R\u00e9sistance aux chocs @@ -316,46 +475,45 @@ 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.SubSkill.Pummel.Name=Frappe +Taming.SubSkill.Pummel.Description=Votre loup a une chance de faire reculer les ennemis +Taming.SubSkill.Pummel.TargetMessage=Vous avez \u00e9t\u00e9 repouss\u00e9 par les loups ! Taming.Listener.Wolf=[[DARK_GRAY]]Votre loup se pr\u00e9cipite \u00e0 vos c\u00f4t\u00e9s... Taming.Listener=Apprivoisement : Taming.SkillName=APPRIVOISEMENT -Taming.Skills.Charge.Off=**Charge s\'est arr\u00eat\u00e9e** -Taming.Skills.Charge.On=[[GREEN]]**CHARGE ACTIV\u00c9E** -Taming.Skills.Charge.Other.Off=Charge[[GREEN]] s\'est arr\u00eat\u00e9e pour [[YELLOW]]{0} -Taming.Skills.Charge.Other.On=[[GREEN]]{0}[[DARK_GREEN]] a utilis\u00e9 [[RED]]Charge! -Taming.Skills.Charge.Refresh=[[GREEN]]Votre capacit\u00e9 [[YELLOW]]Charge [[GREEN]]a \u00e9t\u00e9 renouvel\u00e9e! -Taming.Skills.Charge.NoneNearby=**AUCUN LOUP DISPONIBLE A PROXIMIT\u00c9** -Taming.Skills.Charge.NoTarget=**AUCUNE CIBLE TROUV\u00c9E** -Taming.Skillup=Le talent Apprivoisement augmente de {0}. Total ({1}) -Taming.Summon.Complete=[[GREEN]]Appel r\u00e9ussi -Taming.Summon.Lifespan= (Dur\u00e9e de vie: {0}s) -Taming.Summon.Fail.Ocelot=Il y a d\u00e9j\u00e0 trop d\'ocelots dans les environs. -Taming.Summon.Fail.Wolf=Il y a d\u00e9j\u00e0 trop de loups dans les environs. -Taming.Summon.Fail.Horse=Il y a d\u00e9j\u00e0 trop de chevaux dans les environs. -Taming.Summon.Fail.TooMany=Vous ne pouvez pas appeler plus d\'animaux \u00e0 vos c\u00f4t\u00e9s. [[YELLOW]]({0}) -Taming.Summon.Name.Format={1} de {0} -Unarmed.Ability.Berserk.Length=Dur\u00e9e de Berserk : [[YELLOW]]{0}s +Taming.Summon.COTW.Success.WithoutLifespan=[[GREEN]](Appel de la nature) [[GRAY]]Vous avez invoqu\u00e9 un [[GOLD]]{0}[[GRAY]] +Taming.Summon.COTW.Success.WithLifespan=[[GREEN]](Appel de la nature) [[GRAY]]Vous avez invoqu\u00e9 un [[GOLD]]{0}[[GRAY]] pendant [[GOLD]]{1}[[GRAY]] secondes. +Taming.Summon.COTW.Limit=[[GREEN]](Appel de la nature) [[GRAY]]Vous ne pouvez avoir que [[RED]]{0} [[GRAY]]{1} invoqu\u00e9s en même temps. +Taming.Summon.COTW.TimeExpired=[[GREEN]](Appel de la nature) [[GRAY]]Time is up, your [[GOLD]]{0}[[GRAY]] departs. +Taming.Summon.COTW.BreedingDisallowed=[[GREEN]](Appel de la nature) [[RED]]Vous ne pouvez pas reproduire un animal invoqu\u00e9. +Taming.Summon.COTW.NeedMoreItems=[[GREEN]](Appel de la nature) [[GRAY]]Vous avez besoin de [[YELLOW]]{0} [[DARK_AQUA]]{1}[[GRAY]](s) +Taming.Summon.Name.Format=[[GOLD]]{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.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.Berserk.Stat=Dur\u00e9e du berserk Unarmed.SubSkill.Disarm.Name=D\u00e9sarmement (sur joueurs) Unarmed.SubSkill.Disarm.Description=Fait tomber l\'arme des ennemis +Unarmed.SubSkill.Disarm.Stat=Chance de d\u00e9sarmement +Unarmed.SubSkill.UnarmedLimitBreak.Name=Limitation des d\u00e9gâts aux poings +Unarmed.SubSkill.UnarmedLimitBreak.Description=Casse les limites. Augmente les d\u00e9g\u00e2ts face aux ennemis. Pr\u00e9vu pour le PvP, il peut être configur\u00e9 pour le PvE. +Unarmed.SubSkill.UnarmedLimitBreak.Stat=D\u00e9g\u00e2ts 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.Stat=Chance de d\u00e9viation de fl\u00e8che Unarmed.SubSkill.IronGrip.Name=Poigne de Fer Unarmed.SubSkill.IronGrip.Description=Vous emp\u00eache d\'\u00eatre d\u00e9sarm\u00e9 +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** @@ -363,18 +521,24 @@ 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}) +#B\u00dbCHERONNAGE Woodcutting.Ability.0=Souffleur de Feuilles Woodcutting.Ability.1=Souffle les feuilles -Woodcutting.Ability.Chance.DDrop=Double Drop: [[YELLOW]]{0} -Woodcutting.Ability.Length=Dur\u00e9e d\'Abbateur : [[YELLOW]]{0}s Woodcutting.Ability.Locked.0=Bloqu\u00e9 jusqu\'\u00e0 {0}+ niveaux du talent (EXPLOSEUR DE FEUILLES) Woodcutting.SubSkill.TreeFeller.Name=Abatteur (Comp\u00e9tence) Woodcutting.SubSkill.TreeFeller.Description=Fait exploser les arbres +Woodcutting.SubSkill.TreeFeller.Stat=Dur\u00e9e de l\'abatteur Woodcutting.SubSkill.LeafBlower.Name=Soufflage Woodcutting.SubSkill.LeafBlower.Description=Souffle les feuilles Woodcutting.SubSkill.HarvestLumber.Name=Double drops Woodcutting.SubSkill.HarvestLumber.Description=Double la quantit\u00e9 r\u00e9colt\u00e9e +Woodcutting.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\u00e9riaux utiles lors de l\'abattage d\'arbre. +Woodcutting.SubSkill.NaturesBounty.Name=Cadeau de la nature +Woodcutting.SubSkill.NaturesBounty.Description=Gain d\'exp\u00e9rience de la nature Woodcutting.Listener=B\u00fbcheronnage : Woodcutting.SkillName=B\u00dbCHERONNAGE Woodcutting.Skills.TreeFeller.Off=**Votre comp\u00e9tence Abatteur est termin\u00e9e** @@ -384,18 +548,25 @@ Woodcutting.Skills.TreeFeller.Other.Off=Abatteur[[GREEN]] est termin\u00e9 pour Woodcutting.Skills.TreeFeller.Other.On=[[GREEN]]{0}[[DARK_GREEN]] a utilis\u00e9 [[RED]]Abatteur ! Woodcutting.Skills.TreeFeller.Splinter=VOTRE HACHE SE BRISE EN MILLE MORCEAUX ! Woodcutting.Skills.TreeFeller.Threshold=Cet arbre est trop large! -Woodcutting.Skillup=La comp\u00e9tence B\u00fbcheronnage augmente de {0}. Total ({1}) -Ability.Generic.Refresh=[[GREEN]]**COMP\u00c9TENCES RAFRA\u00ceCHIES !** -Ability.Generic.Template.Lock=[[GRAY]]{0} -Ability.Generic.Template={0} : [[YELLOW]]{1} +#ABILITIY + +#COMBAT 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.BeastLoreHorseSpeed=[[DARK_AQUA]]Vitesse des chevaux ([[GREEN]]{0} blocs/s[[DARK_AQUA]]) +Combat.BeastLoreHorseJumpStrength=[[DARK_AQUA]]Hauteur de saut des chevaux ([[GREEN]]Max {0} blocs[[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. + + + +Ability.Generic.Refresh=[[GREEN]]**COMP\u00c9TENCES RAFRA\u00ceCHIES !** +Ability.Generic.Template.Lock=[[GRAY]]{0} +Ability.Generic.Template={0} : [[YELLOW]]{1} 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}. From 59552f42d74308df67e6734459b69a688b6c1cb2 Mon Sep 17 00:00:00 2001 From: Elikill58 Date: Thu, 9 Jul 2020 23:48:19 +0200 Subject: [PATCH 079/662] Update french translation - end of translation --- .../resources/locale/locale_fr.properties | 175 +++++++++++++----- 1 file changed, 127 insertions(+), 48 deletions(-) diff --git a/src/main/resources/locale/locale_fr.properties b/src/main/resources/locale/locale_fr.properties index 405981b3a..738a2c2e7 100644 --- a/src/main/resources/locale/locale_fr.properties +++ b/src/main/resources/locale/locale_fr.properties @@ -21,7 +21,7 @@ JSON.Alchemy=Alchemie JSON.Archery=Archerie JSON.Axes=Haches JSON.Excavation=Excavation -JSON.Fishing=Pêche +JSON.Fishing=P\u00eache JSON.Herbalism=Herbalisme JSON.Mining=Minage JSON.Repair=R\u00e9paration @@ -53,8 +53,8 @@ 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=Si vous êtes accroupi lorsque vous tombez, vous \u00e9viterez de prendre des d\u00e9g\u00e2ts ! -Anvil.SingleItemStack=[[RED]]Vous ne pouvas pas r\u00e9cup\u00e9rer ou r\u00e9parer un item plus d\'un item à la fois, d\u00e9stackez le d\'abord. +JSON.Acrobatics.SubSkill.Roll.Details.Tips=Si vous \u00eates accroupi lorsque vous tombez, vous \u00e9viterez de prendre des d\u00e9g\u00e2ts ! +Anvil.SingleItemStack=[[RED]]Vous ne pouvas pas r\u00e9cup\u00e9rer ou r\u00e9parer un item plus d\'un item \u00e0 la fois, d\u00e9stackez 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 @@ -88,7 +88,7 @@ Overhaul.Name.Alchemy=Alchemie Overhaul.Name.Archery=Archerie Overhaul.Name.Axes=Haches Overhaul.Name.Excavation=Fouille -Overhaul.Name.Fishing=Pêche +Overhaul.Name.Fishing=P\u00eache Overhaul.Name.Herbalism=Herboristerie Overhaul.Name.Mining=Minage Overhaul.Name.Repair=R\u00e9paration @@ -104,7 +104,7 @@ Commands.Other=[[RED]]---[][[GREEN]]COMMANDES SP\u00c9CIALES[[RED]][]--- Commands.Party.Header=[[RED]]-----[][[GREEN]]PARTIE[[RED]][]----- Commands.Party.Features.Header=[[RED]]-----[][[GREEN]]FONCTIONNALIT\u00c9S[[RED]][]----- # XP BAR accepte les variables -- {0} Niveau de comp\u00e9tence, {1} XP actuelle, {2} XP n\u00e9cessaire pour le niveau suivant, {3} Niveau de puissance, {4} Pourcentage du niveau -# Soyez s\u00fbr d\'avoir activ\u00e9 Experience_Bars.ThisMayCauseLag.AlwaysUpdateTitlesWhenXPIsGained si vous voulez la barre d\'XP à chaque fois que le joueur en gagne ! +# Soyez s\u00fbr d\'avoir activ\u00e9 Experience_Bars.ThisMayCauseLag.AlwaysUpdateTitlesWhenXPIsGained si vous voulez la barre d\'XP \u00e0 chaque fois que le joueur en gagne ! XPBar.Template={0} XPBar.Template.EarlyGameBoost=[[GOLD]]Apprentissage d\'une nouvelle comp\u00e9tence ... XPBar.Acrobatics=Acrobatiques Lv.[[GOLD]]{0} @@ -112,7 +112,7 @@ XPBar.Alchemy=Alchemie Lv.[[GOLD]]{0} XPBar.Archery=Archerie Lv.[[GOLD]]{0} XPBar.Axes=Haches Lv.[[GOLD]]{0} XPBar.Excavation=Fouille Lv.[[GOLD]]{0} -XPBar.Fishing=Pêche Lv.[[GOLD]]{0} +XPBar.Fishing=P\u00eache Lv.[[GOLD]]{0} XPBar.Herbalism=Herboristerie Lv.[[GOLD]]{0} XPBar.Mining=Minage Lv.[[GOLD]]{0} XPBar.Repair=R\u00e9paration Lv.[[GOLD]]{0} @@ -122,10 +122,10 @@ XPBar.Swords=\u00c9p\u00e9e Lv.[[GOLD]]{0} XPBar.Taming=Apprivoisement Lv.[[GOLD]]{0} XPBar.Unarmed=Poings Lv.[[GOLD]]{0} XPBar.Woodcutting=B\u00fbcheronnage Lv.[[GOLD]]{0} -# Ceci n\'est qu\'un exemple qui peut être utilis\u00e9 quand l\'option 'ExtraDetails' dans experience.yml est activ\u00e9 (d\u00e9sactiv\u00e9 par d\u00e9faut), vous pouvez l\'ignor\u00e9 et juste modifier le message au dessus +# Ceci n\'est qu\'un exemple qui peut \u00eatre utilis\u00e9 quand l\'option 'ExtraDetails' dans experience.yml est activ\u00e9 (d\u00e9sactiv\u00e9 par d\u00e9faut), vous pouvez l\'ignor\u00e9 et juste modifier le message au dessus XPBar.Complex.Template={0} [[DARK_AQUA]] {4}[[WHITE]]% [[DARK_AQUA]]([[WHITE]]{1}[[DARK_AQUA]]/[[WHITE]]{2}[[DARK_AQUA]]) # XP BAR accepte les variables -- {0} Niveau de comp\u00e9tence, {1} XP actuelle, {2} XP n\u00e9cessaire pour le niveau suivant, {3} Niveau de puissance, {4} Pourcentage du niveau -# Soyez s\u00fbr d\'avoir activ\u00e9 Experience_Bars.ThisMayCauseLag.AlwaysUpdateTitlesWhenXPIsGained si vous voulez la barre d\'XP à chaque fois que le joueur en gagne ! +# Soyez s\u00fbr d\'avoir activ\u00e9 Experience_Bars.ThisMayCauseLag.AlwaysUpdateTitlesWhenXPIsGained si vous voulez la barre d\'XP \u00e0 chaque fois que le joueur en gagne ! # FIN DE LA CONFIG DU STYLE #ACROBATIES @@ -138,7 +138,7 @@ Acrobatics.SubSkill.Roll.Name=Roulade Acrobatics.SubSkill.Roll.Description=R\u00e9duit ou annule les d\u00e9g\u00e2ts de chute Acrobatics.SubSkill.Roll.Chance=Chance d\'une roulade: [[YELLOW]]{0} Acrobatics.SubSkill.Roll.GraceChance=Chance d\'une roulade gracieuse: [[YELLOW]]{0} -Acrobatics.SubSkill.Roll.Mechanics=[[GRAY]]La roulade est une sous-capacit\u00e9 avec une partie passive.\nLorsque vous prenez des d\u00e9g\u00e2ts de ch\u00fbtes, vous avez une chance de ne rien prendre, en fonction de votre niveau de comp\u00e9tence. Au niveau 50, vous avez [[YELLOW]]{0}%[[GRAY]] de chance de ne pas prendre de d\u00e9g\u00e2ts, et [[YELLOW]]{1}%[[GRAY]] si vous activ\u00e9 la roulade gracieuse.\nLa chance pour la r\u00e9ussite est calcul\u00e9 gr\u00e2ce à votre niveau de comp\u00e9tence, avec une courbe lin\u00e9aire jusqu\'au niveau [[YELLOW]]{2}[[GRAY]] son maximum. Tous les niveaux d\'acrobaties vous donnent [[YELLOW]]{3}%[[GRAY]] de chance de succ\u00e8s.\nEn s'accroupissant, vous pouvez doubler votre chance de ne pas prendre les d\u00e9g\u00e2ts de ch\u00fbte ! En sneakant, vous transformerez une roulade normal en une roulade gracieuse.\nUne roulade empêche jusqu\'à [[RED]]{4}[[GRAY]] d\u00e9g\u00e2ts. Une roulade gracieuse en empêche jusqu\'à [[GREEN]]{5}[[GRAY]]. +Acrobatics.SubSkill.Roll.Mechanics=[[GRAY]]La roulade est une sous-capacit\u00e9 avec une partie passive.\nLorsque vous prenez des d\u00e9g\u00e2ts de ch\u00fbtes, vous avez une chance de ne rien prendre, en fonction de votre niveau de comp\u00e9tence. Au niveau 50, vous avez [[YELLOW]]{0}%[[GRAY]] de chance de ne pas prendre de d\u00e9g\u00e2ts, et [[YELLOW]]{1}%[[GRAY]] si vous activ\u00e9 la roulade gracieuse.\nLa chance pour la r\u00e9ussite est calcul\u00e9 gr\u00e2ce \u00e0 votre niveau de comp\u00e9tence, avec une courbe lin\u00e9aire jusqu\'au niveau [[YELLOW]]{2}[[GRAY]] son maximum. Tous les niveaux d\'acrobaties vous donnent [[YELLOW]]{3}%[[GRAY]] de chance de succ\u00e8s.\nEn s'accroupissant, vous pouvez doubler votre chance de ne pas prendre les d\u00e9g\u00e2ts de ch\u00fbte ! En sneakant, vous transformerez une roulade normal en une roulade gracieuse.\nUne roulade emp\u00eache jusqu\'\u00e0 [[RED]]{4}[[GRAY]] d\u00e9g\u00e2ts. Une roulade gracieuse en emp\u00eache jusqu\'\u00e0 [[GREEN]]{5}[[GRAY]]. Acrobatics.SubSkill.GracefulRoll.Name=Roulade gracieuse Acrobatics.SubSkill.GracefulRoll.Description=Deux fois plus efficace qu\'une roulade classique Acrobatics.SubSkill.Dodge.Name=Esquive @@ -171,7 +171,7 @@ Archery.SubSkill.ArrowRetrieval.Name=R\u00e9cup\u00e9ration de fl\u00e8che Archery.SubSkill.ArrowRetrieval.Description=Probabilit\u00e9 de r\u00e9cup\u00e9rer des fl\u00e8ches sur les corps Archery.SubSkill.ArrowRetrieval.Stat=Chance de r\u00e9cup\u00e9ration de fl\u00e8che Archery.SubSkill.ArcheryLimitBreak.Name=Limitation de d\u00e9g\u00e2ts d\'archerie -Archery.SubSkill.ArcheryLimitBreak.Description=Casse les limites. Augmente les d\u00e9g\u00e2ts face aux ennemis. Pr\u00e9vu pour le PvP, il peut être configur\u00e9 pour le PvE. +Archery.SubSkill.ArcheryLimitBreak.Description=Casse les limites. Augmente les d\u00e9g\u00e2ts face aux ennemis. Pr\u00e9vu pour le PvP, il peut \u00eatre configur\u00e9 pour le PvE. Archery.SubSkill.ArcheryLimitBreak.Stat=D\u00e9g\u00e2ts maximum Archery.Listener=Archerie : Archery.SkillName=ARCHERIE @@ -198,7 +198,7 @@ Axes.SubSkill.CriticalStrikes.Stat=Chance de coup critique Axes.SubSkill.AxeMastery.Name=Ma\u00eetrise des haches Axes.SubSkill.AxeMastery.Description=Ajoute des d\u00e9g\u00e2ts Axes.SubSkill.AxesLimitBreak.Name=Limitation de d\u00e9g\u00e2ts de la hache -Axes.SubSkill.AxesLimitBreak.Description=Casse les limites. Augmente les d\u00e9g\u00e2ts face aux ennemis. Pr\u00e9vu pour le PvP, il peut être configur\u00e9 pour le PvE. +Axes.SubSkill.AxesLimitBreak.Description=Casse les limites. Augmente les d\u00e9g\u00e2ts face aux ennemis. Pr\u00e9vu pour le PvP, il peut \u00eatre configur\u00e9 pour le PvE. Axes.SubSkill.AxesLimitBreak.Stat=D\u00e9g\u00e2ts maximum Axes.SubSkill.ArmorImpact.Name=Impact Axes.SubSkill.ArmorImpact.Description=Frappe avec suffisamment de force pour briser l\'armure @@ -229,9 +229,9 @@ Excavation.Skills.GigaDrillBreaker.Refresh=[[GREEN]]Votre comp\u00e9tence [[YELL 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 ! #PÊCHE -Fishing.ScarcityTip=[[YELLOW]]&oCette zone a souffert d\'une surexploitation ... Utilisez votre canne à p\u00e2che autre part, à au moins {0} blocs de distance. +Fishing.ScarcityTip=[[YELLOW]]&oCette zone a souffert d\'une surexploitation ... Utilisez votre canne \u00e0 p\u00e2che autre part, \u00e0 au moins {0} blocs de distance. Fishing.Scared=[[GRAY]]&oDes mouvements chaotique effrait les poissons ! -Fishing.Exhausting=[[RED]]&oUne mauvaise utilisation de la canne à pêche vous fatigue et use la canne ! +Fishing.Exhausting=[[RED]]&oUne mauvaise utilisation de la canne \u00e0 p\u00eache vous fatigue et use la canne ! Fishing.LowResourcesTip=[[GRAY]]Vous sentez qu\'il n\'y a plus beaucoup de poisson par ici. Allez essayez {0} blocs plus loin. Fishing.Ability.Info=P\u00eache magique : [[GRAY]] **S\'am\u00e9liore via Chasseur de tr\u00e9sors** Fishing.Ability.Locked.0=BLOCKE JUSQU\'A {0}+ COMPETENCE (SHAKE) @@ -252,7 +252,7 @@ Fishing.SubSkill.FishermansDiet.Description=Am\u00e9liore la nutrition des produ Fishing.SubSkill.FishermansDiet.Stat=R\u00e9gime de fermier:[[GREEN]] Grade {0} 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.MasterAngler.Stat=Plus de chance de mordre ou vous êtes: [[GREEN]]+{0} +Fishing.SubSkill.MasterAngler.Stat=Plus de chance de mordre ou vous \u00eates: [[GREEN]]+{0} Fishing.SubSkill.IceFishing.Name=P\u00eache sur Glace Fishing.SubSkill.IceFishing.Description=Vous permet de p\u00eacher dans les biomes glac\u00e9s Fishing.SubSkill.IceFishing.Stat=P\u00eache sur Glace @@ -375,7 +375,7 @@ Repair.Arcane.Perfect=[[GREEN]]Vous avez pr\u00e9serv\u00e9 les \u00e9nergies ar # RECYCLAGE Salvage.Pretty.Name=Recyclage Salvage.SubSkill.UnderstandingTheArt.Name=Compr\u00e9hension 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\u00e9cup\u00e9ration. +Salvage.SubSkill.UnderstandingTheArt.Description=Vous n\'\u00eates pas juste en train de miner \u00e0 travers la poubelle de votre voisin, vous prenez soin de l\'environment.\nRenforce la r\u00e9cup\u00e9ration. Salvage.SubSkill.ScrapCollector.Name=Collection de fragment Salvage.SubSkill.ScrapCollector.Description=R\u00e9cup\u00e9ration de materiel depuis un item, une r\u00e9cup\u00e9ration parfaite en accord avec vos comp\u00e9tences et votre chance. Salvage.SubSkill.ScrapCollector.Stat=Collection de fragment: [[GREEN]]R\u00e9cup\u00e9ration de [[YELLOW]]{0}[[GREEN]] items. Un peu de chance y est impliqu\u00e9. @@ -396,15 +396,15 @@ Salvage.Skills.ArcaneSuccess=[[GREEN]]Vous avez \u00e9t\u00e9 capable d\'extrair Salvage.Listener.Anvil=[[DARK_RED]]Vous avez plac\u00e9 une enclume de r\u00e9paration, utilisez-la pour recycler vos outils et vos armures. Salvage.Listener=Recyclage: Salvage.SkillName=RECYCLAGE -Salvage.Skills.Lottery.Normal=[[GOLD]]Vous êtes capable de r\u00e9cup\u00e9rer [[DARK_AQUA]]{0}[[GOLD]] mat\u00e9riel de [[YELLOW]]{1}[[GOLD]]. +Salvage.Skills.Lottery.Normal=[[GOLD]]Vous \u00eates capable de r\u00e9cup\u00e9rer [[DARK_AQUA]]{0}[[GOLD]] mat\u00e9riel de [[YELLOW]]{1}[[GOLD]]. Salvage.Skills.Lottery.Perfect=[[GREEN]][[BOLD]]Parfait ![[RESET]][[GOLD]] Vous avez r\u00e9cup\u00e9r\u00e9 [[DARK_AQUA]]{1}[[GOLD]] sans effort et retrouv\u00e9 [[DARK_AQUA]]{0}[[GOLD]] mat\u00e9riel. -Salvage.Skills.Lottery.Untrained=[[GRAY]]Vous n\'êtes pas assez qualifi\u00e9 dans la r\u00e9cup\u00e9ration. Vous ne pouvez retrouver que [[RED]]{0}[[GRAY]] mat\u00e9riel depuis [[GREEN]]{1}[[GRAY]]. +Salvage.Skills.Lottery.Untrained=[[GRAY]]Vous n\'\u00eates pas assez qualifi\u00e9 dans la r\u00e9cup\u00e9ration. Vous ne pouvez retrouver que [[RED]]{0}[[GRAY]] mat\u00e9riel depuis [[GREEN]]{1}[[GRAY]]. #Enclume (Partag\u00e9 entre RECYCLAGE et R\u00c9PARATION) Anvil.Unbreakable=Cet item est incassable ! #\u00c9P\u00c9E Swords.Ability.Lower=[[GRAY]]**VOUS ABAISSEZ VOTRE \u00c9P\u00c9E** Swords.Ability.Ready=[[GREEN]]**VOUS LEVEZ VOTRE \u00c9P\u00c9E** -Swords.Combat.Rupture.Note=[[GRAY]]NOTE: [[YELLOW]]1 Tick correspond à 0.5 seconds! +Swords.Combat.Rupture.Note=[[GRAY]]NOTE: [[YELLOW]]1 Tick correspond \u00e0 0.5 seconds! 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** @@ -420,10 +420,10 @@ Swords.SubSkill.SerratedStrikes.Stat=Puissance de l\'attaque d\u00e9chirante Swords.SubSkill.Rupture.Name=H\u00e9morragie Swords.SubSkill.Rupture.Description=Un h\u00e9morragie puissant ! Swords.SubSkill.Stab.Name=Poignarder -Swords.SubSkill.Stab.Description=Ajoute plus de d\u00e9gâts à vos attaques. -Swords.SubSkill.Stab.Stat=D\u00e9gâts du poing supppl\u00e9mentaire +Swords.SubSkill.Stab.Description=Ajoute plus de d\u00e9g\u00e2ts \u00e0 vos attaques. +Swords.SubSkill.Stab.Stat=D\u00e9g\u00e2ts du poing supppl\u00e9mentaire Swords.SubSkill.SwordsLimitBreak.Name=Limitation des d\u00e9g\u00e2ts de l\'\u00e9p\u00e9e -Swords.SubSkill.SwordsLimitBreak.Description=Casse les limites. Augmente les d\u00e9g\u00e2ts face aux ennemis. Pr\u00e9vu pour le PvP, il peut être configur\u00e9 pour le PvE. +Swords.SubSkill.SwordsLimitBreak.Description=Casse les limites. Augmente les d\u00e9g\u00e2ts face aux ennemis. Pr\u00e9vu pour le PvP, il peut \u00eatre configur\u00e9 pour le PvE. Swords.SubSkill.SwordsLimitBreak.Stat=D\u00e9g\u00e2ts maximum Swords.SubSkill.Rupture.Stat=Chance d\'h\u00e9morragie Swords.SubSkill.Rupture.Stat.Extra=H\u00e9morragie: [[GREEN]]{0} ticks [{1} DMG vs Joueur] [{2} DMG vs Monstre] @@ -483,7 +483,7 @@ Taming.Listener=Apprivoisement : Taming.SkillName=APPRIVOISEMENT Taming.Summon.COTW.Success.WithoutLifespan=[[GREEN]](Appel de la nature) [[GRAY]]Vous avez invoqu\u00e9 un [[GOLD]]{0}[[GRAY]] Taming.Summon.COTW.Success.WithLifespan=[[GREEN]](Appel de la nature) [[GRAY]]Vous avez invoqu\u00e9 un [[GOLD]]{0}[[GRAY]] pendant [[GOLD]]{1}[[GRAY]] secondes. -Taming.Summon.COTW.Limit=[[GREEN]](Appel de la nature) [[GRAY]]Vous ne pouvez avoir que [[RED]]{0} [[GRAY]]{1} invoqu\u00e9s en même temps. +Taming.Summon.COTW.Limit=[[GREEN]](Appel de la nature) [[GRAY]]Vous ne pouvez avoir que [[RED]]{0} [[GRAY]]{1} invoqu\u00e9s en m\u00eame temps. Taming.Summon.COTW.TimeExpired=[[GREEN]](Appel de la nature) [[GRAY]]Time is up, your [[GOLD]]{0}[[GRAY]] departs. Taming.Summon.COTW.BreedingDisallowed=[[GREEN]](Appel de la nature) [[RED]]Vous ne pouvez pas reproduire un animal invoqu\u00e9. Taming.Summon.COTW.NeedMoreItems=[[GREEN]](Appel de la nature) [[GRAY]]Vous avez besoin de [[YELLOW]]{0} [[DARK_AQUA]]{1}[[GRAY]](s) @@ -501,8 +501,8 @@ Unarmed.SubSkill.Berserk.Stat=Dur\u00e9e du berserk Unarmed.SubSkill.Disarm.Name=D\u00e9sarmement (sur joueurs) Unarmed.SubSkill.Disarm.Description=Fait tomber l\'arme des ennemis Unarmed.SubSkill.Disarm.Stat=Chance de d\u00e9sarmement -Unarmed.SubSkill.UnarmedLimitBreak.Name=Limitation des d\u00e9gâts aux poings -Unarmed.SubSkill.UnarmedLimitBreak.Description=Casse les limites. Augmente les d\u00e9g\u00e2ts face aux ennemis. Pr\u00e9vu pour le PvP, il peut être configur\u00e9 pour le PvE. +Unarmed.SubSkill.UnarmedLimitBreak.Name=Limitation des d\u00e9g\u00e2ts aux poings +Unarmed.SubSkill.UnarmedLimitBreak.Description=Casse les limites. Augmente les d\u00e9g\u00e2ts face aux ennemis. Pr\u00e9vu pour le PvP, il peut \u00eatre configur\u00e9 pour le PvE. Unarmed.SubSkill.UnarmedLimitBreak.Stat=D\u00e9g\u00e2ts maximum Unarmed.SubSkill.IronArmStyle.Name=Poings de fer Unarmed.SubSkill.IronArmStyle.Description=Durcit vos poings au fil du temps @@ -561,13 +561,10 @@ 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. - - - -Ability.Generic.Refresh=[[GREEN]]**COMP\u00c9TENCES RAFRA\u00ceCHIES !** -Ability.Generic.Template.Lock=[[GRAY]]{0} -Ability.Generic.Template={0} : [[YELLOW]]{1} -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, +#COMMANDES +##generique +mcMMO.Description=[[DARK_AQUA]]\u00e0 propos du projet [[YELLOW]]mcMMO[[DARK_AQUA]]:,[[GOLD]]C'est un mod RPG [[RED]]open source[[GOLD]] cr\u00e9\u00e9 en f\u00e9vrier 2011, [[GOLD]]par [[BLUE]]nossr50[[GOLD]]. Le but est de permettre l'exp\u00e9rience d\'un RPG de qualit\u00e9.,[[DARK_AQUA]]Conseils:,[[GOLD]] - [[GREEN]]Utilisez [[RED]]/mcmmo help[[GREEN]] pour voir les commandes,[[GOLD]] - [[GREEN]]Faites [[RED]]/skillname[[GREEN]] pour voir les d\u00e9tails d\'une comp\u00e9tence,[[DARK_AQUA]]D\u00e9veloppeurs:,[[GOLD]] - [[GREEN]]nossr50 [[BLUE]](Cr\u00e9ateur & Leader du projet),[[GOLD]] - [[GREEN]]electronicboy [[BLUE]](Dev),[[GOLD]] - [[GREEN]]kashike [[BLUE]](Dev),[[GOLD]] - [[GREEN]]t00thpick1 [[BLUE]](Mainteneur classique) +mcMMO.Description.FormerDevs=[[DARK_AQUA]]Former Devs: [[GREEN]]GJ, NuclearW, bm01, TfT_02, Glitchfinder 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}! @@ -590,6 +587,10 @@ 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.AdminChatSpy.Enabled=[mcMMO] Discussion priv\u00e9e SPY activ\u00e9 +Commands.AdminChatSpy.Disabled=[mcMMO] Discussion priv\u00e9e SPY d\u00e9sactiv\u00e9 +Commands.AdminChatSpy.Toggle=[mcMMO] Discussion bascul\u00e9 pour [[YELLOW]]{0} +Commands.AdminChatSpy.Chat=[[GOLD]][SPY: [[GREEN]]{0}[[GOLD]]] [[WHITE]]{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]]. @@ -599,7 +600,6 @@ 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.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 ! @@ -630,9 +630,6 @@ Commands.Notifications.Off=Les notifications des capacit\u00e9s ont \u00e9t\u00e 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} @@ -650,6 +647,9 @@ Commands.Party.Invite.1=Tapez [[GREEN]]/party accept[[YELLOW]] pour accepter l\' 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.PartyFull=[[GOLD]]{0}[[RED]] est complète ! +Commands.Party.PartyFull.Invite=Vous ne pouvez pas inviter [[YELLOW]]{0}[[RED]] \u00e0 rejoindre [[GREEN]]{1}[[RED]] parce qu\'il y a d\u00e9j\u00e0 [[DARK_AQUA]]{2}[[RED]] joueurs dedans ! +Commands.Party.PartyFull.InviteAccept=Vous ne pouvez pas rejoindre [[GREEN]]{0}[[RED]] parce qu\'il y a d\u00e9j\u00e0 [[DARK_AQUA]]{1}[[RED]] joueurs dedans ! 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} @@ -699,6 +699,8 @@ Commands.Scoreboard.Help.2=[[DARK_AQUA]]/mcscoreboard[[AQUA]] keep [[WHITE]] - G 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.XPBar.Reset=[[GOLD]]Configuration de XP Bar mcMMO r\u00e9initialis\u00e9. +Commands.XPBar.SettingChanged=[[GOLD]]Configuration de XP Bar pour [[GREEN]]{0}[[GOLD]] est d\u00e9sormais \u00e0 [[GREEN]]{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 @@ -718,10 +720,22 @@ Commands.Usage.Password=mot de passe Commands.Usage.Player=joueur Commands.Usage.Rate=taux Commands.Usage.Skill=Comp\u00e9tence +Commands.Usage.SubSkill=Sous-Comp\u00e9tence Commands.Usage.XP=exp +Commands.Description.mmoinfo=Lisez les d\u00e9tails \u00e0 propos des comp\u00e9tences ou des m\u00e9caniques. +Commands.MmoInfo.Mystery=[[GRAY]]Vous n'avez pas encore d\u00e9bloqu\u00e9 cette comp\u00e9tence, mais lorsque se sera le cas, vous pourrez lire ses d\u00e9tails ! +Commands.MmoInfo.NoMatch=Cette sous-comp\u00e9tence n'existe pas ! +Commands.MmoInfo.Header=[[DARK_AQUA]]-=[]=====[][[GOLD]] MMO Info [[DARK_AQUA]][]=====[]=- +Commands.MmoInfo.SubSkillHeader=[[GOLD]]Nom:[[YELLOW]] {0} +Commands.MmoInfo.DetailsHeader=[[DARK_AQUA]]-=[]=====[][[GREEN]] D\u00e9tails [[DARK_AQUA]][]=====[]=- +Commands.MmoInfo.OldSkill=[[GRAY]]Comp\u00e9tence mcMMO ont \u00e9t\u00e9 converti en un système modul\u00e9 de comp\u00e9tence, malheureusement celle-ci n'a pas encore \u00e9t\u00e9 converti et manque de d\u00e9tails. Le nouveau système permettra de plus facilement mettre \u00e0 jour les comp\u00e9tences mcMMO avec plus de flexibilit\u00e9 pour les comp\u00e9tences existantes. +Commands.MmoInfo.Mechanics=[[DARK_AQUA]]-=[]=====[][[GOLD]] Mecaniques [[DARK_AQUA]][]=====[]=- +Commands.MmoInfo.Stats=STATS: {0} +Commands.Mmodebug.Toggle=mcMMO mode de debug est d\u00e9sormais [[GOLD]]{0}[[GRAY]], utilisez cette commande pour le modifier. Avec le mode de d\u00e9bug activ\u00e9, vous pouvez taper les blocs pour obtenir des informations utilis\u00e9 pour le support. mcMMO.NoInvites=Vous n\'avez pas \u00e9t\u00e9 invit\u00e9 mcMMO.NoPermission=[[DARK_RED]]Vous n\'avez pas les droits. mcMMO.NoSkillNote=[[DARK_GRAY]]Si vous n\'avez pas les droits pour une comp\u00e9tence, il n\'appara\u00eetra pas ici. +##party 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]. @@ -797,6 +811,7 @@ Party.ItemShare.Category.Mining=Minage Party.ItemShare.Category.Herbalism=Herboristerie Party.ItemShare.Category.Woodcutting=B\u00fbcheronnage Party.ItemShare.Category.Misc=Divers +##xp Commands.XPGain.Acrobatics=Chuter Commands.XPGain.Alchemy=Confection de potions Commands.XPGain.Archery=Attaquer des monstres @@ -819,22 +834,37 @@ Commands.xprate.over=L\u2019\u00e9v\u00e9nement 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.NegativeNumberWarn=N'utilisez pas des nombres n\u00e9gatifs ! +Commands.Event.Start=[[GREEN]]mcMMO[[GOLD]] \u00e9vènement ! +Commands.Event.Stop=[[GREEN]]mcMMO[[DARK_AQUA]] \u00e9vènement termin\u00e9 ! +Commands.Event.Stop.Subtitle=[[GREEN]]J'espère que vous vous amesurez ! +Commands.Event.XP=[[DARK_AQUA]]Ratio d\'XP est d\u00e9sormais [[GOLD]]{0}[[DARK_AQUA]]x 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 ! + +# Admin Notifications +Server.ConsoleName=[[YELLOW]][Serveur] +Notifications.Admin.XPRate.Start.Self=[[GRAY]]Vous avez modifi\u00e9 le ratio d\'XP global \u00e0 [[GOLD]]{0}x +Notifications.Admin.XPRate.End.Self=[[GRAY]]Vous avez arr\u00eat\u00e9 l'\u00e9vènement de ratio d\'XP. +Notifications.Admin.XPRate.End.Others={0} [[GRAY]]a arr\u00eat\u00e9 l'\u00e9vènement de ratio d\'XP. +Notifications.Admin.XPRate.Start.Others={0} [[GRAY]]a commenc\u00e9 ou modifi\u00e9 un \u00e9vènement de ratio d\'XP global, qui est d\u00e9sormais de {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]]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 Guides.Available=[[GRAY]]Guide pour le/la {0} est disponible - \u00e9crivez /{1} ? [page] Guides.Header=[[GOLD]]-=[[GREEN]]{0} Guide[[GOLD]]=- Guides.Page.Invalid=Le num\u00e9ro de page est invalide Guides.Page.OutOfRange=Cette page n\'existe pas, il y a seulement {0} pages totales. Guides.Usage= L\'utilisation est /{0} ? [page] +##Acrobatics 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. +##Alchemy 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. @@ -842,22 +872,26 @@ Guides.Alchemy.Section.3=[[DARK_AQUA]]Ingr\u00e9dients pour la confections de ni 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) +##Archery 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. +##Axes 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. +##Excavation 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. +##Fishing 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. @@ -865,6 +899,7 @@ Guides.Fishing.Section.3=[[DARK_AQUA]]Comment fonctionne Ma\u00eetre P\u00eacheu 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. +##Herbalism 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. @@ -873,27 +908,33 @@ Guides.Herbalism.Section.4=[[DARK_AQUA]]Comment Mains Vertes (Pierre/Briques de 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. +##Mining 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. +##Repair 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. +##Salvage 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... +##Smelting +Guides.Smelting.Section.0=Prochainement... +##Swords 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. +##Taming 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. @@ -903,45 +944,58 @@ Guides.Taming.Section.5=[[DARK_AQUA]]Comment fonctionne Attentif \u00e0 l\'envir 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. +##Unarmed 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. +##Woodcutting Guides.Woodcutting.Section.0=[[DARK_AQUA]]A propos de b\u00fbcheronnage:\n[[YELLOW]]Le b\u00fbcheronnage concerne l\'abattement d\'arbres.\n[[DARK_AQUA]]Gain d\'Exp\u00e9rience:\n[[YELLOW]]Vous gagniez de l\'exp\u00e9rience pour chaque bloc de bois cass\u00e9. Guides.Woodcutting.Section.1=[[DARK_AQUA]]Comment fonctionne le Fendeur d\'Arbres?\n[[YELLOW]]Le Fendage d\'Arbres est une capacit\u00e9 active, en faisant un clic-droit\n[[YELLOW]]avec une hache \u00e0 la main, vous activerez cette capacit\u00e9. Ceci vous\n[[YELLOW]]permettra d\'abattre un arbre int\u00e9gralement, en r\u00e9cup\u00e9rant\n[[YELLOW]]toutes les b\u00fbches d\'un coup. Guides.Woodcutting.Section.2=[[DARK_AQUA]]Comment fonctionne le Souffleur de Feuilles?\n[[YELLOW]]Souffleur de Feuilles est une capacit\u00e9 passive qui permet de casser un\n[[YELLOW]]bloc de feuilles instantan\u00e9ment quand vous les cassez avec un hache. Par d\u00e9faut,\n[[YELLOW]]cette capacit\u00e9 est disponible au niveau 100 de la Comp\u00e9tence B\u00fbcheronnage. Guides.Woodcutting.Section.3=[[DARK_AQUA]]Comment fonctionne Double Bois?\n[[YELLOW]]Cette capacit\u00e9 passive vous donne une chance\n[[YELLOW]]de r\u00e9cup\u00e9rer une b\u00fbche suppl\u00e9mentaire par bloc de bois cass\u00e9. +#INSPECT 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 ! +#ITEMS 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.ChimaeraWing.NotEnough=Vous avez besoin de [[YELLOW]]{0}[[RED]] [[GOLD]]{1}[[RED]] en plus! +Item.NotEnough=Vous avez besoin de [[YELLOW]]{0}[[RED]] [[GOLD]]{1}[[RED]] en plus! Item.Generic.Wait=Vous devez attendre avant de pouvoir utiliser cela de nouveau ! [[YELLOW]]({0}s) Item.Injured.Wait=Vous avez \u00e9t\u00e9 bless\u00e9 r\u00e9cemment et devez attendre pour utiliser cela. [[YELLOW]]({0}s) Item.FluxPickaxe.Name=Pioche de Flux Item.FluxPickaxe.Lore.1=[[GRAY]]A une chance de fondre des minerais instantan\u00e9ment. Item.FluxPickaxe.Lore.2=[[GRAY]]Requi\u00e8re niveau de Forge {0}+ +#TELEPORTATION 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 ! +#COMPETENCES Skills.Child=[[GOLD]](TALENT ENFANT) Skills.Disarmed=[[DARK_RED]]Vous avez \u00e9t\u00e9 d\u00e9sarm\u00e9 ! Skills.Header=-----[][[GREEN]]{0}[[RED]][]----- Skills.NeedMore=[[DARK_RED]]Vous devez en avoir plus +Skills.NeedMore.Extra=[[DARK_RED]]Vous avez besoin de [[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=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. +Skills.AbilityGateRequirementFail=[[GRAY]]Vous devez avoir [[YELLOW]]{0}[[GRAY]] niveaux suppl\u00e9mentaires en [[DARK_AQUA]]{1}[[GRAY]] pour utilisez cette super abilit\u00e9. +#STATISTIQUES 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 Perks.XP.Name=Exp\u00e9rience Perks.XP.Desc=Gain d\'EXP boost\u00e9 dans certains talents. Perks.Lucky.Name=Chance @@ -953,6 +1007,7 @@ Perks.Cooldowns.Desc=Temps d\'attente r\u00e9duits de {0}. Perks.ActivationTime.Name=Endurance Perks.ActivationTime.Desc=Augmente la dur\u00e9e de l\'abil\u00e9t\u00e9 de {0} secondes. Perks.ActivationTime.Bonus=[[GOLD]] ({0}s avec votre avantage d\'endurance) +#HARDCORE 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 @@ -964,13 +1019,15 @@ Hardcore.Vampirism.Killer.Success=[[GOLD]][mcMMO] [[DARK_AQUA]]Vous avez vol\u00 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 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 +MOTD.Website=[[GOLD]][mcMMO] [[GREEN]]{0}[[YELLOW]] - Site de mcMMO +#SMELTING 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) @@ -979,14 +1036,17 @@ Smelting.Ability.SecondSmelt=Chance de seconde cuisson: [[YELLOW]]{0} Smelting.Ability.VanillaXPBoost=Multiplicateur d\'EXP Vanilla: [[YELLOW]]{0}x Smelting.SubSkill.FuelEfficiency.Name=Efficacit\u00e9 du combustible Smelting.SubSkill.FuelEfficiency.Description=Augmente la dur\u00e9e de vie du combustible utilis\u00e9 dans les fours lors des cuissons +Smelting.SubSkill.FuelEfficiency.Stat=Multiplicateur d\'efficacit\u00e9 du combustible: [[YELLOW]]{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.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 @@ -994,6 +1054,7 @@ Commands.Description.hardcore=Modifier le pourcentage de difficult\u00e9 de mcMM 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.mcchatspy=Mettre le chat mcMMO priv\u00e9e sur on/off Commands.Description.mcgod=Modifie le mode Dieu de McMMO en activ\u00e9/d\u00e9sactiv\u00e9 Commands.Description.mchud=Change le style du HUD McMMO Commands.Description.mcmmo=Montre une br\u00e8ve description de McMMO @@ -1006,6 +1067,7 @@ 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.mmodebug=Activer/D\u00e9sactiver le mode de debug pour voir des informations utiles lorsque vous tapez un blocs 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) @@ -1017,8 +1079,10 @@ Commands.Description.skillreset=Remet \u00e0 0 tous les niveaux McMMO pour un ut 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 +#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 @@ -1031,9 +1095,24 @@ 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. -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. +#DATABASE RECOVERY +Profile.PendingLoad=[[RED]]G\u00e9nial! Vos donn\u00e9es McMMO ont \u00e9t\u00e9 charg\u00e9es. +Profile.Loading.Success=[[GREEN]]Votre profil mcMMO a \u00e9t\u00e9 charg\u00e9. +Profile.Loading.FailurePlayer=[[RED]]mcMMO a des problèmes pour le chargement des donn\u00e9es, nous avons essay\u00e9 de les charger [[GREEN]]{0}[[RED]] fois.[[RED]] Vous devez contacter l'administrateur du serveur \u00e0 ce propos. mcMMO essayera de charger les donn\u00e9es jusqu\'\u00e0 votre d\u00e9connection, vous ne gagnerez pas d\'XP ou ne pourrez pas utiliser vos comp\u00e9tences tant que les donn\u00e9es ne sont pas charg\u00e9s. +Profile.Loading.FailureNotice=[[DARK_RED]][A][[RED]] mcMMO ne peut pas charger les donn\u00e9es pour [[YELLOW]]{0}[[RED]]. [[LIGHT_PURPLE]]Merci de v\u00e9rifier la configuration de la base de donn\u00e9es. Essaie fait {1}x. +#Holiday +Holiday.AprilFools.Levelup=[[GOLD]]{0} est d\u00e9sormais au niveau [[GREEN]]{1}[[GOLD]]! +Holiday.Anniversary=[[BLUE]]Joyeux {0} anniversaire !\n[[BLUE]]En honneur \u00e0 tout le travail de nossr50 et \u00e0 tout les d\u00e9veloppeurs, voici un spectacle de feu d\'artifice ! +#Messages de rappels +Reminder.Squelched=[[GRAY]]Rappel: 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=[[GREEN]]Messages recharg\u00e9s ! +#Player Leveling Stuff +LevelCap.PowerLevel=[[GOLD]]([[GREEN]]mcMMO[[GOLD]]) [[YELLOW]]Vous avez atteint le niveau de power maximum de [[RED]]{0}[[YELLOW]]. Vous n'allez pas gagner de niveaux pour cette comp\u00e9tence. +LevelCap.Skill=[[GOLD]]([[GREEN]]mcMMO[[GOLD]]) [[YELLOW]]Vous avez atteint le niveau de power maximum de [[RED]]{0}[[YELLOW]] pour [[GOLD]]{1}[[YELLOW]]. Vous n'allez pas gagner de niveaux pour cette comp\u00e9tence. +Commands.XPBar.Usage=Usage normal est /mmoxpbar +Commands.Description.mmoxpbar=Configuration pour les joueurs des mcMMO XP bars +Commands.Description.mmocompat=Information \u00e0 propos de mcMMO, des compatibilit\u00e9s or des de ses fonctionnalit\u00e9s +Compatibility.Layer.Unsupported=[[GOLD]]Compatibilit\u00e9s pour [[GREEN]]{0}[[GOLD]] n'est pas une version de Minecraft support\u00e9. +Compatibility.Layer.PartialSupport=[[GOLD]]Compatibilit\u00e9s pour [[GREEN]]{0}[[GOLD]] n'est pas une version de Minecraft support\u00e9, mais mcMMO utilise une version qui \u00e9mule certaines fonctionnalit\u00e9s manquantes. +Commands.XPBar.DisableAll=[[GOLD]] Toutes les barres d\'XP mcMMO sont d\u00e9sormais d\u00e9sactiv\u00e9s, utilisez /mmoxpbar reset pour remettre la configuration par d\u00e9faut. From 7f1944b61d393de65c9272bc9e274132526cf8a2 Mon Sep 17 00:00:00 2001 From: Frank van der Heijden Date: Mon, 13 Jul 2020 15:33:22 +0200 Subject: [PATCH 080/662] Update regex to also match colorless healthbar instances --- src/main/java/com/gmail/nossr50/util/MobHealthbarUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gmail/nossr50/util/MobHealthbarUtils.java b/src/main/java/com/gmail/nossr50/util/MobHealthbarUtils.java index 4f17d0955..4bd676b1e 100644 --- a/src/main/java/com/gmail/nossr50/util/MobHealthbarUtils.java +++ b/src/main/java/com/gmail/nossr50/util/MobHealthbarUtils.java @@ -27,7 +27,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); } /** From 039eb0ee9e4f3fc59c05a3664166af36edd0968b Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 13 Jul 2020 07:28:50 -0700 Subject: [PATCH 081/662] Fix array out of bounds --- Changelog.txt | 6 ++++++ pom.xml | 2 +- .../com/gmail/nossr50/listeners/InventoryListener.java | 7 ++++++- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index d2c0faedf..364bac92f 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,9 @@ +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) + 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 diff --git a/pom.xml b/pom.xml index f46788bc8..dba5ae885 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.132 + 2.1.133-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO diff --git a/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java b/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java index b64246df2..823b1528f 100644 --- a/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java @@ -436,7 +436,12 @@ public class InventoryListener implements Listener { public void onInventoryClickEvent(InventoryClickEvent event) { SkillUtils.removeAbilityBuff(event.getCurrentItem()); if (event.getAction() == InventoryAction.HOTBAR_SWAP) { - if(event.getWhoClicked().getInventory().getItem(event.getHotbarButton()) != null) + if(event.getHotbarButton() == -1) + return; + + PlayerInventory playerInventory = event.getWhoClicked().getInventory(); + + if(playerInventory.getItem(event.getHotbarButton()) != null) SkillUtils.removeAbilityBuff(event.getWhoClicked().getInventory().getItem(event.getHotbarButton())); } } From 7eef87b2e0e94c10ecc8532c569ad516ca107236 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 13 Jul 2020 07:39:16 -0700 Subject: [PATCH 082/662] Turn off unused NMS compatibility layers --- Changelog.txt | 1 + .../util/compat/CompatibilityManager.java | 28 ++++++++++--------- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 364bac92f..57abaea1c 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -3,6 +3,7 @@ Version 2.1.133 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 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 e5d3a481a..ae0532ccb 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/CompatibilityManager.java +++ b/src/main/java/com/gmail/nossr50/util/compat/CompatibilityManager.java @@ -51,20 +51,22 @@ 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); + isFullyCompatibleServerSoftware = true; - //Mark as operational - if(playerAttackCooldownExploitPreventionLayer.noErrorsOnInitialize()) { - supportedLayers.put(CompatibilityType.PLAYER_ATTACK_COOLDOWN_EXPLOIT_PREVENTION, true); - } - } +// 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); +// +// //Mark as operational +// if(playerAttackCooldownExploitPreventionLayer.noErrorsOnInitialize()) { +// supportedLayers.put(CompatibilityType.PLAYER_ATTACK_COOLDOWN_EXPLOIT_PREVENTION, true); +// } +// } } private void loadDummyCompatibilityLayers() { From c918f2b72fdbe80504b5c17d4b7119a490e48fd2 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 13 Jul 2020 07:43:03 -0700 Subject: [PATCH 083/662] 2.1.133 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1b5b72246..616ddb9f3 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.133-SNAPSHOT + 2.1.133 mcMMO https://github.com/mcMMO-Dev/mcMMO From 1d1736481c878793cb0fada2a92abe6d5676d569 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 13 Jul 2020 10:19:04 -0700 Subject: [PATCH 084/662] Dev mode --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 616ddb9f3..cea247bd0 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.133 + 2.1.134-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO From ded7fd5bdf509922bebb5f0819da2f9834b3601f Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 13 Jul 2020 10:53:36 -0700 Subject: [PATCH 085/662] Potion NPE fix --- Changelog.txt | 3 +++ src/main/java/com/gmail/nossr50/listeners/EntityListener.java | 3 +++ 2 files changed, 6 insertions(+) diff --git a/Changelog.txt b/Changelog.txt index 57abaea1c..1a88cc01b 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,6 @@ +Version 2.1.134 + Fixed a NPE that could happen with thrown potions + 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) diff --git a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java index 5b79227ba..7a6ff5bc0 100644 --- a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java @@ -1061,6 +1061,9 @@ public class EntityListener implements Listener { if(WorldBlacklist.isWorldBlacklisted(event.getEntity().getWorld())) return; + if(event.getPotion().getItem().getItemMeta() == null) + return; + for (PotionEffect effect : ((PotionMeta) event.getPotion().getItem().getItemMeta()).getCustomEffects()) { if (!effect.getType().equals(PotionEffectType.SATURATION)) { return; From 428c093ae4b212881bcf284348be2370ee29b626 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 13 Jul 2020 11:18:16 -0700 Subject: [PATCH 086/662] UUID updater changes + locale fixes Co-authored-by: t00thpick1 --- Changelog.txt | 3 + .../gmail/nossr50/config/HiddenConfig.java | 18 -- .../database/FlatfileDatabaseManager.java | 2 +- .../nossr50/database/SQLDatabaseManager.java | 4 +- .../database/UUIDUpdateAsyncTask.java | 171 ++++++++++-------- src/main/resources/hidden.yml | 10 +- .../resources/locale/locale_hu_HU.properties | 1 - .../resources/locale/locale_ja_JP.properties | 26 +-- .../resources/locale/locale_ru.properties | 1 - 9 files changed, 119 insertions(+), 117 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 1a88cc01b..57c2f7967 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,5 +1,8 @@ Version 2.1.134 Fixed a NPE that could happen with thrown potions + Fixed a locale mistake in locale hu_HU + Fixed a locale mistake in locale ru + Changed the UUID updater task to not catastrophically fail when requests failed Version 2.1.133 A fix for an 'array out of bounds' error related to players clicking outside the inventory windows has been fixed diff --git a/src/main/java/com/gmail/nossr50/config/HiddenConfig.java b/src/main/java/com/gmail/nossr50/config/HiddenConfig.java index edf89885d..58e6d8816 100644 --- a/src/main/java/com/gmail/nossr50/config/HiddenConfig.java +++ b/src/main/java/com/gmail/nossr50/config/HiddenConfig.java @@ -12,9 +12,6 @@ public class HiddenConfig { 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; @@ -36,9 +33,6 @@ public class HiddenConfig { 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); } } @@ -53,16 +47,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/database/FlatfileDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java index c9e305a14..a634fbf6b 100644 --- a/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java @@ -34,7 +34,7 @@ public final class FlatfileDatabaseManager implements DatabaseManager { updateLeaderboards(); if (mcMMO.getUpgradeManager().shouldUpgrade(UpgradeType.ADD_UUIDS)) { - new UUIDUpdateAsyncTask(mcMMO.p, getStoredUsers()).runTaskAsynchronously(mcMMO.p); + new UUIDUpdateAsyncTask(mcMMO.p, getStoredUsers()).start(); } } diff --git a/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java index 8fdff41d8..e7637edb8 100644 --- a/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java @@ -1338,7 +1338,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(); 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..7a3901834 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.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 Object awaiter = new Object(); + 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 == userNames.size()) + { mcMMO.getUpgradeManager().setUpgradeCompleted(UpgradeType.ADD_UUIDS); - plugin.getLogger().info("UUID upgrade completed!"); + awaiter.notify(); + } + 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.wait(); + } catch (InterruptedException e) { + // I guess we don't care in this event } } } 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_hu_HU.properties b/src/main/resources/locale/locale_hu_HU.properties index fb3fdce37..a037be8ca 100644 --- a/src/main/resources/locale/locale_hu_HU.properties +++ b/src/main/resources/locale/locale_hu_HU.properties @@ -979,7 +979,6 @@ 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} diff --git a/src/main/resources/locale/locale_ja_JP.properties b/src/main/resources/locale/locale_ja_JP.properties index efaa25b8f..0990ad327 100644 --- a/src/main/resources/locale/locale_ja_JP.properties +++ b/src/main/resources/locale/locale_ja_JP.properties @@ -829,9 +829,9 @@ Commands.xplock.locked=[[GOLD]]\u3042\u306a\u305f\u306eXP\u30d0\u30fc\u306f\u73f 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.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 @@ -1056,17 +1056,17 @@ Smelting.SkillName=\u7cbe\u932c # 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.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.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.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.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.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 @@ -1078,13 +1078,13 @@ Commands.Description.mmoedit=\u30e6\u30fc\u30b6\u30fc\u306emcMMO\u30ec\u30d9\u30 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.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.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.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 @@ -1117,7 +1117,7 @@ Holiday.AprilFools.Levelup=[[GOLD]]{0}\u306f\u30ec\u30d9\u30eb[[GREEN]]{1}[[GOLD 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 # 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=[[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 # Locale Locale.Reloaded=[[GREEN]]\u30ed\u30b1\u30fc\u30eb \u30ea\u30ed\u30fc\u30c9\uff01 diff --git a/src/main/resources/locale/locale_ru.properties b/src/main/resources/locale/locale_ru.properties index 7e327c4cd..4811eb8c3 100644 --- a/src/main/resources/locale/locale_ru.properties +++ b/src/main/resources/locale/locale_ru.properties @@ -466,7 +466,6 @@ Taming.Summon.Complete=[[GREEN]]\u0412\u044b\u0437\u043e\u0432 \u0437\u0430\u043 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. From 7eae59a0b3b2ac8cc6aa049bd55d0b8d4d2eb96d Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 13 Jul 2020 11:39:03 -0700 Subject: [PATCH 087/662] Misc code fixes --- extras/mods/1.6.x/extrabiomesxl.blocks.yml | 18 +-- extras/mods/1.6.x/metallurgy3.tools.yml | 18 --- extras/mods/1.6.x/twilightforest.armor.yml | 20 --- .../nossr50/commands/McImportCommand.java | 11 +- .../nossr50/commands/McconvertCommand.java | 23 ++- .../nossr50/commands/McnotifyCommand.java | 21 ++- .../nossr50/commands/McscoreboardCommand.java | 8 +- .../gmail/nossr50/commands/ToggleCommand.java | 10 +- .../admin/McmmoReloadLocaleCommand.java | 22 ++- .../nossr50/commands/chat/ChatCommand.java | 10 +- .../database/ConvertDatabaseCommand.java | 78 +++++----- .../commands/database/McpurgeCommand.java | 19 ++- .../commands/database/McremoveCommand.java | 50 +++---- .../commands/database/MmoshowdbCommand.java | 19 ++- .../experience/ConvertExperienceCommand.java | 51 ++++--- .../hardcore/HardcoreModeCommand.java | 14 +- .../commands/party/PartyAcceptCommand.java | 48 +++---- .../party/PartyChangeOwnerCommand.java | 37 +++-- .../nossr50/commands/party/PartyCommand.java | 36 ++--- .../commands/party/PartyDisbandCommand.java | 38 +++-- .../commands/party/PartyHelpCommand.java | 29 ++-- .../commands/party/PartyInviteCommand.java | 91 ++++++------ .../commands/party/PartyKickCommand.java | 60 ++++---- .../commands/party/PartyLockCommand.java | 2 +- .../commands/party/PartyQuitCommand.java | 36 +++-- .../commands/party/PartyRenameCommand.java | 84 ++++++----- .../commands/party/PartyXpShareCommand.java | 27 ++-- .../alliance/PartyAllianceAcceptCommand.java | 42 +++--- .../party/alliance/PartyAllianceCommand.java | 24 ++-- .../alliance/PartyAllianceDisbandCommand.java | 34 ++--- .../alliance/PartyAllianceInviteCommand.java | 100 +++++++------ .../commands/party/teleport/PtpCommand.java | 120 ++++++++-------- .../commands/player/InspectCommand.java | 133 +++++++++--------- .../commands/player/MccooldownCommand.java | 57 ++++---- .../commands/player/McrankCommand.java | 10 +- .../commands/player/McstatsCommand.java | 57 ++++---- .../nossr50/commands/player/MctopCommand.java | 8 +- .../commands/skills/AcrobaticsCommand.java | 2 +- .../nossr50/commands/skills/AprilCommand.java | 55 ++++---- .../commands/skills/ExcavationCommand.java | 2 +- .../commands/skills/HerbalismCommand.java | 2 +- .../commands/skills/MmoInfoCommand.java | 8 +- .../nossr50/commands/skills/SkillCommand.java | 84 +++++------ .../commands/skills/SkillGuideCommand.java | 6 +- .../commands/skills/UnarmedCommand.java | 4 +- .../commands/skills/WoodcuttingCommand.java | 2 +- .../gmail/nossr50/config/AdvancedConfig.java | 3 +- .../gmail/nossr50/config/ConfigLoader.java | 2 +- .../gmail/nossr50/config/HiddenConfig.java | 2 +- .../com/gmail/nossr50/config/RankConfig.java | 2 +- .../com/gmail/nossr50/config/SoundConfig.java | 2 +- .../gmail/nossr50/config/WorldBlacklist.java | 2 +- .../config/skills/alchemy/PotionConfig.java | 21 ++- .../config/skills/repair/RepairConfig.java | 2 +- .../config/skills/salvage/SalvageConfig.java | 2 +- .../nossr50/database/DatabaseManager.java | 38 ++--- .../database/FlatfileDatabaseManager.java | 28 ++-- .../nossr50/database/SQLDatabaseManager.java | 7 +- .../nossr50/datatypes/BlockSnapshot.java | 2 +- .../nossr50/datatypes/MobHealthbarType.java | 2 +- .../nossr50/datatypes/chat/ChatMode.java | 6 +- .../nossr50/datatypes/mods/CustomBlock.java | 6 +- .../nossr50/datatypes/mods/CustomEntity.java | 12 +- .../nossr50/datatypes/mods/CustomTool.java | 6 +- .../nossr50/datatypes/party/PartyLeader.java | 4 +- .../nossr50/datatypes/player/McMMOPlayer.java | 8 +- .../datatypes/player/PlayerProfile.java | 8 +- .../nossr50/datatypes/skills/ItemType.java | 2 +- .../datatypes/skills/PrimarySkillType.java | 14 +- .../datatypes/skills/SubSkillType.java | 10 +- .../datatypes/skills/SuperAbilityType.java | 12 +- .../nossr50/datatypes/skills/ToolType.java | 6 +- .../skills/alchemy/AlchemyPotion.java | 2 +- .../datatypes/skills/alchemy/PotionStage.java | 2 +- .../skills/subskills/acrobatics/Roll.java | 38 ++--- .../skills/subskills/taming/TamingSummon.java | 12 +- .../nossr50/events/chat/McMMOChatEvent.java | 4 +- .../events/chat/McMMOPartyChatEvent.java | 2 +- .../hardcore/McMMOPlayerVampirismEvent.java | 2 +- .../party/McMMOPartyAllianceChangeEvent.java | 8 +- .../events/party/McMMOPartyChangeEvent.java | 8 +- .../events/party/McMMOPartyLevelUpEvent.java | 2 +- .../events/party/McMMOPartyTeleportEvent.java | 4 +- .../events/party/McMMOPartyXpGainEvent.java | 2 +- .../players/McMMOPlayerProfileLoadEvent.java | 4 +- .../abilities/McMMOPlayerAbilityEvent.java | 2 +- .../skills/alchemy/McMMOPlayerBrewEvent.java | 2 +- .../fishing/McMMOPlayerMagicHunterEvent.java | 2 +- .../repair/McMMOPlayerRepairCheckEvent.java | 6 +- .../salvage/McMMOPlayerSalvageCheckEvent.java | 6 +- .../unarmed/McMMOPlayerDisarmEvent.java | 2 +- .../nossr50/listeners/InteractionManager.java | 6 +- .../gmail/nossr50/locale/LocaleLoader.java | 2 +- src/main/java/com/gmail/nossr50/mcMMO.java | 3 +- .../com/gmail/nossr50/party/PartyManager.java | 6 +- .../MobHealthDisplayUpdaterTask.java | 2 +- .../nossr50/runnables/PistonTrackerTask.java | 6 +- .../runnables/StickyPistonTrackerTask.java | 6 +- .../runnables/backups/CleanBackupsTask.java | 6 +- .../commands/McScoreboardKeepTask.java | 2 +- .../database/DatabaseConversionTask.java | 7 +- .../database/FormulaConversionTask.java | 4 +- .../runnables/database/UserPurgeTask.java | 2 +- .../runnables/items/ChimaeraWingWarmup.java | 2 +- .../runnables/items/TeleportationWarmup.java | 4 +- .../runnables/party/PartyChatTask.java | 8 +- .../player/PlayerProfileSaveTask.java | 4 +- .../player/PlayerUpdateInventoryTask.java | 2 +- .../runnables/skills/AbilityCooldownTask.java | 4 +- .../runnables/skills/AbilityDisableTask.java | 10 +- .../skills/AlchemyBrewCheckTask.java | 6 +- .../runnables/skills/AlchemyBrewTask.java | 10 +- .../runnables/skills/AwardCombatXpTask.java | 12 +- .../runnables/skills/BleedTimerTask.java | 5 +- .../skills/HerbalismBlockUpdaterTask.java | 2 +- .../skills/SkillUnlockNotificationTask.java | 6 +- .../runnables/skills/ToolLowerTask.java | 4 +- .../skills/acrobatics/AcrobaticsManager.java | 4 +- .../gmail/nossr50/skills/alchemy/Alchemy.java | 4 +- .../gmail/nossr50/skills/archery/Archery.java | 2 +- .../nossr50/skills/archery/TrackedEntity.java | 4 +- .../nossr50/skills/child/FamilyTree.java | 2 +- .../skills/repair/repairables/Repairable.java | 20 +-- .../repair/repairables/RepairableManager.java | 10 +- .../repair/repairables/SimpleRepairable.java | 2 +- .../repairables/SimpleRepairableManager.java | 2 +- .../salvage/salvageables/Salvageable.java | 18 +-- .../salvageables/SalvageableManager.java | 10 +- .../SimpleSalvageableManager.java | 2 +- .../skills/taming/TrackedTamingEntity.java | 4 +- .../gmail/nossr50/util/HolidayManager.java | 4 +- .../com/gmail/nossr50/util/LogFilter.java | 2 +- .../gmail/nossr50/util/MaterialMapStore.java | 70 ++++----- .../java/com/gmail/nossr50/util/Misc.java | 4 +- .../com/gmail/nossr50/util/ModManager.java | 44 +++--- .../nossr50/util/TextComponentFactory.java | 9 +- .../util/blockmeta/ChunkletManager.java | 36 ++--- .../nossr50/util/blockmeta/ChunkletStore.java | 10 +- .../blockmeta/chunkmeta/ChunkManager.java | 54 +++---- .../util/blockmeta/chunkmeta/ChunkStore.java | 18 +-- .../blockmeta/chunkmeta/HashChunkManager.java | 11 +- .../chunkmeta/McMMOSimpleRegionFile.java | 2 +- .../commands/CommandRegistrationManager.java | 4 +- .../util/compat/CompatibilityManager.java | 32 ++--- .../util/experience/FormulaManager.java | 2 +- .../version/SimpleNumericVersion.java | 2 +- .../util/scoreboards/ScoreboardManager.java | 4 +- .../util/scoreboards/ScoreboardWrapper.java | 2 +- .../util/skills/ParticleEffectUtils.java | 2 +- .../gmail/nossr50/util/skills/PerksUtils.java | 5 +- .../gmail/nossr50/util/skills/RankUtils.java | 3 +- .../gmail/nossr50/util/uuid/UUIDFetcher.java | 111 --------------- .../shatt/backup/ZipLibrary.java | 18 +-- 153 files changed, 1139 insertions(+), 1474 deletions(-) delete mode 100644 src/main/java/com/gmail/nossr50/util/uuid/UUIDFetcher.java 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/src/main/java/com/gmail/nossr50/commands/McImportCommand.java b/src/main/java/com/gmail/nossr50/commands/McImportCommand.java index 7c953a88a..e133d1392 100644 --- a/src/main/java/com/gmail/nossr50/commands/McImportCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/McImportCommand.java @@ -18,14 +18,11 @@ public class McImportCommand implements CommandExecutor { @Override public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - switch (args.length) { - case 0: - importModConfig(); - return true; - - default: - return false; + if (args.length == 0) { + importModConfig(); + return true; } + return false; } public boolean importModConfig() { diff --git a/src/main/java/com/gmail/nossr50/commands/McconvertCommand.java b/src/main/java/com/gmail/nossr50/commands/McconvertCommand.java index e104b61d2..8c3c544cc 100644 --- a/src/main/java/com/gmail/nossr50/commands/McconvertCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/McconvertCommand.java @@ -22,8 +22,8 @@ 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(); @@ -54,19 +54,16 @@ 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); - } + 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 diff --git a/src/main/java/com/gmail/nossr50/commands/McnotifyCommand.java b/src/main/java/com/gmail/nossr50/commands/McnotifyCommand.java index ac90ce9ab..467797ba7 100644 --- a/src/main/java/com/gmail/nossr50/commands/McnotifyCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/McnotifyCommand.java @@ -19,21 +19,18 @@ public class McnotifyCommand implements TabExecutor { 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 diff --git a/src/main/java/com/gmail/nossr50/commands/McscoreboardCommand.java b/src/main/java/com/gmail/nossr50/commands/McscoreboardCommand.java index 305aae98e..d731f2932 100644 --- a/src/main/java/com/gmail/nossr50/commands/McscoreboardCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/McscoreboardCommand.java @@ -70,12 +70,10 @@ 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(); + 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..8e74a01ff 100644 --- a/src/main/java/com/gmail/nossr50/commands/ToggleCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/ToggleCommand.java @@ -61,13 +61,11 @@ 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(); + 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/admin/McmmoReloadLocaleCommand.java b/src/main/java/com/gmail/nossr50/commands/admin/McmmoReloadLocaleCommand.java index da15b8297..bd78c7853 100644 --- a/src/main/java/com/gmail/nossr50/commands/admin/McmmoReloadLocaleCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/admin/McmmoReloadLocaleCommand.java @@ -12,19 +12,17 @@ import org.bukkit.command.CommandSender; 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")); - + 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/chat/ChatCommand.java b/src/main/java/com/gmail/nossr50/commands/chat/ChatCommand.java index b1d93685a..0062f6645 100644 --- a/src/main/java/com/gmail/nossr50/commands/chat/ChatCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/chat/ChatCommand.java @@ -21,7 +21,7 @@ import java.util.ArrayList; import java.util.List; public abstract class ChatCommand implements TabExecutor { - private ChatMode chatMode; + private final ChatMode chatMode; protected ChatManager chatManager; public ChatCommand(ChatMode chatMode) { @@ -89,12 +89,10 @@ public abstract class ChatCommand implements TabExecutor { @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(); + if (args.length == 1) { + return StringUtil.copyPartialMatches(args[0], CommandUtils.TRUE_FALSE_OPTIONS, new ArrayList(CommandUtils.TRUE_FALSE_OPTIONS.size())); } + return ImmutableList.of(); } protected String buildChatMessage(String[] args, int index) { 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..e1e205b01 100644 --- a/src/main/java/com/gmail/nossr50/commands/database/ConvertDatabaseCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/database/ConvertDatabaseCommand.java @@ -17,58 +17,54 @@ import org.bukkit.entity.Player; public class ConvertDatabaseCommand implements CommandExecutor { @Override public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - switch (args.length) { - case 2: - DatabaseType previousType = DatabaseType.getDatabaseType(args[1]); - DatabaseType newType = mcMMO.getDatabaseManager().getDatabaseType(); + if (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); - 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.getUniqueId()); + + 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..4982f87bf 100644 --- a/src/main/java/com/gmail/nossr50/commands/database/McpurgeCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/database/McpurgeCommand.java @@ -13,20 +13,17 @@ 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(); + if (args.length == 0) { + mcMMO.getDatabaseManager().purgePowerlessUsers(); - if (Config.getInstance().getOldUsersCutoff() != -1) { - mcMMO.getDatabaseManager().purgeOldUsers(); - } + if (Config.getInstance().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 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..e2e6033fb 100644 --- a/src/main/java/com/gmail/nossr50/commands/database/McremoveCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/database/McremoveCommand.java @@ -18,42 +18,36 @@ 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. - } + if (args.length == 1) { + String playerName = CommandUtils.getMatchedPlayerName(args[0]); + if (UserManager.getOfflinePlayer(playerName) == null && CommandUtils.unloadedProfile(sender, mcMMO.getDatabaseManager().loadPlayerProfile(playerName, false))) { 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(); + 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..610f35592 100644 --- a/src/main/java/com/gmail/nossr50/commands/database/MmoshowdbCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/database/MmoshowdbCommand.java @@ -13,21 +13,18 @@ import java.util.List; public class MmoshowdbCommand implements TabExecutor { @Override public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - switch (args.length) { - case 0: - Class clazz = DatabaseManagerFactory.getCustomDatabaseManagerClass(); + if (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", (Config.getInstance().getUseMySQL() ? "sql" : "flatfile"))); + return true; } + return false; } @Override 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..156212d74 100644 --- a/src/main/java/com/gmail/nossr50/commands/experience/ConvertExperienceCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/experience/ConvertExperienceCommand.java @@ -16,36 +16,33 @@ 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 - } + 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/hardcore/HardcoreModeCommand.java b/src/main/java/com/gmail/nossr50/commands/hardcore/HardcoreModeCommand.java index 2a59a45b4..fea605da4 100644 --- a/src/main/java/com/gmail/nossr50/commands/hardcore/HardcoreModeCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/hardcore/HardcoreModeCommand.java @@ -109,16 +109,14 @@ public abstract class HardcoreModeCommand implements TabExecutor { @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: + 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); 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..06ab23d90 100644 --- a/src/main/java/com/gmail/nossr50/commands/party/PartyAcceptCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/party/PartyAcceptCommand.java @@ -12,36 +12,32 @@ import org.bukkit.entity.Player; public class PartyAcceptCommand implements CommandExecutor { @Override public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - switch (args.length) { - case 1: - Player player = (Player) sender; + 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..435d93035 100644 --- a/src/main/java/com/gmail/nossr50/commands/party/PartyChangeOwnerCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/party/PartyChangeOwnerCommand.java @@ -15,30 +15,25 @@ import org.bukkit.entity.Player; public class PartyChangeOwnerCommand implements CommandExecutor { @Override public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - switch (args.length) { - case 2: - //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); + 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/PartyCommand.java b/src/main/java/com/gmail/nossr50/commands/party/PartyCommand.java index b1471d9a0..73638547c 100644 --- a/src/main/java/com/gmail/nossr50/commands/party/PartyCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/party/PartyCommand.java @@ -38,24 +38,24 @@ 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 partyChatCommand = new PartyChatCommand(); + private final CommandExecutor partyAllianceCommand = new PartyAllianceCommand(); @Override public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { 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..dc46f242c 100644 --- a/src/main/java/com/gmail/nossr50/commands/party/PartyDisbandCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/party/PartyDisbandCommand.java @@ -13,31 +13,27 @@ import org.bukkit.entity.Player; public class PartyDisbandCommand implements CommandExecutor { @Override public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - switch (args.length) { - case 1: - if(UserManager.getPlayer((Player) sender) == null) - { - sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad")); + if (args.length == 1) { + if (UserManager.getPlayer((Player) sender) == null) { + sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad")); + return true; + } + + Party playerParty = UserManager.getPlayer((Player) sender).getParty(); + String partyName = playerParty.getName(); + + for (Player member : playerParty.getOnlineMembers()) { + if (!PartyManager.handlePartyChangeEvent(member, partyName, null, EventReason.KICKED_FROM_PARTY)) { return true; } - 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(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..43fefa480 100644 --- a/src/main/java/com/gmail/nossr50/commands/party/PartyHelpCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/party/PartyHelpCommand.java @@ -9,22 +9,19 @@ 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; + 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/PartyInviteCommand.java b/src/main/java/com/gmail/nossr50/commands/party/PartyInviteCommand.java index 588feb3d7..ffb1adee0 100644 --- a/src/main/java/com/gmail/nossr50/commands/party/PartyInviteCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/party/PartyInviteCommand.java @@ -15,60 +15,55 @@ import org.bukkit.entity.Player; public class PartyInviteCommand implements CommandExecutor { @Override public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - switch (args.length) { - case 2: - String targetName = CommandUtils.getMatchedPlayerName(args[1]); - McMMOPlayer mcMMOTarget = UserManager.getOfflinePlayer(targetName); + if (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(), 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")); + 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/PartyKickCommand.java b/src/main/java/com/gmail/nossr50/commands/party/PartyKickCommand.java index ed0adde76..eb5298ad5 100644 --- a/src/main/java/com/gmail/nossr50/commands/party/PartyKickCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/party/PartyKickCommand.java @@ -16,42 +16,38 @@ import org.bukkit.entity.Player; public class PartyKickCommand implements CommandExecutor { @Override public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - switch (args.length) { - case 2: - if(UserManager.getPlayer((Player) sender) == null) - { - sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad")); + 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..ffaba4771 100644 --- a/src/main/java/com/gmail/nossr50/commands/party/PartyLockCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/party/PartyLockCommand.java @@ -67,7 +67,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..9fb080d44 100644 --- a/src/main/java/com/gmail/nossr50/commands/party/PartyQuitCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/party/PartyQuitCommand.java @@ -14,30 +14,26 @@ import org.bukkit.entity.Player; public class PartyQuitCommand implements CommandExecutor { @Override public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - switch (args.length) { - case 1: - Player player = (Player) sender; + 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..e7f50800b 100644 --- a/src/main/java/com/gmail/nossr50/commands/party/PartyRenameCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/party/PartyRenameCommand.java @@ -14,53 +14,49 @@ import org.bukkit.entity.Player; 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)); + 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..f90c7c21c 100644 --- a/src/main/java/com/gmail/nossr50/commands/party/PartyXpShareCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/party/PartyXpShareCommand.java @@ -29,24 +29,19 @@ public class PartyXpShareCommand implements CommandExecutor { 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..caa3a509d 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 @@ -12,32 +12,28 @@ import org.bukkit.entity.Player; public class PartyAllianceAcceptCommand implements CommandExecutor { @Override public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - switch (args.length) { - case 2: - 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); + 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..5283137e3 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 @@ -27,9 +27,9 @@ 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) { @@ -109,19 +109,17 @@ 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())); + 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..e610c136e 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 @@ -13,28 +13,24 @@ import org.bukkit.entity.Player; public class PartyAllianceDisbandCommand implements CommandExecutor { @Override public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - switch (args.length) { - case 2: - 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()); + 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..06694edd2 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 @@ -14,64 +14,60 @@ import org.bukkit.entity.Player; public class PartyAllianceInviteCommand implements CommandExecutor { @Override public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - switch (args.length) { - case 3: - String targetName = CommandUtils.getMatchedPlayerName(args[2]); - McMMOPlayer mcMMOTarget = UserManager.getOfflinePlayer(targetName); + if (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/PtpCommand.java b/src/main/java/com/gmail/nossr50/commands/party/teleport/PtpCommand.java index 8d046c8fb..4fec2eeb6 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 @@ -33,9 +33,9 @@ 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) { @@ -80,85 +80,79 @@ public class PtpCommand implements TabExecutor { 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 = Config.getInstance().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 = Config.getInstance().getPTPCommandCooldown(); + long ptpLastUse = mcMMOPlayer.getPartyTeleportRecord().getLastUse(); + + if (ptpCooldown > 0) { + int timeRemaining = SkillUtils.calculateTimeLeft(ptpLastUse * Misc.TIME_CONVERSION_FACTOR, ptpCooldown, player); + + if (timeRemaining > 0) { + player.sendMessage(LocaleLoader.getString("Item.Generic.Wait", timeRemaining)); + return true; + } + } + + sendTeleportRequest(sender, player, CommandUtils.getMatchedPlayerName(args[0])); + return true; } + 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())); + 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) { 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..b3fb2ba17 100644 --- a/src/main/java/com/gmail/nossr50/commands/player/InspectCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/player/InspectCommand.java @@ -23,86 +23,79 @@ import java.util.List; public class InspectCommand implements TabExecutor { @Override public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - switch (args.length) { - case 1: - String playerName = CommandUtils.getMatchedPlayerName(args[0]); - McMMOPlayer mcMMOPlayer = UserManager.getOfflinePlayer(playerName); + if (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, false); // 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 (Config.getInstance().getScoreboardsEnabled() && sender instanceof Player && Config.getInstance().getInspectUseBoard()) { + ScoreboardManager.enablePlayerInspectScoreboard((Player) sender, profile); - default: - return false; + 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())); + } + + 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(); + 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..ab736762b 100644 --- a/src/main/java/com/gmail/nossr50/commands/player/MccooldownCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/player/MccooldownCommand.java @@ -26,49 +26,44 @@ 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 (Config.getInstance().getScoreboardsEnabled() && Config.getInstance().getCooldownUseBoard()) { + ScoreboardManager.enablePlayerCooldownScoreboard(player); - if (!Config.getInstance().getCooldownUseChat()) { - return true; - } - } - - if(UserManager.getPlayer(player) == null) - { - player.sendMessage(LocaleLoader.getString("Profile.PendingLoad")); + if (!Config.getInstance().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.getName())); + } else { + player.sendMessage(LocaleLoader.getString("Commands.Cooldowns.Row.N", ability.getName(), seconds)); + } + } + + return true; } + return false; } @Override 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..20458624f 100644 --- a/src/main/java/com/gmail/nossr50/commands/player/McrankCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/player/McrankCommand.java @@ -73,13 +73,11 @@ 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(); + 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) { 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..2b623b0e4 100644 --- a/src/main/java/com/gmail/nossr50/commands/player/McstatsCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/player/McstatsCommand.java @@ -24,45 +24,40 @@ 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 (Config.getInstance().getStatsUseBoard() && Config.getInstance().getScoreboardsEnabled()) { + ScoreboardManager.enablePlayerStatsScoreboard(player); + + if (!Config.getInstance().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 = Config.getInstance().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 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..a17224566 100644 --- a/src/main/java/com/gmail/nossr50/commands/player/MctopCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/player/MctopCommand.java @@ -67,12 +67,10 @@ 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(); + if (args.length == 1) { + return StringUtil.copyPartialMatches(args[0], PrimarySkillType.SKILL_NAMES, new ArrayList(PrimarySkillType.SKILL_NAMES.size())); } + return ImmutableList.of(); } private void display(int page, PrimarySkillType skill, CommandSender sender, Command command) { 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..247615acb 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/AcrobaticsCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/AcrobaticsCommand.java @@ -71,7 +71,7 @@ public class AcrobaticsCommand extends SkillCommand { graceChance = RandomChanceUtil.getRandomChanceExecutionChance(grace_rcs); //damageThreshold = AdvancedConfig.getInstance().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; 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..8b29b3413 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/AprilCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/AprilCommand.java @@ -29,44 +29,41 @@ public class AprilCommand implements TabExecutor { skillName = StringUtils.getCapitalized(label); - switch (args.length) { - case 0: - Player player = (Player) sender; - FakeSkillType fakeSkillType = FakeSkillType.getByName(skillName); + if (args.length == 0) { + Player player = (Player) sender; + FakeSkillType fakeSkillType = FakeSkillType.getByName(skillName); - float skillValue = Misc.getRandom().nextInt(99); + 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))); + 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); + List effectMessages = effectsDisplay(fakeSkillType); - if (!effectMessages.isEmpty()) { - player.sendMessage(LocaleLoader.getString("Skills.Header", LocaleLoader.getString("Effects.Effects"))); + if (!effectMessages.isEmpty()) { + player.sendMessage(LocaleLoader.getString("Skills.Header", LocaleLoader.getString("Effects.Effects"))); - for (String message : effectMessages) { - player.sendMessage(message); - } + for (String message : effectMessages) { + player.sendMessage(message); } + } - List statsMessages = statsDisplay(fakeSkillType); + List statsMessages = statsDisplay(fakeSkillType); - if (!statsMessages.isEmpty()) { - player.sendMessage(LocaleLoader.getString("Skills.Header", LocaleLoader.getString("Commands.Stats.Self"))); + if (!statsMessages.isEmpty()) { + player.sendMessage(LocaleLoader.getString("Skills.Header", LocaleLoader.getString("Commands.Stats.Self"))); - for (String message : statsMessages) { - player.sendMessage(message); - } + 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; + player.sendMessage(LocaleLoader.formatString("[[DARK_AQUA]]Guide for {0} available - type /APRIL FOOLS ! :D", skillName)); + return true; } + return true; } private String getXPGainString(FakeSkillType fakeSkillType) { @@ -102,12 +99,10 @@ public class AprilCommand 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(); + if (args.length == 1) { + return ImmutableList.of("?"); } + return ImmutableList.of(); } private List effectsDisplay(FakeSkillType fakeSkillType) { 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..b047b117b 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/ExcavationCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/ExcavationCommand.java @@ -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]; } 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..7b8609a75 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/HerbalismCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/HerbalismCommand.java @@ -45,7 +45,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]; } 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..c1b5f2e0d 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/MmoInfoCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/MmoInfoCommand.java @@ -62,12 +62,10 @@ 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(); + if (args.length == 1) { + return StringUtil.copyPartialMatches(args[0], PrimarySkillType.SUBSKILL_NAMES, new ArrayList(PrimarySkillType.SUBSKILL_NAMES.size())); } + return ImmutableList.of(); } private void displayInfo(Player player, String subSkillName) 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..fe58a35fb 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/SkillCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/SkillCommand.java @@ -35,12 +35,12 @@ 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; @@ -64,64 +64,60 @@ public abstract class SkillCommand implements TabExecutor { return true; } - switch (args.length) { - case 0: - Player player = (Player) sender; - McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); + if (args.length == 0) { + Player player = (Player) sender; + McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); - boolean isLucky = Permissions.lucky(player, skill); - boolean hasEndurance = (PerksUtils.handleActivationPerks(player, 0, 0) != 0); - float skillValue = mcMMOPlayer.getSkillLevel(skill); + boolean isLucky = Permissions.lucky(player, skill); + boolean hasEndurance = (PerksUtils.handleActivationPerks(player, 0, 0) != 0); + float skillValue = mcMMOPlayer.getSkillLevel(skill); - //Send the players a few blank lines to make finding the top of the skill command easier - if(AdvancedConfig.getInstance().doesSkillCommandSendBlankLines()) - for(int i = 0; i < 2; i++) - { - player.sendMessage(""); - } + //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 (Config.getInstance().getUrlLinksEnabled()) { + player.sendMessage(LocaleLoader.getString("Overhaul.mcMMO.Header")); + TextComponentFactory.sendPlayerUrlHeader(player); + } - if (Config.getInstance().getScoreboardsEnabled() && Config.getInstance().getSkillUseBoard()) { - ScoreboardManager.enablePlayerSkillScoreboard(player, skill); - } + if (Config.getInstance().getScoreboardsEnabled() && Config.getInstance().getSkillUseBoard()) { + ScoreboardManager.enablePlayerSkillScoreboard(player, skill); + } - return true; - default: - return skillGuideCommand.onCommand(sender, command, label, args); + return true; } + return skillGuideCommand.onCommand(sender, command, label, args); } private void getStatMessages(Player player, boolean isLucky, boolean hasEndurance, float skillValue) { @@ -170,7 +166,7 @@ public abstract class SkillCommand implements TabExecutor { //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)))*/ } String parentMessage = ""; @@ -216,12 +212,10 @@ 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(); + if (args.length == 1) { + return ImmutableList.of("?"); } + return ImmutableList.of(); } protected int calculateRank(float skillValue, int maxLevel, int rankChangeLevel) { 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..47d2667bb 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/SkillGuideCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/SkillGuideCommand.java @@ -11,10 +11,10 @@ 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()); 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..d427ccb16 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/UnarmedCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/UnarmedCommand.java @@ -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,7 +54,7 @@ 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]; } 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..6fce8dc62 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/WoodcuttingCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/WoodcuttingCommand.java @@ -46,7 +46,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]; } diff --git a/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java b/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java index 296d95cff..a90d81fef 100644 --- a/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java +++ b/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java @@ -687,9 +687,8 @@ 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) diff --git a/src/main/java/com/gmail/nossr50/config/ConfigLoader.java b/src/main/java/com/gmail/nossr50/config/ConfigLoader.java index 025fe981b..a71c3b6a8 100644 --- a/src/main/java/com/gmail/nossr50/config/ConfigLoader.java +++ b/src/main/java/com/gmail/nossr50/config/ConfigLoader.java @@ -10,7 +10,7 @@ import java.util.List; public abstract class ConfigLoader { protected static final mcMMO plugin = mcMMO.p; protected String fileName; - private File configFile; + private final File configFile; protected FileConfiguration config; public ConfigLoader(String relativePath, String fileName) { diff --git a/src/main/java/com/gmail/nossr50/config/HiddenConfig.java b/src/main/java/com/gmail/nossr50/config/HiddenConfig.java index 58e6d8816..d4b646fd3 100644 --- a/src/main/java/com/gmail/nossr50/config/HiddenConfig.java +++ b/src/main/java/com/gmail/nossr50/config/HiddenConfig.java @@ -7,7 +7,7 @@ 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; diff --git a/src/main/java/com/gmail/nossr50/config/RankConfig.java b/src/main/java/com/gmail/nossr50/config/RankConfig.java index f5a1a7e71..6beb13ec5 100644 --- a/src/main/java/com/gmail/nossr50/config/RankConfig.java +++ b/src/main/java/com/gmail/nossr50/config/RankConfig.java @@ -13,7 +13,7 @@ public class RankConfig extends AutoUpdateConfigLoader { { super("skillranks.yml"); validate(); - this.instance = this; + instance = this; } @Override diff --git a/src/main/java/com/gmail/nossr50/config/SoundConfig.java b/src/main/java/com/gmail/nossr50/config/SoundConfig.java index 1bd215461..734e770aa 100644 --- a/src/main/java/com/gmail/nossr50/config/SoundConfig.java +++ b/src/main/java/com/gmail/nossr50/config/SoundConfig.java @@ -9,7 +9,7 @@ public class SoundConfig extends AutoUpdateConfigLoader { { super("sounds.yml"); validate(); - this.instance = this; + instance = this; } @Override diff --git a/src/main/java/com/gmail/nossr50/config/WorldBlacklist.java b/src/main/java/com/gmail/nossr50/config/WorldBlacklist.java index d9bd04b68..f0fd6bd2b 100644 --- a/src/main/java/com/gmail/nossr50/config/WorldBlacklist.java +++ b/src/main/java/com/gmail/nossr50/config/WorldBlacklist.java @@ -11,7 +11,7 @@ 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"; 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..bb479c931 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"); @@ -280,8 +280,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 8449faf2b..76ea32bbc 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 @@ -15,7 +15,7 @@ import java.util.*; public class RepairConfig extends ConfigLoader { private List repairables; - private HashSet notSupported; + private final HashSet notSupported; public RepairConfig(String fileName) { super(fileName); 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 28bee3198..a858c2890 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 @@ -18,7 +18,7 @@ import java.util.*; public class SalvageConfig extends ConfigLoader { private List salvageables; - private HashSet notSupported; + private final HashSet notSupported; public SalvageConfig(String fileName) { super(fileName); diff --git a/src/main/java/com/gmail/nossr50/database/DatabaseManager.java b/src/main/java/com/gmail/nossr50/database/DatabaseManager.java index 314b91800..f5769d93e 100644 --- a/src/main/java/com/gmail/nossr50/database/DatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/DatabaseManager.java @@ -12,19 +12,19 @@ import java.util.UUID; public interface DatabaseManager { // One month in milliseconds - public final long PURGE_TIME = 2630000000L * Config.getInstance().getOldUsersCutoff(); + 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(); + void 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 +33,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,7 +48,7 @@ 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. @@ -58,7 +58,7 @@ public interface DatabaseManager { * @param statsPerPage The number of stats per page * @return the requested leaderboard information */ - public List readLeaderboard(PrimarySkillType skill, int pageNumber, int statsPerPage); + List readLeaderboard(PrimarySkillType skill, int pageNumber, int statsPerPage); /** * Retrieve rank info into a HashMap from PrimarySkillType to the rank. @@ -69,7 +69,7 @@ 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. @@ -77,7 +77,7 @@ public interface DatabaseManager { * @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 */ - public void newUser(String playerName, UUID uuid); + void newUser(String playerName, UUID uuid); /** * Load a player from the database. @@ -91,7 +91,7 @@ public interface DatabaseManager { * and createNew is false */ @Deprecated - public PlayerProfile loadPlayerProfile(String playerName, boolean createNew); + PlayerProfile loadPlayerProfile(String playerName, boolean createNew); /** * Load a player from the database. @@ -99,7 +99,7 @@ public interface DatabaseManager { * @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); + PlayerProfile loadPlayerProfile(UUID uuid); /** * Load a player from the database. Attempt to use uuid, fall back on playername @@ -111,14 +111,14 @@ public interface DatabaseManager { * @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); + PlayerProfile loadPlayerProfile(String playerName, UUID uuid, boolean createNew); /** * 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 +126,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/FlatfileDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java index a634fbf6b..138e4615c 100644 --- a/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java @@ -809,20 +809,20 @@ public final class FlatfileDatabaseManager implements DatabaseManager { 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); + 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); diff --git a/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java index e7637edb8..be165b87b 100644 --- a/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java @@ -23,7 +23,7 @@ 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(); + private final String tablePrefix = Config.getInstance().getMySQLTablePrefix(); private final Map cachedUserIDs = new HashMap(); @@ -33,7 +33,7 @@ public final class SQLDatabaseManager implements DatabaseManager { private boolean debug = false; - private ReentrantLock massUpdateLock = new ReentrantLock(); + private final ReentrantLock massUpdateLock = new ReentrantLock(); protected SQLDatabaseManager() { String connectionString = "jdbc:mysql://" + Config.getInstance().getMySQLServerName() @@ -1488,9 +1488,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) { 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/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/chat/ChatMode.java b/src/main/java/com/gmail/nossr50/datatypes/chat/ChatMode.java index 1596faf2a..a327ad11c 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/chat/ChatMode.java +++ b/src/main/java/com/gmail/nossr50/datatypes/chat/ChatMode.java @@ -6,10 +6,10 @@ public enum ChatMode { ADMIN(LocaleLoader.getString("Commands.AdminChat.On"), LocaleLoader.getString("Commands.AdminChat.Off")), PARTY(LocaleLoader.getString("Commands.Party.Chat.On"), LocaleLoader.getString("Commands.Party.Chat.Off")); - private String enabledMessage; - private String disabledMessage; + private final String enabledMessage; + private final String disabledMessage; - private ChatMode(String enabledMessage, String disabledMessage) { + ChatMode(String enabledMessage, String disabledMessage) { this.enabledMessage = enabledMessage; this.disabledMessage = disabledMessage; } 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/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/player/McMMOPlayer.java b/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java index d848d98d9..214081384 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java +++ b/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java @@ -65,11 +65,11 @@ import java.util.Set; import java.util.UUID; public class McMMOPlayer { - private Player player; - private PlayerProfile profile; + private final Player player; + private final PlayerProfile profile; private final Map skillManagers = new HashMap(); - private ExperienceBarManager experienceBarManager; + private final ExperienceBarManager experienceBarManager; private Party party; private Party invite; @@ -102,7 +102,7 @@ public class McMMOPlayer { private boolean isUsingUnarmed; private final FixedMetadataValue playerMetadata; - private String playerName; + private final String playerName; public McMMOPlayer(Player player, PlayerProfile profile) { this.playerName = player.getName(); 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 ceefb54d3..f8463aa02 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/player/PlayerProfile.java +++ b/src/main/java/com/gmail/nossr50/datatypes/player/PlayerProfile.java @@ -38,8 +38,8 @@ public class PlayerProfile { private final Map uniquePlayerData = new HashMap<>(); //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 HashMap rollingSkillsXp = new HashMap(); @Deprecated public PlayerProfile(String playerName) { @@ -248,9 +248,7 @@ public class PlayerProfile { protected void resetCooldowns() { markProfileDirty(); - for (SuperAbilityType ability : abilityDATS.keySet()) { - abilityDATS.put(ability, 0); - } + abilityDATS.replaceAll((a, v) -> 0); } /* 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/PrimarySkillType.java b/src/main/java/com/gmail/nossr50/datatypes/skills/PrimarySkillType.java index 75fd7540f..fd9f89639 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/skills/PrimarySkillType.java +++ b/src/main/java/com/gmail/nossr50/datatypes/skills/PrimarySkillType.java @@ -65,11 +65,11 @@ public enum PrimarySkillType { WOODCUTTING(WoodcuttingManager.class, Color.OLIVE, SuperAbilityType.TREE_FELLER, ToolType.AXE, ImmutableList.of(SubSkillType.WOODCUTTING_LEAF_BLOWER, SubSkillType.WOODCUTTING_TREE_FELLER, SubSkillType.WOODCUTTING_HARVEST_LUMBER)); - private Class managerClass; - private Color skillColor; - private SuperAbilityType ability; - private ToolType tool; - private List subSkillTypes; + private final Class managerClass; + private final Color skillColor; + private final SuperAbilityType ability; + private final ToolType tool; + private final List subSkillTypes; public static final List SKILL_NAMES; public static final List SUBSKILL_NAMES; @@ -110,11 +110,11 @@ public enum PrimarySkillType { NON_CHILD_SKILLS = ImmutableList.copyOf(nonChildSkills); } - private PrimarySkillType(Class managerClass, Color skillColor, List subSkillTypes) { + 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) { + PrimarySkillType(Class managerClass, Color skillColor, SuperAbilityType ability, ToolType tool, List subSkillTypes) { this.managerClass = managerClass; this.skillColor = skillColor; this.ability = ability; 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..f72ede1bd 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/skills/SubSkillType.java +++ b/src/main/java/com/gmail/nossr50/datatypes/skills/SubSkillType.java @@ -189,7 +189,7 @@ public enum SubSkillType { String subskillNameWithoutPrefix = subSkillName.substring(subStringIndex); if(subskillNameWithoutPrefix.contains("_")) { - String splitStrings[] = subskillNameWithoutPrefix.split("_"); + String[] splitStrings = subskillNameWithoutPrefix.split("_"); for(String string : splitStrings) { @@ -215,7 +215,7 @@ 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++) { @@ -295,14 +295,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..cb4b0b10e 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/skills/SuperAbilityType.java +++ b/src/main/java/com/gmail/nossr50/datatypes/skills/SuperAbilityType.java @@ -85,14 +85,14 @@ 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 SuperAbilityType(String abilityOn, String abilityOff, String abilityPlayer, String abilityRefresh, String abilityPlayerOff) { + SuperAbilityType(String abilityOn, String abilityOff, String abilityPlayer, String abilityRefresh, String abilityPlayerOff) { this.abilityOn = abilityOn; this.abilityOff = abilityOff; this.abilityPlayer = abilityPlayer; 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/Roll.java b/src/main/java/com/gmail/nossr50/datatypes/skills/subskills/acrobatics/Roll.java index eae0f6c7d..0718fec8c 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 @@ -65,31 +65,24 @@ 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.getDamage())); - /* - * 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; + } } return false; @@ -420,8 +413,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) 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/events/chat/McMMOChatEvent.java b/src/main/java/com/gmail/nossr50/events/chat/McMMOChatEvent.java index 9c4f3ae68..3dee6a384 100644 --- a/src/main/java/com/gmail/nossr50/events/chat/McMMOChatEvent.java +++ b/src/main/java/com/gmail/nossr50/events/chat/McMMOChatEvent.java @@ -7,8 +7,8 @@ import org.bukkit.plugin.Plugin; public abstract class McMMOChatEvent extends Event implements Cancellable { private boolean cancelled; - private Plugin plugin; - private String sender; + private final Plugin plugin; + private final String sender; private String displayName; private String message; 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..66f37cdda 100644 --- a/src/main/java/com/gmail/nossr50/events/chat/McMMOPartyChatEvent.java +++ b/src/main/java/com/gmail/nossr50/events/chat/McMMOPartyChatEvent.java @@ -6,7 +6,7 @@ import org.bukkit.plugin.Plugin; * Called when a chat is sent to a party channel */ public class McMMOPartyChatEvent extends McMMOChatEvent { - private String party; + private final String party; public McMMOPartyChatEvent(Plugin plugin, String sender, String displayName, String party, String message) { super(plugin, sender, displayName, message); 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/party/McMMOPartyAllianceChangeEvent.java b/src/main/java/com/gmail/nossr50/events/party/McMMOPartyAllianceChangeEvent.java index 1e126e501..f902561a2 100644 --- a/src/main/java/com/gmail/nossr50/events/party/McMMOPartyAllianceChangeEvent.java +++ b/src/main/java/com/gmail/nossr50/events/party/McMMOPartyAllianceChangeEvent.java @@ -6,9 +6,9 @@ import org.bukkit.event.HandlerList; import org.bukkit.event.player.PlayerEvent; 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 +62,7 @@ public class McMMOPartyAllianceChangeEvent extends PlayerEvent implements Cancel /** * Any reason that doesn't fit elsewhere. */ - CUSTOM; + CUSTOM } /** Following are required for Cancellable **/ 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..bac977001 100644 --- a/src/main/java/com/gmail/nossr50/events/party/McMMOPartyChangeEvent.java +++ b/src/main/java/com/gmail/nossr50/events/party/McMMOPartyChangeEvent.java @@ -9,9 +9,9 @@ import org.bukkit.event.player.PlayerEvent; * 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) { @@ -75,7 +75,7 @@ public class McMMOPartyChangeEvent extends PlayerEvent implements Cancellable { /** * Any reason that doesn't fit elsewhere. */ - CUSTOM; + CUSTOM } /** Following are required for Cancellable **/ 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..b6790dd48 100644 --- a/src/main/java/com/gmail/nossr50/events/party/McMMOPartyLevelUpEvent.java +++ b/src/main/java/com/gmail/nossr50/events/party/McMMOPartyLevelUpEvent.java @@ -6,7 +6,7 @@ import org.bukkit.event.Event; import org.bukkit.event.HandlerList; public class McMMOPartyLevelUpEvent extends Event implements Cancellable { - private Party party; + private final Party party; private int levelsChanged; private boolean cancelled; 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..88a5f666b 100644 --- a/src/main/java/com/gmail/nossr50/events/party/McMMOPartyTeleportEvent.java +++ b/src/main/java/com/gmail/nossr50/events/party/McMMOPartyTeleportEvent.java @@ -8,8 +8,8 @@ import org.bukkit.event.player.PlayerTeleportEvent; * 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); 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..1b001f3b8 100644 --- a/src/main/java/com/gmail/nossr50/events/party/McMMOPartyXpGainEvent.java +++ b/src/main/java/com/gmail/nossr50/events/party/McMMOPartyXpGainEvent.java @@ -6,7 +6,7 @@ import org.bukkit.event.Event; import org.bukkit.event.HandlerList; public class McMMOPartyXpGainEvent extends Event implements Cancellable { - private Party party; + private final Party party; private float xpGained; private boolean cancelled; 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..e8a517754 100644 --- a/src/main/java/com/gmail/nossr50/events/players/McMMOPlayerProfileLoadEvent.java +++ b/src/main/java/com/gmail/nossr50/events/players/McMMOPlayerProfileLoadEvent.java @@ -9,8 +9,8 @@ import org.bukkit.event.HandlerList; 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()); 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..706055df3 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 @@ -6,7 +6,7 @@ import com.gmail.nossr50.events.skills.McMMOPlayerSkillEvent; 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); 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/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/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/InteractionManager.java b/src/main/java/com/gmail/nossr50/listeners/InteractionManager.java index 0a25c37b3..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,8 +50,7 @@ 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); mcMMO.p.getLogger().info("Registered subskill: "+ abstractSubSkill.getConfigKeyName()); } diff --git a/src/main/java/com/gmail/nossr50/locale/LocaleLoader.java b/src/main/java/com/gmail/nossr50/locale/LocaleLoader.java index 42df75d0f..11fc4841b 100644 --- a/src/main/java/com/gmail/nossr50/locale/LocaleLoader.java +++ b/src/main/java/com/gmail/nossr50/locale/LocaleLoader.java @@ -20,7 +20,7 @@ public final class LocaleLoader { 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); diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index ec7f5df41..98b19710a 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -506,7 +506,6 @@ public class mcMMO extends JavaPlugin { new ChildConfig(); List repairables = new ArrayList(); - List salvageables = new ArrayList(); if (Config.getInstance().getToolModsEnabled()) { new ToolConfigManager(this); @@ -532,7 +531,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 = new ArrayList(sManager.getLoadedSalvageables()); salvageableManager = new SimpleSalvageableManager(salvageables.size()); salvageableManager.registerSalvageables(salvageables); } diff --git a/src/main/java/com/gmail/nossr50/party/PartyManager.java b/src/main/java/com/gmail/nossr50/party/PartyManager.java index f27390613..2074fc4bb 100644 --- a/src/main/java/com/gmail/nossr50/party/PartyManager.java +++ b/src/main/java/com/gmail/nossr50/party/PartyManager.java @@ -33,9 +33,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() {} diff --git a/src/main/java/com/gmail/nossr50/runnables/MobHealthDisplayUpdaterTask.java b/src/main/java/com/gmail/nossr50/runnables/MobHealthDisplayUpdaterTask.java index 111ed9482..3e5cc78cc 100644 --- a/src/main/java/com/gmail/nossr50/runnables/MobHealthDisplayUpdaterTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/MobHealthDisplayUpdaterTask.java @@ -5,7 +5,7 @@ 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; diff --git a/src/main/java/com/gmail/nossr50/runnables/PistonTrackerTask.java b/src/main/java/com/gmail/nossr50/runnables/PistonTrackerTask.java index 9f01d64e5..61daa764d 100644 --- a/src/main/java/com/gmail/nossr50/runnables/PistonTrackerTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/PistonTrackerTask.java @@ -9,9 +9,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; 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/backups/CleanBackupsTask.java b/src/main/java/com/gmail/nossr50/runnables/backups/CleanBackupsTask.java index 822683030..d0c333592 100644 --- a/src/main/java/com/gmail/nossr50/runnables/backups/CleanBackupsTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/backups/CleanBackupsTask.java @@ -58,11 +58,7 @@ public class CleanBackupsTask extends BukkitRunnable { 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()) { // Keep one backup of each week 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/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..f8b231b58 100644 --- a/src/main/java/com/gmail/nossr50/runnables/database/FormulaConversionTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/database/FormulaConversionTask.java @@ -14,8 +14,8 @@ 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; 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..8ce66bfa8 100644 --- a/src/main/java/com/gmail/nossr50/runnables/database/UserPurgeTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/database/UserPurgeTask.java @@ -7,7 +7,7 @@ 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(); 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..b4ae92426 100644 --- a/src/main/java/com/gmail/nossr50/runnables/items/ChimaeraWingWarmup.java +++ b/src/main/java/com/gmail/nossr50/runnables/items/ChimaeraWingWarmup.java @@ -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; 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..d3315d4ab 100644 --- a/src/main/java/com/gmail/nossr50/runnables/items/TeleportationWarmup.java +++ b/src/main/java/com/gmail/nossr50/runnables/items/TeleportationWarmup.java @@ -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; diff --git a/src/main/java/com/gmail/nossr50/runnables/party/PartyChatTask.java b/src/main/java/com/gmail/nossr50/runnables/party/PartyChatTask.java index ff4b4999f..aca2d25e1 100644 --- a/src/main/java/com/gmail/nossr50/runnables/party/PartyChatTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/party/PartyChatTask.java @@ -12,11 +12,11 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; public class PartyChatTask extends BukkitRunnable { - private Plugin plugin; + private final Plugin plugin; - private Party party; - private String senderName; - private String displayName; + private final Party party; + private final String senderName; + private final String displayName; private String message; public PartyChatTask(Plugin plugin, Party party, String senderName, String displayName, String message) { 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..53f05f594 100644 --- a/src/main/java/com/gmail/nossr50/runnables/skills/AbilityDisableTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/skills/AbilityDisableTask.java @@ -17,8 +17,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; @@ -41,7 +41,7 @@ public class AbilityDisableTask extends BukkitRunnable { case BERSERK: if (Config.getInstance().getRefreshChunksEnabled()) { - resendChunkRadiusAt(player, 1); + resendChunkRadiusAt(player); } // Fallthrough @@ -66,13 +66,15 @@ public class AbilityDisableTask extends BukkitRunnable { 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/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..e471ba1e3 100644 --- a/src/main/java/com/gmail/nossr50/runnables/skills/BleedTimerTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/skills/BleedTimerTask.java @@ -23,7 +23,7 @@ import java.util.Map; import java.util.Map.Entry; public class BleedTimerTask extends BukkitRunnable { - private static Map bleedList = new HashMap(); + private static final Map bleedList = new HashMap(); private static boolean isIterating = false; @Override @@ -155,8 +155,7 @@ public class BleedTimerTask extends BukkitRunnable { int bleedRank = container.bleedRank; int toolTier = container.toolTier; - BleedContainer newContainer = new BleedContainer(target, bleedTicks, bleedRank, toolTier, source); - return newContainer; + return new BleedContainer(target, bleedTicks, bleedRank, toolTier, source); } /** 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/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..5f8881ff0 100644 --- a/src/main/java/com/gmail/nossr50/runnables/skills/ToolLowerTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/skills/ToolLowerTask.java @@ -8,8 +8,8 @@ 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; 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..8c5076cbf 100644 --- a/src/main/java/com/gmail/nossr50/skills/acrobatics/AcrobaticsManager.java +++ b/src/main/java/com/gmail/nossr50/skills/acrobatics/AcrobaticsManager.java @@ -32,9 +32,9 @@ public class AcrobaticsManager extends SkillManager { } 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 LimitedSizeList fallLocationMap; public boolean hasFallenInLocationBefore(Location location) { 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..025f54563 100644 --- a/src/main/java/com/gmail/nossr50/skills/alchemy/Alchemy.java +++ b/src/main/java/com/gmail/nossr50/skills/alchemy/Alchemy.java @@ -64,9 +64,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/archery/Archery.java b/src/main/java/com/gmail/nossr50/skills/archery/Archery.java index 9d3634e46..d40c1c9fd 100644 --- a/src/main/java/com/gmail/nossr50/skills/archery/Archery.java +++ b/src/main/java/com/gmail/nossr50/skills/archery/Archery.java @@ -15,7 +15,7 @@ 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(); 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/child/FamilyTree.java b/src/main/java/com/gmail/nossr50/skills/child/FamilyTree.java index 72ecbe530..5e4437358 100644 --- a/src/main/java/com/gmail/nossr50/skills/child/FamilyTree.java +++ b/src/main/java/com/gmail/nossr50/skills/child/FamilyTree.java @@ -8,7 +8,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); 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..05edc0d67 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,7 +7,7 @@ import java.util.HashMap; import java.util.List; public class SimpleRepairableManager implements RepairableManager { - private HashMap repairables; + private final HashMap repairables; public SimpleRepairableManager() { this(55); 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/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..6a9a41f9c 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 @@ -8,7 +8,7 @@ import java.util.List; public class SimpleSalvageableManager implements SalvageableManager { - private HashMap salvageables; + private final HashMap salvageables; public SimpleSalvageableManager() { this(55); 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..aabcd44da 100644 --- a/src/main/java/com/gmail/nossr50/skills/taming/TrackedTamingEntity.java +++ b/src/main/java/com/gmail/nossr50/skills/taming/TrackedTamingEntity.java @@ -13,9 +13,9 @@ import org.bukkit.scheduler.BukkitRunnable; import java.util.UUID; public class TrackedTamingEntity extends BukkitRunnable { - private LivingEntity livingEntity; + private final LivingEntity livingEntity; private final CallOfTheWildType callOfTheWildType; - private UUID id; + private final UUID id; private int length; private final TamingManager tamingManagerRef; diff --git a/src/main/java/com/gmail/nossr50/util/HolidayManager.java b/src/main/java/com/gmail/nossr50/util/HolidayManager.java index 7ae7fb2fc..903db4e16 100644 --- a/src/main/java/com/gmail/nossr50/util/HolidayManager.java +++ b/src/main/java/com/gmail/nossr50/util/HolidayManager.java @@ -25,8 +25,8 @@ import java.util.*; import java.util.regex.Pattern; public final class HolidayManager { - private ArrayList hasCelebrated; - private int currentYear; + private final ArrayList hasCelebrated; + private final int currentYear; private static final int START_YEAR = 2011; private static final List ALL_COLORS; 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 15f52fcbc..3ca4370f9 100644 --- a/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java +++ b/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java @@ -15,46 +15,46 @@ 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 HashSet abilityBlackList; + private final HashSet toolBlackList; + private final HashSet mossyWhiteList; + private final HashSet leavesWhiteList; + private final HashSet herbalismAbilityBlackList; + private final HashSet blockCrackerWhiteList; + private final HashSet canMakeShroomyWhiteList; + private final HashSet multiBlockPlant; + private final HashSet foodItemWhiteList; + private final 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 HashSet netheriteArmor; + private final HashSet netheriteTools; + private final HashSet woodTools; + private final HashSet stoneTools; + private final HashSet leatherArmor; + private final HashSet ironArmor; + private final HashSet ironTools; + private final HashSet stringTools; + private final HashSet goldArmor; + private final HashSet goldTools; + private final HashSet chainmailArmor; + private final HashSet diamondArmor; + private final HashSet diamondTools; + private final 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 HashSet swords; + private final HashSet axes; + private final HashSet hoes; + private final HashSet shovels; + private final HashSet pickAxes; + private final HashSet tridents; + private final HashSet bows; + private final HashSet tools; - private HashSet enchantables; + private final HashSet enchantables; - private HashSet ores; + private final HashSet ores; - private HashMap tierValue; + private final HashMap tierValue; public MaterialMapStore() diff --git a/src/main/java/com/gmail/nossr50/util/Misc.java b/src/main/java/com/gmail/nossr50/util/Misc.java index cbb60ee46..7346f42f1 100644 --- a/src/main/java/com/gmail/nossr50/util/Misc.java +++ b/src/main/java/com/gmail/nossr50/util/Misc.java @@ -18,7 +18,7 @@ import java.util.Random; import java.util.Set; public final class Misc { - private static Random random = new Random(); + private static final Random random = new Random(); public static final int TIME_CONVERSION_FACTOR = 1000; public static final int TICK_CONVERSION_FACTOR = 20; @@ -39,7 +39,7 @@ public final class Misc { 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"); - private Misc() {}; + private Misc() {} /** * Determines if an entity is an NPC but not a villager diff --git a/src/main/java/com/gmail/nossr50/util/ModManager.java b/src/main/java/com/gmail/nossr50/util/ModManager.java index 025775801..1cf04b98f 100644 --- a/src/main/java/com/gmail/nossr50/util/ModManager.java +++ b/src/main/java/com/gmail/nossr50/util/ModManager.java @@ -22,36 +22,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); diff --git a/src/main/java/com/gmail/nossr50/util/TextComponentFactory.java b/src/main/java/com/gmail/nossr50/util/TextComponentFactory.java index 70791e3b2..f96e305a2 100644 --- a/src/main/java/com/gmail/nossr50/util/TextComponentFactory.java +++ b/src/main/java/com/gmail/nossr50/util/TextComponentFactory.java @@ -44,8 +44,7 @@ public class TextComponentFactory { 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; + return new TextComponent(LocaleLoader.getString("Overhaul.Levelup", LocaleLoader.getString("Overhaul.Name."+StringUtils.getCapitalized(skill.toString())), levelsGained, currentLevel)); } private static TextComponent getNotificationTextComponent(String text) @@ -347,7 +346,6 @@ public class TextComponentFactory { 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; @@ -375,7 +373,7 @@ public class TextComponentFactory { nextRank = RankUtils.getRankUnlockLevel(abstractSubSkill, curRank+1); } - addRanked(ccRank, ccCurRank, ccPossessive, ccNumRanks, componentBuilder, abstractSubSkill.getNumRanks(), RankUtils.getRank(player, abstractSubSkill), nextRank); + addRanked(ccRank, ccCurRank, ccPossessive, ccCurRank, componentBuilder, abstractSubSkill.getNumRanks(), RankUtils.getRank(player, abstractSubSkill), nextRank); componentBuilder.append(LocaleLoader.getString("JSON.DescriptionHeader")); componentBuilder.append("\n").append(abstractSubSkill.getDescription()).append("\n"); @@ -456,7 +454,6 @@ public class TextComponentFactory { 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; @@ -484,7 +481,7 @@ public class TextComponentFactory { nextRank = RankUtils.getRankUnlockLevel(subSkillType, curRank+1); } - addRanked(ccRank, ccCurRank, ccPossessive, ccNumRanks, componentBuilder, subSkillType.getNumRanks(), RankUtils.getRank(player, subSkillType), nextRank); + addRanked(ccRank, ccCurRank, ccPossessive, ccCurRank, componentBuilder, subSkillType.getNumRanks(), RankUtils.getRank(player, subSkillType), nextRank); } diff --git a/src/main/java/com/gmail/nossr50/util/blockmeta/ChunkletManager.java b/src/main/java/com/gmail/nossr50/util/blockmeta/ChunkletManager.java index e3e3d0b2e..feb54acd3 100755 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/ChunkletManager.java +++ b/src/main/java/com/gmail/nossr50/util/blockmeta/ChunkletManager.java @@ -12,7 +12,7 @@ public interface ChunkletManager { * @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); + void loadChunklet(int cx, int cy, int cz, World world); /** * Unload a specific chunklet @@ -22,7 +22,7 @@ public interface ChunkletManager { * @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); + void unloadChunklet(int cx, int cy, int cz, World world); /** * Load a given Chunk's Chunklet data @@ -31,7 +31,7 @@ public interface ChunkletManager { * @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); + void loadChunk(int cx, int cz, World world); /** * Unload a given Chunk's Chunklet data @@ -40,7 +40,7 @@ public interface ChunkletManager { * @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); + void unloadChunk(int cx, int cz, World world); /** * Informs the ChunkletManager a chunk is loaded @@ -49,7 +49,7 @@ public interface ChunkletManager { * @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); + void chunkLoaded(int cx, int cz, World world); /** * Informs the ChunkletManager a chunk is unloaded @@ -58,38 +58,38 @@ public interface ChunkletManager { * @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); + 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); + 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); + 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); + void loadWorld(World world); /** * Save all ChunkletStores */ - public void saveAll(); + void saveAll(); /** * Unload all ChunkletStores after saving them */ - public void unloadAll(); + void unloadAll(); /** * Check to see if a given location is set to true @@ -100,7 +100,7 @@ public interface ChunkletManager { * @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); + boolean isTrue(int x, int y, int z, World world); /** * Check to see if a given block location is set to true @@ -108,7 +108,7 @@ public interface ChunkletManager { * @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); + boolean isTrue(Block block); /** * Set a given location to true, should create stores as necessary if the location does not exist @@ -118,14 +118,14 @@ public interface ChunkletManager { * @param z Z coordinate to set * @param world World to set in */ - public void setTrue(int x, int y, int z, World world); + 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); + void setTrue(Block block); /** * Set a given location to false, should not create stores if one does not exist for the given location @@ -135,17 +135,17 @@ public interface ChunkletManager { * @param z Z coordinate to set * @param world World to set in */ - public void setFalse(int x, int y, int z, World world); + 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); + void setFalse(Block block); /** * Delete any ChunkletStores that are empty */ - public void cleanUp(); + void cleanUp(); } diff --git a/src/main/java/com/gmail/nossr50/util/blockmeta/ChunkletStore.java b/src/main/java/com/gmail/nossr50/util/blockmeta/ChunkletStore.java index 5514df13c..9b1537782 100755 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/ChunkletStore.java +++ b/src/main/java/com/gmail/nossr50/util/blockmeta/ChunkletStore.java @@ -14,7 +14,7 @@ public interface ChunkletStore 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 @@ -23,7 +23,7 @@ public interface ChunkletStore 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 @@ -32,17 +32,17 @@ public interface ChunkletStore 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); /** * @return true if all values in the chunklet are false, false if otherwise */ - public boolean isEmpty(); + 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); + void copyFrom(ChunkletStore otherStore); } 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 index 3cf9b1faa..d64824a0e 100755 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/ChunkManager.java +++ b/src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/ChunkManager.java @@ -8,13 +8,13 @@ import org.bukkit.entity.Entity; import java.io.IOException; public interface ChunkManager { - public void closeAll(); + void closeAll(); - public ChunkStore readChunkStore(World world, int x, int z) throws IOException; + ChunkStore readChunkStore(World world, int x, int z) throws IOException; - public void writeChunkStore(World world, int x, int z, ChunkStore data); + void writeChunkStore(World world, int x, int z, ChunkStore data); - public void closeChunkStore(World world, int x, int z); + void closeChunkStore(World world, int x, int z); /** * Loads a specific chunklet @@ -24,7 +24,7 @@ public interface ChunkManager { * @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); + void loadChunklet(int cx, int cy, int cz, World world); /** * Unload a specific chunklet @@ -34,7 +34,7 @@ public interface ChunkManager { * @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); + void unloadChunklet(int cx, int cy, int cz, World world); /** * Load a given Chunk's Chunklet data @@ -43,7 +43,7 @@ public interface ChunkManager { * @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); + void loadChunk(int cx, int cz, World world, Entity[] entities); /** * Unload a given Chunk's Chunklet data @@ -52,7 +52,7 @@ public interface ChunkManager { * @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); + void unloadChunk(int cx, int cz, World world); /** * Saves a given Chunk's Chunklet data @@ -61,9 +61,9 @@ public interface ChunkManager { * @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); + void saveChunk(int cx, int cz, World world); - public boolean isChunkLoaded(int cx, int cz, World world); + boolean isChunkLoaded(int cx, int cz, World world); /** * Informs the ChunkletManager a chunk is loaded @@ -72,7 +72,7 @@ public interface ChunkManager { * @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); + void chunkLoaded(int cx, int cz, World world); /** * Informs the ChunkletManager a chunk is unloaded @@ -81,38 +81,38 @@ public interface ChunkManager { * @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); + 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); + 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); + 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); + void loadWorld(World world); /** * Save all ChunkletStores */ - public void saveAll(); + void saveAll(); /** * Unload all ChunkletStores after saving them */ - public void unloadAll(); + void unloadAll(); /** * Check to see if a given location is set to true @@ -123,7 +123,7 @@ public interface ChunkManager { * @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); + boolean isTrue(int x, int y, int z, World world); /** * Check to see if a given block location is set to true @@ -131,7 +131,7 @@ public interface ChunkManager { * @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); + boolean isTrue(Block block); /** * Check to see if a given BlockState location is set to true @@ -139,7 +139,7 @@ public interface ChunkManager { * @param blockState BlockState to check * @return true if the given BlockState location is set to true, false if otherwise */ - public boolean isTrue(BlockState blockState); + boolean isTrue(BlockState blockState); /** * Set a given location to true, should create stores as necessary if the location does not exist @@ -149,21 +149,21 @@ public interface ChunkManager { * @param z Z coordinate to set * @param world World to set in */ - public void setTrue(int x, int y, int z, World world); + 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); + 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); + void setTrue(BlockState blockState); /** * Set a given location to false, should not create stores if one does not exist for the given location @@ -173,24 +173,24 @@ public interface ChunkManager { * @param z Z coordinate to set * @param world World to set in */ - public void setFalse(int x, int y, int z, World world); + 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); + 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); + void setFalse(BlockState blockState); /** * Delete any ChunkletStores that are empty */ - public void cleanUp(); + void cleanUp(); } diff --git a/src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/ChunkStore.java b/src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/ChunkStore.java index d4f585f9a..69b2acae1 100755 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/ChunkStore.java +++ b/src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/ChunkStore.java @@ -13,28 +13,28 @@ public interface ChunkStore extends Serializable { * * @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(); /** * Checks the value at the given coordinates @@ -44,7 +44,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 +53,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 +62,17 @@ 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); /** * @return true if all values in the chunklet are false, false if otherwise */ - public boolean isEmpty(); + 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); + void copyFrom(ChunkletStore otherStore); } 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 index 532f87d66..13e93ebd3 100755 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/HashChunkManager.java +++ b/src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/HashChunkManager.java @@ -11,10 +11,10 @@ import java.io.*; import java.util.*; public class HashChunkManager implements ChunkManager { - private HashMap> regionFiles = new HashMap>(); + private final HashMap> regionFiles = new HashMap>(); public HashMap store = new HashMap(); public ArrayList converters = new ArrayList(); - private HashMap oldData = new HashMap(); + private final HashMap oldData = new HashMap(); @Override public synchronized void closeAll() { @@ -98,12 +98,7 @@ public class HashChunkManager implements ChunkManager { UUID key = world.getUID(); - HashMap worldRegions = regionFiles.get(key); - - if (worldRegions == null) { - worldRegions = new HashMap(); - regionFiles.put(key, worldRegions); - } + HashMap worldRegions = regionFiles.computeIfAbsent(key, k -> new HashMap()); int rx = x >> 5; int rz = z >> 5; 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 index 6a506d2ef..b3646e5fb 100644 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/McMMOSimpleRegionFile.java +++ b/src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/McMMOSimpleRegionFile.java @@ -39,7 +39,7 @@ public class McMMOSimpleRegionFile { @SuppressWarnings("unused") private long lastAccessTime = System.currentTimeMillis(); @SuppressWarnings("unused") - private static long TIMEOUT_TIME = 300000; // 5 min + private static final long TIMEOUT_TIME = 300000; // 5 min public McMMOSimpleRegionFile(File f, int rx, int rz) { this(f, rx, rz, 10); 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 594431af0..744ca5aae 100644 --- a/src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java +++ b/src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java @@ -32,9 +32,9 @@ 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()) { 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 ae0532ccb..67eededab 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/CompatibilityManager.java +++ b/src/main/java/com/gmail/nossr50/util/compat/CompatibilityManager.java @@ -104,23 +104,21 @@ public class CompatibilityManager { } 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; - case 16: - switch(minecraftGameVersion.getPatchVersion().asInt()) { - case 1: - return NMSVersion.NMS_1_16_1; - } - } + 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; + } + } } return NMSVersion.UNSUPPORTED; 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..3926ff9ad 100644 --- a/src/main/java/com/gmail/nossr50/util/experience/FormulaManager.java +++ b/src/main/java/com/gmail/nossr50/util/experience/FormulaManager.java @@ -12,7 +12,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; 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/scoreboards/ScoreboardManager.java b/src/main/java/com/gmail/nossr50/util/scoreboards/ScoreboardManager.java index 006199554..d07a8ef08 100644 --- a/src/main/java/com/gmail/nossr50/util/scoreboards/ScoreboardManager.java +++ b/src/main/java/com/gmail/nossr50/util/scoreboards/ScoreboardManager.java @@ -130,7 +130,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 +138,7 @@ public class ScoreboardManager { STATS_BOARD, COOLDOWNS_BOARD, RANK_BOARD, - TOP_BOARD; + TOP_BOARD } private static String formatAbility(String abilityName) { 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..5223bbce1 100644 --- a/src/main/java/com/gmail/nossr50/util/scoreboards/ScoreboardWrapper.java +++ b/src/main/java/com/gmail/nossr50/util/scoreboards/ScoreboardWrapper.java @@ -37,7 +37,7 @@ public class ScoreboardWrapper { // Internal usage variables (should exist) private SidebarType sidebarType; private Objective sidebarObjective; - private Objective powerObjective; + private final Objective powerObjective; // Parameter variables (May be null / invalid) private Scoreboard oldBoard = null; 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..807b6fb5c 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/ParticleEffectUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/ParticleEffectUtils.java @@ -14,7 +14,7 @@ import org.bukkit.entity.Player; public final class ParticleEffectUtils { - private ParticleEffectUtils() {}; + private ParticleEffectUtils() {} public static void playGreenThumbEffect(Location location) { World world = location.getWorld(); 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..70063bdea 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/PerksUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/PerksUtils.java @@ -11,7 +11,7 @@ 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)) { @@ -47,7 +47,6 @@ public final class PerksUtils { 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 +78,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..2fb58d018 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/RankUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/RankUtils.java @@ -276,8 +276,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/uuid/UUIDFetcher.java b/src/main/java/com/gmail/nossr50/util/uuid/UUIDFetcher.java deleted file mode 100644 index 1da4ddd16..000000000 --- a/src/main/java/com/gmail/nossr50/util/uuid/UUIDFetcher.java +++ /dev/null @@ -1,111 +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); - InputStreamReader tempStream = new InputStreamReader(connection.getInputStream()); - JsonObject[] jsonStreamArray = gson.fromJson(tempStream, JsonObject[].class); - tempStream.close(); - - 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/net/shatteredlands/shatt/backup/ZipLibrary.java b/src/main/java/net/shatteredlands/shatt/backup/ZipLibrary.java index c990d336e..67e797ef0 100644 --- a/src/main/java/net/shatteredlands/shatt/backup/ZipLibrary.java +++ b/src/main/java/net/shatteredlands/shatt/backup/ZipLibrary.java @@ -16,15 +16,15 @@ 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()) { From fdd951f1f1890d4bcb62fb6d44fd576df63ad8fe Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 13 Jul 2020 12:31:30 -0700 Subject: [PATCH 088/662] Second Smelt makes use of its own section in Bonus Drops in config.yml Co-authored-by: t00thpick1 --- Changelog.txt | 11 +++ .../java/com/gmail/nossr50/api/PartyAPI.java | 2 +- .../java/com/gmail/nossr50/api/SkillAPI.java | 2 +- .../nossr50/chat/ChatManagerFactory.java | 4 +- .../gmail/nossr50/commands/MHDCommand.java | 5 +- .../nossr50/commands/McImportCommand.java | 38 ++++----- .../nossr50/commands/McconvertCommand.java | 15 ++-- .../gmail/nossr50/commands/McmmoCommand.java | 3 +- .../nossr50/commands/McnotifyCommand.java | 5 +- .../nossr50/commands/McscoreboardCommand.java | 7 +- .../gmail/nossr50/commands/ToggleCommand.java | 7 +- .../gmail/nossr50/commands/XprateCommand.java | 9 +- .../admin/McmmoReloadLocaleCommand.java | 3 +- .../commands/admin/PlayerDebugCommand.java | 3 +- .../nossr50/commands/chat/ChatCommand.java | 7 +- .../database/ConvertDatabaseCommand.java | 3 +- .../commands/database/McpurgeCommand.java | 5 +- .../commands/database/McremoveCommand.java | 7 +- .../commands/database/MmoshowdbCommand.java | 5 +- .../experience/ConvertExperienceCommand.java | 3 +- .../experience/ExperienceCommand.java | 9 +- .../experience/SkillresetCommand.java | 9 +- .../hardcore/HardcoreModeCommand.java | 7 +- .../commands/party/PartyAcceptCommand.java | 3 +- .../party/PartyChangeOwnerCommand.java | 3 +- .../party/PartyChangePasswordCommand.java | 3 +- .../nossr50/commands/party/PartyCommand.java | 25 +++--- .../commands/party/PartyCreateCommand.java | 3 +- .../commands/party/PartyDisbandCommand.java | 3 +- .../commands/party/PartyHelpCommand.java | 3 +- .../commands/party/PartyInfoCommand.java | 7 +- .../commands/party/PartyInviteCommand.java | 3 +- .../commands/party/PartyItemShareCommand.java | 3 +- .../commands/party/PartyJoinCommand.java | 3 +- .../commands/party/PartyKickCommand.java | 3 +- .../commands/party/PartyLockCommand.java | 3 +- .../commands/party/PartyQuitCommand.java | 3 +- .../commands/party/PartyRenameCommand.java | 3 +- .../commands/party/PartyXpShareCommand.java | 3 +- .../alliance/PartyAllianceAcceptCommand.java | 3 +- .../party/alliance/PartyAllianceCommand.java | 9 +- .../alliance/PartyAllianceDisbandCommand.java | 3 +- .../alliance/PartyAllianceInviteCommand.java | 3 +- .../party/teleport/PtpAcceptAnyCommand.java | 3 +- .../party/teleport/PtpAcceptCommand.java | 3 +- .../commands/party/teleport/PtpCommand.java | 9 +- .../party/teleport/PtpToggleCommand.java | 3 +- .../commands/player/InspectCommand.java | 7 +- .../commands/player/MccooldownCommand.java | 5 +- .../commands/player/McrankCommand.java | 7 +- .../commands/player/McstatsCommand.java | 5 +- .../nossr50/commands/player/MctopCommand.java | 9 +- .../nossr50/commands/player/XPBarCommand.java | 2 +- .../nossr50/commands/server/Mcmmoupgrade.java | 3 +- .../commands/skills/AcrobaticsCommand.java | 2 +- .../commands/skills/AlchemyCommand.java | 2 +- .../nossr50/commands/skills/AprilCommand.java | 9 +- .../commands/skills/ArcheryCommand.java | 2 +- .../nossr50/commands/skills/AxesCommand.java | 2 +- .../commands/skills/ExcavationCommand.java | 2 +- .../commands/skills/FishingCommand.java | 2 +- .../commands/skills/HerbalismCommand.java | 2 +- .../commands/skills/MiningCommand.java | 2 +- .../commands/skills/MmoInfoCommand.java | 7 +- .../commands/skills/RepairCommand.java | 2 +- .../commands/skills/SalvageCommand.java | 2 +- .../nossr50/commands/skills/SkillCommand.java | 22 +++-- .../commands/skills/SkillGuideCommand.java | 7 +- .../commands/skills/SmeltingCommand.java | 2 +- .../commands/skills/SwordsCommand.java | 2 +- .../commands/skills/TamingCommand.java | 2 +- .../commands/skills/UnarmedCommand.java | 2 +- .../commands/skills/WoodcuttingCommand.java | 2 +- .../gmail/nossr50/config/AdvancedConfig.java | 2 +- .../config/AutoUpdateConfigLoader.java | 18 ++-- .../java/com/gmail/nossr50/config/Config.java | 2 +- .../com/gmail/nossr50/config/RankConfig.java | 2 +- .../config/experience/ExperienceConfig.java | 2 +- .../config/mods/CustomArmorConfig.java | 10 +-- .../config/mods/CustomEntityConfig.java | 4 +- .../nossr50/config/mods/CustomToolConfig.java | 16 ++-- .../config/party/ItemWeightConfig.java | 2 +- .../config/skills/alchemy/PotionConfig.java | 28 +++---- .../config/skills/repair/RepairConfig.java | 6 +- .../skills/repair/RepairConfigManager.java | 2 +- .../config/skills/salvage/SalvageConfig.java | 6 +- .../skills/salvage/SalvageConfigManager.java | 2 +- .../config/treasure/TreasureConfig.java | 30 +++---- .../database/FlatfileDatabaseManager.java | 84 +++++++++---------- .../nossr50/database/SQLDatabaseManager.java | 25 +++--- .../datatypes/experience/SkillXpGain.java | 3 +- .../gmail/nossr50/datatypes/party/Party.java | 18 ++-- .../nossr50/datatypes/player/McMMOPlayer.java | 16 +--- .../datatypes/player/PlayerProfile.java | 11 ++- .../datatypes/skills/PrimarySkillType.java | 6 +- .../datatypes/skills/SubSkillType.java | 20 ++--- .../skills/subskills/interfaces/Rank.java | 6 +- .../nossr50/events/chat/McMMOChatEvent.java | 3 +- .../McMMOPlayerExperienceEvent.java | 3 +- .../experience/McMMOPlayerLevelDownEvent.java | 3 +- .../experience/McMMOPlayerLevelUpEvent.java | 3 +- .../experience/McMMOPlayerXpGainEvent.java | 3 +- .../fake/FakeEntityDamageByEntityEvent.java | 2 +- .../events/fake/FakeEntityDamageEvent.java | 2 +- .../McMMOPlayerDeathPenaltyEvent.java | 3 +- .../McMMOPlayerPreDeathPenaltyEvent.java | 3 +- .../events/items/McMMOItemSpawnEvent.java | 3 +- .../party/McMMOPartyAllianceChangeEvent.java | 3 +- .../events/party/McMMOPartyChangeEvent.java | 3 +- .../events/party/McMMOPartyLevelUpEvent.java | 3 +- .../events/party/McMMOPartyTeleportEvent.java | 5 +- .../events/party/McMMOPartyXpGainEvent.java | 3 +- .../players/McMMOPlayerProfileLoadEvent.java | 3 +- .../scoreboard/McMMOScoreboardEvent.java | 5 +- .../skills/McMMOPlayerNotificationEvent.java | 3 +- .../events/skills/McMMOPlayerSkillEvent.java | 3 +- .../nossr50/listeners/BlockListener.java | 3 +- .../nossr50/listeners/EntityListener.java | 14 ++-- .../nossr50/listeners/InventoryListener.java | 1 - .../nossr50/listeners/PlayerListener.java | 81 +++++++++--------- .../gmail/nossr50/listeners/SelfListener.java | 1 - src/main/java/com/gmail/nossr50/mcMMO.java | 13 ++- .../com/gmail/nossr50/party/PartyManager.java | 20 ++--- .../nossr50/runnables/CheckDateTask.java | 2 +- .../runnables/backups/CleanBackupsTask.java | 8 +- .../runnables/party/PartyAutoKickTask.java | 4 +- .../player/PlayerProfileLoadingTask.java | 2 +- .../runnables/skills/BleedTimerTask.java | 5 +- .../runnables/skills/DelayedCropReplant.java | 2 +- .../gmail/nossr50/skills/alchemy/Alchemy.java | 4 +- .../skills/alchemy/AlchemyPotionBrewer.java | 26 +++--- .../gmail/nossr50/skills/archery/Archery.java | 2 +- .../com/gmail/nossr50/skills/axes/Axes.java | 5 +- .../nossr50/skills/child/FamilyTree.java | 2 +- .../nossr50/skills/excavation/Excavation.java | 2 +- .../skills/excavation/ExcavationManager.java | 2 +- .../gmail/nossr50/skills/fishing/Fishing.java | 2 +- .../skills/fishing/FishingManager.java | 12 +-- .../skills/herbalism/HerbalismManager.java | 4 +- .../nossr50/skills/mining/BlastMining.java | 2 +- .../nossr50/skills/mining/MiningManager.java | 2 +- .../nossr50/skills/repair/RepairManager.java | 16 ++-- .../repairables/SimpleRepairableManager.java | 2 +- .../SimpleSalvageableManager.java | 2 +- .../skills/smelting/SmeltingManager.java | 14 ++-- .../nossr50/skills/taming/TamingManager.java | 5 +- .../woodcutting/WoodcuttingManager.java | 4 +- .../com/gmail/nossr50/util/BlockUtils.java | 2 +- .../com/gmail/nossr50/util/ChimaeraWing.java | 3 +- .../gmail/nossr50/util/EnchantmentUtils.java | 2 +- .../gmail/nossr50/util/HardcoreManager.java | 8 +- .../gmail/nossr50/util/HolidayManager.java | 10 +-- .../com/gmail/nossr50/util/ItemUtils.java | 11 ++- .../gmail/nossr50/util/MobHealthbarUtils.java | 10 +-- .../com/gmail/nossr50/util/ModManager.java | 42 +++++----- .../nossr50/util/adapter/BiomeAdapter.java | 4 +- .../util/blockmeta/HashChunkletManager.java | 2 +- .../util/blockmeta/NullChunkletManager.java | 16 ---- .../blockmeta/chunkmeta/HashChunkManager.java | 30 ++----- .../chunkmeta/McMMOSimpleRegionFile.java | 2 +- .../conversion/BlockStoreConversionMain.java | 2 - .../BlockStoreConversionXDirectory.java | 1 - .../BlockStoreConversionZDirectory.java | 1 - .../commands/CommandRegistrationManager.java | 2 +- .../nossr50/util/commands/CommandUtils.java | 8 +- ...rAttackCooldownExploitPreventionLayer.java | 1 - .../util/experience/FormulaManager.java | 6 +- .../nossr50/util/player/UserManager.java | 6 +- .../util/scoreboards/ScoreboardManager.java | 4 +- .../util/scoreboards/ScoreboardWrapper.java | 4 +- .../nossr50/util/skills/CombatUtils.java | 6 +- .../util/skills/ParticleEffectUtils.java | 11 --- .../gmail/nossr50/util/skills/SkillUtils.java | 2 +- .../nossr50/worldguard/WorldGuardManager.java | 2 +- .../shatt/backup/ZipLibrary.java | 2 +- src/main/resources/config.yml | 10 +++ 176 files changed, 642 insertions(+), 604 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 57c2f7967..0fcacba94 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,5 +1,16 @@ Version 2.1.134 + Minor code cleanup + Smelting now has a Bonus Drops section in config.yml + Smelting now only doubles smelting results for items which have bonus drop entries in the config + 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 Changed the UUID updater task to not catastrophically fail when requests failed diff --git a/src/main/java/com/gmail/nossr50/api/PartyAPI.java b/src/main/java/com/gmail/nossr50/api/PartyAPI.java index eaea5027b..97a2bbe40 100644 --- a/src/main/java/com/gmail/nossr50/api/PartyAPI.java +++ b/src/main/java/com/gmail/nossr50/api/PartyAPI.java @@ -185,7 +185,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..cdb686af8 100644 --- a/src/main/java/com/gmail/nossr50/api/SkillAPI.java +++ b/src/main/java/com/gmail/nossr50/api/SkillAPI.java @@ -82,7 +82,7 @@ public final class SkillAPI { } 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/chat/ChatManagerFactory.java b/src/main/java/com/gmail/nossr50/chat/ChatManagerFactory.java index 308e736df..4146d26c7 100644 --- a/src/main/java/com/gmail/nossr50/chat/ChatManagerFactory.java +++ b/src/main/java/com/gmail/nossr50/chat/ChatManagerFactory.java @@ -6,8 +6,8 @@ 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(); + private static final HashMap adminChatManagers = new HashMap<>(); + private static final HashMap partyChatManagers = new HashMap<>(); public static ChatManager getChatManager(Plugin plugin, ChatMode mode) { switch (mode) { diff --git a/src/main/java/com/gmail/nossr50/commands/MHDCommand.java b/src/main/java/com/gmail/nossr50/commands/MHDCommand.java index 3d8c2d445..a85fe9426 100644 --- a/src/main/java/com/gmail/nossr50/commands/MHDCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/MHDCommand.java @@ -10,13 +10,14 @@ 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 MHDCommand 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 (mcMMO.getDatabaseManager() instanceof SQLDatabaseManager) { SQLDatabaseManager m = (SQLDatabaseManager) mcMMO.getDatabaseManager(); m.resetMobHealthSettings(); @@ -39,7 +40,7 @@ public class MHDCommand 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) { 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 e133d1392..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,7 +18,7 @@ public class McImportCommand implements CommandExecutor { int fileAmount; @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 (args.length == 0) { importModConfig(); return true; @@ -31,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; @@ -63,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) { @@ -91,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); @@ -167,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++; } @@ -199,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)) { @@ -218,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); @@ -238,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)) { @@ -263,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); @@ -278,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)) { @@ -297,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); @@ -323,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 8c3c544cc..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; @@ -26,8 +27,8 @@ public class McconvertCommand implements TabExecutor { 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,7 +54,7 @@ public class McconvertCommand 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 (args.length == 2) { if (args[0].equalsIgnoreCase("database") || args[0].equalsIgnoreCase("db")) { return databaseConvertCommand.onCommand(sender, command, label, args); @@ -67,17 +68,17 @@ public class McconvertCommand 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], 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..23b4c8658 100644 --- a/src/main/java/com/gmail/nossr50/commands/McmmoCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/McmmoCommand.java @@ -9,10 +9,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)) { diff --git a/src/main/java/com/gmail/nossr50/commands/McnotifyCommand.java b/src/main/java/com/gmail/nossr50/commands/McnotifyCommand.java index 467797ba7..2ffb16910 100644 --- a/src/main/java/com/gmail/nossr50/commands/McnotifyCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/McnotifyCommand.java @@ -9,12 +9,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 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; } @@ -34,7 +35,7 @@ public class McnotifyCommand 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) { 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 d731f2932..1afaa110e 100644 --- a/src/main/java/com/gmail/nossr50/commands/McscoreboardCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/McscoreboardCommand.java @@ -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,7 +18,7 @@ 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; } @@ -69,9 +70,9 @@ public class McscoreboardCommand 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) { if (args.length == 1) { - return StringUtil.copyPartialMatches(args[0], FIRST_ARGS, new ArrayList(FIRST_ARGS.size())); + return StringUtil.copyPartialMatches(args[0], FIRST_ARGS, new ArrayList<>(FIRST_ARGS.size())); } return ImmutableList.of(); } diff --git a/src/main/java/com/gmail/nossr50/commands/ToggleCommand.java b/src/main/java/com/gmail/nossr50/commands/ToggleCommand.java index 8e74a01ff..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,10 +61,10 @@ public abstract class ToggleCommand 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) { if (args.length == 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())); } return ImmutableList.of(); } diff --git a/src/main/java/com/gmail/nossr50/commands/XprateCommand.java b/src/main/java/com/gmail/nossr50/commands/XprateCommand.java index 58e9d9993..1d7935549 100644 --- a/src/main/java/com/gmail/nossr50/commands/XprateCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/XprateCommand.java @@ -16,6 +16,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; @@ -24,7 +25,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")) { @@ -116,16 +117,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/McmmoReloadLocaleCommand.java b/src/main/java/com/gmail/nossr50/commands/admin/McmmoReloadLocaleCommand.java index bd78c7853..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,13 +5,14 @@ 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) { + 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()); 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/ChatCommand.java b/src/main/java/com/gmail/nossr50/commands/chat/ChatCommand.java index 0062f6645..559395e8e 100644 --- a/src/main/java/com/gmail/nossr50/commands/chat/ChatCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/chat/ChatCommand.java @@ -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; @@ -30,7 +31,7 @@ public abstract class ChatCommand 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) { McMMOPlayer mcMMOPlayer; switch (args.length) { @@ -88,9 +89,9 @@ public abstract class ChatCommand 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) { if (args.length == 1) { - return StringUtil.copyPartialMatches(args[0], CommandUtils.TRUE_FALSE_OPTIONS, new ArrayList(CommandUtils.TRUE_FALSE_OPTIONS.size())); + return StringUtil.copyPartialMatches(args[0], CommandUtils.TRUE_FALSE_OPTIONS, new ArrayList<>(CommandUtils.TRUE_FALSE_OPTIONS.size())); } return ImmutableList.of(); } 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 e1e205b01..327d7da8b 100644 --- a/src/main/java/com/gmail/nossr50/commands/database/ConvertDatabaseCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/database/ConvertDatabaseCommand.java @@ -13,10 +13,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 ConvertDatabaseCommand 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 (args.length == 2) { DatabaseType previousType = DatabaseType.getDatabaseType(args[1]); DatabaseType newType = mcMMO.getDatabaseManager().getDatabaseType(); 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 4982f87bf..9bc472875 100644 --- a/src/main/java/com/gmail/nossr50/commands/database/McpurgeCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/database/McpurgeCommand.java @@ -7,12 +7,13 @@ 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) { + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { if (args.length == 0) { mcMMO.getDatabaseManager().purgePowerlessUsers(); @@ -27,7 +28,7 @@ public class McpurgeCommand 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) { 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 e2e6033fb..731a35524 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,7 +18,7 @@ import java.util.UUID; public class McremoveCommand 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 (args.length == 1) { String playerName = CommandUtils.getMatchedPlayerName(args[0]); @@ -43,10 +44,10 @@ public class McremoveCommand 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) { if (args.length == 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())); } 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 610f35592..aafae253e 100644 --- a/src/main/java/com/gmail/nossr50/commands/database/MmoshowdbCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/database/MmoshowdbCommand.java @@ -7,12 +7,13 @@ 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) { + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { if (args.length == 0) { Class clazz = DatabaseManagerFactory.getCustomDatabaseManagerClass(); @@ -28,7 +29,7 @@ public class MmoshowdbCommand 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) { return ImmutableList.of(); } } 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 156212d74..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,12 +10,13 @@ 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) { + 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)); 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 42b2ec06b..e4886ae0f 100644 --- a/src/main/java/com/gmail/nossr50/commands/experience/ExperienceCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/experience/ExperienceCommand.java @@ -14,6 +14,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; @@ -21,7 +22,7 @@ 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) { @@ -119,13 +120,13 @@ public abstract class ExperienceCommand 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], PrimarySkillType.SKILL_NAMES, new ArrayList<>(PrimarySkillType.SKILL_NAMES.size())); default: return ImmutableList.of(); } 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..1132f7235 100644 --- a/src/main/java/com/gmail/nossr50/commands/experience/SkillresetCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/experience/SkillresetCommand.java @@ -17,6 +17,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; @@ -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: @@ -103,13 +104,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], PrimarySkillType.SKILL_NAMES, new ArrayList<>(PrimarySkillType.SKILL_NAMES.size())); default: return ImmutableList.of(); } 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 fea605da4..73da843a6 100644 --- a/src/main/java/com/gmail/nossr50/commands/hardcore/HardcoreModeCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/hardcore/HardcoreModeCommand.java @@ -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.text.DecimalFormat; import java.util.ArrayList; @@ -18,7 +19,7 @@ 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) { + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { switch (args.length) { case 0: if (!checkTogglePermissions(sender)) { @@ -108,13 +109,13 @@ public abstract class HardcoreModeCommand 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) { 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 StringUtil.copyPartialMatches(args[0], 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/PartyAcceptCommand.java b/src/main/java/com/gmail/nossr50/commands/party/PartyAcceptCommand.java index 06ab23d90..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,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 PartyAcceptCommand 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 (args.length == 1) { Player player = (Player) sender; 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 435d93035..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,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 PartyChangeOwnerCommand 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 (args.length == 2) {//Check if player profile is loaded if (UserManager.getPlayer((Player) sender) == null) { sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad")); 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 73638547c..7a8f99f9d 100644 --- a/src/main/java/com/gmail/nossr50/commands/party/PartyCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/party/PartyCommand.java @@ -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.Arrays; @@ -28,7 +29,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()); @@ -58,7 +59,7 @@ public class PartyCommand implements TabExecutor { 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; } @@ -171,10 +172,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 +189,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 +215,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 +224,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 dc46f242c..f4f8f3d2a 100644 --- a/src/main/java/com/gmail/nossr50/commands/party/PartyDisbandCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/party/PartyDisbandCommand.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 PartyDisbandCommand 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 (args.length == 1) { if (UserManager.getPlayer((Player) sender) == null) { sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad")); 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 43fefa480..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,11 +4,12 @@ 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) { + 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")); 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..ec28ac529 100644 --- a/src/main/java/com/gmail/nossr50/commands/party/PartyInfoCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/party/PartyInfoCommand.java @@ -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)) { 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 ffb1adee0..7d6c6a8ca 100644 --- a/src/main/java/com/gmail/nossr50/commands/party/PartyInviteCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/party/PartyInviteCommand.java @@ -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 PartyInviteCommand 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 (args.length == 2) { String targetName = CommandUtils.getMatchedPlayerName(args[1]); McMMOPlayer mcMMOTarget = UserManager.getOfflinePlayer(targetName); 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..54a8af8fa 100644 --- a/src/main/java/com/gmail/nossr50/commands/party/PartyItemShareCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/party/PartyItemShareCommand.java @@ -13,12 +13,13 @@ 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")); 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 eb5298ad5..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,10 +12,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 PartyKickCommand 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 (args.length == 2) { if (UserManager.getPlayer((Player) sender) == null) { sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad")); 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 ffaba4771..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")) { 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 9fb080d44..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,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 PartyQuitCommand 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 (args.length == 1) { Player player = (Player) sender; 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 e7f50800b..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,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 PartyRenameCommand 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 (args.length == 2) { if (UserManager.getPlayer((Player) sender) == null) { sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad")); 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 f90c7c21c..c1310cf0e 100644 --- a/src/main/java/com/gmail/nossr50/commands/party/PartyXpShareCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/party/PartyXpShareCommand.java @@ -12,10 +12,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 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")); 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 caa3a509d..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,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 PartyAllianceAcceptCommand 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 (args.length == 2) { if (UserManager.getPlayer((Player) sender) == null) { sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad")); 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 5283137e3..d97edf3d7 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 @@ -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; @@ -32,7 +33,7 @@ public class PartyAllianceCommand implements TabExecutor { 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; } @@ -108,13 +109,13 @@ public class PartyAllianceCommand implements TabExecutor { } @Override - public List onTabComplete(CommandSender commandSender, Command command, String label, String[] args) { + 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())); + 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())); + return StringUtil.copyPartialMatches(args[0], playerNames, new ArrayList<>(playerNames.size())); } return matches; 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 e610c136e..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,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 PartyAllianceDisbandCommand 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 (args.length == 2) { if (UserManager.getPlayer((Player) sender) == null) { sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad")); 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 06694edd2..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,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 PartyAllianceInviteCommand 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 (args.length == 3) { String targetName = CommandUtils.getMatchedPlayerName(args[2]); McMMOPlayer mcMMOTarget = UserManager.getOfflinePlayer(targetName); 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..86728e272 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 @@ -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; 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 4fec2eeb6..893164435 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 @@ -26,6 +26,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; @@ -38,7 +39,7 @@ public class PtpCommand implements TabExecutor { 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; } @@ -129,9 +130,9 @@ public class PtpCommand 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) { if (args.length == 1) { - List matches = StringUtil.copyPartialMatches(args[0], TELEPORT_SUBCOMMANDS, new ArrayList(TELEPORT_SUBCOMMANDS.size())); + List matches = StringUtil.copyPartialMatches(args[0], TELEPORT_SUBCOMMANDS, new ArrayList<>(TELEPORT_SUBCOMMANDS.size())); if (matches.size() == 0) { if (UserManager.getPlayer((Player) sender) == null) { @@ -147,7 +148,7 @@ public class PtpCommand implements TabExecutor { } List playerNames = mcMMOPlayer.getParty().getOnlinePlayerNames(player); - return StringUtil.copyPartialMatches(args[0], playerNames, new ArrayList(playerNames.size())); + return StringUtil.copyPartialMatches(args[0], playerNames, new ArrayList<>(playerNames.size())); } return matches; 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 b3fb2ba17..3e54ffa8b 100644 --- a/src/main/java/com/gmail/nossr50/commands/player/InspectCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/player/InspectCommand.java @@ -16,13 +16,14 @@ 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) { + 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); @@ -91,10 +92,10 @@ public class InspectCommand 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) { if (args.length == 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())); } 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 ab736762b..7cf6d7589 100644 --- a/src/main/java/com/gmail/nossr50/commands/player/MccooldownCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/player/MccooldownCommand.java @@ -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; } @@ -67,7 +68,7 @@ public class MccooldownCommand 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) { 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 20458624f..5a781cdfb 100644 --- a/src/main/java/com/gmail/nossr50/commands/player/McrankCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/player/McrankCommand.java @@ -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,10 +73,10 @@ public class McrankCommand 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) { if (args.length == 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())); } return ImmutableList.of(); } 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 2b623b0e4..87025fac5 100644 --- a/src/main/java/com/gmail/nossr50/commands/player/McstatsCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/player/McstatsCommand.java @@ -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; } @@ -61,7 +62,7 @@ public class McstatsCommand 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) { 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 a17224566..a50b51c20 100644 --- a/src/main/java/com/gmail/nossr50/commands/player/MctopCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/player/MctopCommand.java @@ -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,9 +67,9 @@ public class MctopCommand 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) { if (args.length == 1) { - return StringUtil.copyPartialMatches(args[0], PrimarySkillType.SKILL_NAMES, new ArrayList(PrimarySkillType.SKILL_NAMES.size())); + return StringUtil.copyPartialMatches(args[0], PrimarySkillType.SKILL_NAMES, new ArrayList<>(PrimarySkillType.SKILL_NAMES.size())); } return ImmutableList.of(); } @@ -88,7 +89,7 @@ public class MctopCommand implements TabExecutor { long cooldownMillis = Math.max(Config.getInstance().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; } diff --git a/src/main/java/com/gmail/nossr50/commands/player/XPBarCommand.java b/src/main/java/com/gmail/nossr50/commands/player/XPBarCommand.java index 99b6a6afb..2c429ddd8 100644 --- a/src/main/java/com/gmail/nossr50/commands/player/XPBarCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/player/XPBarCommand.java @@ -103,7 +103,7 @@ public class XPBarCommand implements TabExecutor { 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], PrimarySkillType.SKILL_NAMES, new ArrayList(PrimarySkillType.SKILL_NAMES.size())); + return StringUtil.copyPartialMatches(args[1], PrimarySkillType.SKILL_NAMES, new ArrayList<>(PrimarySkillType.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 247615acb..91e86ef0f 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/AcrobaticsCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/AcrobaticsCommand.java @@ -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) 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..b8df20ad4 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/AlchemyCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/AlchemyCommand.java @@ -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) 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 8b29b3413..26c6441e5 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/AprilCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/AprilCommand.java @@ -10,6 +10,7 @@ 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; @@ -22,7 +23,7 @@ public class AprilCommand implements TabExecutor { protected DecimalFormat decimal = new DecimalFormat("##0.00"); @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; } @@ -98,7 +99,7 @@ public class AprilCommand 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) { if (args.length == 1) { return ImmutableList.of("?"); } @@ -106,7 +107,7 @@ public class AprilCommand implements TabExecutor { } private List effectsDisplay(FakeSkillType fakeSkillType) { - List messages = new ArrayList(); + List messages = new ArrayList<>(); switch (fakeSkillType) { case MACHO: @@ -152,7 +153,7 @@ public class AprilCommand implements TabExecutor { } private List statsDisplay(FakeSkillType fakeSkillType) { - List messages = new ArrayList(); + List messages = new ArrayList<>(); switch (fakeSkillType) { case MACHO: 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..4deeb9262 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/ArcheryCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/ArcheryCommand.java @@ -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) 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..8454b4af3 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/AxesCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/AxesCommand.java @@ -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))); 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 b047b117b..2f3d53a0f 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/ExcavationCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/ExcavationCommand.java @@ -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(); 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..2788b98d4 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/FishingCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/FishingCommand.java @@ -128,7 +128,7 @@ public class FishingCommand extends SkillCommand { @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))); 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 7b8609a75..9884ecba8 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/HerbalismCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/HerbalismCommand.java @@ -99,7 +99,7 @@ public class HerbalismCommand 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.HERBALISM_DOUBLE_DROPS, doubleDropChance) 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..27102d7b4 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/MiningCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/MiningCommand.java @@ -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))); 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 c1b5f2e0d..c23c7ac78 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/MmoInfoCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/MmoInfoCommand.java @@ -13,6 +13,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; @@ -23,7 +24,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 */ @@ -61,9 +62,9 @@ public class MmoInfoCommand 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) { if (args.length == 1) { - return StringUtil.copyPartialMatches(args[0], PrimarySkillType.SUBSKILL_NAMES, new ArrayList(PrimarySkillType.SUBSKILL_NAMES.size())); + return StringUtil.copyPartialMatches(args[0], PrimarySkillType.SUBSKILL_NAMES, new ArrayList<>(PrimarySkillType.SUBSKILL_NAMES.size())); } return ImmutableList.of(); } 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..a88a45bb6 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/RepairCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/RepairCommand.java @@ -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(); 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..9dc5263fe 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/SalvageCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/SalvageCommand.java @@ -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) { 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 fe58a35fb..91c683a43 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/SkillCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/SkillCommand.java @@ -26,6 +26,7 @@ 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; @@ -49,7 +50,7 @@ public abstract class SkillCommand 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; } @@ -161,31 +162,28 @@ 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", parentList.get(i).getName(), 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", parentList.get(i).getName(), mcMMOPlayer.getSkillLevel(parentList.get(i)))); } } //XP GAIN METHOD player.sendMessage(LocaleLoader.getString("Commands.XPGain.Overhaul", LocaleLoader.getString("Commands.XPGain.Child"))); - player.sendMessage(LocaleLoader.getString("Effects.Child.Overhaul", skillValue, parentMessage)); + player.sendMessage(LocaleLoader.getString("Effects.Child.Overhaul", skillValue, parentMessage.toString())); //LEVEL //player.sendMessage(LocaleLoader.getString("Effects.Child.Overhaul", skillValue, skillValue)); @@ -211,7 +209,7 @@ public abstract class SkillCommand 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) { if (args.length == 1) { return ImmutableList.of("?"); } 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 47d2667bb..60fc82184 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/SkillGuideCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/SkillGuideCommand.java @@ -6,6 +6,7 @@ import com.gmail.nossr50.util.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; @@ -22,7 +23,7 @@ public class SkillGuideCommand 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].equals("?")) { @@ -67,7 +68,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 +87,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..a3a5f5805 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/SmeltingCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/SmeltingCommand.java @@ -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) 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..0933d6c79 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/SwordsCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/SwordsCommand.java @@ -68,7 +68,7 @@ public class SwordsCommand extends SkillCommand { @Override protected List statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) { - List messages = new ArrayList(); + 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(); 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..e54ce1505 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/TamingCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/TamingCommand.java @@ -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"))); 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 d427ccb16..383b28318 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/UnarmedCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/UnarmedCommand.java @@ -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) 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 6fce8dc62..e96c7b07e 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/WoodcuttingCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/WoodcuttingCommand.java @@ -63,7 +63,7 @@ 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) diff --git a/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java b/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java index a90d81fef..16cb6f915 100644 --- a/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java +++ b/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java @@ -28,7 +28,7 @@ public class AdvancedConfig extends AutoUpdateConfigLoader { @Override protected boolean validateKeys() { // Validate all the settings! - List reason = new ArrayList(); + List reason = new ArrayList<>(); /* GENERAL */ if (getAbilityLength() < 1) { diff --git a/src/main/java/com/gmail/nossr50/config/AutoUpdateConfigLoader.java b/src/main/java/com/gmail/nossr50/config/AutoUpdateConfigLoader.java index 439eef220..c43f14f81 100644 --- a/src/main/java/com/gmail/nossr50/config/AutoUpdateConfigLoader.java +++ b/src/main/java/com/gmail/nossr50/config/AutoUpdateConfigLoader.java @@ -28,10 +28,10 @@ public abstract class AutoUpdateConfigLoader extends ConfigLoader { boolean needSave = false; - Set oldKeys = new HashSet(configKeys); + Set oldKeys = new HashSet<>(configKeys); oldKeys.removeAll(internalConfigKeys); - Set newKeys = new HashSet(internalConfigKeys); + Set newKeys = new HashSet<>(internalConfigKeys); newKeys.removeAll(configKeys); // Don't need a re-save if we have old keys sticking around? @@ -66,17 +66,17 @@ public abstract class AutoUpdateConfigLoader extends ConfigLoader { try { // Read internal BufferedReader reader = new BufferedReader(new InputStreamReader(plugin.getResource(fileName))); - LinkedHashMap comments = new LinkedHashMap(); - String temp = ""; + LinkedHashMap comments = new LinkedHashMap<>(); + StringBuilder temp = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { if (line.contains("#")) { - temp += line + "\n"; + temp.append(line).append("\n"); } else if (line.contains(":")) { line = line.substring(0, line.indexOf(":") + 1); - if (!temp.isEmpty()) { + if (temp.length() > 0) { if(comments.containsKey(line)) { int index = 0; while(comments.containsKey(line + index)) { @@ -86,14 +86,14 @@ public abstract class AutoUpdateConfigLoader extends ConfigLoader { line = line + index; } - comments.put(line, temp); - temp = ""; + comments.put(line, temp.toString()); + temp = new StringBuilder(); } } } // Dump to the new one - HashMap indexed = new HashMap(); + HashMap indexed = new HashMap<>(); for (String key : comments.keySet()) { String actualkey = key.substring(0, key.indexOf(":") + 1); diff --git a/src/main/java/com/gmail/nossr50/config/Config.java b/src/main/java/com/gmail/nossr50/config/Config.java index 1099cc4db..fa8c875dc 100644 --- a/src/main/java/com/gmail/nossr50/config/Config.java +++ b/src/main/java/com/gmail/nossr50/config/Config.java @@ -39,7 +39,7 @@ public class Config extends AutoUpdateConfigLoader { @Override protected boolean validateKeys() { // Validate all the settings! - List reason = new ArrayList(); + List reason = new ArrayList<>(); /* General Settings */ if (getSaveInterval() <= 0) { diff --git a/src/main/java/com/gmail/nossr50/config/RankConfig.java b/src/main/java/com/gmail/nossr50/config/RankConfig.java index 6beb13ec5..fb660e457 100644 --- a/src/main/java/com/gmail/nossr50/config/RankConfig.java +++ b/src/main/java/com/gmail/nossr50/config/RankConfig.java @@ -31,7 +31,7 @@ public class RankConfig extends AutoUpdateConfigLoader { @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 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 a18a8b870..68dcc8d1a 100644 --- a/src/main/java/com/gmail/nossr50/config/experience/ExperienceConfig.java +++ b/src/main/java/com/gmail/nossr50/config/experience/ExperienceConfig.java @@ -38,7 +38,7 @@ public class ExperienceConfig extends AutoUpdateConfigLoader { @Override protected boolean validateKeys() { - List reason = new ArrayList(); + List reason = new ArrayList<>(); /* * FORMULA SETTINGS 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..76686f82d 100644 --- a/src/main/java/com/gmail/nossr50/config/mods/CustomArmorConfig.java +++ b/src/main/java/com/gmail/nossr50/config/mods/CustomArmorConfig.java @@ -15,12 +15,12 @@ import java.util.Set; public class CustomArmorConfig extends ConfigLoader { 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 customBoots = new ArrayList<>(); + public List customChestplates = new ArrayList<>(); + public List customHelmets = new ArrayList<>(); + public List customLeggings = new ArrayList<>(); - public List repairables = new ArrayList(); + public List repairables = new ArrayList<>(); protected CustomArmorConfig(String fileName) { super("mods", fileName); 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..549836152 100644 --- a/src/main/java/com/gmail/nossr50/config/mods/CustomEntityConfig.java +++ b/src/main/java/com/gmail/nossr50/config/mods/CustomEntityConfig.java @@ -9,8 +9,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); 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..104fb3726 100644 --- a/src/main/java/com/gmail/nossr50/config/mods/CustomToolConfig.java +++ b/src/main/java/com/gmail/nossr50/config/mods/CustomToolConfig.java @@ -17,16 +17,16 @@ import java.util.Set; public class CustomToolConfig extends ConfigLoader { 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 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 HashMap customToolMap = new HashMap<>(); - public List repairables = new ArrayList(); + public List repairables = new ArrayList<>(); protected CustomToolConfig(String fileName) { super("mods", fileName); 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..2af0cb727 100644 --- a/src/main/java/com/gmail/nossr50/config/party/ItemWeightConfig.java +++ b/src/main/java/com/gmail/nossr50/config/party/ItemWeightConfig.java @@ -27,7 +27,7 @@ public class ItemWeightConfig extends ConfigLoader { } 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)); 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 bb479c931..bc2ae7417 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 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 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 final Map potionMap = new HashMap(); + private final Map potionMap = new HashMap<>(); private PotionConfig() { super("potions.yml"); @@ -137,14 +137,14 @@ public class PotionConfig extends ConfigLoader { 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(" "); @@ -162,7 +162,7 @@ public class PotionConfig extends ConfigLoader { } } - Color color = null; + Color color; if (potion_section.contains("Color")) { color = Color.fromRGB(potion_section.getInt("Color")); } @@ -170,7 +170,7 @@ public class PotionConfig extends ConfigLoader { 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); @@ -255,7 +255,7 @@ public class PotionConfig extends ConfigLoader { 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()); 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 76ea32bbc..c5ff8846c 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 @@ -25,7 +25,7 @@ public class RepairConfig extends ConfigLoader { @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,7 +42,7 @@ public class RepairConfig extends ConfigLoader { } // Validate all the things! - List reason = new ArrayList(); + List reason = new ArrayList<>(); // Item Material Material itemMaterial = Material.matchMaterial(key); @@ -177,7 +177,7 @@ public class RepairConfig extends ConfigLoader { } protected List getLoadedRepairables() { - return repairables == null ? new ArrayList() : repairables; + return repairables == null ? new ArrayList<>() : repairables; } private boolean noErrorsInRepairable(List issues) { 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 40dd249ba..da02f5fe2 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 @@ -11,7 +11,7 @@ import java.util.List; import java.util.regex.Pattern; public class RepairConfigManager { - private final List repairables = new ArrayList(); + private final List repairables = new ArrayList<>(); public RepairConfigManager(mcMMO plugin) { Pattern pattern = Pattern.compile("repair\\.(?:.+)\\.yml"); 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 a858c2890..f01f41940 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 @@ -28,7 +28,7 @@ public class SalvageConfig extends ConfigLoader { @Override protected void loadKeys() { - salvageables = new ArrayList(); + salvageables = new ArrayList<>(); if (!config.isConfigurationSection("Salvageables")) { mcMMO.p.getLogger().severe("Could not find Salvageables section in " + fileName); @@ -59,7 +59,7 @@ public class SalvageConfig extends ConfigLoader { for (String key : keys) { // Validate all the things! - List reason = new ArrayList(); + List reason = new ArrayList<>(); // Item Material Material itemMaterial = Material.matchMaterial(key); @@ -195,7 +195,7 @@ public class SalvageConfig extends ConfigLoader { } protected List getLoadedSalvageables() { - return salvageables == null ? new ArrayList() : salvageables; + return salvageables == null ? new ArrayList<>() : salvageables; } private boolean noErrorsInSalvageable(List issues) { 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 39ba3b463..21189ec0f 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 @@ -11,7 +11,7 @@ import java.util.List; import java.util.regex.Pattern; public class SalvageConfigManager { - private final List salvageables = new ArrayList(); + private final List salvageables = new ArrayList<>(); public SalvageConfigManager(mcMMO plugin) { Pattern pattern = Pattern.compile("salvage\\.(?:.+)\\.yml"); 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..2c0b3f795 100755 --- a/src/main/java/com/gmail/nossr50/config/treasure/TreasureConfig.java +++ b/src/main/java/com/gmail/nossr50/config/treasure/TreasureConfig.java @@ -24,13 +24,13 @@ public class TreasureConfig extends ConfigLoader { private static TreasureConfig instance; - public HashMap> excavationMap = new HashMap>(); + public HashMap> excavationMap = new HashMap<>(); - public HashMap> shakeMap = new HashMap>(); - public HashMap> hylianMap = new HashMap>(); + public HashMap> shakeMap = new HashMap<>(); + public HashMap> hylianMap = new HashMap<>(); - public HashMap> fishingRewards = new HashMap>(); - public HashMap> fishingEnchantments = new HashMap>(); + public HashMap> fishingRewards = new HashMap<>(); + public HashMap> fishingEnchantments = new HashMap<>(); private TreasureConfig() { super("treasures.yml"); @@ -49,7 +49,7 @@ public class TreasureConfig extends ConfigLoader { @Override protected boolean validateKeys() { // Validate all the settings! - List reason = new ArrayList(); + List reason = new ArrayList<>(); for (String tier : config.getConfigurationSection("Enchantment_Drop_Rates").getKeys(false)) { double totalEnchantDropRate = 0; double totalItemDropRate = 0; @@ -116,13 +116,13 @@ public class TreasureConfig extends ConfigLoader { // Initialize fishing HashMap for (Rarity rarity : Rarity.values()) { if (!fishingRewards.containsKey(rarity)) { - fishingRewards.put(rarity, (new ArrayList())); + 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]; @@ -135,7 +135,7 @@ public class TreasureConfig extends ConfigLoader { 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.put(EntityType.PLAYER, new ArrayList<>()); shakeMap.get(EntityType.PLAYER).add(new ShakeTreasure(new ItemStack(Material.BEDROCK, 1, (byte) 0), 1, getInventoryStealDropChance(), getInventoryStealDropLevel())); continue; } else { @@ -218,7 +218,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 +237,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)); } @@ -254,7 +254,7 @@ public class TreasureConfig extends ConfigLoader { EntityType entityType = EntityType.valueOf(type.substring(6)); if (!shakeMap.containsKey(entityType)) - shakeMap.put(entityType, new ArrayList()); + shakeMap.put(entityType, new ArrayList<>()); shakeMap.get(entityType).add(shakeTreasure); } else if (isExcavation) { ExcavationTreasure excavationTreasure = new ExcavationTreasure(item, xp, dropChance, dropLevel); @@ -262,7 +262,7 @@ public class TreasureConfig extends ConfigLoader { for (String blockType : dropList) { if (!excavationMap.containsKey(blockType)) - excavationMap.put(blockType, new ArrayList()); + excavationMap.put(blockType, new ArrayList<>()); excavationMap.get(blockType).add(excavationTreasure); } } else if (isHylian) { @@ -305,7 +305,7 @@ public class TreasureConfig extends ConfigLoader { 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); } @@ -316,7 +316,7 @@ public class TreasureConfig extends ConfigLoader { } if (!fishingEnchantments.containsKey(rarity)) { - fishingEnchantments.put(rarity, (new ArrayList())); + fishingEnchantments.put(rarity, (new ArrayList<>())); } ConfigurationSection enchantmentSection = config.getConfigurationSection("Enchantments_Rarity." + rarity.toString()); diff --git a/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java index 138e4615c..75c4ff6ca 100644 --- a/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java @@ -20,8 +20,8 @@ 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 final HashMap> playerStatHash = new HashMap<>(); + private final List powerLevels = new ArrayList<>(); private long lastUpdate = 0; private final long UPDATE_WAIT_TIME = 600000L; // 10 minutes @@ -374,7 +374,7 @@ public final class FlatfileDatabaseManager implements DatabaseManager { public Map readRank(String playerName) { updateLeaderboards(); - Map skills = new HashMap(); + Map skills = new HashMap<>(); for (PrimarySkillType skill : PrimarySkillType.NON_CHILD_SKILLS) { skills.put(skill, getPlayerRank(playerName, playerStatHash.get(skill))); @@ -662,7 +662,7 @@ public final class FlatfileDatabaseManager implements DatabaseManager { } character[UUID_INDEX] = fetchedUUIDs.remove(character[USERNAME]).toString(); - line = new StringBuilder(org.apache.commons.lang.StringUtils.join(character, ":")).append(":").toString(); + line = org.apache.commons.lang.StringUtils.join(character, ":") + ":"; } i++; @@ -700,7 +700,7 @@ public final class FlatfileDatabaseManager implements DatabaseManager { } public List getStoredUsers() { - ArrayList users = new ArrayList(); + ArrayList users = new ArrayList<>(); BufferedReader in = null; String usersFilePath = mcMMO.getUsersFilePath(); @@ -746,19 +746,19 @@ public final class FlatfileDatabaseManager implements DatabaseManager { 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(); + 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; @@ -853,8 +853,8 @@ public final class FlatfileDatabaseManager implements DatabaseManager { in = new BufferedReader(new FileReader(usersFilePath)); StringBuilder writer = new StringBuilder(); String line; - HashSet usernames = new HashSet(); - HashSet players = new HashSet(); + HashSet usernames = new HashSet<>(); + HashSet players = new HashSet<>(); while ((line = in.readLine()) != null) { // Remove empty lines from the file @@ -909,7 +909,7 @@ public final class FlatfileDatabaseManager implements DatabaseManager { continue; } int cap = Config.getInstance().getLevelCap(skill); - if (Integer.valueOf(character[index]) > cap) { + if (Integer.parseInt(character[index]) > cap) { mcMMO.p.getLogger().warning("Truncating " + skill.getName() + " to configured max level for player " + character[USERNAME]); character[index] = cap + ""; updated = true; @@ -1053,7 +1053,7 @@ public final class FlatfileDatabaseManager implements DatabaseManager { } if (updated) { - line = new StringBuilder(org.apache.commons.lang.StringUtils.join(character, ":")).append(":").toString(); + line = org.apache.commons.lang.StringUtils.join(character, ":") + ":"; } writer.append(line).append("\r\n"); @@ -1130,7 +1130,7 @@ public final class FlatfileDatabaseManager implements DatabaseManager { return statValue; } - private class SkillComparator implements Comparator { + private static class SkillComparator implements Comparator { @Override public int compare(PlayerStat o1, PlayerStat o2) { return (o2.statVal - o1.statVal); @@ -1139,27 +1139,27 @@ public final class FlatfileDatabaseManager implements DatabaseManager { 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); + 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])); + skillsXp.put(PrimarySkillType.TAMING, (float) Integer.parseInt(character[EXP_TAMING])); + skillsXp.put(PrimarySkillType.MINING, (float) Integer.parseInt(character[EXP_MINING])); + skillsXp.put(PrimarySkillType.REPAIR, (float) Integer.parseInt(character[EXP_REPAIR])); + skillsXp.put(PrimarySkillType.WOODCUTTING, (float) Integer.parseInt(character[EXP_WOODCUTTING])); + skillsXp.put(PrimarySkillType.UNARMED, (float) Integer.parseInt(character[EXP_UNARMED])); + skillsXp.put(PrimarySkillType.HERBALISM, (float) Integer.parseInt(character[EXP_HERBALISM])); + skillsXp.put(PrimarySkillType.EXCAVATION, (float) Integer.parseInt(character[EXP_EXCAVATION])); + skillsXp.put(PrimarySkillType.ARCHERY, (float) Integer.parseInt(character[EXP_ARCHERY])); + skillsXp.put(PrimarySkillType.SWORDS, (float) Integer.parseInt(character[EXP_SWORDS])); + skillsXp.put(PrimarySkillType.AXES, (float) Integer.parseInt(character[EXP_AXES])); + skillsXp.put(PrimarySkillType.ACROBATICS, (float) Integer.parseInt(character[EXP_ACROBATICS])); + skillsXp.put(PrimarySkillType.FISHING, (float) Integer.parseInt(character[EXP_FISHING])); + skillsXp.put(PrimarySkillType.ALCHEMY, (float) Integer.parseInt(character[EXP_ALCHEMY])); // Taming - Unused skillsDATS.put(SuperAbilityType.SUPER_BREAKER, Integer.valueOf(character[COOLDOWN_SUPER_BREAKER])); @@ -1190,7 +1190,7 @@ public final class FlatfileDatabaseManager implements DatabaseManager { } try { - scoreboardTipsShown = Integer.valueOf(character[SCOREBOARD_TIPS]); + scoreboardTipsShown = Integer.parseInt(character[SCOREBOARD_TIPS]); } catch (Exception e) { scoreboardTipsShown = 0; @@ -1207,7 +1207,7 @@ public final class FlatfileDatabaseManager implements DatabaseManager { } private Map getSkillMapFromLine(String[] character) { - Map skills = new EnumMap(PrimarySkillType.class); // Skill & Level + 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])); @@ -1328,7 +1328,7 @@ public final class FlatfileDatabaseManager implements DatabaseManager { character[HEALTHBAR] = Config.getInstance().getMobHealthbarDefault().toString(); - line = new StringBuilder(org.apache.commons.lang.StringUtils.join(character, ":")).append(":").toString(); + line = org.apache.commons.lang.StringUtils.join(character, ":") + ":"; writer.append(line).append("\r\n"); } diff --git a/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java index be165b87b..7830362c4 100644 --- a/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java @@ -25,7 +25,7 @@ public final class SQLDatabaseManager implements DatabaseManager { private static final String ALL_QUERY_VERSION = "total"; private final String tablePrefix = Config.getInstance().getMySQLTablePrefix(); - private final Map cachedUserIDs = new HashMap(); + private final Map cachedUserIDs = new HashMap<>(); private DataSource miscPool; private DataSource loadPool; @@ -214,8 +214,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) { @@ -345,7 +344,7 @@ public final class SQLDatabaseManager implements DatabaseManager { } public List readLeaderboard(PrimarySkillType skill, int pageNumber, int statsPerPage) { - List stats = new ArrayList(); + List stats = new ArrayList<>(); String query = skill == null ? ALL_QUERY_VERSION : skill.name().toLowerCase(Locale.ENGLISH); ResultSet resultSet = null; @@ -360,13 +359,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 +381,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; @@ -752,7 +751,7 @@ public final class SQLDatabaseManager implements DatabaseManager { } public List getStoredUsers() { - ArrayList users = new ArrayList(); + ArrayList users = new ArrayList<>(); Statement statement = null; Connection connection = null; @@ -1070,10 +1069,10 @@ 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 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 MobHealthbarType mobHealthbarType; UUID uuid; int scoreboardTipsShown; @@ -1316,7 +1315,7 @@ public final class SQLDatabaseManager implements DatabaseManager { 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; 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/party/Party.java b/src/main/java/com/gmail/nossr50/datatypes/party/Party.java index 6629adc2d..c4b6e42ca 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/party/Party.java +++ b/src/main/java/com/gmail/nossr50/datatypes/party/Party.java @@ -31,8 +31,8 @@ public class Party { // 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 LinkedHashMap members = new LinkedHashMap<>(); + private final List onlineMembers = new ArrayList<>(); private PartyLeader leader; private String name; @@ -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)) { @@ -323,16 +323,15 @@ public class Party { break; default: - return; } } public boolean hasMember(String memberName) { - return this.getMembers().values().contains(memberName); + return this.getMembers().containsValue(memberName); } public boolean hasMember(UUID uuid) { - return this.getMembers().keySet().contains(uuid); + return this.getMembers().containsKey(uuid); } /** @@ -361,7 +360,8 @@ public class Party { { Player onlinePlayer = Bukkit.getPlayer(onlineMember); - if(!isNotSamePerson(player.getUniqueId(), onlineMember) || player.canSee(onlinePlayer)) + if(!isNotSamePerson(player.getUniqueId(), onlineMember) + || onlinePlayer != null && player.canSee(onlinePlayer)) { visiblePartyList.add(onlineMember); } else { @@ -515,7 +515,7 @@ 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) { 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 214081384..3f469a0b3 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java +++ b/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java @@ -45,7 +45,6 @@ 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.SkillUtils; @@ -68,7 +67,7 @@ public class McMMOPlayer { private final Player player; private final PlayerProfile profile; - private final Map skillManagers = new HashMap(); + private final Map skillManagers = new HashMap<>(); private final ExperienceBarManager experienceBarManager; private Party party; @@ -87,10 +86,10 @@ 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 final Map abilityMode = new HashMap<>(); + private final Map abilityInformed = new HashMap<>(); - private final Map toolMode = new HashMap(); + private final Map toolMode = new HashMap<>(); private int recentlyHurt; private int respawnATS; @@ -766,7 +765,6 @@ public class McMMOPlayer { return; default: - return; } } @@ -783,7 +781,6 @@ public class McMMOPlayer { return; default: - return; } } @@ -801,7 +798,6 @@ public class McMMOPlayer { return; default: - return; } } @@ -906,9 +902,6 @@ public class McMMOPlayer { ticks = PerksUtils.handleActivationPerks(player, 2 + (getSkillLevel(skill) / abilityLengthVar), ability.getMaxLength()); } - // Notify people that ability has been activated - ParticleEffectUtils.playAbilityEnabledEffect(player); - if (useChatNotifications()) { NotificationManager.sendPlayerInformation(player, NotificationType.SUPER_ABILITY, ability.getAbilityOn()); //player.sendMessage(ability.getAbilityOn()); @@ -919,7 +912,6 @@ public class McMMOPlayer { //Sounds SoundManager.worldSendSound(player.getWorld(), player.getLocation(), SoundType.ABILITY_ACTIVATED_GENERIC); - // Enable the ability profile.setAbilityDATS(ability, System.currentTimeMillis() + (ticks * Misc.TIME_CONVERSION_FACTOR)); setAbilityMode(ability, true); 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 f8463aa02..49fc3d6f7 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/player/PlayerProfile.java +++ b/src/main/java/com/gmail/nossr50/datatypes/player/PlayerProfile.java @@ -32,14 +32,14 @@ public class PlayerProfile { private int saveAttempts = 0; /* 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 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..) // Store previous XP gains for diminished returns - private final DelayQueue gainedSkillsXp = new DelayQueue(); - private final HashMap rollingSkillsXp = new HashMap(); + private final DelayQueue gainedSkillsXp = new DelayQueue<>(); + private final HashMap rollingSkillsXp = new HashMap<>(); @Deprecated public PlayerProfile(String playerName) { @@ -136,7 +136,6 @@ public class PlayerProfile { else scheduleAsyncSaveDelay(); - return; } else { mcMMO.p.getLogger().severe("mcMMO has failed to save the profile for " +getPlayerName()+" numerous times." + 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 fd9f89639..2ed443878 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/skills/PrimarySkillType.java +++ b/src/main/java/com/gmail/nossr50/datatypes/skills/PrimarySkillType.java @@ -82,9 +82,9 @@ public enum PrimarySkillType { 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(); + List childSkills = new ArrayList<>(); + List nonChildSkills = new ArrayList<>(); + ArrayList names = new ArrayList<>(); ArrayList subSkillNames = new ArrayList<>(); for (PrimarySkillType skill : values()) { 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 f72ede1bd..6dfcd383f 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/skills/SubSkillType.java +++ b/src/main/java/com/gmail/nossr50/datatypes/skills/SubSkillType.java @@ -180,7 +180,7 @@ public enum SubSkillType { /* * Find where to begin our substring (after the prefix) */ - String endResult = ""; + StringBuilder endResult = new StringBuilder(); int subStringIndex = getSubStringIndex(subSkillName); /* @@ -193,20 +193,20 @@ public enum SubSkillType { 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); /* @@ -220,17 +220,17 @@ public enum SubSkillType { 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(); } /** 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/events/chat/McMMOChatEvent.java b/src/main/java/com/gmail/nossr50/events/chat/McMMOChatEvent.java index 3dee6a384..33b049ee3 100644 --- a/src/main/java/com/gmail/nossr50/events/chat/McMMOChatEvent.java +++ b/src/main/java/com/gmail/nossr50/events/chat/McMMOChatEvent.java @@ -4,6 +4,7 @@ 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; @@ -84,7 +85,7 @@ public abstract class McMMOChatEvent 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/experience/McMMOPlayerExperienceEvent.java b/src/main/java/com/gmail/nossr50/events/experience/McMMOPlayerExperienceEvent.java index 78592b03b..73829b7a0 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. @@ -67,7 +68,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/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/FakeEntityDamageByEntityEvent.java b/src/main/java/com/gmail/nossr50/events/fake/FakeEntityDamageByEntityEvent.java index 840f039f6..3458ab5c8 100644 --- a/src/main/java/com/gmail/nossr50/events/fake/FakeEntityDamageByEntityEvent.java +++ b/src/main/java/com/gmail/nossr50/events/fake/FakeEntityDamageByEntityEvent.java @@ -23,7 +23,7 @@ public class FakeEntityDamageByEntityEvent extends EntityDamageByEntityEvent { } 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/FakeEntityDamageEvent.java b/src/main/java/com/gmail/nossr50/events/fake/FakeEntityDamageEvent.java index 0ec008672..34eab80bd 100644 --- a/src/main/java/com/gmail/nossr50/events/fake/FakeEntityDamageEvent.java +++ b/src/main/java/com/gmail/nossr50/events/fake/FakeEntityDamageEvent.java @@ -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/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/items/McMMOItemSpawnEvent.java b/src/main/java/com/gmail/nossr50/events/items/McMMOItemSpawnEvent.java index b6d7dcb94..3bfb95532 100644 --- a/src/main/java/com/gmail/nossr50/events/items/McMMOItemSpawnEvent.java +++ b/src/main/java/com/gmail/nossr50/events/items/McMMOItemSpawnEvent.java @@ -5,6 +5,7 @@ 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; /** * Called when mcMMO is preparing to drop an item. @@ -63,7 +64,7 @@ public class McMMOItemSpawnEvent 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/McMMOPartyAllianceChangeEvent.java b/src/main/java/com/gmail/nossr50/events/party/McMMOPartyAllianceChangeEvent.java index f902561a2..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,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 McMMOPartyAllianceChangeEvent extends PlayerEvent implements Cancellable { private final String oldAlly; @@ -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 bac977001..365236d91 100644 --- a/src/main/java/com/gmail/nossr50/events/party/McMMOPartyChangeEvent.java +++ b/src/main/java/com/gmail/nossr50/events/party/McMMOPartyChangeEvent.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; /** * Called when a player attempts to join, leave, or change parties. @@ -93,7 +94,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 b6790dd48..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,6 +4,7 @@ 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 final Party party; @@ -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 88a5f666b..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,6 +3,7 @@ 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. @@ -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 1b001f3b8..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,6 +4,7 @@ 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 final Party party; @@ -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 e8a517754..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,6 +6,7 @@ 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; @@ -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..08de8fc99 100644 --- a/src/main/java/com/gmail/nossr50/events/skills/McMMOPlayerNotificationEvent.java +++ b/src/main/java/com/gmail/nossr50/events/skills/McMMOPlayerNotificationEvent.java @@ -7,6 +7,7 @@ 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 @@ -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/listeners/BlockListener.java b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java index c73e64f6a..7f751502e 100644 --- a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java @@ -126,8 +126,7 @@ public class BlockListener implements Listener { } BlockFace direction = event.getDirection(); - Block movedBlock = event.getBlock(); - movedBlock = movedBlock.getRelative(direction, 2); + Block movedBlock; for (Block b : event.getBlocks()) { if (BlockUtils.shouldBeWatched(b.getState())) { diff --git a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java index 7a6ff5bc0..275c52155 100644 --- a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java @@ -195,7 +195,6 @@ public class EntityListener implements Listener { mcMMO.getPlaceStore().setTrue(block); } } else if ((block.getType() == Material.REDSTONE_ORE)) { - return; } else { if (mcMMO.getPlaceStore().isTrue(block)) { @@ -263,13 +262,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); + } } } } @@ -636,7 +637,6 @@ public class EntityListener implements Listener { return; default: - return; } } } @@ -728,7 +728,6 @@ public class EntityListener implements Listener { return; default: - return; } } @@ -960,7 +959,6 @@ public class EntityListener implements Listener { return; default: - return; } } diff --git a/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java b/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java index 823b1528f..bc21c4b69 100644 --- a/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java @@ -280,7 +280,6 @@ public class InventoryListener implements Listener { AlchemyPotionBrewer.scheduleCheck(player, stand); return; default: - return; } } else if (slot == InventoryType.SlotType.FUEL) { diff --git a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java index 4d00d009d..436e6cbc4 100644 --- a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java @@ -288,21 +288,23 @@ 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 (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 (Permissions.vanillaXpBoost(player, PrimarySkillType.FISHING)) { - //Don't modify XP below vanilla values - if(fishingManager.handleVanillaXpBoost(event.getExpToDrop()) > 1) - event.setExpToDrop(fishingManager.handleVanillaXpBoost(event.getExpToDrop())); + 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 +320,6 @@ public class PlayerListener implements Listener { return; default: - return; } } @@ -397,19 +398,21 @@ public class PlayerListener implements Listener { 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(fishingManager.isExploitingFishing(event.getHook().getLocation().toVector())) + { + player.sendMessage(LocaleLoader.getString("Fishing.ScarcityTip", 3)); + event.setExpToDrop(0); + Item caughtItem = (Item) caught; + caughtItem.remove(); + + return; + } + + fishingManager.handleFishing((Item) caught); + fishingManager.setFishingTarget(); } } - - fishingManager.handleFishing((Item) caught); - fishingManager.setFishingTarget(); - //fishingManager.setFishHookReference(null); return; case CAUGHT_ENTITY: if (fishingManager.canShake(caught)) { @@ -418,7 +421,6 @@ public class PlayerListener implements Listener { } return; default: - return; } } @@ -480,7 +482,6 @@ public class PlayerListener implements Listener { if (event.isCancelled()) { SoundManager.sendSound(player, player.getLocation(), SoundType.POP); - return; } } @@ -597,20 +598,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(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) { @@ -763,7 +762,11 @@ 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(); diff --git a/src/main/java/com/gmail/nossr50/listeners/SelfListener.java b/src/main/java/com/gmail/nossr50/listeners/SelfListener.java index 1d20e2f7d..892359505 100644 --- a/src/main/java/com/gmail/nossr50/listeners/SelfListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/SelfListener.java @@ -49,7 +49,6 @@ public class SelfListener implements Listener { ScoreboardManager.handleLevelUp(player, skill); if (!Config.getInstance().getLevelUpEffectsEnabled()) { - return; } /*if ((event.getSkillLevel() % Config.getInstance().getLevelUpEffectsTier()) == 0) { diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index 98b19710a..90e16ea7b 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -62,7 +62,6 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; -import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; @@ -280,8 +279,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(); @@ -505,7 +504,7 @@ public class mcMMO extends JavaPlugin { new ChildConfig(); - List repairables = new ArrayList(); + List repairables = new ArrayList<>(); if (Config.getInstance().getToolModsEnabled()) { new ToolConfigManager(this); @@ -531,7 +530,7 @@ public class mcMMO extends JavaPlugin { // Load salvage configs, make manager and register them at this time SalvageConfigManager sManager = new SalvageConfigManager(this); - List salvageables = new ArrayList(sManager.getLoadedSalvageables()); + List salvageables = new ArrayList<>(sManager.getLoadedSalvageables()); salvageableManager = new SimpleSalvageableManager(salvageables.size()); salvageableManager.registerSalvageables(salvageables); } @@ -587,7 +586,7 @@ public class mcMMO extends JavaPlugin { 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)); + new BleedTimerTask().runTaskTimer(this, Misc.TICK_CONVERSION_FACTOR, (Misc.TICK_CONVERSION_FACTOR / 2)); // Old & Powerless User remover long purgeIntervalTicks = Config.getInstance().getPurgeInterval() * 60L * 60L * Misc.TICK_CONVERSION_FACTOR; @@ -613,7 +612,7 @@ public class mcMMO extends JavaPlugin { 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); + new CheckDateTask().runTaskTimer(this, 10L * Misc.TICK_CONVERSION_FACTOR, 60L * 60L * Misc.TICK_CONVERSION_FACTOR); } // Clear the registered XP data so players can earn XP again diff --git a/src/main/java/com/gmail/nossr50/party/PartyManager.java b/src/main/java/com/gmail/nossr50/party/PartyManager.java index 2074fc4bb..11989ff04 100644 --- a/src/main/java/com/gmail/nossr50/party/PartyManager.java +++ b/src/main/java/com/gmail/nossr50/party/PartyManager.java @@ -34,7 +34,7 @@ import java.util.UUID; public final class PartyManager { private static final String partiesFilePath = mcMMO.getFlatFileDirectory() + "parties.yml"; - private static final List parties = new ArrayList(); + private static final List parties = new ArrayList<>(); private static final File partyFile = new File(partiesFilePath); private PartyManager() {} @@ -150,7 +150,7 @@ 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) { @@ -168,7 +168,7 @@ 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) { @@ -197,7 +197,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 +221,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 +249,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 +266,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)) { @@ -595,7 +595,7 @@ public final class PartyManager { 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); @@ -671,7 +671,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(); @@ -701,7 +701,7 @@ public final class PartyManager { return; } - ArrayList hasAlly = new ArrayList(); + ArrayList hasAlly = new ArrayList<>(); for (String partyName : partiesFile.getConfigurationSection("").getKeys(false)) { Party party = new Party(partyName); diff --git a/src/main/java/com/gmail/nossr50/runnables/CheckDateTask.java b/src/main/java/com/gmail/nossr50/runnables/CheckDateTask.java index 0b296b4bd..b11b73d45 100644 --- a/src/main/java/com/gmail/nossr50/runnables/CheckDateTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/CheckDateTask.java @@ -14,7 +14,7 @@ public class CheckDateTask extends BukkitRunnable { } // Set up jokes - new AprilTask().runTaskTimer(mcMMO.p, 1L * 60L * Misc.TICK_CONVERSION_FACTOR, 10L * 60L * Misc.TICK_CONVERSION_FACTOR); + new AprilTask().runTaskTimer(mcMMO.p, 60L * Misc.TICK_CONVERSION_FACTOR, 10L * 60L * Misc.TICK_CONVERSION_FACTOR); mcMMO.getHolidayManager().registerAprilCommand(); // Jokes deployed. 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 d0c333592..114211c80 100644 --- a/src/main/java/com/gmail/nossr50/runnables/backups/CleanBackupsTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/backups/CleanBackupsTask.java @@ -16,9 +16,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; @@ -58,7 +58,7 @@ public class CleanBackupsTask extends BukkitRunnable { continue; } else { - List savedWeeks = savedYearsWeeks.computeIfAbsent(year, k -> new ArrayList()); + List savedWeeks = savedYearsWeeks.computeIfAbsent(year, k -> new ArrayList<>()); if (!savedWeeks.contains(weekOfYear) && Config.getInstance().getKeepWeeklyPastMonth()) { // Keep one backup of each week 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..31d961bf6 100644 --- a/src/main/java/com/gmail/nossr50/runnables/party/PartyAutoKickTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/party/PartyAutoKickTask.java @@ -18,8 +18,8 @@ public class PartyAutoKickTask extends BukkitRunnable { @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/player/PlayerProfileLoadingTask.java b/src/main/java/com/gmail/nossr50/runnables/player/PlayerProfileLoadingTask.java index bd255dcb5..b97818ebf 100644 --- a/src/main/java/com/gmail/nossr50/runnables/player/PlayerProfileLoadingTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/player/PlayerProfileLoadingTask.java @@ -96,7 +96,7 @@ public class PlayerProfileLoadingTask extends BukkitRunnable { if (Config.getInstance().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); } } 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 e471ba1e3..de303c957 100644 --- a/src/main/java/com/gmail/nossr50/runnables/skills/BleedTimerTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/skills/BleedTimerTask.java @@ -23,7 +23,7 @@ import java.util.Map; import java.util.Map.Entry; public class BleedTimerTask extends BukkitRunnable { - private static final Map bleedList = new HashMap(); + private static final Map bleedList = new HashMap<>(); private static boolean isIterating = false; @Override @@ -71,8 +71,7 @@ public class BleedTimerTask extends BukkitRunnable { //Count Armor for(ItemStack armorPiece : ((Player) target).getInventory().getArmorContents()) { - if(armorPiece != null) - armorCount++; + armorCount++; } } else { 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..1d460060f 100644 --- a/src/main/java/com/gmail/nossr50/runnables/skills/DelayedCropReplant.java +++ b/src/main/java/com/gmail/nossr50/runnables/skills/DelayedCropReplant.java @@ -98,7 +98,7 @@ public class DelayedCropReplant extends BukkitRunnable { } - private class markPlantAsOld extends BukkitRunnable { + private static class markPlantAsOld extends BukkitRunnable { private final Location cropLoc; 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 025f54563..58ac14bee 100644 --- a/src/main/java/com/gmail/nossr50/skills/alchemy/Alchemy.java +++ b/src/main/java/com/gmail/nossr50/skills/alchemy/Alchemy.java @@ -54,7 +54,7 @@ public final class Alchemy { public static double catalysisMinSpeed = AdvancedConfig.getInstance().getCatalysisMinSpeed(); public static double catalysisMaxSpeed = AdvancedConfig.getInstance().getCatalysisMaxSpeed(); - public static Map brewingStandMap = new HashMap(); + public static Map brewingStandMap = new HashMap<>(); private Alchemy() {} @@ -64,7 +64,7 @@ public final class Alchemy { public static void finishAllBrews() { mcMMO.p.debug("Completing " + brewingStandMap.size() + " unfinished Alchemy brews."); - List toFinish = new ArrayList(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/AlchemyPotionBrewer.java b/src/main/java/com/gmail/nossr50/skills/alchemy/AlchemyPotionBrewer.java index f6b42c285..30f93ebd6 100644 --- a/src/main/java/com/gmail/nossr50/skills/alchemy/AlchemyPotionBrewer.java +++ b/src/main/java/com/gmail/nossr50/skills/alchemy/AlchemyPotionBrewer.java @@ -56,19 +56,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 +113,7 @@ public final class AlchemyPotionBrewer { return; } - List inputList = new ArrayList(); + List inputList = new ArrayList<>(); for (int i = 0; i < 3; i++) { ItemStack item = inventory.getItem(i); 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 d40c1c9fd..4194a2baa 100644 --- a/src/main/java/com/gmail/nossr50/skills/archery/Archery.java +++ b/src/main/java/com/gmail/nossr50/skills/archery/Archery.java @@ -15,7 +15,7 @@ import java.util.Iterator; import java.util.List; public class Archery { - private static final List trackedEntities = new ArrayList(); + private static final List trackedEntities = new ArrayList<>(); public static double skillShotMaxBonusDamage = AdvancedConfig.getInstance().getSkillShotDamageMax(); 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..753d55971 100644 --- a/src/main/java/com/gmail/nossr50/skills/axes/Axes.java +++ b/src/main/java/com/gmail/nossr50/skills/axes/Axes.java @@ -23,8 +23,11 @@ public class Axes { public static double skullSplitterModifier = AdvancedConfig.getInstance().getSkullSplitterModifier(); protected static boolean hasArmor(LivingEntity target) { + if(target.getEquipment() == null) + return false; + for (ItemStack itemStack : target.getEquipment().getArmorContents()) { - if (itemStack != null && ItemUtils.isArmor(itemStack)) { + if (ItemUtils.isArmor(itemStack)) { return true; } } 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 5e4437358..af0fbf95e 100644 --- a/src/main/java/com/gmail/nossr50/skills/child/FamilyTree.java +++ b/src/main/java/com/gmail/nossr50/skills/child/FamilyTree.java @@ -8,7 +8,7 @@ import java.util.HashMap; import java.util.Set; public class FamilyTree { - private static final HashMap> tree = new HashMap>(); + private static final HashMap> tree = new HashMap<>(); public static Set getParents(PrimarySkillType childSkill) { enforceChildSkill(childSkill); 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..ea2db8613 100644 --- a/src/main/java/com/gmail/nossr50/skills/excavation/Excavation.java +++ b/src/main/java/com/gmail/nossr50/skills/excavation/Excavation.java @@ -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..e2d259310 100644 --- a/src/main/java/com/gmail/nossr50/skills/excavation/ExcavationManager.java +++ b/src/main/java/com/gmail/nossr50/skills/excavation/ExcavationManager.java @@ -61,7 +61,7 @@ public class ExcavationManager extends SkillManager { } public int getExperienceOrbsReward() { - return 1 * getArchaeologyRank(); + return getArchaeologyRank(); } public double getArchaelogyExperienceOrbChance() { 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..c5b7ef833 100644 --- a/src/main/java/com/gmail/nossr50/skills/fishing/Fishing.java +++ b/src/main/java/com/gmail/nossr50/skills/fishing/Fishing.java @@ -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; 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..5c3de0452 100644 --- a/src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java @@ -89,7 +89,7 @@ public class FishingManager extends SkillManager { fishingRod.setDurability((short) (fishingRod.getDurability() + 5)); getPlayer().updateInventory(); - if(lastWarnedExhaust + (1000 * 1) < currentTime) + if(lastWarnedExhaust + (1000) < currentTime) { getPlayer().sendMessage(LocaleLoader.getString("Fishing.Exhausting")); lastWarnedExhaust = currentTime; @@ -118,7 +118,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(); @@ -286,7 +286,7 @@ public class FishingManager extends SkillManager { if (treasure != null) { ItemStack treasureDrop = treasure.getDrop().clone(); // Not cloning is bad, m'kay? - Map enchants = new HashMap(); + Map enchants = new HashMap<>(); if (isMagicHunterEnabled() && ItemUtils.isEnchantable(treasureDrop)) { @@ -505,7 +505,7 @@ public class FishingManager extends SkillManager { * @return true if the item has been enchanted */ private Map handleMagicHunter(ItemStack treasureDrop) { - Map enchants = new HashMap(); + Map enchants = new HashMap<>(); List fishingEnchantments = null; double diceRoll = Misc.getRandom().nextDouble() * 100; @@ -535,7 +535,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 +574,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/HerbalismManager.java b/src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java index 5e668a3db..c93c2adc9 100644 --- a/src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java +++ b/src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java @@ -701,7 +701,7 @@ public class HerbalismManager extends SkillManager { Player player = getPlayer(); PlayerInventory playerInventory = player.getInventory(); - Material seed = null; + Material seed; switch (blockState.getType()) { case CARROTS: @@ -761,7 +761,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..4ca7756d2 100644 --- a/src/main/java/com/gmail/nossr50/skills/mining/BlastMining.java +++ b/src/main/java/com/gmail/nossr50/skills/mining/BlastMining.java @@ -99,7 +99,7 @@ public class BlastMining { // 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()); - if (!player.equals(defender)) { + if (!(player != null && player.equals(defender))) { return false; } 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 c72811472..329335af5 100644 --- a/src/main/java/com/gmail/nossr50/skills/mining/MiningManager.java +++ b/src/main/java/com/gmail/nossr50/skills/mining/MiningManager.java @@ -159,7 +159,7 @@ public class MiningManager extends SkillManager { public void blastMiningDropProcessing(float yield, EntityExplodeEvent event) { //Strip out only stuff that gives mining XP - List ores = new ArrayList(); + List ores = new ArrayList<>(); List notOres = new ArrayList<>(); for (Block targetBlock : event.blockList()) { 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..ab4a98fbe 100644 --- a/src/main/java/com/gmail/nossr50/skills/repair/RepairManager.java +++ b/src/main/java/com/gmail/nossr50/skills/repair/RepairManager.java @@ -214,10 +214,10 @@ public class RepairManager extends SkillManager { return AdvancedConfig.getInstance().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 +231,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(); 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 05edc0d67..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 @@ -14,7 +14,7 @@ public class SimpleRepairableManager implements RepairableManager { } 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/salvageables/SimpleSalvageableManager.java b/src/main/java/com/gmail/nossr50/skills/salvage/salvageables/SimpleSalvageableManager.java index 6a9a41f9c..db886c189 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 @@ -15,7 +15,7 @@ public class SimpleSalvageableManager implements SalvageableManager { } 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/SmeltingManager.java b/src/main/java/com/gmail/nossr50/skills/smelting/SmeltingManager.java index e36df9787..9d622ea62 100644 --- a/src/main/java/com/gmail/nossr50/skills/smelting/SmeltingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/smelting/SmeltingManager.java @@ -1,5 +1,6 @@ package com.gmail.nossr50.skills.smelting; +import com.gmail.nossr50.config.Config; import com.gmail.nossr50.datatypes.experience.XPGainReason; import com.gmail.nossr50.datatypes.experience.XPGainSource; import com.gmail.nossr50.datatypes.player.McMMOPlayer; @@ -10,7 +11,6 @@ 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.event.inventory.FurnaceBurnEvent; import org.bukkit.inventory.ItemStack; @@ -31,10 +31,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) { @@ -109,9 +109,11 @@ public class SmeltingManager extends SkillManager { } public ItemStack smeltProcessing(ItemStack smelting, ItemStack result) { + applyXpGain(Smelting.getResourceXp(smelting), XPGainReason.PVE, XPGainSource.PASSIVE); - if (isSecondSmeltSuccessful()) { + if (Config.getInstance().getDoubleDropsEnabled(PrimarySkillType.SMELTING, result.getType()) + && isSecondSmeltSuccessful()) { ItemStack newResult = result.clone(); newResult.setAmount(result.getAmount() + 1); 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..2627b93c4 100644 --- a/src/main/java/com/gmail/nossr50/skills/taming/TamingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/taming/TamingManager.java @@ -64,7 +64,7 @@ public class TamingManager extends SkillManager { playerSummonedEntities = new HashMap<>(); for(CallOfTheWildType callOfTheWildType : CallOfTheWildType.values()) { - playerSummonedEntities.put(callOfTheWildType, new ArrayList()); + playerSummonedEntities.put(callOfTheWildType, new ArrayList<>()); } } @@ -524,8 +524,7 @@ 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 removeFromTracker(TrackedTamingEntity trackedEntity) { - if(playerSummonedEntities.get(trackedEntity.getCallOfTheWildType()).contains(trackedEntity)) - playerSummonedEntities.get(trackedEntity.getCallOfTheWildType()).remove(trackedEntity); + playerSummonedEntities.get(trackedEntity.getCallOfTheWildType()).remove(trackedEntity); NotificationManager.sendPlayerInformationChatOnly(getPlayer(), "Taming.Summon.COTW.TimeExpired", StringUtils.getPrettyEntityTypeString(trackedEntity.getLivingEntity().getType())); } 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 8c6ce621e..07c47a1f3 100644 --- a/src/main/java/com/gmail/nossr50/skills/woodcutting/WoodcuttingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/woodcutting/WoodcuttingManager.java @@ -99,7 +99,7 @@ public class WoodcuttingManager extends SkillManager { */ public void processTreeFeller(BlockState blockState) { Player player = getPlayer(); - Set treeFellerBlocks = new HashSet(); + Set treeFellerBlocks = new HashSet<>(); treeFellerReachedThreshold = false; @@ -160,7 +160,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)) { diff --git a/src/main/java/com/gmail/nossr50/util/BlockUtils.java b/src/main/java/com/gmail/nossr50/util/BlockUtils.java index ef6b3df76..4750785fe 100644 --- a/src/main/java/com/gmail/nossr50/util/BlockUtils.java +++ b/src/main/java/com/gmail/nossr50/util/BlockUtils.java @@ -250,7 +250,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()) { diff --git a/src/main/java/com/gmail/nossr50/util/ChimaeraWing.java b/src/main/java/com/gmail/nossr50/util/ChimaeraWing.java index c1a82f9af..c1bccbca2 100644 --- a/src/main/java/com/gmail/nossr50/util/ChimaeraWing.java +++ b/src/main/java/com/gmail/nossr50/util/ChimaeraWing.java @@ -152,9 +152,10 @@ public final class ChimaeraWing { ItemStack itemStack = new ItemStack(Config.getInstance().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); 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/HardcoreManager.java b/src/main/java/com/gmail/nossr50/util/HardcoreManager.java index ee2ad8092..9956a614d 100644 --- a/src/main/java/com/gmail/nossr50/util/HardcoreManager.java +++ b/src/main/java/com/gmail/nossr50/util/HardcoreManager.java @@ -31,8 +31,8 @@ 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()) { @@ -83,8 +83,8 @@ 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()) { diff --git a/src/main/java/com/gmail/nossr50/util/HolidayManager.java b/src/main/java/com/gmail/nossr50/util/HolidayManager.java index 903db4e16..bf312524b 100644 --- a/src/main/java/com/gmail/nossr50/util/HolidayManager.java +++ b/src/main/java/com/gmail/nossr50/util/HolidayManager.java @@ -96,9 +96,9 @@ public final class HolidayManager { Statistic.PIG_ONE_CM); static { - List colors = new ArrayList(); - List chatColors = new ArrayList(); - List chatFormats = new ArrayList(); + List colors = new ArrayList<>(); + List chatColors = new ArrayList<>(); + List chatFormats = new ArrayList<>(); for (ChatColor color : ChatColor.values()) { if (color.isColor()) { @@ -137,7 +137,7 @@ public final class HolidayManager { } } - hasCelebrated = new ArrayList(); + hasCelebrated = new ArrayList<>(); try { hasCelebrated.clear(); @@ -161,7 +161,7 @@ public final class HolidayManager { private void cleanupFiles() { File FlatFileDir = new File(mcMMO.getFlatFileDirectory()); File legacy = new File(FlatFileDir, "anniversary.yml"); - List toDelete = new ArrayList(); + List toDelete = new ArrayList<>(); if (legacy.exists()) { toDelete.add(legacy); diff --git a/src/main/java/com/gmail/nossr50/util/ItemUtils.java b/src/main/java/com/gmail/nossr50/util/ItemUtils.java index a0bfd5dee..f7dea6a38 100644 --- a/src/main/java/com/gmail/nossr50/util/ItemUtils.java +++ b/src/main/java/com/gmail/nossr50/util/ItemUtils.java @@ -459,7 +459,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 +473,10 @@ 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")); } } diff --git a/src/main/java/com/gmail/nossr50/util/MobHealthbarUtils.java b/src/main/java/com/gmail/nossr50/util/MobHealthbarUtils.java index 4bd676b1e..c31e51424 100644 --- a/src/main/java/com/gmail/nossr50/util/MobHealthbarUtils.java +++ b/src/main/java/com/gmail/nossr50/util/MobHealthbarUtils.java @@ -138,19 +138,19 @@ public final class MobHealthbarUtils { int coloredDisplay = (int) Math.ceil(fullDisplay * (healthPercentage / 100.0D)); 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 1cf04b98f..b61f98048 100644 --- a/src/main/java/com/gmail/nossr50/util/ModManager.java +++ b/src/main/java/com/gmail/nossr50/util/ModManager.java @@ -22,36 +22,36 @@ import java.util.HashMap; import java.util.List; public class ModManager { - private final List repairables = new ArrayList(); + private final List repairables = new ArrayList<>(); // Armor Mods - private final List customBoots = new ArrayList(); - private final List customChestplates = new ArrayList(); - private final List customHelmets = new ArrayList(); - private final 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 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 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 final HashMap customEntityClassMap = new HashMap(); - private final HashMap customEntityTypeMap = new HashMap(); + private final HashMap customEntityClassMap = new HashMap<>(); + private final HashMap customEntityTypeMap = new HashMap<>(); // Tool Mods - 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(); + 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); 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/HashChunkletManager.java b/src/main/java/com/gmail/nossr50/util/blockmeta/HashChunkletManager.java index 0302f5de3..c2fc23faf 100755 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/HashChunkletManager.java +++ b/src/main/java/com/gmail/nossr50/util/blockmeta/HashChunkletManager.java @@ -8,7 +8,7 @@ import java.io.*; import java.util.HashMap; public class HashChunkletManager implements ChunkletManager { - public HashMap store = new HashMap(); + public HashMap store = new HashMap<>(); @Override public void loadChunklet(int cx, int cy, int cz, World world) { diff --git a/src/main/java/com/gmail/nossr50/util/blockmeta/NullChunkletManager.java b/src/main/java/com/gmail/nossr50/util/blockmeta/NullChunkletManager.java index 89bd46967..304ef8780 100755 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/NullChunkletManager.java +++ b/src/main/java/com/gmail/nossr50/util/blockmeta/NullChunkletManager.java @@ -11,57 +11,46 @@ import org.bukkit.block.Block; 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 @@ -76,26 +65,21 @@ public class NullChunkletManager implements ChunkletManager { @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/chunkmeta/HashChunkManager.java b/src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/HashChunkManager.java index 13e93ebd3..05153816f 100755 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/HashChunkManager.java +++ b/src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/HashChunkManager.java @@ -11,10 +11,10 @@ import java.io.*; import java.util.*; public class HashChunkManager implements ChunkManager { - private final HashMap> regionFiles = new HashMap>(); - public HashMap store = new HashMap(); - public ArrayList converters = new ArrayList(); - private final HashMap oldData = new HashMap(); + private final HashMap> regionFiles = new HashMap<>(); + public HashMap store = new HashMap<>(); + public ArrayList converters = new ArrayList<>(); + private final HashMap oldData = new HashMap<>(); @Override public synchronized void closeAll() { @@ -38,31 +38,19 @@ public class HashChunkManager implements ChunkManager { if (in == null) { return null; } - ObjectInputStream objectStream = new ObjectInputStream(in); - try { + try (ObjectInputStream objectStream = new ObjectInputStream(in)) { 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) { + } catch (IOException | ClassNotFoundException 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 @@ -98,7 +86,7 @@ public class HashChunkManager implements ChunkManager { UUID key = world.getUID(); - HashMap worldRegions = regionFiles.computeIfAbsent(key, k -> new HashMap()); + HashMap worldRegions = regionFiles.computeIfAbsent(key, k -> new HashMap<>()); int rx = x >> 5; int rz = z >> 5; @@ -217,7 +205,7 @@ public class HashChunkManager implements ChunkManager { closeAll(); String worldName = world.getName(); - List keys = new ArrayList(store.keySet()); + List keys = new ArrayList<>(store.keySet()); for (String key : keys) { String[] info = key.split(","); if (worldName.equals(info[0])) { @@ -239,7 +227,7 @@ public class HashChunkManager implements ChunkManager { String worldName = world.getName(); - List keys = new ArrayList(store.keySet()); + List keys = new ArrayList<>(store.keySet()); for (String key : keys) { String[] info = key.split(","); if (worldName.equals(info[0])) { 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 index b3646e5fb..2193417d8 100644 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/McMMOSimpleRegionFile.java +++ b/src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/McMMOSimpleRegionFile.java @@ -29,7 +29,7 @@ public class McMMOSimpleRegionFile { 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 final ArrayList inuse = new ArrayList<>(); private int segmentSize; private int segmentMask; private final int rx; 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 index 96b2f6b16..9dcb20c2a 100755 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/conversion/BlockStoreConversionMain.java +++ b/src/main/java/com/gmail/nossr50/util/blockmeta/conversion/BlockStoreConversionMain.java @@ -28,7 +28,6 @@ public class BlockStoreConversionMain implements Runnable { } this.taskID = this.scheduler.runTaskLater(mcMMO.p, this, 1).getTaskId(); - return; } @Override @@ -87,6 +86,5 @@ public class BlockStoreConversionMain implements Runnable { 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 index c05beb8ab..a64eec843 100755 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/conversion/BlockStoreConversionXDirectory.java +++ b/src/main/java/com/gmail/nossr50/util/blockmeta/conversion/BlockStoreConversionXDirectory.java @@ -29,7 +29,6 @@ public class BlockStoreConversionXDirectory implements Runnable { } this.taskID = this.scheduler.runTaskLater(mcMMO.p, this, 1).getTaskId(); - return; } @Override 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 index 5c182b55b..4a32a679c 100755 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/conversion/BlockStoreConversionZDirectory.java +++ b/src/main/java/com/gmail/nossr50/util/blockmeta/conversion/BlockStoreConversionZDirectory.java @@ -42,7 +42,6 @@ public class BlockStoreConversionZDirectory implements Runnable { } this.taskID = this.scheduler.runTaskLater(mcMMO.p, this, 1).getTaskId(); - return; } @Override 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 744ca5aae..125c6abba 100644 --- a/src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java +++ b/src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java @@ -199,7 +199,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"); 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..84d96680d 100644 --- a/src/main/java/com/gmail/nossr50/util/commands/CommandUtils.java +++ b/src/main/java/com/gmail/nossr50/util/commands/CommandUtils.java @@ -106,7 +106,7 @@ public final class CommandUtils { } public static boolean hasPlayerDataKey(CommandSender sender) { - if (sender == null || !(sender instanceof Player)) { + if (!(sender instanceof Player)) { return false; } @@ -221,7 +221,7 @@ public final class CommandUtils { PlayerProfile profile = UserManager.getPlayer(inspect).getProfile(); - List displayData = new ArrayList(); + List displayData = new ArrayList<>(); displayData.add(header); for (PrimarySkillType skill : skillGroup) { @@ -239,7 +239,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)) { @@ -286,7 +286,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/layers/DummyPlayerAttackCooldownExploitPreventionLayer.java b/src/main/java/com/gmail/nossr50/util/compat/layers/DummyPlayerAttackCooldownExploitPreventionLayer.java index cf9e3ee7f..79b67138f 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/layers/DummyPlayerAttackCooldownExploitPreventionLayer.java +++ b/src/main/java/com/gmail/nossr50/util/compat/layers/DummyPlayerAttackCooldownExploitPreventionLayer.java @@ -28,6 +28,5 @@ public class DummyPlayerAttackCooldownExploitPreventionLayer extends PlayerAttac @Override public void resetAttackStrength(Player player) throws InvocationTargetException, IllegalAccessException { //Do nothing - return; } } 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 3926ff9ad..3c7ff308f 100644 --- a/src/main/java/com/gmail/nossr50/util/experience/FormulaManager.java +++ b/src/main/java/com/gmail/nossr50/util/experience/FormulaManager.java @@ -116,9 +116,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/player/UserManager.java b/src/main/java/com/gmail/nossr50/util/player/UserManager.java index 396770c58..4ef9606b6 100644 --- a/src/main/java/com/gmail/nossr50/util/player/UserManager.java +++ b/src/main/java/com/gmail/nossr50/util/player/UserManager.java @@ -33,7 +33,7 @@ public final class UserManager { } public static void cleanupPlayer(McMMOPlayer mcMMOPlayer) { - if(playerDataSet != null && playerDataSet.contains(mcMMOPlayer)) + if(playerDataSet != null) playerDataSet.remove(mcMMOPlayer); } @@ -47,7 +47,7 @@ public final class UserManager { mcMMOPlayer.cleanup(); player.removeMetadata(mcMMO.playerDataKey, mcMMO.p); - if(playerDataSet != null && playerDataSet.contains(mcMMOPlayer)) { + if(playerDataSet != null) { playerDataSet.remove(mcMMOPlayer); //Clear sync save tracking } } @@ -91,7 +91,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)) { 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 d07a8ef08..7e5aa65b5 100644 --- a/src/main/java/com/gmail/nossr50/util/scoreboards/ScoreboardManager.java +++ b/src/main/java/com/gmail/nossr50/util/scoreboards/ScoreboardManager.java @@ -25,7 +25,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"; @@ -130,7 +130,7 @@ public class ScoreboardManager { abilityLabelsSkill = abilityLabelSkillBuilder.build(); } - private static final List dirtyPowerLevels = new ArrayList(); + private static final List dirtyPowerLevels = new ArrayList<>(); public enum SidebarType { NONE, 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 5223bbce1..9d675e71b 100644 --- a/src/main/java/com/gmail/nossr50/util/scoreboards/ScoreboardWrapper.java +++ b/src/main/java/com/gmail/nossr50/util/scoreboards/ScoreboardWrapper.java @@ -235,8 +235,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); 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 7f38a45ae..07f0c392d 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java @@ -866,7 +866,7 @@ 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))); + return getFakeDamageFinalResult(attacker, target, DamageCause.ENTITY_ATTACK, new EnumMap<>(ImmutableMap.of(DamageModifier.BASE, damage))); } @Deprecated @@ -912,7 +912,7 @@ public final class CombatUtils { } private static Map getModifiers(EntityDamageEvent event) { - Map modifiers = new HashMap(); + Map modifiers = new HashMap<>(); for (DamageModifier modifier : DamageModifier.values()) { modifiers.put(modifier, event.getDamage(modifier)); } @@ -921,7 +921,7 @@ public final class CombatUtils { } private static Map getScaledModifiers(double damage, Map modifiers) { - Map scaledModifiers = new HashMap(); + Map scaledModifiers = new HashMap<>(); for (DamageModifier modifier : modifiers.keySet()) { if (modifier == DamageModifier.BASE) { 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 807b6fb5c..40fad662b 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/ParticleEffectUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/ParticleEffectUtils.java @@ -85,19 +85,8 @@ public final class ParticleEffectUtils { 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 (hasHeadRoom(player)) { 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..35e0dca39 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/SkillUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/SkillUtils.java @@ -142,7 +142,7 @@ public class SkillUtils { int efficiencyLevel = heldItem.getEnchantmentLevel(Enchantment.DIG_SPEED); ItemMeta itemMeta = heldItem.getItemMeta(); - List itemLore = new ArrayList(); + List itemLore = new ArrayList<>(); if (itemMeta.hasLore()) { itemLore = itemMeta.getLore(); diff --git a/src/main/java/com/gmail/nossr50/worldguard/WorldGuardManager.java b/src/main/java/com/gmail/nossr50/worldguard/WorldGuardManager.java index 51ccc8605..3e4ea3386 100644 --- a/src/main/java/com/gmail/nossr50/worldguard/WorldGuardManager.java +++ b/src/main/java/com/gmail/nossr50/worldguard/WorldGuardManager.java @@ -76,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 } diff --git a/src/main/java/net/shatteredlands/shatt/backup/ZipLibrary.java b/src/main/java/net/shatteredlands/shatt/backup/ZipLibrary.java index 67e797ef0..e60c8554b 100644 --- a/src/main/java/net/shatteredlands/shatt/backup/ZipLibrary.java +++ b/src/main/java/net/shatteredlands/shatt/backup/ZipLibrary.java @@ -47,7 +47,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/config.yml b/src/main/resources/config.yml index 4fe07127c..5ac02a3c4 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -536,6 +536,16 @@ 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 # # Settings for commands From f6c7049cac76a1c68348e9e570a7617c45747af0 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 13 Jul 2020 13:16:47 -0700 Subject: [PATCH 089/662] Furnaces can now change owners during server lifespan for Smelting XP --- Changelog.txt | 17 +- .../nossr50/listeners/InventoryListener.java | 180 +++++++++++------- 2 files changed, 127 insertions(+), 70 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 0fcacba94..fbb3d3b22 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,7 +1,9 @@ Version 2.1.134 - Minor code cleanup + Smelting furnaces are now more flexible about who they consider their owner (see notes) Smelting now has a Bonus Drops section in config.yml - Smelting now only doubles smelting results for items which have bonus drop entries in the config + Smelting now only doubles smelting results for items which have bonus drop entries in config.yml + Minor code cleanup + 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 @@ -13,7 +15,16 @@ Version 2.1.134 Fixed a potential NPE when players right click blocks Fixed a locale mistake in locale hu_HU Fixed a locale mistake in locale ru - Changed the UUID updater task to not catastrophically fail when requests failed + + NOTES: + Furnaces give XP to their owner while smelting + You become the owner of a Furnace by doing one of the following + 1) Opening an empty furnace + 2) Interacting with a furnace + + 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 Version 2.1.133 A fix for an 'array out of bounds' error related to players clicking outside the inventory windows has been fixed diff --git a/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java b/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java index bc21c4b69..0cc7fd227 100644 --- a/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java @@ -29,6 +29,7 @@ import org.bukkit.event.Listener; import org.bukkit.event.inventory.*; import org.bukkit.inventory.*; import org.bukkit.metadata.MetadataValue; +import org.jetbrains.annotations.Nullable; import java.util.List; @@ -45,26 +46,57 @@ public class InventoryListener implements Listener { 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; - } + HumanEntity humanEntity = event.getPlayer(); + Player player = (Player) humanEntity; //Profile not loaded - if(UserManager.getPlayer((Player) player) == null) + if(UserManager.getPlayer(player) == null) { return; } - if(!furnaceBlock.hasMetadata(mcMMO.furnaceMetadataKey) && furnaceBlock.getMetadata(mcMMO.furnaceMetadataKey).size() == 0) - furnaceBlock.setMetadata(mcMMO.furnaceMetadataKey, UserManager.getPlayer((Player) player).getPlayerMetadata()); + if(event.getInventory() instanceof Furnace) { + + } + Furnace furnace = getFurnace(event.getInventory()); + + if (furnace != null) { + if(isFurnaceAvailable(furnace, player)) { + assignFurnace(furnace, player); + } + } + } + + public boolean isFurnaceAvailable(Furnace furnace, Player player) { + if(!furnace.hasMetadata(mcMMO.furnaceMetadataKey) + && furnace.getMetadata(mcMMO.furnaceMetadataKey).size() == 0) { + return true; + } else { + if(player != getPlayerFromFurnace(furnace)) { + + if(isFurnaceResultEmpty(furnace)) { + return true; + } else { + return false; + } + } + } + + return false; + } + + public boolean isFurnaceResultEmpty(Furnace furnace) { + return furnace.getInventory().getResult() == null; + } + + public void assignFurnace(Furnace furnace, Player player) { + + if(furnace.hasMetadata(mcMMO.furnaceMetadataKey)) { + furnace.removeMetadata(mcMMO.furnaceMetadataKey, mcMMO.p); + } + + furnace.setMetadata(mcMMO.furnaceMetadataKey, UserManager.getPlayer(player).getPlayerMetadata()); + } @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) @@ -73,19 +105,15 @@ public class InventoryListener implements Listener { if(WorldBlacklist.isWorldBlacklisted(event.getPlayer().getWorld())) return; - Block furnaceBlock = processInventoryOpenOrCloseEvent(event.getInventory()); + if(event.getInventory() instanceof FurnaceInventory) { + if(getFurnace(event.getInventory()) != null) { + Furnace furnace = getFurnace(event.getInventory()); - if (furnaceBlock == null || furnaceBlock.hasMetadata(mcMMO.furnaceMetadataKey)) { - return; + if(isFurnaceOwned(furnace) && isFurnaceResultEmpty(furnace)) { + removeFurnaceOwner(furnace); + } + } } - - HumanEntity player = event.getPlayer(); - - if (!UserManager.hasPlayerDataKey(player)) { - return; - } - - furnaceBlock.removeMetadata(mcMMO.furnaceMetadataKey, plugin); } @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) @@ -102,7 +130,9 @@ public class InventoryListener implements Listener { return; } - Player player = getPlayerFromFurnace(furnaceBlock); + Furnace furnace = (Furnace) furnaceState; + + Player player = getPlayerFromFurnace(furnace); /* WORLD GUARD MAIN FLAG CHECK */ if(WorldGuardUtils.isWorldGuardLoaded()) @@ -137,26 +167,29 @@ public class InventoryListener implements Listener { return; } - Player player = getPlayerFromFurnace(furnaceBlock); - - /* WORLD GUARD MAIN FLAG CHECK */ - if(WorldGuardUtils.isWorldGuardLoaded()) + if(furnaceBlock instanceof Furnace) { - if(!WorldGuardManager.getInstance().hasMainFlag(player)) + Player player = getPlayerFromFurnace((Furnace) furnaceBlock); + + /* WORLD GUARD MAIN FLAG CHECK */ + if(WorldGuardUtils.isWorldGuardLoaded()) + { + if(!WorldGuardManager.getInstance().hasMainFlag(player)) + return; + } + + if (!UserManager.hasPlayerDataKey(player) || !PrimarySkillType.SMELTING.getPermissions(player)) { return; - } + } - if (!UserManager.hasPlayerDataKey(player) || !PrimarySkillType.SMELTING.getPermissions(player)) { - return; - } + //Profile not loaded + if(UserManager.getPlayer(player) == null) + { + return; + } - //Profile not loaded - if(UserManager.getPlayer(player) == null) - { - return; + event.setResult(UserManager.getPlayer(player).getSmeltingManager().smeltProcessing(smelting, event.getResult())); } - - event.setResult(UserManager.getPlayer(player).getSmeltingManager().smeltProcessing(smelting, event.getResult())); } @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) @@ -171,28 +204,31 @@ public class InventoryListener implements Listener { return; } - Player player = getPlayerFromFurnace(furnaceBlock); + if(furnaceBlock instanceof Furnace) { + Furnace furnace = (Furnace) furnaceBlock; + Player player = getPlayerFromFurnace(furnace); - /* WORLD GUARD MAIN FLAG CHECK */ - if(WorldGuardUtils.isWorldGuardLoaded()) - { - if(!WorldGuardManager.getInstance().hasMainFlag(player)) + /* 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) @@ -206,12 +242,13 @@ public class InventoryListener implements Listener { if(event.getWhoClicked() instanceof Player) { Player player = ((Player) event.getWhoClicked()).getPlayer(); - Block furnaceBlock = processInventoryOpenOrCloseEvent(event.getInventory()); + Furnace furnace = getFurnace(event.getInventory()); - if (furnaceBlock != null) + if (furnace != null) { - if (furnaceBlock.getMetadata(mcMMO.furnaceMetadataKey).size() > 0) - furnaceBlock.removeMetadata(mcMMO.furnaceMetadataKey, mcMMO.p); + if (isFurnaceOwned(furnace)) { + removeFurnaceOwner(furnace); + } //Profile not loaded if(UserManager.getPlayer(player) == null) @@ -219,7 +256,7 @@ public class InventoryListener implements Listener { return; } - furnaceBlock.setMetadata(mcMMO.furnaceMetadataKey, UserManager.getPlayer(player).getPlayerMetadata()); + assignFurnace(furnace, player); } } @@ -325,6 +362,14 @@ public class InventoryListener implements Listener { } } + public boolean isFurnaceOwned(Furnace furnace) { + return furnace.getMetadata(mcMMO.furnaceMetadataKey).size() > 0; + } + + public void removeFurnaceOwner(Furnace furnace) { + furnace.removeMetadata(mcMMO.furnaceMetadataKey, mcMMO.p); + } + @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) public void onInventoryDragEvent(InventoryDragEvent event) { /* WORLD BLACKLIST CHECK */ @@ -480,7 +525,7 @@ public class InventoryListener implements Listener { new PlayerUpdateInventoryTask((Player) whoClicked).runTaskLater(plugin, 0); } - private Block processInventoryOpenOrCloseEvent(Inventory inventory) { + private Furnace getFurnace(Inventory inventory) { if (!(inventory instanceof FurnaceInventory)) { return null; } @@ -491,11 +536,12 @@ public class InventoryListener implements Listener { return null; } - return furnace.getBlock(); + return furnace; } - private Player getPlayerFromFurnace(Block furnaceBlock) { - List metadata = furnaceBlock.getMetadata(mcMMO.furnaceMetadataKey); + @Nullable + private Player getPlayerFromFurnace(Furnace furnace) { + List metadata = furnace.getMetadata(mcMMO.furnaceMetadataKey); if (metadata.isEmpty()) { return null; From 16d7b51497334f5a263f494682c7f05ebab429aa Mon Sep 17 00:00:00 2001 From: Ulrich Fink Date: Tue, 21 Jul 2020 22:49:32 +0200 Subject: [PATCH 090/662] Fix brewing stand not consuming items Fixes #4225 Negation in commit fdd951f1f1890d4bcb62fb6d44fd576df63ad8f is faulty. --- .../com/gmail/nossr50/skills/alchemy/AlchemyPotionBrewer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 30f93ebd6..f42584b25 100644 --- a/src/main/java/com/gmail/nossr50/skills/alchemy/AlchemyPotionBrewer.java +++ b/src/main/java/com/gmail/nossr50/skills/alchemy/AlchemyPotionBrewer.java @@ -61,7 +61,7 @@ public final class AlchemyPotionBrewer { ItemStack ingredient = inventory.getIngredient().clone(); - if (isEmpty(ingredient) && !isValidIngredient(player, ingredient)) { + if (!isEmpty(ingredient) && isValidIngredient(player, ingredient)) { if (ingredient.getAmount() <= 1) { inventory.setIngredient(null); } From 35cde870ffd33151b2d469451731feb7c2f1b0d2 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 23 Jul 2020 20:59:34 -0700 Subject: [PATCH 091/662] Reworked a lot of stuff to do with Smelting --- Changelog.txt | 10 +- .../nossr50/listeners/BlockListener.java | 16 +- .../nossr50/listeners/InventoryListener.java | 218 ++++-------------- src/main/java/com/gmail/nossr50/mcMMO.java | 10 +- .../runnables/skills/FurnaceCleanupTask.java | 22 ++ .../nossr50/skills/smelting/Smelting.java | 20 +- .../nossr50/util/skills/SmeltingTracker.java | 65 ++++++ 7 files changed, 165 insertions(+), 196 deletions(-) create mode 100644 src/main/java/com/gmail/nossr50/runnables/skills/FurnaceCleanupTask.java create mode 100644 src/main/java/com/gmail/nossr50/util/skills/SmeltingTracker.java diff --git a/Changelog.txt b/Changelog.txt index fbb3d3b22..9aa772a11 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,5 +1,5 @@ Version 2.1.134 - Smelting furnaces are now more flexible about who they consider their owner (see notes) + 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 Minor code cleanup @@ -17,14 +17,8 @@ Version 2.1.134 Fixed a locale mistake in locale ru NOTES: - Furnaces give XP to their owner while smelting - You become the owner of a Furnace by doing one of the following - 1) Opening an empty furnace - 2) Interacting with a furnace - 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 + 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 diff --git a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java index 7f751502e..6fee064e9 100644 --- a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java @@ -18,6 +18,7 @@ import com.gmail.nossr50.skills.herbalism.HerbalismManager; 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.smelting.Smelting; import com.gmail.nossr50.skills.woodcutting.WoodcuttingManager; import com.gmail.nossr50.util.BlockUtils; import com.gmail.nossr50.util.EventUtils; @@ -535,16 +536,6 @@ public class BlockListener implements Listener { } } - 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. * @@ -628,7 +619,6 @@ public class BlockListener implements Listener { return; } - BlockState blockState = event.getBlock().getState(); ItemStack heldItem = player.getInventory().getItemInMainHand(); @@ -673,10 +663,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().getPlayerFromFurnace(furnace); if(furnacePlayer != null) { player.sendMessage("[mcMMO DEBUG] This furnace is owned by player "+furnacePlayer.getName()); diff --git a/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java b/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java index 0cc7fd227..196131717 100644 --- a/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java @@ -2,11 +2,13 @@ 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; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.runnables.player.PlayerUpdateInventoryTask; +import com.gmail.nossr50.runnables.skills.FurnaceCleanupTask; import com.gmail.nossr50.skills.alchemy.Alchemy; import com.gmail.nossr50.skills.alchemy.AlchemyPotionBrewer; import com.gmail.nossr50.util.ItemUtils; @@ -15,8 +17,10 @@ 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,10 +32,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 org.jetbrains.annotations.Nullable; - -import java.util.List; public class InventoryListener implements Listener { private final mcMMO plugin; @@ -40,82 +40,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; - - HumanEntity humanEntity = event.getPlayer(); - Player player = (Player) humanEntity; - - //Profile not loaded - if(UserManager.getPlayer(player) == null) - { - return; - } - - if(event.getInventory() instanceof Furnace) { - - } - Furnace furnace = getFurnace(event.getInventory()); - - if (furnace != null) { - if(isFurnaceAvailable(furnace, player)) { - assignFurnace(furnace, player); - } - } - } - - public boolean isFurnaceAvailable(Furnace furnace, Player player) { - if(!furnace.hasMetadata(mcMMO.furnaceMetadataKey) - && furnace.getMetadata(mcMMO.furnaceMetadataKey).size() == 0) { - return true; - } else { - if(player != getPlayerFromFurnace(furnace)) { - - if(isFurnaceResultEmpty(furnace)) { - return true; - } else { - return false; - } - } - } - - return false; - } - - public boolean isFurnaceResultEmpty(Furnace furnace) { - return furnace.getInventory().getResult() == null; - } - - public void assignFurnace(Furnace furnace, Player player) { - - if(furnace.hasMetadata(mcMMO.furnaceMetadataKey)) { - furnace.removeMetadata(mcMMO.furnaceMetadataKey, mcMMO.p); - } - - furnace.setMetadata(mcMMO.furnaceMetadataKey, UserManager.getPlayer(player).getPlayerMetadata()); - - } - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onInventoryClose(InventoryCloseEvent event) { - /* WORLD BLACKLIST CHECK */ - if(WorldBlacklist.isWorldBlacklisted(event.getPlayer().getWorld())) - return; - - if(event.getInventory() instanceof FurnaceInventory) { - if(getFurnace(event.getInventory()) != null) { - Furnace furnace = getFurnace(event.getInventory()); - - if(isFurnaceOwned(furnace) && isFurnaceResultEmpty(furnace)) { - removeFurnaceOwner(furnace); - } - } - } - } - @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) public void onFurnaceBurnEvent(FurnaceBurnEvent event) { /* WORLD BLACKLIST CHECK */ @@ -132,26 +56,27 @@ public class InventoryListener implements Listener { Furnace furnace = (Furnace) furnaceState; - Player player = getPlayerFromFurnace(furnace); + OfflinePlayer offlinePlayer = mcMMO.getSmeltingTracker().getPlayerFromFurnace(furnace); - /* WORLD GUARD MAIN FLAG CHECK */ - if(WorldGuardUtils.isWorldGuardLoaded()) - { - if(!WorldGuardManager.getInstance().hasMainFlag(player)) - return; + 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; + } + + event.setBurnTime(UserManager.getPlayer(player).getSmeltingManager().fuelEfficiency(event.getBurnTime())); + } } - 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) @@ -160,35 +85,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; } - if(furnaceBlock instanceof Furnace) - { - Player player = getPlayerFromFurnace((Furnace) furnaceBlock); + if(blockState instanceof Furnace) { + Furnace furnace = (Furnace) blockState; + OfflinePlayer offlinePlayer = mcMMO.getSmeltingTracker().getPlayerFromFurnace(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) { + event.setResult(offlineProfile.getSmeltingManager().smeltProcessing(smelting, event.getResult())); + } } - 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())); + new FurnaceCleanupTask(furnace).runTaskLater(mcMMO.p, 1); } } @@ -198,16 +116,15 @@ 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; } - if(furnaceBlock instanceof Furnace) { - Furnace furnace = (Furnace) furnaceBlock; - Player player = getPlayerFromFurnace(furnace); + Player player = event.getPlayer(); + if(furnaceBlock instanceof Furnace) { /* WORLD GUARD MAIN FLAG CHECK */ if(WorldGuardUtils.isWorldGuardLoaded()) { @@ -237,26 +154,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(); - Furnace furnace = getFurnace(event.getInventory()); + Furnace furnace = mcMMO.getSmeltingTracker().getFurnaceFromInventory(event.getInventory()); if (furnace != null) { - if (isFurnaceOwned(furnace)) { - removeFurnaceOwner(furnace); - } - - //Profile not loaded - if(UserManager.getPlayer(player) == null) - { - return; - } - - assignFurnace(furnace, player); + //Switch owners + mcMMO.getSmeltingTracker().processFurnaceOwnership(furnace, player); } } @@ -276,8 +189,6 @@ public class InventoryListener implements Listener { return; } - Player player = (Player) whoClicked; - /* WORLD GUARD MAIN FLAG CHECK */ if(WorldGuardUtils.isWorldGuardLoaded()) { @@ -362,13 +273,10 @@ public class InventoryListener implements Listener { } } - public boolean isFurnaceOwned(Furnace furnace) { - return furnace.getMetadata(mcMMO.furnaceMetadataKey).size() > 0; + public boolean isOutsideWindowClick(InventoryClickEvent event) { + return event.getHotbarButton() == -1; } - public void removeFurnaceOwner(Furnace furnace) { - furnace.removeMetadata(mcMMO.furnaceMetadataKey, mcMMO.p); - } @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) public void onInventoryDragEvent(InventoryDragEvent event) { @@ -480,7 +388,7 @@ public class InventoryListener implements Listener { public void onInventoryClickEvent(InventoryClickEvent event) { SkillUtils.removeAbilityBuff(event.getCurrentItem()); if (event.getAction() == InventoryAction.HOTBAR_SWAP) { - if(event.getHotbarButton() == -1) + if(isOutsideWindowClick(event)) return; PlayerInventory playerInventory = event.getWhoClicked().getInventory(); @@ -525,28 +433,4 @@ public class InventoryListener implements Listener { new PlayerUpdateInventoryTask((Player) whoClicked).runTaskLater(plugin, 0); } - private Furnace getFurnace(Inventory inventory) { - if (!(inventory instanceof FurnaceInventory)) { - return null; - } - - Furnace furnace = (Furnace) inventory.getHolder(); - - if (furnace == null) { - return null; - } - - return furnace; - } - - @Nullable - private Player getPlayerFromFurnace(Furnace furnace) { - List metadata = furnace.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/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index 90e16ea7b..697e91439 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -46,6 +46,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.SmeltingTracker; import com.gmail.nossr50.util.upgrade.UpgradeManager; import com.gmail.nossr50.worldguard.WorldGuardManager; import com.google.common.base.Charsets; @@ -78,6 +79,7 @@ public class mcMMO extends JavaPlugin { private static UpgradeManager upgradeManager; private static MaterialMapStore materialMapStore; private static PlayerLevelUtils playerLevelUtils; + private static SmeltingTracker smeltingTracker; /* Blacklist */ private static WorldBlacklist worldBlacklist; @@ -116,7 +118,6 @@ public class mcMMO extends JavaPlugin { 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"; @@ -266,6 +267,9 @@ public class mcMMO extends JavaPlugin { //Init the blacklist worldBlacklist = new WorldBlacklist(this); + + //Init smelting tracker + smeltingTracker = new SmeltingTracker(); } public static PlayerLevelUtils getPlayerLevelUtils() { @@ -670,4 +674,8 @@ public class mcMMO extends JavaPlugin { public static PlatformManager getPlatformManager() { return platformManager; } + + public static SmeltingTracker getSmeltingTracker() { + return smeltingTracker; + } } diff --git a/src/main/java/com/gmail/nossr50/runnables/skills/FurnaceCleanupTask.java b/src/main/java/com/gmail/nossr50/runnables/skills/FurnaceCleanupTask.java new file mode 100644 index 000000000..341a51ac4 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/runnables/skills/FurnaceCleanupTask.java @@ -0,0 +1,22 @@ +package com.gmail.nossr50.runnables.skills; + +import com.gmail.nossr50.mcMMO; +import org.bukkit.block.Furnace; +import org.bukkit.scheduler.BukkitRunnable; + +public class FurnaceCleanupTask extends BukkitRunnable { + + private final Furnace furnace; + + public FurnaceCleanupTask(Furnace furnace) { + this.furnace = furnace; + } + + @Override + public void run() { + if(furnace != null && furnace.getInventory().getResult() == null) { + //Furnace is empty so stop tracking it + mcMMO.getSmeltingTracker().untrackFurnace(furnace); + } + } +} 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..e196eb4ef 100644 --- a/src/main/java/com/gmail/nossr50/skills/smelting/Smelting.java +++ b/src/main/java/com/gmail/nossr50/skills/smelting/Smelting.java @@ -4,19 +4,25 @@ 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.EventUtils; +import com.gmail.nossr50.util.Permissions; +import com.gmail.nossr50.util.player.UserManager; import com.gmail.nossr50.util.skills.RankUtils; +import org.bukkit.Bukkit; +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.bukkit.inventory.ItemStack; +import org.bukkit.metadata.MetadataValue; +import org.jetbrains.annotations.Nullable; + +import java.util.HashMap; +import java.util.List; public class Smelting { - public static int getRank(Player player) - { - return RankUtils.getRank(player, SubSkillType.SMELTING_UNDERSTANDING_THE_ART); - } - - //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/util/skills/SmeltingTracker.java b/src/main/java/com/gmail/nossr50/util/skills/SmeltingTracker.java new file mode 100644 index 000000000..eb8fa5261 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/util/skills/SmeltingTracker.java @@ -0,0 +1,65 @@ +package com.gmail.nossr50.util.skills; + +import com.gmail.nossr50.datatypes.skills.PrimarySkillType; +import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.skills.smelting.Smelting; +import com.gmail.nossr50.util.EventUtils; +import com.gmail.nossr50.util.Permissions; +import org.bukkit.Bukkit; +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.HashMap; + +public class SmeltingTracker { + + private HashMap furnaceOwners; + + public SmeltingTracker() { + furnaceOwners = new HashMap<>(); + } + + private void changeFurnaceOwnership(Furnace furnace, Player player) { + furnaceOwners.put(furnace, player); + } + + @Nullable + public Furnace getFurnaceFromInventory(Inventory inventory) { + if (!(inventory instanceof FurnaceInventory)) { + return null; + } + + return (Furnace) inventory.getHolder(); + } + + @Nullable + public OfflinePlayer getPlayerFromFurnace(Furnace furnace) { + return furnaceOwners.get(furnace); + } + + public boolean isFurnaceOwned(Furnace furnace) { + return furnaceOwners.get(furnace) != null; + } + + public void removeFurnaceOwner(Furnace furnace) { + furnaceOwners.remove(furnace); + } + + public void processFurnaceOwnership(Furnace furnace, Player player) { + if(!Permissions.skillEnabled(player, PrimarySkillType.SMELTING)) + return; + + //If the player is legally allowed to break the block then they can steal ownership + if(EventUtils.simulateBlockBreak(furnace.getBlock(), player, true)) { + changeFurnaceOwnership(furnace, player); + } + } + + public void untrackFurnace(Furnace furnace) { + furnaceOwners.remove(furnace); + } +} From 2910240942ea1af500cb8880ea5acf821f86e400 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 23 Jul 2020 21:16:58 -0700 Subject: [PATCH 092/662] 2.1.134 --- Changelog.txt | 4 +++- pom.xml | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 9aa772a11..b200d4846 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -2,7 +2,8 @@ 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 - Minor code cleanup + 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 @@ -15,6 +16,7 @@ Version 2.1.134 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. diff --git a/pom.xml b/pom.xml index cea247bd0..01eac409c 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.134-SNAPSHOT + 2.1.134 mcMMO https://github.com/mcMMO-Dev/mcMMO From 054c023330b6ced49090ac17ab16cebb54aea547 Mon Sep 17 00:00:00 2001 From: Ineusia Date: Sat, 25 Jul 2020 10:36:34 -0500 Subject: [PATCH 093/662] Handle Fishing Event even if FishingExploitFix is set to false --- .../gmail/nossr50/listeners/PlayerListener.java | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java index 436e6cbc4..dc6423a57 100644 --- a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java @@ -396,11 +396,9 @@ public class PlayerListener implements Listener { } return; case CAUGHT_FISH: - if(ExperienceConfig.getInstance().isFishingExploitingPrevented()) - { - if(caught instanceof Item) { - if(fishingManager.isExploitingFishing(event.getHook().getLocation().toVector())) - { + if(caught instanceof Item) { + 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; @@ -408,10 +406,10 @@ public class PlayerListener implements Listener { return; } - - fishingManager.handleFishing((Item) caught); - fishingManager.setFishingTarget(); } + + fishingManager.handleFishing((Item) caught); + fishingManager.setFishingTarget(); } return; case CAUGHT_ENTITY: From 3ae1b5e987c1657acf5631464bd3195753605760 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sat, 25 Jul 2020 08:37:19 -0700 Subject: [PATCH 094/662] Don't simulate block breaks when assigning furnace ownership --- Changelog.txt | 3 +++ pom.xml | 2 +- .../java/com/gmail/nossr50/util/skills/SmeltingTracker.java | 5 +---- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index b200d4846..8444ee66b 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,6 @@ +Version 2.1.135 + Furnaces no longer simulate block break checks when assigning ownership as it caused some unwanted plugin conflicts + 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 diff --git a/pom.xml b/pom.xml index 01eac409c..51f339764 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.134 + 2.1.135-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO diff --git a/src/main/java/com/gmail/nossr50/util/skills/SmeltingTracker.java b/src/main/java/com/gmail/nossr50/util/skills/SmeltingTracker.java index eb8fa5261..6fa99bed8 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/SmeltingTracker.java +++ b/src/main/java/com/gmail/nossr50/util/skills/SmeltingTracker.java @@ -53,10 +53,7 @@ public class SmeltingTracker { if(!Permissions.skillEnabled(player, PrimarySkillType.SMELTING)) return; - //If the player is legally allowed to break the block then they can steal ownership - if(EventUtils.simulateBlockBreak(furnace.getBlock(), player, true)) { - changeFurnaceOwnership(furnace, player); - } + changeFurnaceOwnership(furnace, player); } public void untrackFurnace(Furnace furnace) { From 36af6d247843a5edde38d4d8d70330442dc3a215 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sat, 25 Jul 2020 08:40:20 -0700 Subject: [PATCH 095/662] update changes --- Changelog.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/Changelog.txt b/Changelog.txt index 8444ee66b..76d7a784c 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,4 +1,5 @@ Version 2.1.135 + Fixed an issue where Fishing would break if exploit protection was turned off for Fishing (Thanks Ineusia) Furnaces no longer simulate block break checks when assigning ownership as it caused some unwanted plugin conflicts Version 2.1.134 From 5298472c902cc8259eebd4805fc64df1602957f0 Mon Sep 17 00:00:00 2001 From: Ineusia Date: Sat, 25 Jul 2020 11:10:01 -0500 Subject: [PATCH 096/662] Add option to disable other-player ability notifications --- src/main/java/com/gmail/nossr50/config/AdvancedConfig.java | 5 +++++ .../com/gmail/nossr50/datatypes/player/McMMOPlayer.java | 4 +++- .../gmail/nossr50/runnables/skills/AbilityDisableTask.java | 6 ++++-- src/main/resources/advanced.yml | 3 +++ 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java b/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java index 16cb6f915..615488646 100644 --- a/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java +++ b/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java @@ -718,6 +718,11 @@ public class AdvancedConfig extends AutoUpdateConfigLoader { return config.getBoolean("Feedback.Events.XP.SendTitles", true); } + public boolean sendAbilityNotificationToOtherPlayers() + { + return config.getBoolean("Feedback.Events.AbilityActivation.SendNotificationToOtherPlayers", true); + } + /* * JSON Style Settings */ 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 3f469a0b3..7b3504265 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java +++ b/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java @@ -907,7 +907,9 @@ public class McMMOPlayer { //player.sendMessage(ability.getAbilityOn()); } - SkillUtils.sendSkillMessage(player, NotificationType.SUPER_ABILITY_ALERT_OTHERS, ability.getAbilityPlayer()); + if (AdvancedConfig.getInstance().sendAbilityNotificationToOtherPlayers()) { + SkillUtils.sendSkillMessage(player, NotificationType.SUPER_ABILITY_ALERT_OTHERS, ability.getAbilityPlayer()); + } //Sounds SoundManager.worldSendSound(player.getWorld(), player.getLocation(), SoundType.ABILITY_ACTIVATED_GENERIC); 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 53f05f594..76dd5a401 100644 --- a/src/main/java/com/gmail/nossr50/runnables/skills/AbilityDisableTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/skills/AbilityDisableTask.java @@ -1,5 +1,6 @@ package com.gmail.nossr50.runnables.skills; +import com.gmail.nossr50.config.AdvancedConfig; import com.gmail.nossr50.config.Config; import com.gmail.nossr50.datatypes.interactions.NotificationType; import com.gmail.nossr50.datatypes.player.McMMOPlayer; @@ -61,8 +62,9 @@ public class AbilityDisableTask extends BukkitRunnable { NotificationManager.sendPlayerInformation(player, NotificationType.ABILITY_OFF, ability.getAbilityOff()); } - - SkillUtils.sendSkillMessage(player, NotificationType.SUPER_ABILITY_ALERT_OTHERS, ability.getAbilityPlayerOff()); + if (AdvancedConfig.getInstance().sendAbilityNotificationToOtherPlayers()) { + 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); } diff --git a/src/main/resources/advanced.yml b/src/main/resources/advanced.yml index 6648a3dc7..211ac13cd 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: From 353fb80957b2b6a1d6a7cc361c628413e3085433 Mon Sep 17 00:00:00 2001 From: Ineusia Date: Sat, 25 Jul 2020 12:13:54 -0500 Subject: [PATCH 097/662] Use localized names for SuperAbility names --- .../commands/player/MccooldownCommand.java | 4 +-- .../datatypes/skills/SuperAbilityType.java | 33 ++++++++++++++----- .../util/scoreboards/ScoreboardManager.java | 10 +++--- 3 files changed, 31 insertions(+), 16 deletions(-) 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 7cf6d7589..74011a39c 100644 --- a/src/main/java/com/gmail/nossr50/commands/player/MccooldownCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/player/MccooldownCommand.java @@ -56,9 +56,9 @@ public class MccooldownCommand implements TabExecutor { int seconds = mcMMOPlayer.calculateTimeRemaining(ability); if (seconds <= 0) { - player.sendMessage(LocaleLoader.getString("Commands.Cooldowns.Row.Y", ability.getName())); + player.sendMessage(LocaleLoader.getString("Commands.Cooldowns.Row.Y", ability.getLocalizedName())); } else { - player.sendMessage(LocaleLoader.getString("Commands.Cooldowns.Row.N", ability.getName(), seconds)); + player.sendMessage(LocaleLoader.getString("Commands.Cooldowns.Row.N", ability.getLocalizedName(), seconds)); } } 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 cb4b0b10e..66c4957a9 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/skills/SuperAbilityType.java +++ b/src/main/java/com/gmail/nossr50/datatypes/skills/SuperAbilityType.java @@ -1,6 +1,7 @@ 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; @@ -15,49 +16,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 +75,8 @@ public enum SuperAbilityType { null, "Mining.Blast.Other.On", "Mining.Blast.Refresh", - null), + null, + "Mining.SubSkill.BlastMining.Name"), ; /* @@ -91,13 +100,15 @@ public enum SuperAbilityType { private final String abilityRefresh; private final String abilityPlayerOff; private SubSkillType subSkillTypeDefinition; + private final String localizedName; - 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() { @@ -132,6 +143,10 @@ public enum SuperAbilityType { return StringUtils.getPrettyAbilityString(this); } + public String getLocalizedName() { + return LocaleLoader.getString(localizedName); + } + @Override public String toString() { String baseString = name(); 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 7e5aa65b5..0bce7f5b5 100644 --- a/src/main/java/com/gmail/nossr50/util/scoreboards/ScoreboardManager.java +++ b/src/main/java/com/gmail/nossr50/util/scoreboards/ScoreboardManager.java @@ -90,10 +90,10 @@ public class ScoreboardManager { skillLabelBuilder.put(type, getShortenedName(colors.get(i) + type.getName(), false)); if (type.getAbility() != null) { - abilityLabelBuilder.put(type.getAbility(), getShortenedName(colors.get(i) + type.getAbility().getName())); + abilityLabelBuilder.put(type.getAbility(), getShortenedName(colors.get(i) + type.getAbility().getLocalizedName())); if (type == PrimarySkillType.MINING) { - abilityLabelBuilder.put(SuperAbilityType.BLAST_MINING, getShortenedName(colors.get(i) + SuperAbilityType.BLAST_MINING.getName())); + abilityLabelBuilder.put(SuperAbilityType.BLAST_MINING, getShortenedName(colors.get(i) + SuperAbilityType.BLAST_MINING.getLocalizedName())); } } @@ -112,17 +112,17 @@ public class ScoreboardManager { skillLabelBuilder.put(type, getShortenedName(ChatColor.GREEN + type.getName())); if (type.getAbility() != null) { - abilityLabelBuilder.put(type.getAbility(), formatAbility(type.getAbility().getName())); + abilityLabelBuilder.put(type.getAbility(), formatAbility(type.getAbility().getLocalizedName())); if (type == PrimarySkillType.MINING) { - abilityLabelBuilder.put(SuperAbilityType.BLAST_MINING, formatAbility(SuperAbilityType.BLAST_MINING.getName())); + 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(); From a28d1cd537caddb07a27ba2b7dd0ed7a37b39a48 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sat, 25 Jul 2020 14:27:31 -0700 Subject: [PATCH 098/662] 2.1.135 --- Changelog.txt | 4 +++- pom.xml | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 76d7a784c..81c782d36 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,6 +1,8 @@ Version 2.1.135 - Fixed an issue where Fishing would break if exploit protection was turned off for Fishing (Thanks Ineusia) 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 diff --git a/pom.xml b/pom.xml index 51f339764..e61fe114b 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.135-SNAPSHOT + 2.1.135 mcMMO https://github.com/mcMMO-Dev/mcMMO From c97dc4181dad1570abd1e069f00ba33ad74e19ce Mon Sep 17 00:00:00 2001 From: srbedrock <51332006+SrBedrock@users.noreply.github.com> Date: Sun, 26 Jul 2020 22:01:30 -0300 Subject: [PATCH 099/662] Update CommandRegistrationManager.java --- .../nossr50/util/commands/CommandRegistrationManager.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 125c6abba..d21ad7d5c 100644 --- a/src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java +++ b/src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java @@ -432,8 +432,8 @@ public final class CommandRegistrationManager { 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.setUsage(LocaleLoader.getString("Commands.Usage.1", "mmoxpbar", "")); + command.setUsage(command.getUsage() +"\n" + LocaleLoader.getString("Commands.Usage.2", "mmoxpbar", "", "")); command.setExecutor(new XPBarCommand()); } From 2eb924d433a82c1de997e83f9f3a6f417157b90c Mon Sep 17 00:00:00 2001 From: srbedrock <51332006+SrBedrock@users.noreply.github.com> Date: Sun, 26 Jul 2020 22:04:43 -0300 Subject: [PATCH 100/662] Update CommandRegistrationManager.java --- .../gmail/nossr50/util/commands/CommandRegistrationManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 d21ad7d5c..81f6c34bc 100644 --- a/src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java +++ b/src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java @@ -433,7 +433,7 @@ public final class CommandRegistrationManager { 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.setUsage(command.getUsage() +"\n" + LocaleLoader.getString("Commands.Usage.2", "mmoxpbar", "", "")); command.setExecutor(new XPBarCommand()); } From 5d294d6dc3040baa00638e44c67d787513cd82d0 Mon Sep 17 00:00:00 2001 From: kn-km <974787396@qq.com> Date: Mon, 27 Jul 2020 22:55:44 +0800 Subject: [PATCH 101/662] Fix #4234 --- .../java/com/gmail/nossr50/skills/salvage/SalvageManager.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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..cb4374b5a 100644 --- a/src/main/java/com/gmail/nossr50/skills/salvage/SalvageManager.java +++ b/src/main/java/com/gmail/nossr50/skills/salvage/SalvageManager.java @@ -100,7 +100,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(); @@ -140,6 +139,8 @@ public class SalvageManager extends SkillManager { return; } + player.getInventory().setItemInMainHand(new ItemStack(Material.AIR)); + Location anvilLoc = location.clone(); Location playerLoc = player.getLocation().clone(); double distance = anvilLoc.distance(playerLoc); From ed9521d4a048dfb7b7dc169802cfbc0b9d8247be Mon Sep 17 00:00:00 2001 From: kn-km <974787396@qq.com> Date: Mon, 27 Jul 2020 23:18:55 +0800 Subject: [PATCH 102/662] Fix #4234 --- .../java/com/gmail/nossr50/skills/repair/RepairManager.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) 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 ab4a98fbe..910c3f5bf 100644 --- a/src/main/java/com/gmail/nossr50/skills/repair/RepairManager.java +++ b/src/main/java/com/gmail/nossr50/skills/repair/RepairManager.java @@ -128,6 +128,9 @@ 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(); + // Call event if (EventUtils.callRepairCheckEvent(player, (short) (startDurability - newDurability), toRemove, item).isCancelled()) { return; @@ -139,7 +142,6 @@ public class RepairManager extends SkillManager { } // Remove the item - toRemove = inventory.getItem(inventory.first(repairMaterial)).clone(); toRemove.setAmount(1); inventory.removeItem(toRemove); @@ -393,4 +395,4 @@ public class RepairManager extends SkillManager { public void actualizeLastAnvilUse() { lastClick = (int) (System.currentTimeMillis() / Misc.TIME_CONVERSION_FACTOR); } -} \ No newline at end of file +} From 567a5461e11e971641878c45edfeb71688e339f5 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 27 Jul 2020 21:19:25 -0700 Subject: [PATCH 103/662] Add some more mmodebug related to furnaces --- .../nossr50/util/skills/SmeltingTracker.java | 37 ++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/gmail/nossr50/util/skills/SmeltingTracker.java b/src/main/java/com/gmail/nossr50/util/skills/SmeltingTracker.java index 6fa99bed8..761e8714e 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/SmeltingTracker.java +++ b/src/main/java/com/gmail/nossr50/util/skills/SmeltingTracker.java @@ -1,11 +1,14 @@ 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.skills.smelting.Smelting; import com.gmail.nossr50.util.EventUtils; import com.gmail.nossr50.util.Permissions; +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; @@ -17,13 +20,45 @@ import java.util.HashMap; public class SmeltingTracker { - private HashMap furnaceOwners; + private final HashMap furnaceOwners; public SmeltingTracker() { furnaceOwners = new HashMap<>(); } private void changeFurnaceOwnership(Furnace furnace, Player player) { + + McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); + + /* + Debug output + */ + if(mcMMOPlayer != null) { + if(mcMMOPlayer.isDebugMode()) { + mcMMOPlayer.getPlayer().sendMessage("Furnace ownership " + + ChatColor.GREEN +"gained " + ChatColor.RESET + + "at location: " + furnace.getLocation().toString()); + } + + if(furnaceOwners.get(furnace) != null) { + OfflinePlayer furnaceOwner = furnaceOwners.get(furnace); + + if(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()); + } + } + } + } + } + + + furnaceOwners.put(furnace, player); } From 4169dceca8681db5cd7bb9de4059ad1b8a1faa97 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 27 Jul 2020 21:20:03 -0700 Subject: [PATCH 104/662] debug tweak for furnaces --- .../nossr50/util/skills/SmeltingTracker.java | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/util/skills/SmeltingTracker.java b/src/main/java/com/gmail/nossr50/util/skills/SmeltingTracker.java index 761e8714e..709b9be8e 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/SmeltingTracker.java +++ b/src/main/java/com/gmail/nossr50/util/skills/SmeltingTracker.java @@ -40,25 +40,25 @@ public class SmeltingTracker { "at location: " + furnace.getLocation().toString()); } - if(furnaceOwners.get(furnace) != null) { - OfflinePlayer furnaceOwner = furnaceOwners.get(furnace); + } - if(furnaceOwner.isOnline()) { - McMMOPlayer furnaceOwnerProfile = UserManager.getPlayer(furnaceOwner.getPlayer()); + if(furnaceOwners.get(furnace) != null) { + OfflinePlayer furnaceOwner = furnaceOwners.get(furnace); - if(furnaceOwnerProfile != null) { - if(furnaceOwnerProfile.isDebugMode()) { - furnaceOwnerProfile.getPlayer().sendMessage("Furnace ownership " + - ChatColor.RED + "lost " + ChatColor.RESET + - "at location: " + furnace.getLocation().toString()); - } + if(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()); } } } } - furnaceOwners.put(furnace, player); } From 8e3d2035942af5369a5070c99465926a3345921e Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 27 Jul 2020 21:34:47 -0700 Subject: [PATCH 105/662] only cleanup furnaces without a job --- .../runnables/skills/FurnaceCleanupTask.java | 3 ++- .../nossr50/util/skills/SmeltingTracker.java | 18 +++++++++++------- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/runnables/skills/FurnaceCleanupTask.java b/src/main/java/com/gmail/nossr50/runnables/skills/FurnaceCleanupTask.java index 341a51ac4..873a6f507 100644 --- a/src/main/java/com/gmail/nossr50/runnables/skills/FurnaceCleanupTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/skills/FurnaceCleanupTask.java @@ -14,7 +14,8 @@ public class FurnaceCleanupTask extends BukkitRunnable { @Override public void run() { - if(furnace != null && furnace.getInventory().getResult() == null) { + if(furnace != null + && furnace.getInventory().getSmelting() == null) { //Furnace is empty so stop tracking it mcMMO.getSmeltingTracker().untrackFurnace(furnace); } diff --git a/src/main/java/com/gmail/nossr50/util/skills/SmeltingTracker.java b/src/main/java/com/gmail/nossr50/util/skills/SmeltingTracker.java index 709b9be8e..c0cd97773 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/SmeltingTracker.java +++ b/src/main/java/com/gmail/nossr50/util/skills/SmeltingTracker.java @@ -33,6 +33,14 @@ public class SmeltingTracker { /* Debug output */ + printOwnershipGainDebug(furnace, mcMMOPlayer); + + printOwnershipLossDebug(furnace); + + furnaceOwners.put(furnace, player); + } + + private void printOwnershipGainDebug(Furnace furnace, McMMOPlayer mcMMOPlayer) { if(mcMMOPlayer != null) { if(mcMMOPlayer.isDebugMode()) { mcMMOPlayer.getPlayer().sendMessage("Furnace ownership " + @@ -41,7 +49,9 @@ public class SmeltingTracker { } } + } + private void printOwnershipLossDebug(Furnace furnace) { if(furnaceOwners.get(furnace) != null) { OfflinePlayer furnaceOwner = furnaceOwners.get(furnace); @@ -57,9 +67,6 @@ public class SmeltingTracker { } } } - - - furnaceOwners.put(furnace, player); } @Nullable @@ -80,10 +87,6 @@ public class SmeltingTracker { return furnaceOwners.get(furnace) != null; } - public void removeFurnaceOwner(Furnace furnace) { - furnaceOwners.remove(furnace); - } - public void processFurnaceOwnership(Furnace furnace, Player player) { if(!Permissions.skillEnabled(player, PrimarySkillType.SMELTING)) return; @@ -92,6 +95,7 @@ public class SmeltingTracker { } public void untrackFurnace(Furnace furnace) { + printOwnershipLossDebug(furnace); furnaceOwners.remove(furnace); } } From 274a41f5309a297ca8052cb1df6c418da3dcc0e6 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 27 Jul 2020 21:39:26 -0700 Subject: [PATCH 106/662] update changelog --- Changelog.txt | 3 +++ pom.xml | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index 81c782d36..f35b40083 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,6 @@ +Version 2.1.136 + Furnace ownership was made more reliable + 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) diff --git a/pom.xml b/pom.xml index e61fe114b..2aaffa568 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.135 + 2.1.136-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO From 38122d8f1705351477419b4ddd8e9ef2e1852362 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 28 Jul 2020 21:56:51 -0700 Subject: [PATCH 107/662] Furnace ownership tweaks --- Changelog.txt | 3 +- .../nossr50/datatypes/meta/UUIDMeta.java | 20 +++++++ .../nossr50/listeners/BlockListener.java | 5 +- .../nossr50/listeners/InventoryListener.java | 7 +-- .../runnables/skills/FurnaceCleanupTask.java | 23 ------- .../nossr50/skills/smelting/Smelting.java | 16 ----- .../util/compat/CompatibilityManager.java | 40 +++++++------ .../util/compat/CompatibilityType.java | 3 +- .../layers/AbstractCompatibilityLayer.java | 7 --- .../layers/AbstractNMSCompatibilityLayer.java | 30 ++++++++++ ...rAttackCooldownExploitPreventionLayer.java | 2 +- ...rAttackCooldownExploitPreventionLayer.java | 5 +- .../PlayerAttackCooldownMethods.java | 2 +- .../AbstractPersistentDataLayer.java | 19 ++++++ .../SpigotPersistentDataLayer.java | 60 +++++++++++++++++++ .../SpigotTemporaryDataLayer.java | 44 ++++++++++++++ .../nossr50/util/skills/SmeltingTracker.java | 56 ++++++++--------- 17 files changed, 234 insertions(+), 108 deletions(-) create mode 100644 src/main/java/com/gmail/nossr50/datatypes/meta/UUIDMeta.java delete mode 100644 src/main/java/com/gmail/nossr50/runnables/skills/FurnaceCleanupTask.java create mode 100644 src/main/java/com/gmail/nossr50/util/compat/layers/AbstractNMSCompatibilityLayer.java rename src/main/java/com/gmail/nossr50/util/compat/layers/{ => attackcooldown}/DummyPlayerAttackCooldownExploitPreventionLayer.java (93%) rename src/main/java/com/gmail/nossr50/util/compat/layers/{ => attackcooldown}/PlayerAttackCooldownExploitPreventionLayer.java (97%) rename src/main/java/com/gmail/nossr50/util/compat/layers/{ => attackcooldown}/PlayerAttackCooldownMethods.java (92%) create mode 100644 src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/AbstractPersistentDataLayer.java create mode 100644 src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer.java create mode 100644 src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotTemporaryDataLayer.java diff --git a/Changelog.txt b/Changelog.txt index f35b40083..9672cf99b 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,5 +1,6 @@ Version 2.1.136 - Furnace ownership was made more reliable + Furnace ownership is no longer lost when the furnace stops doing a job + Furnaces remember owners between restarts (requires MC 1.14 or higher) Version 2.1.135 Furnaces no longer simulate block break checks when assigning ownership as it caused some unwanted plugin conflicts 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/listeners/BlockListener.java b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java index 6fee064e9..a4a7258b3 100644 --- a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java @@ -18,7 +18,6 @@ import com.gmail.nossr50.skills.herbalism.HerbalismManager; 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.smelting.Smelting; import com.gmail.nossr50.skills.woodcutting.WoodcuttingManager; import com.gmail.nossr50.util.BlockUtils; import com.gmail.nossr50.util.EventUtils; @@ -39,10 +38,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; @@ -666,7 +663,7 @@ public class BlockListener implements Listener { if(mcMMO.getSmeltingTracker().isFurnaceOwned(furnace)) { player.sendMessage("[mcMMO DEBUG] This furnace has a registered owner"); - OfflinePlayer furnacePlayer = mcMMO.getSmeltingTracker().getPlayerFromFurnace(furnace); + OfflinePlayer furnacePlayer = mcMMO.getSmeltingTracker().getFurnaceOwner(furnace); if(furnacePlayer != null) { player.sendMessage("[mcMMO DEBUG] This furnace is owned by player "+furnacePlayer.getName()); diff --git a/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java b/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java index 196131717..0052f1644 100644 --- a/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java @@ -8,7 +8,6 @@ import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.events.fake.FakeBrewEvent; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.runnables.player.PlayerUpdateInventoryTask; -import com.gmail.nossr50.runnables.skills.FurnaceCleanupTask; import com.gmail.nossr50.skills.alchemy.Alchemy; import com.gmail.nossr50.skills.alchemy.AlchemyPotionBrewer; import com.gmail.nossr50.util.ItemUtils; @@ -56,7 +55,7 @@ public class InventoryListener implements Listener { Furnace furnace = (Furnace) furnaceState; - OfflinePlayer offlinePlayer = mcMMO.getSmeltingTracker().getPlayerFromFurnace(furnace); + OfflinePlayer offlinePlayer = mcMMO.getSmeltingTracker().getFurnaceOwner(furnace); if(offlinePlayer != null && offlinePlayer.isOnline()) { @@ -94,7 +93,7 @@ public class InventoryListener implements Listener { if(blockState instanceof Furnace) { Furnace furnace = (Furnace) blockState; - OfflinePlayer offlinePlayer = mcMMO.getSmeltingTracker().getPlayerFromFurnace(furnace); + OfflinePlayer offlinePlayer = mcMMO.getSmeltingTracker().getFurnaceOwner(furnace); if(offlinePlayer != null) { @@ -105,8 +104,6 @@ public class InventoryListener implements Listener { event.setResult(offlineProfile.getSmeltingManager().smeltProcessing(smelting, event.getResult())); } } - - new FurnaceCleanupTask(furnace).runTaskLater(mcMMO.p, 1); } } diff --git a/src/main/java/com/gmail/nossr50/runnables/skills/FurnaceCleanupTask.java b/src/main/java/com/gmail/nossr50/runnables/skills/FurnaceCleanupTask.java deleted file mode 100644 index 873a6f507..000000000 --- a/src/main/java/com/gmail/nossr50/runnables/skills/FurnaceCleanupTask.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.gmail.nossr50.runnables.skills; - -import com.gmail.nossr50.mcMMO; -import org.bukkit.block.Furnace; -import org.bukkit.scheduler.BukkitRunnable; - -public class FurnaceCleanupTask extends BukkitRunnable { - - private final Furnace furnace; - - public FurnaceCleanupTask(Furnace furnace) { - this.furnace = furnace; - } - - @Override - public void run() { - if(furnace != null - && furnace.getInventory().getSmelting() == null) { - //Furnace is empty so stop tracking it - mcMMO.getSmeltingTracker().untrackFurnace(furnace); - } - } -} 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 e196eb4ef..c6bbccac1 100644 --- a/src/main/java/com/gmail/nossr50/skills/smelting/Smelting.java +++ b/src/main/java/com/gmail/nossr50/skills/smelting/Smelting.java @@ -2,24 +2,8 @@ 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.EventUtils; -import com.gmail.nossr50.util.Permissions; -import com.gmail.nossr50.util.player.UserManager; -import com.gmail.nossr50.util.skills.RankUtils; -import org.bukkit.Bukkit; -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.bukkit.inventory.ItemStack; -import org.bukkit.metadata.MetadataValue; -import org.jetbrains.annotations.Nullable; - -import java.util.HashMap; -import java.util.List; public class Smelting { 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 67eededab..d601f2d99 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/CompatibilityManager.java +++ b/src/main/java/com/gmail/nossr50/util/compat/CompatibilityManager.java @@ -3,7 +3,10 @@ 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.attackcooldown.PlayerAttackCooldownExploitPreventionLayer; +import com.gmail.nossr50.util.compat.layers.persistentdata.AbstractPersistentDataLayer; +import com.gmail.nossr50.util.compat.layers.persistentdata.SpigotPersistentDataLayer; +import com.gmail.nossr50.util.compat.layers.persistentdata.SpigotTemporaryDataLayer; import com.gmail.nossr50.util.nms.NMSVersion; import com.gmail.nossr50.util.platform.MinecraftGameVersion; import org.bukkit.command.CommandSender; @@ -24,6 +27,7 @@ public class CompatibilityManager { /* Compatibility Layers */ private PlayerAttackCooldownExploitPreventionLayer playerAttackCooldownExploitPreventionLayer; + private AbstractPersistentDataLayer persistentDataLayer; public CompatibilityManager(MinecraftGameVersion minecraftGameVersion) { mcMMO.p.getLogger().info("Loading compatibility layers..."); @@ -42,6 +46,10 @@ public class CompatibilityManager { supportedLayers = new HashMap<>(); //Init map for(CompatibilityType compatibilityType : CompatibilityType.values()) { + //TODO: Remove later + if(compatibilityType == CompatibilityType.PLAYER_ATTACK_COOLDOWN_EXPLOIT_PREVENTION) + continue; + supportedLayers.put(compatibilityType, false); //All layers are set to false when initialized } } @@ -51,26 +59,21 @@ public class CompatibilityManager { * For any unsupported layers, load a dummy layer */ private void initCompatibilityLayers() { - isFullyCompatibleServerSoftware = true; + initPersistentDataLayer(); -// 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); -// -// //Mark as operational -// if(playerAttackCooldownExploitPreventionLayer.noErrorsOnInitialize()) { -// supportedLayers.put(CompatibilityType.PLAYER_ATTACK_COOLDOWN_EXPLOIT_PREVENTION, true); -// } -// } + isFullyCompatibleServerSoftware = true; } - private void loadDummyCompatibilityLayers() { + private void initPersistentDataLayer() { + if(minecraftGameVersion.getMinorVersion().asInt() >= 14 || minecraftGameVersion.getMajorVersion().asInt() >= 2) { + persistentDataLayer = new SpigotPersistentDataLayer(); + } else { + + persistentDataLayer = new SpigotTemporaryDataLayer(); + } + + supportedLayers.put(CompatibilityType.PERSISTENT_DATA, true); } //TODO: move to text manager @@ -128,4 +131,7 @@ public class CompatibilityManager { return playerAttackCooldownExploitPreventionLayer; } + public AbstractPersistentDataLayer getPersistentDataLayer() { + return persistentDataLayer; + } } 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..3304982c7 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,6 @@ package com.gmail.nossr50.util.compat; public enum CompatibilityType { - PLAYER_ATTACK_COOLDOWN_EXPLOIT_PREVENTION + PLAYER_ATTACK_COOLDOWN_EXPLOIT_PREVENTION, + PERSISTENT_DATA } 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/attackcooldown/DummyPlayerAttackCooldownExploitPreventionLayer.java similarity index 93% rename from src/main/java/com/gmail/nossr50/util/compat/layers/DummyPlayerAttackCooldownExploitPreventionLayer.java rename to src/main/java/com/gmail/nossr50/util/compat/layers/attackcooldown/DummyPlayerAttackCooldownExploitPreventionLayer.java index 79b67138f..39fe4d73e 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/layers/DummyPlayerAttackCooldownExploitPreventionLayer.java +++ b/src/main/java/com/gmail/nossr50/util/compat/layers/attackcooldown/DummyPlayerAttackCooldownExploitPreventionLayer.java @@ -1,4 +1,4 @@ -package com.gmail.nossr50.util.compat.layers; +package com.gmail.nossr50.util.compat.layers.attackcooldown; import com.gmail.nossr50.util.nms.NMSVersion; import org.bukkit.entity.Player; diff --git a/src/main/java/com/gmail/nossr50/util/compat/layers/PlayerAttackCooldownExploitPreventionLayer.java b/src/main/java/com/gmail/nossr50/util/compat/layers/attackcooldown/PlayerAttackCooldownExploitPreventionLayer.java similarity index 97% rename from src/main/java/com/gmail/nossr50/util/compat/layers/PlayerAttackCooldownExploitPreventionLayer.java rename to src/main/java/com/gmail/nossr50/util/compat/layers/attackcooldown/PlayerAttackCooldownExploitPreventionLayer.java index 46769536f..4bcfb6303 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/layers/PlayerAttackCooldownExploitPreventionLayer.java +++ b/src/main/java/com/gmail/nossr50/util/compat/layers/attackcooldown/PlayerAttackCooldownExploitPreventionLayer.java @@ -1,6 +1,7 @@ -package com.gmail.nossr50.util.compat.layers; +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; @@ -16,7 +17,7 @@ import java.lang.reflect.Method; * In 2.2 we are switching to modules and that will clean things up significantly * */ -public class PlayerAttackCooldownExploitPreventionLayer extends AbstractCompatibilityLayer implements PlayerAttackCooldownMethods{ +public class PlayerAttackCooldownExploitPreventionLayer extends AbstractNMSCompatibilityLayer implements PlayerAttackCooldownMethods{ private final String cbNMSVersionPath; diff --git a/src/main/java/com/gmail/nossr50/util/compat/layers/PlayerAttackCooldownMethods.java b/src/main/java/com/gmail/nossr50/util/compat/layers/attackcooldown/PlayerAttackCooldownMethods.java similarity index 92% rename from src/main/java/com/gmail/nossr50/util/compat/layers/PlayerAttackCooldownMethods.java rename to src/main/java/com/gmail/nossr50/util/compat/layers/attackcooldown/PlayerAttackCooldownMethods.java index ae7cd9ae8..b5372987f 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/layers/PlayerAttackCooldownMethods.java +++ b/src/main/java/com/gmail/nossr50/util/compat/layers/attackcooldown/PlayerAttackCooldownMethods.java @@ -1,4 +1,4 @@ -package com.gmail.nossr50.util.compat.layers; +package com.gmail.nossr50.util.compat.layers.attackcooldown; import org.bukkit.entity.Player; diff --git a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/AbstractPersistentDataLayer.java b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/AbstractPersistentDataLayer.java new file mode 100644 index 000000000..0cd936c2d --- /dev/null +++ b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/AbstractPersistentDataLayer.java @@ -0,0 +1,19 @@ +package com.gmail.nossr50.util.compat.layers.persistentdata; + +import com.gmail.nossr50.util.compat.layers.AbstractCompatibilityLayer; +import org.bukkit.block.Furnace; +import org.jetbrains.annotations.Nullable; + +import java.util.UUID; + +public abstract class AbstractPersistentDataLayer extends AbstractCompatibilityLayer { + + public AbstractPersistentDataLayer() { + initializeLayer(); + } + + public abstract @Nullable UUID getFurnaceOwner(Furnace furnace); + + public abstract void setFurnaceOwner(Furnace furnace, UUID uuid); + +} diff --git a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer.java b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer.java new file mode 100644 index 000000000..a3672ae6f --- /dev/null +++ b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer.java @@ -0,0 +1,60 @@ +package com.gmail.nossr50.util.compat.layers.persistentdata; + +import com.gmail.nossr50.mcMMO; +import org.bukkit.Bukkit; +import org.bukkit.NamespacedKey; +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; + +public class SpigotPersistentDataLayer extends AbstractPersistentDataLayer { + + private NamespacedKey furnaceOwner_MostSig_Key; + private NamespacedKey furnaceOwner_LeastSig_Key; + + @Override + public boolean initializeLayer() { + initNamespacedKeys(); + return true; + } + + private void initNamespacedKeys() { + furnaceOwner_MostSig_Key = getNamespacedKey("furnace_uuid_most_sig"); + furnaceOwner_LeastSig_Key = getNamespacedKey("furnace_uuid_least_sig"); + } + + @NotNull + public NamespacedKey getNamespacedKey(String key) { + return new NamespacedKey(mcMMO.p, key); + } + + @Override + public @Nullable UUID getFurnaceOwner(Furnace furnace) { + //Get container from entity + PersistentDataContainer dataContainer = ((PersistentDataHolder) furnace).getPersistentDataContainer(); + + Long mostSigBits = dataContainer.get(furnaceOwner_MostSig_Key, PersistentDataType.LONG); + Long leastSigBits = dataContainer.get(furnaceOwner_LeastSig_Key, PersistentDataType.LONG); + + if(mostSigBits != null && leastSigBits != null) { + return new UUID(mostSigBits, leastSigBits); + } else { + return null; + } + } + + @Override + public void setFurnaceOwner(Furnace furnace, UUID uuid) { + PersistentDataContainer dataContainer = ((PersistentDataHolder) furnace).getPersistentDataContainer(); + + dataContainer.set(furnaceOwner_MostSig_Key, PersistentDataType.LONG, uuid.getMostSignificantBits()); + dataContainer.set(furnaceOwner_LeastSig_Key, PersistentDataType.LONG, uuid.getLeastSignificantBits()); + + furnace.update(); + } +} diff --git a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotTemporaryDataLayer.java b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotTemporaryDataLayer.java new file mode 100644 index 000000000..a912520b4 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotTemporaryDataLayer.java @@ -0,0 +1,44 @@ +package com.gmail.nossr50.util.compat.layers.persistentdata; + +import com.gmail.nossr50.datatypes.meta.UUIDMeta; +import com.gmail.nossr50.mcMMO; +import org.bukkit.block.Furnace; +import org.bukkit.metadata.Metadatable; + +import java.util.UUID; + +/** + * Persistent Data API is unavailable + */ +public class SpigotTemporaryDataLayer extends AbstractPersistentDataLayer { + + private final String FURNACE_OWNER_METADATA_KEY = "mcMMO_furnace_owner"; + + @Override + public boolean initializeLayer() { + return true; + } + + @Override + public UUID getFurnaceOwner(Furnace furnace) { + Metadatable metadatable = (Metadatable) furnace; + + if(metadatable.getMetadata(FURNACE_OWNER_METADATA_KEY).size() > 0) { + UUIDMeta uuidMeta = (UUIDMeta) metadatable.getMetadata(FURNACE_OWNER_METADATA_KEY).get(0); + return (UUID) uuidMeta.value(); + } else { + return null; + } + } + + @Override + public void setFurnaceOwner(Furnace furnace, UUID uuid) { + Metadatable metadatable = (Metadatable) furnace; + + if(metadatable.getMetadata(FURNACE_OWNER_METADATA_KEY).size() > 0) { + metadatable.removeMetadata(FURNACE_OWNER_METADATA_KEY, mcMMO.p); + } + + metadatable.setMetadata(FURNACE_OWNER_METADATA_KEY, new UUIDMeta(mcMMO.p, uuid)); + } +} diff --git a/src/main/java/com/gmail/nossr50/util/skills/SmeltingTracker.java b/src/main/java/com/gmail/nossr50/util/skills/SmeltingTracker.java index c0cd97773..91faf30d9 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/SmeltingTracker.java +++ b/src/main/java/com/gmail/nossr50/util/skills/SmeltingTracker.java @@ -3,8 +3,6 @@ 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.skills.smelting.Smelting; -import com.gmail.nossr50.util.EventUtils; import com.gmail.nossr50.util.Permissions; import com.gmail.nossr50.util.player.UserManager; import org.bukkit.Bukkit; @@ -16,15 +14,11 @@ import org.bukkit.inventory.FurnaceInventory; import org.bukkit.inventory.Inventory; import org.jetbrains.annotations.Nullable; -import java.util.HashMap; +import java.util.UUID; public class SmeltingTracker { - private final HashMap furnaceOwners; - - public SmeltingTracker() { - furnaceOwners = new HashMap<>(); - } +// private final HashMap furnaceOwners; private void changeFurnaceOwnership(Furnace furnace, Player player) { @@ -37,7 +31,11 @@ public class SmeltingTracker { printOwnershipLossDebug(furnace); - furnaceOwners.put(furnace, player); + setFurnaceOwner(furnace, player); + } + + private void setFurnaceOwner(Furnace furnace, Player player) { + mcMMO.getCompatibilityManager().getPersistentDataLayer().setFurnaceOwner(furnace, player.getUniqueId()); } private void printOwnershipGainDebug(Furnace furnace, McMMOPlayer mcMMOPlayer) { @@ -52,23 +50,31 @@ public class SmeltingTracker { } private void printOwnershipLossDebug(Furnace furnace) { - if(furnaceOwners.get(furnace) != null) { - OfflinePlayer furnaceOwner = furnaceOwners.get(furnace); + OfflinePlayer furnaceOwner = getFurnaceOwner(furnace); - if(furnaceOwner.isOnline()) { - McMMOPlayer furnaceOwnerProfile = UserManager.getPlayer(furnaceOwner.getPlayer()); + 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()); - } + 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.getCompatibilityManager().getPersistentDataLayer().getFurnaceOwner(furnace); + + if(uuid != null) { + return Bukkit.getOfflinePlayer(uuid); + } else { + return null; + } + } + @Nullable public Furnace getFurnaceFromInventory(Inventory inventory) { if (!(inventory instanceof FurnaceInventory)) { @@ -78,13 +84,8 @@ public class SmeltingTracker { return (Furnace) inventory.getHolder(); } - @Nullable - public OfflinePlayer getPlayerFromFurnace(Furnace furnace) { - return furnaceOwners.get(furnace); - } - public boolean isFurnaceOwned(Furnace furnace) { - return furnaceOwners.get(furnace) != null; + return getFurnaceOwner(furnace) != null; } public void processFurnaceOwnership(Furnace furnace, Player player) { @@ -93,9 +94,4 @@ public class SmeltingTracker { changeFurnaceOwnership(furnace, player); } - - public void untrackFurnace(Furnace furnace) { - printOwnershipLossDebug(furnace); - furnaceOwners.remove(furnace); - } } From 270298c2650065141036bf09102952b501ba370a Mon Sep 17 00:00:00 2001 From: nossr50 Date: Wed, 29 Jul 2020 07:41:47 -0700 Subject: [PATCH 108/662] 2.1.136 --- Changelog.txt | 5 +++++ pom.xml | 2 +- .../layers/persistentdata/SpigotPersistentDataLayer.java | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 9672cf99b..1808d6e88 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -2,6 +2,11 @@ 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) diff --git a/pom.xml b/pom.xml index 2aaffa568..8e60ce5b1 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.136-SNAPSHOT + 2.1.136 mcMMO https://github.com/mcMMO-Dev/mcMMO diff --git a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer.java b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer.java index a3672ae6f..87727ad42 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer.java +++ b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer.java @@ -1,7 +1,6 @@ package com.gmail.nossr50.util.compat.layers.persistentdata; import com.gmail.nossr50.mcMMO; -import org.bukkit.Bukkit; import org.bukkit.NamespacedKey; import org.bukkit.block.Furnace; import org.bukkit.persistence.PersistentDataContainer; @@ -38,6 +37,7 @@ public class SpigotPersistentDataLayer extends AbstractPersistentDataLayer { //Get container from entity PersistentDataContainer dataContainer = ((PersistentDataHolder) furnace).getPersistentDataContainer(); + //Too lazy to make a custom data type for this stuff Long mostSigBits = dataContainer.get(furnaceOwner_MostSig_Key, PersistentDataType.LONG); Long leastSigBits = dataContainer.get(furnaceOwner_LeastSig_Key, PersistentDataType.LONG); From 9266a54fcedfea5ee96184f2ae8c113b4da3fd85 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 30 Jul 2020 11:17:08 -0700 Subject: [PATCH 109/662] debug tweaks --- .../com/gmail/nossr50/util/skills/SmeltingTracker.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/com/gmail/nossr50/util/skills/SmeltingTracker.java b/src/main/java/com/gmail/nossr50/util/skills/SmeltingTracker.java index 91faf30d9..36a634062 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/SmeltingTracker.java +++ b/src/main/java/com/gmail/nossr50/util/skills/SmeltingTracker.java @@ -92,6 +92,13 @@ public class SmeltingTracker { if(!Permissions.skillEnabled(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); } } From 9f9518eea04daa9355edc8c8c998f6f355bc54ca Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 30 Jul 2020 13:05:19 -0700 Subject: [PATCH 110/662] 2.1.137 - avoid npe on armor iterating --- Changelog.txt | 3 +++ pom.xml | 2 +- src/main/java/com/gmail/nossr50/skills/axes/Axes.java | 5 ++++- .../java/com/gmail/nossr50/util/skills/SmeltingTracker.java | 1 - 4 files changed, 8 insertions(+), 3 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 1808d6e88..9f87c496c 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,6 @@ +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) diff --git a/pom.xml b/pom.xml index 8e60ce5b1..f77c819f9 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.136 + 2.1.137 mcMMO https://github.com/mcMMO-Dev/mcMMO 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 753d55971..7f1ba62df 100644 --- a/src/main/java/com/gmail/nossr50/skills/axes/Axes.java +++ b/src/main/java/com/gmail/nossr50/skills/axes/Axes.java @@ -23,10 +23,13 @@ public class Axes { public static double skullSplitterModifier = AdvancedConfig.getInstance().getSkullSplitterModifier(); protected static boolean hasArmor(LivingEntity target) { - if(target.getEquipment() == null) + if(target == null || !target.isValid() || target.getEquipment() == null) return false; for (ItemStack itemStack : target.getEquipment().getArmorContents()) { + if(itemStack == null) + continue; + if (ItemUtils.isArmor(itemStack)) { return true; } diff --git a/src/main/java/com/gmail/nossr50/util/skills/SmeltingTracker.java b/src/main/java/com/gmail/nossr50/util/skills/SmeltingTracker.java index 36a634062..630991341 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/SmeltingTracker.java +++ b/src/main/java/com/gmail/nossr50/util/skills/SmeltingTracker.java @@ -98,7 +98,6 @@ public class SmeltingTracker { return; } - changeFurnaceOwnership(furnace, player); } } From a05c0157320ec313532c6ca77b752bc938d1a0cc Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 30 Jul 2020 16:12:50 -0700 Subject: [PATCH 111/662] Fix Netherite not working for certain skills (like Skull Splitter) --- pom.xml | 2 +- src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f77c819f9..c3b746198 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.137 + 2.1.138-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO 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 07f0c392d..d04ec30fb 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java @@ -980,6 +980,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(); From d490f4fd6007806ad6c06e074e52231ea94a878e Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 30 Jul 2020 16:28:47 -0700 Subject: [PATCH 112/662] 2.1.138 --- Changelog.txt | 3 +++ pom.xml | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index 9f87c496c..e2a567466 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,6 @@ +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 diff --git a/pom.xml b/pom.xml index c3b746198..92c633a5f 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.138-SNAPSHOT + 2.1.138 mcMMO https://github.com/mcMMO-Dev/mcMMO From c85ca2e2caa4c82d7769c1a06323d52a171888b1 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 31 Jul 2020 20:46:52 -0700 Subject: [PATCH 113/662] Dev mode --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 92c633a5f..cc7252461 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.138 + 2.1.139-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO From 01f111f78da1b4b86e894fa1436b50d99641b000 Mon Sep 17 00:00:00 2001 From: t00thpick1 Date: Sun, 2 Aug 2020 12:56:27 -0400 Subject: [PATCH 114/662] Switch to countdown latch so we don't need to bother with synchronization blocks. Fixes #4248 --- .../runnables/database/UUIDUpdateAsyncTask.java | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) 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 7a3901834..6c2c13822 100644 --- a/src/main/java/com/gmail/nossr50/runnables/database/UUIDUpdateAsyncTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/database/UUIDUpdateAsyncTask.java @@ -17,6 +17,7 @@ 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 implements Runnable { @@ -29,7 +30,7 @@ public class UUIDUpdateAsyncTask implements Runnable { private static final int BATCH_SIZE = 100; // 100 at a time - private final Object awaiter = new Object(); + private final CountDownLatch awaiter = new CountDownLatch(1); private final mcMMO plugin; private final ImmutableList userNames; private int position = 0; @@ -98,12 +99,10 @@ public class UUIDUpdateAsyncTask implements Runnable { position += batch.size(); plugin.getLogger().info(String.format("Conversion progress: %d/%d users", position, userNames.size())); - if (position == userNames.size()) - { + if (position == userNames.size()) { mcMMO.getUpgradeManager().setUpgradeCompleted(UpgradeType.ADD_UUIDS); - awaiter.notify(); - } - else + awaiter.countDown(); + } else this.runTaskLaterAsynchronously(plugin, Misc.TICK_CONVERSION_FACTOR * DELAY_PERIOD); // Schedule next batch } @@ -122,7 +121,7 @@ public class UUIDUpdateAsyncTask implements Runnable { public void waitUntilFinished() { try { - awaiter.wait(); + awaiter.await(); } catch (InterruptedException e) { // I guess we don't care in this event } From 375292c0b36ec5a3f20baec29df72cd356ab0cab Mon Sep 17 00:00:00 2001 From: Flannery Lue Moore Date: Thu, 6 Aug 2020 22:22:48 +0000 Subject: [PATCH 115/662] PR for gilded blackstone and nether gold ore to the mining skill, and nether gold ore to the smelting skill. (#4253) * Added gilded blackstone and nether gold ore. * Added nether gold ore to smelting xp. --- src/main/java/com/gmail/nossr50/util/MaterialMapStore.java | 2 ++ src/main/resources/experience.yml | 1 + 2 files changed, 3 insertions(+) diff --git a/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java b/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java index 3ca4370f9..dcdd766f2 100644 --- a/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java +++ b/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java @@ -201,6 +201,8 @@ public class MaterialMapStore { ores.add("redstone_ore"); ores.add("emerald_ore"); ores.add("ancient_debris"); + ores.add("nether_gold_ore"); + ores.add("gilded_blackstone"); } private void fillArmors() { diff --git a/src/main/resources/experience.yml b/src/main/resources/experience.yml index e36f00ab4..f8ed15f62 100644 --- a/src/main/resources/experience.yml +++ b/src/main/resources/experience.yml @@ -464,6 +464,7 @@ Experience_Values: Lapis_Ore: 40 Nether_Quartz_Ore: 25 Redstone_Ore: 15 + Nether_Gold_Ore: 35 Taming: Animal_Taming: Llama: 1200 From 38017cabe7949eb25b6c32fbf7af70264fa7b007 Mon Sep 17 00:00:00 2001 From: emanondev <38587650+emanondev@users.noreply.github.com> Date: Fri, 7 Aug 2020 03:46:12 +0200 Subject: [PATCH 116/662] fixed /mmoinfo roll (#4088) * acrobatics roll mmoinfo fixes LocaleLoader#getString() accepts Object arrays no need to call getStats twice Max skill level is now configurable and so halfMaxSkillValue is now a variable which should be used on locale too instead of "50" * Updated locale_it Acrobatics.SubSkill.Roll.Mechanics supports half level variable instead of static level 50 * Updated locale_en_US Acrobatics.SubSkill.Roll.Mechanics supports half level variable instead of static level 50 * Updated Locale it fixed value --- .../datatypes/skills/subskills/acrobatics/Roll.java | 11 +++++++---- src/main/resources/locale/locale_en_US.properties | 2 +- src/main/resources/locale/locale_it.properties | 2 +- 3 files changed, 9 insertions(+), 6 deletions(-) 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 0718fec8c..9c233ae5e 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 @@ -337,7 +337,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")); @@ -357,6 +357,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 @@ -370,7 +373,7 @@ public class Roll extends AcrobaticsSubSkill { //Chance to roll at half max skill RandomChanceSkill rollHalfMaxSkill = new RandomChanceSkill(null, subSkillType); - int halfMaxSkillValue = mcMMO.isRetroModeEnabled() ? 500 : 50; + int halfMaxSkillValue = AdvancedConfig.getInstance().getMaxBonusLevel(SubSkillType.ACROBATICS_ROLL)/2; rollHalfMaxSkill.setSkillLevel(halfMaxSkillValue); //Chance to graceful roll at full skill @@ -390,7 +393,7 @@ public class Roll extends AcrobaticsSubSkill { double maxLevel = AdvancedConfig.getInstance().getMaxBonusLevel(SubSkillType.ACROBATICS_ROLL); - return LocaleLoader.getString("Acrobatics.SubSkill.Roll.Mechanics", rollChanceHalfMax, graceChanceHalfMax, maxLevel, chancePerLevel, damageThreshold, damageThreshold * 2); + return LocaleLoader.getString("Acrobatics.SubSkill.Roll.Mechanics", rollChanceHalfMax, graceChanceHalfMax, maxLevel, chancePerLevel, damageThreshold, damageThreshold * 2,halfMaxSkillValue); } /** @@ -425,4 +428,4 @@ public class Roll extends AcrobaticsSubSkill { { return player.getLocation().getBlock().getLocation(); } -} \ No newline at end of file +} diff --git a/src/main/resources/locale/locale_en_US.properties b/src/main/resources/locale/locale_en_US.properties index 869b99c3e..dc65d0b2f 100644 --- a/src/main/resources/locale/locale_en_US.properties +++ b/src/main/resources/locale/locale_en_US.properties @@ -138,7 +138,7 @@ 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.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 [[YELLOW]]{6}%[[GRAY]] 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 diff --git a/src/main/resources/locale/locale_it.properties b/src/main/resources/locale/locale_it.properties index 2f23681c3..7fcf079c9 100644 --- a/src/main/resources/locale/locale_it.properties +++ b/src/main/resources/locale/locale_it.properties @@ -142,7 +142,7 @@ 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.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 [[YELLOW]]{6}%[[GRAY]] 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.GracefulRoll.Name=Capriola Aggraziata Acrobatics.SubSkill.GracefulRoll.Description=Due volte pi\u00F9 efficace di una normale Capriola Acrobatics.SubSkill.Dodge.Name=Schivata From 4a4fd9fb75061f8af3473f186f99379154dda40e Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 6 Aug 2020 18:50:24 -0700 Subject: [PATCH 117/662] 2.1.139 --- Changelog.txt | 6 ++++++ pom.xml | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index e2a567466..224e570ae 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,9 @@ +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 Quavelan) + Added 'Gilded_Blackstone' and 'Nether_Gold_Ore' to code used to determine what can activate Super Breaker in certain situations (thanks Quavelan) + 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 diff --git a/pom.xml b/pom.xml index cc7252461..877fb5f5d 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.139-SNAPSHOT + 2.1.139 mcMMO https://github.com/mcMMO-Dev/mcMMO From 8df15a4e55b27af7ac0fc72d587acc2bdf5b966a Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 6 Aug 2020 19:01:36 -0700 Subject: [PATCH 118/662] dev mode --- Changelog.txt | 4 ++-- pom.xml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 224e570ae..9e5d912fa 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,7 +1,7 @@ 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 Quavelan) - Added 'Gilded_Blackstone' and 'Nether_Gold_Ore' to code used to determine what can activate Super Breaker in certain situations (thanks Quavelan) + 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 diff --git a/pom.xml b/pom.xml index 877fb5f5d..980a1c971 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.139 + 2.1.140-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO From d6ff1348eb732f494024dc628c76ba9fcb201e50 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 7 Aug 2020 11:49:12 -0700 Subject: [PATCH 119/662] Polish locale woodcutting rename --- src/main/resources/locale/locale_pl.properties | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/resources/locale/locale_pl.properties b/src/main/resources/locale/locale_pl.properties index b7390a125..27864a932 100644 --- a/src/main/resources/locale/locale_pl.properties +++ b/src/main/resources/locale/locale_pl.properties @@ -313,8 +313,8 @@ 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.Listener=\u015a\u0052\u0105\u0062\u0061\u006e\u0069\u0065 +Woodcutting.SkillName=\u015a\u0052\u0105\u0062\u0061\u006e\u0069\u0065 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! @@ -477,7 +477,7 @@ 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.Woodcutting=\u0052\u0105\u0062\u0061\u006e\u0069\u0065 Party.ItemShare.Category.Misc=R\u00f3zne Commands.XPGain.Acrobatics=Upadanie Commands.XPGain.Archery=Atak potworow @@ -491,7 +491,7 @@ 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.Woodcutting=\u0052\u0105\u0062\u0061\u006e\u0069\u0065 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}! From 771ed9a8b4c605c15b2c60a7b5f201829028ae44 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 7 Aug 2020 11:50:44 -0700 Subject: [PATCH 120/662] oopsie --- src/main/resources/locale/locale_pl.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/locale/locale_pl.properties b/src/main/resources/locale/locale_pl.properties index 27864a932..48b6c3a74 100644 --- a/src/main/resources/locale/locale_pl.properties +++ b/src/main/resources/locale/locale_pl.properties @@ -313,8 +313,8 @@ 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=\u015a\u0052\u0105\u0062\u0061\u006e\u0069\u0065 -Woodcutting.SkillName=\u015a\u0052\u0105\u0062\u0061\u006e\u0069\u0065 +Woodcutting.Listener=\u0052\u0105\u0062\u0061\u006e\u0069\u0065 +Woodcutting.SkillName=\u0052\u0105\u0062\u0061\u006e\u0069\u0065 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! From 3a035e234a5931a7b218ffc609fd5630b8d0b478 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sat, 8 Aug 2020 15:56:53 -0700 Subject: [PATCH 121/662] Scoreboards fixes --- Changelog.txt | 7 + .../gmail/nossr50/listeners/SelfListener.java | 47 ++-- .../util/scoreboards/ScoreboardManager.java | 259 +++++++++++++----- .../util/scoreboards/ScoreboardWrapper.java | 32 +-- 4 files changed, 233 insertions(+), 112 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 9e5d912fa..4c18e7eb6 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,10 @@ +Version 2.1.140 + Deployed a few fixes to scoreboards code + Updated polish locale + + NOTES: + Scoreboards code is a mess and most of it is ancient, I plan to rewrite it in a future update. The way scoreboards API works in general is just difficult to deal with. + 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) diff --git a/src/main/java/com/gmail/nossr50/listeners/SelfListener.java b/src/main/java/com/gmail/nossr50/listeners/SelfListener.java index 892359505..2ea4ac582 100644 --- a/src/main/java/com/gmail/nossr50/listeners/SelfListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/SelfListener.java @@ -33,39 +33,40 @@ public class SelfListener implements Listener { public void onPlayerLevelUp(McMMOPlayerLevelUpEvent event) { Player player = event.getPlayer(); PrimarySkillType skill = event.getSkill(); + 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); + } - //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(Config.getInstance().getScoreboardsEnabled()) + ScoreboardManager.handleLevelUp(player, skill); } - - //Reset the delay timer - RankUtils.resetUnlockDelayTimer(); - - if(Config.getInstance().getScoreboardsEnabled()) - ScoreboardManager.handleLevelUp(player, skill); - - if (!Config.getInstance().getLevelUpEffectsEnabled()) { - } - - /*if ((event.getSkillLevel() % Config.getInstance().getLevelUpEffectsTier()) == 0) { - skill.celebrateLevelUp(player); - }*/ } @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(Config.getInstance().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(Config.getInstance().getScoreboardsEnabled()) + ScoreboardManager.cooldownUpdate(event.getPlayer(), event.getSkill()); + } } @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) 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 0bce7f5b5..ad32306ae 100644 --- a/src/main/java/com/gmail/nossr50/util/scoreboards/ScoreboardManager.java +++ b/src/main/java/com/gmail/nossr50/util/scoreboards/ScoreboardManager.java @@ -6,6 +6,8 @@ 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 +20,8 @@ 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.Nullable; import java.util.*; @@ -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 */ @@ -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 (Config.getInstance().getPowerLevelTagsEnabled() && !dirtyPowerLevels.contains(playerName)) { + dirtyPowerLevels.add(playerName); + } + + if (Config.getInstance().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,40 +267,59 @@ 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()); + ScoreboardWrapper wrapper = getWrapper(player); - wrapper.setOldScoreboard(); - wrapper.setTypeSkill(skill); + if(wrapper == null) { + setupPlayer(player); + wrapper = getWrapper(player); + } - changeScoreboard(wrapper, Config.getInstance().getSkillScoreboardTime()); + if(wrapper != null) { + wrapper.setOldScoreboard(); + wrapper.setTypeSkill(skill); + + changeScoreboard(wrapper, Config.getInstance().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, Config.getInstance().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(); @@ -288,61 +328,112 @@ public class ScoreboardManager { } public static void enablePlayerInspectScoreboard(Player player, PlayerProfile targetProfile) { - ScoreboardWrapper wrapper = PLAYER_SCOREBOARDS.get(player.getName()); + 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, Config.getInstance().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, Config.getInstance().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, Config.getInstance().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, Config.getInstance().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, Config.getInstance().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, Config.getInstance().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 +477,12 @@ public class ScoreboardManager { * * @return the main targetBoard objective, or null if disabled */ - public static Objective getPowerLevelObjective() { + public static @Nullable Objective getPowerLevelObjective() { if (!Config.getInstance().getPowerLevelTagsEnabled()) { - Objective objective = mcMMO.p.getServer().getScoreboardManager().getMainScoreboard().getObjective(POWER_OBJECTIVE); + if(getScoreboardManager() == null) + return null; + + Objective objective = getScoreboardManager().getMainScoreboard().getObjective(POWER_OBJECTIVE); if (objective != null) { objective.unregister(); @@ -398,10 +492,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,6 +507,11 @@ public class ScoreboardManager { return powerObjective; } + public @Nullable static org.bukkit.scoreboard.ScoreboardManager getScoreboardManager() { + return mcMMO.p.getServer().getScoreboardManager(); + } + + private static void changeScoreboard(ScoreboardWrapper wrapper, int displayTime) { if (displayTime == -1) { wrapper.showBoardWithNoRevert(); @@ -433,4 +536,16 @@ public class ScoreboardManager { public static void setRevertTimer(String playerName, int seconds) { PLAYER_SCOREBOARDS.get(playerName).showBoardAndScheduleRevert(seconds * Misc.TICK_CONVERSION_FACTOR); } + + 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 9d675e71b..56c7650dc 100644 --- a/src/main/java/com/gmail/nossr50/util/scoreboards/ScoreboardWrapper.java +++ b/src/main/java/com/gmail/nossr50/util/scoreboards/ScoreboardWrapper.java @@ -6,7 +6,10 @@ 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; @@ -27,6 +30,8 @@ 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; @@ -46,13 +51,13 @@ public class ScoreboardWrapper { private PlayerProfile targetProfile = null; public int leaderboardPage = -1; - 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"); + sidebarObjective = this.scoreboard.registerNewObjective(ScoreboardManager.SIDEBAR_OBJECTIVE, "dummy", SIDE_OBJECTIVE); + powerObjective = this.scoreboard.registerNewObjective(ScoreboardManager.POWER_OBJECTIVE, "dummy", POWER_OBJECTIVE); if (Config.getInstance().getPowerLevelTagsEnabled()) { powerObjective.setDisplayName(ScoreboardManager.TAG_POWER_LEVEL); @@ -64,14 +69,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 { @@ -158,16 +155,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; } } @@ -394,7 +392,7 @@ public class ScoreboardWrapper { //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); From e890d4bae6d8ba109b26f9f4d49e4bdb8104c242 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sat, 8 Aug 2020 21:16:06 -0700 Subject: [PATCH 122/662] 2.1.140 --- Changelog.txt | 5 ++--- pom.xml | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 4c18e7eb6..c6961dd92 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,9 +1,9 @@ Version 2.1.140 - Deployed a few fixes to scoreboards code + Fixed a few potential issues with scoreboards Updated polish locale NOTES: - Scoreboards code is a mess and most of it is ancient, I plan to rewrite it in a future update. The way scoreboards API works in general is just difficult to deal with. + 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) @@ -25,7 +25,6 @@ Version 2.1.136 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) diff --git a/pom.xml b/pom.xml index 980a1c971..958748970 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.140-SNAPSHOT + 2.1.140 mcMMO https://github.com/mcMMO-Dev/mcMMO From a2f2614b10d52a2e5c3e3c9c0239b9d6d674d4fc Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 11 Aug 2020 16:13:11 -0700 Subject: [PATCH 123/662] 2.1.141 --- Changelog.txt | 3 +++ pom.xml | 21 +++++++++++++++++-- .../util/compat/CompatibilityManager.java | 2 ++ .../gmail/nossr50/util/nms/NMSVersion.java | 1 + 4 files changed, 25 insertions(+), 2 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index c6961dd92..665f726f5 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,6 @@ +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 diff --git a/pom.xml b/pom.xml index 958748970..f82d947f9 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.140 + 2.1.141 mcMMO https://github.com/mcMMO-Dev/mcMMO @@ -99,6 +99,7 @@ org.apache.tomcat:tomcat-jdbc org.apache.tomcat:tomcat-juli org.bstats:bstats-bukkit + net.kyori:adventure-api @@ -151,8 +152,24 @@ sk89q-repo https://maven.sk89q.com/repo/ + + + sonatype-oss + https://oss.sonatype.org/content/repositories/snapshots/ + + + + + + + + + + + + org.apache.maven.scm maven-scm-provider-gitexe @@ -167,7 +184,7 @@ org.spigotmc spigot-api - 1.16.1-R0.1-SNAPSHOT + 1.16.2-R0.1-SNAPSHOT provided 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 d601f2d99..51720245f 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/CompatibilityManager.java +++ b/src/main/java/com/gmail/nossr50/util/compat/CompatibilityManager.java @@ -120,6 +120,8 @@ public class CompatibilityManager { 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; } } } 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 51251c47a..a5e599b46 100644 --- a/src/main/java/com/gmail/nossr50/util/nms/NMSVersion.java +++ b/src/main/java/com/gmail/nossr50/util/nms/NMSVersion.java @@ -18,6 +18,7 @@ public enum NMSVersion { //1.16 NMS_1_16_1("1.16.1"), + NMS_1_16_2("1.16.2"), //Version not known to this build of mcMMO UNSUPPORTED("unsupported"); From dca2661ccbecebc9d123ea7090a73547275def40 Mon Sep 17 00:00:00 2001 From: Frank van der Heijden <22407829+FrankHeijden@users.noreply.github.com> Date: Mon, 17 Aug 2020 23:21:09 +0200 Subject: [PATCH 124/662] Don't set double drop if result is already a full stack (#4263) Thanks, merging because I can't think of anything bad that would result from this change. --- .../java/com/gmail/nossr50/skills/smelting/SmeltingManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 9d622ea62..518718765 100644 --- a/src/main/java/com/gmail/nossr50/skills/smelting/SmeltingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/smelting/SmeltingManager.java @@ -113,7 +113,7 @@ public class SmeltingManager extends SkillManager { applyXpGain(Smelting.getResourceXp(smelting), XPGainReason.PVE, XPGainSource.PASSIVE); if (Config.getInstance().getDoubleDropsEnabled(PrimarySkillType.SMELTING, result.getType()) - && isSecondSmeltSuccessful()) { + && isSecondSmeltSuccessful() && result.getAmount() < 64) { ItemStack newResult = result.clone(); newResult.setAmount(result.getAmount() + 1); From c6b2cba007d94494a2994598c56a9e41ec40a100 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 17 Aug 2020 23:32:13 -0700 Subject: [PATCH 125/662] Reworked Iron Arm Style into Steel Arm Style which scales over 20 ranks --- Changelog.txt | 9 ++++ pom.xml | 2 +- .../commands/skills/UnarmedCommand.java | 4 +- .../datatypes/skills/PrimarySkillType.java | 2 +- .../datatypes/skills/SubSkillType.java | 2 +- .../skills/unarmed/UnarmedManager.java | 25 +++++----- .../nossr50/util/skills/CombatUtils.java | 2 +- .../resources/locale/locale_en_US.properties | 8 ++-- src/main/resources/plugin.yml | 6 +-- src/main/resources/skillranks.yml | 48 +++++++++++++++---- 10 files changed, 73 insertions(+), 35 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 665f726f5..de25d1179 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,12 @@ +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 diff --git a/pom.xml b/pom.xml index f82d947f9..629d6cbd4 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.141 + 2.1.142-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO 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 383b28318..8db4ebdf6 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/UnarmedCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/UnarmedCommand.java @@ -61,7 +61,7 @@ public class UnarmedCommand extends SkillCommand { // 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); 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 2ed443878..766d25f63 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/skills/PrimarySkillType.java +++ b/src/main/java/com/gmail/nossr50/datatypes/skills/PrimarySkillType.java @@ -61,7 +61,7 @@ public enum PrimarySkillType { 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)), + ImmutableList.of(SubSkillType.UNARMED_BERSERK, SubSkillType.UNARMED_UNARMED_LIMIT_BREAK, SubSkillType.UNARMED_BLOCK_CRACKER, SubSkillType.UNARMED_ARROW_DEFLECT, SubSkillType.UNARMED_DISARM, SubSkillType.UNARMED_STEEL_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)); 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 6dfcd383f..95738acfd 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/skills/SubSkillType.java +++ b/src/main/java/com/gmail/nossr50/datatypes/skills/SubSkillType.java @@ -95,7 +95,7 @@ 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), 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 92408bab9..d8d99bcce 100644 --- a/src/main/java/com/gmail/nossr50/skills/unarmed/UnarmedManager.java +++ b/src/main/java/com/gmail/nossr50/skills/unarmed/UnarmedManager.java @@ -36,10 +36,10 @@ public class UnarmedManager extends SkillManager { } public boolean canUseIronArm() { - if(!RankUtils.hasUnlockedSubskill(getPlayer(), SubSkillType.UNARMED_IRON_ARM_STYLE)) + 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() { @@ -146,23 +146,22 @@ 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); + double bonus = 0; - if(rank == 1) - { - return 1.5; - } else { - return 3 + (rank * 2); - } + if(rank >= 18) + bonus = 1 + rank - 18; + + return bonus + 0.5 + (rank / 2); } /** 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 d04ec30fb..994e8dfe7 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java @@ -188,7 +188,7 @@ public final class CombatUtils { //Only execute bonuses if the player is not spamming if (unarmedManager.canUseIronArm()) { - finalDamage+=(unarmedManager.calculateIronArmDamage() * mcMMOPlayer.getAttackStrength()); + finalDamage+=(unarmedManager.calculateSteelArmStyleDamage() * mcMMOPlayer.getAttackStrength()); } if (unarmedManager.canUseBerserk()) { diff --git a/src/main/resources/locale/locale_en_US.properties b/src/main/resources/locale/locale_en_US.properties index dc65d0b2f..e7cbb83d5 100644 --- a/src/main/resources/locale/locale_en_US.properties +++ b/src/main/resources/locale/locale_en_US.properties @@ -489,7 +489,7 @@ Taming.Summon.COTW.BreedingDisallowed=[[GREEN]](Call Of The Wild) [[RED]]You can 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} #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! @@ -504,8 +504,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 @@ -947,7 +947,7 @@ Guides.Taming.Section.8=[[DARK_AQUA]]How does Fast Food Service work?\n[[YELLOW] ##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.2=[[DARK_AQUA]]How does Steel Arm Style work?\n[[YELLOW]]Steel Arm Style 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. diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index e9f96d960..7fdb6e627 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -664,7 +664,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 @@ -675,8 +675,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: diff --git a/src/main/resources/skillranks.yml b/src/main/resources/skillranks.yml index 0e51b10e4..acb5d3e28 100644 --- a/src/main/resources/skillranks.yml +++ b/src/main/resources/skillranks.yml @@ -546,19 +546,49 @@ 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: From 59f52f6e7ee67f46f9b150adc67714ce82acdb42 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 17 Aug 2020 23:36:47 -0700 Subject: [PATCH 126/662] 2.1.142 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 629d6cbd4..a4aa7842b 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.142-SNAPSHOT + 2.1.142 mcMMO https://github.com/mcMMO-Dev/mcMMO From a7ded7e98225b565e6f4a800505efc1f2d593e6c Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 18 Aug 2020 18:41:31 -0700 Subject: [PATCH 127/662] super boosted items are now tracked differently --- Changelog.txt | 8 ++ pom.xml | 2 +- .../datatypes/meta/SuperAbilityToolMeta.java | 14 ++++ .../nossr50/listeners/InventoryListener.java | 1 + .../com/gmail/nossr50/util/ItemUtils.java | 46 ++++++++++++ .../AbstractPersistentDataLayer.java | 10 +++ .../SpigotPersistentDataLayer.java | 75 ++++++++++++++++++- .../SpigotTemporaryDataLayer.java | 54 +++++++++++++ .../gmail/nossr50/util/skills/SkillUtils.java | 51 +++++-------- 9 files changed, 224 insertions(+), 37 deletions(-) create mode 100644 src/main/java/com/gmail/nossr50/datatypes/meta/SuperAbilityToolMeta.java diff --git a/Changelog.txt b/Changelog.txt index de25d1179..139db837b 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,11 @@ +Version 2.1.143 + mcMMO now tracks super ability boosted items through item metadata + mcMMO no longer relies on lore to tell if an item has been modified by a super ability + + NOTES: + The item tracking on 1.14+ is persistent (up until now its been temporary) + Lore still gets added and removed from the item, this is sort of a failsafe. It can be considered optional. + Version 2.1.142 Iron Arm Style renamed to Steel Arm Style Steel Arm Style now scales over 20 ranks instead of 5 diff --git a/pom.xml b/pom.xml index a4aa7842b..402e8a0c7 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.142 + 2.1.143-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO 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/listeners/InventoryListener.java b/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java index 0052f1644..6c0ac6a0a 100644 --- a/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java @@ -414,6 +414,7 @@ public class InventoryListener implements Listener { ItemStack result = event.getRecipe().getResult(); + //TODO: what is the point of this if (!ItemUtils.isMcMMOItem(result)) { return; } diff --git a/src/main/java/com/gmail/nossr50/util/ItemUtils.java b/src/main/java/com/gmail/nossr50/util/ItemUtils.java index f7dea6a38..39720b038 100644 --- a/src/main/java/com/gmail/nossr50/util/ItemUtils.java +++ b/src/main/java/com/gmail/nossr50/util/ItemUtils.java @@ -1,17 +1,22 @@ package com.gmail.nossr50.util; +import com.gmail.nossr50.config.AdvancedConfig; import com.gmail.nossr50.config.Config; import com.gmail.nossr50.config.party.ItemWeightConfig; import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.mcMMO; import org.bukkit.ChatColor; import org.bukkit.Material; +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.ItemMeta; +import java.util.ArrayList; +import java.util.List; + public final class ItemUtils { private ItemUtils() {} @@ -479,4 +484,45 @@ public final class ItemUtils { return itemMeta.hasDisplayName() && itemMeta.getDisplayName().equals(ChatColor.GOLD + LocaleLoader.getString("Item.ChimaeraWing.Name")); } + + public static void addAbilityLore(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(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(ItemStack itemStack, int existingEnchantLevel) { + ItemMeta itemMeta = itemStack.getItemMeta(); + itemMeta.addEnchant(Enchantment.DIG_SPEED, existingEnchantLevel + AdvancedConfig.getInstance().getEnchantBuff(), true); + } } diff --git a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/AbstractPersistentDataLayer.java b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/AbstractPersistentDataLayer.java index 0cd936c2d..815c6c5b1 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/AbstractPersistentDataLayer.java +++ b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/AbstractPersistentDataLayer.java @@ -2,6 +2,8 @@ package com.gmail.nossr50.util.compat.layers.persistentdata; import com.gmail.nossr50.util.compat.layers.AbstractCompatibilityLayer; import org.bukkit.block.Furnace; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; import org.jetbrains.annotations.Nullable; import java.util.UUID; @@ -16,4 +18,12 @@ public abstract class AbstractPersistentDataLayer extends AbstractCompatibilityL public abstract void setFurnaceOwner(Furnace furnace, UUID uuid); + public abstract void setSuperAbilityBoostedItem(ItemStack itemStack, int originalDigSpeed); + + public abstract boolean isSuperAbilityBoosted(ItemMeta itemMeta); + + public abstract int getSuperAbilityToolOriginalDigSpeed(ItemMeta itemMeta); + + public abstract void removeBonusDigSpeedOnSuperAbilityTool(ItemStack itemStack); + } diff --git a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer.java b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer.java index 87727ad42..760b074ad 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer.java +++ b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer.java @@ -3,6 +3,9 @@ package com.gmail.nossr50.util.compat.layers.persistentdata; import com.gmail.nossr50.mcMMO; import org.bukkit.NamespacedKey; import org.bukkit.block.Furnace; +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.PersistentDataHolder; import org.bukkit.persistence.PersistentDataType; @@ -13,8 +16,17 @@ import java.util.UUID; public class SpigotPersistentDataLayer extends AbstractPersistentDataLayer { + /* + * Don't modify these keys + */ + public static final String FURNACE_UUID_MOST_SIG = "furnace_uuid_most_sig"; + public static final String FURNACE_UUID_LEAST_SIG = "furnace_uuid_least_sig"; + public static final String SUPER_ABILITY_BOOSTED = "super_ability_boosted"; + private NamespacedKey furnaceOwner_MostSig_Key; private NamespacedKey furnaceOwner_LeastSig_Key; + private NamespacedKey superAbilityBoosted; + @Override public boolean initializeLayer() { @@ -23,8 +35,9 @@ public class SpigotPersistentDataLayer extends AbstractPersistentDataLayer { } private void initNamespacedKeys() { - furnaceOwner_MostSig_Key = getNamespacedKey("furnace_uuid_most_sig"); - furnaceOwner_LeastSig_Key = getNamespacedKey("furnace_uuid_least_sig"); + furnaceOwner_MostSig_Key = getNamespacedKey(FURNACE_UUID_MOST_SIG); + furnaceOwner_LeastSig_Key = getNamespacedKey(FURNACE_UUID_LEAST_SIG); + superAbilityBoosted = getNamespacedKey(SUPER_ABILITY_BOOSTED); } @NotNull @@ -57,4 +70,62 @@ public class SpigotPersistentDataLayer extends AbstractPersistentDataLayer { furnace.update(); } + + @Override + public void setSuperAbilityBoostedItem(ItemStack itemStack, int originalDigSpeed) { + ItemMeta itemMeta = itemStack.getItemMeta(); + PersistentDataContainer dataContainer = ((PersistentDataHolder) itemMeta).getPersistentDataContainer(); + + dataContainer.set(superAbilityBoosted, PersistentDataType.INTEGER, originalDigSpeed); + + itemStack.setItemMeta(itemMeta); + } + + @Override + public boolean isSuperAbilityBoosted(@NotNull ItemMeta itemMeta) { + //Get container from entity + PersistentDataContainer dataContainer = ((PersistentDataHolder) itemMeta).getPersistentDataContainer(); + + //If this value isn't null, then the tool can be considered dig speed boosted + Integer boostValue = dataContainer.get(superAbilityBoosted, PersistentDataType.INTEGER); + + return boostValue != null; + } + + @Override + public int getSuperAbilityToolOriginalDigSpeed(@NotNull ItemMeta itemMeta) { + //Get container from entity + PersistentDataContainer dataContainer = ((PersistentDataHolder) itemMeta).getPersistentDataContainer(); + + if(dataContainer.get(superAbilityBoosted, 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(superAbilityBoosted, PersistentDataType.INTEGER); + return Math.max(boostValue, 0); + } + } + + @Override + public void removeBonusDigSpeedOnSuperAbilityTool(@NotNull ItemStack itemStack) { + ItemMeta itemMeta = itemStack.getItemMeta(); + + //TODO: can be optimized + int originalSpeed = getSuperAbilityToolOriginalDigSpeed(itemMeta); + + if(itemMeta.hasEnchant(Enchantment.DIG_SPEED)) { + itemMeta.removeEnchant(Enchantment.DIG_SPEED); + } + + if(originalSpeed > 0) { + itemMeta.addEnchant(Enchantment.DIG_SPEED, originalSpeed, true); + } + + PersistentDataContainer dataContainer = ((PersistentDataHolder) itemMeta).getPersistentDataContainer(); + dataContainer.remove(superAbilityBoosted); //Remove persistent data + + //TODO: needed? + itemStack.setItemMeta(itemMeta); + } } diff --git a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotTemporaryDataLayer.java b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotTemporaryDataLayer.java index a912520b4..13e845d4e 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotTemporaryDataLayer.java +++ b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotTemporaryDataLayer.java @@ -1,9 +1,15 @@ package com.gmail.nossr50.util.compat.layers.persistentdata; +import com.gmail.nossr50.config.AdvancedConfig; +import com.gmail.nossr50.datatypes.meta.SuperAbilityToolMeta; import com.gmail.nossr50.datatypes.meta.UUIDMeta; import com.gmail.nossr50.mcMMO; import org.bukkit.block.Furnace; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.metadata.Metadatable; +import org.jetbrains.annotations.NotNull; import java.util.UUID; @@ -13,6 +19,7 @@ import java.util.UUID; public class SpigotTemporaryDataLayer extends AbstractPersistentDataLayer { private final String FURNACE_OWNER_METADATA_KEY = "mcMMO_furnace_owner"; + private final String ABILITY_TOOL_METADATA_KEY = "mcMMO_super_ability_tool"; @Override public boolean initializeLayer() { @@ -41,4 +48,51 @@ public class SpigotTemporaryDataLayer extends AbstractPersistentDataLayer { metadatable.setMetadata(FURNACE_OWNER_METADATA_KEY, new UUIDMeta(mcMMO.p, uuid)); } + + @Override + public void setSuperAbilityBoostedItem(ItemStack itemStack, int originalDigSpeed) { + ItemMeta itemMeta = itemStack.getItemMeta(); + Metadatable metadatable = (Metadatable) itemMeta; + metadatable.setMetadata(ABILITY_TOOL_METADATA_KEY, new SuperAbilityToolMeta(originalDigSpeed, mcMMO.p)); + + //TODO: needed? + itemStack.setItemMeta(itemMeta); + } + + @Override + public boolean isSuperAbilityBoosted(@NotNull ItemMeta itemMeta) { + Metadatable metadatable = (Metadatable) itemMeta; + return metadatable.getMetadata(ABILITY_TOOL_METADATA_KEY).size() > 0; + } + + @Override + public int getSuperAbilityToolOriginalDigSpeed(@NotNull ItemMeta itemMeta) { + Metadatable metadatable = (Metadatable) itemMeta; + + if(metadatable.getMetadata(ABILITY_TOOL_METADATA_KEY).size() > 0) { + SuperAbilityToolMeta toolMeta = (SuperAbilityToolMeta) metadatable.getMetadata(ABILITY_TOOL_METADATA_KEY).get(0); + return toolMeta.asInt(); + } else { +// mcMMO.p.getLogger().info("Original dig enchant speed could not be found on item! Most likely it was lost from a server restart."); + return 0; + } + } + + @Override + public void removeBonusDigSpeedOnSuperAbilityTool(@NotNull ItemStack itemStack) { + ItemMeta itemMeta = itemStack.getItemMeta(); + + if(itemMeta.hasEnchant(Enchantment.DIG_SPEED)) { + itemMeta.removeEnchant(Enchantment.DIG_SPEED); + } + + int originalSpeed = getSuperAbilityToolOriginalDigSpeed(itemMeta); + + if(originalSpeed > 0) { + itemMeta.addEnchant(Enchantment.DIG_SPEED, originalSpeed, true); + } + + //TODO: needed? + itemStack.setItemMeta(itemMeta); + } } 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 35e0dca39..65f724f5d 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/SkillUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/SkillUtils.java @@ -15,6 +15,7 @@ import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.ItemUtils; import com.gmail.nossr50.util.Misc; import com.gmail.nossr50.util.StringUtils; +import com.gmail.nossr50.util.compat.layers.persistentdata.AbstractPersistentDataLayer; import com.gmail.nossr50.util.player.NotificationManager; import com.gmail.nossr50.util.player.UserManager; import org.bukkit.Bukkit; @@ -22,10 +23,7 @@ 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.Recipe; -import org.bukkit.inventory.ShapedRecipe; -import org.bukkit.inventory.ShapelessRecipe; +import org.bukkit.inventory.*; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; @@ -140,19 +138,15 @@ public class SkillUtils { 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 lore, add dig speed + ItemUtils.addAbilityLore(heldItem); //lore can be a secondary failsafe for 1.13 and below + ItemUtils.addDigSpeedToItem(heldItem, heldItem.getEnchantmentLevel(Enchantment.DIG_SPEED)); - itemLore.add("mcMMO Ability Tool"); - itemMeta.addEnchant(Enchantment.DIG_SPEED, efficiencyLevel + AdvancedConfig.getInstance().getEnchantBuff(), true); - - itemMeta.setLore(itemLore); - heldItem.setItemMeta(itemMeta); + //1.14+ will have persistent metadata for this item + AbstractPersistentDataLayer compatLayer = mcMMO.getCompatibilityManager().getPersistentDataLayer(); + compatLayer.setSuperAbilityBoostedItem(heldItem, originalDigSpeed); } else { int duration = 0; @@ -205,30 +199,19 @@ public class SkillUtils { } } - 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(ItemStack itemStack) { + if (itemStack == null || itemStack.getType() == Material.AIR) { return; } - ItemMeta itemMeta = item.getItemMeta(); + //Take the lore off + ItemUtils.removeAbilityLore(itemStack); - if (itemMeta.hasLore()) { - List itemLore = itemMeta.getLore(); + //1.14+ will have persistent metadata for this itemStack + AbstractPersistentDataLayer compatLayer = mcMMO.getCompatibilityManager().getPersistentDataLayer(); - 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(compatLayer.isSuperAbilityBoosted(itemStack.getItemMeta())) + compatLayer.removeBonusDigSpeedOnSuperAbilityTool(itemStack); } public static void handleDurabilityChange(ItemStack itemStack, int durabilityModifier) { From 557cfe39441a2c24697b832aed1649e2c5582e49 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 18 Aug 2020 19:47:15 -0700 Subject: [PATCH 128/662] Some bugfixes to the new ability tool tracking --- Changelog.txt | 1 + .../runnables/skills/BleedTimerTask.java | 3 ++ .../com/gmail/nossr50/util/ItemUtils.java | 5 ++++ .../AbstractPersistentDataLayer.java | 4 +-- .../SpigotPersistentDataLayer.java | 29 ++++++++++++++----- .../SpigotTemporaryDataLayer.java | 23 +++++++-------- .../gmail/nossr50/util/skills/SkillUtils.java | 5 +--- 7 files changed, 44 insertions(+), 26 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 139db837b..cfedff549 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,6 +1,7 @@ Version 2.1.143 mcMMO now tracks super ability boosted items through item metadata mcMMO no longer relies on lore to tell if an item has been modified by a super ability + Slight buff to Rupture NOTES: The item tracking on 1.14+ is persistent (up until now its been temporary) 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 de303c957..228ae7f18 100644 --- a/src/main/java/com/gmail/nossr50/runnables/skills/BleedTimerTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/skills/BleedTimerTask.java @@ -188,6 +188,9 @@ public class BleedTimerTask extends BukkitRunnable { if(toolTier < 4) ticks = Math.max(1, (ticks / 3)); + ticks+=1; + + BleedContainer newBleedContainer = new BleedContainer(entity, ticks, bleedRank, toolTier, attacker); bleedList.put(entity, newBleedContainer); } diff --git a/src/main/java/com/gmail/nossr50/util/ItemUtils.java b/src/main/java/com/gmail/nossr50/util/ItemUtils.java index 39720b038..3a9c126ab 100644 --- a/src/main/java/com/gmail/nossr50/util/ItemUtils.java +++ b/src/main/java/com/gmail/nossr50/util/ItemUtils.java @@ -523,6 +523,11 @@ public final class ItemUtils { public static void addDigSpeedToItem(ItemStack itemStack, int existingEnchantLevel) { ItemMeta itemMeta = itemStack.getItemMeta(); + + if(itemMeta == null) + return; + itemMeta.addEnchant(Enchantment.DIG_SPEED, existingEnchantLevel + AdvancedConfig.getInstance().getEnchantBuff(), true); + itemStack.setItemMeta(itemMeta); } } diff --git a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/AbstractPersistentDataLayer.java b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/AbstractPersistentDataLayer.java index 815c6c5b1..cbea2f1aa 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/AbstractPersistentDataLayer.java +++ b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/AbstractPersistentDataLayer.java @@ -20,9 +20,9 @@ public abstract class AbstractPersistentDataLayer extends AbstractCompatibilityL public abstract void setSuperAbilityBoostedItem(ItemStack itemStack, int originalDigSpeed); - public abstract boolean isSuperAbilityBoosted(ItemMeta itemMeta); + public abstract boolean isSuperAbilityBoosted(ItemStack itemStack); - public abstract int getSuperAbilityToolOriginalDigSpeed(ItemMeta itemMeta); + public abstract int getSuperAbilityToolOriginalDigSpeed(ItemStack itemStack); public abstract void removeBonusDigSpeedOnSuperAbilityTool(ItemStack itemStack); diff --git a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer.java b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer.java index 760b074ad..d6e096e70 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer.java +++ b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer.java @@ -73,8 +73,13 @@ public class SpigotPersistentDataLayer extends AbstractPersistentDataLayer { @Override public void setSuperAbilityBoostedItem(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 = ((PersistentDataHolder) itemMeta).getPersistentDataContainer(); + PersistentDataContainer dataContainer = itemMeta.getPersistentDataContainer(); dataContainer.set(superAbilityBoosted, PersistentDataType.INTEGER, originalDigSpeed); @@ -82,9 +87,13 @@ public class SpigotPersistentDataLayer extends AbstractPersistentDataLayer { } @Override - public boolean isSuperAbilityBoosted(@NotNull ItemMeta itemMeta) { + public boolean isSuperAbilityBoosted(ItemStack itemStack) { + if(itemStack.getItemMeta() == null) + return false; + + ItemMeta itemMeta = itemStack.getItemMeta(); //Get container from entity - PersistentDataContainer dataContainer = ((PersistentDataHolder) itemMeta).getPersistentDataContainer(); + PersistentDataContainer dataContainer = itemMeta.getPersistentDataContainer(); //If this value isn't null, then the tool can be considered dig speed boosted Integer boostValue = dataContainer.get(superAbilityBoosted, PersistentDataType.INTEGER); @@ -93,9 +102,14 @@ public class SpigotPersistentDataLayer extends AbstractPersistentDataLayer { } @Override - public int getSuperAbilityToolOriginalDigSpeed(@NotNull ItemMeta itemMeta) { + public int getSuperAbilityToolOriginalDigSpeed(@NotNull ItemStack itemStack) { //Get container from entity - PersistentDataContainer dataContainer = ((PersistentDataHolder) itemMeta).getPersistentDataContainer(); + ItemMeta itemMeta = itemStack.getItemMeta(); + + if(itemMeta == null) + return 0; + + PersistentDataContainer dataContainer = itemMeta.getPersistentDataContainer(); if(dataContainer.get(superAbilityBoosted, PersistentDataType.INTEGER) == null) { mcMMO.p.getLogger().severe("Value should never be null for a boosted item"); @@ -109,11 +123,10 @@ public class SpigotPersistentDataLayer extends AbstractPersistentDataLayer { @Override public void removeBonusDigSpeedOnSuperAbilityTool(@NotNull ItemStack itemStack) { + int originalSpeed = getSuperAbilityToolOriginalDigSpeed(itemStack); ItemMeta itemMeta = itemStack.getItemMeta(); //TODO: can be optimized - int originalSpeed = getSuperAbilityToolOriginalDigSpeed(itemMeta); - if(itemMeta.hasEnchant(Enchantment.DIG_SPEED)) { itemMeta.removeEnchant(Enchantment.DIG_SPEED); } @@ -122,7 +135,7 @@ public class SpigotPersistentDataLayer extends AbstractPersistentDataLayer { itemMeta.addEnchant(Enchantment.DIG_SPEED, originalSpeed, true); } - PersistentDataContainer dataContainer = ((PersistentDataHolder) itemMeta).getPersistentDataContainer(); + PersistentDataContainer dataContainer = itemMeta.getPersistentDataContainer(); dataContainer.remove(superAbilityBoosted); //Remove persistent data //TODO: needed? diff --git a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotTemporaryDataLayer.java b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotTemporaryDataLayer.java index 13e845d4e..1d52cb997 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotTemporaryDataLayer.java +++ b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotTemporaryDataLayer.java @@ -1,6 +1,5 @@ package com.gmail.nossr50.util.compat.layers.persistentdata; -import com.gmail.nossr50.config.AdvancedConfig; import com.gmail.nossr50.datatypes.meta.SuperAbilityToolMeta; import com.gmail.nossr50.datatypes.meta.UUIDMeta; import com.gmail.nossr50.mcMMO; @@ -39,7 +38,7 @@ public class SpigotTemporaryDataLayer extends AbstractPersistentDataLayer { } @Override - public void setFurnaceOwner(Furnace furnace, UUID uuid) { + public void setFurnaceOwner(@NotNull Furnace furnace, UUID uuid) { Metadatable metadatable = (Metadatable) furnace; if(metadatable.getMetadata(FURNACE_OWNER_METADATA_KEY).size() > 0) { @@ -50,24 +49,24 @@ public class SpigotTemporaryDataLayer extends AbstractPersistentDataLayer { } @Override - public void setSuperAbilityBoostedItem(ItemStack itemStack, int originalDigSpeed) { - ItemMeta itemMeta = itemStack.getItemMeta(); - Metadatable metadatable = (Metadatable) itemMeta; + public void setSuperAbilityBoostedItem(@NotNull ItemStack itemStack, int originalDigSpeed) { + Metadatable metadatable = getMetadatable(itemStack); metadatable.setMetadata(ABILITY_TOOL_METADATA_KEY, new SuperAbilityToolMeta(originalDigSpeed, mcMMO.p)); + } - //TODO: needed? - itemStack.setItemMeta(itemMeta); + private Metadatable getMetadatable(@NotNull ItemStack itemStack) { + return (Metadatable) itemStack; } @Override - public boolean isSuperAbilityBoosted(@NotNull ItemMeta itemMeta) { - Metadatable metadatable = (Metadatable) itemMeta; + public boolean isSuperAbilityBoosted(@NotNull ItemStack itemStack) { + Metadatable metadatable = getMetadatable(itemStack); return metadatable.getMetadata(ABILITY_TOOL_METADATA_KEY).size() > 0; } @Override - public int getSuperAbilityToolOriginalDigSpeed(@NotNull ItemMeta itemMeta) { - Metadatable metadatable = (Metadatable) itemMeta; + public int getSuperAbilityToolOriginalDigSpeed(@NotNull ItemStack itemStack) { + Metadatable metadatable = getMetadatable(itemStack); if(metadatable.getMetadata(ABILITY_TOOL_METADATA_KEY).size() > 0) { SuperAbilityToolMeta toolMeta = (SuperAbilityToolMeta) metadatable.getMetadata(ABILITY_TOOL_METADATA_KEY).get(0); @@ -80,13 +79,13 @@ public class SpigotTemporaryDataLayer extends AbstractPersistentDataLayer { @Override public void removeBonusDigSpeedOnSuperAbilityTool(@NotNull ItemStack itemStack) { + int originalSpeed = getSuperAbilityToolOriginalDigSpeed(itemStack); ItemMeta itemMeta = itemStack.getItemMeta(); if(itemMeta.hasEnchant(Enchantment.DIG_SPEED)) { itemMeta.removeEnchant(Enchantment.DIG_SPEED); } - int originalSpeed = getSuperAbilityToolOriginalDigSpeed(itemMeta); if(originalSpeed > 0) { itemMeta.addEnchant(Enchantment.DIG_SPEED, originalSpeed, true); 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 65f724f5d..4a09a1d4a 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/SkillUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/SkillUtils.java @@ -24,13 +24,10 @@ import org.bukkit.Material; import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Player; import org.bukkit.inventory.*; -import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; -import java.util.ArrayList; import java.util.Iterator; -import java.util.List; public class SkillUtils { @@ -210,7 +207,7 @@ public class SkillUtils { //1.14+ will have persistent metadata for this itemStack AbstractPersistentDataLayer compatLayer = mcMMO.getCompatibilityManager().getPersistentDataLayer(); - if(compatLayer.isSuperAbilityBoosted(itemStack.getItemMeta())) + if(compatLayer.isSuperAbilityBoosted(itemStack)) compatLayer.removeBonusDigSpeedOnSuperAbilityTool(itemStack); } From e5f17381686a3a449cf17dde98aff92c7ee38b51 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 18 Aug 2020 20:24:45 -0700 Subject: [PATCH 129/662] 1.13.2 related bugfixes for the new item tracking --- .../nossr50/listeners/BlockListener.java | 2 +- .../nossr50/listeners/PlayerListener.java | 2 +- .../runnables/skills/AbilityDisableTask.java | 2 +- .../com/gmail/nossr50/util/ItemUtils.java | 11 +++-- .../AbstractPersistentDataLayer.java | 24 ++++++++--- .../SpigotPersistentDataLayer.java | 17 ++------ .../SpigotTemporaryDataLayer.java | 43 +++++++++++++++---- .../gmail/nossr50/util/skills/SkillUtils.java | 14 +++--- 8 files changed, 73 insertions(+), 42 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java index a4a7258b3..e5eafb665 100644 --- a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java @@ -687,7 +687,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/PlayerListener.java b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java index dc6423a57..95cdc540d 100644 --- a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java @@ -654,7 +654,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(); } 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 76dd5a401..11cd015a6 100644 --- a/src/main/java/com/gmail/nossr50/runnables/skills/AbilityDisableTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/skills/AbilityDisableTask.java @@ -37,7 +37,7 @@ public class AbilityDisableTask extends BukkitRunnable { switch (ability) { case SUPER_BREAKER: case GIGA_DRILL_BREAKER: - SkillUtils.handleAbilitySpeedDecrease(player); + SkillUtils.removeAbilityBoostsFromInventory(player); // Fallthrough case BERSERK: diff --git a/src/main/java/com/gmail/nossr50/util/ItemUtils.java b/src/main/java/com/gmail/nossr50/util/ItemUtils.java index 3a9c126ab..a12234aa5 100644 --- a/src/main/java/com/gmail/nossr50/util/ItemUtils.java +++ b/src/main/java/com/gmail/nossr50/util/ItemUtils.java @@ -13,6 +13,7 @@ import org.bukkit.inventory.FurnaceRecipe; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.Recipe; import org.bukkit.inventory.meta.ItemMeta; +import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.List; @@ -485,7 +486,7 @@ public final class ItemUtils { return itemMeta.hasDisplayName() && itemMeta.getDisplayName().equals(ChatColor.GOLD + LocaleLoader.getString("Item.ChimaeraWing.Name")); } - public static void addAbilityLore(ItemStack itemStack) { + public static void addAbilityLore(@NotNull ItemStack itemStack) { ItemMeta itemMeta = itemStack.getItemMeta(); List itemLore = new ArrayList<>(); @@ -502,7 +503,7 @@ public final class ItemUtils { itemStack.setItemMeta(itemMeta); } - public static void removeAbilityLore(ItemStack itemStack) { + public static void removeAbilityLore(@NotNull ItemStack itemStack) { ItemMeta itemMeta = itemStack.getItemMeta(); if(itemMeta == null) @@ -521,7 +522,7 @@ public final class ItemUtils { } } - public static void addDigSpeedToItem(ItemStack itemStack, int existingEnchantLevel) { + public static void addDigSpeedToItem(@NotNull ItemStack itemStack, int existingEnchantLevel) { ItemMeta itemMeta = itemStack.getItemMeta(); if(itemMeta == null) @@ -530,4 +531,8 @@ public final class ItemUtils { itemMeta.addEnchant(Enchantment.DIG_SPEED, existingEnchantLevel + AdvancedConfig.getInstance().getEnchantBuff(), true); itemStack.setItemMeta(itemMeta); } + + public static boolean canBeSuperAbilityDigBoosted(@NotNull ItemStack itemStack) { + return isShovel(itemStack) || isPickaxe(itemStack); + } } diff --git a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/AbstractPersistentDataLayer.java b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/AbstractPersistentDataLayer.java index cbea2f1aa..ad28290bc 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/AbstractPersistentDataLayer.java +++ b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/AbstractPersistentDataLayer.java @@ -1,29 +1,39 @@ package com.gmail.nossr50.util.compat.layers.persistentdata; +import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.compat.layers.AbstractCompatibilityLayer; +import org.bukkit.NamespacedKey; import org.bukkit.block.Furnace; import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.UUID; public abstract class AbstractPersistentDataLayer extends AbstractCompatibilityLayer { + public final NamespacedKey superAbilityBoosted; + public final String SUPER_ABILITY_BOOSTED = "super_ability_boosted"; + public AbstractPersistentDataLayer() { + superAbilityBoosted = getNamespacedKey(SUPER_ABILITY_BOOSTED); initializeLayer(); } - public abstract @Nullable UUID getFurnaceOwner(Furnace furnace); + public @NotNull NamespacedKey getNamespacedKey(@NotNull String key) { + return new NamespacedKey(mcMMO.p, key); + } - public abstract void setFurnaceOwner(Furnace furnace, UUID uuid); + public abstract @Nullable UUID getFurnaceOwner(@NotNull Furnace furnace); - public abstract void setSuperAbilityBoostedItem(ItemStack itemStack, int originalDigSpeed); + public abstract void setFurnaceOwner(@NotNull Furnace furnace, @NotNull UUID uuid); - public abstract boolean isSuperAbilityBoosted(ItemStack itemStack); + public abstract void setSuperAbilityBoostedItem(@NotNull ItemStack itemStack, int originalDigSpeed); - public abstract int getSuperAbilityToolOriginalDigSpeed(ItemStack itemStack); + public abstract boolean isSuperAbilityBoosted(@NotNull ItemStack itemStack); - public abstract void removeBonusDigSpeedOnSuperAbilityTool(ItemStack itemStack); + public abstract int getSuperAbilityToolOriginalDigSpeed(@NotNull ItemStack itemStack); + + public abstract void removeBonusDigSpeedOnSuperAbilityTool(@NotNull ItemStack itemStack); } diff --git a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer.java b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer.java index d6e096e70..4297b3f70 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer.java +++ b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer.java @@ -21,12 +21,9 @@ public class SpigotPersistentDataLayer extends AbstractPersistentDataLayer { */ public static final String FURNACE_UUID_MOST_SIG = "furnace_uuid_most_sig"; public static final String FURNACE_UUID_LEAST_SIG = "furnace_uuid_least_sig"; - public static final String SUPER_ABILITY_BOOSTED = "super_ability_boosted"; private NamespacedKey furnaceOwner_MostSig_Key; private NamespacedKey furnaceOwner_LeastSig_Key; - private NamespacedKey superAbilityBoosted; - @Override public boolean initializeLayer() { @@ -37,16 +34,10 @@ public class SpigotPersistentDataLayer extends AbstractPersistentDataLayer { private void initNamespacedKeys() { furnaceOwner_MostSig_Key = getNamespacedKey(FURNACE_UUID_MOST_SIG); furnaceOwner_LeastSig_Key = getNamespacedKey(FURNACE_UUID_LEAST_SIG); - superAbilityBoosted = getNamespacedKey(SUPER_ABILITY_BOOSTED); - } - - @NotNull - public NamespacedKey getNamespacedKey(String key) { - return new NamespacedKey(mcMMO.p, key); } @Override - public @Nullable UUID getFurnaceOwner(Furnace furnace) { + public @Nullable UUID getFurnaceOwner(@NotNull Furnace furnace) { //Get container from entity PersistentDataContainer dataContainer = ((PersistentDataHolder) furnace).getPersistentDataContainer(); @@ -62,7 +53,7 @@ public class SpigotPersistentDataLayer extends AbstractPersistentDataLayer { } @Override - public void setFurnaceOwner(Furnace furnace, UUID uuid) { + public void setFurnaceOwner(@NotNull Furnace furnace, @NotNull UUID uuid) { PersistentDataContainer dataContainer = ((PersistentDataHolder) furnace).getPersistentDataContainer(); dataContainer.set(furnaceOwner_MostSig_Key, PersistentDataType.LONG, uuid.getMostSignificantBits()); @@ -72,7 +63,7 @@ public class SpigotPersistentDataLayer extends AbstractPersistentDataLayer { } @Override - public void setSuperAbilityBoostedItem(ItemStack itemStack, int originalDigSpeed) { + 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; @@ -87,7 +78,7 @@ public class SpigotPersistentDataLayer extends AbstractPersistentDataLayer { } @Override - public boolean isSuperAbilityBoosted(ItemStack itemStack) { + public boolean isSuperAbilityBoosted(@NotNull ItemStack itemStack) { if(itemStack.getItemMeta() == null) return false; diff --git a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotTemporaryDataLayer.java b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotTemporaryDataLayer.java index 1d52cb997..17a68b325 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotTemporaryDataLayer.java +++ b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotTemporaryDataLayer.java @@ -5,8 +5,11 @@ import com.gmail.nossr50.datatypes.meta.UUIDMeta; import com.gmail.nossr50.mcMMO; import org.bukkit.block.Furnace; import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Item; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.inventory.meta.tags.CustomItemTagContainer; +import org.bukkit.inventory.meta.tags.ItemTagType; import org.bukkit.metadata.Metadatable; import org.jetbrains.annotations.NotNull; @@ -26,7 +29,7 @@ public class SpigotTemporaryDataLayer extends AbstractPersistentDataLayer { } @Override - public UUID getFurnaceOwner(Furnace furnace) { + public UUID getFurnaceOwner(@NotNull Furnace furnace) { Metadatable metadatable = (Metadatable) furnace; if(metadatable.getMetadata(FURNACE_OWNER_METADATA_KEY).size() > 0) { @@ -38,7 +41,7 @@ public class SpigotTemporaryDataLayer extends AbstractPersistentDataLayer { } @Override - public void setFurnaceOwner(@NotNull Furnace furnace, UUID uuid) { + public void setFurnaceOwner(@NotNull Furnace furnace, @NotNull UUID uuid) { Metadatable metadatable = (Metadatable) furnace; if(metadatable.getMetadata(FURNACE_OWNER_METADATA_KEY).size() > 0) { @@ -52,6 +55,17 @@ public class SpigotTemporaryDataLayer extends AbstractPersistentDataLayer { public void setSuperAbilityBoostedItem(@NotNull ItemStack itemStack, int originalDigSpeed) { Metadatable metadatable = getMetadatable(itemStack); metadatable.setMetadata(ABILITY_TOOL_METADATA_KEY, new SuperAbilityToolMeta(originalDigSpeed, mcMMO.p)); + + + ItemMeta itemMeta = itemStack.getItemMeta(); + + if(itemMeta == null) { + mcMMO.p.getLogger().severe("Item meta should never be null for a super boosted item!"); + return; + } + + itemMeta.getCustomTagContainer().setCustomTag(superAbilityBoosted, ItemTagType.INTEGER, originalDigSpeed); + itemStack.setItemMeta(itemMeta); } private Metadatable getMetadatable(@NotNull ItemStack itemStack) { @@ -60,19 +74,27 @@ public class SpigotTemporaryDataLayer extends AbstractPersistentDataLayer { @Override public boolean isSuperAbilityBoosted(@NotNull ItemStack itemStack) { - Metadatable metadatable = getMetadatable(itemStack); - return metadatable.getMetadata(ABILITY_TOOL_METADATA_KEY).size() > 0; + ItemMeta itemMeta = itemStack.getItemMeta(); + + if(itemMeta == null) + return false; + + CustomItemTagContainer tagContainer = itemMeta.getCustomTagContainer(); + return tagContainer.hasCustomTag(superAbilityBoosted, ItemTagType.INTEGER); } @Override public int getSuperAbilityToolOriginalDigSpeed(@NotNull ItemStack itemStack) { - Metadatable metadatable = getMetadatable(itemStack); + ItemMeta itemMeta = itemStack.getItemMeta(); - if(metadatable.getMetadata(ABILITY_TOOL_METADATA_KEY).size() > 0) { - SuperAbilityToolMeta toolMeta = (SuperAbilityToolMeta) metadatable.getMetadata(ABILITY_TOOL_METADATA_KEY).get(0); - return toolMeta.asInt(); + if(itemMeta == null) + return 0; + + CustomItemTagContainer tagContainer = itemMeta.getCustomTagContainer(); + + if(tagContainer.hasCustomTag(superAbilityBoosted , ItemTagType.INTEGER)) { + return tagContainer.getCustomTag(superAbilityBoosted, ItemTagType.INTEGER); } else { -// mcMMO.p.getLogger().info("Original dig enchant speed could not be found on item! Most likely it was lost from a server restart."); return 0; } } @@ -82,6 +104,9 @@ public class SpigotTemporaryDataLayer extends AbstractPersistentDataLayer { int originalSpeed = getSuperAbilityToolOriginalDigSpeed(itemStack); ItemMeta itemMeta = itemStack.getItemMeta(); + if(itemMeta == null) + return; + if(itemMeta.hasEnchant(Enchantment.DIG_SPEED)) { itemMeta.removeEnchant(Enchantment.DIG_SPEED); } 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 4a09a1d4a..5ff38705a 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/SkillUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/SkillUtils.java @@ -26,6 +26,7 @@ import org.bukkit.entity.Player; import org.bukkit.inventory.*; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; +import org.jetbrains.annotations.NotNull; import java.util.Iterator; @@ -131,7 +132,7 @@ public class SkillUtils { if (HiddenConfig.getInstance().useEnchantmentBuffs()) { ItemStack heldItem = player.getInventory().getItemInMainHand(); - if (heldItem == null || heldItem.getType() == Material.AIR) { + if (!ItemUtils.canBeSuperAbilityDigBoosted(heldItem)) { return; } @@ -186,20 +187,19 @@ public class SkillUtils { } } - public static void handleAbilitySpeedDecrease(Player player) { + public static void removeAbilityBoostsFromInventory(@NotNull Player player) { if (!HiddenConfig.getInstance().useEnchantmentBuffs()) { return; } - for (ItemStack item : player.getInventory().getContents()) { - removeAbilityBuff(item); + for (ItemStack itemStack : player.getInventory().getContents()) { + removeAbilityBuff(itemStack); } } - public static void removeAbilityBuff(ItemStack itemStack) { - if (itemStack == null || itemStack.getType() == Material.AIR) { + public static void removeAbilityBuff(@NotNull ItemStack itemStack) { + if(!ItemUtils.canBeSuperAbilityDigBoosted(itemStack)) return; - } //Take the lore off ItemUtils.removeAbilityLore(itemStack); From 7ea9ec5c2ff8290df400618a2b1f88f26d8e7926 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 18 Aug 2020 20:28:09 -0700 Subject: [PATCH 130/662] Another 1.13.2 fix --- .../persistentdata/SpigotTemporaryDataLayer.java | 10 ---------- .../java/com/gmail/nossr50/util/skills/SkillUtils.java | 5 ++++- 2 files changed, 4 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotTemporaryDataLayer.java b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotTemporaryDataLayer.java index 17a68b325..744dbf830 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotTemporaryDataLayer.java +++ b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotTemporaryDataLayer.java @@ -1,11 +1,9 @@ package com.gmail.nossr50.util.compat.layers.persistentdata; -import com.gmail.nossr50.datatypes.meta.SuperAbilityToolMeta; import com.gmail.nossr50.datatypes.meta.UUIDMeta; import com.gmail.nossr50.mcMMO; import org.bukkit.block.Furnace; import org.bukkit.enchantments.Enchantment; -import org.bukkit.entity.Item; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.tags.CustomItemTagContainer; @@ -53,10 +51,6 @@ public class SpigotTemporaryDataLayer extends AbstractPersistentDataLayer { @Override public void setSuperAbilityBoostedItem(@NotNull ItemStack itemStack, int originalDigSpeed) { - Metadatable metadatable = getMetadatable(itemStack); - metadatable.setMetadata(ABILITY_TOOL_METADATA_KEY, new SuperAbilityToolMeta(originalDigSpeed, mcMMO.p)); - - ItemMeta itemMeta = itemStack.getItemMeta(); if(itemMeta == null) { @@ -68,10 +62,6 @@ public class SpigotTemporaryDataLayer extends AbstractPersistentDataLayer { itemStack.setItemMeta(itemMeta); } - private Metadatable getMetadatable(@NotNull ItemStack itemStack) { - return (Metadatable) itemStack; - } - @Override public boolean isSuperAbilityBoosted(@NotNull ItemStack itemStack) { ItemMeta itemMeta = itemStack.getItemMeta(); 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 5ff38705a..316588013 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/SkillUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/SkillUtils.java @@ -23,7 +23,10 @@ import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Player; -import org.bukkit.inventory.*; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.Recipe; +import org.bukkit.inventory.ShapedRecipe; +import org.bukkit.inventory.ShapelessRecipe; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; import org.jetbrains.annotations.NotNull; From 1feee7f312b47410504a187f422b1ee381186e5b Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 18 Aug 2020 20:38:56 -0700 Subject: [PATCH 131/662] 1.13.2 fix round 3.. or 4 --- .../gmail/nossr50/listeners/InventoryListener.java | 6 +++++- src/main/java/com/gmail/nossr50/util/ItemUtils.java | 12 ++++++------ .../com/gmail/nossr50/util/skills/SkillUtils.java | 9 ++++++++- 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java b/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java index 6c0ac6a0a..f068e8fab 100644 --- a/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java @@ -383,6 +383,10 @@ public class InventoryListener implements Listener { @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) { if(isOutsideWindowClick(event)) @@ -391,7 +395,7 @@ public class InventoryListener implements Listener { PlayerInventory playerInventory = event.getWhoClicked().getInventory(); if(playerInventory.getItem(event.getHotbarButton()) != null) - SkillUtils.removeAbilityBuff(event.getWhoClicked().getInventory().getItem(event.getHotbarButton())); + SkillUtils.removeAbilityBuff(playerInventory.getItem(event.getHotbarButton())); } } diff --git a/src/main/java/com/gmail/nossr50/util/ItemUtils.java b/src/main/java/com/gmail/nossr50/util/ItemUtils.java index a12234aa5..e96e8949c 100644 --- a/src/main/java/com/gmail/nossr50/util/ItemUtils.java +++ b/src/main/java/com/gmail/nossr50/util/ItemUtils.java @@ -31,7 +31,7 @@ public final class ItemUtils { return mcMMO.getMaterialMapStore().isBow(item.getType().getKey().getKey()); } - public static boolean hasItemInEitherHand(Player player, Material material) { + public static boolean hasItemInEitherHand(@NotNull Player player, Material material) { return player.getInventory().getItemInMainHand().getType() == material || player.getInventory().getItemInOffHand().getType() == material; } @@ -41,7 +41,7 @@ public final class ItemUtils { * @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()); } @@ -51,7 +51,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()); } @@ -61,7 +61,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()); } @@ -71,7 +71,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()); } @@ -81,7 +81,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()); } 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 316588013..cafb0710b 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/SkillUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/SkillUtils.java @@ -30,6 +30,7 @@ import org.bukkit.inventory.ShapelessRecipe; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.Iterator; @@ -135,6 +136,9 @@ public class SkillUtils { if (HiddenConfig.getInstance().useEnchantmentBuffs()) { ItemStack heldItem = player.getInventory().getItemInMainHand(); + if(heldItem == null) + return; + if (!ItemUtils.canBeSuperAbilityDigBoosted(heldItem)) { return; } @@ -200,7 +204,10 @@ public class SkillUtils { } } - public static void removeAbilityBuff(@NotNull ItemStack itemStack) { + public static void removeAbilityBuff(@Nullable ItemStack itemStack) { + if(itemStack == null) + return; + if(!ItemUtils.canBeSuperAbilityDigBoosted(itemStack)) return; From 500ab628dd6b2539d9be89659a0ad2a9b0b22e1b Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 18 Aug 2020 21:11:15 -0700 Subject: [PATCH 132/662] 2.1.143 --- Changelog.txt | 9 ++--- pom.xml | 2 +- .../com/gmail/nossr50/util/ItemUtils.java | 33 +++++++++---------- .../AbstractPersistentDataLayer.java | 17 ++++++++++ .../SpigotTemporaryDataLayer.java | 1 - .../gmail/nossr50/util/skills/SkillUtils.java | 28 ++++++++++++---- 6 files changed, 60 insertions(+), 30 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index cfedff549..f4fbe7d17 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,11 +1,12 @@ Version 2.1.143 - mcMMO now tracks super ability boosted items through item metadata + 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 + 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 on 1.14+ is persistent (up until now its been temporary) - Lore still gets added and removed from the item, this is sort of a failsafe. It can be considered optional. + 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 "mcMMO Ability Tool" lore on them won't get touched by anything this update does, there is no way to tell what the true enchant values on those items should be. Version 2.1.142 Iron Arm Style renamed to Steel Arm Style diff --git a/pom.xml b/pom.xml index 402e8a0c7..4093a28f6 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.143-SNAPSHOT + 2.1.143 mcMMO https://github.com/mcMMO-Dev/mcMMO diff --git a/src/main/java/com/gmail/nossr50/util/ItemUtils.java b/src/main/java/com/gmail/nossr50/util/ItemUtils.java index e96e8949c..4fca5938b 100644 --- a/src/main/java/com/gmail/nossr50/util/ItemUtils.java +++ b/src/main/java/com/gmail/nossr50/util/ItemUtils.java @@ -15,7 +15,6 @@ import org.bukkit.inventory.Recipe; import org.bukkit.inventory.meta.ItemMeta; import org.jetbrains.annotations.NotNull; -import java.util.ArrayList; import java.util.List; public final class ItemUtils { @@ -486,22 +485,22 @@ public final class ItemUtils { 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 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(); diff --git a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/AbstractPersistentDataLayer.java b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/AbstractPersistentDataLayer.java index ad28290bc..db07578cc 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/AbstractPersistentDataLayer.java +++ b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/AbstractPersistentDataLayer.java @@ -5,13 +5,16 @@ import com.gmail.nossr50.util.compat.layers.AbstractCompatibilityLayer; import org.bukkit.NamespacedKey; import org.bukkit.block.Furnace; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.List; import java.util.UUID; public abstract class AbstractPersistentDataLayer extends AbstractCompatibilityLayer { + public static final String LEGACY_ABILITY_TOOL_LORE = "mcMMO Ability Tool"; public final NamespacedKey superAbilityBoosted; public final String SUPER_ABILITY_BOOSTED = "super_ability_boosted"; @@ -36,4 +39,18 @@ public abstract class AbstractPersistentDataLayer extends AbstractCompatibilityL public abstract void removeBonusDigSpeedOnSuperAbilityTool(@NotNull ItemStack itemStack); + public boolean isLegacyAbilityTool(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); + } + } diff --git a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotTemporaryDataLayer.java b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotTemporaryDataLayer.java index 744dbf830..c5b32138d 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotTemporaryDataLayer.java +++ b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotTemporaryDataLayer.java @@ -19,7 +19,6 @@ import java.util.UUID; public class SpigotTemporaryDataLayer extends AbstractPersistentDataLayer { private final String FURNACE_OWNER_METADATA_KEY = "mcMMO_furnace_owner"; - private final String ABILITY_TOOL_METADATA_KEY = "mcMMO_super_ability_tool"; @Override public boolean initializeLayer() { 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 cafb0710b..d9ccf532f 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/SkillUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/SkillUtils.java @@ -27,6 +27,7 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.Recipe; import org.bukkit.inventory.ShapedRecipe; 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; @@ -145,11 +146,13 @@ public class SkillUtils { int originalDigSpeed = heldItem.getEnchantmentLevel(Enchantment.DIG_SPEED); - //Add lore, add dig speed - ItemUtils.addAbilityLore(heldItem); //lore can be a secondary failsafe for 1.13 and below + //Add dig speed + + //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)); - //1.14+ will have persistent metadata for this item + //1.13.2+ will have persistent metadata for this item AbstractPersistentDataLayer compatLayer = mcMMO.getCompatibilityManager().getPersistentDataLayer(); compatLayer.setSuperAbilityBoostedItem(heldItem, originalDigSpeed); } @@ -211,14 +214,25 @@ public class SkillUtils { if(!ItemUtils.canBeSuperAbilityDigBoosted(itemStack)) return; - //Take the lore off - ItemUtils.removeAbilityLore(itemStack); - //1.14+ will have persistent metadata for this itemStack + //1.13.2+ will have persistent metadata for this itemStack AbstractPersistentDataLayer compatLayer = mcMMO.getCompatibilityManager().getPersistentDataLayer(); - if(compatLayer.isSuperAbilityBoosted(itemStack)) + if(compatLayer.isLegacyAbilityTool(itemStack)) { + ItemMeta itemMeta = itemStack.getItemMeta(); + + //TODO: can be optimized + if(itemMeta.hasEnchant(Enchantment.DIG_SPEED)) { + itemMeta.removeEnchant(Enchantment.DIG_SPEED); + } + + itemStack.setItemMeta(itemMeta); + ItemUtils.removeAbilityLore(itemStack); + } + + if(compatLayer.isSuperAbilityBoosted(itemStack)) { compatLayer.removeBonusDigSpeedOnSuperAbilityTool(itemStack); + } } public static void handleDurabilityChange(ItemStack itemStack, int durabilityModifier) { From b8a38bf9755f0c08a61eaaf875395faa9e8a6585 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 18 Aug 2020 21:16:48 -0700 Subject: [PATCH 133/662] small tweak --- Changelog.txt | 2 +- .../layers/persistentdata/AbstractPersistentDataLayer.java | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index f4fbe7d17..17778b4fb 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -6,7 +6,7 @@ Version 2.1.143 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 "mcMMO Ability Tool" lore on them won't get touched by anything this update does, there is no way to tell what the true enchant values on those items should be. + 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 diff --git a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/AbstractPersistentDataLayer.java b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/AbstractPersistentDataLayer.java index db07578cc..a11d3df9a 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/AbstractPersistentDataLayer.java +++ b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/AbstractPersistentDataLayer.java @@ -53,4 +53,7 @@ public abstract class AbstractPersistentDataLayer extends AbstractCompatibilityL return lore.contains(LEGACY_ABILITY_TOOL_LORE); } + public static String getLegacyAbilityToolLore() { + return LEGACY_ABILITY_TOOL_LORE; + } } From b35c58ec21f8eaec83f57f11b869fba6765b3856 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20Marczink=C3=B3?= Date: Thu, 20 Aug 2020 21:46:09 +0200 Subject: [PATCH 134/662] Update locale_hu_HU.properties (#4264) --- .../resources/locale/locale_hu_HU.properties | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src/main/resources/locale/locale_hu_HU.properties b/src/main/resources/locale/locale_hu_HU.properties index a037be8ca..ec8a0d86d 100644 --- a/src/main/resources/locale/locale_hu_HU.properties +++ b/src/main/resources/locale/locale_hu_HU.properties @@ -138,7 +138,7 @@ 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.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 [[YELLOW]]{6}%[[GRAY]]. 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 @@ -165,8 +165,8 @@ 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.Daze.Stat=Es\u00E9ly K\u00E1b\u00EDt\u00E1sra 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 @@ -489,7 +489,7 @@ Taming.Summon.COTW.BreedingDisallowed=[[GREEN]](A Vadon Szava) [[RED]]Nem szapor 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} #UNARMED -Unarmed.Ability.Bonus.0=Vas-\u00D6k\u00F6l St\u00EDlus +Unarmed.Ability.Bonus.0=Ac\u00E9l-\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! @@ -504,8 +504,8 @@ 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.SteelArmStyle.Name=Ac\u00E9l-\u00D6k\u00F6l St\u00EDlus +Unarmed.SubSkill.SteelArmStyle.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 @@ -699,6 +699,8 @@ Commands.Scoreboard.Help.2=[[DARK_AQUA]]/mcscoreboard[[AQUA]] keep [[WHITE]] - a 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.XPBar.Reset=[[GOLD]]Az XP s\u00E1v be\u00E1ll\u00EDt\u00E1sok az mcMMO-hoz vissza\u00E1ll\u00EDtva. +Commands.XPBar.SettingChanged=[[GOLD]]XP s\u00E1v be\u00E1ll\u00EDt\u00E1sok [[GREEN]]{0}[[GOLD]]-nak/nek be\u00E1ll\u00EDtve erre [[GREEN]]{1} 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-- @@ -721,8 +723,8 @@ 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.NoMatch=Ez az alk\u00E9pess\u00E9g nem l\u00E9tezik! 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]][]=====[]=- @@ -945,7 +947,7 @@ Guides.Taming.Section.8=[[DARK_AQUA]]Hogyan m\u0171k\u00F6dik a Gyors\u00E9tterm ##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.2=[[DARK_AQUA]]Hogyan m\u0171k\u00F6dik az Ac\u00E9l-\u00D6k\u00F6l St\u00EDlus?\n[[YELLOW]]Az Ac\u00E9l-\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. @@ -979,6 +981,7 @@ 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.Extra=[[DARK_RED]]T\u00F6bbre van sz\u00FCks\u00E9ged [[GRAY]]{0}{1} 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} @@ -1109,4 +1112,7 @@ LevelCap.PowerLevel=[[GOLD]]([[GREEN]]mcMMO[[GOLD]]) [[YELLOW]]El\u00E9rted ezt 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. 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. +Commands.Description.mmocompat=Inform\u00E1ci\u00F3 az mcMMO-r\u00F3l \u00E9s arr\u00F3l, hogy kompatibilit\u00E1si m\u00F3dban van-e, vagy teljesen m\u0171k\u00F6d\u0151k\u00E9pes-e. +Compatibility.Layer.Unsupported=[[GOLD]]A kompatibilit\u00E1s ezen a Minecraft verzi\u00F3n [[GREEN]]{0}[[GOLD]] nem t\u00E1mogatott. +Compatibility.Layer.PartialSupport=[[GOLD]]A kompatibilit\u00E1s ezen a Minecraft verzi\u00F3n [[GREEN]]{0}[[GOLD]] nem teljesen t\u00E1mogatott, de az mcMMO egy m\u00E1sodlagos rendszert futtat n\u00E9h\u00E1ny hi\u00E1nyz\u00F3 funkci\u00F3 emul\u00E1l\u00E1s\u00E1ra. +Commands.XPBar.DisableAll=[[GOLD]] Most az \u00F6sszes mcMMO XP s\u00E1v le van tiltva, haszn\u00E1ld a /mmoxpbar reset parancsot az alap\u00E9rtelmezett be\u00E1ll\u00EDt\u00E1sok vissza\u00E1ll\u00EDt\u00E1s\u00E1hoz. From b0e8fedf6f5a94c8de58f2c40ac8fbeec0f723f2 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 25 Aug 2020 14:10:53 -0700 Subject: [PATCH 135/662] Fixed a taming NPE --- Changelog.txt | 6 ++++++ pom.xml | 2 +- .../com/gmail/nossr50/listeners/InventoryListener.java | 2 ++ .../gmail/nossr50/util/compat/CompatibilityManager.java | 8 ++++---- ...DataLayer.java => SpigotPersistentDataLayer_1_13.java} | 2 +- ...DataLayer.java => SpigotPersistentDataLayer_1_14.java} | 2 +- .../java/com/gmail/nossr50/util/skills/CombatUtils.java | 4 ++++ 7 files changed, 19 insertions(+), 7 deletions(-) rename src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/{SpigotTemporaryDataLayer.java => SpigotPersistentDataLayer_1_13.java} (97%) rename src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/{SpigotPersistentDataLayer.java => SpigotPersistentDataLayer_1_14.java} (98%) diff --git a/Changelog.txt b/Changelog.txt index 17778b4fb..6fedacf3f 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,9 @@ +Version 2.1.144 + Fixed a NPE that would happen involving taming in combat processing + Updated hu_HU locale (thanks andris155) + + + 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 diff --git a/pom.xml b/pom.xml index 4093a28f6..71b784cd8 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.143 + 2.1.144-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO diff --git a/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java b/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java index f068e8fab..464d83631 100644 --- a/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java @@ -72,7 +72,9 @@ public class InventoryListener implements Listener { return; } + Bukkit.broadcastMessage("Debug: Modifying burn time from - "+event.getBurnTime()); event.setBurnTime(UserManager.getPlayer(player).getSmeltingManager().fuelEfficiency(event.getBurnTime())); + Bukkit.broadcastMessage("Debug: New burn time "+event.getBurnTime()); } } 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 51720245f..a95b14b54 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/CompatibilityManager.java +++ b/src/main/java/com/gmail/nossr50/util/compat/CompatibilityManager.java @@ -5,8 +5,8 @@ import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.StringUtils; import com.gmail.nossr50.util.compat.layers.attackcooldown.PlayerAttackCooldownExploitPreventionLayer; import com.gmail.nossr50.util.compat.layers.persistentdata.AbstractPersistentDataLayer; -import com.gmail.nossr50.util.compat.layers.persistentdata.SpigotPersistentDataLayer; -import com.gmail.nossr50.util.compat.layers.persistentdata.SpigotTemporaryDataLayer; +import com.gmail.nossr50.util.compat.layers.persistentdata.SpigotPersistentDataLayer_1_14; +import com.gmail.nossr50.util.compat.layers.persistentdata.SpigotPersistentDataLayer_1_13; import com.gmail.nossr50.util.nms.NMSVersion; import com.gmail.nossr50.util.platform.MinecraftGameVersion; import org.bukkit.command.CommandSender; @@ -67,10 +67,10 @@ public class CompatibilityManager { private void initPersistentDataLayer() { if(minecraftGameVersion.getMinorVersion().asInt() >= 14 || minecraftGameVersion.getMajorVersion().asInt() >= 2) { - persistentDataLayer = new SpigotPersistentDataLayer(); + persistentDataLayer = new SpigotPersistentDataLayer_1_14(); } else { - persistentDataLayer = new SpigotTemporaryDataLayer(); + persistentDataLayer = new SpigotPersistentDataLayer_1_13(); } supportedLayers.put(CompatibilityType.PERSISTENT_DATA, true); diff --git a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotTemporaryDataLayer.java b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer_1_13.java similarity index 97% rename from src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotTemporaryDataLayer.java rename to src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer_1_13.java index c5b32138d..794aad916 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotTemporaryDataLayer.java +++ b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer_1_13.java @@ -16,7 +16,7 @@ import java.util.UUID; /** * Persistent Data API is unavailable */ -public class SpigotTemporaryDataLayer extends AbstractPersistentDataLayer { +public class SpigotPersistentDataLayer_1_13 extends AbstractPersistentDataLayer { private final String FURNACE_OWNER_METADATA_KEY = "mcMMO_furnace_owner"; diff --git a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer.java b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer_1_14.java similarity index 98% rename from src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer.java rename to src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer_1_14.java index 4297b3f70..f7e8401df 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer.java +++ b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer_1_14.java @@ -14,7 +14,7 @@ import org.jetbrains.annotations.Nullable; import java.util.UUID; -public class SpigotPersistentDataLayer extends AbstractPersistentDataLayer { +public class SpigotPersistentDataLayer_1_14 extends AbstractPersistentDataLayer { /* * Don't modify these keys 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 994e8dfe7..16bbd0c4f 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java @@ -414,6 +414,10 @@ public final class CombatUtils { if (target.getType() != EntityType.CREEPER && !Misc.isNPCEntityExcludingVillagers(player) && PrimarySkillType.TAMING.getPermissions(player)) { McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); + + if(mcMMOPlayer == null) + return; + TamingManager tamingManager = mcMMOPlayer.getTamingManager(); tamingManager.attackTarget(target); } From 8807d6c2162cab2e92a0db422e62a6f53f452bf5 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 25 Aug 2020 14:10:53 -0700 Subject: [PATCH 136/662] Fixed a taming NPE --- Changelog.txt | 6 ++++++ pom.xml | 2 +- .../com/gmail/nossr50/listeners/InventoryListener.java | 2 ++ .../gmail/nossr50/util/compat/CompatibilityManager.java | 8 ++++---- ...DataLayer.java => SpigotPersistentDataLayer_1_13.java} | 2 +- ...DataLayer.java => SpigotPersistentDataLayer_1_14.java} | 2 +- .../java/com/gmail/nossr50/util/skills/CombatUtils.java | 4 ++++ 7 files changed, 19 insertions(+), 7 deletions(-) rename src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/{SpigotTemporaryDataLayer.java => SpigotPersistentDataLayer_1_13.java} (97%) rename src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/{SpigotPersistentDataLayer.java => SpigotPersistentDataLayer_1_14.java} (98%) diff --git a/Changelog.txt b/Changelog.txt index 17778b4fb..6fedacf3f 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,9 @@ +Version 2.1.144 + Fixed a NPE that would happen involving taming in combat processing + Updated hu_HU locale (thanks andris155) + + + 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 diff --git a/pom.xml b/pom.xml index 4093a28f6..71b784cd8 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.143 + 2.1.144-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO diff --git a/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java b/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java index f068e8fab..464d83631 100644 --- a/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java @@ -72,7 +72,9 @@ public class InventoryListener implements Listener { return; } + Bukkit.broadcastMessage("Debug: Modifying burn time from - "+event.getBurnTime()); event.setBurnTime(UserManager.getPlayer(player).getSmeltingManager().fuelEfficiency(event.getBurnTime())); + Bukkit.broadcastMessage("Debug: New burn time "+event.getBurnTime()); } } 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 51720245f..a95b14b54 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/CompatibilityManager.java +++ b/src/main/java/com/gmail/nossr50/util/compat/CompatibilityManager.java @@ -5,8 +5,8 @@ import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.StringUtils; import com.gmail.nossr50.util.compat.layers.attackcooldown.PlayerAttackCooldownExploitPreventionLayer; import com.gmail.nossr50.util.compat.layers.persistentdata.AbstractPersistentDataLayer; -import com.gmail.nossr50.util.compat.layers.persistentdata.SpigotPersistentDataLayer; -import com.gmail.nossr50.util.compat.layers.persistentdata.SpigotTemporaryDataLayer; +import com.gmail.nossr50.util.compat.layers.persistentdata.SpigotPersistentDataLayer_1_14; +import com.gmail.nossr50.util.compat.layers.persistentdata.SpigotPersistentDataLayer_1_13; import com.gmail.nossr50.util.nms.NMSVersion; import com.gmail.nossr50.util.platform.MinecraftGameVersion; import org.bukkit.command.CommandSender; @@ -67,10 +67,10 @@ public class CompatibilityManager { private void initPersistentDataLayer() { if(minecraftGameVersion.getMinorVersion().asInt() >= 14 || minecraftGameVersion.getMajorVersion().asInt() >= 2) { - persistentDataLayer = new SpigotPersistentDataLayer(); + persistentDataLayer = new SpigotPersistentDataLayer_1_14(); } else { - persistentDataLayer = new SpigotTemporaryDataLayer(); + persistentDataLayer = new SpigotPersistentDataLayer_1_13(); } supportedLayers.put(CompatibilityType.PERSISTENT_DATA, true); diff --git a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotTemporaryDataLayer.java b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer_1_13.java similarity index 97% rename from src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotTemporaryDataLayer.java rename to src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer_1_13.java index c5b32138d..794aad916 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotTemporaryDataLayer.java +++ b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer_1_13.java @@ -16,7 +16,7 @@ import java.util.UUID; /** * Persistent Data API is unavailable */ -public class SpigotTemporaryDataLayer extends AbstractPersistentDataLayer { +public class SpigotPersistentDataLayer_1_13 extends AbstractPersistentDataLayer { private final String FURNACE_OWNER_METADATA_KEY = "mcMMO_furnace_owner"; diff --git a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer.java b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer_1_14.java similarity index 98% rename from src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer.java rename to src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer_1_14.java index 4297b3f70..f7e8401df 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer.java +++ b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer_1_14.java @@ -14,7 +14,7 @@ import org.jetbrains.annotations.Nullable; import java.util.UUID; -public class SpigotPersistentDataLayer extends AbstractPersistentDataLayer { +public class SpigotPersistentDataLayer_1_14 extends AbstractPersistentDataLayer { /* * Don't modify these keys 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 994e8dfe7..16bbd0c4f 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java @@ -414,6 +414,10 @@ public final class CombatUtils { if (target.getType() != EntityType.CREEPER && !Misc.isNPCEntityExcludingVillagers(player) && PrimarySkillType.TAMING.getPermissions(player)) { McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); + + if(mcMMOPlayer == null) + return; + TamingManager tamingManager = mcMMOPlayer.getTamingManager(); tamingManager.attackTarget(target); } From f684b0927694bccea97c28874fd3bb0589650f7f Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 25 Aug 2020 14:11:43 -0700 Subject: [PATCH 137/662] brain no worky today --- .../java/com/gmail/nossr50/listeners/InventoryListener.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java b/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java index 464d83631..bfa1da0ca 100644 --- a/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java @@ -72,9 +72,9 @@ public class InventoryListener implements Listener { return; } - Bukkit.broadcastMessage("Debug: Modifying burn time from - "+event.getBurnTime()); +// Bukkit.broadcastMessage("Debug: Modifying burn time from - "+event.getBurnTime()); event.setBurnTime(UserManager.getPlayer(player).getSmeltingManager().fuelEfficiency(event.getBurnTime())); - Bukkit.broadcastMessage("Debug: New burn time "+event.getBurnTime()); +// Bukkit.broadcastMessage("Debug: New burn time "+event.getBurnTime()); } } From bfa092a67c1e1a4f4660381f22ff223c614be304 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 25 Aug 2020 14:33:31 -0700 Subject: [PATCH 138/662] add fuel efficiency info for mmodebug --- Changelog.txt | 1 + .../nossr50/listeners/InventoryListener.java | 17 +++++++++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 6fedacf3f..1c1023f1b 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,6 +1,7 @@ Version 2.1.144 Fixed a NPE that would happen involving taming in combat processing Updated hu_HU locale (thanks andris155) + mmodebug mode now prints some information when fuel efficiency is applied to a furnace diff --git a/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java b/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java index bfa1da0ca..bf78964d6 100644 --- a/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java @@ -72,9 +72,22 @@ public class InventoryListener implements Listener { return; } -// Bukkit.broadcastMessage("Debug: Modifying burn time from - "+event.getBurnTime()); + + 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())); -// Bukkit.broadcastMessage("Debug: New burn time "+event.getBurnTime()); + + if(debugMode) { + player.sendMessage("New Furnace Burn Length (after applying fuel efficiency) "+event.getBurnTime()); + player.sendMessage(""); + } } } From 56abad5360111d902f5d21e571b3420a571c4843 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 25 Aug 2020 14:53:06 -0700 Subject: [PATCH 139/662] Fixed a bug where Roll didn't award XP at great heights --- Changelog.txt | 4 +++- .../nossr50/datatypes/skills/subskills/acrobatics/Roll.java | 4 ++-- .../com/gmail/nossr50/util/compat/CompatibilityManager.java | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 1c1023f1b..d1d2cf19f 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,4 +1,6 @@ Version 2.1.144 + 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) mmodebug mode now prints some information when fuel efficiency is applied to a furnace @@ -9,7 +11,7 @@ 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 + 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. 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 9c233ae5e..62f58a582 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 @@ -76,7 +76,7 @@ public class Roll extends AcrobaticsSubSkill { */ Player player = (Player) ((EntityDamageEvent) event).getEntity(); if (canRoll(player)) { - entityDamageEvent.setDamage(rollCheck(player, mcMMOPlayer, entityDamageEvent.getDamage())); + entityDamageEvent.setDamage(rollCheck(player, mcMMOPlayer, entityDamageEvent.getFinalDamage())); if (entityDamageEvent.getFinalDamage() == 0) { entityDamageEvent.setCancelled(true); @@ -293,7 +293,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())); 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 a95b14b54..3ff3c1530 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/CompatibilityManager.java +++ b/src/main/java/com/gmail/nossr50/util/compat/CompatibilityManager.java @@ -5,8 +5,8 @@ import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.StringUtils; import com.gmail.nossr50.util.compat.layers.attackcooldown.PlayerAttackCooldownExploitPreventionLayer; import com.gmail.nossr50.util.compat.layers.persistentdata.AbstractPersistentDataLayer; -import com.gmail.nossr50.util.compat.layers.persistentdata.SpigotPersistentDataLayer_1_14; import com.gmail.nossr50.util.compat.layers.persistentdata.SpigotPersistentDataLayer_1_13; +import com.gmail.nossr50.util.compat.layers.persistentdata.SpigotPersistentDataLayer_1_14; import com.gmail.nossr50.util.nms.NMSVersion; import com.gmail.nossr50.util.platform.MinecraftGameVersion; import org.bukkit.command.CommandSender; From e4c5a3b8ee976147768bb8a042af7256716a9303 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 25 Aug 2020 16:14:08 -0700 Subject: [PATCH 140/662] two deflect bugs down --- Changelog.txt | 5 ++++- .../com/gmail/nossr50/listeners/EntityListener.java | 2 +- .../com/gmail/nossr50/util/skills/CombatUtils.java | 12 ------------ 3 files changed, 5 insertions(+), 14 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index d1d2cf19f..93ee3d2f2 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,11 +1,14 @@ Version 2.1.144 + 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) 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. Version 2.1.143 mcMMO now tracks super ability boosted items through persistent metadata diff --git a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java index 275c52155..6824b472e 100644 --- a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java @@ -388,7 +388,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; } 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 16bbd0c4f..67ff06589 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java @@ -256,18 +256,6 @@ 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); From 419a810a1ebffaa729222ebe6cba20a62916a544 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 25 Aug 2020 16:28:21 -0700 Subject: [PATCH 141/662] Steel Arm Style can now be customized in advanced.yml --- Changelog.txt | 2 ++ .../gmail/nossr50/config/AdvancedConfig.java | 5 ++++ .../skills/unarmed/UnarmedManager.java | 10 +++++++- src/main/resources/advanced.yml | 25 +++++++++++++++++-- 4 files changed, 39 insertions(+), 3 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 93ee3d2f2..c34fef88b 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,4 +1,5 @@ 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 @@ -9,6 +10,7 @@ Version 2.1.144 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 Version 2.1.143 mcMMO now tracks super ability boosted items through persistent metadata diff --git a/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java b/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java index 615488646..e51edeaad 100644 --- a/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java +++ b/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java @@ -981,6 +981,11 @@ public class AdvancedConfig extends AutoUpdateConfigLoader { /* UNARMED */ + 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 */ 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 d8d99bcce..ebf7e81c0 100644 --- a/src/main/java/com/gmail/nossr50/skills/unarmed/UnarmedManager.java +++ b/src/main/java/com/gmail/nossr50/skills/unarmed/UnarmedManager.java @@ -156,12 +156,20 @@ public class UnarmedManager extends SkillManager { public double getSteelArmStyleDamage() { double rank = RankUtils.getRank(getPlayer(), SubSkillType.UNARMED_STEEL_ARM_STYLE); + double bonus = 0; if(rank >= 18) bonus = 1 + rank - 18; - return bonus + 0.5 + (rank / 2); + double finalBonus = bonus + 0.5 + (rank / 2); + + + if(AdvancedConfig.getInstance().isSteelArmDamageCustom()) { + return AdvancedConfig.getInstance().getSteelArmOverride(RankUtils.getRank(getPlayer(), SubSkillType.UNARMED_STEEL_ARM_STYLE), finalBonus); + } else { + return finalBonus; + } } /** diff --git a/src/main/resources/advanced.yml b/src/main/resources/advanced.yml index 211ac13cd..c733d324b 100644 --- a/src/main/resources/advanced.yml +++ b/src/main/resources/advanced.yml @@ -543,11 +543,32 @@ 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 ### From 480f9afa80d4f6e6b8a6aa5da496a65e1adde43e Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 25 Aug 2020 16:49:50 -0700 Subject: [PATCH 142/662] 2.1.144 --- Changelog.txt | 3 +++ pom.xml | 2 +- .../java/com/gmail/nossr50/listeners/EntityListener.java | 2 +- .../java/com/gmail/nossr50/listeners/PlayerListener.java | 5 +++-- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index c34fef88b..babb16d7a 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -6,11 +6,14 @@ Version 2.1.144 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 diff --git a/pom.xml b/pom.xml index 71b784cd8..f5db27015 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.144-SNAPSHOT + 2.1.144 mcMMO https://github.com/mcMMO-Dev/mcMMO diff --git a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java index 6824b472e..a462d598b 100644 --- a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java @@ -367,7 +367,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; diff --git a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java index 95cdc540d..476c75ec4 100644 --- a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java @@ -711,7 +711,7 @@ public class PlayerListener implements Listener { * * @param event The event to monitor */ - @EventHandler(priority = EventPriority.MONITOR) + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onPlayerInteractMonitor(PlayerInteractEvent event) { /* WORLD BLACKLIST CHECK */ if(WorldBlacklist.isWorldBlacklisted(event.getPlayer().getWorld())) @@ -804,7 +804,8 @@ public class PlayerListener implements Listener { 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)); + player.getInventory().getItemInMainHand().setAmount(heldItem.getAmount() - 1); + player.updateInventory(); if (herbalismManager.processGreenThumbBlocks(blockState) && EventUtils.simulateBlockBreak(block, player, false)) { blockState.update(true); } From 973279cdb7e73d2703028d20a630b31bbdbddfd6 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Wed, 26 Aug 2020 10:26:50 -0700 Subject: [PATCH 143/662] Revert listener behaviour for PlayerInteractEvent --- Changelog.txt | 4 ++++ pom.xml | 2 +- src/main/java/com/gmail/nossr50/listeners/PlayerListener.java | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index babb16d7a..f93ac739b 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,7 @@ +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 diff --git a/pom.xml b/pom.xml index f5db27015..adb49825d 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.144 + 2.1.145-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO diff --git a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java index 476c75ec4..a4212838c 100644 --- a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java @@ -711,7 +711,7 @@ public class PlayerListener implements Listener { * * @param event The event to monitor */ - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + @EventHandler(priority = EventPriority.MONITOR) public void onPlayerInteractMonitor(PlayerInteractEvent event) { /* WORLD BLACKLIST CHECK */ if(WorldBlacklist.isWorldBlacklisted(event.getPlayer().getWorld())) From 2810d36e085d6adaa209a6a119f92504234a0560 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Wed, 26 Aug 2020 10:45:53 -0700 Subject: [PATCH 144/662] 2.1.145 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index adb49825d..c312d11c5 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.145-SNAPSHOT + 2.1.145 mcMMO https://github.com/mcMMO-Dev/mcMMO From 621ccfed3401d1ae1afe3e04f3b9a17d544d89cf Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 8 Sep 2020 19:38:35 -0700 Subject: [PATCH 145/662] minor nms tweak --- .../com/gmail/nossr50/util/compat/CompatibilityManager.java | 2 ++ src/main/java/com/gmail/nossr50/util/nms/NMSVersion.java | 1 + 2 files changed, 3 insertions(+) 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 3ff3c1530..dcfc7d314 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/CompatibilityManager.java +++ b/src/main/java/com/gmail/nossr50/util/compat/CompatibilityManager.java @@ -122,6 +122,8 @@ public class CompatibilityManager { 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; } } } 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 a5e599b46..3768943c9 100644 --- a/src/main/java/com/gmail/nossr50/util/nms/NMSVersion.java +++ b/src/main/java/com/gmail/nossr50/util/nms/NMSVersion.java @@ -19,6 +19,7 @@ public enum NMSVersion { //1.16 NMS_1_16_1("1.16.1"), NMS_1_16_2("1.16.2"), + NMS_1_16_3("1.16.3"), //Version not known to this build of mcMMO UNSUPPORTED("unsupported"); From 3badc2680658d39ab9ea035eafd26cfc58e31330 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Wed, 16 Sep 2020 20:09:59 -0700 Subject: [PATCH 146/662] Hardcore mode won't bring players below level threshold anymore --- Changelog.txt | 4 ++++ pom.xml | 2 +- src/main/java/com/gmail/nossr50/util/EventUtils.java | 4 +++- src/main/java/com/gmail/nossr50/util/HardcoreManager.java | 2 +- 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index f93ac739b..4ee9b23ce 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,7 @@ +Version 2.1.146 + Players no longer lose levels below the level threshold in hardcore mode + Hardcore now only applies penalties to levels above threshold + Version 2.1.145 Reverted 'Changed one of the PlayerInteractEvent listeners to ignore cancelled events' from 2.1.144 diff --git a/pom.xml b/pom.xml index c312d11c5..bd4447210 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.145 + 2.1.146-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO diff --git a/src/main/java/com/gmail/nossr50/util/EventUtils.java b/src/main/java/com/gmail/nossr50/util/EventUtils.java index 2793a446e..3065bc5cb 100644 --- a/src/main/java/com/gmail/nossr50/util/EventUtils.java +++ b/src/main/java/com/gmail/nossr50/util/EventUtils.java @@ -1,5 +1,7 @@ package com.gmail.nossr50.util; +import com.gmail.nossr50.config.AdvancedConfig; +import com.gmail.nossr50.config.Config; import com.gmail.nossr50.datatypes.experience.XPGainReason; import com.gmail.nossr50.datatypes.experience.XPGainSource; import com.gmail.nossr50.datatypes.party.Party; @@ -330,7 +332,7 @@ public class EventUtils { String skillName = primarySkillType.toString(); int playerSkillLevel = playerProfile.getSkillLevel(primarySkillType); - playerProfile.modifySkill(primarySkillType, playerSkillLevel - levelChanged.get(skillName)); + playerProfile.modifySkill(primarySkillType, Math.max(Config.getInstance().getHardcoreDeathStatPenaltyLevelThreshold(), playerSkillLevel - levelChanged.get(skillName))); playerProfile.removeXp(primarySkillType, experienceChanged.get(skillName)); if (playerProfile.getSkillXpLevel(primarySkillType) < 0) { diff --git a/src/main/java/com/gmail/nossr50/util/HardcoreManager.java b/src/main/java/com/gmail/nossr50/util/HardcoreManager.java index 9956a614d..11b7e01c4 100644 --- a/src/main/java/com/gmail/nossr50/util/HardcoreManager.java +++ b/src/main/java/com/gmail/nossr50/util/HardcoreManager.java @@ -50,7 +50,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); From d4ab829812cd7c1d88977cb32237f4f496d175d9 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 21 Sep 2020 21:20:53 -0700 Subject: [PATCH 147/662] Mark blocks always in BlockPlaceEvent --- Changelog.txt | 1 + .../nossr50/listeners/BlockListener.java | 22 ++++++++++--------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 4ee9b23ce..d90ff305c 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,4 +1,5 @@ Version 2.1.146 + A dupe exploit has been patched Players no longer lose levels below the level threshold in hardcore mode Hardcore now only applies penalties to levels above threshold diff --git a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java index e5eafb665..e2a19af43 100644 --- a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java @@ -205,16 +205,6 @@ public class BlockListener implements Listener { */ @EventHandler(priority = EventPriority.MONITOR) public void onBlockPlace(BlockPlaceEvent event) { - /* WORLD BLACKLIST CHECK */ - if(WorldBlacklist.isWorldBlacklisted(event.getBlock().getWorld())) - return; - - Player player = event.getPlayer(); - - if (!UserManager.hasPlayerDataKey(player)) { - return; - } - BlockState blockState = event.getBlock().getState(); /* Check if the blocks placed should be monitored so they do not give out XP in the future */ @@ -224,6 +214,18 @@ public class BlockListener implements Listener { mcMMO.getPlaceStore().setTrue(blockState); } + /* WORLD BLACKLIST CHECK */ + if(WorldBlacklist.isWorldBlacklisted(event.getBlock().getWorld())) { + return; + } + + Player player = event.getPlayer(); + + if (!UserManager.hasPlayerDataKey(player)) { + return; + } + + McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); if(mcMMOPlayer == null) From f496d795fb0a8b012f860881122f9d25b7a14d5a Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 21 Sep 2020 21:23:10 -0700 Subject: [PATCH 148/662] Always track blocks in BlockMultiPlaceEvent --- .../nossr50/listeners/BlockListener.java | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java index e2a19af43..a32ea2c24 100644 --- a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java @@ -246,16 +246,6 @@ 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()) { BlockState blockState = replacedBlockState.getBlock().getState(); @@ -265,6 +255,17 @@ public class BlockListener implements Listener { mcMMO.getPlaceStore().setTrue(blockState); } } + + /* WORLD BLACKLIST CHECK */ + if(WorldBlacklist.isWorldBlacklisted(event.getBlock().getWorld())) { + return; + } + + Player player = event.getPlayer(); + + if (!UserManager.hasPlayerDataKey(player)) { + return; + } } @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) From 959a74b139032f4be309e1adc53d857b8886f2e0 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 21 Sep 2020 21:27:17 -0700 Subject: [PATCH 149/662] Temporarily mark debarked wood as unnatural (will undo later) --- .../java/com/gmail/nossr50/listeners/BlockListener.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java index a32ea2c24..5e1582fd1 100644 --- a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java @@ -210,7 +210,7 @@ public class BlockListener implements Listener { /* 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())) +// if (!Tag.LOGS.isTagged(event.getBlockReplacedState().getType()) || !Tag.LOGS.isTagged(event.getBlockPlaced().getType())) mcMMO.getPlaceStore().setTrue(blockState); } @@ -225,7 +225,6 @@ public class BlockListener implements Listener { return; } - McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); if(mcMMOPlayer == null) @@ -327,8 +326,11 @@ public class BlockListener implements Listener { McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); //Check if profile is loaded - if(mcMMOPlayer == null) + if(mcMMOPlayer == null) { + /* Remove metadata from placed watched blocks */ + mcMMO.getPlaceStore().setFalse(blockState); return; + } ItemStack heldItem = player.getInventory().getItemInMainHand(); From 3fd5cd03eef66b0016d5d49284b692673f42be62 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 21 Sep 2020 21:29:21 -0700 Subject: [PATCH 150/662] Blocks that have double drops enabled are also worth marking --- src/main/java/com/gmail/nossr50/util/BlockUtils.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/gmail/nossr50/util/BlockUtils.java b/src/main/java/com/gmail/nossr50/util/BlockUtils.java index 4750785fe..843c178a9 100644 --- a/src/main/java/com/gmail/nossr50/util/BlockUtils.java +++ b/src/main/java/com/gmail/nossr50/util/BlockUtils.java @@ -66,7 +66,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) || isLog(blockState) + || Config.getInstance().getDoubleDropsEnabled(PrimarySkillType.MINING, blockState.getType()) + || Config.getInstance().getDoubleDropsEnabled(PrimarySkillType.EXCAVATION, blockState.getType()) + || Config.getInstance().getDoubleDropsEnabled(PrimarySkillType.WOODCUTTING, blockState.getType()) + || Config.getInstance().getDoubleDropsEnabled(PrimarySkillType.SMELTING, blockState.getType()); } /** From 0b20fc2c16f20d1c54f319da25db050a87fbefbd Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 21 Sep 2020 21:36:24 -0700 Subject: [PATCH 151/662] Some tweaks to tracking blocks as unnatural --- Changelog.txt | 2 +- .../nossr50/listeners/BlockListener.java | 30 +++++++------------ 2 files changed, 12 insertions(+), 20 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index d90ff305c..10e620817 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,5 +1,5 @@ Version 2.1.146 - A dupe exploit has been patched + 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 diff --git a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java index 5e1582fd1..94d038468 100644 --- a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java @@ -127,10 +127,8 @@ public class BlockListener implements Listener { Block movedBlock; for (Block b : event.getBlocks()) { - if (BlockUtils.shouldBeWatched(b.getState())) { - movedBlock = b.getRelative(direction); - mcMMO.getPlaceStore().setTrue(movedBlock); - } + movedBlock = b.getRelative(direction); + mcMMO.getPlaceStore().setTrue(movedBlock); } } @@ -190,7 +188,6 @@ public class BlockListener implements Listener { 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()); @@ -208,11 +205,8 @@ public class BlockListener implements Listener { 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); - } +// if (!Tag.LOGS.isTagged(event.getBlockReplacedState().getType()) || !Tag.LOGS.isTagged(event.getBlockPlaced().getType())) + mcMMO.getPlaceStore().setTrue(blockState); /* WORLD BLACKLIST CHECK */ if(WorldBlacklist.isWorldBlacklisted(event.getBlock().getWorld())) { @@ -250,9 +244,7 @@ public class BlockListener implements Listener { BlockState blockState = replacedBlockState.getBlock().getState(); /* Check if the blocks placed should be monitored so they do not give out XP in the future */ - if (BlockUtils.shouldBeWatched(blockState)) { - mcMMO.getPlaceStore().setTrue(blockState); - } + mcMMO.getPlaceStore().setTrue(blockState); } /* WORLD BLACKLIST CHECK */ @@ -276,9 +268,9 @@ public class BlockListener implements Listener { BlockState blockState = event.getBlock().getState(); - if (!BlockUtils.shouldBeWatched(blockState)) { - return; - } +// if (!BlockUtils.shouldBeWatched(blockState)) { +// return; +// } mcMMO.getPlaceStore().setFalse(blockState); } @@ -308,9 +300,9 @@ public class BlockListener implements Listener { BlockState blockState = event.getBlock().getState(); Location location = blockState.getLocation(); - if (!BlockUtils.shouldBeWatched(blockState)) { - return; - } +// if (!BlockUtils.shouldBeWatched(blockState)) { +// return; +// } /* ALCHEMY - Cancel any brew in progress for that BrewingStand */ if (blockState instanceof BrewingStand && Alchemy.brewingStandMap.containsKey(location)) { From 02fe8addb7d6b2ab8e8b30b87bc3debfb84e51b4 Mon Sep 17 00:00:00 2001 From: Riley Park Date: Thu, 24 Sep 2020 07:08:24 -0700 Subject: [PATCH 152/662] adventure --- pom.xml | 20 +- .../commands/skills/AcrobaticsCommand.java | 6 +- .../commands/skills/AlchemyCommand.java | 6 +- .../commands/skills/ArcheryCommand.java | 6 +- .../nossr50/commands/skills/AxesCommand.java | 6 +- .../commands/skills/ExcavationCommand.java | 6 +- .../commands/skills/FishingCommand.java | 6 +- .../commands/skills/HerbalismCommand.java | 6 +- .../commands/skills/MiningCommand.java | 6 +- .../commands/skills/RepairCommand.java | 6 +- .../commands/skills/SalvageCommand.java | 6 +- .../nossr50/commands/skills/SkillCommand.java | 5 +- .../commands/skills/SmeltingCommand.java | 6 +- .../commands/skills/SwordsCommand.java | 6 +- .../commands/skills/TamingCommand.java | 6 +- .../commands/skills/UnarmedCommand.java | 6 +- .../commands/skills/WoodcuttingCommand.java | 6 +- .../skills/subskills/acrobatics/Roll.java | 3 +- .../skills/subskills/interfaces/SubSkill.java | 3 +- .../skills/McMMOPlayerNotificationEvent.java | 18 +- src/main/java/com/gmail/nossr50/mcMMO.java | 10 + .../gmail/nossr50/util/McMMOMessageType.java | 21 ++ .../nossr50/util/TextComponentFactory.java | 355 +++++++++--------- .../util/player/NotificationManager.java | 32 +- .../gmail/nossr50/util/skills/PerksUtils.java | 2 +- 25 files changed, 300 insertions(+), 259 deletions(-) create mode 100644 src/main/java/com/gmail/nossr50/util/McMMOMessageType.java diff --git a/pom.xml b/pom.xml index bd4447210..d1228adbe 100755 --- a/pom.xml +++ b/pom.xml @@ -160,16 +160,16 @@ - - - - - - - - - - + + net.kyori + adventure-api + 4.0.0-SNAPSHOT + + + net.kyori + adventure-platform-bukkit + 4.0.0-SNAPSHOT + org.apache.maven.scm maven-scm-provider-gitexe 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 91e86ef0f..1733329ff 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/AcrobaticsCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/AcrobaticsCommand.java @@ -9,7 +9,7 @@ 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 net.kyori.adventure.text.Component; import org.bukkit.entity.Player; import java.util.ArrayList; @@ -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 b8df20ad4..cdb87e461 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/AlchemyCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/AlchemyCommand.java @@ -8,7 +8,7 @@ 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 net.kyori.adventure.text.Component; import org.bukkit.entity.Player; import java.util.ArrayList; @@ -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/ArcheryCommand.java b/src/main/java/com/gmail/nossr50/commands/skills/ArcheryCommand.java index 4deeb9262..bbf0f875b 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/ArcheryCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/ArcheryCommand.java @@ -7,7 +7,7 @@ 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 net.kyori.adventure.text.Component; import org.bukkit.entity.Player; import java.util.ArrayList; @@ -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 8454b4af3..52aa62d8e 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/AxesCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/AxesCommand.java @@ -10,7 +10,7 @@ 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 net.kyori.adventure.text.Component; import org.bukkit.entity.Player; import java.util.ArrayList; @@ -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 2f3d53a0f..170e80054 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/ExcavationCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/ExcavationCommand.java @@ -8,7 +8,7 @@ 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 net.kyori.adventure.text.Component; import org.bukkit.entity.Player; import java.util.ArrayList; @@ -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 2788b98d4..33f2c4cd5 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/FishingCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/FishingCommand.java @@ -13,7 +13,7 @@ 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 net.kyori.adventure.text.Component; import org.bukkit.Location; import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; @@ -167,8 +167,8 @@ public class FishingCommand 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.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 9884ecba8..8f82ce3ff 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/HerbalismCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/HerbalismCommand.java @@ -7,7 +7,7 @@ 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 net.kyori.adventure.text.Component; import org.bukkit.Material; import org.bukkit.entity.Player; @@ -141,8 +141,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 27102d7b4..950953908 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/MiningCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/MiningCommand.java @@ -9,7 +9,7 @@ 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 net.kyori.adventure.text.Component; import org.bukkit.entity.Player; import java.util.ArrayList; @@ -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/RepairCommand.java b/src/main/java/com/gmail/nossr50/commands/skills/RepairCommand.java index a88a45bb6..7444a9fb6 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/RepairCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/RepairCommand.java @@ -14,7 +14,7 @@ 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 net.kyori.adventure.text.Component; import org.bukkit.Material; import org.bukkit.entity.Player; @@ -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 9dc5263fe..ebbd629e3 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/SalvageCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/SalvageCommand.java @@ -8,7 +8,7 @@ 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 net.kyori.adventure.text.Component; import org.bukkit.entity.Player; import java.util.ArrayList; @@ -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 91c683a43..bece332e5 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/SkillCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/SkillCommand.java @@ -19,6 +19,7 @@ import com.gmail.nossr50.util.skills.PerksUtils; import com.gmail.nossr50.util.skills.RankUtils; import com.gmail.nossr50.util.skills.SkillActivationType; 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; @@ -85,7 +86,7 @@ public abstract class SkillCommand implements TabExecutor { sendSkillCommandHeader(player, mcMMOPlayer, (int) skillValue); //Make JSON text components - List subskillTextComponents = getTextComponents(player); + List subskillTextComponents = getTextComponents(player); //Subskills Header player.sendMessage(LocaleLoader.getString("Skills.Overhaul.Header", LocaleLoader.getString("Effects.SubSkills.Overhaul"))); @@ -283,7 +284,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/SmeltingCommand.java b/src/main/java/com/gmail/nossr50/commands/skills/SmeltingCommand.java index a3a5f5805..27ce7fc13 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/SmeltingCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/SmeltingCommand.java @@ -8,7 +8,7 @@ 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 net.kyori.adventure.text.Component; import org.bukkit.entity.Player; import java.util.ArrayList; @@ -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 0933d6c79..325b5bb10 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/SwordsCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/SwordsCommand.java @@ -10,7 +10,7 @@ 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 net.kyori.adventure.text.Component; import org.bukkit.entity.Player; import java.util.ArrayList; @@ -110,8 +110,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 e54ce1505..8970f5c08 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/TamingCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/TamingCommand.java @@ -7,7 +7,7 @@ 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 net.kyori.adventure.text.Component; import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; @@ -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 8db4ebdf6..e8e85418e 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/UnarmedCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/UnarmedCommand.java @@ -9,7 +9,7 @@ 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 net.kyori.adventure.text.Component; import org.bukkit.entity.Player; import java.util.ArrayList; @@ -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 e96c7b07e..b26b385b1 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/WoodcuttingCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/WoodcuttingCommand.java @@ -7,7 +7,7 @@ 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 net.kyori.adventure.text.Component; import org.bukkit.entity.Player; import java.util.ArrayList; @@ -83,8 +83,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/datatypes/skills/subskills/acrobatics/Roll.java b/src/main/java/com/gmail/nossr50/datatypes/skills/subskills/acrobatics/Roll.java index 62f58a582..fc6886a27 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 @@ -22,6 +22,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 net.kyori.adventure.text.TextComponent; import net.md_5.bungee.api.chat.ComponentBuilder; import org.bukkit.Location; import org.bukkit.Material; @@ -116,7 +117,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 */ 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..701a528aa 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,6 +1,7 @@ package com.gmail.nossr50.datatypes.skills.subskills.interfaces; import com.gmail.nossr50.datatypes.skills.interfaces.Skill; +import net.kyori.adventure.text.TextComponent; import net.md_5.bungee.api.chat.ComponentBuilder; import org.bukkit.entity.Player; @@ -61,7 +62,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/events/skills/McMMOPlayerNotificationEvent.java b/src/main/java/com/gmail/nossr50/events/skills/McMMOPlayerNotificationEvent.java index 08de8fc99..45424ae40 100644 --- a/src/main/java/com/gmail/nossr50/events/skills/McMMOPlayerNotificationEvent.java +++ b/src/main/java/com/gmail/nossr50/events/skills/McMMOPlayerNotificationEvent.java @@ -1,8 +1,8 @@ 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.McMMOMessageType; +import net.kyori.adventure.text.Component; import org.bukkit.entity.Player; import org.bukkit.event.Cancellable; import org.bukkit.event.Event; @@ -22,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; @@ -48,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; } diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index 697e91439..998c6d638 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -50,6 +50,7 @@ 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.bukkit.Bukkit; @@ -81,6 +82,9 @@ public class mcMMO extends JavaPlugin { private static PlayerLevelUtils playerLevelUtils; private static SmeltingTracker smeltingTracker; + /* Adventure */ + private static BukkitAudiences audiences; + /* Blacklist */ private static WorldBlacklist worldBlacklist; @@ -270,6 +274,8 @@ public class mcMMO extends JavaPlugin { //Init smelting tracker smeltingTracker = new SmeltingTracker(); + + audiences = BukkitAudiences.create(this); } public static PlayerLevelUtils getPlayerLevelUtils() { @@ -678,4 +684,8 @@ public class mcMMO extends JavaPlugin { public static SmeltingTracker getSmeltingTracker() { return smeltingTracker; } + + public static BukkitAudiences getAudiences() { + return audiences; + } } diff --git a/src/main/java/com/gmail/nossr50/util/McMMOMessageType.java b/src/main/java/com/gmail/nossr50/util/McMMOMessageType.java new file mode 100644 index 000000000..741c94767 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/util/McMMOMessageType.java @@ -0,0 +1,21 @@ +package com.gmail.nossr50.util; + +import java.util.function.BiConsumer; +import net.kyori.adventure.audience.Audience; +import net.kyori.adventure.audience.MessageType; +import net.kyori.adventure.text.Component; + +public enum McMMOMessageType { + ACTION_BAR(Audience::sendActionBar), + SYSTEM((audience, message) -> audience.sendMessage(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/TextComponentFactory.java b/src/main/java/com/gmail/nossr50/util/TextComponentFactory.java index f96e305a2..48d016da5 100644 --- a/src/main/java/com/gmail/nossr50/util/TextComponentFactory.java +++ b/src/main/java/com/gmail/nossr50/util/TextComponentFactory.java @@ -9,10 +9,20 @@ 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.skills.RankUtils; -import net.md_5.bungee.api.ChatColor; +import java.util.concurrent.atomic.AtomicReference; +import net.kyori.adventure.audience.Audience; +import net.kyori.adventure.audience.MessageType; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.ComponentBuilder; +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 net.md_5.bungee.api.ChatMessageType; -import net.md_5.bungee.api.chat.*; import org.bukkit.entity.Player; import java.util.ArrayList; @@ -33,24 +43,23 @@ public class TextComponentFactory { public static TextComponent getNotificationMultipleValues(String localeKey, String... values) { String preColoredString = LocaleLoader.getString(localeKey, (Object[]) values); - TextComponent msg = new TextComponent(preColoredString); - return new TextComponent(msg); + return TextComponent.of(preColoredString); } - public static TextComponent getNotificationTextComponentFromLocale(String localeKey) + public static Component getNotificationTextComponentFromLocale(String localeKey) { return getNotificationTextComponent(LocaleLoader.getString(localeKey)); } - public static TextComponent getNotificationLevelUpTextComponent(PrimarySkillType skill, int levelsGained, int currentLevel) + public static Component getNotificationLevelUpTextComponent(PrimarySkillType skill, int levelsGained, int currentLevel) { - return new TextComponent(LocaleLoader.getString("Overhaul.Levelup", LocaleLoader.getString("Overhaul.Name."+StringUtils.getCapitalized(skill.toString())), levelsGained, currentLevel)); + return TextComponent.of(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 new TextComponent(text); + return TextComponent.of(text); } public static void sendPlayerSubSkillWikiLink(Player player, String subskillformatted) @@ -58,225 +67,225 @@ public class TextComponentFactory { if(!Config.getInstance().getUrlLinksEnabled()) return; - Player.Spigot spigotPlayer = player.spigot(); - - TextComponent wikiLinkComponent = new TextComponent(LocaleLoader.getString("Overhaul.mcMMO.MmoInfo.Wiki")); - wikiLinkComponent.setUnderlined(true); + TextComponent.Builder wikiLinkComponent = TextComponent.builder(LocaleLoader.getString("Overhaul.mcMMO.MmoInfo.Wiki")); + wikiLinkComponent.decoration(TextDecoration.UNDERLINED, true); String wikiUrl = "https://mcmmo.org/wiki/"+subskillformatted; - wikiLinkComponent.setClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, wikiUrl)); + wikiLinkComponent.clickEvent(ClickEvent.openUrl(wikiUrl)); - ComponentBuilder componentBuilder = new ComponentBuilder(subskillformatted).append("\n").append(wikiUrl).color(ChatColor.GRAY).italic(true); + TextComponent.Builder componentBuilder = TextComponent.builder(subskillformatted).append("\n").append(wikiUrl).color(NamedTextColor.GRAY).decoration(TextDecoration.ITALIC, true); - wikiLinkComponent.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, componentBuilder.create())); + wikiLinkComponent.hoverEvent(HoverEvent.showText(componentBuilder.build())); - spigotPlayer.sendMessage(ChatMessageType.SYSTEM, wikiLinkComponent); + mcMMO.getAudiences().audience(player).sendMessage(wikiLinkComponent, MessageType.SYSTEM); } public static void sendPlayerUrlHeader(Player player) { - Player.Spigot spigotPlayer = player.spigot(); - - TextComponent prefix = new TextComponent(LocaleLoader.getString("Overhaul.mcMMO.Url.Wrap.Prefix") + " "); + TextComponent prefix = TextComponent.of(LocaleLoader.getString("Overhaul.mcMMO.Url.Wrap.Prefix") + " "); /*prefix.setColor(ChatColor.DARK_AQUA);*/ - TextComponent suffix = new TextComponent(" "+LocaleLoader.getString("Overhaul.mcMMO.Url.Wrap.Suffix")); + TextComponent suffix = TextComponent.of(" "+LocaleLoader.getString("Overhaul.mcMMO.Url.Wrap.Suffix")); /*suffix.setColor(ChatColor.DARK_AQUA);*/ - TextComponent emptySpace = new TextComponent(" "); + TextComponent emptySpace = TextComponent.space(); - 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); + mcMMO.getAudiences().audience(player).sendMessage(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); } - public static void sendPlayerSubSkillList(Player player, List textComponents) + public static void sendPlayerSubSkillList(Player player, List textComponents) { - TextComponent emptySpace = new TextComponent(" "); + TextComponent emptySpace = TextComponent.space(); - ArrayList bulkMessage = new ArrayList<>(); + AtomicReference messageToSend = new AtomicReference<>(); int newLineCount = 0; //Hacky solution to wordwrap problems - for (TextComponent textComponent : textComponents) { + final Audience audience = mcMMO.getAudiences().audience(player); + for (Component 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); + Component toSend = messageToSend.get(); + if (toSend != null) { + audience.sendMessage(toSend.append(emptySpace)); + } - player.spigot().sendMessage(bulkArray); - bulkMessage = new ArrayList<>(); + messageToSend.set(null); newLineCount = 0; } //Style the skills into @links - final String originalTxt = textComponent.getText(); + final String originalTxt = textComponent instanceof TextComponent ? ((TextComponent) textComponent).content() : ""; - TextComponent stylizedText = new TextComponent(LocaleLoader.getString("JSON.Hover.AtSymbolSkills")); + TextComponent.Builder stylizedText = TextComponent.builder(LocaleLoader.getString("JSON.Hover.AtSymbolSkills")); addChild(stylizedText, originalTxt); - if(textComponent.getHoverEvent() != null) - stylizedText.setHoverEvent(textComponent.getHoverEvent()); + if(textComponent.hoverEvent() != null) + stylizedText.hoverEvent(textComponent.hoverEvent()); - if(textComponent.getClickEvent() != null) - stylizedText.setClickEvent(textComponent.getClickEvent()); + if(textComponent.clickEvent() != null) + stylizedText.clickEvent(textComponent.clickEvent()); - bulkMessage.add(stylizedText); - bulkMessage.add(emptySpace); + messageToSend.set(stylizedText.build().append(emptySpace)); newLineCount++; } - /* - * Convert our list into an array - */ - TextComponent[] bulkArray = new TextComponent[bulkMessage.size()]; - bulkArray = bulkMessage.toArray(bulkArray); - - player.spigot().sendMessage(bulkArray); + Component toSend = messageToSend.get(); + if (toSend != null) { + audience.sendMessage(toSend.append(emptySpace)); + } } - private static TextComponent getWebLinkTextComponent(McMMOWebLinks webLinks) + private static Component getWebLinkTextComponent(McMMOWebLinks webLinks) { - TextComponent webTextComponent; + TextComponent.Builder webTextComponent; switch(webLinks) { case WEBSITE: - webTextComponent = new TextComponent(LocaleLoader.getString("JSON.Hover.AtSymbolURL")); + webTextComponent = TextComponent.builder(LocaleLoader.getString("JSON.Hover.AtSymbolURL")); addChild(webTextComponent, "Web"); - webTextComponent.setClickEvent(getUrlClickEvent(McMMOUrl.urlWebsite)); + webTextComponent.clickEvent(getUrlClickEvent(McMMOUrl.urlWebsite)); break; case SPIGOT: - webTextComponent = new TextComponent(LocaleLoader.getString("JSON.Hover.AtSymbolURL")); + webTextComponent = TextComponent.builder(LocaleLoader.getString("JSON.Hover.AtSymbolURL")); addChild(webTextComponent, "Spigot"); - webTextComponent.setClickEvent(getUrlClickEvent(McMMOUrl.urlSpigot)); + webTextComponent.clickEvent(getUrlClickEvent(McMMOUrl.urlSpigot)); break; case DISCORD: - webTextComponent = new TextComponent(LocaleLoader.getString("JSON.Hover.AtSymbolURL")); + webTextComponent = TextComponent.builder(LocaleLoader.getString("JSON.Hover.AtSymbolURL")); addChild(webTextComponent, "Discord"); - webTextComponent.setClickEvent(getUrlClickEvent(McMMOUrl.urlDiscord)); + webTextComponent.clickEvent(getUrlClickEvent(McMMOUrl.urlDiscord)); break; case PATREON: - webTextComponent = new TextComponent(LocaleLoader.getString("JSON.Hover.AtSymbolURL")); + webTextComponent = TextComponent.builder(LocaleLoader.getString("JSON.Hover.AtSymbolURL")); addChild(webTextComponent, "Patreon"); - webTextComponent.setClickEvent(getUrlClickEvent(McMMOUrl.urlPatreon)); + webTextComponent.clickEvent(getUrlClickEvent(McMMOUrl.urlPatreon)); break; case WIKI: - webTextComponent = new TextComponent(LocaleLoader.getString("JSON.Hover.AtSymbolURL")); + webTextComponent = TextComponent.builder(LocaleLoader.getString("JSON.Hover.AtSymbolURL")); addChild(webTextComponent, "Wiki"); - webTextComponent.setClickEvent(getUrlClickEvent(McMMOUrl.urlWiki)); + webTextComponent.clickEvent(getUrlClickEvent(McMMOUrl.urlWiki)); break; case HELP_TRANSLATE: - webTextComponent = new TextComponent(LocaleLoader.getString("JSON.Hover.AtSymbolURL")); + webTextComponent = TextComponent.builder(LocaleLoader.getString("JSON.Hover.AtSymbolURL")); addChild(webTextComponent, "Lang"); - webTextComponent.setClickEvent(getUrlClickEvent(McMMOUrl.urlTranslate)); + webTextComponent.clickEvent(getUrlClickEvent(McMMOUrl.urlTranslate)); break; default: - webTextComponent = new TextComponent("NOT DEFINED"); + webTextComponent = TextComponent.builder("NOT DEFINED"); } addNewHoverComponentToTextComponent(webTextComponent, getUrlHoverEvent(webLinks)); - webTextComponent.setInsertion(webLinks.getUrl()); + webTextComponent.insertion(webLinks.getUrl()); - return webTextComponent; + return webTextComponent.build(); } - private static void addChild(TextComponent webTextComponent, String childName) { - TextComponent childComponent = new TextComponent(childName); - childComponent.setColor(ChatColor.BLUE); - webTextComponent.addExtra(childComponent); + private static void addChild(Component webTextComponent, String childName) { + TextComponent childComponent = TextComponent.of(childName); + childComponent.color(NamedTextColor.BLUE); + webTextComponent.append(childComponent); } - private static BaseComponent[] getUrlHoverEvent(McMMOWebLinks webLinks) + private static void addChild(ComponentBuilder webTextComponent, String childName) { + TextComponent childComponent = TextComponent.of(childName); + childComponent.color(NamedTextColor.BLUE); + webTextComponent.append(childComponent); + } + + private static Component getUrlHoverEvent(McMMOWebLinks webLinks) { - ComponentBuilder componentBuilder = new ComponentBuilder(webLinks.getNiceTitle()); + TextComponent.Builder componentBuilder = TextComponent.builder(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); + componentBuilder.append("\n\n"); + componentBuilder.append(TextComponent.of(webLinks.getLocaleDescription(), NamedTextColor.GREEN)); + componentBuilder.append(TextComponent.of("\nDev Blogs, and information related to mcMMO can be found here", NamedTextColor.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); + componentBuilder.append("\n\n"); + componentBuilder.append(TextComponent.of(webLinks.getLocaleDescription(), NamedTextColor.GREEN)); + componentBuilder.append(TextComponent.of("\nI post regularly in the discussion thread here!", NamedTextColor.GRAY)); break; case PATREON: addUrlHeaderHover(webLinks, componentBuilder); - componentBuilder.append("\n\n").italic(false); - componentBuilder.append(webLinks.getLocaleDescription()).color(ChatColor.GREEN); + componentBuilder.append("\n\n"); + componentBuilder.append(TextComponent.of(webLinks.getLocaleDescription(), NamedTextColor.GREEN)); componentBuilder.append("\n"); - componentBuilder.append("Show support by buying me a coffee :)").italic(false).color(ChatColor.GRAY); + componentBuilder.append(TextComponent.of("Show support by buying me a coffee :)", NamedTextColor.GRAY)); break; case WIKI: addUrlHeaderHover(webLinks, componentBuilder); - componentBuilder.append("\n\n").italic(false); - componentBuilder.append(webLinks.getLocaleDescription()).color(ChatColor.GREEN); + componentBuilder.append("\n\n"); + componentBuilder.append(TextComponent.of(webLinks.getLocaleDescription(), NamedTextColor.GREEN)); componentBuilder.append("\n"); - componentBuilder.append("I'm looking for more wiki staff, contact me on our discord!").italic(false).color(ChatColor.DARK_GRAY); + componentBuilder.append(TextComponent.of("I'm looking for more wiki staff, contact me on our discord!", NamedTextColor.DARK_GRAY)); break; case DISCORD: addUrlHeaderHover(webLinks, componentBuilder); - componentBuilder.append("\n\n").italic(false); - componentBuilder.append(webLinks.getLocaleDescription()).color(ChatColor.GREEN); + componentBuilder.append("\n\n"); + componentBuilder.append(TextComponent.of(webLinks.getLocaleDescription(), NamedTextColor.GREEN)); break; case HELP_TRANSLATE: addUrlHeaderHover(webLinks, componentBuilder); - componentBuilder.append("\n\n").italic(false); - componentBuilder.append(webLinks.getLocaleDescription()).color(ChatColor.GREEN); + componentBuilder.append("\n\n"); + componentBuilder.append(TextComponent.of(webLinks.getLocaleDescription(), NamedTextColor.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); + componentBuilder.append(TextComponent.of("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.create(); + return componentBuilder.build(); } - private static void addUrlHeaderHover(McMMOWebLinks webLinks, ComponentBuilder componentBuilder) { + private static void addUrlHeaderHover(McMMOWebLinks webLinks, TextComponent.Builder componentBuilder) { componentBuilder.append("\n"); - componentBuilder.append(webLinks.getUrl()).color(ChatColor.GRAY).italic(true); + componentBuilder.append(TextComponent.of(webLinks.getUrl(), NamedTextColor.GRAY, TextDecoration.ITALIC)); } private static ClickEvent getUrlClickEvent(String url) { - return new ClickEvent(ClickEvent.Action.OPEN_URL, url); + return ClickEvent.openUrl(url); } - private static TextComponent getSubSkillTextComponent(Player player, SubSkillType subSkillType) + private static Component 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); + TextComponent.Builder textComponent = initNewSkillTextComponent(player, skillName, subSkillType, skillUnlocked); //Hover Event addNewHoverComponentToTextComponent(textComponent, getSubSkillHoverComponent(player, subSkillType)); //Insertion - textComponent.setInsertion(skillName); + textComponent.insertion(skillName); - return textComponent; + return textComponent.build(); } - private static void addNewHoverComponentToTextComponent(TextComponent textComponent, BaseComponent[] baseComponent) { - textComponent.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, baseComponent)); + private static void addNewHoverComponentToTextComponent(TextComponent.Builder textComponent, Component baseComponent) { + textComponent.hoverEvent(HoverEvent.showText(baseComponent)); } private static TextComponent getSubSkillTextComponent(Player player, AbstractSubSkill abstractSubSkill) @@ -289,42 +298,42 @@ public class TextComponentFactory { boolean skillUnlocked = RankUtils.hasUnlockedSubskill(player, subSkillType); - TextComponent textComponent = initNewSkillTextComponent(player, skillName, subSkillType, skillUnlocked); + TextComponent.Builder textComponent = initNewSkillTextComponent(player, skillName, subSkillType, skillUnlocked); //Hover Event addNewHoverComponentToTextComponent(textComponent, getSubSkillHoverComponent(player, abstractSubSkill)); //Insertion - textComponent.setInsertion(skillName); + textComponent.insertion(skillName); - return textComponent; + return textComponent.build(); } - private static TextComponent initNewSkillTextComponent(Player player, String skillName, SubSkillType subSkillType, boolean skillUnlocked) { - TextComponent textComponent; + 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 = new TextComponent(LocaleLoader.getString("JSON.Hover.MaxRankSkillName", skillName)); + textComponent = TextComponent.builder(LocaleLoader.getString("JSON.Hover.MaxRankSkillName", skillName)); else - textComponent = new TextComponent(LocaleLoader.getString("JSON.Hover.SkillName", skillName)); + textComponent = TextComponent.builder(LocaleLoader.getString("JSON.Hover.SkillName", skillName)); - textComponent.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/mmoinfo " + subSkillType.getNiceNameNoSpaces(subSkillType))); + textComponent.clickEvent(ClickEvent.runCommand("/mmoinfo " + subSkillType.getNiceNameNoSpaces(subSkillType))); } else { - textComponent = new TextComponent(LocaleLoader.getString("JSON.Hover.Mystery", + textComponent = TextComponent.builder(LocaleLoader.getString("JSON.Hover.Mystery", String.valueOf(RankUtils.getUnlockLevel(subSkillType)))); - textComponent.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/mmoinfo ???")); + textComponent.clickEvent(ClickEvent.runCommand("/mmoinfo ???")); } return textComponent; } - private static BaseComponent[] getSubSkillHoverComponent(Player player, AbstractSubSkill abstractSubSkill) + private static Component getSubSkillHoverComponent(Player player, AbstractSubSkill abstractSubSkill) { return getSubSkillHoverEventJSON(abstractSubSkill, player); } - private static BaseComponent[] getSubSkillHoverComponent(Player player, SubSkillType subSkillType) + private static Component getSubSkillHoverComponent(Player player, SubSkillType subSkillType) { return getSubSkillHoverEventJSON(subSkillType, player); } @@ -335,27 +344,27 @@ public class TextComponentFactory { * @param player the player who owns this subskill * @return the hover basecomponent object for this subskill */ - private static BaseComponent[] getSubSkillHoverEventJSON(AbstractSubSkill abstractSubSkill, Player player) + private static Component 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; + 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; - ChatColor ccLocked = ChatColor.DARK_GRAY; - ChatColor ccLevelRequirement = ChatColor.BLUE; - ChatColor ccLevelRequired = ChatColor.RED; + TextColor ccLocked = NamedTextColor.DARK_GRAY; + TextColor ccLevelRequirement = NamedTextColor.BLUE; + TextColor ccLevelRequired = NamedTextColor.RED; SubSkillType subSkillType = abstractSubSkill.getSubSkillType(); //SubSkillType Name - ComponentBuilder componentBuilder = setupSkillComponentNameStyle(player, skillName, subSkillType, RankUtils.hasUnlockedSubskill(player, abstractSubSkill)); + TextComponent.Builder componentBuilder = setupSkillComponentNameStyle(player, skillName, subSkillType, RankUtils.hasUnlockedSubskill(player, abstractSubSkill)); if(!RankUtils.hasUnlockedSubskill(player, abstractSubSkill)) { @@ -379,18 +388,18 @@ public class TextComponentFactory { componentBuilder.append("\n").append(abstractSubSkill.getDescription()).append("\n"); //Empty line - componentBuilder.append("\n").bold(false); + componentBuilder.append("\n").decoration(TextDecoration.BOLD, false); componentBuilder.append("\n"); //Finally, add details to the tooltip abstractSubSkill.addStats(componentBuilder, player); } - return componentBuilder.create(); + return componentBuilder.build(); } - private static ComponentBuilder setupSkillComponentNameStyle(Player player, String skillName, SubSkillType subSkillType, boolean skillUnlocked) { - ComponentBuilder componentBuilder; + 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)); @@ -402,66 +411,64 @@ public class TextComponentFactory { return componentBuilder; } - private static ComponentBuilder getNewComponentBuilder(String skillName) { - ComponentBuilder componentBuilder = new ComponentBuilder(skillName); + private static TextComponent.Builder getNewComponentBuilder(String skillName) { + TextComponent.Builder componentBuilder = TextComponent.builder(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) { + 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(LocaleLoader.getString("JSON.Hover.Rank", String.valueOf(rank))).append("\n") - .bold(false).italic(false).strikethrough(false).underlined(false); + componentBuilder.append(LocaleLoader.getString("JSON.Hover.Rank", String.valueOf(rank))).append("\n"); //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.Hover.NextRank", String.valueOf(nextRank))).append("\n"); /*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) { + private static void addLocked(SubSkillType subSkillType, TextColor ccLocked, TextColor ccLevelRequirement, TextColor ccLevelRequired, TextComponent.Builder componentBuilder) { addLocked(ccLocked, ccLevelRequirement, componentBuilder); - componentBuilder.append(String.valueOf(RankConfig.getInstance().getSubSkillUnlockLevel(subSkillType, 1))).color(ccLevelRequired); + componentBuilder.append(TextComponent.of(String.valueOf(RankConfig.getInstance().getSubSkillUnlockLevel(subSkillType, 1)), ccLevelRequired)); //componentBuilder.append("\n"); } - private static void addLocked(AbstractSubSkill abstractSubSkill, ChatColor ccLocked, ChatColor ccLevelRequirement, ChatColor ccLevelRequired, ComponentBuilder componentBuilder) { + private static void addLocked(AbstractSubSkill abstractSubSkill, TextColor ccLocked, TextColor ccLevelRequirement, TextColor ccLevelRequired, TextComponent.Builder componentBuilder) { addLocked(ccLocked, ccLevelRequirement, componentBuilder); - componentBuilder.append(String.valueOf(RankConfig.getInstance().getSubSkillUnlockLevel(abstractSubSkill, 1))).color(ccLevelRequired); + componentBuilder.append(TextComponent.of(String.valueOf(RankConfig.getInstance().getSubSkillUnlockLevel(abstractSubSkill, 1)), 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); + private static void addLocked(TextColor ccLocked, TextColor ccLevelRequirement, TextComponent.Builder componentBuilder) { + componentBuilder.append(TextComponent.of(LocaleLoader.getString("JSON.Locked"), ccLocked, TextDecoration.BOLD)); + componentBuilder.append("\n").append("\n"); + componentBuilder.append(TextComponent.of(LocaleLoader.getString("JSON.LevelRequirement") + ": ", ccLevelRequirement)); } @Deprecated - private static BaseComponent[] getSubSkillHoverEventJSON(SubSkillType subSkillType, Player player) + private static Component 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 ccDescriptionHeader = ChatColor.DARK_PURPLE; - ChatColor ccDescription = ChatColor.DARK_GRAY; - ChatColor ccLocked = ChatColor.DARK_GRAY; - ChatColor ccLevelRequirement = ChatColor.BLUE; - ChatColor ccLevelRequired = ChatColor.RED; + 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 - ComponentBuilder componentBuilder = setupSkillComponentNameStyle(player, skillName, subSkillType, RankUtils.hasUnlockedSubskill(player, subSkillType)); + TextComponent.Builder componentBuilder = setupSkillComponentNameStyle(player, skillName, subSkillType, RankUtils.hasUnlockedSubskill(player, subSkillType)); if(!RankUtils.hasUnlockedSubskill(player, subSkillType)) { @@ -485,7 +492,7 @@ public class TextComponentFactory { } - componentBuilder.append("\n").bold(false); + componentBuilder.append("\n"); componentBuilder.append(LocaleLoader.getString("JSON.DescriptionHeader")); componentBuilder.color(ccDescriptionHeader); componentBuilder.append("\n"); @@ -493,28 +500,25 @@ public class TextComponentFactory { componentBuilder.color(ccDescription); } - return componentBuilder.create(); + return componentBuilder.build(); } - private static void addSubSkillTypeToHoverEventJSON(AbstractSubSkill abstractSubSkill, ComponentBuilder componentBuilder) + private static void addSubSkillTypeToHoverEventJSON(AbstractSubSkill abstractSubSkill, TextComponent.Builder componentBuilder) { if(abstractSubSkill.isSuperAbility()) { - componentBuilder.append(LocaleLoader.getString("JSON.Type.SuperAbility")).color(ChatColor.LIGHT_PURPLE); - componentBuilder.bold(true); + componentBuilder.append(TextComponent.of(LocaleLoader.getString("JSON.Type.SuperAbility"), NamedTextColor.LIGHT_PURPLE, TextDecoration.BOLD)); } else if(abstractSubSkill.isActiveUse()) { - componentBuilder.append(LocaleLoader.getString("JSON.Type.Active")).color(ChatColor.DARK_RED); - componentBuilder.bold(true); + componentBuilder.append(TextComponent.of(LocaleLoader.getString("JSON.Type.Active"), NamedTextColor.DARK_RED, TextDecoration.BOLD)); } else { - componentBuilder.append(LocaleLoader.getString("JSON.Type.Passive")).color(ChatColor.GREEN); - componentBuilder.bold(true); + componentBuilder.append(TextComponent.of(LocaleLoader.getString("JSON.Type.Passive"), NamedTextColor.GREEN, TextDecoration.BOLD)); } componentBuilder.append("\n"); } - public static void getSubSkillTextComponents(Player player, List textComponents, PrimarySkillType parentSkill) { + public static void getSubSkillTextComponents(Player player, List textComponents, PrimarySkillType parentSkill) { for(SubSkillType subSkillType : SubSkillType.values()) { if(subSkillType.getParentSkill() == parentSkill) @@ -540,11 +544,10 @@ public class TextComponentFactory { 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; + TextComponent.Builder unlockMessage = TextComponent.builder(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/player/NotificationManager.java b/src/main/java/com/gmail/nossr50/util/player/NotificationManager.java index 2bd02aa6a..b5a4ce499 100644 --- a/src/main/java/com/gmail/nossr50/util/player/NotificationManager.java +++ b/src/main/java/com/gmail/nossr50/util/player/NotificationManager.java @@ -10,12 +10,14 @@ import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.events.skills.McMMOPlayerNotificationEvent; import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.util.McMMOMessageType; 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 net.kyori.adventure.audience.Audience; +import net.kyori.adventure.audience.MessageType; +import net.kyori.adventure.text.Component; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Server; @@ -36,9 +38,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 = AdvancedConfig.getInstance().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 +93,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 = AdvancedConfig.getInstance().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,22 +105,24 @@ public class NotificationManager { if (customEvent.isCancelled()) return; + final Audience audience = mcMMO.getAudiences().audience(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(customEvent.getNotificationTextComponent(), MessageType.SYSTEM); } } else { - player.spigot().sendMessage(customEvent.getChatMessageType(), customEvent.getNotificationTextComponent()); + audience.sendMessage(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)); @@ -139,9 +143,9 @@ public class NotificationManager { if(!mcMMOPlayer.useChatNotifications()) return; - ChatMessageType destination = AdvancedConfig.getInstance().doesNotificationUseActionBar(NotificationType.LEVEL_UP_MESSAGE) ? ChatMessageType.ACTION_BAR : ChatMessageType.SYSTEM; + McMMOMessageType destination = AdvancedConfig.getInstance().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,7 +165,7 @@ public class NotificationManager { return; //CHAT MESSAGE - mcMMOPlayer.getPlayer().spigot().sendMessage(TextComponentFactory.getSubSkillUnlockedNotificationComponents(mcMMOPlayer.getPlayer(), subSkillType)); + mcMMO.getAudiences().audience(mcMMOPlayer.getPlayer()).sendMessage(TextComponentFactory.getSubSkillUnlockedNotificationComponents(mcMMOPlayer.getPlayer(), subSkillType)); //Unlock Sound Effect SoundManager.sendCategorizedSound(mcMMOPlayer.getPlayer(), mcMMOPlayer.getPlayer().getLocation(), SoundType.SKILL_UNLOCKED, SoundCategory.MASTER); 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 70063bdea..165008068 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/PerksUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/PerksUtils.java @@ -4,7 +4,7 @@ import com.gmail.nossr50.config.experience.ExperienceConfig; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.util.Permissions; import com.gmail.nossr50.util.player.UserManager; -import net.md_5.bungee.api.ChatColor; +import org.bukkit.ChatColor; import org.bukkit.entity.Player; public final class PerksUtils { From 6f999405403f33b0ec000da968c23842bcd43b3d Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 25 Sep 2020 10:40:26 -0700 Subject: [PATCH 153/662] Add missing includes --- Changelog.txt | 1 + pom.xml | 35 +++++++++++++++++++ .../nossr50/util/TextComponentFactory.java | 2 +- 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index 10e620817..93b49d8af 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,4 +1,5 @@ Version 2.1.146 + JSON Text components are now done through 'adventure' library by Kyori, this should help reduce player disconnects from messages due to an unfixed Spigot bug. 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 diff --git a/pom.xml b/pom.xml index d1228adbe..fc89690db 100755 --- a/pom.xml +++ b/pom.xml @@ -100,6 +100,16 @@ org.apache.tomcat:tomcat-juli 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-common + net.kyori:adventure-platform-viaversion + net.kyori:adventure-nbt + net.kyori:examination-api + net.kyori:examination-string + net.kyori:adventure-text-serializer-legacy + net.kyori:adventure-text-serializer-bungeecord @@ -115,6 +125,10 @@ org.apache.tomcat com.gmail.nossr50.database.tomcat + + net.kyori.adventure + com.gmail.nossr50.kyori.adventure + org.bstats com.gmail.nossr50.metrics.bstat @@ -160,16 +174,37 @@ + + + net.kyori + adventure-text-serializer-gson + 4.0.0-SNAPSHOT + net.kyori adventure-api 4.0.0-SNAPSHOT + + net.kyori + adventure-nbt + 4.0.0-SNAPSHOT + net.kyori adventure-platform-bukkit 4.0.0-SNAPSHOT + + net.kyori + adventure-platform-api + 4.0.0-SNAPSHOT + + + net.kyori + adventure-platform-common + 4.0.0-SNAPSHOT + org.apache.maven.scm maven-scm-provider-gitexe diff --git a/src/main/java/com/gmail/nossr50/util/TextComponentFactory.java b/src/main/java/com/gmail/nossr50/util/TextComponentFactory.java index 48d016da5..d9f24b675 100644 --- a/src/main/java/com/gmail/nossr50/util/TextComponentFactory.java +++ b/src/main/java/com/gmail/nossr50/util/TextComponentFactory.java @@ -483,7 +483,7 @@ public class TextComponentFactory { int curRank = RankUtils.getRank(player, subSkillType); int nextRank = 0; - if(curRank < subSkillType.getNumRanks() && subSkillType.getNumRanks() > 0) + if(curRank < subSkillType.getNumRanks()) { nextRank = RankUtils.getRankUnlockLevel(subSkillType, curRank+1); } From adbcf11c1585c0e39fe9ac7fac9b574a210a15cc Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 25 Sep 2020 11:01:47 -0700 Subject: [PATCH 154/662] 2.1.146 --- Changelog.txt | 31 ++++++++++++++++++++++++++++++- pom.xml | 2 +- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 93b49d8af..43b552678 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,9 +1,38 @@ Version 2.1.146 - JSON Text components are now done through 'adventure' library by Kyori, this should help reduce player disconnects from messages due to an unfixed Spigot bug. + 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 + If you guys are looking to hire someone of exceptional quality for a Java project, Kashike is a skilled developer who I respect and he makes a living off free lance right now. Try contacting him if you do! + Kashike is a developer on the mcMMO team, however after I recruited him had a lot of life stuff come at him and hasn'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 diff --git a/pom.xml b/pom.xml index fc89690db..f8fef7074 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.146-SNAPSHOT + 2.1.146 mcMMO https://github.com/mcMMO-Dev/mcMMO From 8451f84083a036682fb51132d18fc4f43c6847d5 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 25 Sep 2020 11:36:42 -0700 Subject: [PATCH 155/662] dev mode --- Changelog.txt | 4 +- pom.xml | 2 +- .../nossr50/listeners/CommandListener.java | 40 +++++++++++++++++++ src/main/java/com/gmail/nossr50/mcMMO.java | 1 + .../gmail/nossr50/util/skills/SkillUtils.java | 4 -- 5 files changed, 45 insertions(+), 6 deletions(-) create mode 100644 src/main/java/com/gmail/nossr50/listeners/CommandListener.java diff --git a/Changelog.txt b/Changelog.txt index 43b552678..7f67c15e8 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,6 @@ +Version 2.1.147 + + 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 @@ -8,7 +11,6 @@ Version 2.1.146 NOTES: Shout out to Kashike - If you guys are looking to hire someone of exceptional quality for a Java project, Kashike is a skilled developer who I respect and he makes a living off free lance right now. Try contacting him if you do! Kashike is a developer on the mcMMO team, however after I recruited him had a lot of life stuff come at him and hasn'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. diff --git a/pom.xml b/pom.xml index f8fef7074..a3d6c5776 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.146 + 2.1.147-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO 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/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index 998c6d638..64c1509ef 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -555,6 +555,7 @@ 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 CommandListener(this), this); } /** 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 d9ccf532f..76c73d391 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/SkillUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/SkillUtils.java @@ -198,10 +198,6 @@ public class SkillUtils { } public static void removeAbilityBoostsFromInventory(@NotNull Player player) { - if (!HiddenConfig.getInstance().useEnchantmentBuffs()) { - return; - } - for (ItemStack itemStack : player.getInventory().getContents()) { removeAbilityBuff(itemStack); } From 4005c218101b2cb3967aac5eeb0c5910f333371b Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 28 Sep 2020 17:36:33 -0700 Subject: [PATCH 156/662] 2.1.147 --- Changelog.txt | 2 +- pom.xml | 2 +- .../com/gmail/nossr50/util/EventUtils.java | 18 ++++++++++-------- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 7f67c15e8..2b1ac3612 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,5 +1,5 @@ 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) diff --git a/pom.xml b/pom.xml index a3d6c5776..b0125040b 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.147-SNAPSHOT + 2.1.147 mcMMO https://github.com/mcMMO-Dev/mcMMO diff --git a/src/main/java/com/gmail/nossr50/util/EventUtils.java b/src/main/java/com/gmail/nossr50/util/EventUtils.java index 3065bc5cb..b75dcd197 100644 --- a/src/main/java/com/gmail/nossr50/util/EventUtils.java +++ b/src/main/java/com/gmail/nossr50/util/EventUtils.java @@ -331,16 +331,18 @@ public class EventUtils { for (PrimarySkillType primarySkillType : PrimarySkillType.NON_CHILD_SKILLS) { String skillName = primarySkillType.toString(); int playerSkillLevel = playerProfile.getSkillLevel(primarySkillType); + int threshold = Config.getInstance().getHardcoreDeathStatPenaltyLevelThreshold(); + if(playerSkillLevel > threshold) { + playerProfile.modifySkill(primarySkillType, Math.max(threshold, playerSkillLevel - levelChanged.get(skillName))); + playerProfile.removeXp(primarySkillType, experienceChanged.get(skillName)); - playerProfile.modifySkill(primarySkillType, Math.max(Config.getInstance().getHardcoreDeathStatPenaltyLevelThreshold(), 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); + } } } } From c675c36601d30cec281ac38a755ac159f6ed3256 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Wed, 30 Sep 2020 11:34:01 -0700 Subject: [PATCH 157/662] adventure api update --- .../java/com/gmail/nossr50/util/TextComponentFactory.java | 6 +++--- .../com/gmail/nossr50/util/player/NotificationManager.java | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/util/TextComponentFactory.java b/src/main/java/com/gmail/nossr50/util/TextComponentFactory.java index d9f24b675..3a7fbed73 100644 --- a/src/main/java/com/gmail/nossr50/util/TextComponentFactory.java +++ b/src/main/java/com/gmail/nossr50/util/TextComponentFactory.java @@ -78,7 +78,7 @@ public class TextComponentFactory { wikiLinkComponent.hoverEvent(HoverEvent.showText(componentBuilder.build())); - mcMMO.getAudiences().audience(player).sendMessage(wikiLinkComponent, MessageType.SYSTEM); + mcMMO.getAudiences().player(player).sendMessage(wikiLinkComponent, MessageType.SYSTEM); } public static void sendPlayerUrlHeader(Player player) { @@ -89,7 +89,7 @@ public class TextComponentFactory { TextComponent emptySpace = TextComponent.space(); - mcMMO.getAudiences().audience(player).sendMessage(TextComponent.ofChildren( + mcMMO.getAudiences().player(player).sendMessage(TextComponent.ofChildren( prefix, getWebLinkTextComponent(McMMOWebLinks.WEBSITE), emptySpace, @@ -113,7 +113,7 @@ public class TextComponentFactory { AtomicReference messageToSend = new AtomicReference<>(); int newLineCount = 0; //Hacky solution to wordwrap problems - final Audience audience = mcMMO.getAudiences().audience(player); + final Audience audience = mcMMO.getAudiences().player(player); for (Component textComponent : textComponents) { //Don't send more than 3 subskills per line to avoid MOST wordwrap problems if(newLineCount > 2) 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 b5a4ce499..cc169f623 100644 --- a/src/main/java/com/gmail/nossr50/util/player/NotificationManager.java +++ b/src/main/java/com/gmail/nossr50/util/player/NotificationManager.java @@ -105,7 +105,7 @@ public class NotificationManager { if (customEvent.isCancelled()) return; - final Audience audience = mcMMO.getAudiences().audience(player); + 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() == McMMOMessageType.ACTION_BAR) @@ -165,7 +165,7 @@ public class NotificationManager { return; //CHAT MESSAGE - mcMMO.getAudiences().audience(mcMMOPlayer.getPlayer()).sendMessage(TextComponentFactory.getSubSkillUnlockedNotificationComponents(mcMMOPlayer.getPlayer(), subSkillType)); + mcMMO.getAudiences().player(mcMMOPlayer.getPlayer()).sendMessage(TextComponentFactory.getSubSkillUnlockedNotificationComponents(mcMMOPlayer.getPlayer(), subSkillType)); //Unlock Sound Effect SoundManager.sendCategorizedSound(mcMMOPlayer.getPlayer(), mcMMOPlayer.getPlayer().getLocation(), SoundType.SKILL_UNLOCKED, SoundCategory.MASTER); From ee17707c6c47b1c4c20c35062cf7f88dfd5215ef Mon Sep 17 00:00:00 2001 From: nossr50 Date: Wed, 30 Sep 2020 13:12:28 -0700 Subject: [PATCH 158/662] Alchemy progression through ranks improved --- Changelog.txt | 6 ++++++ pom.xml | 2 +- src/main/resources/skillranks.yml | 20 ++++++++++---------- 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 2b1ac3612..1fed01fea 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,9 @@ +Version 2.1.148 + Alchemy progression is now more reasonable (delete skillranks.yml or edit it yourself to receive the change) + + NOTES: + Alchemy now progresses much smoother, with rank 2 no longer unlocking right away. Thanks to Momshroom for pointing out this oddity. + 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 diff --git a/pom.xml b/pom.xml index b0125040b..edf4c378c 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.147 + 2.1.148-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO diff --git a/src/main/resources/skillranks.yml b/src/main/resources/skillranks.yml index acb5d3e28..17574593c 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: From 5d022b6f7c368aa138c3420112665cd709f032e4 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 2 Oct 2020 13:09:38 -0700 Subject: [PATCH 159/662] adding new and required kyori includes --- Changelog.txt | 2 +- pom.xml | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index 1fed01fea..9f84c51b0 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -17,7 +17,7 @@ Version 2.1.146 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 hasn't had a chance to contribute until now! + 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. diff --git a/pom.xml b/pom.xml index edf4c378c..014c5b0a6 100755 --- a/pom.xml +++ b/pom.xml @@ -105,11 +105,13 @@ net.kyori:adventure-platform-api net.kyori:adventure-platform-common net.kyori:adventure-platform-viaversion + net.kyori:adventure-platform-facet net.kyori:adventure-nbt 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 From a6586e07cc4e0cc216db0bd22a0ea81d35cb5d8e Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 5 Oct 2020 14:13:32 -0700 Subject: [PATCH 160/662] final damage values of 0 are only ignored in certain circumstances, fixes a few bugs --- Changelog.txt | 1 + .../com/gmail/nossr50/listeners/EntityListener.java | 3 +-- .../com/gmail/nossr50/util/skills/CombatUtils.java | 12 ++++++++++++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 9f84c51b0..03dbf644e 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,4 +1,5 @@ Version 2.1.148 + Fixed a bug where weakness potions could prevent unarmed skills from activating and thus making unarmed useless Alchemy progression is now more reasonable (delete skillranks.yml or edit it yourself to receive the change) NOTES: diff --git a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java index a462d598b..89339cc8c 100644 --- a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java @@ -411,7 +411,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,7 +420,7 @@ public class EntityListener implements Listener { * Surprising this kind of thing * */ - if(damage <= 0) { + if(event.getDamage() <= 0 && !CombatUtils.isDamageLikelyFromNormalCombat(event.getCause())) { return; } 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 67ff06589..501d9571c 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java @@ -42,6 +42,18 @@ import java.util.Map; public final class CombatUtils { private CombatUtils() {} + //Likely.. because who knows what plugins are throwing around + public static boolean isDamageLikelyFromNormalCombat(DamageCause damageCause) { + switch (damageCause) { + case ENTITY_ATTACK: + case ENTITY_SWEEP_ATTACK: + case PROJECTILE: + return true; + default: + return false; + } + } + private static void processSwordCombat(LivingEntity target, Player player, EntityDamageByEntityEvent event) { if (event.getCause() == DamageCause.THORNS) { return; From 0767e6296586307f85a1765c783ea8802ad8e00a Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 5 Oct 2020 14:43:06 -0700 Subject: [PATCH 161/662] Only ignore 0 dmg if specific plugins are detected --- .../gmail/nossr50/commands/skills/SkillCommand.java | 1 - .../datatypes/skills/subskills/acrobatics/Roll.java | 1 - .../skills/subskills/interfaces/SubSkill.java | 1 - .../com/gmail/nossr50/listeners/EntityListener.java | 13 +++++-------- src/main/java/com/gmail/nossr50/mcMMO.java | 10 ++++++++++ .../nossr50/skills/unarmed/UnarmedManager.java | 2 +- .../java/com/gmail/nossr50/util/EventUtils.java | 1 - .../com/gmail/nossr50/util/McMMOMessageType.java | 3 ++- .../gmail/nossr50/util/TextComponentFactory.java | 4 +--- .../com/gmail/nossr50/util/skills/CombatUtils.java | 9 +++++++-- 10 files changed, 26 insertions(+), 19 deletions(-) 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 bece332e5..5aecd63c7 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/SkillCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/SkillCommand.java @@ -21,7 +21,6 @@ import com.gmail.nossr50.util.skills.SkillActivationType; 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; 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 fc6886a27..a86e74e28 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 @@ -23,7 +23,6 @@ import com.gmail.nossr50.util.skills.SkillUtils; import com.gmail.nossr50.util.sounds.SoundManager; import com.gmail.nossr50.util.sounds.SoundType; import net.kyori.adventure.text.TextComponent; -import net.md_5.bungee.api.chat.ComponentBuilder; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.SoundCategory; 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 701a528aa..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 @@ -2,7 +2,6 @@ package com.gmail.nossr50.datatypes.skills.subskills.interfaces; import com.gmail.nossr50.datatypes.skills.interfaces.Skill; import net.kyori.adventure.text.TextComponent; -import net.md_5.bungee.api.chat.ComponentBuilder; import org.bukkit.entity.Player; public interface SubSkill extends Skill { diff --git a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java index 89339cc8c..5d58aac17 100644 --- a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java @@ -5,6 +5,7 @@ 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; +import com.gmail.nossr50.datatypes.player.PlayerProfile; import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.datatypes.skills.subskills.interfaces.InteractType; import com.gmail.nossr50.events.fake.FakeEntityDamageByEntityEvent; @@ -328,12 +329,6 @@ 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)) { return; @@ -420,8 +415,10 @@ public class EntityListener implements Listener { * Surprising this kind of thing * */ - if(event.getDamage() <= 0 && !CombatUtils.isDamageLikelyFromNormalCombat(event.getCause())) { - return; + if(mcMMO.isProjectKorraEnabled()) { + if(event.getFinalDamage() == 0) { + return; + } } CombatUtils.processCombatAttack(event, attacker, target); diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index 64c1509ef..345e1fd28 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -102,6 +102,7 @@ public class mcMMO extends JavaPlugin { /* Plugin Checks */ private static boolean healthBarPluginEnabled; + private static boolean projectKorraEnabled; // API checks private static boolean serverAPIOutdated = false; @@ -159,6 +160,7 @@ public class mcMMO extends JavaPlugin { PluginManager pluginManager = getServer().getPluginManager(); healthBarPluginEnabled = pluginManager.getPlugin("HealthBar") != null; + projectKorraEnabled = pluginManager.getPlugin("ProjectKorra") != null; upgradeManager = new UpgradeManager(); @@ -182,6 +184,10 @@ public class mcMMO extends JavaPlugin { 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."); } @@ -689,4 +695,8 @@ public class mcMMO extends JavaPlugin { public static BukkitAudiences getAudiences() { return audiences; } + + public static boolean isProjectKorraEnabled() { + return projectKorraEnabled; + } } 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 ebf7e81c0..ebf50f28a 100644 --- a/src/main/java/com/gmail/nossr50/skills/unarmed/UnarmedManager.java +++ b/src/main/java/com/gmail/nossr50/skills/unarmed/UnarmedManager.java @@ -35,7 +35,7 @@ public class UnarmedManager extends SkillManager { return mcMMOPlayer.getToolPreparationMode(ToolType.FISTS) && Permissions.berserk(getPlayer()); } - public boolean canUseIronArm() { + public boolean canUseSteelArm() { if(!RankUtils.hasUnlockedSubskill(getPlayer(), SubSkillType.UNARMED_STEEL_ARM_STYLE)) return false; diff --git a/src/main/java/com/gmail/nossr50/util/EventUtils.java b/src/main/java/com/gmail/nossr50/util/EventUtils.java index b75dcd197..8043e895b 100644 --- a/src/main/java/com/gmail/nossr50/util/EventUtils.java +++ b/src/main/java/com/gmail/nossr50/util/EventUtils.java @@ -1,6 +1,5 @@ package com.gmail.nossr50.util; -import com.gmail.nossr50.config.AdvancedConfig; import com.gmail.nossr50.config.Config; import com.gmail.nossr50.datatypes.experience.XPGainReason; import com.gmail.nossr50.datatypes.experience.XPGainSource; diff --git a/src/main/java/com/gmail/nossr50/util/McMMOMessageType.java b/src/main/java/com/gmail/nossr50/util/McMMOMessageType.java index 741c94767..6619e8f0f 100644 --- a/src/main/java/com/gmail/nossr50/util/McMMOMessageType.java +++ b/src/main/java/com/gmail/nossr50/util/McMMOMessageType.java @@ -1,10 +1,11 @@ package com.gmail.nossr50.util; -import java.util.function.BiConsumer; import net.kyori.adventure.audience.Audience; import net.kyori.adventure.audience.MessageType; import net.kyori.adventure.text.Component; +import java.util.function.BiConsumer; + public enum McMMOMessageType { ACTION_BAR(Audience::sendActionBar), SYSTEM((audience, message) -> audience.sendMessage(message, MessageType.SYSTEM)); diff --git a/src/main/java/com/gmail/nossr50/util/TextComponentFactory.java b/src/main/java/com/gmail/nossr50/util/TextComponentFactory.java index 3a7fbed73..2ec6351bc 100644 --- a/src/main/java/com/gmail/nossr50/util/TextComponentFactory.java +++ b/src/main/java/com/gmail/nossr50/util/TextComponentFactory.java @@ -11,7 +11,6 @@ import com.gmail.nossr50.listeners.InteractionManager; import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.skills.RankUtils; -import java.util.concurrent.atomic.AtomicReference; import net.kyori.adventure.audience.Audience; import net.kyori.adventure.audience.MessageType; import net.kyori.adventure.text.Component; @@ -22,12 +21,11 @@ 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 net.md_5.bungee.api.ChatMessageType; import org.bukkit.entity.Player; -import java.util.ArrayList; import java.util.List; import java.util.Locale; +import java.util.concurrent.atomic.AtomicReference; /** * This class handles many of the JSON components that mcMMO makes and uses 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 501d9571c..a6cc6af19 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java @@ -32,6 +32,7 @@ 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 java.util.EnumMap; @@ -54,6 +55,11 @@ public final class CombatUtils { } } + public static boolean hasWeakenedDamage(LivingEntity livingEntity) { + return livingEntity.hasPotionEffect(PotionEffectType.WEAKNESS); + } + + private static void processSwordCombat(LivingEntity target, Player player, EntityDamageByEntityEvent event) { if (event.getCause() == DamageCause.THORNS) { return; @@ -198,8 +204,7 @@ public final class CombatUtils { mcMMOPlayer.checkAbilityActivation(PrimarySkillType.UNARMED); } - //Only execute bonuses if the player is not spamming - if (unarmedManager.canUseIronArm()) { + if (unarmedManager.canUseSteelArm()) { finalDamage+=(unarmedManager.calculateSteelArmStyleDamage() * mcMMOPlayer.getAttackStrength()); } From 20c69b63af2cfa50aad556f4401d440b1f788e70 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 8 Oct 2020 15:25:40 -0700 Subject: [PATCH 162/662] Memory leak fixes, optimizations, and persistence --- Changelog.txt | 23 +- pom.xml | 2 +- .../IncompleteNamespacedKeyRegister.java | 7 + .../config/experience/ExperienceConfig.java | 2 + .../nossr50/listeners/EntityListener.java | 247 ++++++++---------- src/main/java/com/gmail/nossr50/mcMMO.java | 14 +- .../nossr50/skills/taming/TamingManager.java | 8 +- .../nossr50/util/TransientMetadataTools.java | 37 +++ .../AbstractPersistentDataLayer.java | 114 +++++++- .../persistentdata/MobMetaFlagType.java | 11 + .../SpigotPersistentDataLayer_1_13.java | 98 ++++++- .../SpigotPersistentDataLayer_1_14.java | 110 ++++++-- .../nossr50/util/skills/CombatUtils.java | 93 +++++-- src/main/resources/experience.yml | 4 + 14 files changed, 546 insertions(+), 224 deletions(-) create mode 100644 src/main/java/com/gmail/nossr50/api/exceptions/IncompleteNamespacedKeyRegister.java create mode 100644 src/main/java/com/gmail/nossr50/util/TransientMetadataTools.java create mode 100644 src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/MobMetaFlagType.java diff --git a/Changelog.txt b/Changelog.txt index 03dbf644e..a62c70960 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,9 +1,30 @@ Version 2.1.148 - Fixed a bug where weakness potions could prevent unarmed skills from activating and thus making unarmed useless + Fixed a memory leak involving entity metadata Alchemy progression is now more reasonable (delete skillranks.yml or edit it yourself to receive the change) + 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 + + 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 with certain weapons + + (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 + 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. + 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 diff --git a/pom.xml b/pom.xml index 014c5b0a6..477615059 100755 --- a/pom.xml +++ b/pom.xml @@ -221,7 +221,7 @@ org.spigotmc spigot-api - 1.16.2-R0.1-SNAPSHOT + 1.14-R0.1-SNAPSHOT provided 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..92b97ca88 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/api/exceptions/IncompleteNamespacedKeyRegister.java @@ -0,0 +1,7 @@ +package com.gmail.nossr50.api.exceptions; + +public class IncompleteNamespacedKeyRegister extends RuntimeException { + public IncompleteNamespacedKeyRegister(String message) { + super(message); + } +} 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 68dcc8d1a..c009a4cc4 100644 --- a/src/main/java/com/gmail/nossr50/config/experience/ExperienceConfig.java +++ b/src/main/java/com/gmail/nossr50/config/experience/ExperienceConfig.java @@ -175,6 +175,8 @@ public class ExperienceConfig extends AutoUpdateConfigLoader { /* Spawned Mob modifier */ 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 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 */ diff --git a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java index 5d58aac17..919a6d14f 100644 --- a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java @@ -5,7 +5,6 @@ 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; -import com.gmail.nossr50.datatypes.player.PlayerProfile; import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.datatypes.skills.subskills.interfaces.InteractType; import com.gmail.nossr50.events.fake.FakeEntityDamageByEntityEvent; @@ -22,6 +21,8 @@ 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.compat.layers.persistentdata.AbstractPersistentDataLayer; +import com.gmail.nossr50.util.compat.layers.persistentdata.MobMetaFlagType; import com.gmail.nossr50.util.player.NotificationManager; import com.gmail.nossr50.util.player.UserManager; import com.gmail.nossr50.util.random.RandomChanceUtil; @@ -46,30 +47,36 @@ 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 AbstractPersistentDataLayer persistentDataLayer; - public EntityListener(final mcMMO plugin) { - this.plugin = plugin; + public EntityListener(final mcMMO pluginRef) { + this.pluginRef = pluginRef; + persistentDataLayer = mcMMO.getCompatibilityManager().getPersistentDataLayer(); } @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(persistentDataLayer.hasMobFlags(livingEntity)) { + for(Entity entity : event.getTransformedEntities()) { + if(entity instanceof LivingEntity) { + LivingEntity transformedEntity = (LivingEntity) entity; + persistentDataLayer.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 +89,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(!persistentDataLayer.hasMobFlag(MobMetaFlagType.EXPLOITED_ENDERMEN, enderman)) { + persistentDataLayer.flagMetadata(MobMetaFlagType.EXPLOITED_ENDERMEN, enderman); + } + } } } @@ -119,8 +131,8 @@ public class EntityListener implements Listener { 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())); + projectile.setMetadata(mcMMO.bowForceKey, new FixedMetadataValue(pluginRef, Math.min(event.getForce() * AdvancedConfig.getInstance().getForceMultiplier(), 1.0))); + projectile.setMetadata(mcMMO.arrowDistanceKey, new FixedMetadataValue(pluginRef, projectile.getLocation())); } @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) @@ -145,8 +157,8 @@ public class EntityListener implements Listener { if(!(projectile instanceof Arrow)) return; - projectile.setMetadata(mcMMO.bowForceKey, new FixedMetadataValue(plugin, 1.0)); - projectile.setMetadata(mcMMO.arrowDistanceKey, new FixedMetadataValue(plugin, projectile.getLocation())); + projectile.setMetadata(mcMMO.bowForceKey, new FixedMetadataValue(pluginRef, 1.0)); + projectile.setMetadata(mcMMO.arrowDistanceKey, new FixedMetadataValue(pluginRef, projectile.getLocation())); for(Enchantment enchantment : player.getInventory().getItemInMainHand().getEnchantments().keySet()) { if(enchantment.getName().equalsIgnoreCase("piercing")) @@ -185,74 +197,38 @@ public class EntityListener implements Listener { Entity entity = event.getEntity(); if (entity instanceof FallingBlock || entity instanceof Enderman) { - boolean isTracked = entity.hasMetadata(mcMMO.entityMetadataKey); - - if (mcMMO.getPlaceStore().isTrue(block) && !isTracked) { - mcMMO.getPlaceStore().setFalse(block); - - entity.setMetadata(mcMMO.entityMetadataKey, mcMMO.metadataValue); - } - else if (isTracked) { - mcMMO.getPlaceStore().setTrue(block); - } - } else if ((block.getType() == Material.REDSTONE_ORE)) { - } - else { + trackMovingBlocks(block, entity); //ignore the IDE warning + //Apparently redstone ore will throw these events + } else if ((block.getType() != Material.REDSTONE_ORE)) { if (mcMMO.getPlaceStore().isTrue(block)) { mcMMO.getPlaceStore().setFalse(block); } } } - /*@EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) - public void onEntityDamageDebugLowest(EntityDamageEvent event) - { - if(event instanceof FakeEntityDamageByEntityEvent) - return; + /** + * This is a complex hack to track blocks for this event + * This event is called when a block starts its movement, or ends its movement + * It can start the movement through physics (falling blocks) or through being picked up (endermen) + * Since this event can be cancelled, its even weirder to track this stuff + * @param block this will either be the block that was originally picked up, or the block in its final destination + * @param movementSourceEntity this will either be an Endermen or a Falling Block + */ + private void trackMovingBlocks(@NotNull Block block, @NotNull Entity movementSourceEntity) { - if(event instanceof FakeEntityDamageEvent) - return; - - Bukkit.broadcastMessage(ChatColor.DARK_AQUA+"DMG Before Events: " - +ChatColor.RESET+event.getDamage()); + //A block that has reached its destination, either being placed by endermen or having finished its fall + if(movementSourceEntity.hasMetadata(mcMMO.travelingBlock)) { + mcMMO.getPlaceStore().setTrue(block); + movementSourceEntity.removeMetadata(mcMMO.travelingBlock, pluginRef); + } else { + //A block that is starting movement (from either Endermen or Falling/Physics) + if(mcMMO.getPlaceStore().isTrue(block)) { + mcMMO.getPlaceStore().setFalse(block); + movementSourceEntity.setMetadata(mcMMO.blockMetadataKey, mcMMO.metadataValue); + } + } } - @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) { //Prevent players from setting fire to each other if they are in the same party @@ -284,6 +260,10 @@ public class EntityListener implements Listener { */ @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) public void onEntityDamageByEntity(EntityDamageByEntityEvent event) { + if (event instanceof FakeEntityDamageByEntityEvent) { + return; + } + double damage = event.getFinalDamage(); Entity defender = event.getEntity(); Entity attacker = event.getDamager(); @@ -292,35 +272,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; @@ -344,6 +320,10 @@ public class EntityListener implements Listener { return; } + if (CombatUtils.hasIgnoreDamageMetadata(target)) { + return; + } + if (attacker instanceof Tameable) { AnimalTamer animalTamer = ((Tameable) attacker).getOwner(); @@ -422,7 +402,7 @@ public class EntityListener implements Listener { } 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) @@ -490,7 +470,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 @@ -646,29 +626,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().cleanAllMobMetadata(event.getEntity()); } /** @@ -704,33 +662,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: } } + private void trackSpawnedAndPassengers(LivingEntity livingEntity, MobMetaFlagType mobMetaFlagType) { + persistentDataLayer.flagMetadata(mobMetaFlagType, livingEntity); + + for(Entity passenger : livingEntity.getPassengers()) { + if(passenger != null) { + persistentDataLayer.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(persistentDataLayer.hasMobFlag(MobMetaFlagType.COTW_SUMMONED_MOB, event.getFather()) || persistentDataLayer.hasMobFlag(MobMetaFlagType.COTW_SUMMONED_MOB, event.getMother())) { event.setCancelled(true); Animals mom = (Animals) event.getMother(); Animals father = (Animals) event.getFather(); @@ -745,7 +711,6 @@ public class EntityListener implements Listener { NotificationManager.sendPlayerInformationChatOnly(player, "Taming.Summon.COTW.BreedingDisallowed"); } } - } } @@ -769,7 +734,7 @@ public class EntityListener implements Listener { // 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(mcMMO.tntMetadataKey).get(0).asString()); if (!UserManager.hasPlayerDataKey(player)) { return; @@ -815,7 +780,7 @@ public class EntityListener implements Listener { // 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(mcMMO.tntMetadataKey).get(0).asString()); if (!UserManager.hasPlayerDataKey(player)) { return; @@ -983,13 +948,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) + || Misc.isNPCEntityExcludingVillagers(livingEntity) + || persistentDataLayer.hasMobFlag(MobMetaFlagType.EGG_MOB, livingEntity) + || persistentDataLayer.hasMobFlag(MobMetaFlagType.MOB_SPAWNER_MOB, livingEntity)) { return; } - entity.setMetadata(mcMMO.entityMetadataKey, mcMMO.metadataValue); + persistentDataLayer.flagMetadata(MobMetaFlagType.PLAYER_TAMED_MOB, livingEntity); //Profile not loaded if(UserManager.getPlayer(player) == null) @@ -997,7 +965,7 @@ public class EntityListener implements Listener { return; } - UserManager.getPlayer(player).getTamingManager().awardTamingXP(entity); + UserManager.getPlayer(player).getTamingManager().awardTamingXP(livingEntity); } /** @@ -1069,15 +1037,4 @@ 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/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index 345e1fd28..36219c257 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -81,6 +81,7 @@ public class mcMMO extends JavaPlugin { private static MaterialMapStore materialMapStore; private static PlayerLevelUtils playerLevelUtils; private static SmeltingTracker smeltingTracker; + private static TransientMetadataTools transientMetadataTools; /* Adventure */ private static BukkitAudiences audiences; @@ -120,11 +121,9 @@ public class mcMMO extends JavaPlugin { 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 travelingBlock = "mcMMO: Traveling Block"; public final static String blockMetadataKey = "mcMMO: Piston Tracking"; 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"; @@ -133,12 +132,9 @@ public class mcMMO extends JavaPlugin { 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"; public static FixedMetadataValue metadataValue; @@ -282,6 +278,8 @@ public class mcMMO extends JavaPlugin { smeltingTracker = new SmeltingTracker(); audiences = BukkitAudiences.create(this); + + transientMetadataTools = new TransientMetadataTools(this); } public static PlayerLevelUtils getPlayerLevelUtils() { @@ -699,4 +697,8 @@ public class mcMMO extends JavaPlugin { public static boolean isProjectKorraEnabled() { return projectKorraEnabled; } + + public static TransientMetadataTools getTransientMetadataTools() { + return transientMetadataTools; + } } 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 2627b93c4..8df527618 100644 --- a/src/main/java/com/gmail/nossr50/skills/taming/TamingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/taming/TamingManager.java @@ -17,6 +17,7 @@ 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.compat.layers.persistentdata.MobMetaFlagType; import com.gmail.nossr50.util.player.NotificationManager; import com.gmail.nossr50.util.random.RandomChanceSkillStatic; import com.gmail.nossr50.util.random.RandomChanceUtil; @@ -485,12 +486,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.getCompatibilityManager().getPersistentDataLayer().flagMetadata(MobMetaFlagType.COTW_SUMMONED_MOB, summonedEntity); } /** 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..9891380e1 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/util/TransientMetadataTools.java @@ -0,0 +1,37 @@ +package com.gmail.nossr50.util; + +import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.util.compat.layers.persistentdata.SpigotPersistentDataLayer_1_13; +import org.bukkit.entity.LivingEntity; + +public class TransientMetadataTools { + private final mcMMO pluginRef; + + public TransientMetadataTools(mcMMO pluginRef) { + this.pluginRef = pluginRef; + } + + public void cleanAllMobMetadata(LivingEntity livingEntity) { + //Since its not written anywhere, apparently the GC won't touch objects with metadata still present on them + if (livingEntity.hasMetadata(mcMMO.customNameKey)) { + livingEntity.setCustomName(livingEntity.getMetadata(mcMMO.customNameKey).get(0).asString()); + livingEntity.removeMetadata(mcMMO.customNameKey, pluginRef); + } + + //Involved in changing mob names to hearts + if (livingEntity.hasMetadata(mcMMO.customVisibleKey)) { + livingEntity.setCustomNameVisible(livingEntity.getMetadata(mcMMO.customVisibleKey).get(0).asBoolean()); + livingEntity.removeMetadata(mcMMO.customVisibleKey, pluginRef); + } + + //Gets assigned to endermen, potentially doesn't get cleared before this point + if(livingEntity.hasMetadata(mcMMO.travelingBlock)) { + livingEntity.removeMetadata(mcMMO.travelingBlock, pluginRef); + } + + //1.13.2 uses transient mob flags and needs to be cleaned up + if(mcMMO.getCompatibilityManager().getPersistentDataLayer() instanceof SpigotPersistentDataLayer_1_13) { + mcMMO.getCompatibilityManager().getPersistentDataLayer().removeMobFlags(livingEntity); + } + } +} diff --git a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/AbstractPersistentDataLayer.java b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/AbstractPersistentDataLayer.java index a11d3df9a..498ebb8ce 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/AbstractPersistentDataLayer.java +++ b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/AbstractPersistentDataLayer.java @@ -1,32 +1,128 @@ package com.gmail.nossr50.util.compat.layers.persistentdata; +import com.gmail.nossr50.api.exceptions.IncompleteNamespacedKeyRegister; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.compat.layers.AbstractCompatibilityLayer; import org.bukkit.NamespacedKey; import org.bukkit.block.Furnace; +import org.bukkit.entity.LivingEntity; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.List; -import java.util.UUID; +import java.util.*; public abstract class AbstractPersistentDataLayer extends AbstractCompatibilityLayer { - public static final String LEGACY_ABILITY_TOOL_LORE = "mcMMO Ability Tool"; - public final NamespacedKey superAbilityBoosted; - public final String SUPER_ABILITY_BOOSTED = "super_ability_boosted"; + protected final @NotNull NamespacedKey NSK_SUPER_ABILITY_BOOSTED_ITEM; + protected final @NotNull NamespacedKey NSK_MOB_SPAWNER_MOB; + protected final @NotNull NamespacedKey NSK_EGG_MOB; + protected final @NotNull NamespacedKey NSK_NETHER_GATE_MOB; + protected final @NotNull NamespacedKey NSK_COTW_SUMMONED_MOB; + protected final @NotNull NamespacedKey NSK_PLAYER_BRED_MOB; + protected final @NotNull NamespacedKey NSK_PLAYER_TAMED_MOB; + protected final @NotNull NamespacedKey NSK_VILLAGER_TRADE_ORIGIN_ITEM; + protected final @NotNull NamespacedKey NSK_EXPLOITED_ENDERMEN; + + //Never change these constants + public final @NotNull String STR_SUPER_ABILITY_BOOSTED_ITEM = "super_ability_boosted"; + public final @NotNull String STR_MOB_SPAWNER_MOB = "mcmmo_mob_spawner_mob"; + public final @NotNull String STR_EGG_MOB = "mcmmo_egg_mob"; + public final @NotNull String STR_NETHER_PORTAL_MOB = "mcmmo_nethergate_mob"; + public final @NotNull String STR_COTW_SUMMONED_MOB = "mcmmo_cotw_summoned_mob"; + public final @NotNull String STR_PLAYER_BRED_MOB = "mcmmo_player_bred_mob"; + public final @NotNull String STR_PLAYER_TAMED_MOB = "mcmmo_player_tamed_mob"; + public final @NotNull String STR_VILLAGER_TRADE_ORIGIN_ITEM = "mcmmo_villager_trade_origin_item"; + public final @NotNull String STR_EXPLOITED_ENDERMEN = "mcmmo_exploited_endermen"; + + /* + * Don't modify these keys + */ + public final @NotNull String STR_FURNACE_UUID_MOST_SIG = "furnace_uuid_most_sig"; + public final @NotNull String STR_FURNACE_UUID_LEAST_SIG = "furnace_uuid_least_sig"; + + protected final @NotNull NamespacedKey NSK_FURNACE_UUID_MOST_SIG; + protected final @NotNull NamespacedKey NSK_FURNACE_UUID_LEAST_SIG; + + public final @NotNull String LEGACY_ABILITY_TOOL_LORE = "mcMMO Ability Tool"; + + protected static final byte SIMPLE_FLAG_VALUE = (byte) 0x1; public AbstractPersistentDataLayer() { - superAbilityBoosted = getNamespacedKey(SUPER_ABILITY_BOOSTED); + NSK_SUPER_ABILITY_BOOSTED_ITEM = getNamespacedKey(STR_SUPER_ABILITY_BOOSTED_ITEM); + NSK_MOB_SPAWNER_MOB = getNamespacedKey(STR_MOB_SPAWNER_MOB); + NSK_EGG_MOB = getNamespacedKey(STR_EGG_MOB); + NSK_NETHER_GATE_MOB = getNamespacedKey(STR_NETHER_PORTAL_MOB); + NSK_COTW_SUMMONED_MOB = getNamespacedKey(STR_COTW_SUMMONED_MOB); + NSK_PLAYER_BRED_MOB = getNamespacedKey(STR_PLAYER_BRED_MOB); + NSK_PLAYER_TAMED_MOB = getNamespacedKey(STR_PLAYER_TAMED_MOB); + NSK_VILLAGER_TRADE_ORIGIN_ITEM = getNamespacedKey(STR_VILLAGER_TRADE_ORIGIN_ITEM); + NSK_EXPLOITED_ENDERMEN = getNamespacedKey(STR_EXPLOITED_ENDERMEN); + NSK_FURNACE_UUID_MOST_SIG = getNamespacedKey(STR_FURNACE_UUID_MOST_SIG); + NSK_FURNACE_UUID_LEAST_SIG = getNamespacedKey(STR_FURNACE_UUID_LEAST_SIG); + initializeLayer(); } - public @NotNull NamespacedKey getNamespacedKey(@NotNull String key) { + + /** + * Helper method to simplify generating namespaced keys + * @param key the {@link String} value of the key + * @return the generated {@link NamespacedKey} + */ + private @NotNull NamespacedKey getNamespacedKey(@NotNull String key) { return new NamespacedKey(mcMMO.p, key); } + /** + * 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 abstract boolean hasMobFlag(@NotNull MobMetaFlagType flag, @NotNull LivingEntity livingEntity); + + /** + * 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 abstract boolean hasMobFlags(@NotNull LivingEntity livingEntity); + + /** + * 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 abstract void addMobFlags(@NotNull LivingEntity sourceEntity, @NotNull LivingEntity targetEntity); + + /** + * 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 abstract void flagMetadata(@NotNull MobMetaFlagType flag, @NotNull LivingEntity livingEntity); + + /** + * Removes a specific mob flag from target {@link LivingEntity} + * @param flag desired flag to remove + * @param livingEntity the target living entity + */ + public abstract void removeMobFlag(@NotNull MobMetaFlagType flag, @NotNull LivingEntity livingEntity); + + /** + * Remove all mcMMO related mob flags from the target {@link LivingEntity} + * @param livingEntity target entity + */ + public void removeMobFlags(@NotNull LivingEntity livingEntity) { + for(MobMetaFlagType flag : MobMetaFlagType.values()) { + removeMobFlag(flag, livingEntity); + } + } + public abstract @Nullable UUID getFurnaceOwner(@NotNull Furnace furnace); public abstract void setFurnaceOwner(@NotNull Furnace furnace, @NotNull UUID uuid); @@ -39,7 +135,7 @@ public abstract class AbstractPersistentDataLayer extends AbstractCompatibilityL public abstract void removeBonusDigSpeedOnSuperAbilityTool(@NotNull ItemStack itemStack); - public boolean isLegacyAbilityTool(ItemStack itemStack) { + public boolean isLegacyAbilityTool(@NotNull ItemStack itemStack) { ItemMeta itemMeta = itemStack.getItemMeta(); if(itemMeta == null) @@ -53,7 +149,7 @@ public abstract class AbstractPersistentDataLayer extends AbstractCompatibilityL return lore.contains(LEGACY_ABILITY_TOOL_LORE); } - public static String getLegacyAbilityToolLore() { + public @NotNull String getLegacyAbilityToolLore() { return LEGACY_ABILITY_TOOL_LORE; } } diff --git a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/MobMetaFlagType.java b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/MobMetaFlagType.java new file mode 100644 index 000000000..1bf5eb2df --- /dev/null +++ b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/MobMetaFlagType.java @@ -0,0 +1,11 @@ +package com.gmail.nossr50.util.compat.layers.persistentdata; + +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/util/compat/layers/persistentdata/SpigotPersistentDataLayer_1_13.java b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer_1_13.java index 794aad916..219a2cf4b 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer_1_13.java +++ b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer_1_13.java @@ -1,9 +1,11 @@ package com.gmail.nossr50.util.compat.layers.persistentdata; +import com.gmail.nossr50.api.exceptions.IncompleteNamespacedKeyRegister; import com.gmail.nossr50.datatypes.meta.UUIDMeta; import com.gmail.nossr50.mcMMO; import org.bukkit.block.Furnace; import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.LivingEntity; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.tags.CustomItemTagContainer; @@ -11,6 +13,7 @@ import org.bukkit.inventory.meta.tags.ItemTagType; import org.bukkit.metadata.Metadatable; import org.jetbrains.annotations.NotNull; +import java.util.EnumMap; import java.util.UUID; /** @@ -18,19 +21,94 @@ import java.util.UUID; */ public class SpigotPersistentDataLayer_1_13 extends AbstractPersistentDataLayer { - private final String FURNACE_OWNER_METADATA_KEY = "mcMMO_furnace_owner"; + private final @NotNull String KEY_FURNACE_OWNER = "mcMMO_furnace_owner"; + private final @NotNull EnumMap mobFlagKeyMap; + + public SpigotPersistentDataLayer_1_13() { + mobFlagKeyMap = new EnumMap<>(MobMetaFlagType.class); + initMobFlagKeyMap(); + } @Override public boolean initializeLayer() { return true; } + private void initMobFlagKeyMap() throws IncompleteNamespacedKeyRegister { + for(MobMetaFlagType flagType : MobMetaFlagType.values()) { + switch(flagType) { + case MOB_SPAWNER_MOB: + mobFlagKeyMap.put(flagType, STR_MOB_SPAWNER_MOB); + break; + case EGG_MOB: + mobFlagKeyMap.put(flagType, STR_EGG_MOB); + break; + case NETHER_PORTAL_MOB: + mobFlagKeyMap.put(flagType, STR_NETHER_PORTAL_MOB); + break; + case COTW_SUMMONED_MOB: + mobFlagKeyMap.put(flagType, STR_COTW_SUMMONED_MOB); + break; + case PLAYER_BRED_MOB: + mobFlagKeyMap.put(flagType, STR_PLAYER_BRED_MOB); + break; + case PLAYER_TAMED_MOB: + mobFlagKeyMap.put(flagType, STR_PLAYER_TAMED_MOB); + break; + case EXPLOITED_ENDERMEN: + mobFlagKeyMap.put(flagType, STR_EXPLOITED_ENDERMEN); + break; + default: + throw new IncompleteNamespacedKeyRegister("Missing flag register for: "+flagType.toString()); + } + } + } + + @Override + public boolean hasMobFlag(@NotNull MobMetaFlagType flag, @NotNull LivingEntity livingEntity) { + return livingEntity.hasMetadata(mobFlagKeyMap.get(flag)); + } + + @Override + public boolean hasMobFlags(@NotNull LivingEntity livingEntity) { + for(String currentKey : mobFlagKeyMap.values()) { + if(livingEntity.hasMetadata(currentKey)) { + return true; + } + } + + return false; + } + + @Override + public void addMobFlags(@NotNull LivingEntity sourceEntity, @NotNull LivingEntity targetEntity) { + for(MobMetaFlagType flag : MobMetaFlagType.values()) { + if(hasMobFlag(flag, sourceEntity)) { + flagMetadata(flag, targetEntity); + } + } + } + + @Override + public void flagMetadata(@NotNull MobMetaFlagType flag, @NotNull LivingEntity livingEntity) { + if(!hasMobFlag(flag, livingEntity)) { + livingEntity.setMetadata(mobFlagKeyMap.get(flag), mcMMO.metadataValue); + } + } + + @Override + public void removeMobFlag(@NotNull MobMetaFlagType flag, @NotNull LivingEntity livingEntity) { + if(hasMobFlag(flag, livingEntity)) { + livingEntity.removeMetadata(mobFlagKeyMap.get(flag), mcMMO.p); + } + } + @Override public UUID getFurnaceOwner(@NotNull Furnace furnace) { Metadatable metadatable = (Metadatable) furnace; - if(metadatable.getMetadata(FURNACE_OWNER_METADATA_KEY).size() > 0) { - UUIDMeta uuidMeta = (UUIDMeta) metadatable.getMetadata(FURNACE_OWNER_METADATA_KEY).get(0); + if(metadatable.getMetadata(KEY_FURNACE_OWNER).size() > 0) { + UUIDMeta uuidMeta = (UUIDMeta) metadatable.getMetadata(KEY_FURNACE_OWNER).get(0); return (UUID) uuidMeta.value(); } else { return null; @@ -41,11 +119,11 @@ public class SpigotPersistentDataLayer_1_13 extends AbstractPersistentDataLayer public void setFurnaceOwner(@NotNull Furnace furnace, @NotNull UUID uuid) { Metadatable metadatable = (Metadatable) furnace; - if(metadatable.getMetadata(FURNACE_OWNER_METADATA_KEY).size() > 0) { - metadatable.removeMetadata(FURNACE_OWNER_METADATA_KEY, mcMMO.p); + if(metadatable.getMetadata(KEY_FURNACE_OWNER).size() > 0) { + metadatable.removeMetadata(KEY_FURNACE_OWNER, mcMMO.p); } - metadatable.setMetadata(FURNACE_OWNER_METADATA_KEY, new UUIDMeta(mcMMO.p, uuid)); + metadatable.setMetadata(KEY_FURNACE_OWNER, new UUIDMeta(mcMMO.p, uuid)); } @Override @@ -57,7 +135,7 @@ public class SpigotPersistentDataLayer_1_13 extends AbstractPersistentDataLayer return; } - itemMeta.getCustomTagContainer().setCustomTag(superAbilityBoosted, ItemTagType.INTEGER, originalDigSpeed); + itemMeta.getCustomTagContainer().setCustomTag(NSK_SUPER_ABILITY_BOOSTED_ITEM, ItemTagType.INTEGER, originalDigSpeed); itemStack.setItemMeta(itemMeta); } @@ -69,7 +147,7 @@ public class SpigotPersistentDataLayer_1_13 extends AbstractPersistentDataLayer return false; CustomItemTagContainer tagContainer = itemMeta.getCustomTagContainer(); - return tagContainer.hasCustomTag(superAbilityBoosted, ItemTagType.INTEGER); + return tagContainer.hasCustomTag(NSK_SUPER_ABILITY_BOOSTED_ITEM, ItemTagType.INTEGER); } @Override @@ -81,8 +159,8 @@ public class SpigotPersistentDataLayer_1_13 extends AbstractPersistentDataLayer CustomItemTagContainer tagContainer = itemMeta.getCustomTagContainer(); - if(tagContainer.hasCustomTag(superAbilityBoosted , ItemTagType.INTEGER)) { - return tagContainer.getCustomTag(superAbilityBoosted, ItemTagType.INTEGER); + if(tagContainer.hasCustomTag(NSK_SUPER_ABILITY_BOOSTED_ITEM, ItemTagType.INTEGER)) { + return tagContainer.getCustomTag(NSK_SUPER_ABILITY_BOOSTED_ITEM, ItemTagType.INTEGER); } else { return 0; } diff --git a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer_1_14.java b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer_1_14.java index f7e8401df..858d45677 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer_1_14.java +++ b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer_1_14.java @@ -1,9 +1,11 @@ package com.gmail.nossr50.util.compat.layers.persistentdata; +import com.gmail.nossr50.api.exceptions.IncompleteNamespacedKeyRegister; import com.gmail.nossr50.mcMMO; import org.bukkit.NamespacedKey; import org.bukkit.block.Furnace; import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.LivingEntity; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.persistence.PersistentDataContainer; @@ -12,28 +14,96 @@ import org.bukkit.persistence.PersistentDataType; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.EnumMap; import java.util.UUID; public class SpigotPersistentDataLayer_1_14 extends AbstractPersistentDataLayer { - /* - * Don't modify these keys - */ - public static final String FURNACE_UUID_MOST_SIG = "furnace_uuid_most_sig"; - public static final String FURNACE_UUID_LEAST_SIG = "furnace_uuid_least_sig"; + private final @NotNull EnumMap mobFlagKeyMap; - private NamespacedKey furnaceOwner_MostSig_Key; - private NamespacedKey furnaceOwner_LeastSig_Key; + public SpigotPersistentDataLayer_1_14() { + mobFlagKeyMap = new EnumMap<>(MobMetaFlagType.class); + initMobFlagKeyMap(); + } @Override public boolean initializeLayer() { - initNamespacedKeys(); return true; } - private void initNamespacedKeys() { - furnaceOwner_MostSig_Key = getNamespacedKey(FURNACE_UUID_MOST_SIG); - furnaceOwner_LeastSig_Key = getNamespacedKey(FURNACE_UUID_LEAST_SIG); + /** + * Registers the namespaced keys required by the API (CB/Spigot) + */ + private void initMobFlagKeyMap() throws IncompleteNamespacedKeyRegister { + for(MobMetaFlagType mobMetaFlagType : MobMetaFlagType.values()) { + switch(mobMetaFlagType) { + + case MOB_SPAWNER_MOB: + mobFlagKeyMap.put(mobMetaFlagType, NSK_MOB_SPAWNER_MOB); + break; + case EGG_MOB: + mobFlagKeyMap.put(mobMetaFlagType, NSK_EGG_MOB); + break; + case NETHER_PORTAL_MOB: + mobFlagKeyMap.put(mobMetaFlagType, NSK_NETHER_GATE_MOB); + break; + case COTW_SUMMONED_MOB: + mobFlagKeyMap.put(mobMetaFlagType, NSK_COTW_SUMMONED_MOB); + break; + case PLAYER_BRED_MOB: + mobFlagKeyMap.put(mobMetaFlagType, NSK_PLAYER_BRED_MOB); + break; + case EXPLOITED_ENDERMEN: + mobFlagKeyMap.put(mobMetaFlagType, NSK_EXPLOITED_ENDERMEN); + break; + case PLAYER_TAMED_MOB: + mobFlagKeyMap.put(mobMetaFlagType, NSK_PLAYER_TAMED_MOB); + break; + default: + throw new IncompleteNamespacedKeyRegister("missing namespaced key register for type: "+ mobMetaFlagType.toString()); + } + } + } + + @Override + public boolean hasMobFlag(@NotNull MobMetaFlagType flag, @NotNull LivingEntity livingEntity) { + return livingEntity.getPersistentDataContainer().has(mobFlagKeyMap.get(flag), PersistentDataType.SHORT); + } + + @Override + public boolean hasMobFlags(@NotNull LivingEntity livingEntity) { + for(NamespacedKey currentKey : mobFlagKeyMap.values()) { + if(livingEntity.getPersistentDataContainer().has(currentKey, PersistentDataType.BYTE)) { + return true; + } + } + + return false; + } + + @Override + public void addMobFlags(@NotNull LivingEntity sourceEntity, @NotNull LivingEntity targetEntity) { + for(MobMetaFlagType flag : MobMetaFlagType.values()) { + if(hasMobFlag(flag, sourceEntity)) { + flagMetadata(flag, targetEntity); + } + } + } + + @Override + public void flagMetadata(@NotNull MobMetaFlagType flag, @NotNull LivingEntity livingEntity) { + if(!hasMobFlag(flag, livingEntity)) { + PersistentDataContainer persistentDataContainer = livingEntity.getPersistentDataContainer(); + persistentDataContainer.set(mobFlagKeyMap.get(flag), PersistentDataType.BYTE, SIMPLE_FLAG_VALUE); + } + } + + @Override + public void removeMobFlag(@NotNull MobMetaFlagType flag, @NotNull LivingEntity livingEntity) { + if(hasMobFlag(flag, livingEntity)) { + PersistentDataContainer persistentDataContainer = livingEntity.getPersistentDataContainer(); + persistentDataContainer.remove(mobFlagKeyMap.get(flag)); + } } @Override @@ -42,8 +112,8 @@ public class SpigotPersistentDataLayer_1_14 extends AbstractPersistentDataLayer PersistentDataContainer dataContainer = ((PersistentDataHolder) furnace).getPersistentDataContainer(); //Too lazy to make a custom data type for this stuff - Long mostSigBits = dataContainer.get(furnaceOwner_MostSig_Key, PersistentDataType.LONG); - Long leastSigBits = dataContainer.get(furnaceOwner_LeastSig_Key, PersistentDataType.LONG); + 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); @@ -56,8 +126,8 @@ public class SpigotPersistentDataLayer_1_14 extends AbstractPersistentDataLayer public void setFurnaceOwner(@NotNull Furnace furnace, @NotNull UUID uuid) { PersistentDataContainer dataContainer = ((PersistentDataHolder) furnace).getPersistentDataContainer(); - dataContainer.set(furnaceOwner_MostSig_Key, PersistentDataType.LONG, uuid.getMostSignificantBits()); - dataContainer.set(furnaceOwner_LeastSig_Key, PersistentDataType.LONG, uuid.getLeastSignificantBits()); + dataContainer.set(NSK_FURNACE_UUID_MOST_SIG, PersistentDataType.LONG, uuid.getMostSignificantBits()); + dataContainer.set(NSK_FURNACE_UUID_LEAST_SIG, PersistentDataType.LONG, uuid.getLeastSignificantBits()); furnace.update(); } @@ -72,7 +142,7 @@ public class SpigotPersistentDataLayer_1_14 extends AbstractPersistentDataLayer ItemMeta itemMeta = itemStack.getItemMeta(); PersistentDataContainer dataContainer = itemMeta.getPersistentDataContainer(); - dataContainer.set(superAbilityBoosted, PersistentDataType.INTEGER, originalDigSpeed); + dataContainer.set(NSK_SUPER_ABILITY_BOOSTED_ITEM, PersistentDataType.INTEGER, originalDigSpeed); itemStack.setItemMeta(itemMeta); } @@ -87,7 +157,7 @@ public class SpigotPersistentDataLayer_1_14 extends AbstractPersistentDataLayer PersistentDataContainer dataContainer = itemMeta.getPersistentDataContainer(); //If this value isn't null, then the tool can be considered dig speed boosted - Integer boostValue = dataContainer.get(superAbilityBoosted, PersistentDataType.INTEGER); + Integer boostValue = dataContainer.get(NSK_SUPER_ABILITY_BOOSTED_ITEM, PersistentDataType.INTEGER); return boostValue != null; } @@ -102,12 +172,12 @@ public class SpigotPersistentDataLayer_1_14 extends AbstractPersistentDataLayer PersistentDataContainer dataContainer = itemMeta.getPersistentDataContainer(); - if(dataContainer.get(superAbilityBoosted, PersistentDataType.INTEGER) == null) { + 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(superAbilityBoosted, PersistentDataType.INTEGER); + Integer boostValue = dataContainer.get(NSK_SUPER_ABILITY_BOOSTED_ITEM, PersistentDataType.INTEGER); return Math.max(boostValue, 0); } } @@ -127,7 +197,7 @@ public class SpigotPersistentDataLayer_1_14 extends AbstractPersistentDataLayer } PersistentDataContainer dataContainer = itemMeta.getPersistentDataContainer(); - dataContainer.remove(superAbilityBoosted); //Remove persistent data + dataContainer.remove(NSK_SUPER_ABILITY_BOOSTED_ITEM); //Remove persistent data //TODO: needed? itemStack.setItemMeta(itemMeta); 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 a6cc6af19..500b6a63a 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java @@ -20,6 +20,8 @@ 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.util.*; +import com.gmail.nossr50.util.compat.layers.persistentdata.AbstractPersistentDataLayer; +import com.gmail.nossr50.util.compat.layers.persistentdata.MobMetaFlagType; import com.gmail.nossr50.util.player.NotificationManager; import com.gmail.nossr50.util.player.UserManager; import com.google.common.collect.ImmutableMap; @@ -41,8 +43,13 @@ import java.util.List; import java.util.Map; public final class CombatUtils { + private CombatUtils() {} + private static AbstractPersistentDataLayer getPersistentData() { + return mcMMO.getCompatibilityManager().getPersistentDataLayer(); + } + //Likely.. because who knows what plugins are throwing around public static boolean isDamageLikelyFromNormalCombat(DamageCause damageCause) { switch (damageCause) { @@ -106,6 +113,14 @@ public final class CombatUtils { applyScaledModifiers(initialDamage, finalDamage, event); processCombatXP(mcMMOPlayer, target, PrimarySkillType.SWORDS); + + printFinalDamageDebug(player, event, mcMMOPlayer); + } + + private static void printFinalDamageDebug(Player player, EntityDamageByEntityEvent event, McMMOPlayer mcMMOPlayer) { + if(mcMMOPlayer.isDebugMode()) { + player.sendMessage("Final Damage value after mcMMO modifiers: "+ event.getFinalDamage()); + } } // public static void strengthDebug(Player player) { @@ -181,6 +196,8 @@ public final class CombatUtils { applyScaledModifiers(initialDamage, finalDamage, event); processCombatXP(mcMMOPlayer, target, PrimarySkillType.AXES); + + printFinalDamageDebug(player, event, mcMMOPlayer); } private static void processUnarmedCombat(LivingEntity target, Player player, EntityDamageByEntityEvent event) { @@ -223,6 +240,8 @@ public final class CombatUtils { applyScaledModifiers(initialDamage, finalDamage, event); processCombatXP(mcMMOPlayer, target, PrimarySkillType.UNARMED); + + printFinalDamageDebug(player, event, mcMMOPlayer); } private static void processTamingCombat(LivingEntity target, Player master, Wolf wolf, EntityDamageByEntityEvent event) { @@ -299,6 +318,8 @@ public final class CombatUtils { applyScaledModifiers(initialDamage, finalDamage, event); processCombatXP(mcMMOPlayer, target, PrimarySkillType.ARCHERY, forceMultiplier * distanceMultiplier); + + printFinalDamageDebug(player, event, mcMMOPlayer); } /** @@ -372,6 +393,7 @@ public final class CombatUtils { if (PrimarySkillType.SWORDS.getPermissions(player)) { processSwordCombat(target, player, event); + } } else if (ItemUtils.isAxe(heldItem)) { @@ -428,6 +450,7 @@ public final class CombatUtils { } } } + } /** @@ -547,21 +570,21 @@ public final class CombatUtils { 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 @@ -576,8 +599,11 @@ public final class CombatUtils { return; } - if(canDamage(attacker, target, cause, damage)) + if(canDamage(attacker, target, cause, damage)) { + applyIgnoreDamageMetadata(target); target.damage(damage); + removeIgnoreDamageMetadata(target); + } } private static boolean processingNoInvulnDamage; @@ -596,21 +622,33 @@ 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 removeIgnoreDamageMetadata(LivingEntity target) { + target.removeMetadata(mcMMO.CUSTOM_DAMAGE_METAKEY, mcMMO.p); + } + + public static void applyIgnoreDamageMetadata(LivingEntity target) { + target.setMetadata(mcMMO.CUSTOM_DAMAGE_METAKEY, mcMMO.metadataValue); + } + + public static boolean hasIgnoreDamageMetadata(LivingEntity target) { + return target.getMetadata(mcMMO.CUSTOM_DAMAGE_METAKEY).size() != 0; + } + public static void dealNoInvulnerabilityTickDamageRupture(LivingEntity target, double damage, Entity attacker, int toolTier) { if (target.isDead()) { return; @@ -767,19 +805,20 @@ public final class CombatUtils { } } - if (target.hasMetadata(mcMMO.entityMetadataKey) - //Epic Spawners compatibility - || target.hasMetadata("ES")) { + if(getPersistentData().hasMobFlag(MobMetaFlagType.COTW_SUMMONED_MOB, target)) { + baseXP = 0; + } else if(getPersistentData().hasMobFlag(MobMetaFlagType.MOB_SPAWNER_MOB, target) || target.hasMetadata("ES")) { baseXP *= ExperienceConfig.getInstance().getSpawnedMobXpMultiplier(); - } - - if (target.hasMetadata(mcMMO.bredMetadataKey)) { + } else if(getPersistentData().hasMobFlag(MobMetaFlagType.NETHER_PORTAL_MOB, target)) { + baseXP *= ExperienceConfig.getInstance().getNetherPortalXpMultiplier(); + } else if(getPersistentData().hasMobFlag(MobMetaFlagType.EGG_MOB, target)) { + baseXP *= ExperienceConfig.getInstance().getEggXpMultiplier(); + } else if (getPersistentData().hasMobFlag(MobMetaFlagType.PLAYER_BRED_MOB, target)) { baseXP *= ExperienceConfig.getInstance().getBredMobXpMultiplier(); } - xpGainReason = XPGainReason.PVE; - baseXP *= 10; + xpGainReason = XPGainReason.PVE; } baseXP *= multiplier; diff --git a/src/main/resources/experience.yml b/src/main/resources/experience.yml index f8ed15f62..b7b14b2c1 100644 --- a/src/main/resources/experience.yml +++ b/src/main/resources/experience.yml @@ -139,8 +139,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 From f5294387b0825cbf8a46a3e4998fbfa4497c1c44 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 8 Oct 2020 16:34:59 -0700 Subject: [PATCH 163/662] oopsy --- Changelog.txt | 1 + .../layers/persistentdata/SpigotPersistentDataLayer_1_14.java | 4 ++-- src/main/resources/experience.yml | 3 +-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index a62c70960..4fcc41574 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -17,6 +17,7 @@ Version 2.1.148 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 NOTES: diff --git a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer_1_14.java b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer_1_14.java index 858d45677..9dd420890 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer_1_14.java +++ b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer_1_14.java @@ -2,6 +2,7 @@ package com.gmail.nossr50.util.compat.layers.persistentdata; import com.gmail.nossr50.api.exceptions.IncompleteNamespacedKeyRegister; import com.gmail.nossr50.mcMMO; +import org.bukkit.Bukkit; import org.bukkit.NamespacedKey; import org.bukkit.block.Furnace; import org.bukkit.enchantments.Enchantment; @@ -37,7 +38,6 @@ public class SpigotPersistentDataLayer_1_14 extends AbstractPersistentDataLayer private void initMobFlagKeyMap() throws IncompleteNamespacedKeyRegister { for(MobMetaFlagType mobMetaFlagType : MobMetaFlagType.values()) { switch(mobMetaFlagType) { - case MOB_SPAWNER_MOB: mobFlagKeyMap.put(mobMetaFlagType, NSK_MOB_SPAWNER_MOB); break; @@ -67,7 +67,7 @@ public class SpigotPersistentDataLayer_1_14 extends AbstractPersistentDataLayer @Override public boolean hasMobFlag(@NotNull MobMetaFlagType flag, @NotNull LivingEntity livingEntity) { - return livingEntity.getPersistentDataContainer().has(mobFlagKeyMap.get(flag), PersistentDataType.SHORT); + return livingEntity.getPersistentDataContainer().has(mobFlagKeyMap.get(flag), PersistentDataType.BYTE); } @Override diff --git a/src/main/resources/experience.yml b/src/main/resources/experience.yml index b7b14b2c1..fd0644d93 100644 --- a/src/main/resources/experience.yml +++ b/src/main/resources/experience.yml @@ -552,5 +552,4 @@ Experience_Values: Zombie_Pigman: 3.0 Zombified_Piglin: 3.0 Strider: 1.2 - Zoglin: 2.5 - + Zoglin: 2.5 \ No newline at end of file From 80c89fe1e525c24f15dd8f097e932396f6fa165e Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 8 Oct 2020 19:07:42 -0700 Subject: [PATCH 164/662] Revert this change for now --- Changelog.txt | 1 - .../nossr50/listeners/EntityListener.java | 93 ++++++++++++++----- 2 files changed, 69 insertions(+), 25 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 4fcc41574..f8a82984b 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -19,7 +19,6 @@ Version 2.1.148 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 - 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. diff --git a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java index 919a6d14f..a13c755ff 100644 --- a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java @@ -197,37 +197,82 @@ public class EntityListener implements Listener { Entity entity = event.getEntity(); if (entity instanceof FallingBlock || entity instanceof Enderman) { - trackMovingBlocks(block, entity); //ignore the IDE warning - //Apparently redstone ore will throw these events - } else if ((block.getType() != Material.REDSTONE_ORE)) { + boolean isTracked = entity.hasMetadata(mcMMO.travelingBlock); + + if (mcMMO.getPlaceStore().isTrue(block) && !isTracked) { + mcMMO.getPlaceStore().setFalse(block); + + entity.setMetadata(mcMMO.travelingBlock, mcMMO.metadataValue); + } + else if (isTracked) { + mcMMO.getPlaceStore().setTrue(block); + } + } else if ((block.getType() == Material.REDSTONE_ORE)) { + } + else { if (mcMMO.getPlaceStore().isTrue(block)) { mcMMO.getPlaceStore().setFalse(block); } } } - /** - * This is a complex hack to track blocks for this event - * This event is called when a block starts its movement, or ends its movement - * It can start the movement through physics (falling blocks) or through being picked up (endermen) - * Since this event can be cancelled, its even weirder to track this stuff - * @param block this will either be the block that was originally picked up, or the block in its final destination - * @param movementSourceEntity this will either be an Endermen or a Falling Block - */ - private void trackMovingBlocks(@NotNull Block block, @NotNull Entity movementSourceEntity) { +// /** +// * Monitor EntityChangeBlock events. +// * +// * @param event +// * The event to watch +// */ +// @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) +// public void onEntityChangeBlock(EntityChangeBlockEvent event) { +// /* WORLD BLACKLIST CHECK */ +// if(WorldBlacklist.isWorldBlacklisted(event.getEntity().getWorld())) +// return; +// +// Block block = event.getBlock(); +// +// // When the event is fired for the falling block that changes back to a +// // normal block +// // event.getBlock().getType() returns AIR +// if (!BlockUtils.shouldBeWatched(block.getState()) +// && block.getState().getType() != Material.WATER +// && block.getType() != Material.AIR) { +// return; +// } +// +// Entity entity = event.getEntity(); +// +// if (entity instanceof FallingBlock || entity instanceof Enderman) { +// trackMovingBlocks(block, entity); //ignore the IDE warning +// //Apparently redstone ore will throw these events +// } else if ((block.getType() != Material.REDSTONE_ORE)) { +// if (mcMMO.getPlaceStore().isTrue(block)) { +// mcMMO.getPlaceStore().setFalse(block); +// } +// } +// } - //A block that has reached its destination, either being placed by endermen or having finished its fall - if(movementSourceEntity.hasMetadata(mcMMO.travelingBlock)) { - mcMMO.getPlaceStore().setTrue(block); - movementSourceEntity.removeMetadata(mcMMO.travelingBlock, pluginRef); - } else { - //A block that is starting movement (from either Endermen or Falling/Physics) - if(mcMMO.getPlaceStore().isTrue(block)) { - mcMMO.getPlaceStore().setFalse(block); - movementSourceEntity.setMetadata(mcMMO.blockMetadataKey, mcMMO.metadataValue); - } - } - } +// /** +// * This is a complex hack to track blocks for this event +// * This event is called when a block starts its movement, or ends its movement +// * It can start the movement through physics (falling blocks) or through being picked up (endermen) +// * Since this event can be cancelled, its even weirder to track this stuff +// * @param block this will either be the block that was originally picked up, or the block in its final destination +// * @param movementSourceEntity this will either be an Endermen or a Falling Block +// */ +// private void trackMovingBlocks(@NotNull Block block, @NotNull Entity movementSourceEntity) { +// +// //A block that has reached its destination, either being placed by endermen or having finished its fall +// if(movementSourceEntity.hasMetadata(mcMMO.travelingBlock)) { +// mcMMO.getPlaceStore().setTrue(block); +// movementSourceEntity.removeMetadata(mcMMO.travelingBlock, pluginRef); +// } else { +// //A block that is starting movement (from either Endermen or Falling/Physics) +// if(mcMMO.getPlaceStore().isTrue(block)) { +// mcMMO.getPlaceStore().setFalse(block); +// movementSourceEntity.setMetadata(mcMMO.blockMetadataKey, mcMMO.metadataValue); +// } +// } +// } @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) public void onEntityCombustByEntityEvent(EntityCombustByEntityEvent event) { From d4699c0e2026cd82b63ab851be5760e56009e68c Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 8 Oct 2020 19:14:44 -0700 Subject: [PATCH 165/662] Add player tamed experience multiplier --- Changelog.txt | 2 ++ .../com/gmail/nossr50/config/experience/ExperienceConfig.java | 1 + src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java | 2 ++ 3 files changed, 5 insertions(+) diff --git a/Changelog.txt b/Changelog.txt index f8a82984b..b2103cc8a 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -4,6 +4,7 @@ Version 2.1.148 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 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) @@ -18,6 +19,7 @@ Version 2.1.148 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. 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 c009a4cc4..b094d0176 100644 --- a/src/main/java/com/gmail/nossr50/config/experience/ExperienceConfig.java +++ b/src/main/java/com/gmail/nossr50/config/experience/ExperienceConfig.java @@ -176,6 +176,7 @@ public class ExperienceConfig extends AutoUpdateConfigLoader { /* Spawned Mob modifier */ 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); } 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 500b6a63a..4413b1360 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java @@ -815,6 +815,8 @@ public final class CombatUtils { baseXP *= ExperienceConfig.getInstance().getEggXpMultiplier(); } else if (getPersistentData().hasMobFlag(MobMetaFlagType.PLAYER_BRED_MOB, target)) { baseXP *= ExperienceConfig.getInstance().getBredMobXpMultiplier(); + } else if(getPersistentData().hasMobFlag(MobMetaFlagType.PLAYER_TAMED_MOB, target)) { + baseXP *= ExperienceConfig.getInstance().getTamedMobXpMultiplier(); } baseXP *= 10; From 80f910fc6782483c075454616116f7e0fa35ef8a Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 8 Oct 2020 19:21:39 -0700 Subject: [PATCH 166/662] Add setting for enable/disable triple drops on super breaker --- Changelog.txt | 1 + .../gmail/nossr50/config/AdvancedConfig.java | 163 +----------------- .../nossr50/skills/mining/MiningManager.java | 3 +- src/main/resources/advanced.yml | 2 + 4 files changed, 7 insertions(+), 162 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index b2103cc8a..6f857480a 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -5,6 +5,7 @@ Version 2.1.148 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) diff --git a/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java b/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java index e51edeaad..59803f29c 100644 --- a/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java +++ b/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java @@ -275,62 +275,6 @@ public class AdvancedConfig extends AutoUpdateConfigLoader { reason.add("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!"); @@ -348,83 +292,6 @@ public class AdvancedConfig extends AutoUpdateConfigLoader { reason.add("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!"); @@ -438,38 +305,10 @@ public class AdvancedConfig extends AutoUpdateConfigLoader { reason.add("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!"); } - /*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!"); @@ -897,6 +736,7 @@ public class AdvancedConfig extends AutoUpdateConfigLoader { /* MINING */ 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); } @@ -904,6 +744,7 @@ public class AdvancedConfig extends AutoUpdateConfigLoader { 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); } 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 329335af5..116093980 100644 --- a/src/main/java/com/gmail/nossr50/skills/mining/MiningManager.java +++ b/src/main/java/com/gmail/nossr50/skills/mining/MiningManager.java @@ -95,7 +95,8 @@ public class MiningManager extends SkillManager { //TODO: Make this readable if (RandomChanceUtil.checkRandomChanceExecutionSuccess(getPlayer(), SubSkillType.MINING_DOUBLE_DROPS, true)) { - BlockUtils.markDropsAsBonus(blockState, mcMMOPlayer.getAbilityMode(skill.getAbility())); + boolean useTriple = mcMMOPlayer.getAbilityMode(skill.getAbility()) && AdvancedConfig.getInstance().getAllowMiningTripleDrops(); + BlockUtils.markDropsAsBonus(blockState, useTriple); } } diff --git a/src/main/resources/advanced.yml b/src/main/resources/advanced.yml index c733d324b..8951d37ac 100644 --- a/src/main/resources/advanced.yml +++ b/src/main/resources/advanced.yml @@ -275,6 +275,8 @@ Skills: # Settings for Mining ### Mining: + SuperBreaker: + AllowTripleDrops: true DoubleDrops: SilkTouch: true # ChanceMax: Maximum chance of receiving double drops when on or higher From 916eb7655389163ace17f7978fef5568e05bce9b Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 8 Oct 2020 19:30:36 -0700 Subject: [PATCH 167/662] 2.1.148 --- Changelog.txt | 7 ++++--- pom.xml | 2 +- src/main/java/com/gmail/nossr50/config/AdvancedConfig.java | 1 - 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 6f857480a..2af936383 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,6 +1,6 @@ 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) + 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 @@ -10,7 +10,7 @@ Version 2.1.148 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 with certain weapons + 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 @@ -25,7 +25,8 @@ Version 2.1.148 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. + 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 diff --git a/pom.xml b/pom.xml index 477615059..bc07c3d11 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.148-SNAPSHOT + 2.1.148 mcMMO https://github.com/mcMMO-Dev/mcMMO diff --git a/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java b/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java index 59803f29c..56c63c141 100644 --- a/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java +++ b/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java @@ -744,7 +744,6 @@ public class AdvancedConfig extends AutoUpdateConfigLoader { 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); } From 29722511b779cd4448d7b97205aad3f15aea6c71 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 12 Oct 2020 12:40:54 -0700 Subject: [PATCH 168/662] new config persistentdata.yml --- Changelog.txt | 10 +++++ pom.xml | 2 +- .../nossr50/config/PersistentDataConfig.java | 37 +++++++++++++++++++ .../SpigotPersistentDataLayer_1_14.java | 2 + src/main/resources/persistentdata.yml | 29 +++++++++++++++ 5 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/gmail/nossr50/config/PersistentDataConfig.java create mode 100644 src/main/resources/persistentdata.yml diff --git a/Changelog.txt b/Changelog.txt index 2af936383..f5f942c67 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,13 @@ +Version 2.1.149 + Added new config file 'persistentdata.yml' + Almost all persistent mob data is now off by default and needs to be turned on in persistentdata.yml (new config file) for performance concerns + + NOTES: + There are some performance issues with how mcMMO saves NBT when you start adding NBT to mobs, because of this I have decided that persistent data is opt-in. + Not every server will suffer from these issues, most probably will not, I am making it opt-in so only those aware of the performance risk will be using this feature. + Persistent data on mobs is 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. + 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) diff --git a/pom.xml b/pom.xml index bc07c3d11..fed15ea34 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.148 + 2.1.149-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO 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..37de7605e --- /dev/null +++ b/src/main/java/com/gmail/nossr50/config/PersistentDataConfig.java @@ -0,0 +1,37 @@ +package com.gmail.nossr50.config; + +import com.gmail.nossr50.util.compat.layers.persistentdata.MobMetaFlagType; + +public class PersistentDataConfig extends AutoUpdateConfigLoader { + private static PersistentDataConfig instance; + + private PersistentDataConfig() { + super("persistentdata.yml"); + validate(); + } + + public static PersistentDataConfig getInstance() { + if (instance == null) { + instance = new PersistentDataConfig(); + } + + return instance; + } + + @Override + protected void loadKeys() { + //Sigh this old config system... + } + + @Override + protected boolean validateKeys() { + return true; + } + + //Persistent Data Toggles + + public boolean isMobPersistent(MobMetaFlagType mobMetaFlagType) { + String key = "Persistent_Data.Mobs.Flags." + mobMetaFlagType.toString() + ".Saved_To_Disk"; + return config.getBoolean(key, false); + } +} \ No newline at end of file diff --git a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer_1_14.java b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer_1_14.java index 9dd420890..00fd303cc 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer_1_14.java +++ b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer_1_14.java @@ -21,10 +21,12 @@ import java.util.UUID; public class SpigotPersistentDataLayer_1_14 extends AbstractPersistentDataLayer { private final @NotNull EnumMap mobFlagKeyMap; + private final @NotNull SpigotPersistentDataLayer_1_13 transientLayer; public SpigotPersistentDataLayer_1_14() { mobFlagKeyMap = new EnumMap<>(MobMetaFlagType.class); initMobFlagKeyMap(); + transientLayer = new SpigotPersistentDataLayer_1_13(); //For disabled persistent types } @Override diff --git a/src/main/resources/persistentdata.yml b/src/main/resources/persistentdata.yml new file mode 100644 index 000000000..6a37871c1 --- /dev/null +++ b/src/main/resources/persistentdata.yml @@ -0,0 +1,29 @@ +# 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. +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 \ No newline at end of file From bc71f586d79e4367b0f57b4b7ec64c895e2e4d51 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 12 Oct 2020 12:50:18 -0700 Subject: [PATCH 169/662] Messy fix for now, code cleanup will happen later --- Changelog.txt | 5 ++- .../nossr50/config/PersistentDataConfig.java | 4 +-- .../SpigotPersistentDataLayer_1_14.java | 31 +++++++++++++------ ...persistentdata.yml => persistent_data.yml} | 3 ++ 4 files changed, 31 insertions(+), 12 deletions(-) rename src/main/resources/{persistentdata.yml => persistent_data.yml} (82%) diff --git a/Changelog.txt b/Changelog.txt index f5f942c67..6903c01aa 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,5 +1,5 @@ Version 2.1.149 - Added new config file 'persistentdata.yml' + Added new config file 'persistent_data.yml' Almost all persistent mob data is now off by default and needs to be turned on in persistentdata.yml (new config file) for performance concerns NOTES: @@ -8,6 +8,9 @@ Version 2.1.149 Persistent data on mobs is 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. + 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) diff --git a/src/main/java/com/gmail/nossr50/config/PersistentDataConfig.java b/src/main/java/com/gmail/nossr50/config/PersistentDataConfig.java index 37de7605e..10a7adcfc 100644 --- a/src/main/java/com/gmail/nossr50/config/PersistentDataConfig.java +++ b/src/main/java/com/gmail/nossr50/config/PersistentDataConfig.java @@ -6,7 +6,7 @@ public class PersistentDataConfig extends AutoUpdateConfigLoader { private static PersistentDataConfig instance; private PersistentDataConfig() { - super("persistentdata.yml"); + super("persistent_data.yml"); validate(); } @@ -29,9 +29,9 @@ public class PersistentDataConfig extends AutoUpdateConfigLoader { } //Persistent Data Toggles - public boolean isMobPersistent(MobMetaFlagType mobMetaFlagType) { String key = "Persistent_Data.Mobs.Flags." + mobMetaFlagType.toString() + ".Saved_To_Disk"; return config.getBoolean(key, false); } + } \ No newline at end of file diff --git a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer_1_14.java b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer_1_14.java index 00fd303cc..817b33036 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer_1_14.java +++ b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer_1_14.java @@ -1,6 +1,7 @@ package com.gmail.nossr50.util.compat.layers.persistentdata; import com.gmail.nossr50.api.exceptions.IncompleteNamespacedKeyRegister; +import com.gmail.nossr50.config.PersistentDataConfig; import com.gmail.nossr50.mcMMO; import org.bukkit.Bukkit; import org.bukkit.NamespacedKey; @@ -69,13 +70,17 @@ public class SpigotPersistentDataLayer_1_14 extends AbstractPersistentDataLayer @Override public boolean hasMobFlag(@NotNull MobMetaFlagType flag, @NotNull LivingEntity livingEntity) { - return livingEntity.getPersistentDataContainer().has(mobFlagKeyMap.get(flag), PersistentDataType.BYTE); + if(PersistentDataConfig.getInstance().isMobPersistent(flag)) { + return livingEntity.getPersistentDataContainer().has(mobFlagKeyMap.get(flag), PersistentDataType.BYTE); + } else { + return transientLayer.hasMobFlag(flag, livingEntity); + } } @Override public boolean hasMobFlags(@NotNull LivingEntity livingEntity) { - for(NamespacedKey currentKey : mobFlagKeyMap.values()) { - if(livingEntity.getPersistentDataContainer().has(currentKey, PersistentDataType.BYTE)) { + for(MobMetaFlagType currentFlag : MobMetaFlagType.values()) { + if(hasMobFlag(currentFlag, livingEntity)) { return true; } } @@ -94,17 +99,25 @@ public class SpigotPersistentDataLayer_1_14 extends AbstractPersistentDataLayer @Override public void flagMetadata(@NotNull MobMetaFlagType flag, @NotNull LivingEntity livingEntity) { - if(!hasMobFlag(flag, livingEntity)) { - PersistentDataContainer persistentDataContainer = livingEntity.getPersistentDataContainer(); - persistentDataContainer.set(mobFlagKeyMap.get(flag), PersistentDataType.BYTE, SIMPLE_FLAG_VALUE); + if(PersistentDataConfig.getInstance().isMobPersistent(flag)) { + if(!hasMobFlag(flag, livingEntity)) { + PersistentDataContainer persistentDataContainer = livingEntity.getPersistentDataContainer(); + persistentDataContainer.set(mobFlagKeyMap.get(flag), PersistentDataType.BYTE, SIMPLE_FLAG_VALUE); + } + } else { + transientLayer.flagMetadata(flag, livingEntity); } } @Override public void removeMobFlag(@NotNull MobMetaFlagType flag, @NotNull LivingEntity livingEntity) { - if(hasMobFlag(flag, livingEntity)) { - PersistentDataContainer persistentDataContainer = livingEntity.getPersistentDataContainer(); - persistentDataContainer.remove(mobFlagKeyMap.get(flag)); + if(PersistentDataConfig.getInstance().isMobPersistent(flag)) { + if(hasMobFlag(flag, livingEntity)) { + PersistentDataContainer persistentDataContainer = livingEntity.getPersistentDataContainer(); + persistentDataContainer.remove(mobFlagKeyMap.get(flag)); + } + } else { + transientLayer.removeMobFlag(flag, livingEntity); } } diff --git a/src/main/resources/persistentdata.yml b/src/main/resources/persistent_data.yml similarity index 82% rename from src/main/resources/persistentdata.yml rename to src/main/resources/persistent_data.yml index 6a37871c1..6b39879cd 100644 --- a/src/main/resources/persistentdata.yml +++ b/src/main/resources/persistent_data.yml @@ -2,6 +2,9 @@ # 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: From 508c256aa4f5682975493832027b04d57d7a8003 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 12 Oct 2020 12:57:15 -0700 Subject: [PATCH 170/662] 2.1.149 --- pom.xml | 2 +- .../java/com/gmail/nossr50/util/TransientMetadataTools.java | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index fed15ea34..7875fec71 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.149-SNAPSHOT + 2.1.149 mcMMO https://github.com/mcMMO-Dev/mcMMO diff --git a/src/main/java/com/gmail/nossr50/util/TransientMetadataTools.java b/src/main/java/com/gmail/nossr50/util/TransientMetadataTools.java index 9891380e1..8aacee4d5 100644 --- a/src/main/java/com/gmail/nossr50/util/TransientMetadataTools.java +++ b/src/main/java/com/gmail/nossr50/util/TransientMetadataTools.java @@ -29,9 +29,7 @@ public class TransientMetadataTools { livingEntity.removeMetadata(mcMMO.travelingBlock, pluginRef); } - //1.13.2 uses transient mob flags and needs to be cleaned up - if(mcMMO.getCompatibilityManager().getPersistentDataLayer() instanceof SpigotPersistentDataLayer_1_13) { - mcMMO.getCompatibilityManager().getPersistentDataLayer().removeMobFlags(livingEntity); - } + //Cleanup mob metadata + mcMMO.getCompatibilityManager().getPersistentDataLayer().removeMobFlags(livingEntity); } } From 72feacfdfe97f746bc9813b533b81a17250e4b00 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 12 Oct 2020 13:01:53 -0700 Subject: [PATCH 171/662] update changelog --- Changelog.txt | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 6903c01aa..711fd34cf 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,15 +1,17 @@ Version 2.1.149 Added new config file 'persistent_data.yml' - Almost all persistent mob data is now off by default and needs to be turned on in persistentdata.yml (new config file) for performance concerns + 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 mcMMO saves NBT when you start adding NBT to mobs, because of this I have decided that persistent data is opt-in. - Not every server will suffer from these issues, most probably will not, I am making it opt-in so only those aware of the performance risk will be using this feature. - Persistent data on mobs is 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. + 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 persistent data is opt-in. + Not every server will suffer from these issues, but there can be a significant cost if you turn the settings in persistent_data.yml on + I am therefor 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 is 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 From e90f8f5b82ee30bab36846a6ed6659e99b874c8d Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 12 Oct 2020 13:06:57 -0700 Subject: [PATCH 172/662] Slightly more readable changelog --- Changelog.txt | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 711fd34cf..87f5805a9 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,17 +1,23 @@ Version 2.1.149 - Added new config file 'persistent_data.yml' + 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 persistent data is opt-in. - Not every server will suffer from these issues, but there can be a significant cost if you turn the settings in persistent_data.yml on - I am therefor 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 is 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. +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. - 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. +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 therefor 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 From 8d6d0cf2543a0ca855a776c842d4dc479d2b1d56 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 13 Oct 2020 13:22:36 -0700 Subject: [PATCH 173/662] Spelling mistake in changelog --- Changelog.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index 87f5805a9..7c4339a4b 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -7,7 +7,7 @@ There are some performance issues with how Spigot/MC saves NBT when you start ad 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 therefor making many persistent options (the problematic ones involving mobs) opt-in so only those aware of the performance risk will be using the feature. +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 From f29370a1c8734558f1c1db11b4a1fab544ada7d9 Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Wed, 14 Oct 2020 21:11:15 +0200 Subject: [PATCH 174/662] Added Fake Event check (#4296) Thanks you @TheBusyBiscuit --- .../events/fake/FakeBlockBreakEvent.java | 2 +- .../events/fake/FakeBlockDamageEvent.java | 2 +- .../nossr50/events/fake/FakeBrewEvent.java | 2 +- .../fake/FakeEntityDamageByEntityEvent.java | 2 +- .../events/fake/FakeEntityDamageEvent.java | 2 +- .../events/fake/FakeEntityTameEvent.java | 2 +- .../gmail/nossr50/events/fake/FakeEvent.java | 11 +++++++++ .../events/fake/FakePlayerAnimationEvent.java | 2 +- .../events/fake/FakePlayerFishEvent.java | 2 +- .../com/gmail/nossr50/util/EventUtils.java | 24 ++++++++++++++++++- 10 files changed, 42 insertions(+), 9 deletions(-) create mode 100644 src/main/java/com/gmail/nossr50/events/fake/FakeEvent.java 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..d564ed0d0 100644 --- a/src/main/java/com/gmail/nossr50/events/fake/FakeBrewEvent.java +++ b/src/main/java/com/gmail/nossr50/events/fake/FakeBrewEvent.java @@ -4,7 +4,7 @@ import org.bukkit.block.Block; import org.bukkit.event.inventory.BrewEvent; import org.bukkit.inventory.BrewerInventory; -public class FakeBrewEvent extends BrewEvent { +public class FakeBrewEvent extends BrewEvent implements FakeEvent { public FakeBrewEvent(Block brewer, BrewerInventory contents, int fuelLevel) { super(brewer, contents, 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 3458ab5c8..47a33199d 100644 --- a/src/main/java/com/gmail/nossr50/events/fake/FakeEntityDamageByEntityEvent.java +++ b/src/main/java/com/gmail/nossr50/events/fake/FakeEntityDamageByEntityEvent.java @@ -11,7 +11,7 @@ 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) { super(damager, damagee, cause, modifiers, getFunctionModifiers(modifiers)); 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 34eab80bd..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)); 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/util/EventUtils.java b/src/main/java/com/gmail/nossr50/util/EventUtils.java index 8043e895b..d138c3c3d 100644 --- a/src/main/java/com/gmail/nossr50/util/EventUtils.java +++ b/src/main/java/com/gmail/nossr50/util/EventUtils.java @@ -44,6 +44,7 @@ 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 java.util.HashMap; @@ -52,10 +53,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(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. @@ -69,6 +90,7 @@ public class EventUtils { /** * This little method is just to make the code more readable + * * @param entity target entity * @return the associated McMMOPlayer for this entity */ From 23f836de4056f1d2e914760cf99c4786fb8a8949 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Wed, 14 Oct 2020 12:14:32 -0700 Subject: [PATCH 175/662] dev mode + changelog update --- Changelog.txt | 5 ++++- pom.xml | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 7c4339a4b..3a205efb5 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,6 @@ +Version 2.1.150 + (API) Fake events in mcMMO now implement 'FakeEvent' (thanks TheBusyBiscuit) + 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 @@ -18,7 +21,7 @@ For now it is not recommended to use persistent data without monitoring performa 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) diff --git a/pom.xml b/pom.xml index 7875fec71..350950c82 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.149 + 2.1.150-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO From 5f0c4b1dd31484081dcfcaea80d1dfb8fa8b9396 Mon Sep 17 00:00:00 2001 From: Patrick Date: Thu, 22 Oct 2020 17:55:48 -0300 Subject: [PATCH 176/662] Update locale_pt_BR.properties (#4276) add time left to use the skill again --- src/main/resources/locale/locale_pt_BR.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/locale/locale_pt_BR.properties b/src/main/resources/locale/locale_pt_BR.properties index 044af17af..b4ab4760e 100644 --- a/src/main/resources/locale/locale_pt_BR.properties +++ b/src/main/resources/locale/locale_pt_BR.properties @@ -560,7 +560,7 @@ Item.Injured.Wait=Voce foi ferido recentemente e deve esperar para usar isto. [[ 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.TooTired=[[RED]]Voce esta cansado pra usar essa habilidade. [[YELLOW]]({0}s) Skills.Cancelled=[[RED]]{0} cancelado! Stats.Header.Combat=[[GOLD]]-=SKILLS DE COMBATE=- From 7e057792f5a19cc13bccfbd2e3247905bcca3bfd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=80=A0=E6=83=B0?= Date: Fri, 23 Oct 2020 05:56:36 +0900 Subject: [PATCH 177/662] Fix locale (#4275) "1 is needed" is obvious mistranslation. --- src/main/resources/locale/locale_ja_JP.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/locale/locale_ja_JP.properties b/src/main/resources/locale/locale_ja_JP.properties index 0990ad327..7c95066b7 100644 --- a/src/main/resources/locale/locale_ja_JP.properties +++ b/src/main/resources/locale/locale_ja_JP.properties @@ -484,7 +484,7 @@ Taming.Summon.COTW.Success.WithLifespan=[[GREEN]]\uff08\u91ce\u751f\u306e\u547c\ 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.COTW.NeedMoreItems=[[GREEN]]\uff08\u91ce\u751f\u306e\u547c\u3073\u304b\u3051\uff09 [[YELLOW]]{1}[[GRAY]]\u304c[[DARK_AQUA]]{0}[[GRAY]]\u500b\u5fc5\u8981\u3067\u3059\u3002 Taming.Summon.Name.Format=[[GOLD]](COTW) [[WHITE]]{0} {1} # UNARMED @@ -1127,4 +1127,4 @@ LevelCap.PowerLevel=[[GOLD]]([[GREEN]]mcMMO[[GOLD]]) [[RED]]{0}[[YELLOW]]\u306e\ 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 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. \ No newline at end of file +Commands.Description.mmocompat=Information about mcMMO and whether or not its in compatibility mode or fully functional. From 8240cff0d517f37ce694152309858ceb790143b7 Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Fri, 23 Oct 2020 17:21:47 +0200 Subject: [PATCH 178/662] Some small optimizations (#4305) some improvements to itemmeta calls and misc changes --- pom.xml | 8 +++++ .../IncompleteNamespacedKeyRegister.java | 6 +++- .../McMMOPlayerNotFoundException.java | 3 +- .../nossr50/chat/ChatManagerFactory.java | 25 ++++++++++----- .../nossr50/listeners/EntityListener.java | 10 ++++-- .../gmail/nossr50/skills/salvage/Salvage.java | 11 +++++-- .../skills/salvage/SalvageManager.java | 31 +++++++++++-------- .../salvageables/SalvageableFactory.java | 8 ++++- .../SimpleSalvageableManager.java | 10 +++--- .../woodcutting/WoodcuttingManager.java | 12 ++++--- .../com/gmail/nossr50/util/ItemUtils.java | 4 +++ .../gmail/nossr50/util/skills/SkillUtils.java | 16 ++++++---- 12 files changed, 101 insertions(+), 43 deletions(-) diff --git a/pom.xml b/pom.xml index 350950c82..bb1c1b80e 100755 --- a/pom.xml +++ b/pom.xml @@ -228,6 +228,14 @@ com.sk89q.worldguard worldguard-core 7.0.1-SNAPSHOT + + + + + com.google.code.findbugs + jsr305 + + com.sk89q.worldguard diff --git a/src/main/java/com/gmail/nossr50/api/exceptions/IncompleteNamespacedKeyRegister.java b/src/main/java/com/gmail/nossr50/api/exceptions/IncompleteNamespacedKeyRegister.java index 92b97ca88..5bc8b5c9f 100644 --- a/src/main/java/com/gmail/nossr50/api/exceptions/IncompleteNamespacedKeyRegister.java +++ b/src/main/java/com/gmail/nossr50/api/exceptions/IncompleteNamespacedKeyRegister.java @@ -1,7 +1,11 @@ package com.gmail.nossr50.api.exceptions; +import org.jetbrains.annotations.NotNull; + public class IncompleteNamespacedKeyRegister extends RuntimeException { - public IncompleteNamespacedKeyRegister(String message) { + private static final long serialVersionUID = -6905157273569301219L; + + public IncompleteNamespacedKeyRegister(@NotNull String message) { super(message); } } 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..d2df14a70 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) { + 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/ChatManagerFactory.java b/src/main/java/com/gmail/nossr50/chat/ChatManagerFactory.java index 4146d26c7..299a3e271 100644 --- a/src/main/java/com/gmail/nossr50/chat/ChatManagerFactory.java +++ b/src/main/java/com/gmail/nossr50/chat/ChatManagerFactory.java @@ -1,15 +1,26 @@ package com.gmail.nossr50.chat; -import com.gmail.nossr50.datatypes.chat.ChatMode; -import org.bukkit.plugin.Plugin; - import java.util.HashMap; +import java.util.Map; -public class ChatManagerFactory { - private static final HashMap adminChatManagers = new HashMap<>(); - private static final HashMap partyChatManagers = new HashMap<>(); +import org.bukkit.plugin.Plugin; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; - public static ChatManager getChatManager(Plugin plugin, ChatMode mode) { +import com.gmail.nossr50.datatypes.chat.ChatMode; + +public final class ChatManagerFactory { + private static final Map adminChatManagers = new HashMap<>(); + private static final Map partyChatManagers = new HashMap<>(); + + /** + * 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 ChatManagerFactory() {} + + @Nullable + public static ChatManager getChatManager(@NotNull Plugin plugin, @NotNull ChatMode mode) { switch (mode) { case ADMIN: if (!adminChatManagers.containsKey(plugin)) { diff --git a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java index a13c755ff..c005a38fb 100644 --- a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java @@ -42,6 +42,7 @@ 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; @@ -1068,10 +1069,13 @@ public class EntityListener implements Listener { if(WorldBlacklist.isWorldBlacklisted(event.getEntity().getWorld())) return; - if(event.getPotion().getItem().getItemMeta() == null) - return; + ItemMeta meta = event.getPotion().getItem().getItemMeta(); - for (PotionEffect effect : ((PotionMeta) event.getPotion().getItem().getItemMeta()).getCustomEffects()) { + if (meta == null) { + return; + } + + for (PotionEffect effect : ((PotionMeta) meta).getCustomEffects()) { if (!effect.getType().equals(PotionEffectType.SATURATION)) { return; } 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..0e94b0589 100644 --- a/src/main/java/com/gmail/nossr50/skills/salvage/Salvage.java +++ b/src/main/java/com/gmail/nossr50/skills/salvage/Salvage.java @@ -4,7 +4,14 @@ import com.gmail.nossr50.config.AdvancedConfig; import com.gmail.nossr50.config.Config; import org.bukkit.Material; -public class Salvage { +public final class Salvage { + + /** + * 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 = Config.getInstance().getSalvageAnvilMaterial(); /*public static int salvageMaxPercentageLevel = AdvancedConfig.getInstance().getSalvageMaxPercentageLevel(); @@ -15,7 +22,7 @@ public class Salvage { public static boolean arcaneSalvageDowngrades = AdvancedConfig.getInstance().getArcaneSalvageEnchantDowngradeEnabled(); public static boolean arcaneSalvageEnchantLoss = AdvancedConfig.getInstance().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 cb4374b5a..161eaa84a 100644 --- a/src/main/java/com/gmail/nossr50/skills/salvage/SalvageManager.java +++ b/src/main/java/com/gmail/nossr50/skills/salvage/SalvageManager.java @@ -1,5 +1,18 @@ package com.gmail.nossr50.skills.salvage; +import java.util.Map; +import java.util.Map.Entry; + +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 com.gmail.nossr50.mcMMO; import com.gmail.nossr50.config.AdvancedConfig; import com.gmail.nossr50.config.Config; import com.gmail.nossr50.config.experience.ExperienceConfig; @@ -8,7 +21,6 @@ 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.SkillManager; import com.gmail.nossr50.skills.salvage.salvageables.Salvageable; import com.gmail.nossr50.util.EventUtils; @@ -22,15 +34,6 @@ 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.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.EnchantmentStorageMeta; - -import java.util.Map; -import java.util.Map.Entry; public class SalvageManager extends SkillManager { private boolean placedAnvil; @@ -65,8 +68,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; } @@ -91,7 +95,8 @@ public class SalvageManager extends SkillManager { 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"); 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/SimpleSalvageableManager.java b/src/main/java/com/gmail/nossr50/skills/salvage/salvageables/SimpleSalvageableManager.java index db886c189..0262ca768 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 @@ -1,14 +1,14 @@ package com.gmail.nossr50.skills.salvage.salvageables; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + import org.bukkit.Material; import org.bukkit.inventory.ItemStack; -import java.util.HashMap; -import java.util.List; - - public class SimpleSalvageableManager implements SalvageableManager { - private final HashMap salvageables; + private final Map salvageables; public SimpleSalvageableManager() { this(55); 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 07c47a1f3..cff867c9c 100644 --- a/src/main/java/com/gmail/nossr50/skills/woodcutting/WoodcuttingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/woodcutting/WoodcuttingManager.java @@ -25,6 +25,8 @@ 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 java.util.ArrayList; import java.util.HashSet; @@ -32,7 +34,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 @@ -207,11 +208,13 @@ public class WoodcuttingManager extends SkillManager { */ private static boolean handleDurabilityLoss(Set treeFellerBlocks, ItemStack inHand, 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) { @@ -230,7 +233,8 @@ public class WoodcuttingManager extends SkillManager { } 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())); } /** diff --git a/src/main/java/com/gmail/nossr50/util/ItemUtils.java b/src/main/java/com/gmail/nossr50/util/ItemUtils.java index 4fca5938b..4e70625e6 100644 --- a/src/main/java/com/gmail/nossr50/util/ItemUtils.java +++ b/src/main/java/com/gmail/nossr50/util/ItemUtils.java @@ -18,6 +18,10 @@ import org.jetbrains.annotations.NotNull; 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() {} /** 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 76c73d391..668f41976 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/SkillUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/SkillUtils.java @@ -35,7 +35,12 @@ import org.jetbrains.annotations.Nullable; import java.util.Iterator; -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); @@ -217,10 +222,8 @@ public class SkillUtils { if(compatLayer.isLegacyAbilityTool(itemStack)) { ItemMeta itemMeta = itemStack.getItemMeta(); - //TODO: can be optimized - if(itemMeta.hasEnchant(Enchantment.DIG_SPEED)) { - itemMeta.removeEnchant(Enchantment.DIG_SPEED); - } + // This is safe to call without prior checks. + itemMeta.removeEnchant(Enchantment.DIG_SPEED); itemStack.setItemMeta(itemMeta); ItemUtils.removeAbilityLore(itemStack); @@ -264,7 +267,8 @@ public class SkillUtils { return false; } - protected static Material getRepairAndSalvageItem(ItemStack inHand) { + @Nullable + public static Material getRepairAndSalvageItem(@NotNull ItemStack inHand) { if (ItemUtils.isDiamondTool(inHand) || ItemUtils.isDiamondArmor(inHand)) { return Material.DIAMOND; } From cf6a2e9e97c97d88b29515889b227faf9d9ff234 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 26 Oct 2020 16:04:56 -0700 Subject: [PATCH 179/662] Update all locale files to use & codes instead of [[color]] codes --- .../resources/locale/locale_cs_CZ.properties | 526 ++++---- .../resources/locale/locale_cy.properties | 394 +++--- .../resources/locale/locale_da.properties | 402 +++--- .../resources/locale/locale_de.properties | 10 +- .../resources/locale/locale_en_US.properties | 1095 ++++++++-------- .../resources/locale/locale_es.properties | 566 ++++----- .../resources/locale/locale_fi.properties | 182 +-- .../resources/locale/locale_fr.properties | 984 +++++++-------- .../resources/locale/locale_hu_HU.properties | 1090 ++++++++-------- .../resources/locale/locale_it.properties | 1078 ++++++++-------- .../resources/locale/locale_ja_JP.properties | 1078 ++++++++-------- .../resources/locale/locale_ko.properties | 896 ++++++------- .../resources/locale/locale_lt_LT.properties | 1080 ++++++++-------- .../resources/locale/locale_nl.properties | 320 ++--- .../resources/locale/locale_pl.properties | 498 ++++---- .../resources/locale/locale_pt_BR.properties | 594 ++++----- .../resources/locale/locale_ru.properties | 1116 ++++++++--------- .../resources/locale/locale_sv.properties | 146 +-- .../resources/locale/locale_th_TH.properties | 530 ++++---- .../resources/locale/locale_zh_CN.properties | 1056 ++++++++-------- .../resources/locale/locale_zh_TW.properties | 754 +++++------ 21 files changed, 7200 insertions(+), 7195 deletions(-) diff --git a/src/main/resources/locale/locale_cs_CZ.properties b/src/main/resources/locale/locale_cs_CZ.properties index ca8bda4b3..b6be2e519 100644 --- a/src/main/resources/locale/locale_cs_CZ.properties +++ b/src/main/resources/locale/locale_cs_CZ.properties @@ -1,6 +1,6 @@ -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=\u0160ance na \u00faskok: &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 @@ -8,14 +8,14 @@ Acrobatics.SubSkill.GracefulRoll.Description=Dvojt\u00e1 effectivita ne\u017e no Acrobatics.SubSkill.Dodge.Name=\u00dahyb Acrobatics.SubSkill.Dodge.Description=Sn\u00ed\u017een\u00e9 zran\u011bn\u00ed 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=\u0160ance na kotoul: &e{0} +Acrobatics.SubSkill.Roll.GraceChance=\u0160ance na \u0160\u0165astn\u00fd 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.Combat.DazeChance=\u0160ance na om\u00e1men\u00ed: &e{0} +Archery.Combat.RetrieveChance=\u0160ance z\u00edsk\u00e1n\u00ed \u0161\u00edp\u016f zp\u011bt: &e{0} +Archery.Combat.SkillshotBonus=Bonusov\u00e9 zran\u011bn\u00ed p\u0159esn\u00e9 trefy: &e{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) @@ -31,15 +31,15 @@ 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.Ability.Lower=&7**ODLOZIL JSI SVOU SEKERU** +Axes.Ability.Ready=&a**P\u0158IPRAVUJE\u0160 SI SVOJ\u00cd SEKERU!** +Axes.Combat.CritStruck=&4Byl jsi KRITICKY zasazen! +Axes.Combat.CritChance=Sance na kriticky uder: &e{0}% Axes.Combat.CriticalHit=KRITICK\u00dd Z\u00c1SAH! -Axes.Combat.GI.Proc=[[GREEN]]**\u00daDER VELKOU SILOU** +Axes.Combat.GI.Proc=&a**\u00daDER 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.Combat.SS.Length=Delka trvani Drtice lebek: &e{0}s +Axes.SubSkill.SkullSplitter.Name=&a**Drtic lebek byl AKTIVOVAN** Axes.SubSkill.SkullSplitter.Description=Ud\u011bl AoE zran\u011bn\u00ed Axes.SubSkill.CriticalStrikes.Name=Kriticky zasah Axes.SubSkill.CriticalStrikes.Description=Dvojite zraneni @@ -52,35 +52,35 @@ Axes.SubSkill.GreaterImpact.Description=Zpusobi bonusove zraneni neozbrojenym ne 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\u010d 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.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.On=&a**GIGA DRILL BREAKER BYL AKTIVOVAN** +Excavation.Skills.GigaDrillBreaker.Refresh=&aTvoje schopnost &eGiga Vrta\u010dka &abyla obnovena! +Excavation.Skills.GigaDrillBreaker.Other.Off=Ni\u010ditel hl\u00edny&a je vy\u010derp\u00e1n do &e{0} +Excavation.Skills.GigaDrillBreaker.Other.On=&a{0}&2 pou\u017eil &cGiga Vrta\u010dku! 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.Chance=\u0160ance na zah\u00e1knut\u00ed: &e{0} +Fishing.Ability.Info=Magick\u00fd lovec: &7 **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.Rank=Lovec Poklad\u016f Level: &e{0}/5 +Fishing.Ability.TH.MagicRate=\u0160ance na magick\u00e9ho lovce: &e{0} +Fishing.Ability.Shake=\u0160ance na ot\u0159es: &e{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.FD=Ryb\u00e1\u0159\u016fv apetit: &eRank {0} Fishing.SubSkill.TreasureHunter.Name=Lovec pokladu (pasivni) Fishing.SubSkill.TreasureHunter.Description=Fish up misc. objects Fishing.SubSkill.MagicHunter.Name=Magicky Lovec @@ -93,23 +93,23 @@ 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.Chance.Raining=&9 De\u0161\u0165ov\u00fd bonus Fishing.Listener=Rybareni: -Fishing.Ability.TH.MagicFound=[[GRAY]]C\u00edt\u00edte dotek magie s t\u00edmto \u00falovkem... +Fishing.Ability.TH.MagicFound=&7C\u00edt\u00edte dotek magie s t\u00edmto \u00falovkem... 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.DoubleDropChance=\u0160ance na dvojn\u00e1sobn\u00fd zisk: &e{0} +Herbalism.Ability.FD=Farm\u00e1\u0159ova dieta: &eRank {0} +Herbalism.Ability.GTe.Length=D\u00e9lka trv\u00e1n\u00ed Zelen\u00e9 planety: &e{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.Chance=\u0160ance na dovednost Zahradn\u00edk: &e{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.GTh=&a**ZAHRADNIK** +Herbalism.Ability.HylianLuck=Hylian Luck zm\u011bn\u011bn: &e{0} +Herbalism.Ability.Lower=&7**SKLONIL JSI SVOJI MOTYKU** +Herbalism.Ability.Ready=&a**PRIPRAVIL JSI SVOU MOTYKU** +Herbalism.Ability.ShroomThumb.Chance=\u0160ance na dovednost Houba\u0159: &e{0} Herbalism.Ability.ShroomThumb.Fail=**HOUBA\u0158 SELHAL** Herbalism.SubSkill.GreenTerra.Name=Green Terra (SCHOPNOST) Herbalism.SubSkill.GreenTerra.Description=\u0160\u00ed\u0159en\u00ed planety, 3x v\u00edce drop\u016f @@ -124,20 +124,20 @@ 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.HylianLuck=&aThe luck of Hyrule t\u011b doprov\u00e1z\u00ed! 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 +Herbalism.Skills.GTe.On=&a**ZELEN\u00c1 TERRA AKTIVOV\u00c1NA** +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\u017eil [[RED]Green 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\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** +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 @@ -148,22 +148,22 @@ Mining.SubSkill.BiggerBombs.Name=V\u011bt\u0161\u00ed bomby Mining.SubSkill.BiggerBombs.Description=Navysuje vzdalenost exploze TNT Mining.SubSkill.DemolitionsExpertise.Name=Odborn\u00e1 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\u00ed\u017een\u00ed \u0161kod Demoli\u010dn\u00edho experta: &e{0} +Mining.Effect.DropChance=\u0161ance na dvojn\u00e1sobn\u00fd 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.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\u010den\u00ed +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.Boom=&7**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.Radius.Increase=Navyseni radiusu vybuchu: &e+{0} +Mining.Blast.Rank=V\u00fdbu\u0161n\u00e9 t\u011b\u017een\u00ed &e Rank {0}/8 &7({1}) +Mining.Blast.Other.On=&a{0}&2 pou\u017eil &cV\u00fdbu\u0161n\u00e9 T\u011b\u017een\u00ed! +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.GoldRepair.Name=Oprava zlata ({0}+ SKILL) @@ -182,46 +182,46 @@ 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.Error=&4V mcMMO do\u0161lo k chyb\u011b p\u0159i oprav\u011b tohoto itemu! +Repair.Listener.Anvil=&4Polo\u017eil si kovadlinu, na kovadlin\u011b m\u016f\u017ee\u0161 opravovat n\u00e1stroje 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.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\u00ed\u0161 m\u00edt level &e{0}&c k oprav\u011b &e{1} +Repair.Skills.FeltEasy=&7To bylo snadn\u00e9. +Repair.Skills.FullDurability=&7Tento p\u0159edm\u011bt nen\u00ed po\u0161kozen\u00fd. +Repair.Skills.SalvageSuccess=&7 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.Mastery=Mistrovstvi v opravovani: &eExtra {0} \u017eivotnosti obnovena +Repair.Skills.StackedItems=&4Nem\u016f\u017ee\u0161 opravovat nestackovan\u00e9 p\u0159edm\u011bty. +Repair.Skills.Super.Chance=\u0160ance na superopravov\u00e1n\u00ed: &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.Chance.Downgrade=&7Sance na degradovani magicke sily predmetu: &e{0}% +Repair.Arcane.Chance.Success=&7Pravd\u011bpodobnost \u00fasp\u011bchu AF: &e{0}% Repair.Arcane.Downgrade=Magick\u00e1 s\u00edla tohoto p\u0159edm\u011btu zesl\u00e1bla. 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\u017eel jsi nezn\u00e1mou enegii v tomto p\u0159edm\u011btu. +Repair.Arcane.Rank=Tajemne kov\u00e1n\u00ed: &eLevel {0}/4 +Swords.Ability.Lower=&7**ODLOZIL JSI SVUJ MEC** +Swords.Ability.Ready=&a**PRIPRAVIL JSI SVUJ MEC** +Swords.Combat.Bleed.Chance=\u0160ance na krv\u00e1cen\u00ed: &e{0} +Swords.Combat.Bleed.Length=D\u00e9lka krv\u00e1cen\u00ed: &e{0} tik\u016f +Swords.Combat.Bleed.Note=&7NOTE: &e1 trva 2 sekundy +Swords.Combat.Bleeding.Started=&4 Krv\u00e1c\u00ed\u0161! +Swords.Combat.Bleeding.Stopped=&7Krvaceni bylo &azastaveno&7! +Swords.Combat.Bleeding=&a**NEPRITEL KRVACI** +Swords.Combat.Counter.Chance=\u0160ance na proti\u00fatok: &e{0} +Swords.Combat.Counter.Hit=&4Zasa\u017een proti\u00fatokem! +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) @@ -233,12 +233,12 @@ Swords.SubSkill.Bleed.Description=Aplikuj krv\u00e1cejic\u00ed 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.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\u00e9lka Hroziv\u00e9ho \u00datoku: &e{0}s Taming.Ability.Bonus.0=Ekologicky informovane Taming.Ability.Bonus.1=Vlci, vyhn\u011bte se nebezpe\u010d\u00ed Taming.Ability.Bonus.2=Husta srst @@ -257,15 +257,15 @@ Taming.Ability.Locked.2=ZAM\u010cENO DOKU\u010e {0}+DOVEDNOST (OT\u0158ESUVZDORN 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.Combat.Chance.Gore=\u0160ance na nabodnut\u00ed: &e{0} Taming.SubSkill.BeastLore.Name=Tradice \u0161elem Taming.SubSkill.BeastLore.Description=Na\u0159\u00edznut\u00ed kost\u00ed 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.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.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\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 @@ -278,24 +278,24 @@ 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.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.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.Complete=&aVyvol\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.Name.Format={0}s {1} -Unarmed.Ability.Berserk.Length=Delka trvani Besneni: [[YELLOW]]{0}s +Unarmed.Ability.Berserk.Length=Delka trvani Besneni: &e{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.Chance.ArrowDeflect=\u0160ance na vych\u00edlen\u00ed \u0161\u00edpu: &e{0} +Unarmed.Ability.Chance.Disarm=\u0160ance na odzbrojen\u00ed: &e{0} +Unarmed.Ability.Chance.IronGrip=\u0160ance na \u017delezn\u00fd stisk: &e{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.Ability.IronGrip.Defender=&aTv\u016fj \u017eelezny stisk zabr\u00e1nil tomu abys byl odzbrojen! +Unarmed.Ability.Lower=&7**SKL\u00c1N\u00cd\u0160 SV\u00c9 P\u011aSTI** +Unarmed.Ability.Ready=&a**PRIPRAVIL JSI SVOJE PESTI** Unarmed.SubSkill.Berserk.Name=B\u011bsn\u011bn\u00ed (SCHOPNOST) Unarmed.SubSkill.Berserk.Description=+50% DMG, Nici slabsi materiali Unarmed.SubSkill.Disarm.Name=Odzbrojit (Hr\u00e1ce) @@ -309,15 +309,15 @@ Unarmed.SubSkill.IronGrip.Description=Zabra\u0148uje va\u0161emu odzbrojen\u00ed 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.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\u011bsn\u011bn\u00ed &abyla obnovena! Unarmed.Skillup=Dovednost v boji rukou byla navy\u0161ena 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.Chance.DDrop=\u0160ance na dvojn\u00e1sobn\u00fd zisk: &e{0} +Woodcutting.Ability.Length=D\u00e9lka Tree felleru: &e{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 @@ -327,36 +327,36 @@ Woodcutting.SubSkill.HarvestLumber.Name=Dvojnasobne zisky Woodcutting.SubSkill.HarvestLumber.Description=Zdvojnasobi normalni zisk Woodcutting.Listener=D\u0159evorubectv\u00ed: 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\u00c1LE\u010c STROM\u016e AKTIVOV\u00c1NO** +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.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.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\u00edk (&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! +Combat.TargetDazed=C\u00edl byl &4Omr\u00e1\u010den +Combat.TouchedFuzzy=&4Nejasne dotcen. Mas zavrat. +mcMMO.Description=&3O &emcMMO&3 Projekt:,&6mcMMO je &copen source&6 RPG m\u00f3d vytvo\u0159en\u00fd v \u00fanoru 2011,&6autorem &9nossr50&6. C\u00edl projektu je poskytnout kvalitu RPG.,&3Tipy:,&6 - &aPou\u017eij &c/mcmmo help&a pro zobrazen\u00ed dostupn\u00fdch p\u0159\u00edkaz\u016f,&6 - &aType &c/SKILLNAME&a pro zobrazen\u00ed detailn\u00edch informac\u00ed o skillu,&3V\u00fdvoj\u00e1\u0159i:,&6 - &anossr50 &9(Majitel),&6 - &aGJ &9(Vedouc\u00ed projektu),&6 - &aNuclearW &9(V\u00fdvoj\u00e1\u0159),&6 - &abm01 &9(V\u00fdvoj\u00e1\u0159),&6 - &aTfT_02 &9(V\u00fdvoj\u00e1\u0159),&6 - &aGlitchfinder &9(V\u00fdvoj\u00e1\u0159),&6 - &at00thpick1 &9(V\u00fdvoj\u00e1\u0159),&3U\u017eite\u010dn\u00e9 odkazy:,&6 - &ahttps://github.com/mcMMO-Dev/mcMMO/issues&6 Nahla\u0161ov\u00e1n\u00ed Chyb,&6 - &a#mcmmo @ irc.esper.net&6 IRC Chat, +Commands.addlevels.AwardAll.1=&aBylo 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}! +Commands.addlevels.AwardSkill.1=&aTvoje dovednost {1} je nyn\u00ed {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\u00e1m ud\u011bleno {0} zku\u0161enost\u00ed ve v\u0161ech skillech! +Commands.addxp.AwardSkill=&aZ\u00edskal si {0} zku\u0161enost\u00ed v {1}! +Commands.Ability.Off=Pou\u017eit\u00ed schopnosti bylo &c vypnuto +Commands.Ability.On=Pou\u017eit\u00ed schopnosti bylo &azapnuto +Commands.AdminChat.Off=Admin chat &cVypnuty +Commands.AdminChat.On=Admin Chat&aZapnut\u00fd Commands.AdminToggle=- Prepnout admin chat Commands.Chat.Console=*\u0158\u00edd\u00edc\u00ed panel* Commands.Disabled=Tento prikaz je vypnuty. @@ -364,79 +364,79 @@ 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.Inspect= &c- Shl\u00e9dni detailn\u00ed informace o hr\u00e1\u010di +Commands.Party.Invite.Accepted=&aPozvanka prijata. Pridal jsi se k party {0} +Commands.Invite.Success=&aPozv\u00e1nka \u00faspesne odesl\u00e1na. +Commands.Leaderboards= &c- Tabulka nejlep\u0161\u00edch +Commands.mcc.Header=---[]&emcMMO P\u0159\u00edkazy&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.mcpurge.Success=&aDatab\u00e1ze byla \u00fasp\u011b\u0161n\u011b vy\u010dist\u011bna! +Commands.mcrank.Heading=&6-=OSOBN\u00cd HODNOCEN\u00cd=- +Commands.mcrank.Overall=Celkov\u00e1&a - &6Hodnost &f#&a{0} +Commands.mcrank.Player=C\u00cdL: &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 \u00fasp\u011b\u0161n\u011b vymaz\u00e1n z datab\u00e1ze! +Commands.mctop.Tip=&6Tip: Pro osobn\u00ed statistiky pou\u017eij &c/mcrank&6! +Commands.mmoedit=[player] &c - Modify target +Commands.mmoedit.AllSkills.1=&aTv\u00e1 \u00farove\u0148 ve v\u0161ech skillech byla nastavena na {0}! +Commands.mmoedit.Modified.1=&aTv\u016fj skill v {0} byl pozm\u011bn\u011bn 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\u00e1ln\u00ed pou\u017e\u00edvan\u00e1 datab\u00e1ze 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.Notifications.Off=Oznamov\u00e1n\u00ed schopnost\u00ed &cvypnuto +Commands.Notifications.On=Oznamov\u00e1n\u00ed schopnost\u00ed &azapnuto 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.Other=&a--OSTATNI PRIKAZY-- +Commands.Party.Header=-----[]&aPARTA&c[]----- +Commands.Party.Status=&8JM\u00c9NO: &f{0} {1} +Commands.Party.ShareMode=&8M\u00d3D SD\u00cdLEN\u00cd: +Commands.Party.ItemShare=&7P\u0158EDM\u011aT &3({0}) +Commands.Party.ExpShare=&7EXP &3({0}) +Commands.Party.ItemShareCategories=&8Sd\u00edl\u00edm p\u0159edm\u011bty: &7[[ITALIC]]{0} +Commands.Party.MembersNear=&8BL\u00cdZKO 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.Chat.Off=Chat jenom pro partu &cVypnuty +Commands.Party.Chat.On=Party chat &cOff +Commands.Party.Commands=&a--P\u0158\u00cdKAZY PARTY-- +Commands.Party.Invite.0=VAROVANI: &aObdrzel jsi pozvanku do party {0} od {1} +Commands.Party.Invite.1=Napi\u0161te &a/party accept&e 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.Join=&7P\u0159idal/a jste se do party: {0} +Commands.Party.Create=&7Vytvo\u0159ena parta: {0} +Commands.Party.Rename=&7Jm\u00e9no party zm\u011bn\u011bno na: &f{0} +Commands.Party.SetSharing=&7Parta {0} sd\u00edl\u00ed nastaven\u00ed na: &3{1} +Commands.Party.ToggleShareCategory=&7Sd\u00edlen\u00ed v\u011bc\u00ed v part\u011b pro &6{0} &7bylo &3{1} +Commands.Party.AlreadyExists=&4Parta {0} u\u017e 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.Members.Header=-----[]&a\u010cLENOV\u00c9&c[]----- Commands.Party.None=[RED]]Nejsi 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.Enabled=Teleportace paret &azapnut\u00e1 +Commands.ptp.Disabled=Teleportace paret &cvypnut\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.Request1={0} &apo\u017e\u00e1dal ,aby se k v\u00e1m mohl teleportovat. +Commands.ptp.Request2=&aK teleportu napi\u0161te &e/ptp accept. &aPo\u017eadavek vypr\u0161\u00ed za &c{0} &asekund. +Commands.ptp.AcceptAny.Enabled=Potvrzen\u00ed teleportu party &azapnut +Commands.ptp.AcceptAny.Disabled=Potvrzen\u00ed teleportu party &cvypnuto 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.PowerLevel.Leaderboard=--mcMMO&9 Rebricek &eCelkovych levelu-- +Commands.PowerLevel.Capped=&4CELKOV\u00c1 \u00daROVE\u0147: &a{0} &4MAXIM\u00c1LN\u00cd \u00daROVE\u0147: &e{1} +Commands.PowerLevel=&4CELKOVY LEVEL: &a{0} +Commands.Reset.All=&a Vsechny vase dovednosti byly uspesne resetov\u00e1ny. +Commands.Reset.Single=&aTvoje dovednost {0} byla uspesne restartovana. Commands.Reset=Resetov\u00e1n\u00ed zku\u0161enost\u00ed na level 0 Commands.Skill.Invalid=Neplatny nazev dovednosti! -Commands.Skill.Leaderboard=--mcMMO [[BLUE]]{0}[[YELLOW]] Tabulka nejlepsich-- +Commands.Skill.Leaderboard=--mcMMO &9{0}&e Tabulka nejlepsich-- Commands.SkillInfo=- Shl\u00e9dnout detailn\u00ed informace o dovednosti Commands.Stats.Self=Tvoje statistiky Commands.Stats=- Shl\u00e9dnout svoje mcMMO statistiky @@ -455,54 +455,54 @@ Commands.Usage.Rate=hodnota Commands.Usage.Skill=Dovednost Commands.Usage.XP=Zku\u0161enostn\u00ed body mcMMO.NoInvites=Momentalne nemas zadne pozvanky -mcMMO.NoPermission=[[DARK_RED]]Nedostatecna prava -mcMMO.NoSkillNote=[[DARK_GRAY]]Pokud nemas pristup k schopnosti, nebude zobrazena. +mcMMO.NoPermission=&4Nedostatecna prava +mcMMO.NoSkillNote=&8Pokud 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.Help.0=Spr\u00e1vn\u00e9 pou\u017eit\u00ed je &3{0} [password]. +Party.Help.1=Pro vytvo\u0159en\u00ed party, pou\u017eij &3{0} [password]. +Party.Help.2=Pora\u010f se s &3{0} &cpro v\u00edce informac\u00ed +Party.Help.3=Pou\u017eij &3{0} [password] &cpro vstup nebo &3{1} &cpro opu\u0161t\u011bn\u00ed +Party.Help.4=Pro uzam\u010den\u00ed nebo odem\u010den\u00ed tv\u00e9 party, pou\u017eij &3{0} +Party.Help.5=Pro ochr\u00e1n\u011bn\u00ed va\u0161\u00ed party heslem, pou\u017eij &3{0} +Party.Help.6=Pro vykopnut\u00ed hr\u00e1\u010de z tv\u00e9 party, pou\u017eij &3{0} +Party.Help.7=Pro p\u0159esunut\u00ed v\u016fdcovstv\u00ed tv\u00e9 party, pou\u017eij &3{0} +Party.Help.8=Pro zru\u0161en\u00ed va\u0161\u00ed party pou\u017eij &3{0} +Party.Help.9=Pou\u017eijte&3{0} &cabyste sd\u00edlel v\u011bci se \u010dleny party. +Party.Help.10=Pou\u017eij &3{0} &ck zapnut\u00ed sd\u00edlen\u00ed zku\u0161enostn\u00edch bod\u016f se \u010dleny party +Party.InformedOnJoin={0} &ase p\u0159idal do va\u0161\u00ed party +Party.InformedOnQuit={0} &aopustil va\u0161\u00ed partu +Party.InformedOnNameChange=&6{0} &anastavil jm\u00e9no party na &f{1} +Party.InvalidName=&4Toto 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! 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.NotInYourParty=&4{0} nen\u00ed ve tv\u00e9 part\u011b. +Party.NotOwner=&4Nejste v\u016fdcem party. +Party.Owner.New=&a{0} se stal v\u016fdce party. +Party.Owner.NotLeader=&4U\u017e nejsi v\u016fdce party. +Party.Owner.Player=&aNyn\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.Password.Set=&aHeslo do party nastaveno na {0} +Party.Password.Removed=&aHeslo party bylo vy\u010di\u0161t\u011bno. Party.Player.Invalid=Tohle neni platny hrac. -Party.NotOnline=[[DARK_RED]]{0} nen\u00ed online! +Party.NotOnline=&4{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.PlayerNotInParty=&4{0} nen\u00ed na party Party.Specify=Mus\u00ed\u0161 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.Player=&aByl 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.Target=&a{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.Unlocked=&7Party je odemknuta +Party.Disband=&7Parta se rozpadla +Party.Status.Locked=&4(POUZE POZV\u00c1NKY) +Party.Status.Unlocked=&2(OTEV\u0158\u00cdT) Party.ShareType.Xp=EXP Party.ShareType.Item=P\u0158EDM\u011aT Party.ShareMode.None=\u017d\u00c1DN\u00dd @@ -528,76 +528,76 @@ 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.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\u0161enostn\u00edch bod\u016f byla zm\u011bn\u011bna na {0} Commands.xprate.over=mcMMO Event na XP N\u00e1sobek ZKON\u010cIL! 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.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\u010cAL! +Commands.xprate.started.1=&6mcMMO XP N\u00c1SOBEK JE NYN\u00cd {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]]=- +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\u00e1vod k {0} - napi\u0161te /{1} ? [page] +Guides.Header=&6-=&a{0} N\u00e1vod&6=- 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.OfflineStats=mcMMO Statistiky pro offline hrace &e{0} +Inspect.Stats=&amcMMO Statistiky pro &e{0} Inspect.TooFar=Jsi moc daleko pro prozkoum\u00e1n\u00ed tohoto hr\u00e1\u010de. Item.ChimaeraWing.Fail=**K\u0158\u00cdDLO CHIM\u00c9RY 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 +Item.ChimaeraWing.Lore=&7Teleportuje 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! &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\u00e1jen\u00ed teleportu za&6({0}) &7sekund, pros\u00edm st\u016fj klidn\u011b... +Teleport.Cancelled=&4Teleportace zru\u0161ena +Skills.Child=&6(D\u011btsk\u00e1 dovednost) +Skills.Disarmed=&4Byl jsi odzbrojen! +Skills.Header=-----[]&a{0}&c[]----- +Skills.NeedMore=&4Potrebujes vic Skills.Parents=RODI\u010cE -Skills.Stats={0}[[GREEN]]{1}[[DARK_AQUA]] XP([[GRAY]]{2}[[DARK_AQUA]]/[[GRAY]]{3}[[DARK_AQUA]]) +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.ConfirmOrCancel=[[GREEN]Stiskn\u011bte znovu prav\u00e9 tla\u010d\u00edtko pro potvrzen\u00ed &6{0}&a. Lev\u00e9 tla\u010d\u00edtko ke zru\u0161en\u00ed. +Stats.Header.Combat=&6-=BOJOVE DOVEDNOSTI=- +Stats.Header.Gathering=&6-=SHROMAZDOVACI DOVEDNOSTI=- Stats.Header.Misc=Ostatni schopnosti -Stats.Own.Stats=[[GREEN]][mcMMO] Statistiky +Stats.Own.Stats=&a[mcMMO] Statistiky Perks.XP.Name=Zku\u0161enost 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.Bonus=&6 ({0} s perkem \u0160\u0165astlivec) Perks.Cooldowns.Name=Rychle zotaveni Perks.Cooldowns.Desc=Zmen\u0161\u00ed dobu znovunabit\u00ed 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.Bonus=&6 ({0} s perkem V\u00fddr\u017enost) +MOTD.Donate=&3Informace o p\u0159\u00edsp\u011bvc\u00edch: +MOTD.Hardcore.DeathStatLoss.Stats=&6[mcMMO] &3Dovednost\u00ed penalizace kv\u016fli smrti : &4{0}% +MOTD.Hardcore.Vampirism.Stats=[GOLD]][mcMMO] &3Up\u00edrsk\u00e9 Cizen\u00ed Stat\u016f: &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 +MOTD.Version=&6[mcMMO] - verze &3{0} +MOTD.Website=&6[mcMMO] &a{0}&e - Web mcMMO +Smelting.Ability.FluxMining=\u0160ANCE NA T\u011a\u017dBU VRT\u00c1KEM: &e{0} +Smelting.Ability.FuelEfficiency=N\u00e1sobi\u010d v\u00fdkonnosti paliva: &e{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.Ability.SecondSmelt=\u0160ance na z\u00edsk\u00e1n\u00ed druh\u00e9 ztaveniny: &e{0} +Smelting.Ability.VanillaXPBoost=N\u00c1SOBI\u010c ZKU\u0160ENOST\u00cd: &e{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 @@ -606,7 +606,7 @@ Smelting.Effect.4=Zku\u0161enostn\u00ed zes\u00edlen\u00ed z p\u016fvodn\u00edho 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.FluxMining.Success=&aTa 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 diff --git a/src/main/resources/locale/locale_cy.properties b/src/main/resources/locale/locale_cy.properties index 4fe1e9a58..82417b8ed 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.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=[[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.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.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 \u00f4l i chi ... Taming.Listener=Taming: Taming.SkillName=TAMING Taming.Skillup= sgiliau Ddofi cynyddu {0}.\u00a0Cyfanswm ({1}) -Taming.Summon.Complete=[[GREEN]]Summoning complete +Taming.Summon.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\u00ean ** +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 @@ -412,57 +412,57 @@ Commands.XPGain.Swords=Angenfilod ymosod Commands.XPGain.Taming=Anifeiliaid Taming, neu ymladd \u00e2\'ch bleiddiaid Commands.XPGain.Unarmed=Attacking Monsters Commands.XPGain.Woodcutting=Chopping down trees -Commands.XPGain=[[DARK_GRAY]] Cael Profiad: [[WHITE]] {0} -Commands.xplock.locked=[[GOLD]]Your XP BAR is now locked to {0}! -Commands.xplock.unlocked=[[GOLD]]Your XP BAR is now [[GREEN]]UNLOCKED[[GOLD]]! +Commands.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) +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=[GOLD]] - = GWRTHSEFYLL SGILIAU = - -Stats.Header.Gathering=[[GOLD]] -= CASGLU SGILIAU = = - -Stats.Header.Misc=[[GOLD]]-=MISC SKILLS=- -Stats.Own.Stats=[[GREEN]][mcMMO] Ystadegau +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 diff --git a/src/main/resources/locale/locale_da.properties b/src/main/resources/locale/locale_da.properties index e4cdc1d53..1e4f51f4d 100644 --- a/src/main/resources/locale/locale_da.properties +++ b/src/main/resources/locale/locale_da.properties @@ -1,6 +1,6 @@ -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\u00e6rgnings Chance: &e{0} Acrobatics.SubSkill.Roll.Name=Rul Acrobatics.SubSkill.Roll.Description=Reducerer eller omvender Fald skade Acrobatics.SubSkill.GracefulRoll.Name=Yndefuldt Rul @@ -8,14 +8,14 @@ Acrobatics.SubSkill.GracefulRoll.Description=Dobbelt s\u00e5 effektiv som en nor Acrobatics.SubSkill.Dodge.Name=Afv\u00e6rg Acrobatics.SubSkill.Dodge.Description=Reducer angrebs skade med halvdelen Acrobatics.Listener=Akrobatik: -Acrobatics.SubSkill.Roll.Chance=Rulle Chance: [[YELLOW]]{0} -Acrobatics.SubSkill.Roll.GraceChance=Yndefuldt Rul Chance: [[YELLOW]]{0} +Acrobatics.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} +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.Daze.Name=Lam (Spillere) @@ -30,14 +30,14 @@ 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.Lower=&7**DU S\u00c6NKER DIN \u00d8KSE** +Axes.Ability.Ready=&a**DU G\u00d8R DIN \u00d8KSE 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.Proc=&a**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.SS.Length=Kranie Splitter L\u00e6ngde: &e{0}s Axes.SubSkill.SkullSplitter.Name=Kranie Splitter (Evne) Axes.SubSkill.SkullSplitter.Description=For\u00e5rsag Omr\u00e5de Skade Axes.SubSkill.CriticalStrikes.Name=Kritiske Slag @@ -51,32 +51,32 @@ Axes.SubSkill.GreaterImpact.Description=Giv bonus skade til ubev\u00e6bnede fjen Axes.Listener=\u00d8kser: Axes.SkillName=\u00d8KSER Axes.Skills.SS.Off=**Berserker er aftaget** -Axes.Skills.SS.On=[[GREEN]]**Kranie Knuser AKTIVERET** -Axes.Skills.SS.Refresh=[[GREEN]]Din [[YELLOW]]Kranie Splitter [[GREEN]]evne er genindl\u00e6st! -Axes.Skills.SS.Other.Off=Kranie Knuser[[GREEN]] er aftaget i [[YELLOW]]{0} -Axes.Skills.SS.Other.On=[[GREEN]]{0}[[DARK_GREEN]] har brugt [[RED]]Kranie Splitter! +Axes.Skills.SS.On=&a**Kranie Knuser AKTIVERET** +Axes.Skills.SS.Refresh=&aDin &eKranie Splitter &aevne er genindl\u00e6st! +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=\u00d8kse evner forbedret med {0}. Ialt ({1}) -Excavation.Ability.Lower=[[GRAY]]**DU S\u00c6NKER DIN SKOVL** -Excavation.Ability.Ready=[[GREEN]]**DU G\u00d8R DIN SKOVL KLAR** +Excavation.Ability.Lower=&7**DU S\u00c6NKER DIN SKOVL** +Excavation.Ability.Ready=&a**DU G\u00d8R DIN SKOVL KLAR** Excavation.SubSkill.GigaDrillBreaker.Name=Giga Borer (EVNE) Excavation.SubSkill.GigaDrillBreaker.Description=3x Tabs ratio for blokke, 3x EXP, +Fart Excavation.SubSkill.TreasureHunter.Name=Skatte J\u00e6ger Excavation.SubSkill.TreasureHunter.Description=Evne til at grave efter skatte -Excavation.Effect.Length=Giga Borer L\u00e6ngde: [[YELLOW]]{0}s +Excavation.Effect.Length=Giga Borer L\u00e6ngde: &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.Skills.GigaDrillBreaker.On=&a**Super Bor AKTIVERET** +Excavation.Skills.GigaDrillBreaker.Refresh=&aDin &eGiga Borer &aevne er genindl\u00e6st! +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\u00f8get med {0}. Total ({1}) -Fishing.Ability.Info=Magisk J\u00e6ger: [[GRAY]] **Forbedres med skattejagts ranken** +Fishing.Ability.Info=Magisk J\u00e6ger: &7 **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.Ability.Rank=Skatte J\u00e6ger Rank: &e{0}/5 +Fishing.Ability.TH.MagicRate=Magi J\u00e6ger Chance: &e{0} +Fishing.Ability.Shake=Ryste Chance: &e{0} +Fishing.Ability.FD=Fiskers Diet: &eRank {0} Fishing.SubSkill.TreasureHunter.Name=Skatte J\u00e6ger (Passiv) Fishing.SubSkill.TreasureHunter.Description=Fisk diverse objekter op. Fishing.SubSkill.MagicHunter.Name=Magi J\u00e6ger @@ -85,20 +85,20 @@ Fishing.SubSkill.Shake.Name=Ryst (Mod V\u00e6sner) Fishing.SubSkill.Shake.Description=Ryst ting ud af monstre med en fiskestang Fishing.SubSkill.FishermansDiet.Name=Fiskers Diet Fishing.SubSkill.FishermansDiet.Description=Forbedrer Sult genoprettet af Fisked mad -Fishing.Chance.Raining=[[BLUE]] Regn Bonus +Fishing.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\u00f8ler et strejf a magi med denne fangst... Fishing.SkillName=FISKER Fishing.Skillup=Fisker evne for\u00f8get med {0}. Total ({1}) -Herbalism.Ability.DoubleDropChance=2x Tabs Chance: [[YELLOW]]{0} -Herbalism.Ability.GTe.Length=Gr\u00f8n Terra L\u00e6ngde: [[YELLOW]]{0}s +Herbalism.Ability.DoubleDropChance=2x Tabs Chance: &e{0} +Herbalism.Ability.GTe.Length=Gr\u00f8n Terra L\u00e6ngde: &e{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.Chance=Gr\u00f8nne Fingre Chance: &e{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.Ability.GTh.Stage=Gr\u00f8nne Fingre Stadie: &e Planter gror i stadie {0} +Herbalism.Ability.GTh=&a**GR\u00d8NNE FINGRE** +Herbalism.Ability.Lower=&7**DU S\u00c6NKER DIt LUGEJERN** +Herbalism.Ability.Ready=&a**DU G\u00d8R DIT LUGEJERN KLAR** Herbalism.SubSkill.GreenTerra.Name=Gr\u00f8n Terra (EVNE) Herbalism.SubSkill.GreenTerra.Description=Spred Terra, 3x Tab Herbalism.SubSkill.GreenThumb.Name=Gr\u00f8nne Fingre (Hvede) @@ -110,17 +110,17 @@ Herbalism.SubSkill.DoubleDrops.Name=Dobble tab (alle planter) Herbalism.SubSkill.DoubleDrops.Description=G\u00f8r din normale udbytte dobblet s\u00e5 stort Herbalism.Listener=Urtekundskab Herbalism.SkillName=NATURMEDICIN -Herbalism.Skills.GTe.On=[[GREEN]]**GR\u00d8N TERRA AKTIVERET** -Herbalism.Skills.GTe.Refresh=[[GREEN]Din [[YELLOW]]Gr\u00f8nne Terra [[GREEN]]evne er genindl\u00e6st! -Herbalism.Skills.GTe.Other.Off=Gr\u00f8n Terra[[GREEN]] er aftaget i [[YELLOW]]{0} -Herbalism.Skills.GTe.Other.On=[[GREEN]]{0}[[DARK_GREEN]] har brugt [[RED]]Gr\u00f8n Terra! +Herbalism.Skills.GTe.On=&a**GR\u00d8N TERRA AKTIVERET** +Herbalism.Skills.GTe.Refresh=[[GREEN]Din &eGr\u00f8nne Terra &aevne er genindl\u00e6st! +Herbalism.Skills.GTe.Other.Off=Gr\u00f8n Terra&a er aftaget i &e{0} +Herbalism.Skills.GTe.Other.On=&a{0}&2 har brugt &cGr\u00f8n Terra! Herbalism.Skillup=Naturens Evne forbedret med {0}. Total ({1}) -Mining.Ability.Length=Super \u00d8del\u00e6gger L\u00e6ngde: [[YELLOW]]{0}s +Mining.Ability.Length=Super \u00d8del\u00e6gger L\u00e6ngde: &e{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.Ability.Lower=&7**DU S\u00c6NKER DIN HAKKE** +Mining.Ability.Ready=&a**DU G\u00d8R DIN HAKKE KLAR** Mining.SubSkill.SuperBreaker.Name=Super \u00d8del\u00e6gger (EVNE) Mining.SubSkill.SuperBreaker.Description=Fart+, 3x Tabs chance Mining.SubSkill.DoubleDrops.Name=Dobble Tab @@ -131,21 +131,21 @@ Mining.SubSkill.BiggerBombs.Name=St\u00f8rre Bomber Mining.SubSkill.BiggerBombs.Description=Forbedrer TNT explosions radius Mining.SubSkill.DemolitionsExpertise.Name=Nedrivnings Expertise Mining.SubSkill.DemolitionsExpertise.Description=Formindsker skade fra TNT explotioner -Mining.Effect.Decrease=Nedrivingings Expert Skade neds\u00e6ttelse: [[YELLOW]]{0} -Mining.Effect.DropChance=2x Tabs Chance: [[YELLOW]]{0} +Mining.Effect.Decrease=Nedrivingings Expert Skade neds\u00e6ttelse: &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.Skills.SuperBreaker.On=&a**SUPER \u00d8DEL\u00c6GGER AKTIVERET** +Mining.Skills.SuperBreaker.Other.Off=Super \u00d8del\u00e6gger&a er aftaget i &e{0} +Mining.Skills.SuperBreaker.Other.On=&a{0}&2 har brugt &cSuper \u00d8del\u00e6gger! +Mining.Skills.SuperBreaker.Refresh=&aDin &eSuper Smadrer &aevne 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.Blast.Boom=&7**BOOM** +Mining.Blast.Radius.Increase=Eksplosions Radius For\u00f8gelse: &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\u00e6st! Repair.SubSkill.Repair.Name=Reparer Repair.SubSkill.Repair.Description=Reparer V\u00e6rkt\u00f8jer & Rustning Repair.SubSkill.GoldRepair.Name=Guld Reparer ({0}+ EVNE) @@ -164,44 +164,44 @@ 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.Error=&4mcMMO m\u00f8dte en fejl mens den fors\u00f8gte at reparere dette objekt! +Repair.Listener.Anvil=&4Du har placeret en armbolt, armbolte kan reparere v\u00e6rkt\u00f8j og rustning. +Repair.Listener.Anvil2=&4Du har placeret en Genbrugs Ambolt, Brug den til at Genbruge V\u00e6rkt\u00f8jer og Rustning (F\u00e5 materialer tilbage) Repair.Listener=Reparer: Repair.SkillName=REPARER -Repair.Skills.AdeptSalvage=[[DARK_RED]] Du har ikke Evner nok til at bruge Genbrug p\u00e5 Objekter. -Repair.Skills.AdeptDiamond=[[DARK_RED]]Du er ikke kvalificeret nok til at reparere diamant. -Repair.Skills.AdeptGold=[[DARK_RED]]Du er ikke kvalificeret nok til at reparere guld. -Repair.Skills.AdeptIron=[[DARK_RED]]Du har ikke evner nok til at reparere Jern. -Repair.Skills.AdeptStone=[[DARK_RED]]Du er ikke kvalificeret nok til at reparere sten. -Repair.Skills.Adept=Du skal v\u00e6re level [[YELLOW]]{0}[[RED]] for at reparere [[YELLOW]]{1} -Repair.Skills.FeltEasy=[[GRAY]]Det var nemt. -Repair.Skills.FullDurability=[[GRAY]]Det er p\u00e5 fuld holdbarhed -Repair.Skills.SalvageSuccess=[[GRAY]]Genstand genbrugt! -Repair.Skills.NotFullDurability=[[DARK_RED]]Du kan ikke genbruge \u00f8delagte v\u00e6rkt\u00f8jer og rustninger. -Repair.Skills.Mastery=Reperations Beherskelse: [[YELLOW]]Extra {0} Modstand gendannet -Repair.Skills.StackedItems=[[DARK_RED]]Du kan ikke reparere ting i stabler. -Repair.Skills.Super.Chance=Super Reparerings Chance: [[YELLOW]]{0} +Repair.Skills.AdeptSalvage=&4 Du har ikke Evner nok til at bruge Genbrug p\u00e5 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\u00e6re level &e{0}&c for at reparere &e{1} +Repair.Skills.FeltEasy=&7Det var nemt. +Repair.Skills.FullDurability=&7Det er p\u00e5 fuld holdbarhed +Repair.Skills.SalvageSuccess=&7Genstand genbrugt! +Repair.Skills.NotFullDurability=&4Du kan ikke genbruge \u00f8delagte v\u00e6rkt\u00f8jer 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\u00c6NKER DIT SV\u00c6RD** +Swords.Ability.Ready=&a**DU HAR FORBEREDT DIT SV\u00c6RD** +Swords.Combat.Bleed.Chance=Bl\u00f8de Chance: &e{0} +Swords.Combat.Bleed.Length=Bl\u00f8dnings L\u00e6ngde: &e{0} ticks +Swords.Combat.Bleed.Note=&7NOTER: &e1 Tick sker hver 2 sekund +Swords.Combat.Bleeding.Started=&4 Du Bl\u00f8der! +Swords.Combat.Bleeding.Stopped=&7Bl\u00f8dningen er &astoppet&7! +Swords.Combat.Bleeding=&a**MODSTANDEREN BL\u00d8DER** +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\u00e6gtekunstens S\u00e5r! Swords.SubSkill.CounterAttack.Name=Modangreb Swords.SubSkill.SerratedStrikes.Name=F\u00e6gteKunst (Evne) Swords.Effect.4=F\u00e6gteKunst Bl\u00f8dning+ @@ -210,12 +210,12 @@ Swords.SubSkill.Bleed.Description=S\u00e6t en Bl\u00f8dning med 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.Skills.SS.On=&a**F\u00c6GTEKUNST AKTIVERET** +Swords.Skills.SS.Refresh=&aDin &eF\u00e6gtekunst &aevne er genindl\u00e6st! +Swords.Skills.SS.Other.Off=F\u00e6gtekunst&a er aftaget i &e{0} +Swords.Skills.SS.Other.On=&a{0}&2 har brugt &cF\u00c6GTEKUNST! Swords.Skillup=Sv\u00e6rd evne for\u00f8get med {0}. Total ({1}) -Swords.SS.Length=F\u00e6gtekunstens L\u00e6ngde: [[YELLOW]]{0}s +Swords.SS.Length=F\u00e6gtekunstens L\u00e6ngde: &e{0}s Taming.Ability.Bonus.0=Omgivelses bevidst Taming.Ability.Bonus.1=Ulve undviger fare Taming.Ability.Bonus.2=Tyk Pels @@ -227,15 +227,15 @@ 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.Combat.Chance.Gore=Spidnings Chance: &e{0} +Taming.SubSkill.BeastLore.Name=&a**TIGGENDE MONSTER** Taming.SubSkill.BeastLore.Description=Sl\u00e5 p\u00e5 Ulve & Ocelotter med en Knogle for at incpicere dem. Taming.SubSkill.ShockProof.Name=Shock Sikker Taming.SubSkill.ShockProof.Description=Explosiv Skades Reduktion Taming.SubSkill.CallOfTheWild.Name=Kaldet fra Naturen. Taming.SubSkill.CallOfTheWild.Description=Lav et dyr ved din side -Taming.SubSkill.CallOfTheWild.Description.2=[[GRAY]]COTW (Ocelot): Crouch og venstre-click med {0} en Fisk i h\u00e5nden -Taming.Effect.15=[[GRAY]]COTW (Wolf): Crouch og venstre-click med {0} Knogler i din h\u00e5nd. +Taming.SubSkill.CallOfTheWild.Description.2=&7COTW (Ocelot): Crouch og venstre-click med {0} en Fisk i h\u00e5nden +Taming.Effect.15=&7COTW (Wolf): Crouch og venstre-click med {0} Knogler i din h\u00e5nd. Taming.SubSkill.FastFoodService.Name=Fast Food Service Taming.SubSkill.FastFoodService.Description=Chance for Ulve liver op n\u00e5r de angriber Taming.SubSkill.Gore.Name=M\u00e5l Punkt. @@ -246,22 +246,22 @@ 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.Wolf=&8Din 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.Complete=&aSkabelse Komplet Taming.Summon.Fail.Ocelot=Der er for mange Ocelotter i n\u00e6rheden af dig til at du kan spawne flere. Taming.Summon.Fail.Wolf=Der er for mange Ulve i n\u00e6rheden af dig til at du kan spawne flere. -Unarmed.Ability.Berserk.Length=Berserker L\u00e6ngde: [[YELLOW]]{0}s +Unarmed.Ability.Berserk.Length=Berserker L\u00e6ngde: &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\u00e6bnings 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\u00e5 afv\u00e6bning! +Unarmed.Ability.Lower=&7**DU S\u00c6NKER DINE N\u00c6VER** +Unarmed.Ability.Ready=&a**DU KLARG\u00d8R DIN N\u00c6VE** Unarmed.SubSkill.Berserk.Name=Berserker (EVNE) Unarmed.SubSkill.Berserk.Description=+50% skade, \u00f8del\u00e6gger svage materialer Unarmed.SubSkill.Disarm.Name=Afv\u00e6bn (Spiller) @@ -273,15 +273,15 @@ Unarmed.SubSkill.ArrowDeflect.Description=Undvig Pile Unarmed.Listener=Ubev\u00e6bnet: Unarmed.SkillName=UBEV\u00c6BNET Unarmed.Skills.Berserk.Off=**Berserker er nu aftaget** -Unarmed.Skills.Berserk.On=[[GREEN]]**BERSERKER AKTIVERET** -Unarmed.Skills.Berserk.Other.Off=Berserker[[GREEN]] er aftaget i [[YELLOW]]{0} -Unarmed.Skills.Berserk.Other.On=[[GREEN]]{0}[[DARK_GREEN]] har brugt [[RED]]Berserker! -Unarmed.Skills.Berserk.Refresh=[[GREEN]]Dine [[YELLOW]]Berserker [[GREEN]]evner er genindl\u00e6st! +Unarmed.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\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.Chance.DDrop=2x Tabs Chance: &e{0} +Woodcutting.Ability.Length=Tr\u00e6 Hugger L\u00e6ngde: &e{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 @@ -292,34 +292,34 @@ 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.On=&a**TR\u00c6 HUGGER AKTIVERET** +Woodcutting.Skills.TreeFeller.Refresh=&aDin &eTr\u00e6 Hugger &aevne er genindl\u00e6st! +Woodcutting.Skills.TreeFeller.Other.Off=Tr\u00e6 hugger&a er aftaget i &e{0} +Woodcutting.Skills.TreeFeller.Other.On=&a{0}&2 har brugt &cTr\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** +Ability.Generic.Refresh=&a**EVNER GENINDL\u00c6ST!** +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! +Combat.TargetDazed=M\u00e5let er nu &4Bed\u00f8vet +Combat.TouchedFuzzy=&4R\u00f8rte Plysse. F\u00f8lte mig svimmel. +Commands.addlevels.AwardAll.1=&aDu 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.1=&aDu har f\u00e5et{0} levels i {1}! Commands.addlevels.AwardSkill.2={0} er blevet \u00e6ndret for {1}. -Commands.addxp.AwardAll=[[GREEN]]Du har f\u00e5et {0} Exp i alle evner! -Commands.addxp.AwardSkill=[[GREEN]]Du har f\u00e5et {0} Exp i {1}! -Commands.Ability.Off=Evne brug sat til [[GREEN]]Sand -Commands.Ability.On=Evne brug sat til [[GREEN]]Sand -Commands.AdminChat.Off=Admin Chat kun [[RED]]Slukket -Commands.AdminChat.On=Kun Admin Chat [[GREEN]]Rigtigt +Commands.addxp.AwardAll=&aDu har f\u00e5et {0} Exp i alle evner! +Commands.addxp.AwardSkill=&aDu har f\u00e5et {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. @@ -327,47 +327,47 @@ 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.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\u00c5L: &f{0} +Commands.mcrank.Skill={0}&a - &6Rang &f#&a{1} +Commands.mcrank.Unranked=&fDegraderet 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.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 - \u00c6ndrer m\u00e5let +Commands.mmoedit.Modified.1=&aDit level i {0} er sat til {1}! Commands.mmoedit.Modified.2={0} er blevet \u00e6ndret for {1}. Commands.ModDescription=- L\u00e6s den korte mod beskrivelse Commands.NoConsole=Denne kommando er ikke supported af konsollen. -Commands.Other=[[GREEN]]--ANDRE KOMMANDOER-- +Commands.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.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.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\u00e6s 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 @@ -381,26 +381,26 @@ 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.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.InvalidName=&4Dette 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.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\u00e6ngere 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.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 \u00e5ben Commands.XPGain.Acrobatics=Falder Commands.XPGain.Archery=Angriber Monstre Commands.XPGain.Axes=Angriver Monstre @@ -413,57 +413,57 @@ Commands.XPGain.Swords=Angriber Monstre Commands.XPGain.Taming=Dyret\u00e6mning, eller kamp m/ dine ulve Commands.XPGain.Unarmed=Angriber Monstre Commands.XPGain.Woodcutting=Hugger tr\u00e6er ned -Commands.XPGain=[[DARK_GRAY]]XP FORTJENST: [[WHITE]]{0} -Commands.xplock.locked=[[GOLD]]Din XP BAR er nu l\u00e5st til {0}! -Commands.xplock.unlocked=[[GOLD]]Din XP BAR er nu [[GREEN]]\u00c5BEN[[GOLD]]! +Commands.XPGain=&8XP FORTJENST: &f{0} +Commands.xplock.locked=&6Din XP BAR er nu l\u00e5st til {0}! +Commands.xplock.unlocked=&6Din XP BAR er nu &a\u00c5BEN&6! 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.xprate.started.0=&6XP BEGIVENHEDER FOR mcMMO ER STARTET! +Commands.xprate.started.1=&6mcMMO XP BED\u00d8MMELSE ER NU {0}x! +XPRate.Event=&6mcMMO er lige nu i gang med et XP bed\u00f8mnings begivenhed! XP bed\u00f8mning er {0}x! Effects.Effects=Effekter -Effects.Level=[[DARK_GRAY]]LVL: [[GREEN]]{0} [[DARK_AQUA]]XP[[YELLOW]]([[GOLD]]{1}[[YELLOW]]/[[GOLD]]{2}[[YELLOW]]) -Effects.Template=[[DARK_AQUA]]{0}: [[GREEN]]{1} -Guides.Available=[[GRAY]]Guide for {0} tilg\u00e6ngelige - skriv /{1} ? [page] -Guides.Header=[[GOLD]]-=[[GREEN]]{0} Guide[[GOLD]]=- +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\u00e6ngelige - 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.OfflineStats=mcMMO Stats for Offline Spillere &e{0} +Inspect.Stats=&amcMMO F\u00e6rdigheder for &e{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]]) +Item.Injured.Wait=Du var for nylig skadet og m\u00e5 derfor vente med at bruge dette. &e({0}s) +Skills.Disarmed=&4Du er blevet afv\u00e6bnet! +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\u00e6rdigheder Perks.XP.Name=Erfaring Perks.XP.Desc=Modtag {0}x XP. Perks.Lucky.Name=Held Perks.Lucky.Desc=Giver {0} Evner en 33.3% bedre chance for at aktivere. Perks.Lucky.Desc.Login=Giver visse Evner en 33.3% bedre chance for at aktivere. -Perks.Lucky.Bonus=[[GOLD]] ({0} med heldig frynsegode) +Perks.Lucky.Bonus=&6 ({0} med heldig frynsegode) Perks.Cooldowns.Name=Hurtig Bedring Perks.Cooldowns.Desc=Sk\u00e6rer Nedk\u00f8lings tiden ned med {0}. Perks.ActivationTime.Name=Udholdenhed Perks.ActivationTime.Desc=Forl\u00e6nger evne aktivations tid med {0} sekunder -Perks.ActivationTime.Bonus=[[GOLD]] ({0}s med Udholdenheds Frynsegode) -MOTD.Donate=[[DARK_AQUA]]Donations Info: -MOTD.Hardcore.DeathStatLoss.Stats=[[GOLD]][mcMMO] [[DARK_AQUA]]Evne d\u00f8ds straf: [[DARK_RED]]{0}% -MOTD.Hardcore.Vampirism.Stats=[[GOLD]][mcMMO] [[DARK_AQUA]Vampyr Statistik Igle: [[DARK_RED]]{0}% +Perks.ActivationTime.Bonus=&6 ({0}s med Udholdenheds Frynsegode) +MOTD.Donate=&3Donations Info: +MOTD.Hardcore.DeathStatLoss.Stats=&6[mcMMO] &3Evne d\u00f8ds straf: &4{0}% +MOTD.Hardcore.Vampirism.Stats=&6[mcMMO] [[DARK_AQUA]Vampyr 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\u00f8rer 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 e15da3188..ab78c6b83 100644 --- a/src/main/resources/locale/locale_de.properties +++ b/src/main/resources/locale/locale_de.properties @@ -627,7 +627,7 @@ Mining.SubSkill.SuperBreaker.Description = Abbaugeschwindigkeit+, Dreifa Mining.SubSkill.SuperBreaker.Name = Superbrecher Mining.SubSkill.SuperBreaker.Stat = Superbrecher L\u00E4nge -Overhaul.Levelup = [[BOLD]]{0} erh\u00F6ht auf [[RESET]][[GREEN]][[BOLD]]{2}[[RESET]][[WHITE]]. +Overhaul.Levelup = &l{0} erh\u00F6ht auf &r&a&l{2}&r&f. Overhaul.Name.Acrobatics = Akrobatik Overhaul.Name.Alchemy = Alchemie Overhaul.Name.Archery = Bogenschie\u00DFen @@ -645,8 +645,8 @@ 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]]|] +Overhaul.mcMMO.Url.Wrap.Prefix = &c[| +Overhaul.mcMMO.Url.Wrap.Suffix = &c|] 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} @@ -758,7 +758,7 @@ Repair.Skills.StackedItems = &4Du kannst keine gestapelten Gegens 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.ArcaneForging.Stat.Extra = &3Arkanes Schmieden Chancen:&7 Erfolg &a{0}&7%, Verlust &c{1}&7% 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 @@ -822,7 +822,7 @@ 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.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\u00FCde um diese F\u00E4higkeit zu verwenden. &e({0}s) diff --git a/src/main/resources/locale/locale_en_US.properties b/src/main/resources/locale/locale_en_US.properties index e7cbb83d5..5243280e2 100644 --- a/src/main/resources/locale/locale_en_US.properties +++ b/src/main/resources/locale/locale_en_US.properties @@ -13,7 +13,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 +36,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,46 +99,46 @@ 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 [[YELLOW]]{6}%[[GRAY]] 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 @@ -153,8 +153,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 +182,13 @@ 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.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 +207,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 +224,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} &bRecord: &e{5} Fishing.SubSkill.MagicHunter.Name=Magic Hunter Fishing.SubSkill.MagicHunter.Description=Find Enchanted Items Fishing.SubSkill.MagicHunter.Stat=Magic Hunter Chance @@ -249,25 +249,25 @@ 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.Stat=Added Bite Chance at your current location: &a+{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.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 @@ -275,12 +275,12 @@ 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.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 +290,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 +312,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 +323,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 +344,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 +352,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=&7NOTE: &e1 Tick happens every 0.5 seconds! +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 @@ -426,16 +426,16 @@ 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=Rupture: &a{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.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 +462,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 +478,23 @@ 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.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=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 @@ -517,10 +517,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 @@ -542,175 +542,175 @@ 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.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.XPBar.Reset=[[GOLD]]XP Bar settings for mcMMO have been reset. -Commands.XPBar.SettingChanged=[[GOLD]]XP Bar setting for [[GREEN]]{0}[[GOLD]] is now set to [[GREEN]]{1} +Commands.Party.Status=&8NAME: &f{0} {1} &8LEVEL: &3{2} +Commands.Party.Status.Alliance=&8ALLY: &f{0} +Commands.Party.UnlockedFeatures=&8Unlocked Features: &7[[ITALIC]]{0} +Commands.Party.ShareMode=&8SHARE MODE: +Commands.Party.ItemShare=&7ITEM &3({0}) +Commands.Party.ExpShare=&7EXP &3({0}) +Commands.Party.ItemShareCategories=&8Sharing Items: &7[[ITALIC]]{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.FullClassName=classname Commands.Usage.Level=level Commands.Usage.Message=message @@ -723,69 +723,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 @@ -796,11 +796,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 @@ -826,216 +826,216 @@ 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.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]]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 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 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 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 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 Steel Arm Style work?\n[[YELLOW]]Steel Arm Style 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.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 @@ -1083,36 +1083,41 @@ 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=[[GOLD]]Compatibility for [[GREEN]]{0}[[GOLD]] is not supported by this version of Minecraft. -Compatibility.Layer.PartialSupport=[[GOLD]]Compatibility for [[GREEN]]{0}[[GOLD]] 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=[[GOLD]] All mcMMO XP bars are now disabled, use /mmoxpbar reset to restore default settings. \ No newline at end of file +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. +Chat.Style.Admin=&b[&f{0}&b] {1} +Chat.Style.Party=&a[&6{0}&a] {1} +Chat.Identity.Console=* Console * +Chat.Channel.On=&6(&amcMMO-Chat&6) &eYour chat messages will now be delivered automatically to the &a{0}&e chat channel. +Chat.Channel.Off=&6(&amcMMO-Chat&6) &7Your chat messages will no longer automatically be delivered to specific chat channels. \ 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 73b616f15..6aa857cc3 100644 --- a/src/main/resources/locale/locale_es.properties +++ b/src/main/resources/locale/locale_es.properties @@ -1,6 +1,6 @@ -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.GracefulRoll.Name=Rodada Majestuosa @@ -8,14 +8,14 @@ Acrobatics.SubSkill.GracefulRoll.Description=El doble de efectivo que una rodada Acrobatics.SubSkill.Dodge.Name=Esquivar Acrobatics.SubSkill.Dodge.Description=Reduce el da\u00f1o 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\u00f1o 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.Daze.Name=Aturdir (Jugadores) @@ -31,15 +31,15 @@ Axes.Ability.Bonus.2=Impacto Axes.Ability.Bonus.3=Aplicar un bonus de {0} de da\u00f1o 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.Ability.Lower=&7**BAJAS TU HACHA** +Axes.Ability.Ready=&a**PREPARAS TU HACHA** +Axes.Combat.CritStruck=&4\u00a1Fuiste golpeado CR\u00cdTICAMENTE! +Axes.Combat.CritChance=Probabilidad de golpe cr\u00edtico: &e{0}% Axes.Combat.CriticalHit=\u00a1GOLPE CR\u00cdTICO! -Axes.Combat.GI.Proc=[[GREEN]]**GOLPEADO CON GRAN FUERZA** +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.Combat.SS.Struck=&4Golpeado mediante DIVISOR DE CRANEOS! +Axes.Combat.SS.Length=Duraci\u00f3n de Parte Cr\u00e1neos: &e{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 @@ -53,35 +53,35 @@ Axes.SubSkill.GreaterImpact.Description=Hacer da\u00f1o bonus a los enemigos sin 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.On=&a**PARTE CR\u00c1NEOS ACTIVADO** +Axes.Skills.SS.Refresh=&a\u00a1Tu habilidad &eParte Cr\u00e1neos &aest\u00e1 refrescada! +Axes.Skills.SS.Other.Off=Parte Cr\u00e1neos&a le ha expirado a &e{0} +Axes.Skills.SS.Other.On=&a\u00a1{0}&2 us\u00f3 &cParte Cr\u00e1neos! 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.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.Effect.Length=Duraci\u00f3n de Ultra Taladro Destructor: &e{0}seg Excavation.Listener=Excavaci\u00f3n: Excavation.SkillName=EXCAVACI\u00d3N 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.Skills.GigaDrillBreaker.On=&a**GIGA DRILL BREAKER ACTIVADO** +Excavation.Skills.GigaDrillBreaker.Refresh=&a\u00a1Tu 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\u00a1{0}&2 us\u00f3 &cUltra 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** +Fishing.Ability.Chance=Probabilidad de mordisco: &e{0} +Fishing.Ability.Info=Cazador M\u00e1gico: &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\u00e1gico: &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 @@ -94,23 +94,23 @@ 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\u00f3n 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.Chance=Probabilidad de Pulgar Verde: &e{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.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 @@ -126,20 +126,20 @@ Herbalism.SubSkill.HylianLuck.Name=Suerte de Hylian Herbalism.SubSkill.HylianLuck.Description=Da una peque\u00f1a 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\u00a1Tu habilidad &eTierra Verde &aest\u00e1 refrescada! +Herbalism.Skills.GTe.Other.Off=Tierra Verde&a le ha expirado a &e{0} +Herbalism.Skills.GTe.Other.On=&a\u00a1{0}&2 us\u00f3 &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\u00f3n 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.Ability.Lower=&7**BAJASTE TU PICO** +Mining.Ability.Ready=&a**PREPARAS TU PICO** Mining.SubSkill.SuperBreaker.Name=S\u00faper Destructor (HABILIDAD) Mining.SubSkill.SuperBreaker.Description=Aumento de Velocidad, Probabilidad de Triple Drop Mining.SubSkill.DoubleDrops.Name=Doble Drops @@ -150,22 +150,22 @@ Mining.SubSkill.BiggerBombs.Name=Mayores Bombas Mining.SubSkill.BiggerBombs.Description=Incrementa el radio de la explosi\u00f3n 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.Effect.Decrease=Da\u00f1o de Experto en Demolici\u00f3n Decrementado: &e{0} +Mining.Effect.DropChance=Probabilidad de Doble Drop: &e{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.Skills.SuperBreaker.On=&a**S\u00daPER DESTRUCTOR ACTIVADO** +Mining.Skills.SuperBreaker.Other.Off=S\u00faper Destructor&a le ha expirado a &e{0} +Mining.Skills.SuperBreaker.Other.On=&a\u00a1{0}&2 us\u00f3 &cSuper Destructor! +Mining.Skills.SuperBreaker.Refresh=&a\u00a1Tu habilidad de &eS\u00faper Destructor &aest\u00e1 refrescada! Mining.Skillup=Habilidad de Miner\u00eda incrementada en {0}. Total ({1}) -Mining.Blast.Boom=[[GRAY]]**BOOM** +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! +Mining.Blast.Radius.Increase=Incrementado Radio de Explosi\u00f3n: &e+{0} +Mining.Blast.Rank=Miner\u00eda Explosiva: &e Rango {0}/8 &7({1}) +Mining.Blast.Other.On=&a\u00a1{0}&2 us\u00f3 &cMiner\u00eda Explosiva! +Mining.Blast.Refresh=&a\u00a1Tu habilidad de &eMiner\u00eda Explosiva &aest\u00e1 refrescada! Repair.SubSkill.Repair.Name=Reparaci\u00f3n Repair.SubSkill.Repair.Description=Reparar Herramientas y Armaduras Repair.SubSkill.GoldRepair.Name=Reparar Oro (HABILIDAD {0}+) @@ -183,47 +183,47 @@ Repair.SubSkill.DiamondRepair.Description=Reparar Herramientas y Armaduras de Di Repair.SubSkill.ArcaneForging.Name=Forjado Arcano Repair.SubSkill.ArcaneForging.Description=Reparar objetos m\u00e1gicos 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.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\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.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\u00e1cil. +Repair.Skills.FullDurability=&7Esto est\u00e1 nuevo. +Repair.Skills.SalvageSuccess=&7Objeto recuperado! +Repair.Skills.NotFullDurability=&4 No se puede rescatar los elementos da\u00f1ados. +Repair.Skills.Mastery=Maestr\u00eda de la Reparaci\u00f3n: &e{0} de durabilidad adicional restaurada +Repair.Skills.StackedItems=&4No puedes reparar items apilados. +Repair.Skills.Super.Chance=Probabilidad de Super Reparaci\u00f3n: &e{0} Repair.Skillup=Habilidad de Reparaci\u00f3n 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.Chance.Downgrade=&7Probabilidad de Degradaci\u00f3n en FA: &e{0}% +Repair.Arcane.Chance.Success=&7Tasa de \u00c9xito de FA: &e{0}% Repair.Arcane.Downgrade=El poder Arcano de este objeto ha disminu\u00eddo. 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.Perfect=&aHas logrado mantener las energ\u00edas 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\u00f3n 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\u00a1El 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\u00a1Alcanzado por un contra ataque! +Swords.Combat.Countered=&a**CONTRA-ATACADO** +Swords.Combat.SS.Struck=&4\u00a1Golpeado por ATAQUE DENTADO! Swords.SubSkill.CounterAttack.Name=Contra Ataque Swords.SubSkill.CounterAttack.Description=Refleja {0} del da\u00f1o tomando mientras se bloquea Swords.SubSkill.SerratedStrikes.Name=Ataque Dentado (HABILIDAD) @@ -235,12 +235,12 @@ Swords.SubSkill.Bleed.Description=Aplicar sangrado que da\u00f1a 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\u00a1Tu 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\u00a1{0}&2 us\u00f3 &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\u00f3n 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 @@ -259,16 +259,16 @@ 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.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.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\u00e1pida Taming.SubSkill.FastFoodService.Description=Probabilidad de que los lobos se curen en ataque Taming.SubSkill.HolyHound.Name=Sabueso divino @@ -281,25 +281,25 @@ 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.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.Listener.Wolf=&8T\u00fa lobo se escabulle hacia t\u00ed... 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.Complete=&aInvocaci\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.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.Berserk.Length=Duraci\u00f3n de Enloquecido: &e{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.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\u00d1OS** +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.Disarm.Name=Desarmar (Jugadores) @@ -313,15 +313,15 @@ 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\u00a1{0}&2 us\u00f3 &cEnloquecido! +Unarmed.Skills.Berserk.Refresh=&a\u00a1T\u00fa habilidad &eEnloquecido &aest\u00e1 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\u00f3n de Ca\u00edda de \u00c1rbol: &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 @@ -332,35 +332,35 @@ 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.On=&a**CA\u00cdDA DE \u00c1RBOL ACTIVADA** +Woodcutting.Skills.TreeFeller.Refresh=&a\u00a1Tu habilidad &eCa\u00edda de \u00c1rbol &aest\u00e1 refrescada! +Woodcutting.Skills.TreeFeller.Other.Off=Ca\u00edda de \u00c1rbol&a le ha expirado a &e{0} +Woodcutting.Skills.TreeFeller.Other.On=&a\u00a1{0}&2 us\u00f3 &cCa\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** +Ability.Generic.Refresh=&a**\u00a1HABILIDADES 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\u00f1o (&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\u00e1s confuso. Te sientes mareado. +mcMMO.Description=&3Sobre el proyecto&emcMMO&3:,&6mcMMO es un mod RPG de[[RED]codigo 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\u00f3lo para Admins &cdesactivado +Commands.AdminChat.On=Chat s\u00f3lo para Admins &aactivado Commands.AdminToggle=- Alternar chat de admin Commands.Chat.Console=*Consola* Commands.Disabled=Este comando est\u00e1 deshabilitado. @@ -368,87 +368,87 @@ Commands.DoesNotExist=\u00a1El 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\u00f3n detallada del jugador +Commands.Party.Invite.Accepted=&aInvitaci\u00f3n Aceptada. Te uniste al grupo {0} +Commands.Invite.Success=&aInvitaci\u00f3n 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.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\u00f3n 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.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[[ITALIC]]{0} +Commands.Party.MembersNear=&8CERCA DE TI &3{0}&8/&3{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.Chat.Off=S\u00f3lo chat de grupo &cdesactivado +Commands.Party.Chat.On=S\u00f3lo chat de grupo &cactivado +Commands.Party.Commands=&a--COMANDOS DEL GRUPO-- +Commands.Party.Invite.0=ATENCI\u00d3N: &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=[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.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=\u00a1Fuiste expulsado del grupo {0}! Commands.Party.Leave=Abandonaste el grupo -Commands.Party.Members.Header=-----[][[GREEN]]MIEMBROS[[RED]][]----- +Commands.Party.Members.Header=-----[]&aMIEMBROS&c[]----- Commands.Party.None=No est\u00e1s 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.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.PowerLevel.Leaderboard=--mcMMO-- Tabla de L\u00edderes: &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=[GREEN]]Tu {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.Leaderboard=--mcMMO-- Tabla de L\u00edderes: &9{0} Commands.SkillInfo=- Ver informacion detallada sobre habilidades Commands.Stats.Self=TUS ESTAD\u00cdSTICAS Commands.Stats=- Ver tus estad\u00edsticas de mcMMO @@ -468,54 +468,54 @@ 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\u00e1 mostrada aqu\u00ed. 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\u00f1a, 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\u00e1lido. 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.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\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.Password.Set=&aContrase\u00f1a del grupo establecida: &c{0} +Party.Password.Removed=&aLa 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.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\u00f3 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\u00e1 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 @@ -541,88 +541,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\u00d3N 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\u00a1EL EVENTO DE EXP DE mcMMO HA COMENZADO! +Commands.xprate.started.1=&6\u00a1mcMMO est\u00e1 ahora en un evento de EXP! \u00a1El ratio de EXP es x{0}! +XPRate.Event=&6\u00a1mcMMO est\u00e1 ahora en un evento de rate de EXP! \u00a1El 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.OfflineStats=Estad\u00edsticas de mcMMO para el Jugador Desconectado &e{0} +Inspect.Stats=&aEstad\u00edsticas de mcMMO para &e{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!** 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\u00e9s 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\u00a1Has sido desarmado! +Skills.Header=-----[]&a{0}&c[]----- +Skills.NeedMore=&4Necesitas m\u00e1s Skills.Parents=PADRES -Skills.Stats={0}[[GREEN]]{1}[[DARK_AQUA]] EXP([[GRAY]]{2}[[DARK_AQUA]]/[[GRAY]]{3}[[DARK_AQUA]]) +Skills.Stats={0}&a{1}&3 EXP(&7{2}&3/&7{3}&3) Skills.TooTired=Est\u00e1s 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\u00d3N=- +Stats.Header.Misc=&6-=HABILIDADES VARIAS=- +Stats.Own.Stats=&a[mcMMO] Estad\u00edsticas 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.Lucky.Bonus=&6 ({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.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.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=[GOLD]][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,7 +631,7 @@ 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 diff --git a/src/main/resources/locale/locale_fi.properties b/src/main/resources/locale/locale_fi.properties index 461bbf5d9..d322781f7 100644 --- a/src/main/resources/locale/locale_fi.properties +++ b/src/main/resources/locale/locale_fi.properties @@ -1,5 +1,5 @@ -Acrobatics.Ability.Proc=[[GREEN]]**Sulava Laskeutuminen** -Acrobatics.Combat.Proc=[[GREEN]]**V\u00e4ist\u00f6liike** +Acrobatics.Ability.Proc=&a**Sulava Laskeutuminen** +Acrobatics.Combat.Proc=&a**V\u00e4ist\u00f6liike** Acrobatics.Listener=Akrobatia: Acrobatics.SkillName=AKROBATIA Acrobatics.Skillup=Akrobatian taito nousi {0} tasolla. Kokonaism\u00e4\u00e4r\u00e4 ({1}) @@ -7,13 +7,13 @@ 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 @@ -23,40 +23,40 @@ Axes.SubSkill.GreaterImpact.Name=Suurempi osumisvoima Axes.SubSkill.GreaterImpact.Description=Tee enemm\u00e4n 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.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\u00e4ytt\u00e4nyt &c 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.Ability.Lower=&7**LASKET LAPIOSI ALAS** +Excavation.Ability.Ready=&a**KOHOTAT LAPIOSI** Excavation.SubSkill.TreasureHunter.Name=Aarteenmets\u00e4st\u00e4j\u00e4 Excavation.Listener=Kaivuu: Excavation.SkillName=KAIVANTO -Excavation.Skills.GigaDrillBreaker.On=[[GREEN]]**TEHO PORA HAJOITUS AKTIVOITU** +Excavation.Skills.GigaDrillBreaker.On=&a**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) 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** +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\u00c4\u00c4N 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.Skills.SuperBreaker.Other.Off=Tehostettu hajoitus&a kului loppuun ajaksi &e{0} +Mining.Skills.SuperBreaker.Refresh=&aSinun [[YELLOW]Superrikkomis &a-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.Blast.Boom=&7**BOOM** +Mining.Blast.Radius.Increase=R\u00e4j\u00e4ytys Et\u00e4isyys Nousi: &e+{0} +Mining.Blast.Refresh=&aSinun [[YELLOW] R\u00e4j\u00e4ht\u00e4v\u00e4 Kaivuu &a-kyky on uudelleenlatautunut! Repair.SubSkill.Repair.Name=Korjaus Repair.SubSkill.RepairMastery.Name=Korjaus Mestaruus Repair.SubSkill.RepairMastery.Description=Korotettu korjaus taso @@ -66,33 +66,33 @@ Repair.SubSkill.DiamondRepair.Name=Timantti Korjaus ({0}+ TAITO) Repair.SubSkill.DiamondRepair.Description=Korjaa Timantti ty\u00f6kaluja & 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.Listener.Anvil=&4Olet asettanut alasimen paikalleen, voit korjata ty\u00f6kalusi ja haarniskasi sill\u00e4. 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.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\u00e4. -Repair.Skills.FeltEasy=[[GRAY]]Seh\u00e4n tuntui helpolta. -Repair.Skills.StackedItems=[[DARK_RED]]Et voi korjata p\u00e4\u00e4llekk\u00e4isi\u00e4 tavaroita. +Repair.Skills.FeltEasy=&7Seh\u00e4n tuntui helpolta. +Repair.Skills.StackedItems=&4Et 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.Chance.Downgrade=&7Mystisen Korjauksen huononnus mahdollisuus: &e{0}% +Repair.Arcane.Chance.Success=&7Mystisen Taonnan Onnistumisprosentti: &e{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! +Swords.Ability.Lower=&7**LASKIT MIEKKASI** +Swords.Ability.Ready=&a**VALMISTAUDUT ISKEM\u00c4\u00c4N 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 +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\u00e4ytt\u00e4nyt &cSahalaita iskua! +Swords.SS.Length=Sahalaitaisten Iskujen kesto: &e{0}s Taming.Ability.Bonus.1=Sudet v\u00e4ltt\u00e4v\u00e4t vaaraa Taming.Ability.Bonus.2=Paksu Turkki Taming.Ability.Bonus.6=Teroitetut Kynnet @@ -103,74 +103,74 @@ Taming.SubSkill.CallOfTheWild.Description=Kutsu el\u00e4in 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.Wolf=&8Sutesi 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 +Taming.Summon.Complete=&aKutsuminen valmis +Unarmed.Ability.Berserk.Length=Sekop\u00e4\u00e4n Pituus: &e{0}s Unarmed.Ability.Bonus.0=Rautak\u00e4sityyli 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\u00e4\u00e4&a kului loppuun ajaksi &e{0} +Unarmed.Skills.Berserk.Other.On=&a{0}&2 on k\u00e4ytt\u00e4nyt &cberserkki\u00e4! Woodcutting.Ability.0=Lehtipuhallin Woodcutting.Ability.1=Puhaltaa lehti\u00e4 pois -Woodcutting.Ability.Length=Puunkaatajan kesto: [[YELLOW]]{0}s +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.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\u00e4ytt\u00e4nyt &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** +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 +Combat.TargetDazed=Kohde &4tyrm\u00e4tty +Combat.TouchedFuzzy=&4T\u00f6kk\u00e4sit P\u00f6rr\u00f6\u00e4. Tunsit huimauksen. +Commands.AdminChat.Off=Ainoastaan Yll\u00e4pit\u00e4jien keskustelu &cpois p\u00e4\u00e4lt\u00e4 Commands.AdminToggle=Kytke adminchat p\u00e4\u00e4lle/pois Commands.Disabled=T\u00e4m\u00e4 komento ei ole k\u00e4ytett\u00e4viss\u00e4. 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\u00e4ksytty. Liityit ryhm\u00e4\u00e4n {0} +Commands.Invite.Success=&aKutsu l\u00e4hetettiin onnistuneesti. +Commands.mmoedit=[player] &c - Muokkaa kohdetta Commands.NoConsole=This command does not support console usage. -Commands.Other=[[GREEN]]--MUUT KOMENNOT-- +Commands.Other=&a--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.Commands=&a--RYHM\u00c4KOMENNOT-- +Commands.Party.Invite.0=HUOMIO: &aSait 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.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\u00e4ytt\u00e4\u00e4 jotain taitoa, sit\u00e4 ei n\u00e4ytet\u00e4 t\u00e4ss\u00e4. 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.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 @@ -179,24 +179,24 @@ 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=&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 \u00e4skett\u00e4in 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 738a2c2e7..7732d69f0 100644 --- a/src/main/resources/locale/locale_fr.properties +++ b/src/main/resources/locale/locale_fr.properties @@ -13,7 +13,7 @@ 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=[[GOLD]]Lucky Perks +JSON.JWrapper.Perks.Header=&6Lucky Perks JSON.JWrapper.Perks.Lucky={0}% de chance suppl\u00e9mentaire JSON.Hover.Tips=Conseils JSON.Acrobatics=Acrobatie @@ -36,53 +36,53 @@ 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=[[GOLD]][ mcMMO[[YELLOW]] @[[DARK_AQUA]]{0} [[GOLD]]Grade [[DARK_AQUA]]{1}[[GOLD]] D\u00e9bloqu\u00e9! ] +JSON.SkillUnlockMessage=&6[ mcMMO&e @&3{0} &6Grade &3{1}&6 D\u00e9bloqu\u00e9! ] JSON.Hover.Rank=&e&lGrade:&r &f{0} JSON.Hover.NextRank=&7&oProchaine am\u00e9lioration 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=[[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=Si vous \u00eates accroupi lorsque vous tombez, vous \u00e9viterez de prendre des d\u00e9g\u00e2ts ! -Anvil.SingleItemStack=[[RED]]Vous ne pouvas pas r\u00e9cup\u00e9rer ou r\u00e9parer un item plus d\'un item \u00e0 la fois, d\u00e9stackez le d\'abord. +Anvil.SingleItemStack=&cVous ne pouvas pas r\u00e9cup\u00e9rer ou r\u00e9parer un item plus d\'un item \u00e0 la fois, d\u00e9stackez 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=[[GOLD]]([[GREEN]]mcMMO[[GOLD]]) [[GRAY]]{0} +mcMMO.Template.Prefix=&6(&amcMMO&6) &7{0} # BEGIN STYLING -Ability.Generic.Refresh=[[GREEN]]**ABILIT\u00c9S RECHARG\u00c9!** -Ability.Generic.Template.Lock=[[GRAY]]{0} +Ability.Generic.Refresh=&a**ABILIT\u00c9S RECHARG\u00c9!** +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=Sous-capacit\u00e9 -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=Statistiques -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 - R\u00e9visions [[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 - R\u00e9visions &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=Acrobatie Overhaul.Name.Alchemy=Alchemie Overhaul.Name.Archery=Archerie @@ -99,46 +99,46 @@ Overhaul.Name.Taming=Apprivoisement Overhaul.Name.Unarmed=Poings Overhaul.Name.Woodcutting=B\u00fbcheronnage # style pour les commandes /mcMMO -Commands.mcc.Header=[[RED]]---[][[GREEN]]mcMMO Commandes[[RED]][]--- -Commands.Other=[[RED]]---[][[GREEN]]COMMANDES SP\u00c9CIALES[[RED]][]--- -Commands.Party.Header=[[RED]]-----[][[GREEN]]PARTIE[[RED]][]----- -Commands.Party.Features.Header=[[RED]]-----[][[GREEN]]FONCTIONNALIT\u00c9S[[RED]][]----- +Commands.mcc.Header=&c---[]&amcMMO Commandes&c[]--- +Commands.Other=&c---[]&aCOMMANDES SP\u00c9CIALES&c[]--- +Commands.Party.Header=&c-----[]&aPARTIE&c[]----- +Commands.Party.Features.Header=&c-----[]&aFONCTIONNALIT\u00c9S&c[]----- # XP BAR accepte les variables -- {0} Niveau de comp\u00e9tence, {1} XP actuelle, {2} XP n\u00e9cessaire pour le niveau suivant, {3} Niveau de puissance, {4} Pourcentage du niveau # Soyez s\u00fbr d\'avoir activ\u00e9 Experience_Bars.ThisMayCauseLag.AlwaysUpdateTitlesWhenXPIsGained si vous voulez la barre d\'XP \u00e0 chaque fois que le joueur en gagne ! XPBar.Template={0} -XPBar.Template.EarlyGameBoost=[[GOLD]]Apprentissage d\'une nouvelle comp\u00e9tence ... -XPBar.Acrobatics=Acrobatiques Lv.[[GOLD]]{0} -XPBar.Alchemy=Alchemie Lv.[[GOLD]]{0} -XPBar.Archery=Archerie Lv.[[GOLD]]{0} -XPBar.Axes=Haches Lv.[[GOLD]]{0} -XPBar.Excavation=Fouille Lv.[[GOLD]]{0} -XPBar.Fishing=P\u00eache Lv.[[GOLD]]{0} -XPBar.Herbalism=Herboristerie Lv.[[GOLD]]{0} -XPBar.Mining=Minage Lv.[[GOLD]]{0} -XPBar.Repair=R\u00e9paration Lv.[[GOLD]]{0} -XPBar.Salvage=R\u00e9cup\u00e9ration Lv.[[GOLD]]{0} -XPBar.Smelting=Fonte Lv.[[GOLD]]{0} -XPBar.Swords=\u00c9p\u00e9e Lv.[[GOLD]]{0} -XPBar.Taming=Apprivoisement Lv.[[GOLD]]{0} -XPBar.Unarmed=Poings Lv.[[GOLD]]{0} -XPBar.Woodcutting=B\u00fbcheronnage Lv.[[GOLD]]{0} +XPBar.Template.EarlyGameBoost=&6Apprentissage d\'une nouvelle comp\u00e9tence ... +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\u00eache Lv.&6{0} +XPBar.Herbalism=Herboristerie Lv.&6{0} +XPBar.Mining=Minage Lv.&6{0} +XPBar.Repair=R\u00e9paration Lv.&6{0} +XPBar.Salvage=R\u00e9cup\u00e9ration Lv.&6{0} +XPBar.Smelting=Fonte Lv.&6{0} +XPBar.Swords=\u00c9p\u00e9e Lv.&6{0} +XPBar.Taming=Apprivoisement Lv.&6{0} +XPBar.Unarmed=Poings Lv.&6{0} +XPBar.Woodcutting=B\u00fbcheronnage Lv.&6{0} # Ceci n\'est qu\'un exemple qui peut \u00eatre utilis\u00e9 quand l\'option 'ExtraDetails' dans experience.yml est activ\u00e9 (d\u00e9sactiv\u00e9 par d\u00e9faut), vous pouvez l\'ignor\u00e9 et juste modifier le message au dessus -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 accepte les variables -- {0} Niveau de comp\u00e9tence, {1} XP actuelle, {2} XP n\u00e9cessaire pour le niveau suivant, {3} Niveau de puissance, {4} Pourcentage du niveau # Soyez s\u00fbr d\'avoir activ\u00e9 Experience_Bars.ThisMayCauseLag.AlwaysUpdateTitlesWhenXPIsGained si vous voulez la barre d\'XP \u00e0 chaque fois que le joueur en gagne ! # FIN DE LA CONFIG DU STYLE #ACROBATIES -Acrobatics.Ability.Proc=[[GREEN]]**Atterrissage gracieux** -Acrobatics.Combat.Proc=[[GREEN]]**Esquiv\u00e9** -Acrobatics.SubSkill.Roll.Stats=[[GOLD]]Roll Chance [[YELLOW]]{0}%[[GOLD]] Graceful Roll Chance[[YELLOW]] {1}% +Acrobatics.Ability.Proc=&a**Atterrissage gracieux** +Acrobatics.Combat.Proc=&a**Esquiv\u00e9** +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.Chance=Chance d\'une roulade: [[YELLOW]]{0} -Acrobatics.SubSkill.Roll.GraceChance=Chance d\'une roulade gracieuse: [[YELLOW]]{0} -Acrobatics.SubSkill.Roll.Mechanics=[[GRAY]]La roulade est une sous-capacit\u00e9 avec une partie passive.\nLorsque vous prenez des d\u00e9g\u00e2ts de ch\u00fbtes, vous avez une chance de ne rien prendre, en fonction de votre niveau de comp\u00e9tence. Au niveau 50, vous avez [[YELLOW]]{0}%[[GRAY]] de chance de ne pas prendre de d\u00e9g\u00e2ts, et [[YELLOW]]{1}%[[GRAY]] si vous activ\u00e9 la roulade gracieuse.\nLa chance pour la r\u00e9ussite est calcul\u00e9 gr\u00e2ce \u00e0 votre niveau de comp\u00e9tence, avec une courbe lin\u00e9aire jusqu\'au niveau [[YELLOW]]{2}[[GRAY]] son maximum. Tous les niveaux d\'acrobaties vous donnent [[YELLOW]]{3}%[[GRAY]] de chance de succ\u00e8s.\nEn s'accroupissant, vous pouvez doubler votre chance de ne pas prendre les d\u00e9g\u00e2ts de ch\u00fbte ! En sneakant, vous transformerez une roulade normal en une roulade gracieuse.\nUne roulade emp\u00eache jusqu\'\u00e0 [[RED]]{4}[[GRAY]] d\u00e9g\u00e2ts. Une roulade gracieuse en emp\u00eache jusqu\'\u00e0 [[GREEN]]{5}[[GRAY]]. +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\u00e9 avec une partie passive.\nLorsque vous prenez des d\u00e9g\u00e2ts de ch\u00fbtes, vous avez une chance de ne rien prendre, en fonction de votre niveau de comp\u00e9tence. Au niveau 50, vous avez &e{0}%&7 de chance de ne pas prendre de d\u00e9g\u00e2ts, et &e{1}%&7 si vous activ\u00e9 la roulade gracieuse.\nLa chance pour la r\u00e9ussite est calcul\u00e9 gr\u00e2ce \u00e0 votre niveau de comp\u00e9tence, avec une courbe lin\u00e9aire jusqu\'au niveau &e{2}&7 son maximum. Tous les niveaux d\'acrobaties vous donnent &e{3}%&7 de chance de succ\u00e8s.\nEn s'accroupissant, vous pouvez doubler votre chance de ne pas prendre les d\u00e9g\u00e2ts de ch\u00fbte ! En sneakant, vous transformerez une roulade normal en une roulade gracieuse.\nUne roulade emp\u00eache jusqu\'\u00e0 &c{4}&7 d\u00e9g\u00e2ts. Une roulade gracieuse en emp\u00eache jusqu\'\u00e0 &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 @@ -153,8 +153,8 @@ Alchemy.SubSkill.Catalysis.Description=Augmente la vitesse de confection des pot 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.SubSkill.Concoctions.Stat=Classement des confectionneurs de potions: [[YELLOW]]{0}/{1} -Alchemy.SubSkill.Concoctions.Stat.Extra=Ingr\u00e9dients [[[YELLOW]]{0}[[RED]]]: [[YELLOW]]{1} +Alchemy.SubSkill.Concoctions.Stat=Classement des confectionneurs de potions: &e{0}/{1} +Alchemy.SubSkill.Concoctions.Stat.Extra=Ingr\u00e9dients [&e{0}&c]: &e{1} Alchemy.Listener=Alchemie: Alchemy.Ability.Locked.0=Bloqu\u00e9 jusqu\'\u00e0 {0}+ niveaux de talent (CATALYSE) Alchemy.SkillName=ALCHIMIE @@ -182,13 +182,13 @@ Axes.Ability.Bonus.2=Impact d\'armure Axes.Ability.Bonus.3=Inflige {0} de d\u00e9g\u00e2ts \u00e0 l\'armure Axes.Ability.Bonus.4=Impact puissant Axes.Ability.Bonus.5=Inflige {0} de d\u00e9g\u00e2ts en plus aux ennemis sans armure -Axes.Ability.Lower=[[GRAY]]**VOUS ABAISSEZ VOTRE HACHE** -Axes.Ability.Ready=[[GREEN]]**VOUS LEVEZ VOTRE HACHE** -Axes.Combat.CritStruck=[[DARK_RED]]Vous avez re\u00e7u un coup critique ! +Axes.Ability.Lower=&7**VOUS ABAISSEZ VOTRE HACHE** +Axes.Ability.Ready=&a**VOUS LEVEZ VOTRE HACHE** +Axes.Combat.CritStruck=&4Vous avez re\u00e7u un coup critique ! Axes.Combat.CriticalHit=COUP CRITIQUE ! -Axes.Combat.GI.Proc=[[GREEN]]**FRAPP\u00c9 D\'UNE VIOLENTE INOU\u00cfE** +Axes.Combat.GI.Proc=&a**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.Struck=&4Bloqu\u00e9 par TRANCHE-CR\u00c2NE ! Axes.SubSkill.SkullSplitter.Name=Tranche-cr\u00e2ne (Comp\u00e9tence) Axes.SubSkill.SkullSplitter.Description=Inflige des d\u00e9g\u00e2ts de zone Axes.SubSkill.SkullSplitter.Stat=Dur\u00e9e du tranche-cr\u00e2ne @@ -207,13 +207,13 @@ Axes.SubSkill.GreaterImpact.Description=Inflige des d\u00e9g\u00e2ts bonus aux e 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.Skills.SS.On=&a**TRANCHE-CR\u00c2NE ACTIV\u00c9** +Axes.Skills.SS.Refresh=&aVotre comp\u00e9tence &eTranche-cr\u00e2ne &aest pr\u00eate ! +Axes.Skills.SS.Other.Off=Tranche-cr\u00e2ne&a s\'est termin\u00e9 pour &e{0} +Axes.Skills.SS.Other.On=&a{0}&2 a utilis\u00e9 &cTranche-cr\u00e2ne ! #FOUILLE -Excavation.Ability.Lower=[[GRAY]]**VOUS ABAISSEZ VOTRE PELLE** -Excavation.Ability.Ready=[[GREEN]]**VOUS LEVEZ VOTRE PELLE** +Excavation.Ability.Lower=&7**VOUS ABAISSEZ VOTRE PELLE** +Excavation.Ability.Ready=&a**VOUS LEVEZ VOTRE PELLE** Excavation.SubSkill.GigaDrillBreaker.Name=Foreur (Comp\u00e9tence) Excavation.SubSkill.GigaDrillBreaker.Description=Drops x3, XP x3, plus rapide Excavation.SubSkill.GigaDrillBreaker.Stat=Dur\u00e9e du foreur @@ -224,23 +224,23 @@ Excavation.SubSkill.Archaeology.Stat.Extra=Quantit\u00e9 d\'exp\u00e9rience arch Excavation.Listener=Fouille: Excavation.SkillName=FOUILLE 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.Skills.GigaDrillBreaker.On=&a**FOREUR ACTIV\u00c9** +Excavation.Skills.GigaDrillBreaker.Refresh=&aVotre comp\u00e9tence &eForeur &aest pr\u00eate ! +Excavation.Skills.GigaDrillBreaker.Other.Off=Foreur&a est termin\u00e9 pour &e{0} +Excavation.Skills.GigaDrillBreaker.Other.On=&a{0}&2 a utilis\u00e9 &cForeur ! #PÊCHE -Fishing.ScarcityTip=[[YELLOW]]&oCette zone a souffert d\'une surexploitation ... Utilisez votre canne \u00e0 p\u00e2che autre part, \u00e0 au moins {0} blocs de distance. -Fishing.Scared=[[GRAY]]&oDes mouvements chaotique effrait les poissons ! -Fishing.Exhausting=[[RED]]&oUne mauvaise utilisation de la canne \u00e0 p\u00eache vous fatigue et use la canne ! -Fishing.LowResourcesTip=[[GRAY]]Vous sentez qu\'il n\'y a plus beaucoup de poisson par ici. Allez essayez {0} blocs plus loin. -Fishing.Ability.Info=P\u00eache magique : [[GRAY]] **S\'am\u00e9liore via Chasseur de tr\u00e9sors** +Fishing.ScarcityTip=&e&oCette zone a souffert d\'une surexploitation ... Utilisez votre canne \u00e0 p\u00e2che autre part, \u00e0 au moins {0} blocs de distance. +Fishing.Scared=&7&oDes mouvements chaotique effrait les poissons ! +Fishing.Exhausting=&c&oUne mauvaise utilisation de la canne \u00e0 p\u00eache vous fatigue et use la canne ! +Fishing.LowResourcesTip=&7Vous sentez qu\'il n\'y a plus beaucoup de poisson par ici. Allez essayez {0} blocs plus loin. +Fishing.Ability.Info=P\u00eache magique : &7 **S\'am\u00e9liore via Chasseur de tr\u00e9sors** Fishing.Ability.Locked.0=BLOCKE JUSQU\'A {0}+ COMPETENCE (SHAKE) Fishing.Ability.Locked.1=Bloqu\u00e9 jusqu\'\u00e0 {0}+ niveaux de talent (PECHEUR SUR GLACE) Fishing.Ability.Locked.2=Bloqu\u00e9 jusqu\'\u00e0 {0}+ niveau(x) (Ma\u00eetre P\u00eacheur) Fishing.SubSkill.TreasureHunter.Name=Chasseur de tr\u00e9sors Fishing.SubSkill.TreasureHunter.Description=Remonte des objets inhabituels -Fishing.SubSkill.TreasureHunter.Stat=Grade de chasseur de tr\u00e9sor: [[GREEN]]{0}[[DARK_AQUA]]/[[GREEN]]{1} -Fishing.SubSkill.TreasureHunter.Stat.Extra=Ratio de drop: [[GRAY]]Commun: [[YELLOW]]{0} [[GREEN]]Non-commun: [[YELLOW]]{1}\n[[BLUE]]Rare: [[YELLOW]]{2} [[LIGHT_PURPLE]]Epique: [[YELLOW]]{3} [[GOLD]]Legendaire: [[YELLOW]]{4} [[AQUA]]Record: [[YELLOW]]{5} +Fishing.SubSkill.TreasureHunter.Stat=Grade de chasseur de tr\u00e9sor: &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} &bRecord: &e{5} Fishing.SubSkill.MagicHunter.Name=P\u00eache magique Fishing.SubSkill.MagicHunter.Description=Remonte des objets magiques Fishing.SubSkill.MagicHunter.Stat=Chance du chasseur de tr\u00e9sor @@ -249,25 +249,25 @@ Fishing.SubSkill.Shake.Description=Fait tomber des objets des monstres avec une Fishing.SubSkill.Shake.Stat=Chance d\'esquive Fishing.SubSkill.FishermansDiet.Name=R\u00e9gime de fermier Fishing.SubSkill.FishermansDiet.Description=Am\u00e9liore la nutrition des produits de la ferme -Fishing.SubSkill.FishermansDiet.Stat=R\u00e9gime de fermier:[[GREEN]] Grade {0} +Fishing.SubSkill.FishermansDiet.Stat=R\u00e9gime de fermier:&a Grade {0} 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.MasterAngler.Stat=Plus de chance de mordre ou vous \u00eates: [[GREEN]]+{0} +Fishing.SubSkill.MasterAngler.Stat=Plus de chance de mordre ou vous \u00eates: &a+{0} Fishing.SubSkill.IceFishing.Name=P\u00eache sur Glace Fishing.SubSkill.IceFishing.Description=Vous permet de p\u00eacher dans les biomes glac\u00e9s Fishing.SubSkill.IceFishing.Stat=P\u00eache sur Glace -Fishing.Chance.Raining=[[BLUE]] Bonus de pluie +Fishing.Chance.Raining=&9 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.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\u00caCHE #HERBORISTERIE Herbalism.Ability.GTe.NeedMore=Vous avez besoin de plus de graines pour r\u00e9pandre la terre verte Herbalism.Ability.GTh.Fail=**MAINS VERTES \u00c9CHOU\u00c9ES** -Herbalism.Ability.GTh=[[GREEN]]**DOIGTS VERTS** -Herbalism.Ability.Lower=[[GRAY]]**VOUS ABAISSEZ VOTRE HOUE** -Herbalism.Ability.Ready=[[GREEN]]**VOUS LEVEZ VOTRE HOUE** +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 \u00c9CHOU\u00c9** Herbalism.SubSkill.GreenTerra.Name=Main verte (Comp\u00e9tence) Herbalism.SubSkill.GreenTerra.Description=Propage les plantes / triple drops @@ -275,12 +275,12 @@ Herbalism.SubSkill.GreenTerra.Stat=Dur\u00e9e de la main verte Herbalism.SubSkill.GreenThumb.Name=Mains Vertes (Bl\u00e9) Herbalism.SubSkill.GreenThumb.Description=Plantation automatique apres recolte du champ Herbalism.SubSkill.GreenThumb.Stat=Chance de plantation automatique apr\u00e8s r\u00e9colte -Herbalism.SubSkill.GreenThumb.Stat.Extra=Plantation automatique: [[GREEN]] Graîne pousse au niveau {0} +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.Stat=R\u00e9gime de fermier: [[GREEN]]Grade {0} +Herbalism.SubSkill.FarmersDiet.Stat=R\u00e9gime de fermier: &aGrade {0} Herbalism.SubSkill.DoubleDrops.Name=Double drops Herbalism.SubSkill.DoubleDrops.Description=Double la quantit\u00e9 r\u00e9colt\u00e9e Herbalism.SubSkill.DoubleDrops.Stat=Chance de double drop @@ -290,20 +290,20 @@ Herbalism.SubSkill.HylianLuck.Stat=Chance d\'Hylian Herbalism.SubSkill.ShroomThumb.Name=Doigts \u00e0 Champignons Herbalism.SubSkill.ShroomThumb.Description=Etend le mycelium sur la terre et l\'herbe Herbalism.SubSkill.ShroomThumb.Stat=Chance extension du mycelium -Herbalism.HylianLuck=[[GREEN]]la chance d\'Hyrule est avec vous aujourd\'hui ! +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.Skills.GTe.On=&a**MAIN VERTE ACTIV\u00c9** +Herbalism.Skills.GTe.Refresh=&aVotre comp\u00e9tence &eMain verte &aest pr\u00eate ! +Herbalism.Skills.GTe.Other.Off=Main verte&a est termin\u00e9 pour &e{0} +Herbalism.Skills.GTe.Other.On=&a{0}&2 a utilis\u00e9 &cMain verte ! #MINAGE 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.Ability.Lower=&7**VOUS ABAISSEZ VOTRE PIOCHE** +Mining.Ability.Ready=&a**VOUS LEVEZ VOTRE PIOCHE** Mining.SubSkill.SuperBreaker.Name=Broyeur (Comp\u00e9tence) Mining.SubSkill.SuperBreaker.Description=Plus rapide, chance de triple drops Mining.SubSkill.SuperBreaker.Stat=Puissance du broyeur @@ -312,8 +312,8 @@ Mining.SubSkill.DoubleDrops.Description=Double la quantit\u00e9 r\u00e9colt\u00e 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.Stat=Minage explosif:[[GREEN]] Grade {0}/{1} [[GRAY]]({2}) -Mining.SubSkill.BlastMining.Stat.Extra=Rayon du minage explosif: [[GREEN]]+{0} +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 @@ -323,16 +323,16 @@ Mining.SubSkill.DemolitionsExpertise.Stat=Baisse des d\u00e9g\u00e2ts de destruc 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.Skills.SuperBreaker.On=&a**BROYEUR ACTIV\u00c9** +Mining.Skills.SuperBreaker.Other.Off=Broyeur&a est termin\u00e9 pour &e{0} +Mining.Skills.SuperBreaker.Other.On=&a{0}&2 a utilis\u00e9 &cBroyeur ! +Mining.Skills.SuperBreaker.Refresh=&aVotre comp\u00e9tence &eBroyeur &aest pr\u00eate ! # MINAGE EXPLOSIF -Mining.Blast.Boom=[[GRAY]]**BOUM** +Mining.Blast.Boom=&7**BOUM** Mining.Blast.Cooldown= Mining.Blast.Effect=+{0} de r\u00e9colte des minerais, {1}x les r\u00e9compenses -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 ! +Mining.Blast.Other.On=&a{0}&2 a utilis\u00e9 &cMinage explosif ! +Mining.Blast.Refresh=&aVotre capacit\u00e9 &eMinage Explosif&a est pr\u00eate ! # R\u00c9PARATION Repair.SubSkill.Repair.Name=R\u00e9paration Repair.SubSkill.Repair.Description=R\u00e9parer Outils & Armures @@ -344,7 +344,7 @@ 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.RepairMastery.Stat=Repair Mastery: [[GREEN]]Extra {0} durability restored +Repair.SubSkill.RepairMastery.Stat=Repair Mastery: &aExtra {0} durability restored Repair.SubSkill.SuperRepair.Name=Superbe r\u00e9paration Repair.SubSkill.SuperRepair.Description=Double l\'efficacit\u00e9 Repair.SubSkill.SuperRepair.Stat=Super Repair Chance @@ -352,65 +352,65 @@ Repair.SubSkill.DiamondRepair.Name=R\u00e9paration du diamant (talent {0}+) Repair.SubSkill.DiamondRepair.Description=R\u00e9pare les outils et armures en diamant Repair.SubSkill.ArcaneForging.Name=Forge arcanique Repair.SubSkill.ArcaneForging.Description=R\u00e9pare les objets magiques -Repair.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 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.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\u00e9 une erreur en essayant de r\u00e9parer cet objet ! +Repair.Listener.Anvil=&4Vous venez de poser une enclume, elle peut \u00eatre utilis\u00e9e pour r\u00e9parer votre \u00e9quipement. 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.StackedItems=[[DARK_RED]]Vous ne pouvez pas r\u00e9parer les objets empil\u00e9s. +Repair.Skills.AdeptDiamond=&4Vous n\'\u00eates pas suffisamment comp\u00e9tent pour r\u00e9parer le diamant. +Repair.Skills.AdeptGold=&4Vous n\'\u00eates pas suffisamment comp\u00e9tent pour r\u00e9parer l\'or. +Repair.Skills.AdeptIron=&4Vous n\'\u00eates pas suffisamment comp\u00e9tent pour r\u00e9parer le fer. +Repair.Skills.AdeptStone=&4Vous n\'\u00eates pas suffisamment comp\u00e9tent pour r\u00e9parer la pierre. +Repair.Skills.Adept=Vous devez avoir le niveau &e{0}&c pour pouvoir r\u00e9parer &e{1} +Repair.Skills.FeltEasy=&7Plut\u00f4t facile. +Repair.Skills.FullDurability=&7C\'est d\u00e9j\u00e0 r\u00e9par\u00e9. +Repair.Skills.StackedItems=&4Vous ne pouvez pas r\u00e9parer les objets empil\u00e9s. Repair.Pretty.Name=R\u00e9paration # Force arcanique 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.Perfect=&aVous avez pr\u00e9serv\u00e9 les \u00e9nergies arcaniques de cet objet. # RECYCLAGE Salvage.Pretty.Name=Recyclage Salvage.SubSkill.UnderstandingTheArt.Name=Compr\u00e9hension de l\'art Salvage.SubSkill.UnderstandingTheArt.Description=Vous n\'\u00eates pas juste en train de miner \u00e0 travers la poubelle de votre voisin, vous prenez soin de l\'environment.\nRenforce la r\u00e9cup\u00e9ration. Salvage.SubSkill.ScrapCollector.Name=Collection de fragment Salvage.SubSkill.ScrapCollector.Description=R\u00e9cup\u00e9ration de materiel depuis un item, une r\u00e9cup\u00e9ration parfaite en accord avec vos comp\u00e9tences et votre chance. -Salvage.SubSkill.ScrapCollector.Stat=Collection de fragment: [[GREEN]]R\u00e9cup\u00e9ration de [[YELLOW]]{0}[[GREEN]] items. Un peu de chance y est impliqu\u00e9. +Salvage.SubSkill.ScrapCollector.Stat=Collection de fragment: &aR\u00e9cup\u00e9ration de &e{0}&a items. Un peu de chance y est impliqu\u00e9. Salvage.SubSkill.ArcaneSalvage.Name=Recyclage Arcanique Salvage.SubSkill.ArcaneSalvage.Description=Extrait les enchantements des objets -Salvage.SubSkill.ArcaneSalvage.Stat=Recyclage Arcanique: [[YELLOW]]Grade {0}/{1} +Salvage.SubSkill.ArcaneSalvage.Stat=Recyclage Arcanique: &eGrade {0}/{1} Salvage.Ability.Bonus.0=Recyclage Avanc\u00e9 Salvage.Ability.Bonus.1=Rendement maximal {0} objet(s) d\u00e9truit(s) -Salvage.Arcane.ExtractFull=[[GRAY]]AS Full-Enchant Chance -Salvage.Arcane.ExtractPartial=[[GRAY]]AS Partial-Enchant Chance -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.Arcane.ExtractFull=&7AS Full-Enchant Chance +Salvage.Arcane.ExtractPartial=&7AS Partial-Enchant Chance +Salvage.Skills.Success=&aObjet recycl\u00e9 ! +Salvage.Skills.Adept.Damaged=&4Vous n\'\u00eates pas assez talentueux pour recycler des objets endommag\u00e9s. +Salvage.Skills.Adept.Level=Vous devez \u00eatre niveau &e{0}&c pour recycler &e{1} +Salvage.Skills.TooDamaged=&4C\'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.Skills.ArcaneSuccess=&aVous avez \u00e9t\u00e9 capable d\'extraire toute la connaissance contenue dans cet objet. +Salvage.Listener.Anvil=&4Vous avez plac\u00e9 une enclume de r\u00e9paration, utilisez-la pour recycler vos outils et vos armures. Salvage.Listener=Recyclage: Salvage.SkillName=RECYCLAGE -Salvage.Skills.Lottery.Normal=[[GOLD]]Vous \u00eates capable de r\u00e9cup\u00e9rer [[DARK_AQUA]]{0}[[GOLD]] mat\u00e9riel de [[YELLOW]]{1}[[GOLD]]. -Salvage.Skills.Lottery.Perfect=[[GREEN]][[BOLD]]Parfait ![[RESET]][[GOLD]] Vous avez r\u00e9cup\u00e9r\u00e9 [[DARK_AQUA]]{1}[[GOLD]] sans effort et retrouv\u00e9 [[DARK_AQUA]]{0}[[GOLD]] mat\u00e9riel. -Salvage.Skills.Lottery.Untrained=[[GRAY]]Vous n\'\u00eates pas assez qualifi\u00e9 dans la r\u00e9cup\u00e9ration. Vous ne pouvez retrouver que [[RED]]{0}[[GRAY]] mat\u00e9riel depuis [[GREEN]]{1}[[GRAY]]. +Salvage.Skills.Lottery.Normal=&6Vous \u00eates capable de r\u00e9cup\u00e9rer &3{0}&6 mat\u00e9riel de &e{1}&6. +Salvage.Skills.Lottery.Perfect=&a&lParfait !&r&6 Vous avez r\u00e9cup\u00e9r\u00e9 &3{1}&6 sans effort et retrouv\u00e9 &3{0}&6 mat\u00e9riel. +Salvage.Skills.Lottery.Untrained=&7Vous n\'\u00eates pas assez qualifi\u00e9 dans la r\u00e9cup\u00e9ration. Vous ne pouvez retrouver que &c{0}&7 mat\u00e9riel depuis &a{1}&7. #Enclume (Partag\u00e9 entre RECYCLAGE et R\u00c9PARATION) Anvil.Unbreakable=Cet item est incassable ! #\u00c9P\u00c9E -Swords.Ability.Lower=[[GRAY]]**VOUS ABAISSEZ VOTRE \u00c9P\u00c9E** -Swords.Ability.Ready=[[GREEN]]**VOUS LEVEZ VOTRE \u00c9P\u00c9E** -Swords.Combat.Rupture.Note=[[GRAY]]NOTE: [[YELLOW]]1 Tick correspond \u00e0 0.5 seconds! -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.Hit=[[DARK_RED]]Touch\u00e9 par une contre-attaque ! -Swords.Combat.Countered=[[GREEN]]**CONTRE-ATTAQUE** -Swords.Combat.SS.Struck=[[DARK_RED]]Frapp\u00e9 par ATTAQUE D\u00c9CHIRANTE ! +Swords.Ability.Lower=&7**VOUS ABAISSEZ VOTRE \u00c9P\u00c9E** +Swords.Ability.Ready=&a**VOUS LEVEZ VOTRE \u00c9P\u00c9E** +Swords.Combat.Rupture.Note=&7NOTE: &e1 Tick correspond \u00e0 0.5 seconds! +Swords.Combat.Bleeding.Started=&4 Tu saignes ! +Swords.Combat.Bleeding.Stopped=&7Le saignement s\'est &aarr\u00eat\u00e9&7 ! +Swords.Combat.Bleeding=&a**L\'ENNEMI SAIGNE** +Swords.Combat.Counter.Hit=&4Touch\u00e9 par une contre-attaque ! +Swords.Combat.Countered=&a**CONTRE-ATTAQUE** +Swords.Combat.SS.Struck=&4Frapp\u00e9 par ATTAQUE D\u00c9CHIRANTE ! Swords.SubSkill.CounterAttack.Name=Contre-attaque Swords.SubSkill.CounterAttack.Description=Renvoie {0} des dommages pris en bloquant Swords.SubSkill.CounterAttack.Stat=Chance de contre-attaque @@ -426,16 +426,16 @@ Swords.SubSkill.SwordsLimitBreak.Name=Limitation des d\u00e9g\u00e2ts de l\'\u00 Swords.SubSkill.SwordsLimitBreak.Description=Casse les limites. Augmente les d\u00e9g\u00e2ts face aux ennemis. Pr\u00e9vu pour le PvP, il peut \u00eatre configur\u00e9 pour le PvE. Swords.SubSkill.SwordsLimitBreak.Stat=D\u00e9g\u00e2ts maximum Swords.SubSkill.Rupture.Stat=Chance d\'h\u00e9morragie -Swords.SubSkill.Rupture.Stat.Extra=H\u00e9morragie: [[GREEN]]{0} ticks [{1} DMG vs Joueur] [{2} DMG vs Monstre] +Swords.SubSkill.Rupture.Stat.Extra=H\u00e9morragie: &a{0} ticks [{1} DMG vs Joueur] [{2} DMG vs Monstre] Swords.Effect.4=H\u00e9morragie d\'Attaque d\u00e9chirante Swords.Effect.5={0} Intervale entre les saignements 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.Skills.SS.On=&a**ATTAQUE D\u00c9CHIRANTE ACTIV\u00c9E** +Swords.Skills.SS.Refresh=&aVotre comp\u00e9tence &eAttaque d\u00e9chirante &aest pr\u00eate ! +Swords.Skills.SS.Other.Off=Attaque d\u00e9chirante&a s\'est termin\u00e9 pour &e{0} +Swords.Skills.SS.Other.On=&a{0}&2 a utilis\u00e9 &cAttaque d\u00e9chirante ! #APPRIVOISEMENT Taming.Ability.Bonus.0=Attentif \u00e0 l\'environnement Taming.Ability.Bonus.1=Les loups \u00e9vitent les dangers @@ -462,7 +462,7 @@ Taming.SubSkill.ShockProof.Name=R\u00e9sistance aux chocs Taming.SubSkill.ShockProof.Description=R\u00e9duction des d\u00e9g\u00e2ts explosifs Taming.SubSkill.CallOfTheWild.Name=Appel de la nature Taming.SubSkill.CallOfTheWild.Description=Appelle un animal \u00e0 vos c\u00f4t\u00e9s -Taming.SubSkill.CallOfTheWild.Description.2=[[GRAY]]COTW: Accroupissez vous et faites un clic-gauche avec\n{0} {1} (Ocelot), {2} {3} (Loup), {4} {5} (Cheval) +Taming.SubSkill.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.HolyHound.Name=Super chien de chasse @@ -478,23 +478,23 @@ Taming.SubSkill.ThickFur.Description=R\u00e9duction de d\u00e9g\u00e2t, r\u00e9s 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 \u00e9t\u00e9 repouss\u00e9 par les loups ! -Taming.Listener.Wolf=[[DARK_GRAY]]Votre loup se pr\u00e9cipite \u00e0 vos c\u00f4t\u00e9s... +Taming.Listener.Wolf=&8Votre loup se pr\u00e9cipite \u00e0 vos c\u00f4t\u00e9s... Taming.Listener=Apprivoisement : Taming.SkillName=APPRIVOISEMENT -Taming.Summon.COTW.Success.WithoutLifespan=[[GREEN]](Appel de la nature) [[GRAY]]Vous avez invoqu\u00e9 un [[GOLD]]{0}[[GRAY]] -Taming.Summon.COTW.Success.WithLifespan=[[GREEN]](Appel de la nature) [[GRAY]]Vous avez invoqu\u00e9 un [[GOLD]]{0}[[GRAY]] pendant [[GOLD]]{1}[[GRAY]] secondes. -Taming.Summon.COTW.Limit=[[GREEN]](Appel de la nature) [[GRAY]]Vous ne pouvez avoir que [[RED]]{0} [[GRAY]]{1} invoqu\u00e9s en m\u00eame temps. -Taming.Summon.COTW.TimeExpired=[[GREEN]](Appel de la nature) [[GRAY]]Time is up, your [[GOLD]]{0}[[GRAY]] departs. -Taming.Summon.COTW.BreedingDisallowed=[[GREEN]](Appel de la nature) [[RED]]Vous ne pouvez pas reproduire un animal invoqu\u00e9. -Taming.Summon.COTW.NeedMoreItems=[[GREEN]](Appel de la nature) [[GRAY]]Vous avez besoin de [[YELLOW]]{0} [[DARK_AQUA]]{1}[[GRAY]](s) -Taming.Summon.Name.Format=[[GOLD]]{1} de {0} +Taming.Summon.COTW.Success.WithoutLifespan=&a(Appel de la nature) &7Vous avez invoqu\u00e9 un &6{0}&7 +Taming.Summon.COTW.Success.WithLifespan=&a(Appel de la nature) &7Vous avez invoqu\u00e9 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\u00e9s en m\u00eame temps. +Taming.Summon.COTW.TimeExpired=&a(Appel de la nature) &7Time is up, your &6{0}&7 departs. +Taming.Summon.COTW.BreedingDisallowed=&a(Appel de la nature) &cVous ne pouvez pas reproduire un animal invoqu\u00e9. +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.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.Ability.Lower=&7**VOUS ABAISSEZ VOS POINGS** +Unarmed.Ability.Ready=&a**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.Berserk.Stat=Dur\u00e9e du berserk @@ -517,10 +517,10 @@ 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.Skills.Berserk.On=&a**BERSERK ACTIV\u0081\u00c9** +Unarmed.Skills.Berserk.Other.Off=Berserk&a s\'est termin\u00e9 pour &e{0} +Unarmed.Skills.Berserk.Other.On=&a{0}&2 a utilis\u00e9 &cFurie ! +Unarmed.Skills.Berserk.Refresh=&aVotre comp\u00e9tence &eBerserk &aest pr\u00eate ! #B\u00dbCHERONNAGE Woodcutting.Ability.0=Souffleur de Feuilles Woodcutting.Ability.1=Souffle les feuilles @@ -542,45 +542,45 @@ Woodcutting.SubSkill.NaturesBounty.Description=Gain d\'exp\u00e9rience de la nat Woodcutting.Listener=B\u00fbcheronnage : Woodcutting.SkillName=B\u00dbCHERONNAGE Woodcutting.Skills.TreeFeller.Off=**Votre comp\u00e9tence Abatteur est termin\u00e9e** -Woodcutting.Skills.TreeFeller.On=[[GREEN]]**ABATTEUR ACTIV\u00c9** -Woodcutting.Skills.TreeFeller.Refresh=[[GREEN]]Votre comp\u00e9tence [[YELLOW]]Abatteur [[GREEN]]est pr\u00eate ! -Woodcutting.Skills.TreeFeller.Other.Off=Abatteur[[GREEN]] est termin\u00e9 pour [[YELLOW]]{0} -Woodcutting.Skills.TreeFeller.Other.On=[[GREEN]]{0}[[DARK_GREEN]] a utilis\u00e9 [[RED]]Abatteur ! +Woodcutting.Skills.TreeFeller.On=&a**ABATTEUR ACTIV\u00c9** +Woodcutting.Skills.TreeFeller.Refresh=&aVotre comp\u00e9tence &eAbatteur &aest pr\u00eate ! +Woodcutting.Skills.TreeFeller.Other.Off=Abatteur&a est termin\u00e9 pour &e{0} +Woodcutting.Skills.TreeFeller.Other.On=&a{0}&2 a utilis\u00e9 &cAbatteur ! Woodcutting.Skills.TreeFeller.Splinter=VOTRE HACHE SE BRISE EN MILLE MORCEAUX ! Woodcutting.Skills.TreeFeller.Threshold=Cet arbre est trop large! #ABILITIY #COMBAT -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.BeastLoreHorseSpeed=[[DARK_AQUA]]Vitesse des chevaux ([[GREEN]]{0} blocs/s[[DARK_AQUA]]) -Combat.BeastLoreHorseJumpStrength=[[DARK_AQUA]]Hauteur de saut des chevaux ([[GREEN]]Max {0} blocs[[DARK_AQUA]]) -Combat.Gore=[[GREEN]]**SANG** +Combat.ArrowDeflect=&f**FL\u00c8CHE DEVI\u00c9E** +Combat.BeastLore=&a**CONNAISSANCE DES B\u00caTES** +Combat.BeastLoreHealth=&3Vie (&a{0}&3/{1}) +Combat.BeastLoreOwner=&3Propri\u00e9taire (&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\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. +Combat.TargetDazed=La cible a \u00e9t\u00e9 &4\u00c9tourdi +Combat.TouchedFuzzy=&4Vous voyez flou. Vous vous sentez \u00e9tourdi. #COMMANDES ##generique -mcMMO.Description=[[DARK_AQUA]]\u00e0 propos du projet [[YELLOW]]mcMMO[[DARK_AQUA]]:,[[GOLD]]C'est un mod RPG [[RED]]open source[[GOLD]] cr\u00e9\u00e9 en f\u00e9vrier 2011, [[GOLD]]par [[BLUE]]nossr50[[GOLD]]. Le but est de permettre l'exp\u00e9rience d\'un RPG de qualit\u00e9.,[[DARK_AQUA]]Conseils:,[[GOLD]] - [[GREEN]]Utilisez [[RED]]/mcmmo help[[GREEN]] pour voir les commandes,[[GOLD]] - [[GREEN]]Faites [[RED]]/skillname[[GREEN]] pour voir les d\u00e9tails d\'une comp\u00e9tence,[[DARK_AQUA]]D\u00e9veloppeurs:,[[GOLD]] - [[GREEN]]nossr50 [[BLUE]](Cr\u00e9ateur & Leader du projet),[[GOLD]] - [[GREEN]]electronicboy [[BLUE]](Dev),[[GOLD]] - [[GREEN]]kashike [[BLUE]](Dev),[[GOLD]] - [[GREEN]]t00thpick1 [[BLUE]](Mainteneur classique) -mcMMO.Description.FormerDevs=[[DARK_AQUA]]Former Devs: [[GREEN]]GJ, NuclearW, bm01, TfT_02, Glitchfinder -Commands.addlevels.AwardAll.1=[[GREEN]]Vous avez \u00e9t\u00e9 r\u00e9compens\u00e9 de {0} niveau(x) dans tous les talents ! +mcMMO.Description=&3\u00e0 propos du projet &emcMMO&3:,&6C'est un mod RPG &copen source&6 cr\u00e9\u00e9 en f\u00e9vrier 2011, &6par &9nossr50&6. Le but est de permettre l'exp\u00e9rience d\'un RPG de qualit\u00e9.,&3Conseils:,&6 - &aUtilisez &c/mcmmo help&a pour voir les commandes,&6 - &aFaites &c/skillname&a pour voir les d\u00e9tails d\'une comp\u00e9tence,&3D\u00e9veloppeurs:,&6 - &anossr50 &9(Cr\u00e9ateur & 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 \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.1=&aVous avez re\u00e7u {0} niveau dans {1}! Commands.addlevels.AwardSkill.2={0} a \u00e9t\u00e9 modifi\u00e9 pour {1}. -Commands.addxp.AwardAll=[[GREEN]]Vous avez \u00e9t\u00e9 r\u00e9compens\u00e9 de {0} experiences dans chaque comp\u00e9tences! -Commands.addxp.AwardSkill=[[GREEN]]Vous avez \u00e9t\u00e9 r\u00e9compens\u00e9 de {0} experiences dans {1} ! -Commands.Ability.Off=Utilisation des comp\u00e9tences [[RED]]Off -Commands.Ability.On=Utilisation des comp\u00e9tences [[GREEN]]On -Commands.Ability.Toggle=L\'utilisation des capacit\u00e9s a \u00e9t\u00e9 modifi\u00e9e pour [[YELLOW]]{0} -Commands.AdminChat.Off=Canal admin [[RED]]Off -Commands.AdminChat.On=Canal admin [[GREEN]]On -Commands.AdminToggle=[[GREEN]]- Active/d\u00e9sactive le tchat admin +Commands.addxp.AwardAll=&aVous avez \u00e9t\u00e9 r\u00e9compens\u00e9 de {0} experiences dans chaque comp\u00e9tences! +Commands.addxp.AwardSkill=&aVous avez \u00e9t\u00e9 r\u00e9compens\u00e9 de {0} experiences dans {1} ! +Commands.Ability.Off=Utilisation des comp\u00e9tences &cOff +Commands.Ability.On=Utilisation des comp\u00e9tences &aOn +Commands.Ability.Toggle=L\'utilisation des capacit\u00e9s a \u00e9t\u00e9 modifi\u00e9e pour &e{0} +Commands.AdminChat.Off=Canal admin &cOff +Commands.AdminChat.On=Canal admin &aOn +Commands.AdminToggle=&a- Active/d\u00e9sactive le tchat admin Commands.Chat.Console=*Console* -Commands.Cooldowns.Header=[[GOLD]]--= [[GREEN]]Temps d\'attente des capacit\u00e9s McMMO[[GOLD]] =-- -Commands.Cooldowns.Row.N=\ [[RED]]{0}[[WHITE]] - [[GOLD]]{1} secondes restantes -Commands.Cooldowns.Row.Y=\ [[AQUA]]{0}[[WHITE]] - [[DARK_GREEN]] Pr\u00eat ! +Commands.Cooldowns.Header=&6--= &aTemps d\'attente des capacit\u00e9s McMMO&6 =-- +Commands.Cooldowns.Row.N=\ &c{0}&f - &6{1} secondes restantes +Commands.Cooldowns.Row.Y=\ &b{0}&f - &2 Pr\u00eat ! Commands.Database.Cooldown=Vous devez attendre 1 seconde avant de pouvoir utiliser cette commande de nouveau. Commands.Database.Processing=Votre commande pr\u00e9c\u00e9dente est toujours en ex\u00e9cution. Veuillez patienter. Commands.Disabled=Cette commande est d\u00e9sactiv\u00e9e. @@ -589,124 +589,124 @@ Commands.GodMode.Disabled=mcMMO Godmode d\u00e9sactiv\u00e9 Commands.GodMode.Enabled=mcMMO Godmode activ\u00e9 Commands.AdminChatSpy.Enabled=[mcMMO] Discussion priv\u00e9e SPY activ\u00e9 Commands.AdminChatSpy.Disabled=[mcMMO] Discussion priv\u00e9e SPY d\u00e9sactiv\u00e9 -Commands.AdminChatSpy.Toggle=[mcMMO] Discussion bascul\u00e9 pour [[YELLOW]]{0} -Commands.AdminChatSpy.Chat=[[GOLD]][SPY: [[GREEN]]{0}[[GOLD]]] [[WHITE]]{1} +Commands.AdminChatSpy.Toggle=[mcMMO] Discussion bascul\u00e9 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 \u00e9t\u00e9 modifi\u00e9 pour &e{0} +Commands.Healthbars.Changed.HEARTS=[mcMMO] Le type d\'affichage de la barre de vie a \u00e9t\u00e9 chang\u00e9 en &cC\u0153urs&f. +Commands.Healthbars.Changed.BAR=[mcMMO] Le type d\'affichage de la barre de vie a \u00e9t\u00e9 chang\u00e9 en &eBo\u00eetes&f. +Commands.Healthbars.Changed.DISABLED=[mcMMO] La barre de vie des entit\u00e9s a \u00e9t\u00e9 &7d\u00e9sactiv\u00e9e&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.mcgod=[[GREEN]]- Active/D\u00e9sactive le \"Mode Dieu\" +Commands.Inspect= &a- Voir les infos d\u00e9taill\u00e9es sur le joueur +Commands.Invite.Success=&aInvitation envoy\u00e9e. +Commands.Leaderboards= &a- Classement +Commands.mcgod=&a- Active/D\u00e9sactive le \"Mode Dieu\" Commands.mchud.Invalid=Ce n\'est pas un type valide d\'HUD. -Commands.mcpurge.Success=[[GREEN]]La base de donn\u00e9es a \u00e9t\u00e9 purg\u00e9e avec succ\u00e8s ! -Commands.mcrank.Heading=[[GOLD]]-=CLASSEMENT PERSONNEL=- -Commands.mcrank.Overall=Toutes competences confondues[[GREEN]] - [[GOLD]]Classement [[WHITE]]#[[GREEN]]{0} -Commands.mcrank.Player=CIBLE : [[WHITE]]{0} -Commands.mcrank.Skill={0}[[GREEN]] - [[GOLD]]Classement [[WHITE]]#[[GREEN]]{1} -Commands.mcrank.Unranked=[[WHITE]]Non class\u00e9 +Commands.mcpurge.Success=&aLa base de donn\u00e9es a \u00e9t\u00e9 purg\u00e9e avec succ\u00e8s ! +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\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.mcremove.Success=&a{0} a \u00e9t\u00e9 enlev\u00e9(e) de la base de donn\u00e9es avec succ\u00e8s ! +Commands.mctop.Tip=&6Astuce : Utilisez &c/mcrank&6 pour voir vos positions dans les diff\u00e9rents classements ! +Commands.mmoedit=[joueur] &a - Modifie la cible +Commands.mmoedit.AllSkills.1=&aLe niveau de tous vos talents a \u00e9t\u00e9 mis \u00e0 {0} ! +Commands.mmoedit.Modified.1=&aVotre 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.Database.Start=&7Commencement de la conversion de {0} \u00e0 {1}... +Commands.mcconvert.Database.Finish=&7La 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 &a{0} +Commands.mcconvert.Experience.Invalid=Type de formule inconnu! Les types valides sont: &aLINEAR &cand &aEXPONENTIAL. 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.mcconvert.Experience.Start=&7Commencement de la conversion de {0} \u00e0 {1}... +Commands.mcconvert.Experience.Finish=&7Changement de formule appliqu\u00e9; utilisation d\u00e9sormais de {0} pour la courbe d\'EXP. +Commands.ModDescription=&a- 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.Notifications.Off=Les notifications des capacit\u00e9s ont \u00e9t\u00e9 &cd\u00e9sactiv\u00e9es +Commands.Notifications.On=Les notifications des capacit\u00e9s ont \u00e9t\u00e9 &aactiv\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.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.PartyFull=[[GOLD]]{0}[[RED]] est complète ! -Commands.Party.PartyFull.Invite=Vous ne pouvez pas inviter [[YELLOW]]{0}[[RED]] \u00e0 rejoindre [[GREEN]]{1}[[RED]] parce qu\'il y a d\u00e9j\u00e0 [[DARK_AQUA]]{2}[[RED]] joueurs dedans ! -Commands.Party.PartyFull.InviteAccept=Vous ne pouvez pas rejoindre [[GREEN]]{0}[[RED]] parce qu\'il y a d\u00e9j\u00e0 [[DARK_AQUA]]{1}[[RED]] joueurs dedans ! -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.Status=&8NOM: &f{0} {1} &8NIVEAU: &3{2} +Commands.Party.Status.Alliance=&8ALLIANCES: &f{0} +Commands.Party.UnlockedFeatures=&8Fonctionnalit\u00e9s D\u00e9bloqu\u00e9es: &7[[ITALIC]]{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[[ITALIC]]{0} +Commands.Party.MembersNear=&8A C\u00d4T\u00c9 DE VOUS &3{0}&8/&3{1} +Commands.Party.Accept=&a- Accepter l\'invitation de la guilde +Commands.Party.Chat.Off=Canal guilde &cd\u00e9sactiv\u00e9 +Commands.Party.Chat.On=Canal guilde &cactiv\u00e9 +Commands.Party.Commands=---[]&aCOMMANDES DE GUILDE&c[]--- +Commands.Party.Invite.0=ALERT: &aVous avez re\u00e7u 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\u00e9e. 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 \u00e0 rejoindre &a{1}&c parce qu\'il y a d\u00e9j\u00e0 &3{2}&c joueurs dedans ! +Commands.Party.PartyFull.InviteAccept=Vous ne pouvez pas rejoindre &a{0}&c parce qu\'il y a d\u00e9j\u00e0 &3{1}&c joueurs dedans ! +Commands.Party.Create=&7Groupe Cr\u00e9\u00e9: {0} +Commands.Party.Rename=&7Le nom de la guilde a \u00e9t\u00e9 chang\u00e9 en : &f{0} +Commands.Party.SetSharing=&7Le partage des {0} de la guilde a \u00e9t\u00e9 mis \u00e0: &3{1} +Commands.Party.ToggleShareCategory=&7Le partage d\'objets de guilde &6{0} &7a \u00e9t\u00e9 &3{1} +Commands.Party.AlreadyExists=&4La 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.Members.Header=-----[]&aMEMBRES&c[]----- 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.Quit=&a- Quitter votre pr\u00e9sente guilde +Commands.Party.Teleport=&a- Vous t\u00e9l\u00e9porte \u00e0 un membre de la guilde +Commands.Party.Toggle=&a- Active/d\u00e9sactive le tchat de guilde +Commands.Party1=&a- Cr\u00e9er 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\u00c9 AVEC : &f{1} +Commands.Party.Alliance.Members.Header=-----[]&aMEMBRES DE L\'ALLIANCE&c[]----- +Commands.Party.Alliance.Invite.0=ALERTE: &aVous avez re\u00e7u 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\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.AlreadyAllies=Votre groupe a d\u00e9j\u00e0 une alliance. D\u00e9faites-la avec &3/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.Party.Alliance.Help.1= \u00e0 une alliance &3/party alliance invite &c. +Commands.ptp.Enabled=T\u00e9l\u00e9portation de guilde &aactiv\u00e9e +Commands.ptp.Disabled=T\u00e9l\u00e9portation de guilde &cd\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.Request1={0} &a vous a envoy\u00e9 une requ\u00eate de t\u00e9l\u00e9portation vers vous. +Commands.ptp.Request2=&apour vous t\u00e9l\u00e9porter, tapez &e/ptp accept&a. La requ\u00eate expire dans &c{0} &asecondes. +Commands.ptp.AcceptAny.Enabled=Confirmation de la demande de t\u00e9l\u00e9portation de guilde &aactiv\u00e9e +Commands.ptp.AcceptAny.Disabled=Confirmation de la demande de t\u00e9l\u00e9portation du guilde &cd\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.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\u00e9tences ont \u00e9t\u00e9 remises \u00e0 zero. +Commands.Reset.Single=&aTa comp\u00e9tence {0} a \u00e9t\u00e9 remise \u00e0 zero. +Commands.Reset=&a- Remise \u00e0 0 d\'un talent +Commands.Scoreboard.Clear=&3Le tableau des scores McMMO a \u00e9t\u00e9 enlev\u00e9. Commands.Scoreboard.NoBoard=Le tableau des scores McMMO n\'est pas actif. -Commands.Scoreboard.Keep=[[DARK_AQUA]]Le tableau des scores McMMO restera affich\u00e9 tant que vous n\'utiliserez pas [[GREEN]]/mcscoreboard clear[[DARK_AQUA]]. -Commands.Scoreboard.Timer=[[DARK_AQUA]]Le tableau des scores mcMMO sera enlev\u00e9 dans [[GOLD]]{0}[[DARK_AQUA]] secondes \u00e0 compter de maintenant. -Commands.Scoreboard.Help.0=[[GOLD]] == [[GREEN]]Aide pour [[RED]]/mcscoreboard[[GOLD]] == -Commands.Scoreboard.Help.1=[[DARK_AQUA]]/mcscoreboard[[AQUA]] clear [[WHITE]] - enl\u00e8ve le tableau des scores McMMO -Commands.Scoreboard.Help.2=[[DARK_AQUA]]/mcscoreboard[[AQUA]] keep [[WHITE]] - Garde le tableau des scores affich\u00e9 -Commands.Scoreboard.Help.3=[[DARK_AQUA]]/mcscoreboard[[AQUA]] time [n] [[WHITE]] - enl\u00e8ve le tableau des scores McMMO apr\u00e8s [[LIGHT_PURPLE]]n[[WHITE]] secondes -Commands.Scoreboard.Tip.Keep=[[GOLD]]Astuce : Utilisez [[RED]]/mcscoreboard keep[[GOLD]] quand le tableau des scores est affich\u00e9 pour l\'emp\u00eacher de s\'en aller. -Commands.Scoreboard.Tip.Clear=[[GOLD]]Astuce : Utilisez [[RED]]/mcscoreboard clear[[GOLD]] pour de d\u00e9barrasser du tableau des scores. -Commands.XPBar.Reset=[[GOLD]]Configuration de XP Bar mcMMO r\u00e9initialis\u00e9. -Commands.XPBar.SettingChanged=[[GOLD]]Configuration de XP Bar pour [[GREEN]]{0}[[GOLD]] est d\u00e9sormais \u00e0 [[GREEN]]{1} +Commands.Scoreboard.Keep=&3Le tableau des scores McMMO restera affich\u00e9 tant que vous n\'utiliserez pas &a/mcscoreboard clear&3. +Commands.Scoreboard.Timer=&3Le tableau des scores mcMMO sera enlev\u00e9 dans &6{0}&3 secondes \u00e0 compter de maintenant. +Commands.Scoreboard.Help.0=&6 == &aAide pour &c/mcscoreboard&6 == +Commands.Scoreboard.Help.1=&3/mcscoreboard&b clear &f - enl\u00e8ve le tableau des scores McMMO +Commands.Scoreboard.Help.2=&3/mcscoreboard&b keep &f - Garde le tableau des scores affich\u00e9 +Commands.Scoreboard.Help.3=&3/mcscoreboard&b time [n] &f - enl\u00e8ve le tableau des scores McMMO apr\u00e8s &dn&f secondes +Commands.Scoreboard.Tip.Keep=&6Astuce : Utilisez &c/mcscoreboard keep&6 quand le tableau des scores est affich\u00e9 pour l\'emp\u00eacher de s\'en aller. +Commands.Scoreboard.Tip.Clear=&6Astuce : Utilisez &c/mcscoreboard clear&6 pour de d\u00e9barrasser du tableau des scores. +Commands.XPBar.Reset=&6Configuration de XP Bar mcMMO r\u00e9initialis\u00e9. +Commands.XPBar.SettingChanged=&6Configuration de XP Bar pour &a{0}&6 est d\u00e9sormais \u00e0 &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\u00e9taill\u00e9es \u00e0 propos d\'un talent Commands.Stats.Self=VOS STATISTIQUES -Commands.Stats=[[GREEN]]- Voir vos statistiques McMMO -Commands.ToggleAbility=[[GREEN]]- Active/D\u00e9sactive la possibilit\u00e9 d\'activation d\'une capacit\u00e9 avec un clic droit +Commands.Stats=&a- Voir vos statistiques McMMO +Commands.ToggleAbility=&a- Active/D\u00e9sactive la possibilit\u00e9 d\'activation d\'une capacit\u00e9 avec un clic droit Commands.Usage.0=L\'utilisation correcte est /{0} Commands.Usage.1=L\'utilisation correcte est /{0} {1} Commands.Usage.2=L\'utilisation correcte est /{0} {1} {2} @@ -723,68 +723,68 @@ Commands.Usage.Skill=Comp\u00e9tence Commands.Usage.SubSkill=Sous-Comp\u00e9tence Commands.Usage.XP=exp Commands.Description.mmoinfo=Lisez les d\u00e9tails \u00e0 propos des comp\u00e9tences ou des m\u00e9caniques. -Commands.MmoInfo.Mystery=[[GRAY]]Vous n'avez pas encore d\u00e9bloqu\u00e9 cette comp\u00e9tence, mais lorsque se sera le cas, vous pourrez lire ses d\u00e9tails ! +Commands.MmoInfo.Mystery=&7Vous n'avez pas encore d\u00e9bloqu\u00e9 cette comp\u00e9tence, mais lorsque se sera le cas, vous pourrez lire ses d\u00e9tails ! Commands.MmoInfo.NoMatch=Cette sous-comp\u00e9tence n'existe pas ! -Commands.MmoInfo.Header=[[DARK_AQUA]]-=[]=====[][[GOLD]] MMO Info [[DARK_AQUA]][]=====[]=- -Commands.MmoInfo.SubSkillHeader=[[GOLD]]Nom:[[YELLOW]] {0} -Commands.MmoInfo.DetailsHeader=[[DARK_AQUA]]-=[]=====[][[GREEN]] D\u00e9tails [[DARK_AQUA]][]=====[]=- -Commands.MmoInfo.OldSkill=[[GRAY]]Comp\u00e9tence mcMMO ont \u00e9t\u00e9 converti en un système modul\u00e9 de comp\u00e9tence, malheureusement celle-ci n'a pas encore \u00e9t\u00e9 converti et manque de d\u00e9tails. Le nouveau système permettra de plus facilement mettre \u00e0 jour les comp\u00e9tences mcMMO avec plus de flexibilit\u00e9 pour les comp\u00e9tences existantes. -Commands.MmoInfo.Mechanics=[[DARK_AQUA]]-=[]=====[][[GOLD]] Mecaniques [[DARK_AQUA]][]=====[]=- +Commands.MmoInfo.Header=&3-=[]=====[]&6 MMO Info &3[]=====[]=- +Commands.MmoInfo.SubSkillHeader=&6Nom:&e {0} +Commands.MmoInfo.DetailsHeader=&3-=[]=====[]&a D\u00e9tails &3[]=====[]=- +Commands.MmoInfo.OldSkill=&7Comp\u00e9tence mcMMO ont \u00e9t\u00e9 converti en un système modul\u00e9 de comp\u00e9tence, malheureusement celle-ci n'a pas encore \u00e9t\u00e9 converti et manque de d\u00e9tails. Le nouveau système permettra de plus facilement mettre \u00e0 jour les comp\u00e9tences mcMMO avec plus de flexibilit\u00e9 pour les comp\u00e9tences existantes. +Commands.MmoInfo.Mechanics=&3-=[]=====[]&6 Mecaniques &3[]=====[]=- Commands.MmoInfo.Stats=STATS: {0} -Commands.Mmodebug.Toggle=mcMMO mode de debug est d\u00e9sormais [[GOLD]]{0}[[GRAY]], utilisez cette commande pour le modifier. Avec le mode de d\u00e9bug activ\u00e9, vous pouvez taper les blocs pour obtenir des informations utilis\u00e9 pour le support. +Commands.Mmodebug.Toggle=mcMMO mode de debug est d\u00e9sormais &6{0}&7, utilisez cette commande pour le modifier. Avec le mode de d\u00e9bug activ\u00e9, vous pouvez taper les blocs pour obtenir des informations utilis\u00e9 pour le support. 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. +mcMMO.NoPermission=&4Vous n\'avez pas les droits. +mcMMO.NoSkillNote=&8Si vous n\'avez pas les droits pour une comp\u00e9tence, il n\'appara\u00eetra 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.Help.0=L\'utilisation correcte est &3{0} [mot de passe]. +Party.Help.1=pour cr\u00e9er 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\u00e9bloquer votre groupe, utilisez &3{0} +Party.Help.5=Pour prot\u00e9ger 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\u00e9faire 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\u00e9 votre groupe +Party.InformedOnNameChange=&6{0} &aa modifi\u00e9 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\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.NotInYourParty=&4{0} n\'est pas dans votre guilde. +Party.NotOwner=&4Vous n\'\u00eates 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\'\u00eates d\u00e9sormais plus le chef de la guilde. +Party.Owner.Player=&aVous \u00eates d\u00e9sormais le chef de la guilde. Party.Password.None=Cette guilde est prot\u00e9g\u00e9e par un mot de passe. S\'il vous pla\u00eet, renseignez le mot de passe pour la rejoindre. Party.Password.Incorrect=Le mot de passe de la guilde est incorrect. -Party.Password.Set=[[GREEN]]Mot de passe de la guilde r\u00e9gl\u00e9 \u00e0 {0} -Party.Password.Removed=[[GREEN]]Le mot de passe du groupe a \u00e9t\u00e9 enlev\u00e9. +Party.Password.Set=&aMot de passe de la guilde r\u00e9gl\u00e9 \u00e0 {0} +Party.Password.Removed=&aLe mot de passe du groupe a \u00e9t\u00e9 enlev\u00e9. Party.Player.Invalid=Ce joueur n\'existe pas. -Party.NotOnline=[[DARK_RED]]{0} n\'est pas connect\u00e9 ! +Party.NotOnline=&4{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.PlayerNotInParty=&4{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.Player=&aVous 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.Target=&a{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.Unlocked=&7Le groupe est d\u00e9verrouill\u00e9. +Party.Disband=&7La guilde a \u00e9t\u00e9 dissoute +Party.Alliance.Formed=&7Votre groupe est d\u00e9sormais alli\u00e9 avec &a{0} +Party.Alliance.Disband=&7Votre groupe n\'est d\u00e9sormais plus alli\u00e9 avec &c{0} +Party.Status.Locked=&4(INVITATION-SEULEMENT) +Party.Status.Unlocked=&2(OUVERT) Party.LevelUp=Le niveau de votre guilde a \u00e9t\u00e9 augment\u00e9 de {0}. Total ({1}) Party.Feature.Chat=Tchat de guilde Party.Feature.Teleport=T\u00e9l\u00e9portation de guilde @@ -826,217 +826,217 @@ 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.XPGain=&8Gain d\'exp\u00e9rience: &f{0} +Commands.xplock.locked=&6Votre barre d\'XP est maintenant verrouill\u00e9e sur {0} ! +Commands.xplock.unlocked=&6Votre barre d\'XP est maintenant &aD\u00c9VERROUILL\u00c9E&6 !! Commands.xprate.modified=Le TAUX D\'EXP a \u00e9t\u00e9 pass\u00e9 \u00e0 {0} Commands.xprate.over=L\u2019\u00e9v\u00e9nement de bonus d\'XP mcMMO est TERMIN\u00c9 !! Commands.xprate.proper.0=L\'usage correct pour changer le taux d\'XP est /xprate 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.NegativeNumberWarn=N'utilisez pas des nombres n\u00e9gatifs ! -Commands.Event.Start=[[GREEN]]mcMMO[[GOLD]] \u00e9vènement ! -Commands.Event.Stop=[[GREEN]]mcMMO[[DARK_AQUA]] \u00e9vènement termin\u00e9 ! -Commands.Event.Stop.Subtitle=[[GREEN]]J'espère que vous vous amesurez ! -Commands.Event.XP=[[DARK_AQUA]]Ratio d\'XP est d\u00e9sormais [[GOLD]]{0}[[DARK_AQUA]]x -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 ! +Commands.Event.Start=&amcMMO&6 \u00e9vènement ! +Commands.Event.Stop=&amcMMO&3 \u00e9vènement termin\u00e9 ! +Commands.Event.Stop.Subtitle=&aJ'espère que vous vous amesurez ! +Commands.Event.XP=&3Ratio d\'XP est d\u00e9sormais &6{0}&3x +Commands.xprate.started.0=&6L\u2019\u00c9V\u00c9NEMENT 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=[[YELLOW]][Serveur] -Notifications.Admin.XPRate.Start.Self=[[GRAY]]Vous avez modifi\u00e9 le ratio d\'XP global \u00e0 [[GOLD]]{0}x -Notifications.Admin.XPRate.End.Self=[[GRAY]]Vous avez arr\u00eat\u00e9 l'\u00e9vènement de ratio d\'XP. -Notifications.Admin.XPRate.End.Others={0} [[GRAY]]a arr\u00eat\u00e9 l'\u00e9vènement de ratio d\'XP. -Notifications.Admin.XPRate.Start.Others={0} [[GRAY]]a commenc\u00e9 ou modifi\u00e9 un \u00e9vènement de ratio d\'XP global, qui est d\u00e9sormais de {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[Serveur] +Notifications.Admin.XPRate.Start.Self=&7Vous avez modifi\u00e9 le ratio d\'XP global \u00e0 &6{0}x +Notifications.Admin.XPRate.End.Self=&7Vous avez arr\u00eat\u00e9 l'\u00e9vènement de ratio d\'XP. +Notifications.Admin.XPRate.End.Others={0} &7a arr\u00eat\u00e9 l'\u00e9vènement de ratio d\'XP. +Notifications.Admin.XPRate.Start.Others={0} &7a commenc\u00e9 ou modifi\u00e9 un \u00e9vènement de ratio d\'XP global, qui est d\u00e9sormais 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=[[GOLD]]Un \u00e9v\u00e9nement bonus d\'Exp\u00e9rience est actuellement lanc\u00e9 ! Le bonus est de {0}x ! +XPRate.Event=&6Un \u00e9v\u00e9nement bonus d\'Exp\u00e9rience est actuellement lanc\u00e9 ! Le bonus est de {0}x ! #GUIDES -Guides.Available=[[GRAY]]Guide pour le/la {0} est disponible - \u00e9crivez /{1} ? [page] -Guides.Header=[[GOLD]]-=[[GREEN]]{0} Guide[[GOLD]]=- +Guides.Available=&7Guide pour le/la {0} est disponible - \u00e9crivez /{1} ? [page] +Guides.Header=&6-=&a{0} Guide&6=- Guides.Page.Invalid=Le num\u00e9ro de page est invalide Guides.Page.OutOfRange=Cette page n\'existe pas, il y a seulement {0} pages totales. Guides.Usage= L\'utilisation est /{0} ? [page] ##Acrobatics -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.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\u00e9sistance aux d\u00e9g\u00e2ts physiques.\n&3GAIN D\'XP:\n&ePour gagner de l\'exp\u00e9rience, vous devez esquiver des d\u00e9g\u00e2ts\n&een combat ou encaisser des d\u00e9g\u00e2ts de chute. +Guides.Acrobatics.Section.1=&3Comment fonctionne la Roulade?\n&eVous avez une chance, lorsque vous prenez des d\u00e9g\u00e2ts dus \u00e0 une chute,\n&ed\'esquiver ces d\u00e9g\u00e2ts. Maintenez la touche pour s\'accroupir\n&epour doubler les chances d\'esquiver ces d\u00e9g\u00e2ts.\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\'\u00e9chapper aux d\u00e9g\u00e2ts.\n&eVotre pourcentage de chance de Roulade d\u00e9pend du niveau de votre Comp\u00e9tence. +Guides.Acrobatics.Section.2=&3Comment fonctionne l\'esquive?\n&eL\'esquive est une capacit\u00e9 passive qui peut vous permettre de\n&ediminuer les d\u00e9g\u00e2ts de moiti\u00e9 lorsque vous \u00eates bless\u00e9 au combat.\n&eLes chances d\'esquiver sont fonction de votre niveau de comp\u00e9tence. ##Alchemy -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.Alchemy.Section.0=&3A propos de l\'alchimie:\n&eL\'alchimie est l\'art de pr\u00e9parer des potions.\n&eDonne des bonus de vitesse \u00e0 la pr\u00e9paration des potions mais aussi\n&el\'ajout de nouvelles potions (pr\u00e9c\u00e8demment) incraftables.\n&3GAIN D\'XP:\n&ePour gagner de l\'exp\u00e9rience vous devez pr\u00e9parer des potions. +Guides.Alchemy.Section.1=&3Comment fonctionne Catalyse?\n&eCatalyse acc\u00e8lere le processus de pr\u00e9paration des potions,\n&ejusqu\'\u00e0 4x plus vite au niveau 1000.\n&ePar d\u00e9faut, cette capacit\u00e9 est d\u00e9bloqu\u00e9e au niveau 100. +Guides.Alchemy.Section.2=&3Comment fonctionne Concoction?\n&eConcoction vous permet de pr\u00e9parer plus de potions \u00e0 l\'aide &ed\'ingr\u00e9dients sp\u00e9ciaux..\n&eLes ingr\u00e9dients que vous pouvez utiliser sont d\u00e9termin\u00e9s\n&epar votre rang. Il y a 8 rangs \u00e0 d\u00e9bloquer. +Guides.Alchemy.Section.3=&3Ingr\u00e9dients pour la confections de niveau 4 :\n&ePoudre d\'Incendiaire, \u0152il Ferment\u00e9 d\u2019Araign\u00e9e, Larme de Ghast, Redstone,\n&ePoudre de Pierre Lumineuse, Sucre, Melon Scintillant, Carotte Dor\u00e9e,\n&eCr\u00e8me de Magma, Verrue du Nether, \u0152il d\'Araign\u00e9e, Poudre \u00e0 Canon, N\u00e9nuphar,\n&ePoisson-Globe\n&e(Potions de Minecraft Vanilla) +Guides.Alchemy.Section.4=&3Ingr\u00e9dients pour la confections de niveau 2 :\n&eCarotte (Potion de H\u00e2te)\n&eBoule de Slime (Potion de Lassitude)\n&3Ingr\u00e9dients pour la confections de niveau 3 :\n&eQuartz (Potion d\'Absorption)\n&eChampignon Rouge (Potion de Saut Boost\u00e9) +Guides.Alchemy.Section.5=&3Ingr\u00e9dients pour la confections de niveau 4 :\n&ePomme (Potion de Boost de Vie)\n&eViande Putr\u00e9fi\u00e9e (Potion de Faim)\n&3Ingr\u00e9dients pour la confections de niveau 5 :\n&eChampignon Brun (Potion de Naus\u00e9e)\n&ePoche d\'Encre (Potion d\'Aveuglement) +Guides.Alchemy.Section.6=&3Ingr\u00e9dients pour la confections de niveau 6 :\n&eHerbes Hautes (Potion de Saturation)\n&3Ingr\u00e9dients pour la confections de niveau 7 :\n&ePatate Empoisonn\u00e9e (Potion de Wither)\n&3Ingr\u00e9dients pour la confections de niveau 8 :\n&ePomme d\'or normale (Potion de R\u00e9sistance) ##Archery -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.Archery.Section.0=&3A propos de l\'Archerie:\n&eL\'archerie est l\'art du tir \u00e0 l\'arc.\n&eCette comp\u00e9tence fournit divers bonus de combat, par exemple une\n&eaugmentation des d\u00e9g\u00e2ts proportionelle \u00e0 votre niveau, la capacit\u00e9\n&ede rendre confus d\'autres joueurs en PvP,etc. En plus de cela, vous\n&epouvez aussi r\u00e9cup\u00e9rer quelques fl\u00e8ches des corps de vos ennemis.\n&3GAIN D\'XP:\n&ePour gagner de l\'exp\u00e9rience dans cette discipline vous devez infliger\n&edes d\u00e9g\u00e2ts \u00e0 l\'aide de vos fl\u00e8ches. +Guides.Archery.Section.1=&3Comment fonctionne tir pr\u00e9cis?\n&eTir pr\u00e9cis augmente les d\u00e9g\u00e2ts de vos tirs.\n&eL\'augmentation des d\u00e9g\u00e2ts est fonction de\n&evotre niveau en tir \u00e0 l\'arc..\n&ePar d\u00e9faut, vos d\u00e9g\u00e2ts augmentent de 10% tous les\n&e50 niveaux, jusqu\'\u00e0 un maximum de 200% de bonus. +Guides.Archery.Section.2=&3Comment fonctionne d\u00e9sorienter?\n&eVous avez une chance de d\u00e9sorienter votre cible lorsque vous lui\n&etirez dessus. Sous l\'effet de d\u00e9sorienter, votre cible regarde droit\n&evers le ciel pendant une courte dur\u00e9e.\n&eUn tir qui d\u00e9soriente inflige 4 d\u00e9g\u00e2ts suppl\u00e9mentaires (2 coeurs). +Guides.Archery.Section.3=&3Comment fonctionne la r\u00e9cup\u00e9ration de fl\u00e8ches?\n&eVous avez une chance de r\u00e9cup\u00e9rer certaines de vos fl\u00e8ches\n&elorsque vous tuez un mob \u00e0 l\'arc.\n&eCette chance augmente avec votre niveau en Tir \u00e0 l\'arc.\n&eCette capacit\u00e9 augmente de 0.1% par niveau, jusqu\'\u00e0 100%\n&eau niveau 1000. ##Axes -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.Axes.Section.0=&3Concernant les Haches:\n&eAvec la comp\u00e9tence Hache vous pouvez utiliser votre Hache pour bien plus\n&eque de la d\u00e9forestation! Vous pourrez d\u00e9couper des mobs et des joueurs\n&epour gagner de l\'exp\u00e9rience, 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 \u00e0 mesure que votre niveau\n&eaugmente.\n&3Gain d\'exp\u00e9rience:\n&ePour gagner de l\'exp\u00e9rience, il vous faut attaquer un joueur ou un mob\n&eavec une Hache. +Guides.Axes.Section.1=&3Comment fonctionne le Pourfendeur de Cr\u00e2nes?\n&eCette capacit\u00e9 vous permet d\'infliger des d\u00e9g\u00e2ts de zone.\n&eCe d\u00e9g\u00e2t de zone infligera la moiti\u00e9 de ce que vous avez inflig\u00e9 \u00e0 votre\n&ecible principale et s\'av\u00e8re donc utile pour s\'attaquer \u00e0 des hordes de mobs. +Guides.Axes.Section.2=&3Comment fonctionne le Coup Critique?\n&eLe Coup Critique est une capacit\u00e9 automatique qui donne une chance\n&ed\'infliger des d\u00e9g\u00e2ts suppl\u00e9mentaires.\n&ePar d\u00e9faut, par pallier de 2 niveaux dans la Comp\u00e9tence Hache, vous gagnez\n&e0.1% de chance de porter le Coup Critique, causant 2 fois plus de d\u00e9g\u00e2ts aux mobs\n&eou 1.5 fois de d\u00e9g\u00e2ts aux joueurs. +Guides.Axes.Section.3=&3Comment fonctionne la Ma\u00eetrise de la Hache?\n&e la Ma\u00eetrise de la Hache est une capacit\u00e9 automatique qui permet d\'infliger plus de d\u00e9g\u00e2ts\n&e\u00e0 vos cibles en utilisant une Hache.\n&ePar d\u00e9faut, ce bonus augmente vos d\u00e9g\u00e2t inflig\u00e9s 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\u00e9 a une chance passive de d\u00e9t\u00e9riorer l\'armure de votre ennemi.\n&e de votre ennemi. Ces d\u00e9g\u00e2ts augmentent avec votre niveau de la Comp\u00e9tence Haches. +Guides.Axes.Section.5=&3Comment fonctionne l\'Impact Am\u00e9lior\u00e9?\n&eVous avez une chance, automatique, pour obtenir un impact plus important\n&elorsque vous attaquez avec votre hache.\n&ePar d\u00e9faut cette chance est de 25%. Cette capacit\u00e9 a\n&eun effet de recul consid\u00e9rable, similaire \u00e0 l\u2019enchantement Frappe II.\n&eEn plus, les d\u00e9g\u00e2ts sont augment\u00e9s avec cette capacit\u00e9. ##Excavation -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.Excavation.Section.0=&3A propos de l\'Excavation :\n&eL\'Excavation est l\'action de creuser la terre pour y trouver des tr\u00e9sors.\n&eEn excavant le monde, vous trouverez des tr\u00e9sors.\n&ePlus vous effectuerez ceci, plus vous pourrez trouver de tr\u00e9sors.\n&3Gain d\'exp\u00e9rience:\n&ePour gagner de l\'exp\u00e9rience dans cette comp\u00e9tence vous devez creuser avec une pelle en main.\n&eSeulement certains mat\u00e9riaux peuvent \u00eatre creus\u00e9s pour des tr\u00e9sors et de l\'exp\u00e9rience. +Guides.Excavation.Section.1=&3Mat\u00e9riaux compatibles:\n&eHerbe, Terre, Sable, Argile, Gravier, Mycelium, Sable des \u00e2mes +Guides.Excavation.Section.2=&3Comment utiliser le Giga Broyeur:\n&eAvec une pioche dans votre main, faites clic droit pour pr\u00e9parer votre outil.\n&eUne fois cela fait, vous avez jusqu\'\u00e0 4 secondes pour commencer \u00e0 miner\n&edes mat\u00e9riaux compatibles, ce qui activera le Broyeur. +Guides.Excavation.Section.3=&3Comment fonctionne Foreur?\n&eForeur est une capacit\u00e9 avec temps de recharge, li\u00e9e\n&e\u00e0 votre comp\u00e9tence d\'excavation. Cela triple les chances\n&ede trouver des tr\u00e9sors et d\u00e9truis instantan\u00e9ment les\n&eblocs excavables. +Guides.Excavation.Section.4=&3Comment fonctionne Chasseur de Tr\u00e9sors?\n&eLes tr\u00e9sors r\u00e9cup\u00e9rables requi\u00e8rent d\'avoir un certain niveau\n&een excavation pour avoir une chance de les faire tomber, en &econs\u00e9quence de quoi il est difficile d\'estimer son utilit\u00e9.\n&eMais gardez \u00e0 l\'esprit que plus votre niveau est \u00e9lev\u00e9,\n&eplus vous pourrez trouver de tr\u00e9sors diff\u00e9rents.\n&eRappelez vous aussi que chaque type de bloc excavable\n&econtient sa propre liste de tr\u00e9sors uniques.\n&eEn d\'autres termes, vous trouverez des tr\u00e9sors diff\u00e9rents en creusant\n&edu sable plut\u00f4t que du gravier (par exemple). +Guides.Excavation.Section.5=&3Notes sur l\'Excavation:\n&eLes loots de l\'excavation sont enti\u00e8rement modifiables\n&edonc les r\u00e9sultats varient selon les serveurs. ##Fishing -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.Fishing.Section.0=&3Concernant la P\u00eache:\n&eLa Comp\u00e9tence P\u00eache rend la P\u00eache int\u00e9ressante!\n&eTrouvez des tr\u00e9sors cach\u00e9s, et d\u00e9robez des objets aux mobs!\n&3Gain d\'Exp\u00e9rience:\n&eP\u00eachez des poissons! +Guides.Fishing.Section.1=&3Comment fonctionne le Chasseur de Tr\u00e9sors?\n&eCette capacit\u00e9 vous permet de trouver des tr\u00e9sors en p\u00eachant\n&eavec une petite chance de trouver des objets enchant\u00e9s.\n&eTous les tr\u00e9sors possibles sont trouvables \u00e0 n\'importe\n&equel niveau de la Comp\u00e9tence P\u00eache. Trouver un objet\n&ed\u00e9pend n\u00e9anmoins de la raret\u00e9 de ce dernier.\n&ePlus votre Comp\u00e9tence P\u00eache est \u00e9lev\u00e9e, plus\n&evous aurez de chances de trouver de meilleurs tr\u00e9sors! +Guides.Fishing.Section.2=&3Comment fonctionne la P\u00eache sur Glace?\n&eCette capacit\u00e9 passive vous permet de p\u00eacher sur des lacs gel\u00e9s!\n&eLancez votre cane \u00e0 p\u00eache dans un lac gel\u00e9 et cette capacit\u00e9\n&ecr\u00e9era un trou dans la glace pour p\u00eacher. +Guides.Fishing.Section.3=&3Comment fonctionne Ma\u00eetre P\u00eacheur?\n&eCette capacit\u00e9 passive augmente la chance d\'une touche sur votre ligne de p\u00eache.\n&eLorsque vous avez d\u00e9bloqu\u00e9 cette capacit\u00e9, en p\u00eachant dans un bateau\n&eou lorsque vous \u00eates dans un biome oc\u00e9an, la chance d\'une touche est doubl\u00e9e. +Guides.Fishing.Section.4=&3Comment fonctionne la Secousse?\n&eCette capacit\u00e9 active vous permet de r\u00e9cup\u00e9rer des objets sur les mobs\n&een les crochetant avec une cane \u00e0 p\u00eache.\n&eLes mobs feront alors tomber au sol ce qu\'ils laisseraient normalement \u00e0 leur mort.\n&eIl est aussi possible de r\u00e9cup\u00e9rer des cr\u00e2nes de mobs, qui sont normalement\n&enon r\u00e9cup\u00e9rables. +Guides.Fishing.Section.5=&3Comment fonctionne le Repas du P\u00eacheur?\n&eCette capacit\u00e9 passive vous permet d\'augmenter la vie r\u00e9cup\u00e9r\u00e9e\n&een mangeant du poisson. +Guides.Fishing.Section.6=&3Notes sur la P\u00eache:\n&eLes loots de la P\u00eache sont enti\u00e8rement modifiables\n&edonc les r\u00e9sultats varient selon les serveurs. ##Herbalism -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.Herbalism.Section.0=&3A propos de l\'herboristerie:\n&eL\'herboristerie concerne la culture et la r\u00e9colte de plantes et d\'herbes.\n&3GAIN D\'XP:\n&eR\u00e9colte de plantes et d\'herbes. +Guides.Herbalism.Section.1=&3Blocs compatibles\n&eBl\u00e9, Potatoes, Carrotes, Melons, \n&eCitrouilles, Canne \u00e0 sucre, F\u00e8ves de Cacao, Fleurs, Cactus, Champignons,\n&eVerrues du Nether, N\u00e9nuphars, et Lianes. +Guides.Herbalism.Section.2=&3Comment fonctionne Main Verte?\n&eMain Verte est une capacit\u00e9 activ\u00e9e, gr\u00e2ce \u00e0 un clic-droit\n&elorsque vous tenez une houe.\n&eMain Verte donne au joueur une chance de r\u00e9cup\u00e9rer 3x ce que\n&edonnerai la plante r\u00e9colt\u00e9e. Vous pouvez \u00e9galement utiliser des\n&egraines pour insufler la vie \u00e0 certains blocs \n&eafin de les transformer. +Guides.Herbalism.Section.3=&3Comment Mains Vertes (Plantations) fonctionne ?\n&eCette capacit\u00e9 passive va automatiquement replanter les \n&eplantations lorsque celles-ci ont \u00e9t\u00e9 r\u00e9colt\u00e9es.\n&eLes chances de succ\u00e8es d\u00e9pendent de votre talent Herborisme. +Guides.Herbalism.Section.4=&3Comment Mains Vertes (Pierre/Briques de Pierre/Terre) fonctionent-elles ?\n&eCette cpacit\u00e9 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\u00e9e. +Guides.Herbalism.Section.5=&3Comment fonctionne r\u00e9gime fermier?\n&eCette capacit\u00e9 passive augmente le montant d\'\u00e9nergie rendue \n&elorsque vous mangez du pain, cookies, past\u00e8que, soupe \n&ede champignons, carottes et patates. +Guides.Herbalism.Section.6=&3Comment fonctione Chance d\'Hyrule?\n&eCette capacit\u00e9 passive vous donne une chance de trouver des\n&eobjets rares lorsque vous cassez certains blocs avec une \u00e9p\u00e9e. +Guides.Herbalism.Section.7=&3Comment fonctionne Double Drops?\n&eCette capacit\u00e9 passive donne au joueur\n&eplus d\'objets lors de ses r\u00e9coltes. ##Mining -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.Mining.Section.0=&3A propos du Minage:\n&eLe Minage consiste \u00e0 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\u00e9rience:\n&ePour gagner de l\'exp\u00e9rience dans cette comp\u00e9tence, vous devez simplement miner avec une pioche.\n&eSeulement certains blocs rapportent de l\'exp\u00e9rience. +Guides.Mining.Section.1=&3Mat\u00e9riaux 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\u00e9parer votre outil.\n&eUne fois cela fait, vous avez jusqu\'\u00e0 4 secondes pour commencer \u00e0 miner\n&edes mat\u00e9riaux compatibles, ce qui activera le Broyeur. +Guides.Mining.Section.3=&3Qu\'est-ce que le Super Briseur?\n&eLe Super Briseur est une capacit\u00e9 avec un temps de r\u00e9cup\u00e9ration li\u00e9 \u00e0 la Comp\u00e9tence\n&eminage. Il triple vos chances de r\u00e9cup\u00e9rer des objets et\n&epermet la casse instantan\u00e9e sur des minerais. +Guides.Mining.Section.4=&3Comment utiliser le Minage Explosif:\n&eAvec un d\u00e9tonateur en main, \u00e0 savoir un briquet par d\u00e9faut,\n&es\'accroupir et faire un clic droit sur de la TNT \u00e0 distance. Ceci fera\n&eexploser instantan\u00e9ment la TNT. +Guides.Mining.Section.5=&3Comment fonctionne le Minage par Explosions?\n&eLe Minage par Explosions est une capacit\u00e9 avec un temps de recharge li\u00e9 au talent\n&ede Minage. Il donne des bonus lors de l\'utilisation nde TNT pour le minage et vous permet\n&ede contr\u00f4ler l\'explosion de TNT. Il y a 3 parties du Minage par Explosions.\n&eLa premi\u00e8re est les Grosses Bombes. Elle vous permet d\'augmenter le rayon d\'explosion.\n&eLa seconde est la Demolition Experte, qui diminue les d\u00e9g\u00e2ts provenants des explosions de TNT\n&eLa troisi\u00e8me augmente le nombre de minerais obtenus par la TNT et diminue les pertes. ##Repair -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.Repair.Section.0=&3A propos de la R\u00e9paration :\n&eLa r\u00e9paration vous permet d\'utiliser un bloc de fer pour r\u00e9parer\n&edes armures et des outils.\n&3Gain d\'exp\u00e9rience:\n&eR\u00e9parer des outils ou des armures en utilisant l\'enclume de mcMMO.\n&eC\'est un bloc de fer par d\u00e9faut et il ne doit pas \u00eatre confondu avec\n&el\'enclume de Minecraft Vanilla. +Guides.Repair.Section.1=&3Comment utiliser R\u00e9paration?\n&ePlacez une enclume mcMMO et faites un clic droit pour r\u00e9parer l\'objet\n&eque vous avez en main. Ceci consomme 1 objet \u00e0 chaque utilisation. +Guides.Repair.Section.2=&3Comment fonctionne Ma\u00eetrise de la Forge?\n&eMa\u00eetrise de la Forge augmente la quantit\u00e9 de r\u00e9parations effectu\u00e9es.\n&eLa quantit\u00e9 de durabilit\u00e9 suppl\u00e9mentaire attribu\u00e9e est fonction de \n&evotre niveau en R\u00e9paration. +Guides.Repair.Section.3=&3Comment fonctionne la Super R\u00e9paration?\n&eLa Super R\u00e9paration est une capacit\u00e9 passive . Lors de la r\u00e9paration d\'un \u00e9l\u00e9ment ,\n&eelle accorde aux joueurs une chance de r\u00e9parer un \u00e9l\u00e9ment avec\n&eune double efficacit\u00e9. +Guides.Repair.Section.4=&3Comment fonctionne Forge arcanique?\n&eCette capacit\u00e9 passive vous permet de r\u00e9parer des objets avec une\n&ecertaine chance de conserver les enchantements. Ces derniers\n&epourrons \u00eatre conserv\u00e9 \u00e0 leur niveau, rendus \u00e0 un niveau inf\u00e9rieur\n&eou compl\u00e8tement perdus. ##Salvage -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.Salvage.Section.0=&3A propos du Recyclage:\n&eLe Recyclage vous permet d\'utiliser un bloc d\'or pour r\u00e9cup\u00e9rer des mati\u00e8res premi\u00e8res\n&esur de l\'armure ou des outils.\n&3Gain d\'Exp\u00e9rience:\n&eLe Recyclage est une Comp\u00e9tence enfant des comp\u00e9tences R\u00e9paration et P\u00eache, votre niveau\n&ede Recyclage est donc bas\u00e9 sur les niveaux des comp\u00e9tences R\u00e9paration et P\u00eache. +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\u00e9riaux 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\u00e9?\n&eLorsque d\u00e9bloqu\u00e9e, cette capacit\u00e9 vous permet de recycler des objets d\u00e9t\u00e9rior\u00e9s.\n&eVotre pourcentage de r\u00e9cup\u00e9ration de mat\u00e9riaux augmente avec votre niveau. Un pourcentage\n&eplus \u00e9lev\u00e9 signifie que vous pouvez r\u00e9cup\u00e9rer davantage de mat\u00e9riaux.\n&eAvec le Recyclage Avanc\u00e9 vous r\u00e9cup\u00e9rerez toujours un mat\u00e9riaux \n&esauf si l\'objet est trop endommag\u00e9. Vous n\'aurez donc pas \u00e0 vous\n&esoucier de casser des objets sans avoir rien r\u00e9cup\u00e9r\u00e9. +Guides.Salvage.Section.3=&3Voici une illustration pour expliquer comment cela fonctionne:\n&eDisons que nous recyclons une pioche en or endommag\u00e9e \u00e0 20%,\n&ece qui veux dire que le montant maximum que vous pouvez r\u00e9cup\u00e9rer est 2 (66%).\n&e(parce que la pioche est constitu\u00e9e de 3 lingots, valant chacun\n&e33,33% de durabilit\u00e9). Si votre pourcentage de r\u00e9cup\u00e9ration de mat\u00e9riaux\n&eest en dessous de 66% vous ne pourrez pas r\u00e9cup\u00e9rer 2 lingots.\n&eSi ce pourcentage est au dessus de 66% vous pourrez r\u00e9cup\u00e9rer le\n&e\"montant maximum\", donc 2 lingots. +Guides.Salvage.Section.4=&3Comment fonctionne le Recyclage Arcanique?\n&eCette capacit\u00e9 vous permet de r\u00e9cup\u00e9rer des livres enchant\u00e9s lors que vous recyclez\n&edes objets enchant\u00e9s. En fonction de votre niveau, la chance de r\u00e9cup\u00e9rer avec succ\u00e8s\n&edes enchantements entiers ou partiels varie.\n&eLorsqu\'un enchantement est partiellement r\u00e9cup\u00e9r\u00e9, le livre enchant\u00e9\n&eaura un niveau d\'enchantement plus bas compar\u00e9 \u00e0 l\'enchantement\n&ede l\'objet que recyclez. ##Smelting Guides.Smelting.Section.0=Prochainement... ##Swords -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.Swords.Section.0=&3A propos du combat \u00e0 l\'\u00e9p\u00e9e::\n&eCette comp\u00e9tence octroie un bonus si vous combattez avec\n&eune \u00e9p\u00e9e.\n&3XP GAIN:\n&eLe gain d\'XP est bas\u00e9 sur le montant des d\u00e9gats inflig\u00e9s aux mobs \n&eet autres joueurs avec une \u00e9p\u00e9e. +Guides.Swords.Section.1=&3Comment fonctionne coups d\u00e9chirants?\n&eCoups d\u00e9chirants est une capacit\u00e9 acitv\u00e9e, vous pouvez l\'activer\n&eavec un clic droit, une \u00e9p\u00e9e \u00e0 la main. Cette capacit\u00e9 vous permet \n&ed\'infliger des d\u00e9g\u00e2ts 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\u00e9 active. En bloquant les attaques\n&edes mobs, vous avez une chance de repousser 50% des\n&ed\u00e9g\u00e2ts qui vous sont inflig\u00e9s. +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\'\u00e0 ce que l\'effet s\'estompe, ou qu\'il meure,\n&een fonction de ce qui arrive en premier!\n&eLa durabilit\u00e9 du Saignement est augment\u00e9 avec votre Comp\u00e9tence \u00c9p\u00e9e. ##Taming -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.Taming.Section.0=&3A propos de l\'Apprivoisement:\n&eL\'apprivoisement conf\u00e8re au joueur divers bonus de combat\n&elorsqu\'il utilise un animal (loup/ocelot).\n&3GAIN D\'XP:\n&ePour gagner de l\'exp\u00e9rience, 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\u00e9 active qui vous permet de faire appel\n&e\u00e0 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\u00eates?\n&eConnaissance des b\u00eates permet au joueur d\'inspecter les stats\n&ede ses animaux. Cliquez gauche un loup ou un ocelot pour\n&eutiliser Connaissance des b\u00eates. +Guides.Taming.Section.3=&3Comment fonctione Gore?\n&eGore est une capacit\u00e9 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\u00e9es?\n&eGriffes aiguis\u00e9es ajoute un bonus de d\u00e9g\u00e2ts inflig\u00e9s par votre loup.\n&eLe bonus de d\u00e9g\u00e2ts d\u00e9pend de votre niveau en Apprivoisement. +Guides.Taming.Section.5=&3Comment fonctionne Attentif \u00e0 l\'environnement?\n&eCette capacit\u00e9 passive permet \u00e0 votre loup de se t\u00e9l\u00e9porter sur vous\n&elorsqu\'il se rapproche de dangers (cactus, lave, etc). Cela lui donne\n&e\u00e9galemment l\'immunit\u00e9 contre les d\u00e9g\u00e2ts de chute. +Guides.Taming.Section.6=&3Comment fonctionne Poil \u00c9pais?\n&eCette capacit\u00e9 passive rend vos loups moins vuln\u00e9rables\n&eet r\u00e9sistants au feu. +Guides.Taming.Section.7=&3Comment fonctionne r\u00e9sistance aux chocs?\n&eCette capacit\u00e9 passive r\u00e9duit les d\u00e9g\u00e2ts inflig\u00e9s \u00e0 vos loups\n&epar les explosions. +Guides.Taming.Section.8=&3Comment fonctionne Service Fast Food?\n&eCette capacit\u00e9 passive donne \u00e0 vos loups une chance de\n&ese soigner lorsqu\'ils effectuent une attaque. ##Unarmed -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.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\u00e9rience:\n&eVous gagnez de l\'exp\u00e9rience en fonction des d\u00e9g\u00e2ts inflig\u00e9s 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\u00e9 active qui est activ\u00e9e en faisant un clic-droit,\n&een n\'ayant rien \u00e0 la main. En mode Furie, vous infligerez 50% plus\n&ede d\u00e9g\u00e2ts et vous pourrez casser des mat\u00e9riaux faibles instantan\u00e9ment,\n&ecomme l\'Herbe et la Terre. +Guides.Unarmed.Section.2=&3Comment fonctionne le Bras de Fer?\n&eBras de Fer augmente les d\u00e9g\u00e2ts inflig\u00e9s lorsque vous attaquez des mobs ou\n&edes joueurs avec les Poings. +Guides.Unarmed.Section.3=&3Comment fonctionne la D\u00e9viation de Fl\u00e8che?\n&eLa D\u00e9viation de Fl\u00e8che est une capacit\u00e9 \n&equi permet de d\u00e9vier une fl\u00e8che tir\u00e9e par un Squelette ou un joueur.\n&eCette fl\u00e8che tombera alors au sol, inoffensive. +Guides.Unarmed.Section.4=&3Comment fonctionne la Poigne de Fer?\n&ePoigne de Fer est une capacit\u00e9 passive qui contre le d\u00e9sarmement. En am\u00e9liorant\n&evotre comp\u00e9tence Poings, la chance de parer un d\u00e9sarmement augmente. +Guides.Unarmed.Section.5=&3Comment fonctionne d\u00e9sarmement?\n&eCette capacit\u00e9 passive permet le joueur de d\u00e9sarmer d\'autres joueurs,\n&eprovoquant la chute au sol de ses objets \u00e9quip\u00e9s. ##Woodcutting -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. +Guides.Woodcutting.Section.0=&3A propos de b\u00fbcheronnage:\n&eLe b\u00fbcheronnage concerne l\'abattement d\'arbres.\n&3Gain d\'Exp\u00e9rience:\n&eVous gagniez de l\'exp\u00e9rience pour chaque bloc de bois cass\u00e9. +Guides.Woodcutting.Section.1=&3Comment fonctionne le Fendeur d\'Arbres?\n&eLe Fendage d\'Arbres est une capacit\u00e9 active, en faisant un clic-droit\n&eavec une hache \u00e0 la main, vous activerez cette capacit\u00e9. Ceci vous\n&epermettra d\'abattre un arbre int\u00e9gralement, en r\u00e9cup\u00e9rant\n&etoutes les b\u00fbches d\'un coup. +Guides.Woodcutting.Section.2=&3Comment fonctionne le Souffleur de Feuilles?\n&eSouffleur de Feuilles est une capacit\u00e9 passive qui permet de casser un\n&ebloc de feuilles instantan\u00e9ment quand vous les cassez avec un hache. Par d\u00e9faut,\n&ecette capacit\u00e9 est disponible au niveau 100 de la Comp\u00e9tence B\u00fbcheronnage. +Guides.Woodcutting.Section.3=&3Comment fonctionne Double Bois?\n&eCette capacit\u00e9 passive vous donne une chance\n&ede r\u00e9cup\u00e9rer une b\u00fbche suppl\u00e9mentaire par bloc de bois cass\u00e9. #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.OfflineStats=mcMMO Stats for Offline Player &e{0} +Inspect.Stats=&amcMMO Stats for &e{0} Inspect.TooFar=Vous \u00eates trop \u00e9loign\u00e9 de ce joueur pour l\'inspecter ! #ITEMS 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.ChimaeraWing.NotEnough=Vous avez besoin de [[YELLOW]]{0}[[RED]] [[GOLD]]{1}[[RED]] en plus! -Item.NotEnough=Vous avez besoin de [[YELLOW]]{0}[[RED]] [[GOLD]]{1}[[RED]] en plus! -Item.Generic.Wait=Vous devez attendre avant de pouvoir utiliser cela de nouveau ! [[YELLOW]]({0}s) -Item.Injured.Wait=Vous avez \u00e9t\u00e9 bless\u00e9 r\u00e9cemment et devez attendre pour utiliser cela. [[YELLOW]]({0}s) +Item.ChimaeraWing.Lore=&7Vous t\u00e9l\u00e9porte \u00e0 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 \u00e9t\u00e9 bless\u00e9 r\u00e9cemment 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}+ +Item.FluxPickaxe.Lore.1=&7A une chance de fondre des minerais instantan\u00e9ment. +Item.FluxPickaxe.Lore.2=&7Requi\u00e8re niveau de Forge {0}+ #TELEPORTATION -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 ! +Teleport.Commencing=&7La t\u00e9l\u00e9portation commence dans &6({0}) &7secondes, pri\u00e8re de ne pas bouger... +Teleport.Cancelled=&4T\u00e9l\u00e9portation annul\u00e9e ! #COMPETENCES -Skills.Child=[[GOLD]](TALENT ENFANT) -Skills.Disarmed=[[DARK_RED]]Vous avez \u00e9t\u00e9 d\u00e9sarm\u00e9 ! -Skills.Header=-----[][[GREEN]]{0}[[RED]][]----- -Skills.NeedMore=[[DARK_RED]]Vous devez en avoir plus -Skills.NeedMore.Extra=[[DARK_RED]]Vous avez besoin de [[GRAY]]{0}{1} +Skills.Child=&6(TALENT ENFANT) +Skills.Disarmed=&4Vous avez \u00e9t\u00e9 d\u00e9sarm\u00e9 ! +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.Stats={0}&a{1}&3 XP (&7{2}&3/&7{3}&3) +Skills.ChildStats={0}&a{1} Skills.MaxXP=Max 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. -Skills.AbilityGateRequirementFail=[[GRAY]]Vous devez avoir [[YELLOW]]{0}[[GRAY]] niveaux suppl\u00e9mentaires en [[DARK_AQUA]]{1}[[GRAY]] pour utilisez cette super abilit\u00e9. +Skills.ConfirmOrCancel=&aFa\u00eetes de nouveau un clic droit pour confirmer &6{0}&a. Clic gauche pour annuler. +Skills.AbilityGateRequirementFail=&7Vous devez avoir &e{0}&7 niveaux suppl\u00e9mentaires en &3{1}&7 pour utilisez cette super abilit\u00e9. #STATISTIQUES -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 +Stats.Header.Combat=&6-=COMP\u00c9TENCES DE COMBAT=- +Stats.Header.Gathering=&6-=COMP\u00c9TENCES DE R\u00c9COLTE=- +Stats.Header.Misc=&6-=AUTRES TALENTS=- +Stats.Own.Stats=&a[mcMMO] Statistiques #PERKS Perks.XP.Name=Exp\u00e9rience Perks.XP.Desc=Gain d\'EXP boost\u00e9 dans certains talents. Perks.Lucky.Name=Chance Perks.Lucky.Desc=Donnes {0} comp\u00e9tences et abilet\u00e9s 33.3% de chance d\'\u00eatre activ\u00e9es. Perks.Lucky.Desc.Login=Donne \u00e0 certaines comp\u00e9tences 33.3% de chance d\'\u00eatre activ\u00e9es. -Perks.Lucky.Bonus=[[GOLD]] ({0} avec votre avantage de chance) +Perks.Lucky.Bonus=&6 ({0} avec votre avantage de chance) Perks.Cooldowns.Name=Reg\u00e9n\u00e9ration rapide Perks.Cooldowns.Desc=Temps d\'attente r\u00e9duits de {0}. Perks.ActivationTime.Name=Endurance Perks.ActivationTime.Desc=Augmente la dur\u00e9e de l\'abil\u00e9t\u00e9 de {0} secondes. -Perks.ActivationTime.Bonus=[[GOLD]] ({0}s avec votre avantage d\'endurance) +Perks.ActivationTime.Bonus=&6 ({0}s avec votre avantage d\'endurance) #HARDCORE -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.Mode.Disabled=&6[mcMMO] Le mode Hardcore {0} a \u00e9t\u00e9 d\u00e9sactiv\u00e9 pour {1}. +Hardcore.Mode.Enabled=&6[mcMMO] Le mode Hardcore {0} a \u00e9t\u00e9 activ\u00e9 pour {1}. Hardcore.DeathStatLoss.Name=P\u00e9nalit\u00e9s sur les talents lors de la mort -Hardcore.DeathStatLoss.PlayerDeath=[[GOLD]][mcMMO] [[DARK_RED]]Vous avez perdu [[BLUE]]{0}[[DARK_RED]] niveau(x) dans votre mort. -Hardcore.DeathStatLoss.PercentageChanged=[[GOLD]][mcMMO] Le pourcentage de perte de statistiques a \u00e9t\u00e9 chang\u00e9 \u00e0 {0}. +Hardcore.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 \u00e9t\u00e9 chang\u00e9 \u00e0 {0}. Hardcore.Vampirism.Name=Vampirisme -Hardcore.Vampirism.Killer.Failure=[[GOLD]][mcMMO] [[YELLOW]]{0}[[GRAY]] \u00e9tait trop maladroit pour am\u00e9liorer votre connaissance. -Hardcore.Vampirism.Killer.Success=[[GOLD]][mcMMO] [[DARK_AQUA]]Vous avez vol\u00e9 [[BLUE]]{0}[[DARK_AQUA]] niveau(x) de [[YELLOW]]{1}. -Hardcore.Vampirism.Victim.Failure=[[GOLD]][mcMMO] [[YELLOW]]{0}[[GRAY]] Il n\'a pas \u00e9t\u00e9 capable de vous voler votre connaissance ! -Hardcore.Vampirism.Victim.Success=[[GOLD]][mcMMO] [[YELLOW]]{0}[[DARK_RED]] a vol\u00e9 [[BLUE]]{1}[[DARK_RED]] de vos niveaux ! -Hardcore.Vampirism.PercentageChanged=[[GOLD]][mcMMO] Le pourcentage de perte de statistiques a \u00e9t\u00e9 chang\u00e9 \u00e0 {0}. +Hardcore.Vampirism.Killer.Failure=&6[mcMMO] &e{0}&7 \u00e9tait trop maladroit pour am\u00e9liorer votre connaissance. +Hardcore.Vampirism.Killer.Success=&6[mcMMO] &3Vous avez vol\u00e9 &9{0}&3 niveau(x) de &e{1}. +Hardcore.Vampirism.Victim.Failure=&6[mcMMO] &e{0}&7 Il n\'a pas \u00e9t\u00e9 capable de vous voler votre connaissance ! +Hardcore.Vampirism.Victim.Success=&6[mcMMO] &e{0}&4 a vol\u00e9 &9{1}&4 de vos niveaux ! +Hardcore.Vampirism.PercentageChanged=&6[mcMMO] Le pourcentage de perte de statistiques a \u00e9t\u00e9 chang\u00e9 \u00e0 {0}. #MOTD -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.Donate=&3Donation Info: +MOTD.Hardcore.Enabled=&6[mcMMO] &3Mode Hardcore activ\u00e9 : &4{0} +MOTD.Hardcore.DeathStatLoss.Stats=&6[mcMMO] &3P\u00e9nalit\u00e9s 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\u00e9tences] -MOTD.Version=[[GOLD]][mcMMO] Version [[DARK_AQUA]]{0} -MOTD.Website=[[GOLD]][mcMMO] [[GREEN]]{0}[[YELLOW]] - Site de mcMMO +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 : [[YELLOW]]{0} -Smelting.Ability.FuelEfficiency=Multiplicateur d\'efficacit\u00e9 des Combustibles: [[YELLOW]]{0}x +Smelting.Ability.FluxMining=Chance de Minage en Flux : &e{0} +Smelting.Ability.FuelEfficiency=Multiplicateur d\'efficacit\u00e9 des Combustibles: &e{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.Ability.SecondSmelt=Chance de seconde cuisson: &e{0} +Smelting.Ability.VanillaXPBoost=Multiplicateur d\'EXP Vanilla: &e{0}x Smelting.SubSkill.FuelEfficiency.Name=Efficacit\u00e9 du combustible Smelting.SubSkill.FuelEfficiency.Description=Augmente la dur\u00e9e de vie du combustible utilis\u00e9 dans les fours lors des cuissons -Smelting.SubSkill.FuelEfficiency.Stat=Multiplicateur d\'efficacit\u00e9 du combustible: [[YELLOW]]{0}x +Smelting.SubSkill.FuelEfficiency.Stat=Multiplicateur d\'efficacit\u00e9 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 @@ -1088,31 +1088,31 @@ 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.Cooldown=&dTemps d\'attente +Scoreboard.Misc.Overall=&6Global Scoreboard.Misc.Ability=Capacit\u00e9 #DATABASE RECOVERY -Profile.PendingLoad=[[RED]]G\u00e9nial! Vos donn\u00e9es McMMO ont \u00e9t\u00e9 charg\u00e9es. -Profile.Loading.Success=[[GREEN]]Votre profil mcMMO a \u00e9t\u00e9 charg\u00e9. -Profile.Loading.FailurePlayer=[[RED]]mcMMO a des problèmes pour le chargement des donn\u00e9es, nous avons essay\u00e9 de les charger [[GREEN]]{0}[[RED]] fois.[[RED]] Vous devez contacter l'administrateur du serveur \u00e0 ce propos. mcMMO essayera de charger les donn\u00e9es jusqu\'\u00e0 votre d\u00e9connection, vous ne gagnerez pas d\'XP ou ne pourrez pas utiliser vos comp\u00e9tences tant que les donn\u00e9es ne sont pas charg\u00e9s. -Profile.Loading.FailureNotice=[[DARK_RED]][A][[RED]] mcMMO ne peut pas charger les donn\u00e9es pour [[YELLOW]]{0}[[RED]]. [[LIGHT_PURPLE]]Merci de v\u00e9rifier la configuration de la base de donn\u00e9es. Essaie fait {1}x. +Profile.PendingLoad=&cG\u00e9nial! Vos donn\u00e9es McMMO ont \u00e9t\u00e9 charg\u00e9es. +Profile.Loading.Success=&aVotre profil mcMMO a \u00e9t\u00e9 charg\u00e9. +Profile.Loading.FailurePlayer=&cmcMMO a des problèmes pour le chargement des donn\u00e9es, nous avons essay\u00e9 de les charger &a{0}&c fois.&c Vous devez contacter l'administrateur du serveur \u00e0 ce propos. mcMMO essayera de charger les donn\u00e9es jusqu\'\u00e0 votre d\u00e9connection, vous ne gagnerez pas d\'XP ou ne pourrez pas utiliser vos comp\u00e9tences tant que les donn\u00e9es ne sont pas charg\u00e9s. +Profile.Loading.FailureNotice=&4[A]&c mcMMO ne peut pas charger les donn\u00e9es pour &e{0}&c. &dMerci de v\u00e9rifier la configuration de la base de donn\u00e9es. Essaie fait {1}x. #Holiday -Holiday.AprilFools.Levelup=[[GOLD]]{0} est d\u00e9sormais au niveau [[GREEN]]{1}[[GOLD]]! -Holiday.Anniversary=[[BLUE]]Joyeux {0} anniversaire !\n[[BLUE]]En honneur \u00e0 tout le travail de nossr50 et \u00e0 tout les d\u00e9veloppeurs, voici un spectacle de feu d\'artifice ! +Holiday.AprilFools.Levelup=&6{0} est d\u00e9sormais au niveau &a{1}&6! +Holiday.Anniversary=&9Joyeux {0} anniversaire !\n&9En honneur \u00e0 tout le travail de nossr50 et \u00e0 tout les d\u00e9veloppeurs, voici un spectacle de feu d\'artifice ! #Messages de rappels -Reminder.Squelched=[[GRAY]]Rappel: Vous ne recevez pas les notifications de mcMMO, pour les activez, faites /mcnotify une seconde fois. Ceci est un rappel automatique toutes les heures. +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=[[GREEN]]Messages recharg\u00e9s ! +Locale.Reloaded=&aMessages recharg\u00e9s ! #Player Leveling Stuff -LevelCap.PowerLevel=[[GOLD]]([[GREEN]]mcMMO[[GOLD]]) [[YELLOW]]Vous avez atteint le niveau de power maximum de [[RED]]{0}[[YELLOW]]. Vous n'allez pas gagner de niveaux pour cette comp\u00e9tence. -LevelCap.Skill=[[GOLD]]([[GREEN]]mcMMO[[GOLD]]) [[YELLOW]]Vous avez atteint le niveau de power maximum de [[RED]]{0}[[YELLOW]] pour [[GOLD]]{1}[[YELLOW]]. Vous n'allez pas gagner de niveaux pour cette comp\u00e9tence. +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\u00e9tence. +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\u00e9tence. Commands.XPBar.Usage=Usage normal est /mmoxpbar Commands.Description.mmoxpbar=Configuration pour les joueurs des mcMMO XP bars Commands.Description.mmocompat=Information \u00e0 propos de mcMMO, des compatibilit\u00e9s or des de ses fonctionnalit\u00e9s -Compatibility.Layer.Unsupported=[[GOLD]]Compatibilit\u00e9s pour [[GREEN]]{0}[[GOLD]] n'est pas une version de Minecraft support\u00e9. -Compatibility.Layer.PartialSupport=[[GOLD]]Compatibilit\u00e9s pour [[GREEN]]{0}[[GOLD]] n'est pas une version de Minecraft support\u00e9, mais mcMMO utilise une version qui \u00e9mule certaines fonctionnalit\u00e9s manquantes. -Commands.XPBar.DisableAll=[[GOLD]] Toutes les barres d\'XP mcMMO sont d\u00e9sormais d\u00e9sactiv\u00e9s, utilisez /mmoxpbar reset pour remettre la configuration par d\u00e9faut. +Compatibility.Layer.Unsupported=&6Compatibilit\u00e9s pour &a{0}&6 n'est pas une version de Minecraft support\u00e9. +Compatibility.Layer.PartialSupport=&6Compatibilit\u00e9s pour &a{0}&6 n'est pas une version de Minecraft support\u00e9, mais mcMMO utilise une version qui \u00e9mule certaines fonctionnalit\u00e9s manquantes. +Commands.XPBar.DisableAll=&6 Toutes les barres d\'XP mcMMO sont d\u00e9sormais d\u00e9sactiv\u00e9s, utilisez /mmoxpbar reset pour remettre la configuration par d\u00e9faut. diff --git a/src/main/resources/locale/locale_hu_HU.properties b/src/main/resources/locale/locale_hu_HU.properties index ec8a0d86d..9dd51d6c9 100644 --- a/src/main/resources/locale/locale_hu_HU.properties +++ b/src/main/resources/locale/locale_hu_HU.properties @@ -13,7 +13,7 @@ JSON.LevelRequirement=Sz\u00FCks\u00E9ges Szint JSON.JWrapper.Target.Type=C\u00E9l T\u00EDpus: JSON.JWrapper.Target.Block=Blokk JSON.JWrapper.Target.Player=J\u00E1t\u00E9kos -JSON.JWrapper.Perks.Header=[[GOLD]]Szerencse Perk-kek +JSON.JWrapper.Perks.Header=&6Szerencse Perk-kek JSON.JWrapper.Perks.Lucky={0}% Jobb Es\u00E9ly JSON.Hover.Tips=Tippek JSON.Acrobatics=Akrobatika @@ -36,53 +36,53 @@ JSON.URL.Patreon=T\u00E1mogat\u00E1s nossr50-nak a munk\u00E1j\u00E1\u00E9rt \u0 JSON.URL.Spigot=A hivatalos mcMMO Spigot Forr\u00E1s Oldal! JSON.URL.Translation=Ford\u00EDtsd le az mcMMO-t m\u00E1s 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 # 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.Roll.Interaction.Activated=Teszt &cGurul\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. +Anvil.SingleItemStack=&cNem lehet \u00FAjrahasznos\u00EDtani, vagy jav\u00EDtani \u00F6sszerakott t\u00E1rgyakat, el\u0151sz\u00F6r szed sz\u00E9t az \u00F6sszerakott t\u00E1rgyakat. #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\u00C9PESS\u00C9GEK FRISS\u00CDTVE!** +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} +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\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]]] +Commands.XPGain.Overhaul=&6XP NYERES\u00C9G: &3{0} +MOTD.Version.Overhaul=&6[mcMMO] &3Fel\u00FAj\u00EDt\u00E1s Kora&6 - &3{0} +Overhaul.mcMMO.Header=&c[]=====[]&a mcMMO - Fel\u00FAj\u00EDt\u00E1s Kora &c[]=====[] +Overhaul.mcMMO.Url.Wrap.Prefix=&c[| +Overhaul.mcMMO.Url.Wrap.Suffix=&c|] +Overhaul.mcMMO.MmoInfo.Wiki=&e[&fN\u00E9zd meg a k\u00E9pess\u00E9get 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\u00F6vekedett &r&a&l{2}&r&f. Overhaul.Name.Acrobatics=Akrobatika Overhaul.Name.Alchemy=Alk\u00EDmia Overhaul.Name.Archery=\u00CDj\u00E1szat @@ -99,46 +99,46 @@ Overhaul.Name.Taming=Szel\u00EDd\u00EDt\u00E9s Overhaul.Name.Unarmed=Pusztakezek Overhaul.Name.Woodcutting=Fav\u00E1g\u00E1s # /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\u00C1LIS PARANCSOK&c[]--- +Commands.Party.Header=&c-----[]&aPARTY&c[]----- +Commands.Party.Features.Header=&c-----[]&aFUNKCI\u00D3K&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 \u00FAj k\u00E9pess\u00E9g tanul\u00E1sa... +XPBar.Acrobatics=Akrobatika &6{0}. &fSzint +XPBar.Alchemy=Alk\u00EDmia &6{0}. &fSzint +XPBar.Archery=\u00CDj\u00E1szat &6{0}. &fSzint +XPBar.Axes=Balt\u00E1szat &6{0}. &fSzint +XPBar.Excavation=\u00C1s\u00E1s &6{0}. &fSzint +XPBar.Fishing=Horg\u00E1szat &6{0}. &fSzint +XPBar.Herbalism=N\u00F6v\u00E9nytan &6{0}. &fSzint +XPBar.Mining=B\u00E1ny\u00E1szat &6{0}. &fSzint +XPBar.Repair=Jav\u00EDt\u00E1s &6{0}. &fSzint +XPBar.Salvage=\u00DAjrahasznos\u00EDt\u00E1s &6{0}. &fSzint +XPBar.Smelting=Olvaszt\u00E1s &6{0}. &fSzint +XPBar.Swords=Kardok &6{0}. &fSzint +XPBar.Taming=Szel\u00EDd\u00EDt\u00E9s &6{0}. &fSzint +XPBar.Unarmed=Pusztakezek &6{0}. &fSzint +XPBar.Woodcutting=Fav\u00E1g\u00E1s &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.Ability.Proc=&a**Kecses Landol\u00E1s** +Acrobatics.Combat.Proc=&a**Kit\u00E9r\u00EDtve** +Acrobatics.SubSkill.Roll.Stats=&6Es\u00E9ly Gurul\u00E1sra &e{0}%&6 Es\u00E9ly Kecses Gurul\u00E1sra&e {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 [[YELLOW]]{6}%[[GRAY]]. 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.Roll.Chance=Es\u00E9ly Gurul\u00E1sra: &e{0} +Acrobatics.SubSkill.Roll.GraceChance=Es\u00E9ly Kecses Gurul\u00E1sra: &e{0} +Acrobatics.SubSkill.Roll.Mechanics=&7A 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 &e{6}%&7. szintt\u0151l &e{0}%&7 es\u00E9lyed van a s\u00E9r\u00FCl\u00E9sek megel\u0151z\u00E9s\u00E9re, \u00E9s &e{1}%&7 ha aktiv\u00E1lod a Kecses Gurul\u00E1st.\nA siker es\u00E9lye egy line\u00E1ris g\u00F6rbe, ami a szintedhez igazodik eddig a szintig &e{2}&7, ahol az Akrobatika minden szintje add neked &e{3}%&7 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 &c{4}&7 s\u00E9r\u00FCl\u00E9st. A Kecses Gurul\u00E1s megakad\u00E1lyoz &a{5}&7 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 @@ -153,8 +153,8 @@ Alchemy.SubSkill.Catalysis.Description=N\u00F6veli a b\u00E1jitalok f\u0151z\u00 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.SubSkill.Concoctions.Stat=F\u0151zet Szint: &a{0}&3/&a{1} +Alchemy.SubSkill.Concoctions.Stat.Extra=Hozz\u00E1val\u00F3k [&a{0}&3]: &a{1} Alchemy.Listener=Alk\u00EDmia: Alchemy.Ability.Locked.0=LEZ\u00C1RVA {0}+ K\u00C9PESS\u00C9G SZINTIG (KATAL\u00CDZIS) Alchemy.SkillName=ALK\u00CDMIA @@ -182,13 +182,13 @@ 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.Ability.Lower=&7Leengeded a balt\u00E1d +Axes.Ability.Ready=&6Felemeled&3 a balt\u00E1d +Axes.Combat.CritStruck=&4KRITIKUS sebz\u00E9st kapt\u00E1l! Axes.Combat.CriticalHit=KRITIKUS SEBZ\u00C9S! -Axes.Combat.GI.Proc=[[GREEN]]**ER\u0150S \u00DCT\u00C9SSEL CSAPT\u00C1L** +Axes.Combat.GI.Proc=&a**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.Combat.SS.Struck=&4KOPONYA 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 @@ -207,13 +207,13 @@ Axes.SubSkill.GreaterImpact.Description=B\u00F3nusz sebz\u00E9st okoz felfegyver 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.Skills.SS.On=&a**Koponya T\u00F6r\u00E9s AKTIV\u00C1LVA** +Axes.Skills.SS.Refresh=&aA &eKoponya T\u00F6r\u00E9s &ak\u00E9pess\u00E9ged ism\u00E9t el\u00E9rhet\u0151! +Axes.Skills.SS.Other.Off=Koponya T\u00F6r\u00E9s&a kikapcsolva: &e{0} +Axes.Skills.SS.Other.On=&a{0}&2 haszn\u00E1lta a &cKoponya T\u00F6r\u00E9s &2k\u00E9pess\u00E9get! #EXCAVATION -Excavation.Ability.Lower=[[GRAY]]Leengeded az \u00E1s\u00F3d. -Excavation.Ability.Ready=[[GOLD]]El\u0151k\u00E9sz\u00EDted[[DARK_AQUA]] az \u00E1s\u00F3d. +Excavation.Ability.Lower=&7Leengeded az \u00E1s\u00F3d. +Excavation.Ability.Ready=&6El\u0151k\u00E9sz\u00EDted&3 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 @@ -224,23 +224,23 @@ Excavation.SubSkill.Archaeology.Stat.Extra=R\u00E9g\u00E9szet Tapasztalatpont Me 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.Skills.GigaDrillBreaker.On=&a**GIGA F\u00DAR\u00D3-T\u00D6R\u0150 AKTIV\u00C1LVA** +Excavation.Skills.GigaDrillBreaker.Refresh=&aA &eGiga F\u00FAr\u00F3-T\u00F6r\u0151 &ak\u00E9pess\u00E9ged ism\u00E9t el\u00E9rhet\u0151! +Excavation.Skills.GigaDrillBreaker.Other.Off=Giga F\u00FAr\u00F3-T\u00F6r\u0151&a kikapcsolva: &e{0} +Excavation.Skills.GigaDrillBreaker.Other.On=&a{0}&2 haszn\u00E1lta a &cGiga F\u00FAr\u00F3-T\u00F6r\u0151 &2k\u00E9pess\u00E9get! #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.ScarcityTip=&e&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=&7&oA Zavaros mozg\u00E1sok megijesztik a halakat! +Fishing.Exhausting=&c&oA horg\u00E1szbot helytelen haszn\u00E1lata f\u00E1radts\u00E1got okoz, \u00E9s elhaszn\u00E1l\u00F3dik a r\u00FAd! +Fishing.LowResourcesTip=&7\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: &7 **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.TreasureHunter.Stat=Kincsvad\u00E1sz Szint: &a{0}&3/&a{1} +Fishing.SubSkill.TreasureHunter.Stat.Extra=T\u00E1rgy Es\u00E9si Es\u00E9ly: &7\u00C1tlagos: &e{0} &aRendk\u00EDv\u00FCli: &e{1}\n&9Ritka: &e{2} &dEpikus: &e{3} &6Legend\u00E1s: &e{4} &bRekord: &e{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 @@ -249,25 +249,25 @@ Fishing.SubSkill.Shake.Description=T\u00E1rgy ler\u00E1z\u00E1sa \u00E9l\u0151l\ 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.FishermansDiet.Stat=Horg\u00E1szok Di\u00E9t\u00E1ja:&a 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.MasterAngler.Stat=Hozz\u00E1adott Nagyobb Harap\u00E1si es\u00E9ly a jelenlegi helyen: &a+{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.Chance.Raining=&9 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.Ability.TH.MagicFound=&7Valami m\u00E1gikusat \u00E9rzel ezzel a kap\u00E1ssal kapcsolatban... +Fishing.Ability.TH.Boom=&7BUMM!!! +Fishing.Ability.TH.Poison=&7Valami nincs rendben... Fishing.SkillName=HORG\u00C1SZAT #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.GTh=&a**Z\u00D6LD H\u00DCVELYK** +Herbalism.Ability.Lower=&7Leengeded a kap\u00E1dat. +Herbalism.Ability.Ready=&6El\u0151k\u00E9sz\u00EDted&3 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 @@ -275,12 +275,12 @@ 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.SubSkill.GreenThumb.Stat.Extra=Z\u00F6ld H\u00FCvelyk \u00C1llapota: &a 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.FarmersDiet.Stat=Farmerek Di\u00E9t\u00E1ja: &aSzint {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 @@ -290,20 +290,20 @@ 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.HylianLuck=&aHyrule 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.Skills.GTe.On=&a**Z\u00D6LD F\u00D6LD AKTIV\u00C1LVA** +Herbalism.Skills.GTe.Refresh=&aA &eZ\u00F6ld F\u00F6ld &ak\u00E9pess\u00E9ged ism\u00E9t el\u00E9rhet\u0151! +Herbalism.Skills.GTe.Other.Off=Z\u00F6ld F\u00F6ld&a kikapcsolva: &e{0} +Herbalism.Skills.GTe.Other.On=&a{0}&2 haszn\u00E1lta a &cZ\u00F6ld F\u00F6ld &2k\u00E9pess\u00E9get! #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.Ability.Lower=&7Leengeded a cs\u00E1k\u00E1nyod. +Mining.Ability.Ready=&6El\u0151k\u00E9sz\u00EDted&3 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 @@ -312,8 +312,8 @@ Mining.SubSkill.DoubleDrops.Description=Dupl\u00E1zza a Zs\u00E1km\u00E1ny es\u0 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.SubSkill.BlastMining.Stat=Robbant\u00E1sb\u00E1ny\u00E1szat:&a Szint {0}/{1} &7({2}) +Mining.SubSkill.BlastMining.Stat.Extra=Robban\u00E1si Hat\u00F3sug\u00E1r N\u00F6veked\u00E9s: &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 @@ -323,16 +323,16 @@ Mining.SubSkill.DemolitionsExpertise.Stat=Rombol\u00E1si Tud\u00E1s Sebz\u00E9s 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.Skills.SuperBreaker.On=&a**SZUPER T\u00D6R\u00C9S AKTIV\u00C1LVA** +Mining.Skills.SuperBreaker.Other.Off=Szuper T\u00F6r\u00E9s&a kikapcsolva: &e{0} +Mining.Skills.SuperBreaker.Other.On=&a{0}&2 haszn\u00E1lta a &cSzuper T\u00F6r\u00E9s &2k\u00E9pess\u00E9get! +Mining.Skills.SuperBreaker.Refresh=&aA &eSzuper T\u00F6r\u00E9s &ak\u00E9pess\u00E9ged ism\u00E9t el\u00E9rhet\u0151! #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.Other.On=&a{0}&2 haszn\u00E1lta a &cRobbant\u00E1sb\u00E1ny\u00E1szat &2k\u00E9pess\u00E9get! +Mining.Blast.Refresh=&aA &eRobbant\u00E1sb\u00E1ny\u00E1szat &ak\u00E9pess\u00E9ged ism\u00E9t el\u00E9rhet\u0151! #REPAIR Repair.SubSkill.Repair.Name=Jav\u00EDt\u00E1s Repair.SubSkill.Repair.Description=Eszk\u00F6z\u00F6k & P\u00E1nc\u00E9lzat jav\u00EDt\u00E1sa @@ -344,7 +344,7 @@ Repair.SubSkill.StoneRepair.Name=K\u0151 Jav\u00EDt\u00E1s ({0}+ K\u00C9PESS\u00 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.RepairMastery.Stat=Jav\u00EDt\u00E1si Mesters\u00E9g: &aExtra {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 @@ -352,65 +352,65 @@ Repair.SubSkill.DiamondRepair.Name=Gy\u00E9m\u00E1nt Jav\u00EDt\u00E1s ({0}+ K\u 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.SubSkill.ArcaneForging.Stat=M\u00E1gikus Kov\u00E1csol\u00E1s: &eSzint {0}/{1} +Repair.SubSkill.ArcaneForging.Stat.Extra=&3M\u00E1gikus Kov\u00E1csol\u00E1s Es\u00E9ly:&7 Siker &a{0}&7%, Sikertelen &c{1}&7% +Repair.Error=&4Az mcMMO hib\u00E1t \u00E9szlelt a t\u00E1rgy megjav\u00EDt\u00E1sa k\u00F6zben! +Repair.Listener.Anvil=&4Lehelyezt\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.Skills.AdeptDiamond=&4Nem vagy el\u00E9g tapasztalt ahhoz, hogy Gy\u00E9m\u00E1nttal jav\u00EDts. +Repair.Skills.AdeptGold=&4Nem vagy el\u00E9g tapasztalt ahhoz, hogy Arannyal jav\u00EDts. +Repair.Skills.AdeptIron=&4Nem vagy el\u00E9g tapasztalt ahhoz, hogy Vassal jav\u00EDts. +Repair.Skills.AdeptStone=&4Nem vagy el\u00E9g tapasztalt ahhoz, hogy K\u0151vel jav\u00EDts. +Repair.Skills.Adept=&cSz\u00FCks\u00E9ged van &e{0}&c szintre, hogy ezt megjav\u00EDthasd: &e{1} +Repair.Skills.FeltEasy=&7H\u00E1t ez k\u00F6nny\u0171 volt. +Repair.Skills.FullDurability=&7Ezt nem kell m\u00E9g jav\u00EDtani. +Repair.Skills.StackedItems=&4Nem tudsz jav\u00EDtani egybe rakott t\u00E1rgyakat. Repair.Pretty.Name=Jav\u00EDt\u00E1s #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.Perfect=&aSikeresen megtartottad a m\u00E1gikus energi\u00E1kat ebben a t\u00E1rgyban. #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.ScrapCollector.Stat=Hullad\u00E9kgy\u0171jt\u0151: &aHullad\u00E9kgy\u0171jt\u0151: &aHasznos\u00EDts \u00FAjra ak\u00E1r &e{0}&a 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.SubSkill.ArcaneSalvage.Stat=M\u00E1gikus \u00DAjrahasznos\u00EDt\u00E1s Szint: &e {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.Ability.Bonus.1=Hasznos\u00EDts \u00FAjra ak\u00E1r &e{0}&a t\u00E1rgyat. Egy kis szerencs\u00E9vel. +Salvage.Arcane.ExtractFull=&7M\u00C9 Teljes-Var\u00E1zslat Es\u00E9ly +Salvage.Arcane.ExtractPartial=&7M\u00C9 R\u00E9szleges-Var\u00E1zslat Es\u00E9ly +Salvage.Skills.Success=&aT\u00E1rgy \u00DAjrahasznos\u00EDtva! +Salvage.Skills.Adept.Damaged=&4Nem vagy el\u00E9g tapasztalt, hogy s\u00E9r\u00FClt t\u00E1rgyakat hasznos\u00EDthass \u00FAjra. +Salvage.Skills.Adept.Level=Sz\u00FCks\u00E9ges szint &e{1}&c \u00FAjrahasznos\u00EDt\u00E1shoz: &e{0} +Salvage.Skills.TooDamaged=&4Ez a t\u00E1rgy t\u00FAls\u00E1gosan s\u00E9r\u00FClt az \u00FAjrahasznos\u00EDt\u00E1shoz. +Salvage.Skills.ArcaneFailed=&cNem tudtad kinyerni a tud\u00E1st, ami ebben a t\u00E1rgyban lakozik. +Salvage.Skills.ArcanePartial=&cCsak r\u00E9szleges tud\u00E1st tudt\u00E1l kinyerni ebb\u0151l a t\u00E1rgyb\u00F3l. +Salvage.Skills.ArcaneSuccess=&aSikeresen kinyert\u00E9l minden tud\u00E1st ebb\u0151l a t\u00E1rgyb\u00F3l! +Salvage.Listener.Anvil=&4Lehelyezt\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.Skills.Lottery.Normal=&6\u00DAjrahasznos\u00EDthatsz &3{0}&6 anyagot ebb\u0151l &e{1}&6. +Salvage.Skills.Lottery.Perfect=&a&lT\u00F6k\u00E9letes!&r&6 K\u00F6nnyed\u00E9n \u00FAjrahasznos\u00EDtott\u00E1l egy &3{1}&6-t visszanyerve &3{0}&6 anyagot. +Salvage.Skills.Lottery.Untrained=&7M\u00E9g nem vagy el\u00E9g k\u00E9pezett az \u00FAjrahasznos\u00EDt\u00E1sban. Csak &c{0}&7 anyagot tudt\u00E1l helyre\u00E1ll\u00EDtani ebb\u0151l &a{1}&7. #Anvil (Shared between SALVAGE and REPAIR) Anvil.Unbreakable=Ez a t\u00E1rgy t\u00F6rhetetlen! #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.Ability.Lower=&7Leengeded a kardod. +Swords.Ability.Ready=&6El\u0151k\u00E9sz\u00EDted&3 a kardod. +Swords.Combat.Rupture.Note=&7MEGJ.: &e1 Tick t\u00F6rt\u00E9nik minden 0,5 m\u00E1sodpercenk\u00E9nt +Swords.Combat.Bleeding.Started=&4 V\u00E9rzel! +Swords.Combat.Bleeding.Stopped=&7A v\u00E9rz\u00E9s &ael\u00E1llt&7! +Swords.Combat.Bleeding=&a**AZ ELLENS\u00C9G V\u00C9RZIK** +Swords.Combat.Counter.Hit=&4Ellent\u00E1mad\u00E1s! +Swords.Combat.Countered=&a**ELLENT\u00C1MADVA!** +Swords.Combat.SS.Struck=&4R\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 @@ -426,16 +426,16 @@ 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.SubSkill.Rupture.Stat.Extra=T\u00F6r\u00E9s Hossza: &a{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.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.On=&a**FOGAZOTT PENGE AKTIV\u00C1LVA** +Swords.Skills.SS.Refresh=&aA &eFogazott Penge &ak\u00E9pess\u00E9ged ism\u00E9t el\u00E9rhet\u0151! +Swords.Skills.SS.Other.Off=Fogazott Penge&a kikapcsolva: &e{0} +Swords.Skills.SS.Other.On=&a{0}&2 haszn\u00E1lta a &cFogazott Penge &2k\u00E9pess\u00E9get! #TAMING Taming.Ability.Bonus.0=\u00C9bers\u00E9g Taming.Ability.Bonus.1=A farkasok elker\u00FClik a vesz\u00E9lyt @@ -455,14 +455,14 @@ Taming.Ability.Locked.2=LEZ\u00C1RVA {0}+ K\u00C9PESS\u00C9G SZINTIG (ROBBAN\u00 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.Combat.Chance.Gore=Es\u00E9ly D\u00F6f\u00E9sre: &e{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.CallOfTheWild.Description.2=&7GBKE: 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 @@ -478,23 +478,23 @@ Taming.SubSkill.ThickFur.Description=Cs\u00F6kkentett Sebz\u00E9s, T\u0171z\u00E 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.Wolf=&8A 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.Summon.COTW.Success.WithoutLifespan=&a(A Vadon Szava) &7Megid\u00E9zt\u00E9l egy &6{0}&7 +Taming.Summon.COTW.Success.WithLifespan=&a(A Vadon Szava) &7Megid\u00E9zt\u00E9l egy &6{0}&7 \u00E9s az id\u0151tartama &6{1}&7 m\u00E1sodperc. +Taming.Summon.COTW.Limit=&a(A Vadon Szava) &7Egyszerre csak &c{0} &7megid\u00E9zett &7{1} h\u00E1zi\u00E1llat lehet egyid\u0151ben. +Taming.Summon.COTW.TimeExpired=&a(A Vadon Szava) &7Az id\u0151 v\u00E9get \u00E9r, &6{0}&7 elt\u00E1vozik. +Taming.Summon.COTW.BreedingDisallowed=&a(A Vadon Szava) &cNem szapor\u00EDthatsz megid\u00E9zett \u00E1llatot. +Taming.Summon.COTW.NeedMoreItems=&a(A Vadon Szava) &7Sz\u00FCks\u00E9g van &e{0}&7 t\u00F6bb &3{1}&7(m) +Taming.Summon.Name.Format=&6(COTW) &f{0} \u00E1llata {1} #UNARMED Unarmed.Ability.Bonus.0=Ac\u00E9l-\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.Ability.IronGrip.Defender=&aA Vas-Markol\u00E1sodnak h\u00E1la nem lett\u00E9l Lefegyverezve! +Unarmed.Ability.Lower=&7Leengeded az \u00F6kleidet. +Unarmed.Ability.Ready=&6El\u0151k\u00E9sz\u00EDted&3 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 @@ -517,10 +517,10 @@ Unarmed.SubSkill.BlockCracker.Description=K\u0151 ki\u00FCt\u00E9se 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.On=&a**VADUL\u00C1S AKTIV\u00C1LVA** +Unarmed.Skills.Berserk.Other.Off=Vadul\u00E1s&a kikapcsolva: &e{0} +Unarmed.Skills.Berserk.Other.On=&a{0}&2 haszn\u00E1lta a &cVadul\u00E1s &2k\u00E9pess\u00E9get! +Unarmed.Skills.Berserk.Refresh=&aA &eVadul\u00E1s &ak\u00E9pess\u00E9ged ism\u00E9t el\u00E9rhet\u0151! #WOODCUTTING Woodcutting.Ability.0=Lev\u00E9lf\u00FAj\u00F3 Woodcutting.Ability.1=Elf\u00FAjja a leveleket az \u00FAtb\u00F3l @@ -542,175 +542,175 @@ Woodcutting.SubSkill.NaturesBounty.Description=Gy\u0171jts tapasztalatot a term\ 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.On=&a**FAD\u00D6NT\u00C9S AKTIV\u00C1LVA** +Woodcutting.Skills.TreeFeller.Refresh=&aA &eFad\u00F6nt\u00E9s &ak\u00E9pess\u00E9ged ism\u00E9t el\u00E9rhet\u0151! +Woodcutting.Skills.TreeFeller.Other.Off=Fad\u00F6nt\u00E9s&a kikapcsolva: &e{0} +Woodcutting.Skills.TreeFeller.Other.On=&a{0}&2 haszn\u00E1lta a &cFad\u00F6nt\u00E9s &2k\u00E9pess\u00E9get! Woodcutting.Skills.TreeFeller.Splinter=A BALT\u00C1D TUCATNYI DARABOKRA ESIK SZ\u00C9T! Woodcutting.Skills.TreeFeller.Threshold=Ez a fa t\u00FAl 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.ArrowDeflect=&f**NY\u00CDL ELH\u00C1R\u00CDTVA** +Combat.BeastLore=&a**VAD\u00C1LLAT TAN** +Combat.BeastLoreHealth=&3\u00C9let (&a{0}&3/{1}) +Combat.BeastLoreOwner=&3Tulajdonos (&c{0}&3) +Combat.BeastLoreHorseSpeed=&3L\u00F3 Mozg\u00E1si Sebess\u00E9g (&a{0} blokk/m\u00E1sodperc&3) +Combat.BeastLoreHorseJumpStrength=&3L\u00F3ugr\u00E1s ereje (&aMax {0} blokk&3) +Combat.Gore=&a**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.TargetDazed=A c\u00E9lpont &4Elk\u00E1bult +Combat.TouchedFuzzy=&4Bolyhost \u00E9rintett, K\u00E1bults\u00E1got \u00E9rzett. #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! +mcMMO.Description=&3Az &emcMMO&3 Projektr\u0151l:,&6Az mcMMO egy &cny\u00EDlt forr\u00E1sk\u00F3d\u00FA&6 RPG m\u00F3d, amit 2011 febru\u00E1rj\u00E1ban alap\u00EDtott &9nossr50&6. A c\u00E9l a min\u0151s\u00E9gi RPG \u00E9lm\u00E9ny biztos\u00EDt\u00E1sa.,&3Tippek:,&6 - &aHaszn\u00E1ld a &c/mcmmo help&a parancsot a parancsok megtekint\u00E9s\u00E9hez,&6 - &a\u00CDrd be a &c/K\u00C9PESS\u00C9GN\u00C9V&a parancsot a r\u00E9szletes k\u00E9pess\u00E9ginform\u00E1ci\u00F3khoz,&3Fejleszt\u0151k:,&6 - &anossr50 &9(Alap\u00EDt\u00F3 & Projektvezet\u0151),&6 - &aelectronicboy &9(Fejleszt\u0151),&6 - &akashike &9(Fejleszt\u0151),&6 - &at00thpick1 &9(Classic Karbantart\u00F3) +mcMMO.Description.FormerDevs=&3Kor\u00E1bbi Fejleszt\u0151k: &aGJ, NuclearW, bm01, TfT_02, Glitchfinder +Commands.addlevels.AwardAll.1=&aEl\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.1=&aEl\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. +Commands.addxp.AwardAll=&aEl\u00E9rt\u00E9l {0} tapasztalatot az \u00F6sszes k\u00E9pess\u00E9gben! +Commands.addxp.AwardSkill=&aEl\u00E9rt\u00E9l {0} tapasztalatot a k\u00F6vetkez\u0151ben {1}! +Commands.Ability.Off=K\u00E9pess\u00E9g haszn\u00E1lat &ckikapcsolva. +Commands.Ability.On=K\u00E9pess\u00E9g haszn\u00E1lat &abekapcsolva. +Commands.Ability.Toggle=K\u00E9pess\u00E9g haszn\u00E1lat kikapcsolva &e{0} +Commands.AdminChat.Off=Admin Chat &c kikapcsolva. +Commands.AdminChat.On=Admin Chat &a bekapcsolva. +Commands.AdminToggle=&a- Admin chat \u00E1ll\u00EDt\u00E1sa. 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.Cooldowns.Header=&6--= &amcMMO K\u00E9pess\u00E9g V\u00E1rakoz\u00E1sok&6 =-- +Commands.Cooldowns.Row.N=\ &c{0}&f - &6{1} m\u00E1sodperc maradt +Commands.Cooldowns.Row.Y=\ &b{0}&f - &2K\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.Disabled=Ez a parancs le van tiltva. -Commands.DoesNotExist= [[RED]]A j\u00E1t\u00E9kos nincs az adatb\u00E1zisban! +Commands.DoesNotExist= &cA 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.AdminChatSpy.Toggle=mcMMO Party Chat \u00E1ll\u00EDtva neki &e{0} +Commands.AdminChatSpy.Chat=&6[SPY: &a{0}&6] &f{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.GodMode.Toggle=Isten m\u00F3d \u00E1t\u00E1ll\u00EDtva &e{0} +Commands.Healthbars.Changed.HEARTS=[mcMMO] Az \u00E9l\u0151l\u00E9nyek \u00E9leter\u0151cs\u00EDkj\u00E1nak megjelen\u00EDt\u00E9se \u00E1t\u00E1ll\u00EDtva a k\u00F6vetkez\u0151re:&cSz\u00EDvek&f. +Commands.Healthbars.Changed.BAR=[mcMMO] Az \u00E9l\u0151l\u00E9nyek \u00E9leter\u0151cs\u00EDkj\u00E1nak megjelen\u00EDt\u00E9se \u00E1t\u00E1ll\u00EDtva a k\u00F6vetkez\u0151re: &eDobozok&f. +Commands.Healthbars.Changed.DISABLED=[mcMMO] Az \u00E9l\u0151l\u00E9nyek \u00E9leter\u0151cs\u00EDkja sz\u00E1modra &7kikapcsolva&f. 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.Inspect= &a- R\u00E9szletesebb inform\u00E1ci\u00F3k a j\u00E1t\u00E9kosr\u00F3l +Commands.Invite.Success=&aA megh\u00EDv\u00E1s sikeresen elk\u00FCldve. +Commands.Leaderboards= &a- Ranglista +Commands.mcgod=&a- 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.mcpurge.Success=&aAz adatb\u00E1zis sikeresen megtiszt\u00EDtva! +Commands.mcrank.Heading=&6-=SZEM\u00C9LYES RANGSOR=- +Commands.mcrank.Overall=\u00D6sszes\u00EDtett&a - &6Szint &f#&a{0} +Commands.mcrank.Player=&eHelyez\u00E9s &f{0} +Commands.mcrank.Skill=&e{0}&a - &6Szint &f#&a{1} +Commands.mcrank.Unranked=&fNincs 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.mcremove.Success=&a{0} sikeresen t\u00F6r\u00F6lve az adatb\u00E1zisb\u00F3l! +Commands.mctop.Tip=&6Tip: Haszn\u00E1ld a &c/mcrank&6 parancsot, hogy megn\u00E9zd a szem\u00E9lyes szintjeid! +Commands.mmoedit=[player] &a - C\u00E9lpont m\u00F3dos\u00EDt\u00E1sa +Commands.mmoedit.AllSkills.1=&aMinden k\u00E9pess\u00E9g szintje {0}-ra/re lett \u00E1ll\u00EDtva! +Commands.mmoedit.Modified.1=&aA 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.Database.Start=&7Konvert\u00E1l\u00E1s megkezd\u00E9se a {0}-b\u00F3l az {1}-be... +Commands.mcconvert.Database.Finish=&7Adatb\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:&a{0} +Commands.mcconvert.Experience.Invalid=Ismeretlen k\u00E9plet! L\u00E9tez\u0151 k\u00E9pletek t\u00EDpusai: &aLINE\u00C1RIS &c\u00E9s &aEXPONENCI\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.mcconvert.Experience.Start=&7Konvert\u00E1l\u00E1s megkezd\u00E9se a/az {0} g\u00F6rb\u00E9b\u0151l a/az {1} g\u00F6rb\u00E9be. +Commands.mcconvert.Experience.Finish=&7K\u00E9plet konvert\u00E1l\u00E1s elk\u00E9sz\u00FClt; mostant\u00F3l a/az {0} XP g\u00F6rbe van haszn\u00E1latban. +Commands.ModDescription=&a- 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.Notifications.Off=K\u00E9pess\u00E9g \u00E9rtes\u00EDt\u00E9s &ckikapcsolva. +Commands.Notifications.On=K\u00E9pess\u00E9g \u00E9rtes\u00EDt\u00E9s &abekapcsolva. 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.XPBar.Reset=[[GOLD]]Az XP s\u00E1v be\u00E1ll\u00EDt\u00E1sok az mcMMO-hoz vissza\u00E1ll\u00EDtva. -Commands.XPBar.SettingChanged=[[GOLD]]XP s\u00E1v be\u00E1ll\u00EDt\u00E1sok [[GREEN]]{0}[[GOLD]]-nak/nek be\u00E1ll\u00EDtve erre [[GREEN]]{1} +Commands.Party.Status=&8N\u00C9V: &f{0} {1} &8SZINT: &3{2} +Commands.Party.Status.Alliance=&8SZ\u00D6VETS\u00C9GES: &f{0} +Commands.Party.UnlockedFeatures=&8Feloldott Funkci\u00F3k: &7[[ITALIC]]{0} +Commands.Party.ShareMode=&8Osztoz\u00E1s m\u00F3d: +Commands.Party.ItemShare=&7T\u00C1RGY &3({0}) +Commands.Party.ExpShare=&7TAPASZTALAT &3({0}) +Commands.Party.ItemShareCategories=&8T\u00E1rgyak Megoszt\u00E1sa: &7[[ITALIC]]{0} +Commands.Party.MembersNear=&8A K\u00D6ZELEDBEN &3{0}&8/&3{1} +Commands.Party.Accept=&a- Party felk\u00E9r\u00E9s elfogad\u00E1sa +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\u00E9r\u00E9st kapt\u00E1l a(z) {0}-ba/be {1}-t\u00F3l/t\u0151l. +Commands.Party.Invite.1=&e\u00CDrd be, hogy &a/party accept&e a megh\u00EDv\u00E1s elfogad\u00E1s\u00E1hoz. +Commands.Party.Invite=&a- Party megh\u00EDv\u00E1s k\u00FCld\u00E9se. +Commands.Party.Invite.Accepted=&aMegh\u00EDv\u00E1s elfogadva. Bel\u00E9pt\u00E9l a(z) {0} partyba. +Commands.Party.Join=&7Bel\u00E9pt\u00E9l a partyba: {0} +Commands.Party.PartyFull=&6{0}&c tele van! +Commands.Party.PartyFull.Invite=Nem lehet megh\u00EDvni &e{0}&c-t ide &a{1}&c mert m\u00E1r van &3{2}&c j\u00E1t\u00E9kos bent! +Commands.Party.PartyFull.InviteAccept=Nem lehet bel\u00E9pni ide &a{0}&c mert m\u00E1r van &3{1}&c j\u00E1t\u00E9kos bent! +Commands.Party.Create=&7Elk\u00E9sz\u00EDtetted: {0} +Commands.Party.Rename=&7Party n\u00E9v megv\u00E1ltoztatva: &f{0}-ra/re. +Commands.Party.SetSharing=&7Party {0} osztoz\u00E1s be\u00E1ll\u00EDtva: &3{1}-ra/re. +Commands.Party.ToggleShareCategory=&7Party t\u00E1rgy megoszt\u00E1s a &6{0}-ra/re &7be\u00E1ll\u00EDtva &3{1}-ra/re. +Commands.Party.AlreadyExists=&4A {0} party m\u00E1r l\u00E9tezik! +Commands.Party.Kick=&cKi lett\u00E9l r\u00FAgva a {0} partyb\u00F3l! +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\u00E1sa. +Commands.Party.Teleport=&a- party taghoz val\u00F3 teleport\u00E1l\u00E1s. +Commands.Party.Toggle=&a- party Chat ki/be kapcsol\u00E1sa +Commands.Party1=&a- \u00DAj party l\u00E9trehoz\u00E1sa. +Commands.Party2=&a- Egy j\u00E1t\u00E9kos partyj\u00E1hoz val\u00F3 csatlakoz\u00E1s. +Commands.Party.Alliance.Header=&c-----[]&aPARTY SZ\u00D6VETS\u00C9G&c[]----- +Commands.Party.Alliance.Ally=&f{0} &8SZ\u00D6VETS\u00C9GES VELE: &f{1} +Commands.Party.Alliance.Members.Header=&c-----[]&aSZ\u00D6VETS\u00C9G TAGJAI:&c[]----- +Commands.Party.Alliance.Invite.0=FIGYELEM: &aA {0} partyhoz sz\u00F6vets\u00E9g megh\u00EDv\u00E1st kapt\u00E1l {1}-t\u00F3l/t\u0151l. +Commands.Party.Alliance.Invite.1=\u00CDrd be, hogy &a/party alliance accept&e a megh\u00EDv\u00E1s elfogad\u00E1s\u00E1hoz. +Commands.Party.Alliance.Invite.Accepted=&aSz\u00F6vets\u00E9g megh\u00EDv\u00E1s elfogadva. +Commands.Party.Alliance.None=&cA partydnak nincsenek sz\u00F6vets\u00E9gesei. +Commands.Party.Alliance.AlreadyAllies=&cA partydnak m\u00E1r van egy sz\u00F6vets\u00E9gese. Sz\u00F6vets\u00E9g felbont\u00E1sa: &3/party alliance disband +Commands.Party.Alliance.Help.0=&cEz a party m\u00E9g nem szerzett sz\u00F6vets\u00E9gest. H\u00EDvj meg egy party vezet\u0151t. +Commands.Party.Alliance.Help.1=&c sz\u00F6vets\u00E9g l\u00E9trehoz\u00E1sa: &3/party alliance invite &c. +Commands.ptp.Enabled=Party teleport\u00E1l\u00E1s &aenged\u00E9lyezve. +Commands.ptp.Disabled=Party teleport\u00E1l\u00E1s &cletiltva. +Commands.ptp.NoRequests=&cJelenleg nincs teleport felk\u00E9r\u00E9sed. +Commands.ptp.NoWorldPermissions=&c[mcMMO] Nincs jogod a {0} vil\u00E1gba teleport\u00E1lni. +Commands.ptp.Request1=&e{0} &ateleport felk\u00E9r\u00E9st k\u00FCld\u00F6tt. +Commands.ptp.Request2=&aTeleport\u00E1l\u00E1shoz \u00EDrd be, hogy &e/ptp accept&a. A felk\u00E9r\u00E9s lej\u00E1r &c{0} &a m\u00E1sodperc m\u00FAlva. +Commands.ptp.AcceptAny.Enabled=Party teleport felk\u00E9r\u00E9s meger\u0151s\u00EDt\u00E9se &aenged\u00E9lyezve. +Commands.ptp.AcceptAny.Disabled=Party teleport felk\u00E9r\u00E9s meger\u0151s\u00EDt\u00E9se &cletiltva. +Commands.ptp.RequestExpired=&cA party teleport felk\u00E9r\u00E9s lej\u00E1rt. +Commands.PowerLevel.Leaderboard=&e--mcMMO&9 Er\u0151 Szint &eToplista-- +Commands.PowerLevel.Capped=&4ER\u0150 SZINT: &a{0} &4MAX SZINT: &e{1} +Commands.PowerLevel=&4ER\u0150 SZINT: &a{0} +Commands.Reset.All=&aMinden k\u00E9pess\u00E9ged sikeresen null\u00E1zva. +Commands.Reset.Single=&aA {0} k\u00E9pess\u00E9ged szintje sikeresen null\u00E1zva. +Commands.Reset=&a- K\u00E9pess\u00E9g szintj\u00E9nek null\u00E1z\u00E1sa. +Commands.Scoreboard.Clear=&3mcMMO scoreboard elt\u00FCntetve. +Commands.Scoreboard.NoBoard=&cAz mcMMO scoreboard nem akt\u00EDv. +Commands.Scoreboard.Keep=&3Az mcMMO scoreboard l\u00E1that\u00F3 marad, az elt\u00FCntet\u00E9shez haszn\u00E1ld a &a/mcscoreboard clear&3 parancsot. +Commands.Scoreboard.Timer=&3Az mcMMO scoreboard &6{0}&3 m\u00E1sodperc m\u00FAlva t\u00F6rl\u0151dik. +Commands.Scoreboard.Help.0=&6 == &aSeg\u00EDts\u00E9g: &c/mcscoreboard&6 == +Commands.Scoreboard.Help.1=&3/mcscoreboard&b clear &f - az mcMMO scoreboard elt\u00FCntet\u00E9se. +Commands.Scoreboard.Help.2=&3/mcscoreboard&b keep &f - az mcMMO scoreboard fenntart\u00E1sa. +Commands.Scoreboard.Help.3=&3/mcscoreboard&b time [n] &f - az mcMMO scoreboard elt\u00FCntet\u00E9se &dn&f m\u00E1sodperc m\u00FAlva. +Commands.Scoreboard.Tip.Keep=&6Tipp: Haszn\u00E1ld a &c/mcscoreboard keep&6 parancsot, m\u00EDg l\u00E1that\u00F3 a scoreboard, hogy ne t\u0171nj\u00F6n el. +Commands.Scoreboard.Tip.Clear=&6Tipp: Haszn\u00E1ld a &c/mcscoreboard clear&6 parancsot, hogy elt\u00FCntesd a scoreboard-ot. +Commands.XPBar.Reset=&6Az XP s\u00E1v be\u00E1ll\u00EDt\u00E1sok az mcMMO-hoz vissza\u00E1ll\u00EDtva. +Commands.XPBar.SettingChanged=&6XP s\u00E1v be\u00E1ll\u00EDt\u00E1sok &a{0}&6-nak/nek be\u00E1ll\u00EDtve erre &a{1} 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.Skill.Leaderboard=--mcMMO &9{0}&e Toplista-- +Commands.SkillInfo=&a- Egy k\u00E9pess\u00E9g r\u00E9szletes le\u00EDr\u00E1s\u00E1nak megtekint\u00E9se. +Commands.Stats=&a- Az mcMMO statisztik\u00E1k megtekint\u00E9se. +Commands.ToggleAbility=&a- K\u00E9pess\u00E9g kapcsol\u00E1sa jobb kattint\u00E1ssal. +Commands.Usage.0=&cA helyes haszn\u00E1lat: /{0} +Commands.Usage.1=&cA helyes haszn\u00E1lat: /{0} {1} +Commands.Usage.2=&cA helyes haszn\u00E1lat: /{0} {1} {2} +Commands.Usage.3=&cA helyes haszn\u00E1lat: /{0} {1} {2} {3} Commands.Usage.FullClassName=classname Commands.Usage.Level=level Commands.Usage.Message=message @@ -723,69 +723,69 @@ 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.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.Mystery=&7M\u00E9g nem oldottad fel ezt a k\u00E9pess\u00E9get, de ha igen, akkor el tudod olvasni a r\u00E9szleteket itt! Commands.MmoInfo.NoMatch=Ez az alk\u00E9pess\u00E9g nem l\u00E9tezik! -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.Header=&3-=[]=====[]&6 MMO Inf\u00F3 &3[]=====[]=- +Commands.MmoInfo.SubSkillHeader=&6N\u00E9v:&e {0} +Commands.MmoInfo.DetailsHeader=&3-=[]=====[]&a R\u00E9szletek &3[]=====[]=- +Commands.MmoInfo.OldSkill=&7Az 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=&3-=[]=====[]&6 Mechanik\u00E1k &3[]=====[]=- 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.Mmodebug.Toggle=Az mcMMO hibakeres\u0151 m\u00F3d most m\u00E1r &6{0}&7, 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=&cJelenleg nincsenek megh\u00EDv\u00E1said. +mcMMO.NoPermission=&4Nincs enged\u00E9lyed. +mcMMO.NoSkillNote=&8Ha nincs jogod egy k\u00E9pess\u00E9ghez, akkor az nem fog itt l\u00E1tszani. ##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.Help.0=&cA megfelel\u0151 haszn\u00E1lat &3{0} [jelsz\u00F3]. +Party.Help.1=&cParty l\u00E9trehoz\u00E1s\u00E1\u00E9rt haszn\u00E1ld &3{0} [jelsz\u00F3]. +Party.Help.2=&cHaszn\u00E1ld &3{0} &c t\u00F6bb inform\u00E1ci\u00F3\u00E9rt. +Party.Help.3=&cHaszn\u00E1ld &3{0} [jelsz\u00F3] &c a csatlakoz\u00E1shoz, vagy &3{1} &c a kil\u00E9p\u00E9shez. +Party.Help.4=&cHaszn\u00E1ld hogy z\u00E1rolhasd/feloldhasd a partyt: &3{0} +Party.Help.5=&cParty jelsz\u00F3 megad\u00E1s\u00E1hoz haszn\u00E1ld: &3{0} +Party.Help.6=&cEgy j\u00E1t\u00E9kos kir\u00FAg\u00E1s\u00E1hoz haszn\u00E1ld: &3{0} +Party.Help.7=&cA party tulajdonjog\u00E1nak \u00E1truh\u00E1z\u00E1s\u00E1hoz haszn\u00E1ld: &3{0} +Party.Help.8=&cHogy feloszlasd a partyt, haszn\u00E1ld: &3{0} +Party.Help.9=&cHaszn\u00E1ld &3{0} &chogy enged\u00E9lyezd a t\u00E1rgy megoszt\u00E1s\u00E1t a party tagokkal. +Party.Help.10=&cHaszn\u00E1ld &3{0} &chogy enged\u00E9lyezd az XP megoszt\u00E1s\u00E1t a party tagokkal. +Party.InformedOnJoin={0} &aCsatlakozott a partyba! +Party.InformedOnQuit={0} &aKil\u00E9pett a partyb\u00F3l! +Party.InformedOnNameChange=&6{0} &aA party neve sikeresen megv\u00E1ltoztatva erre:&f{1} +Party.InvalidName=&4Nincs ilyen party! +Party.Invite.Self=&cNem h\u00EDvhatod meg magad! +Party.IsLocked=&cA party m\u00E1r le van z\u00E1rva! +Party.IsntLocked=&cEz a party nincs z\u00E1rva! +Party.Locked=&cA party z\u00E1rva, csak a vezet\u0151 tud megh\u00EDvni! +Party.NotInYourParty=&4{0} nincs a partyban! +Party.NotOwner=&4Nem vagy a party vezet\u0151je! +Party.Target.NotOwner=&4{0} nem party vezet\u0151. +Party.Owner.New=&a{0} az \u00FAj party vezet\u0151. +Party.Owner.NotLeader=&4Mostant\u00F3l nem te vagy a party vezet\u0151je. +Party.Owner.Player =&aTe vagy a party vezet\u0151je. +Party.Password.None=&cEz a party jelsz\u00F3val v\u00E9dett. Adj meg jelsz\u00F3t a csatlakoz\u00E1shoz. +Party.Password.Incorrect=&cNem egyezik a party jelsz\u00F3! +Party.Password.Set=&aA party jelsz\u00F3 be\u00E1ll\u00EDtva: {0} +Party.Password.Removed=&aparty jelsz\u00F3 t\u00F6r\u00F6lve. +Party.Player.Invalid=&cNincs ilyen j\u00E1t\u00E9kos! +Party.NotOnline=&4{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.PlayerNotInParty=&4{0} nincs partyban. +Party.Specify=&cMeg kell adnod egy partyt. +Party.Teleport.Dead=&cNem teleport\u00E1lhatsz halott j\u00E1t\u00E9koshoz! +Party.Teleport.Hurt=&cAz elm\u00FAlt {0} m\u00E1sodpercben s\u00E9r\u00FClt meg, \u00E9s nem tud teleport\u00E1lni. +Party.Teleport.Player=&aHozz\u00E1 teleport\u00E1lt\u00E1l: {0}. +Party.Teleport.Self=&cNem teleport\u00E1lhatsz magadhoz! +Party.Teleport.Target=&a{0} hozz\u00E1d teleport\u00E1lt. +Party.Teleport.Disabled=&c{0} nincs enged\u00E9lyezve a party teleport\u00E1l\u00E1s! +Party.Rename.Same=&cEz m\u00E1r 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\u00F3l sz\u00F6vets\u00E9gben van vel\u00FCk: &a{0} +Party.Alliance.Disband=&7A p\u00E1rtod nem sz\u00F6vets\u00E9ges t\u00F6bb\u00E9 vel\u00FCk: &c{0} +Party.Status.Locked=&4(MEGH\u00CDV\u00C1S) +Party.Status.Unlocked=&2(NYITVA) +Party.LevelUp=&eA 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 @@ -796,11 +796,11 @@ Party.Feature.Locked.Teleport=LEZ\u00C1RVA {0}+ SZINTIG (PARTY TELEPORT\u00C1L\u 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.Feature.Disabled.1=&cA party t\u00E1rsalg\u00F3 m\u00E9g nem nyitott. +Party.Feature.Disabled.2=&cA party teleport\u00E1l\u00E1s m\u00E9g nem nyitott. +Party.Feature.Disabled.3=&cA party sz\u00F6vets\u00E9g m\u00E9g nem nyitott. +Party.Feature.Disabled.4=&cA party t\u00E1rgy megoszt\u00E1s m\u00E9g nem nyitott. +Party.Feature.Disabled.5=&cA party XP megoszt\u00E1s m\u00E9g nem nyitott. Party.ShareType.Xp=XP Party.ShareType.Item=T\u00C1RGY Party.ShareMode.None=EGYIK SEM @@ -826,216 +826,216 @@ 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.XPGain=&8XP NYERES\u00C9G: &f{0} +Commands.xplock.locked=&6Az XP s\u00E1v most le van z\u00E1rva {0}! +Commands.xplock.unlocked=&6Az XP s\u00E1v most &aFELOLDVA&6! +Commands.xprate.modified=&cAz XP AR\u00C1NYA m\u00F3dosult {0} +Commands.xprate.over=&cmcMMO XP szorz\u00F3 esem\u00E9ny V\u00C9GE! +Commands.xprate.proper.0=&cAz XP sebess\u00E9g v\u00E1ltoztat\u00E1s\u00E1nak megfelel\u0151 haszn\u00E1lata: /xprate +Commands.xprate.proper.1=&cAz XP-alap\u00E9rtelmezett \u00E9rt\u00E9k helyes vissza\u00E1ll\u00EDt\u00E1sa: /xprate reset +Commands.xprate.proper.2=&cAdjon 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.Event.Start=&amcMMO&6 Event! +Commands.Event.Stop=&amcMMO&3 Event V\u00E9ge! +Commands.Event.Stop.Subtitle=&aRem\u00E9lem j\u00F3l \u00E9rezted magad! +Commands.Event.XP=&3Az XP szorz\u00F3 &6{0}&3x! +Commands.xprate.started.0=&6mcMMO XP szorz\u00F3 esem\u00E9ny kezd\u0151d\u00F6tt! +Commands.xprate.started.1=&6mcMMO XP Ar\u00E1nya 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\u00E1ll\u00EDtottad a glob\u00E1lis XP szorz\u00F3t erre &6{0}x +Notifications.Admin.XPRate.End.Self=&7Megszak\u00EDtottad az XP szorz\u00F3 eventet. +Notifications.Admin.XPRate.End.Others={0} &7megszak\u00EDtotta az XP szorz\u00F3 eventet. +Notifications.Admin.XPRate.Start.Others={0} &7elind\u00EDtotta vagy m\u00F3dos\u00EDtotta az XP szorz\u00F3 eventet glob\u00E1lis {1}x szorz\u00F3val +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\u00F3 event! Az XP ar\u00E1nya {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.Available=&7A {0} seg\u00EDts\u00E9g el\u00E9rhet\u0151 - haszn\u00E1lat: /{1} ? [oldal] +Guides.Header=&6-=&a{0} Seg\u00EDts\u00E9g&6=- 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] ##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\u00E1r\u00F3l:\n&eAz akrobatika a kecses mozg\u00E1s m\u0171v\u00E9szete az mcMMO-ban.\n&eHarci \u00E9s k\u00F6rnyezeti b\u00F3nuszokkal l\u00E1t el.\n\n&3TAPASZTALAT SZERZ\u00C9S:\n&eHogy tapasztalathoz juss ebben a k\u00E9pess\u00E9gben, kit\u00E9r\u00E9st kell v\u00E9grehajtanod \n&eharcban, vagy olyan es\u00E9seket t\u00FAl\u00E9lned, amelyek sebz\u00E9st okoznak. +Guides.Acrobatics.Section.1=&3Hogyan m\u0171k\u00F6dik a Gurul\u00E1s?\n&ePassz\u00EDv es\u00E9lyed van arra, hogy a sz\u00E1modra sebz\u00E9st okoz\u00F3 landol\u00E1sokn\u00E1l, \n&eneg\u00E1ld a s\u00E9r\u00FCl\u00E9st. A guggol\u00E1s lenyomva tart\u00E1sa es\u00E9s k\u00F6zben \n&e megdupl\u00E1zza az es\u00E9lyeidet.\n&eIlyenkor a sima gurul\u00E1s helyett Kecses Gurul\u00E1st hajthatsz v\u00E9gre.\n&eA Kecses Gurul\u00E1s nagyban hasonl\u00EDt a sima gurul\u00E1shoz, azzal a k\u00FCl\u00F6nbs\u00E9ggel, \n&ehogy k\u00E9tszer olyan val\u00F3sz\u00EDn\u0171, \u00E9s nagyobb v\u00E9delmet ny\u00FAjt.\n&eA gurul\u00E1s es\u00E9lye a k\u00E9pess\u00E9ged szintj\u00E9t\u0151l f\u00FCgg. +Guides.Acrobatics.Section.2=&3Hogyan m\u0171k\u00F6dik a Kit\u00E9r\u00E9s?\n&eA kit\u00E9r\u00E9s passz\u00EDv es\u00E9lyt ad arra, \n&eharcban val\u00F3 s\u00E9r\u00FCl\u00E9s eset\u00E9n csak a sebz\u00E9s fel\u00E9t szenvedd el.\n&eA k\u00E9pess\u00E9ged szintj\u00E9t\u0151l f\u00FCgg. ##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\u00EDmi\u00E1r\u00F3l:\n&eAz alk\u00EDmia alapja a b\u00E1jitalf\u0151z\u00E9s.\n&eGyors\u00EDtja a b\u00E1jitalf\u0151z\u00E9s folyamat\u00E1t, tov\u00E1bb\u00E1\n&elehet\u0151v\u00E9 teszi \u00FAj (eddig) megszerezhetetlen b\u00E1jitalok f\u0151z\u00E9s\u00E9t is.\n\n\n&3TAPASZTALAT SZERZ\u00C9S:\n&eTapasztalat szerz\u00E9shez nem kell m\u00E1s tenned, csak b\u00E1jitalokat f\u0151zn\u00F6d. +Guides.Alchemy.Section.1=&3Hogyan m\u0171k\u00F6dik a Katal\u00EDzis?\n&eA Katal\u00EDzis gyors\u00EDtja a b\u00E1jitalok elk\u00E9sz\u00FCl\u00E9s\u00E9t, maxim\u00E1lis \n&e 4x-es sebess\u00E9get biztos\u00EDt az 1000-es szint el\u00E9r\u00E9sekor.\n&eEz a k\u00E9pess\u00E9g a 100-as szinten old\u00F3dik fel. +Guides.Alchemy.Section.2=&3Hogyan m\u0171k\u00F6dnek a F\u0151zetek?\n&eA F\u0151zet lehet\u0151v\u00E9 teszi a b\u00E1jitalf\u0151z\u00E9st egyedi hozz\u00E1val\u00F3kkal.\n&eA hozz\u00E1val\u00F3k a \n&erangod n\u00F6veked\u00E9ssel old\u00F3dnak fel. 8 k\u00FCl\u00F6nb\u00F6z\u0151 rang van. +Guides.Alchemy.Section.3=&31-es szint\u0171 F\u0151zet hozz\u00E1val\u00F3k:\n&e\u0150rl\u00E1ngpor, Erjesztett p\u00F3kszem, Szellemk\u00F6nny, V\u00F6r\u00F6sk\u0151,\n&eIzz\u00F3k\u0151r por, Cukor, Arany dinnye, Arany r\u00E9pa,\n&eMagmakr\u00E9m, Alvil\u00E1gi bibircs\u00F3k, P\u00F3kszem, Puskapor, Tavir\u00F3zsa,\n&eG\u00F6mbhal\n&e(Alap b\u00E1jitalok) +Guides.Alchemy.Section.4=&32-es szint\u0171 F\u0151zet hozz\u00E1val\u00F3k:\n&eR\u00E9pa (Siets\u00E9g b\u00E1jital)\n&eNy\u00E1lkagoly\u00F3 (F\u00E1radts\u00E1g b\u00E1jital)\n\n&33-as szint\u0171 F\u0151zet hozz\u00E1val\u00F3k:\n&eKvarc (Abszorpci\u00F3 b\u00E1jital)\n&ePiros gomba (Magasugr\u00E1s b\u00E1jital) +Guides.Alchemy.Section.5=&34-es szint\u0171 F\u0151zet hozz\u00E1val\u00F3k:\n&eAlma (\u00C9leter\u0151 n\u00F6vel\u0151 b\u00E1jital)\n&eRohadt h\u00FAs (\u00C9hs\u00E9g b\u00E1jital)\n\n&35-\u00F6s szint\u0171 F\u0151zet hozz\u00E1val\u00F3k:\n&eBarna gomba (Sz\u00E9d\u00FCl\u00E9s b\u00E1jital)\n&eTintazs\u00E1k (Vaks\u00E1g b\u00E1jitala) +Guides.Alchemy.Section.6=&36-os szint\u0171 F\u0151zet hozz\u00E1val\u00F3k:\n&eP\u00E1fr\u00E1ny (J\u00F3llakotts\u00E1g b\u00E1jital)\n\n&37-es szint\u0171 F\u0151zet hozz\u00E1val\u00F3k:\n&eM\u00E9rgez\u0151 krumpli (Elsorvad\u00E1s b\u00E1jital)\n\n&38-as szint\u0171 F\u0151zet hozz\u00E1val\u00F3k:\n&eAranyalma (V\u00E9delem b\u00E1jital) ##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 \u00CDj\u00E1szatr\u00F3l:\n&eAz \u00CDj\u00E1szat az \u00EDjjal val\u00F3 l\u00F6v\u00E9sr\u0151l sz\u00F3l.\n&eK\u00FCl\u00F6nb\u00F6z\u0151 harci b\u00F3nuszokkal ruh\u00E1z fel, olyanokkal, mint a sebz\u00E9sn\u00F6vel\u00E9s\n&e, ami a szinteddel n\u00F6vekszik, \u00E9s m\u00E1sik elk\u00E1b\u00EDt\u00E1s\u00E1nak k\u00E9pess\u00E9g\u00E9vel.\n&e. Tov\u00E1bb\u00E1 visszaszerezheted az elhaszn\u00E1lt \n&enyilaid egy r\u00E9sz\u00E9t az ellens\u00E9geid holttest\u00E9b\u0151l.\n\n\n&3TAPASZTALAT SZERZ\u00C9S:\n&eA tapasztalat szerz\u00E9shez \u00E9l\u0151l\u00E9nyeket vagy \n&ej\u00E1t\u00E9kosokat kell l\u0151n\u00F6d \u00EDjjal. +Guides.Archery.Section.1=&3Hogyan m\u0171k\u00F6dik a Pontos L\u00F6v\u00E9s?\n&eA Pontos L\u00F6v\u00E9s n\u00F6veli a l\u00F6ved\u00E9keid sebz\u00E9s\u00E9t.\n&eA b\u00F3nusz sebz\u00E9s az \n&e\u00CDj\u00E1szat szintedt\u0151l f\u00FCgg.\n&eAlapvet\u0151en a b\u00F3nusz sebz\u00E9sed 10%-kal n\u00F6vekszik\n&eminden 50. szinten, ami a maxim\u00E1lis 200%-os b\u00F3nusz sebz\u00E9shez vezet. +Guides.Archery.Section.2=&3Hogyan m\u0171k\u00F6dik a K\u00E1b\u00EDt\u00E1s?\n&ePassz\u00EDv es\u00E9lyed van elk\u00E1b\u00EDtani m\u00E1s j\u00E1t\u00E9kosokat, \n&emikor eltal\u00E1lod \u0151ket. Amikor a k\u00E1b\u00EDt\u00E1s betal\u00E1l, k\u00E9nyszer\u00EDti az ellenfeledet, hogy\n&er\u00F6vid id\u0151re egyenesen felfel\u00E9 n\u00E9zzen.\n&eEgy K\u00E1b\u00EDt\u00F3l\u00F6ved\u00E9k tov\u00E1bbi 4 sebz\u00E9st okoz. (2 sz\u00EDv). +Guides.Archery.Section.3=&3Hogyan m\u0171k\u00F6dik a ny\u00EDlvessz\u0151 visszaszerz\u00E9se?\n&ePassz\u00EDv es\u00E9lyed van visszaszerezni az elhaszn\u00E1lt ny\u00EDlvessz\u0151idet\n&e, amikor meg\u00F6lsz egy \u00E9l\u0151l\u00E9nyt az \u00EDjaddal.\n&eEnnek az es\u00E9lye az \u00CDj\u00E1szat szinteddel egy\u00FCtt n\u00F6vekszik.\n&eAlapvet\u0151en 0.1%-kal n\u00F6vekszik szintenk\u00E9nt, ami a maxim\u00E1lis 100%-hoz vezet\n&e az 1000-es szint el\u00E9r\u00E9sekor. ##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\u00E1szatr\u00F3l:\n&eA Balt\u00E1szattal sokkal t\u00F6bb dologra is\n&ehaszn\u00E1lhatod a balt\u00E1dat, mint a fav\u00E1g\u00E1s! Meg\u00FCthetsz j\u00E1t\u00E9kosokat \u00E9s \u00E9l\u0151l\u00E9nyeket, \n&ehogy tapasztalatot szerezz, az \u00E9l\u0151l\u00E9nyekre a\n&eh\u00E1tral\u00F6k\u00E9s, m\u00EDg a j\u00E1t\u00E9kosokra egyar\u00E1nt a Hal\u00E1los Kritikus Csap\u00E1s k\u00E9pess\u00E9g\u00E9t haszn\u00E1lhatod.\n&eA Balt\u00E1d egy k\u00E9zi fa apr\u00EDt\u00F3v\u00E1 v\u00E1lik,\n&eami megsemmis\u00EDti ellens\u00E9ged p\u00E1nc\u00E9lzat\u00E1t a szinted n\u00F6veked\u00E9s\u00E9vel. \n&3TAPASZTALAT SZERZ\u00C9S:\n&eTapasztalat szerz\u00E9shez nem kell m\u00E1st tenned, mint j\u00E1t\u00E9kosokat \u00E9s \u00E9l\u0151l\u00E9nyeket \n&ecsapkodnod a Balt\u00E1ddal. +Guides.Axes.Section.1=&3Hogyan m\u0171k\u00F6dik a Koponya T\u00F6r\u00E9s?\n&eTer\u00FCleti hat\u00E1s\u00FA sebz\u00E9st tudsz kiosztani.\n&eA ter\u00FCleti sebz\u00E9s a f\u0151 c\u00E9lpontodnak okozott sebz\u00E9s\n&efel\u00E9vel egyenl\u0151, teh\u00E1t t\u00F6k\u00E9letes nagy sz\u00F6rnyhord\u00E1k kipuszt\u00EDt\u00E1s\u00E1ra. +Guides.Axes.Section.2=&3Hogyan m\u0171k\u00F6dik a Kritikus Csap\u00E1s?\n&eA Kritikus Csap\u00E1sok passz\u00EDv es\u00E9lyt biztos\u00EDtanak a \n&ej\u00E1t\u00E9kosnak b\u00F3nusz sebz\u00E9s kioszt\u00E1s\u00E1ra.\n&eAlapvet\u0151en minden m\u00E1sodik Balt\u00E1szat szinttel \n&e0.1%-kal n\u00F6vekszik a Kritikus Csap\u00E1sok es\u00E9lye, Ezzel maxim\u00E1lisan 2x-es sebz\u00E9st okozhatsz \u00E9l\u0151l\u00E9nyeknek,\n&evagy 1.5x-es sebz\u00E9st j\u00E1t\u00E9kosoknak. +Guides.Axes.Section.3=&3Hogyan m\u0171k\u00F6dik a Balta Mesters\u00E9ge?\n&eA Balt\u00E1szat Mesters\u00E9ge passz\u00EDvan b\u00F3nusz sebz\u00E9st biztos\u00EDt\n&e a csap\u00E1saidnak Balta haszn\u00E1lata eset\u00E9n.\n&eAlapvet\u0151en a b\u00F3nusz 1-el n\u00F6vekszik minden 50. szint ut\u00E1n,\n&eamely a 200-as szinten \u00E9ri el a maximum\u00E1t, a 4 b\u00F3nusz sebz\u00E9st. +Guides.Axes.Section.4=&3Hogyan m\u0171k\u00F6dik a P\u00E1nc\u00E9lt\u00F6r\u00E9s?\n&eOlyan er\u0151s \u00FCt\u00E9ssel s\u00FAjtasz le, amely \u00F6sszet\u00F6ri ellenfeleid p\u00E1nc\u00E9lzat\u00E1t!\n&eA P\u00E1nc\u00E9lt\u00F6r\u00E9s passz\u00EDv es\u00E9lyt ad az ellenfeled p\u00E1nc\u00E9lj\u00E1nak \n&emegsebz\u00E9s\u00E9hez. Ez a sebz\u00E9s a Balt\u00E1szat szinteddel n\u00F6vekszik. +Guides.Axes.Section.5=&3Hogyan m\u0171k\u00F6dik az Er\u0151s \u00DCt\u00E9s?\n&ePassz\u00EDv es\u00E9lyed van Er\u0151s \u00DCt\u00E9ssel lecsapni \n&e\u00E9l\u0151l\u00E9nyekre \u00E9s j\u00E1t\u00E9kosokra Balta haszn\u00E1lata eset\u00E9n.\n&eAlapvet\u0151en ez az es\u00E9ly 25%. Ez a k\u00E9pess\u00E9g egy hatalmas\n&eh\u00E1tral\u00F6k\u00E9s effektussal b\u00EDr, hasonl\u00F3an a H\u00E1tral\u00F6k\u00E9s II \n&evar\u00E1zslathoz. Tov\u00E1bb\u00E1 b\u00F3nusz sebz\u00E9st okoz a c\u00E9lpontnak. ##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 \u00C1s\u00E1sr\u00F3l:\n&eAz \u00C1s\u00E1ssal kincseket tal\u00E1lhatsz a f\u00F6ldben.\n&eMin\u00E9l tov\u00E1bb csin\u00E1lod, ann\u00E1l t\u00F6bb kincsre tehetsz szert.\n\n&3TAPASZTALAT SZERZ\u00C9S:\n&eTapasztalat szerz\u00E9shez \u00C1s\u00F3val kell felt\u00E1rnod a f\u00F6ldet.\n&eCsak bizonyos anyagok ki\u00E1s\u00E1s\u00E9rt kaphatsz kincseket \u00E9s tapasztalatot. +Guides.Excavation.Section.1=&3Kompatibilis Anyagok:\n&eF\u00FCves blokk, F\u00F6ld, Homok, Agyag, S\u00F3der, Gombafonal, L\u00E9lekhomok, H\u00F3 +Guides.Excavation.Section.2=&3Hogyan m\u0171k\u00F6dik a Giga F\u00FAr\u00F3-T\u00F6r\u0151:\n&eJobb klikkelj \u00E1s\u00F3val a kezedben, hogy el\u0151k\u00E9sz\u00EDtsd az \u00E1s\u00F3dat.\n&eEbben a m\u00F3dban tov\u00E1bb\u00E1 4 m\u00E1sodperc \u00E1ll a rendelkez\u00E9sedre, hogy\n&ekapcsolatba l\u00E9pj valamely \u00C1s\u00E1ssal kompatibilis anyaggal a\n&eGiga F\u00FAr\u00F3-T\u00F6r\u0151 aktiv\u00E1l\u00E1s\u00E1hoz. +Guides.Excavation.Section.3=&3Mi is az a Giga F\u00FAr\u00F3-T\u00F6r\u0151?\n&eA Giga F\u00FAr\u00F3-T\u00F6r\u0151 egy v\u00E1rakoz\u00E1si id\u0151vel rendelkez\u0151 k\u00E9pess\u00E9g, \n&eamely az \u00C1s\u00E1shoz kapcsol\u00F3dik. Megtripl\u00E1zza a \n&ekincs tal\u00E1l\u00E1s es\u00E9ly\u00E9t, \u00E9s instant ki\u00FCti az\n&e\u00C1s\u00E1ssal kompatibilis anyagokat. +Guides.Excavation.Section.4=&3Hogyan m\u0171k\u00F6dik a R\u00E9g\u00E9szet?\n&eMinden lehets\u00E9ges kincsnek van egy \n&ebizonyos k\u00E9pess\u00E9g szint k\u00F6vetelm\u00E9nye.\n&eMin\u00E9l nagyobb az \u00C1s\u00E1s szinted, ann\u00E1l\n&et\u00F6bb kincset tal\u00E1lhatsz.\n&eMinden \u00C1s\u00E1ssal kompatibilis anyagnak van egy egyedi\n&ekincses list\u00E1ja.\n&eM\u00E1s sz\u00F3val m\u00E1s kincsekre tehetsz szert p\u00E9ld\u00E1ul F\u00F6ld ki\u00E1s\u00E1sn\u00E1l,\n&emint a S\u00F3dern\u00E9l. +Guides.Excavation.Section.5=&3Megjegyz\u00E9sek az \u00C1s\u00E1sr\u00F3l:\n&eA kincsek teljesen testreszabhat\u00F3ak,\n&eez\u00E9rt gyakorlatilag minden szerveren m\u00E1s \u00E9s m\u00E1s 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 lehet\u0151s\u00E9g van ezzel olyan \u00E9l\u0151l\u00E9ny fejeket is szerezni, amelyeket \u00E1ltal\u00E1ban 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\u00E1szatr\u00F3l:\n&eEzzel a k\u00E9pess\u00E9ggel a horg\u00E1sz\u00E1s ism\u00E9t izgalmas!\n&eTal\u00E1lj rejtett kincseket, vagy r\u00E1zz le t\u00E1rgyakat a \u00E9l\u0151l\u00E9nyekr\u0151l.\n\n&3Tapasztalatszerz\u00E9s:\n&eHorg\u00E1ssz. +Guides.Fishing.Section.1=&3Hogyan m\u0171k\u00F6dik a kincsvad\u00E1szat?\n&eEz a k\u00E9pess\u00E9g lehet\u0151v\u00E9 teszi, hogy kincset tal\u00E1lj horg\u00E1sz\u00E1s k\u00F6zben, \n&ealacsony es\u00E9llyel fejlesztett t\u00E1rgyakra.\n&eMinden lehets\u00E9ges kincs a horg\u00E1sz\u00E1sban szintt\u0151l f\u00FCggetlen\u00FCl kifoghat\u00F3\n&e Azonban a kifog\u00E1s es\u00E9lye f\u00FCgg att\u00F3l, hogy a t\u00E1rgy milyen ritkas\u00E1g\u00FA.\n&eMin\u00E9l nagyobb a horg\u00E1sz\u00E1s szinted, ann\u00E1l nagyobb es\u00E9lyed van jobb kincseket tal\u00E1lni. +Guides.Fishing.Section.2=&3Hogyan m\u0171k\u00F6dik a j\u00E9ghorg\u00E1szat?\n&eEz a passz\u00EDv k\u00E9pess\u00E9g lehet\u0151v\u00E9 teszi, hogy befagyott tavakban horg\u00E1ssz!\n&eHaszn\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=&3Hogyan m\u0171k\u00F6dik a Mester Horg\u00E1szat?\n&eEz a passz\u00EDv k\u00E9pess\u00E9g n\u00F6veli a fog\u00E1s es\u00E9ly\u00E9t horg\u00E1szat k\u00F6zben.\n&eMiut\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=&3Hogyan m\u0171k\u00F6dik a ler\u00E1z\u00E1s?\n&eEz 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&eAz \u00E9l\u0151l\u00E9nyek ugyan olyan t\u00E1rgyakat dobnak, mint amit hal\u00E1lukkor.\n&eValamint lehet\u0151s\u00E9g van ezzel olyan \u00E9l\u0151l\u00E9ny fejeket is szerezni, amelyeket \u00E1ltal\u00E1ban nem lehets\u00E9ges t\u00FAl\u00E9l\u0151 m\u00F3dban. +Guides.Fishing.Section.5=&3Hogyan m\u0171k\u00F6dik a horg\u00E1sz di\u00E9ta?\n&eEz a passz\u00EDv k\u00E9pess\u00E9g n\u00F6veli az \u00E9telcs\u00EDk visszat\u00F6lt\u00E9s\u00E9t, ha halat eszel. +Guides.Fishing.Section.6=&3Tudnival\u00F3 a horg\u00E1szatr\u00F3l:\n&eA fogott t\u00E1rgyak list\u00E1ja teljesen \u00E1ll\u00EDthat\u00F3, teh\u00E1t szervert\u0151l f\u00FCgg. ##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\u00F6v\u00E9nytanr\u00F3l:\n&eA N\u00F6v\u00E9nytan a k\u00FCl\u00F6nf\u00E9le n\u00F6v\u00E9nyek begy\u0171jt\u00E9s\u00E9r\u0151l sz\u00F3l.\n\n\n&3TAPASZTALAT SZERZ\u00C9S:\n&eGy\u0171jts n\u00F6v\u00E9nyeket. +Guides.Herbalism.Section.1=&3Kompatibilis Anyagok:\n&eB\u00FAza, Burgonya, R\u00E9pa, Dinnye, \n&eT\u00F6k, Cukorn\u00E1d, Kaka\u00F3bab, Vir\u00E1gok, Kaktusz, Gomb\u00E1k,\n&eAlvil\u00E1gi Bibircs\u00F3k, Tavir\u00F3zsa, \u00E9s Inda. +Guides.Herbalism.Section.2=&3Hogyan m\u0171k\u00F6dik a Z\u00F6ld F\u00F6ld?\n&eA Z\u00F6ld F\u00F6ld egy aktiv\u00E1lhat\u00F3 k\u00E9pess\u00E9g, az aktiv\u00E1l\u00E1s\u00E1hoz \n&ejobb klikkelj egy kap\u00E1val a kezedben.\n&eA Z\u00F6ld F\u00F6ld megtripl\u00E1zza az arat\u00E1s\u00E9rt \n&ekapott t\u00E1rgyakat. Tov\u00E1bb\u00E1 felruh\u00E1zza a j\u00E1t\u00E9kost azzal a \n&ek\u00E9pess\u00E9ggel, hogy \u00E9letet leheljenek a blokkokba az eszk\u00F6zt\u00E1rukban l\u00E9v\u0151 magok seg\u00EDts\u00E9g\u00E9vel. +Guides.Herbalism.Section.3=&3Hogyan m\u0171k\u00F6dik a Z\u00F6ld H\u00FCvelyk (n\u00F6v\u00E9nyek)?\n&eEz a passz\u00EDv k\u00E9pess\u00E9g automatikusan vissza\u00FClteti a n\u00F6v\u00E9nyt\n&elearat\u00E1skor.\n&eEnnek az es\u00E9lye a N\u00F6v\u00E9nytan szintedt\u0151l f\u00FCgg. +Guides.Herbalism.Section.4=&3Hogyan m\u0171k\u00F6dik a Z\u00F6ld H\u00FCvelyk (Z\u00FAzottk\u0151/K\u0151t\u00E9gla/F\u00F6ld)?\n&eEz az akt\u00EDv k\u00E9pess\u00E9g \u00E1tv\u00E1ltoztatja a blokkokat a \n&e"z\u00F6ldebb" v\u00E1ltozatukk\u00E1. Ezt jobb klikkel teheted meg, mik\u00F6zben\n&emagot tartasz a kezedben. 1db magot haszn\u00E1l el blokkonk\u00E9nt. +Guides.Herbalism.Section.5=&3Hogyan m\u0171k\u00F6dik a Farmer Di\u00E9ta?\n&eEz a passz\u00EDv k\u00E9pess\u00E9g n\u00F6veli az \u00E9telcs\u00EDk visszat\u00F6lt\u00E9s\u00E9t \n&eKeny\u00E9r, S\u00FCtik, Dinnye, Gombaleves, R\u00E9pa,\n&e\u00E9s Burgonya elfogyaszt\u00E1s\u00E1n\u00E1l. +Guides.Herbalism.Section.6=&3Hogyan m\u0171k\u00F6dik a Hili\u00E1n Szerencse?\n&eEz a passz\u00EDv k\u00E9pess\u00E9g es\u00E9lyt ad ritka t\u00E1rgyak tal\u00E1l\u00E1s\u00E1ra\n&ebizonyos blokkok karddal val\u00F3 ki\u00FCt\u00E9s\u00E9n\u00E9l. +Guides.Herbalism.Section.7=&3Hogyan m\u0171k\u00F6dik a Dupla Zs\u00E1km\u00E1ny?\n&eT\u00F6bb t\u00E1rgyat kapsz az arat\u00E1s\u00E9rt. ##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\u00E1ny\u00E1sz\u00E1sr\u00F3l:\n&eA b\u00E1ny\u00E1sz\u00E1s k\u00F6vek \u00E9s \u00E9rcek kib\u00E1ny\u00E1sz\u00E1s\u00E1r\u00F3l sz\u00F3l. T\u00F6bb t\u00E1rgyat is kaphatsz\n&ek\u00FCl\u00F6nb\u00F6z\u0151 anyagok kib\u00E1ny\u00E1sz\u00E1s\u00E1\u00E9rt.\n\n&3TAPASZTALAT SZERZ\u00C9S:\n&eB\u00E1ny\u00E1ssz cs\u00E1k\u00E1nnyal a kezedben.\n&eCsak bizonyos blokkok adnak tapasztalatot. +Guides.Mining.Section.1=&3Kompatibilis Anyagok:\n&eK\u0151, Sz\u00E9n\u00E9rc, Vas\u00E9rc, Arany\u00E9rc, Gy\u00E9m\u00E1nt\u00E9rc, V\u00F6r\u00F6sk\u0151\u00E9rc,\n&eLazurit\u00E9rc, Obszidi\u00E1n, Moh\u00E1s Z\u00FAzottk\u0151, V\u00E9gk\u0151,\n&eIzz\u00F3k\u0151, \u00E9s Alvil\u00E1gi K\u0151. +Guides.Mining.Section.2=&3Hogyan haszn\u00E1ld a Szuper T\u00F6r\u00E9st? \n&eJobb klikkelj cs\u00E1k\u00E1nnyal a kezedben, hogy el\u0151k\u00E9sz\u00EDtsd az eszk\u00F6zt.\n&eEbben a m\u00F3dban tov\u00E1bb\u00E1 4 m\u00E1sodperc \u00E1ll a rendelkez\u00E9sedre, hogy\n&ekapcsolatba l\u00E9pj valamely B\u00E1ny\u00E1sz\u00E1ssal kompatibilis anyaggal a\n&eSzuper T\u00F6r\u0151 aktiv\u00E1l\u00E1s\u00E1hoz. +Guides.Mining.Section.3=&3Mi az a Szuper T\u00F6r\u0151?\n&eA Szuper T\u00F6r\u0151 egy v\u00E1rakoz\u00E1si id\u0151vel rendelkez\u0151 k\u00E9pess\u00E9g, \n&eamely a B\u00E1ny\u00E1sz\u00E1shoz kapcsol\u00F3dik. Megtripl\u00E1zza az \n&eextra t\u00E1rgyak tal\u00E1l\u00E1s\u00E1nak es\u00E9ly\u00E9t, \u00E9s instant ki\u00FCti a\n&eB\u00E1ny\u00E1sz\u00E1ssal kompatibilis anyagokat. +Guides.Mining.Section.4=&3Hogyan haszn\u00E1ld Robbant\u00E1sb\u00E1ny\u00E1szatot:\n&eEgy cs\u00E1k\u00E1nnyal a kezedben,\n&eguggolj, \u00E9s jobb klikkelj a TNT-re t\u00E1volr\u00F3l. Ezzel a TNT\n&eazonnal felrobban. +Guides.Mining.Section.5=&3Hogyan m\u0171k\u00F6dik a Robbant\u00E1sb\u00E1ny\u00E1szat?\n&eA Robbant\u00E1sb\u00E1ny\u00E1szat egy olyan k\u00E9pess\u00E9g, ami a b\u00E1ny\u00E1szati\n&ek\u00E9pess\u00E9ghez k\u00F6t\u0151dik. B\u00F3nuszokat ad, amikor TNT-vel b\u00E1ny\u00E1szol, \u00E9s lehet\u0151s\u00E9ged van\n&ea t\u00E1voli robbant\u00E1sra is. H\u00E1rom r\u00E9sze van a Robbant\u00E1sb\u00E1ny\u00E1szatnak.\n&eAz els\u0151 a \u201ENagyobb Robban\u00E1s\u201D, ami a robban\u00E1s hat\u00F3sugar\u00E1t n\u00F6veli.\n&eA m\u00E1sodik a \u201ERobbant\u00E1si szak\u00E9rt\u0151", ami cs\u00F6kkenti\n&ea TNT robban\u00E1s okozta k\u00E1rokat. A harmadik egyszer\u0171en csak n\u00F6veli\n&e a TNT robban\u00E1sb\u00F3l kies\u0151 \u00E9rcek mennyis\u00E9g\u00E9t \n&e\u00E9s cs\u00F6kkenti a t\u00F6rmel\u00E9kek hull\u00E1s\u00E1t. ##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\u00EDt\u00E1sr\u00F3l:\n&eA Jav\u00EDt\u00E1s lehet\u0151v\u00E9 teszi a p\u00E1nc\u00E9l \u00E9s eszk\u00F6z\u00F6k\n&eVast\u00F6mb\u00F6n val\u00F3 jav\u00EDt\u00E1s\u00E1t.\n\n&3TAPASZTALAT SZERZ\u00C9S:\n&eJav\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=&3Hogyan haszn\u00E1lhatom a Jav\u00EDt\u00E1st?\n&eHelyezz el egy mcMMO \u00FCll\u0151t, \u00E9s jobb klikkelj r\u00E1 egy t\u00E1rggyal a jav\u00EDt\u00E1shoz.\n&eHaszn\u00E1latonk\u00E9nt 1 t\u00E1rgyat haszn\u00E1l fel. +Guides.Repair.Section.2=&3Hogyan m\u0171k\u00F6dik a Jav\u00EDt\u00E1s Mesters\u00E9ge?\n&eA Jav\u00EDt\u00E1s Mesters\u00E9ge a jav\u00EDt\u00E1s m\u00E9rt\u00E9k\u00E9t n\u00F6veli. Ez az \u00E9rt\u00E9k a \n&eJav\u00EDt\u00E1s szintedt\u0151l f\u00FCgg. +Guides.Repair.Section.3=&3Hogyan m\u0171k\u00F6dik a Szuper Jav\u00EDt\u00E1s?\n&eA Szuper Jav\u00EDt\u00E1s egy passz\u00EDv k\u00E9pess\u00E9g. T\u00E1rgyak jav\u00EDt\u00E1s\u00E1n\u00E1l,\n&ees\u00E9lyt ad a j\u00E1t\u00E9kosnak, hogy k\u00E9tszeres \n&ehat\u00E9konys\u00E1ggal jav\u00EDtson. +Guides.Repair.Section.4=&3Hogyan m\u0171k\u00F6dik a M\u00E1gikus Kov\u00E1csol\u00E1s?\n&eEz a k\u00E9pess\u00E9g lehet\u0151v\u00E9 teszi, hogy \n&ebizonyos es\u00E9llyel a jav\u00EDtott t\u00E1rgy megtarthassa az fejleszt\u00E9seit. A fejleszt\u00E9sek\n&emegtarthatj\u00E1k a szintj\u00FCket, visszafejl\u0151dhetnek,\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 \u00DAjrahasznos\u00EDt\u00E1sr\u00F3l:\n&eAz \u00FAjrahasznos\u00EDt\u00E1s lehet\u0151v\u00E9 teszi, hogy egy aranyt\u00F6mb\n&eseg\u00EDts\u00E9g\u00E9vel visszanyerd a t\u00E1rgyaid alapanyagait.\n\n&3TAPASZTALAT SZERZ\u00C9S:\n&eA horg\u00E1sz\u00E1si \u00E9s jav\u00EDt\u00E1si szintjeidt\u0151l f\u00FCgg. +Guides.Salvage.Section.1=&3Hogyan haszn\u00E1lhatom az \u00DAjrahasznos\u00EDt\u00E1st?\n&eHelyezz le egy \u00DAjrahasznos\u00EDt\u00F3 \u00DCll\u0151t, \u00E9s jobb klikkelj r\u00E1 egy adott t\u00E1rggyal. Ez lebontja a t\u00E1rgyat,\n&e\u00E9s visszaadja a bark\u00E1csol\u00E1si alapanyagait.\n\n&eP\u00E9ld\u00E1ul egy Vascs\u00E1k\u00E1ny eset\u00E9ben vasrudakat kapsz vissza. +Guides.Salvage.Section.2=&3Hogyan m\u0171k\u00F6dik a Fejlesztett \u00DAjrahasznos\u00EDt\u00E1s?\n&eMiut\u00E1n feloldottad, lehet\u0151v\u00E9 teszi a s\u00E9r\u00FClt t\u00E1rgyak \u00FAjrahasznos\u00EDt\u00E1s\u00E1t is.\n&eA visszanyert t\u00E1rgyak mennyis\u00E9ge a t\u00E1rgy \u00E1llapot\u00E1t\u00F3l f\u00FCgg. Min\u00E9l jobb \u00E1llapotban van,\n&eann\u00E1l t\u00F6bb anyagot nyerhetsz vissza.\n&eFejlesztett \u00DAjrahasznos\u00EDt\u00E1ssal legal\u00E1bb 1 t\u00E1rgyat mindig visszakapsz,\n&ekiv\u00E9ve ha a t\u00E1rgy t\u00FAl s\u00E9r\u00FClt. +Guides.Salvage.Section.3=&3P\u00E9lda a m\u0171k\u00F6d\u00E9s\u00E9re:\n&e\u00DAjra akarunk hasznos\u00EDtani egy aranycs\u00E1k\u00E1nyt, amely 20%-ban s\u00E9r\u00FClt,\n&eez azt jelenti, hogy maximum 2 t\u00E1rgyat kaphatunk vissza\n&e(mivel a cs\u00E1k\u00E1ny elk\u00E9sz\u00EDt\u00E9s\u00E9hez 3 r\u00FAd kell, ez\u00E9rt egyenk\u00E9nt \n&e33,33% haszn\u00E1lhat\u00F3s\u00E1got \u00E9rnek) ami egyenl\u0151 66%-kal. Ha a t\u00E1rgy s\u00E9r\u00FClts\u00E9ge\n&e66% alatt van, akkor nem kaphatsz vissza 2 rudat.\n&eHa ef\u00F6l\u00F6tt az \u00E9rt\u00E9k f\u00F6l\u00F6tt van, akkor\n&e2 rudat kapsz vissza. +Guides.Salvage.Section.4=&3Hogyan m\u0171k\u00F6dik a M\u00E1gikus \u00DAjrahasznos\u00EDt\u00E1s?\n&eBizonyos es\u00E9llyel var\u00E1zsk\u00F6nyveket is kaphatsz \n&efejlesztett t\u00E1rgyak \u00FAjhasznos\u00EDt\u00E1s\u00E1\u00E9rt. A szintedt\u0151l f\u00FCgg a \n&evar\u00E1zslat kinyer\u00E9s\u00E9nek m\u00E9rt\u00E9ke.\n\n&eR\u00E9szleges kinyer\u00E9sn\u00E9l \n&ea k\u00F6nyv alacsonyabb szint\u0171 var\u00E1zslattal fog rendelkezni, mint\n&eami a t\u00E1rgyon 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\u00F3l:\n&eEz a k\u00E9pess\u00E9g harci b\u00F3nuszokkal ruh\u00E1z fel \n&ekardok haszn\u00E1lata eset\u00E9n.\n\n&3TAPASZTALAT SZERZ\u00C9S:\n&eTapasztalatot az \u00E9l\u0151l\u00E9nyeknek vagy m\u00E1s j\u00E1t\u00E9kosoknak karddal\n&eokozott sebz\u00E9s\u00E9rt kaphatsz. +Guides.Swords.Section.1=&3Hogyan m\u0171k\u00F6dik a Fogazott Penge?\n&eA Fogazott Penge egy karddal jobb klikkel\u00E9ssel aktiv\u00E1lhat\u00F3 k\u00E9pess\u00E9g. \n&eEz a k\u00E9pess\u00E9g lehet\u0151v\u00E9 teszi a \n&eter\u00FCletre hat\u00F3 csap\u00E1sokat. A ter\u00FCletre hat\u00F3 csap\u00E1s 25%-os b\u00F3nusz sebz\u00E9st okoz, \n&etov\u00E1bb\u00E1 5 tick-ig v\u00E9rz\u00E9st ad az ellens\u00E9gnek. +Guides.Swords.Section.2=&3Hogyan m\u0171k\u00F6dik az Ellent\u00E1mad\u00E1s?\n&eAz Ellent\u00E1mad\u00E1s egy aktiv\u00E1lhat\u00F3 k\u00E9pess\u00E9g. V\u00E9dekez\u00E9sn\u00E9l, \u00E9s mikor \u00E9l\u0151l\u00E9ny\n&e\u00FCtnek, es\u00E9lyed van visszaford\u00EDtani az elszenvedett sebz\u00E9s \n&e50%-\u00E1t. +Guides.Swords.Section.3=&3Hogyan m\u0171k\u00F6dik a T\u00F6r\u00E9s?\n&eA T\u00F6r\u00E9s k\u00E9t m\u00E1sodpercenk\u00E9nt sebzi az ellens\u00E9geidet. A c\u00E9lpont \n&emindaddig v\u00E9rezni fog, m\u00EDg a V\u00E9rz\u00E9s id\u0151tartam le nem j\u00E1r, vagy az \u00E1ldozat meg nem hal. \n&eA V\u00E9rz\u00E9s id\u0151tartam a Kardok szintedt\u0151l f\u00FCgg. ##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\u00EDt\u00E9sr\u0151l:\n&eA Szel\u00EDd\u00EDt\u00E9s k\u00FCl\u00F6nb\u00F6z\u0151 harci b\u00F3nuszokkal l\u00E1tja el a j\u00E1t\u00E9kost, ha \n&eszel\u00EDd\u00EDtett farkasokkal van.\n\n&3TAPASZTALAT SZERZ\u00C9S:\n&eSzel\u00EDd\u00EDts farkasokat/ocelotokat, vagy harcolj \n&ea farkasaid oldal\u00E1n. +Guides.Taming.Section.1=&3Hogyan m\u0171k\u00F6dik a Vadon H\u00EDv\u00E1sa?\n&eA Vadon H\u00EDv\u00E1sa egy aktiv\u00E1lhat\u00F3 k\u00E9pess\u00E9g, amellyel magad mell\u00E9 id\u00E9zhetsz \n&eegy farkast vagy egy ocelotot. Ezt \n&ecsonttal vagy hallal val\u00F3 guggol\u00E1s k\u00F6zben balkattint\u00E1ssal teheted meg. +Guides.Taming.Section.2=&3Hogyan m\u0171k\u00F6dik a Vad\u00E1llat-tan?\n&eA Vad\u00E1llat-tan lehet\u0151v\u00E9 teszi a \n&efarkasok \u00E9s ocelotok statisztik\u00E1inak megvizsg\u00E1l\u00E1s\u00E1t. Haszn\u00E1lat\u00E1hoz bal klikkelj egy farkasra\n&evagy ocelotra. +Guides.Taming.Section.3=&3Hogyan m\u0171k\u00F6dik a Led\u00F6f\u00E9s?\n&eA led\u00F6f\u00E9s egy passz\u00EDv k\u00E9pess\u00E9g, amely lehet\u0151v\u00E9 teszi, \n&ehogy a farkasok c\u00E9lpontja V\u00E9rz\u00E9st kapjon. +Guides.Taming.Section.4=&3Hogyan m\u0171k\u00F6dnek az \u00C9les Karmok?\n&eAz \u00C9les Karmok b\u00F3nusz sebz\u00E9st ad a farkasok t\u00E1mad\u00E1sainak. \n&eEz a b\u00F3nusz a Szel\u00EDd\u00EDt\u00E9s szintedt\u0151l f\u00FCgg. +Guides.Taming.Section.5=&3Hogyan m\u0171k\u00F6dik az \u00C9bers\u00E9g?\n&eEz a passz\u00EDv k\u00E9pess\u00E9g lehet\u0151v\u00E9 teszi a farkasaid\n&esz\u00E1m\u00E1ra, hogy r\u00E1d teleport\u00E1ljanak, ha vesz\u00E9lybe ker\u00FClnek, p\u00E9ld\u00E1ul l\u00E1va, kaktusz. Tov\u00E1bb\u00E1\n&eimmuniss\u00E1 teszi a farkasaidat a zuhan\u00E1si sebz\u0151d\u00E9sre. +Guides.Taming.Section.6=&3Hogyan m\u0171k\u00F6dik a Vastag Bunda?\n&eEz a k\u00E9pess\u00E9g cs\u00F6kkenti a farkasaid \u00E1ltal elszenvedett sebz\u00E9st, \u00E9s \n&et\u0171z\u00E1ll\u00F3v\u00E1 teszi \u0151ket. +Guides.Taming.Section.7=&3Hogyan m\u0171k\u00F6dik a Robban\u00E1s\u00E1ll\u00F3s\u00E1g?\n&eEz a k\u00E9pess\u00E9g cs\u00F6kkenti a farkasaid\n&erobban\u00E1s \u00E1ltal elszenvedett sebz\u0151d\u00E9s\u00E9t. +Guides.Taming.Section.8=&3Hogyan m\u0171k\u00F6dik a Gyors\u00E9ttermi Kiszolg\u00E1l\u00E1s?\n&eEz a k\u00E9pess\u00E9g lehet\u0151v\u00E9 teszi, hogy a farkasaid \u00E9letet t\u00F6ltsenek vissza, \n&emikor t\u00E1mad\u00E1st hajtanak v\u00E9gre. ##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 az Ac\u00E9l-\u00D6k\u00F6l St\u00EDlus?\n[[YELLOW]]Az Ac\u00E9l-\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\u0151l:\n&eA Felfegyverzetlen k\u00FCl\u00F6nb\u00F6z\u0151 harci b\u00F3nuszokkal l\u00E1t el, ha\n&eaz \u00F6kleidet haszn\u00E1lod fegyverk\u00E9nt. \n\n&3TAPASZTALAT SZERZ\u00C9S:\n&eHarcolj \u00E9l\u0151l\u00E9nyekkel vagy j\u00E1t\u00E9kosokkal pusztak\u00E9zzel. +Guides.Unarmed.Section.1=&3Hogyan m\u0171k\u00F6dik a Vadul\u00E1s?\n&eA Vadul\u00E1s egy jobb klikkel\u00E9ssel aktiv\u00E1lhat\u00F3 k\u00E9pess\u00E9g. \n&eEbben a m\u00F3dban 50%-kal t\u00F6bb sebz\u00E9st okozol, \u00E9s \n&ea gyenge anyagokat, mint a f\u00F6ld \u00E9s f\u00FCves blokk, instant ki\u00FCtheted. +Guides.Unarmed.Section.2=&3Hogyan m\u0171k\u00F6dik az Ac\u00E9l-\u00D6k\u00F6l St\u00EDlus?\n&eAz Ac\u00E9l-\u00D6k\u00F6l St\u00EDlus b\u00F3nusz sebz\u00E9st biztos\u00EDt \u00E9l\u0151l\u00E9nyek \u00E9s j\u00E1t\u00E9kosok ellen\n&eha csak az \u00F6kleidet haszn\u00E1lod. +Guides.Unarmed.Section.3=&3Hogyan m\u0171k\u00F6dik a Nyilak Kit\u00E9r\u00EDt\u00E9se?\n&eA Nyilak Kit\u00E9r\u00EDt\u00E9se egy passz\u00EDv k\u00E9pess\u00E9g, amely lehet\u0151v\u00E9 teszi, \n&ehogy elh\u00E1r\u00EDtsd a fel\u00E9d \u00E9rkez\u0151 nyilakat.\n&eA nyilak leesnek a f\u00F6ldre. +Guides.Unarmed.Section.4=&3Hogyan m\u0171k\u00F6dik a Vas-Markol\u00E1s?\n&eA Vas-Markol\u00E1s a Lefegyverz\u00E9st akad\u00E1lyozza meg. Min\u00E9l nagyobb a \n&eFelfegyverzetlen szinted, ann\u00E1l nagyobb es\u00E9llyel \u00E1llsz ellen a Lefegyverz\u00E9snek. +Guides.Unarmed.Section.5=&3Hogyan m\u0171k\u00F6dik a Lefegyverz\u00E9s?\n&eA Lefegyverz\u00E9s lehet\u0151v\u00E9 teszi, hogy lefegyverezd az ellens\u00E9ged,\n&eez\u00E1ltal az kidobja a fegyver\u00E9t a f\u00F6ldre. ##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\u0171k\u00F6dik a Fav\u00E1g\u00E1s?\n&eA Fav\u00E1g\u00E1s a fav\u00E1g\u00E1sr\u00F3l sz\u00F3l.\n\n&3TAPASZTALAT SZERZ\u00C9S:\n&eV\u00E1gj ki f\u00E1kat. +Guides.Woodcutting.Section.1=&3Hogyan m\u0171k\u00F6dik a Fad\u00F6nt\u00E9s?\n&eA Fad\u00F6nt\u00E9s egy aktiv\u00E1lhat\u00F3 k\u00E9pess\u00E9g, az aktiv\u00E1l\u00E1s\u00E1hoz \n&ejobb klikkelj balt\u00E1val a kezedben. Ez\u00E1ltal a fa azonnal kid\u0151l\n&e\u00E9s kidobja az \u00F6sszes r\u00F6nk\u00F6t. +Guides.Woodcutting.Section.2=&3Hogyan m\u0171k\u00F6dik a Lev\u00E9lf\u00FAj\u00F3?\n&eA Lev\u00E9lf\u00FAj\u00F3 egy passz\u00EDv k\u00E9pess\u00E9g, amely miatt a levelek azonnal elt\u0171nnek, ha\n&er\u00E1kattintasz balt\u00E1val. Alapb\u00F3l a 100-as szinten old\u00F3dik fel ez a k\u00E9pess\u00E9g. +Guides.Woodcutting.Section.3=&3Hogyan m\u0171k\u00F6dnek a Dupla Drop-ok?\n&eEz a passz\u00EDv k\u00E9pess\u00E9g lehet\u0151v\u00E9 teszi, hogy minden kiv\u00E1gott\n&efar\u00F6nk ut\u00E1n kapj m\u00E9g 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.Offline= &cNincs jogod offline j\u00E1t\u00E9kosok megvizsg\u00E1l\u00E1s\u00E1ra! +Inspect.OfflineStats=A(z) &e{0} nev\u0171 offline j\u00E1t\u00E9kos mcMMO Statisztik\u00E1ja +Inspect.Stats=&aA(z) &e{0} &anev\u0171 j\u00E1t\u00E9kos mcMMO Statisztik\u00E1ja Inspect.TooFar=T\u00FAl t\u00E1vol vagy, hogy megvizsg\u00E1lhasd ezt a j\u00E1t\u00E9kost! #ITEMS -Item.ChimaeraWing.Fail=[[RED]]**KIM\u00C9RA SZ\u00C1RNYAK HASZN\u00C1LATA SIKERTELEN** +Item.ChimaeraWing.Fail=&c**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.ChimaeraWing.Lore=&7Az \u00E1gyadhoz teleport\u00E1l. +Item.ChimaeraWing.NotEnough=Sz\u00FCks\u00E9ged van &e{0}&c m\u00E9g ennyire &6{1}&c! +Item.NotEnough=Sz\u00FCks\u00E9ged van &e{0}&c m\u00E9g ennyire &6{1}&c! +Item.Generic.Wait=V\u00E1rnod kell miel\u0151tt \u00FAjra haszn\u00E1lhatn\u00E1d ezt a k\u00E9pess\u00E9get! &e({0}s) +Item.Injured.Wait=Sebz\u00E9st szenvedt\u00E9l el, \u00FAgyhogy v\u00E1rnod kell, miel\u0151tt haszn\u00E1lhatn\u00E1d. &e({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.FluxPickaxe.Lore.1=&7Bizonyos es\u00E9llyel ki\u00E9geti a kib\u00E1ny\u00E1szott t\u00E1rgyakat. +Item.FluxPickaxe.Lore.2=&7Sz\u00FCks\u00E9ges Olvaszt\u00E1s 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\u00E1l\u00E1s &6({0}) &7m\u00E1sodperc m\u00FAlva, k\u00E9rlek ne mozogj... +Teleport.Cancelled=&4Teleport\u00E1l\u00E1s megszak\u00EDtva! #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.Extra=[[DARK_RED]]T\u00F6bbre van sz\u00FCks\u00E9ged [[GRAY]]{0}{1} +Skills.Child=&6(ALK\u00C9PESS\u00C9G) +Skills.Disarmed=&4Lefegyvereztek! +Skills.Header=-----[] &a{0}&c []----- +Skills.NeedMore=&4T\u00F6bb&7{0}-ra/re van sz\u00FCks\u00E9ged +Skills.NeedMore.Extra=&4T\u00F6bbre van sz\u00FCks\u00E9ged &7{0}{1} 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.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\u00FAl f\u00E1radt vagy, hogy \u00FAjra haszn\u00E1lhasd ezt a k\u00E9pess\u00E9get. &e({0}s) +Skills.Cancelled=&6{0} &cMegszak\u00EDtva! +Skills.ConfirmOrCancel=&aJobb klikkelj a meger\u0151s\u00EDt\u00E9shez. &6{0}&a. Bal klikkelj a megszak\u00EDt\u00E1shoz. +Skills.AbilityGateRequirementFail=&7M\u00E9g &e{0}&7 szint sz\u00FCks\u00E9ges a(z) &3{1}&7b\u00F3l/b\u0151l, hogy haszn\u00E1lhasd ezt a szuper k\u00E9pess\u00E9get. #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\u00C9PESS\u00C9GEK=- +Stats.Header.Gathering=&6-=GY\u0170JT\u00D6GET\u0150 K\u00C9PESS\u00C9GEK=- +Stats.Header.Misc=&6-=EGY\u00C9B K\u00C9PESS\u00C9GEK=- +Stats.Own.Stats=&a[mcMMO] Statisztik\u00E1k #PERKS Perks.XP.Name=Tapasztalat Perks.XP.Desc=T\u00F6bb tapasztalatot kapsz bizonyos k\u00E9pess\u00E9gekn\u00E9l. 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.Lucky.Bonus=&6 ({0} a Szerencse perk-kel) Perks.Cooldowns.Name=Gyors \u00DAjrat\u00F6lt\u00E9s Perks.Cooldowns.Desc=Cs\u00F6kkenti a v\u00E1rakoz\u00E1st {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.Bonus=&6 ({0} m\u00E1sodperc 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.Mode.Disabled=&6[mcMMO] Hardcore M\u00F3d {0} kikapcsolva {1} sz\u00E1m\u00E1ra. +Hardcore.Mode.Enabled=&6[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.DeathStatLoss.PlayerDeath=&6[mcMMO] &4Elvesztett\u00E9l &9{0}&4 szintet a hal\u00E1lod miatt. +Hardcore.DeathStatLoss.PercentageChanged=&6[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.Vampirism.Killer.Failure=&6[mcMMO] &e{0}&7-nak/nek nem volt el\u00E9g tud\u00E1sa, hogy b\u00E1rmit is kisz\u00EDvhass bel\u0151le. +Hardcore.Vampirism.Killer.Success=&6[mcMMO] &3Ellopt\u00E1l &9{0}&3 szintet &e{1}-t\u00F3l/t\u0151l. +Hardcore.Vampirism.Victim.Failure=&6[mcMMO] &e{0}&7 nem tudott tud\u00E1st lopni t\u0151led! +Hardcore.Vampirism.Victim.Success=&6[mcMMO] &e{0}&4 ellopott &9{1}&4 szintet t\u0151led! +Hardcore.Vampirism.PercentageChanged=&6[mcMMO] A statisztika szipolyoz\u00E1si sz\u00E1zal\u00E9k be\u00E1ll\u00EDtva {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\u00E1s inform\u00E1ci\u00F3: +MOTD.Hardcore.Enabled=&6[mcMMO] &3Hardcore M\u00F3d enged\u00E9lyezve: &4{0} +MOTD.Hardcore.DeathStatLoss.Stats=&6[mcMMO] &3K\u00E9pess\u00E9g Hal\u00E1l B\u00FCntet\u00E9s: &4{0}% +MOTD.Hardcore.Vampirism.Stats=&6[mcMMO] &3V\u00E1mpirizmus szipolyoz\u00E1si sz\u00E1zal\u00E9k: &4{0}% +MOTD.PerksPrefix=&6[mcMMO Perk-kek] +MOTD.Version=&6[mcMMO] Jelenlegi verzi\u00F3 &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.FuelEfficiency=Vanilla XP sz\u00E1zal\u00E9k: &e{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.FuelEfficiency.Stat=\u00DCzemanyag Hat\u00E9konys\u00E1gi szorz\u00F3: &e{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 @@ -1083,36 +1083,36 @@ Commands.Description.xprate=mcMMO XP r\u00E1ta m\u00F3dos\u00EDt\u00E1sa egy mcM UpdateChecker.Outdated=Egy r\u00E9gebbi mcMMO-t haszn\u00E1lsz! UpdateChecker.NewAvailable=Egy \u00FAjabb verzi\u00F3 \u00E9rhet\u0151 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.Header.PlayerStats=&emcMMO Statisztik\u00E1k +Scoreboard.Header.PlayerCooldowns=&emcMMO V\u00E1rakoz\u00E1s +Scoreboard.Header.PlayerRank=&emcMMO Ranglista +Scoreboard.Header.PlayerInspect=&emcMMO Statisztika: {0} +Scoreboard.Header.PowerLevel=&eEr\u0151 Szint +Scoreboard.Misc.PowerLevel=&6Er\u0151 Szint +Scoreboard.Misc.Level=&3Szint +Scoreboard.Misc.CurrentXP=&aJelenlegi XP +Scoreboard.Misc.RemainingXP=&eSz\u00FCks\u00E9ges XP +Scoreboard.Misc.Cooldown=&dV\u00E1rakoz\u00E1s +Scoreboard.Misc.Overall=&6Overall Scoreboard.Misc.Ability=K\u00E9pess\u00E9g #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\u00E1t\u00E9kos adatod m\u00E9g nincs bet\u00F6ltve. +Profile.Loading.Success=&amcMMO profil sikeresen bet\u00F6ltve. +Profile.Loading.FailurePlayer=&cAz mcMMO-nak probl\u00E9m\u00E1i vannak az adataid bet\u00F6lt\u00E9sekor, megpr\u00F3b\u00E1ltuk bet\u00F6lteni &a{0}&cx.&c 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=&4[A]&c az mcMMO nem tudta bet\u00F6lteni ennek a j\u00E1t\u00E9kosnak az adatait &e{0}&c. &dK\u00E9rj\u00FCk, ellen\u0151rizd az adatb\u00E1zis be\u00E1ll\u00EDt\u00E1sait. Eddig tett k\u00EDs\u00E9rletek {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}. \u00C9vfordul\u00F3t!\n&9nossr50, \u00E9s az \u00F6sszes fejleszt\u0151 tisztelet\u00E9re itt egy t\u0171zij\u00E1t\u00E9k 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\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. #Locale -Locale.Reloaded=[[GREEN]]Ford\u00EDt\u00E1s \u00FAjrat\u00F6ltve! +Locale.Reloaded=&aFord\u00EDt\u00E1s \u00FAjrat\u00F6ltve! #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\u00E9rted ezt a teljes\u00EDtm\u00E9nyszintet &c{0}&e. Ezen a ponton megsz\u0171nik a k\u00E9pess\u00E9gek szintje. +LevelCap.Skill=&6(&amcMMO&6) &eEl\u00E9rted ezt a szintet &c{0}&e ebben &6{1}&e. Ezen a ponton megsz\u0171nik a k\u00E9pess\u00E9g szintje. Commands.XPBar.Usage=Proper usage is /mmoxpbar Commands.Description.mmoxpbar=Player settings for mcMMO XP bars Commands.Description.mmocompat=Inform\u00E1ci\u00F3 az mcMMO-r\u00F3l \u00E9s arr\u00F3l, hogy kompatibilit\u00E1si m\u00F3dban van-e, vagy teljesen m\u0171k\u00F6d\u0151k\u00E9pes-e. -Compatibility.Layer.Unsupported=[[GOLD]]A kompatibilit\u00E1s ezen a Minecraft verzi\u00F3n [[GREEN]]{0}[[GOLD]] nem t\u00E1mogatott. -Compatibility.Layer.PartialSupport=[[GOLD]]A kompatibilit\u00E1s ezen a Minecraft verzi\u00F3n [[GREEN]]{0}[[GOLD]] nem teljesen t\u00E1mogatott, de az mcMMO egy m\u00E1sodlagos rendszert futtat n\u00E9h\u00E1ny hi\u00E1nyz\u00F3 funkci\u00F3 emul\u00E1l\u00E1s\u00E1ra. -Commands.XPBar.DisableAll=[[GOLD]] Most az \u00F6sszes mcMMO XP s\u00E1v le van tiltva, haszn\u00E1ld a /mmoxpbar reset parancsot az alap\u00E9rtelmezett be\u00E1ll\u00EDt\u00E1sok vissza\u00E1ll\u00EDt\u00E1s\u00E1hoz. +Compatibility.Layer.Unsupported=&6A kompatibilit\u00E1s ezen a Minecraft verzi\u00F3n &a{0}&6 nem t\u00E1mogatott. +Compatibility.Layer.PartialSupport=&6A kompatibilit\u00E1s ezen a Minecraft verzi\u00F3n &a{0}&6 nem teljesen t\u00E1mogatott, de az mcMMO egy m\u00E1sodlagos rendszert futtat n\u00E9h\u00E1ny hi\u00E1nyz\u00F3 funkci\u00F3 emul\u00E1l\u00E1s\u00E1ra. +Commands.XPBar.DisableAll=&6 Most az \u00F6sszes mcMMO XP s\u00E1v le van tiltva, haszn\u00E1ld a /mmoxpbar reset parancsot az alap\u00E9rtelmezett be\u00E1ll\u00EDt\u00E1sok vissza\u00E1ll\u00EDt\u00E1s\u00E1hoz. diff --git a/src/main/resources/locale/locale_it.properties b/src/main/resources/locale/locale_it.properties index 7fcf079c9..604ba2952 100644 --- a/src/main/resources/locale/locale_it.properties +++ b/src/main/resources/locale/locale_it.properties @@ -13,7 +13,7 @@ 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.Header=&6Vantaggi Fortunati JSON.JWrapper.Perks.Lucky={0}% Migliori Probabilit\u00E0 JSON.Hover.Tips=Consigli JSON.Acrobatics=Acrobatica @@ -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\u00F9 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\u00E0 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.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\u00E0 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} \u00E8 aumentata a &r&a&l{2}&r&f. Overhaul.Name.Acrobatics=Acrobatica Overhaul.Name.Alchemy=Alchimia Overhaul.Name.Archery=Tiro con l'Arco @@ -102,47 +102,47 @@ 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\u00E0&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\u00E0... +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.Ability.Proc=&a**Atterraggio Aggraziato** +Acrobatics.Combat.Proc=&a**Schivato** +Acrobatics.SubSkill.Roll.Stats=&6Possibilit\u00E0 di Capriola &e{0}%&6 Possibilit\u00E0 di Capriola Aggraziata&e {1}% Acrobatics.SubSkill.Roll.Stat=Possibilit\u00E0 di Capriola Acrobatics.SubSkill.Roll.Stat.Extra=Possibilit\u00E0 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 [[YELLOW]]{6}%[[GRAY]] 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\u00E0 di Capriola: &e{0} +Acrobatics.SubSkill.Roll.GraceChance=Possibilit\u00E0 di Capriola Aggraziata: &e{0} +Acrobatics.SubSkill.Roll.Mechanics=&7La 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 &e{6}%&7 hai il &e{0}%&7 di possibilit\u00E0 di prevenire il danno, e il &e{1}%&7 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 &e{2}&7 dove diventa massima, ogni livello in Acrobatica ti d\u00E0 il &e{3}%&7 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 &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.Dodge.Name=Schivata @@ -158,8 +158,8 @@ Alchemy.SubSkill.Catalysis.Description=Aumenta la velocit\u00E0 di preparazione Alchemy.SubSkill.Catalysis.Stat=Velocit\u00E0 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.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.SkillName=ALCHIMIA @@ -187,13 +187,13 @@ 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 @@ -212,14 +212,14 @@ Axes.SubSkill.GreaterImpact.Description=Infligge danni bonus ai nemici non armat 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.On=&a**Spacca Crani ATTIVATO** +Axes.Skills.SS.Refresh=&aLa tua capacit\u00E0 &eSpacca Crani &asi \u00E8 rigenerata! +Axes.Skills.SS.Other.Off=Spacca Crani&a si \u00E8 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.Stat=Durata Giga-Trivella Demolitrice @@ -230,24 +230,24 @@ Excavation.SubSkill.Archaeology.Stat.Extra=Quantit\u00E0 Sfere di Esperienza Arc 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.On=&a**GIGA-TRIVELLA DEMOLITRICE ATTIVATA** +Excavation.Skills.GigaDrillBreaker.Refresh=&aLa tua capacit\u00E0 &eGiga-Trivella Demolitrice &asi \u00E8 rigenerata! +Excavation.Skills.GigaDrillBreaker.Other.Off=Giga-Trivella Demolitrice&a si \u00E8 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.ScarcityTip=&e&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=&7&oI movimenti caotici spaventeranno i pesci! +Fishing.Exhausting=&c&oL'uso improprio della canna da pesca provocher\u00E0 affaticamento e usurer\u00E0 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\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.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} &bRecord: &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 @@ -256,26 +256,26 @@ Fishing.SubSkill.Shake.Description=Scrolla oggetti di dosso ai mob o ai giocator Fishing.SubSkill.Shake.Stat=Possibilit\u00E0 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.MasterAngler.Stat=Maggiore Possibilit\u00E0 di Morso alla tua posizione attuale: &a+{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'\u00E8 qualcosa che puzza... Fishing.SkillName=PESCA #HERBALISM Herbalism.Ability.GTe.NeedMore=Ti servono pi\u00F9 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 @@ -283,12 +283,12 @@ 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.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 @@ -298,21 +298,21 @@ Herbalism.SubSkill.HylianLuck.Stat=Possibilit\u00E0 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.HylianLuck=&aOggi la fortuna di Hyrule \u00E8 con te! Herbalism.Listener=Erboristeria: Herbalism.SkillName=ERBORISTERIA Herbalism.Skills.GTe.Off=**Terra Verde si \u00E8 esaurita** -Herbalism.Skills.GTe.On=[[GREEN]]**TERRA VERDE ATTIVATA** -Herbalism.Skills.GTe.Refresh=[[GREEN]]La tua 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.On=&a**TERRA VERDE ATTIVATA** +Herbalism.Skills.GTe.Refresh=&aLa tua capacit\u00E0 &eTerra Verde &asi \u00E8 rigenerata! +Herbalism.Skills.GTe.Other.Off=Terra Verde&a si \u00E8 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.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.Stat=Durata di Super Demolitore @@ -321,8 +321,8 @@ Mining.SubSkill.DoubleDrops.Description=Raddoppia il normale drop Mining.SubSkill.DoubleDrops.Stat=Possibilit\u00E0 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.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\u00F9 Grandi Mining.SubSkill.BiggerBombs.Description=Aumenta il raggio di esplosione del TNT Mining.SubSkill.DemolitionsExpertise.Name=Perizia nelle Demolizioni @@ -331,16 +331,16 @@ Mining.SubSkill.DemolitionsExpertise.Stat=Riduzione del Danno da Perizia nelle D 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.On=&a**SUPER DEMOLITORE ATTIVATO** +Mining.Skills.SuperBreaker.Other.Off=Super Demolitore&a si \u00E8 esaurito per &e{0} +Mining.Skills.SuperBreaker.Other.On=&a{0}&2 ha usato &cSuper Demolitore! +Mining.Skills.SuperBreaker.Refresh=&aLa tua capacit\u00E0 &eSuper Demolitore &asi \u00E8 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\u00E0 &eEstrazione Esplosiva &asi \u00E8 rigenerata! #REPAIR Repair.SubSkill.Repair.Name=Riparazione @@ -353,7 +353,7 @@ Repair.SubSkill.StoneRepair.Name=Riparazione Pietra (ABILIT\u00E0 {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\u00E0 extra ripristinata Repair.SubSkill.SuperRepair.Name=Super Riparazione Repair.SubSkill.SuperRepair.Description=Doppia efficacia Repair.SubSkill.SuperRepair.Stat=Possibilit\u00E0 Super Riparazione @@ -361,66 +361,66 @@ Repair.SubSkill.DiamondRepair.Name=Riparazione Diamante (ABILIT\u00E0 {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\u00E0 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\u00E8 gi\u00E0 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.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.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.Stat=Collezionista di Rottami: &aRecupera fino a &e{0}&a oggetti. \u00E8 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. \u00E8 coinvolta un po' di fortuna. +Salvage.Arcane.ExtractFull=&7Possibilit\u00E0 di Incantesimo-Completo RA +Salvage.Arcane.ExtractPartial=&7Possibilit\u00E0 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 \u00E8 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! #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 \u00E8 &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 @@ -436,16 +436,16 @@ 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.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.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.On=&a**COLPI SEGHETTATI ATTIVATO** +Swords.Skills.SS.Refresh=&aLa tua capacit\u00E0 &eColpi Seghettati &asi \u00E8 rigenerata! +Swords.Skills.SS.Other.Off=Colpi Seghettati&a si \u00E8 esaurito per &e{0} +Swords.Skills.SS.Other.On=&a{0}&2 ha usato &cColpi Seghettati! #TAMING Taming.Ability.Bonus.0=Sicurezza Ambientale @@ -473,7 +473,7 @@ 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.HolyHound.Name=Segugio del Cielo @@ -489,24 +489,24 @@ 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.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 \u00E8 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 @@ -529,10 +529,10 @@ 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.On=&a**FURORE ATTIVATO** +Unarmed.Skills.Berserk.Other.Off=Furore&a si \u00E8 esaurito per &e{0} +Unarmed.Skills.Berserk.Other.On=&a{0}&2 ha usato &cFurore! +Unarmed.Skills.Berserk.Refresh=&aLa tua capacit\u00E0 &eFurore &asi \u00E8 rigenerata! #WOODCUTTING Woodcutting.Ability.0=Soffia Foglie @@ -555,173 +555,173 @@ 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.On=&a**ABBATTITORE D'ALBERI ATTIVATO** +Woodcutting.Skills.TreeFeller.Refresh=&aLa tua capacit\u00E0 &eAbbattitore d'Alberi &asi \u00E8 rigenerata! +Woodcutting.Skills.TreeFeller.Other.Off=Abbattitore d'Alberi&a si \u00E8 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! #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\u00E0 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 \u00E8 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! +mcMMO.Description=&3Introduzione al Progetto &emcMMO&3:,&6mcMMO \u00E8 una mod RPG &copen source&6 creata nel febbraio 2011,&6da &9nossr50&6. L'obbiettivo \u00E8 di fornire una esperienza di RPG di qualit\u00E0.,&3Consigli:,&6 - &aUsa &c/mcmmo help&a per vedere i comandi,&6 - &aDigita &c/NOMEABILIT\u00E0&a per visualizzare informazioni dettagliate sull'abilit\u00E0,&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\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.1=&aTi 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 +Commands.addxp.AwardAll=&aTi \u00E8 stata assegnata {0} esperienza in tutte le abilit\u00E0! +Commands.addxp.AwardSkill=&aTi \u00E8 stata assegnata {0} esperienza in {1}! +Commands.Ability.Off=Uso delle capacit\u00E0 &cdisattivato +Commands.Ability.On=Uso delle capacit\u00E0 &aattivato +Commands.Ability.Toggle=L'uso delle capacit\u00E0 \u00E8 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\u00E0 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.DoesNotExist= &cQuel giocatore non esiste nel database! Commands.GodMode.Disabled=Modalit\u00E0 Dio mcMMO Disabilitata Commands.GodMode.Enabled=Modalit\u00E0 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.AdminChatSpy.Toggle=La Chat Party mcMMO \u00E8 stata attivata/disattivata &e{0} +Commands.AdminChatSpy.Chat=&6[SPIA: &a{0}&6] &f{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.GodMode.Toggle=La modalit\u00E0 Dio \u00E8 stata attivata/disattivata per &e{0} +Commands.Healthbars.Changed.HEARTS=[mcMMO] Il tipo di barra della salute \u00E8 stato modificato a &cCuori&f. +Commands.Healthbars.Changed.BAR=[mcMMO] Il tipo di barra della salute \u00E8 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.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\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.mcpurge.Success=&aIl database \u00E8 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.mcremove.Success=&a{0} \u00E8 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\u00E0 \u00E8 stato impostato a {0}! +Commands.mmoedit.Modified.1=&aIl 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.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 \u00E8 &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} \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.mcconvert.Experience.Start=&7Avvio della conversione dalla curva {0} alla curva {1} +Commands.mcconvert.Experience.Finish=&7Conversione formula completata; ora \u00E8 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\u00E0 sono state &cdisattivate +Commands.Notifications.On=Le notifiche sulle abilit\u00E0 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.Party.Status=&8NOME: &f{0} {1} &8LIVELLO: &3{2} +Commands.Party.Status.Alliance=&8ALLEATO: &f{0} +Commands.Party.UnlockedFeatures=&8Funzionalit\u00E0 Sbloccate: &7[[ITALIC]]{0} +Commands.Party.ShareMode=&8MODALIT\u00E0 SPARTIZIONE: +Commands.Party.ItemShare=&7OGGETTI &3({0}) +Commands.Party.ExpShare=&7XP &3({0}) +Commands.Party.ItemShareCategories=&8Spartizione Oggetti: &7[[ITALIC]]{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 \u00E8 pieno! +Commands.Party.PartyFull.Invite=Non puoi invitare &e{0}&c in &a{1}&c perch\u00E9 ha gi\u00E0 &3{2}&c giocatori! +Commands.Party.PartyFull.InviteAccept=Non puoi unirti a &a{0}&c perch\u00E9 ha gi\u00E0 &3{1}&c giocatori! +Commands.Party.Create=&7Party Creato: {0} +Commands.Party.Rename=&7Nome party cambiato a: &f{0} +Commands.Party.SetSharing=&7Modalit\u00E0 spartizione del party {0} impostata a: &3{1} +Commands.Party.ToggleShareCategory=&7La condivisione oggetti del party per &6{0} &7\u00E8 stata &3{1} +Commands.Party.AlreadyExists=&4Il party {0} gi\u00E0 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\u00E8 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\u00E0 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\u00E0 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 \u00E8 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\u00E0 sono stati azzerati con successo. +Commands.Reset.Single=&aIl tuo livello di abilit\u00E0 di {0} \u00E8 stato azzerato con successo. +Commands.Reset=&a- Reimposta un livello di abilit\u00E0 a 0 +Commands.Scoreboard.Clear=&3Scoreboard mcMMO rimossa. +Commands.Scoreboard.NoBoard=&cLa scoreboard mcMMO non \u00E8 attiva. +Commands.Scoreboard.Keep=&3La scoreboard mcMMO rimmarr\u00E0 finch\u00E9 non userai &a/mcscoreboard clear&3. +Commands.Scoreboard.Timer=&3La scoreboard mcMMO sar\u00E0 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 \u00E8 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 \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.Skill.Leaderboard=--mcMMO &9{0}&e Classifica-- +Commands.SkillInfo=&a- Visualizza informazioni dettagliate su un'abilit\u00E0 +Commands.Stats=&a- Visualizza le tue statistiche mcMMO +Commands.ToggleAbility=&a- Attiva o disattiva l'attivazione delle abilit\u00E0 con il click destro +Commands.Usage.0=&cL'uso appropriato \u00E8 /{0} +Commands.Usage.1=&cL'uso appropriato \u00E8 /{0} {1} +Commands.Usage.2=&cL'uso appropriato \u00E8 /{0} {1} {2} +Commands.Usage.3=&cL'uso appropriato \u00E8 /{0} {1} {2} {3} Commands.Usage.FullClassName=nome classe Commands.Usage.Level=livello Commands.Usage.Message=messaggio @@ -734,70 +734,70 @@ Commands.Usage.Skill=abilit\u00E0 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.Mystery=&7Non 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.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\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=&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\u00E0 debug di mcMMO \u00E8 ora &6{0}&7, 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=&cNon hai inviti in questo momento +mcMMO.NoPermission=&4Permessi insufficienti. +mcMMO.NoSkillNote=&8Se non hai accesso a un'abilit\u00E0, non verr\u00E0 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 \u00E8 &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\u00E0 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\u00E8 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 \u00E8 un nome di party valido. +Party.Invite.Self=&cNon puoi invitare te stesso! +Party.IsLocked=&cQuesto party \u00E8 gi\u00E0 bloccato! +Party.IsntLocked=&cQuesto party non \u00E8 bloccato! +Party.Locked=&cIl party \u00E8 chiuso, solo il capo pu\u00F2 invitare. +Party.NotInYourParty=&4{0} non \u00E8 il tuo party +Party.NotOwner=&4Non sei il capo del party. +Party.Target.NotOwner=&4{0} non \u00E8 il capo del party. +Party.Owner.New=&a{0} \u00E8 il nuovo capo del party. +Party.Owner.NotLeader=&4Non sei pi\u00F9 il capo del party. +Party.Owner.Player =&aOra sei il capo del party. +Party.Password.None=&cQuesto party \u00E8 protetto da password. Fornisci una password per entrare. +Party.Password.Incorrect=&cLa password del party non \u00E8 corretta. +Party.Password.Set=&aPassword del party impostata a {0} +Party.Password.Removed=&aLa password del party \u00E8 stata rimossa. +Party.Player.Invalid=&cQuello non \u00E8 un giocatore valido. +Party.NotOnline=&4{0} non \u00E8 online! +Party.Player.InSameParty=&c{0} \u00E8 gi\u00E0 nel tuo party! +Party.PlayerNotInParty=&4{0} non \u00E8 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 \u00E8 teletrasportato da te. +Party.Teleport.Disabled=&c{0} non consente il teletrasporto del party. +Party.Rename.Same=&cQuello \u00E8 gi\u00E0 il nome del tuo party! +Party.Join.Self=&cNon puoi entrare nel tuo stesso party! +Party.Unlocked=&7Il party \u00E8 sbloccato +Party.Disband=&7Il party \u00E8 stato sciolto +Party.Alliance.Formed=&7Il tuo party \u00E8 ora alleato con &a{0} +Party.Alliance.Disband=&7Il tuo party non \u00E8 pi\u00F9 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 +808,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 \u00E8 ancora stata sbloccata. +Party.Feature.Disabled.2=&cIl teletrasporto del party non \u00E8 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 \u00E8 ancora stata sbloccata. +Party.Feature.Disabled.5=&cLa condivisione XP del party non \u00E8 ancora stata sbloccata. Party.ShareType.Xp=XP Party.ShareType.Item=OGGETTI Party.ShareMode.None=NESSUNA @@ -839,179 +839,179 @@ 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 \u00E8 ora bloccata a {0}! +Commands.xplock.unlocked=&6La tua BARRA XP \u00E8 ora &aSBLOCCATA&6! +Commands.xprate.modified=&cIl TASSO XP \u00E8 stato portato a {0} +Commands.xprate.over=&cL'Evento di mcMMO Tasso XP \u00E8 FINITO!! +Commands.xprate.proper.0=&cL'uso corretto per cambiare il tasso di XP \u00E8 /xprate +Commands.xprate.proper.1=&cL'uso corretto per ripristinare il tasso di XP al valore predefinito \u00E8 /xprate reset +Commands.xprate.proper.2=&cSpecifica "true" o "false" per indicare se questo \u00E8 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 \u00E8 ora &6{0}&3x +Commands.xprate.started.0=&6\u00E8 INIZIATO UN EVENTO XP PER mcMMO! +Commands.xprate.started.1=&6IL TASSO DI XP DI mcMMO \u00E8 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 \u00E8 attualmente in un evento di tasso XP! Il tasso XP \u00E8 {0}x! #GUIDES -Guides.Available=[[GRAY]]Guida per {0} disponibile - digita /{1} ? [pagina] -Guides.Header=[[GOLD]]-=[[GREEN]]Guida {0}[[GOLD]]=- +Guides.Available=&7Guida per {0} disponibile - digita /{1} ? [pagina] +Guides.Header=&6-=&aGuida {0}&6=- Guides.Page.Invalid=Non \u00E8 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] ##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 \u00E8 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\u00E0 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\u00E0 passiva quando subisci danni da caduta\n&edi annullare il danno subito. Puoi accovacciarti per\n&eraddoppiare la possibilit\u00E0 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\u00E0\n&edi verificarsi e forniscono pi\u00F9 protezione di quelle normali.\n&eLa probabilit\u00E0 di Capriola \u00E8 legata al tuo livello di abilit\u00E0 +Guides.Acrobatics.Section.2=&3Come funziona la Schivata?\n&eHai una possibilit\u00E0 passiva quando sei\n&eferito in combattimento di dimezzare il danno subito.\n&e\u00E8 legata al tuo livello di abilit\u00E0. ##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\u00E0 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\u00E0 devi preparare pozioni. +Guides.Alchemy.Section.1=&3Come funziona Catalisi?\n&eCatalizza la velocit\u00E0 di preparazione, con una\n&evelocit\u00E0 massima di 4x al livello 1000.\n&eQuesta abilit\u00E0 \u00E8 sbloccata al livello 100 di default. +Guides.Alchemy.Section.2=&3Come funziona Intrugli?\n&eLa capacit\u00E0 Intrugli consente di preparare pi\u00F9 pozioni con ingredienti personalizzati.\n&eQuali ingredienti speciali sono sbloccati \u00E8 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\u00E0)\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\u00E0) +Guides.Alchemy.Section.6=&3Ingredienti Intrugli di grado 6:\n&eFelce (Pozione di Saziet\u00E0)\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\u00E0 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\u00E0 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\u00E0 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\u00E0 passiva di recupera alcune delle tue frecce\n&equando uccidi un mob con il tuo arco.\n&eQuesta possibilit\u00E0 aumenta all'aumentare del tuo livello in Tiro con l'Arco.\n&eDi default, Questa capacit\u00E0 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\u00E0 Asce puoi usare la tua ascia per molto pi\u00F9 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\u00E0 all'aumentare\n&edel tuo livello.\n&3GUADAGNO XP:\n&ePer ottenere XP in questa abilit\u00E0 devi colpire altri mob o giocatori\n&econ la tua Ascia. +Guides.Axes.Section.1=&3Come funziona Spacca Crani?\n&eQuesta capacit\u00E0 consente di infliggere un colpo EaA (Effetto ad Area).\n&eQuesto colpo EaA infligger\u00E0 la met\u00E0 del danno fatto\n&eall'obbiettivo principale, quindi \u00E8 ottimo per eliminare grandi mucchi di mob. +Guides.Axes.Section.2=&3Come funziona Colpi Critici?\n&eColpi Critici \u00E8 una capacit\u00E0 passiva che d\u00E0 ai giocatori\n&euna possibilit\u00E0 di infliggere danno extra.\n&eCon le impostazioni predefinite, ogni 2 livelli abilit\u00E0 in Asce ottieni un\n&e0.1% di possibilit\u00E0 in pi\u00F9 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 \u00E8 una capacit\u00E0 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\u00E0 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\u00E0 passiva di ottenere un impatto maggiore\n&ecolpendo i mob o i giocatori con la tua ascia.\n&eDi default questa possibilit\u00E0 \u00E8 del 25%. Questa capacit\u00E0 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 \u00E8 l'atto di scavare la terra per trovare tesori.\n&eScavando la terra troverai tesori.\n&ePi\u00F9 lo fai, pi\u00F9 tesori puoi trovare.\n\n&3GUADAGNO XP:\n&ePer ottenere XP in questa abilit\u00E0 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\u00E0 la Giga-Trivella Demolitrice. +Guides.Excavation.Section.3=&3Cos'\u00E8 la Giga-Trivella Demolitrice?\n&eLa Giga-Trivella Demolitrice \u00E8 una capacit\u00E0 con una ricarica\n&elegata all'abilit\u00E0 di Scavo. Triplica la tua possibilit\u00E0\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\u00E0 per il suo drop, di conseguenza \u00E8\n&edifficile dire quanto ti stia aiutando.\n&eTieni presente che maggiore \u00E8 la tua abilit\u00E0 di Scavo,\n&epi\u00F9 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\u00E0 di Pesca, La pesca \u00E8 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\u00E0 ti consente di trovare tesori pescando\n&econ una piccola possibilit\u00E0 che gli oggetti vengano incantati.\n&eOgni possibile tesoro di Pesca ha una possibilit\u00E0\n&edi essere trovato a ogni livello. Dipende comunque\n&edalla rarit\u00E0 dell'oggetto quanto spesso si trover\u00E0.\n&eQuanto pi\u00F9 alta \u00E8 la tua abilit\u00E0 di Pesca, maggiori\n&esaranno le tue possibilit\u00E0 di trovare tesori migliori. +Guides.Fishing.Section.2=&3Come funziona Pesca sul Ghiaccio?\n&eQuesta capacit\u00E0 passiva ti consente di pescare sui laghi ghiacciati!\n&eLancia la tua canna da pesca in un lago di ghiaccio e l'abilit\u00E0\n&ecreer\u00E0 un piccolo buco nel ghiaccio in cui pescare. +Guides.Fishing.Section.3=&3Come funziona Pescatore Provetto?\n&eQuesta capacit\u00E0 passiva aumenta la possibilit\u00E0 che i pesci abbocchino durante la pesca.\n&eQuando sblocchi questa abilit\u00E0, pescare in\n&euna barca o in un bioma oceanico raddoppia la possibilit\u00E0 che i pesci abbocchino. +Guides.Fishing.Section.4=&3Come funziona Scuotere?\n&eQuesta capacit\u00E0 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\u00E8 anche possibile acquisire teschi di mob, che non sono ottenibili \n&enormalmente in modalit\u00E0 sopravvivenza. +Guides.Fishing.Section.5=&3Come funziona Dieta del Pescatore?\n&eQuesta capacit\u00E0 passiva aumenta la quantit\u00E0 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 \u00E8 una capacit\u00E0 attiva, puoi fare clic-destro\n&econ una zappa in mano per attivare Terra Verde.\n&eTerra Verde d\u00E0 ai giocatori la possibilit\u00E0 di ottenere drop 3x\n&eraccogliendo piante. Inoltre d\u00E0 ai giocatori l'abilit\u00E0 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\u00E0 passiva ripianter\u00E0 automaticamente le colture durante\n&ela raccolta.\n&eLe tue possibilit\u00E0 di successo dipendono dalla tua abilit\u00E0 di Erboristeria. +Guides.Herbalism.Section.4=&3Come funziona Pollice Verde (Pietrisco/Mattoni di pietra/Terra)?\n&eQuesta capacit\u00E0 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\u00F2 consumer\u00E0 1 seme. +Guides.Herbalism.Section.5=&3Come funziona Dieta del Contadino?\n&eQuesta capacit\u00E0 passiva aumenta la quantit\u00E0 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\u00E0 passiva ti d\u00E0 una possibilit\u00E0 di trovare oggetti rari\n&equando determinati blocchi vengono rotti con una spada. +Guides.Herbalism.Section.7=&3Come funziona Doppi Drop?\n&eQuesta capacit\u00E0 passiva d\u00E0 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\u00E0 di materiali estratti.\n\n&3GUADAGNO XP:\n&ePer ottenere XP in questa abilit\u00E0, 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'\u00E8 il Super Demolitore?\n&eIl Super Demolitore \u00E8 una capacit\u00E0 con una ricarica legata all'abilit\u00E0\n&edi Estrazione. Triplica le tue possibilit\u00E0 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\u00F2 far\u00E0\n&eesplodere istantaneamente il TNT. +Guides.Mining.Section.5=&3Come funziona Estrazione Esplosiva?\n&eEstrazione Esplosiva \u00E8 una capacit\u00E0 con una ricarica legata all'abilit\u00E0\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 \u00E8 Bombe pi\u00F9 Grandi, che aumenta il raggio di esplosione.\n&eLa seconda \u00E8 Perizia nelle Demolizioni, che diminuisce il danno\n&edalle esplosioni di TNT. La terza parte semplicemente aumenta\n&ela quantit\u00E0 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 \u00E8\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\u00F2 consuma 1 oggetto per ogni uso. +Guides.Repair.Section.2=&3Come funziona Maestria nella Riparazione?\n&eMaestria nella Riparazione aumenta la quantit\u00E0 di riparazione. La quantit\u00E0 extra\n&eriparata \u00E8 influenzata dal tuo livello di abilit\u00E0 in Riparazione. +Guides.Repair.Section.3=&3Come funziona Super Riparazione?\n&eSuper Riparazione \u00E8 una capacit\u00E0 passiva. Durante la riparazione di un oggetto,\n&ed\u00E0 ai giocatori una possibilit\u00E0 di riparare un oggetto con\n&edoppia efficacia. +Guides.Repair.Section.4=&3Come funziona Forgiatura Arcana?\n&eQuesta capacit\u00E0 passiva ti consente di riparare gli oggetti con una certa\n&epossibilit\u00E0 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 \u00E8 un'abilit\u00E0 figlia di Riparazione e Pesca, il tuo livello\n&edi abilit\u00E0 di Rottamazione \u00E8 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\u00F2 romper\u00E0 l'oggetto,\n&ee ti dar\u00E0 indietro i materiali usati per crearlo.\n\n&ePer esempio, rottamando un piccone di ferro ti dar\u00E0 dei lingotti di ferro. +Guides.Salvage.Section.2=&3Come funziona la Rottamazione Avanzata?\n&eUna volta sbloccata, questa capacit\u00E0 ti consente di rottamare gli oggetti danneggiati.\n&eLa percentuale di rendimento aumenta all'aumentare del tuo livello. Un rendimento pi\u00F9 elevato\n&esignifica che puoi recuperare pi\u00F9 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 \u00E8 danneggiato per il 20%,\n&eci\u00F2 significa che la quantit\u00E0 massima che potrai ottenere \u00E8 solo 2\n&e(perch\u00E9 il piccone \u00E8 fatto con 3 lingotti - ognuno vale\n&eil 33,33% di durabilit\u00E0) che equivale al 66%. Se la tua percentuale\n&edi rendimento \u00E8 sotto il 66% non potrai ottenere 2 lingotti.\n&eSe \u00E8 sopra questo valore potrai ottenere la "quantit\u00E0 intera",\n&eil che significa che otterrai 2 lingotti. +Guides.Salvage.Section.4=&3Come funziona Rottamazione Arcana?\n&eQuesta capacit\u00E0 ti consente di ottenere libri incantati rottamando\n&eoggetti incantati. La probabilit\u00E0 di estrarre con successo un incantesimo\n&ecompleto o parziale varia a seconda del tuo livello di abilit\u00E0.\n\n&eQuando un incantesimo \u00E8 estratto parzialmente, il libro\n&eincantato avr\u00E0 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\u00E0 assegna bonus di combattimento a chiunque combatta con una\n&espada.\n\n&3GUADAGNO XP:\n&eGli XP si ottengono in base alla quantit\u00E0 di danoo inflitto ai mob o\n&eagli altri giocatori brandendo una spada. +Guides.Swords.Section.1=&3Come funziona Colpi Seghettati?\n&eColpi Seghettati \u00E8 una capacit\u00E0 attiva, puoi attivarla facendo\n&eclic-destro con una spada. Questa capacit\u00E0 ti consente di infliggere\n&eun colpo EaA (Effetto ad Area). Questo EaA far\u00E0 un danno 25%\n&ebonus e infligger\u00E0 un effetto di sanguinamento per 5 tick. +Guides.Swords.Section.2=&3Come funziona Contrattacco?\n&eContrattacco \u00E8 una capacit\u00E0 passiva. Quando blocchi e prendi\n&ecolpi dai mob, hai una possibilit\u00E0 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\u00E0 fino alla fine dell'effetto, o alla morte, \n&equello che viene prima.\n&eLa durata del sanguinamento \u00E8 aumentata dalla tua abilit\u00E0 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\u00E0 ai giocatori vari bonus di combattimento durante l'utilizzo\n&edi lupi addomesticati.\n\n&3GUADAGNO XP:\n&ePer ottenere XP in questa abilit\u00E0, devi addomesticare lupi/ocelot o\n&ecombattere con i tuoi lupi. +Guides.Taming.Section.1=&3Come funziona Richiamo della Natura?\n&eRichiamo della Natura \u00E8 una capacit\u00E0 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 \u00E8 una capacit\u00E0 passiva che ha una possibilit\u00E0 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\u00E0 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\u00E0 al danno da caduta. +Guides.Taming.Section.6=&3Come funziona Pelliccia Folta?\n&eQuesta capacit\u00E0 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\u00E0 passiva riduce il danno fatti ai lupi\n&edalle esplosioni. +Guides.Taming.Section.8=&3Come funziona Servizio Fast Food?\n&eQuesta capacit\u00E0 passiva d\u00E0 ai lupi una possibilit\u00E0 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\u00E0 di Lotta d\u00E0 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\u00E0 di danno inflitto a mani nude\n&eai mob o agli altri giocatori. +Guides.Unarmed.Section.1=&3Come funziona Furore?\n&eFurore \u00E8 una capacit\u00E0 attiva che \u00E8 attivata dal\n&eclic-destro. In modalit\u00E0 Furore, infliggi il 50% di danni\n&ein pi\u00F9 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 \u00E8 una capacit\u00E0 passiva che ti d\u00E0 una possibilit\u00E0\n&edi deviare frecce tirate da scheletri o altri giocatori.\n&eLa freccia cadr\u00E0 innocuamente a terra. +Guides.Unarmed.Section.4=&3Come funziona Presa di Ferro?\n&ePresa di Ferro \u00E8 una capacit\u00E0 passiva che contrasta il disarmo. All'aumentare\n&edel tuo livello in Lotta, la possibilit\u00E0 di prevenire un disarmo aumenta. +Guides.Unarmed.Section.5=&3Come funziona Disarmo?\n&eQuesta capacit\u00E0 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 \u00E8 una capacit\u00E0 attiva, puoi fare clic-destro\n&econ un'ascia in mano per attivare Abbattitore d'Alberi. Questo\n&efar\u00E0 rompere l'intero albero istantaneamente, droppando tutti\n&ei suoi tronchi insieme. +Guides.Woodcutting.Section.2=&3Come funziona Soffia Foglie?\n&eSoffia Foglie \u00E8 una capacit\u00E0 passiva che fa\n&ecadere le foglie istantaneamente quando colpite da un'ascia. Di default,\n&equesta capacit\u00E0 si sblocca al livello 100. +Guides.Woodcutting.Section.3=&3Come funziona Doppi Drop?\n&eQuesta capacit\u00E0 passiva ti d\u00E0 una possibilit\u00E0 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'\u00E8 la possibilit\u00E0 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\u00E0 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\u00E0 FIGLIA) +Skills.Disarmed=&4Sei stato disarmato! +Skills.Header=-----[] &a{0}&c []----- +Skills.NeedMore=&4Hai bisogno di pi\u00F9 &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\u00E0. &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\u00E0. #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\u00E0 DI COMBATTIMENTO=- +Stats.Header.Gathering=&6-=ABILIT\u00E0 DI RACCOLTA=- +Stats.Header.Misc=&6-=ABILIT\u00E0 VARIE=- +Stats.Own.Stats=&a[mcMMO] Statistiche #PERKS Perks.XP.Name=Esperienza @@ -1019,44 +1019,44 @@ Perks.XP.Desc=Ricevi XP potenziati in determinate abilit\u00E0. 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.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.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.Mode.Disabled=&6[mcMMO] Modalit\u00E0 hardcore {0} disabilitata per {1}. +Hardcore.Mode.Enabled=&6[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.DeathStatLoss.PlayerDeath=&6[mcMMO] &4Hai perso &9{0}&4 livelli a causa della morte. +Hardcore.DeathStatLoss.PercentageChanged=&6[mcMMO] La percentuale di Vampirismo \u00E8 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 \u00E8 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 \u00E8 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\u00E0 hardcore abilitata: &4{0} +MOTD.Hardcore.DeathStatLoss.Stats=&6[mcMMO] &3Perdita di Abilit\u00E0 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.SubSkill.UnderstandingTheArt.Stat=Moltiplicatore XP Vanilla: &e{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.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 @@ -1107,38 +1107,38 @@ UpdateChecker.Outdated=Stai utilizzando una versione non aggiornata di mcMMO! UpdateChecker.NewAvailable=C'\u00E8 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.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\u00E0 #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 \u00E8 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\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=&4[A]&c mcMMO non \u00E8 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} \u00E8 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 \u00E8 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\u00E0. +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\u00E0. 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 0990ad327..f11aafa59 100644 --- a/src/main/resources/locale/locale_ja_JP.properties +++ b/src/main/resources/locale/locale_ja_JP.properties @@ -9,7 +9,7 @@ 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.Header=&6\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 @@ -32,48 +32,48 @@ JSON.URL.Patreon=nossr50\u3068\u5f7c\u306emcMMO\u3078\u306e\u50cd\u304d\u3092Pat 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.SkillUnlockMessage=&6[ mcMMO&e @&3{0} &6\u30e9\u30f3\u30af &3{1}&6 \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]]@ +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@ JSON.Notification.SuperAbility={0} -JSON.Acrobatics.Roll.Interaction.Activated=\u30c6\u30b9\u30c8 [[RED]]\u53d7\u3051\u8eab\u30c6\u30b9\u30c8 +JSON.Acrobatics.Roll.Interaction.Activated=\u30c6\u30b9\u30c8 &c\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 +Anvil.SingleItemStack=&c\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 -mcMMO.Template.Prefix=[[GOLD]]([[GREEN]]mcMMO[[GOLD]]) [[GRAY]]{0} +mcMMO.Template.Prefix=&6(&amcMMO&6) &7{0} ### BEGIN STYLING ### -Ability.Generic.Refresh=[[GREEN]]**\u30a2\u30d3\u30ea\u30c6\u30a3 \u30ea\u30d5\u30ec\u30c3\u30b7\u30e5\uff01** -Ability.Generic.Template.Lock=[[GRAY]]{0} +Ability.Generic.Refresh=&a**\u30a2\u30d3\u30ea\u30c6\u30a3 \u30ea\u30d5\u30ec\u30c3\u30b7\u30e5\uff01** +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=\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} +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=\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 +Commands.XPGain.Overhaul=&6XP\u7372\u5f97: &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\u3067\u3053\u306e\u30b9\u30ad\u30eb\u3092\u898b\u308b&e] +Overhaul.Levelup=&l{0}\u304c&r&a&l{2}&r&f&l\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 @@ -91,40 +91,40 @@ Overhaul.Name.Unarmed=\u7d20\u624b Overhaul.Name.Woodcutting=\u6728\u3053\u308a # /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 \u30b3\u30de\u30f3\u30c9&c[]--- +Commands.Other=&c---[]&a\u30b9\u30da\u30b7\u30e3\u30eb\u30b3\u30de\u30f3\u30c9&c[]--- +Commands.Party.Header=&c-----[]&a\u30d1\u30fc\u30c6\u30a3\u30fc&c[]----- +Commands.Party.Features.Header=&c-----[]&a\u7279\u5fb4&c[]----- 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]]) +XPBar.Template.EarlyGameBoost=&6\u65b0\u3057\u3044\u30b9\u30ad\u30eb\u3092\u5b66\u3093\u3067\u3044\u307e\u3059... +XPBar.Acrobatics=\u30a2\u30af\u30ed\u30d0\u30c6\u30a3\u30c3\u30af Lv.&6{0} +XPBar.Alchemy=\u932c\u91d1\u8853 Lv.&6{0} +XPBar.Archery=\u5f13 Lv.&6{0} +XPBar.Axes=\u65a7 Lv.&6{0} +XPBar.Excavation=\u6398\u524a Lv.&6{0} +XPBar.Fishing=\u91e3\u308a Lv.&6{0} +XPBar.Herbalism=\u8fb2\u696d Lv.&6{0} +XPBar.Mining=\u63a1\u6398 Lv.&6{0} +XPBar.Repair=\u4fee\u7406 Lv.&6{0} +XPBar.Salvage=\u30b5\u30eb\u30d9\u30fc\u30b8 Lv.&6{0} +XPBar.Smelting=\u7cbe\u932c Lv.&6{0} +XPBar.Swords=\u5263 Lv.&6{0} +XPBar.Taming=\u8abf\u6559 Lv.&6{0} +XPBar.Unarmed=\u7d20\u624b Lv.&6{0} +XPBar.Woodcutting=\u6728\u3053\u308a Lv.&6{0} +XPBar.Complex.Template={0} &3 {4}&f% &3(&f{1}&3/&f{2}&3) ### 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.Ability.Proc=&a**\u512a\u96c5\u306b\u7740\u5730\u3057\u305f** +Acrobatics.Combat.Proc=&a**\u8eb1\u3057\u305f** +Acrobatics.SubSkill.Roll.Stats=&6\u53d7\u3051\u8eab \u78ba\u7387 &e{0}%&6 \u512a\u96c5\u306a\u53d7\u3051\u8eab \u78ba\u7387&e {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.Roll.Chance=\u53d7\u3051\u8eab \u78ba\u7387: &e{0} +Acrobatics.SubSkill.Roll.GraceChance=\u512a\u96c5\u306a\u53d7\u3051\u8eab \u78ba\u7387: &e{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 @@ -140,8 +140,8 @@ Alchemy.SubSkill.Catalysis.Description=\u30dd\u30fc\u30b7\u30e7\u30f3\u306e\u91b 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.SubSkill.Concoctions.Stat=\u8abf\u5408 \u30e9\u30f3\u30af: &a{0}&3/&a{1} +Alchemy.SubSkill.Concoctions.Stat.Extra=\u6750\u6599 [&a{0}&3]: &a{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 @@ -169,13 +169,13 @@ 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.Ability.Lower=&7\u65a7\u3092\u4e0b\u3052\u305f\u3002 +Axes.Ability.Ready=&3\u65a7\u3092&6\u6e96\u5099&3\u3057\u305f\u3002 +Axes.Combat.CritStruck=&4\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.Proc=&a**\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.Combat.SS.Struck=&4\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 @@ -194,14 +194,14 @@ Axes.SubSkill.GreaterImpact.Description=\u9632\u5177\u306e\u306a\u3044\u6575\u30 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.Skills.SS.On=&a**\u30b9\u30ab\u30eb\u30b9\u30d7\u30ea\u30c3\u30bf\u30fc \u30a2\u30af\u30c6\u30a3\u30d9\u30fc\u30c8** +Axes.Skills.SS.Refresh=&e\u30b9\u30ab\u30eb\u30b9\u30d7\u30ea\u30c3\u30bf\u30fc &a\u30a2\u30d3\u30ea\u30c6\u30a3\u304c\u56de\u5fa9\u3057\u307e\u3057\u305f\uff01 +Axes.Skills.SS.Other.Off=&e{0}\u304c &f\u30b9\u30ab\u30eb\u30b9\u30d7\u30ea\u30c3\u30bf\u30fc &a\u3092\u6d88\u8017\u3057\u305f +Axes.Skills.SS.Other.On=&a{0}&2\u304c &c\u30b9\u30ab\u30eb\u30b9\u30d7\u30ea\u30c3\u30bf\u30fc &2\u3092\u4f7f\u3063\u305f\uff01 # 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.Ability.Lower=&7\u30b7\u30e3\u30d9\u30eb\u3092\u4e0b\u3052\u305f\u3002 +Excavation.Ability.Ready=&3\u30b7\u30e3\u30d9\u30eb\u3092&6\u6e96\u5099&3\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 @@ -213,24 +213,24 @@ Excavation.SubSkill.Archaeology.Stat.Extra=\u8003\u53e4\u5b66 \u7d4c\u9a13\u5024 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.Skills.GigaDrillBreaker.On=&a**\u30ae\u30ac\u30c9\u30ea\u30eb\u30d6\u30ec\u30fc\u30ab\u30fc \u30a2\u30af\u30c6\u30a3\u30d9\u30fc\u30c8** +Excavation.Skills.GigaDrillBreaker.Refresh=&e\u30ae\u30ac\u30c9\u30ea\u30eb\u30d6\u30ec\u30fc\u30ab\u30fc &a\u30a2\u30d3\u30ea\u30c6\u30a3\u304c\u56de\u5fa9\u3057\u307e\u3057\u305f\uff01 +Excavation.Skills.GigaDrillBreaker.Other.Off=&e{0}\u304c &f\u30ae\u30ac\u30c9\u30ea\u30eb\u30d6\u30ec\u30fc\u30ab\u30fc &a\u3092\u6d88\u8017\u3057\u305f +Excavation.Skills.GigaDrillBreaker.Other.On=&a{0}&2\u304c &c\u30ae\u30ac\u30c9\u30ea\u30eb\u30d6\u30ec\u30fc\u30ab\u30fc &2\u3092\u4f7f\u3063\u305f\uff01 # 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.ScarcityTip=&e&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=&7&o\u6df7\u6c8c\u3068\u3057\u305f\u52d5\u304d\u306f\u9b5a\u3092\u6016\u304c\u3089\u305b\u307e\u3059\uff01 +Fishing.Exhausting=&c&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=&7\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: &7 **\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.TreasureHunter.Stat=\u30c8\u30ec\u30b8\u30e3\u30fc\u30cf\u30f3\u30bf\u30fc \u30e9\u30f3\u30af: &a{0}&3/&a{1} +Fishing.SubSkill.TreasureHunter.Stat.Extra=\u30c9\u30ed\u30c3\u30d7\u7387: &7\u30b3\u30e2\u30f3: &e{0} &a\u30a2\u30f3\u30b3\u30e2\u30f3: &e{1}\n&9\u30ec\u30a2: &e{2} &d\u30a8\u30d4\u30c3\u30af: &e{3} &6\u30ec\u30b8\u30a7\u30f3\u30c0\u30ea\u30fc: &e{4} &b\u30ec\u30b3\u30fc\u30c9: &e{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 @@ -239,26 +239,26 @@ Fishing.SubSkill.Shake.Description=Mob\u3084\u30d7\u30ec\u30a4\u30e4\u30fc\u304b 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.FishermansDiet.Stat=\u6f01\u5e2b\u306e\u98df\u4e8b:&a \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.MasterAngler.Stat=\u73fe\u5728\u306e\u5834\u6240\u306b\u9b5a\u304c\u98df\u3044\u4ed8\u304f\u78ba\u7387\u3092\u8ffd\u52a0\u3057\u307e\u3057\u305f\u3002: &a+&e{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.Chance.Raining=&9 \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.Ability.TH.MagicFound=&7\u9b54\u6cd5\u3092\u611f\u3058\u307e\u3059\u3002 +Fishing.Ability.TH.Boom=&7BOOM TIME!!! +Fishing.Ability.TH.Poison=&7\u306a\u304b\u306a\u304b\u3044\u3044\u5302\u3044\u304c\u3057\u306a\u3044... Fishing.SkillName=\u91e3\u308a # 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.GTh=&a**\u7dd1\u8272\u306e\u89aa\u6307** +Herbalism.Ability.Lower=&7\u30af\u30ef\u3092\u4e0b\u3052\u305f\u3002 +Herbalism.Ability.Ready=&3\u30af\u30ef\u3092&6\u6e96\u5099&3\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 @@ -266,12 +266,12 @@ Herbalism.SubSkill.GreenTerra.Stat=\u30b0\u30ea\u30fc\u30f3\u30c6\u30e9 \u671f\u 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.SubSkill.GreenThumb.Stat.Extra=\u7dd1\u8272\u306e\u89aa\u6307 \u30b9\u30c6\u30fc\u30b8: &a \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.FarmersDiet.Stat=\u8fb2\u5bb6\u306e\u98df\u4e8b: &a\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 @@ -281,31 +281,31 @@ Herbalism.SubSkill.HylianLuck.Stat=\u30cf\u30a4\u30ea\u30a2\u306e\u904b \u78ba\u 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.HylianLuck=&a\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.Skills.GTe.On=&a**\u30b0\u30ea\u30fc\u30f3\u30c6\u30e9 \u30a2\u30af\u30c6\u30a3\u30d9\u30fc\u30c8** +Herbalism.Skills.GTe.Refresh=&e\u30b0\u30ea\u30fc\u30f3\u30c6\u30e9 &a\u30a2\u30d3\u30ea\u30c6\u30a3\u304c\u56de\u5fa9\u3057\u307e\u3057\u305f\uff01 +Herbalism.Skills.GTe.Other.Off=&e{0}\u304c &f\u30b0\u30ea\u30fc\u30f3\u30c6\u30e9 &a\u3092\u6d88\u8017\u3057\u305f +Herbalism.Skills.GTe.Other.On=&a{0}&2\u304c &c\u30b0\u30ea\u30fc\u30f3\u30c6\u30e9 &2\u3092\u4f7f\u3063\u305f\uff01 # 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.Ability.Lower=&7\u30d4\u30c3\u30b1\u30eb\u3092\u4e0b\u3052\u305f\u3002 +Mining.Ability.Ready=&3\u30d4\u30c3\u30b1\u30eb\u3092&6\u6e96\u5099&3\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.DoubleDrops.Stat=\u30c9\u30ed\u30c3\u30d7\u4e8c\u500d \u78ba\u7387: &e{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.BlastMining.Stat=\u30d6\u30e9\u30b9\u30c8\u30de\u30a4\u30cb\u30f3\u30b0:&a \u30e9\u30f3\u30af {0}/{1} &7({2}) +Mining.SubSkill.BlastMining.Stat.Extra=\u7206\u767a\u7bc4\u56f2\u5897\u52a0: &a+{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 @@ -314,17 +314,17 @@ Mining.SubSkill.DemolitionsExpertise.Stat=\u89e3\u4f53\u30a8\u30ad\u30b9\u30d1\u 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.Skills.SuperBreaker.On=&a**\u30b9\u30fc\u30d1\u30fc\u30d6\u30ec\u30fc\u30ab\u30fc \u30a2\u30af\u30c6\u30a3\u30d9\u30fc\u30c8** +Mining.Skills.SuperBreaker.Refresh=&e\u30b9\u30fc\u30d1\u30fc\u30d6\u30ec\u30fc\u30ab\u30fc &a\u30a2\u30d3\u30ea\u30c6\u30a3\u304c\u56de\u5fa9\u3057\u307e\u3057\u305f\uff01 +Mining.Skills.SuperBreaker.Other.Off=&e{0}\u304c &f\u30b9\u30fc\u30d1\u30fc\u30d6\u30ec\u30fc\u30ab\u30fc &a\u3092\u6d88\u8017\u3057\u305f +Mining.Skills.SuperBreaker.Other.On=&a{0}&2\u304c &c\u30b9\u30fc\u30d1\u30fc\u30d6\u30ec\u30fc\u30ab\u30fc &2\u3092\u4f7f\u3063\u305f\uff01 # 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.Other.On=&a{0}&2 \u304c &c\u30d6\u30e9\u30b9\u30c8\u30de\u30a4\u30cb\u30f3\u30b0 &2\u3092\u4f7f\u3063\u305f\uff01 +Mining.Blast.Refresh=&e\u30d6\u30e9\u30b9\u30c8\u30de\u30a4\u30cb\u30f3\u30b0[GREEN]]\u30a2\u30d3\u30ea\u30c6\u30a3\u304c\u56de\u5fa9\u3057\u307e\u3057\u305f\uff01 # REPAIR Repair.SubSkill.Repair.Name=\u4fee\u7406 @@ -337,7 +337,7 @@ 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.RepairMastery.Stat=\u4fee\u7406 \u7df4\u5ea6: &aExtra {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 @@ -345,27 +345,27 @@ Repair.SubSkill.DiamondRepair.Name=\u30c0\u30a4\u30a2\u30e2\u30f3\u30c9 \u4fee\u 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.SubSkill.ArcaneForging.Stat=\u96e3\u89e3\u306a\u935b\u9020: &e\u30e9\u30f3\u30af {0}/{1} +Repair.SubSkill.ArcaneForging.Stat.Extra=&3\u96e3\u89e3\u306a\u935b\u9020 \u30aa\u30c3\u30ba:&7 \u6210\u529f &a{0}&7%, \u5931\u6557 &c{1}&7% +Repair.Error=&4\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=&4\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.Skills.AdeptDiamond=&4\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=&4\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=&4\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=&4\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=&e{1} &c\u3092\u4fee\u7406\u3059\u308b\u305f\u3081\u306b\u306f &e{0} &c\u30ec\u30d9\u30eb\u304c\u5fc5\u8981\u3067\u3059\u3002 +Repair.Skills.FeltEasy=&7\u305d\u308c\u306f\u7c21\u5358\u306b\u611f\u3058\u305f\u3002 +Repair.Skills.FullDurability=&7\u305d\u308c\u306f\u5b8c\u5168\u306a\u8010\u4e45\u6027\u3067\u3059\u3002 +Repair.Skills.StackedItems=&4\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 # 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.Perfect=&a\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 # SALVAGE Salvage.Pretty.Name=\u30b5\u30eb\u30d9\u30fc\u30b8 @@ -373,41 +373,41 @@ Salvage.SubSkill.UnderstandingTheArt.Name=\u82b8\u8853\u3092\u7406\u89e3\u3059\u 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.ScrapCollector.Stat=\u30b9\u30af\u30e9\u30c3\u30d7\u30b3\u30ec\u30af\u30bf\u30fc: &a\u6700\u5927&e{0}\u500b&a\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.SubSkill.ArcaneSalvage.Stat=\u96e3\u89e3\u306a\u30b5\u30eb\u30d9\u30fc\u30b8: &e\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.Ability.Bonus.1=&a\u6700\u5927&e{0}\u500b&a\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=&7\u30d5\u30eb\u30a8\u30f3\u30c1\u30e3\u30f3\u30c8 \u78ba\u7387 +Salvage.Arcane.ExtractPartial=&7\u90e8\u5206\u7684\u306a\u30a8\u30f3\u30c1\u30e3\u30f3\u30c8 \u78ba\u7387 +Salvage.Skills.Success=&a\u30a2\u30a4\u30c6\u30e0\u3092\u30b5\u30eb\u30d9\u30fc\u30b8\uff01 +Salvage.Skills.Adept.Damaged=&4\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=&e{1} &c\u3092\u30b5\u30eb\u30d9\u30fc\u30b8\u3059\u308b\u305f\u3081\u306b\u306f &e{0} &c\u30ec\u30d9\u30eb\u304c\u5fc5\u8981\u3067\u3059\u3002 +Salvage.Skills.TooDamaged=&4\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=&c\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=&c\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=&a\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=&4\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.Skills.Lottery.Normal=&e{1}&6\u304b\u3089&3{0}&6\u306e\u7d20\u6750\u3092\u56de\u53ce\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3057\u305f\u3002 +Salvage.Skills.Lottery.Perfect=&a&l\u30d1\u30fc\u30d5\u30a7\u30af\u30c8\uff01&r&6 \u3042\u306a\u305f\u306f &3{1}&6\u3092\u30b5\u30eb\u30d9\u30fc\u30b8\u3057\u3001&3{0}&6\u500b\u306e\u7d20\u6750\u3092\u56de\u53ce\u3057\u307e\u3057\u305f\u3002 +Salvage.Skills.Lottery.Untrained=&7\u3042\u306a\u305f\u306f\u30b5\u30eb\u30d9\u30fc\u30b8\u3092\u6b63\u3057\u304f\u8a13\u7df4\u3067\u304d\u3066\u3044\u307e\u305b\u3093\u3002 &a{1}&7\u304b\u3089&c{0}&7\u500b\u306e\u7d20\u6750\u3057\u304b\u56de\u53ce\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f # Anvil (Shared between SALVAGE and REPAIR) Anvil.Unbreakable=\u3053\u306e\u30a2\u30a4\u30c6\u30e0\u306f\u58ca\u308c\u307e\u305b\u3093\uff01 # 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.Ability.Lower=&7\u5263\u3092\u4e0b\u3052\u305f\u3002 +Swords.Ability.Ready=&3\u5263\u3092&6\u6e96\u5099&3\u3057\u305f\u3002 +Swords.Combat.Rupture.Note=[[GREY]]\u6ce8\u610f\uff1a&e 0.5\u79d2\u3054\u3068\u306b1tick\u304c\u767a\u751f\u3057\u307e\u3059\u3002 +Swords.Combat.Bleeding.Started=&4 \u3042\u306a\u305f\u306f\u51fa\u8840\u3057\u3066\u3044\u307e\u3059\uff01 +Swords.Combat.Bleeding.Stopped=&7\u51fa\u8840\u304c &a\u6b62\u307e\u308a\u307e\u3057\u305f&7\uff01 +Swords.Combat.Bleeding=&a**\u30a8\u30cd\u30df\u30fc \u51fa\u8840** +Swords.Combat.Counter.Hit=&4\u30ab\u30a6\u30f3\u30bf\u30fc\u653b\u6483\u304c\u30d2\u30c3\u30c8\uff01 +Swords.Combat.Countered=&a**\u30ab\u30a6\u30f3\u30bf\u30fc\u653b\u6483** +Swords.Combat.SS.Struck=&4Struck 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 @@ -423,16 +423,16 @@ 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.SubSkill.Rupture.Stat.Extra=\u7834\u88c2: &a{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.Skills.SS.On=&a**\u92f8\u6b6f\u72b6\u306e\u653b\u6483 \u30a2\u30af\u30c6\u30a3\u30d9\u30fc\u30c8** +Swords.Skills.SS.Refresh=&e\u92f8\u6b6f\u72b6\u306e\u653b\u6483 &a\u30a2\u30d3\u30ea\u30c6\u30a3\u304c\u56de\u5fa9\u3057\u307e\u3057\u305f\uff01 +Swords.Skills.SS.Other.Off=&e{0}\u304c &f\u92f8\u6b6f\u72b6\u306e\u653b\u6483 &a\u3092\u6d88\u8017\u3057\u305f +Swords.Skills.SS.Other.On=&a{0}&2 \u304c &c\u92f8\u6b6f\u72b6\u306e\u653b\u6483 &2\u3092\u4f7f\u3063\u305f\uff01 # TAMING Taming.Ability.Bonus.0=\u74b0\u5883\u306b\u914d\u616e @@ -460,7 +460,7 @@ 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.CallOfTheWild.Description.2=&7COTW: \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 @@ -476,24 +476,24 @@ Taming.SubSkill.ThickFur.Description=\u30c0\u30e1\u30fc\u30b8\u8efd\u6e1b\u3001\ 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.Wolf=&8\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.Summon.COTW.Success.WithoutLifespan=&a\uff08\u91ce\u751f\u306e\u547c\u3073\u304b\u3051\uff09 &7\u3042\u306a\u305f\u306f&6{0}&7\u3092\u53ec\u559a\u3057\u307e\u3057\u305f&7 +Taming.Summon.COTW.Success.WithLifespan=&a\uff08\u91ce\u751f\u306e\u547c\u3073\u304b\u3051\uff09 &6{0}&7\u3092\u53ec\u559a\u3057\u307e\u3057\u305f\u304c\u3001\u6301\u7d9a\u6642\u9593\u306f&6{1}&7\u79d2\u3067\u3059\u3002 +Taming.Summon.COTW.Limit=&a\uff08\u91ce\u751f\u306e\u547c\u3073\u304b\u3051\uff09 &6{0}&7\u306f\u540c\u6642\u306b&6{1}&7\u5339\u3057\u304b\u53ec\u559a\u3067\u304d\u307e\u305b\u3093\u3002 +Taming.Summon.COTW.TimeExpired=&a\uff08\u91ce\u751f\u306e\u547c\u3073\u304b\u3051\uff09 &7\u6642\u9593\u5207\u308c\u3067&6{0}&7\u304c\u7acb\u3061\u53bb\u308a\u307e\u3057\u305f\u3002 +Taming.Summon.COTW.BreedingDisallowed=&a\uff08\u91ce\u751f\u306e\u547c\u3073\u304b\u3051\uff09 &c\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=&a\uff08\u91ce\u751f\u306e\u547c\u3073\u304b\u3051\uff09 &e{0}&7\u304c&3{1}&7\u500b\u5fc5\u8981\u3067\u3059\u3002 +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.Ability.IronGrip.Defender=&a\u30a2\u30a4\u30a2\u30f3\u30b0\u30ea\u30c3\u30d7\u304c\u6b66\u88c5\u89e3\u9664\u3092\u9632\u304e\u307e\u3057\u305f\uff01 +Unarmed.Ability.Lower=&7\u7d20\u624b\u3092\u4e0b\u3052\u305f\u3002 +Unarmed.Ability.Ready=&3\u7d20\u624b\u3092&6\u6e96\u5099&3\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 @@ -516,10 +516,10 @@ Unarmed.SubSkill.BlockCracker.Description=\u62f3\u3067\u5ca9\u3092\u7834\u58ca\u 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.Skills.Berserk.On=&a**\u30d0\u30fc\u30b5\u30fc\u30ab\u30fc \u30a2\u30af\u30c6\u30a3\u30d9\u30fc\u30c8** +Unarmed.Skills.Berserk.Refresh=&e\u30d0\u30fc\u30b5\u30fc\u30ab\u30fc &a\u30a2\u30d3\u30ea\u30c6\u30a3\u304c\u56de\u5fa9\u3057\u307e\u3057\u305f\uff01 +Unarmed.Skills.Berserk.Other.Off=&e{0}\u304c &f\u30d0\u30fc\u30b5\u30fc\u30ab\u30fc &a\u3092\u6d88\u8017\u3057\u305f +Unarmed.Skills.Berserk.Other.On=&a{0}&2\u304c &c\u30d0\u30fc\u30b5\u30fc\u30ab\u30fc &2\u3092\u4f7f\u3063\u305f\uff01 # WOODCUTTING Woodcutting.Ability.0=\u30ea\u30fc\u30d5\u30d6\u30ed\u30ef\u30fc @@ -542,173 +542,173 @@ Woodcutting.SubSkill.NaturesBounty.Description=\u81ea\u7136\u304b\u3089\u7d4c\u9 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.On=&a**\u30c4\u30ea\u30fc\u30d5\u30a7\u30e9\u30fc \u30a2\u30af\u30c6\u30a3\u30d9\u30fc\u30c8** +Woodcutting.Skills.TreeFeller.Refresh=&e\u30c4\u30ea\u30fc\u30d5\u30a7\u30e9\u30fc &a\u30a2\u30d3\u30ea\u30c6\u30a3\u304c\u56de\u5fa9\u3057\u307e\u3057\u305f\uff01 +Woodcutting.Skills.TreeFeller.Other.Off=&e{0}\u304c &f\u30c4\u30ea\u30fc\u30d5\u30a7\u30e9\u30fc &a\u3092\u6d88\u8017\u3057\u305f +Woodcutting.Skills.TreeFeller.Other.On=&a{0}&2\u304c &c\u30c4\u30ea\u30fc\u30d5\u30a7\u30e9\u30fc &2\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 # 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.ArrowDeflect=&f**\u77e2\u3092\u305d\u3089\u3057\u305f** +Combat.BeastLore=&a**\u30d3\u30fc\u30b9\u30c8\u30ed\u30a2** +Combat.BeastLoreHealth=&3\u4f53\u529b (&a{0}&3/{1}) +Combat.BeastLoreOwner=&3\u6240\u6709\u8005 (&c{0}&3) +Combat.BeastLoreHorseSpeed=&3\u99ac\u306e\u79fb\u52d5\u901f (&a{0} \u30d6\u30ed\u30c3\u30af/\u79d2&3) +Combat.BeastLoreHorseJumpStrength=&3\u99ac\u306e\u30b8\u30e3\u30f3\u30d7\u529b (&a\u6700\u5927 {0} \u30d6\u30ed\u30c3\u30af&3) +Combat.Gore=&a**\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.TargetDazed=\u30bf\u30fc\u30b2\u30c3\u30c8\u306f&4\u5e7b\u60d1[&r\u3060\u3063\u305f +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 +mcMMO.Description=&emcMMO&3\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306b\u3064\u3044\u3066:,&6mcMMO\u306f2011\u5e742\u6708\u306b&9nossr50&6\u306b\u3088\u3063\u3066\u958b\u59cb\u3055\u308c\u305f&c\u30aa\u30fc\u30d7\u30f3\u30bd\u30fc\u30b9\u306e&6RPG mod\u3067\u3059\u3002,\u76ee\u6a19\u306f\u9ad8\u54c1\u8cea\u306eRPG\u4f53\u9a13\u3092\u63d0\u4f9b\u3059\u308b\u3053\u3068\u3067\u3059\u3002,&3\u30d2\u30f3\u30c8:,&6 - &c/mcmmo help&a\u3092\u4f7f\u7528\u3057\u3066\u30b3\u30de\u30f3\u30c9\u3092\u8868\u793a\u3057\u307e\u3059,&6 - &c/\u30b9\u30ad\u30eb\u540d&a\u3092\u4f7f\u7528\u3057\u3066\u30b9\u30ad\u30eb\u306e\u8a73\u7d30\u60c5\u5831\u3092\u8868\u793a\u3057\u307e\u3059,&3\u958b\u767a\u8005:,&6 - &anossr50 &9(\u4f5c\u8005 & \u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u30ea\u30fc\u30c0\u30fc),&6 - &aelectronicboy &9(\u958b\u767a),&6 - &akashike &9(\u958b\u767a),&6 - &at00thpick1 &9(Classic \u30e1\u30f3\u30c6\u30ca\u30fc) +mcMMO.Description.FormerDevs=&3\u5143\u958b\u767a\u8005: &aGJ, NuclearW, bm01, TfT_02, Glitchfinder +Commands.addlevels.AwardAll.1=&a\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.1=&a{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.addxp.AwardAll=&a\u3059\u3079\u3066\u306e\u30b9\u30ad\u30eb\u3067{0}\u7d4c\u9a13\u5024\u3092\u7372\u5f97\u3057\u307e\u3057\u305f\uff01 +Commands.addxp.AwardSkill=&a{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&c\u30aa\u30d5&f\u306b\u5207\u308a\u66ff\u3048\u307e\u3057\u305f\u3002 +Commands.Ability.On=\u30a2\u30d3\u30ea\u30c6\u30a3\u306e\u4f7f\u7528\u3092&a\u30aa\u30f3&f\u306b\u5207\u308a\u66ff\u3048\u307e\u3057\u305f\u3002 +Commands.Ability.Toggle=&e{0}&f\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&c\u30aa\u30d5&f\u306b\u5207\u308a\u66ff\u3048\u307e\u3057\u305f\u3002 +Commands.AdminChat.On=\u7ba1\u7406\u7528\u30c1\u30e3\u30c3\u30c8\u306e\u4f7f\u7528\u3092&a\u30aa\u30f3&f\u306b\u5207\u308a\u66ff\u3048\u307e\u3057\u305f\u3002 +Commands.AdminToggle=&a- \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.Cooldowns.Header=&6--= &amcMMO \u30a2\u30d3\u30ea\u30c6\u30a3 \u30af\u30fc\u30eb\u30c0\u30a6\u30f3&6 =-- +Commands.Cooldowns.Row.N=\ &c{0}&f - &6\u6b8b\u308a {1} \u79d2 +Commands.Cooldowns.Row.Y=\ &b{0}&f - &2\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.DoesNotExist= &c\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.AdminChatSpy.Toggle=mcMMO \u30d1\u30fc\u30c6\u30a3\u30fc\u30c1\u30e3\u30c3\u30c8\u304c&e{0}&f\u306b\u5207\u308a\u66ff\u3048\u3089\u308c\u307e\u3057\u305f\u3002 +Commands.AdminChatSpy.Chat=&6[SPY: &a{0}&6] &f{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.GodMode.Toggle=\u30b4\u30c3\u30c9\u30e2\u30fc\u30c9\u304c&e{0}&f\u306b\u5207\u308a\u66ff\u3048\u3089\u308c\u307e\u3057\u305f\u3002 +Commands.Healthbars.Changed.HEARTS=[mcMMO] \u4f53\u529b\u30d0\u30fc\u306e\u8868\u793a\u304c&cHeart&f\u306b\u5207\u308a\u66ff\u3048\u3089\u308c\u307e\u3057\u305f\u3002 +Commands.Healthbars.Changed.BAR=[mcMMO] \u4f53\u529b\u30d0\u30fc\u306e\u8868\u793a\u304c&eBoxed&f\u306b\u5207\u308a\u66ff\u3048\u3089\u308c\u307e\u3057\u305f\u3002 +Commands.Healthbars.Changed.DISABLED=[mcMMO] MOB\u306e\u4f53\u529b\u30d0\u30fc\u304c&7\u7121\u52b9&f\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.Inspect=<\u30d7\u30ec\u30a4\u30e4\u30fc> &a- \u8a73\u7d30\u306a\u30d7\u30ec\u30a4\u30e4\u30fc\u60c5\u5831\u3092\u898b\u308b\u3002 +Commands.Invite.Success=&a\u62db\u5f85\u304c\u6b63\u5e38\u306b\u9001\u4fe1\u3055\u308c\u307e\u3057\u305f\u3002 +Commands.Leaderboards=<\u30b9\u30ad\u30eb> <\u30da\u30fc\u30b8> &a- \u30ea\u30fc\u30c0\u30fc\u30dc\u30fc\u30c9 +Commands.mcgod=&a- \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.mcpurge.Success=&a\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306f\u6b63\u5e38\u306b\u30d1\u30fc\u30b8\u3055\u308c\u307e\u3057\u305f\uff01 +Commands.mcrank.Heading=&6-=\u500b\u4eba\u30e9\u30f3\u30ad\u30f3\u30b0=- +Commands.mcrank.Overall=\u5168\u4f53&a - &6\u30e9\u30f3\u30af &f#&a{0} +Commands.mcrank.Player=&e\u30e9\u30f3\u30ad\u30f3\u30b0 &f{0} +Commands.mcrank.Skill=&e{0}&a - &6\u30e9\u30f3\u30af &f#&a{1} +Commands.mcrank.Unranked=&f\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.mcremove.Success=&a{0}\u304c\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u304b\u3089\u6b63\u5e38\u306b\u524a\u9664\u3055\u308c\u307e\u3057\u305f\uff01 +Commands.mctop.Tip=&6\u30d2\u30f3\u30c8: &c/mcrank&6\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> &a - \u30bf\u30fc\u30b2\u30c3\u30c8\u3092\u5909\u66f4 +Commands.mmoedit.AllSkills.1=&a\u5168\u3066\u306e\u30b9\u30ad\u30eb\u30ec\u30d9\u30eb\u304c{0}\u306b\u8a2d\u5b9a\u3055\u308c\u307e\u3057\u305f\uff01 +Commands.mmoedit.Modified.1=&a{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.Database.Start=&7{0}\u304b\u3089{1}\u3078\u306e\u5909\u63db\u3092\u958b\u59cb\u3057\u3066\u3044\u307e\u3059... +Commands.mcconvert.Database.Finish=&7\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&a{0}&f\u3067\u3059\u3002 +Commands.mcconvert.Experience.Invalid=\u4e0d\u660e\u306a\u6570\u5f0f\u30bf\u30a4\u30d7\uff01 \u6709\u52b9\u306a\u30bf\u30a4\u30d7: &aLINEAR &c\u53ca\u3073 &aEXPONENTIAL&c. 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.mcconvert.Experience.Start=&7{0} \u304b\u3089 {1} \u66f2\u7dda\u3078\u306e\u5909\u63db\u3092\u958b\u59cb\u3057\u3066\u3044\u307e\u3059 +Commands.mcconvert.Experience.Finish=&7\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=&a- 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.Notifications.Off=\u30a2\u30d3\u30ea\u30c6\u30a3\u901a\u77e5\u304c&c\u30aa\u30d5&f\u306b\u5207\u308a\u66ff\u308f\u308a\u307e\u3057\u305f\u3002 +Commands.Notifications.On=\u30a2\u30d3\u30ea\u30c6\u30a3\u901a\u77e5\u304c&a\u30aa\u30f3&f\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.Party.Status=&8\u540d\u524d: &f{0} {1} &8\u30ec\u30d9\u30eb: &3{2} +Commands.Party.Status.Alliance=&8\u5473\u65b9: &f{0} +Commands.Party.UnlockedFeatures=&8\u30ed\u30c3\u30af\u89e3\u9664\u3055\u308c\u305f\u6a5f\u80fd: &7[[ITALIC]]{0} +Commands.Party.ShareMode=&8\u5171\u6709\u30e2\u30fc\u30c9: +Commands.Party.ItemShare=&7\u30a2\u30a4\u30c6\u30e0 &3({0}) +Commands.Party.ExpShare=&7EXP &3({0}) +Commands.Party.ItemShareCategories=&8\u30a2\u30a4\u30c6\u30e0\u5171\u6709: &7[[ITALIC]]{0} +Commands.Party.MembersNear=&8\u3042\u306a\u305f\u306e\u8fd1\u304f\u306b &3{0}&8/&3{1} +Commands.Party.Accept=&a- \u30d1\u30fc\u30c6\u30a3\u30fc\u62db\u5f85\u3092\u8a31\u8afe +Commands.Party.Chat.Off=\u30d1\u30fc\u30c6\u30a3\u30fc\u30c1\u30e3\u30c3\u30c8\u304c&c\u30aa\u30d5&f\u306b\u5207\u308a\u66ff\u308f\u308a\u307e\u3057\u305f\u3002 +Commands.Party.Chat.On=\u30d1\u30fc\u30c6\u30a3\u30fc\u30c1\u30e3\u30c3\u30c8\u304c&a\u30aa\u30f3&f\u306b\u5207\u308a\u66ff\u308f\u308a\u307e\u3057\u305f\u3002 +Commands.Party.Commands=&c---[]&a\u30d1\u30fc\u30c6\u30a3\u30fc\u30b3\u30de\u30f3\u30c9&c[]--- +Commands.Party.Invite.0=&c\u901a\u77e5: &a{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=&a/party accept&e\u3092\u5165\u529b\u3057\u3066\u3001\u62db\u5f85\u3092\u53d7\u3051\u5165\u308c\u307e\u3059\u3002 +Commands.Party.Invite=&a- \u30d1\u30fc\u30c6\u30a3\u30fc\u62db\u5f85\u3092\u9001\u4fe1 +Commands.Party.Invite.Accepted=&a\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=&7\u53c2\u52a0\u30d1\u30fc\u30c6\u30a3\u30fc: {0} +Commands.Party.PartyFull=&6{0}&c \u306f\u6e80\u54e1\u3067\u3059\uff01 +Commands.Party.PartyFull.Invite=&a{1}&c\u306b\u306f\u3059\u3067\u306b&3{2}&c\u4eba\u304c\u3044\u308b\u305f\u3081\u3001&a{1}&c\u306b&e{0}&c\u3092\u62db\u5f85\u3059\u308b\u3053\u3068\u306f\u3067\u304d\u307e\u305b\u3093\uff01 +Commands.Party.PartyFull.InviteAccept=&c\u3059\u3067\u306b&3{1}&c\u4eba\u306e\u30d7\u30ec\u30a4\u30e4\u30fc\u304c\u5c45\u308b\u305f\u3081\u3001&a{0}&c\u306b\u306f\u53c2\u52a0\u3067\u304d\u307e\u305b\u3093\u3002 +Commands.Party.Create=&7\u4f5c\u6210\u3055\u308c\u305f\u30d1\u30fc\u30c6\u30a3\u30fc: {0} +Commands.Party.Rename=&7\u30d1\u30fc\u30c6\u30a3\u30fc\u540d\u5909\u66f4: &f{0} +Commands.Party.SetSharing=&7\u30d1\u30fc\u30c6\u30a3\u30fc {0} \u306e\u5171\u6709\u8a2d\u5b9a: &3{1} +Commands.Party.ToggleShareCategory=&6{0}&7\u306e\u30d1\u30fc\u30c6\u30a3\u30fc\u30a2\u30a4\u30c6\u30e0\u5171\u6709\u306f&3{1}&7\u306b\u306a\u308a\u307e\u3057\u305f\u3002 +Commands.Party.AlreadyExists=&4\u30d1\u30fc\u30c6\u30a3\u30fc {0} \u306f\u3059\u3067\u306b\u5b58\u5728\u3057\u307e\u3059\uff01 +Commands.Party.Kick=&c\u30d1\u30fc\u30c6\u30a3\u30fc&a{0}&c\u304b\u3089\u8ffd\u3044\u51fa\u3055\u308c\u307e\u3057\u305f\uff01 +Commands.Party.Leave=&e\u30d1\u30fc\u30c6\u30a3\u30fc\u304b\u3089\u629c\u3051\u307e\u3057\u305f +Commands.Party.Members.Header=&c-----[]&a\u30e1\u30f3\u30d0\u30fc&c[]----- +Commands.Party.None=&c\u30d1\u30fc\u30c6\u30a3\u30fc\u306b\u53c2\u52a0\u3057\u3066\u3044\u307e\u305b\u3093\u3002 +Commands.Party.Quit=&a- \u73fe\u5728\u306e\u30d1\u30fc\u30c6\u30a3\u30fc\u3092\u629c\u3051\u308b +Commands.Party.Teleport=&a- \u30d1\u30fc\u30c6\u30a3\u30fc\u30e1\u30f3\u30d0\u30fc\u3078\u30c6\u30ec\u30dd\u30fc\u30c8 +Commands.Party.Toggle=&a- \u30d1\u30fc\u30c6\u30a3\u30fc\u30c1\u30e3\u30c3\u30c8\u3092\u5207\u308a\u66ff\u3048 +Commands.Party1=&a- \u65b0\u3057\u3044\u30d1\u30fc\u30c6\u30a3\u30fc\u3092\u4f5c\u6210 +Commands.Party2=&a- \u30d7\u30ec\u30a4\u30e4\u30fc\u30d1\u30fc\u30c6\u30a3\u30fc\u306b\u53c2\u52a0\u3059\u308b +Commands.Party.Alliance.Header=&c-----[]&a\u30d1\u30fc\u30c6\u30a3\u30fc\u540c\u76df&c[]----- +Commands.Party.Alliance.Ally=&f{0} &8\u540c\u76df: &f{1} +Commands.Party.Alliance.Members.Header=&c-----[]&a\u540c\u76df\u30e1\u30f3\u30d0\u30fc&c[]----- +Commands.Party.Alliance.Invite.0=\u901a\u77e5: &a{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=&a/party alliance accept&e\u3092\u5165\u529b\u3057\u3066\u62db\u5f85\u3092\u53d7\u3051\u5165\u308c\u307e\u3059 +Commands.Party.Alliance.Invite.Accepted=&a\u540c\u76df\u306e\u62db\u5f85\u3092\u53d7\u3051\u5165\u308c\u3089\u308c\u307e\u3057\u305f\u3002 +Commands.Party.Alliance.None=&c\u3042\u306a\u305f\u306e\u30d1\u30fc\u30c6\u30a3\u30fc\u306b\u306f\u540c\u76df\u304c\u3044\u307e\u305b\u3093\u3002 +Commands.Party.Alliance.AlreadyAllies=&c\u3042\u306a\u305f\u306e\u30d1\u30fc\u30c6\u30a3\u30fc\u306b\u306f\u3059\u3067\u306b\u540c\u76df\u304c\u3044\u307e\u3059\u3002&3/party alliance disband&c\u3067\u89e3\u6563 +Commands.Party.Alliance.Help.0=&c\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=&3/party alliance invite <\u30d7\u30ec\u30a4\u30e4\u30fc> +Commands.ptp.Enabled=\u30d1\u30fc\u30c6\u30a3\u30fc\u30c6\u30ec\u30dd\u30fc\u30c8\u304c&a\u6709\u52b9&f\u306b\u5207\u308a\u66ff\u308f\u308a\u307e\u3057\u305f\u3002 +Commands.ptp.Disabled=\u30d1\u30fc\u30c6\u30a3\u30fc\u30c6\u30ec\u30dd\u30fc\u30c8\u304c&c\u7121\u52b9&f\u306b\u5207\u308a\u66ff\u308f\u308a\u307e\u3057\u305f\u3002 +Commands.ptp.NoRequests=&c\u73fe\u5728\u30c6\u30ec\u30dd\u30fc\u30c8\u30ea\u30af\u30a8\u30b9\u30c8\u306f\u3042\u308a\u307e\u305b\u3093\u3002 +Commands.ptp.NoWorldPermissions=&c[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=&e{0} &a\u304c\u30c6\u30ec\u30dd\u30fc\u30c8\u3092\u30ea\u30af\u30a8\u30b9\u30c8\u3057\u307e\u3057\u305f\u3002 +Commands.ptp.Request2=&a\u30c6\u30ec\u30dd\u30fc\u30c8\u3059\u308b\u306b\u306f\u3001&e/ptp accept&a\u3068\u5165\u529b\u3057\u307e\u3059\u3002\u30ea\u30af\u30a8\u30b9\u30c8\u306f&c{0} &a\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&a\u6709\u52b9&f\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&c\u7121\u52b9&f\u306b\u5207\u308a\u66ff\u308f\u308a\u307e\u3057\u305f\u3002 +Commands.ptp.RequestExpired=&c\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=&e--mcMMO&9 \u30d1\u30ef\u30fc\u30ec\u30d9\u30eb &e\u30ea\u30fc\u30c0\u30fc\u30dc\u30fc\u30c9-- +Commands.PowerLevel.Capped=&4\u30d1\u30ef\u30fc\u30ec\u30d9\u30eb: &a{0} &4\u6700\u5927\u30ec\u30d9\u30eb: &e{1} +Commands.PowerLevel=&4\u30d1\u30ef\u30fc\u30ec\u30d9\u30eb: &a{0} +Commands.Reset.All=&a\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=&a{0}\u306e\u30b9\u30ad\u30eb\u30ec\u30d9\u30eb\u304c\u6b63\u5e38\u306b\u30ea\u30bb\u30c3\u30c8\u3055\u308c\u307e\u3057\u305f\u3002 +Commands.Reset=&a- \u30b9\u30ad\u30eb\u306e\u30ec\u30d9\u30eb\u30920\u306b\u30ea\u30bb\u30c3\u30c8\u3057\u307e\u3059\u3002 +Commands.Scoreboard.Clear=&3mcMMO \u30b9\u30b3\u30a2\u30dc\u30fc\u30c9\u304c\u30af\u30ea\u30a2\u3055\u308c\u307e\u3057\u305f\u3002 +Commands.Scoreboard.NoBoard=&cThe mcMMO \u30b9\u30b3\u30a2\u30dc\u30fc\u30c9\u304c\u6709\u52b9\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u3002 +Commands.Scoreboard.Keep=&3mcMMO \u30b9\u30b3\u30a2\u30dc\u30fc\u30c9\u306f&a/mcscoreboard clear&3\u3092\u4f7f\u7528\u3059\u308b\u307e\u3067\u66f4\u65b0\u3055\u308c\u307e\u305b\u3093\u3002 +Commands.Scoreboard.Timer=&3mcMMO\u30b9\u30b3\u30a2\u30dc\u30fc\u30c9\u306f&6{0}&3\u79d2\u5f8c\u306b\u6d88\u53bb\u3055\u308c\u307e\u3059\u3002 +Commands.Scoreboard.Help.0=&6 == &c/mcscoreboard&a\u306e\u30d8\u30eb\u30d7 &6 == +Commands.Scoreboard.Help.1=&3/mcscoreboard&b clear &f - mcMMO\u30b9\u30b3\u30a2\u30dc\u30fc\u30c9\u3092\u30af\u30ea\u30a8\u3059\u308b +Commands.Scoreboard.Help.2=&3/mcscoreboard&b keep &f - mcMMO\u30b9\u30b3\u30a2\u30dc\u30fc\u30c9\u3092\u7dad\u6301\u3059\u308b +Commands.Scoreboard.Help.3=&3/mcscoreboard&b time [n] &f - mcMMO\u30b9\u30b3\u30a2\u30dc\u30fc\u30c9\u3092&dn&f\u79d2\u5f8c\u306b\u30af\u30ea\u30a2\u3059\u308b +Commands.Scoreboard.Tip.Keep=&6\u30d2\u30f3\u30c8: \u30b9\u30b3\u30a2\u30dc\u30fc\u30c9\u304c\u8868\u793a\u3055\u308c\u3066\u3044\u308b\u9593\u306b&c/mcscoreboard keep&6\u3092\u4f7f\u7528\u3057\u3066\u6d88\u3048\u306a\u3044\u3088\u3046\u306b\u3059\u308b\u3002 +Commands.Scoreboard.Tip.Clear=&6\u30d2\u30f3\u30c8: &c/mcscoreboard clear&6\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.Skill.Leaderboard=--mcMMO &9{0}&e \u30ea\u30fc\u30c0\u30fc\u30dc\u30fc\u30c9-- +Commands.SkillInfo=&a- \u30b9\u30ad\u30eb\u306b\u95a2\u3059\u308b\u8a73\u7d30\u60c5\u5831\u3092\u8868\u793a\u3059\u308b +Commands.Stats=&a- mcMMO\u306e\u7d71\u8a08\u3092\u8868\u793a\u3059\u308b +Commands.ToggleAbility=&a- \u53f3\u30af\u30ea\u30c3\u30af\u3067\u30a2\u30d3\u30ea\u30c6\u30a3\u3092\u5207\u308a\u66ff\u3048\u308b +Commands.Usage.0=&c\u9069\u5207\u306a\u4f7f\u7528\u6cd5\u306f /{0} +Commands.Usage.1=&c\u9069\u5207\u306a\u4f7f\u7528\u6cd5\u306f /{0} {1} +Commands.Usage.2=&c\u9069\u5207\u306a\u4f7f\u7528\u6cd5\u306f /{0} {1} {2} +Commands.Usage.3=&c\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 @@ -721,69 +721,69 @@ Commands.Usage.Skill=\u30b9\u30ad\u30eb Commands.Usage.SubSkill=\u30b5\u30d6\u30b9\u30ad\u30eb 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.Mystery=&7\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.Header=&3-=[]=====[]&6 MMO \u60c5\u5831 &3[]=====[]=- +Commands.MmoInfo.SubSkillHeader=&6\u540d\u524d:&e {0} +Commands.MmoInfo.DetailsHeader=&3-=[]=====[]&a \u8a73\u7d30 &3[]=====[]=- +Commands.MmoInfo.OldSkill=&7mcMMO\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=&3-=[]=====[]&6 \u529b\u5b66 &3[]=====[]=- 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 +mcMMO.NoInvites=&c\u73fe\u5728\u3001\u62db\u5f85\u306f\u3042\u308a\u307e\u305b\u3093\u3002 +mcMMO.NoPermission=&4\u6a29\u9650\u304c\u4e0d\u5341\u5206\u3067\u3059\u3002 +mcMMO.NoSkillNote=&8\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 ## 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.Help.0=&c\u9069\u5207\u306a\u4f7f\u7528\u6cd5\u306f &3{0} <\u30d7\u30ec\u30a4\u30e4\u30fc> [\u30d1\u30b9\u30ef\u30fc\u30c9] \u3067\u3059\u3002 +Party.Help.1=&c\u30d1\u30fc\u30c6\u30a3\u30fc\u3092\u4f5c\u6210\u3059\u308b\u306b\u306f &3{0} <\u540d\u79f0> [\u30d1\u30b9\u30ef\u30fc\u30c9] \u3092\u4f7f\u7528\u3057\u307e\u3059\u3002 +Party.Help.2=&c\u8a73\u7d30\u306f &3{0} &c \u306b\u76f8\u8ac7\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +Party.Help.3=&3{0} <\u30d7\u30ec\u30a4\u30e4\u30fc> [\u30d1\u30b9\u30ef\u30fc\u30c9] &c\u3092\u4f7f\u7528\u3057\u3066\u53c2\u52a0\u3059\u308b\u304b\u3001&3{1} &c\u3092\u4f7f\u7528\u3057\u3066\u629c\u3051\u307e\u3059\u3002 +Party.Help.4=&c\u30d1\u30fc\u30c6\u30a3\u30fc\u306e\u30ed\u30c3\u30af\u307e\u305f\u306f\u30ed\u30c3\u30af\u89e3\u9664\u306b\u306f\u3001&3{0} &c\u3092\u4f7f\u7528\u3057\u307e\u3059\u3002 +Party.Help.5=&c\u30d1\u30fc\u30c6\u30a3\u30fc\u3092\u30d1\u30b9\u30ef\u30fc\u30c9\u3067\u4fdd\u8b77\u3059\u308b\u306b\u306f\u3001&3{0} <\u30d1\u30b9\u30ef\u30fc\u30c9> &c\u3092\u4f7f\u7528\u3057\u307e\u3059\u3002 +Party.Help.6=&c\u30d1\u30fc\u30c6\u30a3\u30fc\u304b\u3089\u30d7\u30ec\u30a4\u30e4\u30fc\u3092\u30ad\u30c3\u30af\u3059\u308b\u306b\u306f\u3001&3{0} <\u30d7\u30ec\u30a4\u30e4\u30fc> &c\u3092\u4f7f\u7528\u3057\u307e\u3059\u3002 +Party.Help.7=&c\u30d1\u30fc\u30c6\u30a3\u30fc\u306e\u6240\u6709\u6a29\u3092\u8b72\u6e21\u3059\u308b\u306b\u306f\u3001&3{0} <\u30d7\u30ec\u30a4\u30e4\u30fc> &c\u3092\u4f7f\u7528\u3057\u307e\u3059\u3002 +Party.Help.8=&c\u30d1\u30fc\u30c6\u30a3\u30fc\u3092\u89e3\u6563\u3059\u308b\u306b\u306f\u3001&3{0} &c\u3092\u4f7f\u7528\u3057\u307e\u3059\u3002 +Party.Help.9=&3{0} &c\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=&3{0} &c\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} &a\u304c\u30d1\u30fc\u30c6\u30a3\u30fc\u306b\u53c2\u52a0\u3057\u307e\u3057\u305f\u3002 +Party.InformedOnQuit={0} &a\u304c\u30d1\u30fc\u30c6\u30a3\u30fc\u304b\u3089\u96e2\u8131\u3057\u307e\u3057\u305f\u3002 +Party.InformedOnNameChange=&6{0}\u304c\u30d1\u30fc\u30c6\u30a3\u30fc\u540d\u3092&f{1}&a\u306b\u8a2d\u5b9a\u3057\u307e\u3057\u305f\u3002 +Party.InvalidName=&4\u6709\u52b9\u306a\u30d1\u30fc\u30c6\u30a3\u30fc\u540d\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u3002 +Party.Invite.Self=&c\u81ea\u5206\u81ea\u8eab\u3092\u62db\u5f85\u3059\u308b\u3053\u3068\u306f\u3067\u304d\u307e\u305b\u3093\u3002 +Party.IsLocked=&c\u3053\u306e\u30d1\u30fc\u30c6\u30a3\u30fc\u306f\u3059\u3067\u306b\u30ed\u30c3\u30af\u3055\u308c\u3066\u3044\u307e\u3059\uff01 +Party.IsntLocked=&c\u3053\u306e\u30d1\u30fc\u30c6\u30a3\u30fc\u306f\u30ed\u30c3\u30af\u3055\u308c\u3066\u3044\u307e\u305b\u3093\uff01 +Party.Locked=&c\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=&4{0}\u306f\u3042\u306a\u305f\u306e\u30d1\u30fc\u30c6\u30a3\u306b\u3044\u307e\u305b\u3093\u3002 +Party.NotOwner=&4\u3042\u306a\u305f\u306f\u30d1\u30fc\u30c6\u30a3\u30fc\u30ea\u30fc\u30c0\u30fc\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u3002 +Party.Target.NotOwner=&4{0}\u306f\u30d1\u30fc\u30c6\u30a3\u30fc\u30ea\u30fc\u30c0\u30fc\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u3002 +Party.Owner.New=&a{0}\u304c\u65b0\u3057\u3044\u30d1\u30fc\u30c6\u30a3\u30fc\u30ea\u30fc\u30c0\u30fc\u306b\u306a\u308a\u307e\u3057\u305f\u3002 +Party.Owner.NotLeader=&4\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 =&a\u3042\u306a\u305f\u306f\u73fe\u5728\u30d1\u30fc\u30c6\u30a3\u30fc\u30ea\u30fc\u30c0\u30fc\u3067\u3059\u3002 +Party.Password.None=&c\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=&c\u30d1\u30fc\u30c6\u30a3\u30fc\u306e\u30d1\u30b9\u30ef\u30fc\u30c9\u304c\u6b63\u3057\u304f\u3042\u308a\u307e\u305b\u3093\u3002 +Party.Password.Set=&a\u30d1\u30fc\u30c6\u30a3\u30fc\u30d1\u30b9\u30ef\u30fc\u30c9\u304c{0}\u306b\u8a2d\u5b9a\u3055\u308c\u307e\u3057\u305f +Party.Password.Removed=&a\u30d1\u30fc\u30c6\u30a3\u306e\u30d1\u30b9\u30ef\u30fc\u30c9\u304c\u6d88\u53bb\u3055\u308c\u307e\u3057\u305f\u3002 +Party.Player.Invalid=&c\u6709\u52b9\u306a\u30d7\u30ec\u30a4\u30e4\u30fc\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u3002 +Party.NotOnline=&4{0}\u306f\u30aa\u30f3\u30e9\u30a4\u30f3\u3067\u306f\u3042\u308a\u307e\u305b\u3093\uff01 +Party.Player.InSameParty=&c{0}\u306f\u65e2\u306b\u30d1\u30fc\u30c6\u30a3\u30fc\u306b\u53c2\u52a0\u3057\u3066\u3044\u307e\u3059\uff01 +Party.PlayerNotInParty=&4{0}\u306f\u30d1\u30fc\u30c6\u30a3\u30fc\u306b\u53c2\u52a0\u3057\u3066\u3044\u307e\u305b\u3093\u3002 +Party.Specify=&c\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=&c\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=&c{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=&a{0}\u306b\u30c6\u30ec\u30dd\u30fc\u30c8\u3057\u307e\u3057\u305f\u3002 +Party.Teleport.Self=&c\u81ea\u5206\u81ea\u8eab\u306b\u30c6\u30ec\u30dd\u30fc\u30c8\u3067\u304d\u307e\u305b\u3093\uff01 +Party.Teleport.Target=&a{0}\u304c\u3042\u306a\u305f\u306b\u30c6\u30ec\u30dd\u30fc\u30c8\u3057\u307e\u3057\u305f\u3002 +Party.Teleport.Disabled=&c{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=&c\u305d\u308c\u306f\u65e2\u306b\u3042\u306a\u305f\u306e\u30d1\u30fc\u30c6\u30a3\u540d\u3067\u3059\u3002 +Party.Join.Self=&c\u3042\u306a\u305f\u306f\u81ea\u5206\u81ea\u8eab\u306b\u53c2\u52a0\u3059\u308b\u3053\u3068\u306f\u3067\u304d\u307e\u305b\u3093\uff01 +Party.Unlocked=&7\u30d1\u30fc\u30c6\u30a3\u30fc\u306f\u30a2\u30f3\u30ed\u30c3\u30af\u3055\u308c\u3066\u3044\u307e\u3059 +Party.Disband=&7\u30d1\u30fc\u30c6\u30a3\u30fc\u306f\u89e3\u6563\u3055\u308c\u307e\u3057\u305f +Party.Alliance.Formed=&7\u3042\u306a\u305f\u306e\u30d1\u30fc\u30c6\u30a3\u30fc\u306f\u73fe\u5728&a{0}&7\u3068\u540c\u76df\u4e2d\u3067\u3059\u3002 +Party.Alliance.Disband=\u3042\u306a\u305f\u306e\u30d1\u30fc\u30c6\u30a3\u30fc\u306f&c{0}&7\u3068\u540c\u76df\u95a2\u4fc2\u3067\u306f\u306a\u304f\u306a\u308a\u307e\u3057\u305f\u3002 +Party.Status.Locked=&4(\u62db\u5f85\u306e\u307f) +Party.Status.Unlocked=&2(\u30aa\u30fc\u30d7\u30f3) +Party.LevelUp=&e\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 @@ -794,11 +794,11 @@ Party.Feature.Locked.Teleport=\u30ed\u30c3\u30af\u3055\u308c\u308b\u307e\u3067 { 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.Feature.Disabled.1=&c\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=&c\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=&c\u540c\u76df\u306f\u307e\u3060\u958b\u653e\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002 +Party.Feature.Disabled.4=&c\u30a2\u30a4\u30c6\u30e0\u5171\u6709\u306f\u307e\u3060\u958b\u653e\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002 +Party.Feature.Disabled.5=&cXP\u5171\u6709\u306f\u307e\u3060\u958b\u653e\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002 Party.ShareType.Xp=XP Party.ShareType.Item=\u30a2\u30a4\u30c6\u30e0 Party.ShareMode.None=\u7121\u3057 @@ -824,180 +824,180 @@ 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.XPGain=&8XP\u7372\u5f97: &f{0} +Commands.xplock.locked=&6\u3042\u306a\u305f\u306eXP\u30d0\u30fc\u306f\u73fe\u5728{0}\u3067\u30ed\u30c3\u30af\u3055\u308c\u3066\u3044\u307e\u3059\uff01 +Commands.xplock.unlocked=&6\u3042\u306a\u305f\u306eXP\u30d0\u30fc\u306f\u73fe\u5728&a\u30ed\u30c3\u30af\u89e3\u9664&6\u3055\u308c\u3066\u3044\u307e\u3059\uff01 +Commands.xprate.modified=&cXP\u30ec\u30fc\u30c8\u306f{0}\u306b\u5909\u66f4\u3055\u308c\u307e\u3057\u305f +Commands.xprate.over=&cmcMMO XP\u30ec\u30fc\u30c8\u30a4\u30d9\u30f3\u30c8\u304c\u7d42\u308f\u308a\u307e\u3057\u305f\uff01 +Commands.xprate.proper.0=&cXP\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=&cXP\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=&cXP\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.Event.Start=&amcMMO&6 \u30a4\u30d9\u30f3\u30c8\uff01 +Commands.Event.Stop=&amcMMO&3 \u30a4\u30d9\u30f3\u30c8\u7d42\u4e86\uff01 +Commands.Event.Stop.Subtitle=&a\u697d\u3057\u3093\u3067\u304f\u308c\u305f\u3053\u3068\u3092\u9858\u3063\u3066\u307e\u3059\uff01 +Commands.Event.XP=&3XP\u30ec\u30fc\u30c8\u306f\u73fe\u5728&6{0}&3x +Commands.xprate.started.0=&6mcMMO\u306eXP\u30a4\u30d9\u30f3\u30c8\u304c\u958b\u59cb\u3055\u308c\u307e\u3057\u305f\uff01 +Commands.xprate.started.1=&6mcMMO\u306eXP\u30ec\u30fc\u30c8\u306f3\u500d\u306b\u306a\u308a\u307e\u3057\u305f\uff01 # 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\u3042\u306a\u305f\u306f&6{0}x&7\u306b\u30b0\u30ed\u30fc\u30d0\u30ebXP\u30ec\u30fc\u30c8\u3092\u8a2d\u5b9a\u3057\u307e\u3057\u305f\u3002 +Notifications.Admin.XPRate.End.Self=&7XP\u30ec\u30fc\u30c8\u30a4\u30d9\u30f3\u30c8\u3092\u7d42\u4e86\u3057\u307e\u3057\u305f\u3002 +Notifications.Admin.XPRate.End.Others={0}&7\u306fXP\u30ec\u30fc\u30c8\u30a4\u30d9\u30f3\u30c8\u3092\u7d42\u4e86\u3057\u307e\u3057\u305f +Notifications.Admin.XPRate.Start.Others={0}&7\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=&6(&amcMMO &3\u7ba1\u7406\u8005&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\u306f\u73fe\u5728XP\u30ec\u30fc\u30c8\u30a4\u30d9\u30f3\u30c8\u4e2d\u3067\u3059\uff01XP\u30ec\u30fc\u30c8\u306f{0}x\u3067\u3059\uff01 # 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.Available=&7\u5229\u7528\u53ef\u80fd\u306a{0}\u306e\u30ac\u30a4\u30c9 - /{1} ? [\u30da\u30fc\u30b8] +Guides.Header=&6-=&a{0} \u30ac\u30a4\u30c9&6=- 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 ## 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\u30a2\u30af\u30ed\u30d0\u30c6\u30a3\u30c3\u30af\u306b\u3064\u3044\u3066\uff1a\n&e\u30a2\u30af\u30ed\u30d0\u30c6\u30a3\u30c3\u30af\u306f\u3001mcMMO\u3067\u512a\u96c5\u306b\u52d5\u304f\u82b8\u8853\u3067\u3059\u3002\n&e\u30a2\u30af\u30ed\u30d0\u30c6\u30a3\u30c3\u30af\u306f\u3001mcMMO\u3067\u512a\u96c5\u306b\u52d5\u304f\u82b8\u8853\u3067\u3059\u3002\n\n&3XP\u7372\u5f97\uff1a\n&e\u3053\u306e\u30b9\u30ad\u30eb\u3067XP\u3092\u7372\u5f97\u3059\u308b\u306b\u306f\u3001\u6226\u95d8\u3067\u8eb1\u3059\u304b\\&en\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=&3\u53d7\u3051\u8eab\u306f\u3069\u306e\u3088\u3046\u306b\u6a5f\u80fd\u3057\u307e\u3059\u304b\uff1f\r\n&e\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&e\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=&3\u8eb1\u3059\u306f\u3069\u306e\u3088\u3046\u306b\u6a5f\u80fd\u3057\u307e\u3059\u304b\uff1f\n&e\u8eb1\u3059\u306f\u78ba\u7387\u3067\u6226\u95d8\u3067\u8ca0\u50b7\u3057\u305f\u3068\u304d\u306b\\n&e\u53d7\u3051\u305f\u30c0\u30e1\u30fc\u30b8\u3092\u534a\u5206\u306b\u3057\u307e\u3059\u3002\\n&e\u30b9\u30ad\u30eb\u30ec\u30d9\u30eb\u306b\u95a2\u4fc2\u3057\u3066\u3044\u307e\u3059\u3002 ## 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\u932c\u91d1\u8853\u306b\u3064\u3044\u3066\uff1a\n&e\u932c\u91d1\u8853\u306f\u30dd\u30fc\u30b7\u30e7\u30f3\u306e\u91b8\u9020\u306b\u95a2\u3059\u308b\u3082\u306e\u3067\u3059\u3002\n&e\u30dd\u30fc\u30b7\u30e7\u30f3\u306e\u91b8\u9020\u6642\u9593\u3092\u77ed\u7e2e\u3057\u3066\u3001\n&e\u65b0\u3057\u3044\u8ffd\u52a0\u3055\u308c\u305f\u30dd\u30fc\u30b7\u30e7\u30f3\u3092\u5165\u624b\u3067\u304d\u307e\u3059\u3002\n\n\n&3XP \u7372\u5f97:\n&e\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=&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]]\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\u5f13\u306b\u3064\u3044\u3066\uff1a\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]]\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\u65a7\u306b\u3064\u3044\u3066\uff1a\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]]\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\u6398\u524a\u306b\u3064\u3044\u3066\uff1a\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]]\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\u91e3\u308a\u306b\u3064\u3044\u3066\uff1a\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]]\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\u8fb2\u696d\u306b\u3064\u3044\u3066\uff1a\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]]\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\u63a1\u6398\u306b\u3064\u3044\u3066\uff1a\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]]\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\u4fee\u7406\u306b\u3064\u3044\u3066\uff1a\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]]\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\u30b5\u30eb\u30d9\u30fc\u30b8\u306b\u3064\u3044\u3066\uff1a\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]]\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\u5263\u306b\u3064\u3044\u3066\uff1a\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 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]]\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\u8abf\u6559\u306b\u3064\u3044\u3066\uff1a\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=[DARK_AQUA]]How 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]]\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\u7d20\u624b\u306b\u3064\u3044\u3066\uff1a\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]]\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\u6728\u3053\u308a\u306b\u3064\u3044\u3066\uff1a\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]]\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.Offline= &c\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&e{0} +Inspect.Stats=&e{0}&a\u306emcMMO\u7d71\u8a08 Inspect.TooFar=\u305d\u306e\u30d7\u30ec\u30a4\u30e4\u30fc\u3092\u8abf\u3079\u308b\u306b\u306f\u9060\u3059\u304e\u307e\u3059\uff01 # ITEMS -Item.ChimaeraWing.Fail=[[RED]]**\u30ad\u30e1\u30e9\u306e\u7ffc \u5931\u6557\uff01** +Item.ChimaeraWing.Fail=&c**\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.ChimaeraWing.Lore=&7\u3042\u306a\u305f\u3092\u30d9\u30c3\u30c9\u306b\u30c6\u30ec\u30dd\u30fc\u30c8\u3057\u307e\u3059\u3002 +Item.ChimaeraWing.NotEnough=\u3055\u3089\u306b&6{1}&c\u306e&e{0}&c\u304c\u5fc5\u8981\u3067\u3059\uff01 +Item.NotEnough=\u3055\u3089\u306b&6{1}&c\u306e&e{0}&c\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&e({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&e({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.FluxPickaxe.Lore.1=&7\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=&7\u88fd\u932c\u30ec\u30d9\u30eb {0}+ \u304c\u5fc5\u8981 # 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})[[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=&4\u30c6\u30ec\u30dd\u30fc\u30c8\u306f\u30ad\u30e3\u30f3\u30bb\u30eb\u3055\u308c\u307e\u3057\u305f\u3002 # 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(\u5b50\u30b9\u30ad\u30eb) +Skills.Disarmed=&4\u3042\u306a\u305f\u306f\u6b66\u88c5\u89e3\u9664\u3055\u308c\u307e\u3057\u305f\uff01 +Skills.Header=-----[] &a{0}&c []----- +Skills.NeedMore=&4\u3082\u3063\u3068&7{0}&4\u304c\u5fc5\u8981\u3067\u3059 +Skills.NeedMore.Extra=&4\u3082\u3063\u3068&7{0}{1}&4\u304c\u5fc5\u8981\u3067\u3059 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=\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.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 &e({0}\u79d2) +Skills.Cancelled=&6{0} &c\u30ad\u30e3\u30f3\u30bb\u30eb\uff01 +Skills.ConfirmOrCancel=&a\u3082\u3046\u4e00\u5ea6\u53f3\u30af\u30ea\u30c3\u30af\u3057\u3066&6{0}&a\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=&7\u3053\u306e\u30a2\u30d3\u30ea\u30c6\u30a3\u3092\u4f7f\u3046\u305f\u3081\u306b\u306f&e{0}&7\u30ec\u30d9\u30eb\u306e&3{1}&7\u304c\u5fc5\u8981\u3067\u3059\u3002 # 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-=\u6226\u95d8\u30b9\u30ad\u30eb=- +Stats.Header.Gathering=&6-=\u53ce\u96c6\u30b9\u30ad\u30eb=- +Stats.Header.Misc=&6-=\u305d\u306e\u4ed6\u306e\u30b9\u30ad\u30eb=- +Stats.Own.Stats=&a[mcMMO] \u7d71\u8a08 # PERKS Perks.XP.Name=\u7d4c\u9a13\u5024 @@ -1005,44 +1005,44 @@ Perks.XP.Desc=\u7279\u5b9a\u306e\u30b9\u30ad\u30eb\u306e\u30d6\u30fc\u30b9\u30c8 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.Lucky.Bonus=&6 ({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.ActivationTime.Bonus=&6 ({0}\u79d2 \u8010\u4e45\u30d1\u30fc\u30af) # 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.Mode.Disabled=&6[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=&6[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.DeathStatLoss.PlayerDeath=&6[mcMMO] &4\u6b7b\u4ea1\u306b\u3088\u308a&9{0}&4\u30ec\u30d9\u30eb\u3092\u5931\u3044\u307e\u3057\u305f\u3002 +Hardcore.DeathStatLoss.PercentageChanged=&6[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.Vampirism.Killer.Failure=&6[mcMMO] &e{0}&7 \u306f\u77e5\u8b58\u304c\u672a\u719f\u3067\u3057\u305f\u3002 +Hardcore.Vampirism.Killer.Success=&6[mcMMO] &e{1}\u304b\u3089&9{0}&3\u30ec\u30d9\u30eb\u3092\u76d7\u307f\u307e\u3057\u305f\u3002 +Hardcore.Vampirism.Victim.Failure=&6[mcMMO] &e{0}&7\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=&6[mcMMO] &e{0}&4\u306f\u3042\u306a\u305f\u304b\u3089&9{1}&4\u30ec\u30d9\u30eb\u3092\u76d7\u307f\u307e\u3057\u305f\uff01 +Hardcore.Vampirism.PercentageChanged=&6[mcMMO] \u30ed\u30b9\u30c8\u30d1\u30fc\u30bb\u30f3\u30c6\u30fc\u30b8\u304c{0}\u306b\u5909\u66f4\u3055\u308c\u307e\u3057\u305f\u3002 # 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\u5bc4\u4ed8\u60c5\u5831: +MOTD.Hardcore.Enabled=&6[mcMMO] &3\u30cf\u30fc\u30c9\u30b3\u30a2\u30e2\u30fc\u30c9\u6709\u52b9: &4{0} +MOTD.Hardcore.DeathStatLoss.Stats=&6[mcMMO] &3\u30b9\u30ad\u30eb\u30c7\u30b9\u30da\u30ca\u30eb\u30c6\u30a3: &4{0}% +MOTD.Hardcore.Vampirism.Stats=&6[mcMMO] &3\u30f4\u30a1\u30f3\u30d1\u30a4\u30a2\u5438\u8840\u7d71\u8a08: &4{0}% +MOTD.PerksPrefix=&6[mcMMO \u30d1\u30fc\u30af] +MOTD.Version=&6[mcMMO] \u5b9f\u884c\u4e2d\u306e\u30d0\u30fc\u30b8\u30e7\u30f3 &3{0} +MOTD.Website=&6[mcMMO] &a{0}&e - mcMMO \u30a6\u30a7\u30d6\u30b5\u30a4\u30c8 # 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.SubSkill.UnderstandingTheArt.Stat=\u30d0\u30cb\u30e9XP Multiplier: &e{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.FuelEfficiency.Stat=\u71c3\u6599\u52b9\u7387 \u4e57\u6570: &e{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 @@ -1093,38 +1093,38 @@ UpdateChecker.Outdated=\u3042\u306a\u305f\u306f\u53e4\u3044mcMMO\u306e\u30d0\u30 UpdateChecker.NewAvailable=Spigot\u306b\u65b0\u3057\u3044\u30d0\u30fc\u30b8\u30e7\u30f3\u304c\u516c\u958b\u3055\u308c\u3066\u3044\u307e\u3059\u3002 # 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.Header.PlayerStats=&emcMMO \u7d71\u8a08 +Scoreboard.Header.PlayerCooldowns=&emcMMO \u30af\u30fc\u30eb\u30c0\u30a6\u30f3 +Scoreboard.Header.PlayerRank=&emcMMO \u30e9\u30f3\u30ad\u30f3\u30b0 +Scoreboard.Header.PlayerInspect=&emcMMO \u7d71\u8a08: {0} +Scoreboard.Header.PowerLevel=&c\u30d1\u30ef\u30fc\u30ec\u30d9\u30eb +Scoreboard.Misc.PowerLevel=&6\u30d1\u30ef\u30fc\u30ec\u30d9\u30eb +Scoreboard.Misc.Level=&3\u30ec\u30d9\u30eb +Scoreboard.Misc.CurrentXP=&a\u73fe\u5728\u306eXP +Scoreboard.Misc.RemainingXP=&e\u6b8b\u308aXP +Scoreboard.Misc.Cooldown=&d\u30af\u30fc\u30eb\u30c0\u30a6\u30f3 +Scoreboard.Misc.Overall=&6\u5408\u8a08 Scoreboard.Misc.Ability=\u30a2\u30d3\u30ea\u30c6\u30a3 # 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\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=&a\u3042\u306a\u305f\u306emcMMO\u30d7\u30ed\u30d5\u30a3\u30fc\u30eb\u304c\u8aad\u307f\u8fbc\u307e\u308c\u307e\u3057\u305f\u3002 +Profile.Loading.FailurePlayer=&cmcMMO\u306e\u30c7\u30fc\u30bf\u306e\u8aad\u307f\u8fbc\u307f\u306b\u554f\u984c\u304c\u3042\u308a\u307e\u3059\u3002&a{0}&c\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=&4[A]&c mcMMO\u306f&e{0}&c\u306e\u30d7\u30ec\u30fc\u30e4\u30fc\u30c7\u30fc\u30bf\u3092\u8aad\u307f\u8fbc\u3081\u307e\u305b\u3093\u3067\u3057\u305f\u3002 &d\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 # 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}\u306f\u30ec\u30d9\u30eb&a{1}&6\u306b\u306a\u308a\u307e\u3057\u305f\u3002 +Holiday.Anniversary=&9{0}\u5468\u5e74\u8a18\u5ff5\uff01\n&9nossr50\u306e\u5168\u3066\u306e\u4ed5\u4e8b\u3068\u5168\u3066\u306e\u958b\u767a\u3092\u8a18\u5ff5\u3057\u3066\uff01 # 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\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 # Locale -Locale.Reloaded=[[GREEN]]\u30ed\u30b1\u30fc\u30eb \u30ea\u30ed\u30fc\u30c9\uff01 +Locale.Reloaded=&a\u30ed\u30b1\u30fc\u30eb \u30ea\u30ed\u30fc\u30c9\uff01 # 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 +LevelCap.PowerLevel=&6(&amcMMO&6) &c{0}&e\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=&6(&amcMMO&6) &6{1}&e\u306e\u30ec\u30d9\u30eb\u30ad\u30e3\u30c3\u30d7&c{0}&e\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 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. \ 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 a9f62bee0..6a5865391 100644 --- a/src/main/resources/locale/locale_ko.properties +++ b/src/main/resources/locale/locale_ko.properties @@ -16,9 +16,9 @@ # --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.Ability.Proc=&a**\uC6B0\uC544\uD55C \uAD6C\uB974\uAE30** +Acrobatics.Combat.Proc=&a**\uD68C\uD53C** +Acrobatics.DodgeChance=\uD68C\uD53C \uD655\uB960: &e{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 @@ -26,8 +26,8 @@ Acrobatics.SubSkill.GracefulRoll.Description=\uAD6C\uB974\uAE30 2\uBC30 \uD6A8\u 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.SubSkill.Roll.Chance=\uAD6C\uB974\uAE30 \uD655\uB960: &e{0} +Acrobatics.SubSkill.Roll.GraceChance=\uC6B0\uC544\uD55C \uAD6C\uB974\uAE30 \uD655\uB960: &e{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 @@ -39,16 +39,16 @@ 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.Catalysis.Speed=\uC591\uC870 \uC18D\uB3C4: &e{0} +Alchemy.Concoctions.Rank=\uD63C\uD569 \uB7AD\uD06C: &e{0}/{1} +Alchemy.Concoctions.Ingredients=\uC131\uBD84 [&e{0}&c]: &e{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 #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.Combat.DazeChance=\uD604\uD639 \uD655\uB960: &e{0} +Archery.Combat.RetrieveChance=\uD654\uC0B4 \uD68C\uC218 \uD655\uB960: &e{0} +Archery.Combat.SkillshotBonus=\uC3D8\uAE30 \uC19C\uC528 \uCD94\uAC00 \uD53C\uD574 \uD655\uB960: &e{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) @@ -66,15 +66,15 @@ 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.Ability.Lower=&7**\uB3C4\uB07C \uC900\uBE44 \uD574\uC81C** +Axes.Ability.Ready=&a**\uB3C4\uB07C \uC900\uBE44 \uC644\uB8CC** +Axes.Combat.CritStruck=&4\uD06C\uB9AC\uD2F0\uCEEC \uD788\uD2B8\uC5D0 \uB9DE\uC558\uC2B5\uB2C8\uB2E4! +Axes.Combat.CritChance=\uD06C\uB9AC\uD2F0\uCEEC \uD788\uD2B8 \uD655\uB960: &e{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.Proc=&a**\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.Combat.SS.Struck=&4\uBF08 \uCABC\uAC1C\uAE30\uC5D0 \uB9DE\uC558\uC2B5\uB2C8\uB2E4! +Axes.Combat.SS.Length=\uBF08 \uCABC\uAC1C\uAE30 \uC9C0\uC18D\uC2DC\uAC04: &e{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 @@ -88,41 +88,41 @@ Axes.SubSkill.GreaterImpact.Description=\uBE44\uBB34\uC7A5 \uCD94\uAC00 \uD53C\u 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.Skills.SS.On=&a**\uBF08 \uCABC\uAC1C\uAE30 \uBC1C\uB3D9** +Axes.Skills.SS.Refresh=&a\uB2F9\uC2E0\uC758 &e\uBF08 \uCABC\uAC1C\uAE30 &a\uAE30\uC220\uC740 \uC774\uC81C \uC0AC\uC6A9 \uAC00\uB2A5\uD569\uB2C8\uB2E4! +Axes.Skills.SS.Other.Off={0}\uB2D8\uC774 &c\uBF08 \uCABC\uAC1C\uAE30\uB97C&a \uC900\uBE44 \uD574\uC81C\uD588\uC2B5\uB2C8\uB2E4 +Axes.Skills.SS.Other.On=&a{0}&2\uB2D8\uC774 &c\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 #EXCAVATION -Excavation.Ability.Lower=[[GRAY]]**\uC0BD \uC900\uBE44 \uD574\uC81C** -Excavation.Ability.Ready=[[GREEN]]**\uC0BD \uC900\uBE44 \uC644\uB8CC** +Excavation.Ability.Lower=&7**\uC0BD \uC900\uBE44 \uD574\uC81C** +Excavation.Ability.Ready=&a**\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.Effect.Length=\uAE30\uAC00 \uB4DC\uB9B4 \uBC84\uC11C\uCEE4 \uC9C0\uC18D\uC2DC\uAC04: &e{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.Skills.GigaDrillBreaker.On=&a**\uAE30\uAC00 \uB4DC\uB9B4 \uBC84\uC11C\uCEE4 \uBC1C\uB3D9** +Excavation.Skills.GigaDrillBreaker.Refresh=&a\uB2F9\uC2E0\uC758 &e\uAE30\uAC00 \uB4DC\uB9B4 \uBC84\uC11C\uCEE4 &a\uAE30\uC220\uC740 \uC774\uC81C \uC0AC\uC6A9 \uAC00\uB2A5\uD569\uB2C8\uB2E4! +Excavation.Skills.GigaDrillBreaker.Other.Off={0}&2\uB2D8\uC740 &c\uAE30\uAC00 \uB4DC\uB9B4 \uBC84\uC11C\uCEE4\uB97C \uC0AC\uC6A9\uD588\uC2B5\uB2C8\uB2E4! +Excavation.Skills.GigaDrillBreaker.Other.On=&a{0}&2\uB2D8\uC740 &c\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 #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.Chance=\uC785\uC9C8 \uD655\uB960: &e{0} +Fishing.Ability.Info=\uB9E4\uC9C1 \uD5CC\uD130: &7 **\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.Rank=\uD2B8\uB808\uC838 \uD5CC\uD130 \uB7AD\uD06C: &e{0}/5\uB7AD\uD06C +Fishing.Ability.TH.DropRate= \uB4DC\uB86D \uBE44\uC728: &4\uD568\uC815: &e{0} &7\uACF5\uD1B5: &e{1} &a\uBE44\uACF5\uD1B5: &e{2}\n&9\uB808\uC5B4: &e{3} &d\uC5D0\uD53D: &e{4} &6\uB808\uC804\uB4DC\uB9AC: &e{5} &b\uB808\uCF54\uB4DC: &e{6} +Fishing.Ability.TH.MagicRate=\uB9E4\uC9C1 \uD5CC\uD130 \uD655\uB960: &e{0} +Fishing.Ability.Shake=\uD754\uB4E4\uAE30 \uD655\uB960: &e{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.Ability.FD=\uC5B4\uBD80\uC758 \uB2E4\uC774\uC5B4\uD2B8 \uB7AD\uD06C: &e{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 @@ -135,27 +135,27 @@ 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.Chance.Raining=&9 \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.Ability.TH.MagicFound=&7\uC774 \uC785\uC9C8\uC5D0\uC11C \uB9C8\uBC95\uC774 \uB290\uAEF4\uC9D1\uB2C8\uB2E4... +Fishing.Ability.TH.Boom=&7\uD3ED\uBC1C \uC2DC\uAC04!!! +Fishing.Ability.TH.Poison=&7\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 #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.DoubleDropChance=2\uBC30 \uB4DC\uB86D \uD655\uB960: &e{0} +Herbalism.Ability.FD=\uB18D\uBD80\uC758 \uB2E4\uC774\uC5B4\uD2B8: &e{0}\uB7AD\uD06C +Herbalism.Ability.GTe.Length=\uC7AC\uBC30\uC758 \uB300\uC9C0 \uC9C0\uC18D\uC2DC\uAC04: &e{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.Chance=\uC7AC\uBC30\uC758 \uC7AC\uB2A5 \uD655\uB960: &e{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.GTh.Stage=\uC7AC\uBC30\uC758 \uC7AC\uB2A5 \uB2E8\uACC4: &e \uC791\uBB3C \uC7AC\uBC30 {0}\uB2E8\uACC4 +Herbalism.Ability.GTh=&a**\uC7AC\uBC30\uC758 \uC7AC\uB2A5** +Herbalism.Ability.HylianLuck=\uD558\uC77C\uB9AC\uC548\uC758 \uD589\uC6B4 \uD655\uB960: &e{0} +Herbalism.Ability.Lower=&7**\uD638\uBBF8 \uC900\uBE44 \uD574\uC81C** +Herbalism.Ability.Ready=&a**\uD638\uBBF8 \uC900\uBE44 \uC644\uB8CC** +Herbalism.Ability.ShroomThumb.Chance=\uBC84\uC12F\uC7AC\uBC30\uC790\uC758 \uC228\uACB0 \uD655\uB960: &e{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 @@ -171,23 +171,23 @@ 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.HylianLuck=&a\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.Skills.GTe.On=&a**\uC7AC\uBC30\uC758 \uB300\uC9C0 \uD65C\uC131\uD654\uB428** +Herbalism.Skills.GTe.Refresh=&a\uB2F9\uC2E0\uC758 &e\uC7AC\uBC30\uC758 \uB300\uC9C0 &a\uAE30\uC220\uC740 \uC774\uC81C \uC0AC\uC6A9 \uAC00\uB2A5\uD569\uB2C8\uB2E4! +Herbalism.Skills.GTe.Other.Off={0}&2\uB2D8\uC740 &c\uC7AC\uBC30\uC758 \uB300\uC9C0\uB97C \uC0AC\uC6A9\uD588\uC2B5\uB2C8\uB2E4! +Herbalism.Skills.GTe.Other.On=&a{0}&2\uB2D8\uC740 &c\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 #MINING -Mining.Ability.Length=\uD30C\uAD34\uC790 \uC9C0\uC18D\uC2DC\uAC04: [[YELLOW]]{0}s +Mining.Ability.Length=\uD30C\uAD34\uC790 \uC9C0\uC18D\uC2DC\uAC04: &e{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.Ability.Lower=&7**\uACE1\uAD2D\uC774 \uC900\uBE44 \uD574\uC81C** +Mining.Ability.Ready=&a**\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 @@ -198,24 +198,24 @@ 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.Effect.Decrease=\uC804\uBB38 \uD3ED\uD30C \uD53C\uD574 \uAC10\uC18C: &e{0} +Mining.Effect.DropChance=\uB4DC\uB86D 2\uBC30 \uD655\uB960: &e{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.Skills.SuperBreaker.On=&a**\uD30C\uAD34\uC790 \uBC1C\uB3D9** +Mining.Skills.SuperBreaker.Other.Off={0}&2\uB2D8\uC740 &c\uD30C\uAD34\uC790\uB97C \uC0AC\uC6A9\uD588\uC2B5\uB2C8\uB2E4! +Mining.Skills.SuperBreaker.Other.On=&a{0}&2\uB2D8\uC740 &c\uD30C\uAD34\uC790\uB97C \uC0AC\uC6A9\uD588\uC2B5\uB2C8\uB2E4! +Mining.Skills.SuperBreaker.Refresh=&a\uB2F9\uC2E0\uC758 &e\uD30C\uAD34\uC790\uB294 &a\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 #Blast Mining -Mining.Blast.Boom=[[GRAY]]**\uD3ED\uBC1C** +Mining.Blast.Boom=&7**\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.Radius.Increase=\uD3ED\uBC1C \uBC18\uACBD \uC99D\uAC00: &e+{0} +Mining.Blast.Rank=\uD3ED\uBC1C \uCC44\uAD74: &e{0}/8\uB7AD\uD06C &7({1}) +Mining.Blast.Other.On=&a{0}&2\uB2D8\uC740 &c\uD3ED\uBC1C \uCC44\uAD74\uC744 \uC0AC\uC6A9\uD558\uC168\uC2B5\uB2C8\uB2E4! +Mining.Blast.Refresh=&a\uB2F9\uC2E0\uC758 &e\uD3ED\uBC1C \uCC44\uAD74 &a\uAE30\uC220\uC740 \uC774\uC81C \uC0AC\uC6A9 \uAC00\uB2A5\uD569\uB2C8\uB2E4! #REPAIR Repair.SubSkill.Repair.Name=\uC218\uB9AC @@ -234,31 +234,31 @@ Repair.SubSkill.DiamondRepair.Name=\uB2E4\uC774\uC544\uBAAC\uB4DC \uC218\uB9AC ( 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.Error=&4mcMMO\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=&4\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.Skills.AdeptDiamond=&4\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=&4\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=&4\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=&4\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 &e{1}\uC744/\uB97C \uC218\uB9AC\uD560\uB824\uBA74 &e{0}&c\uB808\uBCA8\uC774 \uD544\uC694\uD569\uB2C8\uB2E4 +Repair.Skills.FeltEasy=&7\uC26C\uC6B4 \uB290\uB08C~ +Repair.Skills.FullDurability=&7\uB0B4\uAD6C\uB3C4\uAC00 \uAF49 \uCC3C\uC2B5\uB2C8\uB2E4. +Repair.Skills.Mastery=\uC218\uB9AC \uB9C8\uC2A4\uD130\uB9AC: &e\uCD94\uAC00 \uB0B4\uAD6C\uC131 \uBCF5\uAD6C: {0} +Repair.Skills.StackedItems=&4\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: &e{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 #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.Chance.Downgrade=&7\uC778\uCC48\uD2B8 \uC218\uB9AC \uACA9\uD558 \uD655\uB960: &e{0}% +Repair.Arcane.Chance.Success=&7\uC778\uCC48\uD2B8 \uC218\uB9AC \uC131\uACF5 \uD655\uB960: &e{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.Perfect=&a\uC774 \uC544\uC774\uD15C\uC758 \uC778\uCC48\uD2B8\uB97C \uC9C0\uC18D\uC2DC\uCF30\uC2B5\uB2C8\uB2E4. +Repair.Arcane.Rank=\uC778\uCC48\uD2B8 \uC218\uB9AC: &e{0}/{1}\uB7AD\uD06C #SALVAGE Salvage.Pretty.Name=\uD68C\uC218 @@ -269,33 +269,33 @@ Salvage.SubSkill.ArcaneSalvaging.Description=\uC544\uC774\uD15C\uC758 \uC778\uCC 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.Arcane.Rank=\uC2E0\uBE44\uB85C\uC6B4 \uD68C\uC218: &eRank {0}/{1} +Salvage.Arcane.ExtractFull=&7\uCD5C\uB300-\uC778\uCC48\uD2B8 \uAE30\uD68C \uBD80\uACFC +Salvage.Arcane.ExtractPartial=&7\uC77C\uBD80-\uC778\uCC48\uD2B8 \uAE30\uD68C \uBD80\uACFC +Salvage.Skills.Success=&a\uC544\uC774\uD15C \uD68C\uC218\uB428! +Salvage.Skills.Adept.Damaged=&4\uC190\uC0C1\uB41C \uC544\uC774\uD15C\uC744 \uD68C\uC218\uD560 \uB2A5\uB825\uC774 \uC5C6\uC2B5\uB2C8\uB2E4. +Salvage.Skills.Adept.Level={1}\uB97C &c\uD68C\uC218\uD558\uB824\uBA74 &e{0}&c \uB808\uBCA8\uC774 \uB418\uC57C\uD569\uB2C8\uB2E4 +Salvage.Skills.TooDamaged=&4\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.Skills.ArcaneSuccess=&a\uB2F9\uC2E0\uC740 \uC774 \uC544\uC774\uD15C\uC758 \uBAA8\uB4E0 \uC9C0\uC2DD\uC744 \uCD94\uCD9C\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4! +Salvage.Listener.Anvil=&4\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 #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.Ability.Lower=&7**\uAC80 \uC900\uBE44 \uD574\uC81C** +Swords.Ability.Ready=&a**\uAC80 \uC900\uBE44 \uC644\uB8CC** +Swords.Combat.Bleed.Chance=\uCD9C\uD608 \uD655\uB960: &e{0} +Swords.Combat.Bleed.Length=\uCD9C\uD608 \uC9C0\uC18D\uC2DC\uAC04: &e{0} \uD2F1 +Swords.Combat.Bleed.Note=&7\uC54C\uB9BC: &e1 \uD2F1\uC740 2\uCD08\uC785\uB2C8\uB2E4 +Swords.Combat.Bleeding.Started=&4 \uB2F9\uC2E0\uC740 \uD53C\uB97C \uD758\uB9AC\uACE0 \uC788\uC2B5\uB2C8\uB2E4! +Swords.Combat.Bleeding.Stopped=&7\uCD9C\uD608\uC774 &a\uBA48\uCDC4\uC2B5\uB2C8\uB2E4&7! +Swords.Combat.Bleeding=&a**\uCD9C\uD608** +Swords.Combat.Counter.Chance=\uCE74\uC6B4\uD130 \uC5B4\uD0DD \uD655\uB960: &e{0} +Swords.Combat.Counter.Hit=&4\uCE74\uC6B4\uD130 \uC5B4\uD0DD\uC5D0 \uB9DE\uC558\uC2B5\uB2C8\uB2E4! +Swords.Combat.Countered=&a**\uCE74\uC6B4\uD130-\uC5B4\uD0DD** +Swords.Combat.SS.Struck=&4\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) @@ -307,12 +307,12 @@ 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.Skills.SS.On=&a**\uD1B1\uB0A0 \uACF5\uACA9 \uBC1C\uB3D9** +Swords.Skills.SS.Refresh=&a\uB2F9\uC2E0\uC758 &e\uD1B1\uB0A0 \uACF5\uACA9 &a\uC2A4\uD0AC\uC740 \uC774\uC81C \uC0AC\uC6A9 \uAC00\uB2A5\uD569\uB2C8\uB2E4! +Swords.Skills.SS.Other.Off={0}&2\uB2D8\uC740 &c\uD1B1\uB0A0 \uACF5\uACA9 \uC2A4\uD0AC\uC744 \uC0AC\uC6A9 \uD574\uC81C\uD588\uC2B5\uB2C8\uB2E4! +Swords.Skills.SS.Other.On=&a{0}&2\uB2D8\uC740 &c\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.SS.Length=\uD1B1\uB0A0 \uACF5\uACA9 \uC9C0\uC18D\uC2DC\uAC04: &e{0}\uCD08 #TAMING Taming.Ability.Bonus.0=\uD658\uACBD \uC778\uC2DD @@ -333,16 +333,16 @@ Taming.Ability.Locked.2={0}\uB808\uBCA8 \uB54C \uC2A4\uD0AC\uD574\uC81C (\uCDA9\ 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.Combat.Chance.Gore=\uB3CC\uC9C4 \uD655\uB960: &e{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.CallOfTheWild.Description.2=&7COTW (\uC624\uC140\uB86F): \uCB48\uADF8\uB9AC\uBA74\uC11C \uBB3C\uACE0\uAE30\uB97C \uB4E4\uACE0 {0}\uBC88 \uC88C \uD074\uB9AD +Taming.Effect.15=&7COTW (\uB291\uB300): \uCB48\uADF8\uB9AC\uBA74\uC11C \uBF08\uB97C \uB4E4\uACE0 {0}\uBC88 \uC88C \uD074\uB9AD +Taming.SubSkill.Gore.Name0=&7COTW (\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 @@ -355,27 +355,27 @@ 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.Wolf=&8\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.Complete=&a\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} #UNARMED -Unarmed.Ability.Berserk.Length=\uBC84\uC11C\uCEE4 \uC9C0\uC18D\uC2DC\uAC04: [[YELLOW]]{0}\uCD08 +Unarmed.Ability.Berserk.Length=\uBC84\uC11C\uCEE4 \uC9C0\uC18D\uC2DC\uAC04: &e{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.Chance.ArrowDeflect=\uD654\uC0B4 \uD68C\uD53C \uD655\uB960: &e{0} +Unarmed.Ability.Chance.Disarm=\uBE44\uBB34\uC7A5 \uD655\uB960: &e{0} +Unarmed.Ability.Chance.IronGrip=\uAC15\uCCA0 \uC8FC\uBA39 \uD655\uB960: &e{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.Ability.IronGrip.Defender=&a\uAC15\uCCA0 \uC8FC\uBA39\uC758 \uBE44\uBB34\uC7A5\uC744 \uC77C\uC2DC\uC801\uC73C\uB85C \uBC29\uC5B4\uD588\uC2B5\uB2C8\uB2E4! +Unarmed.Ability.Lower=&7**\uC190 \uC900\uBE44 \uD574\uC81C** +Unarmed.Ability.Ready=&a**\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) @@ -389,17 +389,17 @@ Unarmed.SubSkill.IronGrip.Description=\uBE44\uBB34\uC7A5 \uC0C1\uD0DC \uBC29\uC9 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.Skills.Berserk.On=&a**\uBC84\uC11C\uCEE4 \uBC1C\uB3D9** +Unarmed.Skills.Berserk.Other.Off={0}&2\uB2D8\uC740 &c\uBC84\uC11C\uCEE4\uB97C \uC0AC\uC6A9\uD588\uC2B5\uB2C8\uB2E4! +Unarmed.Skills.Berserk.Other.On=&a{0}&2\uB2D8\uC740 &c\uBC84\uC11C\uCEE4\uB97C \uC0AC\uC6A9\uD569\uB2C8\uB2E4! +Unarmed.Skills.Berserk.Refresh=&a\uB2F9\uC2E0\uC758 &e\uBC84\uC11C\uCEE4 &a\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 #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.Chance.DDrop=\uB4DC\uB86D 2\uBC30 \uD655\uB960: &e{0} +Woodcutting.Ability.Length=\uB098\uBB34\uAFBC \uC9C0\uC18D\uC2DC\uAC04: &e{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 @@ -410,170 +410,170 @@ 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.On=&a**\uB098\uBB34\uAFBC \uBC1C\uB3D9** +Woodcutting.Skills.TreeFeller.Refresh=&a\uB2F9\uC2E0\uC758 &e\uB098\uBB34\uAFBC &a\uC2A4\uD0AC\uC740 \uC774\uC81C \uC0AC\uC6A9 \uAC00\uB2A5\uD569\uB2C8\uB2E4! +Woodcutting.Skills.TreeFeller.Other.Off={0}&2\uB2D8\uC740 &c\uB098\uBB34\uAFBC \uC2A4\uD0AC\uC744 \uC0AC\uC6A9 \uD574\uC81C\uD588\uC2B5\uB2C8\uB2E4! +Woodcutting.Skills.TreeFeller.Other.On=&a{0}&2\uB2D8\uC740 &c\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 #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**\uB2A5\uB825\uC774 \uC7AC \uACF5\uAE09 \uB418\uC5C8\uC2B5\uB2C8\uB2E4!** +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.ArrowDeflect=&f**\uD654\uC0B4 \uD68C\uD53C** +Combat.BeastLore=&a**\uC9D0\uC2B9\uC758 \uD3EC\uD6A8** +Combat.BeastLoreHealth=&3\uCCB4\uB825: (&a{0}&3/{1}) +Combat.BeastLoreOwner=&3\uC8FC\uC778: (&c{0}&3) +Combat.Gore=&a**\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.TargetDazed=\uBAA9\uD45C\uAC00 &4\uD63C\uB780\uC2A4\uB7EC\uC6CC\uD569\uB2C8\uB2E4 +Combat.TouchedFuzzy=&4\uD63C\uB780\uC774 \uC77C\uC5B4\uB0AC\uC2B5\uB2C8\uB2E4. \uC544~ \uC5B4\uC9C0\uB7EC\uC6CC. #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! +mcMMO.Description=mcMMO&3 \uD504\uB85C\uC81D\uD2B8\uC5D0 \uB300\uD574\uC11C:,&6mcMMO\uB294 \uD55C &c\uC624\uD508 \uC18C\uC2A4&6 RPG \uBAA8\uB4DC\uB85C 2011\uB144 2\uC6D4\uC5D0 &9nossr50&6\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.,&3\uD301:,&6 - &c/mcmmo help&a \uBA85\uB839\uC5B4\uB4E4\uC744 \uBD05\uB2C8\uB2E4,&6 - &a\uD0C0\uC785 &c/\uC2A4\uD0AC\uC774\uB984&a \uC790\uC138\uD55C \uC2A4\uD0AC \uC815\uBCF4\uB97C \uBD05\uB2C8\uB2E4,&3\uAC1C\uBC1C\uC790\uB4E4:,&6 - &anossr50 &9(\uC81C\uC791\uC790),&6 - &aGJ &9(\uD504\uB85C\uC81D\uD2B8 \uC8FC\uC7A5),&6 - &aNuclearW &9(\uAC1C\uBC1C\uC790),&6 - &abm01 &9(\uAC1C\uBC1C\uC790),&6 - &aTfT_02 &9(\uAC1C\uBC1C\uC790),&6 - &aGlitchfinder &9(\uAC1C\uBC1C\uC790),&6 - &at00thpick1 &9(\uAC1C\uBC1C\uC790),&3\uC720\uC6A9\uD55C \uB9C1\uD06C:,&6 - &ahttps://github.com/mcMMO-Dev/mcMMO/issues&6 \uBC84\uADF8 \uBCF4\uACE0,&6 - &a#mcmmo @ irc.esper.net&6 IRC \uCC44\uD305, +Commands.addlevels.AwardAll.1=&a\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.1=&a\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.addxp.AwardAll=&a\uB2F9\uC2E0\uC740 \uBAA8\uB4E0 \uC2A4\uD0AC\uC5D0 {0} \uACBD\uD5D8\uCE58\uB97C \uC9C0\uAE09\uD588\uC2B5\uB2C8\uB2E4! +Commands.addxp.AwardSkill=&a\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 &c\uAEBC\uC84C\uC2B5\uB2C8\uB2E4 +Commands.Ability.On=\uB2A5\uB825 \uC0AC\uC6A9\uC774 &a\uCF1C\uC84C\uC2B5\uB2C8\uB2E4 +Commands.Ability.Toggle=\uB2A5\uB825 \uC0AC\uC6A9\uC740 &e{0}(\uC73C)\uB85C \uC804\uD658\uB418\uC5C8\uC2B5\uB2C8\uB2E4 +Commands.AdminChat.Off=\uAD00\uB9AC\uC790 \uCC44\uD305\uC774 &c\uAEBC\uC84C\uC2B5\uB2C8\uB2E4 +Commands.AdminChat.On=\uAD00\uB9AC\uC790 \uCC44\uD305\uC774 &a\uCF1C\uC84C\uC2B5\uB2C8\uB2E4 +Commands.AdminToggle=&a- \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.Cooldowns.Header=&6--= &amcMMO \uB2A5\uB825 \uC7AC \uC0AC\uC6A9 \uB300\uAE30\uC2DC\uAC04&6 =-- +Commands.Cooldowns.Row.N=\ &c{0}&f - &6{1}\uCD08 \uB0A8\uC74C +Commands.Cooldowns.Row.Y=\ &b{0}&f - &2\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.DoesNotExist= &c\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.GodMode.Toggle=\uBD88\uC0AC\uC2E0 \uBAA8\uB4DC\uB294 &e{0}&f(\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 &c\uD558\uD2B8&f\uB85C \uBCC0\uACBD\uB418\uC5C8\uC2B5\uB2C8\uB2E4. +Commands.Healthbars.Changed.BAR=[mcMMO] \uB2F9\uC2E0\uC758 \uCCB4\uB825\uBC14 \uBCF4\uAE30 \uBC29\uC2DD\uC740 &e\uBC15\uC2A4&f\uB85C \uBCC0\uACBD\uB418\uC5C8\uC2B5\uB2C8\uB2E4. +Commands.Healthbars.Changed.DISABLED=[mcMMO] \uB2F9\uC2E0\uC758 \uBAB9 \uCCB4\uB825\uBC14\uB294 &7\uBE44\uD65C\uC131\uD654&f \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.Inspect=<\uD50C\uB808\uC774\uC5B4> &a- \uC0C1\uC138\uD55C \uD50C\uB808\uC774\uC5B4 \uC815\uBCF4\uB97C \uBD05\uB2C8\uB2E4 +Commands.Invite.Success=&a\uCD08\uB300\uB97C \uC131\uACF5\uC801\uC73C\uB85C \uBCF4\uB0C8\uC2B5\uB2C8\uB2E4. +Commands.Leaderboards=<\uC2A4\uD0AC> <\uD398\uC774\uC9C0> &a- mcMMO \uC2A4\uD0AC \uC815\uBCF4 +Commands.mcc.Header=---[]&amcMMO \uBA85\uB839\uC5B4&c[]--- +Commands.mcgod=&a- \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.mcpurge.Success=&a\uB370\uC774\uD130\uBCA0\uC774\uC2A4\uAC00 \uC131\uACF5\uC801\uC73C\uB85C \uCD08\uAE30\uD654\uB42C\uC2B5\uB2C8\uB2E4! +Commands.mcrank.Heading=&6-=\uAC1C\uC778 \uC21C\uC704=- +Commands.mcrank.Overall=\uC885\uD569&a - &6\uB7AD\uD06C &f#&a{0} +Commands.mcrank.Player=\uD0C0\uAC9F: &f{0} +Commands.mcrank.Skill={0}&a - &6\uB7AD\uD06C &f#&a{1} +Commands.mcrank.Unranked=&f\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.mcremove.Success=&a{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=&6\uD301: &c/mcrank&6 \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> &a - \uB300\uC0C1\uC744 \uC218\uC815\uD569\uB2C8\uB2E4 +Commands.mmoedit.AllSkills.1=&a\uB2F9\uC2E0\uC758 \uBAA8\uB4E0 \uC2A4\uD0AC \uB808\uBCA8\uC774 {0}\uB85C \uC124\uC815\uB418\uC5C8\uC2B5\uB2C8\uB2E4! +Commands.mmoedit.Modified.1=&a\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.Database.Start=&7{0}\uC5D0\uC11C {1}(\uC73C)\uB85C \uC804\uD658 \uC2DC\uC791\uC911... +Commands.mcconvert.Database.Finish=&7\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: &a{0} +Commands.mcconvert.Experience.Invalid=\uC798\uBABB\uB41C \uACF5\uC2DD \uD0C0\uC785! \uC62C\uBC14\uB978 \uD0C0\uC785: &aLINEAR &c\uADF8\uB9AC\uACE0 &aEXPONENTIAL. 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.mcconvert.Experience.Start=&7{0} \uC5D0\uC11C {1} \uACE1\uC120\uC73C\uB85C \uBCC0\uD658 \uC2DC\uC791 +Commands.mcconvert.Experience.Finish=&7\uACF5\uC2DD \uBCC0\uD658 \uC644\uB8CC; \uC774\uC81C {0} XP \uACE1\uC120\uC785\uB2C8\uB2E4. +Commands.ModDescription=&a- \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.Notifications.Off=\uB2A5\uB825 \uC54C\uB9BC\uC774 &c\uCF1C\uC84C\uC2B5\uB2C8\uB2E4 +Commands.Notifications.On=\uB2A5\uB825 \uC54C\uB9BC\uC774 &a\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.Other=---[]&a\uAE30\uD0C0 \uBA85\uB839\uC5B4&c[]--- +Commands.Party.Header=-----[]&a\uD30C\uD2F0&c[]----- +Commands.Party.Features.Header=-----[]&a\uD2B9\uC9D5&c[]----- +Commands.Party.Status=&8\uC774\uB984: &f{0} {1} &8\uB808\uBCA8: &3{2} +Commands.Party.Status.Alliance=&8\uB3D9\uB9F9: &f{0} +Commands.Party.UnlockedFeatures=&8\uD574\uC81C\uB41C \uD2B9\uC9D5: &7[[ITALIC]]{0} +Commands.Party.ShareMode=&8\uACF5\uC720 \uBAA8\uB4DC: +Commands.Party.ItemShare=&7\uC544\uC774\uD15C &3({0}) +Commands.Party.ExpShare=&7EXP &3({0}) +Commands.Party.ItemShareCategories=&8\uACF5\uC720\uC911\uC778 \uC544\uC774\uD15C: &7[[ITALIC]]{0} +Commands.Party.MembersNear=&8\uB2F9\uC2E0\uC758 \uADFC\uCC98 &3{0}&8/&3{1} +Commands.Party.Accept=&a- \uD30C\uD2F0 \uCD08\uB300 \uD5C8\uC6A9 +Commands.Party.Chat.Off=\uD30C\uD2F0 \uCC44\uD305\uC744 &c\uB055\uB2C8\uB2E4 +Commands.Party.Chat.On=\uD30C\uD2F0 \uCC44\uD305\uC744 &a\uCF2D\uB2C8\uB2E4 +Commands.Party.Commands=---[]&a\uD30C\uD2F0 \uBA85\uB839\uC5B4&c[]--- +Commands.Party.Invite.0=\uC54C\uB9BC: &a\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 &a/party accept&e \uBA85\uB839\uC5B4\uB97C \uCE58\uBA74 \uD30C\uD2F0 \uCD08\uB300\uC5D0 \uC2B9\uB099\uB429\uB2C8\uB2E4 +Commands.Party.Invite=<\uD50C\uB808\uC774\uC5B4> &a- \uD30C\uD2F0 \uCD08\uB300\uB97C \uBCF4\uB0C5\uB2C8\uB2E4 +Commands.Party.Invite.Accepted=&a\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.Create=&7\uB9CC\uB4E4\uC5B4\uC9C4 \uD30C\uD2F0: {0} +Commands.Party.Rename=&7\uBCC0\uACBD\uB41C \uD30C\uD2F0 \uC774\uB984: &f{0} +Commands.Party.SetSharing=&7\uD30C\uD2F0 {0} \uACF5\uC720 \uC124\uC815: &3{1} +Commands.Party.ToggleShareCategory=&7\uD30C\uD2F0 \uC544\uC774\uD15C \uACF5\uC720 &6{0} &7\uAC00 &3{1}\uB418\uC5C8\uC2B5\uB2C8\uB2E4 +Commands.Party.AlreadyExists=&4{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.Members.Header=-----[]&a\uB9F4\uBC84\uB4E4&c[]----- 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.Quit=&a- \uD604\uC7AC \uCC38\uC5EC \uB418\uC5B4\uC788\uB294 \uD30C\uD2F0\uB97C \uB098\uAC11\uB2C8\uB2E4 +Commands.Party.Teleport=&a- \uD30C\uD2F0 \uB9F4\uBC84\uD55C\uD14C \uD154\uB808\uD3EC\uD2B8\uD569\uB2C8\uB2E4 +Commands.Party.Toggle=&a- \uD30C\uD2F0 \uCC44\uD305\uC744 \uCF1C\uAE30/\uB044\uAE30 \uD569\uB2C8\uB2E4 +Commands.Party1=&a- \uC0C8 \uD30C\uD2F0\uB97C \uB9CC\uB4ED\uB2C8\uB2E4 +Commands.Party2=&a- \uD50C\uB808\uC774\uC5B4\uAC00 \uD30C\uD2F0\uC5D0 \uAC00\uC785\uD569\uB2C8\uB2E4 +Commands.Party.Alliance.Header=-----[]&a\uD30C\uD2F0 \uB3D9\uB9F9&c[]----- +Commands.Party.Alliance.Ally=&f{0} &8\uD30C\uD2F0\uC758 \uB3D9\uB9F9: &f{1} +Commands.Party.Alliance.Members.Header=-----[]&a\uB3D9\uB9F9 \uAD6C\uC131\uC6D0&c[]----- +Commands.Party.Alliance.Invite.0=\uC54C\uB9BC: &a{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 &a/party alliance accept&e \uCD08\uB300\uC5D0 \uC218\uB77D\uD569\uB2C8\uB2E4 +Commands.Party.Alliance.Invite.Accepted=&a\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.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 &3/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.Party.Alliance.Help.1= \uB3D9\uB9F9\uC744 \uD558\uB824\uBA74 &3/party alliance invite &c. +Commands.ptp.Enabled=\uD30C\uD2F0 \uD154\uB808\uD3EC\uD2B8 &a\uD65C\uC131\uD654\uB428 +Commands.ptp.Disabled=\uD30C\uD2F0 \uD154\uB808\uD3EC\uD2B8 &c\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.Request1={0} &a\uB2D8\uC774 \uB2F9\uC2E0\uC5D0\uAC8C \uD154\uB808\uD3EC\uD2B8\uB97C \uC2E0\uCCAD\uD588\uC2B5\uB2C8\uB2E4. +Commands.ptp.Request2=&a\uD154\uB808\uD3EC\uD2B8\uD558\uB824\uBA74, \uD0C0\uC785 &e/ptp accept&a. &c{0}&a\uCD08\uC5D0 \uC694\uCCAD\uC774 \uB9CC\uAE30\uB429\uB2C8\uB2E4. +Commands.ptp.AcceptAny.Enabled=\uD30C\uD2F0 \uD154\uB808\uD3EC\uD2B8 \uC694\uCCAD \uD655\uC778 &a\uD65C\uC131\uD654\uB428 +Commands.ptp.AcceptAny.Disabled=\uD30C\uD2F0 \uD154\uB808\uD3EC\uD2B8 \uC694\uCCAD \uD655\uC778 &c\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.PowerLevel.Leaderboard=--mcMMO&9 \uCD1D \uB808\uBCA8 &e\uC810\uC218\uD45C-- +Commands.PowerLevel.Capped=&4\uCD1D \uB808\uBCA8: &a{0} &4\uCD5C\uB300 \uB808\uBCA8: &e{1} +Commands.PowerLevel=&4\uCD1D \uB808\uBCA8: &a{0} +Commands.Reset.All=&a\uB2F9\uC2E0\uC758 \uBAA8\uB4E0 \uC2A4\uD0AC\uC774 \uC131\uACF5\uC801\uC73C\uB85C \uCD08\uAE30\uD654\uB418\uC5C8\uC2B5\uB2C8\uB2E4. +Commands.Reset.Single=&a\uB2F9\uC2E0\uC758 {0} \uC2A4\uD0AC\uC774 \uC131\uACF5\uC801\uC73C\uB85C \uCD08\uAE30\uD654\uB418\uC5C8\uC2B5\uB2C8\uB2E4. +Commands.Reset=&a\uC2A4\uD0AC \uB808\uBCA8\uC744 0\uC73C\uB85C \uCD08\uAE30\uD654 \uC2DC\uD0B5\uB2C8\uB2E4 +Commands.Scoreboard.Clear=&3mcMMO \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.Scoreboard.Keep=&3mcMMO \uC810\uC218\uD310\uC740 \uB2F9\uC2E0\uC774 &a/mcscoreboard clear&3\uB97C \uC0AC\uC6A9\uD560 \uB54C\uAE4C\uC9C0 \uC720\uC9C0\uB420 \uAC83\uC784. +Commands.Scoreboard.Timer=&3mcMMO \uC810\uC218\uD310\uC740 \uC9C0\uAE08\uC73C\uB85C\uBD80\uD130 &6{0}&3\uCD08 \uB0B4\uC5D0 \uCCAD\uC18C\uB420 \uC608\uC815\uC784. +Commands.Scoreboard.Help.0=&6 == &c/mcscoreboard &a\uB3C4\uC6C0\uB9D0&6 == +Commands.Scoreboard.Help.1=&3/mcscoreboard&b clear &f - McMMO \uC810\uC218\uD310\uC744 \uCCAD\uC18C\uD568 +Commands.Scoreboard.Help.2=&3/mcscoreboard&b keep &f - McMMO \uC810\uC218\uD310\uC744 \uC720\uC9C0\uD568 +Commands.Scoreboard.Help.3=&3/mcscoreboard&b time [n] &f - McMMO \uC810\uC218\uD310\uC744 &dn&f\uCD08 \uD6C4\uC5D0 \uCCAD\uC18C\uD568 +Commands.Scoreboard.Tip.Keep=&6\uD301: &c/mcscoreboard keep&6 \uC810\uC218\uD310\uC744 \uBCF4\uC774\uAC8C \uD56D\uC0C1 \uC720\uC9C0. +Commands.Scoreboard.Tip.Clear=&6\uD301: &c/mcscoreboard clear&6 \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.Skill.Leaderboard=--mcMMO &9{0}&e \uC810\uC218\uD45C-- +Commands.SkillInfo=&a- \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.Stats=&a- \uB2F9\uC2E0\uC758 mcMMO \uD1B5\uACC4 \uBCF4\uAE30 +Commands.ToggleAbility=&a- \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} @@ -589,59 +589,59 @@ Commands.Usage.Rate=\uBC30\uC728 Commands.Usage.Skill=\uC2A4\uD0AC 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.NoPermission=&4\uAD8C\uD55C\uC774 \uBD80\uC871\uD569\uB2C8\uB2E4. +mcMMO.NoSkillNote=&8\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. ##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.Help.0=\uC62C\uBC14\uB978 \uC0AC\uC6A9\uBC95 &3{0} <\uD50C\uB808\uC774\uC5B4> [\uBE44\uBC00\uBC88\uD638]. +Party.Help.1=\uD30C\uD2F0\uB97C \uB9CC\uB4E4\uB824\uBA74, &3{0} <\uC774\uB984> [\uBE44\uBC00\uBC88\uD638]. +Party.Help.2=\uD30C\uD2F0 \uC815\uBCF4\uB97C \uBCFC\uB824\uBA74 &3{0} +Party.Help.3=\uD30C\uD2F0\uC5D0 \uAC00\uC785\uD560\uB824\uBA74 &3{0} <\uD50C\uB808\uC774\uC5B4> [\uBE44\uBC00\uBC88\uD638] &c\uB098\uAC08\uB824\uBA74 &3{1} +Party.Help.4=\uD30C\uD2F0\uB97C \uC7A0\uAE08/\uC7A0\uAE08\uD574\uC81C \uD560\uB824\uBA74, &3{0} +Party.Help.5=\uBE44\uBC00\uBC88\uD638\uB85C \uD30C\uD2F0\uB97C \uBCF4\uD638\uD560\uB824\uBA74, &3{0} <\uBE44\uBC00\uBC88\uD638> +Party.Help.6=\uD30C\uD2F0\uC5D0\uC11C \uD50C\uB808\uC774\uC5B4\uB97C \uCD94\uBC29\uC2DC\uD0AC\uB824\uBA74, &3{0} <\uD50C\uB808\uC774\uC5B4> +Party.Help.7=\uD30C\uD2F0\uC7A5\uC744 \uAD50\uCCB4\uD560\uB824\uBA74, &3{0} <\uD50C\uB808\uC774\uC5B4> +Party.Help.8=\uD30C\uD2F0\uB97C \uD574\uCCB4\uD560\uB824\uBA74, &3{0} +Party.Help.9=\uD30C\uD2F0 \uB9F4\uBC84\uB4E4\uACFC \uC544\uC774\uD15C\uC744 \uACF5\uC720\uD558\uB824\uBA74 &3{0} +Party.Help.10=\uD30C\uD2F0 \uB9F4\uBC84\uB4E4\uACFC \uACBD\uD5D8\uCE58 \uACF5\uC720\uB97C \uD65C\uC131\uD654\uD654\uB824\uBA74 &3{0} +Party.InformedOnJoin={0} &a\uB2D8\uC774 \uB2F9\uC2E0\uC758 \uD30C\uD2F0\uC5D0 \uCC38\uC5EC\uD588\uC2B5\uB2C8\uB2E4 +Party.InformedOnQuit={0} &a\uB2D8\uC774 \uB2F9\uC2E0\uC758 \uD30C\uD2F0\uC5D0\uC11C \uB5A0\uB0AC\uC2B5\uB2C8\uB2E4 +Party.InformedOnNameChange=&6{0} &a\uB2D8\uC774 \uD30C\uD2F0 \uC774\uB984\uC744 &f{1}\uB85C \uC124\uC815\uD588\uC2B5\uB2C8\uB2E4 +Party.InvalidName=&4\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.NotInYourParty=&4{0}\uB2D8\uC740 \uB2F9\uC2E0\uC758 \uD30C\uD2F0\uC5D0 \uC5C6\uC2B5\uB2C8\uB2E4 +Party.NotOwner=&4\uB2F9\uC2E0\uC740 \uD30C\uD2F0\uC7A5\uC774 \uC544\uB2D9\uB2C8\uB2E4. +Party.Target.NotOwner=&4{0}\uB2D8\uC740 \uD30C\uD2F0\uC7A5\uC774 \uC544\uB2D9\uB2C8\uB2E4. +Party.Owner.New=&a{0}\uB2D8\uC774 \uC0C8 \uD30C\uD2F0\uC7A5\uC774 \uB418\uC5C8\uC2B5\uB2C8\uB2E4. +Party.Owner.NotLeader=&4\uB2F9\uC2E0\uC740 \uC774\uC81C \uD30C\uD2F0\uC7A5\uC774 \uC544\uB2D9\uB2C8\uB2E4. +Party.Owner.Player =&a\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.Password.Set=&a\uC124\uC815\uD55C \uD30C\uD2F0 \uBE44\uBC00\uBC88\uD638\uB294 {0} \uC785\uB2C8\uB2E4 +Party.Password.Removed=&a\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.NotOnline=&4{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.PlayerNotInParty=&4{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.Player=&a\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.Target=&a{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.Unlocked=&7\uD30C\uD2F0\uAC00 \uC7A0\uAE08\uD574\uC81C \uB418\uC5C8\uC2B5\uB2C8\uB2E4 +Party.Disband=&7\uADF8 \uD30C\uD2F0\uAC00 \uD574\uCCB4\uB418\uC5C8\uC2B5\uB2C8\uB2E4 +Party.Alliance.Formed=&7\uB2F9\uC2E0\uC758 \uD30C\uD2F0\uB294 \uC774\uC81C &a{0} \uD30C\uD2F0\uC640 \uB3D9\uB9F9\uC785\uB2C8\uB2E4 +Party.Alliance.Disband=&7\uB2F9\uC2E0\uC758 \uD30C\uD2F0\uB294 \uB354 \uC774\uC0C1 &c{0} \uD30C\uD2F0\uC640 \uB3D9\uB9F9\uC774 \uC544\uB2D9\uB2C8\uB2E4 +Party.Status.Locked=&4(\uCD08\uB300\uB9CC-\uD5C8\uC6A9) +Party.Status.Unlocked=&2(\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 @@ -684,182 +684,182 @@ 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.XPGain=&8\uACBD\uD5D8\uCE58 \uC5BB\uB294 \uBC29\uBC95: &f{0} +Commands.xplock.locked=&6\uB2F9\uC2E0\uC758 \uACBD\uD5D8\uCE58 \uBC14\uB294 {0}\uB85C \uC7A0\uACBC\uC2B5\uB2C8\uB2E4! +Commands.xplock.unlocked=&6\uB2F9\uC2E0\uC758 \uACBD\uD5D8\uCE58 \uBC14\uB294 &a\uC7A0\uAE08 \uD574\uC81C\uB418\uC5C8\uC2B5\uB2C8\uB2E4&6! 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.0=\uACBD\uD5D8\uCE58 \uBC30\uC728 \uC774\uBCA4\uD2B8\uB97C \uC0AC\uC6A9\uBC95: &f/xprate <\uBC30\uC728> +Commands.xprate.proper.1=\uACBD\uD5D8\uCE58 \uBC30\uC728\uC744 \uCD08\uAE30\uD654 \uBC29\uBC95: &f/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.xprate.started.0=&6mcMMO \uACBD\uD5D8\uCE58 \uC774\uBCA4\uD2B8\uAC00 \uC2DC\uC791\uB418\uC5C8\uC2B5\uB2C8\uB2E4! +Commands.xprate.started.1=&6mcMMO \uACBD\uD5D8\uCE58 \uBC30\uC728\uC740 {0}\uBC30 \uC785\uB2C8\uB2E4! +XPRate.Event= &6mcMMO \uB294 \uD604\uC7AC \uACBD\uD5D8\uCE58 \uC774\uBCA4\uD2B8 \uC911\uC785\uB2C8\uB2E4! \uACBD\uD5D8\uCE58\uB294 {0}\uBC30 \uC785\uB2C8\uB2E4! #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.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.Available=&7{0} \uAC00\uC774\uB4DC\uAC00 \uC788\uC2B5\uB2C8\uB2E4 - \uD0C0\uC785 /{1} ? [\uD398\uC774\uC9C0] +Guides.Header=&6-=&a{0} \uAC00\uC774\uB4DC&6=- 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] ##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\uACE1\uC608\uC5D0 \uB300\uD558\uC5EC:\n&e\uACE1\uC608\uB294 mcMMO\uC758 \uC6B0\uC640\uD558\uAC8C \uC6C0\uC9C1\uC774\uB294 \uC608\uC220\uC785\uB2C8\uB2E4.\n&e\uC804\uD22C \uD2B9\uD61C\uC640 \uD658\uACBD \uC190\uC0C1 \uD2B9\uD61C\uB97C \uC99D\uAC00\uC2DC\uD0B5\uB2C8\uB2E4.\n\n&3XP \uC5BB\uAE30:\n&e\uC774 \uC2A4\uD0AC\uC758 XP\uB97C \uC5BB\uC744\uB824\uBA74 \uC804\uD22C\uB098 \uC0DD\uC874\uC5D0\uC11C \uD53C\uD574\uB97C \n&e\uC785\uB294 \uB099\uD558\uC5D0\uC11C \uCC29\uC9C0 \uD589\uB3D9\uC774 \uC694\uAD6C\uB429\uB2C8\uB2E4. +Guides.Acrobatics.Section.1=&3\uC5B4\uB5BB\uAC8C \uAD6C\uB974\uAE30\uB97C \uD558\uB098\uC694?\n&e\uB2F9\uC2E0\uC774 \uB099\uD558 \uD53C\uD574\uB97C \uBC1B\uC744 \uB54C \uD53C\uD574\uB97C \uBB34\uD6A8\uD654\uD560\n&e\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&e\uB5A8\uC5B4\uC9C0\uB294 \uB3D9\uC548 \uB450\uBC30\uC758 \uAE30\uD68C\uB97C \uAC00\uC9C0\uAC8C \uB429\uB2C8\uB2E4.\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\uC5B4\uB5BB\uAC8C \uD68C\uD53C\uB97C \uD558\uB098\uC694?\n&e\uD68C\uD53C\uB294 \uB2F9\uC2E0\uC774 \uC804\uD22C\uC5D0\uC11C \uC0C1\uCC98\uB97C \uC785\uC744 \uB54C \uC785\uB294\n&e\uD53C\uD574\uB97C \uBC18\uAC10\uC2DC\uD0A4\uB294 \uC9C0\uC18D\uC801\uC778 \uAE30\uD68C\uC785\uB2C8\uB2E4.\n&e\uC774\uAC83\uC740 \uB2F9\uC2E0\uC758 \uC2A4\uD0AC \uB808\uBCA8\uACFC \uC5F0\uACB0\uB429\uB2C8\uB2E4. ##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\uAD81\uC220\uC5D0 \uB300\uD558\uC5EC:\n&e\uAD81\uC220\uC740 \uD65C\uACFC \uD654\uC0B4\uB85C \uC3D8\uB294 \uAC83\uC744 \uB73B\uD569\uB2C8\uB2E4.\n&e\uAD81\uC220\uC740 PVP\uC5D0\uC11C \uB2F9\uC2E0\uC774 \uC801\uC744 \uD604\uD639\uC2DC\uD0A4\uB294 \uB2A5\uB825\uACFC\n&e\uB808\uBCA8 \uD06C\uAE30\uC758 \uB370\uBBF8\uC9C0 \uBD80\uC2A4\uD130\uB97C \uAC19\uC740 \uAC83\uC73C\uB85C\n&e\uC804\uD22C \uBCF4\uB108\uC2A4\uB97C \uC81C\uACF5\uD569\uB2C8\uB2E4. 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.Offline= &c\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 &e{0} \uC785\uB2C8\uB2E4 +Inspect.Stats=&amcMMO \uC2A4\uD15F\uC740 &e{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! #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.ChimaeraWing.Lore=&7\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 &e({0}\uCD08) &c\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 &e({0}\uCD08) &f\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.FluxPickaxe.Lore.1=&7\uAD11\uBB3C\uC744 \uC989\uC2DC \uC81C\uB828\uD560 \uAE30\uD68C\uB97C \uAC00\uC9D1\uB2C8\uB2E4. +Item.FluxPickaxe.Lore.2=&7\uC81C\uB828 \uC694\uAD6C \uB808\uBCA8 {0} \uC774\uC0C1 #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\uD154\uB808\uD3EC\uD2B8\uAC00 &6({0}) &7\uCD08\uC548\uC5D0 \uC2DC\uC791\uB429\uB2C8\uB2E4, \uAC00\uB9CC\uD788 \uAE30\uB2EC\uB824\uC8FC\uC138\uC694... +Teleport.Cancelled=&4\uD154\uB808\uD3EC\uD2B8 \uCDE8\uC18C\uB428! #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.Child=&6(\uD558\uC704 \uC2A4\uD0AC) +Skills.Disarmed=&4\uB2F9\uC2E0\uC740 \uBB34\uC7A5 \uD574\uC81C\uB418\uC5C8\uC2B5\uB2C8\uB2E4! +Skills.Header=-----[]&a{0}&c[]----- +Skills.NeedMore=&4\uB2F9\uC2E0\uC740 &7{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.Stats={0}&a{1}&3 XP(&7{2}&3/&7{3}&3) +Skills.ChildStats={0}&a{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.ConfirmOrCancel=&a\uB2E4\uC2DC \uC6B0-\uD074\uB9AD\uC744 \uD558\uBA74 \uD655\uC778 &6{0}&a. \uC88C-\uD074\uB9AD\uC744 \uD558\uBA74 \uCDE8\uC18C\uAC00 \uB429\uB2C8\uB2E4. #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-=\uC804\uD22C \uC2A4\uD0AC=- +Stats.Header.Gathering=&6-=\uC218\uC9D1 \uC2A4\uD0AC=- +Stats.Header.Misc=&6-=\uAE30\uD0C0 \uC2A4\uD0AC=- +Stats.Own.Stats=&a[mcMMO] \uC2A4\uD15F #PERKS Perks.XP.Name=\uACBD\uD5D8\uCE58 @@ -867,63 +867,63 @@ Perks.XP.Desc=\uD2B9\uC815 \uC2A4\uD0AC\uC5D0 \uACBD\uD5D8\uCE58 \uBD80\uC2A4\uD 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.Lucky.Bonus=&6 ({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.ActivationTime.Bonus=&6 ({0}\uCD08\uC758 \uC778\uB0B4\uB825 \uD2B9\uC804) #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.Mode.Disabled=&6[mcMMO] \uD558\uB4DC\uCF54\uC5B4 \uBAA8\uB4DC {0}\uAC00 {1}\uC5D0 \uBE44\uD65C\uC131\uD654\uB428. +Hardcore.Mode.Enabled=&6[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.DeathStatLoss.PlayerDeath=&6[mcMMO] &4\uB2F9\uC2E0\uC740 \uC8FD\uC5B4\uC11C &9{0}&4 \uB808\uBCA8\uC744 \uC783\uC5C8\uC2B5\uB2C8\uB2E4. +Hardcore.DeathStatLoss.PercentageChanged=&6[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.Vampirism.Killer.Failure=&6[mcMMO] &e{0}&7\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=&6[mcMMO] &3\uB2F9\uC2E0\uC740 &e{1}&3\uB2D8\uC73C\uB85C\uBD80\uD130 &9{0}&3 \uB808\uBCA8\uC744 \uD6D4\uCCE4\uC2B5\uB2C8\uB2E4. +Hardcore.Vampirism.Victim.Failure=&6[mcMMO] &e{0}&7\uB2D8\uC740 \uB2F9\uC2E0\uC758 \uC9C0\uC2DD\uC744 \uAC00\uC838\uAC08\uC218 \uC5C6\uC5C8\uC2B5\uB2C8\uB2E4! +Hardcore.Vampirism.Victim.Success=&6[mcMMO] &e{0}&4\uB2D8\uC740 \uB2F9\uC2E0\uC5D0\uAC8C\uC11C &9{1}&4 \uB808\uBCA8\uC744 \uD6D4\uCCD0\uAC14\uC2B5\uB2C8\uB2E4! +Hardcore.Vampirism.PercentageChanged=&6[mcMMO] \uC2A4\uD15F \uD761\uD608 \uBE44\uC728\uC774 {0}\uB85C \uBCC0\uACBD\uB418\uC5C8\uC2B5\uB2C8\uB2E4. #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.Donate=&3\uAE30\uBD80 \uC815\uBCF4: +MOTD.Hardcore.Enabled=&6[mcMMO] &3\uD558\uB4DC\uCF54\uC5B4 \uBAA8\uB4DC \uD65C\uC131\uD654\uB428: &4{0} +MOTD.Hardcore.DeathStatLoss.Stats=&6[mcMMO] &3\uB370\uC2A4 \uD328\uB110\uD2F0 \uB2A5\uB825: &4{0}% +MOTD.Hardcore.Vampirism.Stats=&6[mcMMO] &3\uBC40\uD30C\uC774\uC5B4\uB9AC\uC810 \uC2A4\uD15F \uD761\uC218: &4{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.Version=&6[mcMMO] \uAD6C\uB3D9\uC911\uC778 \uBC84\uC804 &3{0} +MOTD.Website=&6[mcMMO] &a{0}&e - mcMMO \uC6F9\uC0AC\uC774\uD2B8 # XP BAR XPBar.Template={0} -XPBar.Template.EarlyGameBoost=[[GOLD]]\uC0C8\uB85C\uC6B4\u0020\uC2A4\uD0AC\uC744\u0020\uBC30\uC6B0\uB294\u0020\uC911... -XPBar.Acrobatics=\uACE1\uC608 Lv.[[GOLD]]{0} -XPBar.Alchemy=\uC5F0\uAE08\uC220 Lv.[[GOLD]]{0} -XPBar.Archery=\uAD81\uC220 Lv.[[GOLD]]{0} -XPBar.Axes=\uBD80\uC220 Lv.[[GOLD]]{0} -XPBar.Excavation=\uBC1C\uAD74 Lv.[[GOLD]]{0} -XPBar.Fishing=\uB09A\uC2DC Lv.[[GOLD]]{0} -XPBar.Herbalism=\uC57D\uCD08\uD559 Lv.[[GOLD]]{0} -XPBar.Mining=\uCC44\uAD11 Lv.[[GOLD]]{0} -XPBar.Repair=\uC218\uB9AC Lv.[[GOLD]]{0} -XPBar.Salvage=\uD68C\uC218 Lv.[[GOLD]]{0} -XPBar.Smelting=\uC81C\uB828 Lv.[[GOLD]]{0} -XPBar.Swords=\uAC80\uC220 Lv.[[GOLD]]{0} -XPBar.Taming=\uC870\uB828 Lv.[[GOLD]]{0} -XPBar.Unarmed=\uBE44\uBB34\uC7A5 Lv.[[GOLD]]{0} -XPBar.Woodcutting=\uBC8C\uBAA9 Lv.[[GOLD]]{0} -XPBar.Complex.Template={0} [[DARK_AQUA]] {4}[[WHITE]]% [[DARK_AQUA]]([[WHITE]]{1}[[DARK_AQUA]]/[[WHITE]]{2}[[DARK_AQUA]]) +XPBar.Template.EarlyGameBoost=&6\uC0C8\uB85C\uC6B4\u0020\uC2A4\uD0AC\uC744\u0020\uBC30\uC6B0\uB294\u0020\uC911... +XPBar.Acrobatics=\uACE1\uC608 Lv.&6{0} +XPBar.Alchemy=\uC5F0\uAE08\uC220 Lv.&6{0} +XPBar.Archery=\uAD81\uC220 Lv.&6{0} +XPBar.Axes=\uBD80\uC220 Lv.&6{0} +XPBar.Excavation=\uBC1C\uAD74 Lv.&6{0} +XPBar.Fishing=\uB09A\uC2DC Lv.&6{0} +XPBar.Herbalism=\uC57D\uCD08\uD559 Lv.&6{0} +XPBar.Mining=\uCC44\uAD11 Lv.&6{0} +XPBar.Repair=\uC218\uB9AC Lv.&6{0} +XPBar.Salvage=\uD68C\uC218 Lv.&6{0} +XPBar.Smelting=\uC81C\uB828 Lv.&6{0} +XPBar.Swords=\uAC80\uC220 Lv.&6{0} +XPBar.Taming=\uC870\uB828 Lv.&6{0} +XPBar.Unarmed=\uBE44\uBB34\uC7A5 Lv.&6{0} +XPBar.Woodcutting=\uBC8C\uBAA9 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.FluxMining=\uC720\uB3D9 \uCC44\uAD74 \uD655\uB960: &e{0} +Smelting.Ability.FuelEfficiency=\uC720\uB3D9 \uD6A8\uC728\uC131 \uBC30\uC728: &e{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.Ability.VanillaXPBoost=\uBC14\uB2D0\uB77C XP \uBC30\uC728: &e{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 @@ -932,7 +932,7 @@ 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.FluxMining.Success=&a\uAD11\uBB3C\uC774 \uC7AC\uB828\uB418\uC5C8\uC2B5\uB2C8\uB2E4! Smelting.Listener=\uC81C\uB828(Smelting): Smelting.SkillName=\uC81C\uB828 @@ -978,23 +978,23 @@ Scoreboard.Header.PlayerCooldowns=mcMMO \uC7AC \uC0AC\uC6A9 \uB300\uAE30\uC2DC\u 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.PowerLevel=&6\uCD1D \uB808\uBCA8 +Scoreboard.Misc.Level=&3\uB808\uBCA8 +Scoreboard.Misc.CurrentXP=&a\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.Misc.Cooldown=&d\uC7AC \uC0AC\uC6A9 \uB300\uAE30\uC2DC\uAC04 +Scoreboard.Misc.Overall=&6\uC885\uD569 #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\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 &b\uC11C\uBC84\uAD00\uB9AC\uC790\uC640 \uC5F0\uB77D&c\uD558\uAE30\uB97C \uC6D0\uD560 \uAC83\uC785\uB2C8\uB2E4.\n&e\uB2F9\uC2E0\uC740 \uC5EC\uC804\uD788 \uC11C\uBC84\uC5D0\uC11C \uAC8C\uC784\uC911\uC774\uC9C0\uB9CC, \uB2F9\uC2E0\uC740 &lmcMMO \uB808\uBCA8\uC774 \uC5C6\uACE0&e \uB2F9\uC2E0\uC774 \uC5BB\uC740 \uC5B4\uB290 XP\uB3C4 &l\uC800\uC7A5\uB418\uC9C0 \uC54A\uC744 \uAC81\uB2C8\uB2E4&e. +Profile.Loading.AdminFailureNotice=&4[A]&c mcMMO\uB294 &e{0}&c \uD50C\uB808\uC774\uC5B4 \uB370\uC774\uD130 \uC77D\uAE30\uAC00 \uBD88\uAC00\uB2A5\uD569\uB2C8\uB2E4. &d\uB2F9\uC2E0\uC758 \uB370\uC774\uD130\uBCA0\uC774\uC2A4 \uC124\uCE58\uB97C \uAC80\uC0AC\uD574\uC8FC\uC138\uC694. 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=[[BOLD]]{0} [[RESET]]\u0028\uC774\u0029\uAC00\u0020\uB808\uBCA8\u0020 [[RESET]][[GREEN]][[BOLD]]{2}[[RESET]][[WHITE]]\u0020\uB85C\u0020\uC131\uC7A5\u0020\uD588\uC2B5\uB2C8\uB2E4. +Overhaul.Levelup=&l{0} &r\u0028\uC774\u0029\uAC00\u0020\uB808\uBCA8\u0020 &r&a&l{2}&r&f\u0020\uB85C\u0020\uC131\uC7A5\u0020\uD588\uC2B5\uB2C8\uB2E4. Overhaul.Name.Acrobatics=\uACE1\uC608 Overhaul.Name.Alchemy=\uC5F0\uAE08\uC220 Overhaul.Name.Archery=\uAD81\uC220 diff --git a/src/main/resources/locale/locale_lt_LT.properties b/src/main/resources/locale/locale_lt_LT.properties index 6a4aa83a9..399881236 100644 --- a/src/main/resources/locale/locale_lt_LT.properties +++ b/src/main/resources/locale/locale_lt_LT.properties @@ -13,7 +13,7 @@ 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.Header=&6Lucky Perks JSON.JWrapper.Perks.Lucky={0}% Better Odds JSON.Hover.Tips=Svarbu JSON.Acrobatics=Acrobatika @@ -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.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]]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[&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} [[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,46 +99,46 @@ 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 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]]Į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.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 50 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 @@ -153,8 +153,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 +182,13 @@ 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.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=Kaukolių skaldytojas Axes.SubSkill.SkullSplitter.Description=Deal AoE Damage Axes.SubSkill.SkullSplitter.Stat=Skull Splitter Duration @@ -207,13 +207,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 +224,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]]&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.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=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=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.Stat=Lobių ieškotojo rankas: &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} &bRecord: &e{5} Fishing.SubSkill.MagicHunter.Name=Magiškas žvejys Fishing.SubSkill.MagicHunter.Description=Find Enchanted Items Fishing.SubSkill.MagicHunter.Stat=Magic Hunter Chance @@ -249,25 +249,25 @@ 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.Stat=Added Bite Chance at your current location: &a+{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.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 @@ -275,12 +275,12 @@ 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.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 +290,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 +312,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 +323,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 +344,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 +352,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=&7NOTE: &e1 Tick happens every 0.5 seconds! +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 @@ -426,16 +426,16 @@ 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=Rupture: &a{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.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 +462,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 +478,23 @@ 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.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.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 @@ -517,10 +517,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 @@ -542,173 +542,173 @@ 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]]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.ArrowDeflect=&f**ARROW DEFLECT** +Combat.BeastLore=&a**BEAST LORE** +Combat.BeastLoreHealth=&3Būklė (&a{0}&3/{1}) +Combat.BeastLoreOwner=&3Savininkas (&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]]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! +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=&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.Processing=Your previous command is still being processed. Please wait. 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.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=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.GodMode.Toggle=Nemirtingumo rėžimas nustatytas: &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]]- 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.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=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.mcpurge.Success=&aThe database was successfully purged! +Commands.mcrank.Heading=&6-=ASMENINIAI ĮGŪDŽIAI=- +Commands.mcrank.Overall=Overall&a - &6Rank &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 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} 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.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=Nežinomas formulės tipas! Galimi tipai yra: &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=Š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.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=Ž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.Party.Status=&8NAME: &f{0} {1} &8LEVEL: &3{2} +Commands.Party.Status.Alliance=&8ALLY: &f{0} +Commands.Party.UnlockedFeatures=&8Unlocked Features: &7[[ITALIC]]{0} +Commands.Party.ShareMode=&8SHARE MODE: +Commands.Party.ItemShare=&7ITEM &3({0}) +Commands.Party.ExpShare=&7EXP &3({0}) +Commands.Party.ItemShareCategories=&8Sharing Items: &7[[ITALIC]]{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.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.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- Toggle ability activation with right click +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 @@ -721,69 +721,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=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 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=&cŠiuo metu Jūs neturite jokio pakvietimo! +mcMMO.NoPermission=&4Apgailestaujame, tačiau tam Jūs neturite atitinkamų leidimų! +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]]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.Help.0=&cTeisingas naudojimas: &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 +794,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 +824,216 @@ 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.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]]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 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 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 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 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 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]]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.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]]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.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.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]]-=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-=GATHERING SKILLS=- +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.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]]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=&3Donation Info: +MOTD.Hardcore.Enabled=&6[mcMMO] &3Sunkusis rėžimas aktyvuotas: &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] 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.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,33 +1081,33 @@ Commands.Description.xprate=Modify the mcMMO XP rate or start an mcMMO XP event 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.Header.PlayerStats=&emcMMO Informacija +Scoreboard.Header.PlayerCooldowns=&emcMMO Cooldowns +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=&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} 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=&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]]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) &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. diff --git a/src/main/resources/locale/locale_nl.properties b/src/main/resources/locale/locale_nl.properties index 9ecb48cad..ebdc4e956 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**VeiligeLanding** +Acrobatics.Combat.Proc=&a**Ontweken** +Acrobatics.DodgeChance=Ontwijk Kans: &e{0} Acrobatics.SubSkill.Roll.Name=Rollen Acrobatics.SubSkill.GracefulRoll.Name=Veilige Roll 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}) @@ -21,13 +21,13 @@ Archery.Skillup= Boogschieten ervaring toegenomen met {0}. Totaal ({1}) Axes.Ability.Bonus.0=Bijl Meesterschap 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.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=Kritische Klap -Axes.Combat.GI.Proc=[[GREEN]] ** GESLAGEN MET GROTE KRACHT ** +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 @@ -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 @@ -74,14 +74,14 @@ 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 @@ -92,13 +92,13 @@ 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 +109,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.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 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.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) @@ -136,27 +136,27 @@ 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=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 goed genoeg om goud te repareren. +Repair.Skills.AdeptIron=&4Je bent niet vaardig genoeg om Ijzer te repareren. +Repair.Skills.AdeptStone=&4Je bent nog niet sterk 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 @@ -166,12 +166,12 @@ 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.On=&a**GEKARTELDE SLAG GEACTIVEERD** +Swords.Skills.SS.Refresh=&aJe &eGekarteld 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 @@ -183,8 +183,8 @@ Taming.SubSkill.ShockProof.Name=Schokbestendig Taming.SubSkill.ShockProof.Description=Explosieve Schade Verkleining 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 @@ -192,16 +192,16 @@ 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 +212,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 +229,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}[[DARK)GREEN]]heeft&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,50 +256,50 @@ 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.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.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 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.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 groep uitnodiging 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.Members.Header=-----[]&aLEDEN&c[]----- Commands.Party.None=Je bent niet in een groep. Commands.Party.Quit=- Verlaat je huidige groep -Commands.Party.Teleport= [[RED]]- Teleport naar een groepslid +Commands.Party.Teleport= &c- Teleport 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.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.Skill.Leaderboard=--mcMMO &9{0}&e Ranglijst -- Commands.Stats.Self=Je status Commands.Stats=- Laat je mcMMO statussen zien Commands.ToggleAbility= - Toggle Kracht activering met rechts klikken @@ -310,43 +310,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 wijning permissions. +mcMMO.NoSkillNote=&8als je geen toegang hebt tot een vermogen, wordt die hier niet getoont 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 jou groep +Party.NotOwner=&4Jij bent niet de groepsleider. +Party.Owner.New=&a{0} is de nieuwe groep leider. +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 hebt geteleporteerd naar {0}. +Party.Teleport.Target=&a{0} is naar jou toe gedeporteerd. 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,48 +370,48 @@ 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.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.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 wachter om dit te gebruiken. &e({0}s) +Teleport.Commencing=&7Teleport 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: +MOTD.Donate=&3Donatie Info: Smelting.SubSkill.FuelEfficiency.Name=Brandstof Effici\u00ebntie Smelting.Listener=Smelten: Smelting.SkillName=SMELTEN diff --git a/src/main/resources/locale/locale_pl.properties b/src/main/resources/locale/locale_pl.properties index 48b6c3a74..960803ebf 100644 --- a/src/main/resources/locale/locale_pl.properties +++ b/src/main/resources/locale/locale_pl.properties @@ -1,6 +1,6 @@ -Acrobatics.Ability.Proc=[[GREEN]]**Mi\u0119kkie L\u0105dowanie** -Acrobatics.Combat.Proc=[[GREEN]]**Unikni\u0119to** -Acrobatics.DodgeChance=Szansa na Unik: [[YELLOW]]{0} +Acrobatics.Ability.Proc=&a**Mi\u0119kkie L\u0105dowanie** +Acrobatics.Combat.Proc=&a**Unikni\u0119to** +Acrobatics.DodgeChance=Szansa na Unik: &e{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 @@ -8,14 +8,14 @@ Acrobatics.SubSkill.GracefulRoll.Description=Dwukrotnie bardziej efektywne niz z 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.SubSkill.Roll.Chance=Szansa na Przewr\u00f3t: &e{0} +Acrobatics.SubSkill.Roll.GraceChance=Szansa na \u0141agodny Przewr\u00f3t: &e{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.Combat.DazeChance=Szansa na Oszolomienie: &e{0} +Archery.Combat.RetrieveChance=Szansa na Odzyskanie Strza\u0142: &e{0} +Archery.Combat.SkillshotBonus=Dodatkowe Obra\u017cenia dla Umiej\u0119tno\u015bci: &e{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 @@ -31,14 +31,14 @@ 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.Ability.Lower=&7**CHOWASZ SIEKIERE** +Axes.Ability.Ready=&a**PRZYGOTOWUJESZ SWOJ\u0104 SIEKIERE** +Axes.Combat.CritStruck=&4Trafiono cie krytycznie! +Axes.Combat.CritChance=Szansa na Trafienie Krytyczne: &e{0} Axes.Combat.CriticalHit=TRAFIENIE KRYTYCZNE! -Axes.Combat.GI.Proc=[[GREEN]]**UDERZONO Z WIELK\u0104 MOC\u0104** +Axes.Combat.GI.Proc=&a**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.Combat.SS.Length=D\u0142ugo\u015bc \u0141amacza Czaszki: &e{0}s Axes.SubSkill.SkullSplitter.Name=\u0141amacz Czaszek Axes.SubSkill.SkullSplitter.Description=Zadaje obra\u017cenia obszarowe Axes.SubSkill.CriticalStrikes.Name=Krytyczne Uderzenia @@ -52,35 +52,35 @@ Axes.SubSkill.GreaterImpact.Description=Zadaje dodatkowe obra\u017cenia nieopanc 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.Skills.SS.On=&a**\u0141amacz Czaszek AKTYWOWANY** +Axes.Skills.SS.Refresh=&aTwoja zdolno\u015b\u0107 &e\u0141amacz Czaszek &ajest ju\u017c dost\u0119pna! +Axes.Skills.SS.Other.Off=\u0141amacz Czaszek&a si\u0119 sko\u0144czy\u0142 &e{0} +Axes.Skills.SS.Other.On=&a{0}&2 u\u017cy\u0142 &c\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.Ability.Lower=&7**CHOWASZ \u0141OPAT\u0118** +Excavation.Ability.Ready=&a**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.Effect.Length=D\u0142ugo\u015bc Mia\u017cdz\u0105cego Wiert\u0142a: &e{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.Skills.GigaDrillBreaker.On=&a**MIA\u017bDZ\u0104CE WIERT\u0141O AKTYWOWANE** +Excavation.Skills.GigaDrillBreaker.Refresh=&aTwoja zdolno\u015b\u0107 &eMia\u017cdz\u0105ce Wiert\u0142o &ajest ju\u017c dost\u0119pna! +Excavation.Skills.GigaDrillBreaker.Other.Off=Mia\u017cdz\u0105ce Wiert\u0142o&a si\u0119 sko\u0144czy\u0142o &e{0} +Excavation.Skills.GigaDrillBreaker.Other.On=&a{0}&2 u\u017cy\u0142 &cMia\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.Chance=Szansa na zlapanie ryby: &e{0} +Fishing.Ability.Info=Magiczny \u0141owca: &7 **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.Rank=Ranga lowienia skarbow: &e{0}/5 +Fishing.Ability.TH.MagicRate=Szanse na Magicznego \u0141owc\u0119: &e{0} +Fishing.Ability.Shake=Szansa na Wstrz\u0105s: &e{0} Fishing.Ability.IceFishing=Lodowe lowienie ryb: Idz lowic ryby w lodzie -Fishing.Ability.FD=Dieta Rybaka: [[YELLOW]]Ranga {0} +Fishing.Ability.FD=Dieta Rybaka: &eRanga {0} Fishing.SubSkill.TreasureHunter.Name=Lowca Skarbow (Pasywna) Fishing.SubSkill.TreasureHunter.Description=\u0141owi\u0107 r\u00f3\u017cne obiekty Fishing.SubSkill.MagicHunter.Name=Magiczny Lowca @@ -92,22 +92,22 @@ Fishing.SubSkill.FishermansDiet.Description=Zwi\u0119ksza nasycenie posi\u0142k\ 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.Chance.Raining=&9 Bonus od Deszczu Fishing.Listener=Rybactwo -Fishing.Ability.TH.MagicFound=[[GRAY]]Wyczuwasz w pobli\u017cu \u017ar\u00f3d\u0142o magii... +Fishing.Ability.TH.MagicFound=&7Wyczuwasz 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.DoubleDropChance=Szansa na Podw\u00f3jny Drop: &e{0} +Herbalism.Ability.FD=Dieta Farmera: &ePoziom {0} +Herbalism.Ability.GTe.Length=D\u0142ugo\u015b\u0107 ?Green Terra?: &e{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.Ability.GTh.Chance=Szansa na Zielony Palec: &e{0} +Herbalism.Ability.GTh.Fail=&a**ZIELONY PALEC SI\u0118 NIE UDA\u0141** +Herbalism.Ability.GTh.Stage=Etap Zielonego Dotyku: &e Ro\u015bliny rosn\u0105 w etapie {0} +Herbalism.Ability.GTh=&a**ZIELONY PALEC** +Herbalism.Ability.HylianLuck=Szansa na Szczescie Hylian: &e{0} +Herbalism.Ability.Lower=&7**CHOWASZ SWOJ\u0104 MOTYKE** +Herbalism.Ability.Ready=&a**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) @@ -119,20 +119,20 @@ 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.HylianLuck=&aSzczescie 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.Skills.GTe.On=&a**?GREEN TERRA? AKTYWOWANA** +Herbalism.Skills.GTe.Refresh=&aTwoja zdolno\u015b\u0107 &e?Green Terra?&ajest ju\u017c gotowa! +Herbalism.Skills.GTe.Other.Off=?Green Terra?&a si\u0119 sko\u0144czy\u0142o &e{0} +Herbalism.Skills.GTe.Other.On=&a{0}&2 u\u017cy\u0142 &c?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.Length=D\u0142ugo\u015bc Super Kopacza: &e{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.Ability.Lower=&7**CHOWASZ SW\u00d3J KILOF** +Mining.Ability.Ready=&a**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 @@ -143,21 +143,21 @@ 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.Effect.Decrease=Redukcja Obra\u017ce\u0144 od Materia\u0142\u00f3w Wybuchowych: &e{0} +Mining.Effect.DropChance=Szansa na Podw\u00f3jny Drop: &e{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.Skills.SuperBreaker.On=&a**SUPER \u0141AMACZ AKTYWOWANY** +Mining.Skills.SuperBreaker.Other.Off=Super Kopacz&a si\u0119 sko\u0144czy\u0142 &e{0} +Mining.Skills.SuperBreaker.Other.On=&a{0}&2 u\u017cy\u0142 &cSuper Kopacza! +Mining.Skills.SuperBreaker.Refresh=&aTwoja zdolno\u015b\u0107 &eSuper \u0141amacz &ajest 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! +Mining.Blast.Boom=&7**BOOM** +Mining.Blast.Radius.Increase=Zasi\u0119g zwi\u0119kszony o: &e+{0} +Mining.Blast.Rank=Szybki Kopacz: &e Ranga {0}/8 &7({1}) +Mining.Blast.Other.On=&a{0}&2 u\u017cy\u0142 &cSzybkiego Kopacza! +Mining.Blast.Refresh=&aTwoja zdolno\u015b\u0107 &eB\u0142yskawiczny Kopacz &ajest 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) @@ -176,46 +176,46 @@ 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.Error=&4mcMMO napotka\u0142 problem pr\u00f3buj\u0105c naprawi\u0107 ten przedmiot! +Repair.Listener.Anvil=&4Postawi\u0142e\u015b kowad\u0142o - kowad\u0142a s\u0142u\u017c\u0105 do naprawiania narz\u0119dzi i zbroi. +Repair.Listener.Anvil2=&4Postawi\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.Skills.AdeptSalvage=&4Nie masz odpowiedniego poziomu aby Odzyskiwa\u0107 przedmioty. +Repair.Skills.AdeptDiamond=&4Masz za niski poziom aby naprawia\u0107 diament. +Repair.Skills.AdeptGold=&4Masz za niski poziom aby naprawia\u0107 z\u0142oto. +Repair.Skills.AdeptIron=&4Masz za niski poziom aby naprawia\u0107 \u017celazo. +Repair.Skills.AdeptStone=&4Masz za niski poziom aby naprawi\u0107 kamie\u0144. +Repair.Skills.Adept=Musisz mie\u0107 &e{0}&c poziom \u017ceby naprawi\u0107 &e{1} +Repair.Skills.FeltEasy=&7Bu\u0142ka z mas\u0142em. +Repair.Skills.FullDurability=&7Ten przedmiot jest ju\u017c w pe\u0142ni sprawny. +Repair.Skills.SalvageSuccess=&7Przedmiot Odzyskany! +Repair.Skills.NotFullDurability=&4Nie mo\u017cesz odzyska\u0107 uszkodzonych przedmiot\u00f3w. +Repair.Skills.Mastery=Mistrzostwo Napraw: &e {0} dodatkowej wytrzyma\u0142o\u015bci dla przedmiot\u00f3w +Repair.Skills.StackedItems=&4Nie mo\u017cesz naprawia\u0107 zestackowanych przedmiot\u00f3w. +Repair.Skills.Super.Chance=Szansa Super Naprawy: &e{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.Chance.Downgrade=&7AF Szansa na zdegradowanie: &e{0}% +Repair.Arcane.Chance.Success=&7AF Szanse na sukces: &e{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! +Repair.Arcane.Perfect=&aNasyci\u0142e\u015b ten przedmiot magiczn\u0105 moc\u0105. +Repair.Arcane.Rank=Kowalstwo Ezoteryczne: &eRanga {0}/4 +Swords.Ability.Lower=&7**CHOWASZ SW\u00d3J MIECZ** +Swords.Ability.Ready=&a **PODNIOSLES SWOJ MIECZ** +Swords.Combat.Bleed.Chance=Szansa na Krwawienie: &e{0} +Swords.Combat.Bleed.Length=D\u0142ugo\u015bc Krwotoku: &e{0} ticks +Swords.Combat.Bleed.Note=&7NOTE: &e1 tykni\u0119cie zdarza si\u0119 co 2 sekundy +Swords.Combat.Bleeding.Started=&4 Krwawisz! +Swords.Combat.Bleeding.Stopped=&7Krwawienie &austa\u0142o&7! +Swords.Combat.Bleeding=&a**PRZECIWNIK KRAWI** +Swords.Combat.Counter.Chance=Szansa na Kontratak: &e{0} +Swords.Combat.Counter.Hit=&4Kontratak! +Swords.Combat.Countered=&a**KONTR-ATAK** +Swords.Combat.SS.Struck=&4Zosta\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 @@ -226,12 +226,12 @@ 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.Skills.SS.On=&a**?Z\u0104BKOWANY? ATAK AKTYWOWANY** +Swords.Skills.SS.Refresh=&aTw\u00f3j &eZ\u0105bkowany Atak &ajest ju\u017c dost\u0119pny! +Swords.Skills.SS.Other.Off=Z\u0105bkowany Atak&a si\u0119 sko\u0144czy\u0142 &e{0} +Swords.Skills.SS.Other.On=&a{0}&2 u\u017cy\u0142 &cZ\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 +Swords.SS.Length=D\u0142ugo\u015b\u0107 Z\u0105bkowanego Ataku: &e{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 @@ -248,15 +248,15 @@ 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.Combat.Chance.Gore=Szansa na Brutalno\u015b\u0107: &e{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.CallOfTheWild.Description.2=&7COTW (Ocelot): Kucnij i kliknij LPM {0} z ryb\u0105 w r\u0119ce +Taming.Effect.15=&7COTW (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 @@ -267,23 +267,23 @@ 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.Wolf=&8Tw\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.Complete=&aPrzywo\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.Berserk.Length=D\u0142ugo\u015b\u0107 Berserka: &e{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.Chance.ArrowDeflect=Szansa na Odbicie Strza\u0142y: &e{0} +Unarmed.Ability.Chance.Disarm=Szansa na Rozbrojenie: &e{0} +Unarmed.Ability.Chance.IronGrip=Szansa za Zelazny Chwyt: &e{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.Ability.IronGrip.Defender=&aTw\u00f3j \u017belazny Uchwyt uchroni\u0142 ci\u0119 przed Rozbrojeniem! +Unarmed.Ability.Lower=&7**OPUSZCZASZ SWOJE PI\u0118\u015aCI** +Unarmed.Ability.Ready=&a**PRZYGOTOWUJESZ SWOJE PIESCI** Unarmed.SubSkill.Berserk.Name=Berserk (Zdolnosc) Unarmed.SubSkill.Berserk.Description=+50% DMG, Niszczy slabe materialy Unarmed.SubSkill.Disarm.Name=Rozbrojenie @@ -297,15 +297,15 @@ 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.Skills.Berserk.On=&a**BERSERK AKTYWOWANY** +Unarmed.Skills.Berserk.Other.Off=Berserk&a si\u0119 sko\u0144czy\u0142 &e{0} +Unarmed.Skills.Berserk.Other.On=&a{0}&2 u\u017cy\u0142 &cBerserka! +Unarmed.Skills.Berserk.Refresh=&aTwoja zdolno\u015b\u0107 &eBerserka &ajest 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.Chance.DDrop=Szansa na Dwukrotny Drop: &e{0} +Woodcutting.Ability.Length=D\u0142ugo\u015bc Powalacza Drzew: &e{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 @@ -316,35 +316,35 @@ Woodcutting.SubSkill.HarvestLumber.Description=Podwaja ilo\u015b\u0107 zdobywany Woodcutting.Listener=\u0052\u0105\u0062\u0061\u006e\u0069\u0065 Woodcutting.SkillName=\u0052\u0105\u0062\u0061\u006e\u0069\u0065 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.On=&a**POWALACZ DRZEW AKTYWOWANY** +Woodcutting.Skills.TreeFeller.Refresh=&aTwoja zdolno\u015b\u0107 &ePowalacz Drzew &a jest ju\u017c dost\u0119pna! +Woodcutting.Skills.TreeFeller.Other.Off=Powalenie Drzewa&a si\u0119 sko\u0144czy\u0142o &e{0} +Woodcutting.Skills.TreeFeller.Other.On=&a{0}&2 u\u017cy\u0142 &cPowalacza 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** +Ability.Generic.Refresh=&a**UMIEJ\u0118TNO\u015aCI DOST\u0118PNE!** +Ability.Generic.Template.Lock=&7{0} +Ability.Generic.Template=&6{0}: &3{1} +Combat.ArrowDeflect=&f**ODBICIE STRZALY** +Combat.BeastLore=&a**WIEDZA O ZWIERZETACH** +Combat.BeastLoreHealth=&3\u017bycie (&a{0}&3/{1}) +Combat.BeastLoreOwner=&3Wlasciciel (&c{0}&3) +Combat.Gore=&a**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! +Combat.TargetDazed=Cel zostal &4oszolomiony. +Combat.TouchedFuzzy=&4Zostales oszolomiony. +mcMMO.Description=&3O &emcMMO&3 Project:,&6mcMMO jest &copen source&6 modem RPG stworzonym w lutym 2011 r.,&6przez &9nossr50&6. Celem jest wprowadzenie doswiadczen RPG.,&3Porady:,&6 - &aUzywaj &c/mcmmo help&a by zobaczyc komendy,&6 - &aPisz &c/NAZWA_UMIEJETNOSCI&a by zobaczyc informacje na jej temat,&3Programisci:,&6 - &anossr50 &9(Zalozyciel),&6 - &aGJ &9(Manager projektu),&6 - &aNuclearW &9(Developer),&6 - &abm01 &9(Developer),&6 - &aTfT_02 &9(Developer),&6 - &aGlitchfinder &9(Developer),&6 - &at00thpick1 &9(Developer),&3Przydatne linki:,&6 - &ahttps://github.com/mcMMO-Dev/mcMMO/issues&6 Zglaszanie bled\u00f3w,&6 - &a#mcmmo @ irc.esper.net&6 IRC Chat, +Commands.addlevels.AwardAll.1=&aOtrzyma\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.1=&aZdoby\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.addxp.AwardAll=&aOtrzyma\u0142e\u015b {0} XP\'a we wszystkich dziedzinach! +Commands.addxp.AwardSkill=&aOtrzyma\u0142e\u015b {0} XP\'a we dziedzinie {1}! +Commands.Ability.Off=Umiej\u0119tno\u015b\u0107 wy\u0142\u0105czona &c +Commands.Ability.On=Umiej\u0119tno\u015b\u0107 w\u0142\u0105czona &a +Commands.AdminChat.Off=Czat tylko dla adminow &c Wylaczony +Commands.AdminChat.On=Czat tylko dla adminow &c W\u0142\u0105czony Commands.AdminToggle=- Wlacza/wylacza czat adminow Commands.Chat.Console=\"Konsola\" Commands.Disabled=Komenda ta jest wylaczona. @@ -352,72 +352,72 @@ 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.Inspect= &c- Pokazuje informacje o graczu +Commands.Party.Invite.Accepted=&aZaproszenie zaakceptowane. Do\u0142\u0105czy\u0142e\u015b do dru\u017cyny {0} +Commands.Invite.Success=&aPomyslnie wyslano zaproszenie +Commands.Leaderboards= &c- Rankingi +Commands.mcc.Header=---[]&emcMMO Komendy&c[]--- 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.mcpurge.Success=&aBaza danych zosta\u0142a wyczyszczona! +Commands.mcrank.Heading=&6-=OSOBISTE RANKINGI=- +Commands.mcrank.Overall=Og\u00f3lne Statystyki&a - &6Ranga &f#&a{0} +Commands.mcrank.Player=CEL: &f{0} +Commands.mcrank.Skill={0}&a - &6Ranga &f#&a{1} +Commands.mcrank.Unranked=&fBez Rangi +Commands.mcrefresh.Success=Umiejetnosci &c{0} zostaly odnowione. +Commands.mcremove.Success=&a{0} zosta\u0142 usuni\u0119ty z bazy danych! +Commands.mctop.Tip=&6Porada: Wpisz &c/mcrank&6 aby zobaczy\u0107 swoje rankingi! +Commands.mmoedit=[player] &c - Modyfikuje cel +Commands.mmoedit.Modified.1=&aTw\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.Notifications.Off=Informacje na temat umiejetnosci &cwylaczone +Commands.Notifications.On=Informacje na temat umiejetnosci &awlaczone +Commands.Other=&a--POZOSTA\u0141E KOMENDY-- +Commands.Party.Header=-----[]&aDRUZYNA&c[]----- +Commands.Party.ShareMode=&8TRYB DZIELENIA SIE: +Commands.Party.ItemShare=&7PRZEDMIOT &3({0}) +Commands.Party.ExpShare=&7EXP &3({0}) +Commands.Party.MembersNear=&8OBOK CIEBIE &3{0}&8/&3{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.Chat.Off=Czat wy\u0142acznie dla dru\u017cyny &cOff +Commands.Party.Chat.On=Czat wy\u0142acznie dla dru\u017cyny w\u0142\u0105czony &c +Commands.Party.Commands=&a--KOMENDY DLA DRU\u017bYN-- +Commands.Party.Invite.0=ALERT: &aOtrzyma\u0142e\u015b zaproszenie do dru\u017cyny {0} od {1} +Commands.Party.Invite.1=Wpisz &a/party accept&e 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.Join=&7Dolaczono do druzyny: {0} +Commands.Party.Create=&7Utworzono druzyne: {0} +Commands.Party.Rename=&7Nazwa druzyny zmieniona na: &f{0} +Commands.Party.SetSharing=&7Druzyny {0} dzielenie sie przedmiotami ustawiono na: &3{1} +Commands.Party.AlreadyExists=&4Druzyna {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.Members.Header=-----[]&aCZLONKOWIE&c[]----- 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.Teleport= &c- 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.Enabled=Teleportacja druzynowa &aaktywna +Commands.ptp.Disabled=Teleportacja druzynowa &cwylaczona 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.Request1={0} &achce sie steleportowac do Ciebie. +Commands.ptp.Request2=&aBy sie steleportowac, wpisz &e/ptp accept. &aZadanie wygasa po &c{0} &asekundach. +Commands.ptp.AcceptAny.Disabled=Potwierdzenie zadania teleportacji druzynowej &cwylaczone 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.PowerLevel.Leaderboard=--mcMMO&9 Poziom Mocy &eRanking-- +Commands.PowerLevel.Capped=&4POZIOM MOCY: &a{0} &4MAKSYMALNY POZIOM: &e{1} +Commands.PowerLevel=&4POZIOM MOCY: &a{0} +Commands.Reset.All=&aWszystkie twoje umiej\u0119tno\u015bci zosta\u0142y zresetowane. +Commands.Reset.Single=&aTw\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.Skill.Leaderboard=--mcMMO &9{0}&e Ranking-- Commands.SkillInfo=- Zobacz szczeg\u00f3lowe informacje na temat tej umiejetnosci Commands.Stats.Self=TWOJE STATYSTYKI Commands.Stats=- Zobacz swoje statystyki @@ -433,42 +433,42 @@ 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. +mcMMO.NoPermission=&4Nie wystarczaj\u0105ce uprawnienia. +mcMMO.NoSkillNote=&8Je\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.Help.9=Uzyj &3{0} &cby dzielic sie przedmiotami z czlonkami druzyny +Party.Help.10=Uzyj &3{0} &cby aktywowac dzielenie sie XP z czlonkami druzyny +Party.InformedOnJoin={0} &adolaczyl do Twojej druzyny +Party.InformedOnQuit={0} &aopuscil Twoja druzyne +Party.InformedOnNameChange=&6{0} &azmienil nazwe druzyny na &f{1} +Party.InvalidName=&4Nie 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.NotInYourParty=&4{0} nie jest cz\u0142onkiem twojej dru\u017cyny. +Party.NotOwner=&4Nie jeste\u015b liderem grupy. +Party.Owner.New=&a{0} jest nowym liderem grupy. +Party.Owner.NotLeader=&4Nie jeste\u015b ju\u017c liderem grupy. +Party.Owner.Player=&aJeste\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.Password.Set=&aHaslo grupy zmienione na: {0} +Party.Password.Removed=&aHaslo druzyny zostalo wyczyszczone. Party.Player.Invalid=Nie ma takiego gracza. -Party.NotOnline=[[DARK_RED]]{0} jest offline! +Party.NotOnline=&4{0} jest offline! Party.Player.InSameParty={0} juz jest w Twojej druzynie! -Party.PlayerNotInParty=[[DARK_RED]]{0} nie jest w druzynie +Party.PlayerNotInParty=&4{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.Player=&aTeleportowa\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.Target=&a{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.Unlocked=&7Grupa jest otwarta dla wszystkich. +Party.Disband=&7Druzyna zostala rozwiazana +Party.Status.Locked=&4(TYLKO NA ZAPROSZENIE) Party.ShareType.Xp=EXP Party.ShareType.Item=PRZEDMIOTOWY Party.ShareMode.Equal=R\u00d3WNY @@ -492,72 +492,72 @@ Commands.XPGain.Swords=Atak potworow Commands.XPGain.Taming=Oswoj zwierze, lub walcz ze swoimi wilkami. Commands.XPGain.Unarmed=Atak potworow Commands.XPGain.Woodcutting=\u0052\u0105\u0062\u0061\u006e\u0069\u0065 -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.XPGain=[[DARK_GRAY]Zdobyte do\u015bwiadczenie: &f{0} +Commands.xplock.locked=&6Tw\u00f3j pasek XP\'a jest zablokowany {0}! +Commands.xplock.unlocked=&6Tw\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.over=&6Event&c 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! +Commands.xprate.started.0=&6EVENT zwi\u0119kszonego zdobywania XP\'a w\u0142a\u015bnie si\u0119 zacz\u0105\u0142! +Commands.xprate.started.1=&6Mno\u017cnik zdobywania XP\'a wynosi {0}x! +XPRate.Event=&6mcMMO is currently in an XP rate event! XP rate is {0}x! Effects.Effects=EFEKTY -Effects.Child=[[DARK_GRAY]]LVL: [[GREEN]]{0} -Effects.Level=[[DARK_GRAY]]Poziom: [[GREEN]]{0} [[DARK_AQUA]]Doswiadczenie[[YELLOW]]([[GOLD]]{1}[[YELLOW]]/[[GOLD]]{2}[[YELLOW]]) -Effects.Parent=[[GOLD]]{0} - -Effects.Template=[[DARK_AQUA]]{0}: [[GREEN]]{1} -Guides.Available=[[GRAY]]Przewodnik dla {0} jest dost\u0119pny - wpisz /{1} ? [strona] -Guides.Header=[[GOLD]]-=[[GREEN]]{0} Przewodnik[[GOLD]]=- +Effects.Child=&8LVL: &a{0} +Effects.Level=&8Poziom: &a{0} &3Doswiadczenie&e(&6{1}&e/&6{2}&e) +Effects.Parent=&6{0} - +Effects.Template=&3{0}: &a{1} +Guides.Available=&7Przewodnik dla {0} jest dost\u0119pny - wpisz /{1} ? [strona] +Guides.Header=&6-=&a{0} Przewodnik&6=- 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.OfflineStats=Statystyki Gracza Offline &e{0} +Inspect.Stats=&aStatystyki Gracza &e{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]]) +Item.ChimaeraWing.Lore=&7Teleportuje Cie do Twojego l\u00f3zka. +Item.Generic.Wait=Musisz poczekac, nim bedziesz m\u00f3gl uzyc tego ponownie! &e({0}s) +Item.Injured.Wait=Zosta\u0142e\u015b ostatnio ranny i musisz poczeka\u0107 aby tego u\u017cy\u0107. &e({0}s) +Teleport.Commencing=&7Teleportacja za &6({0}) &7sekund, nie ruszaj sie... +Teleport.Cancelled=&4Teleportacja anulowana! +Skills.Disarmed=&4Zostales rozbrojony! +Skills.Header=-----[]&a{0}&c[]----- +Skills.NeedMore=&4Potrzebujesz wiecej +Skills.Stats={0}&a{1}&3 XP(&7{2}&3/&7{3}&3) 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 +Skills.ConfirmOrCancel=&aPrawy-klik ponownie by potwierdzic &6{0}&a. Lewy-klik by anulowac. +Stats.Header.Combat=&6-=UMIEJ\u0118TNO\u015aCI BOJOWE=- +Stats.Header.Gathering=&6-=UMIEJ\u0118TNO\u015aCI ZBIERANIA=- +Stats.Header.Misc=&6-=ROZNE UMIEJETNOSCI=- +Stats.Own.Stats=&a[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.Lucky.Bonus=&6 ({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}% +Perks.ActivationTime.Bonus=&6 ({0}s ze zdolno\u015bci\u0105 Wytrzyma\u0142o\u015bci) +MOTD.Donate=&3Informacje o Dotacji: +MOTD.Hardcore.DeathStatLoss.Stats=&6[mcMMO] &3Kara za \u015amier\u0107: &4{0}% +MOTD.Hardcore.Vampirism.Stats=&6[mcMMO] &3Statystyki Wampirycznych Pijawek: &4{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 +MOTD.Version=&6[mcMMO] Obecna Wersja &3{0} +MOTD.Website=&6[mcMMO] &a{0}&e - Strona mcMMO +Smelting.Ability.FuelEfficiency=Mnoznik wydajnosci paliwa: &e{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.Ability.SecondSmelt=Szansa na drugie przetopienie: &e{0} +Smelting.Ability.VanillaXPBoost=Vanilla mnoznik XP: &e{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 @@ -565,7 +565,7 @@ 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.FluxMining.Success=&aZloze przetopilo sie samoistnie! Smelting.Listener=Przetapianie: Smelting.SkillName=PRZETAPIANIE Commands.Description.adminchat=Wlacza/wylacza czat admin\u00f3w lub wysyla wiadomosc na czat admin\u00f3w diff --git a/src/main/resources/locale/locale_pt_BR.properties b/src/main/resources/locale/locale_pt_BR.properties index 044af17af..be23c6119 100644 --- a/src/main/resources/locale/locale_pt_BR.properties +++ b/src/main/resources/locale/locale_pt_BR.properties @@ -1,7 +1,7 @@ #ACROBACIA -Acrobatics.Ability.Proc=[[GREEN]]**Aterrissagem Elegante** -Acrobatics.Combat.Proc=[[GREEN]]**Esquivou** -Acrobatics.DodgeChance=[[RED]]Chance de Esquivar: [[YELLOW]]{0} +Acrobatics.Ability.Proc=&a**Aterrissagem Elegante** +Acrobatics.Combat.Proc=&a**Esquivou** +Acrobatics.DodgeChance=&cChance de Esquivar: &e{0} Acrobatics.Effect.0=Rolamento Acrobatics.Effect.1=Reduz ou nega o dano de queda Acrobatics.Effect.2=Rolamento Melhor @@ -9,11 +9,11 @@ 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.Listener=Acrobacia: -Acrobatics.Roll.Chance=[[RED]]Chance de Rolar: [[YELLOW]]{0} -Acrobatics.Roll.GraceChance=[[RED]]Chance de Rolar Melhor: [[YELLOW]]{0} +Acrobatics.Roll.Chance=&cChance de Rolar: &e{0} +Acrobatics.Roll.GraceChance=&cChance de Rolar Melhor: &e{0} Acrobatics.Roll.Text=**Rolou** Acrobatics.SkillName=ACROBACIA -Acrobatics.Skillup=[[YELLOW]]Habilidade de Acrobacia aumentada para {0}. Total ({1}) +Acrobatics.Skillup=&eHabilidade de Acrobacia aumentada para {0}. Total ({1}) #ALQUIMIA Alchemy.Effect.0=Catalise @@ -22,16 +22,16 @@ Alchemy.Effect.2=Misturas Alchemy.Effect.3=Pocoes de fermentacao com mais ingredientes 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.Catalysis.Speed=&cVelocidade de Infusao: &e{0} +Alchemy.Concoctions.Rank=&cClassificacao de misturas: &e{0}/{1} +Alchemy.Concoctions.Ingredients=&cIngredientes [&e{0}&c]: &e{1} Alchemy.SkillName=ALQUIMIA -Alchemy.Skillup=[[YELLOW]]Habilidade de Alquimia aumentada para {0}. Total ({1}) +Alchemy.Skillup=&eHabilidade 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.Combat.DazeChance=&cChance de Atordoar: &e{0} +Archery.Combat.RetrieveChance=&cChance de Recuperar Flechas: &e{0} +Archery.Combat.SkillshotBonus=&cDano Extra da Habilidade de Atirar: &e{0} Archery.Effect.0=Habilidade de Tiro Archery.Effect.1=Aumenta o dano feito com arcos Archery.Effect.2=Atordoar (Jogadores) @@ -40,7 +40,7 @@ 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}) +Archery.Skillup=&eHabilidade com Arcos aumentada para {0}. Total ({1}) #MACHADOS Axes.Ability.Bonus.0=Dominio do Machado @@ -49,15 +49,15 @@ 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.Ability.Lower=&7**VOCE ABAIXA SEU MACHADO** +Axes.Ability.Ready=&a**VOCE PREPARA SEU MACHADO** +Axes.Combat.CritStruck=&4Voce levou um dano CRITICO! +Axes.Combat.CritChance=&cChance de ataque critico: &e{0} +Axes.Combat.CriticalHit=&cDANO CRITICO! +Axes.Combat.GI.Proc=&a**GOLPEADO COM UMA GRANDE FORCA** +Axes.Combat.GI.Struck=&c**ATINGIDO POR UM GRANDE IMPACTO** +Axes.Combat.SS.Struck=&4Atingido por RACHA CRANIOS! +Axes.Combat.SS.Length=&cDuracao do Racha Cranios: &e{0}s Axes.Effect.0=Racha Cranios (Habilidade) Axes.Effect.1=Oferece dano AoE Axes.Effect.2=Ataques craticos @@ -70,42 +70,42 @@ Axes.Effect.8=Impacto Maior Axes.Effect.9=Oferece dano extra aos 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=&c**Racha Cranios foi desagastado** +Axes.Skills.SS.On=&a**Racha Cranios ATIVADO** +Axes.Skills.SS.Refresh=&aSua habilidade &eRacha Cranios &afoi refrescada! +Axes.Skills.SS.Other.Off=&cRacha Cranios&a foi desgastado para &e{0} +Axes.Skills.SS.Other.On=&a{0}&2 usou &cRacha Cranios! +Axes.Skillup=&eHabilidade com Machados foi aumentada para {0}. Total ({1}) #EXCAVAcaO -Excavation.Ability.Lower=[[GRAY]]**VOCE ABAIXA SUA PA** -Excavation.Ability.Ready=[[GREEN]]**VOCE PREPARA SUA PA** +Excavation.Ability.Lower=&7**VOCE ABAIXA SUA PA** +Excavation.Ability.Ready=&a**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.Effect.Length=&cDuracao da Britadeira: &e{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}) +Excavation.Skills.GigaDrillBreaker.Off=&c**Britadeira foi desgastada** +Excavation.Skills.GigaDrillBreaker.On=&a**BRITADEIRA ATIVADA** +Excavation.Skills.GigaDrillBreaker.Refresh=&aSua habilidade &eBritadeira &afoi refrescada! +Excavation.Skills.GigaDrillBreaker.Other.Off=&cBritadeira&a foi desativada para &e{0} +Excavation.Skills.GigaDrillBreaker.Other.On=&a{0}&2 usou &cBritadeira! +Excavation.Skillup=&eHabilidade de Escavacao aumentada para {0}. Total ({1}) #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.Chance=&cChance de Mordida: &e{0} +Fishing.Ability.Info=&cCacador Magico: &7 **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.Ability.Rank=&cRank de Cacador de Tesouro: &e{0}/{1} +Fishing.Ability.TH.DropRate=&c Chance de Drop: &4Armadilhas: &e{0} &7Comum: &e{1} &aIncomum: &e{2}\n&9Raro: &e{3} &depico: &e{4} &6LegenDario: &e{5} &bRegistro: &e{6} +Fishing.Ability.TH.MagicRate=&cChance de Cacador Magico: &e{0} +Fishing.Ability.Shake=&cChance de Sacudida: &e{0} +Fishing.Ability.IceFishing=&cPescando no Gelo: VA pescar no gelo +Fishing.Ability.FD=&cDieta do Pescador: &eRank {0} Fishing.Effect.0=Cacador de Tesouros (Passivo) Fishing.Effect.1=Pesca de objetos variados Fishing.Effect.2=Cacador Magico @@ -118,28 +118,28 @@ 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.Chance.Raining=&9 Bonus 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=&7VOCE sentiu um toque de magia nesta pescada... +Fishing.Ability.TH.Boom=&7EPOCA DE CRESCIMENTO!!! +Fishing.Ability.TH.Poison=&7Algo nao cheira bem... Fishing.SkillName=PESCA -Fishing.Skillup=[[YELLOW]]Habilidade de Pesca aumentada para {0}. Total ({1}) +Fishing.Skillup=&eHabilidade 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.Ability.DoubleDropChance=&cChance de Drop Duplo: &e{0} +Herbalism.Ability.FD=&cDieta do Fazendeiro: &eRank {0} +Herbalism.Ability.GTe.Length=&cDuracao da Terra Verde: &e{0}s +Herbalism.Ability.GTe.NeedMore=&cVOCE precisa de mais sementes para usar Terra Verde. +Herbalism.Ability.GTh.Chance=&cChance de Dedao Verde: &e{0} +Herbalism.Ability.GTh.Fail=&c**DEDAO VERDE FALHOU** +Herbalism.Ability.GTh.Stage=&cEstagio do Dedao Verde: &e As plantas crescem em estagio {0} +Herbalism.Ability.GTh=&a**DEDAO VERDE** +Herbalism.Ability.HylianLuck=&cChance de Sorte de Hylian: &e{0} +Herbalism.Ability.Lower=&7**VOCE ABAIXA SUA ENXADA** +Herbalism.Ability.Ready=&a**VOCE PREPARA SUA ENXADA** +Herbalism.Ability.ShroomThumb.Chance=&cChance de Dedo Cogumelo: &e{0} +Herbalism.Ability.ShroomThumb.Fail=&c**DEDO COGUMELO FALHOU** Herbalism.Effect.0=Terra Verde (HABILIDADE) Herbalism.Effect.1=Espalha a Terra, 3x Drops Herbalism.Effect.2=Dedao Verde (Trigo) @@ -154,23 +154,23 @@ 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.HylianLuck=&aA Sorte de Hylian esta com VOCE 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=&c**Terra Verde foi desagastado** +Herbalism.Skills.GTe.On=&a**TERRA VERDE ATIVADO** +Herbalism.Skills.GTe.Refresh=&aSua Habilidade &eTerra Verde &afoi refrescada! +Herbalism.Skills.GTe.Other.Off=&cTerra Verde&a foi desgastada para &e{0} +Herbalism.Skills.GTe.Other.On=&a{0}&2 usou &cTerra Verde! +Herbalism.Skillup=&eHabilidade de Herbalismo aumentada para {0}. Total ({1}) #MINERAcaO -Mining.Ability.Length=[[RED]]Duracao do Super Quebrador: [[YELLOW]]{0}s +Mining.Ability.Length=&cDuracao do Super Quebrador: &e{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.Ability.Lower=&7**VOCE ABAIXA SUA PICARETA** +Mining.Ability.Ready=&a**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 @@ -181,24 +181,24 @@ 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.Effect.Decrease=&cDiminuicao de Dano da Pericia em Demolicao: &e{0} +Mining.Effect.DropChance=&cChance de Drop em Dobro: &e{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}) +Mining.Skills.SuperBreaker.Off=&c**Super Quebrador foi desgastado** +Mining.Skills.SuperBreaker.On=&a**SUPER QUEBRADOR ATIVADO** +Mining.Skills.SuperBreaker.Other.Off=&cSuper Quebrador&a foi desgastado para &e{0} +Mining.Skills.SuperBreaker.Other.On=&a{0}&2 usou &cSuper Quebrador! +Mining.Skills.SuperBreaker.Refresh=&aSua Habilidade &eSuper Quebrador &afoi refrescada! +Mining.Skillup=&eHabilidade de Mineracao foi aumentada para {0}. Total ({1}) #Mineracao Explosiva -Mining.Blast.Boom=[[GRAY]]**BOOM** +Mining.Blast.Boom=&7**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.Blast.Radius.Increase=&cAumento no Raio de explosao: &e+{0} +Mining.Blast.Rank=&cMineracao Explosiva: &e Rank {0}/{1} &7({2}) +Mining.Blast.Other.On=&a{0}&2 usou &cMineracao Explosiva! +Mining.Blast.Refresh=&aSua Habilidade &eMineracao Explosiva &afoi refrescada! #REPARAR Repair.Effect.0=Reparar @@ -217,31 +217,31 @@ 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.Error=&4mcMMO encontrou um erro ao reparar este item! +Repair.Listener.Anvil=&4VOCE 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.Skills.AdeptDiamond=&4VOCE nao tem habilidade suficiente para reparar Diamante. +Repair.Skills.AdeptGold=&4VOCE nao tem habilidade suficiente para reparar Ouro. +Repair.Skills.AdeptIron=&4VOCE nao tem habilidade suficiente para reparar Ferro. +Repair.Skills.AdeptStone=&4VOCE nao tem habilidade suficiente para reparar Pedra. +Repair.Skills.Adept=&cVOCE precisa do NIVEL &e{0}&c para reparar &e{1} +Repair.Skills.FeltEasy=&7Isso foi facil. +Repair.Skills.FullDurability=&7A durabilidade disto esta completa. +Repair.Skills.Mastery=&cDominio de Reparacao: &e{0} de durabilidade restaurada a mais. +Repair.Skills.StackedItems=&4VOCE nao pode reparar items empilhados. +Repair.Skills.Super.Chance=&cChance de Super Reparo: &e{0} +Repair.Skillup=&eHabilidade de Reparacao aumentada para {0}. Total ({1}) Repair.Pretty.Name=Reparar #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} +Repair.Arcane.Chance.Downgrade=&7Chance de rebaixar o FS: &e{0}% +Repair.Arcane.Chance.Success=&7Taxa de Sucesso do FS: &e{0}% +Repair.Arcane.Downgrade=&cPoder Misterioso foi diminuido para esse item. +Repair.Arcane.Fail=&cPoder Misterioso saiu permanentemente do item. +Repair.Arcane.Lost=&cVOCE nao foi habil suficiente para manter todos os encantamentos. +Repair.Arcane.Perfect=&aVOCE sustentou suas energias secretas neste item. +Repair.Arcane.Rank=&cForjamento Secreto: &eRank {0}/{1} #SALVAMENTO Salvage.Pretty.Name=Salvamento @@ -252,33 +252,33 @@ 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.Arcane.Rank=&cSalvamento Misterioso: &eRank {0}/{1} +Salvage.Arcane.ExtractFull=&7Possibilidade de ENCANTAMENTO-Maximo do FS +Salvage.Arcane.ExtractPartial=&7Possibilidade de ENCANTAMENTO-PARCIAL do FS +Salvage.Skills.Success=&aItem salvo! +Salvage.Skills.Adept.Damaged=&4VOCE nao tem habilidade suficiente para salvar os itens danificados. +Salvage.Skills.Adept.Level=&cVOCE precisa do NIVEL &e{0}&c para salvar &e{1} +Salvage.Skills.TooDamaged=&4Este item esta muito gasto para ser salvo. +Salvage.Skills.ArcaneFailed=&cVOCE nao foi capaz de extrair o conhecimento contido neste item. +Salvage.Skills.ArcanePartial=&eVOCE so foi capaz de extrair alguns conhecimentos contidos neste item. +Salvage.Skills.ArcaneSuccess=&aVOCE e capaz de extrair todo o conhecimento contido neste item. +Salvage.Listener.Anvil=&4VOCE colocou uma Bigorna de Salvamento, use isto para salvar Ferramentas e Armaduras. Salvage.Listener=Salvamento: Salvage.SkillName=SALVAMENTO #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.Ability.Lower=&7**VOCE ABAIXA SUA ESPADA** +Swords.Ability.Ready=&a**VOCE PREPARA SUA ESPADA** +Swords.Combat.Bleed.Chance=&cChance de Sangramento: &e{0} +Swords.Combat.Bleed.Length=&cTempo de Sangramento: &e{0} ticks +Swords.Combat.Bleed.Note=&7NOTA: &e1 Tick e igual a 2 segundos +Swords.Combat.Bleeding.Started=&4 VOCE esta sangrando! +Swords.Combat.Bleeding.Stopped=&7O Sangramento &aparou&7! +Swords.Combat.Bleeding=&a**INIMIGO SANGRANDO** +Swords.Combat.Counter.Chance=&cChance de Contra-Ataque: &e{0} +Swords.Combat.Counter.Hit=&4Bateu como Contra-Ataque! +Swords.Combat.Countered=&a**CONTRA-ATACADO** +Swords.Combat.SS.Struck=&4Golpeado pelo ATAQUE CORTANTE! Swords.Effect.0=Contra Ataque Swords.Effect.1=Reflete {0} de dano tomado Swords.Effect.2=Ataques Cortantes (HABILIDADE) @@ -289,13 +289,13 @@ Swords.Effect.6=Sangue Swords.Effect.7=Aplica um sangramento DoT 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=&c**Ataques Cortantes desgastados** +Swords.Skills.SS.On=&a**ATAQUES CORTANTES ATIVADO** +Swords.Skills.SS.Refresh=&aSua habilidade &eAtaques Cortantes &afoi refrescada! +Swords.Skills.SS.Other.Off=&cAtaques Cortantes&a foi desgastado para &e{0} +Swords.Skills.SS.Other.On=&a{0}&2 usou &cAtaque Cortantes! +Swords.Skillup=&eHabilidade com espadas aumentada para {0}. Total ({1}) +Swords.SS.Length=&cDuracao dos Ataques Cortantes: &e{0}s #DOMAR Taming.Ability.Bonus.0=Consciencia Ambiental @@ -316,14 +316,14 @@ 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.Combat.Chance.Gore=&cChance de Coagulacao: &e{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.14=&7COTW: 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 @@ -336,29 +336,29 @@ 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.Wolf=&8Seu 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.Skillup=&eHabilidade de Domesticar aumentada para {0}. Total ({1}) +Taming.Summon.Complete=&aInvocacao completa +Taming.Summon.Lifespan=&e ({0}s de Vida util) +Taming.Summon.Fail.Ocelot=&cVOCE tem muitas jaguatiricas por perto para invocar mais. +Taming.Summon.Fail.Wolf=&cVOCE tem muitos lobos por perto para invocar mais. +Taming.Summon.Fail.Horse=&cVOCE tem muitos cavalos por perto para invocar mais. +Taming.Summon.Fail.TooMany=&cVOCE atingiu o limite Maximo para poder invocar mais animais. &e({0}) Taming.Summon.Name.Format={0}''s {1} #DESARMADO -Unarmed.Ability.Berserk.Length=[[RED]]Duracao da Furia: [[YELLOW]]{0}s +Unarmed.Ability.Berserk.Length=&cDuracao da Furia: &e{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.Ability.Chance.ArrowDeflect=&cChance de Desviar de Flechas: &e{0} +Unarmed.Ability.Chance.Disarm=&cChance de Desarmar: &e{0} +Unarmed.Ability.Chance.IronGrip=&cChance de Punho de Ferro: &e{0} +Unarmed.Ability.IronGrip.Attacker=&cSeu oponente tem um Punho de Ferro! +Unarmed.Ability.IronGrip.Defender=&aO seu punho de ferro impediu de ser desarmado! +Unarmed.Ability.Lower=&7**VOCE ABAIXA SEUS PUNHOS** +Unarmed.Ability.Ready=&a**VOCE PREPARA SEUS PUNHOS** Unarmed.Effect.0=Furia (HABILIDADE) Unarmed.Effect.1=+50% de Dano, Quebra materiais fracos Unarmed.Effect.2=Desarme (Jogadores) @@ -371,18 +371,18 @@ Unarmed.Effect.8=Punho de Ferro Unarmed.Effect.9=Protege VOCE de ser desarmado 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=&c**Furia foi desgastada** +Unarmed.Skills.Berserk.On=&a**FuRIA ATIVADA** +Unarmed.Skills.Berserk.Other.Off=&cFuria&a foi desgastada para &e{0} +Unarmed.Skills.Berserk.Other.On=&a{0}&2 usou &cFuria! +Unarmed.Skills.Berserk.Refresh=&aSua habilidade &eFuria &afoi refrescada! +Unarmed.Skillup=&eHabilidade de Desarmado aumentada para {0}. Total ({1}) #WOODCUTTING 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.Chance.DDrop=&cChance de Drop Duplo: &e{0} +Woodcutting.Ability.Length=&cDuracao do Derrubador de arvores: &e{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 @@ -392,123 +392,123 @@ 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.Skills.TreeFeller.Off=&c**Derrubador de arvores foi desgastado** +Woodcutting.Skills.TreeFeller.On=&a**DERRUBADOR DE arvores FOI ATIVADO** +Woodcutting.Skills.TreeFeller.Refresh=&aSua habilidade &eDerrubador de arvores &afoi refrescada! +Woodcutting.Skills.TreeFeller.Other.Off=&cDerrubador de arvores&a foi desgastado para &e{0} +Woodcutting.Skills.TreeFeller.Other.On=&a{0}&2 usou &cDerrubador de arvores! +Woodcutting.Skills.TreeFeller.Splinter=&cSEU MACHADO SE DESPEDACOU EM DEZENAS DE PEDACOS! +Woodcutting.Skills.TreeFeller.Threshold=&cEsta arvore e muito grande! +Woodcutting.Skillup=&eHabilidade de Cortar Madeira aumentada para {0}. Total ({1}) #ABILITIY ##generic -Ability.Generic.Refresh=[[GREEN]]**HABILIDADES REFRESCADAS!** -Ability.Generic.Template.Lock=[[GRAY]]{0} -Ability.Generic.Template=[[RED]]{0}: [[YELLOW]]{1} +Ability.Generic.Refresh=&a**HABILIDADES REFRESCADAS!** +Ability.Generic.Template.Lock=&7{0} +Ability.Generic.Template=&c{0}: &e{1} #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. +Combat.ArrowDeflect=&f**DESVIOU-SE DA FLECHA** +Combat.BeastLore=&a**CONHECIMENTO TOSCO** +Combat.BeastLoreHealth=&3Vida (&a{0}&3/{1}) +Combat.BeastLoreOwner=&3Dono (&c{0}&3) +Combat.Gore=&a**MORDIDA** +Combat.StruckByGore=&c**VOCE FOI MORDIDO** +Combat.TargetDazed=Alvo foi &4Atordoado +Combat.TouchedFuzzy=&4Visoo turva. Sente tonturas. -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.addlevels.AwardAll.1=&aVoce ganhou {0} leveis em todas suas skills! +Commands.addlevels.AwardAll.2=&cTodas suas skills foram alteradas para {0}. +Commands.addlevels.AwardSkill.1=&aVoce ganhou {0} leveis em {1}! +Commands.addlevels.AwardSkill.2=&c{0} foi modificado para {1}. +Commands.addxp.AwardAll=&aVoce ganhou {0} experiencias em todas skills! +Commands.addxp.AwardSkill=&aVoce ganhou {0} experiencias em {1}! +Commands.AdminChat.Off=Chat Admin &cDesligado +Commands.AdminChat.On=Chat de Admin &aLigado +Commands.AdminToggle=&c- Liga o Admin chat +Commands.Disabled=&cEste comando esta desabilitado. +Commands.DoesNotExist=&cPlayer nao existe na database! +Commands.GodMode.Disabled=&emcMMO Modo God desabilitado +Commands.GodMode.Enabled=&emcMMO Godmode Ligado +Commands.Invite.Accepted=&aConvite aceito. Voce se juntou ao grupo {0} +Commands.mmoedit=[player] &c - Modifica alvo +Commands.ModDescription=&c- 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.Party.Accept=&c- Aceitar convite de grupo +Commands.Party.Chat.Off=Chat de grupo &cDesligado +Commands.Party.Commands=&a--COMANDOS DE GRUPO-- +Commands.Party.Invite.0=&cALERTA: &aVoce recebeu um convite para o grupo {0} de {1} +Commands.Party.Kick=&cVoce foi kickado do grupo {0}! +Commands.Party.Leave=&cVoce saiu do grupo +Commands.Party.None=&cVoce nao esta em um grupo. +Commands.Party.Quit=&c- Deixe seu grupo atual +Commands.PowerLevel.Leaderboard=&e--mcMMO&9 Nivel de Poder &ePodium-- +Commands.PowerLevel=&4N\u00cdVEL DE PODER: &a{0} +Commands.Scoreboard.Clear=&3mcMMO scoreboard sumiu. +Commands.Scoreboard.NoBoard=&cThe mcMMO scoreboard nao esta ativo. +Commands.Scoreboard.Keep=&3O mcMMO scoreboard vai estar visivel ate voce usar &a/mcscoreboard clear&3. +Commands.Scoreboard.Timer=&3O mcMMO scoreboard vai sumir em &6{0}&3 segundos. +Commands.Scoreboard.Help.0=&6 == &aAjuda para &c/mcscoreboard&6 == +Commands.Scoreboard.Help.1=&3/mcscoreboard&b clear &f - oculta o McMMO scoreboard +Commands.Scoreboard.Help.2=&3/mcscoreboard&b keep &f - mantem o McMMO scoreboard visivel +Commands.Scoreboard.Help.3=&3/mcscoreboard&b time [n] &f - oculta o McMMO scoreboard depois de &dn&f segundos +Commands.Scoreboard.Tip.Keep=&6Dica: Use &c/mcscoreboard keep&6 enquanto ele estiver visivel para fazer com que ele fique sempre visivel . +Commands.Scoreboard.Tip.Clear=&6Dica: Use &c/mcscoreboard clear&6 para ocultar o McMMO scoreboard. Commands.Stats.Self=SEUS STATS -mcMMO.NoPermission=[[DARK_RED]]Permissoes insuficientes. +mcMMO.NoPermission=&4Permissoes 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.Help.0=&cO Correto e &3{0} [password]. +Party.Help.1=&cPara criar uma party, use &3{0} [password]. +Party.Help.2=&cConsulte &3{0} &cpara mais informacao +Party.Help.3=&cUse &3{0} [password] &cpara entrar ou &3{1} &cpara sair +Party.Help.4=&cPara travar ou destravar a party, use &3{0} +Party.Help.5=&cPara proteger sua party com senha, use &3{0} +Party.Help.6=&cPara chutar um player da party, use &3{0} +Party.Help.7=&cPara transferir o cargo de dono da party, use &3{0} +Party.Help.8=&cPara deletar sua party, use &3{0} +Party.Help.9=&cUse &3{0} &cpara compartilhar items com os membros da party +Party.Help.10=&cUse &3{0} &cpara compartilhar XP com os membros da party +Party.InformedOnJoin={0} &aentrou na sua party +Party.InformedOnQuit={0} &asaiu da sua party +Party.InformedOnNameChange=&6{0} &amudou o nome da party para &f{1} +Party.InvalidName=&4Isso nao e um nome VAlido. +Party.Invite.Self=&cVOCE nao pode convidar VOCE mesmo! +Party.IsLocked=&cEsta party ja esta travada! +Party.IsntLocked=&cEsta party nao esta travada. +Party.Locked=&cA party esta travada, somente os lideres podem convidar membros. +Party.NotInYourParty=&4{0} nao esta na sua party +Party.NotOwner=&4VOCE nao e o lider da party. +Party.Target.NotOwner=&4{0} nao e o lider da party. +Party.Owner.New=&a{0} e o novo lider da party. +Party.Owner.NotLeader=&4VOCE nao e mais o lider da party. +Party.Owner.Player =&aAgora VOCE e o lider da party. +Party.Password.None=&cEsta party esta protegida com senha. Informe a senha para entrar. +Party.Password.Incorrect=&cA senha da party esta incorreta. +Party.Password.Set=&aSenha da party mudada para {0} +Party.Password.Removed=&aA senha da party foi removida. +Party.Player.Invalid=&cIsto nao e um player VAlido. +Party.NotOnline=&4{0} nao esta online! +Party.Player.InSameParty=&c{0} ja esta na sua party! +Party.PlayerNotInParty=&4{0} nao esta na party +Party.Specify=&cVOCE precisa especificar a party. +Party.Teleport.Dead=&cVOCE nao pode teleportar a um membro morto. +Party.Teleport.Hurt=&cVOCE levou dano nos ultimos {0} segundos e nao pode teleportar. +Party.Teleport.Player=&aVOCE teleportou para {0}. +Party.Teleport.Self=&cVOCE nao pode teleportar VOCE mesmo! +Party.Teleport.Target=&a{0} teleportou para VOCE. +Party.Teleport.Disabled=&c{0} nao permitiu o teleporty por party. +Party.Rename.Same=&cEste ja e o nome da sua party! +Party.Join.Self=&cVOCE nao pode convidar VOCE mesmo! +Party.Unlocked=&7Party nao esta mais travada +Party.Disband=&7A party foi removida +Party.Alliance.Formed=&7Sua party agora e aliada de &a{0} +Party.Alliance.Disband=&7Sua party nao tem alianca com &c{0} +Party.Status.Locked=&4(SOMENTE-CONVIDA) +Party.Status.Unlocked=&2(ABERTO) +Party.LevelUp=&eNIVEL de party aumentada para {0}. Total ({1}) Party.Feature.Chat=Chat de Party Party.Feature.Teleport=Teleporte por Party Party.Feature.Alliance=Aliancas @@ -519,11 +519,11 @@ 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. +Party.Feature.Disabled.1=&cChat de Party nao esta destravado ainda. +Party.Feature.Disabled.2=&cTeleporte de Party nao esta destravado ainda. +Party.Feature.Disabled.3=&cAlianca de Party nao esta destravado ainda. +Party.Feature.Disabled.4=&cCompartilhar item nao esta destravado ainda. +Party.Feature.Disabled.5=&cCompartilhar XP nao esta destravado ainda. Party.ShareType.Xp=XP Party.ShareType.Item=ITEM Party.ShareMode.None=NENHUM @@ -543,39 +543,39 @@ Commands.XPGain.Herbalism=Colhendo Ervas Commands.XPGain.Mining=Minerar Pedra & Min\u00e9rio Commands.XPGain.Swords=Atacando Monstros Commands.XPGain.Taming=Domesticar animais, ou combater com os seus lobos -Commands.XPGain=[[DARK_GRAY]]XP ADQUIRIDO: [[WHITE]]{0} -Commands.xplock.locked=[[GOLD]]Sua barra de XP BAR est\u00e1 travada em {0}! -Commands.xplock.unlocked=[[GOLD]]Sua barra de XP foi [[GREEN]]DESTRAVADA[[GOLD]]! -Commands.xprate.over=[[RED]]Evento de XP Rate acabou!! +Commands.XPGain=&8XP ADQUIRIDO: &f{0} +Commands.xplock.locked=&6Sua barra de XP BAR est\u00e1 travada em {0}! +Commands.xplock.unlocked=&6Sua barra de XP foi &aDESTRAVADA&6! +Commands.xprate.over=&cEvento de XP Rate acabou!! -XPRate.Event=[[GOLD]]mcMMO esta em um evento de XP aumentada! O aumento de XP e {0}x! +XPRate.Event=&6mcMMO 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! +Inspect.OfflineStats=Estatisticas do mcMMO para o player offline &e{0} +Inspect.Stats=&aEstatisticas do mcMMO para &e{0} +Inspect.TooFar=&cVoce 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) +Item.Injured.Wait=Voce foi ferido recentemente e deve esperar para usar isto. &e({0}s) -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! +Skills.Disarmed=&4Voce foi Desarmado! +Skills.NeedMore=&4Voce precisa de mais +Skills.TooTired=&cVoce esta cansado pra usar essa habilidade. +Skills.Cancelled=&c{0} cancelado! -Stats.Header.Combat=[[GOLD]]-=SKILLS DE COMBATE=- -Stats.Header.Gathering=[[GOLD]]-=SKILLS DE RECOLHA=- -Stats.Header.Misc=[[GOLD]]-=OUTRAS SKILLS=- -Scoreboard.Header.PlayerCooldowns=[[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 +Stats.Header.Combat=&6-=SKILLS DE COMBATE=- +Stats.Header.Gathering=&6-=SKILLS DE RECOLHA=- +Stats.Header.Misc=&6-=OUTRAS SKILLS=- +Scoreboard.Header.PlayerCooldowns=&emcMMO Restantes +Scoreboard.Misc.CurrentXP=&aXP Atual +Scoreboard.Misc.RemainingXP=&eXP Restante +Scoreboard.Misc.Cooldown=&dFaltando +Scoreboard.Misc.Overall=&6Geral #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. +Profile.Loading.Success=&aSeu perfil mcMMO foi carregado. +Profile.Loading.Failure=&cmcMMO still cannot load your data. You may want to &bcontact the server owner.\n&eYou can still play on the server, but you will have &lno mcMMO levels&e and any XP you get &lwill not be saved&e. +Profile.Loading.AdminFailureNotice=&4[A]&c mcMMO was unable to load the player data for &e{0}&c. &dPlease inspect your database setup. 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_ru.properties b/src/main/resources/locale/locale_ru.properties index 4811eb8c3..0525fa31a 100644 --- a/src/main/resources/locale/locale_ru.properties +++ b/src/main/resources/locale/locale_ru.properties @@ -14,7 +14,7 @@ JSON.LevelRequirement=\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u04 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.Header=&6\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 @@ -37,45 +37,45 @@ JSON.URL.Patreon=\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0430\u0442\u044c no 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.SkillUnlockMessage=&6[ mcMMO&e @&3{0} &6\u0420\u0430\u043d\u0433 &3{1}&6 \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} # 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\u0423\u0440. {0}+ +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.Roll.Interaction.Activated=\u0422\u0435\u0441\u0442 &cRolled \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. +Anvil.SingleItemStack=&c\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. -mcMMO.Template.Prefix=[[GOLD]]([[GREEN]]mcMMO[[GOLD]]) [[GRAY]]{0} +mcMMO.Template.Prefix=&6(&amcMMO&6) &7{0} #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.Ability.Proc=&a**\u0418\u0437\u044f\u0449\u043d\u043e\u0435 \u041f\u0440\u0438\u0437\u0435\u043c\u043b\u0435\u043d\u0438\u0435 ** +Acrobatics.Combat.Proc=&a**\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: &e{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.Stats=&6\u0428\u0430\u043d\u0441 \u0441\u043a\u043e\u043b\u044c\u0436\u0435\u043d\u0438\u044f &e{0}%&6 \u0428\u0430\u043d\u0441 \u0438\u0437\u044f\u0449\u043d\u043e\u0433\u043e \u0441\u043a\u043e\u043b\u044c\u0436\u0435\u043d\u0438\u044f&e {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.Roll.Mechanics=&7\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 &e{0}%&7 \u0448\u0430\u043d\u0441 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0443\u0440\u043e\u043d, \u0438 &e{1}%&7 \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 &e{2}&7 \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 &e{3}%&7 \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 &c{4}&7 \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 &a{5}&7 \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.SubSkill.Roll.Chance=\u0428\u0430\u043d\u0441 \u0421\u043a\u043e\u043b\u044c\u0436\u0435\u043d\u0438\u044f: &e{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: &e{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}) @@ -85,15 +85,15 @@ Alchemy.SubSkill.Catalysis.Description=\u0423\u0432\u0435\u043b\u0438\u0447\u043 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.SubSkill.Concoctions.Stat=\u0420\u0430\u043d\u0433 \u043e\u0442\u0432\u0430\u0440\u043e\u0432: &a{0}&3/&a{1} +Alchemy.SubSkill.Concoctions.Stat.Extra=\u0418\u043d\u0433\u0440\u0438\u0434\u0438\u0435\u043d\u0442\u044b [&a{0}&3]: &a{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.Combat.DazeChance=\u0428\u0430\u043d\u0441 \u0428\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c: &e{0} % +Archery.Combat.RetrieveChance=\u0428\u0430\u043d\u0441 \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u0421\u0442\u0440\u0435\u043b\u044b: &e{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: &e{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 @@ -116,15 +116,15 @@ Axes.Ability.Bonus.2=\u0411\u0440\u043e\u043d\u0435\u0431\u043e\u0439\u043d\u044 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.Ability.Lower=&a**\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=&a**\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=&4\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: &e{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.Proc=&a**\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.Combat.SS.Struck=&4\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\": &e{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 @@ -143,14 +143,14 @@ Axes.SubSkill.GreaterImpact.Description=\u041d\u0430\u043d\u043e\u0441\u0438\u04 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.Skills.SS.On=&a**\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=&a\u0412\u0430\u0448\u0435 \u0443\u043c\u0435\u043d\u0438\u0435 &e\"\u0420\u0430\u0441\u043a\u0430\u043b\u044b\u0432\u0430\u0442\u0435\u043b\u044c\u0427\u0435\u0440\u0435\u043f\u043e\u0432\" &a\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\"&a \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u043b\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0443 &e{0} +Axes.Skills.SS.Other.On=&a{0}&2 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0443\u043c\u0435\u043d\u0438\u0435&c\"\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.Ability.Lower=&a**\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=&a**\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 @@ -160,35 +160,35 @@ Excavation.SubSkill.Archaeology.Name=\u0410\u0440\u0445\u0435\u043e\u043b\u043e\ 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.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\": &e{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.Skills.GigaDrillBreaker.On=&a**\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=&a\u0412\u0430\u0448\u0435 \u0443\u043c\u0435\u043d\u0438\u0435 &e\"\u041c\u0435\u0433\u0430 \u0411\u0443\u0440\" &a\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\"&a \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u043b\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0443 &e{0} +Excavation.Skills.GigaDrillBreaker.Other.On=&a{0}&2 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0443\u043c\u0435\u043d\u0438\u0435&c\"\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.ScarcityTip=&e&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=&7&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=&c&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=&7\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: &e{0} +Fishing.Ability.Info=\u041e\u0445\u043e\u0442\u043d\u0438\u043a \u0417\u0430 \u041c\u0430\u0433\u0438\u0435\u0439: &7 **\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.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: &e{0}/5 +Fishing.Ability.TH.DropRate=\u0428\u0430\u043d\u0441\u044b \u0414\u0440\u043e\u043f\u0430: &4\u041b\u043e\u0432\u0443\u0448\u043a\u0430: &e{0} &7\u041e\u0431\u044b\u0447\u043d\u044b\u0439: &e{1} &a\u041d\u0435\u043e\u0431\u044b\u0447\u043d\u044b\u0439: &e{2}\n&9\u0420\u0435\u0434\u043a\u0438\u0439: &e{3} &d\u042d\u043f\u0438\u0447\u0435\u0441\u043a\u0438\u0439: &e{4} &6\u041b\u0435\u0433\u0435\u043d\u0434\u0430\u0440\u043d\u044b\u0439: &e{5} &b\u041f\u043b\u0430\u0441\u0442\u0438\u043d\u043a\u0430: &e{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: &e{0} +Fishing.Ability.Shake=\u0428\u0430\u043d\u0441 \u0412\u0441\u0442\u0440\u044f\u0441\u043a\u0438: &e{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.Ability.FD=\u0420\u044b\u0431\u0430\u0446\u043a\u0430\u044f \u0414\u0438\u0435\u0442\u0430: &e\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.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: &a{0}&3/&a{1} +Fishing.SubSkill.TreasureHunter.Stat.Extra=\u0428\u0430\u043d\u0441 \u0434\u0440\u043e\u043f\u0430: &7\u041e\u0431\u044b\u0447\u043d\u044b\u0439: &e{0} &a\u041d\u0435\u043e\u0431\u044b\u0447\u043d\u044b\u0439: &e{1}\n&9\u0420\u0435\u0434\u043a\u0438\u0439: &e{2} &d\u042d\u043f\u0438\u0447\u0435\u0441\u043a\u0438\u0439: &e{3} &6\u041b\u0435\u0433\u0435\u043d\u0434\u0430\u0440\u043d\u044b\u0439: &e{4} &b\u041f\u043b\u0430\u0441\u0442\u0438\u043d\u043a\u0430: &e{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 @@ -197,33 +197,33 @@ Fishing.SubSkill.Shake.Description=\u0412\u044b\u0442\u0440\u044f\u0445\u0438\u0 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.FishermansDiet.Stat=\u0420\u044b\u0431\u0430\u0446\u043a\u0430\u044f \u0414\u0438\u0435\u0442\u0430:&a \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.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: &a+{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.Chance.Raining=&9 \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.Ability.TH.MagicFound=&7\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=&7\u0412\u0420\u0415\u041c\u042f \u0412\u0417\u0420\u042b\u0412\u0410\u0422\u042c!!! +Fishing.Ability.TH.Poison=&7\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.DoubleDropChance=\u0428\u0430\u043d\u0441 \u0414\u0432\u043e\u0439\u043d\u043e\u0433\u043e \u0414\u0440\u043e\u043f\u0430: &e{0} % +Herbalism.Ability.FD=\u0424\u0435\u0440\u043c\u0435\u0440\u0441\u043a\u0430\u044f \u0414\u0438\u0435\u0442\u0430: &e\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\": &e{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.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: &e{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.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: &e \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=&a**\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: &e{0} +Herbalism.Ability.Lower=&a**\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=&a**\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: &e{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 @@ -231,12 +231,12 @@ Herbalism.SubSkill.GreenTerra.Stat=\u041e\u0437\u0435\u043b\u0435\u043d\u0435\u0 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.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: &a \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.FarmersDiet.Stat=\u0424\u0435\u0440\u043c\u0435\u0440\u0441\u043a\u0430\u044f \u0414\u0438\u0435\u0442\u0430: &a\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 @@ -246,22 +246,22 @@ Herbalism.SubSkill.HylianLuck.Stat=\u0425\u0430\u0439\u043b\u0438\u0430\u043d\u0 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.HylianLuck=&a\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.Skills.GTe.On=&a**\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=&a\u0412\u0430\u0448\u0435 \u0443\u043c\u0435\u043d\u0438\u0435 &e\"\u041e\u0437\u0435\u043b\u0435\u043d\u0435\u043d\u0438\u0435\" &a\u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e! +Herbalism.Skills.GTe.Other.Off=&a \u0423\u043c\u0435\u043d\u0438\u0435 \"&c\u041e\u0437\u0435\u043b\u0435\u043d\u0435\u043d\u0438\u0435&a \" \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u043b\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0443 &e{0} +Herbalism.Skills.GTe.Other.On=&a{0}&2 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0443\u043c\u0435\u043d\u0438\u0435 &c \"\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.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\": &e{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.Ability.Lower=&a**\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=&a**\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 @@ -270,31 +270,31 @@ Mining.SubSkill.DoubleDrops.Description=\u0423\u0434\u0432\u0430\u0438\u0432\u04 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.BlastMining.Stat=\u041f\u043e\u0434\u0440\u044b\u0432\u043d\u0430\u044f \u0414\u043e\u0431\u044b\u0447\u0430:&a \u0420\u0430\u043d\u0433 {0}/{1} &7({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: &a+{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.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: &e{0} +Mining.Effect.DropChance=\u0428\u0430\u043d\u0441 \u0414\u0432\u043e\u0439\u043d\u043e\u0433\u043e \u0414\u0440\u043e\u043f\u0430: &e{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.Skills.SuperBreaker.On=&a**\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\"&a \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u043b\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0443 &e{0} +Mining.Skills.SuperBreaker.Other.On=&a{0}&2 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0443\u043c\u0435\u043d\u0438\u0435 &c\"\u0421\u0443\u043f\u0435\u0440 \u0414\u0440\u043e\u0431\u0438\u043b\u043a\u0430\"! +Mining.Skills.SuperBreaker.Refresh=&a\u0412\u0430\u0448\u0430 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c &e\u041a\u043e\u043f\u0430\u0442\u0435\u043b\u044c &a\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.Boom=&7**\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! +Mining.Blast.Radius.Increase=\u0420\u0430\u0434\u0438\u0443\u0441 \u0412\u0437\u0440\u044b\u0432\u0430 \u0423\u0432\u0435\u043b\u0438\u0447\u0435\u043d: &e+{0} +Mining.Blast.Rank=\u041f\u043e\u0434\u0440\u044b\u0432\u043d\u0430\u044f \u0414\u043e\u0431\u044b\u0447\u0430: &e \u0420\u0430\u043d\u0433 {0}/8 &7({1}) +Mining.Blast.Other.On=&a{0}&2 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0443\u043c\u0435\u043d\u0438\u0435 &c\"\u041f\u043e\u0434\u0440\u044b\u0432\u043d\u0430\u044f \u0414\u043e\u0431\u044b\u0447\u0430\"! +Mining.Blast.Refresh=&a\u0412\u0430\u0448\u0435 \u0443\u043c\u0435\u043d\u0438\u0435 &e\"\u041f\u043e\u0434\u0440\u044b\u0432\u043d\u0430\u044f \u0414\u043e\u0431\u044b\u0447\u0430\" &a\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 @@ -306,7 +306,7 @@ Repair.SubSkill.StoneRepair.Name=\u0420\u0435\u043c\u043e\u043d\u0442 \u041a\u04 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.RepairMastery.Stat=\u041c\u0430\u0441\u0442\u0435\u0440 \u0420\u0435\u043c\u043e\u043d\u0442\u0430: &a\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 @@ -314,76 +314,76 @@ Repair.SubSkill.DiamondRepair.Name=\u0420\u0435\u043c\u043e\u043d\u0442 \u0410\u 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.SubSkill.ArcaneForging.Stat=\u0412\u043e\u043b\u0448\u0435\u0431\u043d\u0430\u044f \u041a\u043e\u0432\u043a\u0430: &e\u0420\u0430\u043d\u0433 {0}/{1} +Repair.SubSkill.ArcaneForging.Stat.Extra=&3\u0412\u043e\u043b\u0448\u0435\u0431\u043d\u0430\u044f \u041a\u043e\u0432\u043a\u0430 \u0428\u0430\u043d\u0441\u044b:&7 \u0423\u0441\u043f\u0435\u0445 &a{0}&7%, \u041f\u0440\u043e\u0432\u0430\u043b &c{1}&7% +Repair.Error=&4mcMMO \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=&4\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.Skills.AdeptDiamond=&4\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=&4\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=&4\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=&4\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 &e{0}&c, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u0440\u0435\u043c\u043e\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c &e{1} +Repair.Skills.FeltEasy=&7\u042d\u0442\u043e \u0431\u044b\u043b\u043e \u043b\u0435\u0433\u043a\u043e. +Repair.Skills.FullDurability=&7\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=&4\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: &e\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=&4\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: &e{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.Chance.Downgrade=&7\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: &e{0}% +Repair.Arcane.Chance.Success=&7\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\": &e{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 +Repair.Arcane.Perfect=&a\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: &e\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.ScrapCollector.Stat=\u041a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u043e\u043d\u0435\u0440 \u0425\u043b\u0430\u043c\u0430: &a\u0420\u0430\u0437\u0431\u0435\u0440\u0438 \u0434\u043e &e{0}&a \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.SubSkill.ArcaneSalvage.Stat=\u041c\u0430\u0433\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u041f\u0435\u0440\u0435\u0440\u0430\u0431\u043e\u0442\u043a\u0430: &e\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.Ability.Bonus.1=\u0420\u0430\u0437\u0431\u0435\u0440\u0438 \u0434\u043e &e{0}&a \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=&7\u041f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e-\u0428\u0430\u043d\u0441 \u0427\u0430\u0440 +Salvage.Arcane.ExtractPartial=&7\u0427\u0430\u0441\u0442\u0438\u0447\u043d\u043e-\u0428\u0430\u043d\u0441 \u0427\u0430\u0440 +Salvage.Skills.Success=&a\u041f\u0440\u0435\u0434\u043c\u0435\u0442 \u041f\u0435\u0440\u0435\u0440\u0430\u0431\u043e\u0442\u0430\u043d! +Salvage.Skills.Adept.Damaged=&4\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 &e{0}&c \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c &e{1} +Salvage.Skills.TooDamaged=&4\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=&c\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=&c\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=&a\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=&4\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]]. +Salvage.Skills.Lottery.Normal=&6\u0423 \u0432\u0430\u0441 \u0432\u044b\u0448\u043b\u043e \u0438\u0437\u0432\u043b\u0435\u0447\u044c &3{0}&6 \u0438\u0437 &e{1}&6. +Salvage.Skills.Lottery.Perfect=&a&l\u041f\u0440\u0435\u0432\u043e\u0441\u0445\u043e\u0434\u043d\u043e!&r&6 \u0412\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438 &3{1}&6 \u0431\u0435\u0437 \u043e\u0441\u043e\u0431\u044b \u0443\u0441\u0438\u043b\u0438\u0439 \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 &3{0}&6. +Salvage.Skills.Lottery.Untrained=&7\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 &c{0}&7 \u0438\u0437 &a{1}&7. #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.Ability.Lower=&7**\u041c\u0415\u0427 \u0412 \u041e\u0411\u042b\u0427\u041d\u041e\u041c \u0421\u041e\u0421\u0422\u041e\u042f\u041d\u0418\u0418** +Swords.Ability.Ready=&3**\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=&7\u0417\u0410\u041c\u0415\u0422\u041a\u0410: &e1 \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: &e{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: &e{0} \u0442\u0438\u043a\u043e\u0432 +Swords.Combat.Bleed.Note=&7\u0417\u0410\u041c\u0415\u0422\u041a\u0410: &e1 \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=&4 \u0412\u044b \u0438\u0441\u0442\u0435\u043a\u0430\u0435\u0442\u0435 \u043a\u0440\u043e\u0432\u044c\u044e! +Swords.Combat.Bleeding.Stopped=&7\u041a\u0440\u043e\u0432\u043e\u0442\u0435\u0447\u0435\u043d\u0438\u0435 &a\u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u043b\u043e\u0441\u044c&7! +Swords.Combat.Bleeding=&a**\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: &e{0} +Swords.Combat.Counter.Hit=&4\u041f\u043e\u0440\u0430\u0436\u0435\u043d \u043a\u043e\u043d\u0442\u0440\u0430\u0442\u0430\u043a\u043e\u0439! +Swords.Combat.Countered=&a**\u041a\u041e\u041d\u0422\u0420\u0410\u0422\u0410\u041a\u0410** +Swords.Combat.SS.Struck=&4\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 @@ -400,7 +400,7 @@ Swords.SubSkill.SwordsLimitBreak.Name=\u041c\u0435\u0447\u0438 \u041f\u0440\u043 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.SubSkill.Rupture.Stat.Extra=\u041a\u0440\u043e\u0432\u043e\u0442\u0435\u0447\u0435\u043d\u0438\u0435: &a{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 @@ -408,12 +408,12 @@ Swords.SubSkill.Bleed.Description=\u0417\u0430\u0441\u0442\u0430\u0432\u043b\u04 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.Skills.SS.On=&a**\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=&a\u0412\u0430\u0448\u0435 \u0443\u043c\u0435\u043d\u0438\u0435 &e\"\u0420\u0435\u0436\u0443\u0449\u0438\u0439 \u0423\u0434\u0430\u0440\" &a\u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e! +Swords.Skills.SS.Other.Off=&a\u0423\u043c\u0435\u043d\u0438\u0435 \"&c\u0420\u0435\u0436\u0443\u0449\u0438\u0439 \u0443\u0434\u0430\u0440&a\" \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u043b\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0443 &e{0} +Swords.Skills.SS.Other.On=&a{0}&2 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0443\u043c\u0435\u043d\u0438\u0435 &c\"\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. +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\": &e{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 @@ -440,9 +440,9 @@ Taming.SubSkill.ShockProof.Name=\u041d\u0430\u0434\u0435\u0436\u043d\u0430\u044f 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.CallOfTheWild.Description.2=&7COTW (\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=&7COTW (\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=&7COTW (\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 @@ -458,32 +458,32 @@ Taming.SubSkill.ThickFur.Description=\u0421\u043d\u0438\u0436\u0435\u043d\u0438\ 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.Wolf=&8\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.Complete=&a\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.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} +Taming.Summon.COTW.Success.WithoutLifespan=&a(\u0417\u043e\u0432 \u041f\u0440\u0435\u0434\u043a\u043e\u0432) &7\u0412\u044b \u043f\u0440\u0438\u0437\u0432\u0430\u043b\u0438 &6{0}&7 +Taming.Summon.COTW.Success.WithLifespan=&a(\u0417\u043e\u0432 \u041f\u0440\u0435\u0434\u043a\u043e\u0432) &7\u0412\u044b \u043f\u0440\u0438\u0437\u0432\u0430\u043b\u0438 &6{0}&7 \u043d\u0430 &6{1}&7 \u0441\u0435\u043a. +Taming.Summon.COTW.Limit=&a(\u0417\u043e\u0432 \u041f\u0440\u0435\u0434\u043a\u043e\u0432) &7\u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u043c\u0435\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e &c{0} &7\u043f\u0440\u0438\u0437\u0432\u0430\u043d\u043d\u044b\u0445 &7{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=&a(\u0417\u043e\u0432 \u041f\u0440\u0435\u0434\u043a\u043e\u0432) &7\u0412\u0440\u0435\u043c\u044f \u0432\u044b\u0448\u043b\u043e, \u0432\u0430\u0448\u0438 &6{0}&7 \u043e\u0442\u0441\u0442\u0443\u043f\u0430\u044e\u0442. +Taming.Summon.COTW.BreedingDisallowed=&a(\u0417\u043e\u0432 \u041f\u0440\u0435\u0434\u043a\u043e\u0432) &c\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=&a(\u0417\u043e\u0432 \u041f\u0440\u0435\u0434\u043a\u043e\u0432) &7\u0412\u043e\u043c \u043d\u0443\u0436\u043d\u043e \u043d\u0430 &e{0}&7 \u0431\u043e\u043b\u044c\u0448\u0435 &3{1}&7 +Taming.Summon.Name.Format=&6(\u0417\u043e\u0432 \u041f\u0440\u0435\u0434\u043a\u043e\u0432) &f{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.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\": &e{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.ArrowDeflect=\u0428\u0430\u043d\u0441 \u041e\u0442\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0421\u0442\u0440\u0435\u043b: &e{0} +Unarmed.Ability.Chance.Disarm=\u0428\u0430\u043d\u0441 \u0420\u0430\u0437\u043e\u0440\u0443\u0436\u0438\u0442\u044c: &e{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.Ability.IronGrip.Defender=&a\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=&7**\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=&3**\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 @@ -504,16 +504,16 @@ Unarmed.SubSkill.IronGrip.Stat=\u0416\u0435\u043b\u0435\u0437\u043d\u0430\u044f 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.Skills.Berserk.On=&a**\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=&a\u0423\u043c\u0435\u043d\u0438\u0435 \"&c\u0411\u0435\u0440\u0441\u0435\u0440\u043a&a\" \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u043b\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0443 &e{0} +Unarmed.Skills.Berserk.Other.On=&a{0}&2 \u0432\u043a\u043b\u044e\u0447\u0438\u043b &c\u0443\u043c\u0435\u043d\u0438\u0435 \"\u0411\u0435\u0440\u0441\u0435\u0440\u043a\"! +Unarmed.Skills.Berserk.Refresh=&a\u0412\u0430\u0448\u0435 \u0443\u043c\u0435\u043d\u0438\u0435 &e\"\u0411\u0435\u0440\u0441\u0435\u0440\u043a\" &a\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.Chance.DDrop=\u0428\u0430\u043d\u0441 \u0414\u0432\u043e\u0439\u043d\u043e\u0433\u043e \u0414\u0440\u043e\u043f\u0430: &e{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\": &e{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 @@ -532,172 +532,172 @@ Woodcutting.SubSkill.NaturesBounty.Description=\u041f\u043e\u043b\u0443\u0447\u0 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.On=&a**\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=&a\u0412\u0430\u0448\u0435 \u0443\u043c\u0435\u043d\u0438\u0435 &e\"\u041b\u0435\u0441\u043e\u0440\u0443\u0431\" &a\u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e! +Woodcutting.Skills.TreeFeller.Other.Off=&a\u0423\u043c\u0435\u043d\u0438\u0435 \"&c\u041b\u0435\u0441\u043e\u0440\u0443\u0431&a\" \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u043b\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0443 &e{0} +Woodcutting.Skills.TreeFeller.Other.On=&a{0}&2 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0443\u043c\u0435\u043d\u0438\u0435 &c\"\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} +Ability.Generic.Refresh=&a**\u0423\u041c\u0415\u041d\u0418\u042f \u0412\u041e\u0421\u0421\u0422\u0410\u041d\u041e\u0412\u041b\u0415\u041d\u042b!** +Ability.Generic.Template.Lock=&7{0} +Ability.Generic.Template=&6{0}: &3{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.ArrowDeflect=&f**\u0421\u0422\u0420\u0415\u041b\u0410 \u041e\u0422\u0421\u041a\u041e\u0427\u0418\u041b\u0410** +Combat.BeastLore=&a**\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=&3\u0417\u0434\u043e\u0440\u043e\u0432\u044c\u0435 (&a{0}&3/{1}) +Combat.BeastLoreOwner=&3\u0412\u043b\u0430\u0434\u0435\u043b\u0435\u0446 (&c{0}&3) +Combat.Gore=&a**\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. +Combat.TargetDazed=\u0412\u0430\u0448\u0430 \u0446\u0435\u043b\u044c &4\u0428\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0430 +Combat.TouchedFuzzy=&4\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! +mcMMO.Description=&3\u041e \u043f\u0440\u043e\u044d\u043a\u0442\u0435 &emcMMO&3:,&6mcMMO \u044d\u0442\u043e &c\u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439&6 RPG \u043c\u043e\u0434, &6\u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u0432 \u0444\u0435\u0432\u0440\u0430\u043b\u0435 2011,&6\u043a\u043e\u043c\u043c\u0430\u043d\u0434\u043e\u0439 &9nossr50&6. \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.,&3\u041f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438:,&6 - &a\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 &c/mcmmo help&a \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,&6 - &a\u041d\u0430\u043f\u0435\u0447\u0430\u0442\u0430\u0439\u0442\u0435 &c/\u041d\u0410\u0417\u0412\u0410\u041d\u0418\u0415\u0423\u041c\u0415\u041d\u0418\u042f&a \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,&3\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438:,&6 - &anossr50 &9(Creator & Project Lead),&6 - &aelectronicboy &9(Dev),&6 - &akashike &9(Dev),&6 - &at00thpick1 &9(Classic Maintainer) +mcMMO.Description.FormerDevs=&3\u0411\u044b\u0432\u0448\u0438\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438: &aGJ, NuclearW, bm01, TfT_02, Glitchfinder +Commands.addlevels.AwardAll.1=&a\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.1=&a\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.addxp.AwardAll=&a\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=&a\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 &c\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 &a\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 &e{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 &c\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 &c\u0432\u043a\u043b\u044e\u0447\u0435\u043d +Commands.AdminToggle=&a- \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.Cooldowns.Header=&6--= &a\u041a\u0443\u043b\u0434\u0430\u0443\u043d\u044b \u0423\u043c\u0435\u043d\u0438\u0439 mcMMO&6 =-- +Commands.Cooldowns.Row.N=\\ &c{0}&f - &6{1} \u0441\u0435\u043a\u0443\u043d\u0434 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c +Commands.Cooldowns.Row.Y=\\ &b{0}&f - &2\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.DoesNotExist= &c\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.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 &e{0} +Commands.AdminChatSpy.Chat=&6[\u041f\u041e\u0414\u0421\u041b\u0423\u0428\u0418\u0412\u0410\u041d\u0418\u0415: &a{0}&6] &f{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.GodMode.Toggle=\u0420\u0435\u0436\u0438\u043c \u0411\u043e\u0433\u0430 \u0432\u043a\u043b./\u043e\u0442\u043a\u043b. \u0434\u043b\u044f &e{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 &e\u0421\u0435\u0440\u0434\u0446\u0430&f. +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 &e\u041a\u0432\u0430\u0434\u0440\u0430\u0442\u044b&f. +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 &7\u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u043e&f. 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.Inspect=<\u0438\u0433\u0440\u043e\u043a> &a- \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=&a\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> &a- \u0421\u043f\u0438\u0441\u043a\u0438 \u041b\u0438\u0434\u0435\u0440\u043e\u0432 +Commands.mcc.Header=---[]&e\u041a\u043e\u043c\u0430\u043d\u0434\u044b mcMMO&c[]--- 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.mcpurge.Success=&a\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=&6-=\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&a - &6\u0420\u0430\u043d\u0433 &f#&a{0} +Commands.mcrank.Player=\u0426\u0415\u041b\u042c: &f{0} +Commands.mcrank.Skill=&e{0}&a - &6\u0420\u0430\u043d\u0433 &f#&a{1} +Commands.mcrank.Unranked=&f\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.mcremove.Success=&a{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=&6\u041f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430: \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 &c/mcrank&6 \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> &c - \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=&a\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=&a\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.Database.Start=&7\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=&7\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 &a{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: &a\u041b\u0418\u041d\u0415\u0419\u041d\u0418\u0419 &c\u0438 &a\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.mcconvert.Experience.Start=&7\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=&7\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=&a- \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.Notifications.Off=\u0423\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f \u043e\u0431 \u0443\u043c\u0435\u043d\u0438\u044f\u0445 &c\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 &a \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.Other=&a--\u0414\u0420\u0423\u0413\u0418\u0415 \u041a\u041e\u041c\u0410\u041d\u0414\u042b-- +Commands.Party.Header=-----[]&a\u0413\u0420\u0423\u041f\u041f\u0410&c[]----- +Commands.Party.Status=&8\u041d\u0410\u0417\u0412\u0410\u041d\u0418\u0415: &f{0} {1} +Commands.Party.Status.Alliance=&8\u0421\u041e\u042e\u0417: &f{0} +Commands.Party.UnlockedFeatures=&8\u0420\u0410\u0417\u0411\u041b\u041e\u041a\u0418\u0420\u041e\u0412\u0410\u041d\u041d\u042b\u0415 \u0424\u0423\u041d\u041a\u0426\u0418\u0418: &7[[ITALIC]]{0} +Commands.Party.ShareMode=&8\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=&7\u041f\u0420\u0415\u0414\u041c\u0415\u0422 &3({0}) +Commands.Party.ExpShare=&7\u041e\u041f\u042b\u0422 &3({0}) +Commands.Party.ItemShareCategories=&8\u0414\u0435\u043b\u0435\u0436 \u041f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u0432: &7[[ITALIC]]{0} +Commands.Party.MembersNear=&8\u0412\u041e\u0417\u041b\u0415 \u0412\u0410\u0421 &3{0}&8/&3{1} +Commands.Party.Accept=&a- \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 &c\u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d +Commands.Party.Chat.On=\u0413\u0440\u0443\u043f\u043f\u043e\u0432\u043e\u0439 \u0427\u0430\u0442 &c\u0432\u043a\u043b\u044e\u0447\u0435\u043d +Commands.Party.Commands=&a--\u0413\u0420\u0423\u041f\u041f\u041e\u0412\u042b\u0415 \u041a\u041e\u041c\u0410\u041d\u0414\u042b-- +Commands.Party.Invite.0=&c\u0412\u041d\u0418\u041c\u0410\u041d\u0418\u0415: &a\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=&e\u041d\u0430\u043f\u0435\u0447\u0430\u0442\u0430\u0439\u0442\u0435 &a/party accept&e, \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=&a- \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=&a\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=&7\u0423\u0447\u0430\u0441\u0442\u043d\u0438\u043a \u0413\u0440\u0443\u043f\u043f\u044b: {0} +Commands.Party.PartyFull=&6{0}&c \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 &e{0}&c \u0432 &a{1}&c \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432 \u043d\u0435\u0439 \u0443\u0436\u0435 &3{2}&c \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 &a{0}&c \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432 \u043d\u0435\u0439 \u0443\u0436\u0435 &3{1}&c \u0438\u0433\u0440\u043e\u043a\u043e\u0432! +Commands.Party.Create=&7\u0421\u043e\u0437\u0434\u0430\u043d\u0430 \u0413\u0440\u0443\u043f\u043f\u0430: {0} +Commands.Party.Rename=&7\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0433\u0440\u0443\u043f\u043f\u044b \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043e \u043d\u0430: &f{0} +Commands.Party.SetSharing=&7\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: &3{1} +Commands.Party.ToggleShareCategory=&7\u0414\u0435\u043b\u0435\u0436 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430\u043c\u0438 \u0432 \u0433\u0440\u0443\u043f\u0435 \u0434\u043b\u044f &6{0} &7 &3{1} +Commands.Party.AlreadyExists=&4\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.Members.Header=-----[]&a\u0423\u0427\u0410\u0421\u0422\u041d\u0418\u041a\u0418&c[]----- 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.Party.Quit=&a- \u041f\u043e\u043a\u0438\u043d\u0443\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0433\u0440\u0443\u043f\u043f\u0443 +Commands.Party.Teleport= &c- \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=&a- \u0412\u043a\u043b./\u043e\u0442\u043a\u043b. \u0433\u0440\u0443\u043f\u043f\u043e\u0432\u043e\u0439 \u0447\u0430\u0442 +Commands.Party1=&a- \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u0443\u044e \u0433\u0440\u0443\u043f\u043f\u0443 +Commands.Party2=&a- \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=&c-----[]&a\u0421\u041e\u042e\u0417 \u0413\u0420\u0423\u041f\u041f\u042b&c[]----- +Commands.Party.Alliance.Ally=&f{0} &8\u0412 \u0421\u041e\u042e\u0417\u0415 \u0421: &f{1} +Commands.Party.Alliance.Members.Header=&c-----[]&a\u0423\u0427\u0410\u0421\u0422\u041d\u0418\u041a\u0418 \u0421\u041e\u042e\u0417\u0410&c[]----- +Commands.Party.Alliance.Invite.0=\u0412\u041d\u0418\u041c\u0410\u041d\u0418\u0415: &a\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 &a/party alliance accept&e \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=&a\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=&c\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=&c\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 &3/party alliance disband +Commands.Party.Alliance.Help.0=&c\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=&c \u0434\u043b\u044f \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0441\u043e\u044e\u0437\u0430 &3/party alliance invite <\u0438\u0433\u0440\u043e\u043a>&c. +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 &a\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 &c\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.Request1={0} &a\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=&a\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 &e/ptp accept. &a\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 &c{0} &a\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 &a\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 &c\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.PowerLevel.Leaderboard=--\u0421\u043f\u0438\u0441\u043e\u043a \u041b\u0438\u0434\u0435\u0440\u043e\u0432 mcMMO \u043f\u043e&9 \u041e\u0431\u0449\u0435\u043c\u0443 \u0423\u0440\u043e\u0432\u043d\u044e &e-- +Commands.PowerLevel.Capped=&4\u041e\u0411\u0429\u0418\u0419 \u0423\u0420\u041e\u0412\u0415\u041d\u042c: &a{0} &4\u041c\u0410\u041a\u0421\u0418\u041c\u0410\u041b\u042c\u041d\u042b\u0419 \u0423\u0420\u041e\u0412\u0415\u041d\u042c: &e{1} +Commands.PowerLevel=&4\u041e\u0411\u0429\u0418\u0419 \u0423\u0420\u041e\u0412\u0415\u041d\u042c: &a{0} +Commands.Reset.All=&a\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=&a\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=&a-\u0421\u0431\u0440\u043e\u0441 \u0443\u0440\u043e\u0432\u043d\u044f \u043d\u0430\u0432\u044b\u043a\u0430 \u0434\u043e 0 +Commands.Scoreboard.Clear=&3\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.Scoreboard.Keep=&3\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 &a/mcscoreboard clear&3. +Commands.Scoreboard.Timer=&3\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 &6{0}&3 \u0441\u0435\u043a\u0443\u043d\u0434. +Commands.Scoreboard.Help.0=&6 == &a\u041f\u043e\u043c\u043e\u0449\u044c \u043f\u043e &c/mcscoreboard&6 == +Commands.Scoreboard.Help.1=&3/mcscoreboard&b clear &f - \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=&3/mcscoreboard&b keep &f - \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=&3/mcscoreboard&b time [n] &f - \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 &dn&f \u0441\u0435\u043a\u0443\u043d\u0434 +Commands.Scoreboard.Tip.Keep=&6\u041f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430: \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 &c/mcscoreboard keep&6 \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=&6\u041f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430: \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 &c/mcscoreboard clear&6 \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.Skill.Leaderboard=--mcMMO &9{0}&e \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.Stats=&a- \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=&a- \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} @@ -713,67 +713,67 @@ 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.Mystery=&7\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.Header=&3-=[]=====[]&6 MMO \u0418\u043d\u0444\u043e &3[]=====[]=- +Commands.MmoInfo.SubSkillHeader=&6\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435:&e {0} +Commands.MmoInfo.DetailsHeader=&3-=[]=====[]&a \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 &3[]=====[]=- +Commands.MmoInfo.OldSkill=&7mcMMO \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=&3-=[]=====[]&6 \u041c\u0435\u0445\u0430\u043d\u0438\u043a\u0438 &3[]=====[]=- 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. +Commands.Mmodebug.Toggle=mcMMO \u0420\u0415\u0416\u0418\u041c \u0414\u0415\u0411\u0410\u0413\u0410 &6{0}&7, \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. +mcMMO.NoPermission=&4\u041d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u0430\u0432. +mcMMO.NoSkillNote=&8\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.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 &3{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 &3{0} [password]. +Party.Help.2=\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 &3{0} &c\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 &3{0} [password] &c\u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0435\u043d\u0438\u0442\u044c\u0441\u044f \u0438\u043b\u0438 &3{1} &c\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 &3{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 &3{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 &3 {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 &3{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 &3{0} +Party.Help.9=\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 &3{0} &c\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 &3{0} &c\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} &a\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} &a\u043f\u043e\u043a\u0438\u043d\u0443\u043b \u0432\u0430\u0448\u0443 \u0433\u0440\u0443\u043f\u043f\u0443 +Party.InformedOnNameChange=&6{0} &a\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 &f{1} +Party.InvalidName=&4\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=&c\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=&c\u042d\u0442\u0430 \u0433\u0440\u0443\u043f\u043f\u0430 \u0443\u0436\u0435 \u0437\u0430\u043a\u0440\u044b\u0442\u0430! +Party.IsntLocked=&c\u042d\u0442\u0430 \u0433\u0440\u0443\u043f\u043f\u0430 \u043d\u0435 \u0437\u0430\u043a\u0440\u044b\u0442\u0430! +Party.Locked=&c\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=&4{0} \u043d\u0435 \u0432 \u0433\u0440\u0443\u043f\u043f\u0435 +Party.NotOwner=&4\u0412\u044b \u043d\u0435 \u043b\u0438\u0434\u0435\u0440 \u0433\u0440\u0443\u043f\u043f\u044b. +Party.Owner.New=&a{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=&4\u0412\u044b \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043b\u0438\u0434\u0435\u0440 \u0433\u0440\u0443\u043f\u043f\u044b. +Party.Owner.Player=&a\u0422\u0435\u043f\u0435\u0440\u044c \u0432\u044b \u043b\u0438\u0434\u0435\u0440 \u0433\u0440\u0443\u043f\u043f\u044b. +Party.Password.None=&c\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=&c\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=&a\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=&a\u041f\u0430\u0440\u043e\u043b\u044c \u0433\u0440\u0443\u043f\u043f\u044b \u0431\u044b\u043b \u0443\u0434\u0430\u043b\u0435\u043d. +Party.Player.Invalid=&c\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=&4{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.PlayerNotInParty=&4{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.Player=&a\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.Teleport.Target=&a{0} \u0442\u0435\u043b\u0435\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f \u043a \u0412\u0430\u043c. +Party.Teleport.Disabled=&c\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=&c\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=&c\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=&7\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.Alliance.Formed=&7\u0412\u0430\u0448\u0430 \u0433\u0440\u0443\u043f\u043f\u0430 \u0442\u0435\u043f\u0435\u0440\u044c \u0432 \u0441\u043e\u044e\u0437\u0435 \u0441 &a{0} +Party.Alliance.Disband=&7\u0412\u0430\u0448\u0430 \u0433\u0440\u0443\u043f\u043f\u0430 \u0431\u043e\u043b\u0435\u0435 \u043d\u0435 \u0432 \u0441\u043e\u044e\u0437\u0435 \u0441 &c{0} +Party.Status.Locked=&4(\u0422\u041e\u041b\u042c\u041a\u041e \u041f\u041e \u041f\u0420\u0418\u0413\u041b\u0410\u0428\u0415\u041d\u0418\u042e) +Party.LevelUp=&e\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 @@ -784,12 +784,12 @@ Party.Feature.Locked.Teleport=\u0410\u0411\u041b\u041e\u041a\u0418\u0420\u041e\u 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.Feature.Disabled.1=&c\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=&c\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=&c\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=&c\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=&c\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=&2(\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 @@ -817,155 +817,155 @@ Commands.XPGain.Swords=\u0410\u0442\u0430\u043a\u0443\u0439\u0442\u0435 \u041c\u 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.XPGain=&8\u041f\u041e\u041b\u0423\u0427\u0415\u041d\u041e \u041e\u041f\u042b\u0422\u0410: &f{0} +Commands.xplock.locked=&6\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=&6\u0412\u0430\u0448\u0430 \u043f\u0430\u043d\u0435\u043b\u044c \u043e\u043f\u044b\u0442\u0430 \u0442\u0435\u043f\u0435\u0440\u044c &a\u0420\u0410\u0417\u0411\u041b\u041e\u041a\u0418\u0420\u041e\u0412\u0410\u041d\u0410&6! 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! +Commands.Event.Start=&amcMMO&6 \u0421\u043e\u0431\u044b\u0442\u0438\u0435! +Commands.Event.Stop=&amcMMO&3 \u0421\u043e\u0431\u044b\u0442\u0438\u0435 \u0417\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u043e\u0441\u044c! +Commands.Event.Stop.Subtitle=&a\u041d\u0430\u0434\u0435\u044e\u0441\u044c \u0442\u044b \u043f\u043e\u0432\u0435\u0441\u0435\u043b\u0438\u043b\u0441\u044f! +Commands.Event.XP=&3\u041c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043e\u043f\u044b\u0442\u0430 \u0441\u0435\u0439\u0447\u0430\u0441 &6{0}&3x +Commands.xprate.started.0=&6\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=&6\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} +Server.ConsoleName=&e[\u0421\u0435\u0440\u0432\u0435\u0440] +Notifications.Admin.XPRate.Start.Self=&7\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 &6{0}x +Notifications.Admin.XPRate.End.Self=&7\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} &7\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} &7\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=&6(&amcMMO &3Admin&6) &7{0} +Notifications.Admin.Format.Self=&6(&amcMMO&6) &7{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! +XPRate.Event=&6\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.Available=&7\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=&6-=&a{0} \u0420\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e&6=- 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. +Guides.Acrobatics.Section.0=&3\u041e \u043d\u0430\u0432\u044b\u043a\u0435 \u0410\u043a\u0440\u043e\u0431\u0430\u0442\u0438\u043a\u0430:\n&e\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&e\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&3\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u043f\u044b\u0442\u0430:\n&e\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&e\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=&3\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0443\u043c\u0435\u043d\u0438\u0435 \u041f\u0440\u044b\u0436\u043e\u043a?\n&e\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&e\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&e\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0443\u0434\u0432\u043e\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0448\u0430\u043d\u0441.\n&e\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&e\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&e\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&e\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=&3\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&e\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&e\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&e\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) +Guides.Alchemy.Section.0=&3\u041e \u043d\u0430\u0432\u044b\u043a\u0435 \u0410\u043b\u0445\u0438\u043c\u0438\u044f:\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\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u041a\u0430\u0442\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440?\n&e\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&e\u043c\u0430\u043a\u0441. \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e 4x \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 1000.\n&e\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=&3\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043e\u0442\u0432\u0430\u0440\u044b?\n&e\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&e\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&e\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=&3\u041e\u0442\u0432\u0430\u0440\u044b 1 \u0442\u0438\u0440\u0430 (\u0438\u043d\u0433\u0440\u0438\u0434\u0438\u0435\u043d\u0442\u044b):\n&e\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&e\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&e\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&e\u0418\u0433\u043b\u043e\u0431\u0440\u044e\u0445\n&e(\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0437\u0435\u043b\u044c\u044f) +Guides.Alchemy.Section.4=&3\u041e\u0442\u0432\u0430\u0440\u044b 2 \u0442\u0438\u0440\u0430 (\u0438\u043d\u0433\u0440\u0438\u0434\u0438\u0435\u043d\u0442\u044b):\n&e\u041c\u043e\u0440\u043a\u043e\u0432\u044c (\u0417\u0435\u043b\u044c\u0435 \u0421\u043a\u043e\u0440\u043e\u0441\u0442\u0438)\n&e\u0421\u043b\u0438\u0437\u044c (\u0417\u0435\u043b\u044c\u0435 \u0422\u0443\u043f\u043e\u0441\u0442\u0438)\n\n&3\u041e\u0442\u0432\u0430\u0440\u044b 3 \u0442\u0438\u0440\u0430 (\u0438\u043d\u0433\u0440\u0438\u0434\u0438\u0435\u043d\u0442\u044b):\n&e\u041a\u0432\u0430\u0440\u0446 (\u0417\u0435\u043b\u044c\u0435 \u041f\u043e\u0433\u043b\u043e\u0449\u0435\u043d\u0438\u044f)\n&e\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=&3\u041e\u0442\u0432\u0430\u0440\u044b 4 \u0442\u0438\u0440\u0430 (\u0438\u043d\u0433\u0440\u0438\u0434\u0438\u0435\u043d\u0442\u044b):\n&e\u042f\u0431\u043b\u043e\u043a\u043e (\u0417\u0435\u043b\u044c\u0435 \u0414\u043e\u043f. \u0417\u0434\u043e\u0440\u043e\u0432\u044c\u044f)\n&e\u0413\u043d\u0438\u043b\u0430\u044f \u041f\u043b\u043e\u0442\u044c (\u0417\u0435\u043b\u044c\u0435 \u0413\u043e\u043b\u043e\u0434\u0430)\n\n&3\u041e\u0442\u0432\u0430\u0440\u044b 5 \u0442\u0438\u0440\u0430 (\u0438\u043d\u0433\u0440\u0438\u0434\u0438\u0435\u043d\u0442\u044b):\n&e\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&e\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=&3\u041e\u0442\u0432\u0430\u0440\u044b 6 \u0442\u0438\u0440\u0430 (\u0438\u043d\u0433\u0440\u0438\u0434\u0438\u0435\u043d\u0442\u044b):\n&e\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&3\u041e\u0442\u0432\u0430\u0440\u044b 7 \u0442\u0438\u0440\u0430 (\u0438\u043d\u0433\u0440\u0438\u0434\u0438\u0435\u043d\u0442\u044b):\n&e\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&3\u041e\u0442\u0432\u0430\u0440\u044b 8 \u0442\u0438\u0440\u0430 (\u0438\u043d\u0433\u0440\u0438\u0434\u0438\u0435\u043d\u0442\u044b):\n&e\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. +Guides.Archery.Section.0=&3\u041e \u043d\u0430\u0432\u044b\u043a\u0435 \u041b\u0443\u043a\u0438:\n&e\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&e\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&e\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&e\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&3\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u043f\u044b\u0442\u0430:\n&e\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=&3\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&e\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&e\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&e\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&e\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&e\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=&3\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&e\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&e\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&e\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&e\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=&3\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&e\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&e\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&e\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&e\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&e100% \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. +Guides.Axes.Section.0=&3\u041e \u043d\u0430\u0432\u044b\u043a\u0435 \u0422\u043e\u043f\u043e\u0440\u044b:\n&e\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&e\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&e\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&e\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&e\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&e\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&e\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&3\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u043f\u044b\u0442\u0430:\n&e\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&e\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=&3\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&e\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&e\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&e\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=&3\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&e\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&e\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&e\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&e\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&e\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=&3\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&e\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&e\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&e\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&e\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=&3\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&e\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&e\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&e\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=&3\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&e\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&e\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&e\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&e\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&e\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. +Guides.Excavation.Section.0=&3\u041e \u043d\u0430\u0432\u044b\u043a\u0435 \u0420\u0430\u0441\u043a\u043e\u043f\u043a\u0438:\n&e\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&e\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&e\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&3\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u043f\u044b\u0442\u0430:\n&e\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&e\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=&3\u0421\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b:\n&e\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=&3\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&e\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&e\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&e\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=&3\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u041c\u0435\u0433\u0430 \u0411\u0443\u0440?\n&e\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&e\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&e\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=&3\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&e\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&e\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&e\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&e\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&e\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&e\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&e\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&e\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&e\u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u0439\u0442\u0438 \u0432 \u0413\u0440\u0430\u0432\u0438\u0438. +Guides.Excavation.Section.5=&3\u0417\u0430\u043c\u0435\u0442\u043a\u0438 \u043e \u043d\u0430\u0432\u044b\u043a\u0435 \u0420\u0430\u0441\u043a\u043e\u043f\u043a\u0438:\n&e\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&e\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. +Guides.Fishing.Section.0=&3\u041e \u043d\u0430\u0432\u044b\u043a\u0435 \u0420\u044b\u0431\u043e\u043b\u043e\u0432\u0441\u0442\u0432\u043e:\n&e\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&e\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&3\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u043f\u044b\u0442\u0430:\n&e\u0412\u0441\u0435 \u043f\u0440\u043e\u0441\u0442\u043e - \u043b\u043e\u0432\u0438\u0442\u0435 \u0440\u044b\u0431\u0443. +Guides.Fishing.Section.1=&3\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&e\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&e\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&e\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&e\u0447\u0442\u043e\u0431\u044b \u0435\u0433\u043e \u043d\u0430\u0439\u0442\u0438.\n\n&e\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&e\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=&3\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&e\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&e\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&e\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=&3\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&e\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&e\u043f\u0440\u0438 \u043f\u043e\u0435\u0434\u0430\u043d\u0438\u0438 \u0440\u044b\u0431\u044b. +Guides.Fishing.Section.4=&3\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&e\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&e\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&e\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&e\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=&3\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&e\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&e\u043f\u0440\u0438 \u043f\u043e\u0435\u0434\u0430\u043d\u0438\u0438 \u0440\u044b\u0431\u044b. +Guides.Fishing.Section.6=&3\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&e\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&e\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. +Guides.Herbalism.Section.0=&3\u041e \u043d\u0430\u0432\u044b\u043a\u0435 \u0422\u0440\u0430\u0432\u043d\u0438\u0447\u0435\u0441\u0442\u0432\u043e:\n&e\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&3\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u043f\u044b\u0442\u0430:\n&e\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=&3\u0421\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0435 \u0440\u0430\u0441\u0442\u0435\u043d\u0438\u044f:\n&e\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&e\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&e\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=&3\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&e\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&e\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&e\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&e\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&e\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&e\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=&3\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&e\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&e\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&e\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=&3\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&e\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&e\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&e\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=&3\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&e\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&e\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&e\u041c\u043e\u0440\u043a\u043e\u0432\u0438 \u0438 \u041a\u0430\u0440\u0442\u043e\u0448\u043a\u0438. +Guides.Herbalism.Section.6=&3\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&e\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&e\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=&3\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&e\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. +Guides.Mining.Section.0=&3\u041e \u043d\u0430\u0432\u044b\u043a\u0435 \u0428\u0430\u0445\u0442\u0435\u0440\u0441\u0442\u0432\u043e:\n&e\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&e\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&3\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u043f\u044b\u0442\u0430:\n&e\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&e\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=&3\u0421\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0435 \u0411\u043b\u043e\u043a\u0438:\n&e\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&e\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&e\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=&3\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&e\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&e\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&e\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=&3\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u0421\u0443\u043f\u0435\u0440 \u0414\u0440\u043e\u0431\u0438\u043b\u043a\u0430?\n&e\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&e\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&e\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=&3\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&e\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&e\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&e\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=&3\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&e\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&e\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&e\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&e\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&e\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&e\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&e\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. +Guides.Repair.Section.0=&3\u041e \u043d\u0430\u0432\u044b\u043a\u0435 \u0420\u0435\u043c\u043e\u043d\u0442:\n&e\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&e\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432. \n\n&3\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u043f\u044b\u0442\u0430:\n&e\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&e\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&e\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=&3\u041a\u0430\u043a \u0440\u0435\u043c\u043e\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0435\u0449\u0438?\n&e\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&e\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=&3\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&e\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&e\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=&3\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&e\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&e\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&e\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=&3\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&e\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&e\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&e\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&e\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. +Guides.Salvage.Section.0=&3\u041e \u043f\u0435\u0440\u0435\u0440\u0430\u0431\u043e\u0442\u043a\u0435:\n&e\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&e\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432.\n\n&3\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u043f\u044b\u0442\u0430:\n&e\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&e\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=&3\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&e\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&e\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&e\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&e\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=&3\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&e\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&e\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&e\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&e\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&e\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&e\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=&3\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&e\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&e\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&e(\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&e33,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&e\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&e\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&e\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=&3\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&e\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&e\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&e\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&e\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&e\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&e\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. +Guides.Swords.Section.0=&3\u041e \u043d\u0430\u0432\u044b\u043a\u0435 \u041c\u0435\u0447\u0438:\n&e\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&3\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u043f\u044b\u0442\u0430:\n&e\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&e\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=&3\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&e\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&e\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&e\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&e\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=&3\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&e\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&e\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=&3\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&e\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&e\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&e\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&e\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. +Guides.Taming.Section.0=&3\u041e \u043d\u0430\u0432\u044b\u043a\u0435 \u0423\u043a\u0440\u043e\u0449\u0435\u043d\u0438\u0435:\n&e\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&e\u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0437\u0432\u0435\u0440\u0435\u0439.\n\n&3\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u043f\u044b\u0442\u0430:\n&e\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&e\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=&3\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&e\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&e\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&e\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=&3\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&e\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&e\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&e\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=&3\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0443\u043c\u0435\u043d\u0438\u0435 \u0423\u043a\u0443\u0441?\n&e\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&e\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=&3\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&e\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&e\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=&3\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&e\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&e\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&e\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=&3\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&e\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&e\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=&3\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&e\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&e\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=&3\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&e\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&e\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. +Guides.Unarmed.Section.0=&3\u041e \u043d\u0430\u0432\u044b\u043a\u0435 \u0411\u0435\u0437\u043e\u0440\u0443\u0436\u043d\u044b\u0439:\n&e\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&e\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&3\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u043f\u044b\u0442\u0430:\n&e\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&e\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=&3\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&e\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&e\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&e\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=&3\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&e\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&e\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=&3\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&e\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&e\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&e\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=&3\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&e\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&e\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=&3\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&e\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&e\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. +Guides.Woodcutting.Section.0=&3\u041e \u043d\u0430\u0432\u044b\u043a\u0435 \u041b\u0435\u0441\u043e\u0440\u0443\u0431\u0441\u0442\u0432\u043e:\n&e\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&3\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u043f\u044b\u0442\u0430:\n&e\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=&3\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&e\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&e\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&e\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&e\u0432\u044b\u043f\u0430\u0434\u0443\u0442 \u0437\u0430 \u0440\u0430\u0437. +Guides.Woodcutting.Section.2=&3\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&e\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&e\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&e\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=&3\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&e\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&e\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} +Effects.Child=&8\u0423\u0420\u041e\u0412\u0415\u041d\u042c: &a{0} +Effects.Child.Overhaul=&3\u041d\u0410\u0421\u041b\u0415\u0414\u0421\u0422\u0412\u0415\u041d\u041d\u042b\u0419 \u0423\u0420.&e {0}&3: {1} +Effects.Child.ParentList=&a{0}&6(&3\u0423\u0420.&e{1}&6) +Effects.Level=&8\u0423\u0420\u041e\u0412\u0415\u041d\u042c: &a{0} &3\u041e\u041f\u042b\u0422&e(&6{1}&e/&6{2}&e) +Effects.Level.Overhaul=&6\u0423\u0420\u041e\u0412\u0415\u041d\u042c: &e{0} &3\u041e\u041f\u042b\u0422\u0410&e(&6{1}&e/&6{2}&e) +Effects.Parent=&6{0} - +Effects.Template=&3{0}: &a{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]]] +Commands.XPGain.Overhaul=&6\u041e\u043f\u044b\u0442\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043e: &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[&f\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u0441\u043a\u0438\u043b\u043b \u043d\u0430 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} \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d \u0434\u043e [[RESET]][[GREEN]][[BOLD]]{2}[[RESET]][[WHITE]]. +Overhaul.Levelup=&l{0} \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d \u0434\u043e &r&a&l{2}&r&f. 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 @@ -984,119 +984,119 @@ Overhaul.Name.Woodcutting=\u041b\u0435\u0441\u043e\u0440\u0443\u0431\u0441\u0442 # 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\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.&6{0} +XPBar.Alchemy=\u0410\u043b\u0445\u0438\u043c\u0438\u044f \u0443\u0440..&6{0} +XPBar.Archery=\u041b\u0443\u043a\u0438 \u0443\u0440.&6{0} +XPBar.Axes=\u0422\u043e\u043f\u043e\u0440\u044b \u0443\u0440.&6{0} +XPBar.Excavation=\u0420\u0430\u0441\u043a\u043e\u043f\u043a\u0438 \u0443\u0440.&6{0} +XPBar.Fishing=\u0420\u044b\u0431\u043e\u043b\u043e\u0432\u0441\u0442\u0432\u043e \u0443\u0440.&6{0} +XPBar.Herbalism=\u0422\u0440\u0430\u0432\u043d\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0443\u0440.&6{0} +XPBar.Mining=\u0428\u0430\u0445\u0442\u0435\u0440\u0441\u0442\u0432\u043e \u0443\u0440.&6{0} +XPBar.Repair=\u041f\u043e\u0447\u0438\u043d\u043a\u0430 \u0443\u0440.&6{0} +XPBar.Salvage=\u041f\u0435\u0440\u0435\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0443\u0440.&6{0} +XPBar.Smelting=\u0412\u044b\u043f\u043b\u0430\u0432\u043a\u0430 \u0443\u0440.&6{0} +XPBar.Swords=\u041c\u0435\u0447\u0438 \u0443\u0440.&6{0} +XPBar.Taming=\u0423\u043a\u0440\u043e\u0449\u0435\u043d\u0438\u0435 \u0443\u0440.&6{0} +XPBar.Unarmed=\u0411\u0435\u0437\u043e\u0440\u0443\u0436\u043d\u044b\u0439 \u0443\u0440.&6{0} +XPBar.Woodcutting=\u041b\u0435\u0441\u043e\u0440\u0443\u0431\u0441\u0442\u0432\u043e \u0443\u0440.&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 #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.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 &e{0} +Inspect.Stats=&amcMMO \u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430 \u0434\u043b\u044f &e{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! #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.ChimaeraWing.Lore=&7\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 &e{0}&c \u0431\u043e\u043b\u044c\u0448\u0435 &6{1}&c! +Item.NotEnough=\u0412\u0430\u043c \u043d\u0443\u0436\u043d\u043e &e{0}&c \u0431\u043e\u043b\u044c\u0448\u0435 &6{1}&c! +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! &e({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. &e({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.FluxPickaxe.Lore.1=&7\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=&7\u041d\u0443\u0436\u0435\u043d \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043f\u0435\u0440\u0435\u043f\u043b\u0430\u0432\u043a\u0438 {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\u0422\u0435\u043b\u0435\u043f\u043e\u0440\u0442\u0430\u0446\u0438\u044f \u0447\u0435\u0440\u0435\u0437 &6({0}) &7\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=&4\u0422\u0435\u043b\u0435\u043f\u043e\u0440\u0442\u0430\u0446\u0438\u044f \u043e\u0442\u043c\u0435\u043d\u0435\u043d\u0430! #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.Child=&6(\u041d\u0410\u0421\u041b\u0415\u0414\u0421\u0422\u0412\u0415\u041d\u041d\u042b\u0419 \u041d\u0410\u0412\u042b\u041a) +Skills.Disarmed=&4\u0412\u044b \u043e\u0431\u0435\u0437\u043e\u0440\u0443\u0436\u0435\u043d\u044b! +Skills.Header=-----[]&a{0}&c[]----- +Skills.NeedMore=&4\u0412\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0435 &7{0} +Skills.NeedMore.Extra=&4\u0412\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0435 &7{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.Stats={0}&a{1}&3 \u041e\u041f\u042b\u0422(&7{2}&3/&7{3}&3) +Skills.ChildStats={0}&a{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.ConfirmOrCancel=&a\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 &6{0}&a. \u041b\u041a\u041c \u0434\u043b\u044f \u043e\u0442\u043c\u0435\u043d\u044b. +Skills.AbilityGateRequirementFail=&7\u0412\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0435\u0449\u0435 &e{0}&7 \u0443\u0440\u043e\u0432\u043d\u0435\u0439 &3{1}&7 \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. #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-=\u0411\u041e\u0415\u0412\u042b\u0415 \u041d\u0410\u0412\u042b\u041a\u0418=- +Stats.Header.Gathering=&6-=\u041d\u0410\u0412\u042b\u041a\u0418 \u0421\u0411\u041e\u0420\u0410=- +Stats.Header.Misc=&6-=\u0420\u0410\u0417\u041d\u042b\u0415 \u041d\u0410\u0412\u042b\u041a\u0418=- +Stats.Own.Stats=&a[mcMMO] \u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430 #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.Lucky.Bonus=&6 ({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.ActivationTime.Bonus=&6 ({0}% \u0441 \u0421\u0447\u0430\u0441\u0442\u043b\u0438\u0432\u044b\u043c \u041f\u0435\u0440\u043a\u043e\u043c) #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.Mode.Disabled=&6[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=&6[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.DeathStatLoss.PlayerDeath=&6[mcMMO] &4\u0412\u044b \u043f\u043e\u0442\u0435\u0440\u044f\u043b\u0438 &9{0}&4 \u043f\u0440\u0438 \u0441\u043c\u0435\u0440\u0442\u0438. +Hardcore.DeathStatLoss.PercentageChanged=&6[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.Vampirism.Killer.Failure=&6[mcMMO] &e{0}&7 \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=&6[mcMMO] &3\u0412\u044b \u0443\u043a\u0440\u0430\u043b\u0438 &9{0}&3 \u0443\u0440\u043e\u0432\u043d\u0435\u0439 \u0443 &e{1}. +Hardcore.Vampirism.Victim.Failure=&6[mcMMO] &e{0}&7 \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=&6[mcMMO] &e{0}&4 \u0443\u043a\u0440\u0430\u043b \u0443 \u0432\u0430\u0441 &9{1}&4 \u0443\u0440\u043e\u0432\u043d\u0435\u0439! +Hardcore.Vampirism.PercentageChanged=&6[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}. #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.Donate=&3\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=&6[mcMMO] &3\u0420\u0435\u0436\u0438\u043c \u0425\u0430\u0440\u0434\u043a\u043e\u0440 \u0432\u043a\u043b\u044e\u0447\u0435\u043d: &4{0} +MOTD.Hardcore.DeathStatLoss.Stats=&6[mcMMO] &3\u041d\u0430\u0432\u044b\u043a \u0421\u043c\u0435\u0440\u0442\u043d\u043e\u0439 \u041a\u0430\u0437\u043d\u0438: &4{0}% +MOTD.Hardcore.Vampirism.Stats=&6[mcMMO] &3\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: &4{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.Version=&6[mcMMO] \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432\u0435\u0440\u0441\u0438\u044f &3{0} +MOTD.Website=&6[mcMMO] &a{0}&e - \u0421\u0430\u0439\u0442 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.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: &e{0}x +Smelting.Ability.FluxMining=\u0428\u0430\u043d\u0441 \u041f\u043e\u0442\u043e\u043a\u043e\u0432\u043e\u0439 \u0414\u043e\u0431\u044b\u0447\u0438: &e{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.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: &e{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.Ability.SecondSmelt=\u0428\u0430\u043d\u0441 \u0412\u0442\u043e\u0440\u043e\u0439 \u0412\u044b\u043f\u043b\u0430\u0432\u043a\u0438: &e{0} +Smelting.Ability.VanillaXPBoost=\u041c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u044c \u041e\u043f\u044b\u0442\u0430: &e{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.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: &e{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.FluxMining.Success=&a\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 #COMMAND DESCRIPTIONS @@ -1135,34 +1135,34 @@ Commands.Description.xprate=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0 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. #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\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430 mcMMO +Scoreboard.Header.PlayerCooldowns=&e\u041a\u0443\u043b\u0434\u0430\u0443\u043d\u044b mcMMO +Scoreboard.Header.PlayerRank=&e\u0420\u0430\u043d\u0436\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 mcMMO +Scoreboard.Header.PlayerInspect=&e\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430 mcMMO: +Scoreboard.Header.PowerLevel=&c\u0423\u0440\u043e\u0432\u0435\u043d\u044c \u0421\u0438\u043b\u044b +Scoreboard.Misc.PowerLevel=&6\u0423\u0440\u043e\u0432\u0435\u043d\u044c \u0421\u0438\u043b\u044b +Scoreboard.Misc.Level=&3\u0423\u0440\u043e\u0432\u0435\u043d\u044c +Scoreboard.Misc.CurrentXP=&a\u0422\u0435\u043a\u0443\u0449\u0438\u0439 \u043e\u043f\u044b\u0442 +Scoreboard.Misc.RemainingXP=&e\u041e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u043e\u043f\u044b\u0442 +Scoreboard.Misc.Cooldown=&d\u041a\u0443\u043b\u0434\u0430\u0443\u043d +Scoreboard.Misc.Overall=&6\u041e\u0431\u0449\u0438\u0439 +Recovery.Notice=\u0423\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0435: mcMMO &4\u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435.&c \u041f\u043e\u0432\u0442\u043e\u0440 5 \u0440\u0430\u0437... +Recovery.Success=&a\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 &b\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&e\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&l\u043d\u0435 \u0431\u0443\u0434\u0435\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0443\u0440\u043e\u0432\u043d\u0438 mcMMO&e \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c\u044b\u0439 \u0432\u0430\u043c\u0438 \u043e\u043f\u044b\u0442 &l\u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d&e. +Recovery.AdminFailureNotice=&4[A]&c 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 &e{0}&c. &d\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. #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\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=&a\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=&cmcMMO \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 &a{0}&c \u0440\u0430\u0437.&c \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=&4[A]&c 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 &e{0}&c. &d\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}. #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} \u0442\u0435\u043f\u0435\u0440\u044c \u0443\u0440\u043e\u0432\u043d\u044f &a{1}&6! +Holiday.Anniversary=&9\u0421 {0} \u0413\u043e\u0434\u043e\u0432\u0449\u0438\u043d\u043e\u0439!\n&9\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! #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\u041b\u043e\u043a\u0430\u043b\u044c \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u0430! #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\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 &c{0}&e. \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=&6(&amcMMO&6) &e\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 &c{0}&e \u0434\u043b\u044f &6{1}&e. \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. 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_sv.properties b/src/main/resources/locale/locale_sv.properties index 255a11f74..3896d58b6 100644 --- a/src/main/resources/locale/locale_sv.properties +++ b/src/main/resources/locale/locale_sv.properties @@ -1,4 +1,4 @@ -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}) @@ -9,40 +9,40 @@ Archery.SubSkill.ArrowRetrieval.Description=Chans f\u00f6r att \u00e5terta pilar 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.Ability.Lower=&7**DU S\u00c4NKER FIN YXA** +Axes.Combat.CritStruck=&4Du var KRITISKT skadad Axes.Combat.GI.Struck=**SLAGEN AV ST\u00d6RRE EFFEKT** -Axes.Combat.SS.Length=Skallsplittrare l\u00e4ngd [[YELLOW]]{0}s +Axes.Combat.SS.Length=Skallsplittrare l\u00e4ngd &e{0}s Axes.SubSkill.CriticalStrikes.Description=Dubbel Skada Axes.SubSkill.AxeMastery.Description=L\u00e4gger 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.Skills.SS.On=&a**Skallsplittrare AKTIVERAD** +Axes.Skills.SS.Refresh=&aYour [[YELLOW]Skallsplittrar &af\u00f6rm\u00e5gan \u00e4r vederkvickad! +Axes.Skills.SS.Other.On=&a{0}&2 har anv\u00e4nt &cSkallsplittrare! Axes.Skillup=Yxf\u00e4rdigheten har \u00f6kat med {0}. Totalt ({1}) -Excavation.Ability.Ready=[[GREEN]]**DU H\u00d6JER DIN SPADE** +Excavation.Ability.Ready=&a**DU H\u00d6JER DIN SPADE** Excavation.Listener=Gr\u00e4vning: Excavation.SkillName=Gr\u00e4vning -Excavation.Skills.GigaDrillBreaker.On=[[GREEN]]**GIGA BORR KROSSAREN AKTIVERAD** +Excavation.Skills.GigaDrillBreaker.On=&a**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** +Fishing.Ability.TH.MagicFound=&7 Du f\u00e5r en k\u00e4nsla av magi med denna f\u00e5ngst.... +Herbalism.Ability.GTh=&a**GR\u00d6NA FINGRAR** +Herbalism.Ability.Ready=&a**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** +Herbalism.Skills.GTe.Refresh=&aDina&eGr\u00f6na fingrar &af\u00f6rm\u00e5ga \u00e4r vederkvickad! +Herbalism.Skills.GTe.Other.Off=[[RED]Gr\u00f6na fingrar[GREEN]] har avklingat f\u00f6r &e{0} +Herbalism.Skills.GTe.Other.On=&a{0}&2 har anv\u00e4nt &cGr\u00f6n Jord! +Mining.Ability.Length=Superbrytarl\u00e4ngd: &e{0}s +Mining.Ability.Lower=&7**DU S\u00c4NKER DIN HACKA** +Mining.Ability.Ready=&a**DU F\u00d6RBEREDER 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.Skills.SuperBreaker.Other.Off=Supebrytning&a har avklingat f\u00f6r &e{0} +Mining.Skills.SuperBreaker.Refresh=&aDin &eSuperbrytar &af\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.Blast.Radius.Increase=\u00d6KNING AV SPR\u00c4NGNINGSRADIEN: &e+{0} +Mining.Blast.Rank=Explosions Gruvdrift: &e Grad {0}/8 &7({1}) +Mining.Blast.Other.On=&a{0}&2 har anv\u00e4nt &cExplosions Gruvdrift +Mining.Blast.Refresh=&aDin &eExplosionshacknings &af\u00f6rm\u00e5ga har vederkvickas! Repair.SubSkill.Repair.Name=Reparera Repair.SubSkill.RepairMastery.Name=Reparationsm\u00e4stare Repair.SubSkill.RepairMastery.Description=\u00d6kad reparationsm\u00e4ngd @@ -54,82 +54,82 @@ 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.Skills.AdeptDiamond=&4Du \u00e4r inte skicklig nog f\u00f6r att reparera Diamant. +Repair.Skills.AdeptGold=&4Du \u00e4r inte skicklig nog f\u00f6r att reparera Guld. +Repair.Skills.AdeptStone=&4Du \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.Chance.Downgrade=&7AF Chans f\u00f6r nedgradering: &e{0}% +Repair.Arcane.Chance.Success=&7AF Framg\u00e5ngsgrad: &e{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.Ability.Lower=&7**DU S\u00c4NKER DITT SV\u00c4RD** +Swords.Ability.Ready=&a**DU G\u00d6R DIG REDO MED SV\u00c4RDET** +Swords.Combat.Bleeding.Stopped=&7F\u00f6rbl\u00f6dningen har &astoppats&7! +Swords.Combat.Bleeding=&a**FIENDEN BL\u00d6DER** +Swords.Combat.Counter.Hit=&4Tr\u00e4ff med en motattack +Swords.Combat.Countered=&a**MOTATTACK** +Swords.Combat.SS.Struck=&4Tr\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! +Swords.Skills.SS.On=&a**S\u00c5GTANDADE SLAG AKTIVERADE** +Swords.Skills.SS.Refresh=&aDina &eBl\u00f6dande slag &ahar vederkvickas! +Swords.Skills.SS.Other.Off=S\u00e5gtandat slag&a hat avklingat h\u00e4r f\u00f6r &e{0} +Swords.Skills.SS.Other.On=&a{0}&2 har anv\u00e4nt &cS\u00e5gtandat slag! Taming.Ability.Bonus.2=Tjock P\u00e4ls Taming.SubSkill.ShockProof.Name=Shocks\u00e4ker 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.CallOfTheWild.Description.2=&7COTW (Ocelot): Huka och v\u00e4nster-klicka med {0} Fisk i handen +Taming.Effect.15=&7COTW (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.Wolf=&8din 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.Ability.Berserk.Length=Berserk l\u00e4ngd: &e{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! +Unarmed.Skills.Berserk.Other.Off=B\u00e4rs\u00e4rk&a har avklingat f\u00f6r &e{0} +Unarmed.Skills.Berserk.Other.On=&a{0}&2 har anv\u00e4nt &cB\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 +Woodcutting.Skills.TreeFeller.Refresh=[[GREEN]Din &etr\u00e4df\u00e4llarkraft &ahar vederkvickats! +Woodcutting.Skills.TreeFeller.Other.Off=tr\u00e5df\u00e4llning&a har avklingat f\u00f6r &e{0} +Woodcutting.Skills.TreeFeller.Other.On=&a{0}&2 har anv\u00e4nt &cTr\u00e4d f\u00e4llare 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 +Ability.Generic.Template.Lock=&7{0} +Ability.Generic.Template=&6{0}: &3{1} +Combat.BeastLore=&a**MONSTERKUNSKAP** +Combat.BeastLoreHealth=&3H\u00e4lsa (&a{0}&3/{1}) +Combat.TouchedFuzzy=&4R\u00f6rde luddigt. K\u00e4nde suddigt. +Commands.AdminChat.Off=Admin chatt endast &cAv Commands.AdminToggle=- V\u00e4xla admin chat Commands.Disabled=Det h\u00e4r kommandot \u00e4r avst\u00e4ngt. 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.Party.Invite.Accepted=&aF\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.mmoedit=[player] &c - \u00c4ndra m\u00e5l Commands.ModDescription=- L\u00e4s 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.Chat.Off=Endast Gruppchat &cav. +Commands.Party.Invite.0=VARNING: &aDu 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.PowerLevel.Leaderboard=--mcMMO&9 Kraftniv\u00e5&eLeaderboard-- +Commands.PowerLevel=&4KRAFTNIV\u00c5: &a{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. +mcMMO.NoSkillNote=&8Om 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 +Party.Teleport.Target=&a{0} har teleporterat till dig. +Party.Unlocked=&7Gruppen \u00e4r nu uppl\u00e5st Commands.XPGain.Axes=Anfallande monster Commands.XPGain.Excavation=Gr\u00e4va och hitta skatter Commands.XPGain.Fishing=Fiske (Ta reda p\u00e5 det!) @@ -137,18 +137,18 @@ Commands.XPGain.Herbalism=Sk\u00f6rda \u00f6rter 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.XPGain=&8XP \u00d6KAT: &f{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! +XPRate.Event=&6mcMMO \u00e4r f\u00f6rnuvarande med i ett XP evenemang! XP f\u00f6rh\u00e5llandet ligger p\u00e5 {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\u00f6r en liten stund sedan och m\u00e5ste v\u00e4nta med att anv\u00e4nda den h\u00e4r skillen. &e({0}s) +Skills.Disarmed=&4Du har avv\u00e4pnats! +Stats.Header.Combat=&6-=Stridsf\u00e4rdigheter=- +Stats.Header.Gathering=&6-=SAMLA F\u00d6RM\u00c5GOR=- +Stats.Header.Misc=&6-=Varierande F\u00e4rdogheter=- +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 af688ec3a..1882de9eb 100644 --- a/src/main/resources/locale/locale_th_TH.properties +++ b/src/main/resources/locale/locale_th_TH.properties @@ -1,6 +1,6 @@ -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**\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 Graceful Landing** +Acrobatics.Combat.Proc=&a**Dodged** +Acrobatics.DodgeChance=Dodge \u0e42\u0e2d\u0e01\u0e32\u0e2a: &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.GracefulRoll.Name=Graceful Roll @@ -8,14 +8,14 @@ Acrobatics.SubSkill.GracefulRoll.Description=\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e1 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.SubSkill.Roll.Chance=Roll \u0e42\u0e2d\u0e01\u0e32\u0e2a: &e{0} +Acrobatics.SubSkill.Roll.GraceChance=Graceful Roll \u0e42\u0e2d\u0e01\u0e32\u0e2a: &e{0} Acrobatics.Roll.Text=**\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 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} +Archery.Combat.DazeChance=Daze \u0e42\u0e2d\u0e01\u0e32\u0e2a: &e{0} +Archery.Combat.RetrieveChance=Retrieve Arrows \u0e42\u0e2d\u0e01\u0e32\u0e2a: &e{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: &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 @@ -31,14 +31,14 @@ 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.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.Ability.Lower=&7**\u0e22\u0e01\u0e40\u0e25\u0e34\u0e01\u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30\u0e02\u0e2d\u0e07 Axe** +Axes.Ability.Ready=&a**\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=&4\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: &e{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.Proc=&a**\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.Combat.SS.Length=Skull Splitter \u0e21\u0e35\u0e23\u0e30\u0e22\u0e30\u0e40\u0e27\u0e25\u0e32: &e{0}\u0e27\u0e34\u0e19\u0e32\u0e17\u0e35 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.CriticalStrikes.Name=Critical Strikes @@ -52,35 +52,35 @@ Axes.SubSkill.GreaterImpact.Description=\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e04\u0e Axes.Listener=\u0e17\u0e31\u0e01\u0e29\u0e30 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.Skills.SS.On=&a**\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 Skull Splitter** +Axes.Skills.SS.Refresh=&a\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e17\u0e31\u0e01\u0e29\u0e30 &eSkull Splitter &a\u0e04\u0e39\u0e25\u0e14\u0e32\u0e27\u0e19\u0e4c\u0e40\u0e2a\u0e23\u0e47\u0e08\u0e41\u0e25\u0e49\u0e27! +Axes.Skills.SS.Other.Off=Skull Splitter&a \u0e23\u0e2d\u0e01\u0e32\u0e23\u0e04\u0e39\u0e25\u0e14\u0e32\u0e27\u0e19\u0e4c &e{0} +Axes.Skills.SS.Other.On=&a{0}&2 \u0e44\u0e14\u0e49\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 &cSkull 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** +Excavation.Ability.Lower=&7**\u0e22\u0e01\u0e40\u0e25\u0e34\u0e01\u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30\u0e02\u0e2d\u0e07 Shovel** +Excavation.Ability.Ready=&a**\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** 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.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.Effect.Length=Giga Drill Breaker \u0e21\u0e35\u0e23\u0e30\u0e22\u0e30\u0e40\u0e27\u0e25\u0e32: &e{0}\u0e27\u0e34\u0e19\u0e32\u0e17\u0e35 Excavation.Listener=\u0e17\u0e31\u0e01\u0e29\u0e30 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.Skills.GigaDrillBreaker.On=&a**\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 GIGA DRILL BREAKER** +Excavation.Skills.GigaDrillBreaker.Refresh=&a\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e17\u0e31\u0e01\u0e29\u0e30 &eGiga Drill Breaker &a\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&a \u0e23\u0e2d\u0e01\u0e32\u0e23\u0e04\u0e39\u0e25\u0e14\u0e32\u0e27\u0e19\u0e4c &e{0} +Excavation.Skills.GigaDrillBreaker.Other.On=&a{0}&2 \u0e44\u0e14\u0e49\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 &cGiga 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.Chance=Bite \u0e42\u0e2d\u0e01\u0e32\u0e2a: &e{0} +Fishing.Ability.Info=\u0e17\u0e31\u0e01\u0e29\u0e30 Magic Hunter: &7 **\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.Rank=Treasure Hunter \u0e23\u0e30\u0e14\u0e31\u0e1a: &e{0}/5 +Fishing.Ability.TH.MagicRate=Magic Hunter \u0e42\u0e2d\u0e01\u0e32\u0e2a: &e{0} +Fishing.Ability.Shake=Shake \u0e42\u0e2d\u0e01\u0e32\u0e2a: &e{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} +Fishing.Ability.FD=Fisherman\'\'s Diet \u0e23\u0e30\u0e14\u0e31\u0e1a: &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.MagicHunter.Name=Magic Hunter @@ -93,23 +93,23 @@ 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.Chance.Raining=&9 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.Ability.TH.MagicFound=&7\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.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.DoubleDropChance=Double Drop \u0e42\u0e2d\u0e01\u0e32\u0e2a: &e{0} +Herbalism.Ability.FD=Farmer\'\'s Diet \u0e23\u0e30\u0e14\u0e31\u0e1a: &e {0} +Herbalism.Ability.GTe.Length=Green Terra \u0e21\u0e35\u0e23\u0e30\u0e22\u0e30\u0e40\u0e27\u0e25\u0e32: &e{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.Chance=Green Thumb \u0e42\u0e2d\u0e01\u0e32\u0e2a: &e{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.GTh.Stage=Green Thumb \u0e08\u0e33\u0e19\u0e27\u0e19: &e{0} +Herbalism.Ability.GTh=&a**\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 GREEN THUMB** +Herbalism.Ability.HylianLuck=Hylian Luck \u0e42\u0e2d\u0e01\u0e32\u0e2a: &e{0} +Herbalism.Ability.Lower=&7**\u0e22\u0e01\u0e40\u0e25\u0e34\u0e01\u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30\u0e02\u0e2d\u0e07 Hoe** +Herbalism.Ability.Ready=&a**\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: &e{0} Herbalism.Ability.ShroomThumb.Fail=**SHROOM THUMB \u0e25\u0e49\u0e21\u0e40\u0e2b\u0e25\u0e27** 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 @@ -124,20 +124,20 @@ 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.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.HylianLuck=&a\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.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.Skills.GTe.On=&a**\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 GREEN TERRA** +Herbalism.Skills.GTe.Refresh=&aYour &eGreen Terra &a\u0e04\u0e39\u0e25\u0e14\u0e32\u0e27\u0e19\u0e4c\u0e40\u0e2a\u0e23\u0e47\u0e08\u0e41\u0e25\u0e49\u0e27! +Herbalism.Skills.GTe.Other.Off=Green Terra&a \u0e23\u0e2d\u0e01\u0e32\u0e23\u0e04\u0e39\u0e25\u0e14\u0e32\u0e27\u0e19\u0e4c &e{0} +Herbalism.Skills.GTe.Other.On=&a{0}&2 \u0e44\u0e14\u0e49\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 &cGreen 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.Length=Super Breaker \u0e23\u0e30\u0e22\u0e30\u0e40\u0e27\u0e25\u0e32: &e{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** +Mining.Ability.Lower=&7**\u0e22\u0e01\u0e40\u0e25\u0e34\u0e01\u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30\u0e02\u0e2d\u0e07 Pickaxe** +Mining.Ability.Ready=&a**\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** 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.DoubleDrops.Name=Drops x2 @@ -148,22 +148,22 @@ 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.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.Effect.Decrease=Demolitions \u0e25\u0e14\u0e04\u0e27\u0e32\u0e21\u0e40\u0e2a\u0e35\u0e22\u0e2b\u0e32\u0e22: &e{0} +Mining.Effect.DropChance=Double Drop \u0e42\u0e2d\u0e01\u0e32\u0e2a: &e{0} Mining.Listener=\u0e17\u0e31\u0e01\u0e29\u0e30 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.Skills.SuperBreaker.On=&a**\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 SUPER BREAKER** +Mining.Skills.SuperBreaker.Other.Off=Super Breaker&a \u0e23\u0e2d\u0e01\u0e32\u0e23\u0e04\u0e39\u0e25\u0e14\u0e32\u0e27\u0e19\u0e4c &e{0} +Mining.Skills.SuperBreaker.Other.On=&a{0}&2 \u0e44\u0e14\u0e49\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 &cSuper Breaker! +Mining.Skills.SuperBreaker.Refresh=&a\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e32\u0e21\u0e23\u0e16\u0e17\u0e31\u0e01\u0e29\u0e30 &eSuper Breaker &a\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.Boom=&7**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! +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: &e+{0} +Mining.Blast.Rank=\u0e17\u0e31\u0e01\u0e29\u0e30 Blast Mining: &e \u0e23\u0e30\u0e14\u0e31\u0e1a {0}/8 &7({1}) +Mining.Blast.Other.On=&a{0}&2 \u0e44\u0e14\u0e49\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 &cBlast Mining! +Mining.Blast.Refresh=&a\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e17\u0e31\u0e01\u0e29\u0e30 &eBlast Mining &a\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}+) @@ -182,46 +182,46 @@ 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.Error=&4mcMMO \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=&4\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=&4\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.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.Skills.AdeptSalvage=&4\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=&4\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=&4\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=&4\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=&4\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 &e{0}&c \u0e40\u0e1e\u0e35\u0e22\u0e07\u0e1e\u0e2d\u0e17\u0e35\u0e48\u0e08\u0e30\u0e0b\u0e48\u0e2d\u0e21\u0e41\u0e0b\u0e21 &e{1} +Repair.Skills.FeltEasy=&7\u0e23\u0e39\u0e49\u0e2a\u0e36\u0e01\u0e27\u0e48\u0e32\u0e21\u0e31\u0e19\u0e07\u0e48\u0e32\u0e22. +Repair.Skills.FullDurability=&7\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=&7\u0e2a\u0e34\u0e48\u0e07\u0e02\u0e2d\u0e07\u0e16\u0e39\u0e01\u0e01\u0e39\u0e49\u0e04\u0e37\u0e19! +Repair.Skills.NotFullDurability=&4\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: &e\u0e40\u0e1e\u0e34\u0e48\u0e21 {0} \u0e15\u0e48\u0e2d\u0e01\u0e32\u0e23\u0e0b\u0e48\u0e2d\u0e21\u0e41\u0e0b\u0e21 +Repair.Skills.StackedItems=&4\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: &e{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.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.Chance.Downgrade=&7AF \u0e21\u0e35\u0e42\u0e2d\u0e01\u0e32\u0e2a\u0e25\u0e14\u0e04\u0e27\u0e32\u0e21\u0e40\u0e2a\u0e35\u0e22\u0e2b\u0e32\u0e22: &e{0}% +Repair.Arcane.Chance.Success=&7AF \u0e42\u0e2d\u0e01\u0e32\u0e2a\u0e2a\u0e33\u0e40\u0e23\u0e47\u0e08: &e{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.Perfect=&a\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: &e{0}/4 +Swords.Ability.Lower=&7**\u0e22\u0e01\u0e40\u0e25\u0e34\u0e01\u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 Sword** +Swords.Ability.Ready=&a**\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: &e{0} +Swords.Combat.Bleed.Length=Bleed \u0e21\u0e35\u0e23\u0e30\u0e22\u0e30\u0e40\u0e27\u0e25\u0e32: &e{0} ticks +Swords.Combat.Bleed.Note=&7NOTE: &e1 Tick \u0e40\u0e01\u0e34\u0e14\u0e02\u0e36\u0e49\u0e19\u0e17\u0e38\u0e01 2 \u0e27\u0e34\u0e19\u0e32\u0e17\u0e35 +Swords.Combat.Bleeding.Started=&4 \u0e04\u0e38\u0e13\u0e01\u0e33\u0e25\u0e31\u0e07\u0e40\u0e25\u0e37\u0e2d\u0e14\u0e44\u0e2b\u0e25! +Swords.Combat.Bleeding.Stopped=&7\u0e17\u0e31\u0e01\u0e29\u0e30 Enemy Bleeding \u0e2b\u0e21\u0e14\u0e2a\u0e20\u0e32\u0e1e&a +Swords.Combat.Bleeding=&a**\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 ENEMY BLEEDING** +Swords.Combat.Counter.Chance=Counter Attack \u0e42\u0e2d\u0e01\u0e32\u0e2a: &e{0} +Swords.Combat.Counter.Hit=&4\u0e42\u0e08\u0e21\u0e15\u0e35\u0e14\u0e49\u0e27\u0e22 counter-attack! +Swords.Combat.Countered=&a**\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 COUNTER-ATTACKED** +Swords.Combat.SS.Struck=&4\u0e23\u0e39\u0e49\u0e2a\u0e36\u0e01\u0e21\u0e36\u0e19\u0e07\u0e07 \u0e40\u0e1e\u0e23\u0e32\u0e30 \u0e17\u0e31\u0e01\u0e29\u0e30 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 @@ -232,12 +232,12 @@ Swords.SubSkill.Bleed.Description=\u0e40\u0e25\u0e37\u0e2d\u0e14\u0e44\u0e2b\u0e Swords.Listener=\u0e17\u0e31\u0e01\u0e29\u0e30 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.Skills.SS.On=&a**\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e28\u0e30 SERRATED STRIKES** +Swords.Skills.SS.Refresh=&a\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e17\u0e31\u0e01\u0e29\u0e30 &eSerrated Strikes &a\u0e04\u0e39\u0e25\u0e14\u0e32\u0e27\u0e19\u0e4c\u0e40\u0e2a\u0e23\u0e47\u0e08\u0e41\u0e25\u0e49\u0e27! +Swords.Skills.SS.Other.Off=Serrated Strikes&a \u0e23\u0e2d\u0e01\u0e32\u0e23\u0e04\u0e39\u0e25\u0e14\u0e32\u0e27\u0e19\u0e4c &e{0} +Swords.Skills.SS.Other.On=&a{0}&2 \u0e44\u0e14\u0e49\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 &cSerrated 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.SS.Length=Serrated Strikes \u0e21\u0e35\u0e23\u0e30\u0e22\u0e30\u0e40\u0e27\u0e25\u0e32: &e{0}\u0e27\u0e34\u0e19\u0e32\u0e17\u0e35 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.2=Thick Fur @@ -256,15 +256,15 @@ Taming.Ability.Locked.2=\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e1b\u0e25\u0e14\u 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.Combat.Chance.Gore=Gore \u0e42\u0e2d\u0e01\u0e32\u0e2a: &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.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.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.2=&7COTW (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=&7COTW (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.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.HolyHound.Name=Holy Hound @@ -277,24 +277,24 @@ 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.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.Wolf=&8\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.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.Complete=&a\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.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 \u0e21\u0e35\u0e23\u0e30\u0e22\u0e30\u0e40\u0e27\u0e25\u0e32: &e{0}\u0e27\u0e34\u0e19\u0e32\u0e17\u0e35 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.Chance.ArrowDeflect=Arrow Deflect \u0e42\u0e2d\u0e01\u0e32\u0e2a: &e{0} +Unarmed.Ability.Chance.Disarm=Disarm \u0e42\u0e2d\u0e01\u0e32\u0e2a: &e{0} +Unarmed.Ability.Chance.IronGrip=Iron Grip \u0e42\u0e2d\u0e01\u0e32\u0e2a: &e{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.IronGrip.Defender=&aIron 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=&7**\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=&a**\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.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.Disarm.Name=Disarm (Players) @@ -308,15 +308,15 @@ Unarmed.SubSkill.IronGrip.Description=\u0e1b\u0e49\u0e2d\u0e07\u0e01\u0e31\u0e19 Unarmed.Listener=\u0e17\u0e31\u0e01\u0e29\u0e30 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.Skills.Berserk.On=&a**\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 BERSERK** +Unarmed.Skills.Berserk.Other.Off=Berserk&a \u0e23\u0e2d\u0e01\u0e32\u0e23\u0e04\u0e39\u0e25\u0e14\u0e32\u0e27\u0e19\u0e4c &e{0} +Unarmed.Skills.Berserk.Other.On=&a{0}&2 \u0e44\u0e14\u0e49\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 &cBerserk! +Unarmed.Skills.Berserk.Refresh=&a\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e17\u0e31\u0e01\u0e29\u0e30 &eBerserk &a\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.Chance.DDrop=Double Drop \u0e42\u0e2d\u0e01\u0e32\u0e2a: &e{0} +Woodcutting.Ability.Length=Tree Feller \u0e21\u0e35\u0e23\u0e30\u0e22\u0e30\u0e40\u0e27\u0e25\u0e32: &e{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) 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 @@ -327,35 +327,35 @@ Woodcutting.SubSkill.HarvestLumber.Description=\u0e40\u0e1e\u0e34\u0e48\u0e21\u0 Woodcutting.Listener=\u0e17\u0e31\u0e01\u0e29\u0e30 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.On=&a**\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 TREE FELLER** +Woodcutting.Skills.TreeFeller.Refresh=&a\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e17\u0e31\u0e01\u0e29\u0e30 &eTree Feller &a\u0e04\u0e39\u0e25\u0e14\u0e32\u0e27\u0e19\u0e4c\u0e40\u0e2a\u0e23\u0e47\u0e08\u0e41\u0e25\u0e49\u0e27! +Woodcutting.Skills.TreeFeller.Other.Off=Tree Feller&a \u0e23\u0e2d\u0e01\u0e32\u0e23\u0e04\u0e39\u0e25\u0e14\u0e32\u0e27\u0e19\u0e4c &e{0} +Woodcutting.Skills.TreeFeller.Other.On=&a{0}&2 \u0e44\u0e14\u0e49\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 &cTree 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** +Ability.Generic.Refresh=&a**\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 ABILITIES REFRESHED!** +Ability.Generic.Template.Lock=&7{0} +Ability.Generic.Template=&6{0}: &3{1} +Combat.ArrowDeflect=&f**\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 ARROW DEFLECT** +Combat.BeastLore=&a**\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 BEAST LORE** +Combat.BeastLoreHealth=&3\u0e23\u0e30\u0e14\u0e31\u0e1a\u0e40\u0e25\u0e37\u0e2d\u0e14 (&a{0}&3/{1}) +Combat.BeastLoreOwner=&3\u0e40\u0e08\u0e49\u0e32\u0e02\u0e2d\u0e07 (&c{0}&3) +Combat.Gore=&a**\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! +Combat.TargetDazed=\u0e40\u0e1b\u0e49\u0e32\u0e2b\u0e21\u0e32\u0e22\u0e17\u0e35\u0e48 &4\u0e21\u0e36\u0e19\u0e07\u0e07 +Combat.TouchedFuzzy=&4\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=&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\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.1=&a\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.addxp.AwardAll=&a\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=&a\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&a\u0e1b\u0e34\u0e14 +Commands.Ability.On=Ability \u0e2d\u0e22\u0e39\u0e48\u0e43\u0e19\u0e42\u0e2b\u0e21\u0e14&a\u0e40\u0e1b\u0e34\u0e14 +Commands.AdminChat.Off=Admin Chat &c\u0e16\u0e39\u0e01\u0e1b\u0e34\u0e14 +Commands.AdminChat.On=Admin Chat &a\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 Commands.Chat.Console=*Console* Commands.Disabled=\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07\u0e19\u0e35\u0e49\u0e16\u0e39\u0e01\u0e1b\u0e34\u0e14\u0e44\u0e27\u0e49. @@ -363,78 +363,78 @@ Commands.DoesNotExist=\u0e44\u0e21\u0e48\u0e1e\u0e1a\u0e1c\u0e39\u0e49\u0e40\u0e 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.Inspect= &c- \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=&a\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=&a\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= &c- Leaderboards +Commands.mcc.Header=---[]&e\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07 mcMMO&c[]--- 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.mcpurge.Success=&a\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=&6-=\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&a - &6\u0e23\u0e30\u0e14\u0e31\u0e1a &f#&a{0} +Commands.mcrank.Player=\u0e40\u0e1b\u0e49\u0e32\u0e2b\u0e21\u0e32\u0e22: &f{0} +Commands.mcrank.Skill={0}&a - &6\u0e25\u0e33\u0e14\u0e31\u0e1a &f#&a{1} +Commands.mcrank.Unranked=&fUnranked 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.mcremove.Success=&a{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=&6Tip: \u0e43\u0e0a\u0e49 &c/mcrank&6 \u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e14\u0e39\u0e25\u0e33\u0e14\u0e31\u0e1a\u0e02\u0e2d\u0e07\u0e1a\u0e38\u0e04\u0e04\u0e25! +Commands.mmoedit=[player] &c - \u0e41\u0e01\u0e49\u0e44\u0e02\u0e40\u0e1b\u0e49\u0e32\u0e2b\u0e21\u0e32\u0e22 +Commands.mmoedit.AllSkills.1=&a\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=&a\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.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 &c\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 &c\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.Other=&a--\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07\u0e2d\u0e37\u0e48\u0e19\u0e46-- +Commands.Party.Header=-----[]&aPARTY&c[]----- +Commands.Party.Status=&8\u0e0a\u0e37\u0e48\u0e2d: &f{0} {1} +Commands.Party.ShareMode=&8\u0e42\u0e2b\u0e21\u0e14\u0e41\u0e1a\u0e48\u0e07\u0e1b\u0e31\u0e19: +Commands.Party.ItemShare=&7\u0e2a\u0e34\u0e48\u0e07\u0e02\u0e2d\u0e07 &3({0}) +Commands.Party.ExpShare=&7EXP &3({0}) +Commands.Party.ItemShareCategories=&8\u0e41\u0e1a\u0e48\u0e07\u0e1b\u0e31\u0e19\u0e2a\u0e34\u0e48\u0e07\u0e02\u0e2d\u0e07: &7[[ITALIC]]{0} +Commands.Party.MembersNear=&8\u0e17\u0e35\u0e48\u0e2d\u0e22\u0e39\u0e48\u0e43\u0e01\u0e25\u0e49\u0e04\u0e38\u0e13 &3{0}&8/&3{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.Chat.Off=Party Chat &c\u0e16\u0e39\u0e01\u0e1b\u0e34\u0e14 +Commands.Party.Chat.On=Party Chat &a\u0e40\u0e1b\u0e34\u0e14 +Commands.Party.Commands=&a--\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07 PARTY-- +Commands.Party.Invite.0=ALERT: &a\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 &a/party accept&e \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.Join=&7\u0e44\u0e14\u0e49\u0e40\u0e02\u0e49\u0e32\u0e23\u0e48\u0e27\u0e21 Party: {0} +Commands.Party.Create=&7\u0e2a\u0e23\u0e49\u0e32\u0e07 Party: {0} +Commands.Party.Rename=&7\u0e0a\u0e37\u0e48\u0e2d Party \u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e40\u0e1b\u0e47\u0e19: &f{0} +Commands.Party.SetSharing=&7Party {0} \u0e41\u0e1a\u0e48\u0e07\u0e1b\u0e31\u0e19\u0e16\u0e39\u0e01\u0e15\u0e31\u0e49\u0e07\u0e40\u0e1b\u0e47\u0e19: &3{1} +Commands.Party.ToggleShareCategory=&7Party \u0e41\u0e1a\u0e48\u0e07\u0e1b\u0e31\u0e19\u0e2a\u0e34\u0e48\u0e07\u0e02\u0e2d\u0e07\u0e43\u0e2b\u0e49 &6{0} &7\u0e44\u0e14\u0e49\u0e23\u0e31\u0e1a &3{1} +Commands.Party.AlreadyExists=&4Party {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.Members.Header=-----[]&a\u0e2a\u0e21\u0e32\u0e0a\u0e34\u0e01&c[]----- 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.Teleport= &c- 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.Enabled=Party teleporting &a\u0e16\u0e39\u0e01\u0e40\u0e1b\u0e34\u0e14 +Commands.ptp.Disabled=Party teleporting &c\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.Request1={0} &a\u0e15\u0e49\u0e2d\u0e07\u0e01\u0e32\u0e23 teleport \u0e21\u0e32\u0e2b\u0e32\u0e04\u0e38\u0e13. +Commands.ptp.Request2=&a\u0e40\u0e1e\u0e37\u0e48\u0e2d teleport \u0e43\u0e0a\u0e49 &e/ptp accept. &a\u0e20\u0e32\u0e22\u0e43\u0e19 &c{0} &a\u0e27\u0e34\u0e19\u0e32\u0e17\u0e35. +Commands.ptp.AcceptAny.Enabled=Party teleport &a\u0e16\u0e39\u0e01\u0e40\u0e1b\u0e34\u0e14 +Commands.ptp.AcceptAny.Disabled=Party teleport &c\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.PowerLevel.Leaderboard=--mcMMO&9 \u0e23\u0e30\u0e14\u0e31\u0e1a\u0e1e\u0e25\u0e31\u0e07 &eLeaderboard-- +Commands.PowerLevel.Capped=&4\u0e23\u0e30\u0e14\u0e31\u0e1a\u0e1e\u0e25\u0e31\u0e07: &a{0} &4\u0e23\u0e30\u0e14\u0e31\u0e1a\u0e40\u0e15\u0e47\u0e21: &e{1} +Commands.PowerLevel=&4\u0e23\u0e30\u0e14\u0e31\u0e1a\u0e1e\u0e25\u0e31\u0e07: &a{0} +Commands.Reset.All=&a\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=&a\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.Skill.Leaderboard=--mcMMO &9{0}&e 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 @@ -452,54 +452,54 @@ Commands.Usage.Rate=\u0e2d\u0e31\u0e15\u0e23\u0e32 Commands.Usage.Skill=\u0e17\u0e31\u0e01\u0e29\u0e30 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 +mcMMO.NoPermission=&4\u0e2a\u0e34\u0e17\u0e18\u0e34\u0e4c\u0e44\u0e21\u0e48\u0e40\u0e1e\u0e35\u0e22\u0e07\u0e1e\u0e2d. +mcMMO.NoSkillNote=&8\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.Help.0=\u0e04\u0e27\u0e23\u0e43\u0e0a\u0e49 &3{0} [password]. +Party.Help.1=\u0e2a\u0e23\u0e49\u0e32\u0e07 Party \u0e43\u0e2b\u0e21\u0e48\u0e43\u0e0a\u0e49 &3{0} [password]. +Party.Help.2=\u0e1b\u0e23\u0e36\u0e01\u0e29\u0e32 &3{0} &c\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 &3{0} [password] &c\u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e40\u0e02\u0e49\u0e32 &3{1} &c\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 &3{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 &3{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 &3{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 &3{0} +Party.Help.8=\u0e22\u0e01\u0e40\u0e25\u0e34\u0e01 Party \u0e43\u0e0a\u0e49 &3{0} +Party.Help.9=\u0e43\u0e0a\u0e49 &3{0} &c\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 &3{0} &c\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} &a\u0e44\u0e14\u0e49\u0e40\u0e02\u0e49\u0e32\u0e23\u0e48\u0e27\u0e21 Party \u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13 +Party.InformedOnQuit={0} &a\u0e44\u0e14\u0e49\u0e2d\u0e2d\u0e01\u0e08\u0e32\u0e01 Party \u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13 +Party.InformedOnNameChange=&6{0} &a\u0e44\u0e14\u0e49\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e0a\u0e37\u0e48\u0e2d Party \u0e40\u0e1b\u0e47\u0e19 &f{1} +Party.InvalidName=&4\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.NotInYourParty=&4{0} \u0e44\u0e21\u0e48\u0e44\u0e14\u0e49\u0e2d\u0e22\u0e39\u0e48\u0e43\u0e19 party \u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13 +Party.NotOwner=&4\u0e04\u0e38\u0e13\u0e44\u0e21\u0e48\u0e44\u0e14\u0e49\u0e40\u0e1b\u0e47\u0e19\u0e2b\u0e31\u0e27\u0e2b\u0e19\u0e49\u0e32 Party. +Party.Owner.New=&a{0} \u0e44\u0e14\u0e49\u0e40\u0e1b\u0e47\u0e19\u0e2b\u0e31\u0e27\u0e2b\u0e19\u0e49\u0e32 Party \u0e43\u0e2b\u0e21\u0e48. +Party.Owner.NotLeader=&4\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=&4\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.Password.Set=&a\u0e23\u0e2b\u0e31\u0e2a\u0e1c\u0e48\u0e32\u0e19 Party \u0e16\u0e39\u0e01\u0e15\u0e31\u0e49\u0e07\u0e40\u0e1b\u0e47\u0e19 {0} +Party.Password.Removed=&a\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.NotOnline=&4{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.PlayerNotInParty=&4{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.Player=&a\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.Target=&a{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) +Party.Unlocked=&7Party \u0e16\u0e39\u0e01\u0e1b\u0e25\u0e14\u0e25\u0e47\u0e2d\u0e01 +Party.Disband=&7Party \u0e16\u0e39\u0e01\u0e1b\u0e34\u0e14\u0e44\u0e27\u0e49 +Party.Status.Locked=&4(\u0e40\u0e0a\u0e34\u0e0d\u0e2d\u0e22\u0e48\u0e32\u0e07\u0e40\u0e14\u0e35\u0e22\u0e27) +Party.Status.Unlocked=&2(\u0e40\u0e1b\u0e34\u0e14) Party.ShareType.Xp=EXP Party.ShareType.Item=\u0e2a\u0e34\u0e48\u0e07\u0e02\u0e2d\u0e07 Party.ShareMode.None=NONE @@ -525,76 +525,76 @@ Commands.XPGain.Swords=\u0e17\u0e33\u0e01\u0e32\u0e23\u0e42\u0e08\u0e21\u0e15\u0 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.XPGain=&8EXP \u0e17\u0e35\u0e48\u0e44\u0e14\u0e49\u0e23\u0e31\u0e1a: &f{0} +Commands.xplock.locked=&6BAR EXP \u0e16\u0e39\u0e01\u0e1b\u0e14\u0e25\u0e47\u0e2d\u0e01 {0}! +Commands.xplock.unlocked=&6EXP BAR \u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13\u0e44\u0e14\u0e49\u0e16\u0e39\u0e01 &a\u0e1b\u0e25\u0e14\u0e25\u0e47\u0e2d\u0e01&6! 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.xprate.started.0=&6\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=&6mcMMO \u0e2d\u0e31\u0e15\u0e23\u0e32 EXP \u0e15\u0e2d\u0e19\u0e19\u0e35\u0e49 {0}x! +XPRate.Event=&6mcMMO \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! 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]]=- +Effects.Child=&8\u0e23\u0e30\u0e14\u0e31\u0e1a: &a{0} +Effects.Level=&8\u0e23\u0e30\u0e14\u0e31\u0e1a: &a{0} &3EXP&e(&6{1}&e/&6{2}&e) +Effects.Parent=&6{0} - +Effects.Template=&3{0}: &a{1} +Guides.Available=&7\u0e41\u0e19\u0e30\u0e19\u0e33 {0} \u0e04\u0e27\u0e23\u0e43\u0e0a\u0e49 - \u0e0a\u0e19\u0e34\u0e14 /{1} ? [\u0e2b\u0e19\u0e49\u0e32] +Guides.Header=&6-=&a{0} \u0e41\u0e19\u0e30\u0e19\u0e33&6=- 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.OfflineStats=mcMMO \u0e2a\u0e16\u0e34\u0e15\u0e34\u0e1c\u0e39\u0e49\u0e40\u0e25\u0e48\u0e19 Offline &e{0} +Inspect.Stats=&amcMMO \u0e2a\u0e16\u0e34\u0e15\u0e34\u0e02\u0e2d\u0e07 &e{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** 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 \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! &e({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. &e({0} \u0e27\u0e34\u0e19\u0e32\u0e17\u0e35) +Teleport.Commencing=&7\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07 teleport \u0e15\u0e49\u0e2d\u0e07\u0e23\u0e2d &6({0}) &7\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=&4Teleportation \u0e16\u0e39\u0e01\u0e22\u0e01\u0e40\u0e25\u0e34\u0e01! +Skills.Child=&6(\u0e17\u0e31\u0e01\u0e29\u0e30 CHILD) +Skills.Disarmed=&4\u0e04\u0e38\u0e13\u0e44\u0e14\u0e49\u0e1b\u0e25\u0e14\u0e25\u0e47\u0e2d\u0e01! +Skills.Header=-----[]&a{0}&c[]----- +Skills.NeedMore=&4\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 &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.Stats={0}&a{1}&3 EXP(&7{2}&3/&7{3}&3) +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. &e({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 +Skills.ConfirmOrCancel=&6-=&a{0} \u0e41\u0e19\u0e30\u0e19\u0e33&6=- +Stats.Header.Combat=&6-=\u0e17\u0e31\u0e01\u0e29\u0e30\u0e01\u0e32\u0e23\u0e15\u0e48\u0e2d\u0e2a\u0e39\u0e49=- +Stats.Header.Gathering=&6-=\u0e17\u0e31\u0e01\u0e29\u0e30 GATHERING=- +Stats.Header.Misc=&6-=\u0e17\u0e31\u0e01\u0e29\u0e30 MISC=- +Stats.Own.Stats=&a[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) +Perks.Lucky.Bonus=&6 ({0} \u0e14\u0e49\u0e27\u0e22 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.ActivationTime.Bonus=&6 ({0}\u0e27\u0e34\u0e19\u0e32\u0e17\u0e35 \u0e14\u0e49\u0e27\u0e22 Endurance Perk) +MOTD.Donate=&3\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25 Donation: +MOTD.Hardcore.DeathStatLoss.Stats=&6[mcMMO] &3\u0e17\u0e31\u0e01\u0e29\u0e30 Death Penalty: &4{0}% +MOTD.Hardcore.Vampirism.Stats=&6[mcMMO] &3\u0e16\u0e39\u0e01\u0e02\u0e42\u0e21\u0e22\u0e2a\u0e16\u0e34\u0e15\u0e34: &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 +MOTD.Version=&6[mcMMO] \u0e43\u0e0a\u0e49 version &3{0} +MOTD.Website=&6[mcMMO] &a{0}&e - mcMMO Website +Smelting.Ability.FluxMining=Flux Mining \u0e42\u0e2d\u0e01\u0e32\u0e2a: &e{0} +Smelting.Ability.FuelEfficiency=Fuel Efficiency \u0e40\u0e1e\u0e34\u0e48\u0e21\u0e02\u0e36\u0e49\u0e19: &e{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 +Smelting.Ability.SecondSmelt=Second Smelt \u0e42\u0e2d\u0e01\u0e32\u0e2a: &e{0} +Smelting.Ability.VanillaXPBoost=Vanilla EXP \u0e40\u0e1e\u0e34\u0e48\u0e21\u0e02\u0e36\u0e49\u0e19: &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.SecondSmelt.Name=Second Smelt @@ -603,7 +603,7 @@ Smelting.Effect.4=Vanilla EXP \u0e40\u0e1e\u0e34\u0e48\u0e21\u0e02\u0e36\u0e49\u 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.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.FluxMining.Success=&a\u0e41\u0e23\u0e48\u0e16\u0e39\u0e01\u0e16\u0e25\u0e38\u0e07! Smelting.Listener=\u0e17\u0e31\u0e01\u0e29\u0e30 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 diff --git a/src/main/resources/locale/locale_zh_CN.properties b/src/main/resources/locale/locale_zh_CN.properties index fe57cca0e..69382621a 100644 --- a/src/main/resources/locale/locale_zh_CN.properties +++ b/src/main/resources/locale/locale_zh_CN.properties @@ -13,7 +13,7 @@ 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.Header=&6\u5e78\u8fd0\u6d25\u8d34 JSON.JWrapper.Perks.Lucky={0}% \u66f4\u597d\u7684\u8d54\u7387 JSON.Hover.Tips=\u63d0\u793a JSON.Acrobatics=\u6742\u6280 @@ -36,53 +36,53 @@ JSON.URL.Patreon=\u652f\u6301nossr50\u548c\u4ed6\u5728Patreon\u4e0a\u4e3amcMMO\u 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.SkillUnlockMessage=&6[ mcMMO&e @&3{0} &6\u7b49\u7ea7 &3{1}&6 \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.Hover.Mystery=&7\u672a\u77e5\u80fd\u529b +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.Roll.Interaction.Activated=\u6d4b\u8bd5 &c\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. +Anvil.SingleItemStack=&c\u4f60\u4e0d\u80fd\u5206\u89e3\u8d27\u4fee\u590d\u6709\u591a\u4e2a\u7269\u54c1\u7684\u7269\u54c1\u5806, \u8bf7\u62c6\u5206\u540e\u518d\u4f7f\u7528. #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]]) +mcMMO.Template.Prefix=&6(&amcMMO&6) # BEGIN STYLING -Ability.Generic.Refresh=[[GREEN]]**\u6280\u80fd\u51b7\u5374\u5b8c\u6bd5!** -Ability.Generic.Template.Lock=[[GRAY]]{0} +Ability.Generic.Refresh=&a**\u6280\u80fd\u51b7\u5374\u5b8c\u6bd5!** +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=\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} +Effects.Child.Overhaul=&3\u5b50\u7b49\u7ea7 Lv.&e {0}&3: {1} +Effects.Child.ParentList=&a{0}&6(&3Lv.&e{1}&6) +Effects.Level.Overhaul=&6\u7b49\u7ea7: &e{0} &3XP&e(&6{1}&e/&6{2}&e) +Effects.Parent=&6{0} - +Effects.Template=&3{0}: &a{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]]] +Commands.XPGain.Overhaul=&6\u7ecf\u9a8c\u6765\u6e90: &3{0} +MOTD.Version.Overhaul=&6[mcMMO] &3\u5927\u6539\u7248\u672c&6 - &3{0} +Overhaul.mcMMO.Header=&c[]=====[]&a mcMMO - \u5927\u6539\u7248\u672c &c[]=====[] +Overhaul.mcMMO.Url.Wrap.Prefix=&c[| +Overhaul.mcMMO.Url.Wrap.Suffix=&c|] +Overhaul.mcMMO.MmoInfo.Wiki=&e[&f\u5728WIKI\u4e0a\u67e5\u770b\u6b64\u6280\u80fd!&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} \u589e\u52a0\u5230 [[RESET]][[GREEN]][[BOLD]]{2}[[RESET]][[WHITE]]. +Overhaul.Levelup=&l{0} \u589e\u52a0\u5230 &r&a&l{2}&r&f. Overhaul.Name.Acrobatics=\u6742\u6280 Overhaul.Name.Alchemy=\u70bc\u91d1 Overhaul.Name.Archery=\u7bad\u672f @@ -99,46 +99,46 @@ 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]][]----- +Commands.mcc.Header=&c---[]&amcMMO \u547d\u4ee4&c[]--- +Commands.Other=&c---[]&a\u5176\u4ed6\u547d\u4ee4&c[]--- +Commands.Party.Header=&c-----[]&a\u961f\u4f0d&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]]\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} +XPBar.Template.EarlyGameBoost=&6\u6b63\u5728\u5b66\u4e60\u65b0\u6280\u80fd... +XPBar.Acrobatics=\u6742\u6280 Lv.&6{0} +XPBar.Alchemy=\u70bc\u91d1 Lv.&6{0} +XPBar.Archery=\u7bad\u672f Lv.&6{0} +XPBar.Axes=\u65a7\u6280 Lv.&6{0} +XPBar.Excavation=\u6316\u6398 Lv.&6{0} +XPBar.Fishing=\u9493\u9c7c Lv.&6{0} +XPBar.Herbalism=\u8349\u836f\u5b66 Lv.&6{0} +XPBar.Mining=\u6316\u77ff Lv.&6{0} +XPBar.Repair=\u4fee\u7406 Lv.&6{0} +XPBar.Salvage=\u5206\u89e3 Lv.&6{0} +XPBar.Smelting=\u51b6\u70bc Lv.&6{0} +XPBar.Swords=\u5251\u672f Lv.&6{0} +XPBar.Taming=\u9a6f\u517d Lv.&6{0} +XPBar.Unarmed=\u683c\u6597 Lv.&6{0} +XPBar.Woodcutting=\u4f10\u6728 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 #\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.Ability.Proc=&a**\u534e\u5c14\u5179\u822c\u7684\u964d\u843d** +Acrobatics.Combat.Proc=&a**\u95ea\u907f** +Acrobatics.SubSkill.Roll.Stats=&6\u7ffb\u6eda\u51e0\u7387 &e{0}%&6 \u4f18\u96c5\u7ffb\u6eda\u51e0\u7387&e {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.Roll.Chance=\u7ffb\u6eda\u51e0\u7387: &e{0} +Acrobatics.SubSkill.Roll.GraceChance=\u4f18\u96c5\u7684\u7ffb\u6eda\u51e0\u7387: &e{0} +Acrobatics.SubSkill.Roll.Mechanics=&7\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 &e{0}%&7 \u7684\u51e0\u7387\u83b7\u5f97\u51cf\u4f24\u6216\u514d\u4f24, \u5982\u679c\u4f60\u6fc0\u6d3b\u4f18\u96c5\u7684\u7ffb\u6eda\u5219\u6709 &e{1}%&7 \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 &e{2}&7 \u7ea7, \u6bcf\u4e00\u7ea7\u7684\u6742\u6280\u7b49\u7ea7\u63d0\u4f9b &e{3}%&7 \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 &c{4}&7 \u4f24\u5bb3. \u4f18\u96c5\u7ffb\u6eda\u6700\u591a\u51cf\u4f24 &a{5}&7 \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 @@ -153,8 +153,8 @@ Alchemy.SubSkill.Catalysis.Description=\u63d0\u5347\u836f\u6c34\u917f\u9020\u901 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.SubSkill.Concoctions.Stat=\u6df7\u5408\u7b49\u7ea7: &a{0}&3/&a{1} +Alchemy.SubSkill.Concoctions.Stat.Extra=\u914d\u65b9 [&a{0}&3]: &a{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 @@ -182,13 +182,13 @@ 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.Ability.Lower=&7\u4f60\u653e\u4e0b\u4e86\u4f60\u7684\u65a7\u5b50. +Axes.Ability.Ready=&3\u4f60 &6\u63e1\u7d27&3 \u4e86\u4f60\u7684\u65a7\u5b50. +Axes.Combat.CritStruck=&4\u4f60\u6253\u51fa\u4e86\u66b4\u51fb! Axes.Combat.CriticalHit=\u66b4\u51fb! -Axes.Combat.GI.Proc=[[GREEN]]**\u5de8\u529b\u6253\u51fb** +Axes.Combat.GI.Proc=&a**\u5de8\u529b\u6253\u51fb** Axes.Combat.GI.Struck=**\u88ab\u5f3a\u70c8\u51b2\u51fb\u51fb\u4e2d** -Axes.Combat.SS.Struck=[[DARK_RED]]\u88ab\u65a9\u9996\u8005\u6280\u80fd\u653b\u51fb! +Axes.Combat.SS.Struck=&4\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 @@ -207,13 +207,13 @@ Axes.SubSkill.GreaterImpact.Description=\u5bf9\u65e0\u62a4\u7532\u654c\u4eba\u90 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! +Axes.Skills.SS.On=&a**\u65a9\u9996\u8005\u6280\u80fd\u542f\u52a8** +Axes.Skills.SS.Refresh=&a\u4f60\u7684 &e\u65a9\u9996\u8005 &a\u6280\u80fd\u53ef\u4ee5\u4f7f\u7528\u4e86! +Axes.Skills.SS.Other.Off=\u65a9\u9996\u8005&a \u7ed3\u675f\u4e86,\u8fdb\u5165\u51b7\u5374 &e{0} +Axes.Skills.SS.Other.On=&a{0}&2\u4f7f\u7528\u4e86 &c\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.Ability.Lower=&7\u4f60\u653e\u4e0b\u4e86\u4f60\u7684\u94f2\u5b50. +Excavation.Ability.Ready=&3\u4f60 &6\u63e1\u7d27&3 \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 @@ -224,23 +224,23 @@ Excavation.SubSkill.Archaeology.Stat.Extra=\u8003\u53e4\u5b66\u83b7\u53d6\u7ecf\ 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! +Excavation.Skills.GigaDrillBreaker.On=&a**\u66b4\u8d70\u94bb\u5934\u6fc0\u6d3b** +Excavation.Skills.GigaDrillBreaker.Refresh=&a\u4f60\u7684 &e\u66b4\u8d70\u94bb\u5934 &a\u6280\u80fd\u53ef\u4ee5\u4f7f\u7528\u4e86! +Excavation.Skills.GigaDrillBreaker.Other.Off=\u66b4\u8d70\u94bb\u5934&a \u7ed3\u675f\u4e86,\u8fdb\u5165\u51b7\u5374 &e{0} +Excavation.Skills.GigaDrillBreaker.Other.On=&a{0}&2 \u4f7f\u7528\u4e86 &c\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.ScarcityTip=&e&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=&7&o\u4e71\u52a8\u4f1a\u5413\u8dd1\u9c7c! +Fishing.Exhausting=&c&o\u4e0d\u6b63\u5f53\u4f7f\u7528\u9c7c\u7aff\u4f1a\u52a0\u5267\u8010\u4e45\u7684\u635f\u8017! +Fishing.LowResources=&7\u4f60\u89c9\u5f97\u8fd9\u5757\u533a\u57df\u4f3c\u4e4e\u6ca1\u6709\u591a\u5c11\u9c7c\u4e86. +Fishing.Ability.Info=\u9b54\u6cd5\u730e\u4eba: &7 **\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.TreasureHunter.Stat=\u6dd8\u91d1\u8005\u7b49\u7ea7: &a{0}&3/&a{1} +Fishing.SubSkill.TreasureHunter.Stat.Extra=\u6389\u843d\u7387: &7\u4e00\u822c: &e{0} &a\u666e\u901a: &e{1}\n&9\u7a00\u6709: &e{2} &d\u7f55\u89c1: &e{3} &6\u53f2\u8bd7: &e{4} &b\u4f20\u8bf4: &e{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 @@ -249,25 +249,25 @@ Fishing.SubSkill.Shake.Description=\u7528\u9c7c\u7aff\u628a\u73a9\u5bb6\u6216\u7 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.FishermansDiet.Stat=\u6e14\u592b\u7684\u98df\u8c31:&a \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.MasterAngler.Stat=\u9493\u9c7c\u54ac\u94a9\u7387: &a+&e{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.Chance.Raining=&9 \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.Ability.TH.MagicFound=&7\u4f60\u611f\u5230\u4e00\u80a1\u9b54\u529b\u7684\u6ce2\u52a8... +Fishing.Ability.TH.Boom=&7\u7e41\u8363\u65f6\u671f!!! +Fishing.Ability.TH.Poison=&7\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.GTh=&a**\u7eff\u5316** +Herbalism.Ability.Lower=&7\u4f60\u653e\u4e0b\u4e86\u4f60\u7684\u9504\u5934. +Herbalism.Ability.Ready=&3\u4f60 &6\u6311\u8d77&3 \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 @@ -275,12 +275,12 @@ Herbalism.SubSkill.GreenTerra.Stat=\u5927\u5730\u795d\u798f\u6301\u7eed\u65f6\u9 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.SubSkill.GreenThumb.Stat.Extra=\u7eff\u62c7\u6307\u9636\u6bb5: &a \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.FarmersDiet.Stat=\u519c\u592b\u98df\u8c31: &a\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 @@ -290,30 +290,30 @@ Herbalism.SubSkill.HylianLuck.Stat=\u6d77\u62c9\u5c14\u7684\u795d\u798f\u7684\u5 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.HylianLuck=&a\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! +Herbalism.Skills.GTe.On=&a**\u571f\u795e\u5e87\u4f51\u6fc0\u6d3b** +Herbalism.Skills.GTe.Refresh=&a\u4f60\u7684 &e\u571f\u795e\u5e87\u4f51 &a\u6280\u80fd\u53ef\u4ee5\u4f7f\u7528\u4e86\uff01 +Herbalism.Skills.GTe.Other.Off=\u571f\u795e\u5e87\u4f51&a \u7ed3\u675f\u4e86,\u8fdb\u5165\u51b7\u5374 &e{0} +Herbalism.Skills.GTe.Other.On=&a{0}&2 \u4f7f\u7528\u4e86 &c\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.Ability.Lower=&7\u4f60\u653e\u4e0b\u4e86\u4f60\u7684\u9550\u5b50. +Mining.Ability.Ready=&3\u4f60 &6\u62ff\u8d77&3 \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.DoubleDrops.Stat=\u53cc\u500d\u6389\u843d\u6982\u7387: &e{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.BlastMining.Stat=\u7206\u7834\u5f00\u91c7:&a \u7b49\u7ea7 {0}/{1} &7({2}) +Mining.SubSkill.BlastMining.Stat.Extra=\u7206\u7834\u534a\u5f84\u52a0\u6210: &a+{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 @@ -323,16 +323,16 @@ Mining.SubSkill.DemolitionsExpertise.Stat=\u7206\u70b8\u4f24\u5bb3\u51cf\u5c11 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 +Mining.Skills.SuperBreaker.On=&a**\u8d85\u7ea7\u788e\u77f3\u673a\u6fc0\u6d3b** +Mining.Skills.SuperBreaker.Other.Off=\u8d85\u7ea7\u788e\u77f3\u673a &a \u7ed3\u675f\u4e86,\u8fdb\u5165\u51b7\u5374 &e{0} +Mining.Skills.SuperBreaker.Other.On=&a{0}&2 \u4f7f\u7528\u4e86 &c\u8d85\u7ea7\u788e\u77f3\u673a! +Mining.Skills.SuperBreaker.Refresh=&a\u4f60\u7684 &e\u8d85\u7ea7\u788e\u77f3\u673a &a\u6280\u80fd\u53ef\u4ee5\u4f7f\u7528\u4e86\uff01 #Blast Mining -Mining.Blast.Boom=[[GRAY]]**\u5623** +Mining.Blast.Boom=&7**\u5623** 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! +Mining.Blast.Other.On=&a{0}&2 \u4f7f\u7528\u4e86 &c\u7206\u7834\u5f00\u91c7! +Mining.Blast.Refresh=&a\u4f60\u7684 &e\u7206\u7834\u5f00\u91c7 &a\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 @@ -344,7 +344,7 @@ Repair.SubSkill.StoneRepair.Name=\u4fee\u7406\u77f3\u5934\u7269\u54c1 ({0}+ SKIL 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.RepairMastery.Stat=\u4fee\u7406\u7cbe\u901a: &a\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 @@ -352,65 +352,65 @@ 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.SubSkill.ArcaneForging.Stat=\u79d8\u6cd5\u953b\u9020: &e\u7b49\u7ea7 {0}/{1} +Repair.SubSkill.ArcaneForging.Stat.Extra=&3\u79d8\u6cd5\u953b\u9020\u8d54\u7387:&7 \u6210\u529f &a{0}&7%, \u5931\u8d25 &c{1}&7% +Repair.Error=&4mcMMO \u5728\u5c1d\u8bd5\u4fee\u7406\u6b64\u7269\u54c1\u65f6\u53d1\u751f\u4e86\u9519\u8bef! +Repair.Listener.Anvil=&4\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.Skills.AdeptDiamond=&4\u4f60\u7684\u6280\u80fd\u7b49\u7ea7\u4e0d\u8db3\u4ee5\u4fee\u7406\u94bb\u77f3\u88c5\u5907. +Repair.Skills.AdeptGold=&4\u4f60\u7684\u6280\u80fd\u7b49\u7ea7\u4e0d\u8db3\u4ee5\u4fee\u7406\u9ec4\u91d1\u88c5\u5907. +Repair.Skills.AdeptIron=&4\u4f60\u7684\u6280\u80fd\u4e0d\u8db3\u4ee5\u4fee\u590d\u94c1\u8d28\u88c5\u5907. +Repair.Skills.AdeptStone=&4\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 &e{0}&c \u624d\u80fd\u4fee\u7406 &e{1} +Repair.Skills.FeltEasy=&7\u90a3\u770b\u8d77\u6765\u5f88\u7b80\u5355. +Repair.Skills.FullDurability=&7\u4f60\u7684\u88c5\u5907\u5df2\u7ecf\u6ee1\u8010\u4e45\u5ea6\u4e86 +Repair.Skills.StackedItems=&4\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. +Repair.Arcane.Perfect=&a\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.ScrapCollector.Stat=\u5e9f\u6599\u56de\u6536: &a\u6700\u591a\u5206\u89e3\u51fa &e{0}&a \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.SubSkill.ArcaneSalvage.Stat=\u5965\u6570\u5206\u89e3: &e\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.Arcane.ExtractFull=&7\u5b8c\u5168\u62c6\u89e3\u51fa\u9644\u9b54\u51e0\u7387 +Salvage.Arcane.ExtractPartial=&7\u90e8\u5206\u62c6\u89e3\u51fa\u9644\u9b54\u51e0\u7387 +Salvage.Skills.Success=&a\u7269\u54c1\u5df2\u5206\u89e3\uff01 +Salvage.Skills.Adept.Damaged=&4\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 &e{0}&c \u7ea7\u624d\u80fd\u5206\u89e3 &e{1} +Salvage.Skills.TooDamaged=&4\u8be5\u7269\u54c1\u635f\u574f\u8fc7\u4e8e\u4e25\u91cd\uff0c\u65e0\u6cd5\u5206\u89e3. +Salvage.Skills.ArcaneFailed=&c\u60a8\u65e0\u6cd5\u62c6\u89e3\u51fa\u672c\u7269\u54c1\u6240\u8574\u542b\u7684\u77e5\u8bc6. +Salvage.Skills.ArcanePartial=&c\u60a8\u53ea\u80fd\u62c6\u89e3\u51fa\u672c\u7269\u54c1\u6240\u8574\u542b\u7684\u90e8\u5206\u77e5\u8bc6. +Salvage.Skills.ArcaneSuccess=&a\u60a8\u80fd\u591f\u5b8c\u5168\u62c6\u89e3\u51fa\u672c\u7269\u54c1\u6240\u542b\u7684\u77e5\u8bc6! +Salvage.Listener.Anvil=&4\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.Ability.Lower=&7\u4f60\u653e\u4e0b\u4e86\u4f60\u7684\u5251. +Swords.Ability.Ready=&3\u4f60 &6\u63e1\u7d27&3 \u4e86\u4f60\u7684\u5251. +Swords.Combat.Rupture.Note=&7\u6ce8\u91ca: &e1 Tick \u7b49\u4ef7\u4e8e 0.5 \u79d2! +Swords.Combat.Bleeding.Started=&4 \u4f60\u5728\u6d41\u8840! +Swords.Combat.Bleeding.Stopped=&7\u6d41\u8840 &a\u5df2\u505c\u6b62&7! +Swords.Combat.Bleeding=&a**\u654c\u4eba\u6b63\u5728\u4e0d\u65ad\u6d41\u8840** +Swords.Combat.Counter.Hit=&4\u4f60\u53cd\u51fb\u4e86\u5bf9\u624b! +Swords.Combat.Countered=&a**\u53cd\u51fb\u4e86\u654c\u4eba** +Swords.Combat.SS.Struck=&4\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 @@ -426,16 +426,16 @@ 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.SubSkill.Rupture.Stat.Extra=\u6495\u88c2: &a{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! +Swords.Skills.SS.On=&a**\u5229\u5203\u7a81\u523a\u6fc0\u6d3b** +Swords.Skills.SS.Refresh=&a\u4f60\u7684 &e\u5229\u5203\u7a81\u523a &a\u6280\u80fd\u53ef\u4ee5\u4f7f\u7528\u4e86! +Swords.Skills.SS.Other.Off=\u5229\u5203\u7a81\u523a&a \u7ed3\u675f\u4e86,\u8fdb\u5165\u51b7\u5374 &e{0} +Swords.Skills.SS.Other.On=&a{0}&2 \u4f7f\u7528\u4e86 &c\u5229\u5203\u7a81\u523a! #\u9a6f\u517d Taming.Ability.Bonus.0=\u73af\u5883\u611f\u77e5 Taming.Ability.Bonus.1=\u72fc\u4f1a\u907f\u514d\u5371\u9669 @@ -462,7 +462,7 @@ 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.CallOfTheWild.Description.2=&7\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 @@ -478,23 +478,23 @@ Taming.SubSkill.ThickFur.Description=\u524a\u51cf\u53d7\u5230\u7684\u4f24\u5bb3, 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.Wolf=&8\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.Complete=&a\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.Fail.TooMany=&c\u4f60\u5df2\u7ecf\u8fbe\u5230\u4e86\u53ec\u5524\u5ba0\u7269\u7684\u4e0a\u9650. &e({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.Ability.IronGrip.Defender=&a\u4f60\u7684\u8d85\u5f3a\u63e1\u529b\u62b5\u6321\u4f4f\u4e86\u5bf9\u65b9\u7684\u7f34\u68b0\u653b\u51fb! +Unarmed.Ability.Lower=&7\u4f60\u677e\u5f00\u4e86\u4f60\u7684\u62f3\u5934. +Unarmed.Ability.Ready=&3\u4f60 &6\u63e1\u7d27&3 \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 @@ -517,10 +517,10 @@ Unarmed.SubSkill.BlockCracker.Description=\u7528\u62f3\u5934\u6253\u788e\u662f\u 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! +Unarmed.Skills.Berserk.On=&a**\u72c2\u66b4\u6fc0\u6d3b** +Unarmed.Skills.Berserk.Other.Off=\u72c2\u66b4&a \u7ed3\u675f\u4e86,\u8fdb\u5165\u51b7\u5374 &e{0} +Unarmed.Skills.Berserk.Other.On=&a{0}&2 \u4f7f\u7528\u4e86 &c\u72c2\u66b4! +Unarmed.Skills.Berserk.Refresh=&a\u4f60\u7684 &e\u72c2\u66b4 &a\u6280\u80fd\u53ef\u4ee5\u4f7f\u7528\u4e86! #WOODCUTTING Woodcutting.Ability.0=\u79cb\u98ce\u626b\u843d\u53f6 Woodcutting.Ability.1=\u626b\u9664\u6811\u53f6 @@ -542,173 +542,173 @@ Woodcutting.SubSkill.NaturesBounty.Description=\u4ece\u5927\u81ea\u7136\u4e2d\u8 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.On=&a**\u4f10\u6728\u5de5\u6fc0\u6d3b** +Woodcutting.Skills.TreeFeller.Refresh=&a\u4f60\u7684 &e\u4f10\u6728\u5de5 &a\u6280\u80fd\u53ef\u4ee5\u4f7f\u7528\u4e86! +Woodcutting.Skills.TreeFeller.Other.Off=\u4f10\u6728\u6280\u80fd &a \u7ed3\u675f\u4e86,\u8fdb\u5165\u51b7\u5374 &e{0} +Woodcutting.Skills.TreeFeller.Other.On=&a{0}&2 \u4f7f\u7528\u4e86 &c\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 #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.ArrowDeflect=&f**\u7bad\u77e2\u504f\u5411** +Combat.BeastLore=&a**\u9a6f\u517d\u77e5\u8bc6** +Combat.BeastLoreHealth=&3\u751f\u547d\u503c (&a{0}&3/{1}) +Combat.BeastLoreOwner=&3\u62e5\u6709\u8005 (&c{0}&3) +Combat.BeastLoreHorseSpeed=&3\u9a6c\u5339\u79fb\u901f (&a{0} \u683c/\u79d2&3) +Combat.BeastLoreHorseJumpStrength=&3\u9a6c\u5339\u8df3\u8dc3\u9ad8\u5ea6 (&a\u6700\u9ad8 {0} \u683c&3) +Combat.Gore=&a**\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 +Combat.TargetDazed=\u76ee\u6807\u88ab &4\u88ab\u51fb\u6655 +Combat.TouchedFuzzy=&4\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 +mcMMO.Description=&3\u5173\u4e8e &emcMMO&3:,&6mcMMO \u662f\u4e00\u4e2a &c\u5f00\u6e90&6 RPG mod \u521b\u5efa\u4e8e2011\u5e742\u6708,&6by &9nossr50&6. \u76ee\u6807\u4e3a\u73a9\u5bb6\u63d0\u4f9b\u4e00\u4e2a\u9ad8\u8d28\u91cf\u7684RPG\u4f53\u9a8c.,&3\u63d0\u793a:,&6 - &a\u4f7f\u7528 &c/mcmmo help&a \u67e5\u770b\u6307\u4ee4,&6 - &a\u8f93\u5165 &c/\u6280\u80fd\u540d&a \u67e5\u770b\u8be6\u7ec6\u7684\u6280\u80fd\u4fe1\u606f,&3\u5f00\u53d1\u8005:,&6 - &anossr50 &9(\u521b\u59cb\u4eba & \u9879\u76ee\u8d1f\u8d23\u4eba),&6 - &aGJ &9(\u9879\u76ee\u7ec4\u957f),&6 - &aNuclearW &9(\u5f00\u53d1\u8005),&6 - &abm01 &9(\u5f00\u53d1\u8005),&6 - &aTfT_02 &9(\u5f00\u53d1\u8005),&6 - &aGlitchfinder &9(\u5f00\u53d1\u8005),&6 - &at00thpick1 &9(\u5f00\u53d1\u8005)&6,&3\u7ffb\u8bd1\u4f5c\u8005:,&6 - &aFu_Meng,&3\u6709\u7528\u94fe\u63a5:,&6 - &ahttps://github.com/mcMMO-Dev/mcMMO/issues&6 Bug \u62a5\u544a,&6 - &ahttps://discord.gg/EJGVanb &6 \u5b98\u65b9 Discord +mcMMO.Description.FormerDevs=&3\u524d\u5f00\u53d1\u8005: &aGJ, 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.1=&a\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.AwardAll=&a\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.Ability.Off=\u80fd\u529b\u4f7f\u7528\u5207\u6362 &c\u5173\u95ed +Commands.Ability.On=\u80fd\u529b\u4f7f\u7528\u5207\u6362 &a\u5f00\u542f +Commands.Ability.Toggle=\u80fd\u529b\u4f7f\u7528\u5df2\u5207\u6362\u4e3a &e{0} +Commands.AdminChat.Off=\u4ec5\u7ba1\u7406\u804a\u5929\u6a21\u5f0f &c\u5173\u95ed +Commands.AdminChat.On=\u4ec5\u7ba1\u7406\u804a\u5929\u6a21\u5f0f &a\u5f00\u542f +Commands.AdminToggle=&a- \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.Cooldowns.Header=&6--= &amcMMO \u80fd\u529b\u51b7\u5374&6 =-- +Commands.Cooldowns.Row.N=\ &c{0}&f - \u5269\u4f59 &6{1} &f\u79d2 +Commands.Cooldowns.Row.Y=\ &b{0}&f - &2\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.DoesNotExist= &c\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.AdminChatSpy.Toggle=mcMMO \u961f\u4f0d\u804a\u5929\u5df2\u5207\u6362\u4e3a&e {0} +Commands.AdminChatSpy.Chat=&6[\u76d1\u89c6: &a{0}&6] &f{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.GodMode.Toggle=\u4e0a\u5e1d\u6a21\u5f0f\u5df2\u5207\u6362\u4e3a &e{0} +Commands.Healthbars.Changed.HEARTS=[mcMMO] \u4f60\u7684\u8840\u6761\u663e\u793a\u7c7b\u578b\u5df2\u66f4\u6539\u4e3a &c\u5fc3\u5f62&f. +Commands.Healthbars.Changed.BAR=[mcMMO] \u4f60\u7684\u8840\u6761\u663e\u793a\u7c7b\u578b\u5df2\u66f4\u6539\u4e3a &c\u65b9\u5f62&f. +Commands.Healthbars.Changed.DISABLED=[mcMMO] \u4f60\u7684\u602a\u7269\u8840\u6761\u663e\u793a\u5df2\u88ab &7\u7981\u7528&f. 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.Inspect= &a- \u67e5\u770b\u73a9\u5bb6\u8be6\u7ec6\u4fe1\u606f +Commands.Invite.Success=&a\u9080\u8bf7\u5df2\u6210\u529f\u53d1\u9001. +Commands.Leaderboards= &a- \u6392\u884c\u5427 +Commands.mcgod=&a- \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.mcpurge.Success=&a\u6570\u636e\u5e93\u5df2\u6210\u529f\u6e05\u9664! +Commands.mcrank.Heading=&6-=\u4e2a\u4eba\u6392\u540d=- +Commands.mcrank.Overall=\u7efc\u5408&a - &6\u6392\u540d &f#&a{0} +Commands.mcrank.Player=&f{0} &e\u7684\u6392\u540d +Commands.mcrank.Skill=&e{0}&a - &6\u6392\u540d &f#&a{1} +Commands.mcrank.Unranked=&f\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.mcremove.Success=&a{0} \u4e00\u4ece\u6570\u636e\u5e93\u4e2d\u5220\u9664! +Commands.mctop.Tip=&6\u63d0\u793a: \u4f7f\u7528 &c/mcrank&6 \u6765\u67e5\u770b\u4f60\u6240\u6709\u7684\u4e2a\u4eba\u6392\u540d! +Commands.mmoedit=[player] &a - \u7f16\u8f91\u76ee\u6807 +Commands.mmoedit.AllSkills.1=&a\u4f60\u6240\u6709\u7684\u6280\u80fd\u7b49\u7ea7\u88ab\u8bbe\u7f6e\u4e3a {0} \u7ea7! +Commands.mmoedit.Modified.1=&a\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.Database.Start=&7\u5f00\u59cb\u4ece{0}\u8f6c\u6362\u81f3{1}... +Commands.mcconvert.Database.Finish=&7\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 &a{0} +Commands.mcconvert.Experience.Invalid=\u9519\u8bef\u7684\u516c\u5f0f\u7c7b\u578b! \u6709\u6548\u7c7b\u578b\u4e3a: &a\u7ebf\u6027 &c\u548c &a\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.mcconvert.Experience.Start=&7\u5f00\u59cb\u4ece{0}\u8f6c\u6362\u5230{1}\u66f2\u7ebf +Commands.mcconvert.Experience.Finish=&7\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.Notifications.Off=\u6280\u80fd\u63d0\u793a &c\u5173\u95ed +Commands.Notifications.On=\u6280\u80fd\u63d0\u793a &a\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.Party.Status=&8\u540d\u5b57: &f{0} {1} &8\u7b49\u7ea7: &3{2} +Commands.Party.Status.Alliance=&8\u540c\u76df: &f{0} +Commands.Party.UnlockedFeatures=&8\u5df2\u89e3\u9501\u529f\u80fd: &7[[ITALIC]]{0} +Commands.Party.ShareMode=&8\u5171\u4eab\u6a21\u5f0f: +Commands.Party.ItemShare=&7\u7269\u54c1 &3({0}) +Commands.Party.ExpShare=&7\u7ecf\u9a8c &3({0}) +Commands.Party.ItemShareCategories=&8\u7269\u54c1\u5206\u914d: &7[[ITALIC]]{0} +Commands.Party.MembersNear=&8\u4f60\u9644\u8fd1 &3{0}&8/&3{1} +Commands.Party.Accept=&a- \u63a5\u53d7\u961f\u4f0d\u9080\u8bf7 +Commands.Party.Chat.Off=\u53ea\u5141\u8bb8\u961f\u4f0d\u804a\u5929 &c\u5173\u95ed +Commands.Party.Chat.On=\u53ea\u5141\u8bb8\u961f\u4f0d\u804a\u5929 &a\u5f00\u542f +Commands.Party.Commands=&c---[]&a\u961f\u4f0d\u547d\u4ee4&c[]--- +Commands.Party.Invite.0=&c\u6ce8\u610f: &a\u4f60\u6536\u5230\u4e86\u4e00\u4e2a\u7ec4\u961f\u9080\u8bf7 {0} \u6765\u81ea {1} +Commands.Party.Invite.1=&e\u8f93\u5165 &a/party accept&e \u6765\u63a5\u53d7\u9080\u8bf7 +Commands.Party.Invite=&a- \u53d1\u9001\u7ec4\u961f\u9080\u8bf7 +Commands.Party.Invite.Accepted=&a\u5df2\u63a5\u53d7\u7ec4\u961f\u9080\u8bf7\u3002\u60a8\u5df2\u7ecf\u52a0\u5165\u961f\u4f0d {0} +Commands.Party.Join=&7\u52a0\u5165\u7684\u961f\u4f0d: {0} +Commands.Party.PartyFull=&6{0}&c \u5df2\u6ee1! +Commands.Party.PartyFull.Invite=\u4f60\u4e0d\u80fd\u9080\u8bf7 &e{0}&c \u5230 &a{1}&c \u56e0\u4e3a\u961f\u4f0d\u5df2\u7ecf\u6709 &3{2}&c \u4e2a\u73a9\u5bb6\u4e86! +Commands.Party.PartyFull.InviteAccept=\u4f60\u4e0d\u80fd\u52a0\u5165\u961f\u4f0d &a{0}&c \u56e0\u4e3a\u961f\u4f0d\u5df2\u7ecf\u6709 &3{1}&c \u4e2a\u73a9\u5bb6\u4e86! +Commands.Party.Create=&7\u5df2\u521b\u5efa\u961f\u4f0d: {0} +Commands.Party.Rename=&7\u961f\u4f0d\u540d\u53d8\u66f4\u4e3a: &f{0} +Commands.Party.SetSharing=&7\u961f\u4f0d {0} \u5171\u4eab\u8bbe\u7f6e\u4e3a: &3{1} +Commands.Party.ToggleShareCategory=&7\u961f\u4f0d\u7269\u54c1\u5206\u914d\u7531 &6{0} &7 \u53d8\u4e3a &3{1} +Commands.Party.AlreadyExists=&4\u961f\u4f0d {0} \u5df2\u5b58\u5728! +Commands.Party.Kick=&c\u4f60\u5df2\u88ab &a{0}&c &c\u8e22\u51fa!! +Commands.Party.Leave=&e\u4f60\u79bb\u5f00\u4e86\u8fd9\u652f\u961f\u4f0d +Commands.Party.Members.Header=&c-----[]&a\u6210\u5458&c[]----- +Commands.Party.None=&c\u4f60\u4e0d\u5728\u961f\u4f0d\u4e2d. +Commands.Party.Quit=&a- \u79bb\u5f00\u4f60\u73b0\u6709\u7684\u961f\u4f0d +Commands.Party.Teleport=&a- \u4f20\u9001\u5230\u961f\u4f0d\u6210\u5458 +Commands.Party.Toggle=&a- \u5207\u6362\u961f\u4f0d\u804a\u5929 +Commands.Party1=&a- \u521b\u5efa\u4e00\u4e2a\u65b0\u961f\u4f0d +Commands.Party2=&a- \u52a0\u5165\u4e00\u4e2a\u73a9\u5bb6\u7684\u961f\u4f0d +Commands.Party.Alliance.Header=&c-----[]&a\u961f\u4f0d\u540c\u76df&c[]----- +Commands.Party.Alliance.Ally=&f{0} &8\u7684\u540c\u76df\u961f\u4f0d: &f{1} +Commands.Party.Alliance.Members.Header=&c-----[]&a\u540c\u76df\u6210\u5458&c[]----- +Commands.Party.Alliance.Invite.0=\u6ce8\u610f: &a\u60a8\u4ece {1} \u6536\u5230\u961f\u4f0d\u540c\u76df\u9080\u8bf7\u6765 {0} +Commands.Party.Alliance.Invite.1=\u8f93\u5165 &a/party alliance accept&e \u6765\u63a5\u53d7\u9080\u8bf7 +Commands.Party.Alliance.Invite.Accepted=&a\u5df2\u63a5\u53d7\u540c\u76df\u9080\u8bf7. +Commands.Party.Alliance.None=&c\u60a8\u6ca1\u6709\u540c\u76df.&c&a +Commands.Party.Alliance.AlreadyAllies=&c\u60a8\u7684\u961f\u4f0d\u5df2\u7ecf\u6709\u4e00\u4e2a\u540c\u76df. \u4f7f\u7528 &3/party alliance disband &c\u6765\u89e3\u6563\u5f53\u524d\u540c\u76df +Commands.Party.Alliance.Help.0=&c\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=&c \u4f7f\u7528 &3/party alliance invite <\u73a9\u5bb6>&c. +Commands.ptp.Enabled=\u961f\u4f0d\u4f20\u9001 &a\u542f\u7528 +Commands.ptp.Disabled=\u961f\u4f0d\u4f20\u9001 &c\u7981\u7528 +Commands.ptp.NoRequests=&c\u5f53\u524d\u6ca1\u6709\u4f20\u9001\u8bf7\u6c42 +Commands.ptp.NoWorldPermissions=&c[mcMMO] \u4f60\u6ca1\u6709\u6743\u9650\u4f20\u9001\u5230\u4e16\u754c {0}. +Commands.ptp.Request1=&e{0} &a\u5df2\u7ecf\u5411\u4f60\u53d1\u51fa\u8bf7\u6c42\u4f20\u9001 +Commands.ptp.Request2=&a\u540c\u610f\u4f20\u9001\u8f93\u5165 &e/ptp accept. &a\u8bf7\u6c42\u5c06\u5728 &c{0} &a \u79d2\u540e\u5931\u6548 +Commands.ptp.AcceptAny.Enabled=\u961f\u4f0d\u4f20\u9001\u8bf7\u6c42\u786e\u8ba4 &a\u542f\u7528 +Commands.ptp.AcceptAny.Disabled=\u961f\u4f0d\u4f20\u9001\u8bf7\u6c42\u786e\u8ba4 &c\u7981\u7528 +Commands.ptp.RequestExpired=&c\u961f\u4f0d\u4f20\u9001\u8bf7\u6c42\u5df2\u5931\u6548! +Commands.PowerLevel.Leaderboard=&e--mcMMO&9 \u6218\u6597\u529b &e\u6392\u884c\u699c-- +Commands.PowerLevel.Capped=&4]\u6218\u6597\u529b: &a{0} &4\u6700\u9ad8\u7b49\u7ea7: &e{1} +Commands.PowerLevel=&4\u6218\u6597\u529b: &a{0} +Commands.Reset.All=&a\u4f60\u7684\u6280\u80fd\u7b49\u7ea7\u5df2\u590d\u4f4d\u6210\u529f. +Commands.Reset.Single=&a\u4f60\u7684 {0} \u6280\u80fd\u7b49\u7ea7\u5df2\u6210\u529f\u91cd\u7f6e. +Commands.Reset=&a- \u91cd\u7f6e\u6280\u80fd\u7b49\u7ea7\u4e3a0 +Commands.Scoreboard.Clear=&3mcMMO \u8bb0\u5206\u677f\u5df2\u6e05\u7a7a. +Commands.Scoreboard.NoBoard=&cmcMMO \u8bb0\u5206\u677f\u5f53\u524d\u672a\u6fc0\u6d3b. +Commands.Scoreboard.Keep=&3mcMMO \u8bb0\u5206\u677f\u5c06\u60ac\u505c\u76f4\u5230\u60a8\u4f7f\u7528 &a/mcscoreboard clear&3. +Commands.Scoreboard.Timer=&3mcMMO \u8bb0\u5206\u677f\u5c06\u5728 &6{0}&3 \u79d2\u540e\u6e05\u7a7a\u3002 +Commands.Scoreboard.Help.0=&6 == &c/mcscoreboard &a\u5e2e\u52a9&6 == +Commands.Scoreboard.Help.1=&3/mcscoreboard&b clear &f - \u6e05\u7a7a mcMMO \u8bb0\u5206\u677f +Commands.Scoreboard.Help.2=&3/mcscoreboard&b keep &f - \u4fdd\u6301 mcMMO \u8bb0\u5206\u677f\u60ac\u505c +Commands.Scoreboard.Help.3=&3/mcscoreboard&b time [n] &f - &dn&f \u79d2\u540e\u6e05\u7a7a mcMMO \u8bb0\u5206\u677f +Commands.Scoreboard.Tip.Keep=&6\u63d0\u793a: \u5f53\u8bb0\u5206\u677f\u663e\u793a\u65f6\u4f7f\u7528 &c/mcscoreboard keep&6 \u6765\u4fdd\u6301\u5b83\u4e0d\u6d88\u5931\u3002 +Commands.Scoreboard.Tip.Clear=&6\u63d0\u793a: \u4f7f\u7528 &c/mcscoreboard clear&6 \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.Skill.Leaderboard=--mcMMO &9{0}&e \u6392\u884c\u699c-- +Commands.SkillInfo=&a- \u67e5\u770b\u6280\u80fd\u7684\u8be6\u7ec6\u4fe1\u606f +Commands.Stats=&a- \u4f60\u7684\u4fe1\u606f +Commands.ToggleAbility=&a- \u7528\u9f20\u6807\u53f3\u952e\u5207\u6362\u6280\u80fd\u6fc0\u6d3b\u6a21\u5f0f +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.FullClassName=\u6570\u636e\u7c7b\u578b Commands.Usage.Level=\u7b49\u7ea7 Commands.Usage.Message=\u6d88\u606f @@ -721,69 +721,69 @@ 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.Mystery=&7\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.Header=&3-=[]=====[]&6 MMO \u4fe1\u606f &3[]=====[]=- +Commands.MmoInfo.SubSkillHeader=&6\u540d\u5b57:&e {0} +Commands.MmoInfo.DetailsHeader=&3-=[]=====[]&a \u7ec6\u8282 &3[]=====[]=- +Commands.MmoInfo.OldSkill=&7mcMMO\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=&3-=[]=====[]&6 \u673a\u68b0\u5b66 &3[]=====[]=- 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.. +Commands.Mmodebug.Toggle=mcMMO \u8c03\u8bd5\u6a21\u5f0f &6{0}&7, \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=&c\u4f60\u73b0\u5728\u6ca1\u6709\u53d7\u5230\u4efb\u4f55\u9080\u8bf7 +mcMMO.NoPermission=&4\u6743\u9650\u4e0d\u8db3. +mcMMO.NoSkillNote=&8\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.Help.0=&c\u6b63\u786e\u7684\u7528\u6cd5 &3{0} [password]. +Party.Help.1=&c\u521b\u5efa\u4e00\u4e2a\u961f\u4f0d, \u4f7f\u7528 &3{0} [password]. +Party.Help.2=&c\u67e5\u9605 &3{0} &c\u83b7\u53d6\u66f4\u591a\u4fe1\u606f +Party.Help.3=&c\u4f7f\u7528 &3{0} [password] &c\u52a0\u5165\u6216 &3{1} &c\u9000\u51fa +Party.Help.4=&c\u9501\u5b9a\u6216\u89e3\u9501\u4f60\u7684\u961f\u4f0d, \u4f7f\u7528 &3{0} +Party.Help.5=&c\u8bbe\u7f6e\u961f\u4f0d\u5bc6\u7801, \u4f7f\u7528 &3{0} +Party.Help.6=&c\u4ece\u4f60\u7684\u961f\u4f0d\u4e2d\u8e22\u51fa\u73a9\u5bb6, \u4f7f\u7528 &3{0} +Party.Help.7=&c\u79fb\u4ea4\u961f\u957f, \u4f7f\u7528 &3{0} +Party.Help.8=&c\u89e3\u6563\u961f\u4f0d, \u4f7f\u7528 &3{0} +Party.Help.9=&c\u4f7f\u7528 &3{0} &c\u6765\u4e0e\u4f60\u7684\u961f\u4f0d\u6210\u5458\u5206\u4eab\u7269\u54c1 +Party.Help.10=&c\u4f7f\u7528 &3{0} &c\u5f00\u542f\u4e0e\u4f60\u7684\u961f\u4f0d\u6210\u5458\u5206\u4eab\u7ecf\u9a8c +Party.InformedOnJoin={0} &a\u5df2\u7ecf\u52a0\u5165\u4f60\u7684\u961f\u4f0d +Party.InformedOnQuit={0} &a\u79bb\u5f00\u4e86\u961f\u4f0d +Party.InformedOnNameChange=&6{0} &a\u5df2\u8bbe\u7f6e\u961f\u4f0d\u540d\u4e3a &f{1} +Party.InvalidName=&4\u90a3\u4e0d\u662f\u4e00\u4e2a\u6709\u6548\u7684\u961f\u4f0d\u540d\u5b57. +Party.Invite.Self=&c\u4f60\u4e0d\u80fd\u9080\u8bf7\u81ea\u5df1! +Party.IsLocked=&c\u8fd9\u4e2a\u961f\u4f0d\u5df2\u7ecf\u9501\u5b9a! +Party.IsntLocked=&c\u8fd9\u4e2a\u961f\u4f0d\u5e76\u6ca1\u6709\u9501\u5b9a! +Party.Locked=&c\u961f\u4f0d\u88ab\u9501\u5b9a, \u53ea\u6709\u961f\u957f\u53ef\u4ee5\u9080\u8bf7. +Party.NotInYourParty=&4{0} \u4f60\u4e0d\u5728\u4f60\u7684\u56e2\u961f +Party.NotOwner=&4\u4f60\u4e0d\u662f\u961f\u957f +Party.Target.NotOwner=&4{0} \u4e0d\u662f\u961f\u957f\u3002 +Party.Owner.New=&a{0} \u73b0\u5728\u662f\u65b0\u7684\u6d3e\u7cfb\u9886\u961f. +Party.Owner.NotLeader=&4\u4f60\u5df2\u7ecf\u4e0d\u518d\u662f\u6d3e\u7cfb\u5185\u7684\u9886\u961f. +Party.Owner.Player=&a\u4f60\u73b0\u5728\u4e0d\u662f\u961f\u957f\u4e86 +Party.Password.None=&c\u52a0\u5165\u8fd9\u4e2a\u961f\u4f0d\u9700\u8981\u5bc6\u7801. \u8bf7\u63d0\u4f9b\u5bc6\u7801\u518d\u52a0\u5165 +Party.Password.Incorrect=&c\u961f\u4f0d\u5bc6\u7801\u9519\u8bef +Party.Password.Set=&a\u961f\u4f0d\u5bc6\u7801\u8bbe\u7f6e\u4e3a {0} +Party.Password.Removed=&a\u961f\u4f0d\u5bc6\u7801\u5df2\u88ab\u6e05\u9664 +Party.Player.Invalid=&c\u8fd9\u4e0d\u662f\u4e00\u540d\u6709\u6548\u7684\u73a9\u5bb6 +Party.NotOnline=&4{0} \u4e0d\u5728\u7ebf! +Party.Player.InSameParty=&c{0} \u5df2\u7ecf\u5728\u961f\u4f0d\u4e2d! +Party.PlayerNotInParty=&4{0} \u4e0d\u5728\u961f\u4f0d\u91cc +Party.Specify=&c\u4f60\u5fc5\u987b\u6307\u5b9a\u4e00\u4e2a\u961f\u4f0d +Party.Teleport.Dead=&c\u4f60\u4e0d\u80fd\u4f20\u9001\u5230\u6b7b\u4ea1\u7684\u73a9\u5bb6\u8eab\u8fb9 +Party.Teleport.Hurt=&c\u4f60\u53d7\u5230\u4f24\u5bb3, \u81f3\u5c11 {0} \u79d2\u5185\u4e0d\u80fd\u4f20\u9001 +Party.Teleport.Player=&a\u4f60\u5df2\u7ecf\u4f20\u9001\u5230 {0}. +Party.Teleport.Self=&c\u4f60\u4e0d\u80fd\u4f20\u9001\u5230\u4f60\u81ea\u5df1\u90a3\u91cc! +Party.Teleport.Target=&a{0} \u5df2\u7ecf\u4f20\u9001\u5230\u4f60\u8eab\u8fb9. +Party.Teleport.Disabled=&c{0} \u4e0d\u5141\u8bb8\u961f\u4f0d\u4f20\u9001 +Party.Rename.Same=&c\u8fd9\u5df2\u7ecf\u662f\u4f60\u7684\u961f\u4f0d\u540d\u5b57\u4e86! +Party.Join.Self=&c\u4f60\u4e0d\u80fd\u52a0\u5165\u4f60\u81ea\u5df1! +Party.Unlocked=&7\u961f\u4f0d\u5df2\u89e3\u9501 +Party.Disband=&7\u961f\u4f0d\u5df2\u89e3\u6563 +Party.Alliance.Formed=&7\u60a8\u7684\u961f\u4f0d\u5f53\u524d\u4e0e &a{0} &7\u7ed3\u76df +Party.Alliance.Disband=&7\u60a8\u7684\u961f\u4f0d\u4e0d\u518d\u4e0e &c{0} &7\u7ed3\u76df +Party.Status.Locked=&4(\u4ec5\u9080\u8bf7) +Party.Status.Unlocked=&2(\u5f00\u542f) +Party.LevelUp=&e\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 @@ -794,11 +794,11 @@ Party.Feature.Locked.Teleport=\u529f\u80fd\u9501\u5b9a\u76f4\u81f3 {0}+ (\u961f\ 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.Feature.Disabled.1=&c\u961f\u4f0d\u804a\u5929\u5c1a\u672a\u89e3\u9501\u3002 +Party.Feature.Disabled.2=&c\u961f\u4f0d\u4f20\u9001\u5c1a\u672a\u89e3\u9501\u3002 +Party.Feature.Disabled.3=&c\u961f\u4f0d\u540c\u76df\u5c1a\u672a\u89e3\u9501\u3002 +Party.Feature.Disabled.4=&c\u961f\u4f0d\u7269\u54c1\u5171\u4eab\u5c1a\u672a\u89e3\u9501\u3002 +Party.Feature.Disabled.5=&c\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 @@ -824,216 +824,216 @@ 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.XPGain=&8\u7ecf\u9a8c\u6765\u6e90: &f{0} +Commands.xplock.locked=&6\u4f60\u7684\u7ecf\u9a8c\u6761\u9501\u5b9a\u5728 {0}! +Commands.xplock.unlocked=&6\u4f60\u7684\u7ecf\u9a8c\u6761\u73b0\u5728 &a\u89e3\u9664\u9501\u5b9a\u4e86&6! +Commands.xprate.modified=&c\u7ecf\u9a8c\u500d\u7387\u5df2\u8bbe\u7f6e\u4e3a {0} +Commands.xprate.over=&cmcMMO \u9ad8\u7ecf\u9a8c\u4e8b\u4ef6\u7ed3\u675f!! +Commands.xprate.proper.0=&c\u60f3\u4fee\u6539\u7ecf\u9a8c\u83b7\u53d6\u7387\u8bf7\u8f93\u5165 /xprate +Commands.xprate.proper.1=&c\u60f3\u628a\u7ecf\u9a8c\u83b7\u53d6\u7387\u8c03\u6574\u4e3a\u9ed8\u8ba4\u8bf7\u8f93\u5165 /xprate reset +Commands.xprate.proper.2=&c\u8bf7\u6307\u5b9a true \u6216 false \u6765\u8868\u660e\u8fd9\u662f\u5426\u662f\u4e00\u4e2a\u7ecf\u9a8c\u4e8b\u4ef6 +Commands.xprate.started.0=&6 mcMMO \u9ad8\u7ecf\u9a8c\u4e8b\u4ef6\u5df2\u5f00\u59cb! +Commands.xprate.started.1=&6mcMMO \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 +Commands.Event.Start=&amcMMO&6 \u4e8b\u4ef6! +Commands.Event.Stop=&amcMMO&3 \u4e8b\u4ef6\u7ed3\u675f! +Commands.Event.Stop.Subtitle=&a\u6211\u5e0c\u671b\u4f60\u73a9\u7684\u5f00\u5fc3! +Commands.Event.XP=&3\u591a\u500d\u7ecf\u9a8c\u901f\u7387\u4e3a &6{0}&3 \u500d # 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\u4f60\u5df2\u5c06\u5168\u5c40\u591a\u500d\u7ecf\u9a8c\u8bbe\u7f6e\u4e3a &6{0} \u500d +Notifications.Admin.XPRate.End.Self=&7\u4f60\u7ed3\u675f\u4e86\u591a\u500d\u7ecf\u9a8c\u4e8b\u4ef6. +Notifications.Admin.XPRate.End.Others={0} &7\u7ed3\u675f\u4e86\u591a\u500d\u7ecf\u9a8c\u4e8b\u4ef6 +Notifications.Admin.XPRate.Start.Others={0} &7\u5df2\u542f\u52a8\u6216\u4fee\u6539\u5177\u6709\u5168\u5c40 {1} \u500d\u7684\u591a\u500d\u7ecf\u9a8c\u4e8b\u4ef6 +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 \u73b0\u5728\u6b63\u5904\u4e8e\u591a\u500d\u7ecf\u9a8c\u4e8b\u4ef6\u9636\u6bb5! \u7ecf\u9a8c\u83b7\u53d6\u7387\u4e3a {0}\u500d! #GUIDES -Guides.Available=[[GRAY]]{0} \u7684\u5411\u5bfc - \u8f93\u5165 /{1} ? [\u9875\u6570] -Guides.Header=[[GOLD]]-=[[GREEN]]{0} \u5411\u5bfc[[GOLD]]=- +Guides.Available=&7{0} \u7684\u5411\u5bfc - \u8f93\u5165 /{1} ? [\u9875\u6570] +Guides.Header=&6-=&a{0} \u5411\u5bfc&6=- 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 +Guides.Acrobatics.Section.0=&3\u5173\u4e8e\u6742\u6280:\n&e\u6742\u6280\u662f mcMMO \u4e2d\u4f18\u96c5\u79fb\u52a8\u7684\u827a\u672f\u3002\n&e\u5b83\u63d0\u4f9b\u4e86\u6218\u6597\u52a0\u6210\u548c\u73af\u5883\u4f24\u5bb3\u52a0\u6210\u3002\n\n&3\u7ecf\u9a8c\u83b7\u53d6:\n&e\u901a\u8fc7\u5728\u6218\u6597\u4e2d\u95ea\u907f\u6216\u8005\u4ece\u9ad8\u5904\n&e\u8dcc\u843d\u65f6\u53d7\u4f24\u5e76\u5e78\u5b58\u6765\u83b7\u5f97\u7ecf\u9a8c\u3002 +Guides.Acrobatics.Section.1=&3\u7ffb\u6eda\u662f\u5982\u4f55\u5de5\u4f5c\u7684\uff1f\n&e\u5f53\u60a8\u53d7\u5230\u8dcc\u843d\u4f24\u5bb3\u65f6\u60a8\u6709\u88ab\u52a8\u673a\u4f1a\u6765\u514d\u53d7\u4f24\u5bb3\u3002\n&e\u60a8\u53ef\u4ee5\u5728\u8dcc\u843d\u4e2d\u6309\u4f4f\u6f5c\u884c\u952e\u6765\u63d0\u5347\u89e6\u53d1\u51e0\u7387\u3002\n&e\u8fd9\u5c06\u89e6\u53d1\u4e00\u4e2a\u4f18\u96c5\u5730\u7ffb\u6eda\u800c\u4e0d\u662f\u666e\u901a\u7684\u7ffb\u6eda\u3002\n&e\u4f18\u96c5\u5730\u7ffb\u6eda\u7c7b\u4f3c\u666e\u901a\u7684\u7ffb\u6eda\u4f46\u662f\u5b83\u6709\u53cc\u500d\u51e0\u7387\n&e\u53d1\u751f\uff0c\u5e76\u4e14\u80fd\u591f\u63d0\u4f9b\u6bd4\u666e\u901a\u5730\u7ffb\u6eda\u66f4\u9ad8\u7684\u4f24\u5bb3\u51cf\u514d\u3002\n&e\u7ffb\u6eda\u51e0\u7387\u53d6\u51b3\u4e8e\u60a8\u7684\u6280\u80fd\u7b49\u7ea7 +Guides.Acrobatics.Section.2=&3\u95ea\u907f\u662f\u5982\u4f55\u5de5\u4f5c\u7684?\n&e\u95ea\u907f\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd\n&e\u4ed6\u5728\u4f60\u88ab\u653b\u51fb\u65f6\u6709\u4e00\u5b9a\u51e0\u7387\u88ab\u6fc0\u53d1\n&e\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) +Guides.Alchemy.Section.0=&3\u5173\u4e8e\u70bc\u91d1:\n&e\u70bc\u91d1\u662f\u836f\u6c34\u917f\u9020\u7684\u6280\u80fd\u3002\n&e\u5b83\u63d0\u5347\u4e86\u836f\u6c34\u917f\u9020\u65f6\u7684\u901f\u5ea6\uff0c\u5e76\u4e14\u52a0\u5165\u4e86\n&e\u65b0\u7684\uff08\u76f8\u5bf9\u4e4b\u524d\uff09\u65e0\u6cd5\u83b7\u53d6\u7684\u836f\u6c34\u3002\n\n\n&3\u7ecf\u9a8c\u83b7\u53d6\uff1a\n&e\u901a\u8fc7\u917f\u9020\u836f\u6c34\u6765\u83b7\u53d6\u7ecf\u9a8c\u3002 +Guides.Alchemy.Section.1=&3\u50ac\u5316\u662f\u5982\u4f55\u5de5\u4f5c\u7684\uff1f\n&e\u50ac\u5316\u63d0\u5347\u917f\u9020\u7684\u901f\u5ea6\uff0c\u5728 1000 \u7ea7\n&e\u65f6\u80fd\u8fbe\u5230\u6700\u9ad8 4 \u500d\u3002\n&e\u6b64\u80fd\u529b\u9ed8\u8ba4\u5728 100 \u7ea7\u89e3\u9501\u3002 +Guides.Alchemy.Section.2=&3\u6df7\u5408\u662f\u5982\u4f55\u5de5\u4f5c\u7684\uff1f\n&e\u6df7\u5408\u5141\u8bb8\u4f7f\u7528\u81ea\u8ba2\u539f\u6599\u917f\u9020\u66f4\u591a\u836f\u6c34\u3002\n&e\u7279\u6b8a\u539f\u6599\u6839\u636e\u60a8\u7684\u7b49\u7ea7\u6765\u89e3\u9501\u3002\n&e\u603b\u5171\u6709 8 \u4e2a\u7b49\u7ea7\u9700\u8981\u89e3\u9501\u3002 +Guides.Alchemy.Section.3=&3\u6df7\u5408\u7b2c 1 \u9636\u539f\u6599:\n&e\u70c8\u7130\u7c89, \u53d1\u9175\u86db\u773c, \u6076\u9b42\u4e4b\u6cea, \u7ea2\u77f3,\n&e\u8424\u77f3\u7c89, \u7cd6, \u95ea\u70c1\u7684\u897f\u74dc, \u91d1\u80e1\u841d\u535c,\n&e\u5ca9\u6d46\u818f, \u5730\u72f1\u75a3, \u8718\u86db\u773c, \u706b\u836f, \u7761\u83b2,\n&e\u6cb3\u8c5a\n&e(\u7eaf\u51c0\u836f\u6c34) +Guides.Alchemy.Section.4=&3\u6df7\u5408\u7b2c 2 \u9636\u539f\u6599:\n&e\u80e1\u841d\u535c (\u6025\u8feb\u836f\u6c34)\n&e\u7c98\u6db2\u7403 (\u8fdf\u949d\u836f\u6c34)\n\n&3\u6df7\u5408\u7b2c 3 \u9636\u539f\u6599:\n&e\u4e0b\u754c\u77f3\u82f1 (\u4f24\u5bb3\u5438\u6536\u836f\u6c34)\n&e\u7ea2\u8272\u8611\u83c7 (\u8df3\u8dc3\u836f\u6c34) +Guides.Alchemy.Section.5=&3\u6df7\u5408\u7b2c 4 \u9636\u539f\u6599:\n&e\u82f9\u679c (\u751f\u547d\u52a0\u6210\u836f\u6c34)\n&e\u8150\u8089 (\u9965\u997f\u836f\u6c34)\n\n&3\u6df7\u5408\u7b2c 5 \u9636\u539f\u6599:\n&e\u8910\u8272\u8611\u83c7 (\u53cd\u80c3\u836f\u6c34)\n&e\u58a8\u56ca (\u5931\u660e\u836f\u6c34) +Guides.Alchemy.Section.6=&3\u6df7\u5408\u7b2c 6 \u9636\u539f\u6599:\n&e\u8568\u7c7b (\u9971\u548c\u836f\u6c34)\n\n&3\u6df7\u5408\u7b2c 7 \u9636\u539f\u6599:\n&e\u6bd2\u9a6c\u94c3\u85af (Potion of Decay)\n\n[[\u8150\u70c2\u836f\u6c34]]\u6df7\u5408\u7b2c 8 \u9636\u539f\u6599:\n&e\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%. +Guides.Archery.Section.0=&3\u5173\u4e8e\u7bad\u672f:\n&e\u7bad\u672f\u662f\u7528\u5f13\u5c04\u7bad.\n&e\u4e3a\u4f60\u63d0\u4f9b\u5404\u79cd\u7ad9\u4e1c\u52a0\u6210, \n&e\u4f8b\u5982\u968f\u7740\u4f60\u7684\u7b49\u7ea7\u63d0\u5347\u4f24\u5bb3\uff0c\u4ee5\u53ca\u5c06\u5bf9\u624b\u51fb\u6655\u7684\u80fd\u529b\n&e\u9664\u6b64\u4e4b\u5916\u4f60\u8fd8\u80fd\u4ece\u5bf9\u624b\u7684\u8eab\u4e0a\u56de\u6536\u7bad\u77e2.\n\n\n&3\u7ecf\u9a8c\u6765\u6e90:\n&e\u8981\u83b7\u53d6\u6b64\u4ec5\u80fd\u7684\u7ecf\u9a8c\n&e\u4f60\u9700\u8981\u5c04\u51fb\u602a\u7269\u6216\u5176\u4ed6\u73a9\u5bb6. +Guides.Archery.Section.1=&3\u6280\u5de7\u5c04\u51fb\u5982\u4f55\u5de5\u4f5c?\n&e\u6280\u5de7\u5c04\u51fb\u4f1a\u4f7f\u4f60\u7684\u5c04\u7bad\u653b\u51fb\u83b7\u5f97\u4f24\u5bb3\u52a0\u6210.\n&e\u6280\u5de7\u5c04\u51fb\u63d0\u4f9b\u7684\u4f24\u5bb3\u52a0\u6210\u4f1a\u968f\u7740\n&e\u7bad\u672f\u7b49\u7ea7\u7684\u63d0\u5347\u800c\u589e\u52a0.\n&e\u4f7f\u7528\u9ed8\u8ba4\u8bbe\u7f6e\u4f60\u7684\u7bad\u672f\u6bcf\u4e94\u5341\u7ea7\u63d0\u9ad810%\u7684\u4f24\u5bb3\u52a0\u6210\n&e\u6700\u9ad8\u63d0\u4f9b200%\u7684\u4f24\u5bb3\u52a0\u6210. +Guides.Archery.Section.2=&3\u51fb\u6655\u5982\u4f55\u5de5\u4f5c?\n&e\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&e\u5f53\u51fb\u6655\u89e6\u53d1\u65f6\u4ed6\u4f1a\u65f6\n&e\u5bf9\u624b\u76f4\u89c6\u524d\u65b9\u4e00\u5b9a\u65f6\u95f4.\n&e\u5e76\u63d0\u4f9b4\u70b9\u7684\u989d\u5916\u4f24\u5bb3\uff082 \u5fc3\uff09. +Guides.Archery.Section.3=&3\u7bad\u77e2\u56de\u6536\u5982\u4f55\u5de5\u4f5c?\n&e\u5f53\u4f60\u7528\u5f13\u7bad\u51fb\u6740\u602a\u7269\u65f6\n&e\u6709\u51e0\u7387\u56de\u6536\u7bad\u77e2.\n&e\u8fd9\u4e2a\u51e0\u7387\u968f\u7740\u4f60\u7bad\u672f\u7b49\u7ea7\u7684\u63d0\u5347\u800c\u589e\u52a0.\n&e\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u8fd9\u4e2a\u80fd\u529b\u6bcf\u7ea7\u589e\u52a00.1%,\n&e1000\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 +Guides.Axes.Section.0=&3\u5173\u4e8e \u65a7\u6280:\n&e\u6709\u4e86\u65a7\u5934\u6280\u80fd,\u65a7\u5b50\u4e0d\u518d\u53ea\u662f\u780d\u6811\u800c\u5df2.\n&e\u4f60\u8fd8\u53ef\u4ee5\u780d\u5176\u4ed6\u751f\u7269\u548c\u73a9\u5bb6\u6765\u8d5a\u53d6\u7ecf\u9a8c.\n&e\u6253\u51fb\u751f\u7269\u65f6\u9644\u52a0\u51fb\u9000\u6548\u679c.\n&e\u8fd8\u4f1a\u5bf9\u751f\u7269\u548c\u73a9\u5bb6\u9020\u6210\u81f4\u547d\u4f24\u5bb3.\n&e\u4f60\u7684\u65a7\u5b50\u4f1a\u50cf\u4f10\u6728\u673a\u4e00\u6837.\n&e\u8f7b\u677e\u524a\u6389\u654c\u4eba\u7684\u62a4\u7532.\n&e\u6548\u679c\u968f\u7740\u6280\u80fd\u7b49\u7ea7\u63d0\u9ad8.\n&3\u7ecf\u9a8c\u7684\u83b7\u53d6:\n&e\u624b\u6301\u65a7\u5b50\u653b\u51fb\u5176\u4ed6\u751f\u7269\u6216\u73a9\u5bb6. +Guides.Axes.Section.1=&3\u4ec0\u4e48\u662f\u65a9\u9996\u8005?\n&e\u8fd9\u4e2a\u6280\u80fd\u4f1a\u9020\u6210\u8303\u56f4\u6253\u51fb\u4f24\u5bb3\n&e\u4f24\u5bb3\u7b49\u4e8e\u5bf9\u4e3b\u8981\u653b\u51fb\u76ee\u6807\u9020\u6210\u4f24\u5bb3\u768450%\n&e\u6240\u4ee5\u5f88\u5bb9\u6613\u6e05\u7406\u6389\u4e00\u5927\u7247\u602a\u7269 +Guides.Axes.Section.2=&3\u4ec0\u4e48\u662f\u81f4\u547d\u4e00\u51fb?\n&e\u8fd9\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd\n&e\u4e00\u5b9a\u51e0\u7387\u5bf9\u76ee\u6807\u9020\u6210\u989d\u5916\u4f24\u5bb3\n&e\u9ed8\u8ba4\u6bcf2\u7ea7\u589e\u52a0 0.1%\n&e\u5bf9\u751f\u7269\u9020\u62102\u500d\u4f24\u5bb3\n&e\u5bf9\u73a9\u5bb6\u9020\u62101.5\u500d\u4f24\u5bb3 +Guides.Axes.Section.3=&3\u4ec0\u4e48\u662f\u65a7\u7cbe\u901a?\n&e\u8fd9\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd\n&e\u4f7f\u7528\u65a7\u5b50\u653b\u51fb\u65f6\u9644\u52a0\u989d\u5916\u4f24\u5bb3\n&e\u9ed8\u8ba4\u6bcf50\u7ea7\u989d\u5916\u63d0\u9ad81\u70b9\u4f24\u5bb3\n&e4\u70b9\u989d\u5916\u4f24\u5bb3\u5c01\u9876 +Guides.Axes.Section.4=&3\u4ec0\u4e48\u662f\u7834\u7532?\n&e\u7528\u8db3\u591f\u7684\u529b\u91cf\u51fb\u788e\u62a4\u7532!\n&e\u7834\u7532\u662f\u4e00\u4e2a\u88ab\u52a8\u7684\u80fd\u529b,\u5b83\u6709\u51e0\u7387\u4f1a\u635f\u8017\n&e\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=&3\u4ec0\u4e48\u662f\u5f3a\u529b\u51b2\u51fb?\n&e\u8fd9\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd\n&e\u4f7f\u7528\u65a7\u5b50\u653b\u51fb\u65f6\u4e00\u5b9a\u51e0\u7387\u7ed9\u654c\u4eba\u5e26\u6765\u5de8\u5927\u7684\u51b2\u51fb\u529b\n&e\u9ed8\u8ba4\u51e0\u7387\u4e3a 25%\n&e\u6548\u679c\u76f8\u5f53\u4e8e \u51fb\u9000 II \u7684\u9644\u9b54\u6548\u679c\n&e\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. +Guides.Excavation.Section.0=&3\u5173\u4e8e\u6316\u6398:\n&e\u6316\u6398\u662f\u4ee5\u6316\u6398\u6ce5\u571f\u4ee5\u5bfb\u627e\u5b9d\u85cf\u7684\u884c\u4e3a.\n&e\u901a\u8fc7\u6316\u6398,\u4f60\u5c06\u4f1a\u627e\u5230\u9690\u85cf\u7684\u5b9d\u85cf.\n&e\u4f60\u6316\u7684\u8d8a\u591a\u4f60\u627e\u5230\u7684\u5b9d\u85cf\u4e5f\u5c31\u8d8a\u591a.\n\n&3\u7ecf\u9a8c\u6765\u6e90:\n&e\u8981\u83b7\u5f97\u8be5\u6280\u80fd\u7684\u7ecf\u9a8c\u4f60\u5fc5\u987b\u624b\u6301\u94f2\u5b50\u6316\u6398.\n&e\u53ea\u6709\u7279\u5b9a\u7684\u65b9\u5757\u624d\u80fd\u83b7\u5f97\u7ecf\u9a8c,\u6316\u6398\u5230\u5b9d\u85cf. +Guides.Excavation.Section.1=&3\u53ef\u4ee5\u6316\u6398\u7684\u65b9\u5757:\n&e\u8349\u65b9\u5757, \u6ce5\u571f, \u6c99\u5b50, \u7c98\u571f, \u7802\u783e, \u83cc\u4e1d, \u7075\u9b42\u6c99, \u96ea +Guides.Excavation.Section.2=&3\u5982\u4f55\u4f7f\u7528\u66b4\u8d70\u94bb\u5934:\n&e\u624b\u62ff\u94f2\u5b50\u53f3\u952e\u5355\u51fb\u4ee5\u8fdb\u5165\u51c6\u5907\u72b6\u6001.\n&e\u4e00\u65e6\u8fdb\u5165\u8fd9\u79cd\u72b6\u6001,\u4f60\u7ea6\u67094\u79d2\u7684\u65f6\u95f4\u8ba9\u5de5\u5177\n&e\u70b9\u51fb\u4e0e\u6316\u6398\u673a\u80fd\u517c\u5bb9\u7684\u65b9\u5757\n&e\u8fd9\u6837\u5c31\u4f1a\u6fc0\u6d3b\u66b4\u8d70\u94bb\u5934\u6280\u80fd. +Guides.Excavation.Section.3=&3\u4ec0\u4e48\u662f\u66b4\u8d70\u94bb\u5934?\n&e\u66b4\u8d70\u94bb\u5934\u662f\u4e00\u79cd\u4e0e\u6316\u6398\u6280\u80fd\u76f8\u5173\u4e14\u6709\u65f6\u95f4\u9650\u5236\u7684\u80fd\u529b\n&e\u5b83\u4f7f\u4f60\u627e\u5230\u5b9d\u85cf\u7684\u51e0\u7387\u589e\u52a0\u4e09\u500d\n&e\u5e76\u4e14\u80fd\u77ac\u95f4\u6253\u7834\u517c\u5bb9\u7684\u65b9\u5757. +Guides.Excavation.Section.4=&3\u8003\u53e4\u5b66\u662f\u600e\u6837\u5de5\u4f5c\u7684?\n&e\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&e\u56e0\u6b64\u5f88\u96be\u8bf4\u5b83\u5bf9\u4f60\u7684\u5e2e\u52a9\u6709\u591a\u5927\n&e\u8bf7\u8bb0\u4f4f\uff0c\u6316\u6398\u673a\u80fd\u7b49\u7ea7\u8d8a\u9ad8\u6316\u5230\u7684\u5b9d\u85cf\u5c31\u8d8a\u591a.\n&e\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&e\u6362\u53e5\u8bdd\u8bf4,\u4f60\u5728\u6ce5\u571f\u4e2d\u627e\u5230\u7684\u5b9d\u85cf.\n&e\u5728\u7802\u783e\u4e2d\u4e0d\u4e00\u5b9a\u80fd\u627e\u5230. +Guides.Excavation.Section.5=&3\u5173\u4e8e\u6316\u6398\u6ce8\u610f\u4e8b\u9879:\n&e\u6316\u6398\u6389\u843d\u7269\u662f\u5b8c\u5168\u53ef\u5b9a\u5236\u7684\n&e\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. +Guides.Fishing.Section.0=&3\u5173\u4e8e\u9493\u9c7c:\n&e\u5173\u4e8e\u9493\u9c7c\u6280\u80fd, \u9493\u9c7c\u518d\u6b21\u4f7f\u4eba\u632f\u594b!\n&e\u627e\u5230\u9690\u85cf\u7684\u5b9d\u85cf\u4ece\u602a\u7269\u8eab\u4e0a\u6296\u843d\u7269\u54c1.\n\n&3\u7ecf\u9a8c\u6765\u6e90:\n&e\u9493\u9c7c. +Guides.Fishing.Section.1=&3\u6dd8\u91d1\u8005\u5982\u4f55\u5de5\u4f5c?\n&e\u8fd9\u4e2a\u80fd\u529b\u4f7f\u4f60\u5728\u9493\u9c7c\u65f6\u627e\u5230\u5b9d\u85cf \n&e\u5e76\u4e14\u7269\u54c1\u6709\u5c0f\u51e0\u7387\u5e26\u6709\u9644\u9b54.\n&e\u9493\u9c7c\u6280\u80fd\u7684\u6bcf\u4e00\u4e2a\u7ea7\u522b\u7684\u5b9d\u85cf\u90fd\u6709\u6982\u7387\u6389\u843d\n&e.\u5b9d\u85cf\u7684\u6982\u7387\u53d6\u51b3\u4e8e\u7a00\u6709\u5ea6\u7684\u6389\u843d\u51e0\u7387\n&e\u4f60\u7684\u9493\u9c7c\u7b49\u7ea7\u8d8a\u9ad8,\u4f60\u8d8a\u6709\u53ef\u80fd\u627e\u5230\u66f4\u597d\u7684\u5b9d\u85cf.\n&e\u83b7\u5f97\u5b9d\u85cf\u7684\u51e0\u7387\u4e5f\u8d8a\u9ad8. +Guides.Fishing.Section.2=&3\u51b0\u9493\u5982\u4f55\u5de5\u4f5c?\n&e\u8fd9\u4e2a\u88ab\u52a8\u6280\u80fd\u53ef\u4ee5\u8ba9\u4f60\u5728\u51b0\u6e56\u4e2d\u9493\u9c7c!\n&e\u5c06\u4f60\u7684\u9c7c\u7aff\u6254\u5728\u51b0\u6e56\u91cc\u8fd9\u4e2a\u80fd\u529b\u4f1a\u5728\u51b0\u4e0a\n&e\u5f62\u6210\u4e00\u4e2a\u5c0f\u5b54\u4f9b\u4f60\u9493\u9c7c. +Guides.Fishing.Section.3=&3\u9493\u9c7c\u5927\u5e08\u5982\u4f55\u5de5\u4f5c?\n&e\u8fd9\u4e2a\u88ab\u52a8\u589e\u52a0\u4e86\u9493\u9c7c\u65f6\u54ac\u94a9\u7684\u51e0\u7387.\n&e\u5f53\u4f60\u89e3\u9501\u8fd9\u79cd\u80fd\u529b\u65f6\n&e\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=&3\u6296\u52a8\u5982\u4f55\u5de5\u4f5c?\n&e\u8fd9\u79cd\u4e3b\u52a8\u6280\u80fd\u53ef\u4ee5\u8ba9\u4f60\u7528\u9c7c\u7aff\u52fe\u4f4f\u751f\u7269\n&e\u5e76\u4ece\u4ed6\u4eec\u8eab\u4e0a\u83b7\u53d6\u7269\u54c1. \n&e\u751f\u7269\u4f1a\u6389\u843d\u4ed6\u4eec\u6b7b\u4ea1\u65f6\u6389\u843d\u7684\u7269\u54c1.\n&e\u4e5f\u53ef\u80fd\u83b7\u5f97\u602a\u7269\u7684\u5934 \n&e\u4e00\u822c\u60c5\u51b5\u4e0b\u8fd9\u4e9b\u5934\u65e0\u6cd5\u5728\u751f\u5b58\u6a21\u5f0f\u4e2d\u83b7\u5f97. +Guides.Fishing.Section.5=&3\u6e14\u592b\u7684\u98df\u8c31\u5982\u4f55\u5de5\u4f5c?\n&e\u8fd9\u4e2a\u88ab\u52a8\u589e\u52a0\u4e86\u5403\u9c7c\u65f6\u6062\u590d\u7684\u9971\u98df\u5ea6. +Guides.Fishing.Section.6=&3\u5173\u4e8e\u9493\u9c7c\u7684\u8bf4\u660e:\n&e\u9493\u9c7c\u7684\u6389\u843d\u7269\u662f\u53ef\u4ee5\u81ea\u5b9a\u4e49\u7684,\n&e\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. +Guides.Herbalism.Section.0=&3\u5173\u4e8e\u8349\u836f\u5b66:\n&e\u8349\u836f\u5b66\u662f\u5173\u4e8e\u91c7\u96c6\u8349\u836f\u4e0e\u690d\u7269\u7684\u6280\u80fd.\n\n&3\u7ecf\u9a8c\u62c9\u8fdc:\n&e\u91c7\u96c6\u8349\u836f\u6216\u690d\u7269. +Guides.Herbalism.Section.1=&3\u53ef\u4f5c\u7528\u7684\u8349\u836f/\u690d\u7269\n&e\u5c0f\u9ea6, \u9a6c\u94c3\u85af, \u80e1\u841d\u535c, \u897f\u74dc, \n&e\u5357\u74dc, \u7518\u8517, \u53ef\u53ef\u8c46, \u82b1, \u4ed9\u4eba\u638c, \u8611\u83c7,\n&e\u5730\u72f1\u75a3, \u83b2\u53f6, \u4e0e\u85e4\u8513. +Guides.Herbalism.Section.2=&3\u5927\u5730\u795d\u798f\u5982\u4f55\u5de5\u4f5c?\n&e\u5927\u5730\u795d\u798f\u662f\u4e00\u4e2a\u4e3b\u52a8\u6280\u80fd, \u5f53\u4f60\u624b\u6301\u9504\u5934\u65f6\n&e\u70b9\u51fb\u53f3\u952e\u53ef\u53d1\u52a8\u6280\u80fd. \u5927\u5730\u795d\u798f\u63d0\u9ad8\u4e09\u500d\u6536\u83b7\u7684\u673a\u7387. \n&e\u540c\u65f6\u4e5f\u8ba9\u73a9\u5bb6\u6709\u80fd\u529b\u4f7f\u7528\u8eab\u4e0a\u7684\u79cd\u5b50\u6765\u8f6c\u5316\n&e\u65b9\u5757\u5e76\u8d4b\u4e88\u751f\u547d. +Guides.Herbalism.Section.3=&3\u7eff\u62c7\u6307(\u4f5c\u7269)\u5982\u4f55\u5de5\u4f5c?\n&e\u8fd9\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd,\u8ba9\u4f5c\u7269\u5728\u91c7\u96c6\u65f6\n&e\u81ea\u52a8\u79cd\u56de\u53bb.\n&e\u6982\u7387\u53d6\u51b3\u4e8e\u4f60\u7684\u8349\u836f\u5b66\u6280\u80fd\u7b49\u7ea7. +Guides.Herbalism.Section.4=&3\u7eff\u624b\u6307(\u5706\u77f3/\u77f3\u7816/\u6ce5\u571f)\u5982\u4f55\u5de5\u4f5c?\n&e\u8fd9\u662f\u4e00\u4e2a\u4e3b\u52a8\u6280\u80fd,\u8ba9\u4f60\u5728\u624b\u62ff\u7740\u79cd\u5b50\u65f6,\n&e\u5bf9\u5706\u77f3\u77f3/\u77f3\u7816/\u6ce5\u571f,\u70b9\u51fb\u53f3\u952e,\u53ef\u4f7f\u5b83\u4eec\u53d8\u6210\n&e\u82d4\u77f3\u8349\u65b9\u5757\u7b49,\u4f1a\u6d88\u8017\u4e00\u9897\u79cd\u5b50. +Guides.Herbalism.Section.5=&3\u519c\u592b\u98df\u8c31\u5982\u4f55\u5de5\u4f5c?\n&e\u8fd9\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd, \u53ef\u589e\u52a0\u4e0b\u5217\u98df\u7269\u7684\u9971\u98df\u5ea6\u6062\u590d -\n&e\u9762\u5305, \u66f2\u5947, \u897f\u74dc, \u8611\u83c7\u6c64, \u80e1\u841d\u535c, \u9a6c\u94c3\u85af. +Guides.Herbalism.Section.6=&3\u6d77\u62c9\u5c14\u7684\u795d\u798f\u5982\u4f55\u5de5\u4f5c?\n&e\u8fd9\u662f\u4e00\u4e2a\u4e3b\u52a8\u6280\u80fd,\u6709\u673a\u7387\u5728\u7528\u5251\u7834\u574f\u7279\u5b9a\n&e\u65b9\u5757\u65f6\u83b7\u5f97\u7a00\u6709\u9053\u5177. +Guides.Herbalism.Section.7=&3\u53cc\u500d\u6389\u843d\u5982\u4f55\u5de5\u4f5c?\n&e\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 +Guides.Mining.Section.0=&3\u5173\u4e8e\u6316\u77ff:\n&e\u6316\u77ff\u5305\u62ec\u6316\u6398\u77f3\u5934\u548c\u77ff\u7269. \n&e\u6316\u77ff\u6280\u80fd\u53ef\u4ee5\u63d0\u4f9b\u591a\u91cd\u77ff\u7269\u6389\u843d\u7684\u5956\u52b1.\n\n&3\u7ecf\u9a8c\u6765\u6e90:\n&e\u83b7\u53d6\u6b64\u6280\u80fd\u7684\u7ecf\u9a8c\u503c, \u4f60\u5fc5\u987b\u62ff\u7740\u77ff\u9550\u8fdb\u884c\u6316\u6398.\n&e\u53ea\u6709\u7279\u5b9a\u65b9\u5757\u624d\u80fd\u83b7\u53d6\u7ecf\u9a8c. +Guides.Mining.Section.1=&3\u517c\u5bb9\u6750\u6599:\n&e\u77f3\u5934,\u7164\u77ff\u77f3,\u94c1\u77ff\u77f3,\u91d1\u77ff\u77f3,\u94bb\u77f3\u77ff\u77f3,\u7ea2\u77f3\u77ff\u77f3,\n&e\u9752\u91d1\u77f3\u77ff\u77f3,\u9ed1\u66dc\u77f3,\u82d4\u77f3,\u672b\u5730\u77f3,\n&e\u8424\u77f3,\u5730\u72f1\u5ca9. +Guides.Mining.Section.2=&3\u5982\u4f55\u4f7f\u7528\u8d85\u7ea7\u788e\u77f3\u673a:\n&e\u628a\u9550\u5b50\u62ff\u5728\u4f60\u7684\u624b\u4e0a,\u6309\u4e0b\u53f3\u952e\u6765\u51c6\u5907\u4f60\u7684\u9550\u5b50.\n&e\u4f60\u5c06\u67094\u79d2\u949f\u7684\u65f6\u95f4\u6765\u6fc0\u53d1\u4f60\u7684\u6280\u80fd.\n&e\u5f53\u4f60\u6572\u4e0b\u5bf9\u5e94\u7684\u77f3\u5934\u4ee5\u540e,\u8d85\u7ea7\u788e\u77f3\u673a\u5c06\u88ab\u6fc0\u6d3b. +Guides.Mining.Section.3=&3\u4ec0\u4e48\u662f\u8d85\u7ea7\u788e\u77f3\u673a?\n&e\u8d85\u7ea7\u788e\u77f3\u673a\u662f\u4e00\u4e2a\u4e3b\u52a8\u6280\u80fd\n&e\u5b83\u80fd\u4f7f\u4f60\u5728\u6316\u6389\u5bf9\u5e94\u77ff\u77f3\u7684\u65f6\u5019\u589e\u52a03\u500d\u6389\u843d\u51e0\u7387\n&e\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&e\u628a\u96f7\u7ba1\u62ff\u5728\u624b\u4e0a,\u9ed8\u8ba4\u7684\u60c5\u51b5\u4e0b\u662f\u6253\u706b\u5668.\n&e\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=&3\u4ec0\u4e48\u662f\u7206\u7834\u5f00\u91c7?\n&e\u7206\u7834\u5f00\u91c7\u662f\u4e00\u4e2a\u9700\u8981\u51b7\u5374\u65f6\u95f4\u7684\u6316\u77ff\u6280\u80fd\n&e\u5b83\u80fd\u4f7f\u4f60\u5728\u4f7f\u7528TNT\u70b8\u77ff\u65f6\u83b7\u5f97\u989d\u5916\u5956\u52b1\n&e\u7206\u7834\u5f00\u91c7\u603b\u5171\u67093\u4e2a\u529f\u80fd\n&e\u5927\u53f7\u70b8\u5f39:\u4f7f\u4f60\u7684TNT\u7206\u70b8\u8303\u56f4\u6269\u5927\n&e\u7206\u7834\u4e13\u5bb6:\u964d\u4f4e\u4f60\u53d7\u5230TNT\u7684\u7206\u70b8\u4f24\u5bb3\n&e\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. +Guides.Repair.Section.0=&3\u5173\u4e8e\u4fee\u7406:\n&e\u4fee\u7406\u53ef\u4ee5\u8ba9\u4f60\u4f7f\u7528\u94c1\u5757\u6765\u4fee\u7406\u76d4\u7532\u548c\u5de5\u5177.\n\n&3\u7ecf\u9a8c\u6765\u6e90:\n&e\u4f7f\u7528mcmmo\u7684\u94c1\u7827\u4fee\u7406\u5de5\u5177\u6216\u88c5\u5907. \n&emcmmo\u9ed8\u8ba4\u7684\u4fee\u7406\u53f0\u662f\u94c1\u5757\n&e\u4e0d\u8981\u4e0e\u7528\u7ecf\u9a8c\u4fee\u590d\u7684\u94c1\u7827\u6df7\u6dc6. +Guides.Repair.Section.1=&3\u5982\u4f55\u4f7f\u7528\u4fee\u7406?\n&e\u653e\u5047\u4e00\u4e2amcmmo\u94c1\u7827(\u94c1\u5757),\u624b\u6301\u9700\u8981\u4fee\u7406\u7684\u9053\u5177 \n&e\uff0c\u53f3\u952e\u70b9\u51fb\u94c1\u5757\uff0c\u6bcf\u6b21\u4f7f\u7528\u6d88\u8017\u4e00\u4e2a\u7269\u54c1 +Guides.Repair.Section.2=&3\u4fee\u7406\u7cbe\u901a\u5982\u4f55\u5de5\u4f5c?\n&e\u4fee\u7406\u7cbe\u901a\u63d0\u5347\u4fee\u7406\u65f6\u8010\u4e45\u6062\u590d\u91cf. \n&e\u989d\u5916\u4fee\u7406\u7684\u8010\u4e45\u503c\u91cf\u53d6\u51b3\u4e8e\u4f60\u7684\u4fee\u7406\u6280\u80fd\u7b49\u7ea7. +Guides.Repair.Section.3=&3\u8d85\u7ea7\u4fee\u7406\u5982\u4f55\u5de5\u4f5c?\n&e\u8d85\u7ea7\u4fee\u7406\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd. \u5f53\u4fee\u7406\u4e00\u4e2a\u7269\u54c1\u65f6,\n&e\u4f1a\u4f7f\u7269\u54c1\u7684\u4fee\u7406\u6548\u679c\u7ffb\u500d. +Guides.Repair.Section.4=&3\u79d8\u6cd5\u953b\u9020\u5982\u4f55\u5de5\u4f5c?\n&e\u8fd9\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd\uff0c\u5141\u8bb8\u4f60\u4fee\u590d\u9644\u9b54\u7269\u54c1\n&e\u4fee\u7406\u7269\u54c1\u65f6\u6709\u4e00\u5b9a\u51e0\u7387\u4fdd\u7559\u9644\u9b54\u5c5e\u6027\n&e\u9644\u9b54\u5c5e\u6027\u53ef\u4ee5\u4fdd\u6301\u73b0\u6709\u7684\u7b49\u7ea7\uff0c\n&e\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. +Guides.Salvage.Section.0=&3\u5173\u4e8e\u5206\u89e3:\n&e\u5206\u89e3\u4f7f\u4f60\u53ef\u4ee5\u4f7f\u7528\u91d1\u5757\u6765\u5206\u89e3\u88c5\u5907\u548c\u5de5\u5177.\n\n&3\u7ecf\u9a8c\u6765\u6e90:\n&e\u5206\u89e3\u65f6\u4fee\u7406\u548c\u9493\u9c7c\u7684\u5b50\u6280\u80fd\uff0c\n&e\u6280\u80fd\u7b49\u7ea7\u53d6\u51b3\u4e8e\u4f60\u7684\u9493\u9c7c\u548c\u4fee\u7406\u7684\u7b49\u7ea7. +Guides.Salvage.Section.1=&3\u5982\u4f55\u4f7f\u7528\u5206\u89e3?\n&e\u653e\u4e00\u4e2amcmmo\u5206\u89e3\u7827(\u91d1\u5757)\u62ff\u7740\u7269\u54c1\u53f3\u952e\u91d1\u5757.\n&e\u8fd9\u5c06\u62c6\u89e3\u7269\u54c1,\u5e76\u8fd4\u8fd8\u7269\u54c1\u7684\u5236\u4f5c\u539f\u6599\n&e\u4f8b\u5982:\u62c6\u89e3\u94c1\u9550\u4f60\u5c06\u83b7\u5f97\u94c1\u952d. +Guides.Salvage.Section.2=&3\u5982\u4f55\u4f7f\u7528\u8fdb\u9636\u5206\u89e3?\n&e\u89e3\u9501\u540e,\u6b64\u529f\u80fd\u4f7f\u4f60\u53ef\u4ee5\u5206\u89e3\u635f\u574f\u7684\u7269\u54c1.\n&e\u968f\u7740\u7b49\u7ea7\u7684\u63d0\u5347\u5206\u89e3\u6240\u5f97\u7684\u7269\u54c1\u4f1a\u83b7\u5f97\u66f4\u591a\u7684\u6750\u6599\n&e\u901a\u8fc7\u8fdb\u9636\u5206\u89e3\u4f60\u59cb\u7ec8\u80fd\u83b7\u5f97\u4e00\u4e2a\u6750\u6599.\n&e\u4e0d\u7528\u62c5\u5fc3\u4e0d\u4f1a\u83b7\u5f97\u6750\u6599\uff0c\u9664\u975e\u4f60\u7684\u8010\u4e45\u503c\u592a\u4f4e. +Guides.Salvage.Section.3=&3\u4e3a\u4e86\u8bf4\u660e\u8fd9\u662f\u5982\u4f55\u5de5\u4f5c\u7684, \u8fd9\u6709\u4e00\u4e2a\u4f8b\u5b50:\n&e\u5047\u8bbe\u6211\u4eec\u5206\u89e3\u4e86\u4e00\u4e2a\u635f\u574f\u4e8620%\u7684\u91d1\u9550,\n&e\u4ea6\u4e3a\u4e4b\u4f60\u6700\u591a\u83b7\u5f97\u4e24\u4e2a\u91d1\u952d\n&e(\u56e0\u4e3a\u91d1\u9550\u4f7f\u7528\u4e09\u4e2a\u91d1\u952d\u5236\u4f5c\u7684\uff0c\n&e33,33% \u7684\u635f\u8017) \u7b49\u4e8e 66% \u7684\u8010\u4e45\u503c. \n&e\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=&3\u5982\u4f55\u4f7f\u7528\u5965\u672f\u5206\u89e3?\n&e\u8fd9\u4e2a\u6280\u80fd\u53ef\u4ee5\u4f7f\u4f60\u5728\u5206\u89e3\u9644\u9b54\u7269\u54c1\u65f6\u83b7\u5f97\u9644\u9b54\u4e66\n&e\u6839\u636e\u4f60\u7684\u5206\u89e3\u7b49\u7ea7\uff0c\u5206\u4e3a\u5168\u90e8\u63d0\u53d6\u548c\u90e8\u5206\u63d0\u53d6\n&e\u5f53\u5206\u89e3\u4f4d\u90e8\u5206\u63d0\u53d6\u65f6.\n\n&e\u9644\u9b54\u4e66\u7684\u9644\u9b54\u4e0e\u7269\u54c1\u76f8\u6bd4\n&e\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. +Guides.Swords.Section.0=&3\u5173\u4e8e\u5251\u672f:\n&e\u8fd9\u4e2a\u6280\u80fd\u5728\u4f7f\u7528\u5251\u8fdb\u884c\u6218\u6597\u65f6\n&e\u63d0\u4f9b\u5404\u79cd\u52a0\u6210.\n\n&3\u7ecf\u9a8c\u6765\u6e90:\n&e\u7ecf\u9a8c\u503c\u662f\u901a\u8fc7\u7528\u5251\u5bf9\u602a\u7269\u6216\u5176\u4ed6\u73a9\u5bb6 \n&e\u9020\u6210\u4f24\u5bb3\u83b7\u5f97. +Guides.Swords.Section.1=&3\u5982\u4f55\u4f7f\u7528\u5229\u5203\u7a81\u523a?\n&e\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&e\u8fd9\u4e2a\u6280\u80fd\u8ba9\u4f60\u53d1\u52a8\u8303\u56f4\u653b\u51fb\uff0c\u63d0\u4f9b25%\u7684\u4f24\u5bb3\u52a0\u6210 \n&e\u5e76\u4f34\u6709\u6495\u88c2\u6548\u679c. +Guides.Swords.Section.2=&3\u53cd\u51fb\u5982\u4f55\u5de5\u4f5c?\n&e\u53cd\u51fb\u662f\u4e00\u4e2a\u4e3b\u52a8\u6280\u80fd\uff0c\u683c\u6321\u5bf9\u624b\u5bf9\u4f60\u7684\u4f24\u5bb3\n&e\u5e76\u6709\u51e0\u7387\u53cd\u5c0450%\u7684\u4f24\u5bb3\u7ed9\u5bf9\u624b. +Guides.Swords.Section.3=&3\u6495\u88c2\u5982\u4f55\u5de5\u4f5c?\n&e\u6495\u88c2\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd\uff0c\u653b\u51fb\u65f6\u6709\u51e0\u7387\u51fa\u53d1\u6495\u88c2. \n&e\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&e\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. +Guides.Taming.Section.0=&3\u9a6f\u517d\n&e\u9a6f\u517d\u6280\u80fd\u8ba9\u73a9\u5bb6\u80fd\u5728\u7528\u72fc\u6218\u6597\u65f6\n&e\u65f6\u6709\u52a0\u6210\u6548\u679c.\n\n&3\u7ecf\u9a8c\u6765\u6e90:\n&e\u8981\u83b7\u53d6\u7ecf\u9a8c,\u987b\u8bad\u670d\u72fc\u6216\u8c79\u732b,\n&e\u6216\u4e0e\u4f60\u7684\u72fc\u4e00\u540c\u6218\u6597. +Guides.Taming.Section.1=&3\u4ec0\u4e48\u662f\u91ce\u6027\u547c\u558a?\n&e\u91ce\u6027\u547c\u558a\u662f\u4e00\u4e2a\u4e3b\u52a8\u6280\u80fd\u8ba9\u4f60\n&e\u53ef\u4ee5\u53ec\u5524\u4e00\u53ea\u72fc\u6216\u8c79\u732b,\n&e\u53ea\u8981\u624b\u6301\u9aa8\u5934\u6216\u751f\u9c7c,\u70b9\u5de6\u952e. +Guides.Taming.Section.2=&3\u4ec0\u4e48\u662f\u91ce\u517d\u4fe1\u606f?\n&e\u91ce\u517d\u4fe1\u606f\u80fd\u8ba9\u4f60\u67e5\u770b\u5ba0\u7269\u7684\u72b6\u6001,\n&e\u5bf9\u5ba0\u7269\u70b9\u51fb\u5de6\u952e\u5c31\u80fd\u4f7f\u7528\u8fd9\u9879\u80fd\u529b. +Guides.Taming.Section.3=&3\u4ec0\u4e48\u662f\u55dc\u8840?\n&e\u8840\u8165\u653b\u51fb\u662f\u4e00\u4e2a\u4e3b\u52a8\u6280\u80fd,\u80fd\u9020\u6210\n&e\u72fc\u7684\u653b\u51fb\u76ee\u6807\u6709\u673a\u7387\u9677\u5165\u6d41\u8840\u72b6\u6001. +Guides.Taming.Section.4=&3\u4ec0\u4e48\u662f\u5229\u722a?\n&e\u5229\u722a\u4f7f\u72fc\u7684\u653b\u51fb\u529b\u968f\u7740\u9a6f\u517d\u7b49\u7ea7\n&e\u589e\u52a0\u800c\u589e\u52a0. +Guides.Taming.Section.5=&3\u4ec0\u4e48\u662f\u73af\u5883\u611f\u77e5?\n&e\u8fd9\u4e2a\u88ab\u52a8\u6280\u80fd\u80fd\u8ba9\u72fc\u5728\u9047\u5230\u5371\u9669\u65f6\n&e\u8fc5\u901f\u56de\u5230\u4f60\u8eab\u8fb9(\u5982\u4ed9\u4eba\u638c\u6216\u5ca9\u6d46),\n&e\u4e5f\u53ef\u4ee5\u51cf\u514d\u6454\u843d\u4f24\u5bb3. +Guides.Taming.Section.6=&3\u4ec0\u4e48\u662f\u6bdb\u76ae\u5f3a\u5316?\n&e\u8fd9\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd\u80fd\u8ba9\u72fc\n&e\u53d7\u5230\u653b\u51fb\u6216\u71c3\u70e7\u65f6\u51cf\u514d\u4f24\u5bb3. +Guides.Taming.Section.7=&3\u4ec0\u4e48\u662f\u51b2\u51fb\u6297\u6027?\n&e\u8fd9\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd,\u8ba9\u72fc\u7fa4\n&e\u51cf\u514d\u7206\u70b8\u4f24\u5bb3. +Guides.Taming.Section.8=&3\u4ec0\u4e48\u662f\u5feb\u9910\u670d\u52a1?\n&e\u8fd9\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd,\u8ba9\u72fc\u7fa4\u5728\u653b\u51fb\u65f6\n&e\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. +Guides.Unarmed.Section.0=&3\u683c\u6597:\n&e\u683c\u6597\u4f7f\u73a9\u5bb6\u5728\u4f7f\u7528\u62f3\u5934\u4f5c\u6218\u65f6\u6709\n&e\u5404\u79cd\u52a0\u6210\u6548\u679c.\n\n&3\u7ecf\u9a8c\u83b7\u53d6:\n&e\u5728\u7528\u624b\u653b\u51fb\u602a\u7269\u6216\u73a9\u5bb6\u65f6\u53ef\u4ee5\u83b7\u53d6\u7ecf\u9a8c. +Guides.Unarmed.Section.1=&3\u4ec0\u4e48\u662f\u72c2\u66b4?\n&e\u72c2\u66b4\u662f\u4e3b\u52a8\u6280\u80fd,\u7a7a\u624b\u65f6\u70b9\u51fb\u53f3\u952e\u53d1\u52a8.\n&e\u72c2\u66b4\u53ef\u4ee5\u52a0\u621050%\u5bf9\u65b9\u5757\u7684\u4f24\u5bb3,\n&e\u4f7f\u4f60\u53ef\u4ee5\u8f7b\u677e\u7834\u574f\u8106\u5f31\u7269\u4f53,\n&e\u5982\u6ce5\u571f\u4e0e\u6c99\u5b50. +Guides.Unarmed.Section.2=&3\u4ec0\u4e48\u662f\u94c1\u81c2\u5f0f?\n&e\u94c1\u81c2\u80fd\u589e\u52a0\u5f92\u624b\u653b\u51fb\u602a\u7269\u6216\n&e\u73a9\u5bb6\u7684\u4f24\u5bb3. +Guides.Unarmed.Section.3=&3\u4ec0\u4e48\u662f\u7bad\u77e2\u504f\u5411?\n&e\u7bad\u77e2\u504f\u5411\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd,\u8ba9\u4f60\u6709\u673a\u7387\n&e\u80fd\u6539\u53d8\u9ab7\u9ac5\u83b7\u73a9\u5bb6\u5c04\u5411\u4f60\u7684\u7bad\u7684\u65b9\u5411.\n&e\u7bad\u4f1a\u843d\u81f3\u5730\u9762. +Guides.Unarmed.Section.4=&3\u4ec0\u4e48\u662f\u94c1\u8155?\n&e\u94c1\u8155\u6709\u51e0\u7387\u9632\u6b62\u5bf9\u624b\u7684\u7f34\u68b0.\n&e\u51fa\u53d1\u7684\u51e0\u7387\u5374\u51b3\u4e8e\u4f60\u683c\u6597\u7684\u7b49\u7ea7. +Guides.Unarmed.Section.5=&3\u4ec0\u4e48\u662f\u7f34\u68b0?\n&e\u8fd9\u4e2a\u88ab\u52a8\u6280\u80fd\u8ba9\u73a9\u5bb6\u89e3\u9664\u5176\u4ed6\u73a9\u5bb6\u7684\u6b66\u88c5,\n&e\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. +Guides.Woodcutting.Section.0=&3\u5173\u4e8e\u4f10\u6728:\n&e\u4f10\u6728\u662f\u5173\u4e8e\u780d\u6811\u7684.\n\n&3\u7ecf\u9a8c\u6765\u6e90:\n&e\u7834\u574f\u6728\u5934\u7c7b\u7684\u65b9\u5757\u5c31\u4f1a\u83b7\u5f97\u4f10\u6728\u7ecf\u9a8c. +Guides.Woodcutting.Section.1=&3\u4f10\u6728\u5de5\u5982\u4f55\u5de5\u4f5c?\n&e\u4f10\u6728\u5de5\u662f\u4e00\u4e2a\u4e3b\u52a8\u6280\u80fd\n&e\u5728\u624b\u6301\u65a7\u5934\u7684\u540c\u65f6\u53f3\u952e\u5e76\u7834\u574f\u6728\u5934\u4ee5\u6fc0\u6d3b\u4f10\u6728\u5de5\n&e\u8fd9\u5c06\u77ac\u95f4\u7834\u574f\u6574\u68f5\u6811. +Guides.Woodcutting.Section.2=&3\u79cb\u98ce\u626b\u843d\u53f6\u5982\u4f55\u5de5\u4f5c?\n&e\u79cb\u98ce\u626b\u843d\u53f6\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd\n&e\u5f53\u65a7\u5934\u51fb\u4e2d\u6811\u53f6\u65b9\u5757\u65f6\u4f1a\u5bfc\u81f4\u77ac\u95f4\u6d88\u5931\n&e\u9ed8\u8ba4\u60c5\u51b5\u4e0b\uff0c100\u7ea7\u89e3\u9501. +Guides.Woodcutting.Section.3=&3\u6811\u6728\u4e30\u6536\u5982\u4f55\u5de5\u4f5c?\n&e\u8fd9\u4e2a\u88ab\u52a8\u6280\u80fd\u4f7f\u4f60\u5728\u780d\u6811\u65f6\n&e\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.Offline= &c\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 &e{0} +Inspect.Stats=&e{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.ChimaeraWing.Lore=&7\u4f20\u9001\u81f3\u4f60\u7684\u5e8a. +Item.ChimaeraWing.NotEnough=\u4f60\u9700\u8981 &e{0}&c \u66f4\u591a &6{1}&c! +Item.NotEnough=\u4f60\u9700\u8981 &e{0}&c \u66f4\u591a &6{1}&c! +Item.Generic.Wait=\u4f60\u9700\u8981\u7b49\u5f85\u4e00\u6bb5\u65f6\u95f4\u624d\u80fd\u518d\u6b21\u4f7f\u7528! &e({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. &e({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}+ +Item.FluxPickaxe.Lore.1=&7\u6709\u51e0\u7387\u77ac\u95f4\u7194\u70bc\u77ff\u7269\u3002 +Item.FluxPickaxe.Lore.2=&7\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! +Teleport.Commencing=&7\u4f20\u9001\u5c06\u5728 &6({0}) &7 \u79d2\u540e\u8fdb\u884c, \u8bf7\u4fdd\u6301\u7ad9\u7acb\u4e0d\u52a8... +Teleport.Cancelled=&4\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.Child=&6(\u5206\u652f\u6280\u80fd) +Skills.Disarmed=&4\u4f60\u88ab\u7f34\u68b0\u4e86! +Skills.Header=-----[] &a{0}&c []----- +Skills.NeedMore=&4\u4f60\u9700\u8981\u66f4\u591a &7{0} +Skills.NeedMore.Extra=&4\u4f60\u9700\u8981\u66f4\u591a &7{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.Stats={0}&a{1}&3 XP(&7{2}&3/&7{3}&3) +Skills.ChildStats={0}&a{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. +Skills.TooTired=\u4f60\u592a\u7d2f\u4e86\u6682\u65f6\u65e0\u6cd5\u4f7f\u7528\u8be5\u6280\u80fd.&e({0}s) +Skills.Cancelled=&6{0} &c\u5df2\u53d6\u6d88! +Skills.ConfirmOrCancel=&a\u518d\u6b21\u53f3\u952e\u4ee5\u786e\u5b9a &6{0}&a. \u5de6\u952e\u53d6\u6d88. +Skills.AbilityGateRequirementFail=&7\u4f60\u9700\u8981 &e{0}&7 \u7ea7\u4ee5\u4e0a\u7684 &3{1}&7 \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 +Stats.Header.Combat=&6-=\u683c\u6597\u6280\u80fd=- +Stats.Header.Gathering=&6-=\u91c7\u96c6\u6280\u80fd=- +Stats.Header.Misc=&6-=\u6742\u9879\u6280\u80fd=- +Stats.Own.Stats=&a[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.Lucky.Bonus=&6 ({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) +Perks.ActivationTime.Bonus=&6 ({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.Mode.Disabled=&6[mcMMO] \u786c\u6838\u6a21\u5f0f {0} \u5173\u95ed. {1} +Hardcore.Mode.Enabled=&6[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.DeathStatLoss.PlayerDeath=&6[mcMMO] &4\u6b7b\u4ea1,\u4f60\u5931\u53bb\u4e86 &9{0}&4. +Hardcore.DeathStatLoss.PercentageChanged=&6[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}. +Hardcore.Vampirism.Killer.Failure=&6[mcMMO] &e{0}&7\u592a\u4e0d\u719f\u7ec3\u6388\u4e88\u4f60\u83b7\u5f97\u4efb\u4f55\u7684\u77e5\u8bc6. +Hardcore.Vampirism.Killer.Success=&6[mcMMO] &3\u4f60\u4ece&e{1}&3\u90a3\u5077\u53d6\u4e86&9{0}&3\u4e2a\u7b49\u7ea7. +Hardcore.Vampirism.Victim.Failure=&6[mcMMO] &e{0}&7\u65e0\u6cd5\u4ece\u4f60\u8fd9\u5077\u53d6\u4efb\u4f55\u7684\u77e5\u8bc6! +Hardcore.Vampirism.Victim.Success=&6[mcMMO] &e{0}&4\u4ece\u4f60\u8fd9\u5077\u53d6\u4e86&9{1}&4\u4e2a\u7b49\u7ea7! +Hardcore.Vampirism.PercentageChanged=&6[mcMMO] \u72b6\u6001\u5438\u6536\u7387\u53d8\u66f4\u4e3a {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 +MOTD.Donate=&3\u6350\u8d60\u4fe1\u606f: +MOTD.Hardcore.Enabled=&6[mcMMO] &3\u786c\u6838\u6a21\u5f0f\u5df2\u542f\u7528: &4{0} +MOTD.Hardcore.DeathStatLoss.Stats=&6[mcMMO] &3\u6280\u80fd\u6b7b\u4ea1\u60e9\u7f5a: &4{0}% +MOTD.Hardcore.Vampirism.Stats=&6[mcMMO] &3Vampirism\u7edf\u8ba1: &4{0}% +MOTD.PerksPrefix=&6[mcMMO \u80fd\u529b] +MOTD.Version=&6[mcMMO] \u6b63\u5728\u8fd0\u884c\u7248\u672c &3{0} +MOTD.Website=&6[mcMMO] &a{0}&e - 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.SubSkill.UnderstandingTheArt.Stat=\u7ecf\u9a8c\u7403\u500d\u6570: &e{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.FuelEfficiency.Stat=\u71c3\u6599\u6548\u7387\u500d\u6570: &e{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 @@ -1081,33 +1081,33 @@ Commands.Description.xprate=\u66f4\u6539 mcMMO \u7ecf\u9a8c\u500d\u7387\u6216\u5 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.Header.PlayerStats=&emcMMO \u7edf\u8ba1 +Scoreboard.Header.PlayerCooldowns=&emcMMO \u51b7\u5374 +Scoreboard.Header.PlayerRank=&emcMMO \u6392\u540d +Scoreboard.Header.PlayerInspect=&emcMMO \u7edf\u8ba1: {0} +Scoreboard.Header.PowerLevel=&c\u6218\u6597\u529b +Scoreboard.Misc.PowerLevel=&6\u6218\u6597\u529b +Scoreboard.Misc.Level=&3\u7b49\u7ea7 +Scoreboard.Misc.CurrentXP=&a\u5f53\u524d\u7ecf\u9a8c +Scoreboard.Misc.RemainingXP=&e\u5347\u7ea7\u6240\u9700\u7ecf\u9a8c +Scoreboard.Misc.Cooldown=&d\u51b7\u5374 +Scoreboard.Misc.Overall=&6\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. +Profile.PendingLoad=&c\u4f60\u7684mcmmo\u73a9\u5bb6\u6570\u636e\u672a\u52a0\u8f7d. +Profile.Loading.Success=&a\u4f60\u7684mcMMO\u6570\u636e\u5df2\u52a0\u8f7d +Profile.Loading.Failure=&cmcMMO \u65e0\u6cd5\u52a0\u8f7d\u4f60\u7684\u6570\u636e. \u8bf7\u8054\u7cfb &b\u670d\u52a1\u5668\u7ba1\u7406\u5458\u53cd\u9988\u4f60\u7684\u95ee\u9898.\n&e\u4f60\u53ef\u4ee5\u7ee7\u7eed\u5728\u670d\u52a1\u5668\u6e38\u73a9, \u4f46\u662f\u4f60 &l\u6ca1\u6709mcMMO\u7b49\u7ea7&e \u5e76\u4e14\u4f60\u83b7\u5f97\u7684\u4efb\u4f55\u7ecf\u9a8c\u90fd &l\u4e0d\u4f1a\u88ab\u4fdd\u5b58&e. +Profile.Loading.AdminFailureNotice=&4[A]&c mcMMO \u65e0\u6cd5\u52a0\u8f7d\u73a9\u5bb6 &e{0}&c \u7684\u6570\u636e. &d\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! +Holiday.AprilFools.Levelup=&6{0} \u73b0\u5728 &a{1}&6 \u7ea7! +Holiday.Anniversary=&9mcMMO {0} \u5468\u5e74\u5feb\u4e50!\n&9\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. +Reminder.Squelched=&7\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) +Locale.Reloaded=&a\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. +LevelCap.PowerLevel=&6(&amcMMO&6) &e\u4f60\u5df2\u7ecf\u5230\u8fbe\u4e86\u6218\u6597\u529b\u7684\u7b49\u7ea7\u5c01\u9876 &c{0}&e \u7ea7. \u4f60\u5c06\u505c\u6b62\u83b7\u53d6\u6280\u80fd\u7ecf\u9a8c. +LevelCap.Skill=&6(&amcMMO&6) &e\u4f60\u5df2\u7ecf\u5230\u8fbe\u4e86 &6{1}&e \u6280\u80fd\u7684\u7b49\u7ea7\u5c01\u9876 &c{0}&e . \u4f60\u7684\u8be5\u6280\u80fd\u5c06\u65e0\u6cd5\u518d\u5347\u7ea7. 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_TW.properties b/src/main/resources/locale/locale_zh_TW.properties index 8eea0a70c..f20ff761f 100644 --- a/src/main/resources/locale/locale_zh_TW.properties +++ b/src/main/resources/locale/locale_zh_TW.properties @@ -1,6 +1,6 @@ -Acrobatics.Ability.Proc=[[GREEN]]**\u5b8c\u7f8e\u8457\u9678** -Acrobatics.Combat.Proc=[[GREEN]]**\u8ff4\u907f** -Acrobatics.DodgeChance=\u8ff4\u907f\u6a5f\u7387: [[YELLOW]]{0} +Acrobatics.Ability.Proc=&a**\u5b8c\u7f8e\u8457\u9678** +Acrobatics.Combat.Proc=&a**\u8ff4\u907f** +Acrobatics.DodgeChance=\u8ff4\u907f\u6a5f\u7387: &e{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 @@ -8,14 +8,14 @@ Acrobatics.SubSkill.GracefulRoll.Description=\u5169\u500d\u7684\u7ffb\u6efe\u654 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.SubSkill.Roll.Chance=\u7ffb\u6efe\u6a5f\u7387: &e{0} +Acrobatics.SubSkill.Roll.GraceChance=\u6f02\u4eae\u7ffb\u6efe\u6a5f\u7387: &e{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.Combat.DazeChance=\u6688\u7729\u6a5f\u7387: &e{0} +Archery.Combat.RetrieveChance=\u56de\u6536\u7bad\u77e2\u7684\u6a5f\u7387: &e{0} +Archery.Combat.SkillshotBonus=\u6280\u8853\u5c04\u64ca\u734e\u52f5\u50b7\u5bb3: &e{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) @@ -31,15 +31,15 @@ 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.Ability.Lower=&7**\u4f60\u653e\u4e0b\u4e86\u4f60\u7684\u65a7\u982d** +Axes.Ability.Ready=&a**\u4f60\u63e1\u7dca\u4e86\u4f60\u7684\u65a7\u982d** +Axes.Combat.CritStruck=&4\u4f60\u6253\u51fa\u4e86\u6703\u5fc3\u4e00\u64ca! +Axes.Combat.CritChance=\u66b4\u64ca\u6a5f\u7387: &e{0}% Axes.Combat.CriticalHit=\u6703\u5fc3\u4e00\u64ca! -Axes.Combat.GI.Proc=[[GREEN]]**\u66b4\u529b\u6253\u64ca** +Axes.Combat.GI.Proc=&a**\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.Combat.SS.Struck=&4\u88ab\u5288\u9871\u65ac\u64ca\u4e2d! +Axes.Combat.SS.Length=\u5288\u9871\u65ac\u6301\u7e8c\u6642\u9593: &e{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 @@ -53,37 +53,37 @@ Axes.SubSkill.GreaterImpact.Description=\u5c0d\u7121\u88dd\u7532\u6575\u4eba\u90 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.Skills.SS.On=&a**\u5288\u9871\u65ac\u5df2\u4f7f\u7528** +Axes.Skills.SS.Refresh=&a\u4f60\u7684 &e\u5288\u9871\u65ac &a\u80fd\u529b\u5df2\u53ef\u4f7f\u7528\uff01 +Axes.Skills.SS.Other.Off=\u5288\u9871\u65ac&a \u5df2\u7d93\u7ed3\u675f\u4e86 &e{0} +Axes.Skills.SS.Other.On=&a{0}&2\u4f7f\u7528\u4e86 &c\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.Ability.Lower=&7**\u4f60\u653e\u4e0b\u4e86\u4f60\u7684\u93df\u5b50** +Excavation.Ability.Ready=&a**\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.Effect.Length=\u66b4\u8d70\u947d\u982d\u6301\u7e8c\u6642\u9593: &e{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.Skills.GigaDrillBreaker.On=&a**\u66b4\u8d70\u947d\u982d\u6280\u80fd\u4f7f\u7528** +Excavation.Skills.GigaDrillBreaker.Refresh=&a\u4f60\u7684 &e\u66b4\u8d70\u947d\u982d &a\u6280\u80fd\u5df2\u7d93\u53ef\u4ee5\u4f7f\u7528\u4e86! +Excavation.Skills.GigaDrillBreaker.Other.Off=\u66b4\u8d70\u947d\u982d&a \u5df2\u7d93\u7ed3\u675f\u4e86 &e{0} +Excavation.Skills.GigaDrillBreaker.Other.On=&a{0}&2 \u4f7f\u7528\u4e86 &c\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.Chance=\u54ac\u788e\u6a5f\u7387: &e{0} +Fishing.Ability.Info=\u9b54\u6cd5\u7375\u4eba: &7 ** \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.Rank=\u5bf6\u7269\u7375\u4eba\u7b49\u7d1a: &e{0}/5 +Fishing.Ability.TH.DropRate=\u6389\u5bf6\u7387: &4\u9677\u9631: &e{0} &7\u5e38\u898b: &e{1} &a\u7f55\u898b: &e{2}\n&9\u7a00\u6709: &e{3} &d\u53f2\u8a69: &e{4} &6\u50b3\u8aaa: &e{5} &b\u5275\u7d00\u9304: &e{6} +Fishing.Ability.TH.MagicRate=\u9b54\u6cd5\u7375\u4eba\u6a5f\u7387: &e{0} +Fishing.Ability.Shake=\u6416\u6643\u6a5f\u7387: &e{0} Fishing.Ability.IceFishing=\u51b0\u91e3: \u5728\u51b0\u4e0a\u91e3\u9b5a -Fishing.Ability.FD=\u6f01\u4eba\u4fbf\u7576: [[YELLOW]]\u7b49\u7d1a {0} +Fishing.Ability.FD=\u6f01\u4eba\u4fbf\u7576: &e\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 @@ -96,25 +96,25 @@ 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.Chance.Raining=&9 \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.Ability.TH.MagicFound=&7\u4f60\u611f\u53d7\u5230\u9b54\u529b\u7684\u6ce2\u52d5... +Fishing.Ability.TH.Boom=&7\u6536\u7a6b\u6642\u9593!!! +Fishing.Ability.TH.Poison=&7\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.DoubleDropChance=\u96d9\u500d\u6389\u843d\u6a5f\u7387: &e{0} +Herbalism.Ability.FD=\u8fb2\u592b\u79c1\u623f\u83dc: &e\u7b49\u7d1a {0} +Herbalism.Ability.GTe.Length=\u7da0\u5316\u6301\u7e8c\u6642\u9593: &e{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.Chance=\u7da0\u624b\u6307\u6a5f\u7387: &e{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.GTh.Stage=\u7da0\u624b\u6307\u968e\u6bb5: &e\u4f5c\u7269\u6210\u9577\u81f3\u968e\u6bb5 {0} +Herbalism.Ability.GTh=&a**\u7da0\u624b\u6307** +Herbalism.Ability.HylianLuck=\u6d77\u502b\u7684\u795d\u798f\u6a5f\u7387: &e{0} +Herbalism.Ability.Lower=&7**\u4f60\u653e\u4e0b\u4e86\u4f60\u7684\u92e4\u982d** +Herbalism.Ability.Ready=&a**\u4f60\u8209\u9ad8\u4e86\u4f60\u7684\u92e4\u982d** +Herbalism.Ability.ShroomThumb.Chance=\u8611\u83c7\u624b\u89f8\u767c\u6a5f\u7387: &e{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 @@ -130,20 +130,20 @@ 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.HylianLuck=&a\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.Skills.GTe.On=&a**\u767c\u52d5\u7da0\u5316** +Herbalism.Skills.GTe.Refresh=&a\u4f60\u7684 &e\u7da0\u5316 &a\u80fd\u529b\u5df2\u53ef\u4f7f\u7528! +Herbalism.Skills.GTe.Other.Off=\u7da0\u5316&a \u5373\u5c07\u7ed3\u675f &e{0} +Herbalism.Skills.GTe.Other.On=&a{0}&2 \u4f7f\u7528\u4e86 &c\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.Length=\u8d85\u7d1a\u788e\u77f3\u6a5f\u6301\u7e8c\u6642\u9593: &e{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.Ability.Lower=&7**\u4f60\u653e\u4e0b\u4e86\u4f60\u7684\u93ac\u5b50** +Mining.Ability.Ready=&a**\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 @@ -154,22 +154,22 @@ 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.Effect.Decrease=\u7206\u7834\u5c08\u5bb6\u50b7\u5bb3\u6e1b\u5c11: &e{0} +Mining.Effect.DropChance=\u96d9\u500d\u6389\u843d\u6a5f\u7387: &e{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.Skills.SuperBreaker.On=&a**\u8d85\u7d1a\u788e\u77f3\u6a5f\u5df2\u4f7f\u7528** +Mining.Skills.SuperBreaker.Other.Off=\u8d85\u7d1a\u788e\u77f3\u6a5f&a \u5df2\u7d93\u7ed3\u675f\u4e86 &e{0} +Mining.Skills.SuperBreaker.Other.On=&a{0}&2 \u4f7f\u7528\u4e86 &c\u8d85\u7d1a\u788e\u77f3\u6a5f! +Mining.Skills.SuperBreaker.Refresh=&a\u4f60\u7684&e \u8d85\u7d1a\u788e\u77f3\u6a5f &a\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.Boom=&7**\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! +Mining.Blast.Radius.Increase=\u7206\u70b8\u534a\u5f91\u63d0\u5347: &e+{0} +Mining.Blast.Rank=\u6316\u7926\u7206\u767c: &e \u6392\u540d {0}/8 &7({1}) +Mining.Blast.Other.On=&a{0}&2 \u4f7f\u7528\u4e86 &c\u6316\u7926\u7206\u767c! +Mining.Blast.Refresh=&a\u4f60\u7684 &e\u6316\u7926\u7206\u767c &a\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) @@ -188,46 +188,46 @@ 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.Error=&4mcMMO \u5728\u4fee\u6b63\u6642\u767c\u751f\u4e86\u932f\u8aa4! +Repair.Listener.Anvil=&4\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=&4\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.Skills.AdeptSalvage=&4\u56e0\u70ba\u719f\u7df4\u5ea6\u4e0d\u5920\u6240\u4ee5\u4f60\u4e0d\u80fd\u56de\u6536\u5b83\u5011 +Repair.Skills.AdeptDiamond=&4\u4f60\u7684\u6280\u80fd\u7b49\u7d1a\u4e0d\u8db3\u4ee5\u4fee\u7406\u947d\u77f3\u88dd\u5099! +Repair.Skills.AdeptGold=&4\u4f60\u7684\u6280\u80fd\u7b49\u7d1a\u4e0d\u8db3\u4ee5\u4fee\u7406\u9ec4\u91d1\u88dd\u5099! +Repair.Skills.AdeptIron=&4\u4f60\u7684\u6280\u80fd\u7b49\u7d1a\u4e0d\u8db3\u4ee5\u4fee\u7406\u9435\u88fd\u88dd\u5099! +Repair.Skills.AdeptStone=&4\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 &e{0}&c \u624d\u53ef\u4fee\u7406&e{1} +Repair.Skills.FeltEasy=&7\u90a3\u770b\u8d77\u4f86\u5f88\u7c21\u55ae. +Repair.Skills.FullDurability=&7\u4f60\u7684\u88dd\u5099\u8010\u4e45\u5ea6\u5df2\u6eff! +Repair.Skills.SalvageSuccess=&7\u7269\u54c1\u5df2\u56de\u6536! +Repair.Skills.NotFullDurability=&4\u4f60\u7121\u6cd5\u56de\u6536\u5df2\u53d7\u640d\u7684\u7269\u54c1 +Repair.Skills.Mastery=\u4fee\u7406\u7cbe\u901a: &e\u984d\u5916\u56de\u5fa9 {0}% \u8010\u4e45\u5ea6 +Repair.Skills.StackedItems=&4\u4f60\u7121\u6cd5\u4fee\u7406\u758a\u52a0\u7684\u7269\u54c1 +Repair.Skills.Super.Chance=\u8d85\u7d1a\u4fee\u7406\u6a5f\u7387: &e{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.Chance.Downgrade=&7\u9644\u9b54\u964d\u7d1a\u6a5f\u7387: &e{0}% +Repair.Arcane.Chance.Success=&7\u81ea\u52d5\u7784\u6e96\u7684\u6210\u529f\u7387: &e{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 +Repair.Arcane.Perfect=&a\u4f60\u6210\u529f\u5730\u4fdd\u7559\u4e86\u9019\u4ef6\u7269\u54c1\u7684\u9644\u9b54. +Repair.Arcane.Rank=\u79d8\u6cd5\u935b\u9020: &e\u7b49\u7ea7 {0}/4 +Swords.Ability.Lower=&7**\u4f60\u653e\u4e0b\u4e86\u4f60\u7684\u528d** +Swords.Ability.Ready=&a**\u4f60\u63e1\u7dca\u8457\u4f60\u7684\u528d** +Swords.Combat.Bleed.Chance=\u653e\u8840\u6a5f\u7387: &e{0} +Swords.Combat.Bleed.Length=\u653e\u8840\u6301\u7e8c\u6642\u9593: &e{0} \u9031\u671f +Swords.Combat.Bleed.Note=&7\u6ce8\u610f: &e\u6bcf\u5169\u79d2\u6e1b\u4e00\u6ef4\u8840 +Swords.Combat.Bleeding.Started=&4 \u4f60\u6b63\u5728\u6d41\u8840! +Swords.Combat.Bleeding.Stopped=&7\u653e\u8840\u5df2&a\u505c\u6b62&7! +Swords.Combat.Bleeding=&a**\u6575\u4eba\u6b63\u5728\u4e0d\u65b7\u6d41\u8840** +Swords.Combat.Counter.Chance=\u53cd\u64ca\u6a5f\u7387: &e{0} +Swords.Combat.Counter.Hit=&4\u4f60\u53cd\u64ca\u4e86\u5c0d\u624b! +Swords.Combat.Countered=&a**\u53cd\u5c04\u4e86\u6575\u4eba\u7684\u653b\u64ca** +Swords.Combat.SS.Struck=&4\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) @@ -238,13 +238,13 @@ 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.Skills.SS.Off=&4\u5272\u88c2\u65ac\u7d50\u675f\u4e86\uff01 +Swords.Skills.SS.On=&a**\u767c\u52d5\u5272\u88c2\u65ac** +Swords.Skills.SS.Refresh=&a\u4f60\u7684 &e\u5272\u88c2\u65ac &a\u6280\u80fd\u5df2\u53ef\u4f7f\u7528! +Swords.Skills.SS.Other.Off=\u5272\u88c2\u65ac&a \u5373\u5c07\u7d50\u675f &e{0} +Swords.Skills.SS.Other.On=&a{0}&2 \u4f7f\u7528\u4e86 &c\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 +Swords.SS.Length=\u5272\u88c2\u65ac\u6301\u7e8c\u6642\u9593: &e{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 @@ -263,16 +263,16 @@ Taming.Ability.Locked.2=\u9396\u5b9a\u76f4\u5230\u6280\u80fd {0}+ (\u885d\u64ca 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.Combat.Chance.Gore=\u6d41\u8840\u6a5f\u7387: &e{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.CallOfTheWild.Description.2=&7\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=&7\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=&7\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 @@ -285,25 +285,25 @@ 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.Wolf=&8\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.Complete=&a\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.Berserk.Length=\u72c2\u66b4\u6301\u7e8c\u6642\u9593: &e{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.Chance.ArrowDeflect=\u64ca\u843d\u5f13\u7bad\u6a5f\u7387: &e{0} +Unarmed.Ability.Chance.Disarm=\u64ca\u843d\u6b66\u5668\u6a5f\u7387: &e{0} +Unarmed.Ability.Chance.IronGrip=\u9435\u722a\u6a5f\u7387: &e{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.Ability.IronGrip.Defender=&a\u4f60\u7684\u9435\u722a\u4f7f\u4f60\u7684\u6b66\u5668\u514d\u65bc\u88ab\u64ca\u843d! +Unarmed.Ability.Lower=&7**\u4f60\u653e\u9b06\u4e86\u4f60\u7684\u62f3\u982d** +Unarmed.Ability.Ready=&a**\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) @@ -317,15 +317,15 @@ Unarmed.SubSkill.IronGrip.Description=\u9632\u6b62\u4f60\u7684\u6b66\u5668\u88ab 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.Skills.Berserk.On=&a**\u767c\u52d5\u72c2\u66b4** +Unarmed.Skills.Berserk.Other.Off=\u72c2\u66b4&a \u5373\u5c07\u7ed3\u675f &e{0} +Unarmed.Skills.Berserk.Other.On=&a{0}&2 \u4f7f\u7528\u4e86 &c\u72c2\u66b4! +Unarmed.Skills.Berserk.Refresh=&a\u4f60\u7684 &e\u72c2\u66b4 &a\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.Chance.DDrop=\u96d9\u500d\u6389\u843d\u6a5f\u7387: &e{0} +Woodcutting.Ability.Length=\u4f10\u6728\u5de5\u6301\u7e8c\u6642\u9593: &e{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 @@ -336,143 +336,143 @@ Woodcutting.SubSkill.HarvestLumber.Description=\u96d9\u500d\u6389\u843d\u7269\u5 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.On=&a**\u555f\u52d5\u4f10\u6728\u5de5** +Woodcutting.Skills.TreeFeller.Refresh=&a\u4f60\u7684 &e\u4f10\u6728\u5de5 &a\u5df2\u53ef\u4f7f\u7528\uff01 +Woodcutting.Skills.TreeFeller.Other.Off=\u4f10\u6728\u5de5&a \u5373\u5c07\u7ed3\u675f &e{0} +Woodcutting.Skills.TreeFeller.Other.On=&a{0}&2 \u4f7f\u7528\u4e86 &c\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** +Ability.Generic.Refresh=&a**\u6280\u80fd\u51b7\u537b\u5b8c\u7562!** +Ability.Generic.Template.Lock=&7{0} +Ability.Generic.Template=&6{0}: &3{1} +Combat.ArrowDeflect=&f**\u64ca\u843d\u5f13\u7bad** +Combat.BeastLore=&a**\u99b4\u7378\u4e4b\u80fd** +Combat.BeastLoreHealth=&3\u751f\u547d\u503c (&a{0}&3/{1}) +Combat.BeastLoreOwner=&3\u64c1\u6709\u8005 (&c{0}&3) +Combat.Gore=&a**\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! +Combat.TargetDazed=\u76ee\u6a19\u5df2\u88ab &4 \u64ca\u6688 +Combat.TouchedFuzzy=&4\u982d\u6688\u76ee\u7729... +mcMMO.Description=&3\u95dc\u65bc &emcMMO&3 \u5c08\u6848:,&6mcMMO\u662f\u4e00\u500b&c\u958b\u653e\u539f\u59cb\u78bc\u7684&6 RPG \u6a21\u7d44\u59cb\u65bc2011\u5e74\u4e8c\u6708,&6\u5efa\u7acb\u8005 &9nossr50&6. \u65e8\u5728\u63d0\u4f9b\u4e00\u500b\u9ad8\u54c1\u8ceaRPG\u9ad4\u9a57.,&3\u5c0f\u6280\u5de7:,&6 - &a\u8f38\u5165 &c/mcmmo help&a \u4ee5\u4e86\u89e3\u6240\u6709\u6307\u4ee4,&6 - &a\u8f38\u5165 &c/\u6280\u80fd\u540d\u7a31 &a\u4ee5\u4e86\u89e3\u6280\u80fd\u7d30\u7bc0,&3\u958b\u767c\u8005:,&6 - &anossr50 &9(\u8d0a\u52a9\u8005),&6 - &aGJ &9(\u5c08\u6848\u9818\u5c0e\u4eba),&6 - &aNuclearW &9(\u958b\u767c\u8005),&6 - &abm01 &9(\u958b\u767c\u8005),&6 - &aTfT_02 &9(\u958b\u767c\u8005),&6 - &aGlitchfinder &9(\u958b\u767c\u8005),&6 - &at00thpick1 &9(\u958b\u767c\u8005),&3\u5be6\u7528\u9023\u7d50:,&6 - &ahttps://github.com/mcMMO-Dev/mcMMO/issues&6 \u932f\u8aa4\u56de\u5831,&6 - &a#mcmmo @ irc.esper.net&6 IRC \u983b\u9053, +Commands.addlevels.AwardAll.1=&a\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.1=&a{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.addxp.AwardAll=&a\u5728\u5168\u90e8\u7684\u6280\u80fd\u88e1\u4f60\u9084\u5dee {0} \u7d93\u9a57\u503c! +Commands.addxp.AwardSkill=&a\u4f60\u5728 {1} \u4e2d\u88ab\u734e\u52f5\u4e86 {0} \u7d93\u9a57\u503c! +Commands.Ability.Off=\u6280\u80fd\u4f7f\u7528 &c\u95dc\u9589 +Commands.Ability.On=\u6280\u80fd\u4f7f\u7528 &a\u555f\u52d5 +Commands.Ability.Toggle=\u6280\u80fd\u4f7f\u7528\u5df2\u88ab\u5207\u63db\u70ba &e{0} +Commands.AdminChat.Off=\u7ba1\u7406\u54e1\u804a\u5929\u6a21\u5f0f &c\u95dc\u9589 +Commands.AdminChat.On=\u7ba1\u7406\u54e1\u804a\u5929\u6a21\u5f0f &a\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.Cooldowns.Header=&6--= &amcMMO \u80fd\u529b\u51b7\u537b\u6642\u9593&6 =-- +Commands.Cooldowns.Row.N=\\ &c{0}&f - &6\u5c1a\u9918 {1} \u79d2 +Commands.Cooldowns.Row.Y=\\ &b{0}&f - &2 \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.GodMode.Toggle=\u795e\u4e4b\u6a21\u5f0f\u5df2\u88ab\u5207\u63db\u70ba &e{0} +Commands.Healthbars.Changed.HEARTS=[mcMMO] \u4f60\u7684\u8840\u689d\u986f\u793a\u6a21\u5f0f\u5df2\u66f4\u6539\u70ba &c\u611b\u5fc3&f. +Commands.Healthbars.Changed.BAR=[mcMMO] \u4f60\u7684\u8840\u689d\u986f\u793a\u6a21\u5f0f\u5df2\u66f4\u6539\u70ba &e\u65b9\u584a&f. +Commands.Healthbars.Changed.DISABLED=[mcMMO] \u4f60\u7684\u602a\u7269\u8840\u689d\u5df2 &7\u505c\u7528&f. 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.Inspect= &c-\u67e5\u770b\u73a9\u5bb6\u8a73\u7d30\u8a0a\u606f +Commands.Party.Invite.Accepted=&a\u63a5\u53d7\u9080\u8acb\uff0c\u4f60\u52a0\u5165\u4e86\u968a\u4f0d {0} +Commands.Invite.Success=&a\u9080\u8acb\u8a0a\u606f\u767c\u9001\u6210\u529f +Commands.Leaderboards= &c- \u6392\u884c\u699c +Commands.mcc.Header=---[]&emcMMO \u6307\u4ee4&c[]--- 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.mcpurge.Success=&a\u6578\u64da\u5df2\u91cd\u7f6e! +Commands.mcrank.Heading=&6-=\u500b\u4eba\u6392\u884c=- +Commands.mcrank.Overall=\u6574\u9ad4&a - &6\u6392\u884c &f#&a{0} +Commands.mcrank.Player=\u76ee\u6a19: &f{0} +Commands.mcrank.Skill={0}&a - &6\u6392\u540d &f#&a{1} +Commands.mcrank.Unranked=&f\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.mcremove.Success=&a{0} \u5df2\u6210\u529f\u5f9e\u6578\u64da\u88e1\u79fb\u9664! +Commands.mctop.Tip=&6\u5c0f\u6487\u6b65: \u6253 &c/mcrank&6 \u53ef\u4ee5\u89c0\u770b\u4f60\u7684\u6392\u540d! +Commands.mmoedit=[player] &c - \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.1=&a\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.Database.Start=&7\u958b\u59cb\u5f9e{0}\u8f49\u63db\u81f3{1}... +Commands.mcconvert.Database.Finish=&7\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 &a{0} +Commands.mcconvert.Experience.Invalid=\u4e0d\u660e\u7684\u516c\u5f0f\u7a2e\u985e! \u6b63\u78ba\u7684\u7a2e\u985e\u70ba: &aLINEAR &c\u548c &aEXPONENTIAL. 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.mcconvert.Experience.Start=&7\u958b\u59cb\u5f9e{0}\u8f49\u63db\u5230{1}\u66f2\u7dda +Commands.mcconvert.Experience.Finish=&7\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.Notifications.Off=\u5207\u63db\u80fd\u529b\u901a\u77e5\u70ba &c\u95dc\u9589 +Commands.Notifications.On=\u5207\u63db\u80fd\u529b\u901a\u77e5\u70ba &a\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.Other=&a--\u5176\u4ed6\u6307\u4ee4-- +Commands.Party.Header=-----[]&a\u968a\u4f0d&c[]----- +Commands.Party.Status=&8\u540d\u5b57: &f{0} {1} +Commands.Party.ShareMode=&8\u5206\u4eab\u6a21\u5f0f: +Commands.Party.ItemShare=&7\u7269\u54c1 &3({0}) +Commands.Party.ExpShare=&7\u7d93\u9a57\u503c &3({0}) +Commands.Party.ItemShareCategories=&8\u5171\u4eab\u7269\u54c1: &7[[ITALIC]]{0} +Commands.Party.MembersNear=&8\u63a5\u8fd1\u4f60 &3{0}&8/&3{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.Chat.Off=\u968a\u4f0d\u804a\u5929\u6a21\u5f0f&c\u53d6\u6d88 +Commands.Party.Chat.On=\u968a\u4f0d\u804a\u5929\u6a21\u5f0f &a\u958b\u555f +Commands.Party.Commands=&a--\u7d44\u968a\u6307\u4ee4-- +Commands.Party.Invite.0=\u6ce8\u610f: &a\u4f60\u6536\u5230\u4e86\u4f86\u81ea {1} \u7684\u968a\u4f0d\u9080\u8acb {0} +Commands.Party.Invite.1=\u8f38\u5165 &a/party accept&e \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.Join=&7\u52a0\u5165\u7684\u968a\u4f0d: {0} +Commands.Party.Create=&7\u5275\u5efa\u7684\u968a\u4f0d\u540d\u7a31: {0} +Commands.Party.Rename=&7\u968a\u4f0d\u540d\u7a31\u5df2\u66f4\u6539\u70ba: &f{0} +Commands.Party.SetSharing=&7\u968a\u4f0d {0} \u5206\u4eab\u8a2d\u5b9a\u70ba: &3{1} +Commands.Party.ToggleShareCategory=&7\u968a\u4f0d\u5171\u4eab\u7684\u7269\u54c1&6{0} &7 \u5df2\u7d93 &3{1} +Commands.Party.AlreadyExists=&4\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.Teleport= &c- \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.Enabled=\u968a\u4f0d\u50b3\u9001 &a\u5141\u8a31 +Commands.ptp.Disabled=\u968a\u4f0d\u50b3\u9001 &c\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.Request1={0} &a\u5df2\u50b3\u9001\u81f3\u4f60\u65c1\u908a. +Commands.ptp.Request2=&a\u4f60\u50b3\u9001\u7684\u8a71\u8acb\u8f38\u5165&e/ptp accept. &a\u5728&c{0} &a\u79d2\u5167\u5fc5\u9808\u5b8c\u6210 +Commands.ptp.AcceptAny.Enabled=\u968a\u4f0d\u50b3\u9001\u8acb\u6c42\u78ba\u8a8d &a\u555f\u7528 +Commands.ptp.AcceptAny.Disabled=\u968a\u4f0d\u50b3\u9001\u8acb\u6c42\u78ba\u8a8d&c\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.PowerLevel.Leaderboard=--mcMMO&9 \u6230\u9b25\u529b &e\u6392\u884c\u699c-- +Commands.PowerLevel.Capped=&4\u6230\u9b25\u529b: &a{0} &4\u6700\u9ad8\u7b49\u7d1a: &e{1} +Commands.PowerLevel=&4\u6230\u9b25\u529b: &a{0} +Commands.Reset.All=&a\u4f60\u5168\u90e8\u7684\u6280\u80fd\u7b49\u7d1a\u4ee5\u91cd\u7f6e\u6210\u529f. +Commands.Reset.Single=&a\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.Clear=&3\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.Scoreboard.Keep=&3mcMMO \u5f97\u5206\u699c\u6703\u6301\u7e8c\u986f\u793a\u76f4\u5230\u4f60\u8f38\u5165 &a/mcscoreboard clear&3. +Commands.Scoreboard.Timer=&3mcMMO \u5f97\u5206\u699c\u5c07\u5728 &6{0}&3 \u79d2\u540e\u6e05\u9664. +Commands.Scoreboard.Help.0=&6 == &c/mcscoreboard &a\u8aaa\u660e &6== +Commands.Scoreboard.Help.1=&3/mcscoreboard&b clear &f - \u6e05\u9664 McMMO \u5f97\u5206\u699c +Commands.Scoreboard.Help.2=&3/mcscoreboard&b keep &f - \u6301\u7e8c\u986f\u793a mcMMO \u5f97\u5206\u699c +Commands.Scoreboard.Help.3=&3/mcscoreboard&b \u6642\u9593 [n] &f - \u5728 &dn&f \u79d2\u4e4b\u5f8c\u6e05\u9664 McMMO \u5f97\u5206\u699c +Commands.Scoreboard.Tip.Keep=&6\u5c0f\u6280\u5de7: \u7576\u5f97\u5206\u699c\u51fa\u73fe\u6642\u8f38\u5165 &c/mcscoreboard keep&6 \u4f86\u907f\u514d\u5b83\u6d88\u5931. +Commands.Scoreboard.Tip.Clear=&6\u5c0f\u6280\u5de7: \u8f38\u5165 &c/mcscoreboard clear&6 \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.Skill.Leaderboard=--mcMMO &9{0}&e \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 @@ -492,54 +492,54 @@ 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 +mcMMO.NoPermission=&4\u6b0a\u9650\u4e0d\u8db3 +mcMMO.NoSkillNote=&8\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.Help.0=\u6b63\u78ba\u7528\u6cd5\u70ba&3{0} [password]. +Party.Help.1=\u8981\u5275\u5efa\u4e00\u500b\u968a\u4f0d\uff0c\u8acb\u4f7f\u7528&3 {0} [password]. +Party.Help.2=\u66f4\u591a\u8cc7\u8a0a\u8acb\u8aee\u8a62&3{0} +Party.Help.3=\u4f7f\u7528 &3{0} [password] &c\u4f86\u52a0\u5165\u6216\u4f7f\u7528 &3{1} &c\u4f86\u96e2\u958b +Party.Help.4=\u6b32\u9396\u5b9a\u6216\u89e3\u9396\u4f60\u7684\u968a\u4f0d\uff0c\u4f7f\u7528&3 {0} +Party.Help.5=\u6b32\u4f7f\u7528\u5bc6\u78bc\u4fdd\u8b77\u4f60\u7684\u968a\u4f0d\uff0c\u8acb\u4f7f\u7528&3 {0} +Party.Help.6=\u8981\u5f9e\u968a\u4f0d\u4e2d\u8e22\u6389\u6210\u54e1\uff0c\u4f7f\u7528&3 {0} +Party.Help.7=\u8981\u8f49\u79fb\u4f60\u7684\u968a\u4f0d\u6240\u6709\u6b0a\uff0c\u4f7f\u7528&3 {0} +Party.Help.8=\u8981\u89e3\u6563\u968a\u4f0d\uff0c\u4f7f\u7528&3 {0} +Party.Help.9=\u4f7f\u7528 &3{0} &c\u4f86\u548c\u968a\u54e1\u5206\u4eab\u7269\u54c1 +Party.Help.10=\u4f7f\u7528 &3{0} &c\u4f86\u555f\u7528\u548c\u968a\u54e1\u5206\u4eab\u7d93\u9a57 +Party.InformedOnJoin={0} &a\u52a0\u5165\u4e86\u4f60\u7684\u968a\u4f0d +Party.InformedOnQuit={0} &a\u96e2\u958b\u4e86\u4f60\u7684\u968a\u4f0d +Party.InformedOnNameChange=&6{0} &a\u5c07\u968a\u4f0d\u540d\u7a31\u8a2d\u5b9a\u70ba &f{1} +Party.InvalidName=&4\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.NotInYourParty=&4{0} \u4f60\u4e0d\u5728\u4f60\u7684\u5718\u968a +Party.NotOwner=&4\u4f60\u4e26\u975e\u968a\u9577. +Party.Owner.New=&a{0} \u6210\u70ba\u65b0\u968a\u9577. +Party.Owner.NotLeader=&4\u56e0\u9592\u7f6e\u904e\u4e45,\u968a\u9577\u81ea\u52d5\u8f49\u8b93. +Party.Owner.Player=&a\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.Password.Set=&a\u968a\u4f0d\u5bc6\u78bc\u8a2d\u5b9a\u70ba {0} +Party.Password.Removed=&a\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.NotOnline=&4{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.PlayerNotInParty=&4{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.Player=&a\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.Target=&a{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.Unlocked=&7\u968a\u4f0d\u5df2\u89e3\u9396! +Party.Disband=&7\u968a\u4f0d\u5df2\u89e3\u6563 +Party.Status.Locked=&4(\u53ea\u53ef\u9080\u8acb) +Party.Status.Unlocked=&2(\u958b\u555f) Party.ShareType.Xp=\u7d93\u9a57\u503c Party.ShareType.Item=\u7269\u54c1 Party.ShareMode.None=\u7121 @@ -565,158 +565,158 @@ 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.XPGain=&8\u7372\u5f97\u7d93\u9a57\u503c:&f{0} +Commands.xplock.locked=&6\u4f60\u7684\u7d93\u9a57\u503c\u9396\u5b9a\u5728 {0}! +Commands.xplock.unlocked=&6\u4f60\u7684\u7d93\u9a57\u503c\u73fe\u5728 &a\u89e3\u9664\u9396\u5b9a\u4e86&6! 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}! +Commands.xprate.started.0=&6 mcMMO \u7d93\u9a57\u52a0\u500d\u6642\u6bb5\u958b\u59cb! +Commands.xprate.started.1=&6mcMMO \u7d93\u9a57\u503c\u73fe\u5728\u52a0\u500d {0}x! +XPRate.Event=&6mcMMO\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]]=- +Effects.Child=&8\u7b49\u7d1a: &a{0} +Effects.Level=&8\u7b49\u7d1a: &a{0} &3\u7d93\u9a57\u503c&e(&6{1}&e/&6{2}&e) +Effects.Parent=&6{0} - +Effects.Template=&3{0}: &a{1} +Guides.Available=&7 \u95dc\u65bc{0}\u7684\u8aaa\u660e - \u8f38\u5165 /{1} ? [\u9801\u6578] +Guides.Header=&6-=&a{0} \u6307\u5357&6=- 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.Acrobatics.Section.0=[DARK_AQUA]]\u95dc\u65bc\u96dc\u6280:\n&e\u96dc\u6280\u53ef\u4ee5\u8b93\u4f60\u5728MMO\u88e1\u73a9\u5f97\u5f88\u512a\u96c5.\n&e\u5b83\u53ef\u4ee5\u8b93\u4f60\u5728\u6230\u9b25\u4e2d\u53ca\u74b0\u5883\u4e2d\u53d6\u5f97\u512a\u52e2.\n\n&3\u7d93\u9a57\u5982\u4f55\u7372\u53d6:\n&e\u5728\u6230\u9b25\u4e2d\u9583\u8eb2\u653b\u64ca\u6216\u5f9e\u9ad8\u8655\u589c\u843d\u5c07\n&e\u53ef\u7372\u5f97\u7d93\u9a57. +Guides.Acrobatics.Section.1=&3\u4ec0\u9ebc\u662f\u7ffb\u6efe?\n&e\u4f60\u6709\u4e00\u5b9a\u7684\u6a5f\u7387\u53ef\u4ee5\u6e1b\u514d\u5f9e\u9ad8\u8655\u589c\u843d\n&e\u7684\u50b7\u5bb3. \u4f60\u53ef\u4ee5\u6309\u4f4f\u6f5b\u884c\u9375(\u9810\u8a2dshift)\n&e\u4f86\u5f97\u5230\u96d9\u500d\u7684\u7ffb\u6efe\u6a5f\u7387.\n&e\u9019\u5c07\u89f8\u767c\u5b8c\u7f8e\u8457\u9678\u800c\u4e0d\u53ea\u662f\u55ae\u7d14\u7684\u7ffb\u6efe.\n&e\u5b8c\u7f8e\u8457\u9678\u6548\u679c\u8207\u7ffb\u6efe\u985e\u4f3c,\u4f46\u6709\u5169\u500d\n&e\u7684\u89f8\u767c\u6a5f\u7387\u4e14\u53ef\u6e1b\u514d\u66f4\u591a\u50b7\u5bb3.\n&e\u7ffb\u6efe\u6a5f\u7387\u95dc\u4fc2\u5230\u4f60\u7684\u96dc\u6280\u7b49\u7d1a. +Guides.Acrobatics.Section.2=&3\u4ec0\u9ebc\u662f\u8ff4\u907f?\n[YELLOW]]\u8ff4\u907f\u662f\u6709\u6a5f\u7387\u6e1b \u514d\u5728\u6230\u9b25\u4e2d\n&e\u6575\u4eba\u5c0d\u4f60\u7684\u50b7\u5bb3.\n&e\u9019\u6a5f\u7387\u95dc\u4fc2\u5230\u4f60\u7684\u96dc\u6280\u7b49\u7d1a. +Guides.Archery.Section.0=&3\u7bad\u8853:\n&e\u7bad\u8853\u662f\u7528\u5f13\u5c04\u7bad\u7684\u6280\u80fd.\n&e\u7bad\u8853\u6709\u5404\u7a2e\u52a0\u4e58\u6548\u679c,\u5982\u52a0\u4e58\u653b\u64ca\n&e\u6688\u7729\u5c0d\u624b\u7b49\u6548\u679c.\n&e\u6b64\u5916\u4f60\u4e5f\u6709\u6a5f\u7387\u56de\u6536\u5df2\u7d93\u5c04\u4e2d\u6575\u4eba\u7684\u7bad\n&e \u4ee5\u4e0a\u6a5f\u7387\u95dc\u4fc2\u5230\u7b49\u7d1a.\n\n&3\u7372\u53d6\u7d93\u9a57:\n&e\u8981\u7372\u5f97\u7d93\u9a57\u5fc5\u9808\u7528\u5f13\u5c04\u4e2d\u602a\u7269\u6216\u73a9\u5bb6. +Guides.Archery.Section.1=&3\u4ec0\u9ebc\u662f\u6280\u8853\u5c04\u64ca?\n&e\u6280\u8853\u5c04\u64ca\u5c07\u52a0\u4e58\u4f60\u7684\u5c04\u7bad\u57fa\u672c\u653b\u64ca\u529b.\n&e\u52a0\u4e58\u7684\u7a0b\u5ea6\u95dc\u4fc2\u5230\u4f60\u7684\u7bad\u8853\u7b49\u7d1a.\n&e\u9810\u8a2d\u72c0\u614b\u4e0b, \u6bcf\u534750\u7d1a\u52a0\u4e5810%\u653b\u64ca\u529b, \n&e\u6700\u9ad8\u5230200%\u52a0\u4e58. +Guides.Archery.Section.2=&3\u4ec0\u9ebc\u662f\u6688\u7729\u6548\u679c?\n&e\u7576\u4f60\u64ca\u4e2d\u76ee\u6a19\u6642\u6709\u88ab\u52d5\u6a5f\u7387\u4f7f\u76ee\u6a19\u6688\u7729.\n&e\u6688\u7dda\u89f8\u767c\u6642\u5c07\u5f37\u5236\u4f60\u7684\u76ee\u6a19\u5446\u6eef\u4e00\u5c0f\u6bb5\u6642\u9593.\n&e\u6688\u7729\u6548\u679c\u6709\u52a0\u4e584\u9ede\u50b7\u5bb3(2\u5fc3). +Guides.Archery.Section.3=&3\u4ec0\u9ebc\u662f\u56de\u6536\u5f13\u7bad?\n&e\u4f60\u6709\u6a5f\u7387\u5728\u6bba\u6b7b\u602a\u7269\u5f8c\u56de\u6536\u5c04\u51fa\u53bb\u7684\u7bad.\n&e\u6a5f\u7387\u95dc\u4fc2\u5230\u4f60\u7684\u7bad\u8853\u7b49\u7d1a.\n&e\u9810\u8a2d\u72c0\u614b\u4e0b,\u6bcf\u5347\u4e00\u7b49\u589e\u52a00.1%\u6a5f\u7387,\n&e\u7b49\u7d1a\u5230\u90541000\u6642\u5c07\u6709100%\u56de\u6536\u7387. +Guides.Axes.Section.0=&3\u95dc\u65bc\u65a7\u6280:\n&e\u6709\u4e86\u65a7\u6280, \u4f60\u5c31\u53ef\u4ee5\u4e0d\u5fc5\u53ea\u662f\u4e82\u63ee\u4e82\u780d\n&e\u4f60\u53ef\u4ee5\u66f4\u6709\u6548\u5730\u64ca\u6bba\u53ef\u60e1\u7684\u602a\u7269\u5011!\n&e\u800c\u4e14\u53ef\u4ee5\u5728\u63ee\u64ca\u6642\u70b8\u98db\u6216\u767c\u51fa\u81f4\u547d\u7684\u66b4\u64ca\n&e\u4ee5\u91cd\u5275 \u5c0d\u624b.\n&e\u4f60\u7684\u65a7\u982d\u4e5f\u53ef\u4ee5\u6210\u70ba\u4e00\u53f0\u524a\u6728\u6a5f,\n&e\u91cd\u5275\u5c0d\u624b\u7684\u88dd\u7532,\u96a8\u8457\u64cd\u65a7\u6280\u80fd\u5347\u9ad8\u800c\n&e\u63d0\u5347\u6548\u679c.\n&3\u5982\u4f55\u7372\u53d6\u7d93\u9a57:\n&e\u8981\u7372\u53d6\u7d93\u9a57\u4f60\u5fc5\u9808\u7528\u65a7\u982d\u653b\u64ca\u73a9\u5bb6\u6216\u602a\u7269 +Guides.Axes.Section.1=&3\u4ec0\u9ebc\u662f\u5288\u9871\u65ac?\n&e\u9019\u662f\u4e00\u500b\u4e3b\u52d5\u6280\u80fd(\u7bc4\u570d\u6280).\n&e\u9031\u906d\u88ab\u6ce2\u53ca\u7684\u50b7\u5bb3\u70ba\u4e3b\u8981\u76ee\u6a19\u7684\u4e00\u534a\n&e\u662f\u7528\u4f86\u6e05\u9664\u4e00\u5768\u602a\u7269\u7684\u5fc5\u5099\u7d55\u62db. +Guides.Axes.Section.2=&3\u4ec0\u9ebc\u662f\u6703\u5fc3\u4e00\u64ca?\n&e\u6703\u5fc3\u4e00\u64ca\u662f\u4e00\u500b\u53ef\u4ee5\u9020\u6210\u52a0\u4e58\u50b7\u5bb3\u7684\u88ab\u52d5\u6280\u80fd.\n&e\u9810\u8a2d\u65a7\u6280\u6bcf\u5347\u5169\u7b49,\u53ef\u589e\u52a00.1%\u66b4\u64ca\u7387\n&e\u5c0d\u602a\u7269\u67092\u500d\u653b\u64ca\u529b\u5c0d\u73a9\u5bb6\u67091.5\u500d. +Guides.Axes.Section.3=&3\u4ec0\u9ebc\u662f\u65a7\u982d\u7cbe\u901a?\n&e\u65a7\u982d\u7cbe\u901a\u53ef\u4ee5\u52a0\u4e58\u65a7\u982d\u7684\u57fa\u672c\u653b\u64ca \u529b\n&e\u9810\u8a2d\u4e2d\u6bcf50\u7b49\u589e\u52a01\u9ede\u50b7\u5bb3(\u534a\u5fc3)\n&e200\u7b49\u9054\u5230\u6975\u96504\u9ede\u50b7\u5bb3. +Guides.Axes.Section.4=&3\u4ec0\u9ebc\u662f\u9632\u5177\u7834\u58de\u8005?\n&e\u66b4\u529b\u7684\u6253\u64ca\u4f7f\u9632\u5177\u7c89\u788e!\n&e\u9632\u5177\u7834\u58de\u8005\u6709\u88ab\u52d5\u6a5f\u7387\u9020\u6210\u5c0d\u624b\u9632\u5177\u88ab\u7834\u58de!\n&e\u7834\u58de\u7a0b\u5ea6\u95dc\u4fc2\u5230\u4f60\u7684\u65a7\u982d\u6280\u80fd\u7b49\u7d1a. +Guides.Axes.Section.5=&3\u4ec0\u9ebc\u662f\u5f37\u529b\u653b\u64ca?\n&e\u5728\u653b\u64ca\u73a9\u5bb6\u6216\u602a\u7269\u6642\u6709\u88ab\u52d5\u6a5f\u7387\u70b8\u98db\u5c0d\u624b\n&e\u9810\u8a2d\u6a5f\u7387\u70ba25%. \u70b8\u98db\u6548\u679c\u76f8\u7576\u65bc\u64ca\u9000II\u7684\u9644\u9b54\n&e\u5916\u52a0\u5c0d\u76ee\u6a19\u7684\u52a0\u4e58\u653b\u64ca. +Guides.Excavation.Section.0=&3\u95dc\u65bc\u6316\u6398:\n&e\u6316\u6398\u662f\u4e00\u500b\u95dc\u65bc\u6316\u571f\u8207\u6316\u5bf6\u7684\u6280\u80fd.\n&e\u6316\u6398\u5730\u9762\u53ef\u4ee5\u627e\u5230\u5bf6\u7269.\n&e\u6316\u6108\u591a\u5bf6\u7269\u6108\u591a.\n\n&3\u7372\u53d6\u7d93\u9a57:\n&e\u8981\u7372\u53d6\u7d93\u9a57\u5fc5\u9808\u6301 \u6709\u93df\u5b50.\n&e\u53ea\u6709\u7279\u5b9a\u7269\u8cea\u624d\u80fd\u6316\u5230\u5bf6\u7269\u6216\u7d93\u9a57. +Guides.Excavation.Section.1=&3\u76f8\u5bb9\u7684\u7269\u8cea:\n&e\u8349\u76ae, \u571f, \u6c99, \u9ecf\u571f, \u792b\u77f3, \u83cc\u7d72\u9ad4, \u9748\u9b42\u6c99 +Guides.Excavation.Section.2=&3\u5982\u4f55\u7528\u66b4\u8d70\u947d\u982d:\n&e\u624b\u6301\u93df\u5b50\u4e26\u9ede\u53f3\u9375.\n&e\u9032\u5165\u6b64\u72c0\u614b\u7d04\u80fd\u7dad\u63014\u79d2\n&e\u4e00\u65e6\u63a5\u89f8\u5230\u76f8\u5bb9\u7684\u7269\u8cea\u4fbf\u80fd\n&e\u89f8\u767c\u66b4\u8d70\u947d\u982d. +Guides.Excavation.Section.3=&3\u4ec0\u9ebc\u662f\u66b4\u8d70\u947d\u982d?\n&e\u66b4\u8d70\u947d\u982d\u662f\u4e3b\u52d5\u6280\u80fd,\u6301\u7e8c\u6642\u9593\u95dc\u4fc2\u5230\n&e\u6316\u6398\u6280\u80fd\u7b49\u7d1a,\u5b83\u53ef \u4ee5\u8b93\u4f60\u6709\u6a5f\u7387\u7372\u5f97\u5bf6\u7269\n&e\u9084\u6709\u76f4\u63a5\u6467\u6bc0\u6307\u5b9a\u65b9\u584a. +Guides.Excavation.Section.4=&3\u4ec0\u9ebc\u662f\u5bf6\u7269\u7375\u4eba?\n&e\u6240\u6709\u5bf6\u7269\u90fd\u6709\u81ea\u5df1\u7684\u6700\u4f4e\u6389\u843d\u7b49\u7d1a\n&e\u6240\u4ee5\u5bf6\u7269\u5c0d\u4f60\u4e0d\u898b\u5f97\u6709\u7528.\n&e\u53ea\u9700\u8981 \u8a18\u5f97\u6108\u6316\u6398\u7b49\u7d1a\u6108\u9ad8,\n&e\u5c31\u80fd\u6316\u9053\u6108\u591a\u5bf6.\n&e\u9084\u6709\u6bcf\u4e00\u7a2e\u4e0d\u540c\u7684\u6750\u8cea,\n&e\u53ef\u80fd\u6389\u51fa\u4f86\u7684\u5bf6\u7269\u90fd\u4e0d\u540c.\n&e\u63db\u53e5\u8a71\u8aaa\u4f60\u80fd\u5f9e\u571f\u88e1\u6316\u51fa\u6bd4\u792b\u77f3\n&e\u66f4\u591a\u7a2e\u985e\u7684\u5bf6\u7269. +Guides.Excavation.Section.5=&3\u6316\u6398\u7684\u6ce8\u610f\u4e8b\u9805:\n&e\u6316\u6398\u7684\u6389\u843d\u7269\u662f\u53ef\u96a8\u610f\u8abf\u6574\u7684,\n&e\u4e0d\u540c\u4f3a\u670d\u5668\u5c07\u6709\u6240\u5dee\u7570. +Guides.Fishing.Section.0=&3\u95dc\u65bc\u91e3\u9b5a:\n&e\u6709\u4e86\u91e3\u9b5a\u6280\u80fd,\u91e3\u9b5a\u66f4\u6709\u8da3\u4e86!\n&e\u53ef\u4ee5\u6389\u5bf6\u7269,\u5f9e\u602a\u7269\u8eab\u4e0a\u76dc\u5bf6.\n\n&3\u7372\u53d6\u7d93\u9a57:\n&e\u6293\u5230\u9b5a. +Guides.Fishing.Section.1=&3\u4ec0\u9ebc\u662f\u5bf6\u7269\u7375\u4eba?\n&e\u9019\u500b\u6280\u80fd\u8b93\u4f60\u5728\u91e3\u9b5a\u6642\u91e3\u5230\u5bf6\u7269\n&e\u6709\u5c0f\u6a5f\u7387\u91e3\u5230\u9644\u9b54\u9053\u5177.\n&e\u6bcf\u7a2e\u5bf6\u7269\u7684\u51fa\u73fe\u95dc\u4fc2\u5230\n&e\u4f60\u7684\u91e3\u9b5a\u7b49\u7d1a. \u91e3\u9b5a\u7b49\u7d1a\u6108\u9ad8,\n&e\u5c31\u80fd\u91e3\u5230\u6108\u591a\u6108\u597d\u7684\u5bf6\u7269. +Guides.Fishing.Section.2=&3\u4ec0\u9ebc\u662f\u51b0\u91e3?\n&e\u9019\u500b\u88ab\u52d5\u6280\u80fd\u8b93\u4f60\u5728\u51b0\u6e56\u4e0a\u6355\u9b5a!\n&e\u5728\u51b0\u6e56\u4e0a\u7529\u52d5\u4f60\u7684\u91e3\u7aff\n&e\u5c07\u6703\u5728\u51b0\u4e0a\u88fd\u9020\u51fa\u53ef\u4f9b\u91e3\u9b5a\u7684\u5c0f\u6d1e. +Guides.Fishing.Section.3=&3\u4ec0\u9ebc\u662f\u5782\u91e3\u5927\u5e2b?\n&e\u9019\u500b\u88ab\u52d5\u6280\u80fd\u5c07\u589e\u52a0\u4e0a\u9264\u7684\u6a5f\u7387.\n&e\u7576\u4f60\u7372\u5f97\u9019\u500b\u80fd\u529b, \u5728\u8239\u4e0a\u6216\u6d77\u6d0b\u751f\u614b\n&e\u91e3\u9b5a\u5c07\u6703\u7372\u5f97\u96d9\u500d\u4e0a\u9264\u6a5f\u7387. +Guides.Fishing.Section.4=&3\u4ec0\u9ebc\u662f\u6416\u6643?\n&e\u9019\u500b\u6280\u80fd\u8b93\u4f60\u53ef\u4ee5\u5f9e\u602a\u7269\u8eab\u4e0a\u626f\u4e0b\u5bf6\u7269.\n&e\u53ea\u8981\u4f7f\u7528\u91e3\u7aff\u91e3\u602a\u7269,\n&e\u80fd\u91e3\u51fa\u602a\u7269\u6b7b\u4ea1\u6642\u6703\u6389\u7684\u5bf6\u7269.\n&e\u9019\u6280\u80fd\u751a\u81f3\u80fd\u91e3\u51fa\u8eab\u5b58\u6a21\u5f0f\u7121\u6cd5\u7372\u5f97\u7684\n&e\u602a\u7269\u982d\u9871. +Guides.Fishing.Section.5=&3\u4ec0\u9ebc\u662f\u6f01\u4eba\u4fbf\u7576?\n&e\u9019\u662f\u4e00\u500b\u88ab\u52d5\u6280\u80fd\u8b93\u4f60\u80fd\u5728\u5403\u9b5a\u6642\u6709\n&e\u66f4\u591a\u7684\u98fd\u98df\u5ea6. +Guides.Fishing.Section.6=&3\u91e3\u9b5a\u7684\u6ce8\u610f\u4e8b\u9805:\n&e\u6389\u843d\u8a2d\u5b9a\u662f\u53ef\u8abf\u6574\u7684,\n&e\u5404\u4f3a\u670d\u5668\u53ef\u80fd\u6709\u6240\u4e0d\u540c. +Guides.Herbalism.Section.0=&3\u95dc\u65bc\u8349\u85e5\u5b78:\n&e\u8349\u85e5\u5b78\u662f\u95dc\u65bc\u63a1\u6536\u8349\u85e5\u8207\u690d\u7269\u7684\u6280\u80fd.\n\n&3\u7372\u53d6\u7d93\u9a57:\n&e\u63a1\u6536\u8349\u85e5\u6216\u690d\u7269. +Guides.Herbalism.Section.1=&3\u53ef\u4f5c\u7528\u7684\u8349\u85e5/\u690d\u7269\n&e\u5c0f\u9ea5, \u99ac\u9234\u85af, \u80e1\u863f\u8514, \u897f\u74dc, \n&e\u5357\u74dc, \u7518\u8517, \u53ef\u53ef\u8c46, \u82b1, \u4ed9\u4eba\u638c, \u9999\u83c7,\n&e\u5730\u7344\u7599\u7629, \u84ee\u8449, \u8207\u85e4. +Guides.Herbalism.Section.2=&3\u4ec0\u9ebc\u662f\u7da0\u5316?\n&e\u7da0\u5316\u662f\u4e00\u500b\u4e3b\u52d5\u6280\u80fd, \u7576\u4f60\u624b\u6301\u92e4\u982d\u6642\n&e\u9ede\u64ca\u53f3\u9375\u53ef\u767c\u52d5\u6280\u80fd. \u7da0\u5316\u63d0\u9ad8\u4e09\u88ab\u6536\u7a6b\u7684\u6a5f\u7387. \n&e\u540c\u6642\u4e5f\u8b93\u73a9\u5bb6\u6709\u80fd\u529b\u4f7f\u7528\u8eab\u4e0a\u7684\u7a2e\u5b50\u4f86\u8f49\u5316\n&e\u65b9\u584a\u4e26\u8ce6\u4e88\u751f\u547d. +Guides.Herbalism.Section.3=&3\u4ec0\u9ebc\u662f\u7da0\u624b\u6307(\u4f5c\u7269)?\n&e\u9019\u662f\u4e00\u500b\u88ab\u52d5\u6280\u80fd,\u8b93\u4f5c\u7269\u5728\u63a1\u6536\u6642\n&e\u81ea\u52d5\u7a2e\u56de\u53bb.\n&e\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&e\u9019\u662f\u4e00\u500b\u4e3b\u52d5\u6280\u80fd,\u8b93\u4f60\u5728\u624b\u62ff\u8457\u7a2e\u5b50\u6642,\n&e\u5c0d\u5375\u77f3/\u77f3\u78da/\u571f,\u9ede\u64ca\u53f3\u9375,\u53ef\u4f7f\u5b83\u5011\u8b8a\u6210\n&e\u690d\u7269\u5f62\u614b,\u6703\u6d88\u8017\u4e00\u9846\u7a2e\u5b50. +Guides.Herbalism.Section.5=&3\u4ec0\u9ebc\u662f\u8fb2\u592b\u79c1\u623f\u83dc?\n&e\u9019\u662f\u4e00\u500b\u88ab\u52d5\u6280\u80fd, \u53ef\u589e\u52a0\u4e0b\u5217\u98df\u7269\u7684\u98fd\u98df\u5ea6\u56de\u5fa9 -\n&e\u9eb5\u5305, \u9905\u4e7e, \u897f\u74dc, \u8611\u83c7\u6e6f, \u80e1\u863f\u8514, \u99ac\u9234\u85af. +Guides.Herbalism.Section.6=&3\u4ec0\u9ebc\u662f\u6d77\u502b\u7684\u795d\u798f?\n&e\u9019\u662f\u4e00\u500b\u4e3b\u52d5\u6280\u80fd,\u6709\u6a5f\u7387\u5728\u7528\u528d\u7834\u58de\u7279\u5b9a\n&e\u65b9\u584a\u6642\u7372\u5f97\u7a00\u6709\u9053\u5177. +Guides.Herbalism.Section.7=&3\u4ec0\u9ebc\u662f\u96d9\u500d\u6389\u843d?\n&e\u9019\u662f\u4e00\u500b\u88ab\u52d5\u6280\u80fd\u4f7f\u73a9\u5bb6\u80fd\u52a0\u500d\u6536\u7372. +Guides.Mining.Section.0=&3\u95dc\u65bc\u6316\u7926:\n&e\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&3\u5982\u4f55\u7372\u53d6\u7d93\u9a57:\n&e\u8981\u589e\u9032\u6316\u7926\u6280\u80fd,\u4f60\u5fc5\u9808\u7528\u93ac\u5b50\u6316\u7926.\n&e\u53ea\u6709\u6316\u6398\u6307\u5b9a\u7926\u7269\u80fd\u589e\u52a0\u7d93\u9a57. +Guides.Mining.Section.1=&3\u76f8\u5bb9\u7684\u7926\u7269:\n&e\u77f3\u982d, \u70ad\u7926\u8108, \u9435\u7926\u8108, \u91d1\u7926\u8108, \u947d\u77f3\u7926\u8108, \u7d05\u77f3\u7926\u8108,\n&e\u9752\u91d1\u77f3\u7926\u8108, \u9ed1\u66dc\u77f3, \u9752\u82d4\u77f3, \u7d42\u754c\u77f3,\n&e\u87a2\u5149\u77f3, \u9084\u6709\u5730\u7344\u77f3. +Guides.Mining.Section.2=&3\u5982\u4f55\u4f7f\u7528\u8d85\u7d1a\u788e\u77f3\u6a5f:\n&e\u624b\u62ff\u8457\u93ac\u5b50\u9ede\u6ed1\u9f20\u53f3\u9375\u4ee5\u6e96\u5099\u597d\u958b\u555f\u6280\u80fd.\n&e\u4e00\u65e6\u958b\u555f\u6280\u80fd\u5c07\u6709\u6578\u79d2\u7684\u6642\u9593\u53ef\u4ee5\u8b93\u4f60\n&e\u5feb\u901f\u7834\u58de\u6307\u5b9a\u7926\u7269,\u53ea\u6709\u76f8\u5bb9\u7684\u7926\u7269\u53ef\u4ee5\n&e\u89f8\u767c\u6280\u80fd. +Guides.Mining.Section.3=&3\u4ec0\u9ebc\u662f\u8d85\u7d1a\u788e\u77f3\u6a5f?\n&e\u8d85\u7d1a\u788e\u77f3\u6a5f\u662f\u4e00\u500b\u9700\u8981\u51b7\u537b\u6642\u9593\u7684\u6316\u7926\u6280\u80fd.\n&e\u5b83\u80fd\u4f7f\u4f60\u5728\u6316\u6389\u5c0d\u61c9\u7926\u77f3\u7684\u6642\u5019\u589e\u52a03\u500d\u6389\u843d\u6a5f\u7387.\n&e\u4e26\u4e14\u5728\u6280\u80fd\u6642\u9593\u5167\u77ac\u9593\u7834\u58de\u77f3\u982d\u548c\u7926\u77f3. +Guides.Mining.Section.4=&3\u5982\u4f55\u4f7f\u7528\u7206\u7834\u6316\u6398:\n&e\u624b\u6301\u6253\u706b\u77f3, \u9810\u8a2d\u7531\u71e7\u77f3\u53ca\u9435\u9320\u7d44\u6210,\n&e\u8e72\u4e0b\u4e26\u7528\u53f3\u9375\u9ede\u53caTNT. \u9019\u6703\u4f7fTNT\n&e\u76f4\u63a5\u7206\u70b8, \u6700\u597d\u7ad9\u9060\u4e00\u9ede. +Guides.Mining.Section.5=&3\u4ec0\u9ebc\u662f\u7206\u7834\u6316\u6398?\n&e\u7206\u7834\u6316\u6398\u662f\u4e00\u500b\u4e3b\u52d5\u6280\u80fd, \u51b7\u537b\u6642\u9593\u95dc\u4fc2\u5230\u4f60\u7684\u6316\u7926\n&e\u6280\u80fd\u7b49\u7d1a. \u5b83\u53ef\u4ee5\u8b93\u4f60\u5728\u4f7f\u7528TNT\u6316\u7926\u77f3\u6709\u66f4\u591a\u798f\u5229\n&e\u4e14\u53ef\u4ee5\u9059\u63a7\u5f15\u7206TNT. \u7206\u7834\u6316\u6398\u5206\u6210\u4e09\u90e8\u5206.\n&e\u7b2c\u4e00\u90e8\u5206\u7a31\u70ba\u5de8\u5927\u7206\u7834, \u53ef \u4ee5\u64f4\u5927\u4f60\u7684\u7206\u7834\u7bc4\u570d.\n&e\u7b2c\u4e8c\u90e8\u5206\u7a31\u70ba\u7206\u7834\u5c08\u5bb6, \u53ef\u4ee5\u6e1b\u514dTNT\u5c0d\u4f60\u7684\u50b7\u5bb3\n&e\u7b2c\u4e09\u90e8\u5206\u7a31\u70ba\u7cbe\u6e96\u7206\u7834, \u589e\u52a0\u6389\u843d\u7269\u6578\u91cf, \u6e1b\u5c11\u5783\u573e\u6389\n&e\u843d\u7269\u6578\u91cf, \u5f88\u68d2\u5427. +Guides.Repair.Section.0=&3\u4fee\u5fa9:\n&e\u4fee\u5fa9\u6280\u80fd\u8b93\u4f60\u53ef\u4ee5\u4f7f\u7528\u9435\u78da(MMO\u9435\u7827)\n&e\u4fee\u5fa9\u5de5\u5177,\u6216\u4f7f\u7528\u91d1\u78da\u56de\u6536\u5de5\u5177.\n\n&3\u7d93\u9a57\u7372\u53d6:\n&e\u7528MMO\u9435\u7827\u4fee\u5fa9\u5de5\u5177.\n&e\u9810\u8a2d\u662f\u9435\u78da,\u4e0d\u8981\u548c\u4e00\u822c\u7684\u9435\u7827\u641e\u6df7. +Guides.Repair.Section.1=&3\u5982\u4f55\u4fee\u5fa9?\n&e\u624b\u6301\u8981\u4fee\u5fa9\u7684\u5de5\u5177\u5c0d\u9435\u78da\u9ede\u64ca\u53f3\u9375\n&e\u6703\u6d88\u80171\u500b\u4e3b\u539f\u6599. +Guides.Repair.Section.2=&3\u4ec0\u9ebc\u662f\u4fee\u7406\u7cbe\u901a?\n&e\u55ae\u6b21\u4fee\u5fa9\u7684\u8010\u4e45\u5ea6\u52a0\u4e58.\n&e\u9019\u95dc\u4fc2\u5230\u4f60\u7684\u4fee\u5fa9\u7b49\u7d1a. +Guides.Repair.Section.3=&3\u4ec0\u9ebc\u662f\u8d85\u7d1a\u4fee\u7406?\n&e\u8d85\u7d1a\u4fee\u7406\u662f\u88ab\u52d5\u6280\u80fd. \u7576\u4fee\u7406\u4e00\u500b\u7269\u54c1\u6642,\n&e\u73a9\u5bb6\u6709\u6a5f\u7387\u4fee\u5fa9\u5169\u500d\u8010\u4e45\u5ea6. +Guides.Repair.Section.4=&3\u4ec0\u9ebc\u662f\u79d8\u6cd5\u935b\u9020?\n&e\u79d8\u6cd5\u935b\u9020\u8b93\u4f60\u6709\u6a5f\u7387\u7559\u4f4f\u5de5\u5177\u7684\u9644\u9b54.\n&e\u9644\u9b54\u53ef\u80fd\u5728\u4fee\u5fa9\u6642\u964d\u7d1a\u6216\u6d88\u5931. +Guides.Repair.Section.5=&3\u4ec0\u9ebc\u662f\u56de\u6536?\n&e\u5c07\u624b\u4e2d\u7684\u7269\u54c1\u5c0dmcMMO\u56de\u6536\u7827(\u9810\u8a2d\u91d1\u78da)\n&e\u9ede\u64ca\u53f3\u9375. \u6703\u5c07\u7269\u54c1\u62c6\u89e3\u56de\u6240\u4f7f\u7528\u7684\u539f\u6599.\n&e\u6ce8\u610f: \u4f60\u53ea\u80fd\u56de\u6536\u7121\u8017\u640d\u7684\u5de5\u5177\u6216\u88dd\u5099 +Guides.Swords.Section.0=&3\u528d\u8853:\n&e\u528d\u8853\u8b93\u73a9\u5bb6\u5728\u4f7f\u7528\u528d\u6230\u9b25\u6642\u7372\u5f97\u5404\u7a2e\u52a0\u4e58\u6548\u679c.\n\n&3\u5982\u4f55\u7372\u53d6\u7d93\u9a57:\n&e\u8981\u7372\u53d6\u7d93\u9a57\u4f60\u5fc5\u9808\u7528\u528d\u653b\u64ca\u73a9\u5bb6\u6216\u602a\u7269. +Guides.Swords.Section.1=&3\u4ec0\u9ebc\u662f\u5272\u88c2\u65ac?\n&e\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&e\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&e\u4e26\u4e14\u9644\u5e36\u81f3\u5c115\u500bticks\u7684\u653e\u8840\u6548\u679c. +Guides.Swords.Section.2=&3\u4ec0\u9ebc\u662f\u53cd\u64ca?\n&e\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&e50%\u6240\u53d7\u5230\u7684\u50b7\u5bb3. +Guides.Swords.Section.3=&3\u4ec0\u9ebc\u662f\u653e\u8840?\n&e\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&e\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. +Guides.Taming.Section.0=&3\u99b4\u7378\n&e\u99b4\u7378\u6280\u80fd\u8b93\u73a9\u5bb6\u80fd\u5728\u7528\u72fc\u6230\u9b25\u6642\n&e\u6642\u6709\u52a0\u4e58\u6548\u679c.\n\n&3\u7d93\u9a57\u7372\u53d6:\n&e\u8981\u7372\u53d6\u7d93\u9a57,\u9808\u8a13\u670d\u72fc\u6216\u8c79\u8c93,\n&e\u6216\u8207\u4f60\u7684\u72fc\u4e00\u540c\u6230\u9b25. +Guides.Taming.Section.1=&3\u4ec0\u9ebc\u662f\u91ce\u6027\u547c\u558a?\n&e\u91ce\u6027\u547c\u558a\u662f\u4e00\u500b\u4e3b\u52d5\u6280\u80fd\u8b93\u4f60\n&e\u53ef\u4ee5\u53ec\u559a\u4e00\u96bb\u72fc\u6216\u8c79\u8c93,\n&e\u53ea\u8981\u624b\u630110\u8ddf\u9aa8\u982d\u6216\u751f\u9b5a,\u9ede\u5de6\u9375. +Guides.Taming.Section.2=&3\u4ec0\u9ebc\u662f\u99b4\u7378\u4e4b\u80fd?\n&e\u99b4\u7378\u4e4b\u80fd\u8b93\u4f60\u5bdf\u89ba\u5bf5\u7269\u7684\u72c0\u614b,\n&e\u5c0d\u5bf5\u7269\u9ede\u64ca\u5de6\u9375\u5c31\u80fd\u4f7f\u7528\u9019\u9805\u80fd\u529b. +Guides.Taming.Section.3=&3\u4ec0\u9ebc\u662f\u8840\u8165\u653b\u64ca?\n&e\u8840\u8165\u653b\u64ca\u662f\u4e00\u500b\u4e3b\u52d5\u6280\u80fd,\u80fd\u9020\u6210\n&e\u72fc\u7684\u653b\u64ca\u76ee\u6a19\u6709\u6a5f\u7387\u9677\u5165\u6d41\u8840\u72c0\u614b. +Guides.Taming.Section.4=&3\u4ec0\u9ebc\u662f\u5229\u722a?\n&e\u5229\u722a\u4f7f\u72fc\u7684\u653b\u64ca\u529b\u96a8\u8457\u99b4\u7378\u7b49\u7d1a\n&e\u589e\u52a0\u800c\u589e\u52a0. +Guides.Taming.Section.5=&3\u4ec0\u9ebc\u662f\u5371\u6a5f\u610f\u8b58?\n&e\u9019\u500b\u88ab\u52d5\u6280\u80fd\u80fd\u8b93\u72fc\u5728\u9047\u5230\u5371\u96aa\u6642\n&e\u8fc5\u901f\u56de\u5230\u4f60\u8eab\u908a(\u5982\u4ed9\u4eba\u638c\u6216\u5ca9\u6f3f),\n&e\u4e5f\u53ef\u4ee5\u6e1b\u514d\u6454\u843d\u50b7\u5bb3. +Guides.Taming.Section.6=&3\u4ec0\u9ebc\u662f\u6bdb\u76ae\u5f37\u5316?\n&e\u9019\u662f\u4e00\u500b\u88ab\u52d5\u6280\u80fd\u80fd\u8b93\u72fc\n&e\u53d7\u5230\u653b\u64ca\u6216\u71c3\u71d2\u6642\u6e1b\u514d\u50b7\u5bb3. +Guides.Taming.Section.7=&3\u4ec0\u9ebc\u662f\u885d\u64ca\u683c\u64cb?\n&e\u9019\u662f\u4e00\u500b\u88ab\u52d5\u6280\u80fd,\u8b93\u72fc\u7fa4\n&e\u6e1b\u514d\u7206\u70b8\u50b7\u5bb3. +Guides.Taming.Section.8=&3\u4ec0\u9ebc\u662f\u5feb\u9910\u670d\u52d9?\n&e\u9019\u662f\u4e00\u500b\u88ab\u52d5\u6280\u80fd,\u8b93\u72fc\u7fa4\u5728\u653b\u64ca\u6642\n&e\u6709\u6a5f\u7387\u56de\u5fa9\u8840\u91cf. +Guides.Unarmed.Section.0=&3\u640f\u64ca:\n&e\u640f\u64ca\u8b93\u73a9\u5bb6\u5728\u4f7f\u7528\u62f3\u982d\u4f5c\u6230\u6642\u6709\n&e\u5404\u7a2e\u52a0\u4e58\u6548\u679c.\n\n&3\u7d93\u9a57\u7372\u53d6:\n&e\u5728\u7528\u624b\u653b\u64ca\u602a\u7269\u6216\u73a9\u5bb6\u6642\u53ef\u4ee5\u7372\u53d6\u7d93\u9a57. +Guides.Unarmed.Section.1=&3\u4ec0\u9ebc\u662f\u72c2\u66b4?\n&e\u72c2\u66b4\u662f\u4e3b\u52d5\u6280\u80fd,\u7a7a\u624b\u6642\u9ede\u64ca\u53f3\u9375\u767c\u52d5.\n&e\u72c2\u66b4\u53ef\u4ee5\u52a0\u4e5850%\u5c0d\u65b9\u584a\u7684\u50b7\u5bb3,\n&e\u4f7f\u4f60\u53ef\u4ee5\u8f15\u9b06\u7834\u58de\u8106\u5f31\u7269\u9ad4,\n&e\u5982\u571f\u8207\u7802. +Guides.Unarmed.Section.2=&3\u4ec0\u9ebc\u662f\u9435\u81c2?\n&e\u9435\u81c2\u80fd\u589e\u52a0\u5f92\u624b\u653b\u64ca\u602a\u7269\u6216\n&e\u73a9\u5bb6\u7684\u5a01\u529b. +Guides.Unarmed.Section.3=&3\u4ec0\u9ebc\u662f\u64ca\u843d\u5f13\u7bad?\n&e\u64ca\u843d\u5f13\u7bad\u662f\u4e00\u500b\u88ab\u52d5\u6280\u80fd,\u8b93\u4f60\u6709\u6a5f\u7387\n&e\u80fd\u64ca\u843d\u9ab7\u9acf\u7372\u73a9\u5bb6\u5c04\u5411\u4f60\u7684\u7bad.\n&e\u7bad\u6703\u88ab\u64ca\u843d\u81f3\u5730\u9762. +Guides.Unarmed.Section.4=&3\u4ec0\u9ebc\u662f\u9435\u722a?\n&e\u9435\u722a\u53ef\u4ee5\u6709\u6a5f\u7387\u4f7f\u64ca\u843d\u6b66\u5668\u7121\u6548\u5316.\n&e\u6a5f\u7387\u95dc\u4fc2\u5230\u640f\u64ca\u6280\u80fd\u7b49\u7d1a. +Guides.Unarmed.Section.5=&3\u4ec0\u9ebc\u662f\u64ca\u843d\u6b66\u5668?\n&e\u9019\u500b\u88ab\u52d5\u6280\u80fd\u8b93\u73a9\u5bb6\u89e3\u9664\u5176\u4ed6\u73a9\u5bb6\u7684\u6b66\u88dd,\n&e\u4f7f\u76ee\u6a19\u6240\u88dd\u5099\u7684\u7269\u54c1\u6389\u843d\u5230\u5730\u4e0a. +Guides.Woodcutting.Section.0=&3\u95dc\u65bc\u4f10\u6728:\n&e \u4f10\u6728\u5c31\u662f\u628a\u6a39\u780d\u5012.\n\n&3\u7372\u53d6\u7d93\u9a57:\n&e\u7834\u58de\u6a39\u5e79\u53ef\u7372\u53d6\u7d93\u9a57. +Guides.Woodcutting.Section.1=&3\u4ec0\u9ebc\u662f\u4f10\u6728\u5de5?\n&e\u4f10\u6728\u5de5\u662f\u4e3b\u52d5\u6280\u80fd,\u6301\u6709\u65a7\u982d\u6642\u9ede\u53f3\u9375\n&e\u53ef\u4ee5\u767c\u52d5.\u5c07\u5c0e\u81f4\u6574\u68f5\u6a39\u6728\u76f4\u63a5\u7834\u58de,\n&e\u6240\u6709\u679d\u8449\u90fd\u5c07\u6389\u843d. +Guides.Woodcutting.Section.2=&3\u4ec0\u9ebc\u662f\u79cb\u98a8\u6383\u843d\u8449?\n&e\u79cb\u98a8\u6383\u843d\u8449\u662f\u4e00\u500b\u88ab\u52d5\u6280\u80fd,\n&e\u7576\u4f60\u7528\u65a7\u982d\u7834\u58de\u6a39\u8449\u6642,\u6a39\u8449\u5c07\u76f4\u63a5\u6467\u6bc0.\n&e\u9019\u500b\u6280\u80fd\u9810\u8a2d\u5728100\u7b49\u958b\u653e. +Guides.Woodcutting.Section.3=&3\u4ec0\u9ebc\u662f\u96d9\u500d\u6389\u843d?\n&e\u9019\u500b\u88ab\u52d5\u6280\u80fd\u53ef\u4ee5\u8b93\u4f60\u6709\u6a5f\u7387\u5728\u4f10\u6728\n&e\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.OfflineStats=\u96e2\u7dda\u73a9\u5bb6\u7684 [mcMMO] \u7d71\u8a08\u8a0a\u606f &e{0} +Inspect.Stats=&a[mcMMO] \u7684\u7d71\u8a08\u8a0a\u606f &e{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} +Item.ChimaeraWing.Lore=&7\u50b3\u9001\u4f60\u5230\u4f60\u7684\u5e8a\u908a. +Item.Generic.Wait=\u4f60\u5fc5\u9808\u7b49\u5f85\u76f4\u5230\u53ef\u4ee5\u518d\u6b21\u4f7f\u7528! &e({0}s) +Item.Injured.Wait=\u4f60\u904e\u5ea6\u75b2\u52de\u5fc5\u9808\u7b49\u5f85\u4e00\u6bb5\u6642\u9593\u5f8c\u624d\u53ef\u4f7f\u7528. &e({0}s) +Teleport.Commencing=&7\u5373\u5c07\u5728 &6({0}) &7\u79d2\u5f8c\u50b3\u9001, \u8acb\u4e0d\u8981\u4e82\u52d5... +Teleport.Cancelled=&4\u53d6\u6d88\u50b3\u9001! +Skills.Child=&6(\u5b50\u6280\u80fd) +Skills.Disarmed=&4\u4f60\u7684\u6b66\u5668\u88ab\u64ca\u843d! +Skills.Header=-----[]&a{0}&c[]----- +Skills.NeedMore=&4\u4f60\u9700\u8981\u66f4\u591a&7{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.Stats={0}&a{1}&3 XP(&7{2}&3/&7{3}&3) +Skills.ChildStats={0}&a{1} +Skills.TooTired=\u6b64\u6280\u80fd\u6b63\u8655\u65bc\u51b7\u537b\u6642\u9593. &e({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 +Skills.ConfirmOrCancel=&a\u518d\u6b21\u6309\u4e0b\u6ed1\u9f20\u53f3\u9375\u4f86\u78ba\u8a8d &6{0}&a. \u6ed1\u9f20\u5de6\u9375\u53d6\u6d88. +Stats.Header.Combat=&6-=\u683c\u9b25\u6280\u80fd=- +Stats.Header.Gathering=&6-=\u63a1\u96c6\u6280\u80fd=- +Stats.Header.Misc=&6-=\u96dc\u985e\u6280\u80fd=- +Stats.Own.Stats=&a[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.Lucky.Bonus=&6 ({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} +Perks.ActivationTime.Bonus=&6 ({0}\u8010\u4e45\u52a0\u4e58) +Hardcore.Mode.Disabled=&6[mcMMO] \u786c\u6d3e\u6a21\u5f0f {0} \u95dc\u9589. {1} +Hardcore.Mode.Enabled=&6[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.DeathStatLoss.PlayerDeath=&6[mcMMO] &4\u56e0\u70ba\u6b7b\u4ea1\u4f60\u5931\u53bb\u4e86&9{0}&4. +Hardcore.DeathStatLoss.PercentageChanged=&6[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}% +Hardcore.Vampirism.Killer.Failure=&6[mcMMO] &e{0}&7\u592a\u4e0d\u7d14\u719f\u4ee5\u81f3\u65bc\u7121\u6cd5\u8b93\u4f60\u7372\u5f97\u4efb\u4f55\u7684\u77e5\u8b58. +Hardcore.Vampirism.Killer.Success=&6[mcMMO] &3\u4f60\u5f9e&e{1}&3\u90a3\u5077\u53d6\u4e86&9{0}&3\u500b\u7b49\u7d1a . +Hardcore.Vampirism.Victim.Failure=&6[mcMMO] &e{0}&7\u7121\u6cd5\u5f9e\u4f60\u9019\u5077\u53d6\u4efb\u4f55\u7684\u77e5\u8b58! +Hardcore.Vampirism.Victim.Success=&6[mcMMO] &e{0}&4\u5f9e\u4f60\u9019\u5077\u53d6\u4e86&9{1}&4\u500b\u7b49\u7d1a! +Hardcore.Vampirism.PercentageChanged=&6[mcMMO] \u72c0\u614b\u5438\u6536\u7387\u8b8a\u66f4\u70ba {0}. +MOTD.Donate=&3\u8d0a\u52a9\u8cc7\u8a0a: +MOTD.Hardcore.Enabled=&6[mcMMO] &3\u786c\u6d3e\u6a21\u5f0f\u5df2\u555f\u7528: &4{0} +MOTD.Hardcore.DeathStatLoss.Stats=&6[mcMMO] &3\u6b7b\u4ea1\u6280\u80fd\u61f2\u7f70: &4{0}% +MOTD.Hardcore.Vampirism.Stats=&6[mcMMO] &3\u5438\u8840\u7372\u5f97\u72c0\u614b: &4{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 +MOTD.Version=&6[mcMMO] \u6b63\u904b\u4f5c\u7684\u7248\u672c &3{0} +MOTD.Website=&6[mcMMO] &a{0}&e - mcMMO \u9996\u9801 +Smelting.Ability.FluxMining=\u6d41\u80fd\u6316\u7926\u6a5f\u7387: &e{0} +Smelting.Ability.FuelEfficiency=\u71c3\u71d2\u6548\u7387\u52a0\u4e58: &e{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.Ability.SecondSmelt=\u518d\u51b6\u7149\u6a5f\u7387: &e{0} +Smelting.Ability.VanillaXPBoost=\u4e00\u822c\u7d93\u9a57\u52a0\u4e58: &e{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 @@ -725,7 +725,7 @@ 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.FluxMining.Success=&a\u7926\u7269\u81ea\u52d5\u51b6\u7149! Smelting.Listener=\u51b6\u7149: Smelting.SkillName=\u51b6\u7149 Commands.Description.addlevels=\u7d66\u4e88\u73a9\u5bb6McMMO\u7b49\u7d1a @@ -769,12 +769,12 @@ 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.Cooldown=&d\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. +Recovery.Notice=\u6ce8\u610f: mcMMO&4\u7121\u6cd5\u8f09\u5165\u4f60\u7684\u8cc7\u6599.&c \u91cd\u8a665\u6b21... +Recovery.Success=&a\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&b\u904a\u6232\u7ba1\u7406\u54e1\n&e\u4f60\u53ef\u4ee5\u7e7c\u7e8c\u904a\u6232,\u4f46\u4f60&l\u7121\u6cd5\u5f97\u5230mcMMO\u7b49\u7d1a&e\u548c\u4efb\u4f55\u7d93\u9a57&l\u6240\u6709\u8cc7\u6599\u4e0d\u6703\u88ab\u5132\u5b58&e. +Recovery.AdminFailureNotice=&4[A]&cmcMMO\u7121\u6cd5\u8f09\u5165\u73a9\u5bb6&e{0}&c\u7684\u8cc7\u6599. &d\u8acb\u6aa2\u67e5\u4f60\u7684\u8cc7\u6599\u5eab\u6216\u8a2d\u5b9a. 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. From 749c83ac59ab8a5c47a322759fd0ddf7e090b461 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 26 Oct 2020 16:31:02 -0700 Subject: [PATCH 180/662] Complete rewrite of Admin & Party chat code There are some API breaks as a result of these rewrites, I tried to keep it minimal, but I'm sure some plugins will need to update. --- Changelog.txt | 19 ++ pom.xml | 54 +++-- .../java/com/gmail/nossr50/api/ChatAPI.java | 141 +++++------ .../gmail/nossr50/chat/AdminChatManager.java | 21 -- .../com/gmail/nossr50/chat/ChatManager.java | 228 +++++++++++++----- .../nossr50/chat/ChatManagerFactory.java | 30 --- .../gmail/nossr50/chat/PartyChatManager.java | 29 --- .../nossr50/chat/SamePartyPredicate.java | 36 +++ .../nossr50/chat/author/AdminAuthor.java | 52 ++++ .../com/gmail/nossr50/chat/author/Author.java | 32 +++ .../nossr50/chat/author/ConsoleAuthor.java | 41 ++++ .../nossr50/chat/author/PartyAuthor.java | 52 ++++ .../chat/mailer/AbstractChatMailer.java | 13 + .../nossr50/chat/mailer/AdminChatMailer.java | 72 ++++++ .../gmail/nossr50/chat/mailer/ChatMailer.java | 12 + .../nossr50/chat/mailer/PartyChatMailer.java | 47 ++++ .../chat/message/AbstractChatMessage.java | 59 +++++ .../chat/message/AdminChatMessage.java | 18 ++ .../nossr50/chat/message/ChatMessage.java | 73 ++++++ .../chat/message/PartyChatMessage.java | 63 +++++ .../nossr50/commands/CommandManager.java | 103 ++++++++ .../commands/chat/AdminChatCommand.java | 48 +++- .../nossr50/commands/chat/ChatCommand.java | 141 ----------- .../commands/chat/PartyChatCommand.java | 113 +++++---- .../nossr50/commands/party/PartyCommand.java | 4 - .../nossr50/commands/skills/AprilCommand.java | 24 +- .../chat/{ChatMode.java => ChatChannel.java} | 9 +- .../gmail/nossr50/datatypes/party/Party.java | 12 + .../nossr50/datatypes/player/McMMOPlayer.java | 118 ++++----- .../skills/subskills/acrobatics/Roll.java | 19 +- .../events/chat/McMMOAdminChatEvent.java | 10 +- .../nossr50/events/chat/McMMOChatEvent.java | 139 ++++++++--- .../events/chat/McMMOPartyChatEvent.java | 36 ++- .../nossr50/listeners/PlayerListener.java | 31 +-- src/main/java/com/gmail/nossr50/mcMMO.java | 16 ++ .../com/gmail/nossr50/party/PartyManager.java | 4 +- .../gmail/nossr50/util/McMMOMessageType.java | 3 +- .../nossr50/util/TextComponentFactory.java | 147 +++++------ .../nossr50/util/TransientMetadataTools.java | 1 - .../commands/CommandRegistrationManager.java | 46 ++-- .../AbstractPersistentDataLayer.java | 4 +- .../SpigotPersistentDataLayer_1_14.java | 1 - .../util/player/NotificationManager.java | 7 +- .../resources/locale/locale_en_US.properties | 4 +- 44 files changed, 1419 insertions(+), 713 deletions(-) delete mode 100644 src/main/java/com/gmail/nossr50/chat/AdminChatManager.java delete mode 100644 src/main/java/com/gmail/nossr50/chat/ChatManagerFactory.java delete mode 100644 src/main/java/com/gmail/nossr50/chat/PartyChatManager.java create mode 100644 src/main/java/com/gmail/nossr50/chat/SamePartyPredicate.java create mode 100644 src/main/java/com/gmail/nossr50/chat/author/AdminAuthor.java create mode 100644 src/main/java/com/gmail/nossr50/chat/author/Author.java create mode 100644 src/main/java/com/gmail/nossr50/chat/author/ConsoleAuthor.java create mode 100644 src/main/java/com/gmail/nossr50/chat/author/PartyAuthor.java create mode 100644 src/main/java/com/gmail/nossr50/chat/mailer/AbstractChatMailer.java create mode 100644 src/main/java/com/gmail/nossr50/chat/mailer/AdminChatMailer.java create mode 100644 src/main/java/com/gmail/nossr50/chat/mailer/ChatMailer.java create mode 100644 src/main/java/com/gmail/nossr50/chat/mailer/PartyChatMailer.java create mode 100644 src/main/java/com/gmail/nossr50/chat/message/AbstractChatMessage.java create mode 100644 src/main/java/com/gmail/nossr50/chat/message/AdminChatMessage.java create mode 100644 src/main/java/com/gmail/nossr50/chat/message/ChatMessage.java create mode 100644 src/main/java/com/gmail/nossr50/chat/message/PartyChatMessage.java create mode 100644 src/main/java/com/gmail/nossr50/commands/CommandManager.java delete mode 100644 src/main/java/com/gmail/nossr50/commands/chat/ChatCommand.java rename src/main/java/com/gmail/nossr50/datatypes/chat/{ChatMode.java => ChatChannel.java} (70%) diff --git a/Changelog.txt b/Changelog.txt index 3a205efb5..7d887480f 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,5 +1,24 @@ Version 2.1.150 + mcMMO Party & Admin Chat have had a rewrite, work was put in to make sure their API would be mostly compatible with the old one + mcMMO should now be compatible with 1.16.4's new social features + The style and look of admin/party chat is now determined by locale file instead of options in config.yml + Improved messages players recieve when they toggle on or off admin or party chat + All locale files have had [[]] color codes replaced by & color codes, you can still use [[GOLD]] and stuff if you want + Added new locale string 'Chat.Identity.Console' + Added new locale string 'Chat.Style.Admin' + Added new locale string 'Chat.Style.Party' + Added new locale string 'Chat.Channel.On' + Added new locale string '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 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' diff --git a/pom.xml b/pom.xml index 350950c82..4698a4479 100755 --- a/pom.xml +++ b/pom.xml @@ -63,8 +63,11 @@ org.apache.maven.plugins maven-compiler-plugin - 2.3.2 + 3.8.1 + + -parameters + 1.8 1.8 @@ -91,7 +94,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.1.1 + 3.2.3 @@ -112,28 +115,38 @@ net.kyori:adventure-text-serializer-legacy net.kyori:adventure-text-serializer-bungeecord net.kyori:adventure-text-serializer-craftbukkit + co.aikar:acf-bukkit + + + 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 net.kyori.adventure - com.gmail.nossr50.kyori.adventure + com.gmail.nossr50.mcmmo.kyori.adventure org.bstats - com.gmail.nossr50.metrics.bstat + com.gmail.nossr50.mcmmo.metrics.bstat @@ -168,29 +181,38 @@ sk89q-repo https://maven.sk89q.com/repo/ - - - sonatype-oss - https://oss.sonatype.org/content/repositories/snapshots/ - - + + aikar + https://repo.aikar.co/content/groups/aikar/ + + + + sonatype-oss + https://oss.sonatype.org/content/repositories/snapshots/ + + + + co.aikar + acf-bukkit + 0.5.0-SNAPSHOT + net.kyori adventure-text-serializer-gson - 4.0.0-SNAPSHOT + 4.1.1 net.kyori adventure-api - 4.0.0-SNAPSHOT + 4.1.1 net.kyori adventure-nbt - 4.0.0-SNAPSHOT + 4.1.1 net.kyori 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/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..51b61d273 100644 --- a/src/main/java/com/gmail/nossr50/chat/ChatManager.java +++ b/src/main/java/com/gmail/nossr50/chat/ChatManager.java @@ -1,88 +1,184 @@ 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.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.Permissions; +import com.gmail.nossr50.util.StringUtils; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; -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 @Nullable ConsoleAuthor consoleAuthor; + + public ChatManager(@NotNull mcMMO pluginRef) { + adminChatMailer = new AdminChatMailer(pluginRef); + partyChatMailer = new PartyChatMailer(pluginRef); } - 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.getAdminAuthor(), rawMessage, isAsync); + break; + case PARTY: + partyChatMailer.processChatMessage(mmoPlayer.getPartyAuthor(), rawMessage, mmoPlayer.getParty(), isAsync); + 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); + } + + /** + * 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); + } + + /** + * Handles console messaging to a specific party + * @param args raw command args from the console + * @param party target party + */ + public void processConsoleMessage(@NotNull String[] args, @NotNull Party party) { + String chatMessageWithoutCommand = buildChatMessage(args); + + processConsoleMessage(chatMessageWithoutCommand, party); + } + + /** + * Gets a console author + * Constructs one if it doesn't already exist + * @return a {@link ConsoleAuthor} + */ + private @NotNull Author getConsoleAuthor() { + if (consoleAuthor == null) { + consoleAuthor = new ConsoleAuthor(LocaleLoader.getString("Chat.Identity.Console")); } - senderName = event.getSender(); - displayName = useDisplayNames ? event.getDisplayName() : senderName; - message = LocaleLoader.formatString(chatPrefix, displayName) + " " + event.getMessage(); + return consoleAuthor; + } - sendMessage(); + /** + * 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()))); + } + } - /* - * 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; + /** + * 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(); - //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)); - } - } + for(int i = 0; i < args.length; i++) { + if(i + 1 >= args.length) { + stringBuilder.append(args[i]); + } else { + stringBuilder.append(args[i]).append(" "); } } + + return stringBuilder.toString(); } - public void handleChat(String senderName, String message) { - handleChat(senderName, senderName, message, false); + /** + * 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) { + return true; + } + break; + case PARTY_OFFICER: + case NONE: + return false; + } + + return 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(); } + 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 4146d26c7..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..5e12bce2a --- /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 true; + } 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/AdminAuthor.java b/src/main/java/com/gmail/nossr50/chat/author/AdminAuthor.java new file mode 100644 index 000000000..e08d64610 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/chat/author/AdminAuthor.java @@ -0,0 +1,52 @@ +package com.gmail.nossr50.chat.author; + +import com.gmail.nossr50.config.Config; +import org.bukkit.entity.Player; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.UUID; + +public class AdminAuthor implements Author { + + private final @NotNull Player player; + private @Nullable String overrideName; + + public AdminAuthor(@NotNull Player player) { + this.player = player; + } + + @Override + public @NotNull String getAuthoredName() { + if(overrideName != null) { + return overrideName; + } else { + if(Config.getInstance().getAdminDisplayNames()) { + return player.getDisplayName(); + } else { + return player.getName(); + } + } + } + + @Override + public void setName(@NotNull String newName) { + overrideName = newName; + } + + @Override + public boolean isConsole() { + return false; + } + + @Override + public boolean isPlayer() { + return true; + } + + @Override + public @NonNull UUID uuid() { + return player.getUniqueId(); + } +} 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..81b5d5fe3 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/chat/author/Author.java @@ -0,0 +1,32 @@ +package com.gmail.nossr50.chat.author; + +import net.kyori.adventure.identity.Identity; +import org.jetbrains.annotations.NotNull; + +public interface Author extends Identity { + + /** + * The name of this author + * @return the name of this author + */ + @NotNull String getAuthoredName(); + + /** + * Set the name of this author + * @param newName value of the new name + */ + void setName(@NotNull String newName); + + /** + * 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..662fce3e5 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/chat/author/ConsoleAuthor.java @@ -0,0 +1,41 @@ +package com.gmail.nossr50.chat.author; + +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 @NotNull String name; + + public ConsoleAuthor(@NotNull String name) { + this.name = name; + this.uuid = new UUID(0, 0); + } + + @Override + public @NotNull String getAuthoredName() { + return name; + } + + @Override + public void setName(@NotNull String newName) { + this.name = newName; + } + + @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/PartyAuthor.java b/src/main/java/com/gmail/nossr50/chat/author/PartyAuthor.java new file mode 100644 index 000000000..c3f3c3f22 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/chat/author/PartyAuthor.java @@ -0,0 +1,52 @@ +package com.gmail.nossr50.chat.author; + +import com.gmail.nossr50.config.Config; +import org.bukkit.entity.Player; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.UUID; + +public class PartyAuthor implements Author { + + private final @NotNull Player player; + private @Nullable String overrideName; + + public PartyAuthor(@NotNull Player player) { + this.player = player; + } + + @Override + public @NotNull String getAuthoredName() { + if(overrideName != null) { + return overrideName; + } else { + if(Config.getInstance().getPartyDisplayNames()) { + return player.getDisplayName(); + } else { + return player.getName(); + } + } + } + + @Override + public void setName(@NotNull String newName) { + overrideName = newName; + } + + @Override + public boolean isConsole() { + return false; + } + + @Override + public boolean isPlayer() { + return true; + } + + @Override + public @NonNull UUID uuid() { + return player.getUniqueId(); + } +} 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..ffe78599f --- /dev/null +++ b/src/main/java/com/gmail/nossr50/chat/mailer/AdminChatMailer.java @@ -0,0 +1,72 @@ +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.events.chat.McMMOAdminChatEvent; +import com.gmail.nossr50.events.chat.McMMOChatEvent; +import com.gmail.nossr50.locale.LocaleLoader; +import com.gmail.nossr50.mcMMO; +import net.kyori.adventure.audience.Audience; +import net.kyori.adventure.text.Component; +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 + * @return the styled string, based on a locale entry + */ + public @NotNull TextComponent addStyle(@NotNull Author author, @NotNull String message) { + return Component.text(LocaleLoader.getString("Chat.Style.Admin", author.getAuthoredName(), message)); + } + + @Override + public void sendMail(@NotNull ChatMessage chatMessage) { + chatMessage.sendMessage(); + } + + public void processChatMessage(@NotNull Author author, @NotNull String rawString, boolean isAsync) { + AdminChatMessage chatMessage = new AdminChatMessage(pluginRef, author, constructAudience(), rawString, addStyle(author, rawString)); + + McMMOChatEvent chatEvent = new McMMOAdminChatEvent(pluginRef, chatMessage, isAsync); + Bukkit.getPluginManager().callEvent(chatEvent); + + if(!chatEvent.isCancelled()) { + sendMail(chatMessage); + } + } +} 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..49e210268 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/chat/mailer/PartyChatMailer.java @@ -0,0 +1,47 @@ +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.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 net.kyori.adventure.audience.Audience; +import net.kyori.adventure.text.Component; +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); + } + + public void processChatMessage(@NotNull Author author, @NotNull String rawString, @NotNull Party party, boolean isAsync) { + PartyChatMessage chatMessage = new PartyChatMessage(pluginRef, author, constructPartyAudience(party), rawString, addStyle(author, rawString), party); + + McMMOChatEvent chatEvent = new McMMOPartyChatEvent(pluginRef, chatMessage, party, isAsync); + Bukkit.getPluginManager().callEvent(chatEvent); + + if(!chatEvent.isCancelled()) { + sendMail(chatMessage); + } + } + + public @NotNull Audience constructPartyAudience(@NotNull Party party) { + return mcMMO.getAudiences().filter(party.getSamePartyPredicate()); + } + + public @NotNull TextComponent addStyle(@NotNull Author author, @NotNull String message) { + return Component.text(LocaleLoader.getString("Chat.Style.Party", author.getAuthoredName(), 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..e83b5df8d --- /dev/null +++ b/src/main/java/com/gmail/nossr50/chat/message/AbstractChatMessage.java @@ -0,0 +1,59 @@ +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.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 String getAuthorDisplayName() { + return author.getAuthoredName(); + } + + @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; + } +} 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..5cbd3d673 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/chat/message/AdminChatMessage.java @@ -0,0 +1,18 @@ +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.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); + } +} 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..a055a8953 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/chat/message/PartyChatMessage.java @@ -0,0 +1,63 @@ +package com.gmail.nossr50.chat.message; + +import com.gmail.nossr50.chat.author.Author; +import com.gmail.nossr50.datatypes.party.Party; +import com.gmail.nossr50.datatypes.player.McMMOPlayer; +import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.util.player.UserManager; +import net.kyori.adventure.audience.Audience; +import net.kyori.adventure.text.Component; +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 void sendMessage() { + audience.sendMessage(author, componentMessage); + + //Relay to spies + TextComponent textComponent = Component.text("[" + getParty().getName() + "] ->" ).append(getChatMessage()); + relayChatToSpies(textComponent); + } + + /** + * Party Chat Spies will get a copy of the message as well + * @param spyMessage the message to copy to spies + */ + private void relayChatToSpies(@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); + } + } + } + } +} 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..2b4dbe7f7 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/commands/CommandManager.java @@ -0,0 +1,103 @@ +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.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.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 String ADMIN_CONDITION = "adminCondition"; + public static final String PARTY_CONDITION = "partyCondition"; + public static final 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(); + } + + public void registerConditions() { + //TODO: Might be making a mistake with this lambda here, double check + //TODO: Might be making a mistake with this lambda here, double check + //TODO: Might be making a mistake with this lambda here, double check + //TODO: Might be making a mistake with this lambda here, double check + //TODO: Might be making a mistake with this lambda here, double check + //TODO: Might be making a mistake with this lambda here, double check + //TODO: Might be making a mistake with this lambda here, double check + //TODO: Might be making a mistake with this lambda here, double check + //TODO: Might be making a mistake with this lambda here, double check + //TODO: Might be making a mistake with this lambda here, double check + + // 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) { + 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()); + } + }); + } + + private void registerCommands() { + bukkitCommandManager.registerCommand(new AdminChatCommand(pluginRef)); + bukkitCommandManager.registerCommand(new PartyChatCommand(pluginRef)); + } + + + 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("Your mcMMO player data has not yet loaded!"); + } + } + + 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/chat/AdminChatCommand.java b/src/main/java/com/gmail/nossr50/commands/chat/AdminChatCommand.java index 41f3746b5..6ff82c500 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,47 @@ 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.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); +@CommandAlias("a|adminchat") //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()); + + //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 559395e8e..000000000 --- a/src/main/java/com/gmail/nossr50/commands/chat/ChatCommand.java +++ /dev/null @@ -1,141 +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 org.jetbrains.annotations.NotNull; - -import java.util.ArrayList; -import java.util.List; - -public abstract class ChatCommand implements TabExecutor { - private final ChatMode chatMode; - protected ChatManager chatManager; - - public ChatCommand(ChatMode chatMode) { - this.chatMode = chatMode; - this.chatManager = ChatManagerFactory.getChatManager(mcMMO.p, chatMode); - } - - @Override - public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull 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(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, String[] args) { - if (args.length == 1) { - return StringUtil.copyPartialMatches(args[0], CommandUtils.TRUE_FALSE_OPTIONS, new ArrayList<>(CommandUtils.TRUE_FALSE_OPTIONS.size())); - } - 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..dc43b3dbc 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,87 @@ 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.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 org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; -public class PartyChatCommand extends ChatCommand { - public PartyChatCommand() { - super(ChatMode.PARTY); +@CommandAlias("p|partychat") //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(args, 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/party/PartyCommand.java b/src/main/java/com/gmail/nossr50/commands/party/PartyCommand.java index 7a8f99f9d..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; @@ -55,7 +54,6 @@ public class PartyCommand implements TabExecutor { private final CommandExecutor partyInfoCommand = new PartyInfoCommand(); private final CommandExecutor partyHelpCommand = new PartyHelpCommand(); private final CommandExecutor partyTeleportCommand = new PtpCommand(); - private final CommandExecutor partyChatCommand = new PartyChatCommand(); private final CommandExecutor partyAllianceCommand = new PartyAllianceCommand(); @Override @@ -132,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; } 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 26c6441e5..6c41b232d 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/AprilCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/AprilCommand.java @@ -157,40 +157,40 @@ public class AprilCommand implements TabExecutor { switch (fakeSkillType) { case MACHO: - messages.add(LocaleLoader.formatString("[[RED]]Damage Taken: [[YELLOW]]{0}%", decimal.format(Misc.getRandom().nextInt(77)))); + messages.add(LocaleLoader.formatString("&cDamage Taken: &e{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)))); + messages.add(LocaleLoader.formatString("&cDouble Jump Chance: &e{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)))); + messages.add(LocaleLoader.formatString("&cDrop Item Chance: &e{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)))); + messages.add(LocaleLoader.formatString("&cWrecking Chance: &e{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)))); + messages.add(LocaleLoader.formatString("&cCrafting Success: &e{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)))); + messages.add(LocaleLoader.formatString("&cWalk Chance: &e{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)))); + messages.add(LocaleLoader.formatString("&cSwim Chance: &e{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)))); + messages.add(LocaleLoader.formatString("&cSkydiving Success: &e{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)))); + messages.add(LocaleLoader.formatString("&cRock Climber Chance: &e{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)))); + messages.add(LocaleLoader.formatString("&cFly Chance: &e{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)))); + messages.add(LocaleLoader.formatString("&cHold Breath Chance: &e{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)); + messages.add(LocaleLoader.formatString("&cCarrot Turbo Boost: &e{0}%", decimal.format(Misc.getRandom().nextInt(80)) + 10)); break; } 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 70% 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 a327ad11c..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 final String enabledMessage; private final String disabledMessage; - 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/party/Party.java b/src/main/java/com/gmail/nossr50/datatypes/party/Party.java index c4b6e42ca..d15d525a9 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/party/Party.java +++ b/src/main/java/com/gmail/nossr50/datatypes/party/Party.java @@ -1,5 +1,6 @@ package com.gmail.nossr50.datatypes.party; +import com.gmail.nossr50.chat.SamePartyPredicate; import com.gmail.nossr50.config.Config; import com.gmail.nossr50.config.experience.ExperienceConfig; import com.gmail.nossr50.datatypes.experience.FormulaType; @@ -16,15 +17,18 @@ import org.bukkit.Bukkit; import org.bukkit.ChatColor; 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.function.Predicate; import java.util.stream.Collectors; public class Party { + private final @NotNull Predicate samePartyPredicate; // private static final String ONLINE_PLAYER_PREFIX = "★"; // private static final String ONLINE_PLAYER_PREFIX = "●" + ChatColor.RESET; private static final String ONLINE_PLAYER_PREFIX = "⬤"; @@ -53,6 +57,7 @@ public class Party { public Party(String name) { this.name = name; + samePartyPredicate = new SamePartyPredicate<>(this); } public Party(PartyLeader leader, String name) { @@ -60,6 +65,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 +74,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 +83,7 @@ public class Party { this.password = password; this.locked = locked; this.level = 0; + samePartyPredicate = new SamePartyPredicate<>(this); } public LinkedHashMap getMembers() { @@ -550,4 +558,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/player/McMMOPlayer.java b/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java index 7b3504265..e5f38f706 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java +++ b/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java @@ -1,10 +1,12 @@ package com.gmail.nossr50.datatypes.player; +import com.gmail.nossr50.chat.author.AdminAuthor; +import com.gmail.nossr50.chat.author.PartyAuthor; 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.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; @@ -50,6 +52,8 @@ 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 net.kyori.adventure.identity.Identified; +import net.kyori.adventure.identity.Identity; import org.apache.commons.lang.Validate; import org.bukkit.GameMode; import org.bukkit.Location; @@ -57,13 +61,21 @@ 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.Map; import java.util.Set; import java.util.UUID; -public class McMMOPlayer { +public class McMMOPlayer implements Identified { + private final @NotNull Identity identity; + + //Hacky fix for now, redesign later + private final @NotNull PartyAuthor partyAuthor; + private final @NotNull AdminAuthor adminAuthor; + private final Player player; private final PlayerProfile profile; @@ -77,8 +89,6 @@ public class McMMOPlayer { private PartyTeleportRecord ptpRecord; - private boolean partyChatMode; - private boolean adminChatMode; private boolean displaySkillNotifications = true; private boolean debugMode; @@ -86,6 +96,8 @@ public class McMMOPlayer { private boolean godMode; private boolean chatSpy = false; //Off by default + private ChatChannel chatChannel; + private final Map abilityMode = new HashMap<>(); private final Map abilityInformed = new HashMap<>(); @@ -106,6 +118,7 @@ public class McMMOPlayer { 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); @@ -143,6 +156,11 @@ public class McMMOPlayer { debugMode = false; //Debug mode helps solve support issues, players can toggle it on or off attackStrength = 1.0D; + + this.adminAuthor = new AdminAuthor(player); + this.partyAuthor = new PartyAuthor(player); + + this.chatChannel = ChatChannel.NONE; } public String getPlayerName() { @@ -737,70 +755,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: - } - } - - public void enableChat(ChatMode mode) { - switch (mode) { - case ADMIN: - adminChatMode = true; - partyChatMode = false; - return; - - case PARTY: - partyChatMode = true; - adminChatMode = false; - return; - - default: - } - - } - - public void toggleChat(ChatMode mode) { - switch (mode) { - case ADMIN: - adminChatMode = !adminChatMode; - partyChatMode = !adminChatMode && partyChatMode; - return; - - case PARTY: - partyChatMode = !partyChatMode; - adminChatMode = !partyChatMode && adminChatMode; - return; - - default: - } - } - public boolean isUsingUnarmed() { return isUsingUnarmed; } @@ -1080,4 +1034,32 @@ public class McMMOPlayer { resetAbilityMode(); getTamingManager().cleanupAllSummons(); } + + /** + * For use with Adventure API (Kyori lib) + * @return this players identity + */ + @Override + public @NonNull Identity identity() { + return identity; + } + + //TODO: Replace this hacky crap + public @NotNull PartyAuthor getPartyAuthor() { + return partyAuthor; + } + + //TODO: Replace this hacky crap + public @NotNull AdminAuthor getAdminAuthor() { + return adminAuthor; + } + + public @NotNull ChatChannel getChatChannel() { + return chatChannel; + } + + public void setChatMode(ChatChannel chatChannel) { + //TODO: Code in the "you turned off blah, you turned on blah" messages. + this.chatChannel = chatChannel; + } } 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 a86e74e28..4ea8ad156 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 @@ -22,6 +22,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 net.kyori.adventure.text.Component; import net.kyori.adventure.text.TextComponent; import org.bukkit.Location; import org.bukkit.Material; @@ -143,21 +144,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"))); } } 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 33b049ee3..a612d6170 100644 --- a/src/main/java/com/gmail/nossr50/events/chat/McMMOChatEvent.java +++ b/src/main/java/com/gmail/nossr50/events/chat/McMMOChatEvent.java @@ -1,5 +1,11 @@ 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 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; @@ -8,66 +14,123 @@ import org.jetbrains.annotations.NotNull; public abstract class McMMOChatEvent extends Event implements Cancellable { private boolean cancelled; - private final Plugin plugin; - private final 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 display name of the author + * + * @return the display name of the author + * @deprecated Use {@link #getDisplayName()} instead */ - public String getSender() { - return sender; + @Deprecated + public @NotNull String getSender() { + return getAuthor().getAuthoredName(); } /** - * @return String display name of the player who sent the chat, or "Console" + * The name of the author + * @return the author's name */ - public String getDisplayName() { - return displayName; + public @NotNull String getDisplayName() { + return getAuthor().getAuthoredName(); } /** - * @return String message that will be sent + * Don't use this method + * + * @return The raw message + * @deprecated use {@link #getComponentMessage()} instead */ - public String getMessage() { - return message; + @Deprecated + public @NotNull String getMessage() { + return chatMessage.rawMessage(); } /** - * @param displayName String display name of the player who sent the chat + * 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 void setDisplayName(String displayName) { - this.displayName = displayName; + public @NotNull String getRawMessage() { + return chatMessage.rawMessage(); } /** - * @param message String message to be sent in 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 setMessage(String message) { - this.message = message; + public @NotNull TextComponent getComponentMessage() { + return chatMessage.getChatMessage(); + } + + /** + * 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 setMessagePayload(@NotNull TextComponent chatMessage) { + this.chatMessage.setChatMessage(chatMessage); + } + + /** + * Does not function anymore + */ + @Deprecated + public void setDisplayName(@NotNull String displayName) { + return; + } + + /** + * @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 **/ @@ -82,14 +145,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 @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 66f37cdda..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 final 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/listeners/PlayerListener.java b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java index a4212838c..6c9793acc 100644 --- a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java @@ -1,13 +1,8 @@ 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.player.McMMOPlayer; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.datatypes.skills.SubSkillType; @@ -896,27 +891,13 @@ 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; - } - - 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()); + //If the message is allowed we cancel this event to avoid double sending messages + if(plugin.getChatManager().isMessageAllowed(mcMMOPlayer)) { + 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()); } } diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index 36219c257..7649eb114 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; @@ -82,6 +84,8 @@ public class mcMMO extends JavaPlugin { private static PlayerLevelUtils playerLevelUtils; private static SmeltingTracker smeltingTracker; private static TransientMetadataTools transientMetadataTools; + private static ChatManager chatManager; + private static CommandManager commandManager; //ACF /* Adventure */ private static BukkitAudiences audiences; @@ -280,6 +284,10 @@ public class mcMMO extends JavaPlugin { audiences = BukkitAudiences.create(this); transientMetadataTools = new TransientMetadataTools(this); + + chatManager = new ChatManager(this); + + commandManager = new CommandManager(this); } public static PlayerLevelUtils getPlayerLevelUtils() { @@ -701,4 +709,12 @@ public class mcMMO extends JavaPlugin { public static TransientMetadataTools getTransientMetadataTools() { return transientMetadataTools; } + + public ChatManager getChatManager() { + return chatManager; + } + + public CommandManager getCommandManager() { + return commandManager; + } } diff --git a/src/main/java/com/gmail/nossr50/party/PartyManager.java b/src/main/java/com/gmail/nossr50/party/PartyManager.java index 11989ff04..6a1591a70 100644 --- a/src/main/java/com/gmail/nossr50/party/PartyManager.java +++ b/src/main/java/com/gmail/nossr50/party/PartyManager.java @@ -1,7 +1,7 @@ package com.gmail.nossr50.party; import com.gmail.nossr50.config.Config; -import com.gmail.nossr50.datatypes.chat.ChatMode; +import com.gmail.nossr50.datatypes.chat.ChatChannel; import com.gmail.nossr50.datatypes.database.UpgradeType; import com.gmail.nossr50.datatypes.interactions.NotificationType; import com.gmail.nossr50.datatypes.party.ItemShareType; @@ -799,7 +799,7 @@ public final class PartyManager { */ public static void processPartyLeaving(McMMOPlayer mcMMOPlayer) { mcMMOPlayer.removeParty(); - mcMMOPlayer.disableChat(ChatMode.PARTY); + mcMMOPlayer.setChatMode(ChatChannel.NONE); mcMMOPlayer.setItemShareModifier(10); } diff --git a/src/main/java/com/gmail/nossr50/util/McMMOMessageType.java b/src/main/java/com/gmail/nossr50/util/McMMOMessageType.java index 6619e8f0f..ed29e886f 100644 --- a/src/main/java/com/gmail/nossr50/util/McMMOMessageType.java +++ b/src/main/java/com/gmail/nossr50/util/McMMOMessageType.java @@ -2,13 +2,14 @@ package com.gmail.nossr50.util; 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(message, MessageType.SYSTEM)); + SYSTEM((audience, message) -> audience.sendMessage(Identity.nil(), message, MessageType.SYSTEM)); private final BiConsumer sender; diff --git a/src/main/java/com/gmail/nossr50/util/TextComponentFactory.java b/src/main/java/com/gmail/nossr50/util/TextComponentFactory.java index 2ec6351bc..276c997f6 100644 --- a/src/main/java/com/gmail/nossr50/util/TextComponentFactory.java +++ b/src/main/java/com/gmail/nossr50/util/TextComponentFactory.java @@ -13,6 +13,7 @@ import com.gmail.nossr50.mcMMO; 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.ComponentBuilder; import net.kyori.adventure.text.TextComponent; @@ -41,7 +42,7 @@ public class TextComponentFactory { public static TextComponent getNotificationMultipleValues(String localeKey, String... values) { String preColoredString = LocaleLoader.getString(localeKey, (Object[]) values); - return TextComponent.of(preColoredString); + return Component.text(preColoredString); } public static Component getNotificationTextComponentFromLocale(String localeKey) @@ -51,13 +52,13 @@ public class TextComponentFactory { public static Component getNotificationLevelUpTextComponent(PrimarySkillType skill, int levelsGained, int currentLevel) { - return TextComponent.of(LocaleLoader.getString("Overhaul.Levelup", LocaleLoader.getString("Overhaul.Name."+StringUtils.getCapitalized(skill.toString())), levelsGained, 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 TextComponent.of(text); + return Component.text(text); } public static void sendPlayerSubSkillWikiLink(Player player, String subskillformatted) @@ -65,29 +66,29 @@ public class TextComponentFactory { if(!Config.getInstance().getUrlLinksEnabled()) return; - TextComponent.Builder wikiLinkComponent = TextComponent.builder(LocaleLoader.getString("Overhaul.mcMMO.MmoInfo.Wiki")); + 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 = TextComponent.builder(subskillformatted).append("\n").append(wikiUrl).color(NamedTextColor.GRAY).decoration(TextDecoration.ITALIC, true); + 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(wikiLinkComponent, MessageType.SYSTEM); + mcMMO.getAudiences().player(player).sendMessage(Identity.nil(), wikiLinkComponent, MessageType.SYSTEM); } public static void sendPlayerUrlHeader(Player player) { - TextComponent prefix = TextComponent.of(LocaleLoader.getString("Overhaul.mcMMO.Url.Wrap.Prefix") + " "); + TextComponent prefix = Component.text(LocaleLoader.getString("Overhaul.mcMMO.Url.Wrap.Prefix") + " "); /*prefix.setColor(ChatColor.DARK_AQUA);*/ - TextComponent suffix = TextComponent.of(" "+LocaleLoader.getString("Overhaul.mcMMO.Url.Wrap.Suffix")); + TextComponent suffix = Component.text(" "+LocaleLoader.getString("Overhaul.mcMMO.Url.Wrap.Suffix")); /*suffix.setColor(ChatColor.DARK_AQUA);*/ - TextComponent emptySpace = TextComponent.space(); + TextComponent emptySpace = Component.space(); - mcMMO.getAudiences().player(player).sendMessage(TextComponent.ofChildren( + mcMMO.getAudiences().player(player).sendMessage(Identity.nil(),TextComponent.ofChildren( prefix, getWebLinkTextComponent(McMMOWebLinks.WEBSITE), emptySpace, @@ -106,7 +107,7 @@ public class TextComponentFactory { public static void sendPlayerSubSkillList(Player player, List textComponents) { - TextComponent emptySpace = TextComponent.space(); + TextComponent emptySpace = Component.space(); AtomicReference messageToSend = new AtomicReference<>(); int newLineCount = 0; //Hacky solution to wordwrap problems @@ -118,7 +119,7 @@ public class TextComponentFactory { { Component toSend = messageToSend.get(); if (toSend != null) { - audience.sendMessage(toSend.append(emptySpace)); + audience.sendMessage(Identity.nil(), toSend.append(emptySpace)); } messageToSend.set(null); @@ -127,7 +128,7 @@ public class TextComponentFactory { //Style the skills into @links final String originalTxt = textComponent instanceof TextComponent ? ((TextComponent) textComponent).content() : ""; - TextComponent.Builder stylizedText = TextComponent.builder(LocaleLoader.getString("JSON.Hover.AtSymbolSkills")); + TextComponent.Builder stylizedText = Component.text().content(LocaleLoader.getString("JSON.Hover.AtSymbolSkills")); addChild(stylizedText, originalTxt); if(textComponent.hoverEvent() != null) @@ -143,7 +144,7 @@ public class TextComponentFactory { Component toSend = messageToSend.get(); if (toSend != null) { - audience.sendMessage(toSend.append(emptySpace)); + audience.sendMessage(Identity.nil(), toSend.append(emptySpace)); } } @@ -154,37 +155,37 @@ public class TextComponentFactory { switch(webLinks) { case WEBSITE: - webTextComponent = TextComponent.builder(LocaleLoader.getString("JSON.Hover.AtSymbolURL")); + webTextComponent = Component.text().content(LocaleLoader.getString("JSON.Hover.AtSymbolURL")); addChild(webTextComponent, "Web"); webTextComponent.clickEvent(getUrlClickEvent(McMMOUrl.urlWebsite)); break; case SPIGOT: - webTextComponent = TextComponent.builder(LocaleLoader.getString("JSON.Hover.AtSymbolURL")); + webTextComponent = Component.text().content(LocaleLoader.getString("JSON.Hover.AtSymbolURL")); addChild(webTextComponent, "Spigot"); webTextComponent.clickEvent(getUrlClickEvent(McMMOUrl.urlSpigot)); break; case DISCORD: - webTextComponent = TextComponent.builder(LocaleLoader.getString("JSON.Hover.AtSymbolURL")); + webTextComponent = Component.text().content(LocaleLoader.getString("JSON.Hover.AtSymbolURL")); addChild(webTextComponent, "Discord"); webTextComponent.clickEvent(getUrlClickEvent(McMMOUrl.urlDiscord)); break; case PATREON: - webTextComponent = TextComponent.builder(LocaleLoader.getString("JSON.Hover.AtSymbolURL")); + webTextComponent = Component.text().content(LocaleLoader.getString("JSON.Hover.AtSymbolURL")); addChild(webTextComponent, "Patreon"); webTextComponent.clickEvent(getUrlClickEvent(McMMOUrl.urlPatreon)); break; case WIKI: - webTextComponent = TextComponent.builder(LocaleLoader.getString("JSON.Hover.AtSymbolURL")); + webTextComponent = Component.text().content(LocaleLoader.getString("JSON.Hover.AtSymbolURL")); addChild(webTextComponent, "Wiki"); webTextComponent.clickEvent(getUrlClickEvent(McMMOUrl.urlWiki)); break; case HELP_TRANSLATE: - webTextComponent = TextComponent.builder(LocaleLoader.getString("JSON.Hover.AtSymbolURL")); + webTextComponent = Component.text().content(LocaleLoader.getString("JSON.Hover.AtSymbolURL")); addChild(webTextComponent, "Lang"); webTextComponent.clickEvent(getUrlClickEvent(McMMOUrl.urlTranslate)); break; default: - webTextComponent = TextComponent.builder("NOT DEFINED"); + webTextComponent = Component.text().content("NOT DEFINED"); } addNewHoverComponentToTextComponent(webTextComponent, getUrlHoverEvent(webLinks)); @@ -194,60 +195,60 @@ public class TextComponentFactory { } private static void addChild(Component webTextComponent, String childName) { - TextComponent childComponent = TextComponent.of(childName); + TextComponent childComponent = Component.text(childName); childComponent.color(NamedTextColor.BLUE); webTextComponent.append(childComponent); } private static void addChild(ComponentBuilder webTextComponent, String childName) { - TextComponent childComponent = TextComponent.of(childName); + TextComponent childComponent = Component.text(childName); childComponent.color(NamedTextColor.BLUE); webTextComponent.append(childComponent); } private static Component getUrlHoverEvent(McMMOWebLinks webLinks) { - TextComponent.Builder componentBuilder = TextComponent.builder(webLinks.getNiceTitle()); + TextComponent.Builder componentBuilder = Component.text().content(webLinks.getNiceTitle()); switch(webLinks) { case WEBSITE: addUrlHeaderHover(webLinks, componentBuilder); - componentBuilder.append("\n\n"); - componentBuilder.append(TextComponent.of(webLinks.getLocaleDescription(), NamedTextColor.GREEN)); - componentBuilder.append(TextComponent.of("\nDev Blogs, and information related to mcMMO can be found here", NamedTextColor.GRAY)); + 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("\n\n"); - componentBuilder.append(TextComponent.of(webLinks.getLocaleDescription(), NamedTextColor.GREEN)); - componentBuilder.append(TextComponent.of("\nI post regularly in the discussion thread here!", NamedTextColor.GRAY)); + 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("\n\n"); - componentBuilder.append(TextComponent.of(webLinks.getLocaleDescription(), NamedTextColor.GREEN)); - componentBuilder.append("\n"); - componentBuilder.append(TextComponent.of("Show support by buying me a coffee :)", NamedTextColor.GRAY)); + 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("\n\n"); - componentBuilder.append(TextComponent.of(webLinks.getLocaleDescription(), NamedTextColor.GREEN)); - componentBuilder.append("\n"); - componentBuilder.append(TextComponent.of("I'm looking for more wiki staff, contact me on our discord!", NamedTextColor.DARK_GRAY)); + 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("\n\n"); - componentBuilder.append(TextComponent.of(webLinks.getLocaleDescription(), NamedTextColor.GREEN)); + componentBuilder.append(Component.newline()).append(Component.newline()); + componentBuilder.append(Component.text(webLinks.getLocaleDescription(), NamedTextColor.GREEN)); break; case HELP_TRANSLATE: addUrlHeaderHover(webLinks, componentBuilder); - componentBuilder.append("\n\n"); - componentBuilder.append(TextComponent.of(webLinks.getLocaleDescription(), NamedTextColor.GREEN)); - componentBuilder.append("\n"); - componentBuilder.append(TextComponent.of("You can use this website to help translate mcMMO into your language!" + + 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)); } @@ -255,8 +256,8 @@ public class TextComponentFactory { } private static void addUrlHeaderHover(McMMOWebLinks webLinks, TextComponent.Builder componentBuilder) { - componentBuilder.append("\n"); - componentBuilder.append(TextComponent.of(webLinks.getUrl(), NamedTextColor.GRAY, TextDecoration.ITALIC)); + componentBuilder.append(Component.newline()); + componentBuilder.append(Component.text(webLinks.getUrl(), NamedTextColor.GRAY, TextDecoration.ITALIC)); } private static ClickEvent getUrlClickEvent(String url) @@ -311,14 +312,14 @@ public class TextComponentFactory { TextComponent.Builder textComponent; if (skillUnlocked) { if (RankUtils.getHighestRank(subSkillType) == RankUtils.getRank(player, subSkillType) && subSkillType.getNumRanks() > 1) - textComponent = TextComponent.builder(LocaleLoader.getString("JSON.Hover.MaxRankSkillName", skillName)); + textComponent = Component.text().content(LocaleLoader.getString("JSON.Hover.MaxRankSkillName", skillName)); else - textComponent = TextComponent.builder(LocaleLoader.getString("JSON.Hover.SkillName", skillName)); + textComponent = Component.text().content(LocaleLoader.getString("JSON.Hover.SkillName", skillName)); textComponent.clickEvent(ClickEvent.runCommand("/mmoinfo " + subSkillType.getNiceNameNoSpaces(subSkillType))); } else { - textComponent = TextComponent.builder(LocaleLoader.getString("JSON.Hover.Mystery", + textComponent = Component.text().content(LocaleLoader.getString("JSON.Hover.Mystery", String.valueOf(RankUtils.getUnlockLevel(subSkillType)))); textComponent.clickEvent(ClickEvent.runCommand("/mmoinfo ???")); @@ -382,12 +383,12 @@ public class TextComponentFactory { addRanked(ccRank, ccCurRank, ccPossessive, ccCurRank, componentBuilder, abstractSubSkill.getNumRanks(), RankUtils.getRank(player, abstractSubSkill), nextRank); - componentBuilder.append(LocaleLoader.getString("JSON.DescriptionHeader")); - componentBuilder.append("\n").append(abstractSubSkill.getDescription()).append("\n"); + componentBuilder.append(Component.text(LocaleLoader.getString("JSON.DescriptionHeader"))); + componentBuilder.append(Component.newline()).append(Component.text(abstractSubSkill.getDescription())).append(Component.newline()); //Empty line - componentBuilder.append("\n").decoration(TextDecoration.BOLD, false); - componentBuilder.append("\n"); + componentBuilder.append(Component.newline()).decoration(TextDecoration.BOLD, false); + componentBuilder.append(Component.newline()); //Finally, add details to the tooltip abstractSubSkill.addStats(componentBuilder, player); @@ -410,19 +411,19 @@ public class TextComponentFactory { } private static TextComponent.Builder getNewComponentBuilder(String skillName) { - TextComponent.Builder componentBuilder = TextComponent.builder(skillName); - componentBuilder.append("\n"); + 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(LocaleLoader.getString("JSON.Hover.Rank", String.valueOf(rank))).append("\n"); + componentBuilder.append(Component.text(LocaleLoader.getString("JSON.Hover.Rank", String.valueOf(rank)))).append(Component.newline()); //Next Rank: x if(nextRank > rank) - componentBuilder.append(LocaleLoader.getString("JSON.Hover.NextRank", String.valueOf(nextRank))).append("\n"); + 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);*/ @@ -431,20 +432,20 @@ public class TextComponentFactory { private static void addLocked(SubSkillType subSkillType, TextColor ccLocked, TextColor ccLevelRequirement, TextColor ccLevelRequired, TextComponent.Builder componentBuilder) { addLocked(ccLocked, ccLevelRequirement, componentBuilder); - componentBuilder.append(TextComponent.of(String.valueOf(RankConfig.getInstance().getSubSkillUnlockLevel(subSkillType, 1)), ccLevelRequired)); - //componentBuilder.append("\n"); + 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(TextComponent.of(String.valueOf(RankConfig.getInstance().getSubSkillUnlockLevel(abstractSubSkill, 1)), ccLevelRequired)); - //componentBuilder.append("\n"); + 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(TextComponent.of(LocaleLoader.getString("JSON.Locked"), ccLocked, TextDecoration.BOLD)); - componentBuilder.append("\n").append("\n"); - componentBuilder.append(TextComponent.of(LocaleLoader.getString("JSON.LevelRequirement") + ": ", ccLevelRequirement)); + 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 @@ -490,11 +491,11 @@ public class TextComponentFactory { } - componentBuilder.append("\n"); - componentBuilder.append(LocaleLoader.getString("JSON.DescriptionHeader")); + componentBuilder.append(Component.newline()); + componentBuilder.append(Component.text(LocaleLoader.getString("JSON.DescriptionHeader"))); componentBuilder.color(ccDescriptionHeader); - componentBuilder.append("\n"); - componentBuilder.append(subSkillType.getLocaleDescription()); + componentBuilder.append(Component.newline()); + componentBuilder.append(Component.text(subSkillType.getLocaleDescription())); componentBuilder.color(ccDescription); } @@ -505,15 +506,15 @@ public class TextComponentFactory { { if(abstractSubSkill.isSuperAbility()) { - componentBuilder.append(TextComponent.of(LocaleLoader.getString("JSON.Type.SuperAbility"), NamedTextColor.LIGHT_PURPLE, TextDecoration.BOLD)); + componentBuilder.append(Component.text(LocaleLoader.getString("JSON.Type.SuperAbility"), NamedTextColor.LIGHT_PURPLE, TextDecoration.BOLD)); } else if(abstractSubSkill.isActiveUse()) { - componentBuilder.append(TextComponent.of(LocaleLoader.getString("JSON.Type.Active"), NamedTextColor.DARK_RED, TextDecoration.BOLD)); + componentBuilder.append(Component.text(LocaleLoader.getString("JSON.Type.Active"), NamedTextColor.DARK_RED, TextDecoration.BOLD)); } else { - componentBuilder.append(TextComponent.of(LocaleLoader.getString("JSON.Type.Passive"), NamedTextColor.GREEN, TextDecoration.BOLD)); + componentBuilder.append(Component.text(LocaleLoader.getString("JSON.Type.Passive"), NamedTextColor.GREEN, TextDecoration.BOLD)); } - componentBuilder.append("\n"); + componentBuilder.append(Component.newline()); } public static void getSubSkillTextComponents(Player player, List textComponents, PrimarySkillType parentSkill) { @@ -542,7 +543,7 @@ public class TextComponentFactory { public static TextComponent getSubSkillUnlockedNotificationComponents(Player player, SubSkillType subSkillType) { - TextComponent.Builder unlockMessage = TextComponent.builder(LocaleLoader.getString("JSON.SkillUnlockMessage", subSkillType.getLocaleName(), RankUtils.getRank(player, 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/TransientMetadataTools.java b/src/main/java/com/gmail/nossr50/util/TransientMetadataTools.java index 8aacee4d5..3e74d9bf8 100644 --- a/src/main/java/com/gmail/nossr50/util/TransientMetadataTools.java +++ b/src/main/java/com/gmail/nossr50/util/TransientMetadataTools.java @@ -1,7 +1,6 @@ package com.gmail.nossr50.util; import com.gmail.nossr50.mcMMO; -import com.gmail.nossr50.util.compat.layers.persistentdata.SpigotPersistentDataLayer_1_13; import org.bukkit.entity.LivingEntity; public class TransientMetadataTools { 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 81f6c34bc..c5056f02f 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; @@ -313,27 +311,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"); @@ -453,10 +451,6 @@ public final class CommandRegistrationManager { registerMHDCommand(); registerXprateCommand(); - // Chat Commands - registerPartyChatCommand(); - registerAdminChatCommand(); - // Database Commands registerMcpurgeCommand(); registerMcremoveCommand(); diff --git a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/AbstractPersistentDataLayer.java b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/AbstractPersistentDataLayer.java index 498ebb8ce..9a3af55bf 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/AbstractPersistentDataLayer.java +++ b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/AbstractPersistentDataLayer.java @@ -1,6 +1,5 @@ package com.gmail.nossr50.util.compat.layers.persistentdata; -import com.gmail.nossr50.api.exceptions.IncompleteNamespacedKeyRegister; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.compat.layers.AbstractCompatibilityLayer; import org.bukkit.NamespacedKey; @@ -11,7 +10,8 @@ import org.bukkit.inventory.meta.ItemMeta; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.*; +import java.util.List; +import java.util.UUID; public abstract class AbstractPersistentDataLayer extends AbstractCompatibilityLayer { diff --git a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer_1_14.java b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer_1_14.java index 817b33036..3f8feb349 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer_1_14.java +++ b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer_1_14.java @@ -3,7 +3,6 @@ package com.gmail.nossr50.util.compat.layers.persistentdata; import com.gmail.nossr50.api.exceptions.IncompleteNamespacedKeyRegister; import com.gmail.nossr50.config.PersistentDataConfig; import com.gmail.nossr50.mcMMO; -import org.bukkit.Bukkit; import org.bukkit.NamespacedKey; import org.bukkit.block.Furnace; import org.bukkit.enchantments.Enchantment; 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 cc169f623..b42a6e3cb 100644 --- a/src/main/java/com/gmail/nossr50/util/player/NotificationManager.java +++ b/src/main/java/com/gmail/nossr50/util/player/NotificationManager.java @@ -17,6 +17,7 @@ import com.gmail.nossr50.util.sounds.SoundManager; import com.gmail.nossr50.util.sounds.SoundType; 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 org.bukkit.Bukkit; import org.bukkit.ChatColor; @@ -115,10 +116,10 @@ public class NotificationManager { if(customEvent.isMessageAlsoBeingSentToChat()) { //Send copy to chat system - audience.sendMessage(customEvent.getNotificationTextComponent(), MessageType.SYSTEM); + audience.sendMessage(Identity.nil(), customEvent.getNotificationTextComponent(), MessageType.SYSTEM); } } else { - audience.sendMessage(customEvent.getNotificationTextComponent(), MessageType.SYSTEM); + audience.sendMessage(Identity.nil(), customEvent.getNotificationTextComponent(), MessageType.SYSTEM); } } @@ -165,7 +166,7 @@ public class NotificationManager { return; //CHAT MESSAGE - mcMMO.getAudiences().player(mcMMOPlayer.getPlayer()).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); diff --git a/src/main/resources/locale/locale_en_US.properties b/src/main/resources/locale/locale_en_US.properties index 5243280e2..dcb7e95e3 100644 --- a/src/main/resources/locale/locale_en_US.properties +++ b/src/main/resources/locale/locale_en_US.properties @@ -1119,5 +1119,5 @@ Commands.XPBar.DisableAll=&6 All mcMMO XP bars are now disabled, use /mmoxpbar r Chat.Style.Admin=&b[&f{0}&b] {1} Chat.Style.Party=&a[&6{0}&a] {1} Chat.Identity.Console=* Console * -Chat.Channel.On=&6(&amcMMO-Chat&6) &eYour chat messages will now be delivered automatically to the &a{0}&e chat channel. -Chat.Channel.Off=&6(&amcMMO-Chat&6) &7Your chat messages will no longer automatically be delivered to specific chat channels. \ No newline at end of file +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. \ No newline at end of file From 8372fae6f8fc64d38a4ffe990390d78702d391b8 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 26 Oct 2020 16:34:31 -0700 Subject: [PATCH 181/662] remove some unwanted code comments --- .../com/gmail/nossr50/commands/CommandManager.java | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/commands/CommandManager.java b/src/main/java/com/gmail/nossr50/commands/CommandManager.java index 2b4dbe7f7..6527eddff 100644 --- a/src/main/java/com/gmail/nossr50/commands/CommandManager.java +++ b/src/main/java/com/gmail/nossr50/commands/CommandManager.java @@ -33,17 +33,6 @@ public class CommandManager { } public void registerConditions() { - //TODO: Might be making a mistake with this lambda here, double check - //TODO: Might be making a mistake with this lambda here, double check - //TODO: Might be making a mistake with this lambda here, double check - //TODO: Might be making a mistake with this lambda here, double check - //TODO: Might be making a mistake with this lambda here, double check - //TODO: Might be making a mistake with this lambda here, double check - //TODO: Might be making a mistake with this lambda here, double check - //TODO: Might be making a mistake with this lambda here, double check - //TODO: Might be making a mistake with this lambda here, double check - //TODO: Might be making a mistake with this lambda here, double check - // Method or Class based - Can only be used on methods bukkitCommandManager.getCommandConditions().addCondition(ADMIN_CONDITION, (context) -> { BukkitCommandIssuer issuer = context.getIssuer(); From e6e9fdca31317a3f6d2f08ca489d03d879bcef97 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 26 Oct 2020 16:42:56 -0700 Subject: [PATCH 182/662] Fix ArrayIndexOutOfBoundsException for Skill Reset command --- Changelog.txt | 3 ++- .../gmail/nossr50/commands/experience/SkillresetCommand.java | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 7d887480f..a0f452ad9 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,6 +1,6 @@ Version 2.1.150 - mcMMO Party & Admin Chat have had a rewrite, work was put in to make sure their API would be mostly compatible with the old one mcMMO should now be compatible with 1.16.4's new social features + mcMMO Party & Admin Chat have had a rewrite, work was put in to make sure their API would be mostly compatible with the old one The style and look of admin/party chat is now determined by locale file instead of options in config.yml Improved messages players recieve when they toggle on or off admin or party chat All locale files have had [[]] color codes replaced by & color codes, you can still use [[GOLD]] and stuff if you want @@ -9,6 +9,7 @@ Version 2.1.150 Added new locale string 'Chat.Style.Party' Added new locale string 'Chat.Channel.On' Added new locale string 'Chat.Channel.Off' + Fixed an ArrayIndexOutOfBounds exception when using /skillreset (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) 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 1132f7235..3df1976d9 100644 --- a/src/main/java/com/gmail/nossr50/commands/experience/SkillresetCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/experience/SkillresetCommand.java @@ -50,7 +50,7 @@ public class SkillresetCommand implements TabExecutor { skill = null; } else { - skill = PrimarySkillType.getSkill(args[1]); + skill = PrimarySkillType.getSkill(args[0]); } editValues((Player) sender, UserManager.getPlayer(sender.getName()).getProfile(), skill); From 33287b650f2f5ff33554736a6fd65813098c9585 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 26 Oct 2020 16:52:43 -0700 Subject: [PATCH 183/662] Add NMS definition for 1.16.4 --- .../com/gmail/nossr50/util/compat/CompatibilityManager.java | 2 ++ src/main/java/com/gmail/nossr50/util/nms/NMSVersion.java | 1 + 2 files changed, 3 insertions(+) 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 dcfc7d314..6e5f7c8f4 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/CompatibilityManager.java +++ b/src/main/java/com/gmail/nossr50/util/compat/CompatibilityManager.java @@ -124,6 +124,8 @@ public class CompatibilityManager { 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; } } } 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 3768943c9..2f2597a0b 100644 --- a/src/main/java/com/gmail/nossr50/util/nms/NMSVersion.java +++ b/src/main/java/com/gmail/nossr50/util/nms/NMSVersion.java @@ -20,6 +20,7 @@ public enum NMSVersion { 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"), //Version not known to this build of mcMMO UNSUPPORTED("unsupported"); From 05f2763311af4af6b6570a97b205ed600d3aee9e Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 27 Oct 2020 11:03:47 -0700 Subject: [PATCH 184/662] You can now silence mmoedit, addlevels, and addxp with -s --- Changelog.txt | 12 +++--- .../commands/experience/AddlevelsCommand.java | 10 ++++- .../commands/experience/AddxpCommand.java | 10 ++++- .../experience/ExperienceCommand.java | 40 ++++++++++++------- .../commands/experience/MmoeditCommand.java | 10 ++++- .../commands/CommandRegistrationManager.java | 6 +-- .../resources/locale/locale_en_US.properties | 1 + 7 files changed, 61 insertions(+), 28 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index a0f452ad9..1baf71fe8 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -4,11 +4,13 @@ Version 2.1.150 The style and look of admin/party chat is now determined by locale file instead of options in config.yml Improved messages players recieve when they toggle on or off admin or party chat All locale files have had [[]] color codes replaced by & color codes, you can still use [[GOLD]] and stuff if you want - Added new locale string 'Chat.Identity.Console' - Added new locale string 'Chat.Style.Admin' - Added new locale string 'Chat.Style.Party' - Added new locale string 'Chat.Channel.On' - Added new locale string 'Chat.Channel.Off' + 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. + 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.Channel.On' + Added new locale entry 'Chat.Channel.Off' Fixed an ArrayIndexOutOfBounds exception when using /skillreset (API) ChatAPI::getPartyChatManager() has been removed (API) ChatAPI::sendPartyChat has been removed (similar functionality can be found in the new ChatManager class) 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..6c736fd2c 100644 --- a/src/main/java/com/gmail/nossr50/commands/experience/AddlevelsCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/experience/AddlevelsCommand.java @@ -34,12 +34,18 @@ public class AddlevelsCommand 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.addlevels.AwardAll.1", value)); } @Override - protected void handlePlayerMessageSkill(Player player, int value, PrimarySkillType skill) { + protected void handlePlayerMessageSkill(Player player, int value, PrimarySkillType skill, boolean isSilent) { + if(isSilent) + return; + player.sendMessage(LocaleLoader.getString("Commands.addlevels.AwardSkill.1", value, skill.getName())); } } 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..03ad449bb 100644 --- a/src/main/java/com/gmail/nossr50/commands/experience/AddxpCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/experience/AddxpCommand.java @@ -37,12 +37,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) { + protected void handlePlayerMessageSkill(Player player, int value, PrimarySkillType skill, boolean isSilent) { + if(isSilent) + return; + player.sendMessage(LocaleLoader.getString("Commands.addxp.AwardSkill", value, skill.getName())); } } 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 e4886ae0f..2443e6d62 100644 --- a/src/main/java/com/gmail/nossr50/commands/experience/ExperienceCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/experience/ExperienceCommand.java @@ -25,8 +25,10 @@ public abstract class ExperienceCommand implements TabExecutor { 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; } @@ -62,10 +64,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; @@ -105,20 +107,30 @@ public abstract class ExperienceCommand implements TabExecutor { 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(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, String[] args) { switch (args.length) { @@ -135,8 +147,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))); @@ -151,21 +163,21 @@ public abstract class ExperienceCommand implements TabExecutor { } } - 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) { 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..9aa02b164 100644 --- a/src/main/java/com/gmail/nossr50/commands/experience/MmoeditCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/experience/MmoeditCommand.java @@ -40,12 +40,18 @@ public class MmoeditCommand 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.mmoedit.AllSkills.1", value)); } @Override - protected void handlePlayerMessageSkill(Player player, int value, PrimarySkillType skill) { + protected void handlePlayerMessageSkill(Player player, int value, PrimarySkillType skill, boolean isSilent) { + if(isSilent) + return; + player.sendMessage(LocaleLoader.getString("Commands.mmoedit.Modified.1", skill.getName(), value)); } } 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 c5056f02f..b01e34e4a 100644 --- a/src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java +++ b/src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java @@ -120,7 +120,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()); } @@ -129,7 +129,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()); } @@ -183,7 +183,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()); } diff --git a/src/main/resources/locale/locale_en_US.properties b/src/main/resources/locale/locale_en_US.properties index dcb7e95e3..a6387bc57 100644 --- a/src/main/resources/locale/locale_en_US.properties +++ b/src/main/resources/locale/locale_en_US.properties @@ -711,6 +711,7 @@ 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 From 1d55c4c2bc6e22680e2879b9265f5361efc62188 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 27 Oct 2020 11:08:50 -0700 Subject: [PATCH 185/662] fix message spam bug --- .../gmail/nossr50/listeners/PlayerListener.java | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java index 6c9793acc..dfd547891 100644 --- a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java @@ -3,6 +3,7 @@ package com.gmail.nossr50.listeners; 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.ChatChannel; import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.datatypes.skills.SubSkillType; @@ -891,13 +892,15 @@ public class PlayerListener implements Listener { return; } - //If the message is allowed we cancel this event to avoid double sending messages - if(plugin.getChatManager().isMessageAllowed(mcMMOPlayer)) { - 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()); + 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()); + } } } From d183d1217c835ec0ae3615545ff1c604b2d27126 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 27 Oct 2020 11:55:59 -0700 Subject: [PATCH 186/662] Players & Console can now use color codes in party or admin chat (new permission node mcmmo.chat.colors) --- Changelog.txt | 2 ++ .../com/gmail/nossr50/chat/ChatManager.java | 8 ++++---- .../nossr50/chat/author/AdminAuthor.java | 8 ++++++++ .../nossr50/chat/mailer/AdminChatMailer.java | 16 ++++++++++++---- .../nossr50/chat/mailer/PartyChatMailer.java | 19 +++++++++++++++---- .../gmail/nossr50/locale/LocaleLoader.java | 2 +- .../com/gmail/nossr50/util/Permissions.java | 1 + src/main/resources/plugin.yml | 8 ++++++-- 8 files changed, 49 insertions(+), 15 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 1baf71fe8..2696f4446 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,6 +1,8 @@ Version 2.1.150 mcMMO should now be compatible with 1.16.4's new social features mcMMO Party & Admin Chat have had a rewrite, work was put in to make sure their API would be mostly compatible with the old one + 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 Improved messages players recieve when they toggle on or off admin or party chat All locale files have had [[]] color codes replaced by & color codes, you can still use [[GOLD]] and stuff if you want diff --git a/src/main/java/com/gmail/nossr50/chat/ChatManager.java b/src/main/java/com/gmail/nossr50/chat/ChatManager.java index 51b61d273..7d19df79f 100644 --- a/src/main/java/com/gmail/nossr50/chat/ChatManager.java +++ b/src/main/java/com/gmail/nossr50/chat/ChatManager.java @@ -60,10 +60,10 @@ public class ChatManager { private void processPlayerMessage(@NotNull McMMOPlayer mmoPlayer, @NotNull ChatChannel chatChannel, @NotNull String rawMessage, boolean isAsync) { switch (chatChannel) { case ADMIN: - adminChatMailer.processChatMessage(mmoPlayer.getAdminAuthor(), rawMessage, isAsync); + adminChatMailer.processChatMessage(mmoPlayer.getAdminAuthor(), rawMessage, isAsync, Permissions.colorChat(mmoPlayer.getPlayer())); break; case PARTY: - partyChatMailer.processChatMessage(mmoPlayer.getPartyAuthor(), rawMessage, mmoPlayer.getParty(), isAsync); + partyChatMailer.processChatMessage(mmoPlayer.getPartyAuthor(), rawMessage, mmoPlayer.getParty(), isAsync, Permissions.colorChat(mmoPlayer.getPlayer())); break; case PARTY_OFFICER: case NONE: @@ -76,7 +76,7 @@ public class ChatManager { * @param rawMessage raw message from the console */ public void processConsoleMessage(@NotNull String rawMessage) { - adminChatMailer.processChatMessage(getConsoleAuthor(), rawMessage, false); + adminChatMailer.processChatMessage(getConsoleAuthor(), rawMessage, false, true); } /** @@ -93,7 +93,7 @@ public class ChatManager { * @param party target party */ public void processConsoleMessage(@NotNull String rawMessage, @NotNull Party party) { - partyChatMailer.processChatMessage(getConsoleAuthor(), rawMessage, party, false); + partyChatMailer.processChatMessage(getConsoleAuthor(), rawMessage, party, false, true); } /** diff --git a/src/main/java/com/gmail/nossr50/chat/author/AdminAuthor.java b/src/main/java/com/gmail/nossr50/chat/author/AdminAuthor.java index e08d64610..7d6053403 100644 --- a/src/main/java/com/gmail/nossr50/chat/author/AdminAuthor.java +++ b/src/main/java/com/gmail/nossr50/chat/author/AdminAuthor.java @@ -30,6 +30,14 @@ public class AdminAuthor implements Author { } } + public @NotNull Player getPlayer() { + return player; + } + + public @Nullable String getOverrideName() { + return overrideName; + } + @Override public void setName(@NotNull String newName) { overrideName = newName; diff --git a/src/main/java/com/gmail/nossr50/chat/mailer/AdminChatMailer.java b/src/main/java/com/gmail/nossr50/chat/mailer/AdminChatMailer.java index ffe78599f..43bc0557f 100644 --- a/src/main/java/com/gmail/nossr50/chat/mailer/AdminChatMailer.java +++ b/src/main/java/com/gmail/nossr50/chat/mailer/AdminChatMailer.java @@ -1,5 +1,6 @@ package com.gmail.nossr50.chat.mailer; +import com.gmail.nossr50.chat.author.AdminAuthor; import com.gmail.nossr50.chat.author.Author; import com.gmail.nossr50.chat.message.AdminChatMessage; import com.gmail.nossr50.chat.message.ChatMessage; @@ -7,12 +8,14 @@ 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.Permissions; import net.kyori.adventure.audience.Audience; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.TextComponent; import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; import org.bukkit.command.ConsoleCommandSender; +import org.bukkit.entity.Player; import org.bukkit.plugin.Plugin; import org.jetbrains.annotations.NotNull; @@ -48,10 +51,15 @@ public class AdminChatMailer extends AbstractChatMailer { * 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) { - return Component.text(LocaleLoader.getString("Chat.Style.Admin", author.getAuthoredName(), message)); + public @NotNull TextComponent addStyle(@NotNull Author author, @NotNull String message, boolean canColor) { + if(canColor) { + return Component.text(LocaleLoader.getString("Chat.Style.Admin", author.getAuthoredName(), LocaleLoader.addColors(message))); + } else { + return Component.text(LocaleLoader.getString("Chat.Style.Admin", author.getAuthoredName(), message)); + } } @Override @@ -59,8 +67,8 @@ public class AdminChatMailer extends AbstractChatMailer { chatMessage.sendMessage(); } - public void processChatMessage(@NotNull Author author, @NotNull String rawString, boolean isAsync) { - AdminChatMessage chatMessage = new AdminChatMessage(pluginRef, author, constructAudience(), rawString, addStyle(author, rawString)); + 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); diff --git a/src/main/java/com/gmail/nossr50/chat/mailer/PartyChatMailer.java b/src/main/java/com/gmail/nossr50/chat/mailer/PartyChatMailer.java index 49e210268..9bcb5de4c 100644 --- a/src/main/java/com/gmail/nossr50/chat/mailer/PartyChatMailer.java +++ b/src/main/java/com/gmail/nossr50/chat/mailer/PartyChatMailer.java @@ -21,8 +21,8 @@ public class PartyChatMailer extends AbstractChatMailer { super(pluginRef); } - public void processChatMessage(@NotNull Author author, @NotNull String rawString, @NotNull Party party, boolean isAsync) { - PartyChatMessage chatMessage = new PartyChatMessage(pluginRef, author, constructPartyAudience(party), rawString, addStyle(author, rawString), party); + public void processChatMessage(@NotNull Author author, @NotNull String rawString, @NotNull Party party, boolean isAsync, boolean canColor) { + PartyChatMessage chatMessage = new PartyChatMessage(pluginRef, author, constructPartyAudience(party), rawString, addStyle(author, rawString, canColor), party); McMMOChatEvent chatEvent = new McMMOPartyChatEvent(pluginRef, chatMessage, party, isAsync); Bukkit.getPluginManager().callEvent(chatEvent); @@ -36,8 +36,19 @@ public class PartyChatMailer extends AbstractChatMailer { return mcMMO.getAudiences().filter(party.getSamePartyPredicate()); } - public @NotNull TextComponent addStyle(@NotNull Author author, @NotNull String message) { - return Component.text(LocaleLoader.getString("Chat.Style.Party", author.getAuthoredName(), message)); + /** + * 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 Component.text(LocaleLoader.getString("Chat.Style.Party", author.getAuthoredName(), LocaleLoader.addColors(message))); + } else { + return Component.text(LocaleLoader.getString("Chat.Style.Party", author.getAuthoredName(), message)); + } } @Override diff --git a/src/main/java/com/gmail/nossr50/locale/LocaleLoader.java b/src/main/java/com/gmail/nossr50/locale/LocaleLoader.java index 11fc4841b..ac6f496ea 100644 --- a/src/main/java/com/gmail/nossr50/locale/LocaleLoader.java +++ b/src/main/java/com/gmail/nossr50/locale/LocaleLoader.java @@ -128,7 +128,7 @@ public final class LocaleLoader { } } - private static String addColors(String input) { + 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/util/Permissions.java b/src/main/java/com/gmail/nossr50/util/Permissions.java index b1acacdb1..3f804b363 100644 --- a/src/main/java/com/gmail/nossr50/util/Permissions.java +++ b/src/main/java/com/gmail/nossr50/util/Permissions.java @@ -39,6 +39,7 @@ public final class Permissions { /* 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 diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 7fdb6e627..e3ec1e2b5 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -746,12 +746,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.*: @@ -1297,6 +1300,7 @@ permissions: mcmmo.commands.defaults: true mcmmo.motd: true mcmmo.skills.all: true + mcmmo.chat.colors: true mcmmo.defaultsop: default: op description: mcmmo permissions that default to op From 2f506b72bbf11890f40fc9eb98a8175ef53f0b84 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 27 Oct 2020 13:09:01 -0700 Subject: [PATCH 187/662] Better party chat logging in console, some style changes to admin/party chat as well --- Changelog.txt | 1 + .../com/gmail/nossr50/chat/ChatManager.java | 35 +++++++++---------- .../nossr50/chat/SamePartyPredicate.java | 2 +- .../nossr50/chat/author/AdminAuthor.java | 20 ++++++++++- .../com/gmail/nossr50/chat/author/Author.java | 6 ---- .../nossr50/chat/author/ConsoleAuthor.java | 7 +--- .../nossr50/chat/author/PartyAuthor.java | 24 ++++++++++++- .../chat/message/AbstractChatMessage.java | 18 ++++++++++ .../chat/message/PartyChatMessage.java | 32 +++++++++++++++-- .../commands/chat/AdminChatCommand.java | 2 +- .../commands/chat/PartyChatCommand.java | 5 +-- .../skills/archery/ArcheryManager.java | 10 +++--- .../com/gmail/nossr50/util/StringUtils.java | 20 +++++++++++ .../resources/locale/locale_en_US.properties | 10 +++--- 14 files changed, 144 insertions(+), 48 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 2696f4446..4164eaa87 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -4,6 +4,7 @@ Version 2.1.150 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 recieve when they toggle on or off admin or party chat All locale files have had [[]] color codes replaced by & color codes, you can still use [[GOLD]] and stuff if you want 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. diff --git a/src/main/java/com/gmail/nossr50/chat/ChatManager.java b/src/main/java/com/gmail/nossr50/chat/ChatManager.java index 7d19df79f..e162cb6c8 100644 --- a/src/main/java/com/gmail/nossr50/chat/ChatManager.java +++ b/src/main/java/com/gmail/nossr50/chat/ChatManager.java @@ -11,8 +11,10 @@ import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.Permissions; import com.gmail.nossr50.util.StringUtils; +import net.kyori.adventure.audience.Audience; +import net.kyori.adventure.text.TextComponent; +import org.bukkit.command.ConsoleCommandSender; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; //TODO: Micro optimization - Cache audiences and update cache when needed public class ChatManager { @@ -20,11 +22,15 @@ public class ChatManager { private final @NotNull AdminChatMailer adminChatMailer; private final @NotNull PartyChatMailer partyChatMailer; - private @Nullable ConsoleAuthor consoleAuthor; + private final @NotNull ConsoleAuthor consoleAuthor; + private final @NotNull Audience consoleAudience; 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); } /** @@ -96,27 +102,11 @@ public class ChatManager { partyChatMailer.processChatMessage(getConsoleAuthor(), rawMessage, party, false, true); } - /** - * Handles console messaging to a specific party - * @param args raw command args from the console - * @param party target party - */ - public void processConsoleMessage(@NotNull String[] args, @NotNull Party party) { - String chatMessageWithoutCommand = buildChatMessage(args); - - processConsoleMessage(chatMessageWithoutCommand, party); - } - /** * Gets a console author - * Constructs one if it doesn't already exist * @return a {@link ConsoleAuthor} */ private @NotNull Author getConsoleAuthor() { - if (consoleAuthor == null) { - consoleAuthor = new ConsoleAuthor(LocaleLoader.getString("Chat.Identity.Console")); - } - return consoleAuthor; } @@ -180,5 +170,14 @@ public class ChatManager { 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); + } } diff --git a/src/main/java/com/gmail/nossr50/chat/SamePartyPredicate.java b/src/main/java/com/gmail/nossr50/chat/SamePartyPredicate.java index 5e12bce2a..6d4636d6c 100644 --- a/src/main/java/com/gmail/nossr50/chat/SamePartyPredicate.java +++ b/src/main/java/com/gmail/nossr50/chat/SamePartyPredicate.java @@ -21,7 +21,7 @@ public class SamePartyPredicate implements Predicate public boolean test(T t) { //Include the console in the audience if(t instanceof ConsoleCommandSender) { - return true; + 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; diff --git a/src/main/java/com/gmail/nossr50/chat/author/AdminAuthor.java b/src/main/java/com/gmail/nossr50/chat/author/AdminAuthor.java index 7d6053403..f5680872c 100644 --- a/src/main/java/com/gmail/nossr50/chat/author/AdminAuthor.java +++ b/src/main/java/com/gmail/nossr50/chat/author/AdminAuthor.java @@ -1,6 +1,7 @@ package com.gmail.nossr50.chat.author; import com.gmail.nossr50.config.Config; +import com.google.common.base.Objects; import org.bukkit.entity.Player; import org.checkerframework.checker.nullness.qual.NonNull; import org.jetbrains.annotations.NotNull; @@ -38,7 +39,10 @@ public class AdminAuthor implements Author { return overrideName; } - @Override + /** + * Set the name of this author + * @param newName value of the new name + */ public void setName(@NotNull String newName) { overrideName = newName; } @@ -57,4 +61,18 @@ public class AdminAuthor implements Author { 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; + AdminAuthor that = (AdminAuthor) o; + return Objects.equal(player, that.player) && + Objects.equal(overrideName, that.overrideName); + } + + @Override + public int hashCode() { + return Objects.hashCode(player, overrideName); + } } diff --git a/src/main/java/com/gmail/nossr50/chat/author/Author.java b/src/main/java/com/gmail/nossr50/chat/author/Author.java index 81b5d5fe3..7d3c4ef61 100644 --- a/src/main/java/com/gmail/nossr50/chat/author/Author.java +++ b/src/main/java/com/gmail/nossr50/chat/author/Author.java @@ -11,12 +11,6 @@ public interface Author extends Identity { */ @NotNull String getAuthoredName(); - /** - * Set the name of this author - * @param newName value of the new name - */ - void setName(@NotNull String newName); - /** * Whether or not this author is a {@link org.bukkit.command.ConsoleCommandSender} * diff --git a/src/main/java/com/gmail/nossr50/chat/author/ConsoleAuthor.java b/src/main/java/com/gmail/nossr50/chat/author/ConsoleAuthor.java index 662fce3e5..7c48cfba3 100644 --- a/src/main/java/com/gmail/nossr50/chat/author/ConsoleAuthor.java +++ b/src/main/java/com/gmail/nossr50/chat/author/ConsoleAuthor.java @@ -7,7 +7,7 @@ import java.util.UUID; public class ConsoleAuthor implements Author { private final UUID uuid; - private @NotNull String name; + private final @NotNull String name; public ConsoleAuthor(@NotNull String name) { this.name = name; @@ -19,11 +19,6 @@ public class ConsoleAuthor implements Author { return name; } - @Override - public void setName(@NotNull String newName) { - this.name = newName; - } - @Override public boolean isConsole() { return true; diff --git a/src/main/java/com/gmail/nossr50/chat/author/PartyAuthor.java b/src/main/java/com/gmail/nossr50/chat/author/PartyAuthor.java index c3f3c3f22..3100d1f91 100644 --- a/src/main/java/com/gmail/nossr50/chat/author/PartyAuthor.java +++ b/src/main/java/com/gmail/nossr50/chat/author/PartyAuthor.java @@ -1,6 +1,7 @@ package com.gmail.nossr50.chat.author; import com.gmail.nossr50.config.Config; +import com.google.common.base.Objects; import org.bukkit.entity.Player; import org.checkerframework.checker.nullness.qual.NonNull; import org.jetbrains.annotations.NotNull; @@ -30,7 +31,10 @@ public class PartyAuthor implements Author { } } - @Override + /** + * Set the name of this author + * @param newName value of the new name + */ public void setName(@NotNull String newName) { overrideName = newName; } @@ -45,8 +49,26 @@ public class PartyAuthor implements Author { return true; } + public 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; + PartyAuthor that = (PartyAuthor) o; + return Objects.equal(player, that.player) && + Objects.equal(overrideName, that.overrideName); + } + + @Override + public int hashCode() { + return Objects.hashCode(player, overrideName); + } } diff --git a/src/main/java/com/gmail/nossr50/chat/message/AbstractChatMessage.java b/src/main/java/com/gmail/nossr50/chat/message/AbstractChatMessage.java index e83b5df8d..5e965140c 100644 --- a/src/main/java/com/gmail/nossr50/chat/message/AbstractChatMessage.java +++ b/src/main/java/com/gmail/nossr50/chat/message/AbstractChatMessage.java @@ -1,6 +1,7 @@ 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; @@ -56,4 +57,21 @@ public abstract class AbstractChatMessage implements ChatMessage { 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/PartyChatMessage.java b/src/main/java/com/gmail/nossr50/chat/message/PartyChatMessage.java index a055a8953..ecf593c11 100644 --- a/src/main/java/com/gmail/nossr50/chat/message/PartyChatMessage.java +++ b/src/main/java/com/gmail/nossr50/chat/message/PartyChatMessage.java @@ -3,8 +3,10 @@ package com.gmail.nossr50.chat.message; import com.gmail.nossr50.chat.author.Author; 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.Component; import net.kyori.adventure.text.TextComponent; @@ -31,18 +33,28 @@ public class PartyChatMessage extends AbstractChatMessage { @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 = Component.text(LocaleLoader.getString("Chat.Spy.Party", author.getAuthoredName(), rawMessage, party.getName())); //Relay to spies - TextComponent textComponent = Component.text("[" + getParty().getName() + "] ->" ).append(getChatMessage()); - relayChatToSpies(textComponent); + 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 relayChatToSpies(@NotNull TextComponent spyMessage) { + private void messagePartyChatSpies(@NotNull TextComponent spyMessage) { //Find the people with permissions for(McMMOPlayer mcMMOPlayer : UserManager.getPlayers()) { Player player = mcMMOPlayer.getPlayer(); @@ -60,4 +72,18 @@ public class PartyChatMessage extends AbstractChatMessage { } } } + + @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/chat/AdminChatCommand.java b/src/main/java/com/gmail/nossr50/commands/chat/AdminChatCommand.java index 6ff82c500..26b4f2dad 100644 --- a/src/main/java/com/gmail/nossr50/commands/chat/AdminChatCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/chat/AdminChatCommand.java @@ -12,7 +12,7 @@ import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.player.UserManager; import org.jetbrains.annotations.NotNull; -@CommandAlias("a|adminchat") //Kept for historical reasons +@CommandAlias("a|adminchat|achat") //Kept for historical reasons public class AdminChatCommand extends BaseCommand { private final @NotNull mcMMO pluginRef; 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 dc43b3dbc..62c23dc49 100644 --- a/src/main/java/com/gmail/nossr50/commands/chat/PartyChatCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/chat/PartyChatCommand.java @@ -11,11 +11,12 @@ import com.gmail.nossr50.datatypes.party.Party; import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.party.PartyManager; +import com.gmail.nossr50.util.StringUtils; import com.gmail.nossr50.util.player.UserManager; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; -@CommandAlias("p|partychat") //Kept for historical reasons +@CommandAlias("p|partychat|pchat") //Kept for historical reasons public class PartyChatCommand extends BaseCommand { private final @NotNull mcMMO pluginRef; @@ -78,7 +79,7 @@ public class PartyChatCommand extends BaseCommand { Party targetParty = PartyManager.getParty(args[0]); if(targetParty != null) { - pluginRef.getChatManager().processConsoleMessage(args, targetParty); + pluginRef.getChatManager().processConsoleMessage(StringUtils.buildStringAfterNthElement(args, 1), targetParty); } else { mcMMO.p.getLogger().severe("A party with that name doesn't exist!"); } 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..a4b68c878 100644 --- a/src/main/java/com/gmail/nossr50/skills/archery/ArcheryManager.java +++ b/src/main/java/com/gmail/nossr50/skills/archery/ArcheryManager.java @@ -50,14 +50,14 @@ 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(mcMMO.arrowDistanceKey)) + return arrow.getLocation().distance(target.getLocation()); - Location firedLocation = (Location) damager.getMetadata(mcMMO.arrowDistanceKey).get(0).value(); + Location firedLocation = (Location) arrow.getMetadata(mcMMO.arrowDistanceKey).get(0).value(); Location targetLocation = target.getLocation(); if (firedLocation.getWorld() != targetLocation.getWorld()) { diff --git a/src/main/java/com/gmail/nossr50/util/StringUtils.java b/src/main/java/com/gmail/nossr50/util/StringUtils.java index 1b90467bb..ba0b9cdc2 100644 --- a/src/main/java/com/gmail/nossr50/util/StringUtils.java +++ b/src/main/java/com/gmail/nossr50/util/StringUtils.java @@ -6,6 +6,7 @@ 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.util.Locale; @@ -22,6 +23,25 @@ public class StringUtils { return target.substring(0, 1).toUpperCase() + target.substring(1).toLowerCase(Locale.ENGLISH); } + /** + * 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/resources/locale/locale_en_US.properties b/src/main/resources/locale/locale_en_US.properties index a6387bc57..3a2534c3f 100644 --- a/src/main/resources/locale/locale_en_US.properties +++ b/src/main/resources/locale/locale_en_US.properties @@ -1117,8 +1117,10 @@ Commands.Description.mmocompat=Information about mcMMO and whether or not its in 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. -Chat.Style.Admin=&b[&f{0}&b] {1} -Chat.Style.Party=&a[&6{0}&a] {1} -Chat.Identity.Console=* Console * +#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.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. \ No newline at end of file +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} \ No newline at end of file From 3169cf9225b612c33dfc4d4c68174d67594bb549 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 27 Oct 2020 13:19:00 -0700 Subject: [PATCH 188/662] 2.1.150 --- Changelog.txt | 14 ++++++++------ pom.xml | 2 +- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 4164eaa87..8ffc50133 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,20 +1,20 @@ Version 2.1.150 - mcMMO should now be compatible with 1.16.4's new social features - mcMMO Party & Admin Chat have had a rewrite, work was put in to make sure their API would be mostly compatible with the old one + 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 recieve when they toggle on or off admin or party chat - All locale files have had [[]] color codes replaced by & color codes, you can still use [[GOLD]] and stuff if you want - 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. + 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.Channel.On' Added new locale entry 'Chat.Channel.Off' - Fixed an ArrayIndexOutOfBounds exception when using /skillreset (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) @@ -23,6 +23,8 @@ Version 2.1.150 (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. diff --git a/pom.xml b/pom.xml index eafcc27c0..48719cb44 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.150-SNAPSHOT + 2.1.150 mcMMO https://github.com/mcMMO-Dev/mcMMO From 81bf0935e16a84bd472e2cedd40e9349a4c26d24 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 27 Oct 2020 13:35:01 -0700 Subject: [PATCH 189/662] changelog tweaks --- Changelog.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/Changelog.txt b/Changelog.txt index 8ffc50133..8b96da7b8 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -13,6 +13,7 @@ Version 2.1.150 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 From 8aff13895431c1bc86123343b3321050ae798bfc Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 27 Oct 2020 13:37:08 -0700 Subject: [PATCH 190/662] import cleanup --- .../nossr50/chat/mailer/AdminChatMailer.java | 3 --- .../skills/salvage/SalvageManager.java | 25 +++++++++---------- .../SimpleSalvageableManager.java | 6 ++--- 3 files changed, 15 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/chat/mailer/AdminChatMailer.java b/src/main/java/com/gmail/nossr50/chat/mailer/AdminChatMailer.java index 43bc0557f..c627876ee 100644 --- a/src/main/java/com/gmail/nossr50/chat/mailer/AdminChatMailer.java +++ b/src/main/java/com/gmail/nossr50/chat/mailer/AdminChatMailer.java @@ -1,6 +1,5 @@ package com.gmail.nossr50.chat.mailer; -import com.gmail.nossr50.chat.author.AdminAuthor; import com.gmail.nossr50.chat.author.Author; import com.gmail.nossr50.chat.message.AdminChatMessage; import com.gmail.nossr50.chat.message.ChatMessage; @@ -8,14 +7,12 @@ 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.Permissions; import net.kyori.adventure.audience.Audience; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.TextComponent; import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; import org.bukkit.command.ConsoleCommandSender; -import org.bukkit.entity.Player; import org.bukkit.plugin.Plugin; import org.jetbrains.annotations.NotNull; 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 161eaa84a..f67af3963 100644 --- a/src/main/java/com/gmail/nossr50/skills/salvage/SalvageManager.java +++ b/src/main/java/com/gmail/nossr50/skills/salvage/SalvageManager.java @@ -1,18 +1,5 @@ package com.gmail.nossr50.skills.salvage; -import java.util.Map; -import java.util.Map.Entry; - -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 com.gmail.nossr50.mcMMO; import com.gmail.nossr50.config.AdvancedConfig; import com.gmail.nossr50.config.Config; import com.gmail.nossr50.config.experience.ExperienceConfig; @@ -21,6 +8,7 @@ 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.SkillManager; import com.gmail.nossr50.skills.salvage.salvageables.Salvageable; import com.gmail.nossr50.util.EventUtils; @@ -34,6 +22,17 @@ 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.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; public class SalvageManager extends SkillManager { private boolean placedAnvil; 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 0262ca768..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 @@ -1,12 +1,12 @@ package com.gmail.nossr50.skills.salvage.salvageables; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; + import java.util.HashMap; import java.util.List; import java.util.Map; -import org.bukkit.Material; -import org.bukkit.inventory.ItemStack; - public class SimpleSalvageableManager implements SalvageableManager { private final Map salvageables; From ca93dc02df5340e045b4b3d9c0de205ef0e8231a Mon Sep 17 00:00:00 2001 From: nossr50 Date: Wed, 28 Oct 2020 10:53:47 -0700 Subject: [PATCH 191/662] Fix missing party chat permission node check --- Changelog.txt | 3 +++ pom.xml | 2 +- src/main/java/com/gmail/nossr50/chat/ChatManager.java | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 8b96da7b8..abc246fbb 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,6 @@ +Version 2.1.151 + Fixed a bug where players could chat to party chat without the party chat permission + 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. diff --git a/pom.xml b/pom.xml index 48719cb44..fc6fc4248 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.150 + 2.1.151-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO diff --git a/src/main/java/com/gmail/nossr50/chat/ChatManager.java b/src/main/java/com/gmail/nossr50/chat/ChatManager.java index e162cb6c8..f993d8da0 100644 --- a/src/main/java/com/gmail/nossr50/chat/ChatManager.java +++ b/src/main/java/com/gmail/nossr50/chat/ChatManager.java @@ -159,7 +159,7 @@ public class ChatManager { } break; case PARTY: - if(mmoPlayer.getParty() != null) { + if(mmoPlayer.getParty() != null && Permissions.partyChat(mmoPlayer.getPlayer())) { return true; } break; From 4bac5862538bbc0a13478393a862de952dee8801 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 29 Oct 2020 12:20:52 -0700 Subject: [PATCH 192/662] Add missing party chat permission check to the party chat command --- .../com/gmail/nossr50/commands/CommandManager.java | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/commands/CommandManager.java b/src/main/java/com/gmail/nossr50/commands/CommandManager.java index 6527eddff..0b07e54c7 100644 --- a/src/main/java/com/gmail/nossr50/commands/CommandManager.java +++ b/src/main/java/com/gmail/nossr50/commands/CommandManager.java @@ -11,6 +11,7 @@ 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; /* @@ -32,6 +33,11 @@ public class CommandManager { registerCommands(); } + private void registerCommands() { + bukkitCommandManager.registerCommand(new AdminChatCommand(pluginRef)); + bukkitCommandManager.registerCommand(new PartyChatCommand(pluginRef)); + } + public void registerConditions() { // Method or Class based - Can only be used on methods bukkitCommandManager.getCommandConditions().addCondition(ADMIN_CONDITION, (context) -> { @@ -56,13 +62,15 @@ public class CommandManager { if(bukkitCommandIssuer.getIssuer() instanceof Player) { validateLoadedData(bukkitCommandIssuer.getPlayer()); validatePlayerParty(bukkitCommandIssuer.getPlayer()); + validatePermission("mcmmo.chat.partychat", bukkitCommandIssuer.getPlayer()); } }); } - private void registerCommands() { - bukkitCommandManager.registerCommand(new AdminChatCommand(pluginRef)); - bukkitCommandManager.registerCommand(new PartyChatCommand(pluginRef)); + private void validatePermission(@NotNull String permissionNode, @NotNull Permissible permissible) { + if(!permissible.hasPermission(permissionNode)) { + throw new ConditionFailedException("You do not have the appropriate permission to use this command."); + } } From 8856d2b071eb0f76e8e9380a80d2c1f5423444d8 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 29 Oct 2020 13:06:22 -0700 Subject: [PATCH 193/662] move chat config options from config.yml -> chat.yml --- Changelog.txt | 10 +++- .../com/gmail/nossr50/chat/ChatManager.java | 39 ++++++++++++++ .../nossr50/chat/author/AdminAuthor.java | 5 +- .../nossr50/chat/author/PartyAuthor.java | 5 +- .../nossr50/commands/CommandManager.java | 25 +++++++-- .../com/gmail/nossr50/config/ChatConfig.java | 51 +++++++++++++++++++ .../java/com/gmail/nossr50/config/Config.java | 7 --- .../gmail/nossr50/datatypes/party/Party.java | 4 +- .../runnables/party/PartyChatTask.java | 50 ------------------ src/main/resources/chat.yml | 20 ++++++++ src/main/resources/config.yml | 7 --- 11 files changed, 148 insertions(+), 75 deletions(-) create mode 100644 src/main/java/com/gmail/nossr50/config/ChatConfig.java delete mode 100644 src/main/java/com/gmail/nossr50/runnables/party/PartyChatTask.java create mode 100644 src/main/resources/chat.yml diff --git a/Changelog.txt b/Changelog.txt index abc246fbb..3a323c230 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,5 +1,13 @@ Version 2.1.151 - Fixed a bug where players could chat to party chat without the party chat permission + Fixed a bug where players could use the party chat command without the party chat permission + Added new config 'chat.yml' + All chat settings that used to be in 'config.yml' are now in 'chat.yml' + + NOTES: + 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. + 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 Version 2.1.150 Fixed an ArrayIndexOutOfBounds exception when using /skillreset diff --git a/src/main/java/com/gmail/nossr50/chat/ChatManager.java b/src/main/java/com/gmail/nossr50/chat/ChatManager.java index f993d8da0..a15f1cc9f 100644 --- a/src/main/java/com/gmail/nossr50/chat/ChatManager.java +++ b/src/main/java/com/gmail/nossr50/chat/ChatManager.java @@ -4,6 +4,7 @@ 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; @@ -25,12 +26,15 @@ public class ChatManager { 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(); } /** @@ -179,5 +183,40 @@ public class ChatManager { 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; + } + } + } } diff --git a/src/main/java/com/gmail/nossr50/chat/author/AdminAuthor.java b/src/main/java/com/gmail/nossr50/chat/author/AdminAuthor.java index f5680872c..e4b26f8c2 100644 --- a/src/main/java/com/gmail/nossr50/chat/author/AdminAuthor.java +++ b/src/main/java/com/gmail/nossr50/chat/author/AdminAuthor.java @@ -1,6 +1,7 @@ package com.gmail.nossr50.chat.author; -import com.gmail.nossr50.config.Config; +import com.gmail.nossr50.config.ChatConfig; +import com.gmail.nossr50.datatypes.chat.ChatChannel; import com.google.common.base.Objects; import org.bukkit.entity.Player; import org.checkerframework.checker.nullness.qual.NonNull; @@ -23,7 +24,7 @@ public class AdminAuthor implements Author { if(overrideName != null) { return overrideName; } else { - if(Config.getInstance().getAdminDisplayNames()) { + if(ChatConfig.getInstance().useDisplayNames(ChatChannel.ADMIN)) { return player.getDisplayName(); } else { return player.getName(); diff --git a/src/main/java/com/gmail/nossr50/chat/author/PartyAuthor.java b/src/main/java/com/gmail/nossr50/chat/author/PartyAuthor.java index 3100d1f91..3a821018c 100644 --- a/src/main/java/com/gmail/nossr50/chat/author/PartyAuthor.java +++ b/src/main/java/com/gmail/nossr50/chat/author/PartyAuthor.java @@ -1,6 +1,7 @@ package com.gmail.nossr50.chat.author; -import com.gmail.nossr50.config.Config; +import com.gmail.nossr50.config.ChatConfig; +import com.gmail.nossr50.datatypes.chat.ChatChannel; import com.google.common.base.Objects; import org.bukkit.entity.Player; import org.checkerframework.checker.nullness.qual.NonNull; @@ -23,7 +24,7 @@ public class PartyAuthor implements Author { if(overrideName != null) { return overrideName; } else { - if(Config.getInstance().getPartyDisplayNames()) { + if(ChatConfig.getInstance().useDisplayNames(ChatChannel.PARTY)) { return player.getDisplayName(); } else { return player.getName(); diff --git a/src/main/java/com/gmail/nossr50/commands/CommandManager.java b/src/main/java/com/gmail/nossr50/commands/CommandManager.java index 0b07e54c7..7182744b2 100644 --- a/src/main/java/com/gmail/nossr50/commands/CommandManager.java +++ b/src/main/java/com/gmail/nossr50/commands/CommandManager.java @@ -5,6 +5,8 @@ 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; @@ -18,9 +20,9 @@ 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 String ADMIN_CONDITION = "adminCondition"; - public static final String PARTY_CONDITION = "partyCondition"; - public static final String MMO_DATA_LOADED = "mmoDataLoaded"; + 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; @@ -34,8 +36,21 @@ public class CommandManager { } private void registerCommands() { - bukkitCommandManager.registerCommand(new AdminChatCommand(pluginRef)); - bukkitCommandManager.registerCommand(new PartyChatCommand(pluginRef)); + 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() { 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..f8d117288 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/config/ChatConfig.java @@ -0,0 +1,51 @@ +package com.gmail.nossr50.config; + +import com.gmail.nossr50.datatypes.chat.ChatChannel; +import com.gmail.nossr50.util.StringUtils; +import org.jetbrains.annotations.NotNull; + +public class ChatConfig extends AutoUpdateConfigLoader { + private static ChatConfig instance; + + private ChatConfig() { + super("chat.yml"); + validate(); + } + + public static ChatConfig getInstance() { + if (instance == null) { + instance = new ChatConfig(); + } + + return instance; + } + + @Override + protected void loadKeys() { + //Sigh this old config system... + } + + @Override + protected boolean validateKeys() { + return true; + } + + public boolean isChatEnabled() { + return config.getBoolean("Chat.Enable", true); + } + + public boolean isChatChannelEnabled(@NotNull ChatChannel chatChannel) { + String key = "Chat.Channels." + StringUtils.getCapitalized(chatChannel.toString()) + ".Enabled"; + 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); + } +} \ 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 index fa8c875dc..1ab532744 100644 --- a/src/main/java/com/gmail/nossr50/config/Config.java +++ b/src/main/java/com/gmail/nossr50/config/Config.java @@ -259,13 +259,6 @@ public class Config extends AutoUpdateConfigLoader { 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); } 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 d15d525a9..9943d149e 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/party/Party.java +++ b/src/main/java/com/gmail/nossr50/datatypes/party/Party.java @@ -1,8 +1,10 @@ package com.gmail.nossr50.datatypes.party; import com.gmail.nossr50.chat.SamePartyPredicate; +import com.gmail.nossr50.config.ChatConfig; import com.gmail.nossr50.config.Config; import com.gmail.nossr50.config.experience.ExperienceConfig; +import com.gmail.nossr50.datatypes.chat.ChatChannel; import com.gmail.nossr50.datatypes.experience.FormulaType; import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.locale.LocaleLoader; @@ -403,7 +405,7 @@ public class Party { List nearbyPlayerList = getNearMembers(UserManager.getPlayer(player)); - boolean useDisplayNames = Config.getInstance().getPartyDisplayNames(); + boolean useDisplayNames = ChatConfig.getInstance().useDisplayNames(ChatChannel.PARTY); if(isPartyLeaderOfflineOrHidden) { 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 aca2d25e1..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 final Plugin plugin; - - private final Party party; - private final String senderName; - private final 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/resources/chat.yml b/src/main/resources/chat.yml new file mode 100644 index 000000000..0aa86c7b6 --- /dev/null +++ b/src/main/resources/chat.yml @@ -0,0 +1,20 @@ +# 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 + Admin: + # Enable or disable party 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 customizeable. +# 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 5ac02a3c4..b9e299eeb 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -575,13 +575,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 From 449407439a88406a263699d7778c7338a4417775 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 29 Oct 2020 13:12:26 -0700 Subject: [PATCH 194/662] Added 'Chat.Channels.Party.Spies.Automatically_Enable_Spying' which allows chat spys to join servers with spying toggled on instead of off its a QOL feature for people who are always spying on chat --- Changelog.txt | 1 + src/main/java/com/gmail/nossr50/chat/ChatManager.java | 3 +-- src/main/java/com/gmail/nossr50/config/ChatConfig.java | 5 +++++ .../java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java | 5 +++++ src/main/resources/chat.yml | 3 +++ 5 files changed, 15 insertions(+), 2 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 3a323c230..e6acfb699 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,6 +1,7 @@ Version 2.1.151 Fixed a bug where players could use the party chat command without the party chat permission Added new config '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' NOTES: diff --git a/src/main/java/com/gmail/nossr50/chat/ChatManager.java b/src/main/java/com/gmail/nossr50/chat/ChatManager.java index a15f1cc9f..8dee40de3 100644 --- a/src/main/java/com/gmail/nossr50/chat/ChatManager.java +++ b/src/main/java/com/gmail/nossr50/chat/ChatManager.java @@ -218,5 +218,4 @@ public class ChatManager { } } } -} - +} \ 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 index f8d117288..27e57930d 100644 --- a/src/main/java/com/gmail/nossr50/config/ChatConfig.java +++ b/src/main/java/com/gmail/nossr50/config/ChatConfig.java @@ -48,4 +48,9 @@ public class ChatConfig extends AutoUpdateConfigLoader { 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/datatypes/player/McMMOPlayer.java b/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java index e5f38f706..1223c9083 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java +++ b/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java @@ -3,6 +3,7 @@ package com.gmail.nossr50.datatypes.player; import com.gmail.nossr50.chat.author.AdminAuthor; import com.gmail.nossr50.chat.author.PartyAuthor; import com.gmail.nossr50.config.AdvancedConfig; +import com.gmail.nossr50.config.ChatConfig; import com.gmail.nossr50.config.Config; import com.gmail.nossr50.config.WorldBlacklist; import com.gmail.nossr50.config.experience.ExperienceConfig; @@ -161,6 +162,10 @@ public class McMMOPlayer implements Identified { this.partyAuthor = new PartyAuthor(player); this.chatChannel = ChatChannel.NONE; + + if(ChatConfig.getInstance().isSpyingAutomatic() && Permissions.adminChatSpy(getPlayer())) { + chatSpy = true; + } } public String getPlayerName() { diff --git a/src/main/resources/chat.yml b/src/main/resources/chat.yml index 0aa86c7b6..b9f180922 100644 --- a/src/main/resources/chat.yml +++ b/src/main/resources/chat.yml @@ -8,6 +8,9 @@ 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 party chat Enable: true From c6ecf30d1f1913abdbc1d8bd06db995e86c4da40 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 29 Oct 2020 13:54:12 -0700 Subject: [PATCH 195/662] new party member list format/style --- Changelog.txt | 2 + .../com/gmail/nossr50/chat/ChatManager.java | 1 - .../gmail/nossr50/datatypes/party/Party.java | 160 +++--------------- .../nossr50/listeners/PlayerListener.java | 19 ++- 4 files changed, 36 insertions(+), 146 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index e6acfb699..8b5d99cb0 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -3,8 +3,10 @@ Version 2.1.151 Added new config '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 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 T&C. 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. I hate adding more config files using the old .yml system, but the config update is a ways out and this works for now. diff --git a/src/main/java/com/gmail/nossr50/chat/ChatManager.java b/src/main/java/com/gmail/nossr50/chat/ChatManager.java index 8dee40de3..eb53cc07d 100644 --- a/src/main/java/com/gmail/nossr50/chat/ChatManager.java +++ b/src/main/java/com/gmail/nossr50/chat/ChatManager.java @@ -206,7 +206,6 @@ public class ChatManager { return false; } else { switch(chatChannel) { - case ADMIN: case PARTY: case PARTY_OFFICER: 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 9943d149e..90442617f 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/party/Party.java +++ b/src/main/java/com/gmail/nossr50/datatypes/party/Party.java @@ -1,5 +1,6 @@ package com.gmail.nossr50.datatypes.party; +import com.gmail.nossr50.chat.ChatManager; import com.gmail.nossr50.chat.SamePartyPredicate; import com.gmail.nossr50.config.ChatConfig; import com.gmail.nossr50.config.Config; @@ -17,17 +18,14 @@ 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.*; import java.util.function.Predicate; -import java.util.stream.Collectors; public class Party { private final @NotNull Predicate samePartyPredicate; @@ -353,146 +351,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()); - - 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) - || onlinePlayer != null && player.canSee(onlinePlayer)) - { - visiblePartyList.add(onlineMember); + for(UUID playerUUID : members.keySet()) { + OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(playerUUID); + if(offlinePlayer.isOnline() && player.canSee((Player) offlinePlayer)) { + coloredNames.add(ChatColor.GREEN + 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 + offlinePlayer.getName()); } } - 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 = ChatConfig.getInstance().useDisplayNames(ChatChannel.PARTY); - - 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 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(names[i]) + .append(" "); + } + } + } + private boolean isNotSamePerson(UUID onlinePlayerUUID, UUID uniqueId) { return onlinePlayerUUID != uniqueId; } diff --git a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java index dfd547891..1d6726045 100644 --- a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java @@ -1,5 +1,6 @@ package com.gmail.nossr50.listeners; +import com.gmail.nossr50.config.ChatConfig; import com.gmail.nossr50.config.Config; import com.gmail.nossr50.config.WorldBlacklist; import com.gmail.nossr50.config.experience.ExperienceConfig; @@ -892,14 +893,16 @@ public class PlayerListener implements Listener { return; } - 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()); + 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()); + } } } } From 4e8f49db5b9d3c1356b1c07874d0c83b4a231ada Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 29 Oct 2020 14:06:34 -0700 Subject: [PATCH 196/662] avoid null party names --- Changelog.txt | 2 +- .../gmail/nossr50/datatypes/party/Party.java | 38 +------------------ 2 files changed, 3 insertions(+), 37 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 8b5d99cb0..ac166a579 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,9 +1,9 @@ Version 2.1.151 - Fixed a bug where players could use the party chat command without the party chat permission Added new config '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 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 T&C. 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 90442617f..c0c1d2f87 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/party/Party.java +++ b/src/main/java/com/gmail/nossr50/datatypes/party/Party.java @@ -1,11 +1,8 @@ package com.gmail.nossr50.datatypes.party; -import com.gmail.nossr50.chat.ChatManager; import com.gmail.nossr50.chat.SamePartyPredicate; -import com.gmail.nossr50.config.ChatConfig; import com.gmail.nossr50.config.Config; import com.gmail.nossr50.config.experience.ExperienceConfig; -import com.gmail.nossr50.datatypes.chat.ChatChannel; import com.gmail.nossr50.datatypes.experience.FormulaType; import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.locale.LocaleLoader; @@ -13,7 +10,6 @@ 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; @@ -29,12 +25,6 @@ import java.util.function.Predicate; public class Party { private final @NotNull Predicate samePartyPredicate; -// 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<>(); @@ -355,10 +345,11 @@ public class Party { for(UUID playerUUID : members.keySet()) { OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(playerUUID); + if(offlinePlayer.isOnline() && player.canSee((Player) offlinePlayer)) { coloredNames.add(ChatColor.GREEN + offlinePlayer.getName()); } else { - coloredNames.add(ChatColor.DARK_GRAY + offlinePlayer.getName()); + coloredNames.add(ChatColor.DARK_GRAY + members.get(playerUUID)); } } @@ -379,31 +370,6 @@ public class Party { } } - 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); - } else { - stringBuilder.append(ChatColor.GRAY); - } - -// stringBuilder.append(ChatColor.BOLD); - stringBuilder.append(ONLINE_PLAYER_PREFIX); - } else { - stringBuilder.append(ChatColor.GRAY); - stringBuilder.append(OFFLINE_PLAYER_PREFIX); - } - - stringBuilder.append(ChatColor.RESET); - } - /** * Get the near party members. * From 1f02d9a5a09f00cfb9f7e412164c6df6ce796dfd Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 29 Oct 2020 14:13:39 -0700 Subject: [PATCH 197/662] online leaders will be gold --- src/main/java/com/gmail/nossr50/datatypes/party/Party.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 c0c1d2f87..0b557312b 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/party/Party.java +++ b/src/main/java/com/gmail/nossr50/datatypes/party/Party.java @@ -347,7 +347,8 @@ public class Party { OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(playerUUID); if(offlinePlayer.isOnline() && player.canSee((Player) offlinePlayer)) { - coloredNames.add(ChatColor.GREEN + offlinePlayer.getName()); + ChatColor onlineColor = leader.getUniqueId() == playerUUID ? ChatColor.GOLD : ChatColor.GREEN; + coloredNames.add(onlineColor + offlinePlayer.getName()); } else { coloredNames.add(ChatColor.DARK_GRAY + members.get(playerUUID)); } From 5a8e607a393328bebc38543f9cd606fdf90319ac Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 29 Oct 2020 14:30:29 -0700 Subject: [PATCH 198/662] party leader has unique chat style --- Changelog.txt | 1 + .../java/com/gmail/nossr50/chat/ChatManager.java | 8 ++++++-- .../gmail/nossr50/chat/mailer/PartyChatMailer.java | 12 ++++++++---- .../com/gmail/nossr50/datatypes/party/Party.java | 7 +++++-- .../com/gmail/nossr50/listeners/PlayerListener.java | 1 - src/main/resources/locale/locale_en_US.properties | 1 + 6 files changed, 21 insertions(+), 9 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index ac166a579..8ccf22ee6 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -4,6 +4,7 @@ Version 2.1.151 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 + Added 'Chat.Style.Party.Leader' which is the chat style the party leader uses when communicating to the party 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 T&C. diff --git a/src/main/java/com/gmail/nossr50/chat/ChatManager.java b/src/main/java/com/gmail/nossr50/chat/ChatManager.java index eb53cc07d..826521e5d 100644 --- a/src/main/java/com/gmail/nossr50/chat/ChatManager.java +++ b/src/main/java/com/gmail/nossr50/chat/ChatManager.java @@ -73,7 +73,7 @@ public class ChatManager { adminChatMailer.processChatMessage(mmoPlayer.getAdminAuthor(), rawMessage, isAsync, Permissions.colorChat(mmoPlayer.getPlayer())); break; case PARTY: - partyChatMailer.processChatMessage(mmoPlayer.getPartyAuthor(), rawMessage, mmoPlayer.getParty(), isAsync, Permissions.colorChat(mmoPlayer.getPlayer())); + partyChatMailer.processChatMessage(mmoPlayer.getPartyAuthor(), rawMessage, mmoPlayer.getParty(), isAsync, Permissions.colorChat(mmoPlayer.getPlayer()), isPartyLeader(mmoPlayer)); break; case PARTY_OFFICER: case NONE: @@ -81,6 +81,10 @@ public class ChatManager { } } + private boolean isPartyLeader(@NotNull McMMOPlayer mmoPlayer) { + return mmoPlayer.getParty().getLeader().getUniqueId().equals(mmoPlayer.getPlayer().getUniqueId()); + } + /** * Handles console messaging to admins * @param rawMessage raw message from the console @@ -103,7 +107,7 @@ public class ChatManager { * @param party target party */ public void processConsoleMessage(@NotNull String rawMessage, @NotNull Party party) { - partyChatMailer.processChatMessage(getConsoleAuthor(), rawMessage, party, false, true); + partyChatMailer.processChatMessage(getConsoleAuthor(), rawMessage, party, false, true, false); } /** diff --git a/src/main/java/com/gmail/nossr50/chat/mailer/PartyChatMailer.java b/src/main/java/com/gmail/nossr50/chat/mailer/PartyChatMailer.java index 9bcb5de4c..3e7d19cc4 100644 --- a/src/main/java/com/gmail/nossr50/chat/mailer/PartyChatMailer.java +++ b/src/main/java/com/gmail/nossr50/chat/mailer/PartyChatMailer.java @@ -21,8 +21,8 @@ public class PartyChatMailer extends AbstractChatMailer { super(pluginRef); } - public void processChatMessage(@NotNull Author author, @NotNull String rawString, @NotNull Party party, boolean isAsync, boolean canColor) { - PartyChatMessage chatMessage = new PartyChatMessage(pluginRef, author, constructPartyAudience(party), rawString, addStyle(author, rawString, canColor), party); + 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); @@ -43,9 +43,13 @@ public class PartyChatMailer extends AbstractChatMailer { * @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) { + public @NotNull TextComponent addStyle(@NotNull Author author, @NotNull String message, boolean canColor, boolean isLeader) { if(canColor) { - return Component.text(LocaleLoader.getString("Chat.Style.Party", author.getAuthoredName(), LocaleLoader.addColors(message))); + message = LocaleLoader.addColors(message); + } + + if(isLeader) { + return Component.text(LocaleLoader.getString("Chat.Style.Party.Leader", author.getAuthoredName(), message)); } else { return Component.text(LocaleLoader.getString("Chat.Style.Party", author.getAuthoredName(), message)); } 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 0b557312b..f185f24e5 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/party/Party.java +++ b/src/main/java/com/gmail/nossr50/datatypes/party/Party.java @@ -20,7 +20,10 @@ import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; import java.text.DecimalFormat; -import java.util.*; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.UUID; import java.util.function.Predicate; public class Party { @@ -347,7 +350,7 @@ public class Party { OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(playerUUID); if(offlinePlayer.isOnline() && player.canSee((Player) offlinePlayer)) { - ChatColor onlineColor = leader.getUniqueId() == playerUUID ? ChatColor.GOLD : ChatColor.GREEN; + ChatColor onlineColor = leader.getUniqueId().equals(playerUUID) ? ChatColor.GOLD : ChatColor.GREEN; coloredNames.add(onlineColor + offlinePlayer.getName()); } else { coloredNames.add(ChatColor.DARK_GRAY + members.get(playerUUID)); diff --git a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java index 1d6726045..1aa393a22 100644 --- a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java @@ -1,6 +1,5 @@ package com.gmail.nossr50.listeners; -import com.gmail.nossr50.config.ChatConfig; import com.gmail.nossr50.config.Config; import com.gmail.nossr50.config.WorldBlacklist; import com.gmail.nossr50.config.experience.ExperienceConfig; diff --git a/src/main/resources/locale/locale_en_US.properties b/src/main/resources/locale/locale_en_US.properties index 3a2534c3f..ee91cfcca 100644 --- a/src/main/resources/locale/locale_en_US.properties +++ b/src/main/resources/locale/locale_en_US.properties @@ -1120,6 +1120,7 @@ Commands.XPBar.DisableAll=&6 All mcMMO XP bars are now disabled, use /mmoxpbar r #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. From bae9783123bc6a088a646e62d2d1f25547516954 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 29 Oct 2020 14:38:09 -0700 Subject: [PATCH 199/662] 2.1.151 --- Changelog.txt | 11 +++++++---- pom.xml | 2 +- src/main/resources/chat.yml | 2 +- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 8ccf22ee6..3ded13a63 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,17 +1,20 @@ Version 2.1.151 - Added new config 'chat.yml' + 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 - Added 'Chat.Style.Party.Leader' which is the chat style the party leader uses when communicating to the party + 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 T&C. + 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. + 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 diff --git a/pom.xml b/pom.xml index fc6fc4248..46e093bb6 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.151-SNAPSHOT + 2.1.151 mcMMO https://github.com/mcMMO-Dev/mcMMO diff --git a/src/main/resources/chat.yml b/src/main/resources/chat.yml index b9f180922..1c5a2da1f 100644 --- a/src/main/resources/chat.yml +++ b/src/main/resources/chat.yml @@ -17,7 +17,7 @@ Chat: # 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 customizeable. +# 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 From 523d10ef29527a3224efd98e1ee5f72b35e7076b Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 2 Nov 2020 11:30:18 -0800 Subject: [PATCH 200/662] dev mode 2.1.152-snapshot --- pom.xml | 2 +- .../nossr50/skills/woodcutting/WoodcuttingManager.java | 7 +------ 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/pom.xml b/pom.xml index 46e093bb6..6aa9ff0db 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.151 + 2.1.152-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO 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 cff867c9c..a9eba5cdb 100644 --- a/src/main/java/com/gmail/nossr50/skills/woodcutting/WoodcuttingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/woodcutting/WoodcuttingManager.java @@ -372,13 +372,8 @@ public class WoodcuttingManager extends SkillManager { * @param blockState Block being broken */ protected static void checkForDoubleDrop(BlockState blockState) { - if (mcMMO.getModManager().isCustomLog(blockState) && mcMMO.getModManager().getBlock(blockState).isDoubleDropEnabled()) { + if (Config.getInstance().getWoodcuttingDoubleDropsEnabled(blockState.getBlockData())) { Misc.dropItems(Misc.getBlockCenter(blockState), blockState.getBlock().getDrops()); } - else { - if (Config.getInstance().getWoodcuttingDoubleDropsEnabled(blockState.getBlockData())) { - Misc.dropItems(Misc.getBlockCenter(blockState), blockState.getBlock().getDrops()); - } - } } } From 9529bbf8980425153b01d40f6386e7b5ea184e00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20Marczink=C3=B3?= Date: Mon, 2 Nov 2020 20:56:24 +0100 Subject: [PATCH 201/662] Update locale_hu_HU.properties (#4322) * Update locale_hu_HU.properties --- src/main/resources/locale/locale_hu_HU.properties | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/main/resources/locale/locale_hu_HU.properties b/src/main/resources/locale/locale_hu_HU.properties index 9dd51d6c9..e561c8388 100644 --- a/src/main/resources/locale/locale_hu_HU.properties +++ b/src/main/resources/locale/locale_hu_HU.properties @@ -711,6 +711,7 @@ Commands.Usage.0=&cA helyes haszn\u00E1lat: /{0} Commands.Usage.1=&cA helyes haszn\u00E1lat: /{0} {1} Commands.Usage.2=&cA helyes haszn\u00E1lat: /{0} {1} {2} Commands.Usage.3=&cA helyes haszn\u00E1lat: /{0} {1} {2} {3} +Commands.Usage.3.XP=&cA helyes haszn\u00E1lat: /{0} {1} {2} {3}&7 (Ha be\u00EDrod a -s param\u00E9tert a parancs v\u00E9g\u00E9re, akkor a parancs \u00FAgy fut le, hogy j\u00E1t\u00E9kos nem kap r\u00F3la inform\u00E1ci\u00F3t, hat\u00E9k\u00E1nyan elrejtve ezt) Commands.Usage.FullClassName=classname Commands.Usage.Level=level Commands.Usage.Message=message @@ -1115,4 +1116,12 @@ Commands.Description.mmoxpbar=Player settings for mcMMO XP bars Commands.Description.mmocompat=Inform\u00E1ci\u00F3 az mcMMO-r\u00F3l \u00E9s arr\u00F3l, hogy kompatibilit\u00E1si m\u00F3dban van-e, vagy teljesen m\u0171k\u00F6d\u0151k\u00E9pes-e. Compatibility.Layer.Unsupported=&6A kompatibilit\u00E1s ezen a Minecraft verzi\u00F3n &a{0}&6 nem t\u00E1mogatott. Compatibility.Layer.PartialSupport=&6A kompatibilit\u00E1s ezen a Minecraft verzi\u00F3n &a{0}&6 nem teljesen t\u00E1mogatott, de az mcMMO egy m\u00E1sodlagos rendszert futtat n\u00E9h\u00E1ny hi\u00E1nyz\u00F3 funkci\u00F3 emul\u00E1l\u00E1s\u00E1ra. -Commands.XPBar.DisableAll=&6 Most az \u00F6sszes mcMMO XP s\u00E1v le van tiltva, haszn\u00E1ld a /mmoxpbar reset parancsot az alap\u00E9rtelmezett be\u00E1ll\u00EDt\u00E1sok vissza\u00E1ll\u00EDt\u00E1s\u00E1hoz. +Commands.XPBar.DisableAll=&6 Most az \u00F6sszes mcMMO XP s\u00E1v le van tiltva, haszn\u00E1ld a /mmoxpbar reset parancsot az alap\u00E9rtelmezett be\u00E1ll\u00EDt\u00E1sok vissza\u00E1ll\u00EDt\u00E1s\u00E1hoz. +#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* Konzol * +Chat.Channel.On=&6(&amcMMO-Chat&6) &eA chat \u00FCzeneteid mostant\u00F3l automatikusan a(z) &a{0}&e chat csatorn\u00E1ra ker\u00FClnek. +Chat.Channel.Off=&6(&amcMMO-Chat&6) &7A chat \u00FCzeneteid a tov\u00E1bbiakban nem ker\u00FClnek automatikusan a meghat\u00E1rozott chat csatorn\u00E1kra. +Chat.Spy.Party=&6[&eSPY&6-&a{2}&6] &r{0} &b\u2192 &r{1} From 65fba3e20ebd74d350a6d11d4e8fee1c6b2bde80 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 2 Nov 2020 13:51:43 -0800 Subject: [PATCH 202/662] Expanding McMMOItemSpawnEvent & Fixing a bug with Tree Feller drops --- Changelog.txt | 11 + .../gmail/nossr50/api/ItemSpawnReason.java | 17 + .../datatypes/skills/SuperAbilityType.java | 2 +- .../events/items/McMMOItemSpawnEvent.java | 26 +- .../nossr50/listeners/BlockListener.java | 22 +- .../gmail/nossr50/skills/archery/Archery.java | 6 +- .../skills/excavation/ExcavationManager.java | 3 +- .../skills/fishing/FishingManager.java | 5 +- .../skills/herbalism/HerbalismManager.java | 3 +- .../nossr50/skills/mining/MiningManager.java | 7 +- .../skills/salvage/SalvageManager.java | 5 +- .../skills/unarmed/UnarmedManager.java | 3 +- .../woodcutting/WoodcuttingManager.java | 76 ++--- .../com/gmail/nossr50/util/BlockUtils.java | 12 +- .../com/gmail/nossr50/util/EventUtils.java | 13 +- .../gmail/nossr50/util/MaterialMapStore.java | 313 ++++++++---------- .../java/com/gmail/nossr50/util/Misc.java | 74 +++-- .../com/gmail/nossr50/util/ModManager.java | 4 - 18 files changed, 318 insertions(+), 284 deletions(-) create mode 100644 src/main/java/com/gmail/nossr50/api/ItemSpawnReason.java diff --git a/Changelog.txt b/Changelog.txt index 3ded13a63..d9fc0899d 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,14 @@ +Version 2.1.152 + Updated hu_HU locale (thanks andris) + Fixed a bug where Tree Feller would sometimes double drop blocks inappropriately + Added some code to prevent a possible NPE when spawning items in a world that got unloaded + (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 + + NOTES: + I really should stop letting my OCD compel me to rewrite code all the time. + 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 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/datatypes/skills/SuperAbilityType.java b/src/main/java/com/gmail/nossr50/datatypes/skills/SuperAbilityType.java index 66c4957a9..dddb4bef5 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/skills/SuperAbilityType.java +++ b/src/main/java/com/gmail/nossr50/datatypes/skills/SuperAbilityType.java @@ -226,7 +226,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/events/items/McMMOItemSpawnEvent.java b/src/main/java/com/gmail/nossr50/events/items/McMMOItemSpawnEvent.java index 3bfb95532..a626ebf00 100644 --- a/src/main/java/com/gmail/nossr50/events/items/McMMOItemSpawnEvent.java +++ b/src/main/java/com/gmail/nossr50/events/items/McMMOItemSpawnEvent.java @@ -1,5 +1,6 @@ package com.gmail.nossr50.events.items; +import com.gmail.nossr50.api.ItemSpawnReason; import org.bukkit.Location; import org.bukkit.event.Cancellable; import org.bukkit.event.Event; @@ -14,38 +15,49 @@ public class McMMOItemSpawnEvent extends Event implements Cancellable { private Location location; private ItemStack itemStack; private boolean cancelled; + private final ItemSpawnReason itemSpawnReason; - public McMMOItemSpawnEvent(Location location, ItemStack itemStack) { + public McMMOItemSpawnEvent(@NotNull Location location, @NotNull ItemStack itemStack, @NotNull ItemSpawnReason itemSpawnReason) { this.location = location; this.itemStack = itemStack; + this.itemSpawnReason = itemSpawnReason; this.cancelled = false; } + /** + * 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; } @@ -61,14 +73,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 @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/listeners/BlockListener.java b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java index 94d038468..14b043e9f 100644 --- a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java @@ -1,5 +1,6 @@ package com.gmail.nossr50.listeners; +import com.gmail.nossr50.api.ItemSpawnReason; import com.gmail.nossr50.config.Config; import com.gmail.nossr50.config.HiddenConfig; import com.gmail.nossr50.config.WorldBlacklist; @@ -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; @@ -98,7 +96,7 @@ public class BlockListener implements Listener { int bonusCount = bonusDropMeta.asInt(); for (int i = 0; i < bonusCount; i++) { - event.getBlock().getWorld().dropItemNaturally(event.getBlockState().getLocation(), is); + Misc.spawnItemNaturally(event.getBlockState().getLocation(), is, ItemSpawnReason.BONUS_DROPS); } } } @@ -356,13 +354,17 @@ public class BlockListener implements Listener { } /* 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) && PrimarySkillType.WOODCUTTING.getPermissions(player) && !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); } } @@ -491,7 +493,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)) { @@ -525,7 +527,7 @@ 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) && Config.getInstance().getTreeFellerSoundsEnabled()) { SoundManager.sendSound(player, blockState.getLocation(), SoundType.FIZZ); } } @@ -596,7 +598,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); } 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 4194a2baa..a892b0a89 100644 --- a/src/main/java/com/gmail/nossr50/skills/archery/Archery.java +++ b/src/main/java/com/gmail/nossr50/skills/archery/Archery.java @@ -1,5 +1,6 @@ package com.gmail.nossr50.skills.archery; +import com.gmail.nossr50.api.ItemSpawnReason; import com.gmail.nossr50.config.AdvancedConfig; import com.gmail.nossr50.config.experience.ExperienceConfig; import com.gmail.nossr50.datatypes.skills.SubSkillType; @@ -9,6 +10,7 @@ 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; @@ -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(livingEntity.getLocation(), new ItemStack(Material.ARROW), trackedEntity.getArrowCount(), ItemSpawnReason.ARROW_RETRIEVAL_ACTIVATED); entityIterator.remove(); return; } 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 e2d259310..b12805856 100644 --- a/src/main/java/com/gmail/nossr50/skills/excavation/ExcavationManager.java +++ b/src/main/java/com/gmail/nossr50/skills/excavation/ExcavationManager.java @@ -1,5 +1,6 @@ package com.gmail.nossr50.skills.excavation; +import com.gmail.nossr50.api.ItemSpawnReason; import com.gmail.nossr50.config.Config; import com.gmail.nossr50.datatypes.experience.XPGainReason; import com.gmail.nossr50.datatypes.player.McMMOPlayer; @@ -51,7 +52,7 @@ public class ExcavationManager extends SkillManager { } xp += treasure.getXp(); - Misc.dropItem(location, treasure.getDrop()); + Misc.spawnItem(location, treasure.getDrop(), ItemSpawnReason.EXCAVATION_TREASURE); } } } 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 5c3de0452..9ec3c55da 100644 --- a/src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java @@ -1,5 +1,6 @@ package com.gmail.nossr50.skills.fishing; +import com.gmail.nossr50.api.ItemSpawnReason; import com.gmail.nossr50.config.AdvancedConfig; import com.gmail.nossr50.config.Config; import com.gmail.nossr50.config.experience.ExperienceConfig; @@ -318,7 +319,7 @@ public class FishingManager extends SkillManager { } if (Config.getInstance().getFishingExtraFish()) { - Misc.dropItem(player.getEyeLocation(), fishingCatch.getItemStack()); + Misc.spawnItem(player.getEyeLocation(), fishingCatch.getItemStack(), ItemSpawnReason.FISHING_EXTRA_FISH); } fishingCatch.setItemStack(treasureDrop); @@ -426,7 +427,7 @@ public class FishingManager extends SkillManager { return; } - Misc.dropItem(target.getLocation(), drop); + Misc.spawnItem(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); } 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 c93c2adc9..edd33d28d 100644 --- a/src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java +++ b/src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java @@ -1,5 +1,6 @@ package com.gmail.nossr50.skills.herbalism; +import com.gmail.nossr50.api.ItemSpawnReason; import com.gmail.nossr50.config.Config; import com.gmail.nossr50.config.experience.ExperienceConfig; import com.gmail.nossr50.config.treasure.TreasureConfig; @@ -626,7 +627,7 @@ public class HerbalismManager extends SkillManager { return false; } blockState.setType(Material.AIR); - Misc.dropItem(location, treasure.getDrop()); + Misc.spawnItem(location, treasure.getDrop(), ItemSpawnReason.HYLIAN_LUCK_TREASURE); NotificationManager.sendPlayerInformation(player, NotificationType.SUBSKILL_MESSAGE, "Herbalism.HylianLuck"); return true; } 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 116093980..29bb05d20 100644 --- a/src/main/java/com/gmail/nossr50/skills/mining/MiningManager.java +++ b/src/main/java/com/gmail/nossr50/skills/mining/MiningManager.java @@ -1,5 +1,6 @@ package com.gmail.nossr50.skills.mining; +import com.gmail.nossr50.api.ItemSpawnReason; import com.gmail.nossr50.config.AdvancedConfig; import com.gmail.nossr50.config.Config; import com.gmail.nossr50.config.experience.ExperienceConfig; @@ -188,7 +189,7 @@ public class MiningManager extends SkillManager { //Drop "debris" based on skill modifiers for(BlockState blockState : notOres) { if(RandomUtils.nextFloat() < debrisYield) { - Misc.dropItem(Misc.getBlockCenter(blockState), new ItemStack(blockState.getType())); // Initial block that would have been dropped + Misc.spawnItem(Misc.getBlockCenter(blockState), new ItemStack(blockState.getType()), ItemSpawnReason.BLAST_MINING_DEBRIS_NON_ORES); // Initial block that would have been dropped } } @@ -196,12 +197,12 @@ public class MiningManager extends SkillManager { 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(Misc.getBlockCenter(blockState), new ItemStack(blockState.getType()), ItemSpawnReason.BLAST_MINING_ORES); // Initial block that would have been dropped if (!mcMMO.getPlaceStore().isTrue(blockState)) { for (int i = 1; i < dropMultiplier; i++) { // Bukkit.broadcastMessage("Bonus Drop on Ore: "+blockState.getType().toString()); - Misc.dropItem(Misc.getBlockCenter(blockState), new ItemStack(blockState.getType())); // Initial block that would have been dropped + Misc.spawnItem(Misc.getBlockCenter(blockState), new ItemStack(blockState.getType()), ItemSpawnReason.BLAST_MINING_ORES_BONUS_DROP); // Initial block that would have been dropped } } } 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 f67af3963..f71b6fbe2 100644 --- a/src/main/java/com/gmail/nossr50/skills/salvage/SalvageManager.java +++ b/src/main/java/com/gmail/nossr50/skills/salvage/SalvageManager.java @@ -1,5 +1,6 @@ package com.gmail.nossr50.skills.salvage; +import com.gmail.nossr50.api.ItemSpawnReason; import com.gmail.nossr50.config.AdvancedConfig; import com.gmail.nossr50.config.Config; import com.gmail.nossr50.config.experience.ExperienceConfig; @@ -159,10 +160,10 @@ public class SalvageManager extends SkillManager { anvilLoc.add(0, .1, 0); if (enchantBook != null) { - Misc.spawnItemTowardsLocation(anvilLoc.clone(), playerLoc.clone(), enchantBook, vectorSpeed); + Misc.spawnItemTowardsLocation(anvilLoc.clone(), playerLoc.clone(), enchantBook, vectorSpeed, ItemSpawnReason.SALVAGE_ENCHANTMENT_BOOK); } - Misc.spawnItemTowardsLocation(anvilLoc.clone(), playerLoc.clone(), salvageResults, vectorSpeed); + Misc.spawnItemTowardsLocation(anvilLoc.clone(), playerLoc.clone(), salvageResults, vectorSpeed, ItemSpawnReason.SALVAGE_MATERIALS); // BWONG BWONG BWONG - CLUNK! if (Config.getInstance().getSalvageAnvilUseSoundsEnabled()) { 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 ebf50f28a..2379b7c50 100644 --- a/src/main/java/com/gmail/nossr50/skills/unarmed/UnarmedManager.java +++ b/src/main/java/com/gmail/nossr50/skills/unarmed/UnarmedManager.java @@ -1,5 +1,6 @@ package com.gmail.nossr50.skills.unarmed; +import com.gmail.nossr50.api.ItemSpawnReason; import com.gmail.nossr50.config.AdvancedConfig; import com.gmail.nossr50.datatypes.interactions.NotificationType; import com.gmail.nossr50.datatypes.player.McMMOPlayer; @@ -109,7 +110,7 @@ public class UnarmedManager extends SkillManager { if(UserManager.getPlayer(defender) == null) return; - Item item = Misc.dropItem(defender.getLocation(), defender.getInventory().getItemInMainHand()); + Item item = Misc.spawnItem(defender.getLocation(), defender.getInventory().getItemInMainHand(), ItemSpawnReason.UNARMED_DISARMED_ITEM); if (item != null && AdvancedConfig.getInstance().getDisarmProtected()) { item.setMetadata(mcMMO.disarmedItemKey, UserManager.getPlayer(defender).getPlayerMetadata()); 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 a9eba5cdb..8b649a208 100644 --- a/src/main/java/com/gmail/nossr50/skills/woodcutting/WoodcuttingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/woodcutting/WoodcuttingManager.java @@ -1,5 +1,6 @@ package com.gmail.nossr50.skills.woodcutting; +import com.gmail.nossr50.api.ItemSpawnReason; import com.gmail.nossr50.config.Config; import com.gmail.nossr50.config.experience.ExperienceConfig; import com.gmail.nossr50.datatypes.experience.XPGainReason; @@ -27,6 +28,7 @@ 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; @@ -65,10 +67,11 @@ public class WoodcuttingManager extends SkillManager { && 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()) + && Config.getInstance().getDoubleDropsEnabled(PrimarySkillType.WOODCUTTING, material); } /** @@ -76,20 +79,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); } @@ -206,7 +203,7 @@ public class WoodcuttingManager extends SkillManager { * @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, Player player) { + private static boolean handleDurabilityLoss(@NotNull Set treeFellerBlocks, @NotNull ItemStack inHand, @NotNull Player player) { //Treat the NBT tag for unbreakable and the durability enchant differently ItemMeta meta = inHand.getItemMeta(); @@ -218,7 +215,7 @@ public class WoodcuttingManager extends SkillManager { Material type = inHand.getType(); for (BlockState blockState : treeFellerBlocks) { - if (BlockUtils.isLog(blockState)) { + if (BlockUtils.hasWoodcuttingXP(blockState)) { durabilityLoss += Config.getInstance().getAbilityToolDamage(); } } @@ -249,7 +246,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; } @@ -259,12 +256,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; } @@ -276,7 +273,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; @@ -289,25 +286,22 @@ public class WoodcuttingManager extends SkillManager { break; // TODO: Shouldn't we use continue instead? } - 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); - } - xp += processTreeFellerXPGains(blockState, processedLogCount); - Misc.dropItems(Misc.getBlockCenter(blockState), block.getDrops()); - } - if (BlockUtils.isLeaves(blockState)) { - Misc.dropItems(Misc.getBlockCenter(blockState), block.getDrops()); - } + + //Drop displaced block + Misc.spawnItemsFromCollection(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 + Misc.spawnItemsFromCollection(Misc.getBlockCenter(blockState), block.getDrops(), ItemSpawnReason.TREE_FELLER_DISPLACED_BLOCK, 1); } blockState.setType(Material.AIR); @@ -367,13 +361,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 (Config.getInstance().getWoodcuttingDoubleDropsEnabled(blockState.getBlockData())) { - Misc.dropItems(Misc.getBlockCenter(blockState), blockState.getBlock().getDrops()); - } + protected static void spawnHarvestLumberBonusDrops(@NotNull BlockState blockState) { + Misc.spawnItemsFromCollection(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 843c178a9..17a2d82f2 100644 --- a/src/main/java/com/gmail/nossr50/util/BlockUtils.java +++ b/src/main/java/com/gmail/nossr50/util/BlockUtils.java @@ -66,7 +66,7 @@ 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) || Config.getInstance().getDoubleDropsEnabled(PrimarySkillType.MINING, blockState.getType()) || Config.getInstance().getDoubleDropsEnabled(PrimarySkillType.EXCAVATION, blockState.getType()) || Config.getInstance().getDoubleDropsEnabled(PrimarySkillType.WOODCUTTING, blockState.getType()) @@ -165,10 +165,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(BlockState blockState) { + return ExperienceConfig.getInstance().doesBlockGiveSkillXP(PrimarySkillType.WOODCUTTING, blockState.getBlockData()); } /** @@ -177,8 +175,8 @@ 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(BlockState blockState) { + return mcMMO.getMaterialMapStore().isTreeFellerDestructible(blockState.getType()); } /** diff --git a/src/main/java/com/gmail/nossr50/util/EventUtils.java b/src/main/java/com/gmail/nossr50/util/EventUtils.java index d138c3c3d..52a2f989e 100644 --- a/src/main/java/com/gmail/nossr50/util/EventUtils.java +++ b/src/main/java/com/gmail/nossr50/util/EventUtils.java @@ -46,6 +46,7 @@ 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; @@ -73,7 +74,7 @@ public final class EventUtils { * @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(Event event) { + public static boolean isFakeEvent(@NotNull Event event) { return event instanceof FakeEvent; } @@ -84,7 +85,7 @@ public final 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; } @@ -94,7 +95,7 @@ public final class EventUtils { * @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); } @@ -112,7 +113,7 @@ public final 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(); @@ -167,14 +168,14 @@ public final 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); diff --git a/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java b/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java index dcdd766f2..6be54c63c 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,46 @@ import java.util.Locale; */ public class MaterialMapStore { - private final HashSet abilityBlackList; - private final HashSet toolBlackList; - private final HashSet mossyWhiteList; - private final HashSet leavesWhiteList; - private final HashSet herbalismAbilityBlackList; - private final HashSet blockCrackerWhiteList; - private final HashSet canMakeShroomyWhiteList; - private final HashSet multiBlockPlant; - private final HashSet foodItemWhiteList; - private final 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 final HashSet netheriteArmor; - private final HashSet netheriteTools; - private final HashSet woodTools; - private final HashSet stoneTools; - private final HashSet leatherArmor; - private final HashSet ironArmor; - private final HashSet ironTools; - private final HashSet stringTools; - private final HashSet goldArmor; - private final HashSet goldTools; - private final HashSet chainmailArmor; - private final HashSet diamondArmor; - private final HashSet diamondTools; - private final 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 final HashSet swords; - private final HashSet axes; - private final HashSet hoes; - private final HashSet shovels; - private final HashSet pickAxes; - private final HashSet tridents; - private final HashSet bows; - private final 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 tools; - private final HashSet enchantables; + private final @NotNull HashSet enchantables; - private final HashSet ores; + private final @NotNull HashSet ores; - private final HashMap tierValue; + private final @NotNull HashMap tierValue; public MaterialMapStore() @@ -62,7 +63,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<>(); @@ -104,52 +105,12 @@ public class MaterialMapStore { 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() { fillAbilityBlackList(); fillToolBlackList(); fillMossyWhiteList(); - fillLeavesWhiteList(); + fillTreeFellerDestructibleWhiteList(); fillHerbalismAbilityBlackList(); fillBlockCrackerWhiteList(); fillShroomyWhiteList(); @@ -164,6 +125,46 @@ public class MaterialMapStore { 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); @@ -418,26 +419,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"); @@ -555,7 +537,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()); } @@ -564,207 +546,196 @@ 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 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"); @@ -802,16 +773,18 @@ 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("nether_wart_block"); + treeFellerDestructibleWhiteList.add("warped_wart_block"); + treeFellerDestructibleWhiteList.add("brown_mushroom_block"); + treeFellerDestructibleWhiteList.add("red_mushroom_block"); } private void fillMossyWhiteList() @@ -1090,24 +1063,24 @@ public class MaterialMapStore { toolBlackList.add("respawn_anchor"); } - public HashSet getNetheriteArmor() { + public @NotNull HashSet getNetheriteArmor() { return netheriteArmor; } - public HashSet getNetheriteTools() { + public @NotNull HashSet getNetheriteTools() { return netheriteTools; } - public int getTier(Material material) { + 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/Misc.java b/src/main/java/com/gmail/nossr50/util/Misc.java index 7346f42f1..92316d732 100644 --- a/src/main/java/com/gmail/nossr50/util/Misc.java +++ b/src/main/java/com/gmail/nossr50/util/Misc.java @@ -1,5 +1,6 @@ package com.gmail.nossr50.util; +import com.gmail.nossr50.api.ItemSpawnReason; import com.gmail.nossr50.events.items.McMMOItemSpawnEvent; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.runnables.player.PlayerProfileLoadingTask; @@ -11,6 +12,8 @@ import org.bukkit.block.BlockState; import org.bukkit.entity.*; import org.bukkit.inventory.ItemStack; 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 +21,7 @@ import java.util.Random; import java.util.Set; public final class Misc { - private static final 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,7 +40,7 @@ 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() {} @@ -54,7 +57,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 +76,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 +91,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 +105,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 Location location, @NotNull Collection drops, @NotNull ItemSpawnReason itemSpawnReason) { for (ItemStack drop : drops) { - dropItem(location, drop); + spawnItem(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(@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(location, arrayDrops[i], itemSpawnReason); } } @@ -115,9 +134,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(@NotNull Location location, @NotNull ItemStack is, int quantity, @NotNull ItemSpawnReason itemSpawnReason) { for (int i = 0; i < quantity; i++) { - dropItem(location, is); + spawnItem(location, is, itemSpawnReason); } } @@ -126,15 +145,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(@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); mcMMO.p.getServer().getPluginManager().callEvent(event); if (event.isCancelled()) { @@ -149,22 +169,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(@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); 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 +196,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(@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(fromLocation, toLocation, is, speed, itemSpawnReason); } } @@ -191,7 +212,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(@NotNull Location fromLocation, @NotNull Location toLocation, @NotNull ItemStack itemToSpawn, double speed, @NotNull ItemSpawnReason itemSpawnReason) { if (itemToSpawn.getType() == Material.AIR) { return null; } @@ -201,12 +222,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); 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 +248,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 +263,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 +282,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 +296,7 @@ public final class Misc { return new Location(location.getWorld(), blockX, location.getY(), blockZ); } - public static Random getRandom() { + public static @NotNull Random getRandom() { return random; } } diff --git a/src/main/java/com/gmail/nossr50/util/ModManager.java b/src/main/java/com/gmail/nossr50/util/ModManager.java index b61f98048..184b571b1 100644 --- a/src/main/java/com/gmail/nossr50/util/ModManager.java +++ b/src/main/java/com/gmail/nossr50/util/ModManager.java @@ -136,10 +136,6 @@ public class ModManager { return Config.getInstance().getBlockModsEnabled() && customLogs.contains(state.getType()); } - public boolean isCustomLeaf(BlockState state) { - return Config.getInstance().getBlockModsEnabled() && customLeaves.contains(state.getType()); - } - public boolean isCustomAbilityBlock(BlockState state) { return Config.getInstance().getBlockModsEnabled() && customAbilityBlocks.contains(state.getType()); } From 01ebba4443a2dbbbbe8928909fbc1c1ee32ad1d5 Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Mon, 2 Nov 2020 22:57:53 +0100 Subject: [PATCH 203/662] Two small fixes (#4321) * Fixed armor counting in BleedTimerTask * Key instead of Name for Piercing --- .../com/gmail/nossr50/listeners/EntityListener.java | 12 ++++++++++-- .../nossr50/runnables/skills/BleedTimerTask.java | 8 +++++--- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java index c005a38fb..8ba975f24 100644 --- a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java @@ -31,6 +31,7 @@ import com.gmail.nossr50.util.skills.SkillActivationType; import com.gmail.nossr50.worldguard.WorldGuardManager; import com.gmail.nossr50.worldguard.WorldGuardUtils; import org.bukkit.Material; +import org.bukkit.NamespacedKey; import org.bukkit.OfflinePlayer; import org.bukkit.block.Block; import org.bukkit.enchantments.Enchantment; @@ -54,6 +55,12 @@ public class EntityListener implements Listener { private final mcMMO pluginRef; private final @NotNull AbstractPersistentDataLayer persistentDataLayer; + /** + * 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; persistentDataLayer = mcMMO.getCompatibilityManager().getPersistentDataLayer(); @@ -161,9 +168,10 @@ public class EntityListener implements Listener { projectile.setMetadata(mcMMO.bowForceKey, new FixedMetadataValue(pluginRef, 1.0)); projectile.setMetadata(mcMMO.arrowDistanceKey, new FixedMetadataValue(pluginRef, projectile.getLocation())); - for(Enchantment enchantment : player.getInventory().getItemInMainHand().getEnchantments().keySet()) { - if(enchantment.getName().equalsIgnoreCase("piercing")) + for (Enchantment enchantment : player.getInventory().getItemInMainHand().getEnchantments().keySet()) { + if (enchantment.getKey().equals(piercingEnchantment)) { return; + } } if (RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.ARCHERY_ARROW_RETRIEVAL, player)) { 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 228ae7f18..aef946971 100644 --- a/src/main/java/com/gmail/nossr50/runnables/skills/BleedTimerTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/skills/BleedTimerTask.java @@ -69,9 +69,11 @@ public class BleedTimerTask extends BukkitRunnable { } //Count Armor - for(ItemStack armorPiece : ((Player) target).getInventory().getArmorContents()) - { - armorCount++; + for (ItemStack armorPiece : ((Player) target).getInventory().getArmorContents()) { + //We only want to count slots that contain armor. + if (armorPiece != null) { + armorCount++; + } } } else { From a945e2e6b340f6b168467e1220ea264cedbad2b6 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 2 Nov 2020 14:01:45 -0800 Subject: [PATCH 204/662] update changelog --- Changelog.txt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index d9fc0899d..9af3b2099 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,13 +1,16 @@ Version 2.1.152 - Updated hu_HU locale (thanks andris) Fixed a bug where Tree Feller would sometimes double drop blocks inappropriately Added some code to prevent a possible NPE when spawning items in a world that got unloaded + Fixed a bug with bleed damage calculations and player armor (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' From 28b6a457f2ed388acfaa9150dc5b4b450dcf8f42 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 2 Nov 2020 14:03:58 -0800 Subject: [PATCH 205/662] Add back the pc and ac command aliases --- Changelog.txt | 4 +++- .../com/gmail/nossr50/commands/chat/AdminChatCommand.java | 2 +- .../com/gmail/nossr50/commands/chat/PartyChatCommand.java | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 9af3b2099..c27b4ae04 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -2,10 +2,12 @@ Version 2.1.152 Fixed a bug where Tree Feller would sometimes double drop blocks inappropriately Added some code to prevent a possible NPE when spawning items in a world that got unloaded Fixed a bug with bleed damage calculations and player armor + Added the missing 'pc' alias for party chat + Added the missing 'ac' alias for admin chat + Updated hu_HU locale (thanks andris) (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. 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 26b4f2dad..f8547a4a0 100644 --- a/src/main/java/com/gmail/nossr50/commands/chat/AdminChatCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/chat/AdminChatCommand.java @@ -12,7 +12,7 @@ import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.player.UserManager; import org.jetbrains.annotations.NotNull; -@CommandAlias("a|adminchat|achat") //Kept for historical reasons +@CommandAlias("ac|a|adminchat|achat") //Kept for historical reasons public class AdminChatCommand extends BaseCommand { private final @NotNull mcMMO pluginRef; 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 62c23dc49..e1f17b840 100644 --- a/src/main/java/com/gmail/nossr50/commands/chat/PartyChatCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/chat/PartyChatCommand.java @@ -16,7 +16,7 @@ import com.gmail.nossr50.util.player.UserManager; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; -@CommandAlias("p|partychat|pchat") //Kept for historical reasons +@CommandAlias("pc|p|partychat|pchat") //Kept for historical reasons public class PartyChatCommand extends BaseCommand { private final @NotNull mcMMO pluginRef; From 094d57bce036399e81e3503018e1aa4b4836bfb8 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 2 Nov 2020 14:06:02 -0800 Subject: [PATCH 206/662] more changelog tweaks --- Changelog.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index c27b4ae04..64781125a 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,13 +1,13 @@ Version 2.1.152 Fixed a bug where Tree Feller would sometimes double drop blocks inappropriately - Added some code to prevent a possible NPE when spawning items in a world that got unloaded 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 - Updated hu_HU locale (thanks andris) (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. From 1f3a2baa6bbd4194a9d2653a6c7a053d94525433 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 2 Nov 2020 14:10:17 -0800 Subject: [PATCH 207/662] Some BlockMultiPlaceEvent optimization --- .../nossr50/listeners/BlockListener.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java index 14b043e9f..b2ce690f7 100644 --- a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java @@ -245,16 +245,16 @@ public class BlockListener implements Listener { mcMMO.getPlaceStore().setTrue(blockState); } - /* WORLD BLACKLIST CHECK */ - if(WorldBlacklist.isWorldBlacklisted(event.getBlock().getWorld())) { - return; - } - - Player player = event.getPlayer(); - - if (!UserManager.hasPlayerDataKey(player)) { - return; - } +// /* WORLD BLACKLIST CHECK */ +// if(WorldBlacklist.isWorldBlacklisted(event.getBlock().getWorld())) { +// return; +// } +// +// Player player = event.getPlayer(); +// +// if (!UserManager.hasPlayerDataKey(player)) { +// return; +// } } @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) From 5afaeb40a85d1d7185052a9b355746d646db21d6 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 2 Nov 2020 15:12:29 -0800 Subject: [PATCH 208/662] 2.1.152 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 6aa9ff0db..7a662f7a0 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.152-SNAPSHOT + 2.1.152 mcMMO https://github.com/mcMMO-Dev/mcMMO From 95c9daebe1df998bad817172d5591a44b9845243 Mon Sep 17 00:00:00 2001 From: Vlammar <36545324+Vlammar@users.noreply.github.com> Date: Wed, 4 Nov 2020 18:59:56 +0100 Subject: [PATCH 209/662] Update locale_fr.properties (#4324) Fixed a small translation error --- src/main/resources/locale/locale_fr.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/locale/locale_fr.properties b/src/main/resources/locale/locale_fr.properties index 7732d69f0..a24695264 100644 --- a/src/main/resources/locale/locale_fr.properties +++ b/src/main/resources/locale/locale_fr.properties @@ -232,7 +232,7 @@ Excavation.Skills.GigaDrillBreaker.Other.On=&a{0}&2 a utilis\u00e9 &cForeur ! Fishing.ScarcityTip=&e&oCette zone a souffert d\'une surexploitation ... Utilisez votre canne \u00e0 p\u00e2che autre part, \u00e0 au moins {0} blocs de distance. Fishing.Scared=&7&oDes mouvements chaotique effrait les poissons ! Fishing.Exhausting=&c&oUne mauvaise utilisation de la canne \u00e0 p\u00eache vous fatigue et use la canne ! -Fishing.LowResourcesTip=&7Vous sentez qu\'il n\'y a plus beaucoup de poisson par ici. Allez essayez {0} blocs plus loin. +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\u00eache magique : &7 **S\'am\u00e9liore via Chasseur de tr\u00e9sors** Fishing.Ability.Locked.0=BLOCKE JUSQU\'A {0}+ COMPETENCE (SHAKE) Fishing.Ability.Locked.1=Bloqu\u00e9 jusqu\'\u00e0 {0}+ niveaux de talent (PECHEUR SUR GLACE) From cb9c7acceb699182161c94073e63f7c3a8f6969d Mon Sep 17 00:00:00 2001 From: nossr50 Date: Wed, 4 Nov 2020 12:05:29 -0800 Subject: [PATCH 210/662] Fixing a major bug with sub-skills not being shown when using commands --- Changelog.txt | 4 + pom.xml | 8 +- .../nossr50/util/TextComponentFactory.java | 166 ++++++++++++++---- 3 files changed, 137 insertions(+), 41 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 64781125a..101a74ab1 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,7 @@ +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 + 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 diff --git a/pom.xml b/pom.xml index 7a662f7a0..0006c8fa2 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.152 + 2.1.153-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO @@ -202,17 +202,17 @@ net.kyori adventure-text-serializer-gson - 4.1.1 + 4.2.0-SNAPSHOT net.kyori adventure-api - 4.1.1 + 4.2.0-SNAPSHOT net.kyori adventure-nbt - 4.1.1 + 4.2.0-SNAPSHOT net.kyori diff --git a/src/main/java/com/gmail/nossr50/util/TextComponentFactory.java b/src/main/java/com/gmail/nossr50/util/TextComponentFactory.java index 276c997f6..302fe335c 100644 --- a/src/main/java/com/gmail/nossr50/util/TextComponentFactory.java +++ b/src/main/java/com/gmail/nossr50/util/TextComponentFactory.java @@ -22,11 +22,15 @@ 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.ChatColor; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import java.lang.reflect.Array; +import java.util.ArrayList; import java.util.List; import java.util.Locale; -import java.util.concurrent.atomic.AtomicReference; /** * This class handles many of the JSON components that mcMMO makes and uses @@ -105,49 +109,138 @@ public class TextComponentFactory { ), MessageType.SYSTEM); } - public static void sendPlayerSubSkillList(Player player, List textComponents) - { - TextComponent emptySpace = Component.space(); - - AtomicReference messageToSend = new AtomicReference<>(); - int newLineCount = 0; //Hacky solution to wordwrap problems - + public static void sendPlayerSubSkillList(@NotNull Player player, @NotNull List subSkillComponents) { final Audience audience = mcMMO.getAudiences().player(player); - for (Component textComponent : textComponents) { - //Don't send more than 3 subskills per line to avoid MOST wordwrap problems - if(newLineCount > 2) - { - Component toSend = messageToSend.get(); - if (toSend != null) { - audience.sendMessage(Identity.nil(), toSend.append(emptySpace)); - } - messageToSend.set(null); - newLineCount = 0; - } - //Style the skills into @links - final String originalTxt = textComponent instanceof TextComponent ? ((TextComponent) textComponent).content() : ""; + //@ Signs, done for style + Component space = Component.space(); + TextComponent atSignComponent = Component.text(LocaleLoader.getString("JSON.Hover.AtSymbolSkills")); - TextComponent.Builder stylizedText = Component.text().content(LocaleLoader.getString("JSON.Hover.AtSymbolSkills")); - addChild(stylizedText, originalTxt); + //Only send 3 sub-skills per line + Component[][] splitSubSkills = splitComponentsIntoGroups(subSkillComponents, 3); + ArrayList individualLinesToSend = new ArrayList<>(); - if(textComponent.hoverEvent() != null) - stylizedText.hoverEvent(textComponent.hoverEvent()); - - if(textComponent.clickEvent() != null) - stylizedText.clickEvent(textComponent.clickEvent()); - - messageToSend.set(stylizedText.build().append(emptySpace)); - - newLineCount++; + //Create each line + for (Component[] componentArray : splitSubSkills) { + individualLinesToSend.add(fromArray(componentArray, atSignComponent, space)); } - Component toSend = messageToSend.get(); - if (toSend != null) { - audience.sendMessage(Identity.nil(), toSend.append(emptySpace)); + //Send each group + for(Component curLine : individualLinesToSend) { + audience.sendMessage(Identity.nil(), curLine); } } + /** + * 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 + */ + private 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 + */ + private 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; + } + + +// public static void sendPlayerSubSkillList(Player player, List textComponents) +// { +// TextComponent emptySpace = Component.space(); +// +// AtomicReference messageToSend = new AtomicReference<>(); +// int newLineCount = 0; //Hacky solution to wordwrap problems +// +// final Audience audience = mcMMO.getAudiences().player(player); +// for (Component textComponent : textComponents) { +// //Don't send more than 3 subskills per line to avoid MOST wordwrap problems +// if(newLineCount > 2) +// { +// Component toSend = messageToSend.get(); +// if (toSend != null) { +// audience.sendMessage(Identity.nil(), toSend.append(emptySpace)); +// } +// +// messageToSend.set(null); +// newLineCount = 0; +// } +// //Style the skills into @links +// final String originalTxt = textComponent instanceof TextComponent ? ((TextComponent) textComponent).content() : ""; +// +// TextComponent.Builder stylizedText = Component.text().content(LocaleLoader.getString("JSON.Hover.AtSymbolSkills")); +// addChild(stylizedText, originalTxt); +// +// if(textComponent.hoverEvent() != null) +// stylizedText.hoverEvent(textComponent.hoverEvent()); +// +// if(textComponent.clickEvent() != null) +// stylizedText.clickEvent(textComponent.clickEvent()); +// +// messageToSend.set(stylizedText.build().append(emptySpace)); +// +// newLineCount++; +// } +// +// Component toSend = messageToSend.get(); +// if (toSend != null) { +// audience.sendMessage(Identity.nil(), toSend.append(emptySpace)); +// } +// } + private static Component getWebLinkTextComponent(McMMOWebLinks webLinks) { TextComponent.Builder webTextComponent; @@ -201,8 +294,7 @@ public class TextComponentFactory { } private static void addChild(ComponentBuilder webTextComponent, String childName) { - TextComponent childComponent = Component.text(childName); - childComponent.color(NamedTextColor.BLUE); + TextComponent childComponent = Component.text(childName).color(NamedTextColor.BLUE); webTextComponent.append(childComponent); } From 329de942b40d14cf56cbc025b0aef94a98e7f4e7 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Wed, 4 Nov 2020 12:06:30 -0800 Subject: [PATCH 211/662] Update changelog --- Changelog.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/Changelog.txt b/Changelog.txt index 101a74ab1..a47aabd4b 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,6 +1,7 @@ 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 From 15578bb84ea90e3d94c511e976bd64e626d9e1c9 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Wed, 4 Nov 2020 12:12:51 -0800 Subject: [PATCH 212/662] Some refactoring --- .../com/gmail/nossr50/chat/ChatManager.java | 2 +- .../gmail/nossr50/commands/XprateCommand.java | 2 +- .../commands/chat/PartyChatCommand.java | 2 +- .../hardcore/HardcoreModeCommand.java | 2 +- .../commands/party/PartyItemShareCommand.java | 2 +- .../commands/party/PartyXpShareCommand.java | 2 +- .../nossr50/commands/player/MctopCommand.java | 2 +- .../nossr50/commands/player/XPBarCommand.java | 2 +- .../commands/skills/AcrobaticsCommand.java | 2 +- .../commands/skills/AlchemyCommand.java | 2 +- .../nossr50/commands/skills/AprilCommand.java | 2 +- .../commands/skills/ArcheryCommand.java | 2 +- .../nossr50/commands/skills/AxesCommand.java | 2 +- .../commands/skills/ExcavationCommand.java | 2 +- .../commands/skills/FishingCommand.java | 2 +- .../commands/skills/HerbalismCommand.java | 2 +- .../commands/skills/MiningCommand.java | 2 +- .../commands/skills/MmoInfoCommand.java | 2 +- .../commands/skills/RepairCommand.java | 2 +- .../commands/skills/SalvageCommand.java | 2 +- .../nossr50/commands/skills/SkillCommand.java | 4 +- .../commands/skills/SkillGuideCommand.java | 2 +- .../commands/skills/SmeltingCommand.java | 2 +- .../commands/skills/SwordsCommand.java | 2 +- .../commands/skills/TamingCommand.java | 2 +- .../commands/skills/UnarmedCommand.java | 2 +- .../commands/skills/WoodcuttingCommand.java | 2 +- .../com/gmail/nossr50/config/ChatConfig.java | 2 +- .../java/com/gmail/nossr50/config/Config.java | 2 +- .../nossr50/config/CoreSkillsConfig.java | 2 +- .../config/experience/ExperienceConfig.java | 2 +- .../config/party/ItemWeightConfig.java | 2 +- .../config/treasure/TreasureConfig.java | 2 +- .../database/FlatfileDatabaseManager.java | 2 +- .../nossr50/datatypes/json/McMMOWebLinks.java | 2 +- .../datatypes/party/ItemShareType.java | 2 +- .../nossr50/datatypes/party/PartyFeature.java | 2 +- .../datatypes/skills/PrimarySkillType.java | 2 +- .../datatypes/skills/SubSkillType.java | 2 +- .../datatypes/skills/SuperAbilityType.java | 2 +- .../acrobatics/AcrobaticsSubSkill.java | 2 +- .../subskills/taming/CallOfTheWildType.java | 2 +- .../skills/McMMOPlayerNotificationEvent.java | 2 +- .../skills/alchemy/AlchemyManager.java | 2 +- .../nossr50/skills/child/ChildConfig.java | 2 +- .../nossr50/skills/excavation/Excavation.java | 2 +- .../skills/herbalism/HerbalismManager.java | 1 + .../nossr50/skills/repair/RepairManager.java | 2 +- .../skills/salvage/SalvageManager.java | 2 +- .../nossr50/skills/taming/TamingManager.java | 2 +- .../gmail/nossr50/util/HolidayManager.java | 1 + .../gmail/nossr50/util/MobHealthbarUtils.java | 1 + .../commands/CommandRegistrationManager.java | 2 +- .../nossr50/util/commands/CommandUtils.java | 2 +- .../util/compat/CompatibilityManager.java | 2 +- .../util/experience/ExperienceBarWrapper.java | 2 +- .../util/player/NotificationManager.java | 4 +- .../gmail/nossr50/util/skills/SkillUtils.java | 2 +- .../util/{ => text}/McMMOMessageType.java | 2 +- .../nossr50/util/{ => text}/StringUtils.java | 2 +- .../util/{ => text}/TextComponentFactory.java | 163 +++--------------- .../gmail/nossr50/util/text/TextUtils.java | 87 ++++++++++ 62 files changed, 170 insertions(+), 201 deletions(-) rename src/main/java/com/gmail/nossr50/util/{ => text}/McMMOMessageType.java (94%) rename src/main/java/com/gmail/nossr50/util/{ => text}/StringUtils.java (99%) rename src/main/java/com/gmail/nossr50/util/{ => text}/TextComponentFactory.java (79%) create mode 100644 src/main/java/com/gmail/nossr50/util/text/TextUtils.java diff --git a/src/main/java/com/gmail/nossr50/chat/ChatManager.java b/src/main/java/com/gmail/nossr50/chat/ChatManager.java index 826521e5d..b62708d54 100644 --- a/src/main/java/com/gmail/nossr50/chat/ChatManager.java +++ b/src/main/java/com/gmail/nossr50/chat/ChatManager.java @@ -11,7 +11,7 @@ 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.StringUtils; +import com.gmail.nossr50.util.text.StringUtils; import net.kyori.adventure.audience.Audience; import net.kyori.adventure.text.TextComponent; import org.bukkit.command.ConsoleCommandSender; diff --git a/src/main/java/com/gmail/nossr50/commands/XprateCommand.java b/src/main/java/com/gmail/nossr50/commands/XprateCommand.java index 1d7935549..150b97590 100644 --- a/src/main/java/com/gmail/nossr50/commands/XprateCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/XprateCommand.java @@ -7,9 +7,9 @@ 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; 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 e1f17b840..9fc985308 100644 --- a/src/main/java/com/gmail/nossr50/commands/chat/PartyChatCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/chat/PartyChatCommand.java @@ -11,8 +11,8 @@ import com.gmail.nossr50.datatypes.party.Party; import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.party.PartyManager; -import com.gmail.nossr50.util.StringUtils; import com.gmail.nossr50.util.player.UserManager; +import com.gmail.nossr50.util.text.StringUtils; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; 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 73da843a6..62206566a 100644 --- a/src/main/java/com/gmail/nossr50/commands/hardcore/HardcoreModeCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/hardcore/HardcoreModeCommand.java @@ -2,8 +2,8 @@ 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.gmail.nossr50.util.text.StringUtils; import com.google.common.collect.ImmutableList; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; 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 54a8af8fa..4b0d8fb23 100644 --- a/src/main/java/com/gmail/nossr50/commands/party/PartyItemShareCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/party/PartyItemShareCommand.java @@ -6,9 +6,9 @@ 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.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; 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 c1310cf0e..a8354914e 100644 --- a/src/main/java/com/gmail/nossr50/commands/party/PartyXpShareCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/party/PartyXpShareCommand.java @@ -5,9 +5,9 @@ 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.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; 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 a50b51c20..63ed2726e 100644 --- a/src/main/java/com/gmail/nossr50/commands/player/MctopCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/player/MctopCommand.java @@ -7,9 +7,9 @@ import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.runnables.commands.MctopCommandAsyncTask; 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; diff --git a/src/main/java/com/gmail/nossr50/commands/player/XPBarCommand.java b/src/main/java/com/gmail/nossr50/commands/player/XPBarCommand.java index 2c429ddd8..ad24c60da 100644 --- a/src/main/java/com/gmail/nossr50/commands/player/XPBarCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/player/XPBarCommand.java @@ -2,11 +2,11 @@ package com.gmail.nossr50.commands.player; import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; -import com.gmail.nossr50.util.StringUtils; 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; 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 1733329ff..9b6e8ea2f 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/AcrobaticsCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/AcrobaticsCommand.java @@ -5,10 +5,10 @@ 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 com.gmail.nossr50.util.text.TextComponentFactory; import net.kyori.adventure.text.Component; import org.bukkit.entity.Player; 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 cdb87e461..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,9 +5,9 @@ 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 com.gmail.nossr50.util.text.TextComponentFactory; import net.kyori.adventure.text.Component; import org.bukkit.entity.Player; 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 6c41b232d..819205ca1 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/AprilCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/AprilCommand.java @@ -3,8 +3,8 @@ 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.gmail.nossr50.util.text.StringUtils; import com.google.common.collect.ImmutableList; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; 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 bbf0f875b..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,9 +4,9 @@ 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 com.gmail.nossr50.util.text.TextComponentFactory; import net.kyori.adventure.text.Component; import org.bukkit.entity.Player; 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 52aa62d8e..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,11 +5,11 @@ 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 com.gmail.nossr50.util.text.TextComponentFactory; import net.kyori.adventure.text.Component; import org.bukkit.entity.Player; 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 170e80054..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,9 +5,9 @@ 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 com.gmail.nossr50.util.text.TextComponentFactory; import net.kyori.adventure.text.Component; import org.bukkit.entity.Player; 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 33f2c4cd5..692b18174 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/FishingCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/FishingCommand.java @@ -9,10 +9,10 @@ import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.skills.fishing.Fishing; 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 com.gmail.nossr50.util.text.TextComponentFactory; import net.kyori.adventure.text.Component; import org.bukkit.Location; import org.bukkit.entity.EntityType; 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 8f82ce3ff..3d4693b77 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/HerbalismCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/HerbalismCommand.java @@ -4,9 +4,9 @@ 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.skills.RankUtils; import com.gmail.nossr50.util.skills.SkillActivationType; +import com.gmail.nossr50.util.text.TextComponentFactory; import net.kyori.adventure.text.Component; import org.bukkit.Material; import org.bukkit.entity.Player; 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 950953908..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,10 +5,10 @@ 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 com.gmail.nossr50.util.text.TextComponentFactory; import net.kyori.adventure.text.Component; import org.bukkit.entity.Player; 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 c23c7ac78..e562e9429 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/MmoInfoCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/MmoInfoCommand.java @@ -6,7 +6,7 @@ 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.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; 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 7444a9fb6..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,10 +10,10 @@ 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 com.gmail.nossr50.util.text.TextComponentFactory; import net.kyori.adventure.text.Component; import org.bukkit.Material; import org.bukkit.entity.Player; 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 ebbd629e3..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,9 +5,9 @@ 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 com.gmail.nossr50.util.text.TextComponentFactory; import net.kyori.adventure.text.Component; import org.bukkit.entity.Player; 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 5aecd63c7..e550913fa 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/SkillCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/SkillCommand.java @@ -8,8 +8,6 @@ import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.locale.LocaleLoader; 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,6 +16,8 @@ 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.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; 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 60fc82184..a7879bb8d 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/SkillGuideCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/SkillGuideCommand.java @@ -2,7 +2,7 @@ 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.util.text.StringUtils; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; 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 27ce7fc13..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,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.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 com.gmail.nossr50.util.text.TextComponentFactory; import net.kyori.adventure.text.Component; import org.bukkit.entity.Player; 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 325b5bb10..1e6bf1d72 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/SwordsCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/SwordsCommand.java @@ -5,11 +5,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.CombatUtils; import com.gmail.nossr50.util.skills.RankUtils; import com.gmail.nossr50.util.skills.SkillActivationType; +import com.gmail.nossr50.util.text.TextComponentFactory; import net.kyori.adventure.text.Component; import org.bukkit.entity.Player; 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 8970f5c08..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,8 +5,8 @@ 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 com.gmail.nossr50.util.text.TextComponentFactory; import net.kyori.adventure.text.Component; import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; 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 e8e85418e..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,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.CombatUtils; import com.gmail.nossr50.util.skills.RankUtils; import com.gmail.nossr50.util.skills.SkillActivationType; +import com.gmail.nossr50.util.text.TextComponentFactory; import net.kyori.adventure.text.Component; import org.bukkit.entity.Player; 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 b26b385b1..505a37c8d 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/WoodcuttingCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/WoodcuttingCommand.java @@ -4,9 +4,9 @@ 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.skills.RankUtils; import com.gmail.nossr50.util.skills.SkillActivationType; +import com.gmail.nossr50.util.text.TextComponentFactory; import net.kyori.adventure.text.Component; import org.bukkit.entity.Player; diff --git a/src/main/java/com/gmail/nossr50/config/ChatConfig.java b/src/main/java/com/gmail/nossr50/config/ChatConfig.java index 27e57930d..1b9204e4b 100644 --- a/src/main/java/com/gmail/nossr50/config/ChatConfig.java +++ b/src/main/java/com/gmail/nossr50/config/ChatConfig.java @@ -1,7 +1,7 @@ package com.gmail.nossr50.config; import com.gmail.nossr50.datatypes.chat.ChatChannel; -import com.gmail.nossr50.util.StringUtils; +import com.gmail.nossr50.util.text.StringUtils; import org.jetbrains.annotations.NotNull; public class ChatConfig extends AutoUpdateConfigLoader { diff --git a/src/main/java/com/gmail/nossr50/config/Config.java b/src/main/java/com/gmail/nossr50/config/Config.java index 1ab532744..d3fdb5c74 100644 --- a/src/main/java/com/gmail/nossr50/config/Config.java +++ b/src/main/java/com/gmail/nossr50/config/Config.java @@ -5,7 +5,7 @@ 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 com.gmail.nossr50.util.text.StringUtils; import org.bukkit.Material; import org.bukkit.block.data.BlockData; import org.bukkit.configuration.ConfigurationSection; diff --git a/src/main/java/com/gmail/nossr50/config/CoreSkillsConfig.java b/src/main/java/com/gmail/nossr50/config/CoreSkillsConfig.java index 269ee30f2..4a10cdf2a 100644 --- a/src/main/java/com/gmail/nossr50/config/CoreSkillsConfig.java +++ b/src/main/java/com/gmail/nossr50/config/CoreSkillsConfig.java @@ -2,7 +2,7 @@ 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 { private static CoreSkillsConfig instance; 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 b094d0176..bd4e92ad6 100644 --- a/src/main/java/com/gmail/nossr50/config/experience/ExperienceConfig.java +++ b/src/main/java/com/gmail/nossr50/config/experience/ExperienceConfig.java @@ -5,7 +5,7 @@ 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.util.text.StringUtils; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.BlockState; 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 2af0cb727..6864b71e6 100644 --- a/src/main/java/com/gmail/nossr50/config/party/ItemWeightConfig.java +++ b/src/main/java/com/gmail/nossr50/config/party/ItemWeightConfig.java @@ -1,7 +1,7 @@ package com.gmail.nossr50.config.party; import com.gmail.nossr50.config.ConfigLoader; -import com.gmail.nossr50.util.StringUtils; +import com.gmail.nossr50.util.text.StringUtils; import org.bukkit.Material; import java.util.HashSet; 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 2c0b3f795..be050d298 100755 --- a/src/main/java/com/gmail/nossr50/config/treasure/TreasureConfig.java +++ b/src/main/java/com/gmail/nossr50/config/treasure/TreasureConfig.java @@ -3,7 +3,7 @@ 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.util.text.StringUtils; import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.Tag; diff --git a/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java index 75c4ff6ca..ab87fe955 100644 --- a/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java @@ -13,7 +13,7 @@ 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 com.gmail.nossr50.util.text.StringUtils; import org.bukkit.OfflinePlayer; import java.io.*; 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/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/PartyFeature.java b/src/main/java/com/gmail/nossr50/datatypes/party/PartyFeature.java index 55fa2688f..dd215fb5a 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/party/PartyFeature.java +++ b/src/main/java/com/gmail/nossr50/datatypes/party/PartyFeature.java @@ -4,7 +4,7 @@ import com.gmail.nossr50.commands.party.PartySubcommandType; import com.gmail.nossr50.config.Config; import com.gmail.nossr50.locale.LocaleLoader; 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 { 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 766d25f63..8f022ab6c 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/skills/PrimarySkillType.java +++ b/src/main/java/com/gmail/nossr50/datatypes/skills/PrimarySkillType.java @@ -21,8 +21,8 @@ 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.gmail.nossr50.util.text.StringUtils; import com.google.common.collect.ImmutableList; import org.bukkit.Color; import org.bukkit.entity.Entity; 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 95738acfd..97f9848b1 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,7 @@ package com.gmail.nossr50.datatypes.skills; import com.gmail.nossr50.locale.LocaleLoader; -import com.gmail.nossr50.util.StringUtils; +import com.gmail.nossr50.util.text.StringUtils; import java.util.Locale; 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 dddb4bef5..6d038332c 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/skills/SuperAbilityType.java +++ b/src/main/java/com/gmail/nossr50/datatypes/skills/SuperAbilityType.java @@ -5,7 +5,7 @@ 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; 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/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/events/skills/McMMOPlayerNotificationEvent.java b/src/main/java/com/gmail/nossr50/events/skills/McMMOPlayerNotificationEvent.java index 45424ae40..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,7 +1,7 @@ package com.gmail.nossr50.events.skills; import com.gmail.nossr50.datatypes.interactions.NotificationType; -import com.gmail.nossr50.util.McMMOMessageType; +import com.gmail.nossr50.util.text.McMMOMessageType; import net.kyori.adventure.text.Component; import org.bukkit.entity.Player; import org.bukkit.event.Cancellable; 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..92050ae77 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; 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..66e3b48e6 100644 --- a/src/main/java/com/gmail/nossr50/skills/child/ChildConfig.java +++ b/src/main/java/com/gmail/nossr50/skills/child/ChildConfig.java @@ -2,7 +2,7 @@ package com.gmail.nossr50.skills.child; import com.gmail.nossr50.config.AutoUpdateConfigLoader; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; -import com.gmail.nossr50.util.StringUtils; +import com.gmail.nossr50.util.text.StringUtils; import org.bukkit.configuration.file.YamlConfiguration; import java.util.EnumSet; 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 ea2db8613..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; 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 edd33d28d..20f8e0ba0 100644 --- a/src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java +++ b/src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java @@ -28,6 +28,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; 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 910c3f5bf..8e8e56a3c 100644 --- a/src/main/java/com/gmail/nossr50/skills/repair/RepairManager.java +++ b/src/main/java/com/gmail/nossr50/skills/repair/RepairManager.java @@ -15,7 +15,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,6 +23,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.Material; import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Player; 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 f71b6fbe2..aa2d30542 100644 --- a/src/main/java/com/gmail/nossr50/skills/salvage/SalvageManager.java +++ b/src/main/java/com/gmail/nossr50/skills/salvage/SalvageManager.java @@ -15,7 +15,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; @@ -23,6 +22,7 @@ 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; 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 8df527618..7b5f11f0b 100644 --- a/src/main/java/com/gmail/nossr50/skills/taming/TamingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/taming/TamingManager.java @@ -16,7 +16,6 @@ import com.gmail.nossr50.runnables.skills.BleedTimerTask; 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.compat.layers.persistentdata.MobMetaFlagType; import com.gmail.nossr50.util.player.NotificationManager; import com.gmail.nossr50.util.random.RandomChanceSkillStatic; @@ -26,6 +25,7 @@ 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; diff --git a/src/main/java/com/gmail/nossr50/util/HolidayManager.java b/src/main/java/com/gmail/nossr50/util/HolidayManager.java index bf312524b..7004245f6 100644 --- a/src/main/java/com/gmail/nossr50/util/HolidayManager.java +++ b/src/main/java/com/gmail/nossr50/util/HolidayManager.java @@ -11,6 +11,7 @@ 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; diff --git a/src/main/java/com/gmail/nossr50/util/MobHealthbarUtils.java b/src/main/java/com/gmail/nossr50/util/MobHealthbarUtils.java index c31e51424..f306a4854 100644 --- a/src/main/java/com/gmail/nossr50/util/MobHealthbarUtils.java +++ b/src/main/java/com/gmail/nossr50/util/MobHealthbarUtils.java @@ -6,6 +6,7 @@ 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; 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 b01e34e4a..e6b50d469 100644 --- a/src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java +++ b/src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java @@ -22,7 +22,7 @@ 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; 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 84d96680d..de6f689fb 100644 --- a/src/main/java/com/gmail/nossr50/util/commands/CommandUtils.java +++ b/src/main/java/com/gmail/nossr50/util/commands/CommandUtils.java @@ -7,9 +7,9 @@ import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.mcMMO; 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.SkillUtils; +import com.gmail.nossr50.util.text.StringUtils; import com.google.common.collect.ImmutableList; import org.bukkit.OfflinePlayer; import org.bukkit.command.CommandSender; 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 6e5f7c8f4..775592a70 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/CompatibilityManager.java +++ b/src/main/java/com/gmail/nossr50/util/compat/CompatibilityManager.java @@ -2,13 +2,13 @@ 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.attackcooldown.PlayerAttackCooldownExploitPreventionLayer; import com.gmail.nossr50.util.compat.layers.persistentdata.AbstractPersistentDataLayer; import com.gmail.nossr50.util.compat.layers.persistentdata.SpigotPersistentDataLayer_1_13; import com.gmail.nossr50.util.compat.layers.persistentdata.SpigotPersistentDataLayer_1_14; 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 java.util.HashMap; 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..64ea51da3 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; 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 b42a6e3cb..b334566f2 100644 --- a/src/main/java/com/gmail/nossr50/util/player/NotificationManager.java +++ b/src/main/java/com/gmail/nossr50/util/player/NotificationManager.java @@ -10,11 +10,11 @@ import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.events.skills.McMMOPlayerNotificationEvent; import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.mcMMO; -import com.gmail.nossr50.util.McMMOMessageType; 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 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; 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 668f41976..08b931764 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/SkillUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/SkillUtils.java @@ -14,10 +14,10 @@ import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.ItemUtils; import com.gmail.nossr50.util.Misc; -import com.gmail.nossr50.util.StringUtils; import com.gmail.nossr50.util.compat.layers.persistentdata.AbstractPersistentDataLayer; 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; diff --git a/src/main/java/com/gmail/nossr50/util/McMMOMessageType.java b/src/main/java/com/gmail/nossr50/util/text/McMMOMessageType.java similarity index 94% rename from src/main/java/com/gmail/nossr50/util/McMMOMessageType.java rename to src/main/java/com/gmail/nossr50/util/text/McMMOMessageType.java index ed29e886f..f4fb0d7bb 100644 --- a/src/main/java/com/gmail/nossr50/util/McMMOMessageType.java +++ b/src/main/java/com/gmail/nossr50/util/text/McMMOMessageType.java @@ -1,4 +1,4 @@ -package com.gmail.nossr50.util; +package com.gmail.nossr50.util.text; import net.kyori.adventure.audience.Audience; import net.kyori.adventure.audience.MessageType; 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 99% rename from src/main/java/com/gmail/nossr50/util/StringUtils.java rename to src/main/java/com/gmail/nossr50/util/text/StringUtils.java index ba0b9cdc2..637e4b4e4 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; diff --git a/src/main/java/com/gmail/nossr50/util/TextComponentFactory.java b/src/main/java/com/gmail/nossr50/util/text/TextComponentFactory.java similarity index 79% rename from src/main/java/com/gmail/nossr50/util/TextComponentFactory.java rename to src/main/java/com/gmail/nossr50/util/text/TextComponentFactory.java index 302fe335c..d8c13faf2 100644 --- a/src/main/java/com/gmail/nossr50/util/TextComponentFactory.java +++ b/src/main/java/com/gmail/nossr50/util/text/TextComponentFactory.java @@ -1,4 +1,4 @@ -package com.gmail.nossr50.util; +package com.gmail.nossr50.util.text; import com.gmail.nossr50.config.Config; import com.gmail.nossr50.config.RankConfig; @@ -10,24 +10,21 @@ 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.ComponentBuilder; 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.ChatColor; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import java.lang.reflect.Array; import java.util.ArrayList; import java.util.List; import java.util.Locale; @@ -56,7 +53,7 @@ public class TextComponentFactory { 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)); + return Component.text(LocaleLoader.getString("Overhaul.Levelup", LocaleLoader.getString("Overhaul.Name."+ StringUtils.getCapitalized(skill.toString())), levelsGained, currentLevel)); } private static TextComponent getNotificationTextComponent(String text) @@ -109,6 +106,13 @@ public class TextComponentFactory { ), 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); @@ -117,12 +121,12 @@ public class TextComponentFactory { TextComponent atSignComponent = Component.text(LocaleLoader.getString("JSON.Hover.AtSymbolSkills")); //Only send 3 sub-skills per line - Component[][] splitSubSkills = splitComponentsIntoGroups(subSkillComponents, 3); + Component[][] splitSubSkills = TextUtils.splitComponentsIntoGroups(subSkillComponents, 3); ArrayList individualLinesToSend = new ArrayList<>(); //Create each line for (Component[] componentArray : splitSubSkills) { - individualLinesToSend.add(fromArray(componentArray, atSignComponent, space)); + individualLinesToSend.add(TextUtils.fromArray(componentArray, atSignComponent, space)); } //Send each group @@ -131,116 +135,6 @@ public class TextComponentFactory { } } - /** - * 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 - */ - private 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 - */ - private 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; - } - - -// public static void sendPlayerSubSkillList(Player player, List textComponents) -// { -// TextComponent emptySpace = Component.space(); -// -// AtomicReference messageToSend = new AtomicReference<>(); -// int newLineCount = 0; //Hacky solution to wordwrap problems -// -// final Audience audience = mcMMO.getAudiences().player(player); -// for (Component textComponent : textComponents) { -// //Don't send more than 3 subskills per line to avoid MOST wordwrap problems -// if(newLineCount > 2) -// { -// Component toSend = messageToSend.get(); -// if (toSend != null) { -// audience.sendMessage(Identity.nil(), toSend.append(emptySpace)); -// } -// -// messageToSend.set(null); -// newLineCount = 0; -// } -// //Style the skills into @links -// final String originalTxt = textComponent instanceof TextComponent ? ((TextComponent) textComponent).content() : ""; -// -// TextComponent.Builder stylizedText = Component.text().content(LocaleLoader.getString("JSON.Hover.AtSymbolSkills")); -// addChild(stylizedText, originalTxt); -// -// if(textComponent.hoverEvent() != null) -// stylizedText.hoverEvent(textComponent.hoverEvent()); -// -// if(textComponent.clickEvent() != null) -// stylizedText.clickEvent(textComponent.clickEvent()); -// -// messageToSend.set(stylizedText.build().append(emptySpace)); -// -// newLineCount++; -// } -// -// Component toSend = messageToSend.get(); -// if (toSend != null) { -// audience.sendMessage(Identity.nil(), toSend.append(emptySpace)); -// } -// } - private static Component getWebLinkTextComponent(McMMOWebLinks webLinks) { TextComponent.Builder webTextComponent; @@ -249,55 +143,44 @@ public class TextComponentFactory { { case WEBSITE: webTextComponent = Component.text().content(LocaleLoader.getString("JSON.Hover.AtSymbolURL")); - addChild(webTextComponent, "Web"); + TextUtils.addChildWebComponent(webTextComponent, "Web"); webTextComponent.clickEvent(getUrlClickEvent(McMMOUrl.urlWebsite)); break; case SPIGOT: webTextComponent = Component.text().content(LocaleLoader.getString("JSON.Hover.AtSymbolURL")); - addChild(webTextComponent, "Spigot"); + TextUtils.addChildWebComponent(webTextComponent, "Spigot"); webTextComponent.clickEvent(getUrlClickEvent(McMMOUrl.urlSpigot)); break; case DISCORD: webTextComponent = Component.text().content(LocaleLoader.getString("JSON.Hover.AtSymbolURL")); - addChild(webTextComponent, "Discord"); + TextUtils.addChildWebComponent(webTextComponent, "Discord"); webTextComponent.clickEvent(getUrlClickEvent(McMMOUrl.urlDiscord)); break; case PATREON: webTextComponent = Component.text().content(LocaleLoader.getString("JSON.Hover.AtSymbolURL")); - addChild(webTextComponent, "Patreon"); + TextUtils.addChildWebComponent(webTextComponent, "Patreon"); webTextComponent.clickEvent(getUrlClickEvent(McMMOUrl.urlPatreon)); break; case WIKI: webTextComponent = Component.text().content(LocaleLoader.getString("JSON.Hover.AtSymbolURL")); - addChild(webTextComponent, "Wiki"); + TextUtils.addChildWebComponent(webTextComponent, "Wiki"); webTextComponent.clickEvent(getUrlClickEvent(McMMOUrl.urlWiki)); break; case HELP_TRANSLATE: webTextComponent = Component.text().content(LocaleLoader.getString("JSON.Hover.AtSymbolURL")); - addChild(webTextComponent, "Lang"); + TextUtils.addChildWebComponent(webTextComponent, "Lang"); webTextComponent.clickEvent(getUrlClickEvent(McMMOUrl.urlTranslate)); break; default: webTextComponent = Component.text().content("NOT DEFINED"); } - addNewHoverComponentToTextComponent(webTextComponent, getUrlHoverEvent(webLinks)); + TextUtils.addNewHoverComponentToTextComponent(webTextComponent, getUrlHoverEvent(webLinks)); webTextComponent.insertion(webLinks.getUrl()); return webTextComponent.build(); } - private static void addChild(Component webTextComponent, String childName) { - TextComponent childComponent = Component.text(childName); - childComponent.color(NamedTextColor.BLUE); - webTextComponent.append(childComponent); - } - - private static void addChild(ComponentBuilder webTextComponent, String childName) { - TextComponent childComponent = Component.text(childName).color(NamedTextColor.BLUE); - webTextComponent.append(childComponent); - } - private static Component getUrlHoverEvent(McMMOWebLinks webLinks) { TextComponent.Builder componentBuilder = Component.text().content(webLinks.getNiceTitle()); @@ -367,7 +250,7 @@ public class TextComponentFactory { TextComponent.Builder textComponent = initNewSkillTextComponent(player, skillName, subSkillType, skillUnlocked); //Hover Event - addNewHoverComponentToTextComponent(textComponent, getSubSkillHoverComponent(player, subSkillType)); + TextUtils.addNewHoverComponentToTextComponent(textComponent, getSubSkillHoverComponent(player, subSkillType)); //Insertion textComponent.insertion(skillName); @@ -375,10 +258,6 @@ public class TextComponentFactory { return textComponent.build(); } - private static void addNewHoverComponentToTextComponent(TextComponent.Builder textComponent, Component baseComponent) { - textComponent.hoverEvent(HoverEvent.showText(baseComponent)); - } - private static TextComponent getSubSkillTextComponent(Player player, AbstractSubSkill abstractSubSkill) { //String key = abstractSubSkill.getConfigKeyName(); @@ -392,7 +271,7 @@ public class TextComponentFactory { TextComponent.Builder textComponent = initNewSkillTextComponent(player, skillName, subSkillType, skillUnlocked); //Hover Event - addNewHoverComponentToTextComponent(textComponent, getSubSkillHoverComponent(player, abstractSubSkill)); + TextUtils.addNewHoverComponentToTextComponent(textComponent, getSubSkillHoverComponent(player, abstractSubSkill)); //Insertion textComponent.insertion(skillName); 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..579128250 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/util/text/TextUtils.java @@ -0,0 +1,87 @@ +package com.gmail.nossr50.util.text; + +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 org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class TextUtils { + /** + * 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)); + } +} From b2cdffe9658e68febb9d456eb90737348b4c4fe1 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Wed, 4 Nov 2020 12:14:55 -0800 Subject: [PATCH 213/662] 2.1.153 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 0006c8fa2..eaa87f925 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.153-SNAPSHOT + 2.1.153 mcMMO https://github.com/mcMMO-Dev/mcMMO From a4fd632d533c10bc6f00b0a562670444f42ed5d1 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 6 Nov 2020 14:01:07 -0800 Subject: [PATCH 214/662] Fix Hex-Colored names in parties/admin chat --- Changelog.txt | 9 ++ pom.xml | 4 +- .../com/gmail/nossr50/chat/ChatManager.java | 5 +- .../chat/author/AbstractPlayerAuthor.java | 95 +++++++++++++++++++ .../nossr50/chat/author/AdminAuthor.java | 79 --------------- .../com/gmail/nossr50/chat/author/Author.java | 26 ++++- .../nossr50/chat/author/ConsoleAuthor.java | 15 ++- .../nossr50/chat/author/PartyAuthor.java | 75 --------------- .../nossr50/chat/author/PlayerAuthor.java | 33 +++++++ .../nossr50/chat/mailer/AdminChatMailer.java | 7 +- .../nossr50/chat/mailer/PartyChatMailer.java | 7 +- .../chat/message/AbstractChatMessage.java | 7 +- .../chat/message/AdminChatMessage.java | 6 ++ .../nossr50/chat/message/ChatMessage.java | 2 + .../chat/message/PartyChatMessage.java | 10 +- .../nossr50/datatypes/player/McMMOPlayer.java | 36 +++---- .../nossr50/events/chat/McMMOChatEvent.java | 25 +---- .../util/compat/CompatibilityManager.java | 25 ++++- .../util/compat/CompatibilityType.java | 3 +- ...actBungeeSerializerCompatibilityLayer.java | 11 +++ ...geeLegacySerializerCompatibilityLayer.java | 13 +++ ...geeModernSerializerCompatibilityLayer.java | 13 +++ .../gmail/nossr50/util/text/TextUtils.java | 14 +++ 23 files changed, 300 insertions(+), 220 deletions(-) create mode 100644 src/main/java/com/gmail/nossr50/chat/author/AbstractPlayerAuthor.java delete mode 100644 src/main/java/com/gmail/nossr50/chat/author/AdminAuthor.java delete mode 100644 src/main/java/com/gmail/nossr50/chat/author/PartyAuthor.java create mode 100644 src/main/java/com/gmail/nossr50/chat/author/PlayerAuthor.java create mode 100644 src/main/java/com/gmail/nossr50/util/compat/layers/bungee/AbstractBungeeSerializerCompatibilityLayer.java create mode 100644 src/main/java/com/gmail/nossr50/util/compat/layers/bungee/BungeeLegacySerializerCompatibilityLayer.java create mode 100644 src/main/java/com/gmail/nossr50/util/compat/layers/bungee/BungeeModernSerializerCompatibilityLayer.java diff --git a/Changelog.txt b/Changelog.txt index a47aabd4b..dbad616be 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,12 @@ +Version 2.1.154 + (API) Author class has been reworked + (API) McMMOChatEvent::getSender removed (use getDisplayName() instead) + (API) McMMMOChatEvent::setDisplayName() removed (you can set author names in Author) + (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 + 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 diff --git a/pom.xml b/pom.xml index eaa87f925..ddb52b939 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.153 + 2.1.154-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO @@ -243,7 +243,7 @@ org.spigotmc spigot-api - 1.14-R0.1-SNAPSHOT + 1.14.4-R0.1-SNAPSHOT provided diff --git a/src/main/java/com/gmail/nossr50/chat/ChatManager.java b/src/main/java/com/gmail/nossr50/chat/ChatManager.java index b62708d54..b8c25d11e 100644 --- a/src/main/java/com/gmail/nossr50/chat/ChatManager.java +++ b/src/main/java/com/gmail/nossr50/chat/ChatManager.java @@ -13,6 +13,7 @@ import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.Permissions; import com.gmail.nossr50.util.text.StringUtils; import net.kyori.adventure.audience.Audience; +import net.kyori.adventure.text.Component; import net.kyori.adventure.text.TextComponent; import org.bukkit.command.ConsoleCommandSender; import org.jetbrains.annotations.NotNull; @@ -70,10 +71,10 @@ public class ChatManager { private void processPlayerMessage(@NotNull McMMOPlayer mmoPlayer, @NotNull ChatChannel chatChannel, @NotNull String rawMessage, boolean isAsync) { switch (chatChannel) { case ADMIN: - adminChatMailer.processChatMessage(mmoPlayer.getAdminAuthor(), rawMessage, isAsync, Permissions.colorChat(mmoPlayer.getPlayer())); + adminChatMailer.processChatMessage(mmoPlayer.getPlayerAuthor(), rawMessage, isAsync, Permissions.colorChat(mmoPlayer.getPlayer())); break; case PARTY: - partyChatMailer.processChatMessage(mmoPlayer.getPartyAuthor(), rawMessage, mmoPlayer.getParty(), isAsync, Permissions.colorChat(mmoPlayer.getPlayer()), isPartyLeader(mmoPlayer)); + partyChatMailer.processChatMessage(mmoPlayer.getPlayerAuthor(), rawMessage, mmoPlayer.getParty(), isAsync, Permissions.colorChat(mmoPlayer.getPlayer()), isPartyLeader(mmoPlayer)); break; case PARTY_OFFICER: case NONE: 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..ea317d487 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/chat/author/AbstractPlayerAuthor.java @@ -0,0 +1,95 @@ +package com.gmail.nossr50.chat.author; + +import com.gmail.nossr50.util.text.TextUtils; +import com.google.common.base.Objects; +import net.kyori.adventure.text.TextComponent; +import org.bukkit.entity.Player; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.UUID; + +public abstract class AbstractPlayerAuthor implements Author { + private final @NotNull Player player; + private @NotNull String displayName; + private @Nullable TextComponent componentDisplayName; + private @Nullable TextComponent componentUserName; + + public AbstractPlayerAuthor(@NotNull Player player) { + this.player = player; + this.displayName = player.getDisplayName(); + } + + /** + * Grabs the {@link TextComponent} version of a players display name + * Cached and only processed as needed + * Always checks if the player display name has changed, if it has it regenerates the output + * + * @return the {@link TextComponent} version of a players display name + */ + public @NotNull TextComponent getComponentDisplayName() { + //Not sure if this is expensive but it ensures always up to date names + if(!player.getDisplayName().equals(displayName)) { + displayName = player.getDisplayName(); + componentDisplayName = null; + } + + if(componentDisplayName != null) { + return componentDisplayName; + } else { + //convert to adventure component + componentDisplayName = TextUtils.ofBungeeRawStrings(displayName); + } + return componentDisplayName; + } + + /** + * Grabs the {@link TextComponent} version of a players current minecraft nickname + * Cached and only processed as needed + * + * @return the {@link TextComponent} version of a players current minecraft nickname + */ + public @NotNull TextComponent getComponentUserName() { + //Not sure if this is expensive but it ensures always up to date names + if(componentUserName != null) { + return componentUserName; + } else { + //convert to adventure component + componentUserName = TextUtils.ofBungeeRawStrings(player.getName()); + } + return componentUserName; + } + + @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); + } + + @Override + public int hashCode() { + return Objects.hashCode(player); + } +} diff --git a/src/main/java/com/gmail/nossr50/chat/author/AdminAuthor.java b/src/main/java/com/gmail/nossr50/chat/author/AdminAuthor.java deleted file mode 100644 index e4b26f8c2..000000000 --- a/src/main/java/com/gmail/nossr50/chat/author/AdminAuthor.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.gmail.nossr50.chat.author; - -import com.gmail.nossr50.config.ChatConfig; -import com.gmail.nossr50.datatypes.chat.ChatChannel; -import com.google.common.base.Objects; -import org.bukkit.entity.Player; -import org.checkerframework.checker.nullness.qual.NonNull; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.UUID; - -public class AdminAuthor implements Author { - - private final @NotNull Player player; - private @Nullable String overrideName; - - public AdminAuthor(@NotNull Player player) { - this.player = player; - } - - @Override - public @NotNull String getAuthoredName() { - if(overrideName != null) { - return overrideName; - } else { - if(ChatConfig.getInstance().useDisplayNames(ChatChannel.ADMIN)) { - return player.getDisplayName(); - } else { - return player.getName(); - } - } - } - - public @NotNull Player getPlayer() { - return player; - } - - public @Nullable String getOverrideName() { - return overrideName; - } - - /** - * Set the name of this author - * @param newName value of the new name - */ - public void setName(@NotNull String newName) { - overrideName = newName; - } - - @Override - public boolean isConsole() { - return false; - } - - @Override - public boolean isPlayer() { - return true; - } - - @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; - AdminAuthor that = (AdminAuthor) o; - return Objects.equal(player, that.player) && - Objects.equal(overrideName, that.overrideName); - } - - @Override - public int hashCode() { - return Objects.hashCode(player, overrideName); - } -} diff --git a/src/main/java/com/gmail/nossr50/chat/author/Author.java b/src/main/java/com/gmail/nossr50/chat/author/Author.java index 7d3c4ef61..e434d8039 100644 --- a/src/main/java/com/gmail/nossr50/chat/author/Author.java +++ b/src/main/java/com/gmail/nossr50/chat/author/Author.java @@ -1,15 +1,35 @@ package com.gmail.nossr50.chat.author; +import com.gmail.nossr50.datatypes.chat.ChatChannel; import net.kyori.adventure.identity.Identity; +import net.kyori.adventure.text.TextComponent; import org.jetbrains.annotations.NotNull; public interface Author extends Identity { /** - * The name of this author - * @return the name of this author + * The name of this author as used in mcMMO chat + * This is the {@link TextComponent} 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 + * + * NOTE: + * mcMMO doesn't use this method currently because we convert the whole chat message from raw Bungee-compatible strings to Bungee components before converting it to adventure components (hacky and will be changed later) + * So this method is provided for future use or if plugins want to make use of it + * + * @param chatChannel which chat channel this is going to + * @return The name of this author as used in mcMMO chat */ - @NotNull String getAuthoredName(); + @NotNull TextComponent getAuthoredComponentName(@NotNull ChatChannel chatChannel); + + /** + * 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} diff --git a/src/main/java/com/gmail/nossr50/chat/author/ConsoleAuthor.java b/src/main/java/com/gmail/nossr50/chat/author/ConsoleAuthor.java index 7c48cfba3..978b5d544 100644 --- a/src/main/java/com/gmail/nossr50/chat/author/ConsoleAuthor.java +++ b/src/main/java/com/gmail/nossr50/chat/author/ConsoleAuthor.java @@ -1,5 +1,8 @@ package com.gmail.nossr50.chat.author; +import com.gmail.nossr50.datatypes.chat.ChatChannel; +import com.gmail.nossr50.util.text.TextUtils; +import net.kyori.adventure.text.TextComponent; import org.checkerframework.checker.nullness.qual.NonNull; import org.jetbrains.annotations.NotNull; @@ -8,14 +11,22 @@ import java.util.UUID; public class ConsoleAuthor implements Author { private final UUID uuid; private final @NotNull String name; + private final @NotNull TextComponent componentName; public ConsoleAuthor(@NotNull String name) { - this.name = name; this.uuid = new UUID(0, 0); + this.name = name; + this.componentName = TextUtils.ofBungeeRawStrings(name); + } + + //TODO: Think of a better solution later + @Override + public @NotNull TextComponent getAuthoredComponentName(@NotNull ChatChannel chatChannel) { + return componentName; } @Override - public @NotNull String getAuthoredName() { + public @NotNull String getAuthoredName(@NotNull ChatChannel chatChannel) { return name; } diff --git a/src/main/java/com/gmail/nossr50/chat/author/PartyAuthor.java b/src/main/java/com/gmail/nossr50/chat/author/PartyAuthor.java deleted file mode 100644 index 3a821018c..000000000 --- a/src/main/java/com/gmail/nossr50/chat/author/PartyAuthor.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.gmail.nossr50.chat.author; - -import com.gmail.nossr50.config.ChatConfig; -import com.gmail.nossr50.datatypes.chat.ChatChannel; -import com.google.common.base.Objects; -import org.bukkit.entity.Player; -import org.checkerframework.checker.nullness.qual.NonNull; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.UUID; - -public class PartyAuthor implements Author { - - private final @NotNull Player player; - private @Nullable String overrideName; - - public PartyAuthor(@NotNull Player player) { - this.player = player; - } - - @Override - public @NotNull String getAuthoredName() { - if(overrideName != null) { - return overrideName; - } else { - if(ChatConfig.getInstance().useDisplayNames(ChatChannel.PARTY)) { - return player.getDisplayName(); - } else { - return player.getName(); - } - } - } - - /** - * Set the name of this author - * @param newName value of the new name - */ - public void setName(@NotNull String newName) { - overrideName = newName; - } - - @Override - public boolean isConsole() { - return false; - } - - @Override - public boolean isPlayer() { - return true; - } - - public 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; - PartyAuthor that = (PartyAuthor) o; - return Objects.equal(player, that.player) && - Objects.equal(overrideName, that.overrideName); - } - - @Override - public int hashCode() { - return Objects.hashCode(player, overrideName); - } -} 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..1921faaed --- /dev/null +++ b/src/main/java/com/gmail/nossr50/chat/author/PlayerAuthor.java @@ -0,0 +1,33 @@ +package com.gmail.nossr50.chat.author; + +import com.gmail.nossr50.config.ChatConfig; +import com.gmail.nossr50.datatypes.chat.ChatChannel; +import net.kyori.adventure.text.TextComponent; +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 TextComponent getAuthoredComponentName(@NotNull ChatChannel chatChannel) { + if(ChatConfig.getInstance().useDisplayNames(chatChannel)) { + return getComponentDisplayName(); + } else { + return getComponentUserName(); + } + } + + @Override + public @NotNull String getAuthoredName(@NotNull ChatChannel chatChannel) { + if(ChatConfig.getInstance().useDisplayNames(chatChannel)) { + return getPlayer().getDisplayName(); + } else { + return getPlayer().getName(); + } + } + +} diff --git a/src/main/java/com/gmail/nossr50/chat/mailer/AdminChatMailer.java b/src/main/java/com/gmail/nossr50/chat/mailer/AdminChatMailer.java index c627876ee..644657df8 100644 --- a/src/main/java/com/gmail/nossr50/chat/mailer/AdminChatMailer.java +++ b/src/main/java/com/gmail/nossr50/chat/mailer/AdminChatMailer.java @@ -3,12 +3,13 @@ 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.Component; import net.kyori.adventure.text.TextComponent; import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; @@ -53,9 +54,9 @@ public class AdminChatMailer extends AbstractChatMailer { */ public @NotNull TextComponent addStyle(@NotNull Author author, @NotNull String message, boolean canColor) { if(canColor) { - return Component.text(LocaleLoader.getString("Chat.Style.Admin", author.getAuthoredName(), LocaleLoader.addColors(message))); + return TextUtils.ofBungeeRawStrings(LocaleLoader.getString("Chat.Style.Admin", author.getAuthoredName(ChatChannel.ADMIN), LocaleLoader.addColors(message))); } else { - return Component.text(LocaleLoader.getString("Chat.Style.Admin", author.getAuthoredName(), message)); + return TextUtils.ofBungeeRawStrings(LocaleLoader.getString("Chat.Style.Admin", author.getAuthoredName(ChatChannel.ADMIN), message)); } } diff --git a/src/main/java/com/gmail/nossr50/chat/mailer/PartyChatMailer.java b/src/main/java/com/gmail/nossr50/chat/mailer/PartyChatMailer.java index 3e7d19cc4..5b69edeef 100644 --- a/src/main/java/com/gmail/nossr50/chat/mailer/PartyChatMailer.java +++ b/src/main/java/com/gmail/nossr50/chat/mailer/PartyChatMailer.java @@ -3,13 +3,14 @@ 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.Component; import net.kyori.adventure.text.TextComponent; import org.bukkit.Bukkit; import org.bukkit.plugin.Plugin; @@ -49,9 +50,9 @@ public class PartyChatMailer extends AbstractChatMailer { } if(isLeader) { - return Component.text(LocaleLoader.getString("Chat.Style.Party.Leader", author.getAuthoredName(), message)); + return TextUtils.ofBungeeRawStrings(LocaleLoader.getString("Chat.Style.Party.Leader", author.getAuthoredName(ChatChannel.PARTY), message)); } else { - return Component.text(LocaleLoader.getString("Chat.Style.Party", author.getAuthoredName(), message)); + return TextUtils.ofBungeeRawStrings(LocaleLoader.getString("Chat.Style.Party", author.getAuthoredName(ChatChannel.PARTY), message)); } } diff --git a/src/main/java/com/gmail/nossr50/chat/message/AbstractChatMessage.java b/src/main/java/com/gmail/nossr50/chat/message/AbstractChatMessage.java index 5e965140c..5015be0c0 100644 --- a/src/main/java/com/gmail/nossr50/chat/message/AbstractChatMessage.java +++ b/src/main/java/com/gmail/nossr50/chat/message/AbstractChatMessage.java @@ -1,8 +1,10 @@ package com.gmail.nossr50.chat.message; import com.gmail.nossr50.chat.author.Author; +import com.gmail.nossr50.datatypes.chat.ChatChannel; import com.google.common.base.Objects; import net.kyori.adventure.audience.Audience; +import net.kyori.adventure.text.Component; import net.kyori.adventure.text.TextComponent; import org.bukkit.plugin.Plugin; import org.jetbrains.annotations.NotNull; @@ -33,11 +35,6 @@ public abstract class AbstractChatMessage implements ChatMessage { return author; } - @Override - public @NotNull String getAuthorDisplayName() { - return author.getAuthoredName(); - } - @Override public @NotNull Audience getAudience() { return 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 index 5cbd3d673..973c0f0c7 100644 --- a/src/main/java/com/gmail/nossr50/chat/message/AdminChatMessage.java +++ b/src/main/java/com/gmail/nossr50/chat/message/AdminChatMessage.java @@ -1,6 +1,7 @@ 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; @@ -15,4 +16,9 @@ public class AdminChatMessage extends AbstractChatMessage { 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 index 45bc1ac18..c4c0264cf 100644 --- a/src/main/java/com/gmail/nossr50/chat/message/ChatMessage.java +++ b/src/main/java/com/gmail/nossr50/chat/message/ChatMessage.java @@ -1,7 +1,9 @@ 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.Component; import net.kyori.adventure.text.TextComponent; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/com/gmail/nossr50/chat/message/PartyChatMessage.java b/src/main/java/com/gmail/nossr50/chat/message/PartyChatMessage.java index ecf593c11..2dee5c2e6 100644 --- a/src/main/java/com/gmail/nossr50/chat/message/PartyChatMessage.java +++ b/src/main/java/com/gmail/nossr50/chat/message/PartyChatMessage.java @@ -1,14 +1,15 @@ 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.gmail.nossr50.util.text.TextUtils; import com.google.common.base.Objects; import net.kyori.adventure.audience.Audience; -import net.kyori.adventure.text.Component; import net.kyori.adventure.text.TextComponent; import org.bukkit.entity.Player; import org.bukkit.plugin.Plugin; @@ -31,6 +32,11 @@ public class PartyChatMessage extends AbstractChatMessage { return party; } + @Override + public @NotNull String getAuthorDisplayName() { + return author.getAuthoredName(ChatChannel.PARTY); + } + @Override public void sendMessage() { /* @@ -40,7 +46,7 @@ public class PartyChatMessage extends AbstractChatMessage { //Sends to everyone but console audience.sendMessage(author, componentMessage); - TextComponent spyMessage = Component.text(LocaleLoader.getString("Chat.Spy.Party", author.getAuthoredName(), rawMessage, party.getName())); + TextComponent spyMessage = TextUtils.ofBungeeRawStrings(LocaleLoader.getString("Chat.Spy.Party", author.getAuthoredName(ChatChannel.PARTY), rawMessage, party.getName())); //Relay to spies messagePartyChatSpies(spyMessage); 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 1223c9083..21459c837 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java +++ b/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java @@ -1,7 +1,6 @@ package com.gmail.nossr50.datatypes.player; -import com.gmail.nossr50.chat.author.AdminAuthor; -import com.gmail.nossr50.chat.author.PartyAuthor; +import com.gmail.nossr50.chat.author.PlayerAuthor; import com.gmail.nossr50.config.AdvancedConfig; import com.gmail.nossr50.config.ChatConfig; import com.gmail.nossr50.config.Config; @@ -74,8 +73,7 @@ public class McMMOPlayer implements Identified { private final @NotNull Identity identity; //Hacky fix for now, redesign later - private final @NotNull PartyAuthor partyAuthor; - private final @NotNull AdminAuthor adminAuthor; + private final @NotNull PlayerAuthor playerAuthor; private final Player player; private final PlayerProfile profile; @@ -158,8 +156,7 @@ public class McMMOPlayer implements Identified { debugMode = false; //Debug mode helps solve support issues, players can toggle it on or off attackStrength = 1.0D; - this.adminAuthor = new AdminAuthor(player); - this.partyAuthor = new PartyAuthor(player); + this.playerAuthor = new PlayerAuthor(player); this.chatChannel = ChatChannel.NONE; @@ -176,9 +173,9 @@ public class McMMOPlayer implements Identified { return attackStrength; } - public void setAttackStrength(double attackStrength) { - this.attackStrength = attackStrength; - } +// public void setAttackStrength(double attackStrength) { +// this.attackStrength = attackStrength; +// } /*public void hideXpBar(PrimarySkillType primarySkillType) { @@ -1049,22 +1046,25 @@ public class McMMOPlayer implements Identified { return identity; } - //TODO: Replace this hacky crap - public @NotNull PartyAuthor getPartyAuthor() { - return partyAuthor; - } - //TODO: Replace this hacky crap - public @NotNull AdminAuthor getAdminAuthor() { - return adminAuthor; + /** + * 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; } - public void setChatMode(ChatChannel chatChannel) { - //TODO: Code in the "you turned off blah, you turned on blah" messages. + /** + * 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/events/chat/McMMOChatEvent.java b/src/main/java/com/gmail/nossr50/events/chat/McMMOChatEvent.java index a612d6170..5f9980398 100644 --- a/src/main/java/com/gmail/nossr50/events/chat/McMMOChatEvent.java +++ b/src/main/java/com/gmail/nossr50/events/chat/McMMOChatEvent.java @@ -3,6 +3,7 @@ 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; @@ -57,23 +58,13 @@ public abstract class McMMOChatEvent extends Event implements Cancellable { return plugin; } - /** - * The display name of the author - * - * @return the display name of the author - * @deprecated Use {@link #getDisplayName()} instead - */ - @Deprecated - public @NotNull String getSender() { - return getAuthor().getAuthoredName(); - } - /** * 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 @NotNull String getDisplayName() { - return getAuthor().getAuthoredName(); + public @NotNull String getDisplayName(ChatChannel chatChannel) { + return getAuthor().getAuthoredName(chatChannel); } /** @@ -115,14 +106,6 @@ public abstract class McMMOChatEvent extends Event implements Cancellable { this.chatMessage.setChatMessage(chatMessage); } - /** - * Does not function anymore - */ - @Deprecated - public void setDisplayName(@NotNull String displayName) { - return; - } - /** * @param message Adjusts the final message sent to players in the party * 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 775592a70..6749add9a 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/CompatibilityManager.java +++ b/src/main/java/com/gmail/nossr50/util/compat/CompatibilityManager.java @@ -2,7 +2,9 @@ package com.gmail.nossr50.util.compat; import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.mcMMO; -import com.gmail.nossr50.util.compat.layers.attackcooldown.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.persistentdata.AbstractPersistentDataLayer; import com.gmail.nossr50.util.compat.layers.persistentdata.SpigotPersistentDataLayer_1_13; import com.gmail.nossr50.util.compat.layers.persistentdata.SpigotPersistentDataLayer_1_14; @@ -26,8 +28,9 @@ public class CompatibilityManager { private final NMSVersion nmsVersion; /* Compatibility Layers */ - private PlayerAttackCooldownExploitPreventionLayer playerAttackCooldownExploitPreventionLayer; +// private PlayerAttackCooldownExploitPreventionLayer playerAttackCooldownExploitPreventionLayer; private AbstractPersistentDataLayer persistentDataLayer; + private AbstractBungeeSerializerCompatibilityLayer bungeeSerializerCompatibilityLayer; public CompatibilityManager(MinecraftGameVersion minecraftGameVersion) { mcMMO.p.getLogger().info("Loading compatibility layers..."); @@ -60,10 +63,19 @@ public class CompatibilityManager { */ private void initCompatibilityLayers() { initPersistentDataLayer(); + initBungeeSerializerLayer(); isFullyCompatibleServerSoftware = true; } + private void initBungeeSerializerLayer() { + if(minecraftGameVersion.getMinorVersion().asInt() >= 16) { + bungeeSerializerCompatibilityLayer = new BungeeModernSerializerCompatibilityLayer(); + } else { + bungeeSerializerCompatibilityLayer = new BungeeLegacySerializerCompatibilityLayer(); + } + } + private void initPersistentDataLayer() { if(minecraftGameVersion.getMinorVersion().asInt() >= 14 || minecraftGameVersion.getMajorVersion().asInt() >= 2) { @@ -133,8 +145,13 @@ public class CompatibilityManager { return NMSVersion.UNSUPPORTED; } - public PlayerAttackCooldownExploitPreventionLayer getPlayerAttackCooldownExploitPreventionLayer() { - return playerAttackCooldownExploitPreventionLayer; +// public PlayerAttackCooldownExploitPreventionLayer getPlayerAttackCooldownExploitPreventionLayer() { +// return playerAttackCooldownExploitPreventionLayer; +// } + + + public AbstractBungeeSerializerCompatibilityLayer getBungeeSerializerCompatibilityLayer() { + return bungeeSerializerCompatibilityLayer; } public AbstractPersistentDataLayer getPersistentDataLayer() { 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 3304982c7..a54fd9485 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/CompatibilityType.java +++ b/src/main/java/com/gmail/nossr50/util/compat/CompatibilityType.java @@ -2,5 +2,6 @@ package com.gmail.nossr50.util.compat; public enum CompatibilityType { PLAYER_ATTACK_COOLDOWN_EXPLOIT_PREVENTION, - PERSISTENT_DATA + PERSISTENT_DATA, + BUNGEE_SERIALIZER } 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/text/TextUtils.java b/src/main/java/com/gmail/nossr50/util/text/TextUtils.java index 579128250..7007d7f1d 100644 --- a/src/main/java/com/gmail/nossr50/util/text/TextUtils.java +++ b/src/main/java/com/gmail/nossr50/util/text/TextUtils.java @@ -1,10 +1,12 @@ 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.md_5.bungee.api.chat.BaseComponent; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -84,4 +86,16 @@ public class TextUtils { 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)); + } } From 5b6a57d7a8db1d9aa5ea5a9f1e83286d5d3477b3 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 6 Nov 2020 14:04:40 -0800 Subject: [PATCH 215/662] Tree Feller drops saplings again --- Changelog.txt | 1 + .../gmail/nossr50/skills/woodcutting/WoodcuttingManager.java | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index dbad616be..7cb768366 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,4 +1,5 @@ Version 2.1.154 + Fixed a bug where Tree Feller was not dropping stuff like saplings (API) Author class has been reworked (API) McMMOChatEvent::getSender removed (use getDisplayName() instead) (API) McMMMOChatEvent::setDisplayName() removed (you can set author names in Author) 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 8b649a208..c63706200 100644 --- a/src/main/java/com/gmail/nossr50/skills/woodcutting/WoodcuttingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/woodcutting/WoodcuttingManager.java @@ -301,7 +301,8 @@ public class WoodcuttingManager extends SkillManager { processHarvestLumber(blockState); } else if (BlockUtils.isNonWoodPartOfTree(blockState)) { //Drop displaced non-woodcutting XP blocks - Misc.spawnItemsFromCollection(Misc.getBlockCenter(blockState), block.getDrops(), ItemSpawnReason.TREE_FELLER_DISPLACED_BLOCK, 1); +// Misc.spawnItemsFromCollection(Misc.getBlockCenter(blockState), block.getDrops(), ItemSpawnReason.TREE_FELLER_DISPLACED_BLOCK, 1); + Misc.spawnItemsFromCollection(Misc.getBlockCenter(blockState), block.getDrops(), ItemSpawnReason.TREE_FELLER_DISPLACED_BLOCK); } blockState.setType(Material.AIR); From 0f15f234b5327b798b83cabd75d8da52203e3066 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 6 Nov 2020 14:05:40 -0800 Subject: [PATCH 216/662] Update changelog --- Changelog.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/Changelog.txt b/Changelog.txt index 7cb768366..8d64f63cd 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,5 +1,6 @@ Version 2.1.154 Fixed a bug where Tree Feller was not dropping stuff like saplings + Fixed a bug where player names that used hex color codes weren't working in party or admin chat (API) Author class has been reworked (API) McMMOChatEvent::getSender removed (use getDisplayName() instead) (API) McMMMOChatEvent::setDisplayName() removed (you can set author names in Author) From bd486801254e71e335a917911c973043639dfc48 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 6 Nov 2020 14:13:46 -0800 Subject: [PATCH 217/662] Use legacy serializer instead --- src/main/java/com/gmail/nossr50/chat/ChatManager.java | 1 - .../com/gmail/nossr50/chat/author/AbstractPlayerAuthor.java | 4 ++-- .../java/com/gmail/nossr50/chat/mailer/AdminChatMailer.java | 4 ++-- .../java/com/gmail/nossr50/chat/mailer/PartyChatMailer.java | 4 ++-- .../com/gmail/nossr50/chat/message/AbstractChatMessage.java | 2 -- .../java/com/gmail/nossr50/chat/message/ChatMessage.java | 2 -- .../com/gmail/nossr50/chat/message/PartyChatMessage.java | 2 +- src/main/java/com/gmail/nossr50/util/text/TextUtils.java | 5 +++++ 8 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/chat/ChatManager.java b/src/main/java/com/gmail/nossr50/chat/ChatManager.java index b8c25d11e..ae6499583 100644 --- a/src/main/java/com/gmail/nossr50/chat/ChatManager.java +++ b/src/main/java/com/gmail/nossr50/chat/ChatManager.java @@ -13,7 +13,6 @@ import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.Permissions; import com.gmail.nossr50.util.text.StringUtils; import net.kyori.adventure.audience.Audience; -import net.kyori.adventure.text.Component; import net.kyori.adventure.text.TextComponent; import org.bukkit.command.ConsoleCommandSender; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/com/gmail/nossr50/chat/author/AbstractPlayerAuthor.java b/src/main/java/com/gmail/nossr50/chat/author/AbstractPlayerAuthor.java index ea317d487..7cc36eee7 100644 --- a/src/main/java/com/gmail/nossr50/chat/author/AbstractPlayerAuthor.java +++ b/src/main/java/com/gmail/nossr50/chat/author/AbstractPlayerAuthor.java @@ -39,7 +39,7 @@ public abstract class AbstractPlayerAuthor implements Author { return componentDisplayName; } else { //convert to adventure component - componentDisplayName = TextUtils.ofBungeeRawStrings(displayName); + componentDisplayName = TextUtils.ofLegacyTextRaw(displayName); } return componentDisplayName; } @@ -56,7 +56,7 @@ public abstract class AbstractPlayerAuthor implements Author { return componentUserName; } else { //convert to adventure component - componentUserName = TextUtils.ofBungeeRawStrings(player.getName()); + componentUserName = TextUtils.ofLegacyTextRaw(player.getName()); } return componentUserName; } diff --git a/src/main/java/com/gmail/nossr50/chat/mailer/AdminChatMailer.java b/src/main/java/com/gmail/nossr50/chat/mailer/AdminChatMailer.java index 644657df8..7886bc5cc 100644 --- a/src/main/java/com/gmail/nossr50/chat/mailer/AdminChatMailer.java +++ b/src/main/java/com/gmail/nossr50/chat/mailer/AdminChatMailer.java @@ -54,9 +54,9 @@ public class AdminChatMailer extends AbstractChatMailer { */ public @NotNull TextComponent addStyle(@NotNull Author author, @NotNull String message, boolean canColor) { if(canColor) { - return TextUtils.ofBungeeRawStrings(LocaleLoader.getString("Chat.Style.Admin", author.getAuthoredName(ChatChannel.ADMIN), LocaleLoader.addColors(message))); + return TextUtils.ofLegacyTextRaw(LocaleLoader.getString("Chat.Style.Admin", author.getAuthoredName(ChatChannel.ADMIN), LocaleLoader.addColors(message))); } else { - return TextUtils.ofBungeeRawStrings(LocaleLoader.getString("Chat.Style.Admin", author.getAuthoredName(ChatChannel.ADMIN), message)); + return TextUtils.ofLegacyTextRaw(LocaleLoader.getString("Chat.Style.Admin", author.getAuthoredName(ChatChannel.ADMIN), message)); } } diff --git a/src/main/java/com/gmail/nossr50/chat/mailer/PartyChatMailer.java b/src/main/java/com/gmail/nossr50/chat/mailer/PartyChatMailer.java index 5b69edeef..603934ee1 100644 --- a/src/main/java/com/gmail/nossr50/chat/mailer/PartyChatMailer.java +++ b/src/main/java/com/gmail/nossr50/chat/mailer/PartyChatMailer.java @@ -50,9 +50,9 @@ public class PartyChatMailer extends AbstractChatMailer { } if(isLeader) { - return TextUtils.ofBungeeRawStrings(LocaleLoader.getString("Chat.Style.Party.Leader", author.getAuthoredName(ChatChannel.PARTY), message)); + return TextUtils.ofLegacyTextRaw(LocaleLoader.getString("Chat.Style.Party.Leader", author.getAuthoredName(ChatChannel.PARTY), message)); } else { - return TextUtils.ofBungeeRawStrings(LocaleLoader.getString("Chat.Style.Party", author.getAuthoredName(ChatChannel.PARTY), message)); + return TextUtils.ofLegacyTextRaw(LocaleLoader.getString("Chat.Style.Party", author.getAuthoredName(ChatChannel.PARTY), message)); } } diff --git a/src/main/java/com/gmail/nossr50/chat/message/AbstractChatMessage.java b/src/main/java/com/gmail/nossr50/chat/message/AbstractChatMessage.java index 5015be0c0..5eeb889e4 100644 --- a/src/main/java/com/gmail/nossr50/chat/message/AbstractChatMessage.java +++ b/src/main/java/com/gmail/nossr50/chat/message/AbstractChatMessage.java @@ -1,10 +1,8 @@ package com.gmail.nossr50.chat.message; import com.gmail.nossr50.chat.author.Author; -import com.gmail.nossr50.datatypes.chat.ChatChannel; import com.google.common.base.Objects; import net.kyori.adventure.audience.Audience; -import net.kyori.adventure.text.Component; import net.kyori.adventure.text.TextComponent; import org.bukkit.plugin.Plugin; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/com/gmail/nossr50/chat/message/ChatMessage.java b/src/main/java/com/gmail/nossr50/chat/message/ChatMessage.java index c4c0264cf..45bc1ac18 100644 --- a/src/main/java/com/gmail/nossr50/chat/message/ChatMessage.java +++ b/src/main/java/com/gmail/nossr50/chat/message/ChatMessage.java @@ -1,9 +1,7 @@ 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.Component; import net.kyori.adventure.text.TextComponent; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/com/gmail/nossr50/chat/message/PartyChatMessage.java b/src/main/java/com/gmail/nossr50/chat/message/PartyChatMessage.java index 2dee5c2e6..3c957d483 100644 --- a/src/main/java/com/gmail/nossr50/chat/message/PartyChatMessage.java +++ b/src/main/java/com/gmail/nossr50/chat/message/PartyChatMessage.java @@ -46,7 +46,7 @@ public class PartyChatMessage extends AbstractChatMessage { //Sends to everyone but console audience.sendMessage(author, componentMessage); - TextComponent spyMessage = TextUtils.ofBungeeRawStrings(LocaleLoader.getString("Chat.Spy.Party", author.getAuthoredName(ChatChannel.PARTY), rawMessage, party.getName())); + TextComponent spyMessage = TextUtils.ofLegacyTextRaw(LocaleLoader.getString("Chat.Spy.Party", author.getAuthoredName(ChatChannel.PARTY), rawMessage, party.getName())); //Relay to spies messagePartyChatSpies(spyMessage); diff --git a/src/main/java/com/gmail/nossr50/util/text/TextUtils.java b/src/main/java/com/gmail/nossr50/util/text/TextUtils.java index 7007d7f1d..865105eb1 100644 --- a/src/main/java/com/gmail/nossr50/util/text/TextUtils.java +++ b/src/main/java/com/gmail/nossr50/util/text/TextUtils.java @@ -6,6 +6,7 @@ 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.serializer.legacy.LegacyComponentSerializer; import net.md_5.bungee.api.chat.BaseComponent; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -98,4 +99,8 @@ public class TextUtils { 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); + } } From 1383457eba0e27ba1b577753e3f1476dbf0a1641 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 6 Nov 2020 14:16:24 -0800 Subject: [PATCH 218/662] Update javadocs --- src/main/java/com/gmail/nossr50/chat/author/Author.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/chat/author/Author.java b/src/main/java/com/gmail/nossr50/chat/author/Author.java index e434d8039..36977b99e 100644 --- a/src/main/java/com/gmail/nossr50/chat/author/Author.java +++ b/src/main/java/com/gmail/nossr50/chat/author/Author.java @@ -13,8 +13,8 @@ public interface Author extends Identity { * 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 * * NOTE: - * mcMMO doesn't use this method currently because we convert the whole chat message from raw Bungee-compatible strings to Bungee components before converting it to adventure components (hacky and will be changed later) - * So this method is provided for future use or if plugins want to make use of it + * mcMMO doesn't transform a players name into a component when creating the chat message, instead it converts the whole string from raw legacy text (including md5 stuff) -> TextComponent via {@link net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer} + * This method is just provided for convenience, it uses lazy initialization * * @param chatChannel which chat channel this is going to * @return The name of this author as used in mcMMO chat From 4abf64f6257ff0e1232b96531339bcfa28a8112e Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 6 Nov 2020 15:16:26 -0800 Subject: [PATCH 219/662] Full hex color support in admin/party chat --- Changelog.txt | 12 +++++-- .../nossr50/chat/mailer/AdminChatMailer.java | 4 ++- .../nossr50/chat/mailer/PartyChatMailer.java | 16 ++++++---- .../chat/message/PartyChatMessage.java | 2 +- .../nossr50/commands/CommandManager.java | 1 + .../commands/chat/AdminChatCommand.java | 3 ++ .../gmail/nossr50/locale/LocaleLoader.java | 29 +++++++++++++++++ .../gmail/nossr50/util/text/TextUtils.java | 31 +++++++++++++++++++ 8 files changed, 88 insertions(+), 10 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 8d64f63cd..0e4573159 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,6 +1,9 @@ Version 2.1.154 - Fixed a bug where Tree Feller was not dropping stuff like saplings - Fixed a bug where player names that used hex color codes weren't working in party or admin chat + 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 (you can set author names in Author) @@ -8,6 +11,11 @@ Version 2.1.154 (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) diff --git a/src/main/java/com/gmail/nossr50/chat/mailer/AdminChatMailer.java b/src/main/java/com/gmail/nossr50/chat/mailer/AdminChatMailer.java index 7886bc5cc..a238d4e63 100644 --- a/src/main/java/com/gmail/nossr50/chat/mailer/AdminChatMailer.java +++ b/src/main/java/com/gmail/nossr50/chat/mailer/AdminChatMailer.java @@ -54,7 +54,7 @@ public class AdminChatMailer extends AbstractChatMailer { */ public @NotNull TextComponent addStyle(@NotNull Author author, @NotNull String message, boolean canColor) { if(canColor) { - return TextUtils.ofLegacyTextRaw(LocaleLoader.getString("Chat.Style.Admin", author.getAuthoredName(ChatChannel.ADMIN), LocaleLoader.addColors(message))); + return LocaleLoader.getTextComponent("Chat.Style.Admin", TextUtils.sanitizeAuthorName(author, ChatChannel.ADMIN), message); } else { return TextUtils.ofLegacyTextRaw(LocaleLoader.getString("Chat.Style.Admin", author.getAuthoredName(ChatChannel.ADMIN), message)); } @@ -75,4 +75,6 @@ public class AdminChatMailer extends AbstractChatMailer { sendMail(chatMessage); } } + + } diff --git a/src/main/java/com/gmail/nossr50/chat/mailer/PartyChatMailer.java b/src/main/java/com/gmail/nossr50/chat/mailer/PartyChatMailer.java index 603934ee1..37c02f144 100644 --- a/src/main/java/com/gmail/nossr50/chat/mailer/PartyChatMailer.java +++ b/src/main/java/com/gmail/nossr50/chat/mailer/PartyChatMailer.java @@ -46,13 +46,17 @@ public class PartyChatMailer extends AbstractChatMailer { */ public @NotNull TextComponent addStyle(@NotNull Author author, @NotNull String message, boolean canColor, boolean isLeader) { if(canColor) { - message = LocaleLoader.addColors(message); - } - - if(isLeader) { - return TextUtils.ofLegacyTextRaw(LocaleLoader.getString("Chat.Style.Party.Leader", author.getAuthoredName(ChatChannel.PARTY), message)); + if(isLeader) { + return LocaleLoader.getTextComponent("Chat.Style.Party.Leader", TextUtils.sanitizeAuthorName(author, ChatChannel.PARTY), message); + } else { + return LocaleLoader.getTextComponent("Chat.Style.Party", author.getAuthoredName(ChatChannel.PARTY), message); + } } else { - return TextUtils.ofLegacyTextRaw(LocaleLoader.getString("Chat.Style.Party", author.getAuthoredName(ChatChannel.PARTY), message)); + 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)); + } } } diff --git a/src/main/java/com/gmail/nossr50/chat/message/PartyChatMessage.java b/src/main/java/com/gmail/nossr50/chat/message/PartyChatMessage.java index 3c957d483..c66644d6e 100644 --- a/src/main/java/com/gmail/nossr50/chat/message/PartyChatMessage.java +++ b/src/main/java/com/gmail/nossr50/chat/message/PartyChatMessage.java @@ -46,7 +46,7 @@ public class PartyChatMessage extends AbstractChatMessage { //Sends to everyone but console audience.sendMessage(author, componentMessage); - TextComponent spyMessage = TextUtils.ofLegacyTextRaw(LocaleLoader.getString("Chat.Spy.Party", author.getAuthoredName(ChatChannel.PARTY), rawMessage, party.getName())); + TextComponent spyMessage = LocaleLoader.getTextComponent("Chat.Spy.Party", TextUtils.sanitizeAuthorName(author, ChatChannel.PARTY), rawMessage, party.getName()); //Relay to spies messagePartyChatSpies(spyMessage); diff --git a/src/main/java/com/gmail/nossr50/commands/CommandManager.java b/src/main/java/com/gmail/nossr50/commands/CommandManager.java index 7182744b2..de5d4a7fd 100644 --- a/src/main/java/com/gmail/nossr50/commands/CommandManager.java +++ b/src/main/java/com/gmail/nossr50/commands/CommandManager.java @@ -59,6 +59,7 @@ public class CommandManager { BukkitCommandIssuer issuer = context.getIssuer(); if(issuer.getIssuer() instanceof Player) { + validateLoadedData(issuer.getPlayer()); validateAdmin(issuer.getPlayer()); } }); 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 f8547a4a0..e2b2aef79 100644 --- a/src/main/java/com/gmail/nossr50/commands/chat/AdminChatCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/chat/AdminChatCommand.java @@ -36,6 +36,9 @@ public class AdminChatCommand extends BaseCommand { 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 { diff --git a/src/main/java/com/gmail/nossr50/locale/LocaleLoader.java b/src/main/java/com/gmail/nossr50/locale/LocaleLoader.java index ac6f496ea..f4f57ceaf 100644 --- a/src/main/java/com/gmail/nossr50/locale/LocaleLoader.java +++ b/src/main/java/com/gmail/nossr50/locale/LocaleLoader.java @@ -2,6 +2,8 @@ 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 java.io.IOException; @@ -42,6 +44,23 @@ 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 TextComponent getTextComponent(String key, Object... messageArguments) { + if (bundle == null) { + initialize(); + } + + String rawMessage = bundleCache.computeIfAbsent(key, LocaleLoader::getRawString); + return formatComponent(rawMessage, messageArguments); + } + /** * Reloads locale */ @@ -90,6 +109,16 @@ public final class LocaleLoader { return string; } + public static TextComponent formatComponent(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(); diff --git a/src/main/java/com/gmail/nossr50/util/text/TextUtils.java b/src/main/java/com/gmail/nossr50/util/text/TextUtils.java index 865105eb1..231b7be69 100644 --- a/src/main/java/com/gmail/nossr50/util/text/TextUtils.java +++ b/src/main/java/com/gmail/nossr50/util/text/TextUtils.java @@ -1,5 +1,7 @@ package com.gmail.nossr50.util.text; +import com.gmail.nossr50.chat.author.Author; +import com.gmail.nossr50.datatypes.chat.ChatChannel; import com.gmail.nossr50.mcMMO; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.ComponentBuilder; @@ -14,6 +16,9 @@ import org.jetbrains.annotations.Nullable; import java.util.List; public class TextUtils { + + private static @Nullable LegacyComponentSerializer customLegacySerializer; + /** * 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 @@ -103,4 +108,30 @@ public class TextUtils { public static @NotNull TextComponent ofLegacyTextRaw(@NotNull String rawString) { return LegacyComponentSerializer.legacySection().deserialize(rawString); } + + public static @NotNull TextComponent colorizeText(String rawtext) { + if(customLegacySerializer == null) { + customLegacySerializer = getSerializer(); + } + + return customLegacySerializer.deserialize(rawtext); + } + + @NotNull + private static LegacyComponentSerializer getSerializer() { + return LegacyComponentSerializer.builder().hexColors().useUnusualXRepeatedCharacterHexFormat().character('&').hexCharacter('#').build(); + } + + public static @NotNull String sanitizeForSerializer(@NotNull String string) { + if(customLegacySerializer == null) { + customLegacySerializer = getSerializer(); + } + + TextComponent componentForm = ofLegacyTextRaw(string); + return customLegacySerializer.serialize(componentForm); + } + + public static @NotNull String sanitizeAuthorName(@NotNull Author author, @NotNull ChatChannel chatChannel) { + return sanitizeForSerializer(author.getAuthoredName(ChatChannel.ADMIN)); + } } From 8c5123f494d174a9f8c9b9ae649bd3eeeeacb2f7 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 6 Nov 2020 15:16:52 -0800 Subject: [PATCH 220/662] 2.1.154 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index ddb52b939..246612928 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.154-SNAPSHOT + 2.1.154 mcMMO https://github.com/mcMMO-Dev/mcMMO From 34d9f70ac0c8b90ea629852decb6c491561f288a Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 9 Nov 2020 13:19:54 -0800 Subject: [PATCH 221/662] Fixed a bug where party members didn't have properly colored names, added some optimization and removed some unnecessary API --- Changelog.txt | 12 ++- pom.xml | 2 +- .../com/gmail/nossr50/chat/ChatManager.java | 11 ++- .../chat/author/AbstractPlayerAuthor.java | 99 ++++++++++++------- .../com/gmail/nossr50/chat/author/Author.java | 15 --- .../nossr50/chat/author/ConsoleAuthor.java | 12 +-- .../nossr50/chat/author/PlayerAuthor.java | 16 +-- .../nossr50/chat/mailer/AdminChatMailer.java | 15 ++- .../nossr50/chat/mailer/PartyChatMailer.java | 17 +++- .../chat/message/PartyChatMessage.java | 3 +- .../java/com/gmail/nossr50/util/Misc.java | 11 +++ .../gmail/nossr50/util/text/TextUtils.java | 6 -- 12 files changed, 124 insertions(+), 95 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 0e4573159..df2f38d3d 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,13 @@ +Version 2.1.155 + Optimized party/admin chat a bit + Fixed a bug where party members other than the party leader had names that weren't properly hex colored + (API) Removed AbstractPlayerAuthor#getComponentDisplayName + (API) Removed AbstractPlayerAuthor#getComponentUserName + (API) Removed Author#getAuthoredComponentName + + NOTES: + Removed some unnecessary API, we aren't a chat plugin so these things shouldn't be here. + 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 @@ -6,7 +16,7 @@ Version 2.1.154 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 (you can set author names in Author) + (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) diff --git a/pom.xml b/pom.xml index 246612928..3b24bfcb2 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.154 + 2.1.155-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO diff --git a/src/main/java/com/gmail/nossr50/chat/ChatManager.java b/src/main/java/com/gmail/nossr50/chat/ChatManager.java index ae6499583..a0a1e6f30 100644 --- a/src/main/java/com/gmail/nossr50/chat/ChatManager.java +++ b/src/main/java/com/gmail/nossr50/chat/ChatManager.java @@ -10,6 +10,7 @@ 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.Misc; import com.gmail.nossr50.util.Permissions; import com.gmail.nossr50.util.text.StringUtils; import net.kyori.adventure.audience.Audience; @@ -39,6 +40,7 @@ public class ChatManager { /** * 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 @@ -49,6 +51,7 @@ public class ChatManager { /** * 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 @@ -62,6 +65,7 @@ public class ChatManager { /** * 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 @@ -73,7 +77,7 @@ public class ChatManager { 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()), isPartyLeader(mmoPlayer)); + partyChatMailer.processChatMessage(mmoPlayer.getPlayerAuthor(), rawMessage, mmoPlayer.getParty(), isAsync, Permissions.colorChat(mmoPlayer.getPlayer()), Misc.isPartyLeader(mmoPlayer)); break; case PARTY_OFFICER: case NONE: @@ -81,10 +85,6 @@ public class ChatManager { } } - private boolean isPartyLeader(@NotNull McMMOPlayer mmoPlayer) { - return mmoPlayer.getParty().getLeader().getUniqueId().equals(mmoPlayer.getPlayer().getUniqueId()); - } - /** * Handles console messaging to admins * @param rawMessage raw message from the console @@ -221,4 +221,5 @@ public class ChatManager { } } } + } \ No newline at end of file diff --git a/src/main/java/com/gmail/nossr50/chat/author/AbstractPlayerAuthor.java b/src/main/java/com/gmail/nossr50/chat/author/AbstractPlayerAuthor.java index 7cc36eee7..e2bb7c7e0 100644 --- a/src/main/java/com/gmail/nossr50/chat/author/AbstractPlayerAuthor.java +++ b/src/main/java/com/gmail/nossr50/chat/author/AbstractPlayerAuthor.java @@ -1,64 +1,87 @@ 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 net.kyori.adventure.text.TextComponent; import org.bukkit.entity.Player; import org.checkerframework.checker.nullness.qual.NonNull; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import java.util.HashMap; import java.util.UUID; public abstract class AbstractPlayerAuthor implements Author { private final @NotNull Player player; - private @NotNull String displayName; - private @Nullable TextComponent componentDisplayName; - private @Nullable TextComponent componentUserName; + private @NotNull String lastKnownDisplayName; + private final @NotNull HashMap sanitizedNameCache; public AbstractPlayerAuthor(@NotNull Player player) { this.player = player; - this.displayName = player.getDisplayName(); + this.lastKnownDisplayName = player.getDisplayName(); + this.sanitizedNameCache = new HashMap<>(); } /** - * Grabs the {@link TextComponent} version of a players display name - * Cached and only processed as needed - * Always checks if the player display name has changed, if it has it regenerates the output + * Returns true if a players display name has changed * - * @return the {@link TextComponent} version of a players display name + * @return true if the players display name has changed */ - public @NotNull TextComponent getComponentDisplayName() { - //Not sure if this is expensive but it ensures always up to date names - if(!player.getDisplayName().equals(displayName)) { - displayName = player.getDisplayName(); - componentDisplayName = null; - } - - if(componentDisplayName != null) { - return componentDisplayName; - } else { - //convert to adventure component - componentDisplayName = TextUtils.ofLegacyTextRaw(displayName); - } - return componentDisplayName; + private boolean hasPlayerDisplayNameChanged() { + return !player.getDisplayName().equals(lastKnownDisplayName); } /** - * Grabs the {@link TextComponent} version of a players current minecraft nickname - * Cached and only processed as needed - * - * @return the {@link TextComponent} version of a players current minecraft nickname + * Player display names can change and this method will update the last known display name of this player */ - public @NotNull TextComponent getComponentUserName() { - //Not sure if this is expensive but it ensures always up to date names - if(componentUserName != null) { - return componentUserName; + 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 { - //convert to adventure component - componentUserName = TextUtils.ofLegacyTextRaw(player.getName()); + //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()); } - return componentUserName; } @Override @@ -85,11 +108,13 @@ public abstract class AbstractPlayerAuthor implements Author { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; AbstractPlayerAuthor that = (AbstractPlayerAuthor) o; - return Objects.equal(player, that.player); + return Objects.equal(player, that.player) && + Objects.equal(lastKnownDisplayName, that.lastKnownDisplayName) && + Objects.equal(sanitizedNameCache, that.sanitizedNameCache); } @Override public int hashCode() { - return Objects.hashCode(player); + 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 index 36977b99e..6f45a21b7 100644 --- a/src/main/java/com/gmail/nossr50/chat/author/Author.java +++ b/src/main/java/com/gmail/nossr50/chat/author/Author.java @@ -2,25 +2,10 @@ package com.gmail.nossr50.chat.author; import com.gmail.nossr50.datatypes.chat.ChatChannel; import net.kyori.adventure.identity.Identity; -import net.kyori.adventure.text.TextComponent; import org.jetbrains.annotations.NotNull; public interface Author extends Identity { - /** - * The name of this author as used in mcMMO chat - * This is the {@link TextComponent} 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 - * - * NOTE: - * mcMMO doesn't transform a players name into a component when creating the chat message, instead it converts the whole string from raw legacy text (including md5 stuff) -> TextComponent via {@link net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer} - * This method is just provided for convenience, it uses lazy initialization - * - * @param chatChannel which chat channel this is going to - * @return The name of this author as used in mcMMO chat - */ - @NotNull TextComponent getAuthoredComponentName(@NotNull ChatChannel chatChannel); - /** * The name of this author as used in mcMMO chat * This is the {@link String} representation of the users current chat username diff --git a/src/main/java/com/gmail/nossr50/chat/author/ConsoleAuthor.java b/src/main/java/com/gmail/nossr50/chat/author/ConsoleAuthor.java index 978b5d544..3c6452d32 100644 --- a/src/main/java/com/gmail/nossr50/chat/author/ConsoleAuthor.java +++ b/src/main/java/com/gmail/nossr50/chat/author/ConsoleAuthor.java @@ -2,7 +2,6 @@ package com.gmail.nossr50.chat.author; import com.gmail.nossr50.datatypes.chat.ChatChannel; import com.gmail.nossr50.util.text.TextUtils; -import net.kyori.adventure.text.TextComponent; import org.checkerframework.checker.nullness.qual.NonNull; import org.jetbrains.annotations.NotNull; @@ -11,20 +10,13 @@ import java.util.UUID; public class ConsoleAuthor implements Author { private final UUID uuid; private final @NotNull String name; - private final @NotNull TextComponent componentName; public ConsoleAuthor(@NotNull String name) { this.uuid = new UUID(0, 0); - this.name = name; - this.componentName = TextUtils.ofBungeeRawStrings(name); - } - - //TODO: Think of a better solution later - @Override - public @NotNull TextComponent getAuthoredComponentName(@NotNull ChatChannel chatChannel) { - return componentName; + this.name = TextUtils.sanitizeForSerializer(name); } + //TODO: Think of a less clunky solution later @Override public @NotNull String getAuthoredName(@NotNull ChatChannel chatChannel) { return name; diff --git a/src/main/java/com/gmail/nossr50/chat/author/PlayerAuthor.java b/src/main/java/com/gmail/nossr50/chat/author/PlayerAuthor.java index 1921faaed..72383e96e 100644 --- a/src/main/java/com/gmail/nossr50/chat/author/PlayerAuthor.java +++ b/src/main/java/com/gmail/nossr50/chat/author/PlayerAuthor.java @@ -2,7 +2,6 @@ package com.gmail.nossr50.chat.author; import com.gmail.nossr50.config.ChatConfig; import com.gmail.nossr50.datatypes.chat.ChatChannel; -import net.kyori.adventure.text.TextComponent; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; @@ -12,22 +11,9 @@ public class PlayerAuthor extends AbstractPlayerAuthor { super(player); } - @Override - public @NotNull TextComponent getAuthoredComponentName(@NotNull ChatChannel chatChannel) { - if(ChatConfig.getInstance().useDisplayNames(chatChannel)) { - return getComponentDisplayName(); - } else { - return getComponentUserName(); - } - } - @Override public @NotNull String getAuthoredName(@NotNull ChatChannel chatChannel) { - if(ChatConfig.getInstance().useDisplayNames(chatChannel)) { - return getPlayer().getDisplayName(); - } else { - return getPlayer().getName(); - } + return getSanitizedName(chatChannel, ChatConfig.getInstance().useDisplayNames(chatChannel)); } } diff --git a/src/main/java/com/gmail/nossr50/chat/mailer/AdminChatMailer.java b/src/main/java/com/gmail/nossr50/chat/mailer/AdminChatMailer.java index a238d4e63..de922e56a 100644 --- a/src/main/java/com/gmail/nossr50/chat/mailer/AdminChatMailer.java +++ b/src/main/java/com/gmail/nossr50/chat/mailer/AdminChatMailer.java @@ -29,6 +29,7 @@ public class AdminChatMailer extends AbstractChatMailer { /** * Constructs an audience of admins + * * @return an audience of admins */ public @NotNull Audience constructAudience() { @@ -37,6 +38,7 @@ public class AdminChatMailer extends AbstractChatMailer { /** * Predicate used to filter the audience + * * @return admin chat audience predicate */ public @NotNull Predicate predicate() { @@ -47,6 +49,7 @@ public class AdminChatMailer extends AbstractChatMailer { /** * 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 @@ -54,7 +57,7 @@ public class AdminChatMailer extends AbstractChatMailer { */ public @NotNull TextComponent addStyle(@NotNull Author author, @NotNull String message, boolean canColor) { if(canColor) { - return LocaleLoader.getTextComponent("Chat.Style.Admin", TextUtils.sanitizeAuthorName(author, ChatChannel.ADMIN), message); + 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)); } @@ -65,6 +68,14 @@ public class AdminChatMailer extends AbstractChatMailer { 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)); @@ -77,4 +88,4 @@ public class AdminChatMailer extends AbstractChatMailer { } -} +} \ 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 index 37c02f144..6158ad826 100644 --- a/src/main/java/com/gmail/nossr50/chat/mailer/PartyChatMailer.java +++ b/src/main/java/com/gmail/nossr50/chat/mailer/PartyChatMailer.java @@ -22,6 +22,14 @@ public class PartyChatMailer extends AbstractChatMailer { 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); @@ -33,12 +41,19 @@ public class PartyChatMailer extends AbstractChatMailer { } } + /** + * 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 @@ -47,7 +62,7 @@ public class PartyChatMailer extends AbstractChatMailer { 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", TextUtils.sanitizeAuthorName(author, ChatChannel.PARTY), message); + return LocaleLoader.getTextComponent("Chat.Style.Party.Leader", author.getAuthoredName(ChatChannel.PARTY), message); } else { return LocaleLoader.getTextComponent("Chat.Style.Party", author.getAuthoredName(ChatChannel.PARTY), message); } diff --git a/src/main/java/com/gmail/nossr50/chat/message/PartyChatMessage.java b/src/main/java/com/gmail/nossr50/chat/message/PartyChatMessage.java index c66644d6e..4c143ec69 100644 --- a/src/main/java/com/gmail/nossr50/chat/message/PartyChatMessage.java +++ b/src/main/java/com/gmail/nossr50/chat/message/PartyChatMessage.java @@ -7,7 +7,6 @@ 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.gmail.nossr50.util.text.TextUtils; import com.google.common.base.Objects; import net.kyori.adventure.audience.Audience; import net.kyori.adventure.text.TextComponent; @@ -46,7 +45,7 @@ public class PartyChatMessage extends AbstractChatMessage { //Sends to everyone but console audience.sendMessage(author, componentMessage); - TextComponent spyMessage = LocaleLoader.getTextComponent("Chat.Spy.Party", TextUtils.sanitizeAuthorName(author, ChatChannel.PARTY), rawMessage, party.getName()); + TextComponent spyMessage = LocaleLoader.getTextComponent("Chat.Spy.Party", author.getAuthoredName(ChatChannel.PARTY), rawMessage, party.getName()); //Relay to spies messagePartyChatSpies(spyMessage); diff --git a/src/main/java/com/gmail/nossr50/util/Misc.java b/src/main/java/com/gmail/nossr50/util/Misc.java index 92316d732..41195c08d 100644 --- a/src/main/java/com/gmail/nossr50/util/Misc.java +++ b/src/main/java/com/gmail/nossr50/util/Misc.java @@ -1,6 +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; @@ -299,4 +300,14 @@ public final class Misc { 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()); + } } diff --git a/src/main/java/com/gmail/nossr50/util/text/TextUtils.java b/src/main/java/com/gmail/nossr50/util/text/TextUtils.java index 231b7be69..1f1b24c2c 100644 --- a/src/main/java/com/gmail/nossr50/util/text/TextUtils.java +++ b/src/main/java/com/gmail/nossr50/util/text/TextUtils.java @@ -1,7 +1,5 @@ package com.gmail.nossr50.util.text; -import com.gmail.nossr50.chat.author.Author; -import com.gmail.nossr50.datatypes.chat.ChatChannel; import com.gmail.nossr50.mcMMO; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.ComponentBuilder; @@ -130,8 +128,4 @@ public class TextUtils { TextComponent componentForm = ofLegacyTextRaw(string); return customLegacySerializer.serialize(componentForm); } - - public static @NotNull String sanitizeAuthorName(@NotNull Author author, @NotNull ChatChannel chatChannel) { - return sanitizeForSerializer(author.getAuthoredName(ChatChannel.ADMIN)); - } } From da06d5c075975a31d56ed5c32ae7bda20262b895 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 9 Nov 2020 13:53:17 -0800 Subject: [PATCH 222/662] Fixed a bug where Spectral arrow awarded too much XP --- .../nossr50/listeners/EntityListener.java | 23 +++++++++++-------- .../nossr50/util/skills/CombatUtils.java | 16 +++++++++++-- 2 files changed, 27 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java index 8ba975f24..ca1a5a94b 100644 --- a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java @@ -161,21 +161,24 @@ public class EntityListener implements Listener { } Projectile projectile = event.getEntity(); + EntityType entityType = projectile.getType(); - if(!(projectile instanceof Arrow)) - return; + if(entityType == EntityType.ARROW || entityType == EntityType.SPECTRAL_ARROW) { + if(!projectile.hasMetadata(mcMMO.bowForceKey)) + projectile.setMetadata(mcMMO.bowForceKey, new FixedMetadataValue(pluginRef, 1.0)); - projectile.setMetadata(mcMMO.bowForceKey, new FixedMetadataValue(pluginRef, 1.0)); - projectile.setMetadata(mcMMO.arrowDistanceKey, new FixedMetadataValue(pluginRef, projectile.getLocation())); + if(!projectile.hasMetadata(mcMMO.arrowDistanceKey)) + projectile.setMetadata(mcMMO.arrowDistanceKey, new FixedMetadataValue(pluginRef, projectile.getLocation())); - for (Enchantment enchantment : player.getInventory().getItemInMainHand().getEnchantments().keySet()) { - if (enchantment.getKey().equals(piercingEnchantment)) { - return; + for (Enchantment enchantment : player.getInventory().getItemInMainHand().getEnchantments().keySet()) { + if (enchantment.getKey().equals(piercingEnchantment)) { + 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(mcMMO.trackedArrow, mcMMO.metadataValue); + } } } } 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 4413b1360..0282dc2fb 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java @@ -36,6 +36,8 @@ 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; @@ -117,9 +119,14 @@ public final class CombatUtils { printFinalDamageDebug(player, event, mcMMOPlayer); } - private static void printFinalDamageDebug(Player player, EntityDamageByEntityEvent event, McMMOPlayer mcMMOPlayer) { + private static void printFinalDamageDebug(@NotNull Player player, @NotNull EntityDamageByEntityEvent event, @NotNull McMMOPlayer mcMMOPlayer, @Nullable String... extraInfoLines) { if(mcMMOPlayer.isDebugMode()) { player.sendMessage("Final Damage value after mcMMO modifiers: "+ event.getFinalDamage()); + if(extraInfoLines != null) { + for(String str : extraInfoLines) { + player.sendMessage(str); + } + } } } @@ -317,9 +324,14 @@ public final class CombatUtils { forceMultiplier = arrow.getMetadata(mcMMO.bowForceKey).get(0).asDouble(); applyScaledModifiers(initialDamage, finalDamage, event); + processCombatXP(mcMMOPlayer, target, PrimarySkillType.ARCHERY, forceMultiplier * distanceMultiplier); - printFinalDamageDebug(player, event, mcMMOPlayer); + printFinalDamageDebug(player, event, mcMMOPlayer, + "Distance Multiplier: "+distanceMultiplier, + "Force Multiplier: "+forceMultiplier, + "Initial Damage: "+initialDamage, + "Final Damage: "+finalDamage); } /** From f4f6abd9d5b5663d274598328436042342250990 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 9 Nov 2020 13:54:01 -0800 Subject: [PATCH 223/662] Fix Spec Arrow awarding too much XP --- Changelog.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index df2f38d3d..a89cd42b5 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,6 +1,7 @@ Version 2.1.155 - Optimized party/admin chat a bit + 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 + Optimized party/admin chat a bit (API) Removed AbstractPlayerAuthor#getComponentDisplayName (API) Removed AbstractPlayerAuthor#getComponentUserName (API) Removed Author#getAuthoredComponentName From ba7e235e64795ebd30678ed72b76cad90d0b7bfe Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 9 Nov 2020 16:46:52 -0800 Subject: [PATCH 224/662] Master Angler reworked --- Changelog.txt | 19 + pom.xml | 2 +- .../commands/skills/FishingCommand.java | 43 +- .../gmail/nossr50/config/AdvancedConfig.java | 6 + .../datatypes/skills/SubSkillType.java | 2 +- .../runnables/skills/MasterAnglerTask.java | 21 + .../gmail/nossr50/skills/SkillManager.java | 14 +- .../skills/acrobatics/AcrobaticsManager.java | 4 +- .../skills/archery/ArcheryManager.java | 6 +- .../nossr50/skills/axes/AxesManager.java | 16 +- .../skills/fishing/FishingManager.java | 123 +++++- .../skills/herbalism/HerbalismManager.java | 20 +- .../nossr50/skills/mining/MiningManager.java | 14 +- .../nossr50/skills/swords/SwordsManager.java | 8 +- .../skills/unarmed/UnarmedManager.java | 8 +- .../woodcutting/WoodcuttingManager.java | 2 +- .../util/compat/CompatibilityManager.java | 41 +- .../util/compat/CompatibilityType.java | 4 +- ...rAttackCooldownExploitPreventionLayer.java | 64 +-- ...rAttackCooldownExploitPreventionLayer.java | 404 +++++++++--------- .../PlayerAttackCooldownMethods.java | 38 +- .../AbstractMasterAnglerCompatibility.java | 6 + .../MasterAnglerCompatibilityLayer.java | 91 ++++ .../nossr50/util/skills/CombatUtils.java | 132 +++--- .../gmail/nossr50/util/skills/RankUtils.java | 11 + .../gmail/nossr50/util/text/StringUtils.java | 9 + .../util/text/TextComponentFactory.java | 5 + src/main/resources/advanced.yml | 14 +- .../resources/locale/locale_en_US.properties | 7 +- src/main/resources/skillranks.yml | 18 +- 30 files changed, 715 insertions(+), 437 deletions(-) create mode 100644 src/main/java/com/gmail/nossr50/runnables/skills/MasterAnglerTask.java create mode 100644 src/main/java/com/gmail/nossr50/util/compat/layers/skills/AbstractMasterAnglerCompatibility.java create mode 100644 src/main/java/com/gmail/nossr50/util/compat/layers/skills/MasterAnglerCompatibilityLayer.java diff --git a/Changelog.txt b/Changelog.txt index a89cd42b5..0f54e15cf 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,13 +1,32 @@ 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. The Spigot API related to it has been broken since years and years ago, they finally updated the API but its 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 + 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) Removed some unnecessary API, we aren't a chat plugin so these things shouldn't be here. + Master Angler stacks with the Lure enchant + Slowly adding Nullability annotations to the codebase Version 2.1.154 Hex colors are now supported in Party & Admin chat diff --git a/pom.xml b/pom.xml index 3b24bfcb2..5ee69222a 100755 --- a/pom.xml +++ b/pom.xml @@ -243,7 +243,7 @@ org.spigotmc spigot-api - 1.14.4-R0.1-SNAPSHOT + 1.16.4-R0.1-SNAPSHOT provided 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 692b18174..0c12bcdc1 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.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.player.UserManager; import com.gmail.nossr50.util.random.RandomChanceUtil; import com.gmail.nossr50.util.skills.RankUtils; +import com.gmail.nossr50.util.text.StringUtils; import com.gmail.nossr50.util.text.TextComponentFactory; import net.kyori.adventure.text.Component; -import org.bukkit.Location; -import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import java.util.ArrayList; @@ -26,9 +23,7 @@ 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; @@ -45,6 +40,8 @@ public class FishingCommand extends SkillCommand { private boolean canMasterAngler; private boolean canIceFish; + private String maMinWaitTime, maMaxWaitTime; + public FishingCommand() { super(PrimarySkillType.FISHING); } @@ -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)); } } @@ -122,7 +102,7 @@ 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); } @@ -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) { diff --git a/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java b/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java index 56c63c141..dce24a189 100644 --- a/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java +++ b/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java @@ -721,6 +721,12 @@ public class AdvancedConfig extends AutoUpdateConfigLoader { 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 int getFishingReductionMinWaitTicks() { return config.getInt("Skills.Fishing.MasterAngler.Tick_Reduction_Per_Rank.Min_Wait", 10);} + 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 int getIceFishingUnlockLevel() { return config.getInt("Skills.Fishing.IceFishing.UnlockLevel", 50); } 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 97f9848b1..4d36fe7fb 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/skills/SubSkillType.java +++ b/src/main/java/com/gmail/nossr50/datatypes/skills/SubSkillType.java @@ -38,7 +38,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), 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..720243f1c --- /dev/null +++ b/src/main/java/com/gmail/nossr50/runnables/skills/MasterAnglerTask.java @@ -0,0 +1,21 @@ +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; + + public MasterAnglerTask(@NotNull FishHook fishHook, @NotNull FishingManager fishingManager) { + this.fishHook = fishHook; + this.fishingManager = fishingManager; + } + + @Override + public void run() { + fishingManager.processMasterAngler(fishHook); + } +} 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/AcrobaticsManager.java b/src/main/java/com/gmail/nossr50/skills/acrobatics/AcrobaticsManager.java index 8c5076cbf..ce8e6d93b 100644 --- a/src/main/java/com/gmail/nossr50/skills/acrobatics/AcrobaticsManager.java +++ b/src/main/java/com/gmail/nossr50/skills/acrobatics/AcrobaticsManager.java @@ -91,11 +91,11 @@ 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 (SkillUtils.cooldownExpired(mmoPlayer.getRespawnATS(), Misc.PLAYER_RESPAWN_COOLDOWN_SECONDS)) { if(!(attacker instanceof Player)) { //Check to see how many dodge XP rewards this mob has handed out if(attacker.hasMetadata(mcMMO.DODGE_TRACKER) && ExperienceConfig.getInstance().isAcrobaticsExploitingPrevented()) { 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 a4b68c878..fecbc9c8b 100644 --- a/src/main/java/com/gmail/nossr50/skills/archery/ArcheryManager.java +++ b/src/main/java/com/gmail/nossr50/skills/archery/ArcheryManager.java @@ -57,9 +57,13 @@ public class ArcheryManager extends SkillManager { if(!arrow.hasMetadata(mcMMO.arrowDistanceKey)) return arrow.getLocation().distance(target.getLocation()); + Location firedLocation = (Location) arrow.getMetadata(mcMMO.arrowDistanceKey).get(0).value(); Location targetLocation = target.getLocation(); + if(firedLocation == null || firedLocation.getWorld() == null) + return 1; + if (firedLocation.getWorld() != targetLocation.getWorld()) { return 1; } @@ -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/axes/AxesManager.java b/src/main/java/com/gmail/nossr50/skills/axes/AxesManager.java index abff849b8..2a5d648b5 100644 --- a/src/main/java/com/gmail/nossr50/skills/axes/AxesManager.java +++ b/src/main/java/com/gmail/nossr50/skills/axes/AxesManager.java @@ -57,18 +57,18 @@ public class AxesManager extends SkillManager { 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(), mmoPlayer.getAttackStrength())) { return 0; } @@ -82,13 +82,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(), mmoPlayer.getAttackStrength())) { return 0; } Player player = getPlayer(); - if (mcMMOPlayer.useChatNotifications()) { + if (mmoPlayer.useChatNotifications()) { NotificationManager.sendPlayerInformation(player, NotificationType.SUBSKILL_MESSAGE, "Axes.Combat.CriticalHit"); } @@ -118,7 +118,7 @@ public class AxesManager extends SkillManager { 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())) { + if (RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_STATIC_CHANCE, SubSkillType.AXES_ARMOR_IMPACT, getPlayer(), mmoPlayer.getAttackStrength())) { SkillUtils.handleDurabilityChange(armor, durabilityDamage, 1); } } @@ -136,7 +136,7 @@ public class AxesManager extends SkillManager { */ public double greaterImpact(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(), mmoPlayer.getAttackStrength())) { return 0; } @@ -145,7 +145,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"); } 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 9ec3c55da..f0733588c 100644 --- a/src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java @@ -18,8 +18,10 @@ 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; @@ -28,6 +30,7 @@ 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; @@ -40,6 +43,7 @@ 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 java.util.*; @@ -67,7 +71,7 @@ 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() @@ -243,24 +247,109 @@ 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) { + new MasterAnglerTask(hook, this).runTaskLater(mcMMO.p, 0); //We run later to get the lure bonus applied } + /** + * Processes master angler + * Reduced tick time on fish hook, etc + * @param fishHook target fish hook + */ + public void processMasterAngler(@NotNull FishHook fishHook) { + 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); + + boolean boatBonus = isInBoat(); + int minWaitReduction = getMasterAnglerTickMinWaitReduction(masterAnglerRank, boatBonus); + int maxWaitReduction = getMasterAnglerTickMaxWaitReduction(masterAnglerRank, boatBonus); + + //Ticks for minWait and maxWait never go below this value + int bonusCapMin = AdvancedConfig.getInstance().getFishingReductionMinWaitCap(); + int bonusCapMax = AdvancedConfig.getInstance().getFishingReductionMaxWaitCap(); + + int reducedMinWaitTime = getReducedTicks(minWaitTicks, minWaitReduction, bonusCapMin); + int reducedMaxWaitTime = getReducedTicks(maxWaitTicks, maxWaitReduction, bonusCapMax); + + if(mmoPlayer.isDebugMode()) { + mmoPlayer.getPlayer().sendMessage(ChatColor.GOLD + "Master Angler Debug"); + + 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 totalBonus = AdvancedConfig.getInstance().getFishingReductionMaxWaitTicks() * masterAnglerRank; + + if(boatBonus) { + totalBonus += getFishingBoatMaxWaitReduction(); + } + + return totalBonus; + } + + public int getMasterAnglerTickMinWaitReduction(int masterAnglerRank, boolean boatBonus) { + int totalBonus = AdvancedConfig.getInstance().getFishingReductionMinWaitTicks() * masterAnglerRank; + + if(boatBonus) { + totalBonus += getFishingBoatMinWaitReduction(); + } + + return totalBonus; + } + + public int getFishingBoatMinWaitReduction() { + return AdvancedConfig.getInstance().getFishingBoatReductionMinWaitTicks(); + } + + public int getFishingBoatMaxWaitReduction() { + return AdvancedConfig.getInstance().getFishingBoatReductionMaxWaitTicks(); + } + + public boolean isMagicHunterEnabled() { return RankUtils.hasUnlockedSubskill(getPlayer(), SubSkillType.FISHING_MAGIC_HUNTER) 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 20f8e0ba0..b997f9c89 100644 --- a/src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java +++ b/src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java @@ -80,15 +80,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); } /** @@ -242,7 +242,7 @@ 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 @@ -330,7 +330,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); } @@ -387,8 +387,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 @@ -438,9 +438,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 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 29bb05d20..868cdaad1 100644 --- a/src/main/java/com/gmail/nossr50/skills/mining/MiningManager.java +++ b/src/main/java/com/gmail/nossr50/skills/mining/MiningManager.java @@ -82,7 +82,7 @@ public class MiningManager extends SkillManager { return; } - if (mcMMOPlayer.getAbilityMode(skill.getAbility())) { + if (mmoPlayer.getAbilityMode(skill.getAbility())) { SkillUtils.handleDurabilityChange(getPlayer().getInventory().getItemInMainHand(), Config.getInstance().getAbilityToolDamage()); } @@ -96,7 +96,7 @@ public class MiningManager extends SkillManager { //TODO: Make this readable if (RandomChanceUtil.checkRandomChanceExecutionSuccess(getPlayer(), SubSkillType.MINING_DOUBLE_DROPS, true)) { - boolean useTriple = mcMMOPlayer.getAbilityMode(skill.getAbility()) && AdvancedConfig.getInstance().getAllowMiningTripleDrops(); + boolean useTriple = mmoPlayer.getAbilityMode(skill.getAbility()) && AdvancedConfig.getInstance().getAllowMiningTripleDrops(); BlockUtils.markDropsAsBonus(blockState, useTriple); } } @@ -119,13 +119,13 @@ 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(mcMMO.tntMetadataKey, mmoPlayer.getPlayerMetadata()); tnt.setFuseTicks(0); 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); } /** @@ -311,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/swords/SwordsManager.java b/src/main/java/com/gmail/nossr50/skills/swords/SwordsManager.java index c8d9cc36c..e536c50f1 100644 --- a/src/main/java/com/gmail/nossr50/skills/swords/SwordsManager.java +++ b/src/main/java/com/gmail/nossr50/skills/swords/SwordsManager.java @@ -29,7 +29,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 +51,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); } /** @@ -60,7 +60,7 @@ 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())) { + if (RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.SWORDS_RUPTURE, getPlayer(), this.mmoPlayer.getAttackStrength())) { if (target instanceof Player) { Player defender = (Player) target; @@ -77,7 +77,7 @@ public class SwordsManager extends SkillManager { BleedTimerTask.add(target, getPlayer(), getRuptureBleedTicks(), RankUtils.getRank(getPlayer(), SubSkillType.SWORDS_RUPTURE), getToolTier(getPlayer().getInventory().getItemInMainHand())); - if (mcMMOPlayer.useChatNotifications()) { + if (mmoPlayer.useChatNotifications()) { NotificationManager.sendPlayerInformation(getPlayer(), NotificationType.SUBSKILL_MESSAGE, "Swords.Combat.Bleeding"); } } 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 2379b7c50..c20620cf8 100644 --- a/src/main/java/com/gmail/nossr50/skills/unarmed/UnarmedManager.java +++ b/src/main/java/com/gmail/nossr50/skills/unarmed/UnarmedManager.java @@ -33,7 +33,7 @@ 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 canUseSteelArm() { @@ -44,7 +44,7 @@ public class UnarmedManager extends SkillManager { } public boolean canUseBerserk() { - return mcMMOPlayer.getAbilityMode(SuperAbilityType.BERSERK); + return mmoPlayer.getAbilityMode(SuperAbilityType.BERSERK); } public boolean canDisarm(LivingEntity target) { @@ -102,7 +102,7 @@ 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)) { + if (RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.UNARMED_DISARM, getPlayer(), mmoPlayer.getAttackStrength()) && !hasIronGrip(defender)) { if (EventUtils.callDisarmEvent(defender).isCancelled()) { return; } @@ -139,7 +139,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; } 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 c63706200..46d466839 100644 --- a/src/main/java/com/gmail/nossr50/skills/woodcutting/WoodcuttingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/woodcutting/WoodcuttingManager.java @@ -63,7 +63,7 @@ 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); } 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 6749add9a..3a5a64f2b 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/CompatibilityManager.java +++ b/src/main/java/com/gmail/nossr50/util/compat/CompatibilityManager.java @@ -8,10 +8,13 @@ import com.gmail.nossr50.util.compat.layers.bungee.BungeeModernSerializerCompati import com.gmail.nossr50.util.compat.layers.persistentdata.AbstractPersistentDataLayer; import com.gmail.nossr50.util.compat.layers.persistentdata.SpigotPersistentDataLayer_1_13; import com.gmail.nossr50.util.compat.layers.persistentdata.SpigotPersistentDataLayer_1_14; +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.Nullable; import java.util.HashMap; @@ -21,6 +24,7 @@ import java.util.HashMap; * In 2.2 we are switching to modules and that will clean things up significantly * */ +//TODO: I need to rewrite this crap public class CompatibilityManager { private HashMap supportedLayers; private boolean isFullyCompatibleServerSoftware = true; //true if all compatibility layers load successfully @@ -31,6 +35,7 @@ public class CompatibilityManager { // private PlayerAttackCooldownExploitPreventionLayer playerAttackCooldownExploitPreventionLayer; private AbstractPersistentDataLayer persistentDataLayer; private AbstractBungeeSerializerCompatibilityLayer bungeeSerializerCompatibilityLayer; + private AbstractMasterAnglerCompatibility masterAnglerCompatibility; public CompatibilityManager(MinecraftGameVersion minecraftGameVersion) { mcMMO.p.getLogger().info("Loading compatibility layers..."); @@ -49,10 +54,6 @@ public class CompatibilityManager { supportedLayers = new HashMap<>(); //Init map for(CompatibilityType compatibilityType : CompatibilityType.values()) { - //TODO: Remove later - if(compatibilityType == CompatibilityType.PLAYER_ATTACK_COOLDOWN_EXPLOIT_PREVENTION) - continue; - supportedLayers.put(compatibilityType, false); //All layers are set to false when initialized } } @@ -64,16 +65,39 @@ public class CompatibilityManager { private void initCompatibilityLayers() { initPersistentDataLayer(); initBungeeSerializerLayer(); + initMasterAnglerLayer(); isFullyCompatibleServerSoftware = true; } + private void initMasterAnglerLayer() { + if(minecraftGameVersion.getMinorVersion().asInt() >= 16 || minecraftGameVersion.getMajorVersion().asInt() >= 2) { + if(hasNewFishingHookAPI()) { + masterAnglerCompatibility = new MasterAnglerCompatibilityLayer(); + } + } else { + masterAnglerCompatibility = null; + } + } + + private boolean hasNewFishingHookAPI() { + try { + Class checkForClass = Class.forName("org.bukkit.entity.FishHook"); + checkForClass.getMethod("getMinWaitTime"); + return true; + } catch (ClassNotFoundException | NoSuchMethodException e) { + return false; + } + } + private void initBungeeSerializerLayer() { if(minecraftGameVersion.getMinorVersion().asInt() >= 16) { bungeeSerializerCompatibilityLayer = new BungeeModernSerializerCompatibilityLayer(); } else { bungeeSerializerCompatibilityLayer = new BungeeLegacySerializerCompatibilityLayer(); } + + supportedLayers.put(CompatibilityType.BUNGEE_SERIALIZER, true); } private void initPersistentDataLayer() { @@ -145,11 +169,6 @@ public class CompatibilityManager { return NMSVersion.UNSUPPORTED; } -// public PlayerAttackCooldownExploitPreventionLayer getPlayerAttackCooldownExploitPreventionLayer() { -// return playerAttackCooldownExploitPreventionLayer; -// } - - public AbstractBungeeSerializerCompatibilityLayer getBungeeSerializerCompatibilityLayer() { return bungeeSerializerCompatibilityLayer; } @@ -157,4 +176,8 @@ public class CompatibilityManager { public AbstractPersistentDataLayer getPersistentDataLayer() { return persistentDataLayer; } + + public @Nullable AbstractMasterAnglerCompatibility getMasterAnglerCompatibilityLayer() { + return masterAnglerCompatibility; + } } 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 a54fd9485..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,7 +1,7 @@ package com.gmail.nossr50.util.compat; public enum CompatibilityType { - PLAYER_ATTACK_COOLDOWN_EXPLOIT_PREVENTION, PERSISTENT_DATA, - BUNGEE_SERIALIZER + BUNGEE_SERIALIZER, + MASTER_ANGLER, } diff --git a/src/main/java/com/gmail/nossr50/util/compat/layers/attackcooldown/DummyPlayerAttackCooldownExploitPreventionLayer.java b/src/main/java/com/gmail/nossr50/util/compat/layers/attackcooldown/DummyPlayerAttackCooldownExploitPreventionLayer.java index 39fe4d73e..ad0e5d235 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/layers/attackcooldown/DummyPlayerAttackCooldownExploitPreventionLayer.java +++ b/src/main/java/com/gmail/nossr50/util/compat/layers/attackcooldown/DummyPlayerAttackCooldownExploitPreventionLayer.java @@ -1,32 +1,32 @@ -package com.gmail.nossr50.util.compat.layers.attackcooldown; - -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 - } -} +//package com.gmail.nossr50.util.compat.layers.attackcooldown; +// +//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 +// } +//} diff --git a/src/main/java/com/gmail/nossr50/util/compat/layers/attackcooldown/PlayerAttackCooldownExploitPreventionLayer.java b/src/main/java/com/gmail/nossr50/util/compat/layers/attackcooldown/PlayerAttackCooldownExploitPreventionLayer.java index 4bcfb6303..3b5b929a4 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/layers/attackcooldown/PlayerAttackCooldownExploitPreventionLayer.java +++ b/src/main/java/com/gmail/nossr50/util/compat/layers/attackcooldown/PlayerAttackCooldownExploitPreventionLayer.java @@ -1,202 +1,202 @@ -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.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 AbstractNMSCompatibilityLayer 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: - case NMS_1_16_1: - 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"); - case NMS_1_16_1: - return wireNMS("eR", "getAttackCooldown", "resetAttackCooldown", "getHandle"); - default: - break; - } - - return false; - } -} +//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.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 AbstractNMSCompatibilityLayer 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: +// case NMS_1_16_1: +// 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"); +// case NMS_1_16_1: +// return wireNMS("eR", "getAttackCooldown", "resetAttackCooldown", "getHandle"); +// default: +// break; +// } +// +// return false; +// } +//} 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 index b5372987f..d990fe1aa 100644 --- 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 @@ -1,19 +1,19 @@ -package com.gmail.nossr50.util.compat.layers.attackcooldown; - -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; -} +//package com.gmail.nossr50.util.compat.layers.attackcooldown; +// +//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/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/skills/CombatUtils.java b/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java index 0282dc2fb..464fa9e50 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java @@ -27,6 +27,8 @@ import com.gmail.nossr50.util.player.UserManager; import com.google.common.collect.ImmutableMap; 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; @@ -48,12 +50,12 @@ public final class CombatUtils { private CombatUtils() {} - private static AbstractPersistentDataLayer getPersistentData() { + private static @NotNull AbstractPersistentDataLayer getPersistentData() { return mcMMO.getCompatibilityManager().getPersistentDataLayer(); } //Likely.. because who knows what plugins are throwing around - public static boolean isDamageLikelyFromNormalCombat(DamageCause damageCause) { + public static boolean isDamageLikelyFromNormalCombat(@NotNull DamageCause damageCause) { switch (damageCause) { case ENTITY_ATTACK: case ENTITY_SWEEP_ATTACK: @@ -64,12 +66,11 @@ public final class CombatUtils { } } - public static boolean hasWeakenedDamage(LivingEntity livingEntity) { + public static boolean hasWeakenedDamage(@NotNull LivingEntity livingEntity) { return livingEntity.hasPotionEffect(PotionEffectType.WEAKNESS); } - - private static void processSwordCombat(LivingEntity target, Player player, EntityDamageByEntityEvent event) { + private static void processSwordCombat(@NotNull LivingEntity target, @NotNull Player player, @NotNull EntityDamageByEntityEvent event) { if (event.getCause() == DamageCause.THORNS) { return; } @@ -119,43 +120,19 @@ public final class CombatUtils { printFinalDamageDebug(player, event, mcMMOPlayer); } - private static void printFinalDamageDebug(@NotNull Player player, @NotNull EntityDamageByEntityEvent event, @NotNull McMMOPlayer mcMMOPlayer, @Nullable String... extraInfoLines) { + 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) { - player.sendMessage(str); + if(str != null) + player.sendMessage(str); } } } } -// 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 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; } @@ -207,7 +184,7 @@ public final class CombatUtils { 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; } @@ -251,7 +228,7 @@ public final class CombatUtils { 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; @@ -280,12 +257,12 @@ public final class CombatUtils { } applyScaledModifiers(initialDamage, finalDamage, event); - processCombatXP(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); @@ -339,7 +316,7 @@ public final class CombatUtils { * * @param event The event to run the combat checks on. */ - public static void processCombatAttack(EntityDamageByEntityEvent event, Entity painSourceRoot, LivingEntity target) { + public static void processCombatAttack(@NotNull EntityDamageByEntityEvent event, @NotNull Entity painSourceRoot, @NotNull LivingEntity target) { Entity painSource = event.getDamager(); EntityType entityType = painSource.getType(); @@ -469,7 +446,7 @@ public final class CombatUtils { * 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"); @@ -488,7 +465,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)); @@ -505,7 +482,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) { @@ -524,7 +501,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()) { @@ -541,7 +518,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()); } @@ -550,7 +527,7 @@ 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) { + public static boolean canUseLimitBreak(@NotNull Player player, LivingEntity target, @NotNull SubSkillType subSkillType) { if(target instanceof Player || AdvancedConfig.getInstance().canApplyLimitBreakPVE()) { return RankUtils.hasUnlockedSubskill(player, subSkillType) && Permissions.isSubSkillEnabled(player, subSkillType); @@ -566,7 +543,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); } @@ -578,7 +555,7 @@ 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); } @@ -606,7 +583,7 @@ 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; } @@ -623,7 +600,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, Entity attacker) { if (target.isDead()) { return; } @@ -649,19 +626,19 @@ public final class CombatUtils { processingNoInvulnDamage = false; } - public static void removeIgnoreDamageMetadata(LivingEntity target) { + public static void removeIgnoreDamageMetadata(@NotNull LivingEntity target) { target.removeMetadata(mcMMO.CUSTOM_DAMAGE_METAKEY, mcMMO.p); } - public static void applyIgnoreDamageMetadata(LivingEntity target) { + public static void applyIgnoreDamageMetadata(@NotNull LivingEntity target) { target.setMetadata(mcMMO.CUSTOM_DAMAGE_METAKEY, mcMMO.metadataValue); } - public static boolean hasIgnoreDamageMetadata(LivingEntity target) { + public static boolean hasIgnoreDamageMetadata(@NotNull LivingEntity target) { return target.getMetadata(mcMMO.CUSTOM_DAMAGE_METAKEY).size() != 0; } - public static void dealNoInvulnerabilityTickDamageRupture(LivingEntity target, double damage, Entity attacker, int toolTier) { + public static void dealNoInvulnerabilityTickDamageRupture(@NotNull LivingEntity target, double damage, Entity attacker, int toolTier) { if (target.isDead()) { return; } @@ -706,7 +683,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); @@ -754,7 +731,7 @@ public final class CombatUtils { * @param target The defending entity * @param primarySkillType The skill being used */ - public static void processCombatXP(McMMOPlayer mcMMOPlayer, LivingEntity target, PrimarySkillType primarySkillType) { + public static void processCombatXP(@NotNull McMMOPlayer mcMMOPlayer, LivingEntity target, PrimarySkillType primarySkillType) { processCombatXP(mcMMOPlayer, target, primarySkillType, 1.0); } @@ -766,7 +743,7 @@ public final class CombatUtils { * @param primarySkillType The skill being used * @param multiplier final XP result will be multiplied by this */ - public static void processCombatXP(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; @@ -849,7 +826,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; @@ -879,10 +856,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); } } @@ -897,7 +876,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. @@ -912,7 +891,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(); @@ -927,12 +906,12 @@ public final class CombatUtils { } @Deprecated - public static double getFakeDamageFinalResult(Entity attacker, Entity target, double 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()) { @@ -942,27 +921,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); @@ -973,7 +952,7 @@ public final class CombatUtils { return damageEvent.getFinalDamage(); } - private static Map getModifiers(EntityDamageEvent event) { + private static @NotNull Map getModifiers(@NotNull EntityDamageEvent event) { Map modifiers = new HashMap<>(); for (DamageModifier modifier : DamageModifier.values()) { modifiers.put(modifier, event.getDamage(modifier)); @@ -982,7 +961,7 @@ public final class CombatUtils { return modifiers; } - private static Map getScaledModifiers(double damage, Map modifiers) { + private static @NotNull Map getScaledModifiers(double damage, @NotNull Map modifiers) { Map scaledModifiers = new HashMap<>(); for (DamageModifier modifier : modifiers.keySet()) { @@ -997,7 +976,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; @@ -1025,7 +1004,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)) { @@ -1052,7 +1031,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; } @@ -1069,4 +1048,13 @@ public final class CombatUtils { 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); + } + } } 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 2fb58d018..f35239eec 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/RankUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/RankUtils.java @@ -154,6 +154,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 diff --git a/src/main/java/com/gmail/nossr50/util/text/StringUtils.java b/src/main/java/com/gmail/nossr50/util/text/StringUtils.java index 637e4b4e4..42f2ced9e 100644 --- a/src/main/java/com/gmail/nossr50/util/text/StringUtils.java +++ b/src/main/java/com/gmail/nossr50/util/text/StringUtils.java @@ -8,10 +8,14 @@ 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. * @@ -23,6 +27,11 @@ 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) + "s"; + } + + /** * Creates a string from an array skipping the first n elements * @param args the array to iterate over when forming the string diff --git a/src/main/java/com/gmail/nossr50/util/text/TextComponentFactory.java b/src/main/java/com/gmail/nossr50/util/text/TextComponentFactory.java index d8c13faf2..2259c509f 100644 --- a/src/main/java/com/gmail/nossr50/util/text/TextComponentFactory.java +++ b/src/main/java/com/gmail/nossr50/util/text/TextComponentFactory.java @@ -493,6 +493,11 @@ public class TextComponentFactory { { 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)) diff --git a/src/main/resources/advanced.yml b/src/main/resources/advanced.yml index 8951d37ac..461d8979e 100644 --- a/src/main/resources/advanced.yml +++ b/src/main/resources/advanced.yml @@ -231,10 +231,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 ### diff --git a/src/main/resources/locale/locale_en_US.properties b/src/main/resources/locale/locale_en_US.properties index ee91cfcca..99e01acdb 100644 --- a/src/main/resources/locale/locale_en_US.properties +++ b/src/main/resources/locale/locale_en_US.properties @@ -251,8 +251,9 @@ Fishing.SubSkill.FishermansDiet.Name=Fisherman's Diet Fishing.SubSkill.FishermansDiet.Description=Improves hunger restored from fished foods 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: &a+{0} +Fishing.SubSkill.MasterAngler.Description=Fish are caught more frequently +Fishing.SubSkill.MasterAngler.Stat=Fishing minimum wait time bonus: &a-{0} seconds +Fishing.SubSkill.MasterAngler.Stat.Extra=Fishing maximum wait time bonus: &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 @@ -896,7 +897,7 @@ Guides.Excavation.Section.5=&3Notes about Excavation:\n&eExcavation drops are co 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.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. diff --git a/src/main/resources/skillranks.yml b/src/main/resources/skillranks.yml index 17574593c..3c5cac24b 100644 --- a/src/main/resources/skillranks.yml +++ b/src/main/resources/skillranks.yml @@ -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 From 06334da7f8abd7b7a7c1d5f2c46d9a96b45bb4b2 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 9 Nov 2020 16:47:34 -0800 Subject: [PATCH 225/662] 2.1.155 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 5ee69222a..2cb56f32c 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.155-SNAPSHOT + 2.1.155 mcMMO https://github.com/mcMMO-Dev/mcMMO From d9e99b08db937f9754239973270d585e5eaf275d Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 9 Nov 2020 16:56:02 -0800 Subject: [PATCH 226/662] changelog stuff --- Changelog.txt | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 0f54e15cf..379607209 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -20,12 +20,14 @@ Version 2.1.155 (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. The Spigot API related to it has been broken since years and years ago, they finally updated the API but its only in the newest builds of Spigot. + 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 + 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) - Removed some unnecessary API, we aren't a chat plugin so these things shouldn't be here. 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 From c9b950d0c861bc505458ffd8ce78c7153c74658f Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 10 Nov 2020 11:07:07 -0800 Subject: [PATCH 227/662] Fix chat.yml chat channel toggles --- Changelog.txt | 3 +++ pom.xml | 2 +- src/main/java/com/gmail/nossr50/config/ChatConfig.java | 2 +- src/main/resources/chat.yml | 2 +- 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 379607209..319b13d6f 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,6 @@ +Version 2.1.156 + Fixed a bug where the admin and party chat toggles in chat.yml didn't function as intended + 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 diff --git a/pom.xml b/pom.xml index 2cb56f32c..f782e15d5 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.155 + 2.1.156-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO diff --git a/src/main/java/com/gmail/nossr50/config/ChatConfig.java b/src/main/java/com/gmail/nossr50/config/ChatConfig.java index 1b9204e4b..1440194fc 100644 --- a/src/main/java/com/gmail/nossr50/config/ChatConfig.java +++ b/src/main/java/com/gmail/nossr50/config/ChatConfig.java @@ -35,7 +35,7 @@ public class ChatConfig extends AutoUpdateConfigLoader { } public boolean isChatChannelEnabled(@NotNull ChatChannel chatChannel) { - String key = "Chat.Channels." + StringUtils.getCapitalized(chatChannel.toString()) + ".Enabled"; + String key = "Chat.Channels." + StringUtils.getCapitalized(chatChannel.toString()) + ".Enable"; return config.getBoolean(key, true); } diff --git a/src/main/resources/chat.yml b/src/main/resources/chat.yml index 1c5a2da1f..6fa5ecf88 100644 --- a/src/main/resources/chat.yml +++ b/src/main/resources/chat.yml @@ -12,7 +12,7 @@ Chat: # 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 party chat + # Enable or disable admin chat Enable: true # Whether or not to use the current display name of a player Use_Display_Names: true From 592851e80b7322f0316cbe65c87d33cea4fbd18a Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 10 Nov 2020 11:20:32 -0800 Subject: [PATCH 228/662] Throw errors for child skill leaderboard requests --- Changelog.txt | 1 + .../nossr50/api/exceptions/InvalidSkillException.java | 4 ++++ .../com/gmail/nossr50/database/DatabaseManager.java | 3 ++- .../nossr50/database/FlatfileDatabaseManager.java | 9 ++++++++- .../com/gmail/nossr50/database/SQLDatabaseManager.java | 10 +++++++++- .../gmail/nossr50/skills/salvage/SalvageManager.java | 4 +++- 6 files changed, 27 insertions(+), 4 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 319b13d6f..45e9a4684 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,5 +1,6 @@ Version 2.1.156 Fixed a bug where the admin and party chat toggles in chat.yml didn't function as intended + 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) Version 2.1.155 Master Angler now has 8 ranks 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/database/DatabaseManager.java b/src/main/java/com/gmail/nossr50/database/DatabaseManager.java index f5769d93e..6ab5339e7 100644 --- a/src/main/java/com/gmail/nossr50/database/DatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/DatabaseManager.java @@ -1,5 +1,6 @@ package com.gmail.nossr50.database; +import com.gmail.nossr50.api.exceptions.InvalidSkillException; import com.gmail.nossr50.config.Config; import com.gmail.nossr50.datatypes.database.DatabaseType; import com.gmail.nossr50.datatypes.database.PlayerStat; @@ -58,7 +59,7 @@ public interface DatabaseManager { * @param statsPerPage The number of stats per page * @return the requested leaderboard information */ - List readLeaderboard(PrimarySkillType skill, int pageNumber, int statsPerPage); + List readLeaderboard(PrimarySkillType skill, int pageNumber, int statsPerPage) throws InvalidSkillException; /** * Retrieve rank info into a HashMap from PrimarySkillType to the rank. diff --git a/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java index ab87fe955..288da1d25 100644 --- a/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java @@ -1,5 +1,6 @@ package com.gmail.nossr50.database; +import com.gmail.nossr50.api.exceptions.InvalidSkillException; import com.gmail.nossr50.config.AdvancedConfig; import com.gmail.nossr50.config.Config; import com.gmail.nossr50.datatypes.MobHealthbarType; @@ -363,7 +364,13 @@ public final class FlatfileDatabaseManager implements DatabaseManager { writer.append("\r\n"); } - public List readLeaderboard(PrimarySkillType skill, int pageNumber, int statsPerPage) { + public List readLeaderboard(PrimarySkillType skill, int pageNumber, int statsPerPage) throws InvalidSkillException { + //Fix for a plugin that people are using that is throwing SQL errors + if(skill.isChildSkill()) { + 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!"); + } + updateLeaderboards(); List statsList = skill == null ? powerLevels : playerStatHash.get(skill); int fromIndex = (Math.max(pageNumber, 1) - 1) * statsPerPage; diff --git a/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java index 7830362c4..56190a4b6 100644 --- a/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java @@ -1,5 +1,6 @@ package com.gmail.nossr50.database; +import com.gmail.nossr50.api.exceptions.InvalidSkillException; import com.gmail.nossr50.config.AdvancedConfig; import com.gmail.nossr50.config.Config; import com.gmail.nossr50.datatypes.MobHealthbarType; @@ -343,9 +344,16 @@ public final class SQLDatabaseManager implements DatabaseManager { return success; } - public List readLeaderboard(PrimarySkillType skill, int pageNumber, int statsPerPage) { + public List readLeaderboard(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.isChildSkill()) { + 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; PreparedStatement statement = null; 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 aa2d30542..2545a15d2 100644 --- a/src/main/java/com/gmail/nossr50/skills/salvage/SalvageManager.java +++ b/src/main/java/com/gmail/nossr50/skills/salvage/SalvageManager.java @@ -91,7 +91,9 @@ 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; } From b0afdccfa5fb774e69b7fb11a5d247ccab5306e7 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 10 Nov 2020 12:05:42 -0800 Subject: [PATCH 229/662] skillranks.yml will automatically fix itself if it finds certain issues --- Changelog.txt | 6 ++ .../config/AutoUpdateConfigLoader.java | 14 +++ .../gmail/nossr50/config/ConfigLoader.java | 2 +- .../com/gmail/nossr50/config/RankConfig.java | 90 ++++++++++++++++++- 4 files changed, 107 insertions(+), 5 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 45e9a4684..6e5aa8625 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,6 +1,12 @@ Version 2.1.156 Fixed a bug where the admin and party chat toggles in chat.yml didn't function as intended 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 + * Fixed a bug where Master Angler rank 1 was set too high (default configs) + + NOTES: + * - 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 don't need to do anything. Version 2.1.155 Master Angler now has 8 ranks diff --git a/src/main/java/com/gmail/nossr50/config/AutoUpdateConfigLoader.java b/src/main/java/com/gmail/nossr50/config/AutoUpdateConfigLoader.java index c43f14f81..63189aea2 100644 --- a/src/main/java/com/gmail/nossr50/config/AutoUpdateConfigLoader.java +++ b/src/main/java/com/gmail/nossr50/config/AutoUpdateConfigLoader.java @@ -2,6 +2,7 @@ package com.gmail.nossr50.config; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; +import org.jetbrains.annotations.NotNull; import java.io.*; import java.util.HashMap; @@ -18,6 +19,19 @@ public abstract class AutoUpdateConfigLoader extends ConfigLoader { super(fileName); } + protected void saveConfig() { + try { + plugin.getLogger().info("Saving changes to config file - "+fileName); + config.save(configFile); + } catch (IOException e) { + e.printStackTrace(); + } + } + + protected @NotNull FileConfiguration getInternalConfig() { + return YamlConfiguration.loadConfiguration(plugin.getResourceAsReader(fileName)); + } + @Override protected void loadFile() { super.loadFile(); diff --git a/src/main/java/com/gmail/nossr50/config/ConfigLoader.java b/src/main/java/com/gmail/nossr50/config/ConfigLoader.java index a71c3b6a8..7fb7f19d1 100644 --- a/src/main/java/com/gmail/nossr50/config/ConfigLoader.java +++ b/src/main/java/com/gmail/nossr50/config/ConfigLoader.java @@ -10,7 +10,7 @@ import java.util.List; public abstract class ConfigLoader { protected static final mcMMO plugin = mcMMO.p; protected String fileName; - private final File configFile; + protected final File configFile; protected FileConfiguration config; public ConfigLoader(String relativePath, String fileName) { diff --git a/src/main/java/com/gmail/nossr50/config/RankConfig.java b/src/main/java/com/gmail/nossr50/config/RankConfig.java index fb660e457..e1b90edda 100644 --- a/src/main/java/com/gmail/nossr50/config/RankConfig.java +++ b/src/main/java/com/gmail/nossr50/config/RankConfig.java @@ -2,8 +2,10 @@ package com.gmail.nossr50.config; import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.datatypes.skills.subskills.AbstractSubSkill; +import org.jetbrains.annotations.NotNull; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; public class RankConfig extends AutoUpdateConfigLoader { @@ -54,6 +56,18 @@ public class RankConfig extends AutoUpdateConfigLoader { return findRankByRootAddress(rank, key); } + /** + * Returns the unlock level for a subskill depending on the gamemode + * @param subSkillType target subskill + * @param rank the rank we are checking + * @return the level requirement for a subskill at this particular rank + */ + public int getSubSkillUnlockLevel(SubSkillType subSkillType, int rank, 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 @@ -84,12 +98,61 @@ 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); + plugin.getLogger().info(key +" set to a value of: " + 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 + checkConfig(reasons, badSkillSetup, true); + checkConfig(reasons, badSkillSetup, false); + + //Fix bad entries + if(badSkillSetup.isEmpty()) + return; + + plugin.getLogger().info("(FIXING CONFIG) mcMMO is correcting a few mistakes found in your skill rank config setup"); + + for(SubSkillType subSkillType : badSkillSetup) { + plugin.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 @@ -98,23 +161,42 @@ public class RankConfig extends AutoUpdateConfigLoader { 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!"); + reasons.add("(CONFIG ISSUE) " + subSkillType.toString() + " should not have any ranks that require a negative level!"); + badSkillSetup.add(subSkillType); + continue; } 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"); + plugin.getLogger().info("(CONFIG ISSUE) You have the ranks for the subskill "+ subSkillType.toString()+" 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(); + } } From 7887232d9388c647dac8974ab8cd74dee086d0b4 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 10 Nov 2020 12:19:23 -0800 Subject: [PATCH 230/662] Update locales --- Changelog.txt | 5 ++++- src/main/java/com/gmail/nossr50/config/RankConfig.java | 2 +- src/main/resources/locale/locale_de.properties | 1 - src/main/resources/locale/locale_fr.properties | 1 - src/main/resources/locale/locale_hu_HU.properties | 1 - src/main/resources/locale/locale_it.properties | 1 - src/main/resources/locale/locale_ja_JP.properties | 1 - src/main/resources/locale/locale_lt_LT.properties | 1 - src/main/resources/locale/locale_ru.properties | 1 - src/main/resources/locale/locale_zh_CN.properties | 1 - 10 files changed, 5 insertions(+), 10 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 6e5aa8625..7ae027527 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -4,9 +4,12 @@ Version 2.1.156 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 * Fixed a bug where Master Angler rank 1 was set too high (default configs) + Removed incorrect translations of Master Angler from various locales NOTES: - * - 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 don't need to do anything. + You don't need to touch your config files, this update handles everything 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. Version 2.1.155 Master Angler now has 8 ranks diff --git a/src/main/java/com/gmail/nossr50/config/RankConfig.java b/src/main/java/com/gmail/nossr50/config/RankConfig.java index e1b90edda..2fa1a353e 100644 --- a/src/main/java/com/gmail/nossr50/config/RankConfig.java +++ b/src/main/java/com/gmail/nossr50/config/RankConfig.java @@ -126,7 +126,7 @@ public class RankConfig extends AutoUpdateConfigLoader { String key = getRankAddressKey(subSkillType, rank, retroMode); int defaultValue = getInternalConfig().getInt(key); config.set(key, defaultValue); - plugin.getLogger().info(key +" set to a value of: " + defaultValue); + plugin.getLogger().info(key +" SET -> " + defaultValue); } /** diff --git a/src/main/resources/locale/locale_de.properties b/src/main/resources/locale/locale_de.properties index ab78c6b83..23e9fba05 100644 --- a/src/main/resources/locale/locale_de.properties +++ b/src/main/resources/locale/locale_de.properties @@ -374,7 +374,6 @@ 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 diff --git a/src/main/resources/locale/locale_fr.properties b/src/main/resources/locale/locale_fr.properties index a24695264..3ef73beeb 100644 --- a/src/main/resources/locale/locale_fr.properties +++ b/src/main/resources/locale/locale_fr.properties @@ -252,7 +252,6 @@ Fishing.SubSkill.FishermansDiet.Description=Am\u00e9liore la nutrition des produ Fishing.SubSkill.FishermansDiet.Stat=R\u00e9gime de fermier:&a Grade {0} 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.MasterAngler.Stat=Plus de chance de mordre ou vous \u00eates: &a+{0} Fishing.SubSkill.IceFishing.Name=P\u00eache sur Glace Fishing.SubSkill.IceFishing.Description=Vous permet de p\u00eacher dans les biomes glac\u00e9s Fishing.SubSkill.IceFishing.Stat=P\u00eache sur Glace diff --git a/src/main/resources/locale/locale_hu_HU.properties b/src/main/resources/locale/locale_hu_HU.properties index e561c8388..f3d8148f2 100644 --- a/src/main/resources/locale/locale_hu_HU.properties +++ b/src/main/resources/locale/locale_hu_HU.properties @@ -252,7 +252,6 @@ Fishing.SubSkill.FishermansDiet.Description=N\u00F6veli a kihal\u00E1szott \u00E Fishing.SubSkill.FishermansDiet.Stat=Horg\u00E1szok Di\u00E9t\u00E1ja:&a 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: &a+{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 diff --git a/src/main/resources/locale/locale_it.properties b/src/main/resources/locale/locale_it.properties index 604ba2952..10b7d5a97 100644 --- a/src/main/resources/locale/locale_it.properties +++ b/src/main/resources/locale/locale_it.properties @@ -259,7 +259,6 @@ Fishing.SubSkill.FishermansDiet.Description=Aumenta la fame recuperata tramite c 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: &a+{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 diff --git a/src/main/resources/locale/locale_ja_JP.properties b/src/main/resources/locale/locale_ja_JP.properties index 666db6cc0..b3da37ccb 100644 --- a/src/main/resources/locale/locale_ja_JP.properties +++ b/src/main/resources/locale/locale_ja_JP.properties @@ -242,7 +242,6 @@ Fishing.SubSkill.FishermansDiet.Description=\u9b5a\u4ecb\u985e\u304b\u3089\u56de Fishing.SubSkill.FishermansDiet.Stat=\u6f01\u5e2b\u306e\u98df\u4e8b:&a \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: &a+&e{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 diff --git a/src/main/resources/locale/locale_lt_LT.properties b/src/main/resources/locale/locale_lt_LT.properties index 399881236..e6eaef4fc 100644 --- a/src/main/resources/locale/locale_lt_LT.properties +++ b/src/main/resources/locale/locale_lt_LT.properties @@ -252,7 +252,6 @@ Fishing.SubSkill.FishermansDiet.Description=Improves hunger restored from fished 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: &a+{0} Fishing.SubSkill.IceFishing.Name=Ice Fishing Fishing.SubSkill.IceFishing.Description=Allows you to fish in icy biomes Fishing.SubSkill.IceFishing.Stat=Ice Fishing diff --git a/src/main/resources/locale/locale_ru.properties b/src/main/resources/locale/locale_ru.properties index 0525fa31a..be1e8680b 100644 --- a/src/main/resources/locale/locale_ru.properties +++ b/src/main/resources/locale/locale_ru.properties @@ -200,7 +200,6 @@ Fishing.SubSkill.FishermansDiet.Description=\u0423\u0432\u0435\u043b\u0438\u0447 Fishing.SubSkill.FishermansDiet.Stat=\u0420\u044b\u0431\u0430\u0446\u043a\u0430\u044f \u0414\u0438\u0435\u0442\u0430:&a \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: &a+{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 diff --git a/src/main/resources/locale/locale_zh_CN.properties b/src/main/resources/locale/locale_zh_CN.properties index 69382621a..5b2dcc042 100644 --- a/src/main/resources/locale/locale_zh_CN.properties +++ b/src/main/resources/locale/locale_zh_CN.properties @@ -252,7 +252,6 @@ Fishing.SubSkill.FishermansDiet.Description=\u63d0\u9ad8\u9c7c\u7c7b\u98df\u7269 Fishing.SubSkill.FishermansDiet.Stat=\u6e14\u592b\u7684\u98df\u8c31:&a \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: &a+&e{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 From 8f6819edc506b786e2e7cd2ac0cdf8166113700e Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 10 Nov 2020 13:17:58 -0800 Subject: [PATCH 231/662] Fix GT replant sometimes planting floating plants --- Changelog.txt | 5 +- .../runnables/skills/DelayedCropReplant.java | 66 ++++++++++++++++++- .../gmail/nossr50/util/text/StringUtils.java | 2 +- .../resources/locale/locale_en_US.properties | 6 +- 4 files changed, 72 insertions(+), 7 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 7ae027527..e2cad02ca 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,10 +1,13 @@ Version 2.1.156 + 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 - * Fixed a bug where Master Angler rank 1 was set too high (default configs) 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 NOTES: You don't need to touch your config files, this update handles everything automagically. 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 1d460060f..64fee44f6 100644 --- a/src/main/java/com/gmail/nossr50/runnables/skills/DelayedCropReplant.java +++ b/src/main/java/com/gmail/nossr50/runnables/skills/DelayedCropReplant.java @@ -11,8 +11,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 +24,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 +51,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 +85,10 @@ public class DelayedCropReplant extends BukkitRunnable { directional.setFacing(cropFace); newState.setBlockData(directional); + + if(newData instanceof Cocoa) { + plantAnchorType = PlantAnchorType.COCOA; + } } //Age the crop @@ -89,15 +97,69 @@ 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 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; diff --git a/src/main/java/com/gmail/nossr50/util/text/StringUtils.java b/src/main/java/com/gmail/nossr50/util/text/StringUtils.java index 42f2ced9e..db53feb31 100644 --- a/src/main/java/com/gmail/nossr50/util/text/StringUtils.java +++ b/src/main/java/com/gmail/nossr50/util/text/StringUtils.java @@ -28,7 +28,7 @@ public class StringUtils { } public static String ticksToSeconds(double ticks) { - return shortDecimal.format(ticks / 20) + "s"; + return shortDecimal.format(ticks / 20); } diff --git a/src/main/resources/locale/locale_en_US.properties b/src/main/resources/locale/locale_en_US.properties index 99e01acdb..f2ce907e6 100644 --- a/src/main/resources/locale/locale_en_US.properties +++ b/src/main/resources/locale/locale_en_US.properties @@ -252,8 +252,8 @@ Fishing.SubSkill.FishermansDiet.Description=Improves hunger restored from fished Fishing.SubSkill.FishermansDiet.Stat=Fisherman's Diet:&a Rank {0} Fishing.SubSkill.MasterAngler.Name=Master Angler Fishing.SubSkill.MasterAngler.Description=Fish are caught more frequently -Fishing.SubSkill.MasterAngler.Stat=Fishing minimum wait time bonus: &a-{0} seconds -Fishing.SubSkill.MasterAngler.Stat.Extra=Fishing maximum wait time bonus: &a-{0} seconds +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 @@ -274,7 +274,7 @@ 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: &a Crops grow in stage {0} Herbalism.Effect.4=Green Thumb (Blocks) From b31e1e533ba40b50be9586c29a1692930f702349 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 10 Nov 2020 15:17:52 -0800 Subject: [PATCH 232/662] New skill 'Knock On Wood', changes to axe readying messages --- Changelog.txt | 10 +++ .../commands/skills/WoodcuttingCommand.java | 14 ++++ .../java/com/gmail/nossr50/config/Config.java | 2 +- .../nossr50/datatypes/player/McMMOPlayer.java | 66 ++++++++++++++++++- .../datatypes/skills/PrimarySkillType.java | 2 +- .../datatypes/skills/SubSkillType.java | 1 + .../skills/excavation/ExcavationManager.java | 5 +- .../woodcutting/WoodcuttingManager.java | 16 ++++- .../com/gmail/nossr50/util/BlockUtils.java | 9 +++ .../java/com/gmail/nossr50/util/Misc.java | 34 ++++++++++ src/main/resources/config.yml | 2 +- .../resources/locale/locale_en_US.properties | 8 +++ src/main/resources/plugin.yml | 3 + src/main/resources/skillranks.yml | 34 ++-------- 14 files changed, 168 insertions(+), 38 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index e2cad02ca..bc47635e1 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,4 +1,13 @@ 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 + 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' + 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) @@ -8,6 +17,7 @@ Version 2.1.156 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 NOTES: You don't need to touch your config files, this update handles everything automagically. 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 505a37c8d..a817a312d 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/WoodcuttingCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/WoodcuttingCommand.java @@ -22,6 +22,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; @@ -56,6 +57,7 @@ public class WoodcuttingCommand extends SkillCommand { canTreeFell = RankUtils.hasUnlockedSubskill(player, SubSkillType.WOODCUTTING_TREE_FELLER) && Permissions.treeFeller(player); canDoubleDrop = canUseSubskill(player, SubSkillType.WOODCUTTING_HARVEST_LUMBER) && !skill.getDoubleDropsDisabled() && RankUtils.getRank(player, SubSkillType.WOODCUTTING_HARVEST_LUMBER) >= 1; canLeafBlow = canUseSubskill(player, SubSkillType.WOODCUTTING_LEAF_BLOWER); + 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);*/ @@ -69,6 +71,18 @@ public class WoodcuttingCommand extends SkillCommand { 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"))); diff --git a/src/main/java/com/gmail/nossr50/config/Config.java b/src/main/java/com/gmail/nossr50/config/Config.java index d3fdb5c74..d1368dc9b 100644 --- a/src/main/java/com/gmail/nossr50/config/Config.java +++ b/src/main/java/com/gmail/nossr50/config/Config.java @@ -450,7 +450,7 @@ public class Config extends AutoUpdateConfigLoader { public int getAbilityToolDamage() { return config.getInt("Abilities.Tools.Durability_Loss", 1); } /* Thresholds */ - public int getTreeFellerThreshold() { return config.getInt("Abilities.Limits.Tree_Feller_Threshold", 500); } + public int getTreeFellerThreshold() { return config.getInt("Abilities.Limits.Tree_Feller_Threshold", 1000); } /* * SKILL SETTINGS 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 21459c837..5aae58596 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java +++ b/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java @@ -14,8 +14,10 @@ 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.datatypes.skills.subskills.interfaces.SubSkill; import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.party.PartyManager; @@ -40,6 +42,7 @@ 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.BlockUtils; import com.gmail.nossr50.util.EventUtils; import com.gmail.nossr50.util.Misc; import com.gmail.nossr50.util.Permissions; @@ -57,6 +60,7 @@ import net.kyori.adventure.identity.Identity; import org.apache.commons.lang.Validate; 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; @@ -918,14 +922,25 @@ public class McMMOPlayer implements Identified { if (skill != PrimarySkillType.WOODCUTTING && skill != 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 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); } @@ -934,6 +949,53 @@ public class McMMOPlayer implements Identified { } } + 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", + primarySkillType.getName(), + 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. * 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 8f022ab6c..6acc8cf5d 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/skills/PrimarySkillType.java +++ b/src/main/java/com/gmail/nossr50/datatypes/skills/PrimarySkillType.java @@ -63,7 +63,7 @@ public enum PrimarySkillType { 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_STEEL_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)); + ImmutableList.of(SubSkillType.WOODCUTTING_LEAF_BLOWER, SubSkillType.WOODCUTTING_TREE_FELLER, SubSkillType.WOODCUTTING_HARVEST_LUMBER, SubSkillType.WOODCUTTING_KNOCK_ON_WOOD)); private final Class managerClass; private final Color skillColor; 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 4d36fe7fb..059df8db9 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/skills/SubSkillType.java +++ b/src/main/java/com/gmail/nossr50/datatypes/skills/SubSkillType.java @@ -101,6 +101,7 @@ public enum SubSkillType { /* Woodcutting */ /* WOODCUTTING_BARK_SURGEON(3),*/ + WOODCUTTING_KNOCK_ON_WOOD(2), WOODCUTTING_HARVEST_LUMBER(1), WOODCUTTING_LEAF_BLOWER(1), /* WOODCUTTING_NATURES_BOUNTY(3), 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 b12805856..14eda7e32 100644 --- a/src/main/java/com/gmail/nossr50/skills/excavation/ExcavationManager.java +++ b/src/main/java/com/gmail/nossr50/skills/excavation/ExcavationManager.java @@ -15,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; @@ -47,8 +45,7 @@ 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(); 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 46d466839..9dd45742a 100644 --- a/src/main/java/com/gmail/nossr50/skills/woodcutting/WoodcuttingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/woodcutting/WoodcuttingManager.java @@ -301,8 +301,20 @@ public class WoodcuttingManager extends SkillManager { processHarvestLumber(blockState); } else if (BlockUtils.isNonWoodPartOfTree(blockState)) { //Drop displaced non-woodcutting XP blocks -// Misc.spawnItemsFromCollection(Misc.getBlockCenter(blockState), block.getDrops(), ItemSpawnReason.TREE_FELLER_DISPLACED_BLOCK, 1); - Misc.spawnItemsFromCollection(Misc.getBlockCenter(blockState), block.getDrops(), ItemSpawnReason.TREE_FELLER_DISPLACED_BLOCK); + + if(RankUtils.hasUnlockedSubskill(player, SubSkillType.WOODCUTTING_KNOCK_ON_WOOD)) { + Misc.spawnItemsFromCollection(Misc.getBlockCenter(blockState), block.getDrops(), ItemSpawnReason.TREE_FELLER_DISPLACED_BLOCK); + + if(RankUtils.hasReachedRank(2, player, SubSkillType.WOODCUTTING_KNOCK_ON_WOOD)) { + if(RandomChanceUtil.rollDice(75, 100)) { + int randOrbCount = Math.max(1, Misc.getRandom().nextInt(50)); + Misc.spawnExperienceOrb(blockState.getLocation(), randOrbCount); + } + } + + } else { + Misc.spawnItemsFromCollection(Misc.getBlockCenter(blockState), block.getDrops(), ItemSpawnReason.TREE_FELLER_DISPLACED_BLOCK, 1); + } } blockState.setType(Material.AIR); diff --git a/src/main/java/com/gmail/nossr50/util/BlockUtils.java b/src/main/java/com/gmail/nossr50/util/BlockUtils.java index 17a2d82f2..67da9f4af 100644 --- a/src/main/java/com/gmail/nossr50/util/BlockUtils.java +++ b/src/main/java/com/gmail/nossr50/util/BlockUtils.java @@ -11,6 +11,7 @@ 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.block.Block; import org.bukkit.block.BlockState; import org.bukkit.block.data.Ageable; import org.bukkit.block.data.BlockData; @@ -179,6 +180,10 @@ public final class BlockUtils { return mcMMO.getMaterialMapStore().isTreeFellerDestructible(blockState.getType()); } + public static boolean isNonWoodPartOfTree(Material material) { + return mcMMO.getMaterialMapStore().isTreeFellerDestructible(material); + } + /** * Determine if a given block should be affected by Flux Mining * @@ -274,4 +279,8 @@ public final class BlockUtils { } return true; } + + public static boolean isPartOfTree(Block rayCast) { + return hasWoodcuttingXP(rayCast.getState()) || isNonWoodPartOfTree(rayCast.getType()); + } } diff --git a/src/main/java/com/gmail/nossr50/util/Misc.java b/src/main/java/com/gmail/nossr50/util/Misc.java index 41195c08d..9b74f110c 100644 --- a/src/main/java/com/gmail/nossr50/util/Misc.java +++ b/src/main/java/com/gmail/nossr50/util/Misc.java @@ -12,6 +12,7 @@ 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; @@ -310,4 +311,37 @@ public final class Misc { 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/resources/config.yml b/src/main/resources/config.yml index b9e299eeb..748d8a6ba 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -303,7 +303,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 diff --git a/src/main/resources/locale/locale_en_US.properties b/src/main/resources/locale/locale_en_US.properties index f2ce907e6..585d9a5f9 100644 --- a/src/main/resources/locale/locale_en_US.properties +++ b/src/main/resources/locale/locale_en_US.properties @@ -184,6 +184,7 @@ Axes.Ability.Bonus.4=Greater Impact Axes.Ability.Bonus.5=Deal {0} Bonus DMG to unarmored foes Axes.Ability.Lower=&7You lower your Axe. Axes.Ability.Ready=&3You &6ready&3 your Axe. +Axes.Ability.Ready.Extra=&3You &6ready&3 your Axe. [[GRAY]]({0} is on cooldown for {1}s) Axes.Combat.CritStruck=&4You were CRITICALLY hit! Axes.Combat.CriticalHit=CRITICAL HIT! Axes.Combat.GI.Proc=&a**STRUCK WITH GREAT FORCE** @@ -531,6 +532,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 @@ -989,6 +995,8 @@ 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. &e({0}s) +Skills.TooTired.Named=[[GRAY]](&6{0}&e {1}s[[GRAY]]) +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. diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index e3ec1e2b5..9bbf76aa9 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -695,8 +695,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: diff --git a/src/main/resources/skillranks.yml b/src/main/resources/skillranks.yml index 3c5cac24b..6e68929a0 100644 --- a/src/main/resources/skillranks.yml +++ b/src/main/resources/skillranks.yml @@ -605,15 +605,6 @@ Unarmed: 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 @@ -627,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 From 477d6932cd315a1e784202f92f95aba6e56b7765 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 10 Nov 2020 15:21:45 -0800 Subject: [PATCH 233/662] 2.1.156 --- Changelog.txt | 17 +++++++++-------- pom.xml | 2 +- .../nossr50/datatypes/player/McMMOPlayer.java | 1 - .../skills/woodcutting/WoodcuttingManager.java | 2 +- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index bc47635e1..e2f956fba 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,12 +1,6 @@ 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 - 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' 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 @@ -17,12 +11,19 @@ Version 2.1.156 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 + '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, this update handles everything automagically. + 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 diff --git a/pom.xml b/pom.xml index f782e15d5..5359a0132 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.156-SNAPSHOT + 2.1.156 mcMMO https://github.com/mcMMO-Dev/mcMMO 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 5aae58596..99830d0ba 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java +++ b/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java @@ -17,7 +17,6 @@ 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.datatypes.skills.subskills.interfaces.SubSkill; import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.party.PartyManager; 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 9dd45742a..3162ce552 100644 --- a/src/main/java/com/gmail/nossr50/skills/woodcutting/WoodcuttingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/woodcutting/WoodcuttingManager.java @@ -307,7 +307,7 @@ public class WoodcuttingManager extends SkillManager { if(RankUtils.hasReachedRank(2, player, SubSkillType.WOODCUTTING_KNOCK_ON_WOOD)) { if(RandomChanceUtil.rollDice(75, 100)) { - int randOrbCount = Math.max(1, Misc.getRandom().nextInt(50)); + int randOrbCount = Math.max(1, Misc.getRandom().nextInt(20)); Misc.spawnExperienceOrb(blockState.getLocation(), randOrbCount); } } From f346d3b758a97f28ec08be6937ed6399ff019e29 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Wed, 11 Nov 2020 16:50:21 -0800 Subject: [PATCH 234/662] 2.1.157 --- Changelog.txt | 3 +++ pom.xml | 2 +- .../java/com/gmail/nossr50/database/DatabaseManager.java | 5 ++++- .../com/gmail/nossr50/database/FlatfileDatabaseManager.java | 6 ++++-- .../java/com/gmail/nossr50/database/SQLDatabaseManager.java | 6 ++++-- 5 files changed, 16 insertions(+), 6 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index e2f956fba..1d360743d 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,6 @@ +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 diff --git a/pom.xml b/pom.xml index 5359a0132..3c1fb5ae8 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.156 + 2.1.157 mcMMO https://github.com/mcMMO-Dev/mcMMO diff --git a/src/main/java/com/gmail/nossr50/database/DatabaseManager.java b/src/main/java/com/gmail/nossr50/database/DatabaseManager.java index 6ab5339e7..c41401296 100644 --- a/src/main/java/com/gmail/nossr50/database/DatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/DatabaseManager.java @@ -6,6 +6,8 @@ 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.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.List; import java.util.Map; @@ -53,13 +55,14 @@ public interface DatabaseManager { /** * 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 */ - List readLeaderboard(PrimarySkillType skill, int pageNumber, int statsPerPage) throws InvalidSkillException; + @NotNull List readLeaderboard(@Nullable PrimarySkillType skill, int pageNumber, int statsPerPage) throws InvalidSkillException; /** * Retrieve rank info into a HashMap from PrimarySkillType to the rank. diff --git a/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java index 288da1d25..4c9753373 100644 --- a/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java @@ -16,6 +16,8 @@ import com.gmail.nossr50.runnables.database.UUIDUpdateAsyncTask; import com.gmail.nossr50.util.Misc; import com.gmail.nossr50.util.text.StringUtils; import org.bukkit.OfflinePlayer; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.io.*; import java.util.*; @@ -364,9 +366,9 @@ public final class FlatfileDatabaseManager implements DatabaseManager { writer.append("\r\n"); } - public List readLeaderboard(PrimarySkillType skill, int pageNumber, int statsPerPage) throws InvalidSkillException { + public @NotNull List readLeaderboard(@Nullable PrimarySkillType skill, int pageNumber, int statsPerPage) throws InvalidSkillException { //Fix for a plugin that people are using that is throwing SQL errors - if(skill.isChildSkill()) { + if(skill != null && skill.isChildSkill()) { 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!"); } diff --git a/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java index 56190a4b6..a8a1fd326 100644 --- a/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java @@ -17,6 +17,8 @@ import com.gmail.nossr50.util.Misc; import org.apache.tomcat.jdbc.pool.DataSource; import org.apache.tomcat.jdbc.pool.PoolProperties; import org.bukkit.scheduler.BukkitRunnable; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.sql.*; import java.util.*; @@ -344,11 +346,11 @@ public final class SQLDatabaseManager implements DatabaseManager { return success; } - public List readLeaderboard(PrimarySkillType skill, int pageNumber, int statsPerPage) throws InvalidSkillException { + 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.isChildSkill()) { + if(skill != null && skill.isChildSkill()) { 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!"); } From cfcdcd1676d814ef269d4415d7007dad824b1094 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 16 Nov 2020 14:36:59 -0800 Subject: [PATCH 235/662] Fix Lure above 3 breaking fishing --- Changelog.txt | 6 ++++ pom.xml | 2 +- .../commands/skills/FishingCommand.java | 2 +- .../nossr50/listeners/PlayerListener.java | 17 +++++++++- .../runnables/skills/MasterAnglerTask.java | 6 ++-- .../skills/fishing/FishingManager.java | 31 ++++++++++++++++--- 6 files changed, 54 insertions(+), 10 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 1d360743d..1333e46e2 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,9 @@ +Version 2.1.158 + Fixed a bug where Lure level 4 and above would break fishing with the new Master Angler + + NOTES: + 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 diff --git a/pom.xml b/pom.xml index 3c1fb5ae8..a775af69e 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.157 + 2.1.158-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO 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 0c12bcdc1..0f34e84b1 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/FishingCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/FishingCommand.java @@ -92,7 +92,7 @@ public class FishingCommand extends SkillCommand { // MASTER ANGLER if (canMasterAngler) { 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)); + maMaxWaitTime = StringUtils.ticksToSeconds(fishingManager.getMasterAnglerTickMaxWaitReduction(RankUtils.getRank(player, SubSkillType.FISHING_MASTER_ANGLER), false, 0)); } } diff --git a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java index 1aa393a22..c0fb6da54 100644 --- a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java @@ -35,6 +35,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; @@ -387,7 +388,21 @@ 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; diff --git a/src/main/java/com/gmail/nossr50/runnables/skills/MasterAnglerTask.java b/src/main/java/com/gmail/nossr50/runnables/skills/MasterAnglerTask.java index 720243f1c..0f652e02c 100644 --- a/src/main/java/com/gmail/nossr50/runnables/skills/MasterAnglerTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/skills/MasterAnglerTask.java @@ -8,14 +8,16 @@ 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) { + 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); + fishingManager.processMasterAngler(fishHook, lureLevel); } } 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 f0733588c..9d76097b6 100644 --- a/src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java @@ -247,8 +247,8 @@ public class FishingManager extends SkillManager { EventUtils.callFakeFishEvent(getPlayer(), hook); } - public void masterAngler(@NotNull FishHook hook) { - new MasterAnglerTask(hook, this).runTaskLater(mcMMO.p, 0); //We run later to get the lure bonus applied + 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 } /** @@ -256,7 +256,7 @@ public class FishingManager extends SkillManager { * Reduced tick time on fish hook, etc * @param fishHook target fish hook */ - public void processMasterAngler(@NotNull FishHook fishHook) { + public void processMasterAngler(@NotNull FishHook fishHook, int lureLevel) { MasterAnglerCompatibilityLayer masterAnglerCompatibilityLayer = (MasterAnglerCompatibilityLayer) mcMMO.getCompatibilityManager().getMasterAnglerCompatibilityLayer(); if(masterAnglerCompatibilityLayer != null) { @@ -264,10 +264,17 @@ public class FishingManager extends SkillManager { 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 > 3) { + masterAnglerCompatibilityLayer.setApplyLure(fishHook, false); + convertedLureBonus = lureLevel * 100; + } boolean boatBonus = isInBoat(); int minWaitReduction = getMasterAnglerTickMinWaitReduction(masterAnglerRank, boatBonus); - int maxWaitReduction = getMasterAnglerTickMaxWaitReduction(masterAnglerRank, boatBonus); + int maxWaitReduction = getMasterAnglerTickMaxWaitReduction(masterAnglerRank, boatBonus, convertedLureBonus); //Ticks for minWait and maxWait never go below this value int bonusCapMin = AdvancedConfig.getInstance().getFishingReductionMinWaitCap(); @@ -276,9 +283,21 @@ public class FishingManager extends SkillManager { 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); @@ -321,13 +340,15 @@ public class FishingManager extends SkillManager { return mmoPlayer.getPlayer().isInsideVehicle() && mmoPlayer.getPlayer().getVehicle() instanceof Boat; } - public int getMasterAnglerTickMaxWaitReduction(int masterAnglerRank, boolean boatBonus) { + public int getMasterAnglerTickMaxWaitReduction(int masterAnglerRank, boolean boatBonus, int emulatedLureBonus) { int totalBonus = AdvancedConfig.getInstance().getFishingReductionMaxWaitTicks() * masterAnglerRank; if(boatBonus) { totalBonus += getFishingBoatMaxWaitReduction(); } + totalBonus += emulatedLureBonus; + return totalBonus; } From 4fd8f6d6470549d6bb1e50bf871be42eba4ee69e Mon Sep 17 00:00:00 2001 From: Tim Date: Mon, 16 Nov 2020 23:39:07 +0100 Subject: [PATCH 236/662] Update locale_nl.properties (#4336) Fixed small translation errors --- src/main/resources/locale/locale_nl.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/locale/locale_nl.properties b/src/main/resources/locale/locale_nl.properties index ebdc4e956..cd2ae6e67 100644 --- a/src/main/resources/locale/locale_nl.properties +++ b/src/main/resources/locale/locale_nl.properties @@ -264,7 +264,7 @@ 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. @@ -416,7 +416,7 @@ Smelting.SubSkill.FuelEfficiency.Name=Brandstof Effici\u00ebntie 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. From 128ba88e6470c913beb85f03715d71f0b591f8f5 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 16 Nov 2020 14:39:33 -0800 Subject: [PATCH 237/662] Update changelog --- Changelog.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/Changelog.txt b/Changelog.txt index 1333e46e2..7c33c2d92 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,5 +1,6 @@ Version 2.1.158 Fixed a bug where Lure level 4 and above would break fishing with the new Master Angler + Updated nl locale (thanks xl3ehindTim) NOTES: 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 From c22a65f9f3dce22e5e92e1056f05ab6a14d89be7 Mon Sep 17 00:00:00 2001 From: Momshroom Date: Mon, 16 Nov 2020 16:42:24 -0600 Subject: [PATCH 238/662] Adding crossbows, shields, elytra, and tridents to default repair.vanilla.yml and fixing minor typo. (#4308) * Changed comment over netherite items to say "Netherite repairables" instead of "Diamond repairables" Added Crossbow to string repairables Added Shield to wood repairables, with oak planks as material Added Elytra and Trident to Other repairables, using phantom membrane and prismarine crystals respectively. * Changed comment over netherite items to say "Netherite repairables" instead of "Diamond repairables" Added Crossbow to string repairables Added Shield to wood repairables, with oak planks as material Added Elytra and Trident to Other repairables, using phantom membrane and prismarine crystals respectively. Added warped fungus on a stick as a string repairable. Signed-off-by: Momshroom * Added warped fungus on a stick as a string repairable. Signed-off-by: Momshroom --- src/main/resources/repair.vanilla.yml | 45 ++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/src/main/resources/repair.vanilla.yml b/src/main/resources/repair.vanilla.yml index 357c1b6d1..c7d5735e4 100644 --- a/src/main/resources/repair.vanilla.yml +++ b/src/main/resources/repair.vanilla.yml @@ -45,6 +45,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 +191,7 @@ Repairables: XpMultiplier: 6 # - # Diamond repairables + # Netherite repairables ### # Tools NETHERITE_SWORD: @@ -243,3 +251,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 From 915855363d5bc689f537e2f149d44dd693f8188f Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 16 Nov 2020 14:43:53 -0800 Subject: [PATCH 239/662] Update changelog --- Changelog.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Changelog.txt b/Changelog.txt index 7c33c2d92..e42ba9583 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,8 +1,12 @@ Version 2.1.158 Fixed a bug where Lure level 4 and above would break fishing with the new Master Angler 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: + 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 From db8086d6ad28bd72c8b117fa79ed17eb41a4aca1 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 16 Nov 2020 14:56:48 -0800 Subject: [PATCH 240/662] Allow URLs in chat again --- src/main/java/com/gmail/nossr50/util/text/TextUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gmail/nossr50/util/text/TextUtils.java b/src/main/java/com/gmail/nossr50/util/text/TextUtils.java index 1f1b24c2c..d326a62a7 100644 --- a/src/main/java/com/gmail/nossr50/util/text/TextUtils.java +++ b/src/main/java/com/gmail/nossr50/util/text/TextUtils.java @@ -117,7 +117,7 @@ public class TextUtils { @NotNull private static LegacyComponentSerializer getSerializer() { - return LegacyComponentSerializer.builder().hexColors().useUnusualXRepeatedCharacterHexFormat().character('&').hexCharacter('#').build(); + return LegacyComponentSerializer.builder().hexColors().useUnusualXRepeatedCharacterHexFormat().character('&').hexCharacter('#').extractUrls().build(); } public static @NotNull String sanitizeForSerializer(@NotNull String string) { From bc53714ac860a22c5010a3bceb634a446cbea09d Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 16 Nov 2020 16:00:01 -0800 Subject: [PATCH 241/662] URL style adjust --- .../gmail/nossr50/util/text/TextUtils.java | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/util/text/TextUtils.java b/src/main/java/com/gmail/nossr50/util/text/TextUtils.java index d326a62a7..b8d71500e 100644 --- a/src/main/java/com/gmail/nossr50/util/text/TextUtils.java +++ b/src/main/java/com/gmail/nossr50/util/text/TextUtils.java @@ -6,6 +6,8 @@ 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; @@ -107,7 +109,7 @@ public class TextUtils { return LegacyComponentSerializer.legacySection().deserialize(rawString); } - public static @NotNull TextComponent colorizeText(String rawtext) { + public static @NotNull TextComponent colorizeText(@NotNull String rawtext) { if(customLegacySerializer == null) { customLegacySerializer = getSerializer(); } @@ -117,7 +119,20 @@ public class TextUtils { @NotNull private static LegacyComponentSerializer getSerializer() { - return LegacyComponentSerializer.builder().hexColors().useUnusualXRepeatedCharacterHexFormat().character('&').hexCharacter('#').extractUrls().build(); + 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) { From cf86e79e8793567012cf590e09b4655ab881cc9b Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 16 Nov 2020 16:24:27 -0800 Subject: [PATCH 242/662] Updated changelog --- Changelog.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Changelog.txt b/Changelog.txt index e42ba9583..6c1ba883b 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,11 +1,13 @@ 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: + 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 From c54161b7d1d39393acb12b8662720675b238fd9a Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 16 Nov 2020 16:40:18 -0800 Subject: [PATCH 243/662] update changes --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a775af69e..a52d16156 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.158-SNAPSHOT + 2.1.158 mcMMO https://github.com/mcMMO-Dev/mcMMO From ab276ffe33d916d135642053740a1ff4de769021 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 16 Nov 2020 16:55:55 -0800 Subject: [PATCH 244/662] 2.1.158 --- Changelog.txt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 6c1ba883b..5516043a6 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -2,11 +2,12 @@ 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) + * 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 From bcd260d9c1fe0d38a39636914cbc805ff89eb082 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 27 Nov 2020 16:26:24 -0800 Subject: [PATCH 245/662] Memory leak fix --- Changelog.txt | 3 +++ pom.xml | 2 +- .../java/com/gmail/nossr50/util/TransientMetadataTools.java | 5 +++++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index 5516043a6..c9a165be8 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,6 @@ +Version 2.1.159 + Fixed a memory leak involving renamed mobs + 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) diff --git a/pom.xml b/pom.xml index a52d16156..cb291c50a 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.158 + 2.1.159-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO diff --git a/src/main/java/com/gmail/nossr50/util/TransientMetadataTools.java b/src/main/java/com/gmail/nossr50/util/TransientMetadataTools.java index 3e74d9bf8..72649c548 100644 --- a/src/main/java/com/gmail/nossr50/util/TransientMetadataTools.java +++ b/src/main/java/com/gmail/nossr50/util/TransientMetadataTools.java @@ -4,6 +4,7 @@ import com.gmail.nossr50.mcMMO; import org.bukkit.entity.LivingEntity; public class TransientMetadataTools { + public static final String OLD_NAME_METAKEY = "mcMMO_oldName"; private final mcMMO pluginRef; public TransientMetadataTools(mcMMO pluginRef) { @@ -17,6 +18,10 @@ public class TransientMetadataTools { livingEntity.removeMetadata(mcMMO.customNameKey, pluginRef); } + if(livingEntity.hasMetadata(OLD_NAME_METAKEY)) { + livingEntity.removeMetadata(OLD_NAME_METAKEY, pluginRef); + } + //Involved in changing mob names to hearts if (livingEntity.hasMetadata(mcMMO.customVisibleKey)) { livingEntity.setCustomNameVisible(livingEntity.getMetadata(mcMMO.customVisibleKey).get(0).asBoolean()); From 0ce316e4284c2c546ca14ca7209c035497377f32 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 27 Nov 2020 16:55:40 -0800 Subject: [PATCH 246/662] update adventure (used for chat) --- Changelog.txt | 1 + pom.xml | 6 +++--- src/main/java/com/gmail/nossr50/util/MobHealthbarUtils.java | 4 ++-- .../java/com/gmail/nossr50/util/TransientMetadataTools.java | 2 +- .../java/com/gmail/nossr50/util/skills/CombatUtils.java | 2 +- 5 files changed, 8 insertions(+), 7 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index c9a165be8..7a7d137c8 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,5 +1,6 @@ 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 diff --git a/pom.xml b/pom.xml index cb291c50a..7defad4d5 100755 --- a/pom.xml +++ b/pom.xml @@ -202,12 +202,12 @@ net.kyori adventure-text-serializer-gson - 4.2.0-SNAPSHOT + 4.3.0-SNAPSHOT net.kyori adventure-api - 4.2.0-SNAPSHOT + 4.2.0 net.kyori @@ -232,7 +232,7 @@ org.apache.maven.scm maven-scm-provider-gitexe - 1.8.1 + 1.9.4 org.bstats diff --git a/src/main/java/com/gmail/nossr50/util/MobHealthbarUtils.java b/src/main/java/com/gmail/nossr50/util/MobHealthbarUtils.java index f306a4854..0ba956dd5 100644 --- a/src/main/java/com/gmail/nossr50/util/MobHealthbarUtils.java +++ b/src/main/java/com/gmail/nossr50/util/MobHealthbarUtils.java @@ -56,8 +56,8 @@ 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(TransientMetadataTools.OLD_NAME_METAKEY).size() <= 0 && originalName != null) + target.setMetadata(TransientMetadataTools.OLD_NAME_METAKEY, new OldName(originalName, plugin)); if (oldName == null) { oldName = ""; diff --git a/src/main/java/com/gmail/nossr50/util/TransientMetadataTools.java b/src/main/java/com/gmail/nossr50/util/TransientMetadataTools.java index 72649c548..b84e8c60e 100644 --- a/src/main/java/com/gmail/nossr50/util/TransientMetadataTools.java +++ b/src/main/java/com/gmail/nossr50/util/TransientMetadataTools.java @@ -4,7 +4,7 @@ import com.gmail.nossr50.mcMMO; import org.bukkit.entity.LivingEntity; public class TransientMetadataTools { - public static final String OLD_NAME_METAKEY = "mcMMO_oldName"; + public static final String OLD_NAME_METAKEY = TransientMetadataTools.OLD_NAME_METAKEY; private final mcMMO pluginRef; public TransientMetadataTools(mcMMO pluginRef) { 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 464fa9e50..2c28b1969 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java @@ -448,7 +448,7 @@ public final class CombatUtils { */ public static void fixNames(@NotNull LivingEntity entity) { - List metadataValue = entity.getMetadata("mcMMO_oldName"); + List metadataValue = entity.getMetadata(TransientMetadataTools.OLD_NAME_METAKEY); if(metadataValue.size() <= 0) return; From dacd846fe76e762f6ecfaeea8bb84a2c89917a43 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 27 Nov 2020 16:59:37 -0800 Subject: [PATCH 247/662] 2.1.159 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 7defad4d5..b5d5679ca 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.159-SNAPSHOT + 2.1.159 mcMMO https://github.com/mcMMO-Dev/mcMMO From 958fb6f0442d839776145facead5104f63f7bada Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 1 Dec 2020 13:08:33 -0800 Subject: [PATCH 248/662] Silenced a mostly harmless error that can happen when using plugins like crazyenchantments --- Changelog.txt | 3 + pom.xml | 2 +- .../runnables/skills/BleedTimerTask.java | 25 +- .../nossr50/skills/swords/SwordsManager.java | 31 +-- .../nossr50/skills/taming/TamingManager.java | 32 +-- ...rAttackCooldownExploitPreventionLayer.java | 32 --- .../DummyPlayerAttackCooldownToolLayer.java | 42 ++++ ...rAttackCooldownExploitPreventionLayer.java | 202 --------------- .../PlayerAttackCooldownMethods.java | 43 ++-- .../PlayerAttackCooldownToolLayer.java | 237 ++++++++++++++++++ .../gmail/nossr50/util/nms/NMSConstants.java | 2 + .../nossr50/util/skills/CombatUtils.java | 2 +- 12 files changed, 363 insertions(+), 290 deletions(-) delete mode 100644 src/main/java/com/gmail/nossr50/util/compat/layers/attackcooldown/DummyPlayerAttackCooldownExploitPreventionLayer.java create mode 100644 src/main/java/com/gmail/nossr50/util/compat/layers/attackcooldown/DummyPlayerAttackCooldownToolLayer.java delete mode 100644 src/main/java/com/gmail/nossr50/util/compat/layers/attackcooldown/PlayerAttackCooldownExploitPreventionLayer.java create mode 100644 src/main/java/com/gmail/nossr50/util/compat/layers/attackcooldown/PlayerAttackCooldownToolLayer.java diff --git a/Changelog.txt b/Changelog.txt index 7a7d137c8..8ca13a1d0 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,6 @@ +Version 2.1.160 + 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) diff --git a/pom.xml b/pom.xml index b5d5679ca..523a3346e 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.159 + 2.1.160-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO 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 aef946971..aee720282 100644 --- a/src/main/java/com/gmail/nossr50/runnables/skills/BleedTimerTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/skills/BleedTimerTask.java @@ -16,6 +16,7 @@ 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; @@ -23,7 +24,7 @@ import java.util.Map; import java.util.Map.Entry; public class BleedTimerTask extends BukkitRunnable { - private static final Map bleedList = new HashMap<>(); + private static final @NotNull Map bleedList = new HashMap<>(); private static boolean isIterating = false; @Override @@ -148,7 +149,7 @@ public class BleedTimerTask extends BukkitRunnable { isIterating = false; } - public static BleedContainer copyContainer(BleedContainer container) + public static @NotNull BleedContainer copyContainer(@NotNull BleedContainer container) { LivingEntity target = container.target; LivingEntity source = container.damageSource; @@ -164,7 +165,7 @@ public class BleedTimerTask extends BukkitRunnable { * * @param entity LivingEntity to bleed out */ - public static void bleedOut(LivingEntity entity) { + public static void bleedOut(@NotNull LivingEntity entity) { /* * Don't remove anything from the list outside of run() */ @@ -178,26 +179,36 @@ public class BleedTimerTask extends BukkitRunnable { * 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(LivingEntity entity, LivingEntity attacker, int ticks, int bleedRank, int toolTier) { + 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) throw new IllegalStateException("Cannot add task while iterating timers!"); + 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 isBleeding(LivingEntity entity) { + 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/skills/swords/SwordsManager.java b/src/main/java/com/gmail/nossr50/skills/swords/SwordsManager.java index e536c50f1..ebcc93993 100644 --- a/src/main/java/com/gmail/nossr50/skills/swords/SwordsManager.java +++ b/src/main/java/com/gmail/nossr50/skills/swords/SwordsManager.java @@ -20,6 +20,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; @@ -59,26 +60,28 @@ 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.mmoPlayer.getAttackStrength())) { + public void ruptureCheck(@NotNull LivingEntity target) throws IllegalStateException { + if(BleedTimerTask.isBleedOperationAllowed()) { + if (RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.SWORDS_RUPTURE, getPlayer(), this.mmoPlayer.getAttackStrength())) { - if (target instanceof Player) { - Player defender = (Player) target; + if (target instanceof Player) { + Player defender = (Player) target; - //Don't start or add to a bleed if they are blocking - if(defender.isBlocking()) - return; + //Don't start or add to a bleed if they are blocking + if(defender.isBlocking()) + return; - if (NotificationManager.doesPlayerUseNotifications(defender)) { - if(!BleedTimerTask.isBleeding(defender)) - NotificationManager.sendPlayerInformation(defender, NotificationType.SUBSKILL_MESSAGE, "Swords.Combat.Bleeding.Started"); + if (NotificationManager.doesPlayerUseNotifications(defender)) { + if(!BleedTimerTask.isBleeding(defender)) + 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())); + BleedTimerTask.add(target, getPlayer(), getRuptureBleedTicks(), RankUtils.getRank(getPlayer(), SubSkillType.SWORDS_RUPTURE), getToolTier(getPlayer().getInventory().getItemInMainHand())); - if (mmoPlayer.useChatNotifications()) { - NotificationManager.sendPlayerInformation(getPlayer(), NotificationType.SUBSKILL_MESSAGE, "Swords.Combat.Bleeding"); + if (mmoPlayer.useChatNotifications()) { + NotificationManager.sendPlayerInformation(getPlayer(), NotificationType.SUBSKILL_MESSAGE, "Swords.Combat.Bleeding"); + } } } } 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 7b5f11f0b..64c2e8f16 100644 --- a/src/main/java/com/gmail/nossr50/skills/taming/TamingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/taming/TamingManager.java @@ -31,6 +31,7 @@ import org.bukkit.Material; import org.bukkit.attribute.Attribute; import org.bukkit.entity.*; import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.HashMap; @@ -147,7 +148,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); } @@ -157,7 +158,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; } @@ -177,20 +178,23 @@ 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; + public double gore(@NotNull LivingEntity target, double damage) { + if(BleedTimerTask.isBleedOperationAllowed()) { + 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"); + + damage = (damage * Taming.goreModifier) - damage; } - 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"); - - damage = (damage * Taming.goreModifier) - damage; return damage; } diff --git a/src/main/java/com/gmail/nossr50/util/compat/layers/attackcooldown/DummyPlayerAttackCooldownExploitPreventionLayer.java b/src/main/java/com/gmail/nossr50/util/compat/layers/attackcooldown/DummyPlayerAttackCooldownExploitPreventionLayer.java deleted file mode 100644 index ad0e5d235..000000000 --- a/src/main/java/com/gmail/nossr50/util/compat/layers/attackcooldown/DummyPlayerAttackCooldownExploitPreventionLayer.java +++ /dev/null @@ -1,32 +0,0 @@ -//package com.gmail.nossr50.util.compat.layers.attackcooldown; -// -//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 -// } -//} 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..909f290b6 --- /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/PlayerAttackCooldownExploitPreventionLayer.java b/src/main/java/com/gmail/nossr50/util/compat/layers/attackcooldown/PlayerAttackCooldownExploitPreventionLayer.java deleted file mode 100644 index 3b5b929a4..000000000 --- a/src/main/java/com/gmail/nossr50/util/compat/layers/attackcooldown/PlayerAttackCooldownExploitPreventionLayer.java +++ /dev/null @@ -1,202 +0,0 @@ -//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.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 AbstractNMSCompatibilityLayer 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: -// case NMS_1_16_1: -// 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"); -// case NMS_1_16_1: -// return wireNMS("eR", "getAttackCooldown", "resetAttackCooldown", "getHandle"); -// default: -// break; -// } -// -// return false; -// } -//} 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 index d990fe1aa..510577a68 100644 --- 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 @@ -1,19 +1,24 @@ -//package com.gmail.nossr50.util.compat.layers.attackcooldown; -// -//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; -//} +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..539c1a0c4 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/util/compat/layers/attackcooldown/PlayerAttackCooldownToolLayer.java @@ -0,0 +1,237 @@ +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: + 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/nms/NMSConstants.java b/src/main/java/com/gmail/nossr50/util/nms/NMSConstants.java index 6f740e084..38d65eb4b 100644 --- a/src/main/java/com/gmail/nossr50/util/nms/NMSConstants.java +++ b/src/main/java/com/gmail/nossr50/util/nms/NMSConstants.java @@ -50,6 +50,8 @@ public class NMSConstants { return "v1_15_R1"; 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/skills/CombatUtils.java b/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java index 2c28b1969..616f0e562 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java @@ -600,7 +600,7 @@ public final class CombatUtils { return processingNoInvulnDamage; } - public static void dealNoInvulnerabilityTickDamage(@NotNull LivingEntity target, double damage, Entity attacker) { + public static void dealNoInvulnerabilityTickDamage(@NotNull LivingEntity target, double damage, @Nullable Entity attacker) { if (target.isDead()) { return; } From 7f213ee30549777c8745ef499ded311e27e505e9 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Wed, 9 Dec 2020 15:34:32 -0800 Subject: [PATCH 249/662] exploit fix --- .../nossr50/listeners/BlockListener.java | 32 +++------ .../nossr50/listeners/EntityListener.java | 71 +++---------------- 2 files changed, 20 insertions(+), 83 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java index b2ce690f7..a2a4c2a76 100644 --- a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java @@ -158,6 +158,7 @@ public class BlockListener implements Listener { /** * 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 */ @@ -176,6 +177,9 @@ public class BlockListener implements Listener { } } + /* + * Does not monitor stuff like a falling block replacing a liquid + */ @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onBlockFormEvent(BlockFormEvent event) { @@ -183,12 +187,12 @@ public class BlockListener implements Listener { if(WorldBlacklist.isWorldBlacklisted(event.getBlock().getWorld())) return; - if(ExperienceConfig.getInstance().preventStoneLavaFarming()) - { - if(event.getNewState().getType() != Material.OBSIDIAN - && ExperienceConfig.getInstance().doesBlockGiveSkillXP(PrimarySkillType.MINING, event.getNewState().getBlockData())) - { - mcMMO.getPlaceStore().setTrue(event.getNewState()); + BlockState newState = event.getNewState(); + + if(ExperienceConfig.getInstance().preventStoneLavaFarming()) { + if(newState.getType() != Material.OBSIDIAN + && ExperienceConfig.getInstance().doesBlockGiveSkillXP(PrimarySkillType.MINING, newState.getBlockData())) { + mcMMO.getPlaceStore().setTrue(newState); } } } @@ -244,17 +248,6 @@ public class BlockListener implements Listener { /* Check if the blocks placed should be monitored so they do not give out XP in the future */ mcMMO.getPlaceStore().setTrue(blockState); } - -// /* WORLD BLACKLIST CHECK */ -// if(WorldBlacklist.isWorldBlacklisted(event.getBlock().getWorld())) { -// return; -// } -// -// Player player = event.getPlayer(); -// -// if (!UserManager.hasPlayerDataKey(player)) { -// return; -// } } @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) @@ -265,11 +258,6 @@ public class BlockListener implements Listener { return; BlockState blockState = event.getBlock().getState(); - -// if (!BlockUtils.shouldBeWatched(blockState)) { -// return; -// } - mcMMO.getPlaceStore().setFalse(blockState); } diff --git a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java index ca1a5a94b..804c3c73a 100644 --- a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java @@ -196,18 +196,24 @@ 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.travelingBlock); @@ -228,63 +234,6 @@ public class EntityListener implements Listener { } } -// /** -// * Monitor EntityChangeBlock events. -// * -// * @param event -// * The event to watch -// */ -// @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) -// public void onEntityChangeBlock(EntityChangeBlockEvent event) { -// /* WORLD BLACKLIST CHECK */ -// if(WorldBlacklist.isWorldBlacklisted(event.getEntity().getWorld())) -// return; -// -// Block block = event.getBlock(); -// -// // When the event is fired for the falling block that changes back to a -// // normal block -// // event.getBlock().getType() returns AIR -// if (!BlockUtils.shouldBeWatched(block.getState()) -// && block.getState().getType() != Material.WATER -// && block.getType() != Material.AIR) { -// return; -// } -// -// Entity entity = event.getEntity(); -// -// if (entity instanceof FallingBlock || entity instanceof Enderman) { -// trackMovingBlocks(block, entity); //ignore the IDE warning -// //Apparently redstone ore will throw these events -// } else if ((block.getType() != Material.REDSTONE_ORE)) { -// if (mcMMO.getPlaceStore().isTrue(block)) { -// mcMMO.getPlaceStore().setFalse(block); -// } -// } -// } - -// /** -// * This is a complex hack to track blocks for this event -// * This event is called when a block starts its movement, or ends its movement -// * It can start the movement through physics (falling blocks) or through being picked up (endermen) -// * Since this event can be cancelled, its even weirder to track this stuff -// * @param block this will either be the block that was originally picked up, or the block in its final destination -// * @param movementSourceEntity this will either be an Endermen or a Falling Block -// */ -// private void trackMovingBlocks(@NotNull Block block, @NotNull Entity movementSourceEntity) { -// -// //A block that has reached its destination, either being placed by endermen or having finished its fall -// if(movementSourceEntity.hasMetadata(mcMMO.travelingBlock)) { -// mcMMO.getPlaceStore().setTrue(block); -// movementSourceEntity.removeMetadata(mcMMO.travelingBlock, pluginRef); -// } else { -// //A block that is starting movement (from either Endermen or Falling/Physics) -// if(mcMMO.getPlaceStore().isTrue(block)) { -// mcMMO.getPlaceStore().setFalse(block); -// movementSourceEntity.setMetadata(mcMMO.blockMetadataKey, mcMMO.metadataValue); -// } -// } -// } @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) public void onEntityCombustByEntityEvent(EntityCombustByEntityEvent event) { From a114886454f58cac5a6f61a3785be84cfd52de4b Mon Sep 17 00:00:00 2001 From: nossr50 Date: Wed, 9 Dec 2020 15:36:54 -0800 Subject: [PATCH 250/662] 2.1.160 --- Changelog.txt | 1 + pom.xml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index 8ca13a1d0..67f252785 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,4 +1,5 @@ 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 diff --git a/pom.xml b/pom.xml index 523a3346e..cb1fc2630 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.160-SNAPSHOT + 2.1.160 mcMMO https://github.com/mcMMO-Dev/mcMMO From 439a69cc5bbf821d7c24eb15e6dca6eb19ade0b3 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Wed, 9 Dec 2020 19:16:58 -0800 Subject: [PATCH 251/662] normalize pom --- pom.xml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/pom.xml b/pom.xml index cb1fc2630..060d22fbe 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.160 + 2.1.161-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO @@ -120,6 +120,10 @@ + + net.kyori.adventure + com.gmail.nossr50.mcmmo.kyori.adventure + co.aikar.commands com.gmail.nossr50.mcmmo.acf @@ -140,10 +144,6 @@ org.apache.tomcat com.gmail.nossr50.mcmmo.database.tomcat - - net.kyori.adventure - com.gmail.nossr50.mcmmo.kyori.adventure - org.bstats com.gmail.nossr50.mcmmo.metrics.bstat @@ -202,17 +202,17 @@ net.kyori adventure-text-serializer-gson - 4.3.0-SNAPSHOT + 4.3.0 net.kyori adventure-api - 4.2.0 + 4.3.0 net.kyori adventure-nbt - 4.2.0-SNAPSHOT + 4.3.0 net.kyori From b7cf84299ab963f5d6a0d95e6f5085610ff53864 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Wed, 9 Dec 2020 19:51:57 -0800 Subject: [PATCH 252/662] add missing adventure modules --- pom.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pom.xml b/pom.xml index 060d22fbe..94d06526d 100755 --- a/pom.xml +++ b/pom.xml @@ -115,6 +115,7 @@ 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 @@ -229,6 +230,11 @@ adventure-platform-common 4.0.0-SNAPSHOT + + net.kyori + adventure-text-serializer-gson-legacy-impl + 4.3.0 + org.apache.maven.scm maven-scm-provider-gitexe From c4072ee90d560ff0da07eedc9be866353da002d6 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Wed, 9 Dec 2020 19:58:20 -0800 Subject: [PATCH 253/662] 2.1.161 - Messages fixed! --- Changelog.txt | 5 +++++ pom.xml | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index 67f252785..64b09b933 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,8 @@ +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 diff --git a/pom.xml b/pom.xml index 94d06526d..31cef8065 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.161-SNAPSHOT + 2.1.161 mcMMO https://github.com/mcMMO-Dev/mcMMO From 0e09ac397d0e835a134c5aaeb97cb8f8fe932881 Mon Sep 17 00:00:00 2001 From: Wolf2323 Date: Thu, 10 Dec 2020 22:24:08 +0100 Subject: [PATCH 254/662] fix BrewingStand inventory is updated immediately instead of after firing the event. Now the event can be canceled correct. (#4351) --- .../nossr50/skills/alchemy/AlchemyPotionBrewer.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) 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 f42584b25..8b9f9ae36 100644 --- a/src/main/java/com/gmail/nossr50/skills/alchemy/AlchemyPotionBrewer.java +++ b/src/main/java/com/gmail/nossr50/skills/alchemy/AlchemyPotionBrewer.java @@ -114,6 +114,7 @@ public final class AlchemyPotionBrewer { } List inputList = new ArrayList<>(); + ItemStack[] outputList = new ItemStack[3]; for (int i = 0; i < 3; i++) { ItemStack item = inventory.getItem(i); @@ -128,7 +129,7 @@ public final class AlchemyPotionBrewer { inputList.add(input); if (output != null) { - inventory.setItem(i, output.toItemStack(item.getAmount()).clone()); + outputList[i] = output.toItemStack(item.getAmount()).clone(); } } @@ -139,6 +140,12 @@ public final class AlchemyPotionBrewer { return; } + for (int i = 0; i < 3; i++) { + if(outputList[i] != null) { + inventory.setItem(i, outputList[i]); + } + } + removeIngredient(inventory, player); for (AlchemyPotion input : inputList) { From bb37edaa7f0509ccab1e4d932c2020bd026f96f5 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 14 Dec 2020 15:21:48 -0800 Subject: [PATCH 255/662] update changelog --- Changelog.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Changelog.txt b/Changelog.txt index 64b09b933..7e7a19322 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,6 @@ +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 From 58e634e53a5b01bace5e0a574108adde4bdf6184 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 14 Dec 2020 15:22:09 -0800 Subject: [PATCH 256/662] dev mode --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 31cef8065..00739f6cc 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.161 + 2.1.162-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO From 16aa6d65ac78971bdd9889d0c8c0458f0b8babeb Mon Sep 17 00:00:00 2001 From: Robert Alan Chapton Date: Wed, 16 Dec 2020 12:46:17 -0800 Subject: [PATCH 257/662] Update McMMOUrl.java fixed translate link, thanks chew --- src/main/java/com/gmail/nossr50/datatypes/json/McMMOUrl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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) { From dfc2691cd65a7d6ae007fc4a51eeacbad732bee6 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Wed, 16 Dec 2020 15:55:54 -0800 Subject: [PATCH 258/662] dev mode and changelog update --- Changelog.txt | 4 ++++ pom.xml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index 7e7a19322..43ba29e19 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,7 @@ +Version 2.1.163 + Fixed the translate URL pointing to the wrong place (thanks chew) + + Version 2.1.162 Fixed a bug where Alchemy brew events were processed after setting brew results (thanks Wolf2323) diff --git a/pom.xml b/pom.xml index 00739f6cc..e6c2c9896 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.162-SNAPSHOT + 2.1.163-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO From 22a738bace1832d9e5b744716c6e7d72f7844e71 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Wed, 16 Dec 2020 16:15:19 -0800 Subject: [PATCH 259/662] mcMMO no longer throws errors on below 0 xp gains Fixes #4346 --- Changelog.txt | 5 +++++ .../java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java | 4 +--- .../nossr50/runnables/database/UUIDUpdateAsyncTask.java | 1 + src/main/resources/upgrades.yml | 1 + 4 files changed, 8 insertions(+), 3 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 43ba29e19..c15166fcd 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,6 +1,11 @@ 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) + NOTES: + 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) 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 99830d0ba..7ae9861a9 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java +++ b/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java @@ -545,9 +545,7 @@ public class McMMOPlayer implements Identified { * @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; } 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 6c2c13822..fe87185aa 100644 --- a/src/main/java/com/gmail/nossr50/runnables/database/UUIDUpdateAsyncTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/database/UUIDUpdateAsyncTask.java @@ -102,6 +102,7 @@ public class UUIDUpdateAsyncTask implements Runnable { if (position == userNames.size()) { mcMMO.getUpgradeManager().setUpgradeCompleted(UpgradeType.ADD_UUIDS); awaiter.countDown(); + plugin.getLogger().info("UUID checks completed"); } else this.runTaskLaterAsynchronously(plugin, Misc.TICK_CONVERSION_FACTOR * DELAY_PERIOD); // Schedule next batch } diff --git a/src/main/resources/upgrades.yml b/src/main/resources/upgrades.yml index 7e392e7f0..3a60fb42c 100644 --- a/src/main/resources/upgrades.yml +++ b/src/main/resources/upgrades.yml @@ -10,3 +10,4 @@ Upgrades_Finished: FIX_SPELLING_NETHERITE_SALVAGE: false FIX_SPELLING_NETHERITE_REPAIR: false FIX_NETHERITE_SALVAGE_QUANTITIES: false + ADD_UUIDS: false From 8c52884ac685a73f787ca3c461454feeeca8afcf Mon Sep 17 00:00:00 2001 From: nossr50 Date: Wed, 16 Dec 2020 16:29:05 -0800 Subject: [PATCH 260/662] Remove COTW entities on chunk unload Fixes #4289 --- Changelog.txt | 1 + .../nossr50/listeners/ChunkListener.java | 30 +++++++++++++++++++ .../nossr50/skills/taming/TamingManager.java | 1 + 3 files changed, 32 insertions(+) create mode 100644 src/main/java/com/gmail/nossr50/listeners/ChunkListener.java diff --git a/Changelog.txt b/Changelog.txt index c15166fcd..f2a7d129e 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -2,6 +2,7 @@ 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: I often test in SQL environments so I missed this bug, reminder to come bother me on discord if you find any annoying bugs! 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..406a02436 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/listeners/ChunkListener.java @@ -0,0 +1,30 @@ +package com.gmail.nossr50.listeners; + +import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.util.compat.layers.persistentdata.MobMetaFlagType; +import org.bukkit.entity.Entity; +import org.bukkit.entity.LivingEntity; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.world.ChunkUnloadEvent; + +public class ChunkListener implements Listener { + + @EventHandler(ignoreCancelled = true) + public void onChunkUnload(ChunkUnloadEvent event) { + for(Entity entity : event.getChunk().getEntities()) { + if(entity instanceof LivingEntity) { + LivingEntity livingEntity = (LivingEntity) entity; + if(mcMMO.getCompatibilityManager().getPersistentDataLayer().hasMobFlag(MobMetaFlagType.COTW_SUMMONED_MOB, livingEntity)) { + + //Remove from existence + if(livingEntity.isValid()) { + mcMMO.getCompatibilityManager().getPersistentDataLayer().removeMobFlags(livingEntity); + livingEntity.setHealth(0); + livingEntity.remove(); + } + } + } + } + } +} 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 64c2e8f16..3fce43f26 100644 --- a/src/main/java/com/gmail/nossr50/skills/taming/TamingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/taming/TamingManager.java @@ -570,6 +570,7 @@ public class TamingManager extends SkillManager { //Remove from existence if(livingEntity != null && livingEntity.isValid()) { + mcMMO.getCompatibilityManager().getPersistentDataLayer().removeMobFlags(livingEntity); livingEntity.setHealth(0); livingEntity.remove(); } From 2de52c79550ccc8f37aa0545b7496b2e85007041 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Wed, 16 Dec 2020 16:30:05 -0800 Subject: [PATCH 261/662] register new chunk listener --- src/main/java/com/gmail/nossr50/mcMMO.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index 7649eb114..15314c693 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -567,6 +567,7 @@ 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); } From 1046007b7aa99a92cac7466307f18141313ba4f6 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Wed, 16 Dec 2020 16:41:24 -0800 Subject: [PATCH 262/662] 2.1.163 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e6c2c9896..def6dc78b 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.163-SNAPSHOT + 2.1.163 mcMMO https://github.com/mcMMO-Dev/mcMMO From 4d386f2e619442bdf432d48967f2b9afe33475b0 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Wed, 16 Dec 2020 16:43:08 -0800 Subject: [PATCH 263/662] update changelog --- Changelog.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/Changelog.txt b/Changelog.txt index f2a7d129e..27c11d51a 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -5,6 +5,7 @@ Version 2.1.163 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! From e8d51f42f38834a139a4ba0207482c3c08ce84c5 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 28 Dec 2020 12:44:21 -0800 Subject: [PATCH 264/662] dev mode --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index def6dc78b..19ed2dbfa 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.163 + 2.1.164-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO From a4ef322fa526d81ec42749cd16a21d46665083c0 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 28 Dec 2020 12:58:03 -0800 Subject: [PATCH 265/662] Add ExploitFix.PreventPluginNPCInteraction to experience.yml Read the changelog for why --- Changelog.txt | 8 ++++++++ .../nossr50/config/experience/ExperienceConfig.java | 1 + .../com/gmail/nossr50/listeners/EntityListener.java | 11 ++++++----- .../com/gmail/nossr50/listeners/PlayerListener.java | 2 +- src/main/java/com/gmail/nossr50/util/EventUtils.java | 1 + .../com/gmail/nossr50/util/skills/CombatUtils.java | 8 +++++--- src/main/resources/experience.yml | 4 ++++ 7 files changed, 26 insertions(+), 9 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 27c11d51a..9d689ced8 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,11 @@ +Version 2.1.164 + New exploit fix setting, when disabled it will allow combat interactions with "NPC" entities from plugins like Citizens + ExploitFix.PreventPluginNPCInteraction Added to experience.yml + + NOTES: + Historically mcMMO has checked an entity for being a NPC (not a Villager) and backed out of any interaction, this was originally done because of NPCs that were meant to be invincible/etc and not give XP + However nowadays what an NPC is used for is pretty loose, mcMMO only has definitions for some NPCs (such as from Citizens) it doesn't know about most NPCs in most plugins unless they identify themselves in a similar way to the predefined parameters + 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 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 bd4e92ad6..2d84ea0c7 100644 --- a/src/main/java/com/gmail/nossr50/config/experience/ExperienceConfig.java +++ b/src/main/java/com/gmail/nossr50/config/experience/ExperienceConfig.java @@ -152,6 +152,7 @@ public class ExperienceConfig extends AutoUpdateConfigLoader { 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 boolean isAcrobaticsExploitingPrevented() { return config.getBoolean("ExploitFix.Acrobatics", true); } diff --git a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java index 804c3c73a..73f9b064b 100644 --- a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java @@ -312,7 +312,8 @@ public class EntityListener implements Listener { return; } - if (Misc.isNPCEntityExcludingVillagers(defender) || !defender.isValid() || !(defender instanceof LivingEntity)) { + + if ((ExperienceConfig.getInstance().isNPCInteractionPrevented() && Misc.isNPCEntityExcludingVillagers(defender)) || !defender.isValid() || !(defender instanceof LivingEntity)) { return; } @@ -322,7 +323,7 @@ public class EntityListener implements Listener { return; } - if (Misc.isNPCEntityExcludingVillagers(attacker)) { + if (ExperienceConfig.getInstance().isNPCInteractionPrevented() && Misc.isNPCEntityExcludingVillagers(attacker)) { return; } @@ -502,7 +503,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; } @@ -649,7 +650,7 @@ public class EntityListener implements Listener { LivingEntity entity = event.getEntity(); - if (Misc.isNPCEntityExcludingVillagers(entity)) { + if (ExperienceConfig.getInstance().isNPCInteractionPrevented() && Misc.isNPCEntityExcludingVillagers(entity)) { return; } @@ -957,7 +958,7 @@ public class EntityListener implements Listener { LivingEntity livingEntity = event.getEntity(); if (!UserManager.hasPlayerDataKey(player) - || Misc.isNPCEntityExcludingVillagers(livingEntity) + || (ExperienceConfig.getInstance().isNPCInteractionPrevented() && Misc.isNPCEntityExcludingVillagers(livingEntity)) || persistentDataLayer.hasMobFlag(MobMetaFlagType.EGG_MOB, livingEntity) || persistentDataLayer.hasMobFlag(MobMetaFlagType.MOB_SPAWNER_MOB, livingEntity)) { return; diff --git a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java index c0fb6da54..d7f727278 100644 --- a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java @@ -895,7 +895,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; } diff --git a/src/main/java/com/gmail/nossr50/util/EventUtils.java b/src/main/java/com/gmail/nossr50/util/EventUtils.java index 52a2f989e..a290ab0dd 100644 --- a/src/main/java/com/gmail/nossr50/util/EventUtils.java +++ b/src/main/java/com/gmail/nossr50/util/EventUtils.java @@ -1,6 +1,7 @@ package com.gmail.nossr50.util; 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.experience.XPGainSource; import com.gmail.nossr50.datatypes.party.Party; 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 616f0e562..1aaf6395f 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java @@ -321,8 +321,10 @@ public final class CombatUtils { 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; @@ -692,7 +694,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; } diff --git a/src/main/resources/experience.yml b/src/main/resources/experience.yml index fd0644d93..4cbbfd080 100644 --- a/src/main/resources/experience.yml +++ b/src/main/resources/experience.yml @@ -35,6 +35,10 @@ 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 Experience_Bars: # Turn this to false if you wanna disable XP bars Enable: true From 31134b38de0efbbc2169f7bf7742116c8951d35e Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 28 Dec 2020 13:00:47 -0800 Subject: [PATCH 266/662] updated changelog --- Changelog.txt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 9d689ced8..ff8d8429e 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -3,8 +3,10 @@ Version 2.1.164 ExploitFix.PreventPluginNPCInteraction Added to experience.yml NOTES: - Historically mcMMO has checked an entity for being a NPC (not a Villager) and backed out of any interaction, this was originally done because of NPCs that were meant to be invincible/etc and not give XP - However nowadays what an NPC is used for is pretty loose, mcMMO only has definitions for some NPCs (such as from Citizens) it doesn't know about most NPCs in most plugins unless they identify themselves in a similar way to the predefined parameters + 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 Version 2.1.163 Fixed the translate URL pointing to the wrong place (thanks chew) From 652a9519c1952bd3c78541a0195de39f7a5ce6ac Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 28 Dec 2020 16:42:00 -0800 Subject: [PATCH 267/662] Move fishing treasues to new file fishing_treasures.yml, replace Records rarity with Mythic, and allow for Enchanted_Book in the treasures list with new optional whitelist/blacklist parameters read the changelog for information about this --- Changelog.txt | 16 +- .../commands/admin/DropTreasureCommand.java | 57 ++ .../commands/skills/FishingCommand.java | 8 +- .../treasure/FishingTreasureConfig.java | 368 ++++++++ .../config/treasure/TreasureConfig.java | 102 +-- .../nossr50/datatypes/player/McMMOPlayer.java | 1 - .../treasure/EnchantmentWrapper.java | 44 + .../treasure/FishingTreasureBook.java | 76 ++ .../nossr50/datatypes/treasure/Rarity.java | 6 +- src/main/java/com/gmail/nossr50/mcMMO.java | 2 + .../gmail/nossr50/skills/fishing/Fishing.java | 6 +- .../skills/fishing/FishingManager.java | 127 ++- .../com/gmail/nossr50/util/EventUtils.java | 1 - .../commands/CommandRegistrationManager.java | 9 + src/main/resources/fishing_treasures.yml | 828 ++++++++++++++++++ .../resources/locale/locale_de.properties | 2 +- .../resources/locale/locale_en_US.properties | 2 +- .../resources/locale/locale_fr.properties | 2 +- .../resources/locale/locale_hu_HU.properties | 2 +- .../resources/locale/locale_it.properties | 2 +- .../resources/locale/locale_ja_JP.properties | 2 +- .../resources/locale/locale_lt_LT.properties | 2 +- .../resources/locale/locale_ru.properties | 2 +- .../resources/locale/locale_zh_CN.properties | 2 +- src/main/resources/plugin.yml | 3 + src/main/resources/treasures.yml | 776 +--------------- 26 files changed, 1512 insertions(+), 936 deletions(-) create mode 100644 src/main/java/com/gmail/nossr50/commands/admin/DropTreasureCommand.java create mode 100755 src/main/java/com/gmail/nossr50/config/treasure/FishingTreasureConfig.java create mode 100644 src/main/java/com/gmail/nossr50/datatypes/treasure/EnchantmentWrapper.java create mode 100644 src/main/java/com/gmail/nossr50/datatypes/treasure/FishingTreasureBook.java create mode 100644 src/main/resources/fishing_treasures.yml diff --git a/Changelog.txt b/Changelog.txt index ff8d8429e..29d9eeb91 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,12 +1,26 @@ Version 2.1.164 - New exploit fix setting, when disabled it will allow combat interactions with "NPC" entities from plugins like Citizens + The Rarity known as Records has been renamed to Mythic + Fishing treasures have been moved from treasures.yml -> fishing_treasures.yml, you'll have to copy over your changes and be aware that Records rarity is now Mythic + Mythic rarity (formerly known as Records) now allows for Enchantments to be applied to drops (See Notes) + Added all Netherite gear to the Mythic tier in fishing_treasures.yml + Added Enchanted Books to fishing loot tables + 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 entry in fishing_treasures.yml, see notes for an example NOTES: + The rarity known as Records was odd to me, if you got the best possible drop it was always going to be a Records drop, 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. 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 + 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 + Version 2.1.163 Fixed the translate URL pointing to the wrong place (thanks chew) 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/skills/FishingCommand.java b/src/main/java/com/gmail/nossr50/commands/skills/FishingCommand.java index 0f34e84b1..b6f1aef42 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/FishingCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/FishingCommand.java @@ -29,7 +29,7 @@ public class FishingCommand extends SkillCommand { private String rareTreasure; private String epicTreasure; private String legendaryTreasure; - private String recordTreasure; + private String mythicTreasure; private String magicChance; @@ -60,13 +60,13 @@ public class FishingCommand extends SkillCommand { 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); + mythicTreasure = percent.format(TreasureConfig.getInstance().getItemDropRate(lootTier, Rarity.MYTHIC) / 100.0); // Magic hunter drop rates double totalEnchantChance = 0; for (Rarity rarity : Rarity.values()) { - if (rarity != Rarity.RECORD) { + if (rarity != Rarity.MYTHIC) { totalEnchantChance += TreasureConfig.getInstance().getEnchantmentDropRate(lootTier, rarity); } } @@ -145,7 +145,7 @@ public class FishingCommand extends SkillCommand { String.valueOf(rareTreasure), String.valueOf(epicTreasure), String.valueOf(legendaryTreasure), - String.valueOf(recordTreasure))); + String.valueOf(mythicTreasure))); } return messages; 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..f7f0a9ec2 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/config/treasure/FishingTreasureConfig.java @@ -0,0 +1,368 @@ +package com.gmail.nossr50.config.treasure; + +import com.gmail.nossr50.config.ConfigLoader; +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 ConfigLoader { + + 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(); + validate(); + } + + public static FishingTreasureConfig getInstance() { + if (instance == null) { + instance = new FishingTreasureConfig(); + } + + return instance; + } + + @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)) { + reason.add("The enchant drop rate for " + tier + " items that are " + rarity.toString() + "should be between 0.0 and 100.0!"); + } + + if (itemDropRate < 0.0 || itemDropRate > 100.0) { + reason.add("The item drop rate for " + tier + " items that are " + rarity.toString() + "should be between 0.0 and 100.0!"); + } + + totalEnchantDropRate += enchantDropRate; + totalItemDropRate += itemDropRate; + } + + if (totalEnchantDropRate < 0 || totalEnchantDropRate > 100.0) { + reason.add("The total enchant drop rate for " + tier + " should be between 0.0 and 100.0!"); + } + + if (totalItemDropRate < 0 || totalItemDropRate > 100.0) { + reason.add("The total item drop rate for " + tier + " should be between 0.0 and 100.0!"); + } + } + + return noErrorsInConfig(reason); + } + + @Override + protected void loadKeys() { + if (config.getConfigurationSection("Treasures") != null) { + backup(); + return; + } + + loadTreasures("Fishing"); + 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"); + + 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 + 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); + } + + 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); + } + + if (amount <= 0) { + amount = 1; + } + + if (material != null && material.isBlock() && (data > 127 || data < -128)) { + reason.add("Data of " + treasureName + " is invalid! " + data); + } + + /* + * XP, Drop Chance, and Drop Level + */ + + int xp = config.getInt(type + "." + treasureName + ".XP"); + double dropChance = config.getDouble(type + "." + treasureName + ".Drop_Chance"); + int dropLevel = config.getInt(type + "." + treasureName + ".Drop_Level"); + + if (xp < 0) { + reason.add(treasureName + " has an invalid XP value: " + xp); + } + + if (dropChance < 0.0D) { + reason.add(treasureName + " has an invalid Drop_Chance: " + dropChance); + } + + if (dropLevel < 0) { + reason.add(treasureName + " has an invalid Drop_Level: " + dropLevel); + } + + /* + * Specific Types + */ + Rarity rarity = null; + + if (isFishing) { + rarity = Rarity.getRarity(config.getString(type + "." + treasureName + ".Rarity")); + + if (rarity == null) { + reason.add("Invalid Rarity for item: " + treasureName); + } + } + + /* + * 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) { + reason.add("Potion format for Treasures.yml has changed"); + } else { + item = new ItemStack(mat, amount, data); + PotionMeta itemMeta = (PotionMeta) item.getItemMeta(); + + PotionType potionType = null; + try { + potionType = PotionType.valueOf(config.getString(type + "." + treasureName + ".PotionData.PotionType", "WATER")); + } catch (IllegalArgumentException ex) { + reason.add("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 != null) { + 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); + //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); + } + } + + } + + + if (noErrorsInConfig(reason)) { + if (isFishing) { + fishingRewards.get(rarity).add(new FishingTreasure(item, xp)); + } else if (isShake) { + ShakeTreasure shakeTreasure = new ShakeTreasure(item, xp, dropChance, dropLevel); + + EntityType entityType = EntityType.valueOf(type.substring(6)); + if (!shakeMap.containsKey(entityType)) + shakeMap.put(entityType, new ArrayList<>()); + shakeMap.get(entityType).add(shakeTreasure); + } + } + } + } + + 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(List enchantListStr, 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.toString() + "." + enchantmentName); + Enchantment enchantment = EnchantmentUtils.getByName(enchantmentName); + + if (enchantment == null) { + plugin.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, 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()); + } +} 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 be050d298..a91968acf 100755 --- a/src/main/java/com/gmail/nossr50/config/treasure/TreasureConfig.java +++ b/src/main/java/com/gmail/nossr50/config/treasure/TreasureConfig.java @@ -1,14 +1,14 @@ 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.datatypes.treasure.ExcavationTreasure; +import com.gmail.nossr50.datatypes.treasure.HylianTreasure; +import com.gmail.nossr50.datatypes.treasure.Rarity; 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; @@ -22,18 +22,14 @@ import java.util.List; public class TreasureConfig extends ConfigLoader { + public static final String FILENAME = "treasures.yml"; 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<>(); - private TreasureConfig() { - super("treasures.yml"); + super(FILENAME); loadKeys(); validate(); } @@ -51,29 +47,18 @@ public class TreasureConfig extends ConfigLoader { // 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!"); } @@ -92,7 +77,6 @@ public class TreasureConfig extends ConfigLoader { loadTreasures("Fishing"); loadTreasures("Excavation"); loadTreasures("Hylian_Luck"); - loadEnchantments(); for (EntityType entity : EntityType.values()) { if (entity.isAlive()) { @@ -102,8 +86,6 @@ public class TreasureConfig extends ConfigLoader { } private void loadTreasures(String type) { - boolean isFishing = type.equals("Fishing"); - boolean isShake = type.contains("Shake"); boolean isExcavation = type.equals("Excavation"); boolean isHylian = type.equals("Hylian_Luck"); @@ -113,13 +95,6 @@ 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<>(); @@ -131,16 +106,7 @@ 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"); @@ -177,19 +143,6 @@ public class TreasureConfig extends ConfigLoader { 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); - } - } - /* * Itemstack */ @@ -198,7 +151,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"); + reason.add("Potion format for " + FILENAME + " has changed"); } else { item = new ItemStack(mat, amount, data); PotionMeta itemMeta = (PotionMeta) item.getItemMeta(); @@ -247,16 +200,7 @@ 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); - - EntityType entityType = EntityType.valueOf(type.substring(6)); - if (!shakeMap.containsKey(entityType)) - shakeMap.put(entityType, new ArrayList<>()); - shakeMap.get(entityType).add(shakeTreasure); - } else if (isExcavation) { + if (isExcavation) { ExcavationTreasure excavationTreasure = new ExcavationTreasure(item, xp, dropChance, dropLevel); List dropList = config.getStringList(type + "." + treasureName + ".Drops_From"); @@ -309,36 +253,6 @@ public class TreasureConfig extends ConfigLoader { 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"); } 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 7ae9861a9..4d94f0d4b 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java +++ b/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java @@ -56,7 +56,6 @@ import com.gmail.nossr50.util.sounds.SoundManager; import com.gmail.nossr50.util.sounds.SoundType; import net.kyori.adventure.identity.Identified; import net.kyori.adventure.identity.Identity; -import org.apache.commons.lang.Validate; import org.bukkit.GameMode; import org.bukkit.Location; import org.bukkit.block.Block; 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..4e65cd9c7 --- /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..ff76b670d 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,16 @@ package com.gmail.nossr50.datatypes.treasure; +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) { try { return valueOf(string); } diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index 15314c693..b98ad9f9f 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -11,6 +11,7 @@ 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; @@ -517,6 +518,7 @@ public class mcMMO extends JavaPlugin { private void loadConfigFiles() { // Force the loading of config files TreasureConfig.getInstance(); + FishingTreasureConfig.getInstance(); HiddenConfig.getInstance(); AdvancedConfig.getInstance(); PotionConfig.getInstance(); 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 c5b7ef833..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; @@ -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 9d76097b6..59789c29d 100644 --- a/src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java @@ -4,16 +4,14 @@ import com.gmail.nossr50.api.ItemSpawnReason; import com.gmail.nossr50.config.AdvancedConfig; import com.gmail.nossr50.config.Config; import com.gmail.nossr50.config.experience.ExperienceConfig; +import com.gmail.nossr50.config.treasure.FishingTreasureConfig; import com.gmail.nossr50.config.treasure.TreasureConfig; 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; @@ -40,10 +38,12 @@ import org.bukkit.entity.*; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.PlayerInventory; +import org.bukkit.inventory.meta.ItemMeta; 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.*; @@ -370,9 +370,7 @@ public class FishingManager extends SkillManager { return AdvancedConfig.getInstance().getFishingBoatReductionMaxWaitTicks(); } - - public boolean isMagicHunterEnabled() - { + 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); @@ -383,12 +381,14 @@ public class FishingManager extends SkillManager { * * @param fishingCatch The {@link Item} initially caught */ - public void handleFishing(Item fishingCatch) { + public void handleFishing(@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)) { treasure = getFishingTreasure(); @@ -396,49 +396,92 @@ public class FishingManager extends SkillManager { } if (treasure != null) { - ItemStack treasureDrop = treasure.getDrop().clone(); // Not cloning is bad, m'kay? - Map enchants = new HashMap<>(); + if(treasure instanceof FishingTreasureBook) { + treasureDrop = 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(fishingSucceeds) { + fishingCatch.setItemStack(treasureDrop); - 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.spawnItem(player.getEyeLocation(), fishingCatch.getItemStack(), ItemSpawnReason.FISHING_EXTRA_FISH); - } - - fishingCatch.setItemStack(treasureDrop); + if (Config.getInstance().getFishingExtraFish()) { + Misc.spawnItem(player.getEyeLocation(), fishingCatch.getItemStack(), ItemSpawnReason.FISHING_EXTRA_FISH); } } applyXpGain(fishXp + treasureXp, XPGainReason.PVE); } + + private @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; + + itemMeta.addEnchant(enchantmentWrapper.getEnchantment(), enchantmentWrapper.getEnchantmentLevel(), ExperienceConfig.getInstance().allowUnsafeEnchantments()); + itemStack.setItemMeta(itemMeta); + return itemStack; + } + + private @NotNull EnchantmentWrapper getRandomEnchantment(@NotNull List enchantmentWrappers) { + Collections.shuffle(enchantmentWrappers, Misc.getRandom()); + + int randomIndex = Misc.getRandom().nextInt(enchantmentWrappers.size()); + return enchantmentWrappers.get(randomIndex+1); + } + /** * Handle the vanilla XP boost for Fishing * @@ -548,7 +591,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; @@ -569,12 +612,8 @@ public class FishingManager extends SkillManager { double dropRate = TreasureConfig.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; @@ -612,19 +651,14 @@ 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) { + 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); @@ -634,7 +668,8 @@ public class FishingManager extends SkillManager { diceRoll = dropRate + 1; continue; } - fishingEnchantments = TreasureConfig.getInstance().fishingEnchantments.get(rarity); + + fishingEnchantments = FishingTreasureConfig.getInstance().fishingEnchantments.get(rarity); break; } diff --git a/src/main/java/com/gmail/nossr50/util/EventUtils.java b/src/main/java/com/gmail/nossr50/util/EventUtils.java index a290ab0dd..52a2f989e 100644 --- a/src/main/java/com/gmail/nossr50/util/EventUtils.java +++ b/src/main/java/com/gmail/nossr50/util/EventUtils.java @@ -1,7 +1,6 @@ package com.gmail.nossr50.util; 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.experience.XPGainSource; import com.gmail.nossr50.datatypes.party.Party; 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 e6b50d469..215c160d8 100644 --- a/src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java +++ b/src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java @@ -142,6 +142,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")); diff --git a/src/main/resources/fishing_treasures.yml b/src/main/resources/fishing_treasures.yml new file mode 100644 index 000000000..36948f73b --- /dev/null +++ b/src/main/resources/fishing_treasures.yml @@ -0,0 +1,828 @@ +# +# 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 + 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: UNCOMMON + MUSIC_DISC_CHIRP: + Amount: 1 + XP: 200 + Rarity: UNCOMMON + MUSIC_DISC_FAR: + Amount: 1 + XP: 200 + Rarity: RARE + MUSIC_DISC_MALL: + Amount: 1 + XP: 200 + Rarity: RARE + MUSIC_DISC_MELLOHI: + Amount: 1 + XP: 200 + Rarity: RARE + MUSIC_DISC_STAL: + Amount: 1 + XP: 200 + Rarity: EPIC + MUSIC_DISC_STRAD: + Amount: 1 + XP: 200 + Rarity: EPIC + MUSIC_DISC_WARD: + Amount: 1 + XP: 200 + Rarity: EPIC + MUSIC_DISC_11: + Amount: 1 + XP: 200 + Rarity: LEGENDARY + MUSIC_DISC_WAIT: + Amount: 1 + XP: 200 + Rarity: LEGENDARY + MUSIC_DISC_13: + Amount: 1 + XP: 200 + Rarity: MYTHIC + 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: MYTHIC + Enchantments_Whitelist: + - Fortune + - Protection + NETHERITE_SCRAP: + Amount: 1 + XP: 400 + Rarity: MYTHIC +# +# 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 + MYTHIC: 0.01 + Tier_2: + TRAP: 2.50 + COMMON: 6.50 + UNCOMMON: 1.75 + RARE: 0.75 + EPIC: 0.50 + LEGENDARY: 0.05 + MYTHIC: 0.01 + Tier_3: + TRAP: 1.50 + COMMON: 3.50 + UNCOMMON: 2.75 + RARE: 1.25 + EPIC: 1.00 + LEGENDARY: 0.10 + MYTHIC: 0.01 + Tier_4: + TRAP: 1.00 + COMMON: 2.00 + UNCOMMON: 3.50 + RARE: 2.25 + EPIC: 1.50 + LEGENDARY: 1.00 + MYTHIC: 0.01 + Tier_5: + TRAP: 0.25 + COMMON: 1.50 + UNCOMMON: 3.75 + RARE: 2.50 + EPIC: 2.00 + LEGENDARY: 1.00 + MYTHIC: 0.01 + Tier_6: + TRAP: 0.10 + COMMON: 1.00 + UNCOMMON: 3.25 + RARE: 3.75 + EPIC: 2.50 + LEGENDARY: 1.50 + MYTHIC: 0.05 + Tier_7: + TRAP: 0.05 + COMMON: 0.25 + UNCOMMON: 2.75 + RARE: 4.00 + EPIC: 5.00 + LEGENDARY: 2.50 + MYTHIC: 0.10 + Tier_8: + TRAP: 0.01 + 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 +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/locale/locale_de.properties b/src/main/resources/locale/locale_de.properties index 23e9fba05..d6525a129 100644 --- a/src/main/resources/locale/locale_de.properties +++ b/src/main/resources/locale/locale_de.properties @@ -380,7 +380,7 @@ 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} +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} &bMythic: &e{5} 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. diff --git a/src/main/resources/locale/locale_en_US.properties b/src/main/resources/locale/locale_en_US.properties index 585d9a5f9..e60f89a86 100644 --- a/src/main/resources/locale/locale_en_US.properties +++ b/src/main/resources/locale/locale_en_US.properties @@ -241,7 +241,7 @@ 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: &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} &bRecord: &e{5} +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 diff --git a/src/main/resources/locale/locale_fr.properties b/src/main/resources/locale/locale_fr.properties index 3ef73beeb..c773ad65c 100644 --- a/src/main/resources/locale/locale_fr.properties +++ b/src/main/resources/locale/locale_fr.properties @@ -240,7 +240,7 @@ Fishing.Ability.Locked.2=Bloqu\u00e9 jusqu\'\u00e0 {0}+ niveau(x) (Ma\u00eetre P Fishing.SubSkill.TreasureHunter.Name=Chasseur de tr\u00e9sors Fishing.SubSkill.TreasureHunter.Description=Remonte des objets inhabituels Fishing.SubSkill.TreasureHunter.Stat=Grade de chasseur de tr\u00e9sor: &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} &bRecord: &e{5} +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\u00eache magique Fishing.SubSkill.MagicHunter.Description=Remonte des objets magiques Fishing.SubSkill.MagicHunter.Stat=Chance du chasseur de tr\u00e9sor diff --git a/src/main/resources/locale/locale_hu_HU.properties b/src/main/resources/locale/locale_hu_HU.properties index f3d8148f2..71f11514c 100644 --- a/src/main/resources/locale/locale_hu_HU.properties +++ b/src/main/resources/locale/locale_hu_HU.properties @@ -240,7 +240,7 @@ Fishing.Ability.Locked.2=LEZ\u00C1RVA {0}+ K\u00C9PESS\u00C9G SZINTIG (MESTER HO Fishing.SubSkill.TreasureHunter.Name=Kincsvad\u00E1sz Fishing.SubSkill.TreasureHunter.Description=Furcsa t\u00E1rgyak kihal\u00E1sz\u00E1sa Fishing.SubSkill.TreasureHunter.Stat=Kincsvad\u00E1sz Szint: &a{0}&3/&a{1} -Fishing.SubSkill.TreasureHunter.Stat.Extra=T\u00E1rgy Es\u00E9si Es\u00E9ly: &7\u00C1tlagos: &e{0} &aRendk\u00EDv\u00FCli: &e{1}\n&9Ritka: &e{2} &dEpikus: &e{3} &6Legend\u00E1s: &e{4} &bRekord: &e{5} +Fishing.SubSkill.TreasureHunter.Stat.Extra=T\u00E1rgy Es\u00E9si Es\u00E9ly: &7\u00C1tlagos: &e{0} &aRendk\u00EDv\u00FCli: &e{1}\n&9Ritka: &e{2} &dEpikus: &e{3} &6Legend\u00E1s: &e{4} &bMythic: &e{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 diff --git a/src/main/resources/locale/locale_it.properties b/src/main/resources/locale/locale_it.properties index 10b7d5a97..c5f293733 100644 --- a/src/main/resources/locale/locale_it.properties +++ b/src/main/resources/locale/locale_it.properties @@ -247,7 +247,7 @@ Fishing.Ability.Locked.2=BLOCCATO FINO AD ABILIT\u00E0 {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: &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} &bRecord: &e{5} +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 diff --git a/src/main/resources/locale/locale_ja_JP.properties b/src/main/resources/locale/locale_ja_JP.properties index b3da37ccb..1064c29ac 100644 --- a/src/main/resources/locale/locale_ja_JP.properties +++ b/src/main/resources/locale/locale_ja_JP.properties @@ -230,7 +230,7 @@ Fishing.Ability.Locked.2=\u30ed\u30c3\u30af\u3055\u308c\u308b\u307e\u3067 {0}+ \ 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: &a{0}&3/&a{1} -Fishing.SubSkill.TreasureHunter.Stat.Extra=\u30c9\u30ed\u30c3\u30d7\u7387: &7\u30b3\u30e2\u30f3: &e{0} &a\u30a2\u30f3\u30b3\u30e2\u30f3: &e{1}\n&9\u30ec\u30a2: &e{2} &d\u30a8\u30d4\u30c3\u30af: &e{3} &6\u30ec\u30b8\u30a7\u30f3\u30c0\u30ea\u30fc: &e{4} &b\u30ec\u30b3\u30fc\u30c9: &e{5} +Fishing.SubSkill.TreasureHunter.Stat.Extra=\u30c9\u30ed\u30c3\u30d7\u7387: &7\u30b3\u30e2\u30f3: &e{0} &a\u30a2\u30f3\u30b3\u30e2\u30f3: &e{1}\n&9\u30ec\u30a2: &e{2} &d\u30a8\u30d4\u30c3\u30af: &e{3} &6\u30ec\u30b8\u30a7\u30f3\u30c0\u30ea\u30fc: &e{4} &bMythic: &e{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 diff --git a/src/main/resources/locale/locale_lt_LT.properties b/src/main/resources/locale/locale_lt_LT.properties index e6eaef4fc..80e26d8e4 100644 --- a/src/main/resources/locale/locale_lt_LT.properties +++ b/src/main/resources/locale/locale_lt_LT.properties @@ -240,7 +240,7 @@ Fishing.Ability.Locked.2=LOCKED UNTIL {0}+ SKILL (MASTER ANGLER) Fishing.SubSkill.TreasureHunter.Name=Lobių ieškotojas Fishing.SubSkill.TreasureHunter.Description=Fish up misc. objects Fishing.SubSkill.TreasureHunter.Stat=Lobių ieškotojo rankas: &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} &bRecord: &e{5} +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=Magiškas žvejys Fishing.SubSkill.MagicHunter.Description=Find Enchanted Items Fishing.SubSkill.MagicHunter.Stat=Magic Hunter Chance diff --git a/src/main/resources/locale/locale_ru.properties b/src/main/resources/locale/locale_ru.properties index be1e8680b..9d36e5e2d 100644 --- a/src/main/resources/locale/locale_ru.properties +++ b/src/main/resources/locale/locale_ru.properties @@ -188,7 +188,7 @@ Fishing.Ability.FD=\u0420\u044b\u0431\u0430\u0446\u043a\u0430\u044f \u0414\u0438 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: &a{0}&3/&a{1} -Fishing.SubSkill.TreasureHunter.Stat.Extra=\u0428\u0430\u043d\u0441 \u0434\u0440\u043e\u043f\u0430: &7\u041e\u0431\u044b\u0447\u043d\u044b\u0439: &e{0} &a\u041d\u0435\u043e\u0431\u044b\u0447\u043d\u044b\u0439: &e{1}\n&9\u0420\u0435\u0434\u043a\u0438\u0439: &e{2} &d\u042d\u043f\u0438\u0447\u0435\u0441\u043a\u0438\u0439: &e{3} &6\u041b\u0435\u0433\u0435\u043d\u0434\u0430\u0440\u043d\u044b\u0439: &e{4} &b\u041f\u043b\u0430\u0441\u0442\u0438\u043d\u043a\u0430: &e{5} +Fishing.SubSkill.TreasureHunter.Stat.Extra=\u0428\u0430\u043d\u0441 \u0434\u0440\u043e\u043f\u0430: &7\u041e\u0431\u044b\u0447\u043d\u044b\u0439: &e{0} &a\u041d\u0435\u043e\u0431\u044b\u0447\u043d\u044b\u0439: &e{1}\n&9\u0420\u0435\u0434\u043a\u0438\u0439: &e{2} &d\u042d\u043f\u0438\u0447\u0435\u0441\u043a\u0438\u0439: &e{3} &6\u041b\u0435\u0433\u0435\u043d\u0434\u0430\u0440\u043d\u044b\u0439: &e{4} &bMythic: &e{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 diff --git a/src/main/resources/locale/locale_zh_CN.properties b/src/main/resources/locale/locale_zh_CN.properties index 5b2dcc042..7557b6cd3 100644 --- a/src/main/resources/locale/locale_zh_CN.properties +++ b/src/main/resources/locale/locale_zh_CN.properties @@ -240,7 +240,7 @@ Fishing.Ability.Locked.2=\u9501\u5b9a\u72b6\u6001,\u76f4\u5230 {0}+ \u6280\u80fd 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: &a{0}&3/&a{1} -Fishing.SubSkill.TreasureHunter.Stat.Extra=\u6389\u843d\u7387: &7\u4e00\u822c: &e{0} &a\u666e\u901a: &e{1}\n&9\u7a00\u6709: &e{2} &d\u7f55\u89c1: &e{3} &6\u53f2\u8bd7: &e{4} &b\u4f20\u8bf4: &e{5} +Fishing.SubSkill.TreasureHunter.Stat.Extra=\u6389\u843d\u7387: &7\u4e00\u822c: &e{0} &a\u666e\u901a: &e{1}\n&9\u7a00\u6709: &e{2} &d\u7f55\u89c1: &e{3} &6\u53f2\u8bd7: &e{4} &bMythic: &e{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 diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 9bbf76aa9..f3dcec5c1 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -19,6 +19,9 @@ 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 diff --git a/src/main/resources/treasures.yml b/src/main/resources/treasures.yml index 077a628c8..24de2fb86 100755 --- a/src/main/resources/treasures.yml +++ b/src/main/resources/treasures.yml @@ -1,447 +1,4 @@ # -# 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. ### @@ -630,335 +187,4 @@ Hylian_Luck: XP: 0 Drop_Chance: 100.0 Drop_Level: 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 + Drops_From: [Pots] \ No newline at end of file From 14a6e5c6034257ecf026c3a752adbaee725c0c51 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 28 Dec 2020 16:45:16 -0800 Subject: [PATCH 268/662] Comment out whitelist in fishing_treasures.yml --- src/main/resources/fishing_treasures.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/resources/fishing_treasures.yml b/src/main/resources/fishing_treasures.yml index 36948f73b..9bdca543a 100644 --- a/src/main/resources/fishing_treasures.yml +++ b/src/main/resources/fishing_treasures.yml @@ -283,9 +283,10 @@ Fishing: Amount: 1 XP: 400 Rarity: MYTHIC - Enchantments_Whitelist: - - Fortune - - Protection +# Uncomment the below 3 lines to use the Whitelist, Alternatively rename it Enchantments_Blacklist to use the blacklist +# Enchantments_Whitelist: +# - Fortune +# - Protection NETHERITE_SCRAP: Amount: 1 XP: 400 From 31e0f1e4da52c8b80532f036e58524a6c0510faf Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 28 Dec 2020 16:47:33 -0800 Subject: [PATCH 269/662] less verbose enchantment book log --- .../gmail/nossr50/datatypes/treasure/FishingTreasureBook.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gmail/nossr50/datatypes/treasure/FishingTreasureBook.java b/src/main/java/com/gmail/nossr50/datatypes/treasure/FishingTreasureBook.java index 4e65cd9c7..8f89f7484 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/treasure/FishingTreasureBook.java +++ b/src/main/java/com/gmail/nossr50/datatypes/treasure/FishingTreasureBook.java @@ -60,7 +60,7 @@ public class FishingTreasureBook extends FishingTreasure { int enchantLevel = i+1; EnchantmentWrapper enchantmentWrapper = new EnchantmentWrapper(enchantment, enchantLevel); legalEnchantments.add(enchantmentWrapper); - mcMMO.p.getLogger().info("Fishing treasure book enchantment added: " + enchantmentWrapper); +// mcMMO.p.getLogger().info("Fishing treasure book enchantment added: " + enchantmentWrapper); } } From 8b62c0b693e9871008e38c310a70cd3ffbcbf6a1 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 28 Dec 2020 16:58:57 -0800 Subject: [PATCH 270/662] Better message for items not found in current version of MC from Fishing Config --- Changelog.txt | 15 ++++++++------- .../config/treasure/FishingTreasureConfig.java | 3 ++- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 29d9eeb91..8b93415d7 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -3,24 +3,25 @@ Version 2.1.164 Fishing treasures have been moved from treasures.yml -> fishing_treasures.yml, you'll have to copy over your changes and be aware that Records rarity is now Mythic Mythic rarity (formerly known as Records) now allows for Enchantments to be applied to drops (See Notes) Added all Netherite gear to the Mythic tier in fishing_treasures.yml - Added Enchanted Books to fishing loot tables + Added Enchanted Books to fishing_treasures.yml as Mythic rarity (can drop with any legal enchantment - 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 entry in fishing_treasures.yml, see notes for an example + 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: - The rarity known as Records was odd to me, if you got the best possible drop it was always going to be a Records drop, 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. + The rarity 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. - 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 + 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 + 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 Version 2.1.163 Fixed the translate URL pointing to the wrong place (thanks chew) diff --git a/src/main/java/com/gmail/nossr50/config/treasure/FishingTreasureConfig.java b/src/main/java/com/gmail/nossr50/config/treasure/FishingTreasureConfig.java index f7f0a9ec2..d71ef7247 100755 --- a/src/main/java/com/gmail/nossr50/config/treasure/FishingTreasureConfig.java +++ b/src/main/java/com/gmail/nossr50/config/treasure/FishingTreasureConfig.java @@ -137,7 +137,8 @@ public class FishingTreasureConfig extends ConfigLoader { short data = (treasureInfo.length == 2) ? Short.parseShort(treasureInfo[1]) : (short) config.getInt(type + "." + treasureName + ".Data"); if (material == null) { - reason.add("Invalid material: " + materialName); + reason.add("Cannot find matching item type in this version of MC, skipping - " + materialName); + continue; } if (amount <= 0) { From 2162c81b21e7665946ab50bab1e903f3c8158449 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 28 Dec 2020 17:00:50 -0800 Subject: [PATCH 271/662] Add semi-important note to changelog --- Changelog.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/Changelog.txt b/Changelog.txt index 8b93415d7..000604dcf 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -13,6 +13,7 @@ Version 2.1.164 The rarity 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. + 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 From ac31a3dc0eb9c0ee9d1ad2b7135f0cefd13a8aca Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 28 Dec 2020 17:37:14 -0800 Subject: [PATCH 272/662] Fixing start up errors when loading treasures.yml --- .../config/treasure/TreasureConfig.java | 34 ------------------- .../skills/fishing/FishingManager.java | 4 +-- 2 files changed, 2 insertions(+), 36 deletions(-) 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 a91968acf..a4dbd6b03 100755 --- a/src/main/java/com/gmail/nossr50/config/treasure/TreasureConfig.java +++ b/src/main/java/com/gmail/nossr50/config/treasure/TreasureConfig.java @@ -46,23 +46,6 @@ public class TreasureConfig extends ConfigLoader { protected boolean validateKeys() { // Validate all the settings! List reason = new ArrayList<>(); - for (String tier : config.getConfigurationSection("Enchantment_Drop_Rates").getKeys(false)) { - double totalItemDropRate = 0; - - for (Rarity rarity : Rarity.values()) { - double itemDropRate = config.getDouble("Item_Drop_Rates." + tier + "." + rarity.toString()); - - 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!"); - } - - totalItemDropRate += itemDropRate; - } - - 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); } @@ -74,7 +57,6 @@ public class TreasureConfig extends ConfigLoader { return; } - loadTreasures("Fishing"); loadTreasures("Excavation"); loadTreasures("Hylian_Luck"); @@ -253,22 +235,6 @@ public class TreasureConfig extends ConfigLoader { hylianMap.get(dropper).add(treasure); } - 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()); } 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 59789c29d..f2bba2bd5 100644 --- a/src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java @@ -531,7 +531,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); @@ -541,7 +541,7 @@ public class FishingManager extends SkillManager { break; } - if (TreasureConfig.getInstance().getInventoryStealStacks()) { + if (FishingTreasureConfig.getInstance().getInventoryStealStacks()) { inventory.setItem(slot, null); } else { From bdee0278a5517f6d8c762f1668837b259c4f25f8 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 29 Dec 2020 12:03:57 -0800 Subject: [PATCH 273/662] Fix Fishing using values from the wrong config --- .../nossr50/commands/skills/FishingCommand.java | 16 ++++++++-------- .../nossr50/config/treasure/TreasureConfig.java | 9 --------- .../nossr50/skills/fishing/FishingManager.java | 5 ++--- 3 files changed, 10 insertions(+), 20 deletions(-) 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 b6f1aef42..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,6 +1,6 @@ package com.gmail.nossr50.commands.skills; -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; @@ -55,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); - mythicTreasure = percent.format(TreasureConfig.getInstance().getItemDropRate(lootTier, Rarity.MYTHIC) / 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.MYTHIC) { - totalEnchantChance += TreasureConfig.getInstance().getEnchantmentDropRate(lootTier, rarity); + totalEnchantChance += FishingTreasureConfig.getInstance().getEnchantmentDropRate(lootTier, 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 a4dbd6b03..eac722de1 100755 --- a/src/main/java/com/gmail/nossr50/config/treasure/TreasureConfig.java +++ b/src/main/java/com/gmail/nossr50/config/treasure/TreasureConfig.java @@ -3,7 +3,6 @@ package com.gmail.nossr50.config.treasure; import com.gmail.nossr50.config.ConfigLoader; import com.gmail.nossr50.datatypes.treasure.ExcavationTreasure; import com.gmail.nossr50.datatypes.treasure.HylianTreasure; -import com.gmail.nossr50.datatypes.treasure.Rarity; import com.gmail.nossr50.util.text.StringUtils; import org.bukkit.ChatColor; import org.bukkit.Material; @@ -234,12 +233,4 @@ public class TreasureConfig extends ConfigLoader { hylianMap.put(dropper, new ArrayList<>()); hylianMap.get(dropper).add(treasure); } - - 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()); - } } 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 f2bba2bd5..1211966c3 100644 --- a/src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java @@ -5,7 +5,6 @@ import com.gmail.nossr50.config.AdvancedConfig; import com.gmail.nossr50.config.Config; import com.gmail.nossr50.config.experience.ExperienceConfig; import com.gmail.nossr50.config.treasure.FishingTreasureConfig; -import com.gmail.nossr50.config.treasure.TreasureConfig; import com.gmail.nossr50.datatypes.experience.XPGainReason; import com.gmail.nossr50.datatypes.interactions.NotificationType; import com.gmail.nossr50.datatypes.player.McMMOPlayer; @@ -609,7 +608,7 @@ public class FishingManager extends SkillManager { 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) { @@ -660,7 +659,7 @@ public class FishingManager extends SkillManager { for (Rarity rarity : Rarity.values()) { - 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 From 0f4455d5a8d3841a4d5b1591e4fb156dd3b7d5ac Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 29 Dec 2020 12:12:03 -0800 Subject: [PATCH 274/662] remove unused settings from fishing treasures and add enchantment section for mythic --- src/main/resources/fishing_treasures.yml | 30 +++++++++++++++++------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/src/main/resources/fishing_treasures.yml b/src/main/resources/fishing_treasures.yml index 9bdca543a..0994aeb79 100644 --- a/src/main/resources/fishing_treasures.yml +++ b/src/main/resources/fishing_treasures.yml @@ -296,7 +296,6 @@ Fishing: ### Item_Drop_Rates: Tier_1: - TRAP: 7.68 COMMON: 7.50 UNCOMMON: 1.25 RARE: 0.25 @@ -304,7 +303,6 @@ Item_Drop_Rates: LEGENDARY: 0.01 MYTHIC: 0.01 Tier_2: - TRAP: 2.50 COMMON: 6.50 UNCOMMON: 1.75 RARE: 0.75 @@ -312,7 +310,6 @@ Item_Drop_Rates: LEGENDARY: 0.05 MYTHIC: 0.01 Tier_3: - TRAP: 1.50 COMMON: 3.50 UNCOMMON: 2.75 RARE: 1.25 @@ -320,7 +317,6 @@ Item_Drop_Rates: LEGENDARY: 0.10 MYTHIC: 0.01 Tier_4: - TRAP: 1.00 COMMON: 2.00 UNCOMMON: 3.50 RARE: 2.25 @@ -328,7 +324,6 @@ Item_Drop_Rates: LEGENDARY: 1.00 MYTHIC: 0.01 Tier_5: - TRAP: 0.25 COMMON: 1.50 UNCOMMON: 3.75 RARE: 2.50 @@ -336,7 +331,6 @@ Item_Drop_Rates: LEGENDARY: 1.00 MYTHIC: 0.01 Tier_6: - TRAP: 0.10 COMMON: 1.00 UNCOMMON: 3.25 RARE: 3.75 @@ -344,7 +338,6 @@ Item_Drop_Rates: LEGENDARY: 1.50 MYTHIC: 0.05 Tier_7: - TRAP: 0.05 COMMON: 0.25 UNCOMMON: 2.75 RARE: 4.00 @@ -352,7 +345,6 @@ Item_Drop_Rates: LEGENDARY: 2.50 MYTHIC: 0.10 Tier_8: - TRAP: 0.01 COMMON: 0.10 UNCOMMON: 1.50 RARE: 6.00 @@ -439,6 +431,28 @@ Enchantments_Rarity: 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 From d9f98b1aa9b2ff97fd840ba51b92e9f84a771b81 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 29 Dec 2020 12:39:06 -0800 Subject: [PATCH 275/662] Fix a bug where books weren't registered + tweaked how treasures were loaded --- .../treasure/FishingTreasureConfig.java | 119 ++++++++++-------- .../nossr50/datatypes/treasure/Rarity.java | 5 + .../nossr50/listeners/PlayerListener.java | 2 +- .../skills/fishing/FishingManager.java | 2 +- 4 files changed, 74 insertions(+), 54 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/config/treasure/FishingTreasureConfig.java b/src/main/java/com/gmail/nossr50/config/treasure/FishingTreasureConfig.java index d71ef7247..69d835541 100755 --- a/src/main/java/com/gmail/nossr50/config/treasure/FishingTreasureConfig.java +++ b/src/main/java/com/gmail/nossr50/config/treasure/FishingTreasureConfig.java @@ -15,6 +15,7 @@ import org.bukkit.inventory.meta.PotionMeta; import org.bukkit.potion.PotionData; import org.bukkit.potion.PotionType; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.*; @@ -94,7 +95,7 @@ public class FishingTreasureConfig extends ConfigLoader { } } - private void loadTreasures(String type) { + private void loadTreasures(@NotNull String type) { boolean isFishing = type.equals("Fishing"); boolean isShake = type.contains("Shake"); @@ -125,9 +126,7 @@ public class FishingTreasureConfig extends ConfigLoader { 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())); + addShakeTreasure(new ShakeTreasure(new ItemStack(Material.BEDROCK, 1, (byte) 0), 1, getInventoryStealDropChance(), getInventoryStealDropLevel()), EntityType.PLAYER); continue; } else { material = Material.matchMaterial(materialName); @@ -145,7 +144,7 @@ public class FishingTreasureConfig extends ConfigLoader { amount = 1; } - if (material != null && material.isBlock() && (data > 127 || data < -128)) { + if (material.isBlock() && (data > 127 || data < -128)) { reason.add("Data of " + treasureName + " is invalid! " + data); } @@ -175,10 +174,14 @@ public class FishingTreasureConfig extends ConfigLoader { Rarity rarity = null; if (isFishing) { - rarity = Rarity.getRarity(config.getString(type + "." + treasureName + ".Rarity")); + String rarityStr = config.getString(type + "." + treasureName + ".Rarity"); - if (rarity == null) { - reason.add("Invalid Rarity for item: " + treasureName); + 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; } } @@ -202,6 +205,11 @@ public class FishingTreasureConfig extends ConfigLoader { 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")); @@ -225,67 +233,74 @@ public class FishingTreasureConfig extends ConfigLoader { } item.setItemMeta(itemMeta); } - } else if (material != null) { - if(material == Material.ENCHANTED_BOOK) { - //If any whitelisted enchants exist we use whitelist-based matching - item = new ItemStack(material, 1); - ItemMeta itemMeta = item.getItemMeta(); + } 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"); + List allowedEnchantsList = config.getStringList(type + "." + treasureName + ".Enchantments_Whitelist"); + List disallowedEnchantsList = config.getStringList(type + "." + treasureName + ".Enchantments_Blacklist"); - Set blackListedEnchants = new HashSet<>(); - Set whiteListedEnchants = new HashSet<>(); + Set blackListedEnchants = new HashSet<>(); + Set whiteListedEnchants = new HashSet<>(); - matchAndFillSet(disallowedEnchantsList, blackListedEnchants); - matchAndFillSet(allowedEnchantsList, whiteListedEnchants); + 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); - //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); - } + 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); + } } + if (noErrorsInConfig(reason)) { if (isFishing) { - fishingRewards.get(rarity).add(new FishingTreasure(item, xp)); + addFishingTreasure(rarity, new FishingTreasure(item, xp)); } else if (isShake) { ShakeTreasure shakeTreasure = new ShakeTreasure(item, xp, dropChance, dropLevel); EntityType entityType = EntityType.valueOf(type.substring(6)); - if (!shakeMap.containsKey(entityType)) - shakeMap.put(entityType, new ArrayList<>()); - shakeMap.get(entityType).add(shakeTreasure); + 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"); } @@ -296,7 +311,7 @@ public class FishingTreasureConfig extends ConfigLoader { * @param enchantListStr the users string list of enchantments * @param permissiveList the permissive list of enchantments */ - private void matchAndFillSet(List enchantListStr, Set permissiveList) { + private void matchAndFillSet(@NotNull List enchantListStr, @NotNull Set permissiveList) { if(enchantListStr.isEmpty()) { return; } @@ -359,11 +374,11 @@ public class FishingTreasureConfig extends ConfigLoader { return config.getInt("Shake.PLAYER.INVENTORY.Drop_Level"); } - public double getItemDropRate(int tier, Rarity rarity) { + public double getItemDropRate(int tier, @NotNull Rarity rarity) { return config.getDouble("Item_Drop_Rates.Tier_" + tier + "." + rarity.toString()); } - public double getEnchantmentDropRate(int tier, Rarity rarity) { + public double getEnchantmentDropRate(int tier, @NotNull Rarity rarity) { return config.getDouble("Enchantment_Drop_Rates.Tier_" + tier + "." + rarity.toString()); } } 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 ff76b670d..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,5 +1,6 @@ package com.gmail.nossr50.datatypes.treasure; +import com.gmail.nossr50.mcMMO; import org.jetbrains.annotations.NotNull; public enum Rarity { @@ -11,6 +12,10 @@ public enum Rarity { COMMON; 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/listeners/PlayerListener.java b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java index d7f727278..e2981c32c 100644 --- a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java @@ -419,7 +419,7 @@ public class PlayerListener implements Listener { } } - fishingManager.handleFishing((Item) caught); + fishingManager.processFishing((Item) caught); fishingManager.setFishingTarget(); } return; 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 1211966c3..52c4163ab 100644 --- a/src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java @@ -380,7 +380,7 @@ public class FishingManager extends SkillManager { * * @param fishingCatch The {@link Item} initially caught */ - public void handleFishing(@NotNull Item fishingCatch) { + public void processFishing(@NotNull Item fishingCatch) { this.fishingCatch = fishingCatch; int fishXp = ExperienceConfig.getInstance().getXp(PrimarySkillType.FISHING, fishingCatch.getItemStack().getType()); int treasureXp = 0; From 3c9c8556dde9ec6fefafd889ce182b43490c60a8 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 29 Dec 2020 12:58:39 -0800 Subject: [PATCH 276/662] Allow vanilla block interaction with sneak if the block is set to be a mcMMO repair/salvage anvil --- Changelog.txt | 2 ++ src/main/java/com/gmail/nossr50/listeners/PlayerListener.java | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 000604dcf..c70b7c4f9 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,4 +1,5 @@ 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, you'll have to copy over your changes and be aware that Records rarity is now Mythic Mythic rarity (formerly known as Records) now allows for Enchantments to be applied to drops (See Notes) @@ -10,6 +11,7 @@ Version 2.1.164 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: + 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. The rarity 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. diff --git a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java index e2981c32c..1339a8850 100644 --- a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java @@ -616,8 +616,8 @@ public class PlayerListener implements Listener { 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); } } From bab13f32e75d54cf192134f5bb97ce0c203a7348 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 29 Dec 2020 13:15:15 -0800 Subject: [PATCH 277/662] update notes --- Changelog.txt | 2 +- src/main/java/com/gmail/nossr50/config/Config.java | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index c70b7c4f9..6058013d5 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -11,7 +11,7 @@ Version 2.1.164 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: - 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. + 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). The rarity 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. diff --git a/src/main/java/com/gmail/nossr50/config/Config.java b/src/main/java/com/gmail/nossr50/config/Config.java index d1368dc9b..9747d3acb 100644 --- a/src/main/java/com/gmail/nossr50/config/Config.java +++ b/src/main/java/com/gmail/nossr50/config/Config.java @@ -9,6 +9,7 @@ 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.Nullable; import java.util.ArrayList; import java.util.List; @@ -509,14 +510,17 @@ public class Config extends AutoUpdateConfigLoader { 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 @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 Material getSalvageAnvilMaterial() { return Material.matchMaterial(config.getString("Skills.Salvage.Anvil_Material", "GOLD_BLOCK")); } + 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 */ From 8ff345af38ec712c5b4f01e4017af2a82a93ddb9 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 29 Dec 2020 13:20:10 -0800 Subject: [PATCH 278/662] fix array out of bounds --- .../java/com/gmail/nossr50/skills/fishing/FishingManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 52c4163ab..3e0ec850e 100644 --- a/src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java @@ -478,7 +478,7 @@ public class FishingManager extends SkillManager { Collections.shuffle(enchantmentWrappers, Misc.getRandom()); int randomIndex = Misc.getRandom().nextInt(enchantmentWrappers.size()); - return enchantmentWrappers.get(randomIndex+1); + return enchantmentWrappers.get(randomIndex); } /** From dd3d3244158735bb9d7abad9728d8c388987e7e8 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 29 Dec 2020 13:38:03 -0800 Subject: [PATCH 279/662] update notes and default fishing treasures --- Changelog.txt | 19 +++++++++++++------ src/main/resources/fishing_treasures.yml | 13 +++++++++++-- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 6058013d5..85d2b10ae 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,31 +1,38 @@ 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, you'll have to copy over your changes and be aware that Records rarity is now 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) - Added all Netherite gear to the Mythic tier in fishing_treasures.yml - Added Enchanted Books to fishing_treasures.yml as Mythic rarity (can drop with any legal enchantment - 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: - 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). - The rarity 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. + 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. + 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. + 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 diff --git a/src/main/resources/fishing_treasures.yml b/src/main/resources/fishing_treasures.yml index 0994aeb79..d839da2fd 100644 --- a/src/main/resources/fishing_treasures.yml +++ b/src/main/resources/fishing_treasures.yml @@ -139,6 +139,10 @@ Fishing: Amount: 1 XP: 200 Rarity: RARE + NAME_TAG: + Amount: 1 + XP: 200 + Rarity: RARE IRON_BOOTS: Amount: 1 XP: 200 @@ -163,6 +167,10 @@ Fishing: Amount: 5 XP: 200 Rarity: EPIC + NAUTILUS_SHELL: + Amount: 1 + XP: 200 + Rarity: LEGENDARY DIAMOND_SWORD: Amount: 1 XP: 200 @@ -282,15 +290,16 @@ Fishing: ENCHANTED_BOOK: Amount: 1 XP: 400 - Rarity: MYTHIC + 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: MYTHIC + Rarity: LEGENDARY # # Fishing drop rates ### From 7802d54ebd7d27cf766b65c2c629a1120ac1692c Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 29 Dec 2020 13:47:40 -0800 Subject: [PATCH 280/662] 2.1.164 Closes #4358 #4342 #3812 #3643 #3540 --- Changelog.txt | 1 + pom.xml | 2 +- .../nossr50/config/treasure/FishingTreasureConfig.java | 3 +-- .../com/gmail/nossr50/config/treasure/TreasureConfig.java | 6 ------ 4 files changed, 3 insertions(+), 9 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 85d2b10ae..99717caaf 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -16,6 +16,7 @@ Version 2.1.164 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. diff --git a/pom.xml b/pom.xml index 19ed2dbfa..e353ab913 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.164-SNAPSHOT + 2.1.164 mcMMO https://github.com/mcMMO-Dev/mcMMO diff --git a/src/main/java/com/gmail/nossr50/config/treasure/FishingTreasureConfig.java b/src/main/java/com/gmail/nossr50/config/treasure/FishingTreasureConfig.java index 69d835541..41fa349ce 100755 --- a/src/main/java/com/gmail/nossr50/config/treasure/FishingTreasureConfig.java +++ b/src/main/java/com/gmail/nossr50/config/treasure/FishingTreasureConfig.java @@ -15,7 +15,6 @@ import org.bukkit.inventory.meta.PotionMeta; import org.bukkit.potion.PotionData; import org.bukkit.potion.PotionType; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import java.util.*; @@ -200,7 +199,7 @@ public class FishingTreasureConfig extends ConfigLoader { if (materialName.contains("POTION")) { Material mat = Material.matchMaterial(materialName); if (mat == null) { - reason.add("Potion format for Treasures.yml has changed"); + reason.add("Potion format for " + FILENAME + " has changed"); } else { item = new ItemStack(mat, amount, data); PotionMeta itemMeta = (PotionMeta) item.getItemMeta(); 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 eac722de1..51e01307e 100755 --- a/src/main/java/com/gmail/nossr50/config/treasure/TreasureConfig.java +++ b/src/main/java/com/gmail/nossr50/config/treasure/TreasureConfig.java @@ -58,12 +58,6 @@ public class TreasureConfig extends ConfigLoader { loadTreasures("Excavation"); loadTreasures("Hylian_Luck"); - - for (EntityType entity : EntityType.values()) { - if (entity.isAlive()) { - loadTreasures("Shake." + entity.toString()); - } - } } private void loadTreasures(String type) { From 01f31e76f57e8be8bbaa867bf6396bbaf752f792 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Wed, 30 Dec 2020 15:20:24 -0800 Subject: [PATCH 281/662] new chunkstore Co-authored-by: t00thpick1 --- Changelog.txt | 7 + pom.xml | 22 +- .../nossr50/listeners/WorldListener.java | 22 - src/main/java/com/gmail/nossr50/mcMMO.java | 6 +- .../util/blockmeta/BitSetChunkStore.java | 243 ++++++++++ .../{chunkmeta => }/ChunkManager.java | 72 +-- .../{chunkmeta => }/ChunkManagerFactory.java | 2 +- .../blockmeta/{chunkmeta => }/ChunkStore.java | 27 +- .../util/blockmeta/ChunkletManager.java | 151 ------ .../blockmeta/ChunkletManagerFactory.java | 15 - .../nossr50/util/blockmeta/ChunkletStore.java | 48 -- .../util/blockmeta/ChunkletStoreFactory.java | 8 - .../util/blockmeta/HashChunkManager.java | 354 ++++++++++++++ .../util/blockmeta/HashChunkletManager.java | 410 ---------------- .../util/blockmeta/McMMOSimpleRegionFile.java | 257 ++++++++++ .../{chunkmeta => }/NullChunkManager.java | 42 +- .../util/blockmeta/NullChunkletManager.java | 85 ---- .../blockmeta/PrimitiveChunkletStore.java | 48 -- .../blockmeta/PrimitiveExChunkletStore.java | 180 ------- .../chunkmeta/ChunkStoreFactory.java | 10 - .../blockmeta/chunkmeta/HashChunkManager.java | 447 ------------------ .../chunkmeta/McMMOSimpleChunkBuffer.java | 39 -- .../chunkmeta/McMMOSimpleRegionFile.java | 306 ------------ .../chunkmeta/PrimitiveChunkStore.java | 147 ------ .../conversion/BlockStoreConversionMain.java | 90 ---- .../BlockStoreConversionXDirectory.java | 80 ---- .../BlockStoreConversionZDirectory.java | 191 -------- src/test/java/ChunkStoreTest.java | 308 ++++++++++++ 28 files changed, 1211 insertions(+), 2406 deletions(-) create mode 100644 src/main/java/com/gmail/nossr50/util/blockmeta/BitSetChunkStore.java rename src/main/java/com/gmail/nossr50/util/blockmeta/{chunkmeta => }/ChunkManager.java (61%) mode change 100755 => 100644 rename src/main/java/com/gmail/nossr50/util/blockmeta/{chunkmeta => }/ChunkManagerFactory.java (86%) mode change 100755 => 100644 rename src/main/java/com/gmail/nossr50/util/blockmeta/{chunkmeta => }/ChunkStore.java (79%) mode change 100755 => 100644 delete mode 100755 src/main/java/com/gmail/nossr50/util/blockmeta/ChunkletManager.java delete mode 100755 src/main/java/com/gmail/nossr50/util/blockmeta/ChunkletManagerFactory.java delete mode 100755 src/main/java/com/gmail/nossr50/util/blockmeta/ChunkletStore.java delete mode 100755 src/main/java/com/gmail/nossr50/util/blockmeta/ChunkletStoreFactory.java create mode 100644 src/main/java/com/gmail/nossr50/util/blockmeta/HashChunkManager.java delete mode 100755 src/main/java/com/gmail/nossr50/util/blockmeta/HashChunkletManager.java create mode 100644 src/main/java/com/gmail/nossr50/util/blockmeta/McMMOSimpleRegionFile.java rename src/main/java/com/gmail/nossr50/util/blockmeta/{chunkmeta => }/NullChunkManager.java (54%) mode change 100755 => 100644 delete mode 100755 src/main/java/com/gmail/nossr50/util/blockmeta/NullChunkletManager.java delete mode 100755 src/main/java/com/gmail/nossr50/util/blockmeta/PrimitiveChunkletStore.java delete mode 100755 src/main/java/com/gmail/nossr50/util/blockmeta/PrimitiveExChunkletStore.java delete mode 100755 src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/ChunkStoreFactory.java delete mode 100755 src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/HashChunkManager.java delete mode 100644 src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/McMMOSimpleChunkBuffer.java delete mode 100644 src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/McMMOSimpleRegionFile.java delete mode 100755 src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/PrimitiveChunkStore.java delete mode 100755 src/main/java/com/gmail/nossr50/util/blockmeta/conversion/BlockStoreConversionMain.java delete mode 100755 src/main/java/com/gmail/nossr50/util/blockmeta/conversion/BlockStoreConversionXDirectory.java delete mode 100755 src/main/java/com/gmail/nossr50/util/blockmeta/conversion/BlockStoreConversionZDirectory.java create mode 100644 src/test/java/ChunkStoreTest.java diff --git a/Changelog.txt b/Changelog.txt index 99717caaf..64cce7473 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,10 @@ +Version 2.1.165 + The mcMMO system which tracks player placed blocks has had some major rewrites (thanks t00thpick1) + mcMMO will now be compatible with changes to world height (1.17 compatibility) + + NOTES: + 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 + 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 diff --git a/pom.xml b/pom.xml index e353ab913..755d4490f 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.164 + 2.1.165-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO @@ -279,7 +279,25 @@ junit junit-dep - 4.10 + 4.11 + test + + + org.powermock + powermock-module-junit4 + 2.0.7 + test + + + org.powermock + powermock-api-mockito2 + 2.0.7 + test + + + org.mockito + mockito-core + 3.4.6 test diff --git a/src/main/java/com/gmail/nossr50/listeners/WorldListener.java b/src/main/java/com/gmail/nossr50/listeners/WorldListener.java index 5fc386c86..650a0e0cc 100644 --- a/src/main/java/com/gmail/nossr50/listeners/WorldListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/WorldListener.java @@ -42,28 +42,6 @@ public class WorldListener implements Listener { } } - /** - * 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/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index b98ad9f9f..529f70fb5 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -38,8 +38,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; @@ -336,8 +336,8 @@ public class mcMMO extends JavaPlugin { formulaManager.saveFormula(); holidayManager.saveAnniversaryFiles(); - placeStore.saveAll(); // Save our metadata placeStore.cleanUp(); // Cleanup empty metadata stores + placeStore.closeAll(); } catch (Exception e) { e.printStackTrace(); } 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..dce7ab174 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/util/blockmeta/BitSetChunkStore.java @@ -0,0 +1,243 @@ +package com.gmail.nossr50.util.blockmeta; + +import org.bukkit.Bukkit; +import org.bukkit.World; + +import java.io.*; +import java.util.BitSet; +import java.util.UUID; + +public class BitSetChunkStore implements ChunkStore, Serializable { + private static final long serialVersionUID = -1L; + transient private boolean dirty = false; + // 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 BitSet store; + private static final int CURRENT_VERSION = 8; + private static final int MAGIC_NUMBER = 0xEA5EDEBB; + private int cx; + private int cz; + private int worldHeight; + private UUID worldUid; + + public BitSetChunkStore(World world, int cx, int cz) { + this.cx = cx; + this.cz = cz; + this.worldUid = world.getUID(); + this.worldHeight = world.getMaxHeight(); + this.store = new BitSet(16 * 16 * worldHeight); + } + + private BitSetChunkStore() {} + + @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 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) { + if (x < 0 || x >= 16 || y < 0 || y >= worldHeight || z < 0 || z >= 16) + throw new IndexOutOfBoundsException(); + return (z * 16 + x) + (256 * y); + } + + private void fixWorldHeight() { + 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) + return; + + // Lop off any extra data if the world height has shrunk + int currentWorldHeight = world.getMaxHeight(); + if (currentWorldHeight < worldHeight) + { + store.clear(coordToIndex(16, currentWorldHeight, 16), store.length()); + worldHeight = currentWorldHeight; + dirty = true; + } + // If the world height has grown, update the worldHeight variable, but don't bother marking it dirty as unless something else changes we don't need to force a file write; + else if (currentWorldHeight > worldHeight) + worldHeight = currentWorldHeight; + } + + @Deprecated + private void writeObject(ObjectOutputStream out) throws IOException { + throw new UnsupportedOperationException("Serializable support should only be used for legacy deserialization"); + } + + @Deprecated + private void readObject(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(); + + boolean[][][] oldStore = (boolean[][][]) in.readObject(); + worldHeight = oldStore[0][0].length; + store = new BitSet(16 * 16 * worldHeight / 8); + for (int x = 0; x < 16; x++) { + for (int z = 0; z < 16; z++) { + for (int y = 0; y < worldHeight; y++) { + store.set(coordToIndex(x, y, z), oldStore[x][z][y]); + } + } + } + dirty = true; + fixWorldHeight(); + } + + private void serialize(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(worldHeight); + + // 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 BitSetChunkStore deserialize(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 != CURRENT_VERSION) + throw new IOException(); + + BitSetChunkStore chunkStore = new BitSetChunkStore(); + + long lsb = in.readLong(); + long msb = in.readLong(); + chunkStore.worldUid = new UUID(msb, lsb); + chunkStore.cx = in.readInt(); + chunkStore.cz = in.readInt(); + + chunkStore.worldHeight = in.readInt(); + byte[] temp = new byte[in.readInt()]; + in.readFully(temp); + chunkStore.store = BitSet.valueOf(temp); + + chunkStore.fixWorldHeight(); + return chunkStore; + } + + public static class Serialization { + + public static final short STREAM_MAGIC = (short)0xACDC; + + public static ChunkStore readChunkStore(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 >>> 0) & 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(DataOutputStream outputStream, 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 classes even though we have changed name/package + private static class LegacyDeserializationInputStream extends ObjectInputStream { + public LegacyDeserializationInputStream(InputStream in) throws IOException { + super(in); + enableResolveObject(true); + } + + @Override + protected ObjectStreamClass readClassDescriptor() throws IOException, ClassNotFoundException { + ObjectStreamClass read = super.readClassDescriptor(); + if (read.getName().contentEquals("com.gmail.nossr50.util.blockmeta.chunkmeta.PrimitiveChunkStore")) + return ObjectStreamClass.lookup(BitSetChunkStore.class); + return read; + } + + public ChunkStore readLegacyChunkStore(){ + try { + return (ChunkStore) readObject(); + } catch (IOException | ClassNotFoundException e) { + return null; + } + } + } + } +} diff --git a/src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/ChunkManager.java b/src/main/java/com/gmail/nossr50/util/blockmeta/ChunkManager.java old mode 100755 new mode 100644 similarity index 61% rename from src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/ChunkManager.java rename to src/main/java/com/gmail/nossr50/util/blockmeta/ChunkManager.java index d64824a0e..5cb50ac7f --- a/src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/ChunkManager.java +++ b/src/main/java/com/gmail/nossr50/util/blockmeta/ChunkManager.java @@ -1,59 +1,12 @@ -package com.gmail.nossr50.util.blockmeta.chunkmeta; +package com.gmail.nossr50.util.blockmeta; 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 { void closeAll(); - ChunkStore readChunkStore(World world, int x, int z) throws IOException; - - void writeChunkStore(World world, int x, int z, ChunkStore data); - - 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 - */ - 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 - */ - 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 - */ - 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 - */ - void unloadChunk(int cx, int cz, World world); - /** * Saves a given Chunk's Chunklet data * @@ -63,17 +16,6 @@ public interface ChunkManager { */ void saveChunk(int cx, int cz, World world); - 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 - */ - void chunkLoaded(int cx, int cz, World world); - /** * Informs the ChunkletManager a chunk is unloaded * @@ -97,23 +39,11 @@ public interface ChunkManager { */ void unloadWorld(World world); - /** - * Load all ChunkletStores from all loaded chunks from this world into memory - * - * @param world World to load - */ - void loadWorld(World world); - /** * Save all ChunkletStores */ void saveAll(); - /** - * Unload all ChunkletStores after saving them - */ - void unloadAll(); - /** * Check to see if a given location is set to true * diff --git a/src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/ChunkManagerFactory.java b/src/main/java/com/gmail/nossr50/util/blockmeta/ChunkManagerFactory.java old mode 100755 new mode 100644 similarity index 86% rename from src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/ChunkManagerFactory.java rename to src/main/java/com/gmail/nossr50/util/blockmeta/ChunkManagerFactory.java index 2b4d90349..a290c5e2a --- a/src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/ChunkManagerFactory.java +++ b/src/main/java/com/gmail/nossr50/util/blockmeta/ChunkManagerFactory.java @@ -1,4 +1,4 @@ -package com.gmail.nossr50.util.blockmeta.chunkmeta; +package com.gmail.nossr50.util.blockmeta; import com.gmail.nossr50.config.HiddenConfig; 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 79% 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 69b2acae1..eca783ccd --- a/src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/ChunkStore.java +++ b/src/main/java/com/gmail/nossr50/util/blockmeta/ChunkStore.java @@ -1,13 +1,13 @@ -package com.gmail.nossr50.util.blockmeta.chunkmeta; +package com.gmail.nossr50.util.blockmeta; -import com.gmail.nossr50.util.blockmeta.ChunkletStore; +import org.bukkit.World; -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 * @@ -36,6 +36,8 @@ public interface ChunkStore extends Serializable { */ int getChunkZ(); + UUID getWorldId(); + /** * Checks the value at the given coordinates * @@ -64,15 +66,18 @@ public interface ChunkStore extends Serializable { */ 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 */ 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 - */ - void copyFrom(ChunkletStore otherStore); } 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 feb54acd3..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 - */ - 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 - */ - 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 - */ - 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 - */ - 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 - */ - 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 - */ - void chunkUnloaded(int cx, int cz, World world); - - /** - * Save all ChunkletStores related to the given world - * - * @param world World to save - */ - void saveWorld(World world); - - /** - * Unload all ChunkletStores from memory related to the given world after saving them - * - * @param world World to unload - */ - void unloadWorld(World world); - - /** - * Load all ChunkletStores from all loaded chunks from this world into memory - * - * @param world World to load - */ - void loadWorld(World world); - - /** - * Save all ChunkletStores - */ - void saveAll(); - - /** - * Unload all ChunkletStores after saving them - */ - 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 - */ - 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 - */ - 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 - */ - 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 - */ - 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 - */ - 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 - */ - void setFalse(Block block); - - /** - * Delete any ChunkletStores that are empty - */ - 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 9b1537782..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 - */ - 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 - */ - 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 - */ - void setFalse(int x, int y, int z); - - /** - * @return true if all values in the chunklet are false, false if otherwise - */ - 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 - */ - 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..888937872 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/util/blockmeta/HashChunkManager.java @@ -0,0 +1,354 @@ +package com.gmail.nossr50.util.blockmeta; + +import com.gmail.nossr50.mcMMO; +import org.bukkit.Bukkit; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.BlockState; + +import java.io.*; +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; + writeChunkStore(Bukkit.getWorld(chunkStore.getWorldId()), chunkStore); + } + // Clear in memory chunks + chunkMap.clear(); + chunkUsageMap.clear(); + // Close all region files + for (McMMOSimpleRegionFile rf : regionMap.values()) + rf.close(); + regionMap.clear(); + } + + private synchronized ChunkStore readChunkStore(World world, int cx, int cz) throws IOException { + McMMOSimpleRegionFile rf = getSimpleRegionFile(world, cx, cz, false); + 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(World world, ChunkStore data) { + if (!data.isDirty()) + return; // Don't save unchanged data + try { + McMMOSimpleRegionFile rf = getSimpleRegionFile(world, data.getChunkX(), data.getChunkZ(), true); + 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 McMMOSimpleRegionFile getSimpleRegionFile(World world, int cx, int cz, boolean createIfAbsent) { + CoordinateKey regionKey = toRegionKey(world.getUID(), cx, cz); + + return regionMap.computeIfAbsent(regionKey, k -> { + File worldRegionsDirectory = new File(world.getWorldFolder(), "mcmmo_regions"); + if (!createIfAbsent && !worldRegionsDirectory.isDirectory()) + return null; // Don't create the directory on read-only operations + worldRegionsDirectory.mkdirs(); // Ensure directory exists + File regionFile = new File(worldRegionsDirectory, "mcmmo_" + regionKey.x + "_" + regionKey.z + "_.mcm"); + if (!createIfAbsent && !regionFile.exists()) + return null; // Don't create the file on read-only operations + return new McMMOSimpleRegionFile(regionFile, regionKey.x, regionKey.z); + }); + } + + private ChunkStore loadChunk(int cx, int cz, World world) { + try { + return readChunkStore(world, cx, cz); + } + catch (Exception ignored) {} + + return null; + } + + private void unloadChunk(int cx, int cz, 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 saveChunk(int cx, int cz, World world) { + if (world == null) + return; + + CoordinateKey chunkKey = toChunkKey(world.getUID(), cx, cz); + + ChunkStore out = chunkMap.get(chunkKey); + + if (out == null) + return; + + if (!out.isDirty()) + return; + + writeChunkStore(world, out); + } + + @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; + + UUID wID = world.getUID(); + + // Save all teh chunks + for (ChunkStore chunkStore : chunkMap.values()) { + if (!chunkStore.isDirty()) + continue; + if (!wID.equals(chunkStore.getWorldId())) + continue; + try { + writeChunkStore(world, chunkStore); + } + catch (Exception ignore) { } + } + } + + @Override + public synchronized void unloadWorld(World world) { + if (world == null) + return; + + 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); + } + } + + @Override + public synchronized void saveAll() { + for (World world : mcMMO.p.getServer().getWorlds()) { + saveWorld(world); + } + } + + @Override + public synchronized boolean isTrue(int x, int y, int z, World world) { + if (world == null) + return false; + + 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(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) { + set(x, y, z, world, true); + } + + @Override + public synchronized void setTrue(Block block) { + if (block == null) + return; + + setTrue(block.getX(), block.getY(), block.getZ(), block.getWorld()); + } + + @Override + public synchronized 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) { + set(x, y, z, world, false); + } + + @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()); + } + + public synchronized void set(int x, int y, int z, World world, boolean value){ + if (world == null) + return; + + 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 CoordinateKey blockCoordinateToChunkKey(UUID worldUid, int x, int y, int z) { + return toChunkKey(worldUid, x >> 4, z >> 4); + } + + private CoordinateKey toChunkKey(UUID worldUid, int cx, int cz){ + return new CoordinateKey(worldUid, cx, cz); + } + + private CoordinateKey toRegionKey(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 UUID worldID; + public final int x; + public final int z; + + private CoordinateKey(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); + } + } + + @Override + public synchronized void cleanUp() {} +} 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 c2fc23faf..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(new BufferedInputStream(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..bef730ff4 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/util/blockmeta/McMMOSimpleRegionFile.java @@ -0,0 +1,257 @@ +/* + * 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 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 File parent; + // File access + private final RandomAccessFile file; + + // Region index + private final int rx; + private final int rz; + + public McMMOSimpleRegionFile(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 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 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/chunkmeta/NullChunkManager.java b/src/main/java/com/gmail/nossr50/util/blockmeta/NullChunkManager.java old mode 100755 new mode 100644 similarity index 54% rename from src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/NullChunkManager.java rename to src/main/java/com/gmail/nossr50/util/blockmeta/NullChunkManager.java index 3081b0938..b777fa349 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/NullChunkManager.java +++ b/src/main/java/com/gmail/nossr50/util/blockmeta/NullChunkManager.java @@ -1,51 +1,17 @@ -package com.gmail.nossr50.util.blockmeta.chunkmeta; +package com.gmail.nossr50.util.blockmeta; 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) {} @@ -55,15 +21,9 @@ public class NullChunkManager implements ChunkManager { @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; 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 304ef8780..000000000 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/NullChunkletManager.java +++ /dev/null @@ -1,85 +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) { - } - - @Override - public void unloadChunklet(int cx, int cy, int cz, World world) { - } - - @Override - public void loadChunk(int cx, int cz, World world) { - } - - @Override - public void unloadChunk(int cx, int cz, World world) { - } - - @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 void setTrue(int x, int y, int z, World world) { - } - - @Override - public void setTrue(Block block) { - } - - @Override - public void setFalse(int x, int y, int z, World world) { - } - - @Override - public void setFalse(Block block) { - } - - @Override - public void cleanUp() { - } -} 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/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 05153816f..000000000 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/HashChunkManager.java +++ /dev/null @@ -1,447 +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 final HashMap> regionFiles = new HashMap<>(); - public HashMap store = new HashMap<>(); - public ArrayList converters = new ArrayList<>(); - private final 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; - } - try (ObjectInputStream objectStream = new ObjectInputStream(in)) { - 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 | ClassNotFoundException e) { - e.printStackTrace(); - // Assume the format changed - return null; - //throw new RuntimeException("Unable to process chunk meta data for " + x + ", " + z, e); - } - } - - @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.computeIfAbsent(key, k -> new HashMap<>()); - - 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 2193417d8..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 final 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/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 9dcb20c2a..000000000 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/conversion/BlockStoreConversionMain.java +++ /dev/null @@ -1,90 +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(); - } - - @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; - } -} 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 a64eec843..000000000 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/conversion/BlockStoreConversionXDirectory.java +++ /dev/null @@ -1,80 +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(); - } - - @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 4a32a679c..000000000 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/conversion/BlockStoreConversionZDirectory.java +++ /dev/null @@ -1,191 +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(); - } - - @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/test/java/ChunkStoreTest.java b/src/test/java/ChunkStoreTest.java new file mode 100644 index 000000000..9d4e4995d --- /dev/null +++ b/src/test/java/ChunkStoreTest.java @@ -0,0 +1,308 @@ +import com.gmail.nossr50.util.blockmeta.*; +import com.google.common.io.Files; +import org.bukkit.Bukkit; +import org.bukkit.World; +import org.junit.*; +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 java.io.*; +import java.util.UUID; + +import static org.mockito.Mockito.mock; + +/** + * Could be alot better. But some tests are better than none! Tests the major things, still kinda unit-testy. Verifies that the serialization isn't completely broken. + */ +@RunWith(PowerMockRunner.class) +@PrepareForTest(Bukkit.class) +public class ChunkStoreTest { + private static File tempDir; + @BeforeClass + public static void setUpClass() { + tempDir = Files.createTempDir(); + } + + @AfterClass + public static void tearDownClass() { + recursiveDelete(tempDir); + } + + private World mockWorld; + @Before + public void setUpMock(){ + UUID worldUUID = UUID.randomUUID(); + mockWorld = mock(World.class); + Mockito.when(mockWorld.getUID()).thenReturn(worldUUID); + Mockito.when(mockWorld.getMaxHeight()).thenReturn(256); + Mockito.when(mockWorld.getWorldFolder()).thenReturn(tempDir); + PowerMockito.mockStatic(Bukkit.class); + Mockito.when(Bukkit.getWorld(worldUUID)).thenReturn(mockWorld); + } + + @Test + public void testSetValue() { + BitSetChunkStore original = new BitSetChunkStore(mockWorld, 0, 0); + original.setTrue(0, 0, 0); + Assert.assertTrue(original.isTrue(0, 0, 0)); + original.setFalse(0, 0, 0); + Assert.assertFalse(original.isTrue(0, 0, 0)); + } + + @Test + public void testIsEmpty() { + BitSetChunkStore original = new BitSetChunkStore(mockWorld, 0, 0); + Assert.assertTrue(original.isEmpty()); + original.setTrue(0, 0, 0); + original.setFalse(0, 0, 0); + Assert.assertTrue(original.isEmpty()); + } + + @Test + public 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 + public 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 + public 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))); + assertEqual(original, deserialized); + } + + @Test + public 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())) + { + Assert.assertNotNull(is); + ChunkStore deserialized = BitSetChunkStore.Serialization.readChunkStore(is); + assertEqual(original, deserialized); + } + region.close(); + file.delete(); + } + + @Test + public void testSimpleRegionRejectsOutOfBounds() { + File file = new File(tempDir, "SimpleRegionRoundTrip.region"); + McMMOSimpleRegionFile region = new McMMOSimpleRegionFile(file, 0, 0); + assertThrows(() -> region.getOutputStream(-1, 0), IndexOutOfBoundsException.class); + assertThrows(() -> region.getOutputStream(0, -1), IndexOutOfBoundsException.class); + assertThrows(() -> region.getOutputStream(32, 0), IndexOutOfBoundsException.class); + assertThrows(() -> region.getOutputStream(0, 32), IndexOutOfBoundsException.class); + region.close(); + } + + @Test + public void testChunkStoreRejectsOutOfBounds() { + ChunkStore chunkStore = new BitSetChunkStore(mockWorld, 0, 0); + assertThrows(() -> chunkStore.setTrue(-1, 0, 0), IndexOutOfBoundsException.class); + assertThrows(() -> chunkStore.setTrue(0, -1, 0), IndexOutOfBoundsException.class); + assertThrows(() -> chunkStore.setTrue(0, 0, -1), IndexOutOfBoundsException.class); + assertThrows(() -> chunkStore.setTrue(16, 0, 0), IndexOutOfBoundsException.class); + assertThrows(() -> chunkStore.setTrue(0, mockWorld.getMaxHeight(), 0), IndexOutOfBoundsException.class); + assertThrows(() -> chunkStore.setTrue(0, 0, 16), IndexOutOfBoundsException.class); + } + + @Test + public void testRegressionChunkMirrorBug() { + ChunkManager chunkManager = new HashChunkManager(); + chunkManager.setTrue(15,0,15, mockWorld); + chunkManager.setFalse(-15, 0, -15, mockWorld); + Assert.assertTrue(chunkManager.isTrue(15, 0, 15, mockWorld)); + } + + private interface Delegate { + void run(); + } + + private void assertThrows(Delegate delegate, Class clazz) { + try { + delegate.run(); + Assert.fail(); // We didn't throw + } + catch (Throwable t) { + Assert.assertTrue(t.getClass().equals(clazz)); + } + } + + private void assertEqual(ChunkStore expected, ChunkStore actual) + { + Assert.assertEquals(expected.getChunkX(), actual.getChunkX()); + Assert.assertEquals(expected.getChunkZ(), actual.getChunkZ()); + Assert.assertEquals(expected.getWorldId(), actual.getWorldId()); + for (int y = 0; y < 256; y++) + for (int x = 0; x < 16; x++) + for (int z = 0; z < 16; z++) + Assert.assertTrue(expected.isTrue(x, y, z) == actual.isTrue(x, y, z)); + } + + private static void recursiveDelete(File directoryToBeDeleted) { + if (directoryToBeDeleted.isDirectory()) { + for (File file : directoryToBeDeleted.listFiles()) { + recursiveDelete(file); + } + } + directoryToBeDeleted.delete(); + } + + private static byte[] serializeChunkstore(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 int cx; + private int cz; + private UUID worldUid; + + public LegacyChunkStore(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 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(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 { + throw new UnsupportedOperationException(); + } + } + + private static class UnitTestObjectOutputStream extends ObjectOutputStream { + public UnitTestObjectOutputStream(OutputStream outputStream) throws IOException { + super(outputStream); + } + + @Override + public void writeUTF(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); + } + } +} From d0d05a33f8561cacbedbfc31099cfd22e317f7d2 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Wed, 30 Dec 2020 15:30:46 -0800 Subject: [PATCH 282/662] update changelog --- Changelog.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Changelog.txt b/Changelog.txt index 64cce7473..db1394a97 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -4,6 +4,8 @@ Version 2.1.165 NOTES: 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. + This update shouldn't break anything as the API is the same 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) From 006a7bf2772bb6ed16a471b1e0f9117119d5dc6d Mon Sep 17 00:00:00 2001 From: nossr50 Date: Wed, 30 Dec 2020 15:41:14 -0800 Subject: [PATCH 283/662] Add back missing cooldown locale message Fixes #4361 --- Changelog.txt | 1 + src/main/resources/locale/locale_en_US.properties | 1 + src/test/java/ChunkStoreTest.java | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index db1394a97..278a9f4d3 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,6 +1,7 @@ Version 2.1.165 The mcMMO system which tracks player placed blocks has had some major rewrites (thanks t00thpick1) mcMMO will now be compatible with changes to world height (1.17 compatibility) + Added missing cooldown locale message 'Commands.Database.Cooldown' NOTES: 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 diff --git a/src/main/resources/locale/locale_en_US.properties b/src/main/resources/locale/locale_en_US.properties index e60f89a86..939132271 100644 --- a/src/main/resources/locale/locale_en_US.properties +++ b/src/main/resources/locale/locale_en_US.properties @@ -589,6 +589,7 @@ 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= &cPlayer does not exist in the database! diff --git a/src/test/java/ChunkStoreTest.java b/src/test/java/ChunkStoreTest.java index 9d4e4995d..f45b0e0c9 100644 --- a/src/test/java/ChunkStoreTest.java +++ b/src/test/java/ChunkStoreTest.java @@ -15,7 +15,7 @@ import java.util.UUID; import static org.mockito.Mockito.mock; /** - * Could be alot better. But some tests are better than none! Tests the major things, still kinda unit-testy. Verifies that the serialization isn't completely broken. + * 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. */ @RunWith(PowerMockRunner.class) @PrepareForTest(Bukkit.class) From aed4cb87be9944c3a7ade8d3e81f19b33fe05401 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 31 Dec 2020 13:21:55 -0800 Subject: [PATCH 284/662] Fix enchanted books not being created with the proper data --- Changelog.txt | 2 ++ .../com/gmail/nossr50/skills/fishing/FishingManager.java | 9 ++++++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 278a9f4d3..d45f0f9b3 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,9 +1,11 @@ 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) mcMMO will now be compatible with changes to world height (1.17 compatibility) Added missing cooldown locale message 'Commands.Database.Cooldown' 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. This update shouldn't break anything as the API is the same 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 3e0ec850e..90e909525 100644 --- a/src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java @@ -37,6 +37,7 @@ import org.bukkit.entity.*; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.PlayerInventory; +import org.bukkit.inventory.meta.EnchantmentStorageMeta; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.SkullMeta; import org.bukkit.util.BoundingBox; @@ -466,11 +467,13 @@ public class FishingManager extends SkillManager { EnchantmentWrapper enchantmentWrapper = getRandomEnchantment(fishingTreasureBook.getLegalEnchantments()); ItemMeta itemMeta = itemStack.getItemMeta(); - if(itemMeta == null) + if(itemMeta == null) { return itemStack; + } - itemMeta.addEnchant(enchantmentWrapper.getEnchantment(), enchantmentWrapper.getEnchantmentLevel(), ExperienceConfig.getInstance().allowUnsafeEnchantments()); - itemStack.setItemMeta(itemMeta); + EnchantmentStorageMeta enchantmentStorageMeta = (EnchantmentStorageMeta) itemMeta; + enchantmentStorageMeta.addStoredEnchant(enchantmentWrapper.getEnchantment(), enchantmentWrapper.getEnchantmentLevel(), ExperienceConfig.getInstance().allowUnsafeEnchantments()); + itemStack.setItemMeta(enchantmentStorageMeta); return itemStack; } From 2664ae4bd609261fcb448c871ecbaca3d0dc8f2e Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 31 Dec 2020 15:25:21 -0800 Subject: [PATCH 285/662] Optimize ChunkUnloadEvent & Partial rewrite to COTW entity tracking + some tweaks to COTW entity removal --- Changelog.txt | 4 + .../nossr50/listeners/ChunkListener.java | 20 +- .../nossr50/listeners/EntityListener.java | 10 +- src/main/java/com/gmail/nossr50/mcMMO.java | 7 + .../skills/fishing/FishingManager.java | 27 +-- .../nossr50/skills/taming/TamingManager.java | 86 +------ .../skills/taming/TrackedTamingEntity.java | 43 +--- .../com/gmail/nossr50/util/ItemUtils.java | 27 +++ .../nossr50/util/TransientEntityTracker.java | 225 ++++++++++++++++++ .../resources/locale/locale_en_US.properties | 1 + 10 files changed, 294 insertions(+), 156 deletions(-) create mode 100644 src/main/java/com/gmail/nossr50/util/TransientEntityTracker.java diff --git a/Changelog.txt b/Changelog.txt index d45f0f9b3..1be88f3c3 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,8 +1,12 @@ 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) Added missing cooldown locale message 'Commands.Database.Cooldown' + Added new locale message 'Taming.Summon.COTW.Removed' 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. diff --git a/src/main/java/com/gmail/nossr50/listeners/ChunkListener.java b/src/main/java/com/gmail/nossr50/listeners/ChunkListener.java index 406a02436..761516deb 100644 --- a/src/main/java/com/gmail/nossr50/listeners/ChunkListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/ChunkListener.java @@ -1,30 +1,20 @@ package com.gmail.nossr50.listeners; import com.gmail.nossr50.mcMMO; -import com.gmail.nossr50.util.compat.layers.persistentdata.MobMetaFlagType; -import org.bukkit.entity.Entity; 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) { - for(Entity entity : event.getChunk().getEntities()) { - if(entity instanceof LivingEntity) { - LivingEntity livingEntity = (LivingEntity) entity; - if(mcMMO.getCompatibilityManager().getPersistentDataLayer().hasMobFlag(MobMetaFlagType.COTW_SUMMONED_MOB, livingEntity)) { - - //Remove from existence - if(livingEntity.isValid()) { - mcMMO.getCompatibilityManager().getPersistentDataLayer().removeMobFlags(livingEntity); - livingEntity.setHealth(0); - livingEntity.remove(); - } - } - } + 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/EntityListener.java b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java index 73f9b064b..24dd48031 100644 --- a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java @@ -644,11 +644,13 @@ 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(); + mcMMO.getTransientEntityTracker().removeSummon(entity, null, false); + + /* WORLD BLACKLIST CHECK */ + if(WorldBlacklist.isWorldBlacklisted(event.getEntity().getWorld())) { + return; + } if (ExperienceConfig.getInstance().isNPCInteractionPrevented() && Misc.isNPCEntityExcludingVillagers(entity)) { return; diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index 529f70fb5..06347a952 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -87,6 +87,7 @@ public class mcMMO extends JavaPlugin { private static TransientMetadataTools transientMetadataTools; private static ChatManager chatManager; private static CommandManager commandManager; //ACF + private static TransientEntityTracker transientEntityTracker; /* Adventure */ private static BukkitAudiences audiences; @@ -289,6 +290,8 @@ public class mcMMO extends JavaPlugin { chatManager = new ChatManager(this); commandManager = new CommandManager(this); + + transientEntityTracker = new TransientEntityTracker(); } public static PlayerLevelUtils getPlayerLevelUtils() { @@ -720,4 +723,8 @@ public class mcMMO extends JavaPlugin { public CommandManager getCommandManager() { return commandManager; } + + public static TransientEntityTracker getTransientEntityTracker() { + return transientEntityTracker; + } } 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 90e909525..8360825c9 100644 --- a/src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java @@ -37,8 +37,6 @@ import org.bukkit.entity.*; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.PlayerInventory; -import org.bukkit.inventory.meta.EnchantmentStorageMeta; -import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.SkullMeta; import org.bukkit.util.BoundingBox; import org.bukkit.util.Vector; @@ -397,7 +395,7 @@ public class FishingManager extends SkillManager { if (treasure != null) { if(treasure instanceof FishingTreasureBook) { - treasureDrop = createEnchantBook((FishingTreasureBook) treasure); + treasureDrop = ItemUtils.createEnchantBook((FishingTreasureBook) treasure); } else { treasureDrop = treasure.getDrop().clone(); // Not cloning is bad, m'kay? @@ -461,29 +459,6 @@ public class FishingManager extends SkillManager { applyXpGain(fishXp + treasureXp, XPGainReason.PVE); } - - private @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; - } - - private @NotNull EnchantmentWrapper getRandomEnchantment(@NotNull List enchantmentWrappers) { - Collections.shuffle(enchantmentWrappers, Misc.getRandom()); - - int randomIndex = Misc.getRandom().nextInt(enchantmentWrappers.size()); - return enchantmentWrappers.get(randomIndex); - } - /** * Handle the vanilla XP boost for Fishing * 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 3fce43f26..d3160f50c 100644 --- a/src/main/java/com/gmail/nossr50/skills/taming/TamingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/taming/TamingManager.java @@ -33,9 +33,7 @@ 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 @@ -43,8 +41,6 @@ public class TamingManager extends SkillManager { private static HashMap cotwSummonDataProperties; private long lastSummonTimeStamp; - private HashMap> playerSummonedEntities; - public TamingManager(McMMOPlayer mcMMOPlayer) { super(mcMMOPlayer, PrimarySkillType.TAMING); init(); @@ -56,20 +52,12 @@ public class TamingManager extends SkillManager { lastSummonTimeStamp = 0L; //Init per-player tracking of summoned entities - initPerPlayerSummonTracking(); + mcMMO.getTransientEntityTracker().initPlayer(mmoPlayer.getPlayer().getUniqueId()); //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 @@ -500,62 +488,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) { - 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())); } /** @@ -564,20 +506,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()) { - mcMMO.getCompatibilityManager().getPersistentDataLayer().removeMobFlags(livingEntity); - 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 aabcd44da..9116c4fdf 100644 --- a/src/main/java/com/gmail/nossr50/skills/taming/TrackedTamingEntity.java +++ b/src/main/java/com/gmail/nossr50/skills/taming/TrackedTamingEntity.java @@ -4,61 +4,40 @@ 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 final LivingEntity livingEntity; - private final CallOfTheWildType callOfTheWildType; - private final 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()); 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/util/ItemUtils.java b/src/main/java/com/gmail/nossr50/util/ItemUtils.java index 4e70625e6..62c8d2165 100644 --- a/src/main/java/com/gmail/nossr50/util/ItemUtils.java +++ b/src/main/java/com/gmail/nossr50/util/ItemUtils.java @@ -2,7 +2,10 @@ package com.gmail.nossr50.util; import com.gmail.nossr50.config.AdvancedConfig; 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 org.bukkit.ChatColor; @@ -12,9 +15,11 @@ 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 java.util.Collections; import java.util.List; public final class ItemUtils { @@ -538,4 +543,26 @@ public final class ItemUtils { 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/TransientEntityTracker.java b/src/main/java/com/gmail/nossr50/util/TransientEntityTracker.java new file mode 100644 index 000000000..a5495864e --- /dev/null +++ b/src/main/java/com/gmail/nossr50/util/TransientEntityTracker.java @@ -0,0 +1,225 @@ +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 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 { + private final @NotNull HashMap>> perPlayerTransientEntityMap; + private final @NotNull HashSet chunkLookupCache; + + public TransientEntityTracker() { + perPlayerTransientEntityMap = new HashMap<>(); + chunkLookupCache = new HashSet<>(); + } + + public void initPlayer(@NotNull UUID playerUUID) { + if (!isPlayerRegistered(playerUUID)) { + registerPlayer(playerUUID); + } + } + + public void cleanupPlayer(@NotNull UUID playerUUID) { + cleanupAllSummons(null, playerUUID); + } + + public void cleanupPlayer(@NotNull Player player) { + //First remove all entities related to this player + cleanupAllSummons(player, player.getUniqueId()); + } + + private boolean isPlayerRegistered(@NotNull UUID playerUUID) { + return perPlayerTransientEntityMap.get(playerUUID) != null; + } + + private void registerPlayer(@NotNull UUID playerUUID) { + for(CallOfTheWildType callOfTheWildType : CallOfTheWildType.values()) { + perPlayerTransientEntityMap.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 @Nullable HashMap> getPlayerTrackedEntityMap(@NotNull UUID playerUUID) { + return perPlayerTransientEntityMap.get(playerUUID); + } + + public void registerEntity(@NotNull UUID playerUUID, @NotNull TrackedTamingEntity trackedTamingEntity) { + if(!isPlayerRegistered(playerUUID)) { + mcMMO.p.getLogger().severe("Attempting to register entity to a player which hasn't been initialized!"); + initPlayer(playerUUID); + } + + //Add to map entry + getTrackedEntities(playerUUID, trackedTamingEntity.getCallOfTheWildType()).add(trackedTamingEntity); + + //Add to cache for chunk lookups + addToChunkLookupCache(trackedTamingEntity); + } + + /** + * 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 @Nullable HashSet getTrackedEntities(@NotNull UUID playerUUID, @NotNull CallOfTheWildType callOfTheWildType) { + HashMap> playerEntityMap = getPlayerTrackedEntityMap(playerUUID); + + if(playerEntityMap == null) + return null; + + return playerEntityMap.get(callOfTheWildType); + } + + private void addToChunkLookupCache(@NotNull TrackedTamingEntity trackedTamingEntity) { + chunkLookupCache.add(trackedTamingEntity.getLivingEntity()); + } + + public void unregisterEntity(@NotNull LivingEntity livingEntity) { + chunkLookupCacheCleanup(livingEntity); + perPlayerTransientMapCleanup(livingEntity); + } + + private void chunkLookupCacheCleanup(@NotNull LivingEntity livingEntity) { + chunkLookupCache.remove(livingEntity); + } + + private void perPlayerTransientMapCleanup(@NotNull LivingEntity livingEntity) { + for(UUID uuid : perPlayerTransientEntityMap.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; + } + } + } + } + } + + public @NotNull List getAllTransientEntitiesInChunk(@NotNull Chunk chunk) { + ArrayList matchingEntities = new ArrayList<>(); + + for(LivingEntity livingEntity : chunkLookupCache) { + if(livingEntity.getLocation().getChunk().equals(chunk)) { + matchingEntities.add(livingEntity); + } + } + + return matchingEntities; + } + + /* + * Gross code below + */ + + /** + * 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 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 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.getCompatibilityManager().getPersistentDataLayer().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; + + for(TrackedTamingEntity trackedTamingEntity : trackedEntities) { + //Remove from existence + removeSummon(trackedTamingEntity.getLivingEntity(), player, false); + } + } + } +} diff --git a/src/main/resources/locale/locale_en_US.properties b/src/main/resources/locale/locale_en_US.properties index 939132271..1020210c1 100644 --- a/src/main/resources/locale/locale_en_US.properties +++ b/src/main/resources/locale/locale_en_US.properties @@ -487,6 +487,7 @@ Taming.Summon.COTW.Success.WithoutLifespan=&a(Call Of The Wild) &7You have summo 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} From 8ee405fbfde34c12ade27518c61b4c8a1c3948fc Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 31 Dec 2020 15:49:32 -0800 Subject: [PATCH 286/662] Ignore "fake player" npcs in EntityPickupItemEvent --- Changelog.txt | 1 + .../com/gmail/nossr50/listeners/PlayerListener.java | 10 ++++++---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 1be88f3c3..9d7f4f4a6 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -7,6 +7,7 @@ Version 2.1.165 mcMMO will now be compatible with changes to world height (1.17 compatibility) Added missing cooldown locale message 'Commands.Database.Cooldown' Added new locale message 'Taming.Summon.COTW.Removed' + mcMMO will ignore PlayerPickupItem events from "Fake-Player" NPCs if it recognizes them as such, this will prevent some issues 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. diff --git a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java index 1339a8850..bf47ef5a0 100644 --- a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java @@ -447,6 +447,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(); @@ -463,13 +467,11 @@ 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(); From 3f6de1c4ba5782a23bede55a5af8c95ab858057c Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 31 Dec 2020 15:53:01 -0800 Subject: [PATCH 287/662] Fix giving double treasures if the setting to give extra fish is on Fixes #4363 --- Changelog.txt | 2 +- .../java/com/gmail/nossr50/skills/fishing/FishingManager.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 9d7f4f4a6..9f3daebcf 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -7,7 +7,7 @@ Version 2.1.165 mcMMO will now be compatible with changes to world height (1.17 compatibility) Added missing cooldown locale message 'Commands.Database.Cooldown' Added new locale message 'Taming.Summon.COTW.Removed' - mcMMO will ignore PlayerPickupItem events from "Fake-Player" NPCs if it recognizes them as such, this will prevent some issues + mcMMO will ignore EntityPickupItemEvents from "Fake-Player" NPCs if it recognizes them as such, this will prevent some compatibility issues with some plugins 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. 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 8360825c9..ab597a8da 100644 --- a/src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java @@ -449,11 +449,11 @@ public class FishingManager extends SkillManager { } if(fishingSucceeds) { - fishingCatch.setItemStack(treasureDrop); - if (Config.getInstance().getFishingExtraFish()) { Misc.spawnItem(player.getEyeLocation(), fishingCatch.getItemStack(), ItemSpawnReason.FISHING_EXTRA_FISH); } + + fishingCatch.setItemStack(treasureDrop); } applyXpGain(fishXp + treasureXp, XPGainReason.PVE); From c05c8e1b1d40edf5db8c73b6e8f99acc9fdc088d Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 31 Dec 2020 16:08:23 -0800 Subject: [PATCH 288/662] Fix init player in TransientyEntityTracker --- .../com/gmail/nossr50/skills/taming/TamingManager.java | 2 +- .../java/com/gmail/nossr50/util/MaterialMapStore.java | 9 +++++++++ .../com/gmail/nossr50/util/TransientEntityTracker.java | 2 ++ 3 files changed, 12 insertions(+), 1 deletion(-) 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 d3160f50c..0ec720ec1 100644 --- a/src/main/java/com/gmail/nossr50/skills/taming/TamingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/taming/TamingManager.java @@ -41,7 +41,7 @@ public class TamingManager extends SkillManager { private static HashMap cotwSummonDataProperties; private long lastSummonTimeStamp; - public TamingManager(McMMOPlayer mcMMOPlayer) { + public TamingManager(@NotNull McMMOPlayer mcMMOPlayer) { super(mcMMOPlayer, PrimarySkillType.TAMING); init(); } diff --git a/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java b/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java index 6be54c63c..0f0bcc25c 100644 --- a/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java +++ b/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java @@ -54,6 +54,8 @@ public class MaterialMapStore { private final @NotNull HashSet enchantables; private final @NotNull HashSet ores; + private final @NotNull HashSet intendedToolPickAxe; + private final @NotNull HashSet intendedToolShovel; private final @NotNull HashMap tierValue; @@ -99,6 +101,8 @@ public class MaterialMapStore { enchantables = new HashSet<>(); ores = new HashSet<>(); + intendedToolPickAxe = new HashSet<>(); + intendedToolShovel = new HashSet<>(); tierValue = new HashMap<>(); @@ -206,6 +210,11 @@ public class MaterialMapStore { ores.add("gilded_blackstone"); } + private void fillIntendedTools() { + intendedToolPickAxe.addAll(ores); + + } + private void fillArmors() { fillLeatherArmorWhiteList(); fillIronArmorWhiteList(); diff --git a/src/main/java/com/gmail/nossr50/util/TransientEntityTracker.java b/src/main/java/com/gmail/nossr50/util/TransientEntityTracker.java index a5495864e..486842f7f 100644 --- a/src/main/java/com/gmail/nossr50/util/TransientEntityTracker.java +++ b/src/main/java/com/gmail/nossr50/util/TransientEntityTracker.java @@ -46,6 +46,8 @@ public class TransientEntityTracker { } private void registerPlayer(@NotNull UUID playerUUID) { + perPlayerTransientEntityMap.put(playerUUID, new HashMap>()); + for(CallOfTheWildType callOfTheWildType : CallOfTheWildType.values()) { perPlayerTransientEntityMap.get(playerUUID).put(callOfTheWildType, new HashSet<>()); } From c408c7d057b3162f05cdefe60973286f34c4b6b0 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 31 Dec 2020 16:26:37 -0800 Subject: [PATCH 289/662] avoid concurrent exceptions on TransientEntityTracker --- .../com/gmail/nossr50/util/TransientEntityTracker.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/util/TransientEntityTracker.java b/src/main/java/com/gmail/nossr50/util/TransientEntityTracker.java index 486842f7f..4b22abaea 100644 --- a/src/main/java/com/gmail/nossr50/util/TransientEntityTracker.java +++ b/src/main/java/com/gmail/nossr50/util/TransientEntityTracker.java @@ -6,6 +6,7 @@ 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; @@ -215,13 +216,17 @@ public class TransientEntityTracker { for(CallOfTheWildType callOfTheWildType : CallOfTheWildType.values()) { HashSet trackedEntities = getTrackedEntities(playerUUID, callOfTheWildType); - if(trackedEntities == null) + if(trackedEntities == null) { continue; + } - for(TrackedTamingEntity trackedTamingEntity : trackedEntities) { + ImmutableSet immutableSet = ImmutableSet.copyOf(trackedEntities); + + for(TrackedTamingEntity trackedTamingEntity : immutableSet) { //Remove from existence removeSummon(trackedTamingEntity.getLivingEntity(), player, false); } + } } } From 56b376eb540347284cd9cbf1721c1147cebe3945 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 31 Dec 2020 16:41:08 -0800 Subject: [PATCH 290/662] SuperBreaker will always activate if the fastest tool for the block is a PickAxe Fixes #4362 --- Changelog.txt | 1 + .../com/gmail/nossr50/util/BlockUtils.java | 5 +- .../gmail/nossr50/util/MaterialMapStore.java | 187 ++++++++++++++++++ 3 files changed, 192 insertions(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index 9f3daebcf..44960faf2 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -8,6 +8,7 @@ Version 2.1.165 Added missing cooldown locale message 'Commands.Database.Cooldown' Added new locale message 'Taming.Summon.COTW.Removed' 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) 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. diff --git a/src/main/java/com/gmail/nossr50/util/BlockUtils.java b/src/main/java/com/gmail/nossr50/util/BlockUtils.java index 67da9f4af..1c68e9747 100644 --- a/src/main/java/com/gmail/nossr50/util/BlockUtils.java +++ b/src/main/java/com/gmail/nossr50/util/BlockUtils.java @@ -141,10 +141,13 @@ public final class BlockUtils { * otherwise */ 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); } /** diff --git a/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java b/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java index 0f0bcc25c..61b772eec 100644 --- a/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java +++ b/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java @@ -213,6 +213,185 @@ public class MaterialMapStore { private void fillIntendedTools() { intendedToolPickAxe.addAll(ores); + 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("amethyst_bud"); + intendedToolPickAxe.add("amethyst_cluster"); + intendedToolPickAxe.add("block_of_amethyst"); + intendedToolPickAxe.add("budding_amethyst"); + 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"); + } private void fillArmors() { @@ -1072,6 +1251,14 @@ public class MaterialMapStore { toolBlackList.add("respawn_anchor"); } + public boolean isIntendedToolPickaxe(Material material) { + return intendedToolPickAxe.contains(material.getKey().getKey()); + } + + public boolean isIntendedToolPickaxe(String string) { + return intendedToolPickAxe.contains(string); + } + public @NotNull HashSet getNetheriteArmor() { return netheriteArmor; } From 9ba8af9f6e2a35c4eb99d1231ac966e2c8241ad8 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 31 Dec 2020 16:42:37 -0800 Subject: [PATCH 291/662] Forgot to register the intended tool set --- src/main/java/com/gmail/nossr50/util/MaterialMapStore.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java b/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java index 61b772eec..8a0c378ed 100644 --- a/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java +++ b/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java @@ -109,8 +109,8 @@ public class MaterialMapStore { fillVanillaMaterialRegisters(); } - private void fillVanillaMaterialRegisters() - { + private void fillVanillaMaterialRegisters() { + //The order matters fillAbilityBlackList(); fillToolBlackList(); fillMossyWhiteList(); @@ -125,6 +125,7 @@ public class MaterialMapStore { fillTools(); fillEnchantables(); fillOres(); + fillIntendedTools(); fillTierMap(); } From e4af53a535e87ed7ebade872fcb3d80506dc06a2 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 31 Dec 2020 16:46:49 -0800 Subject: [PATCH 292/662] Use boolean over Boolean --- src/main/java/com/gmail/nossr50/util/BlockUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gmail/nossr50/util/BlockUtils.java b/src/main/java/com/gmail/nossr50/util/BlockUtils.java index 1c68e9747..8a443c119 100644 --- a/src/main/java/com/gmail/nossr50/util/BlockUtils.java +++ b/src/main/java/com/gmail/nossr50/util/BlockUtils.java @@ -140,7 +140,7 @@ 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; From 42d3dc3925af3069069ad728c55f6fa457315470 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 31 Dec 2020 16:58:46 -0800 Subject: [PATCH 293/662] Master Angler now mentions it works better with a boat in its hover tip --- src/main/resources/locale/locale_cs_CZ.properties | 1 - src/main/resources/locale/locale_de.properties | 1 - src/main/resources/locale/locale_en_US.properties | 2 +- src/main/resources/locale/locale_es.properties | 1 - src/main/resources/locale/locale_fr.properties | 1 - src/main/resources/locale/locale_hu_HU.properties | 1 - src/main/resources/locale/locale_it.properties | 1 - src/main/resources/locale/locale_ja_JP.properties | 1 - src/main/resources/locale/locale_ko.properties | 1 - src/main/resources/locale/locale_lt_LT.properties | 1 - src/main/resources/locale/locale_nl.properties | 1 - src/main/resources/locale/locale_pl.properties | 1 - src/main/resources/locale/locale_ru.properties | 1 - src/main/resources/locale/locale_th_TH.properties | 1 - src/main/resources/locale/locale_zh_CN.properties | 1 - src/main/resources/locale/locale_zh_TW.properties | 1 - 16 files changed, 1 insertion(+), 16 deletions(-) diff --git a/src/main/resources/locale/locale_cs_CZ.properties b/src/main/resources/locale/locale_cs_CZ.properties index b6be2e519..d56a7d4b7 100644 --- a/src/main/resources/locale/locale_cs_CZ.properties +++ b/src/main/resources/locale/locale_cs_CZ.properties @@ -90,7 +90,6 @@ Fishing.SubSkill.Shake.Description=Vyklepni p\u0159edm\u011bty z p\u0159\u00ed\u 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=&9 De\u0161\u0165ov\u00fd bonus diff --git a/src/main/resources/locale/locale_de.properties b/src/main/resources/locale/locale_de.properties index d6525a129..108e9cb63 100644 --- a/src/main/resources/locale/locale_de.properties +++ b/src/main/resources/locale/locale_de.properties @@ -372,7 +372,6 @@ 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.Shake.Description = Rei\u00DFe Gegenst\u00E4nde weg von Lebewesen und Spielern mit deiner Angel Fishing.SubSkill.Shake.Name = Rei\u00DFen diff --git a/src/main/resources/locale/locale_en_US.properties b/src/main/resources/locale/locale_en_US.properties index 1020210c1..9e98a9420 100644 --- a/src/main/resources/locale/locale_en_US.properties +++ b/src/main/resources/locale/locale_en_US.properties @@ -252,7 +252,7 @@ Fishing.SubSkill.FishermansDiet.Name=Fisherman's Diet Fishing.SubSkill.FishermansDiet.Description=Improves hunger restored from fished foods Fishing.SubSkill.FishermansDiet.Stat=Fisherman's Diet:&a Rank {0} Fishing.SubSkill.MasterAngler.Name=Master Angler -Fishing.SubSkill.MasterAngler.Description=Fish are caught more frequently +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 diff --git a/src/main/resources/locale/locale_es.properties b/src/main/resources/locale/locale_es.properties index 6aa857cc3..cdce790bd 100644 --- a/src/main/resources/locale/locale_es.properties +++ b/src/main/resources/locale/locale_es.properties @@ -91,7 +91,6 @@ Fishing.SubSkill.Shake.Description=Sacudir los items fuera de los monstruos con 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=&9 Lluvia de Bonus diff --git a/src/main/resources/locale/locale_fr.properties b/src/main/resources/locale/locale_fr.properties index c773ad65c..c69bd5eb1 100644 --- a/src/main/resources/locale/locale_fr.properties +++ b/src/main/resources/locale/locale_fr.properties @@ -251,7 +251,6 @@ Fishing.SubSkill.FishermansDiet.Name=R\u00e9gime de fermier Fishing.SubSkill.FishermansDiet.Description=Am\u00e9liore la nutrition des produits de la ferme Fishing.SubSkill.FishermansDiet.Stat=R\u00e9gime de fermier:&a Grade {0} 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.SubSkill.IceFishing.Stat=P\u00eache sur Glace diff --git a/src/main/resources/locale/locale_hu_HU.properties b/src/main/resources/locale/locale_hu_HU.properties index 71f11514c..60776b3f7 100644 --- a/src/main/resources/locale/locale_hu_HU.properties +++ b/src/main/resources/locale/locale_hu_HU.properties @@ -251,7 +251,6 @@ 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:&a 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.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 diff --git a/src/main/resources/locale/locale_it.properties b/src/main/resources/locale/locale_it.properties index c5f293733..d6df1ef1e 100644 --- a/src/main/resources/locale/locale_it.properties +++ b/src/main/resources/locale/locale_it.properties @@ -258,7 +258,6 @@ 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:&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.IceFishing.Name=Pesca sul Ghiaccio Fishing.SubSkill.IceFishing.Description=Ti permette di pescare in biomi ghiacciati Fishing.SubSkill.IceFishing.Stat=Pesca sul Ghiaccio diff --git a/src/main/resources/locale/locale_ja_JP.properties b/src/main/resources/locale/locale_ja_JP.properties index 1064c29ac..f93cda4be 100644 --- a/src/main/resources/locale/locale_ja_JP.properties +++ b/src/main/resources/locale/locale_ja_JP.properties @@ -241,7 +241,6 @@ 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:&a \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.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 diff --git a/src/main/resources/locale/locale_ko.properties b/src/main/resources/locale/locale_ko.properties index 6a5865391..e6f9e7c30 100644 --- a/src/main/resources/locale/locale_ko.properties +++ b/src/main/resources/locale/locale_ko.properties @@ -132,7 +132,6 @@ Fishing.SubSkill.Shake.Description=\uC544\uC774\uD15C\uC744 \uBAB9\uC774\uB098 \ 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=&9 \uBE44 \uD2B9\uD61C diff --git a/src/main/resources/locale/locale_lt_LT.properties b/src/main/resources/locale/locale_lt_LT.properties index 80e26d8e4..f9d8bb9e4 100644 --- a/src/main/resources/locale/locale_lt_LT.properties +++ b/src/main/resources/locale/locale_lt_LT.properties @@ -251,7 +251,6 @@ Fishing.SubSkill.FishermansDiet.Name=Fisherman's Diet Fishing.SubSkill.FishermansDiet.Description=Improves hunger restored from fished foods 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.IceFishing.Name=Ice Fishing Fishing.SubSkill.IceFishing.Description=Allows you to fish in icy biomes Fishing.SubSkill.IceFishing.Stat=Ice Fishing diff --git a/src/main/resources/locale/locale_nl.properties b/src/main/resources/locale/locale_nl.properties index cd2ae6e67..19dea9c04 100644 --- a/src/main/resources/locale/locale_nl.properties +++ b/src/main/resources/locale/locale_nl.properties @@ -71,7 +71,6 @@ 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.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=&9 Regen Bonus diff --git a/src/main/resources/locale/locale_pl.properties b/src/main/resources/locale/locale_pl.properties index 960803ebf..cf4f89579 100644 --- a/src/main/resources/locale/locale_pl.properties +++ b/src/main/resources/locale/locale_pl.properties @@ -89,7 +89,6 @@ 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=&9 Bonus od Deszczu diff --git a/src/main/resources/locale/locale_ru.properties b/src/main/resources/locale/locale_ru.properties index 9d36e5e2d..7510220b4 100644 --- a/src/main/resources/locale/locale_ru.properties +++ b/src/main/resources/locale/locale_ru.properties @@ -199,7 +199,6 @@ Fishing.SubSkill.FishermansDiet.Name=\u0420\u044b\u0431\u0430\u0446\u043a\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:&a \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.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 diff --git a/src/main/resources/locale/locale_th_TH.properties b/src/main/resources/locale/locale_th_TH.properties index 1882de9eb..56695b922 100644 --- a/src/main/resources/locale/locale_th_TH.properties +++ b/src/main/resources/locale/locale_th_TH.properties @@ -90,7 +90,6 @@ Fishing.SubSkill.Shake.Description=\u0e40\u0e02\u0e22\u0e48\u0e32\u0e40\u0e2d\u0 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.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=&9 Rain Bonus diff --git a/src/main/resources/locale/locale_zh_CN.properties b/src/main/resources/locale/locale_zh_CN.properties index 7557b6cd3..338737994 100644 --- a/src/main/resources/locale/locale_zh_CN.properties +++ b/src/main/resources/locale/locale_zh_CN.properties @@ -251,7 +251,6 @@ 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:&a \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.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 diff --git a/src/main/resources/locale/locale_zh_TW.properties b/src/main/resources/locale/locale_zh_TW.properties index f20ff761f..01a0c15ac 100644 --- a/src/main/resources/locale/locale_zh_TW.properties +++ b/src/main/resources/locale/locale_zh_TW.properties @@ -93,7 +93,6 @@ Fishing.SubSkill.Shake.Description=\u7528\u91e3\u7aff\u628a\u602a\u7269\u7684\u7 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=&9 \u5927\u91cf\u734e\u52f5 From a8d81a2080fff952ee0c0dd41bfeea41064a408a Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 31 Dec 2020 17:02:38 -0800 Subject: [PATCH 294/662] 2.1.165 --- Changelog.txt | 12 ++++++++---- pom.xml | 2 +- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 44960faf2..abc04fb7c 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -5,16 +5,20 @@ Version 2.1.165 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) - Added missing cooldown locale message 'Commands.Database.Cooldown' - Added new locale message 'Taming.Summon.COTW.Removed' 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 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. - This update shouldn't break anything as the API is the same + 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) diff --git a/pom.xml b/pom.xml index 755d4490f..d12b264c6 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.165-SNAPSHOT + 2.1.165 mcMMO https://github.com/mcMMO-Dev/mcMMO From 0d4e1b3ba665aadb4ce011caaa9f402b14dbf99a Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 31 Dec 2020 17:13:56 -0800 Subject: [PATCH 295/662] update changes --- Changelog.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index abc04fb7c..f619cdea0 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -7,7 +7,7 @@ Version 2.1.165 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 in its hover tip + 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' From 959d1e4a05423f0bbd9185f38947b327ca1d2d11 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 1 Jan 2021 12:46:08 -0800 Subject: [PATCH 296/662] Remove music discs from the default loot table --- Changelog.txt | 5 +++ pom.xml | 2 +- src/main/resources/fishing_treasures.yml | 44 ------------------------ 3 files changed, 6 insertions(+), 45 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index f619cdea0..0a1a046a1 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,8 @@ +Version 2.1.166 + Music discs removed from the default fishing_treasures.yml + + NOTES: + No one likes fishing up music discs 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) diff --git a/pom.xml b/pom.xml index d12b264c6..1a419ab4c 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.165 + 2.1.166-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO diff --git a/src/main/resources/fishing_treasures.yml b/src/main/resources/fishing_treasures.yml index d839da2fd..3b9f796dc 100644 --- a/src/main/resources/fishing_treasures.yml +++ b/src/main/resources/fishing_treasures.yml @@ -207,50 +207,6 @@ Fishing: Amount: 1 XP: 200 Rarity: LEGENDARY - MUSIC_DISC_BLOCKS: - Amount: 1 - XP: 200 - Rarity: UNCOMMON - MUSIC_DISC_CHIRP: - Amount: 1 - XP: 200 - Rarity: UNCOMMON - MUSIC_DISC_FAR: - Amount: 1 - XP: 200 - Rarity: RARE - MUSIC_DISC_MALL: - Amount: 1 - XP: 200 - Rarity: RARE - MUSIC_DISC_MELLOHI: - Amount: 1 - XP: 200 - Rarity: RARE - MUSIC_DISC_STAL: - Amount: 1 - XP: 200 - Rarity: EPIC - MUSIC_DISC_STRAD: - Amount: 1 - XP: 200 - Rarity: EPIC - MUSIC_DISC_WARD: - Amount: 1 - XP: 200 - Rarity: EPIC - MUSIC_DISC_11: - Amount: 1 - XP: 200 - Rarity: LEGENDARY - MUSIC_DISC_WAIT: - Amount: 1 - XP: 200 - Rarity: LEGENDARY - MUSIC_DISC_13: - Amount: 1 - XP: 200 - Rarity: MYTHIC NETHERITE_SWORD: Amount: 1 XP: 200 From fbecbc167a489962c070959db68bb3d6683ce652 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 1 Jan 2021 14:04:36 -0800 Subject: [PATCH 297/662] Optimizations and potentially fixing a ConcurrentModificationException involving the TransientEntityTracker Fixes #4368 --- Changelog.txt | 8 +- .../datatypes/player/PlayerProfile.java | 5 +- .../nossr50/listeners/PlayerListener.java | 11 +- src/main/java/com/gmail/nossr50/mcMMO.java | 25 ++- .../nossr50/skills/taming/TamingManager.java | 2 +- .../nossr50/util/TransientEntityTracker.java | 142 +++++++++++++----- 6 files changed, 144 insertions(+), 49 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 0a1a046a1..a829e376d 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,8 +1,14 @@ 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 + No one likes fishing up music discs, if you want this change it is recommended you delete fishing_treasures.yml and let it regenerate + 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. + (You won't have this file if you haven't updated in a while, if so you don't need to do anything) + 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) 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 49fc3d6f7..1d1cb53c2 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/player/PlayerProfile.java +++ b/src/main/java/com/gmail/nossr50/datatypes/player/PlayerProfile.java @@ -131,10 +131,11 @@ public class PlayerProfile { { saveAttempts++; - if(useSync) + //Back out of async saving if we detect a server shutdown, this is not always going to be caught + if(mcMMO.isServerShutdownExecuted() || useSync) scheduleSyncSave(); //Execute sync saves immediately else - scheduleAsyncSaveDelay(); + scheduleAsyncSave(); } else { mcMMO.p.getLogger().severe("mcMMO has failed to save the profile for " diff --git a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java index bf47ef5a0..b410a330d 100644 --- a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java @@ -526,16 +526,15 @@ 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()); } /** diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index 06347a952..f3f6bb9ac 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -88,6 +88,7 @@ public class mcMMO extends JavaPlugin { private static ChatManager chatManager; private static CommandManager commandManager; //ACF private static TransientEntityTracker transientEntityTracker; + private static boolean serverShutdownExecuted = false; /* Adventure */ private static BukkitAudiences audiences; @@ -292,6 +293,7 @@ public class mcMMO extends JavaPlugin { commandManager = new CommandManager(this); transientEntityTracker = new TransientEntityTracker(); + setServerShutdown(false); //Reset flag, used to make decisions about async saves } public static PlayerLevelUtils getPlayerLevelUtils() { @@ -327,6 +329,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(); @@ -345,11 +351,6 @@ public class mcMMO extends JavaPlugin { 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()) { // Remove other tasks BEFORE starting the Backup, or we just cancel it straight away. try { @@ -369,6 +370,11 @@ public class mcMMO extends JavaPlugin { } } + 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! } @@ -727,4 +733,13 @@ public class mcMMO extends JavaPlugin { public static TransientEntityTracker getTransientEntityTracker() { return transientEntityTracker; } + + public static synchronized boolean isServerShutdownExecuted() { + return serverShutdownExecuted; + } + + private static synchronized void setServerShutdown(boolean bool) { + serverShutdownExecuted = bool; + } + } 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 0ec720ec1..6a902dd43 100644 --- a/src/main/java/com/gmail/nossr50/skills/taming/TamingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/taming/TamingManager.java @@ -52,7 +52,7 @@ public class TamingManager extends SkillManager { lastSummonTimeStamp = 0L; //Init per-player tracking of summoned entities - mcMMO.getTransientEntityTracker().initPlayer(mmoPlayer.getPlayer().getUniqueId()); + mcMMO.getTransientEntityTracker().initPlayer(mmoPlayer.getPlayer()); //Hacky stuff used as a band-aid initStaticCaches(); diff --git a/src/main/java/com/gmail/nossr50/util/TransientEntityTracker.java b/src/main/java/com/gmail/nossr50/util/TransientEntityTracker.java index 4b22abaea..9ee1807b4 100644 --- a/src/main/java/com/gmail/nossr50/util/TransientEntityTracker.java +++ b/src/main/java/com/gmail/nossr50/util/TransientEntityTracker.java @@ -19,6 +19,7 @@ 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; @@ -27,30 +28,74 @@ public class TransientEntityTracker { chunkLookupCache = new HashSet<>(); } - public void initPlayer(@NotNull UUID playerUUID) { - if (!isPlayerRegistered(playerUUID)) { - registerPlayer(playerUUID); + 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()); } } - public void cleanupPlayer(@NotNull UUID playerUUID) { - cleanupAllSummons(null, playerUUID); + /** + * Removes a player from the tracker + * + * @param playerUUID target player + */ + public synchronized void cleanupPlayer(@NotNull UUID playerUUID) { + cleanPlayer(null, playerUUID); } - public void cleanupPlayer(@NotNull Player player) { - //First remove all entities related to this player + /** + * 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 boolean isPlayerRegistered(@NotNull UUID playerUUID) { - return perPlayerTransientEntityMap.get(playerUUID) != null; + private void removePlayerFromMap(@NotNull UUID playerUUID) { + getPerPlayerTransientEntityMap().remove(playerUUID); } - private void registerPlayer(@NotNull UUID playerUUID) { - perPlayerTransientEntityMap.put(playerUUID, new HashMap>()); + /** + * 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()) { - perPlayerTransientEntityMap.get(playerUUID).put(callOfTheWildType, new HashSet<>()); + getPerPlayerTransientEntityMap().get(playerUUID).put(callOfTheWildType, new HashSet<>()); } } @@ -60,16 +105,18 @@ public class TransientEntityTracker { * @param playerUUID the target uuid of the player * @return the tracked entities map for the player, null if the player isn't registered */ - public @Nullable HashMap> getPlayerTrackedEntityMap(@NotNull UUID playerUUID) { - return perPlayerTransientEntityMap.get(playerUUID); + public synchronized @Nullable HashMap> getPlayerTrackedEntityMap(@NotNull UUID playerUUID) { + return getPerPlayerTransientEntityMap().get(playerUUID); } - public void registerEntity(@NotNull UUID playerUUID, @NotNull TrackedTamingEntity trackedTamingEntity) { - if(!isPlayerRegistered(playerUUID)) { - mcMMO.p.getLogger().severe("Attempting to register entity to a player which hasn't been initialized!"); - initPlayer(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); @@ -85,7 +132,7 @@ public class TransientEntityTracker { * @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 @Nullable HashSet getTrackedEntities(@NotNull UUID playerUUID, @NotNull CallOfTheWildType callOfTheWildType) { + private synchronized @Nullable HashSet getTrackedEntities(@NotNull UUID playerUUID, @NotNull CallOfTheWildType callOfTheWildType) { HashMap> playerEntityMap = getPlayerTrackedEntityMap(playerUUID); if(playerEntityMap == null) @@ -94,21 +141,45 @@ public class TransientEntityTracker { return playerEntityMap.get(callOfTheWildType); } - private void addToChunkLookupCache(@NotNull TrackedTamingEntity trackedTamingEntity) { - chunkLookupCache.add(trackedTamingEntity.getLivingEntity()); + /** + * 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()); } - public void unregisterEntity(@NotNull LivingEntity livingEntity) { + /** + * 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) { - chunkLookupCache.remove(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 : perPlayerTransientEntityMap.keySet()) { + for(UUID uuid : getPerPlayerTransientEntityMap().keySet()) { for(CallOfTheWildType callOfTheWildType : CallOfTheWildType.values()) { HashSet trackedEntities = getTrackedEntities(uuid, callOfTheWildType); @@ -127,10 +198,16 @@ public class TransientEntityTracker { } } - public @NotNull List getAllTransientEntitiesInChunk(@NotNull Chunk chunk) { + /** + * 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 : chunkLookupCache) { + for(LivingEntity livingEntity : getChunkLookupCache()) { if(livingEntity.getLocation().getChunk().equals(chunk)) { matchingEntities.add(livingEntity); } @@ -139,17 +216,14 @@ public class TransientEntityTracker { return matchingEntities; } - /* - * Gross code below - */ - /** * 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 int getAmountCurrentlySummoned(@NotNull UUID playerUUID, @NotNull CallOfTheWildType callOfTheWildType) { + public synchronized int getAmountCurrentlySummoned(@NotNull UUID playerUUID, @NotNull CallOfTheWildType callOfTheWildType) { HashSet trackedEntities = getTrackedEntities(playerUUID, callOfTheWildType); if(trackedEntities == null) @@ -165,7 +239,7 @@ public class TransientEntityTracker { * @param livingEntity entity to remove * @param player associated player */ - public void removeSummon(@NotNull LivingEntity livingEntity, @Nullable Player player, boolean timeExpired) { + 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 From 91808791643951e257761f08effe26942d6e3ea8 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 1 Jan 2021 14:06:15 -0800 Subject: [PATCH 298/662] 2.1.166 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1a419ab4c..77cb38b4a 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.166-SNAPSHOT + 2.1.166 mcMMO https://github.com/mcMMO-Dev/mcMMO From 0466a28a5f5d3b20af23fbccd462439ca58dff2d Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 1 Jan 2021 14:08:52 -0800 Subject: [PATCH 299/662] Update changelog --- Changelog.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index a829e376d..37fd225ad 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -6,8 +6,8 @@ Version 2.1.166 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 - 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. (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 From 556515eefde184c5e71e9c1df6658a7f39169481 Mon Sep 17 00:00:00 2001 From: Shane Freeder Date: Tue, 20 Oct 2020 09:43:44 +0100 Subject: [PATCH 300/662] Add SkillActivationPerkEvent --- pom.xml | 2 +- .../skills/SkillActivationPerkEvent.java | 49 +++++++++++++++++++ .../gmail/nossr50/util/skills/PerksUtils.java | 7 ++- 3 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/gmail/nossr50/events/skills/SkillActivationPerkEvent.java diff --git a/pom.xml b/pom.xml index 77cb38b4a..a6c89b72a 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.166 + 2.1.167-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO 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..89c41dd6f --- /dev/null +++ b/src/main/java/com/gmail/nossr50/events/skills/SkillActivationPerkEvent.java @@ -0,0 +1,49 @@ +package com.gmail.nossr50.events.skills; + +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) { + + 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/util/skills/PerksUtils.java b/src/main/java/com/gmail/nossr50/util/skills/PerksUtils.java index 165008068..588b944e1 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/PerksUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/PerksUtils.java @@ -2,8 +2,11 @@ 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 org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.entity.Player; @@ -42,7 +45,9 @@ 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) { From 67a4b6c7c136a394580f4b6c6f5b1887875fd97a Mon Sep 17 00:00:00 2001 From: Shane Freeder Date: Sun, 25 Oct 2020 14:43:33 +0000 Subject: [PATCH 301/662] Experience PreGain event --- .../nossr50/datatypes/player/McMMOPlayer.java | 7 +++ .../experience/McMMOPlayerPreXpGainEvent.java | 50 +++++++++++++++++++ 2 files changed, 57 insertions(+) create mode 100644 src/main/java/com/gmail/nossr50/events/experience/McMMOPlayerPreXpGainEvent.java 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 4d94f0d4b..cc5aebefe 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java +++ b/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java @@ -17,6 +17,7 @@ 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; @@ -56,6 +57,8 @@ import com.gmail.nossr50.util.sounds.SoundManager; import com.gmail.nossr50.util.sounds.SoundType; import net.kyori.adventure.identity.Identified; import net.kyori.adventure.identity.Identity; +import org.apache.commons.lang.Validate; +import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.Location; import org.bukkit.block.Block; @@ -601,6 +604,10 @@ public class McMMOPlayer implements Identified { return; } + final McMMOPlayerPreXpGainEvent mcMMOPlayerPreXpGainEvent = new McMMOPlayerPreXpGainEvent(player, primarySkillType, xp, xpGainReason); + Bukkit.getPluginManager().callEvent(mcMMOPlayerPreXpGainEvent); + xp = mcMMOPlayerPreXpGainEvent.getXpGained(); + if (primarySkillType.isChildSkill()) { Set parentSkills = FamilyTree.getParents(primarySkillType); 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; + } +} From 140806576858623b57db78fa5311a7398d162c39 Mon Sep 17 00:00:00 2001 From: Shane Freeder Date: Sat, 2 Jan 2021 01:07:15 +0000 Subject: [PATCH 302/662] update changelog --- Changelog.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Changelog.txt b/Changelog.txt index 37fd225ad..9724aac43 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,8 @@ +Version 2.1.167 + Add McMMOPlayerPreXpGainEvent event for plugins to modify given exp + Add SkillActivationPerkEvent + + 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) From bec54d93ac8628689561d1976e949044a89d2f9c Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 1 Jan 2021 22:15:44 -0800 Subject: [PATCH 303/662] Fix dupe bug --- Changelog.txt | 8 ++++++-- .../com/gmail/nossr50/listeners/EntityListener.java | 5 ++++- .../com/gmail/nossr50/util/TransientEntityTracker.java | 10 ++++++++++ 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 9724aac43..03b0c066b 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,6 +1,10 @@ Version 2.1.167 - Add McMMOPlayerPreXpGainEvent event for plugins to modify given exp - Add SkillActivationPerkEvent + 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 diff --git a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java index 24dd48031..13c65f3ec 100644 --- a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java @@ -645,7 +645,10 @@ public class EntityListener implements Listener { @EventHandler(ignoreCancelled = true) public void onEntityDeath(EntityDeathEvent event) { LivingEntity entity = event.getEntity(); - mcMMO.getTransientEntityTracker().removeSummon(entity, null, false); + + if(mcMMO.getTransientEntityTracker().isTransientSummon(entity)) { + mcMMO.getTransientEntityTracker().removeSummon(entity, null, false); + } /* WORLD BLACKLIST CHECK */ if(WorldBlacklist.isWorldBlacklisted(event.getEntity().getWorld())) { diff --git a/src/main/java/com/gmail/nossr50/util/TransientEntityTracker.java b/src/main/java/com/gmail/nossr50/util/TransientEntityTracker.java index 9ee1807b4..6e1b44938 100644 --- a/src/main/java/com/gmail/nossr50/util/TransientEntityTracker.java +++ b/src/main/java/com/gmail/nossr50/util/TransientEntityTracker.java @@ -124,6 +124,16 @@ public class TransientEntityTracker { 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 From 0fa1d822d4497b123780c11ca999d4d53bc60d04 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 1 Jan 2021 22:16:52 -0800 Subject: [PATCH 304/662] 2.1.167 --- Changelog.txt | 1 - pom.xml | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 03b0c066b..00979b96a 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -6,7 +6,6 @@ Version 2.1.167 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) diff --git a/pom.xml b/pom.xml index a6c89b72a..49d76da30 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.167-SNAPSHOT + 2.1.167 mcMMO https://github.com/mcMMO-Dev/mcMMO From e0d85f842b1b96b2b1c055e66d65b65d2f14c306 Mon Sep 17 00:00:00 2001 From: t00thpick1 Date: Sat, 2 Jan 2021 11:18:32 -0500 Subject: [PATCH 305/662] Fix exception thrown when plants fake grow at max world height. --- .../com/gmail/nossr50/listeners/BlockListener.java | 12 +++++++++--- .../nossr50/util/blockmeta/BitSetChunkStore.java | 2 +- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java index a2a4c2a76..a6d8e7900 100644 --- a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java @@ -253,12 +253,18 @@ public class BlockListener implements Listener { @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) 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(); - mcMMO.getPlaceStore().setFalse(blockState); + // 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 (block.getY() >= world.getMaxHeight()) + return; + + mcMMO.getPlaceStore().setFalse(block); } /** diff --git a/src/main/java/com/gmail/nossr50/util/blockmeta/BitSetChunkStore.java b/src/main/java/com/gmail/nossr50/util/blockmeta/BitSetChunkStore.java index dce7ab174..a1fe92e4b 100644 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/BitSetChunkStore.java +++ b/src/main/java/com/gmail/nossr50/util/blockmeta/BitSetChunkStore.java @@ -82,7 +82,7 @@ public class BitSetChunkStore implements ChunkStore, Serializable { private int coordToIndex(int x, int y, int z) { if (x < 0 || x >= 16 || y < 0 || y >= worldHeight || z < 0 || z >= 16) - throw new IndexOutOfBoundsException(); + throw new IndexOutOfBoundsException(String.format("x: %d y: %d z: %d World Height: %d", x, y, z, worldHeight)); return (z * 16 + x) + (256 * y); } From a39c7420b94d9c5a97f50a19025c5754ef819343 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sat, 2 Jan 2021 13:32:30 -0800 Subject: [PATCH 306/662] Add relocation for Kyori's examination library --- pom.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pom.xml b/pom.xml index 49d76da30..a0e35a0be 100755 --- a/pom.xml +++ b/pom.xml @@ -121,6 +121,10 @@ + + net.kyori.examination + com.gmail.nossr50.kyori.examination + net.kyori.adventure com.gmail.nossr50.mcmmo.kyori.adventure From d08c9391b045b786700a38d6a0385ec95621e85b Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sat, 2 Jan 2021 13:36:59 -0800 Subject: [PATCH 307/662] Add nullability annotations to blockmeta --- .../util/blockmeta/BitSetChunkStore.java | 10 ++-- .../nossr50/util/blockmeta/ChunkManager.java | 23 ++++---- .../util/blockmeta/ChunkManagerFactory.java | 3 +- .../nossr50/util/blockmeta/ChunkStore.java | 3 +- .../util/blockmeta/HashChunkManager.java | 56 ++++++++++--------- .../util/blockmeta/McMMOSimpleRegionFile.java | 11 ++-- src/test/java/ChunkStoreTest.java | 3 +- 7 files changed, 60 insertions(+), 49 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/util/blockmeta/BitSetChunkStore.java b/src/main/java/com/gmail/nossr50/util/blockmeta/BitSetChunkStore.java index a1fe92e4b..2f4ffe9ce 100644 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/BitSetChunkStore.java +++ b/src/main/java/com/gmail/nossr50/util/blockmeta/BitSetChunkStore.java @@ -2,6 +2,8 @@ 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; @@ -19,7 +21,7 @@ public class BitSetChunkStore implements ChunkStore, Serializable { private int worldHeight; private UUID worldUid; - public BitSetChunkStore(World world, int cx, int cz) { + public BitSetChunkStore(@NotNull World world, int cx, int cz) { this.cx = cx; this.cz = cz; this.worldUid = world.getUID(); @@ -50,7 +52,7 @@ public class BitSetChunkStore implements ChunkStore, Serializable { } @Override - public UUID getWorldId() { + public @NotNull UUID getWorldId() { return worldUid; } @@ -153,7 +155,7 @@ public class BitSetChunkStore implements ChunkStore, Serializable { dirty = false; } - private static BitSetChunkStore deserialize(DataInputStream in) throws IOException { + private static 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(); @@ -182,7 +184,7 @@ public class BitSetChunkStore implements ChunkStore, Serializable { public static final short STREAM_MAGIC = (short)0xACDC; - public static ChunkStore readChunkStore(DataInputStream inputStream) throws IOException { + public static @NotNull ChunkStore readChunkStore(DataInputStream inputStream) throws IOException { if (inputStream.markSupported()) inputStream.mark(2); short magicNumber = inputStream.readShort(); diff --git a/src/main/java/com/gmail/nossr50/util/blockmeta/ChunkManager.java b/src/main/java/com/gmail/nossr50/util/blockmeta/ChunkManager.java index 5cb50ac7f..57c66a899 100644 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/ChunkManager.java +++ b/src/main/java/com/gmail/nossr50/util/blockmeta/ChunkManager.java @@ -3,6 +3,7 @@ package com.gmail.nossr50.util.blockmeta; import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.block.BlockState; +import org.jetbrains.annotations.Nullable; public interface ChunkManager { void closeAll(); @@ -14,7 +15,7 @@ public interface ChunkManager { * @param cz Chunk Z coordinate that is to be saved * @param world World that the Chunk is in */ - void saveChunk(int cx, int cz, World world); + void saveChunk(int cx, int cz, @Nullable World world); /** * Informs the ChunkletManager a chunk is unloaded @@ -23,7 +24,7 @@ public interface ChunkManager { * @param cz Chunk Z coordinate that is unloaded * @param world World that the chunk was unloaded in */ - void chunkUnloaded(int cx, int cz, World world); + void chunkUnloaded(int cx, int cz, @Nullable World world); /** * Save all ChunkletStores related to the given world @@ -53,7 +54,7 @@ public interface ChunkManager { * @param world World to check in * @return true if the given location is set to true, false if otherwise */ - boolean isTrue(int x, int y, int z, World world); + boolean isTrue(int x, int y, int z, @Nullable World world); /** * Check to see if a given block location is set to true @@ -61,7 +62,7 @@ public interface ChunkManager { * @param block Block location to check * @return true if the given block location is set to true, false if otherwise */ - boolean isTrue(Block block); + boolean isTrue(@Nullable Block block); /** * Check to see if a given BlockState location is set to true @@ -69,7 +70,7 @@ public interface ChunkManager { * @param blockState BlockState to check * @return true if the given BlockState location is set to true, false if otherwise */ - boolean isTrue(BlockState blockState); + boolean isTrue(@Nullable BlockState blockState); /** * Set a given location to true, should create stores as necessary if the location does not exist @@ -79,21 +80,21 @@ public interface ChunkManager { * @param z Z coordinate to set * @param world World to set in */ - void setTrue(int x, int y, int z, World world); + void setTrue(int x, int y, int z, @Nullable 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 */ - void setTrue(Block block); + void setTrue(@Nullable 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 */ - void setTrue(BlockState blockState); + void setTrue(@Nullable BlockState blockState); /** * Set a given location to false, should not create stores if one does not exist for the given location @@ -103,21 +104,21 @@ public interface ChunkManager { * @param z Z coordinate to set * @param world World to set in */ - void setFalse(int x, int y, int z, World world); + void setFalse(int x, int y, int z, @Nullable 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 */ - void setFalse(Block block); + void setFalse(@Nullable 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 */ - void setFalse(BlockState blockState); + void setFalse(@Nullable BlockState blockState); /** * Delete any ChunkletStores that are empty diff --git a/src/main/java/com/gmail/nossr50/util/blockmeta/ChunkManagerFactory.java b/src/main/java/com/gmail/nossr50/util/blockmeta/ChunkManagerFactory.java index a290c5e2a..e2c47662e 100644 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/ChunkManagerFactory.java +++ b/src/main/java/com/gmail/nossr50/util/blockmeta/ChunkManagerFactory.java @@ -1,9 +1,10 @@ package com.gmail.nossr50.util.blockmeta; import com.gmail.nossr50.config.HiddenConfig; +import org.jetbrains.annotations.NotNull; public class ChunkManagerFactory { - public static ChunkManager getChunkManager() { + public static @NotNull ChunkManager getChunkManager() { HiddenConfig hConfig = HiddenConfig.getInstance(); if (hConfig.getChunkletsEnabled()) { diff --git a/src/main/java/com/gmail/nossr50/util/blockmeta/ChunkStore.java b/src/main/java/com/gmail/nossr50/util/blockmeta/ChunkStore.java index eca783ccd..df01b93ee 100644 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/ChunkStore.java +++ b/src/main/java/com/gmail/nossr50/util/blockmeta/ChunkStore.java @@ -1,6 +1,7 @@ package com.gmail.nossr50.util.blockmeta; import org.bukkit.World; +import org.jetbrains.annotations.NotNull; import java.util.UUID; @@ -36,7 +37,7 @@ public interface ChunkStore { */ int getChunkZ(); - UUID getWorldId(); + @NotNull UUID getWorldId(); /** * Checks the value at the given coordinates diff --git a/src/main/java/com/gmail/nossr50/util/blockmeta/HashChunkManager.java b/src/main/java/com/gmail/nossr50/util/blockmeta/HashChunkManager.java index 888937872..f3023e0e3 100644 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/HashChunkManager.java +++ b/src/main/java/com/gmail/nossr50/util/blockmeta/HashChunkManager.java @@ -5,14 +5,16 @@ 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.*; 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 + private final @NotNull HashMap regionMap = new HashMap<>(); // Tracks active regions + private final @NotNull HashMap> chunkUsageMap = new HashMap<>(); // Tracks active chunks by region + private final @NotNull HashMap chunkMap = new HashMap<>(); // Tracks active chunks @Override public synchronized void closeAll() { @@ -32,7 +34,7 @@ public class HashChunkManager implements ChunkManager { regionMap.clear(); } - private synchronized ChunkStore readChunkStore(World world, int cx, int cz) throws IOException { + private synchronized @Nullable ChunkStore readChunkStore(@NotNull World world, int cx, int cz) throws IOException { McMMOSimpleRegionFile rf = getSimpleRegionFile(world, cx, cz, false); if (rf == null) return null; // If there is no region file, there can't be a chunk @@ -43,7 +45,7 @@ public class HashChunkManager implements ChunkManager { } } - private synchronized void writeChunkStore(World world, ChunkStore data) { + private synchronized void writeChunkStore(@NotNull World world, @NotNull ChunkStore data) { if (!data.isDirty()) return; // Don't save unchanged data try { @@ -58,7 +60,7 @@ public class HashChunkManager implements ChunkManager { } } - private synchronized McMMOSimpleRegionFile getSimpleRegionFile(World world, int cx, int cz, boolean createIfAbsent) { + private synchronized @Nullable McMMOSimpleRegionFile getSimpleRegionFile(World world, int cx, int cz, boolean createIfAbsent) { CoordinateKey regionKey = toRegionKey(world.getUID(), cx, cz); return regionMap.computeIfAbsent(regionKey, k -> { @@ -73,7 +75,7 @@ public class HashChunkManager implements ChunkManager { }); } - private ChunkStore loadChunk(int cx, int cz, World world) { + private @Nullable ChunkStore loadChunk(int cx, int cz, World world) { try { return readChunkStore(world, cx, cz); } @@ -82,7 +84,7 @@ public class HashChunkManager implements ChunkManager { return null; } - private void unloadChunk(int cx, int cz, World world) { + 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) @@ -102,7 +104,7 @@ public class HashChunkManager implements ChunkManager { } @Override - public synchronized void saveChunk(int cx, int cz, World world) { + public synchronized void saveChunk(int cx, int cz, @Nullable World world) { if (world == null) return; @@ -120,7 +122,7 @@ public class HashChunkManager implements ChunkManager { } @Override - public synchronized void chunkUnloaded(int cx, int cz, World world) { + public synchronized void chunkUnloaded(int cx, int cz, @Nullable World world) { if (world == null) return; @@ -128,7 +130,7 @@ public class HashChunkManager implements ChunkManager { } @Override - public synchronized void saveWorld(World world) { + public synchronized void saveWorld(@Nullable World world) { if (world == null) return; @@ -148,7 +150,7 @@ public class HashChunkManager implements ChunkManager { } @Override - public synchronized void unloadWorld(World world) { + public synchronized void unloadWorld(@Nullable World world) { if (world == null) return; @@ -185,7 +187,7 @@ public class HashChunkManager implements ChunkManager { } @Override - public synchronized boolean isTrue(int x, int y, int z, World world) { + public synchronized boolean isTrue(int x, int y, int z, @Nullable World world) { if (world == null) return false; @@ -214,7 +216,7 @@ public class HashChunkManager implements ChunkManager { } @Override - public synchronized boolean isTrue(Block block) { + public synchronized boolean isTrue(@Nullable Block block) { if (block == null) return false; @@ -222,7 +224,7 @@ public class HashChunkManager implements ChunkManager { } @Override - public synchronized boolean isTrue(BlockState blockState) { + public synchronized boolean isTrue(@Nullable BlockState blockState) { if (blockState == null) return false; @@ -230,12 +232,12 @@ public class HashChunkManager implements ChunkManager { } @Override - public synchronized void setTrue(int x, int y, int z, World world) { + public synchronized void setTrue(int x, int y, int z, @Nullable World world) { set(x, y, z, world, true); } @Override - public synchronized void setTrue(Block block) { + public synchronized void setTrue(@Nullable Block block) { if (block == null) return; @@ -243,7 +245,7 @@ public class HashChunkManager implements ChunkManager { } @Override - public synchronized void setTrue(BlockState blockState) { + public synchronized void setTrue(@Nullable BlockState blockState) { if (blockState == null) return; @@ -251,12 +253,12 @@ public class HashChunkManager implements ChunkManager { } @Override - public synchronized void setFalse(int x, int y, int z, World world) { + public synchronized void setFalse(int x, int y, int z, @Nullable World world) { set(x, y, z, world, false); } @Override - public synchronized void setFalse(Block block) { + public synchronized void setFalse(@Nullable Block block) { if (block == null) return; @@ -264,14 +266,14 @@ public class HashChunkManager implements ChunkManager { } @Override - public synchronized void setFalse(BlockState blockState) { + public synchronized void setFalse(@Nullable BlockState blockState) { if (blockState == null) return; setFalse(blockState.getX(), blockState.getY(), blockState.getZ(), blockState.getWorld()); } - public synchronized void set(int x, int y, int z, World world, boolean value){ + public synchronized void set(int x, int y, int z, @Nullable World world, boolean value){ if (world == null) return; @@ -307,15 +309,15 @@ public class HashChunkManager implements ChunkManager { cStore.set(ix, y, iz, value); } - private CoordinateKey blockCoordinateToChunkKey(UUID worldUid, int x, int y, int z) { + private CoordinateKey blockCoordinateToChunkKey(@NotNull UUID worldUid, int x, int y, int z) { return toChunkKey(worldUid, x >> 4, z >> 4); } - private CoordinateKey toChunkKey(UUID worldUid, int cx, int cz){ + private CoordinateKey toChunkKey(@NotNull UUID worldUid, int cx, int cz){ return new CoordinateKey(worldUid, cx, cz); } - private CoordinateKey toRegionKey(UUID worldUid, int cx, int cz) { + private CoordinateKey toRegionKey(@NotNull UUID worldUid, int cx, int cz) { // Compute region index (32x32 chunk regions) int rx = cx >> 5; int rz = cz >> 5; @@ -323,11 +325,11 @@ public class HashChunkManager implements ChunkManager { } private static final class CoordinateKey { - public final UUID worldID; + public final @NotNull UUID worldID; public final int x; public final int z; - private CoordinateKey(UUID worldID, int x, int z) { + private CoordinateKey(@NotNull UUID worldID, int x, int z) { this.worldID = worldID; this.x = x; this.z = z; diff --git a/src/main/java/com/gmail/nossr50/util/blockmeta/McMMOSimpleRegionFile.java b/src/main/java/com/gmail/nossr50/util/blockmeta/McMMOSimpleRegionFile.java index bef730ff4..3f61c9bef 100644 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/McMMOSimpleRegionFile.java +++ b/src/main/java/com/gmail/nossr50/util/blockmeta/McMMOSimpleRegionFile.java @@ -19,6 +19,9 @@ */ 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; @@ -54,7 +57,7 @@ public class McMMOSimpleRegionFile { private final int segmentMask; // File location - private final File parent; + private final @NotNull File parent; // File access private final RandomAccessFile file; @@ -62,7 +65,7 @@ public class McMMOSimpleRegionFile { private final int rx; private final int rz; - public McMMOSimpleRegionFile(File f, int rx, int rz) { + public McMMOSimpleRegionFile(@NotNull File f, int rx, int rz) { this.rx = rx; this.rz = rz; this.parent = f; @@ -104,7 +107,7 @@ public class McMMOSimpleRegionFile { } } - public synchronized DataOutputStream getOutputStream(int x, int z) { + 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))); } @@ -144,7 +147,7 @@ public class McMMOSimpleRegionFile { file.writeInt(chunkNumBytes[index]); } - public synchronized DataInputStream getInputStream(int x, int z) throws IOException { + 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 diff --git a/src/test/java/ChunkStoreTest.java b/src/test/java/ChunkStoreTest.java index f45b0e0c9..43f105bad 100644 --- a/src/test/java/ChunkStoreTest.java +++ b/src/test/java/ChunkStoreTest.java @@ -2,6 +2,7 @@ import com.gmail.nossr50.util.blockmeta.*; import com.google.common.io.Files; import org.bukkit.Bukkit; import org.bukkit.World; +import org.jetbrains.annotations.NotNull; import org.junit.*; import org.junit.runner.RunWith; import org.mockito.Mockito; @@ -227,7 +228,7 @@ public class ChunkStoreTest { } @Override - public UUID getWorldId() { + public @NotNull UUID getWorldId() { return worldUid; } From 10694042e9d6ebe8bff60f9571af978bbdcb8b8e Mon Sep 17 00:00:00 2001 From: t00thpick1 Date: Sat, 2 Jan 2021 16:46:35 -0500 Subject: [PATCH 308/662] Move legacy Serializable usage into a subclass. --- .../util/blockmeta/BitSetChunkStore.java | 172 ++++++++++-------- 1 file changed, 101 insertions(+), 71 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/util/blockmeta/BitSetChunkStore.java b/src/main/java/com/gmail/nossr50/util/blockmeta/BitSetChunkStore.java index 2f4ffe9ce..a04ed501b 100644 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/BitSetChunkStore.java +++ b/src/main/java/com/gmail/nossr50/util/blockmeta/BitSetChunkStore.java @@ -3,33 +3,35 @@ 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, Serializable { - private static final long serialVersionUID = -1L; - transient private boolean dirty = false; - // 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 BitSet store; +public class BitSetChunkStore implements ChunkStore { private static final int CURRENT_VERSION = 8; private static final int MAGIC_NUMBER = 0xEA5EDEBB; - private int cx; - private int cz; - private int worldHeight; - private UUID worldUid; + + private final int cx; + private final int cz; + private final int worldHeight; + private final 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 BitSet store; + + private transient boolean dirty = false; public BitSetChunkStore(@NotNull World world, int cx, int cz) { - this.cx = cx; - this.cz = cz; - this.worldUid = world.getUID(); - this.worldHeight = world.getMaxHeight(); - this.store = new BitSet(16 * 16 * worldHeight); + this(world.getUID(), world.getMaxHeight(), cx, cz); } - private BitSetChunkStore() {} + private BitSetChunkStore(@NotNull UUID worldUid, int worldHeight, int cx, int cz) { + this.cx = cx; + this.cz = cz; + this.worldUid = worldUid; + this.worldHeight = worldHeight; + this.store = new BitSet(16 * 16 * worldHeight); + } @Override public boolean isDirty() { @@ -83,58 +85,24 @@ public class BitSetChunkStore implements ChunkStore, Serializable { } private int coordToIndex(int x, int y, int z) { + return coordToIndex(x, y, z, worldHeight); + } + + private static int coordToIndex(int x, int y, int z, int worldHeight) { if (x < 0 || x >= 16 || y < 0 || y >= worldHeight || z < 0 || z >= 16) throw new IndexOutOfBoundsException(String.format("x: %d y: %d z: %d World Height: %d", x, y, z, worldHeight)); return (z * 16 + x) + (256 * y); } - private void fixWorldHeight() { + private static int getWorldHeight(UUID worldUid, int storedWorldHeight) + { 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) - return; + return storedWorldHeight; - // Lop off any extra data if the world height has shrunk - int currentWorldHeight = world.getMaxHeight(); - if (currentWorldHeight < worldHeight) - { - store.clear(coordToIndex(16, currentWorldHeight, 16), store.length()); - worldHeight = currentWorldHeight; - dirty = true; - } - // If the world height has grown, update the worldHeight variable, but don't bother marking it dirty as unless something else changes we don't need to force a file write; - else if (currentWorldHeight > worldHeight) - worldHeight = currentWorldHeight; - } - - @Deprecated - private void writeObject(ObjectOutputStream out) throws IOException { - throw new UnsupportedOperationException("Serializable support should only be used for legacy deserialization"); - } - - @Deprecated - private void readObject(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(); - - boolean[][][] oldStore = (boolean[][][]) in.readObject(); - worldHeight = oldStore[0][0].length; - store = new BitSet(16 * 16 * worldHeight / 8); - for (int x = 0; x < 16; x++) { - for (int z = 0; z < 16; z++) { - for (int y = 0; y < worldHeight; y++) { - store.set(coordToIndex(x, y, z), oldStore[x][z][y]); - } - } - } - dirty = true; - fixWorldHeight(); + return world.getMaxHeight(); } private void serialize(DataOutputStream out) throws IOException { @@ -163,26 +131,34 @@ public class BitSetChunkStore implements ChunkStore, Serializable { if (magic != MAGIC_NUMBER || fileVersionNumber != CURRENT_VERSION) throw new IOException(); - BitSetChunkStore chunkStore = new BitSetChunkStore(); - long lsb = in.readLong(); long msb = in.readLong(); - chunkStore.worldUid = new UUID(msb, lsb); - chunkStore.cx = in.readInt(); - chunkStore.cz = in.readInt(); + UUID worldUid = new UUID(msb, lsb); + int cx = in.readInt(); + int cz = in.readInt(); - chunkStore.worldHeight = in.readInt(); + int worldHeight = in.readInt(); byte[] temp = new byte[in.readInt()]; in.readFully(temp); - chunkStore.store = BitSet.valueOf(temp); + BitSet stored = BitSet.valueOf(temp); + + int currentWorldHeight = getWorldHeight(worldUid, worldHeight); + + boolean worldHeightShrunk = currentWorldHeight < worldHeight; + // Lop off extra data if world height has shrunk + if (worldHeightShrunk) + stored.clear(coordToIndex(16, currentWorldHeight, 16, worldHeight), stored.length()); + + BitSetChunkStore chunkStore = new BitSetChunkStore(worldUid, currentWorldHeight, cx, cz); + chunkStore.store.or(stored); + chunkStore.dirty = worldHeightShrunk; // In the expanded case there is no reason to re-write it unless the data changes - chunkStore.fixWorldHeight(); return chunkStore; } public static class Serialization { - public static final short STREAM_MAGIC = (short)0xACDC; + public static final short STREAM_MAGIC = (short)0xACDC; // Rock on public static @NotNull ChunkStore readChunkStore(DataInputStream inputStream) throws IOException { if (inputStream.markSupported()) @@ -198,7 +174,7 @@ public class BitSetChunkStore implements ChunkStore, Serializable { { // 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 >>> 0) & 0xFF); + pushbackInputStream.unread((magicNumber) & 0xFF); pushbackInputStream.unread((magicNumber >>> 8) & 0xFF); inputStream = new DataInputStream(pushbackInputStream); } @@ -218,8 +194,61 @@ public class BitSetChunkStore implements ChunkStore, Serializable { ((BitSetChunkStore)chunkStore).serialize(outputStream); } - // Handles loading the old serialized classes even though we have changed name/package + // 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 worldHeight; + private UUID worldUid; + private boolean[][][] store; + + private LegacyChunkStoreDeserializer() {} + + @Deprecated + private void writeObject(ObjectOutputStream out) throws IOException { + throw new UnsupportedOperationException("You goofed."); + } + + @Deprecated + private void readObject(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(); + worldHeight = store[0][0].length; + } + + public BitSetChunkStore convert() + { + int currentWorldHeight = getWorldHeight(worldUid, worldHeight); + + BitSetChunkStore converted = new BitSetChunkStore(worldUid, currentWorldHeight, 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 < worldHeight && y < currentWorldHeight; 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(InputStream in) throws IOException { super(in); enableResolveObject(true); @@ -229,13 +258,14 @@ public class BitSetChunkStore implements ChunkStore, Serializable { protected ObjectStreamClass readClassDescriptor() throws IOException, ClassNotFoundException { ObjectStreamClass read = super.readClassDescriptor(); if (read.getName().contentEquals("com.gmail.nossr50.util.blockmeta.chunkmeta.PrimitiveChunkStore")) - return ObjectStreamClass.lookup(BitSetChunkStore.class); + return ObjectStreamClass.lookup(LegacyChunkStoreDeserializer.class); return read; } public ChunkStore readLegacyChunkStore(){ try { - return (ChunkStore) readObject(); + LegacyChunkStoreDeserializer deserializer = (LegacyChunkStoreDeserializer)readObject(); + return deserializer.convert(); } catch (IOException | ClassNotFoundException e) { return null; } From 5b41b04777c9bdd5a67bb5f643a4fae1c7ff15d3 Mon Sep 17 00:00:00 2001 From: t00thpick1 Date: Sat, 2 Jan 2021 17:29:15 -0500 Subject: [PATCH 309/662] Use @NotNull in methods rather than @Nullable Separate safe external methods from internal only methods Remove unnecessary methods --- src/main/java/com/gmail/nossr50/mcMMO.java | 1 - .../nossr50/util/blockmeta/ChunkManager.java | 125 +--------------- .../nossr50/util/blockmeta/ChunkStore.java | 1 - .../util/blockmeta/HashChunkManager.java | 134 ++++-------------- .../util/blockmeta/NullChunkManager.java | 40 ++---- .../util/blockmeta/UserBlockTracker.java | 56 ++++++++ src/test/java/ChunkStoreTest.java | 18 ++- 7 files changed, 109 insertions(+), 266 deletions(-) create mode 100644 src/main/java/com/gmail/nossr50/util/blockmeta/UserBlockTracker.java diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index f3f6bb9ac..c956b65f4 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -345,7 +345,6 @@ public class mcMMO extends JavaPlugin { formulaManager.saveFormula(); holidayManager.saveAnniversaryFiles(); - placeStore.cleanUp(); // Cleanup empty metadata stores placeStore.closeAll(); } diff --git a/src/main/java/com/gmail/nossr50/util/blockmeta/ChunkManager.java b/src/main/java/com/gmail/nossr50/util/blockmeta/ChunkManager.java index 57c66a899..a0b61ba6f 100644 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/ChunkManager.java +++ b/src/main/java/com/gmail/nossr50/util/blockmeta/ChunkManager.java @@ -1,127 +1,10 @@ package com.gmail.nossr50.util.blockmeta; import org.bukkit.World; -import org.bukkit.block.Block; -import org.bukkit.block.BlockState; -import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.NotNull; -public interface ChunkManager { +public interface ChunkManager extends UserBlockTracker { void closeAll(); - - /** - * 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 - */ - void saveChunk(int cx, int cz, @Nullable 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 - */ - void chunkUnloaded(int cx, int cz, @Nullable World world); - - /** - * Save all ChunkletStores related to the given world - * - * @param world World to save - */ - void saveWorld(World world); - - /** - * Unload all ChunkletStores from memory related to the given world after saving them - * - * @param world World to unload - */ - void unloadWorld(World world); - - /** - * Save all ChunkletStores - */ - void saveAll(); - - /** - * 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 - */ - boolean isTrue(int x, int y, int z, @Nullable 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 - */ - boolean isTrue(@Nullable 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(@Nullable 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 - */ - void setTrue(int x, int y, int z, @Nullable 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 - */ - void setTrue(@Nullable 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 - */ - void setTrue(@Nullable 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 - */ - void setFalse(int x, int y, int z, @Nullable 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 - */ - void setFalse(@Nullable 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 - */ - void setFalse(@Nullable BlockState blockState); - - /** - * Delete any ChunkletStores that are empty - */ - void cleanUp(); + 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/ChunkStore.java b/src/main/java/com/gmail/nossr50/util/blockmeta/ChunkStore.java index df01b93ee..e21006628 100644 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/ChunkStore.java +++ b/src/main/java/com/gmail/nossr50/util/blockmeta/ChunkStore.java @@ -1,6 +1,5 @@ package com.gmail.nossr50.util.blockmeta; -import org.bukkit.World; import org.jetbrains.annotations.NotNull; import java.util.UUID; diff --git a/src/main/java/com/gmail/nossr50/util/blockmeta/HashChunkManager.java b/src/main/java/com/gmail/nossr50/util/blockmeta/HashChunkManager.java index f3023e0e3..f6d88665f 100644 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/HashChunkManager.java +++ b/src/main/java/com/gmail/nossr50/util/blockmeta/HashChunkManager.java @@ -1,6 +1,5 @@ package com.gmail.nossr50.util.blockmeta; -import com.gmail.nossr50.mcMMO; import org.bukkit.Bukkit; import org.bukkit.World; import org.bukkit.block.Block; @@ -8,13 +7,16 @@ import org.bukkit.block.BlockState; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.io.*; +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 @NotNull HashMap regionMap = new HashMap<>(); // Tracks active regions - private final @NotNull HashMap> chunkUsageMap = new HashMap<>(); // Tracks active chunks by region - private final @NotNull HashMap chunkMap = new HashMap<>(); // Tracks active chunks + 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() { @@ -23,7 +25,10 @@ public class HashChunkManager implements ChunkManager { { if (!chunkStore.isDirty()) continue; - writeChunkStore(Bukkit.getWorld(chunkStore.getWorldId()), chunkStore); + World world = Bukkit.getWorld(chunkStore.getWorldId()); + if (world == null) + continue; // Oh well + writeChunkStore(world, chunkStore); } // Clear in memory chunks chunkMap.clear(); @@ -104,56 +109,12 @@ public class HashChunkManager implements ChunkManager { } @Override - public synchronized void saveChunk(int cx, int cz, @Nullable World world) { - if (world == null) - return; - - CoordinateKey chunkKey = toChunkKey(world.getUID(), cx, cz); - - ChunkStore out = chunkMap.get(chunkKey); - - if (out == null) - return; - - if (!out.isDirty()) - return; - - writeChunkStore(world, out); - } - - @Override - public synchronized void chunkUnloaded(int cx, int cz, @Nullable World world) { - if (world == null) - return; - + public synchronized void chunkUnloaded(int cx, int cz, @NotNull World world) { unloadChunk(cx, cz, world); } @Override - public synchronized void saveWorld(@Nullable World world) { - if (world == null) - return; - - UUID wID = world.getUID(); - - // Save all teh chunks - for (ChunkStore chunkStore : chunkMap.values()) { - if (!chunkStore.isDirty()) - continue; - if (!wID.equals(chunkStore.getWorldId())) - continue; - try { - writeChunkStore(world, chunkStore); - } - catch (Exception ignore) { } - } - } - - @Override - public synchronized void unloadWorld(@Nullable World world) { - if (world == null) - return; - + public synchronized void unloadWorld(@NotNull World world) { UUID wID = world.getUID(); // Save and remove all the chunks @@ -179,18 +140,7 @@ public class HashChunkManager implements ChunkManager { } } - @Override - public synchronized void saveAll() { - for (World world : mcMMO.p.getServer().getWorlds()) { - saveWorld(world); - } - } - - @Override - public synchronized boolean isTrue(int x, int y, int z, @Nullable World world) { - if (world == null) - return false; - + 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 @@ -216,67 +166,36 @@ public class HashChunkManager implements ChunkManager { } @Override - public synchronized boolean isTrue(@Nullable Block block) { - if (block == null) - return false; - + public synchronized boolean isTrue(@NotNull Block block) { return isTrue(block.getX(), block.getY(), block.getZ(), block.getWorld()); } @Override - public synchronized boolean isTrue(@Nullable BlockState blockState) { - if (blockState == null) - return false; - + public synchronized boolean isTrue(@NotNull BlockState blockState) { return isTrue(blockState.getX(), blockState.getY(), blockState.getZ(), blockState.getWorld()); } @Override - public synchronized void setTrue(int x, int y, int z, @Nullable World world) { - set(x, y, z, world, true); + public synchronized void setTrue(@NotNull Block block) { + set(block.getX(), block.getY(), block.getZ(), block.getWorld(), true); } @Override - public synchronized void setTrue(@Nullable Block block) { - if (block == null) - return; - - setTrue(block.getX(), block.getY(), block.getZ(), block.getWorld()); + public synchronized void setTrue(@NotNull BlockState blockState) { + set(blockState.getX(), blockState.getY(), blockState.getZ(), blockState.getWorld(), true); } @Override - public synchronized void setTrue(@Nullable BlockState blockState) { - if (blockState == null) - return; - - setTrue(blockState.getX(), blockState.getY(), blockState.getZ(), blockState.getWorld()); + public synchronized void setFalse(@NotNull Block block) { + set(block.getX(), block.getY(), block.getZ(), block.getWorld(), false); } @Override - public synchronized void setFalse(int x, int y, int z, @Nullable World world) { - set(x, y, z, world, false); + public synchronized void setFalse(@NotNull BlockState blockState) { + set(blockState.getX(), blockState.getY(), blockState.getZ(), blockState.getWorld(), false); } - @Override - public synchronized void setFalse(@Nullable Block block) { - if (block == null) - return; - - setFalse(block.getX(), block.getY(), block.getZ(), block.getWorld()); - } - - @Override - public synchronized void setFalse(@Nullable BlockState blockState) { - if (blockState == null) - return; - - setFalse(blockState.getX(), blockState.getY(), blockState.getZ(), blockState.getWorld()); - } - - public synchronized void set(int x, int y, int z, @Nullable World world, boolean value){ - if (world == null) - return; - + 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 @@ -350,7 +269,4 @@ public class HashChunkManager implements ChunkManager { return Objects.hash(worldID, x, z); } } - - @Override - public synchronized void cleanUp() {} } diff --git a/src/main/java/com/gmail/nossr50/util/blockmeta/NullChunkManager.java b/src/main/java/com/gmail/nossr50/util/blockmeta/NullChunkManager.java index b777fa349..203376780 100644 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/NullChunkManager.java +++ b/src/main/java/com/gmail/nossr50/util/blockmeta/NullChunkManager.java @@ -3,6 +3,7 @@ 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 { @@ -10,53 +11,30 @@ public class NullChunkManager implements ChunkManager { public void closeAll() {} @Override - public void saveChunk(int cx, int cz, World world) {} + public void chunkUnloaded(int cx, int cz, @NotNull World world) {} @Override - public void chunkUnloaded(int cx, int cz, World world) {} + public void unloadWorld(@NotNull World world) {} @Override - public void saveWorld(World world) {} - - @Override - public void unloadWorld(World world) {} - - @Override - public void saveAll() {} - - @Override - public boolean isTrue(int x, int y, int z, World world) { + public boolean isTrue(@NotNull Block block) { return false; } @Override - public boolean isTrue(Block block) { + public boolean isTrue(@NotNull BlockState blockState) { return false; } @Override - public boolean isTrue(BlockState blockState) { - return false; - } + public void setTrue(@NotNull Block block) {} @Override - public void setTrue(int x, int y, int z, World world) {} + public void setTrue(@NotNull BlockState blockState) {} @Override - public void setTrue(Block block) {} + public void setFalse(@NotNull 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() {} + public void setFalse(@NotNull BlockState blockState) {} } 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/test/java/ChunkStoreTest.java b/src/test/java/ChunkStoreTest.java index 43f105bad..8a090dfaf 100644 --- a/src/test/java/ChunkStoreTest.java +++ b/src/test/java/ChunkStoreTest.java @@ -2,6 +2,7 @@ import com.gmail.nossr50.util.blockmeta.*; 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.*; import org.junit.runner.RunWith; @@ -141,9 +142,20 @@ public class ChunkStoreTest { @Test public void testRegressionChunkMirrorBug() { ChunkManager chunkManager = new HashChunkManager(); - chunkManager.setTrue(15,0,15, mockWorld); - chunkManager.setFalse(-15, 0, -15, mockWorld); - Assert.assertTrue(chunkManager.isTrue(15, 0, 15, mockWorld)); + Block mockBlockA = 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 = 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); + Assert.assertTrue(chunkManager.isTrue(mockBlockA)); } private interface Delegate { From cddf6195185396f56985481a871177e4549f98cb Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sat, 2 Jan 2021 15:01:29 -0800 Subject: [PATCH 310/662] dev mode --- Changelog.txt | 4 ++++ pom.xml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index 00979b96a..5a72330a5 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,7 @@ +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) + Version 2.1.167 Fixed a serious dupe bug Add McMMOPlayerPreXpGainEvent event for plugins to modify given exp (thanks electronicboy) diff --git a/pom.xml b/pom.xml index 49d76da30..6dce9e08b 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.167 + 2.1.168-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO From eff016c0a63acd95fef36133e45c021d92c320bd Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sat, 2 Jan 2021 15:27:51 -0800 Subject: [PATCH 311/662] More nullability in blockmeta classes --- .../util/blockmeta/BitSetChunkStore.java | 25 ++++++++++--------- .../util/blockmeta/HashChunkManager.java | 4 +-- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/util/blockmeta/BitSetChunkStore.java b/src/main/java/com/gmail/nossr50/util/blockmeta/BitSetChunkStore.java index a04ed501b..c378d7489 100644 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/BitSetChunkStore.java +++ b/src/main/java/com/gmail/nossr50/util/blockmeta/BitSetChunkStore.java @@ -3,6 +3,7 @@ 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; @@ -15,9 +16,9 @@ public class BitSetChunkStore implements ChunkStore { private final int cx; private final int cz; private final int worldHeight; - private final UUID worldUid; + 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 BitSet store; + private final @NotNull BitSet store; private transient boolean dirty = false; @@ -94,7 +95,7 @@ public class BitSetChunkStore implements ChunkStore { return (z * 16 + x) + (256 * y); } - private static int getWorldHeight(UUID worldUid, int storedWorldHeight) + private static int getWorldHeight(@NotNull UUID worldUid, int storedWorldHeight) { World world = Bukkit.getWorld(worldUid); @@ -105,7 +106,7 @@ public class BitSetChunkStore implements ChunkStore { return world.getMaxHeight(); } - private void serialize(DataOutputStream out) throws IOException { + private void serialize(@NotNull DataOutputStream out) throws IOException { out.writeInt(MAGIC_NUMBER); out.writeInt(CURRENT_VERSION); @@ -123,7 +124,7 @@ public class BitSetChunkStore implements ChunkStore { dirty = false; } - private static BitSetChunkStore deserialize(@NotNull DataInputStream in) throws IOException { + 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(); @@ -187,7 +188,7 @@ public class BitSetChunkStore implements ChunkStore { throw new IOException("Bad Data Format"); } - public static void writeChunkStore(DataOutputStream outputStream, ChunkStore chunkStore) throws IOException { + 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); @@ -209,12 +210,12 @@ public class BitSetChunkStore implements ChunkStore { private LegacyChunkStoreDeserializer() {} @Deprecated - private void writeObject(ObjectOutputStream out) throws IOException { + private void writeObject(@NotNull ObjectOutputStream out) throws IOException { throw new UnsupportedOperationException("You goofed."); } @Deprecated - private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { + private void readObject(@NotNull ObjectInputStream in) throws IOException, ClassNotFoundException { in.readInt(); // Magic number in.readInt(); // Format version long lsb = in.readLong(); @@ -228,7 +229,7 @@ public class BitSetChunkStore implements ChunkStore { worldHeight = store[0][0].length; } - public BitSetChunkStore convert() + public @NotNull BitSetChunkStore convert() { int currentWorldHeight = getWorldHeight(worldUid, worldHeight); @@ -249,20 +250,20 @@ public class BitSetChunkStore implements ChunkStore { } - public LegacyDeserializationInputStream(InputStream in) throws IOException { + public LegacyDeserializationInputStream(@NotNull InputStream in) throws IOException { super(in); enableResolveObject(true); } @Override - protected ObjectStreamClass readClassDescriptor() throws IOException, ClassNotFoundException { + 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 ChunkStore readLegacyChunkStore(){ + public @Nullable ChunkStore readLegacyChunkStore(){ try { LegacyChunkStoreDeserializer deserializer = (LegacyChunkStoreDeserializer)readObject(); return deserializer.convert(); diff --git a/src/main/java/com/gmail/nossr50/util/blockmeta/HashChunkManager.java b/src/main/java/com/gmail/nossr50/util/blockmeta/HashChunkManager.java index f6d88665f..95397f89d 100644 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/HashChunkManager.java +++ b/src/main/java/com/gmail/nossr50/util/blockmeta/HashChunkManager.java @@ -65,7 +65,7 @@ public class HashChunkManager implements ChunkManager { } } - private synchronized @Nullable McMMOSimpleRegionFile getSimpleRegionFile(World world, int cx, int cz, boolean createIfAbsent) { + private synchronized @Nullable McMMOSimpleRegionFile getSimpleRegionFile(@NotNull World world, int cx, int cz, boolean createIfAbsent) { CoordinateKey regionKey = toRegionKey(world.getUID(), cx, cz); return regionMap.computeIfAbsent(regionKey, k -> { @@ -80,7 +80,7 @@ public class HashChunkManager implements ChunkManager { }); } - private @Nullable ChunkStore loadChunk(int cx, int cz, World world) { + private @Nullable ChunkStore loadChunk(int cx, int cz, @NotNull World world) { try { return readChunkStore(world, cx, cz); } From 05f07c174bb93956a1677e6f9b124cae67109806 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sat, 2 Jan 2021 15:30:00 -0800 Subject: [PATCH 312/662] Change readChunkStore to Nullable --- .../java/com/gmail/nossr50/util/blockmeta/BitSetChunkStore.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gmail/nossr50/util/blockmeta/BitSetChunkStore.java b/src/main/java/com/gmail/nossr50/util/blockmeta/BitSetChunkStore.java index c378d7489..63f08d228 100644 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/BitSetChunkStore.java +++ b/src/main/java/com/gmail/nossr50/util/blockmeta/BitSetChunkStore.java @@ -161,7 +161,7 @@ public class BitSetChunkStore implements ChunkStore { public static final short STREAM_MAGIC = (short)0xACDC; // Rock on - public static @NotNull ChunkStore readChunkStore(DataInputStream inputStream) throws IOException { + public static @Nullable ChunkStore readChunkStore(DataInputStream inputStream) throws IOException { if (inputStream.markSupported()) inputStream.mark(2); short magicNumber = inputStream.readShort(); From 26ef4cc4110ed4fef2c942a7f49d3cd63800545a Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sat, 2 Jan 2021 15:55:37 -0800 Subject: [PATCH 313/662] More nullability annotations --- .../util/blockmeta/BitSetChunkStore.java | 2 +- src/test/java/ChunkStoreTest.java | 24 +++++++++---------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/util/blockmeta/BitSetChunkStore.java b/src/main/java/com/gmail/nossr50/util/blockmeta/BitSetChunkStore.java index 63f08d228..272710aeb 100644 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/BitSetChunkStore.java +++ b/src/main/java/com/gmail/nossr50/util/blockmeta/BitSetChunkStore.java @@ -161,7 +161,7 @@ public class BitSetChunkStore implements ChunkStore { public static final short STREAM_MAGIC = (short)0xACDC; // Rock on - public static @Nullable ChunkStore readChunkStore(DataInputStream inputStream) throws IOException { + public static @Nullable ChunkStore readChunkStore(@NotNull DataInputStream inputStream) throws IOException { if (inputStream.markSupported()) inputStream.mark(2); short magicNumber = inputStream.readShort(); diff --git a/src/test/java/ChunkStoreTest.java b/src/test/java/ChunkStoreTest.java index 8a090dfaf..2290ee103 100644 --- a/src/test/java/ChunkStoreTest.java +++ b/src/test/java/ChunkStoreTest.java @@ -4,6 +4,7 @@ import org.bukkit.Bukkit; import org.bukkit.World; import org.bukkit.block.Block; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.junit.*; import org.junit.runner.RunWith; import org.mockito.Mockito; @@ -162,7 +163,7 @@ public class ChunkStoreTest { void run(); } - private void assertThrows(Delegate delegate, Class clazz) { + private void assertThrows(@NotNull Delegate delegate, @NotNull Class clazz) { try { delegate.run(); Assert.fail(); // We didn't throw @@ -183,7 +184,7 @@ public class ChunkStoreTest { Assert.assertTrue(expected.isTrue(x, y, z) == actual.isTrue(x, y, z)); } - private static void recursiveDelete(File directoryToBeDeleted) { + private static void recursiveDelete(@NotNull File directoryToBeDeleted) { if (directoryToBeDeleted.isDirectory()) { for (File file : directoryToBeDeleted.listFiles()) { recursiveDelete(file); @@ -192,7 +193,7 @@ public class ChunkStoreTest { directoryToBeDeleted.delete(); } - private static byte[] serializeChunkstore(ChunkStore chunkStore) throws IOException { + private static byte[] serializeChunkstore(@NotNull ChunkStore chunkStore) throws IOException { ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); if (chunkStore instanceof BitSetChunkStore) BitSetChunkStore.Serialization.writeChunkStore(new DataOutputStream(byteArrayOutputStream), chunkStore); @@ -201,18 +202,17 @@ public class ChunkStoreTest { 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 int cx; - private int cz; - private UUID worldUid; + private final int cx; + private final int cz; + private final @NotNull UUID worldUid; - public LegacyChunkStore(World world, int cx, int cz) { + public LegacyChunkStore(@NotNull World world, int cx, int cz) { this.cx = cx; this.cz = cz; this.worldUid = world.getUID(); @@ -287,7 +287,7 @@ public class ChunkStoreTest { return true; } - private void writeObject(ObjectOutputStream out) throws IOException { + private void writeObject(@NotNull ObjectOutputStream out) throws IOException { out.writeInt(MAGIC_NUMBER); out.writeInt(CURRENT_VERSION); @@ -300,18 +300,18 @@ public class ChunkStoreTest { dirty = false; } - private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { + private void readObject(@NotNull ObjectInputStream in) throws IOException, ClassNotFoundException { throw new UnsupportedOperationException(); } } private static class UnitTestObjectOutputStream extends ObjectOutputStream { - public UnitTestObjectOutputStream(OutputStream outputStream) throws IOException { + public UnitTestObjectOutputStream(@NotNull OutputStream outputStream) throws IOException { super(outputStream); } @Override - public void writeUTF(String str) throws IOException { + 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"; From 00a6d527178cfa2cb4ec400b8ffe35537bcb8117 Mon Sep 17 00:00:00 2001 From: t00thpick1 Date: Sat, 2 Jan 2021 18:57:51 -0500 Subject: [PATCH 314/662] Refactor region file loading for better nullability analysis --- .../util/blockmeta/HashChunkManager.java | 32 +++++++++++++------ 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/util/blockmeta/HashChunkManager.java b/src/main/java/com/gmail/nossr50/util/blockmeta/HashChunkManager.java index 95397f89d..6bc87ae30 100644 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/HashChunkManager.java +++ b/src/main/java/com/gmail/nossr50/util/blockmeta/HashChunkManager.java @@ -38,9 +38,9 @@ public class HashChunkManager implements ChunkManager { rf.close(); regionMap.clear(); } - + private synchronized @Nullable ChunkStore readChunkStore(@NotNull World world, int cx, int cz) throws IOException { - McMMOSimpleRegionFile rf = getSimpleRegionFile(world, cx, cz, false); + 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 @@ -54,7 +54,7 @@ public class HashChunkManager implements ChunkManager { if (!data.isDirty()) return; // Don't save unchanged data try { - McMMOSimpleRegionFile rf = getSimpleRegionFile(world, data.getChunkX(), data.getChunkZ(), true); + McMMOSimpleRegionFile rf = getWriteableSimpleRegionFile(world, data.getChunkX(), data.getChunkZ()); try (DataOutputStream out = rf.getOutputStream(data.getChunkX(), data.getChunkZ())) { BitSetChunkStore.Serialization.writeChunkStore(out, data); } @@ -65,21 +65,33 @@ public class HashChunkManager implements ChunkManager { } } - private synchronized @Nullable McMMOSimpleRegionFile getSimpleRegionFile(@NotNull World world, int cx, int cz, boolean createIfAbsent) { + 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 worldRegionsDirectory = new File(world.getWorldFolder(), "mcmmo_regions"); - if (!createIfAbsent && !worldRegionsDirectory.isDirectory()) - return null; // Don't create the directory on read-only operations - worldRegionsDirectory.mkdirs(); // Ensure directory exists - File regionFile = new File(worldRegionsDirectory, "mcmmo_" + regionKey.x + "_" + regionKey.z + "_.mcm"); - if (!createIfAbsent && !regionFile.exists()) + 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); From 4fa3d913bfc9566f8e94a2d8a9d3f6eae0543439 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sat, 2 Jan 2021 16:15:04 -0800 Subject: [PATCH 315/662] More annotations for blockmeta.. again --- .../com/gmail/nossr50/util/blockmeta/HashChunkManager.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/util/blockmeta/HashChunkManager.java b/src/main/java/com/gmail/nossr50/util/blockmeta/HashChunkManager.java index 6bc87ae30..c1114130c 100644 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/HashChunkManager.java +++ b/src/main/java/com/gmail/nossr50/util/blockmeta/HashChunkManager.java @@ -240,15 +240,15 @@ public class HashChunkManager implements ChunkManager { cStore.set(ix, y, iz, value); } - private CoordinateKey blockCoordinateToChunkKey(@NotNull UUID worldUid, int x, int y, int z) { + private @NotNull CoordinateKey blockCoordinateToChunkKey(@NotNull UUID worldUid, int x, int y, int z) { return toChunkKey(worldUid, x >> 4, z >> 4); } - private CoordinateKey toChunkKey(@NotNull UUID worldUid, int cx, int cz){ + private @NotNull CoordinateKey toChunkKey(@NotNull UUID worldUid, int cx, int cz){ return new CoordinateKey(worldUid, cx, cz); } - private CoordinateKey toRegionKey(@NotNull UUID worldUid, int cx, int 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; From 597eb7f8dd1d862152d24e20dc0c8f1186adfee7 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sat, 2 Jan 2021 16:39:26 -0800 Subject: [PATCH 316/662] Tweaks to the random chance classes --- .../nossr50/skills/axes/AxesManager.java | 23 +-- .../nossr50/skills/swords/SwordsManager.java | 8 +- .../skills/unarmed/UnarmedManager.java | 9 +- .../util/random/RandomChanceExecution.java | 2 + .../util/random/RandomChanceSkill.java | 38 ++--- .../util/random/RandomChanceSkillStatic.java | 8 +- .../util/random/RandomChanceStatic.java | 3 +- .../nossr50/util/random/RandomChanceUtil.java | 146 ++++++------------ 8 files changed, 91 insertions(+), 146 deletions(-) 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 2a5d648b5..ead48f6d8 100644 --- a/src/main/java/com/gmail/nossr50/skills/axes/AxesManager.java +++ b/src/main/java/com/gmail/nossr50/skills/axes/AxesManager.java @@ -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,28 +33,28 @@ 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; @@ -68,7 +69,7 @@ public class AxesManager extends SkillManager { * Handle the effects of the Axe Mastery ability */ public double axeMastery() { - if (!RandomChanceUtil.isActivationSuccessful(SkillActivationType.ALWAYS_FIRES, SubSkillType.AXES_AXE_MASTERY, getPlayer(), mmoPlayer.getAttackStrength())) { + if (!RandomChanceUtil.isActivationSuccessful(SkillActivationType.ALWAYS_FIRES, SubSkillType.AXES_AXE_MASTERY, getPlayer())) { return 0; } @@ -82,7 +83,7 @@ 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(), mmoPlayer.getAttackStrength())) { + if (!RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.AXES_CRITICAL_STRIKES, getPlayer())) { return 0; } @@ -113,12 +114,12 @@ 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(), mmoPlayer.getAttackStrength())) { + if (RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_STATIC_CHANCE, SubSkillType.AXES_ARMOR_IMPACT, getPlayer())) { SkillUtils.handleDurabilityChange(armor, durabilityDamage, 1); } } @@ -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(), mmoPlayer.getAttackStrength())) { + if (!RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_STATIC_CHANCE, SubSkillType.AXES_GREATER_IMPACT, getPlayer())) { return 0; } @@ -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/swords/SwordsManager.java b/src/main/java/com/gmail/nossr50/skills/swords/SwordsManager.java index ebcc93993..1c3fa3766 100644 --- a/src/main/java/com/gmail/nossr50/skills/swords/SwordsManager.java +++ b/src/main/java/com/gmail/nossr50/skills/swords/SwordsManager.java @@ -62,7 +62,7 @@ public class SwordsManager extends SkillManager { */ public void ruptureCheck(@NotNull LivingEntity target) throws IllegalStateException { if(BleedTimerTask.isBleedOperationAllowed()) { - if (RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.SWORDS_RUPTURE, getPlayer(), this.mmoPlayer.getAttackStrength())) { + if (RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.SWORDS_RUPTURE, getPlayer())) { if (target instanceof Player) { Player defender = (Player) target; @@ -98,7 +98,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; @@ -128,7 +128,7 @@ public class SwordsManager extends SkillManager { * @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()); @@ -146,7 +146,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/unarmed/UnarmedManager.java b/src/main/java/com/gmail/nossr50/skills/unarmed/UnarmedManager.java index c20620cf8..73bf3dce9 100644 --- a/src/main/java/com/gmail/nossr50/skills/unarmed/UnarmedManager.java +++ b/src/main/java/com/gmail/nossr50/skills/unarmed/UnarmedManager.java @@ -25,6 +25,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 { @@ -70,7 +71,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; } @@ -101,8 +102,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(), mmoPlayer.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; } @@ -179,7 +180,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/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..67221a433 100644 --- a/src/main/java/com/gmail/nossr50/util/random/RandomChanceSkill.java +++ b/src/main/java/com/gmail/nossr50/util/random/RandomChanceSkill.java @@ -7,18 +7,19 @@ 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 @NotNull PrimarySkillType primarySkillType; + protected final @NotNull SubSkillType subSkillType; protected final double probabilityCap; protected final boolean isLucky; protected int skillLevel; protected double resultModifier; - public RandomChanceSkill(Player player, SubSkillType subSkillType, double resultModifier) - { + public RandomChanceSkill(@Nullable Player player, @NotNull SubSkillType subSkillType, double resultModifier) { this.primarySkillType = subSkillType.getParentSkill(); this.subSkillType = subSkillType; this.probabilityCap = RandomChanceUtil.LINEAR_CURVE_VAR; @@ -30,7 +31,7 @@ public class RandomChanceSkill implements RandomChanceExecution { this.skillLevel = 0; } - if(player != null) + if (player != null) isLucky = Permissions.lucky(player, primarySkillType); else isLucky = false; @@ -38,8 +39,7 @@ public class RandomChanceSkill implements RandomChanceExecution { this.resultModifier = resultModifier; } - public RandomChanceSkill(Player player, SubSkillType subSkillType) - { + public RandomChanceSkill(@Nullable Player player, @NotNull SubSkillType subSkillType) { this.primarySkillType = subSkillType.getParentSkill(); this.subSkillType = subSkillType; this.probabilityCap = RandomChanceUtil.LINEAR_CURVE_VAR; @@ -51,7 +51,7 @@ public class RandomChanceSkill implements RandomChanceExecution { this.skillLevel = 0; } - if(player != null) + if (player != null) isLucky = Permissions.lucky(player, primarySkillType); else isLucky = false; @@ -59,9 +59,8 @@ public class RandomChanceSkill implements RandomChanceExecution { this.resultModifier = 1.0D; } - public RandomChanceSkill(Player player, SubSkillType subSkillType, boolean hasCap) - { - if(hasCap) + public RandomChanceSkill(@Nullable Player player, @NotNull SubSkillType subSkillType, boolean hasCap) { + if (hasCap) this.probabilityCap = AdvancedConfig.getInstance().getMaximumProbability(subSkillType); else this.probabilityCap = RandomChanceUtil.LINEAR_CURVE_VAR; @@ -76,7 +75,7 @@ public class RandomChanceSkill implements RandomChanceExecution { this.skillLevel = 0; } - if(player != null) + if (player != null) isLucky = Permissions.lucky(player, primarySkillType); else isLucky = false; @@ -84,9 +83,8 @@ public class RandomChanceSkill implements RandomChanceExecution { this.resultModifier = 1.0D; } - public RandomChanceSkill(Player player, SubSkillType subSkillType, boolean hasCap, double resultModifier) - { - if(hasCap) + public RandomChanceSkill(@Nullable Player player, @NotNull SubSkillType subSkillType, boolean hasCap, double resultModifier) { + if (hasCap) this.probabilityCap = AdvancedConfig.getInstance().getMaximumProbability(subSkillType); else this.probabilityCap = RandomChanceUtil.LINEAR_CURVE_VAR; @@ -101,7 +99,7 @@ public class RandomChanceSkill implements RandomChanceExecution { this.skillLevel = 0; } - if(player != null) + if (player != null) isLucky = Permissions.lucky(player, primarySkillType); else isLucky = false; @@ -111,23 +109,25 @@ public class RandomChanceSkill implements RandomChanceExecution { /** * The subskill corresponding to this RandomChanceSkill + * * @return this subskill */ - public SubSkillType getSubSkill() { + public @NotNull SubSkillType getSubSkill() { return 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) { 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..ab5f33ecd 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,19 @@ 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, 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..3204a348d 100644 --- a/src/main/java/com/gmail/nossr50/util/random/RandomChanceStatic.java +++ b/src/main/java/com/gmail/nossr50/util/random/RandomChanceStatic.java @@ -5,8 +5,7 @@ public class RandomChanceStatic implements RandomChanceExecution { private final double probabilityCap; private final boolean isLucky; - public RandomChanceStatic(double xPos, boolean isLucky) - { + public RandomChanceStatic(double xPos, boolean isLucky) { this.xPos = xPos; this.probabilityCap = xPos; 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..885ff3a90 100644 --- a/src/main/java/com/gmail/nossr50/util/random/RandomChanceUtil.java +++ b/src/main/java/com/gmail/nossr50/util/random/RandomChanceUtil.java @@ -10,13 +10,14 @@ 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; @@ -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,36 +45,8 @@ 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) - { - case RANDOM_LINEAR_100_SCALE_WITH_CAP: - return checkRandomChanceExecutionSuccess(player, subSkillType, true); - 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) - { + public static double getActivationChance(@NotNull SkillActivationType skillActivationType, @NotNull SubSkillType subSkillType, @Nullable Player player) { + switch (skillActivationType) { case RANDOM_LINEAR_100_SCALE_WITH_CAP: return getRandomChanceExecutionSuccess(player, subSkillType, true); case RANDOM_STATIC_CHANCE: @@ -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,15 @@ 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 RandomChanceStatic randomChance) { double chanceOfSuccess = getChanceOfSuccess(randomChance.getXPos(), randomChance.getProbabilityCap(), LINEAR_CURVE_VAR); chanceOfSuccess = addLuck(randomChance.isLucky(), chanceOfSuccess); @@ -171,7 +142,7 @@ public class RandomChanceUtil return chanceOfSuccess; }*/ - private static double calculateChanceOfSuccess(RandomChanceSkill randomChance) { + private static double calculateChanceOfSuccess(@NotNull RandomChanceSkill randomChance) { double skillLevel = randomChance.getSkillLevel(); double maximumProbability = randomChance.getProbabilityCap(); double maximumBonusLevel = randomChance.getMaximumBonusLevelCap(); @@ -192,7 +163,7 @@ public class RandomChanceUtil return chanceOfSuccess; } - private static double calculateChanceOfSuccess(RandomChanceSkillStatic randomChance) { + private static double calculateChanceOfSuccess(@NotNull RandomChanceSkillStatic randomChance) { double chanceOfSuccess = getChanceOfSuccess(randomChance.getXPos(), 100, 100); //Add Luck @@ -207,27 +178,23 @@ 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 getRandomStaticChanceExecutionSuccess(@Nullable Player player, @NotNull SubSkillType subSkillType) { try { return getRandomChanceExecutionChance(new RandomChanceSkillStatic(getStaticRandomChance(subSkillType), player, subSkillType)); } catch (InvalidStaticChance invalidStaticChance) { @@ -238,29 +205,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,21 +233,15 @@ 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(); case AXES_GREATER_IMPACT: @@ -297,24 +253,12 @@ public class RandomChanceUtil } } - 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 boolean isActivationSuccessful(SkillActivationType skillActivationType, AbstractSubSkill abstractSubSkill, Player player) - { - return isActivationSuccessful(skillActivationType, abstractSubSkill.getSubSkillType(), player); - } - - public static String[] calculateAbilityDisplayValues(SkillActivationType skillActivationType, Player player, SubSkillType subSkillType) { + public static String @NotNull [] calculateAbilityDisplayValues(@NotNull SkillActivationType skillActivationType, @NotNull Player player, @NotNull SubSkillType subSkillType) { double successChance = getActivationChance(skillActivationType, subSkillType, player); String[] displayValues = new String[2]; @@ -326,7 +270,7 @@ public class RandomChanceUtil return displayValues; } - public static String[] calculateAbilityDisplayValuesStatic(Player player, PrimarySkillType primarySkillType, double chance) { + public static String @NotNull [] calculateAbilityDisplayValuesStatic(@NotNull Player player, @NotNull PrimarySkillType primarySkillType, double chance) { RandomChanceStatic rcs = new RandomChanceStatic(chance, false); double successChance = getRandomChanceExecutionChance(rcs); @@ -343,7 +287,7 @@ public class RandomChanceUtil return displayValues; } - public static String[] calculateAbilityDisplayValuesCustom(SkillActivationType skillActivationType, Player player, SubSkillType subSkillType, double multiplier) { + public static String @NotNull [] calculateAbilityDisplayValuesCustom(@NotNull SkillActivationType skillActivationType, @NotNull Player player, @NotNull SubSkillType subSkillType, double multiplier) { double successChance = getActivationChance(skillActivationType, subSkillType, player); successChance *= multiplier; //Currently only used for graceful roll String[] displayValues = new String[2]; @@ -358,17 +302,15 @@ public class RandomChanceUtil return displayValues; } - public static double addLuck(Player player, PrimarySkillType primarySkillType, double chance) - { - if(Permissions.lucky(player, primarySkillType)) + public static double addLuck(@NotNull Player player, @NotNull PrimarySkillType primarySkillType, double chance) { + if (Permissions.lucky(player, primarySkillType)) return chance * 1.333D; else return chance; } - public static double addLuck(boolean isLucky, double chance) - { - if(isLucky) + public static double addLuck(boolean isLucky, double chance) { + if (isLucky) return chance * 1.333D; else return chance; From 4aa17e61fc6b9d4e80912d22fb9e299f78e74ad7 Mon Sep 17 00:00:00 2001 From: t00thpick1 Date: Sat, 2 Jan 2021 20:38:27 -0500 Subject: [PATCH 317/662] More efficient acrobatics location memory class --- .../datatypes/BlockLocationHistory.java | 41 +++++++++++++ .../nossr50/datatypes/LimitedSizeList.java | 57 ------------------- .../skills/acrobatics/AcrobaticsManager.java | 6 +- 3 files changed, 44 insertions(+), 60 deletions(-) create mode 100644 src/main/java/com/gmail/nossr50/datatypes/BlockLocationHistory.java delete mode 100644 src/main/java/com/gmail/nossr50/datatypes/LimitedSizeList.java 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/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/skills/acrobatics/AcrobaticsManager.java b/src/main/java/com/gmail/nossr50/skills/acrobatics/AcrobaticsManager.java index ce8e6d93b..a4903e123 100644 --- a/src/main/java/com/gmail/nossr50/skills/acrobatics/AcrobaticsManager.java +++ b/src/main/java/com/gmail/nossr50/skills/acrobatics/AcrobaticsManager.java @@ -1,7 +1,7 @@ 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; @@ -28,13 +28,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 final long rollXPInterval = (1000 * 3); //1 Minute private long rollXPIntervalLengthen = (1000 * 10); //10 Seconds - private final LimitedSizeList fallLocationMap; + private final BlockLocationHistory fallLocationMap; public boolean hasFallenInLocationBefore(Location location) { From 9e2d5aada86efb09ebd9323471715210b4df131c Mon Sep 17 00:00:00 2001 From: t00thpick1 Date: Sat, 2 Jan 2021 20:38:35 -0500 Subject: [PATCH 318/662] Whitespace fix --- .../java/com/gmail/nossr50/util/blockmeta/HashChunkManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gmail/nossr50/util/blockmeta/HashChunkManager.java b/src/main/java/com/gmail/nossr50/util/blockmeta/HashChunkManager.java index c1114130c..5f38022d5 100644 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/HashChunkManager.java +++ b/src/main/java/com/gmail/nossr50/util/blockmeta/HashChunkManager.java @@ -38,7 +38,7 @@ public class HashChunkManager implements ChunkManager { 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) From a57e6d3bbeb13f02687c7523d72a408bdd7db625 Mon Sep 17 00:00:00 2001 From: t00thpick1 Date: Sat, 2 Jan 2021 20:53:25 -0500 Subject: [PATCH 319/662] Add unit test for BlockLocationHistory Move ChunkStoreTest to correct package --- .../datatypes/BlockLocationHistoryTest.java | 37 +++++++++++++++++++ .../util/blockmeta}/ChunkStoreTest.java | 4 +- 2 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 src/test/java/com/gmail/nossr50/datatypes/BlockLocationHistoryTest.java rename src/test/java/{ => com/gmail/nossr50/util/blockmeta}/ChunkStoreTest.java (99%) 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..5e9499a17 --- /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.Assert; +import org.junit.Test; + +public class BlockLocationHistoryTest { + @Test + public 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); + Assert.assertFalse(history.contains(locationA)); + Assert.assertTrue(history.contains(locationB)); + Assert.assertTrue(history.contains(locationC)); + } + + @Test + public 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); + Assert.assertTrue(history.contains(locationA)); + Assert.assertTrue(history.contains(locationB)); + history.add(locationB); + Assert.assertFalse(history.contains(locationA)); + } +} diff --git a/src/test/java/ChunkStoreTest.java b/src/test/java/com/gmail/nossr50/util/blockmeta/ChunkStoreTest.java similarity index 99% rename from src/test/java/ChunkStoreTest.java rename to src/test/java/com/gmail/nossr50/util/blockmeta/ChunkStoreTest.java index 2290ee103..5f1af96da 100644 --- a/src/test/java/ChunkStoreTest.java +++ b/src/test/java/com/gmail/nossr50/util/blockmeta/ChunkStoreTest.java @@ -1,10 +1,10 @@ -import com.gmail.nossr50.util.blockmeta.*; +package com.gmail.nossr50.util.blockmeta; + 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.jetbrains.annotations.Nullable; import org.junit.*; import org.junit.runner.RunWith; import org.mockito.Mockito; From 7931a095fe009bfe3f4f584017ad05616449335e Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sun, 3 Jan 2021 12:21:32 -0800 Subject: [PATCH 320/662] Add some tests for com.gmail.nossr50.util.random classes --- Changelog.txt | 2 + .../commands/experience/AddlevelsCommand.java | 2 +- .../commands/experience/AddxpCommand.java | 2 +- .../experience/ExperienceCommand.java | 2 +- .../commands/experience/MmoeditCommand.java | 2 +- .../experience/SkillresetCommand.java | 4 +- .../commands/hardcore/HardcoreCommand.java | 2 +- .../nossr50/commands/skills/SkillCommand.java | 6 +- .../commands/skills/SkillGuideCommand.java | 2 +- .../config/treasure/TreasureConfig.java | 1 - .../database/FlatfileDatabaseManager.java | 2 +- .../nossr50/datatypes/player/McMMOPlayer.java | 7 +- .../datatypes/skills/PrimarySkillType.java | 6 +- .../nossr50/listeners/PlayerListener.java | 2 +- .../nossr50/listeners/WorldListener.java | 4 - .../commands/McrankCommandDisplayTask.java | 2 +- .../commands/MctopCommandDisplayTask.java | 4 +- .../skills/herbalism/HerbalismManager.java | 1 - .../commands/CommandRegistrationManager.java | 2 +- .../util/experience/ExperienceBarManager.java | 2 +- .../util/random/RandomChanceSkill.java | 57 +++------ .../nossr50/util/random/RandomChanceUtil.java | 18 ++- .../util/scoreboards/ScoreboardManager.java | 4 +- .../gmail/nossr50/util/skills/PerksUtils.java | 1 - src/test/java/com/gmail/nossr50/TestUtil.java | 17 +++ .../util/blockmeta/ChunkStoreTest.java | 12 +- .../nossr50/util/random/RandomChanceTest.java | 116 ++++++++++++++++++ 27 files changed, 195 insertions(+), 87 deletions(-) create mode 100644 src/test/java/com/gmail/nossr50/TestUtil.java create mode 100644 src/test/java/com/gmail/nossr50/util/random/RandomChanceTest.java diff --git a/Changelog.txt b/Changelog.txt index 5a72330a5..e4c81a0c3 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,6 +1,8 @@ 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 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 6c736fd2c..8863ab524 100644 --- a/src/main/java/com/gmail/nossr50/commands/experience/AddlevelsCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/experience/AddlevelsCommand.java @@ -46,6 +46,6 @@ public class AddlevelsCommand extends ExperienceCommand { if(isSilent) return; - player.sendMessage(LocaleLoader.getString("Commands.addlevels.AwardSkill.1", value, skill.getName())); + player.sendMessage(LocaleLoader.getString("Commands.addlevels.AwardSkill.1", value, skill.getLocalizedName())); } } 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 03ad449bb..7799ef9af 100644 --- a/src/main/java/com/gmail/nossr50/commands/experience/AddxpCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/experience/AddxpCommand.java @@ -49,6 +49,6 @@ public class AddxpCommand extends ExperienceCommand { if(isSilent) return; - player.sendMessage(LocaleLoader.getString("Commands.addxp.AwardSkill", value, skill.getName())); + player.sendMessage(LocaleLoader.getString("Commands.addxp.AwardSkill", value, skill.getLocalizedName())); } } 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 2443e6d62..6ff0b93ed 100644 --- a/src/main/java/com/gmail/nossr50/commands/experience/ExperienceCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/experience/ExperienceCommand.java @@ -159,7 +159,7 @@ 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", skill.getLocalizedName(), playerName)); } } 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 9aa02b164..8ef5635e5 100644 --- a/src/main/java/com/gmail/nossr50/commands/experience/MmoeditCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/experience/MmoeditCommand.java @@ -52,6 +52,6 @@ public class MmoeditCommand extends ExperienceCommand { if(isSilent) return; - player.sendMessage(LocaleLoader.getString("Commands.mmoedit.Modified.1", skill.getName(), value)); + player.sendMessage(LocaleLoader.getString("Commands.mmoedit.Modified.1", skill.getLocalizedName(), 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 3df1976d9..091ccadca 100644 --- a/src/main/java/com/gmail/nossr50/commands/experience/SkillresetCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/experience/SkillresetCommand.java @@ -143,7 +143,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", skill.getLocalizedName())); } private boolean validateArguments(CommandSender sender, String skillName) { @@ -155,7 +155,7 @@ 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", skill.getLocalizedName(), playerName)); } } 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..2b78c5deb 100644 --- a/src/main/java/com/gmail/nossr50/commands/hardcore/HardcoreCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/hardcore/HardcoreCommand.java @@ -59,6 +59,6 @@ public class HardcoreCommand extends HardcoreModeCommand { 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()))); + mcMMO.p.getServer().broadcastMessage(LocaleLoader.getString("Hardcore.Mode." + (enable ? "Enabled" : "Disabled"), LocaleLoader.getString("Hardcore.DeathStatLoss.Name"), (skill == null ? "all skills" : skill.getLocalizedName()))); } } \ No newline at end of file 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 e550913fa..d7d5bc7df 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/SkillCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/SkillCommand.java @@ -45,7 +45,7 @@ public abstract class SkillCommand implements TabExecutor { public SkillCommand(PrimarySkillType skill) { this.skill = skill; - skillName = skill.getName(); + skillName = skill.getLocalizedName(); skillGuideCommand = new SkillGuideCommand(skill); } @@ -173,10 +173,10 @@ public abstract class SkillCommand implements TabExecutor { { if(i+1 < parentList.size()) { - parentMessage.append(LocaleLoader.getString("Effects.Child.ParentList", parentList.get(i).getName(), mcMMOPlayer.getSkillLevel(parentList.get(i)))); + parentMessage.append(LocaleLoader.getString("Effects.Child.ParentList", parentList.get(i).getLocalizedName(), mcMMOPlayer.getSkillLevel(parentList.get(i)))); parentMessage.append(ChatColor.GRAY).append(", "); } else { - parentMessage.append(LocaleLoader.getString("Effects.Child.ParentList", parentList.get(i).getName(), mcMMOPlayer.getSkillLevel(parentList.get(i)))); + parentMessage.append(LocaleLoader.getString("Effects.Child.ParentList", parentList.get(i).getLocalizedName(), mcMMOPlayer.getSkillLevel(parentList.get(i)))); } } 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 a7879bb8d..f45ceadd3 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/SkillGuideCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/SkillGuideCommand.java @@ -18,7 +18,7 @@ public class SkillGuideCommand implements CommandExecutor { 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", skill.getLocalizedName()); guide = getGuide(skill); } 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 51e01307e..370f2baa3 100755 --- a/src/main/java/com/gmail/nossr50/config/treasure/TreasureConfig.java +++ b/src/main/java/com/gmail/nossr50/config/treasure/TreasureConfig.java @@ -8,7 +8,6 @@ import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.Tag; import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.entity.EntityType; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.PotionMeta; diff --git a/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java index 4c9753373..e9b5aafed 100644 --- a/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java @@ -919,7 +919,7 @@ public final class FlatfileDatabaseManager implements DatabaseManager { } int cap = Config.getInstance().getLevelCap(skill); if (Integer.parseInt(character[index]) > cap) { - mcMMO.p.getLogger().warning("Truncating " + skill.getName() + " to configured max level for player " + character[USERNAME]); + mcMMO.p.getLogger().warning("Truncating " + skill.getLocalizedName() + " to configured max level for player " + character[USERNAME]); character[index] = cap + ""; updated = true; } 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 cc5aebefe..85dd12fe4 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java +++ b/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java @@ -57,7 +57,6 @@ import com.gmail.nossr50.util.sounds.SoundManager; import com.gmail.nossr50.util.sounds.SoundType; import net.kyori.adventure.identity.Identified; import net.kyori.adventure.identity.Identity; -import org.apache.commons.lang.Validate; import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.Location; @@ -193,7 +192,7 @@ public class McMMOPlayer implements Identified { if(hasReachedPowerLevelCap()) { NotificationManager.sendPlayerInformationChatOnly(player, "LevelCap.PowerLevel", String.valueOf(Config.getInstance().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(Config.getInstance().getLevelCap(primarySkillType)), primarySkillType.getLocalizedName()); } //Updates from Party sources @@ -828,7 +827,7 @@ public class McMMOPlayer implements Identified { int diff = RankUtils.getSuperAbilityUnlockRequirement(skill.getAbility()) - getSkillLevel(skill); //Inform the player they are not yet skilled enough - NotificationManager.sendPlayerInformation(player, NotificationType.ABILITY_COOLDOWN, "Skills.AbilityGateRequirementFail", String.valueOf(diff), skill.getName()); + NotificationManager.sendPlayerInformation(player, NotificationType.ABILITY_COOLDOWN, "Skills.AbilityGateRequirementFail", String.valueOf(diff), skill.getLocalizedName()); return; } @@ -984,7 +983,7 @@ public class McMMOPlayer implements Identified { String allCDStr = aSuperAbilityCD + ", " + bSuperAbilityCD; NotificationManager.sendPlayerInformation(player, NotificationType.TOOL, "Skills.TooTired.Extra", - primarySkillType.getName(), + primarySkillType.getLocalizedName(), allCDStr); } 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 6acc8cf5d..f8e0afb5b 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/skills/PrimarySkillType.java +++ b/src/main/java/com/gmail/nossr50/datatypes/skills/PrimarySkillType.java @@ -234,10 +234,14 @@ public enum PrimarySkillType { return null; } - public String getName() { + public String getLocalizedName() { return StringUtils.getCapitalized(LocaleLoader.getString(StringUtils.getCapitalized(this.toString()) + ".SkillName")); } + public String getName() { + return StringUtils.getCapitalized(StringUtils.getCapitalized(this.toString())); + } + public boolean getPermissions(Player player) { return Permissions.skillEnabled(player, this); } diff --git a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java index b410a330d..81496c046 100644 --- a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java @@ -937,7 +937,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 = skill.getLocalizedName().toLowerCase(Locale.ENGLISH); if (lowerCaseCommand.equals(localizedName)) { event.setMessage(message.replace(command, skillName)); diff --git a/src/main/java/com/gmail/nossr50/listeners/WorldListener.java b/src/main/java/com/gmail/nossr50/listeners/WorldListener.java index 650a0e0cc..a08071a04 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; 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..a0e26d306 100644 --- a/src/main/java/com/gmail/nossr50/runnables/commands/McrankCommandDisplayTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/commands/McrankCommandDisplayTask.java @@ -53,7 +53,7 @@ public class McrankCommandDisplayTask extends BukkitRunnable { // } 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", skill.getLocalizedName(), (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..4901f6bb8 100644 --- a/src/main/java/com/gmail/nossr50/runnables/commands/MctopCommandDisplayTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/commands/MctopCommandDisplayTask.java @@ -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", skill.getLocalizedName())); } else { - sender.sendMessage(ChatColor.stripColor(LocaleLoader.getString("Commands.Skill.Leaderboard", skill.getName()))); + sender.sendMessage(ChatColor.stripColor(LocaleLoader.getString("Commands.Skill.Leaderboard", skill.getLocalizedName()))); } } 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 b997f9c89..72fc0e1bb 100644 --- a/src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java +++ b/src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java @@ -740,7 +740,6 @@ public class HerbalismManager extends SkillManager { return false; } - if (!playerInventory.containsAtLeast(seedStack, 1)) { return false; } 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 215c160d8..f072d2440 100644 --- a/src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java +++ b/src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java @@ -37,7 +37,7 @@ public final class CommandRegistrationManager { 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 = skill.getLocalizedName().toLowerCase(Locale.ENGLISH); PluginCommand command; 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 7a49a1260..22e14de09 100644 --- a/src/main/java/com/gmail/nossr50/util/experience/ExperienceBarManager.java +++ b/src/main/java/com/gmail/nossr50/util/experience/ExperienceBarManager.java @@ -149,7 +149,7 @@ public class ExperienceBarManager { private void informPlayer(@NotNull ExperienceBarManager.@NotNull XPBarSettingTarget settingTarget, @Nullable PrimarySkillType skillType) { //Inform player of setting change if(settingTarget != XPBarSettingTarget.RESET) { - NotificationManager.sendPlayerInformationChatOnlyPrefixed(mcMMOPlayer.getPlayer(), "Commands.XPBar.SettingChanged", skillType.getName(), settingTarget.toString()); + NotificationManager.sendPlayerInformationChatOnlyPrefixed(mcMMOPlayer.getPlayer(), "Commands.XPBar.SettingChanged", skillType.getLocalizedName(), settingTarget.toString()); } else { NotificationManager.sendPlayerInformationChatOnlyPrefixed(mcMMOPlayer.getPlayer(), "Commands.XPBar.Reset"); } 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 67221a433..c77a9e9a1 100644 --- a/src/main/java/com/gmail/nossr50/util/random/RandomChanceSkill.java +++ b/src/main/java/com/gmail/nossr50/util/random/RandomChanceSkill.java @@ -1,8 +1,6 @@ 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; @@ -11,109 +9,92 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; public class RandomChanceSkill implements RandomChanceExecution { - - protected final @NotNull PrimarySkillType primarySkillType; - protected final @NotNull 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(@Nullable Player player, @NotNull SubSkillType subSkillType, double resultModifier) { - this.primarySkillType = subSkillType.getParentSkill(); - this.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); + isLucky = Permissions.lucky(player, subSkillType.getParentSkill()); else isLucky = false; this.resultModifier = resultModifier; + this.maximumBonusLevelCap = RandomChanceUtil.getMaxBonusLevelCap(subSkillType); } public RandomChanceSkill(@Nullable Player player, @NotNull SubSkillType subSkillType) { - this.primarySkillType = subSkillType.getParentSkill(); - this.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); + isLucky = Permissions.lucky(player, subSkillType.getParentSkill()); else isLucky = false; this.resultModifier = 1.0D; + this.maximumBonusLevelCap = RandomChanceUtil.getMaxBonusLevelCap(subSkillType); } public RandomChanceSkill(@Nullable Player player, @NotNull SubSkillType subSkillType, boolean hasCap) { if (hasCap) - this.probabilityCap = AdvancedConfig.getInstance().getMaximumProbability(subSkillType); + 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 = Permissions.lucky(player, subSkillType.getParentSkill()); else isLucky = false; 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 = AdvancedConfig.getInstance().getMaximumProbability(subSkillType); + 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 = Permissions.lucky(player, subSkillType.getParentSkill()); else isLucky = false; this.resultModifier = resultModifier; - } - - /** - * The subskill corresponding to this RandomChanceSkill - * - * @return this subskill - */ - public @NotNull SubSkillType getSubSkill() { - return subSkillType; + this.maximumBonusLevelCap = RandomChanceUtil.getMaxBonusLevelCap(subSkillType); } /** @@ -142,7 +123,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 +154,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/RandomChanceUtil.java b/src/main/java/com/gmail/nossr50/util/random/RandomChanceUtil.java index 885ff3a90..a6f27ef54 100644 --- a/src/main/java/com/gmail/nossr50/util/random/RandomChanceUtil.java +++ b/src/main/java/com/gmail/nossr50/util/random/RandomChanceUtil.java @@ -3,7 +3,6 @@ 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.util.EventUtils; @@ -20,6 +19,7 @@ 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 @@ -142,7 +142,7 @@ public class RandomChanceUtil { return chanceOfSuccess; }*/ - private static double calculateChanceOfSuccess(@NotNull RandomChanceSkill randomChance) { + public static double calculateChanceOfSuccess(@NotNull RandomChanceSkill randomChance) { double skillLevel = randomChance.getSkillLevel(); double maximumProbability = randomChance.getProbabilityCap(); double maximumBonusLevel = randomChance.getMaximumBonusLevelCap(); @@ -163,7 +163,7 @@ public class RandomChanceUtil { return chanceOfSuccess; } - private static double calculateChanceOfSuccess(@NotNull RandomChanceSkillStatic randomChance) { + public static double calculateChanceOfSuccess(@NotNull RandomChanceSkillStatic randomChance) { double chanceOfSuccess = getChanceOfSuccess(randomChance.getXPos(), 100, 100); //Add Luck @@ -304,15 +304,23 @@ public class RandomChanceUtil { public static double addLuck(@NotNull Player player, @NotNull PrimarySkillType primarySkillType, double chance) { if (Permissions.lucky(player, primarySkillType)) - return chance * 1.333D; + return chance * LUCKY_MODIFIER; else return chance; } public static double addLuck(boolean isLucky, double chance) { if (isLucky) - return chance * 1.333D; + return chance * LUCKY_MODIFIER; else return chance; } + + public static double getMaximumProbability(@NotNull SubSkillType subSkillType) { + return AdvancedConfig.getInstance().getMaximumProbability(subSkillType); + } + + public static double getMaxBonusLevelCap(@NotNull SubSkillType subSkillType) { + return AdvancedConfig.getInstance().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 ad32306ae..119138ca6 100644 --- a/src/main/java/com/gmail/nossr50/util/scoreboards/ScoreboardManager.java +++ b/src/main/java/com/gmail/nossr50/util/scoreboards/ScoreboardManager.java @@ -93,7 +93,7 @@ public class ScoreboardManager { int i = 0; for (PrimarySkillType type : PrimarySkillType.values()) { // Include child skills - skillLabelBuilder.put(type, getShortenedName(colors.get(i) + type.getName(), false)); + skillLabelBuilder.put(type, getShortenedName(colors.get(i) + type.getLocalizedName(), false)); if (type.getAbility() != null) { abilityLabelBuilder.put(type.getAbility(), getShortenedName(colors.get(i) + type.getAbility().getLocalizedName())); @@ -115,7 +115,7 @@ public class ScoreboardManager { else { for (PrimarySkillType type : PrimarySkillType.values()) { // Include child skills - skillLabelBuilder.put(type, getShortenedName(ChatColor.GREEN + type.getName())); + skillLabelBuilder.put(type, getShortenedName(ChatColor.GREEN + type.getLocalizedName())); if (type.getAbility() != null) { abilityLabelBuilder.put(type.getAbility(), formatAbility(type.getAbility().getLocalizedName())); 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 588b944e1..1aa39105a 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/PerksUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/PerksUtils.java @@ -5,7 +5,6 @@ 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 org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.entity.Player; diff --git a/src/test/java/com/gmail/nossr50/TestUtil.java b/src/test/java/com/gmail/nossr50/TestUtil.java new file mode 100644 index 000000000..341bf4fc0 --- /dev/null +++ b/src/test/java/com/gmail/nossr50/TestUtil.java @@ -0,0 +1,17 @@ +package com.gmail.nossr50; + +import org.jetbrains.annotations.NotNull; + +import java.io.File; + +//TODO: Move generic test stuff here +public class TestUtil { + 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/blockmeta/ChunkStoreTest.java b/src/test/java/com/gmail/nossr50/util/blockmeta/ChunkStoreTest.java index 5f1af96da..450cd7222 100644 --- a/src/test/java/com/gmail/nossr50/util/blockmeta/ChunkStoreTest.java +++ b/src/test/java/com/gmail/nossr50/util/blockmeta/ChunkStoreTest.java @@ -1,5 +1,6 @@ package com.gmail.nossr50.util.blockmeta; +import com.gmail.nossr50.TestUtil; import com.google.common.io.Files; import org.bukkit.Bukkit; import org.bukkit.World; @@ -31,7 +32,7 @@ public class ChunkStoreTest { @AfterClass public static void tearDownClass() { - recursiveDelete(tempDir); + TestUtil.recursiveDelete(tempDir); } private World mockWorld; @@ -184,15 +185,6 @@ public class ChunkStoreTest { Assert.assertTrue(expected.isTrue(x, y, z) == actual.isTrue(x, y, z)); } - private static void recursiveDelete(@NotNull File directoryToBeDeleted) { - if (directoryToBeDeleted.isDirectory()) { - for (File file : directoryToBeDeleted.listFiles()) { - recursiveDelete(file); - } - } - directoryToBeDeleted.delete(); - } - private static byte[] serializeChunkstore(@NotNull ChunkStore chunkStore) throws IOException { ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); if (chunkStore instanceof BitSetChunkStore) 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..b6e2e51f8 --- /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); + } +} From 7ea6809fd39219129243d7d5b7e8d8eccd46b033 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sun, 3 Jan 2021 12:22:58 -0800 Subject: [PATCH 321/662] 2.1.168 --- Changelog.txt | 1 - pom.xml | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index e4c81a0c3..b30478c11 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -3,7 +3,6 @@ Version 2.1.168 (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) diff --git a/pom.xml b/pom.xml index 85553551c..7063867ce 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.168-SNAPSHOT + 2.1.168 mcMMO https://github.com/mcMMO-Dev/mcMMO From 888205fd897ceba50c3a2b2d4c6aeed02e8ce1bc Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 5 Jan 2021 12:04:48 -0800 Subject: [PATCH 322/662] Memory leak fix for arrow metadata --- Changelog.txt | 4 ++ pom.xml | 2 +- .../nossr50/listeners/EntityListener.java | 50 ++++++++++--------- .../skills/archery/ArcheryManager.java | 3 +- .../nossr50/util/skills/CombatUtils.java | 37 ++++++++++++++ 5 files changed, 70 insertions(+), 26 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index b30478c11..a8729e381 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,7 @@ +Version 2.1.169 + Fixed a few memory leaks involving arrows + Fixed mcMMO inappropriately assigning metadata to projectiles not fired from players + 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) diff --git a/pom.xml b/pom.xml index 7063867ce..38b03f6ff 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.168 + 2.1.169-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO diff --git a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java index 13c65f3ec..6fa4d13e4 100644 --- a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java @@ -123,24 +123,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(mcMMO.infiniteArrowKey, mcMMO.metadataValue); + } + + projectile.setMetadata(mcMMO.bowForceKey, new FixedMetadataValue(pluginRef, Math.min(event.getForce() * AdvancedConfig.getInstance().getForceMultiplier(), 1.0))); + projectile.setMetadata(mcMMO.arrowDistanceKey, new FixedMetadataValue(pluginRef, projectile.getLocation())); + //Cleanup metadata in 1 minute in case normal collection falls through + CombatUtils.cleanupArrowMetadata((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(pluginRef, Math.min(event.getForce() * AdvancedConfig.getInstance().getForceMultiplier(), 1.0))); - projectile.setMetadata(mcMMO.arrowDistanceKey, new FixedMetadataValue(pluginRef, projectile.getLocation())); } @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) @@ -164,6 +166,8 @@ public class EntityListener implements Listener { EntityType entityType = projectile.getType(); 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 + if(!projectile.hasMetadata(mcMMO.bowForceKey)) projectile.setMetadata(mcMMO.bowForceKey, new FixedMetadataValue(pluginRef, 1.0)); @@ -199,7 +203,6 @@ public class EntityListener implements Listener { 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 @@ -418,13 +421,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) { 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 fecbc9c8b..8ef8a0e1a 100644 --- a/src/main/java/com/gmail/nossr50/skills/archery/ArcheryManager.java +++ b/src/main/java/com/gmail/nossr50/skills/archery/ArcheryManager.java @@ -55,8 +55,7 @@ public class ArcheryManager extends SkillManager { public double distanceXpBonusMultiplier(LivingEntity target, Entity arrow) { //Hacky Fix - some plugins spawn arrows and assign them to players after the ProjectileLaunchEvent fires if(!arrow.hasMetadata(mcMMO.arrowDistanceKey)) - return arrow.getLocation().distance(target.getLocation()); - + return 1; Location firedLocation = (Location) arrow.getMetadata(mcMMO.arrowDistanceKey).get(0).value(); Location targetLocation = target.getLocation(); 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 1aaf6395f..716524762 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java @@ -25,16 +25,19 @@ import com.gmail.nossr50.util.compat.layers.persistentdata.MobMetaFlagType; 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.enchantments.Enchantment; import org.bukkit.entity.*; import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import org.bukkit.event.entity.EntityDamageEvent.DamageModifier; import org.bukkit.inventory.ItemStack; +import org.bukkit.metadata.FixedMetadataValue; import org.bukkit.metadata.MetadataValue; import org.bukkit.potion.PotionEffectType; import org.bukkit.projectiles.ProjectileSource; @@ -269,6 +272,7 @@ public final class CombatUtils { //Make sure the profiles been loaded if(mcMMOPlayer == null) { + cleanupArrowMetadata(arrow); return; } @@ -309,6 +313,8 @@ public final class CombatUtils { "Force Multiplier: "+forceMultiplier, "Initial Damage: "+initialDamage, "Final Damage: "+finalDamage); + //Clean data + cleanupArrowMetadata(arrow); } /** @@ -428,6 +434,9 @@ public final class CombatUtils { if (!Misc.isNPCEntityExcludingVillagers(player) && PrimarySkillType.ARCHERY.getPermissions(player)) { processArcheryCombat(target, player, event, arrow); + } else { + //Cleanup Arrow + cleanupArrowMetadata(arrow); } if (target.getType() != EntityType.CREEPER && !Misc.isNPCEntityExcludingVillagers(player) && PrimarySkillType.TAMING.getPermissions(player)) { @@ -1059,4 +1068,32 @@ public final class CombatUtils { attributeInstance.setBaseValue(normalSpeed * multiplier); } } + + /** + * Clean up metadata from a projectile + * + * @param entity projectile + */ + public static void cleanupArrowMetadata(@NotNull Projectile entity) { + if(entity.hasMetadata(mcMMO.infiniteArrowKey)) { + entity.removeMetadata(mcMMO.infiniteArrowKey, mcMMO.p); + } + + if(entity.hasMetadata(mcMMO.bowForceKey)) { + entity.removeMetadata(mcMMO.bowForceKey, mcMMO.p); + } + + if(entity.hasMetadata(mcMMO.arrowDistanceKey)) { + entity.removeMetadata(mcMMO.arrowDistanceKey, 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); + } } From dd07bcafc67750e35efced02771a03a7473c0e0d Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 5 Jan 2021 12:12:49 -0800 Subject: [PATCH 323/662] Disable random testing for now --- .../datatypes/skills/PrimarySkillType.java | 12 +- .../nossr50/util/random/RandomChanceTest.java | 232 +++++++++--------- 2 files changed, 122 insertions(+), 122 deletions(-) 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 f8e0afb5b..a2d958ad5 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/skills/PrimarySkillType.java +++ b/src/main/java/com/gmail/nossr50/datatypes/skills/PrimarySkillType.java @@ -95,11 +95,11 @@ public enum PrimarySkillType { nonChildSkills.add(skill); } - for(SubSkillType subSkillType : skill.subSkillTypes) - { + for(SubSkillType subSkillType : skill.subSkillTypes) { subSkillNames.add(subSkillType.getNiceNameNoSpaces(subSkillType)); } - names.add(skill.getName()); + + names.add(skill.getLocalizedName()); } Collections.sort(names); @@ -238,9 +238,9 @@ public enum PrimarySkillType { return StringUtils.getCapitalized(LocaleLoader.getString(StringUtils.getCapitalized(this.toString()) + ".SkillName")); } - public String getName() { - return StringUtils.getCapitalized(StringUtils.getCapitalized(this.toString())); - } +// public String getName() { +// return StringUtils.getCapitalized(StringUtils.getCapitalized(this.toString())); +// } public boolean getPermissions(Player player) { return Permissions.skillEnabled(player, this); diff --git a/src/test/java/com/gmail/nossr50/util/random/RandomChanceTest.java b/src/test/java/com/gmail/nossr50/util/random/RandomChanceTest.java index b6e2e51f8..f28e7e842 100644 --- a/src/test/java/com/gmail/nossr50/util/random/RandomChanceTest.java +++ b/src/test/java/com/gmail/nossr50/util/random/RandomChanceTest.java @@ -1,116 +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); - } -} +//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); +// } +//} From 7bc01571ee16b9af269089227730d1e981b21bdc Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 5 Jan 2021 12:13:44 -0800 Subject: [PATCH 324/662] Fix mctop on non-en_US locale Fixes #4372 --- Changelog.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/Changelog.txt b/Changelog.txt index a8729e381..8e3ac0d99 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,6 +1,7 @@ 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 Version 2.1.168 Fixed an IndexOutOfBoundsException error when trying to access UserBlockTracker from an invalid range (thanks t00thpick1) From 1c9592aba34b5b99e5c9f2d70f8cead081cecebf Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 5 Jan 2021 12:16:16 -0800 Subject: [PATCH 325/662] Always emulate lure bonus to avoid vanilla bugs Fixes #4359 --- Changelog.txt | 1 + .../java/com/gmail/nossr50/skills/fishing/FishingManager.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index 8e3ac0d99..67f40b344 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -2,6 +2,7 @@ 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) 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 ab597a8da..9298665c8 100644 --- a/src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java @@ -265,7 +265,7 @@ public class FishingManager extends SkillManager { int convertedLureBonus = 0; //This avoids a Minecraft bug where lure levels above 3 break fishing - if(lureLevel > 3) { + if(lureLevel > 0) { masterAnglerCompatibilityLayer.setApplyLure(fishHook, false); convertedLureBonus = lureLevel * 100; } From 0b8f4b47331496464e27f7b1060ddfb9c121efdd Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 5 Jan 2021 12:20:33 -0800 Subject: [PATCH 326/662] 2.1.169 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 38b03f6ff..c32445e7e 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.169-SNAPSHOT + 2.1.169 mcMMO https://github.com/mcMMO-Dev/mcMMO From ba7b6826b485bf8c25487173963eca6d4c109427 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 5 Jan 2021 15:25:39 -0800 Subject: [PATCH 327/662] 2.1.170 - papi fix --- Changelog.txt | 3 +++ pom.xml | 2 +- .../gmail/nossr50/commands/experience/AddlevelsCommand.java | 2 +- .../com/gmail/nossr50/commands/experience/AddxpCommand.java | 2 +- .../nossr50/commands/experience/ExperienceCommand.java | 2 +- .../gmail/nossr50/commands/experience/MmoeditCommand.java | 2 +- .../nossr50/commands/experience/SkillresetCommand.java | 4 ++-- .../gmail/nossr50/commands/hardcore/HardcoreCommand.java | 2 +- .../com/gmail/nossr50/commands/skills/SkillCommand.java | 6 +++--- .../gmail/nossr50/commands/skills/SkillGuideCommand.java | 2 +- .../com/gmail/nossr50/database/FlatfileDatabaseManager.java | 2 +- .../com/gmail/nossr50/datatypes/player/McMMOPlayer.java | 6 +++--- .../gmail/nossr50/datatypes/skills/PrimarySkillType.java | 4 ++-- .../java/com/gmail/nossr50/listeners/PlayerListener.java | 2 +- .../runnables/commands/McrankCommandDisplayTask.java | 2 +- .../nossr50/runnables/commands/MctopCommandDisplayTask.java | 4 ++-- .../nossr50/util/commands/CommandRegistrationManager.java | 2 +- .../gmail/nossr50/util/experience/ExperienceBarManager.java | 2 +- .../gmail/nossr50/util/scoreboards/ScoreboardManager.java | 4 ++-- 19 files changed, 29 insertions(+), 26 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 67f40b344..876cc1387 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,6 @@ +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 diff --git a/pom.xml b/pom.xml index c32445e7e..57b7bbd47 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.169 + 2.1.170 mcMMO https://github.com/mcMMO-Dev/mcMMO 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 8863ab524..6c736fd2c 100644 --- a/src/main/java/com/gmail/nossr50/commands/experience/AddlevelsCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/experience/AddlevelsCommand.java @@ -46,6 +46,6 @@ public class AddlevelsCommand extends ExperienceCommand { if(isSilent) return; - player.sendMessage(LocaleLoader.getString("Commands.addlevels.AwardSkill.1", value, skill.getLocalizedName())); + player.sendMessage(LocaleLoader.getString("Commands.addlevels.AwardSkill.1", value, skill.getName())); } } 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 7799ef9af..03ad449bb 100644 --- a/src/main/java/com/gmail/nossr50/commands/experience/AddxpCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/experience/AddxpCommand.java @@ -49,6 +49,6 @@ public class AddxpCommand extends ExperienceCommand { if(isSilent) return; - player.sendMessage(LocaleLoader.getString("Commands.addxp.AwardSkill", value, skill.getLocalizedName())); + player.sendMessage(LocaleLoader.getString("Commands.addxp.AwardSkill", value, skill.getName())); } } 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 6ff0b93ed..2443e6d62 100644 --- a/src/main/java/com/gmail/nossr50/commands/experience/ExperienceCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/experience/ExperienceCommand.java @@ -159,7 +159,7 @@ 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.getLocalizedName(), playerName)); + sender.sendMessage(LocaleLoader.getString("Commands.addlevels.AwardSkill.2", skill.getName(), playerName)); } } 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 8ef5635e5..9aa02b164 100644 --- a/src/main/java/com/gmail/nossr50/commands/experience/MmoeditCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/experience/MmoeditCommand.java @@ -52,6 +52,6 @@ public class MmoeditCommand extends ExperienceCommand { if(isSilent) return; - player.sendMessage(LocaleLoader.getString("Commands.mmoedit.Modified.1", skill.getLocalizedName(), value)); + player.sendMessage(LocaleLoader.getString("Commands.mmoedit.Modified.1", skill.getName(), 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 091ccadca..3df1976d9 100644 --- a/src/main/java/com/gmail/nossr50/commands/experience/SkillresetCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/experience/SkillresetCommand.java @@ -143,7 +143,7 @@ public class SkillresetCommand implements TabExecutor { } protected void handlePlayerMessageSkill(Player player, PrimarySkillType skill) { - player.sendMessage(LocaleLoader.getString("Commands.Reset.Single", skill.getLocalizedName())); + player.sendMessage(LocaleLoader.getString("Commands.Reset.Single", skill.getName())); } private boolean validateArguments(CommandSender sender, String skillName) { @@ -155,7 +155,7 @@ public class SkillresetCommand implements TabExecutor { sender.sendMessage(LocaleLoader.getString("Commands.addlevels.AwardAll.2", playerName)); } else { - sender.sendMessage(LocaleLoader.getString("Commands.addlevels.AwardSkill.2", skill.getLocalizedName(), playerName)); + sender.sendMessage(LocaleLoader.getString("Commands.addlevels.AwardSkill.2", skill.getName(), playerName)); } } 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 2b78c5deb..6375265b2 100644 --- a/src/main/java/com/gmail/nossr50/commands/hardcore/HardcoreCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/hardcore/HardcoreCommand.java @@ -59,6 +59,6 @@ public class HardcoreCommand extends HardcoreModeCommand { skill.setHardcoreStatLossEnabled(enable); } - mcMMO.p.getServer().broadcastMessage(LocaleLoader.getString("Hardcore.Mode." + (enable ? "Enabled" : "Disabled"), LocaleLoader.getString("Hardcore.DeathStatLoss.Name"), (skill == null ? "all skills" : skill.getLocalizedName()))); + 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 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 d7d5bc7df..e550913fa 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/SkillCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/SkillCommand.java @@ -45,7 +45,7 @@ public abstract class SkillCommand implements TabExecutor { public SkillCommand(PrimarySkillType skill) { this.skill = skill; - skillName = skill.getLocalizedName(); + skillName = skill.getName(); skillGuideCommand = new SkillGuideCommand(skill); } @@ -173,10 +173,10 @@ public abstract class SkillCommand implements TabExecutor { { if(i+1 < parentList.size()) { - parentMessage.append(LocaleLoader.getString("Effects.Child.ParentList", parentList.get(i).getLocalizedName(), mcMMOPlayer.getSkillLevel(parentList.get(i)))); + parentMessage.append(LocaleLoader.getString("Effects.Child.ParentList", parentList.get(i).getName(), mcMMOPlayer.getSkillLevel(parentList.get(i)))); parentMessage.append(ChatColor.GRAY).append(", "); } else { - parentMessage.append(LocaleLoader.getString("Effects.Child.ParentList", parentList.get(i).getLocalizedName(), mcMMOPlayer.getSkillLevel(parentList.get(i)))); + parentMessage.append(LocaleLoader.getString("Effects.Child.ParentList", parentList.get(i).getName(), mcMMOPlayer.getSkillLevel(parentList.get(i)))); } } 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 f45ceadd3..a7879bb8d 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/SkillGuideCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/SkillGuideCommand.java @@ -18,7 +18,7 @@ public class SkillGuideCommand implements CommandExecutor { private final String invalidPage = LocaleLoader.getString("Guides.Page.Invalid"); public SkillGuideCommand(PrimarySkillType skill) { - header = LocaleLoader.getString("Guides.Header", skill.getLocalizedName()); + header = LocaleLoader.getString("Guides.Header", skill.getName()); guide = getGuide(skill); } diff --git a/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java index e9b5aafed..4c9753373 100644 --- a/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java @@ -919,7 +919,7 @@ public final class FlatfileDatabaseManager implements DatabaseManager { } int cap = Config.getInstance().getLevelCap(skill); if (Integer.parseInt(character[index]) > cap) { - mcMMO.p.getLogger().warning("Truncating " + skill.getLocalizedName() + " to configured max level for player " + character[USERNAME]); + mcMMO.p.getLogger().warning("Truncating " + skill.getName() + " to configured max level for player " + character[USERNAME]); character[index] = cap + ""; updated = true; } 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 85dd12fe4..db72ffeec 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java +++ b/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java @@ -192,7 +192,7 @@ public class McMMOPlayer implements Identified { if(hasReachedPowerLevelCap()) { NotificationManager.sendPlayerInformationChatOnly(player, "LevelCap.PowerLevel", String.valueOf(Config.getInstance().getPowerLevelCap())); } else if(hasReachedLevelCap(primarySkillType)) { - NotificationManager.sendPlayerInformationChatOnly(player, "LevelCap.Skill", String.valueOf(Config.getInstance().getLevelCap(primarySkillType)), primarySkillType.getLocalizedName()); + NotificationManager.sendPlayerInformationChatOnly(player, "LevelCap.Skill", String.valueOf(Config.getInstance().getLevelCap(primarySkillType)), primarySkillType.getName()); } //Updates from Party sources @@ -827,7 +827,7 @@ public class McMMOPlayer implements Identified { int diff = RankUtils.getSuperAbilityUnlockRequirement(skill.getAbility()) - getSkillLevel(skill); //Inform the player they are not yet skilled enough - NotificationManager.sendPlayerInformation(player, NotificationType.ABILITY_COOLDOWN, "Skills.AbilityGateRequirementFail", String.valueOf(diff), skill.getLocalizedName()); + NotificationManager.sendPlayerInformation(player, NotificationType.ABILITY_COOLDOWN, "Skills.AbilityGateRequirementFail", String.valueOf(diff), skill.getName()); return; } @@ -983,7 +983,7 @@ public class McMMOPlayer implements Identified { String allCDStr = aSuperAbilityCD + ", " + bSuperAbilityCD; NotificationManager.sendPlayerInformation(player, NotificationType.TOOL, "Skills.TooTired.Extra", - primarySkillType.getLocalizedName(), + primarySkillType.getName(), allCDStr); } 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 a2d958ad5..0673db147 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/skills/PrimarySkillType.java +++ b/src/main/java/com/gmail/nossr50/datatypes/skills/PrimarySkillType.java @@ -99,7 +99,7 @@ public enum PrimarySkillType { subSkillNames.add(subSkillType.getNiceNameNoSpaces(subSkillType)); } - names.add(skill.getLocalizedName()); + names.add(skill.getName()); } Collections.sort(names); @@ -234,7 +234,7 @@ public enum PrimarySkillType { return null; } - public String getLocalizedName() { + public String getName() { return StringUtils.getCapitalized(LocaleLoader.getString(StringUtils.getCapitalized(this.toString()) + ".SkillName")); } diff --git a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java index 81496c046..b410a330d 100644 --- a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java @@ -937,7 +937,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.getLocalizedName().toLowerCase(Locale.ENGLISH); + String localizedName = skill.getName().toLowerCase(Locale.ENGLISH); if (lowerCaseCommand.equals(localizedName)) { event.setMessage(message.replace(command, skillName)); 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 a0e26d306..353e0ea04 100644 --- a/src/main/java/com/gmail/nossr50/runnables/commands/McrankCommandDisplayTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/commands/McrankCommandDisplayTask.java @@ -53,7 +53,7 @@ public class McrankCommandDisplayTask extends BukkitRunnable { // } rank = skills.get(skill); - sender.sendMessage(LocaleLoader.getString("Commands.mcrank.Skill", skill.getLocalizedName(), (rank == null ? LocaleLoader.getString("Commands.mcrank.Unranked") : rank))); + sender.sendMessage(LocaleLoader.getString("Commands.mcrank.Skill", skill.getName(), (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 4901f6bb8..664a1da10 100644 --- a/src/main/java/com/gmail/nossr50/runnables/commands/MctopCommandDisplayTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/commands/MctopCommandDisplayTask.java @@ -61,10 +61,10 @@ public class MctopCommandDisplayTask extends BukkitRunnable { } else { if(sender instanceof Player) { - sender.sendMessage(LocaleLoader.getString("Commands.Skill.Leaderboard", skill.getLocalizedName())); + sender.sendMessage(LocaleLoader.getString("Commands.Skill.Leaderboard", skill.getName())); } else { - sender.sendMessage(ChatColor.stripColor(LocaleLoader.getString("Commands.Skill.Leaderboard", skill.getLocalizedName()))); + sender.sendMessage(ChatColor.stripColor(LocaleLoader.getString("Commands.Skill.Leaderboard", skill.getName()))); } } 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 f072d2440..215c160d8 100644 --- a/src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java +++ b/src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java @@ -37,7 +37,7 @@ public final class CommandRegistrationManager { private static void registerSkillCommands() { for (PrimarySkillType skill : PrimarySkillType.values()) { String commandName = skill.toString().toLowerCase(Locale.ENGLISH); - String localizedName = skill.getLocalizedName().toLowerCase(Locale.ENGLISH); + String localizedName = skill.getName().toLowerCase(Locale.ENGLISH); PluginCommand command; 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 22e14de09..7a49a1260 100644 --- a/src/main/java/com/gmail/nossr50/util/experience/ExperienceBarManager.java +++ b/src/main/java/com/gmail/nossr50/util/experience/ExperienceBarManager.java @@ -149,7 +149,7 @@ public class ExperienceBarManager { private void informPlayer(@NotNull ExperienceBarManager.@NotNull XPBarSettingTarget settingTarget, @Nullable PrimarySkillType skillType) { //Inform player of setting change if(settingTarget != XPBarSettingTarget.RESET) { - NotificationManager.sendPlayerInformationChatOnlyPrefixed(mcMMOPlayer.getPlayer(), "Commands.XPBar.SettingChanged", skillType.getLocalizedName(), settingTarget.toString()); + NotificationManager.sendPlayerInformationChatOnlyPrefixed(mcMMOPlayer.getPlayer(), "Commands.XPBar.SettingChanged", skillType.getName(), settingTarget.toString()); } else { NotificationManager.sendPlayerInformationChatOnlyPrefixed(mcMMOPlayer.getPlayer(), "Commands.XPBar.Reset"); } 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 119138ca6..ad32306ae 100644 --- a/src/main/java/com/gmail/nossr50/util/scoreboards/ScoreboardManager.java +++ b/src/main/java/com/gmail/nossr50/util/scoreboards/ScoreboardManager.java @@ -93,7 +93,7 @@ public class ScoreboardManager { int i = 0; for (PrimarySkillType type : PrimarySkillType.values()) { // Include child skills - skillLabelBuilder.put(type, getShortenedName(colors.get(i) + type.getLocalizedName(), false)); + skillLabelBuilder.put(type, getShortenedName(colors.get(i) + type.getName(), false)); if (type.getAbility() != null) { abilityLabelBuilder.put(type.getAbility(), getShortenedName(colors.get(i) + type.getAbility().getLocalizedName())); @@ -115,7 +115,7 @@ public class ScoreboardManager { else { for (PrimarySkillType type : PrimarySkillType.values()) { // Include child skills - skillLabelBuilder.put(type, getShortenedName(ChatColor.GREEN + type.getLocalizedName())); + skillLabelBuilder.put(type, getShortenedName(ChatColor.GREEN + type.getName())); if (type.getAbility() != null) { abilityLabelBuilder.put(type.getAbility(), formatAbility(type.getAbility().getLocalizedName())); From 3cd09b886fe6c28280a1dd9ae9b2ce52bc0b2170 Mon Sep 17 00:00:00 2001 From: Enderaoe Date: Thu, 7 Jan 2021 02:24:16 +0800 Subject: [PATCH 328/662] Issue #4343 Axe can replant Cocoa (#4373) --- .../gmail/nossr50/skills/herbalism/HerbalismManager.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) 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 72fc0e1bb..d1d920359 100644 --- a/src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java +++ b/src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java @@ -687,7 +687,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; } @@ -736,6 +737,11 @@ public class HerbalismManager extends SkillManager { ItemStack seedStack = new ItemStack(seed); + 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; } From 801c2c83e2439836bbd8cd945a4d2d74763e3df9 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Wed, 6 Jan 2021 10:25:58 -0800 Subject: [PATCH 329/662] update pom and changelog --- Changelog.txt | 2 ++ pom.xml | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index 876cc1387..520a72476 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,5 @@ +Version 2.1.171 + Axes can now replant cocoa plants (thanks Lyther) Version 2.1.170 Reverted a change that broke compatibility with the mcMMO papi ecloud thingy diff --git a/pom.xml b/pom.xml index 57b7bbd47..835f0b229 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.170 + 2.1.171-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO From f38d92497a511bde33db3a6ad729a85a2662254b Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 7 Jan 2021 13:33:12 -0800 Subject: [PATCH 330/662] Add broadcasting when players reach certain level milestones (defaults to every 100 levels) --- Changelog.txt | 4 + .../commands/experience/AddlevelsCommand.java | 11 +- .../commands/experience/MmoeditCommand.java | 11 +- .../java/com/gmail/nossr50/config/Config.java | 8 ++ .../datatypes/LevelUpBroadcastPredicate.java | 100 ++++++++++++++++++ .../nossr50/datatypes/player/McMMOPlayer.java | 2 +- .../com/gmail/nossr50/util/EventUtils.java | 37 +++++++ .../util/player/NotificationManager.java | 43 ++++++++ src/main/resources/config.yml | 18 ++++ .../resources/locale/locale_en_US.properties | 3 +- 10 files changed, 233 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/gmail/nossr50/datatypes/LevelUpBroadcastPredicate.java diff --git a/Changelog.txt b/Changelog.txt index 520a72476..d3ce333d8 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,5 +1,9 @@ Version 2.1.171 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) + Added Level_Up_Chat_Broadcasts settings to config.yml under General + New locale string 'Broadcasts.LevelUpMilestone' + Version 2.1.170 Reverted a change that broke compatibility with the mcMMO papi ecloud thingy 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 6c736fd2c..af3b3366c 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,13 @@ 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.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,7 +32,14 @@ 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 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 9aa02b164..ac8405525 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,13 @@ 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.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,7 +38,14 @@ 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 diff --git a/src/main/java/com/gmail/nossr50/config/Config.java b/src/main/java/com/gmail/nossr50/config/Config.java index 9747d3acb..297ab3088 100644 --- a/src/main/java/com/gmail/nossr50/config/Config.java +++ b/src/main/java/com/gmail/nossr50/config/Config.java @@ -581,4 +581,12 @@ public class Config extends AutoUpdateConfigLoader { 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); } + } 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..8820f7742 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/datatypes/LevelUpBroadcastPredicate.java @@ -0,0 +1,100 @@ +package com.gmail.nossr50.datatypes; + +import com.gmail.nossr50.config.Config; +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(Config.getInstance().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(Config.getInstance().shouldLevelUpBroadcastsRestrictDistance()) { + if(!Misc.isNear(mmoBroadcastingPlayer.getPlayer().getLocation(), listeningPlayer.getLocation(), Config.getInstance().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 Config.getInstance().shouldLevelUpBroadcastToConsole(); + } + } + + private static boolean isLevelUpBroadcastsSameWorldOnly() { + return Config.getInstance().isLevelUpBroadcastsSameWorldOnly(); + } + + @Override + public String toString() { + return "LevelUpBroadcastPredicate{" + + "broadcaster=" + broadcaster + + '}'; + } +} 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 db72ffeec..fb68f24ea 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java +++ b/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java @@ -652,7 +652,7 @@ public class McMMOPlayer implements Identified { levelsGained++; } - if (EventUtils.tryLevelChangeEvent(player, primarySkillType, levelsGained, xpRemoved, true, xpGainReason)) { + if (EventUtils.tryLevelChangeEvent(this, primarySkillType, levelsGained, xpRemoved, true, xpGainReason)) { return; } diff --git a/src/main/java/com/gmail/nossr50/util/EventUtils.java b/src/main/java/com/gmail/nossr50/util/EventUtils.java index 52a2f989e..a928c7c82 100644 --- a/src/main/java/com/gmail/nossr50/util/EventUtils.java +++ b/src/main/java/com/gmail/nossr50/util/EventUtils.java @@ -32,6 +32,7 @@ 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 org.bukkit.block.Block; @@ -232,6 +233,24 @@ public final 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)); + } + } + + 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); @@ -248,6 +267,24 @@ public final 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)); + } + } + + return isCancelled; + } + /** * Simulate a block break event. * 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 b334566f2..5e20de087 100644 --- a/src/main/java/com/gmail/nossr50/util/player/NotificationManager.java +++ b/src/main/java/com/gmail/nossr50/util/player/NotificationManager.java @@ -2,6 +2,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.interactions.NotificationType; import com.gmail.nossr50.datatypes.notifications.SensitiveCommandType; import com.gmail.nossr50.datatypes.player.McMMOPlayer; @@ -19,14 +20,23 @@ 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 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 @@ -256,4 +266,37 @@ public class NotificationManager { return newArray; } + public static void processLevelUpBroadcasting(@NotNull McMMOPlayer mmoPlayer, @NotNull PrimarySkillType primarySkillType, int level) { + if(level <= 0) + return; + + //Check if broadcasting is enabled + if(Config.getInstance().shouldLevelUpBroadcasts()) { + int levelInterval = Config.getInstance().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(primarySkillType.getName()+" reached level "+level)).color(TextColor.fromHexString(HEX_BEIGE_COLOR)) + .asHoverEvent(); + + String localeMessage = LocaleLoader.getString("Broadcasts.LevelUpMilestone", mmoPlayer.getPlayer().getDisplayName(), level, primarySkillType.toString()); + Component message = Component.text(localeMessage).hoverEvent(levelMilestoneHover); + + audience.sendMessage(Identity.nil(), message); + } + } + } + + //TODO: Could cache + public static @NotNull LevelUpBroadcastPredicate getLevelUpBroadcastPredicate(@NotNull CommandSender levelUpPlayer) { + return new LevelUpBroadcastPredicate<>(levelUpPlayer); + } + } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 748d8a6ba..7e2d6b787 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -8,6 +8,24 @@ # 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 + # 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 diff --git a/src/main/resources/locale/locale_en_US.properties b/src/main/resources/locale/locale_en_US.properties index 9e98a9420..ae6616f7e 100644 --- a/src/main/resources/locale/locale_en_US.properties +++ b/src/main/resources/locale/locale_en_US.properties @@ -1135,4 +1135,5 @@ 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} \ No newline at end of file +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 [[DARK_AQUA]]{2}&7! \ No newline at end of file From ade6fb2c1d334ccb67a0ac8a6324f120ace7daf0 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 7 Jan 2021 13:36:54 -0800 Subject: [PATCH 331/662] Arrow dupe fix --- Changelog.txt | 1 + src/main/java/com/gmail/nossr50/listeners/EntityListener.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index d3ce333d8..cd1ed48f5 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,4 +1,5 @@ Version 2.1.171 + Fixed a bug where arrows shot by infinite bow enchant would duplicate 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) Added Level_Up_Chat_Broadcasts settings to config.yml under General diff --git a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java index 6fa4d13e4..ede2081e6 100644 --- a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java @@ -141,7 +141,7 @@ public class EntityListener implements Listener { projectile.setMetadata(mcMMO.bowForceKey, new FixedMetadataValue(pluginRef, Math.min(event.getForce() * AdvancedConfig.getInstance().getForceMultiplier(), 1.0))); projectile.setMetadata(mcMMO.arrowDistanceKey, new FixedMetadataValue(pluginRef, projectile.getLocation())); //Cleanup metadata in 1 minute in case normal collection falls through - CombatUtils.cleanupArrowMetadata((Projectile) projectile); + CombatUtils.delayArrowMetaCleanup((Projectile) projectile); } } From c64e693861b050b086b1b163dab007fb2c6df691 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 7 Jan 2021 13:39:28 -0800 Subject: [PATCH 332/662] Less capitals in broadcast msg --- Changelog.txt | 1 + .../java/com/gmail/nossr50/util/player/NotificationManager.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index cd1ed48f5..f047258a8 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,5 +1,6 @@ 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) Added Level_Up_Chat_Broadcasts settings to config.yml under General 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 5e20de087..94b00513b 100644 --- a/src/main/java/com/gmail/nossr50/util/player/NotificationManager.java +++ b/src/main/java/com/gmail/nossr50/util/player/NotificationManager.java @@ -286,7 +286,7 @@ public class NotificationManager { .append(Component.text(primarySkillType.getName()+" reached level "+level)).color(TextColor.fromHexString(HEX_BEIGE_COLOR)) .asHoverEvent(); - String localeMessage = LocaleLoader.getString("Broadcasts.LevelUpMilestone", mmoPlayer.getPlayer().getDisplayName(), level, primarySkillType.toString()); + String localeMessage = LocaleLoader.getString("Broadcasts.LevelUpMilestone", mmoPlayer.getPlayer().getDisplayName(), level, primarySkillType.getName()); Component message = Component.text(localeMessage).hoverEvent(levelMilestoneHover); audience.sendMessage(Identity.nil(), message); From cbbfcf655a3dae97ef597ec1f032ecb8bceab726 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 7 Jan 2021 13:48:15 -0800 Subject: [PATCH 333/662] 2.1.171 --- Changelog.txt | 17 ++++++++++++++++- pom.xml | 2 +- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index f047258a8..3fac58362 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -3,8 +3,23 @@ Version 2.1.171 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) - Added Level_Up_Chat_Broadcasts settings to config.yml under General 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 diff --git a/pom.xml b/pom.xml index 835f0b229..3258e5593 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.171-SNAPSHOT + 2.1.171 mcMMO https://github.com/mcMMO-Dev/mcMMO From fecaef8d96da546f84d4277fa0227d3710ffabb1 Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Mon, 11 Jan 2021 19:30:08 +0100 Subject: [PATCH 334/662] Updated german translations (#4375) * Updated german translations * Fixed line endings * Missed one --- .../resources/locale/locale_de.properties | 1959 +++++++++-------- 1 file changed, 1010 insertions(+), 949 deletions(-) diff --git a/src/main/resources/locale/locale_de.properties b/src/main/resources/locale/locale_de.properties index 108e9cb63..171aa90d0 100644 --- a/src/main/resources/locale/locale_de.properties +++ b/src/main/resources/locale/locale_de.properties @@ -1,1035 +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\u00E4higkeiten 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.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.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}% -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.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.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} +Anvil.SingleItemStack = &cDu kannst nicht mehrere Items gleichzeitig zerlegen oder reparieren, versuche es erstmal mit einem einzelnen Item. Anvil.Unbreakable = Dieses Item ist unzerst\u00F6rbar! -Archery.Listener = Bogenschie\u00DFen: -Archery.SkillName = Bogenschie\u00DFen +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.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 -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\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.Ability.Ready.Extra = &3Du &6hebst&3 deine Axt. [[GRAY]]({0} ist f\u00FCr {1}s pausiert) +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.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\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 -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\u00E4higkeit [[DARK_AQUA]]{2}&7 erreicht! + +Chat.Channel.Off = &6(&amcMMO-Chat&6) &7Deine Nachrichten werden nicht l\u00E4nger automatisch an die spezifischen Kan\u00E4le 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\u2192 &r{1} +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} + +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\u00E4rke (&aMaximal {0} Bl\u00F6cke&3) +Combat.BeastLoreHorseSpeed =&3Pferde-Laufgeschwindigkeit (&a{0} Bl\u00F6cke/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\u00E4ubt! +Combat.TouchedFuzzy = &a&o**Du wurdest ungl\u00FCcklich ber\u00FChrt, rin Schwindelgef\u00FChl 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.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.Cooldown = Du musst {0} Sekunden warten bis du diesen Befehl wieder ausf\u00FChren kannst! +Commands.Database.CooldownMS = Du musst {0}ms warten bis du diesen Befehl wieder ausf\u00FChren 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 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.mmocompat = Information about mcMMO and whether or not its in compatibility mode or fully functional. +Commands.Description.mmodebug = (De)aktiviere den Debugging-Modus, welcher n\u00FCtzliche Informationen ausgibt, wenn du einen Block schl\u00E4gst +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.mmoxpbar = Player settings for mcMMO XP bars +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.Mmodebug.Toggle = Der mcMMO Debugging-Modus ist nun &6{0}&7, benutze den Befehl erneut, um dies r\u00FCckg\u00E4ngig zu machen. Wenn der Debugging-Modus aktiviert wurde kannst du Bl\u00F6cke schlagen, um n\u00FCtzliche Informationen zu erhalten. Dies ist f\u00FCr den Support sehr n\u00FCtzlich. +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.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.3.XP = &cDie korrekte Verwendung /{0} {1} {2} {3}&7 (Du kannst auch -s an das Ende des Befehls hinzuf\u00FC"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\u00E4higkeit +Commands.Usage.XP = Erfahrung +Commands.XPBar.DisableAll = &6Alle mcMMO Erfahrungsleisten wurden deaktiviert, benutze /mmoxpbar reset um die Standardeinstellungen wiederherzustellen. +Commands.XPBar.Reset = &6Die Erfahrungsleisten-Einstellungen f\u00FCr mcMMO wurden zur\u00FCckgesetzt. +Commands.XPBar.SettingChanged = &6Die Erfahrungsleisten-Einstellungen f\u00FCr &a{0}&6 wurden gesetzt auf: &a{1} +Commands.XPBar.Usage = Proper usage is /mmoxpbar +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.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-Teleportierung - Anfragenbest\u00E4tigung &cdeaktiviert +Commands.ptp.AcceptAny.Enabled = Party-Teleportierung - Anfragenbest\u00E4tigung &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\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-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\u00FCr Skills 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 Bonuserfahrungs-Event f\u00FCr Skills hat begonnen! +Commands.xprate.started.1 = &6Die Erfahrungsrate f\u00FCr 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} - +Compatibility.Layer.PartialSupport = &6Diese Version besitzt keine vollst\u00E4ndige Unterst\u00FCtzung f\u00FCr &a{0}&6, jedoch verwendet mcMMO ein System, was die fehlenden Features versucht zu emulieren. +Compatibility.Layer.Unsupported = &6Diese Version von Minecraft ist nicht kompatibel mit &a{0}&6. + +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} +Effects.Template = &3{0}: &a{1} -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.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.Archaeology.Stat = Arch\u00E4ologie Erfahrungspunkte-Chance +Excavation.SubSkill.Archaeology.Stat.Extra = Arch\u00E4ologie Erfahrungspunkte-Anzahl Excavation.SubSkill.GigaDrillBreaker.Description = Dreifache Droprate, Dreifache Erfahrung und Bonus Geschwindigkeit. -Excavation.SubSkill.GigaDrillBreaker.Name = Gigabohrer -Excavation.SubSkill.GigaDrillBreaker.Stat = Gigabohrer Dauer +Excavation.SubSkill.GigaDrillBreaker.Name = Gigabohrer +Excavation.SubSkill.GigaDrillBreaker.Stat = Gigabohrer-Dauer -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.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 = &9Regen-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.Name = Superangel -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.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 = Fische k\u00F6nnen h\u00E4ufiger 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} seconds +Fishing.SubSkill.MasterAngler.Stat.Extra = Maximalwartezeit beim Angeln reduziert um: &a-{0} seconds +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} &bMythic: &e{5} +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}\n&9Selten: &e{2} &dEpisch: &e{3} &6Legend\u00E4r: &e{4} &bMythic: &e{5} -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.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. +Guides.Alchemy.Section.2 = &3Wie funktioniert Gebr\u00E4u?\n&eGebr\u00E4u 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\u00E4u 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\u00E4u Tier 2 Zutaten:\n&eKarotte (Eile)\n&eSchleimball (Langsamkeit)\n\n&3Gebr\u00E4u Tier 3 Zutaten:\n&eQuarz (Absoption)\n&eRoter Pilz (Springen) +Guides.Alchemy.Section.5 = &3Gebr\u00E4u Tier 4 Zutaten:\n&eApfel (Gesundheitsboost)\n&eVerrottetes Fleisch (Hunger)\n\n&3Gebr\u00E4u Tier 5 Zutaten:\n&eBrauner Pilz(\u00DCbelkeit)\n&eTintensack (Blindheit) +Guides.Alchemy.Section.6 = &3Gebr\u00E4u Tier 6 Zutaten:\n&eGras (S\u00E4ttigung)\n\n&3Gebr\u00E4u Tier 7 Zutaten:\n&eGiftige Kartoffel (Verwesung)\n\n&3Gebr\u00E4u 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\u00E4uterkunde\n&eIn Kr\u00E4uterkunde geht es um das Ernten.\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\u00E4uterkunde 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. -Hardcore.DeathStatLoss.Name = Skillverlust bei Tod: +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! +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! -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.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 +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 -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! +Holiday.Anniversary = &9Alles gute zu mcMMO's {0} j\u00E4hrigen Geburtstag!\n&9In Ehren von nossr50 und all den anderen flei\u00DFigen Entwicklern, hier ist 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.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.Stats = &amcMMO Stats f\u00FCr &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.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.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! -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.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 -MOTD.Donate = &3Spenden Info: +LevelCap.PowerLevel = &6(&amcMMO&6) &eDu hast das Level-Limit von &c{0}&e erreicht. Du kannst deine F\u00E4higkeiten nun nicht mehr weiter verbessern. +LevelCap.Skill = &6(&amcMMO&6) &eDu hast das Level-Limit von &c{0}&e f\u00FCr &6{1}&e erreicht. Du kannst diese F\u00E4higkeit von nun an nicht mehr weiter verbessern. + +Locale.Reloaded = &aDie Sprachdateien wurden neugeladen! + +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\u00DCberholungs 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.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.Cooldown = +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.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 -Overhaul.Levelup = &l{0} erh\u00F6ht auf &r&a&l{2}&r&f. -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] +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 + +Overhaul.Levelup = &l{0} erh\u00F6ht auf &r&a&l{2}&r&f. +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 = &c[| Overhaul.mcMMO.Url.Wrap.Suffix = &c|] -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.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. +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. 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\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 -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 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. +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. +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. + +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 = &3Arkanes Schmieden Chancen:&7 Erfolg &a{0}&7%, Verlust &c{1}&7% +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\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.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 +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 -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.Ability.Bonus.0 = Fortgeschrittenes Verwerten +Salvage.Ability.Bonus.1 = Max Ertrag {0} Item zerst\u00F6rt +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.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\u00FCckgewinnen. +Salvage.Skills.Success = &aItem verwertet! +Salvage.Skills.TooDamaged = &4Das Item ist zu besch\u00E4digt um verwertet zu werden. +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.ScrapCollector.Description = Verschrotte einen Gegenstand, um Materialien zur\u00FCckzugewinnen, eine perfekte Verschrottung erfordert Gl\u00FCck und Geschick. +Salvage.SubSkill.ScrapCollector.Name = Schrottsammler +Salvage.SubSkill.ScrapCollector.Stat = Schrottsammler: &aVerschrotte bis zu &e{0}&a Gegenst\u00E4nde. Hierbei spielt Gl\u00FCck eine gewisse Rolle. 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 +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\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 + +Server.ConsoleName = &e[Server] 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 = &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\u00FCde um diese F\u00E4higkeit zu verwenden. &e({0}s) +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.MaxXP = Max +Skills.NeedMore = &4Du brauchst mehr &7{0} +Skills.NeedMore.Extra = &4Du ben\u00F6tigst 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\u00FCde um diese F\u00E4higkeit zu verwenden. &e({0}s) +Skills.TooTired.Extra = &6{0} &eSuperf\u00E4higkeit CDs - {1} +Skills.TooTired.Named = [[GRAY]](&6{0}&e {1}s[[GRAY]]) -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.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 Ö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\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 +Smelting.SubSkill.UnderstandingTheArt.Name = Die Kunst des Bergbaus +Smelting.SubSkill.UnderstandingTheArt.Stat = Vanilla Erfahrungsmultiplikator: &e{0}x -Stats.Header.Combat = &6-=Kampfskills=- +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.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.SubSkill.SwordsLimitBreak.Name = \u00DCberwindung +Swords.SubSkill.SwordsLimitBreak.Stat = Bonus Schaden durch \u00DCberwindung -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.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.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.COTW.BreedingDisallowed = &a(Ruf der Wildnis) &cBeschworene Tiere k\u00F6nnen nicht gez\u00FCchtet 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\u00F6tigst &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\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.IronGrip.Description = Sch\u00FCtzt dich davor, entwaffnet zu werden +Unarmed.SubSkill.IronGrip.Name = Eisen Griff +Unarmed.SubSkill.IronGrip.Stat = Eisen Griff Chance +Unarmed.SubSkill.SteelArmStyle.Description = Verst\u00E4rkt deinen Arm mit der Zeit +Unarmed.SubSkill.SteelArmStyle.Name = St\u00E4hlerner 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 = \u00DCberwindung +Unarmed.SubSkill.UnarmedLimitBreak.Stat = Bonus Schaden durch \u00DCberwindung UpdateChecker.NewAvailable = Eine neue Version von mcMMO ist auf Spigot erh\u00E4ltlich! -UpdateChecker.Outdated = Du verwendest eine veraltete mcMMO Version! +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.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.HarvestLumber.Name = Doppel Drops +Woodcutting.SubSkill.HarvestLumber.Stat = Doppeldrop Chance +Woodcutting.SubSkill.KnockOnWood.Description = Zus\u00E4tliche Drops durch Baumf\u00E4ller +Woodcutting.SubSkill.KnockOnWood.Loot.Normal = Standard-Loot von B\u00E4umen +Woodcutting.SubSkill.KnockOnWood.Loot.Rank2 = Standard-Loot von B\u00E4umen und Erfahrungspunkte +Woodcutting.SubSkill.KnockOnWood.Name = Auf Holz geklopft +Woodcutting.SubSkill.KnockOnWood.Stat = Auf Holz geklopft +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.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 -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\u00DFen 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\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.Template = {0} +XPBar.Template.EarlyGameBoost = &6Du erlernst eine neue F\u00E4higkeit... +XPBar.Unarmed = Faustkampf Level: &6{0} +XPBar.Woodcutting = Holzf\u00E4llen 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\u00FCr 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\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.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. -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. +mcMMO.NoSkillNote = &8Wenn du keinen Zugriff auf einen Skill hast wird er hier nicht angezeigt. +mcMMO.Template.Prefix = &6(&amcMMO&6) &7{0} From f72497532f840ddf51757b0eb72458150188a102 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 11 Jan 2021 10:34:14 -0800 Subject: [PATCH 335/662] Fists should be fists --- Changelog.txt | 4 ++++ pom.xml | 2 +- src/main/resources/locale/locale_en_US.properties | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 3fac58362..aabab5afa 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,7 @@ +Version 2.1.172 + Updated german locale (thanks TheBusyBiscuit) + Changed Fists to not be capitalized (en_US) when lowering/readying berserk + 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 diff --git a/pom.xml b/pom.xml index 3258e5593..61acee27c 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.171 + 2.1.172-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO diff --git a/src/main/resources/locale/locale_en_US.properties b/src/main/resources/locale/locale_en_US.properties index ae6616f7e..450ea66aa 100644 --- a/src/main/resources/locale/locale_en_US.properties +++ b/src/main/resources/locale/locale_en_US.properties @@ -497,7 +497,7 @@ Unarmed.Ability.Bonus.1=+{0} DMG Upgrade Unarmed.Ability.IronGrip.Attacker=Your opponent has an iron grip! 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.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 From bd9794e744e2f4182c83b7aa0e26921f136337f4 Mon Sep 17 00:00:00 2001 From: Shane Freeder Date: Thu, 21 Jan 2021 12:09:24 +0000 Subject: [PATCH 336/662] Support calling SkillActivationPerkEvent off the main thread This event was never considered as to if it would be called off the main thread, this event should NOT be designed to signify that a skill activation is occuring, just providing a means to manipulate those values by other plugins, etc --- .../gmail/nossr50/events/skills/SkillActivationPerkEvent.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/gmail/nossr50/events/skills/SkillActivationPerkEvent.java b/src/main/java/com/gmail/nossr50/events/skills/SkillActivationPerkEvent.java index 89c41dd6f..36848e6fa 100644 --- a/src/main/java/com/gmail/nossr50/events/skills/SkillActivationPerkEvent.java +++ b/src/main/java/com/gmail/nossr50/events/skills/SkillActivationPerkEvent.java @@ -1,5 +1,6 @@ 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; @@ -16,7 +17,7 @@ public class SkillActivationPerkEvent extends Event { private final int maxTicks; public SkillActivationPerkEvent(Player player, int ticks, int maxTicks) { - + super(!Bukkit.isPrimaryThread()); this.player = player; this.ticks = ticks; this.maxTicks = maxTicks; From 2835c5fc5e4a50d01ad004ff0a3d251d8413189f Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 21 Jan 2021 14:07:58 -0800 Subject: [PATCH 337/662] update changelog --- Changelog.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/Changelog.txt b/Changelog.txt index aabab5afa..cd76655d7 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,6 +1,7 @@ Version 2.1.172 Updated german locale (thanks TheBusyBiscuit) Changed Fists to not be capitalized (en_US) when lowering/readying berserk + SkillActivationPerkEvent can now be called in async threads (thanks cat) Version 2.1.171 Fixed a bug where arrows shot by infinite bow enchant would duplicate From c44e28077386e163c470513fcb19851bff3aa990 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 21 Jan 2021 14:08:14 -0800 Subject: [PATCH 338/662] oh wait cat was not really his nickname... --- Changelog.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index cd76655d7..b06fda419 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,7 +1,7 @@ Version 2.1.172 Updated german locale (thanks TheBusyBiscuit) Changed Fists to not be capitalized (en_US) when lowering/readying berserk - SkillActivationPerkEvent can now be called in async threads (thanks cat) + SkillActivationPerkEvent can now be called in async threads (thanks electronicboy) Version 2.1.171 Fixed a bug where arrows shot by infinite bow enchant would duplicate From ac57615383b798485a472ec5e69fc51aff16bf2c Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 21 Jan 2021 14:19:50 -0800 Subject: [PATCH 339/662] Add setting to turn off knock on wood XP orb drops for Tree Feller --- Changelog.txt | 3 ++ .../gmail/nossr50/config/AdvancedConfig.java | 33 +------------------ .../woodcutting/WoodcuttingManager.java | 9 +++-- src/main/resources/advanced.yml | 23 ++----------- 4 files changed, 13 insertions(+), 55 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index b06fda419..8a20191a7 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -2,6 +2,9 @@ Version 2.1.172 Updated german locale (thanks TheBusyBiscuit) Changed Fists to not be capitalized (en_US) when lowering/readying berserk SkillActivationPerkEvent can now be called in async threads (thanks electronicboy) + 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 + Removed a few never implemented settings from Skills.Woodcutting.TreeFeller in advanced.yml Version 2.1.171 Fixed a bug where arrows shot by infinite bow enchant would duplicate diff --git a/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java b/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java index dce24a189..bb8f8167e 100644 --- a/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java +++ b/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java @@ -451,23 +451,6 @@ public class AdvancedConfig extends AutoUpdateConfigLoader { reason.add("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); } @@ -835,19 +818,5 @@ public class AdvancedConfig extends AutoUpdateConfigLoader { 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/skills/woodcutting/WoodcuttingManager.java b/src/main/java/com/gmail/nossr50/skills/woodcutting/WoodcuttingManager.java index 3162ce552..cb076c652 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,7 @@ package com.gmail.nossr50.skills.woodcutting; import com.gmail.nossr50.api.ItemSpawnReason; +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; @@ -306,9 +307,11 @@ public class WoodcuttingManager extends SkillManager { Misc.spawnItemsFromCollection(Misc.getBlockCenter(blockState), block.getDrops(), ItemSpawnReason.TREE_FELLER_DISPLACED_BLOCK); if(RankUtils.hasReachedRank(2, player, SubSkillType.WOODCUTTING_KNOCK_ON_WOOD)) { - if(RandomChanceUtil.rollDice(75, 100)) { - int randOrbCount = Math.max(1, Misc.getRandom().nextInt(20)); - Misc.spawnExperienceOrb(blockState.getLocation(), randOrbCount); + if(AdvancedConfig.getInstance().isKnockOnWoodXPOrbEnabled()) { + if(RandomChanceUtil.rollDice(75, 100)) { + int randOrbCount = Math.max(1, Misc.getRandom().nextInt(20)); + Misc.spawnExperienceOrb(blockState.getLocation(), randOrbCount); + } } } diff --git a/src/main/resources/advanced.yml b/src/main/resources/advanced.yml index 461d8979e..e9979909c 100644 --- a/src/main/resources/advanced.yml +++ b/src/main/resources/advanced.yml @@ -582,26 +582,9 @@ Skills: ### 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. From 4fea5438feda6644226d4daad815a195a7a4658f Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 21 Jan 2021 14:26:08 -0800 Subject: [PATCH 340/662] Move some permissions closer to the top --- src/main/resources/plugin.yml | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index f3dcec5c1..03dbf7856 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -185,6 +185,24 @@ 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.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. @@ -1298,23 +1316,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.chat.colors: 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 From 80a1b3949ec02e5e330035dbb5135cb6f4d29176 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 21 Jan 2021 14:31:11 -0800 Subject: [PATCH 341/662] Add permission node 'mcmmo.broadcast.levelup' for level up broadcasts --- Changelog.txt | 5 +++++ src/main/java/com/gmail/nossr50/util/Permissions.java | 1 + .../com/gmail/nossr50/util/player/NotificationManager.java | 7 ++++++- src/main/resources/plugin.yml | 3 +++ 4 files changed, 15 insertions(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index 8a20191a7..bba9f0b04 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,4 +1,5 @@ Version 2.1.172 + Added 'mcmmo.broadcast.levelup' permission node, if a player lacks this node they will not have their level up milestones broadcast to chat Updated german locale (thanks TheBusyBiscuit) Changed Fists to not be capitalized (en_US) when lowering/readying berserk SkillActivationPerkEvent can now be called in async threads (thanks electronicboy) @@ -6,6 +7,10 @@ Version 2.1.172 Added 'Skills.Woodcutting.TreeFeller.Knock_On_Wood.Add_XP_Orbs_To_Drops' to advanced.yml Removed a few never implemented settings from Skills.Woodcutting.TreeFeller in advanced.yml + 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 + 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 diff --git a/src/main/java/com/gmail/nossr50/util/Permissions.java b/src/main/java/com/gmail/nossr50/util/Permissions.java index 3f804b363..c72b048b9 100644 --- a/src/main/java/com/gmail/nossr50/util/Permissions.java +++ b/src/main/java/com/gmail/nossr50/util/Permissions.java @@ -25,6 +25,7 @@ public final class Permissions { * GENERAL */ public static boolean motd(Permissible permissible) { return permissible.hasPermission("mcmmo.motd"); } + public static boolean levelUpBroadcast(Permissible permissible) { return permissible.hasPermission("mcmmo.broadcast.levelup"); } public static boolean mobHealthDisplay(Permissible permissible) { return permissible.hasPermission("mcmmo.mobhealthdisplay"); } public static boolean updateNotifications(Permissible permissible) {return permissible.hasPermission("mcmmo.tools.updatecheck"); } public static boolean chimaeraWing(Permissible permissible) { return permissible.hasPermission("mcmmo.item.chimaerawing"); } 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 94b00513b..64bedc286 100644 --- a/src/main/java/com/gmail/nossr50/util/player/NotificationManager.java +++ b/src/main/java/com/gmail/nossr50/util/player/NotificationManager.java @@ -272,13 +272,18 @@ public class NotificationManager { //Check if broadcasting is enabled if(Config.getInstance().shouldLevelUpBroadcasts()) { + //Permission check + if(!Permissions.levelUpBroadcast(mmoPlayer.getPlayer())) { + return; + } + int levelInterval = Config.getInstance().getLevelUpBroadcastInterval(); int remainder = level % levelInterval; if(remainder == 0) { //Grab appropriate audience Audience audience = mcMMO.getAudiences().filter(getLevelUpBroadcastPredicate(mmoPlayer.getPlayer())); - //TODO: Make prettier+ + //TODO: Make prettier HoverEvent levelMilestoneHover = Component.text(mmoPlayer.getPlayer().getName()) .append(Component.newline()) .append(Component.text(LocalDate.now().toString())) diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 03dbf7856..70499738e 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -195,6 +195,7 @@ permissions: 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 @@ -219,6 +220,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. From 1b5dd867969a673cf82091c6eb119d6996dab567 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 21 Jan 2021 14:33:39 -0800 Subject: [PATCH 342/662] Use locale instead of hard coded message for pending load on certain commands Fixes #4391 --- src/main/java/com/gmail/nossr50/commands/CommandManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gmail/nossr50/commands/CommandManager.java b/src/main/java/com/gmail/nossr50/commands/CommandManager.java index de5d4a7fd..1bf350b08 100644 --- a/src/main/java/com/gmail/nossr50/commands/CommandManager.java +++ b/src/main/java/com/gmail/nossr50/commands/CommandManager.java @@ -98,7 +98,7 @@ public class CommandManager { public void validateLoadedData(@NotNull Player player) { if(UserManager.getPlayer(player) == null) { - throw new ConditionFailedException("Your mcMMO player data has not yet loaded!"); + throw new ConditionFailedException(LocaleLoader.getString("Profile.PendingLoad")); } } From 4b4643f510df45686287e085c4e3666832164219 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 21 Jan 2021 14:34:58 -0800 Subject: [PATCH 343/662] Message about missing permissions on certain commands no longer hard coded --- src/main/java/com/gmail/nossr50/commands/CommandManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gmail/nossr50/commands/CommandManager.java b/src/main/java/com/gmail/nossr50/commands/CommandManager.java index 1bf350b08..ea72fc2f9 100644 --- a/src/main/java/com/gmail/nossr50/commands/CommandManager.java +++ b/src/main/java/com/gmail/nossr50/commands/CommandManager.java @@ -85,7 +85,7 @@ public class CommandManager { private void validatePermission(@NotNull String permissionNode, @NotNull Permissible permissible) { if(!permissible.hasPermission(permissionNode)) { - throw new ConditionFailedException("You do not have the appropriate permission to use this command."); + throw new ConditionFailedException(LocaleLoader.getString("mcMMO.NoPermission")); } } From f43f3a7fb16b138536e6dff652e3158b0d7f52ff Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 21 Jan 2021 14:37:59 -0800 Subject: [PATCH 344/662] Make ACF aware of the permission nodes for the commands it handles Fixes #4396 --- .../java/com/gmail/nossr50/commands/chat/AdminChatCommand.java | 2 ++ .../java/com/gmail/nossr50/commands/chat/PartyChatCommand.java | 2 ++ 2 files changed, 4 insertions(+) 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 e2b2aef79..3c6f93d11 100644 --- a/src/main/java/com/gmail/nossr50/commands/chat/AdminChatCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/chat/AdminChatCommand.java @@ -3,6 +3,7 @@ package com.gmail.nossr50.commands.chat; 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; @@ -12,6 +13,7 @@ import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.player.UserManager; import org.jetbrains.annotations.NotNull; +@CommandPermission("mcmmo.chat.adminchat") @CommandAlias("ac|a|adminchat|achat") //Kept for historical reasons public class AdminChatCommand extends BaseCommand { private final @NotNull mcMMO pluginRef; 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 9fc985308..9e420e901 100644 --- a/src/main/java/com/gmail/nossr50/commands/chat/PartyChatCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/chat/PartyChatCommand.java @@ -3,6 +3,7 @@ package com.gmail.nossr50.commands.chat; 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; @@ -16,6 +17,7 @@ import com.gmail.nossr50.util.text.StringUtils; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; +@CommandPermission("mcmmo.chat.partychat") @CommandAlias("pc|p|partychat|pchat") //Kept for historical reasons public class PartyChatCommand extends BaseCommand { private final @NotNull mcMMO pluginRef; From 8181743114d1f99ba26150ae0ae462ce55d7149d Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 21 Jan 2021 14:44:13 -0800 Subject: [PATCH 345/662] Fix compile issue --- src/main/java/com/gmail/nossr50/util/MobHealthbarUtils.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/util/MobHealthbarUtils.java b/src/main/java/com/gmail/nossr50/util/MobHealthbarUtils.java index 0ba956dd5..ffef8b238 100644 --- a/src/main/java/com/gmail/nossr50/util/MobHealthbarUtils.java +++ b/src/main/java/com/gmail/nossr50/util/MobHealthbarUtils.java @@ -62,10 +62,6 @@ public final class MobHealthbarUtils { if (oldName == null) { oldName = ""; } - else if (oldName.equalsIgnoreCase(AdvancedConfig.getInstance().getKrakenName())) { - return; - } - boolean oldNameVisible = target.isCustomNameVisible(); String newName = createHealthDisplay(Config.getInstance().getMobHealthbarDefault(), target, damage); From 67f29d52b37a22bcd38250b67a2779eeef05869c Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Thu, 21 Jan 2021 23:54:51 +0100 Subject: [PATCH 346/662] Updated bStats (#4384) Thank you --- pom.xml | 4 ++-- src/main/java/com/gmail/nossr50/mcMMO.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 61acee27c..9d65e9afb 100755 --- a/pom.xml +++ b/pom.xml @@ -151,7 +151,7 @@ org.bstats - com.gmail.nossr50.mcmmo.metrics.bstat + com.gmail.nossr50.mcmmo.metrics.bstats @@ -247,7 +247,7 @@ org.bstats bstats-bukkit - 1.4 + 1.8 compile diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index c956b65f4..05c8c04a1 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -253,7 +253,7 @@ public class mcMMO extends JavaPlugin { Metrics metrics; if(Config.getInstance().getIsMetricsEnabled()) { - metrics = new Metrics(this); + metrics = new Metrics(this, 3894); metrics.addCustomChart(new Metrics.SimplePie("version", () -> getDescription().getVersion())); if(Config.getInstance().getIsRetroMode()) From 6c5eb72ab4f49b258a9fefdb67e45a0ef8ad366d Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 21 Jan 2021 14:56:45 -0800 Subject: [PATCH 347/662] Fixed an error in bstats where Retro Mode was reported as Standard mode and vice versa I might be the most dyslexic person ever --- src/main/java/com/gmail/nossr50/mcMMO.java | 4 ++-- src/main/java/com/gmail/nossr50/util/MobHealthbarUtils.java | 1 - src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java | 2 -- 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index 05c8c04a1..8b38343e0 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -257,9 +257,9 @@ public class mcMMO extends JavaPlugin { metrics.addCustomChart(new Metrics.SimplePie("version", () -> getDescription().getVersion())); if(Config.getInstance().getIsRetroMode()) - metrics.addCustomChart(new Metrics.SimplePie("scaling", () -> "Standard")); - else metrics.addCustomChart(new Metrics.SimplePie("scaling", () -> "Retro")); + else + metrics.addCustomChart(new Metrics.SimplePie("scaling", () -> "Standard")); } } catch (Throwable t) { diff --git a/src/main/java/com/gmail/nossr50/util/MobHealthbarUtils.java b/src/main/java/com/gmail/nossr50/util/MobHealthbarUtils.java index ffef8b238..57c7afe92 100644 --- a/src/main/java/com/gmail/nossr50/util/MobHealthbarUtils.java +++ b/src/main/java/com/gmail/nossr50/util/MobHealthbarUtils.java @@ -1,6 +1,5 @@ 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; 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 716524762..f2ab26669 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java @@ -30,14 +30,12 @@ import org.bukkit.GameMode; import org.bukkit.Material; import org.bukkit.attribute.Attribute; import org.bukkit.attribute.AttributeInstance; -import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.*; import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import org.bukkit.event.entity.EntityDamageEvent.DamageModifier; import org.bukkit.inventory.ItemStack; -import org.bukkit.metadata.FixedMetadataValue; import org.bukkit.metadata.MetadataValue; import org.bukkit.potion.PotionEffectType; import org.bukkit.projectiles.ProjectileSource; From 6e63007068c6e2f9043ccec98e7dbdb7181da69d Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 21 Jan 2021 14:58:29 -0800 Subject: [PATCH 348/662] Update changelog --- Changelog.txt | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index bba9f0b04..73eb614fe 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,11 +1,13 @@ Version 2.1.172 Added 'mcmmo.broadcast.levelup' permission node, if a player lacks this node they will not have their level up milestones broadcast to chat - Updated german locale (thanks TheBusyBiscuit) - Changed Fists to not be capitalized (en_US) when lowering/readying berserk - SkillActivationPerkEvent can now be called in async threads (thanks electronicboy) 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 + Updated german locale (thanks TheBusyBiscuit) + Updated bStats (thanks TheBusyBiscuit) + 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 + 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' From a85fd024b2320ac6d083cbc3d5bc0a3f5175b153 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 21 Jan 2021 15:00:42 -0800 Subject: [PATCH 349/662] Have correct bStats data point to a new id --- src/main/java/com/gmail/nossr50/mcMMO.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index 8b38343e0..0b52bb832 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -257,9 +257,9 @@ public class mcMMO extends JavaPlugin { metrics.addCustomChart(new Metrics.SimplePie("version", () -> getDescription().getVersion())); if(Config.getInstance().getIsRetroMode()) - metrics.addCustomChart(new Metrics.SimplePie("scaling", () -> "Retro")); + metrics.addCustomChart(new Metrics.SimplePie("leveling_system", () -> "Retro")); else - metrics.addCustomChart(new Metrics.SimplePie("scaling", () -> "Standard")); + metrics.addCustomChart(new Metrics.SimplePie("leveling_system", () -> "Standard")); } } catch (Throwable t) { From 27ae7ae1a76f1370738110c18fea2b2d40c82e3a Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 21 Jan 2021 15:27:50 -0800 Subject: [PATCH 350/662] Add Power Level broadcasts Fixes #4388 --- Changelog.txt | 11 ++ .../java/com/gmail/nossr50/config/Config.java | 8 ++ .../PowerLevelUpBroadcastPredicate.java | 100 ++++++++++++++++++ .../com/gmail/nossr50/util/EventUtils.java | 3 + .../util/player/NotificationManager.java | 39 +++++++ src/main/resources/config.yml | 17 +++ .../resources/locale/locale_en_US.properties | 3 +- 7 files changed, 180 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/gmail/nossr50/datatypes/PowerLevelUpBroadcastPredicate.java diff --git a/Changelog.txt b/Changelog.txt index 73eb614fe..5eaff843c 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,5 +1,16 @@ Version 2.1.172 Added 'mcmmo.broadcast.levelup' permission node, if a player lacks this node they will not have their level up milestones broadcast to chat + 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 Updated german locale (thanks TheBusyBiscuit) diff --git a/src/main/java/com/gmail/nossr50/config/Config.java b/src/main/java/com/gmail/nossr50/config/Config.java index 297ab3088..cc8549303 100644 --- a/src/main/java/com/gmail/nossr50/config/Config.java +++ b/src/main/java/com/gmail/nossr50/config/Config.java @@ -589,4 +589,12 @@ public class Config extends AutoUpdateConfigLoader { 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); } + } 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..549255006 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/datatypes/PowerLevelUpBroadcastPredicate.java @@ -0,0 +1,100 @@ +package com.gmail.nossr50.datatypes; + +import com.gmail.nossr50.config.Config; +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(Config.getInstance().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(Config.getInstance().shouldPowerLevelUpBroadcastsRestrictDistance()) { + if(!Misc.isNear(mmoBroadcastingPlayer.getPlayer().getLocation(), listeningPlayer.getLocation(), Config.getInstance().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 Config.getInstance().shouldPowerLevelUpBroadcastToConsole(); + } + } + + private static boolean isPowerLevelUpBroadcastsSameWorldOnly() { + return Config.getInstance().isPowerLevelUpBroadcastsSameWorldOnly(); + } + + @Override + public String toString() { + return "PowerLevelUpBroadcastPredicate{" + + "broadcaster=" + broadcaster + + '}'; + } +} diff --git a/src/main/java/com/gmail/nossr50/util/EventUtils.java b/src/main/java/com/gmail/nossr50/util/EventUtils.java index a928c7c82..b1f99de72 100644 --- a/src/main/java/com/gmail/nossr50/util/EventUtils.java +++ b/src/main/java/com/gmail/nossr50/util/EventUtils.java @@ -245,6 +245,8 @@ public final class EventUtils { } else { if (isLevelUp) { NotificationManager.processLevelUpBroadcasting(mmoPlayer, skill, mmoPlayer.getSkillLevel(skill)); + NotificationManager.processPowerLevelUpBroadcasting(mmoPlayer, mmoPlayer.getPowerLevel()); + } } @@ -279,6 +281,7 @@ public final class EventUtils { } else { if (isLevelUp) { NotificationManager.processLevelUpBroadcasting(mmoPlayer, skill, mmoPlayer.getSkillLevel(skill)); + NotificationManager.processPowerLevelUpBroadcasting(mmoPlayer, mmoPlayer.getPowerLevel()); } } 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 64bedc286..c8ac56c72 100644 --- a/src/main/java/com/gmail/nossr50/util/player/NotificationManager.java +++ b/src/main/java/com/gmail/nossr50/util/player/NotificationManager.java @@ -3,6 +3,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; @@ -299,9 +300,47 @@ public class NotificationManager { } } + //TODO: Remove the code duplication, am lazy atm + public static void processPowerLevelUpBroadcasting(@NotNull McMMOPlayer mmoPlayer, int powerLevel) { + if(powerLevel <= 0) + return; + + //Check if broadcasting is enabled + if(Config.getInstance().shouldPowerLevelUpBroadcasts()) { + //Permission check + if(!Permissions.levelUpBroadcast(mmoPlayer.getPlayer())) { + return; + } + + int levelInterval = Config.getInstance().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 = Component.text(localeMessage).hoverEvent(levelMilestoneHover); + + audience.sendMessage(Identity.nil(), message); + } + } + } + //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/resources/config.yml b/src/main/resources/config.yml index 7e2d6b787..ad1a09e69 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -12,6 +12,23 @@ General: 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: diff --git a/src/main/resources/locale/locale_en_US.properties b/src/main/resources/locale/locale_en_US.properties index 450ea66aa..e9048c103 100644 --- a/src/main/resources/locale/locale_en_US.properties +++ b/src/main/resources/locale/locale_en_US.properties @@ -1136,4 +1136,5 @@ 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 [[DARK_AQUA]]{2}&7! \ No newline at end of file +Broadcasts.LevelUpMilestone=&6(&amcMMO&6) {0}&7 has reached level &a{1}&7 in [[DARK_AQUA]]{2}&7! +Broadcasts.PowerLevelUpMilestone=&6(&amcMMO&6) {0}&7 has reached a Power level of &a{1}&7! \ No newline at end of file From bf9bb6ffd8ba60a632776c780906b776378b4a68 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 21 Jan 2021 15:38:31 -0800 Subject: [PATCH 351/662] 2.1.172 --- Changelog.txt | 8 ++++---- pom.xml | 2 +- .../gmail/nossr50/util/player/NotificationManager.java | 7 +++++-- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 5eaff843c..aba172ec6 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,5 +1,6 @@ Version 2.1.172 - Added 'mcmmo.broadcast.levelup' permission node, if a player lacks this node they will not have their level up milestones broadcast to chat + 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 @@ -10,19 +11,18 @@ Version 2.1.172 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 - Updated german locale (thanks TheBusyBiscuit) - Updated bStats (thanks TheBusyBiscuit) 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 diff --git a/pom.xml b/pom.xml index 9d65e9afb..77953dc4b 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.172-SNAPSHOT + 2.1.172 mcMMO https://github.com/mcMMO-Dev/mcMMO 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 c8ac56c72..0ae24eafc 100644 --- a/src/main/java/com/gmail/nossr50/util/player/NotificationManager.java +++ b/src/main/java/com/gmail/nossr50/util/player/NotificationManager.java @@ -267,6 +267,8 @@ 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; @@ -295,12 +297,13 @@ public class NotificationManager { String localeMessage = LocaleLoader.getString("Broadcasts.LevelUpMilestone", mmoPlayer.getPlayer().getDisplayName(), level, primarySkillType.getName()); Component message = Component.text(localeMessage).hoverEvent(levelMilestoneHover); - audience.sendMessage(Identity.nil(), message); + 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; @@ -329,7 +332,7 @@ public class NotificationManager { String localeMessage = LocaleLoader.getString("Broadcasts.PowerLevelUpMilestone", mmoPlayer.getPlayer().getDisplayName(), powerLevel); Component message = Component.text(localeMessage).hoverEvent(levelMilestoneHover); - audience.sendMessage(Identity.nil(), message); + Bukkit.getScheduler().runTaskLater(mcMMO.p, () -> {audience.sendMessage(Identity.nil(), message);}, 0); } } } From 52ac1cc522f5674d7468469e226bb9a3e0070ed6 Mon Sep 17 00:00:00 2001 From: snake Date: Tue, 26 Jan 2021 07:12:57 +0900 Subject: [PATCH 352/662] Update ja_jp locale (#4406) --- .../resources/locale/locale_ja_JP.properties | 367 ++++++++++-------- 1 file changed, 206 insertions(+), 161 deletions(-) diff --git a/src/main/resources/locale/locale_ja_JP.properties b/src/main/resources/locale/locale_ja_JP.properties index f93cda4be..153967ba5 100644 --- a/src/main/resources/locale/locale_ja_JP.properties +++ b/src/main/resources/locale/locale_ja_JP.properties @@ -1,3 +1,7 @@ +#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=\u30e9\u30f3\u30af JSON.DescriptionHeader=\u8aac\u660e JSON.JWrapper.Header=\u8a73\u7d30 @@ -35,6 +39,7 @@ JSON.URL.Wiki=mcMMO\u516c\u5f0fwiki JSON.SkillUnlockMessage=&6[ mcMMO&e @&3{0} &6\u30e9\u30f3\u30af &3{1}&6 \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 +# 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 @@ -43,15 +48,20 @@ 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=\u30c6\u30b9\u30c8 &c\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=&c\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 +#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 ### +# BEGIN STYLING Ability.Generic.Refresh=&a**\u30a2\u30d3\u30ea\u30c6\u30a3 \u30ea\u30d5\u30ec\u30c3\u30b7\u30e5\uff01** Ability.Generic.Template.Lock=&7{0} @@ -73,6 +83,7 @@ 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\u3067\u3053\u306e\u30b9\u30ad\u30eb\u3092\u898b\u308b&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}\u304c&r&a&l{2}&r&f&l\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 @@ -95,6 +106,8 @@ Commands.mcc.Header=&c---[]&amcMMO \u30b3\u30de\u30f3\u30c9&c[]--- Commands.Other=&c---[]&a\u30b9\u30da\u30b7\u30e3\u30eb\u30b3\u30de\u30f3\u30c9&c[]--- Commands.Party.Header=&c-----[]&a\u30d1\u30fc\u30c6\u30a3\u30fc&c[]----- Commands.Party.Features.Header=&c-----[]&a\u7279\u5fb4&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\u65b0\u3057\u3044\u30b9\u30ad\u30eb\u3092\u5b66\u3093\u3067\u3044\u307e\u3059... XPBar.Acrobatics=\u30a2\u30af\u30ed\u30d0\u30c6\u30a3\u30c3\u30af Lv.&6{0} @@ -112,24 +125,28 @@ XPBar.Swords=\u5263 Lv.&6{0} XPBar.Taming=\u8abf\u6559 Lv.&6{0} XPBar.Unarmed=\u7d20\u624b Lv.&6{0} XPBar.Woodcutting=\u6728\u3053\u308a 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) -### END STYLING ### +# 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 ### +# END STYLING # ACROBATICS Acrobatics.Ability.Proc=&a**\u512a\u96c5\u306b\u7740\u5730\u3057\u305f** Acrobatics.Combat.Proc=&a**\u8eb1\u3057\u305f** -Acrobatics.SubSkill.Roll.Stats=&6\u53d7\u3051\u8eab \u78ba\u7387 &e{0}%&6 \u512a\u96c5\u306a\u53d7\u3051\u8eab \u78ba\u7387&e {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.Stats=&6\u53d7\u3051\u8eab\u306e\u78ba\u7387 &e{0}%&6 \u512a\u96c5\u306a\u53d7\u3051\u8eab\u306e\u78ba\u7387&e {1}% +Acrobatics.SubSkill.Roll.Stat=\u53d7\u3051\u8eab\u306e\u78ba\u7387 +Acrobatics.SubSkill.Roll.Stat.Extra=\u512a\u96c5\u306a\u53d7\u3051\u8eab\u306e\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: &e{0} -Acrobatics.SubSkill.Roll.GraceChance=\u512a\u96c5\u306a\u53d7\u3051\u8eab \u78ba\u7387: &e{0} +Acrobatics.SubSkill.Roll.Chance=\u53d7\u3051\u8eab\u306e\u78ba\u7387: &e{0} +Acrobatics.SubSkill.Roll.GraceChance=\u512a\u96c5\u306a\u53d7\u3051\u8eab\u306e\u78ba\u7387: &e{0} +Acrobatics.SubSkill.Roll.Mechanics=&7\u843d\u4e0b\u30c0\u30e1\u30fc\u30b8\u3092\u53d7\u3051\u308b\u305f\u3073\u306b\u3001\u30b9\u30ad\u30eb\u30ec\u30d9\u30eb\u306b\u5fdc\u3058\u3066\u30c0\u30e1\u30fc\u30b8\u3092\u5b8c\u5168\u306b\u9632\u3050\u53ef\u80fd\u6027\u304c\u3042\u308a\u3001\u30ec\u30d9\u30eb&e{6}%&7\u3067\u306f\u30c0\u30e1\u30fc\u30b8\u3092\u9632\u3050\u78ba\u7387\u304c&e{0}%&7\u3067\u3059\u3002\n\u30b9\u30cb\u30fc\u30af\u30dc\u30bf\u30f3\u3092\u62bc\u3059\u3053\u3068\u3067\u3001\u843d\u4e0b\u30c0\u30e1\u30fc\u30b8\u3092\u56de\u907f\u3059\u308b\u78ba\u7387\u304c2\u500d\u306b\u306a\u308a\u3001\u6700\u59272\u500d\u306e\u843d\u4e0b\u30c0\u30e1\u30fc\u30b8\u3092\u56de\u907f\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u30b9\u30cb\u30fc\u30af\u30dc\u30bf\u30f3\u3092\u62bc\u3059\u3068\u3001\u901a\u5e38\u306e\u53d7\u3051\u8eab\u304c\u300c\u512a\u96c5\u306a\u53d7\u3051\u8eab\u300d\u306b\u5909\u5316\u3057\u307e\u3059\u3002\u512a\u96c5\u306a\u53d7\u3051\u8eab\u306f\u6700\u5927\u3067&a{5}&7\u30c0\u30e1\u30fc\u30b8\u3092\u9632\u3050\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002 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.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 @@ -152,10 +169,10 @@ Archery.SubSkill.SkillShot.Description=\u5f13\u306e\u30c0\u30e1\u30fc\u30b8\u309 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.Daze.Stat=\u5e7b\u60d1\u306e\u78ba\u7387 +Archery.SubSkill.ArrowRetrieval.Name=\u77e2\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.ArrowRetrieval.Stat=\u77e2\u56de\u53ce\u306e\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 @@ -163,7 +180,7 @@ Archery.Listener=\u5f13: Archery.SkillName=\u5f13 # AXES -Axes.Ability.Bonus.0=\u65a7 \u7df4\u5ea6 +Axes.Ability.Bonus.0=\u30a2\u30c3\u30af\u30b9\u30de\u30b9\u30bf\u30ea\u30fc 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 @@ -171,6 +188,7 @@ Axes.Ability.Bonus.4=\u30b0\u30ea\u30fc\u30bf\u30fc\u30a4\u30f3\u30d1\u30af\u30c 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=&7\u65a7\u3092\u4e0b\u3052\u305f\u3002 Axes.Ability.Ready=&3\u65a7\u3092&6\u6e96\u5099&3\u3057\u305f\u3002 +Axes.Ability.Ready.Extra=&3\u65a7\u3092&6\u6e96\u5099&3\u3057\u305f\u3002 &7({0} \u304c {1} \u79d2\u306e\u30af\u30fc\u30eb\u30c0\u30a6\u30f3\u4e2d) Axes.Combat.CritStruck=&4\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=&a**\u5927\u304d\u306a\u529b\u304c\u8972\u3063\u3066\u304d\u305f** @@ -181,8 +199,8 @@ Axes.SubSkill.SkullSplitter.Description=AoE\u30c0\u30e1\u30fc\u30b8\u3092\u4e0e\ 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.CriticalStrikes.Stat=\u30af\u30ea\u30c6\u30a3\u30ab\u30eb\u30b9\u30c8\u30e9\u30a4\u30af\u306e\u78ba\u7387 +Axes.SubSkill.AxeMastery.Name=\u30a2\u30c3\u30af\u30b9\u30de\u30b9\u30bf\u30ea\u30fc 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 @@ -202,9 +220,9 @@ Axes.Skills.SS.Other.On=&a{0}&2\u304c &c\u30b9\u30ab\u30eb\u30b9\u30d7\u30ea\u30 # EXCAVATION Excavation.Ability.Lower=&7\u30b7\u30e3\u30d9\u30eb\u3092\u4e0b\u3052\u305f\u3002 Excavation.Ability.Ready=&3\u30b7\u30e3\u30d9\u30eb\u3092&6\u6e96\u5099&3\u3057\u305f\u3002 -Excavation.SubSkill.GigaDrillBreaker.Name=\u30ae\u30ac\u30c9\u30ea\u30eb\u30d6\u30ec\u30fc\u30ab\u30fc +Excavation.SubSkill.GigaDrillBreaker.Name=\u30ae\u30ac\u30c9\u30ea\u30eb\u30d6\u30ec\u30a4\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.GigaDrillBreaker.Stat=\u30ae\u30ac\u30c9\u30ea\u30eb\u30d6\u30ec\u30a4\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 @@ -212,11 +230,11 @@ Excavation.SubSkill.Archaeology.Stat.Extra=\u8003\u53e4\u5b66 \u7d4c\u9a13\u5024 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=&a**\u30ae\u30ac\u30c9\u30ea\u30eb\u30d6\u30ec\u30fc\u30ab\u30fc \u30a2\u30af\u30c6\u30a3\u30d9\u30fc\u30c8** -Excavation.Skills.GigaDrillBreaker.Refresh=&e\u30ae\u30ac\u30c9\u30ea\u30eb\u30d6\u30ec\u30fc\u30ab\u30fc &a\u30a2\u30d3\u30ea\u30c6\u30a3\u304c\u56de\u5fa9\u3057\u307e\u3057\u305f\uff01 -Excavation.Skills.GigaDrillBreaker.Other.Off=&e{0}\u304c &f\u30ae\u30ac\u30c9\u30ea\u30eb\u30d6\u30ec\u30fc\u30ab\u30fc &a\u3092\u6d88\u8017\u3057\u305f -Excavation.Skills.GigaDrillBreaker.Other.On=&a{0}&2\u304c &c\u30ae\u30ac\u30c9\u30ea\u30eb\u30d6\u30ec\u30fc\u30ab\u30fc &2\u3092\u4f7f\u3063\u305f\uff01 +Excavation.Skills.GigaDrillBreaker.Off=**\u30ae\u30ac\u30c9\u30ea\u30eb\u30d6\u30ec\u30a4\u30ab\u30fc \u3092\u6d88\u8017\u3057\u305f** +Excavation.Skills.GigaDrillBreaker.On=&a**\u30ae\u30ac\u30c9\u30ea\u30eb\u30d6\u30ec\u30a4\u30ab\u30fc \u30a2\u30af\u30c6\u30a3\u30d9\u30fc\u30c8** +Excavation.Skills.GigaDrillBreaker.Refresh=&e\u30ae\u30ac\u30c9\u30ea\u30eb\u30d6\u30ec\u30a4\u30ab\u30fc &a\u30a2\u30d3\u30ea\u30c6\u30a3\u304c\u56de\u5fa9\u3057\u307e\u3057\u305f\uff01 +Excavation.Skills.GigaDrillBreaker.Other.Off=&e{0}\u304c &f\u30ae\u30ac\u30c9\u30ea\u30eb\u30d6\u30ec\u30a4\u30ab\u30fc &a\u3092\u6d88\u8017\u3057\u305f +Excavation.Skills.GigaDrillBreaker.Other.On=&a{0}&2\u304c &c\u30ae\u30ac\u30c9\u30ea\u30eb\u30d6\u30ec\u30a4\u30ab\u30fc &2\u3092\u4f7f\u3063\u305f\uff01 # FISHING Fishing.ScarcityTip=&e&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 @@ -225,7 +243,7 @@ Fishing.Exhausting=&c&o\u91e3\u308a\u7aff\u3092\u4e0d\u9069\u5207\u306b\u4f7f\u7 Fishing.LowResourcesTip=&7\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: &7 **\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.1=\u30ed\u30c3\u30af\u3055\u308c\u308b\u307e\u3067 {0}+ \u30b9\u30ad\u30eb (\u30a2\u30a4\u30b9\u30d5\u30a3\u30c3\u30b7\u30f3\u30b0) 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 @@ -233,17 +251,20 @@ Fishing.SubSkill.TreasureHunter.Stat=\u30c8\u30ec\u30b8\u30e3\u30fc\u30cf\u30f3\ Fishing.SubSkill.TreasureHunter.Stat.Extra=\u30c9\u30ed\u30c3\u30d7\u7387: &7\u30b3\u30e2\u30f3: &e{0} &a\u30a2\u30f3\u30b3\u30e2\u30f3: &e{1}\n&9\u30ec\u30a2: &e{2} &d\u30a8\u30d4\u30c3\u30af: &e{3} &6\u30ec\u30b8\u30a7\u30f3\u30c0\u30ea\u30fc: &e{4} &bMythic: &e{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.MagicHunter.Stat=\u30de\u30b8\u30c3\u30af\u30cf\u30f3\u30bf\u30fc\u306e\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.Shake.Stat=\u30b7\u30a7\u30a4\u30af\u306e\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:&a \u30e9\u30f3\u30af {0} Fishing.SubSkill.MasterAngler.Name=\u30de\u30b9\u30bf\u30fc\u30a2\u30f3\u30b0\u30e9\u30fc -Fishing.SubSkill.IceFishing.Name=\u7a74\u91e3\u308a +Fishing.SubSkill.MasterAngler.Description=\u9b5a\u304c\u3088\u304f\u91e3\u308c\u307e\u3059\u3001\u8239\u304b\u3089\u306e\u91e3\u308a\u3067\u306f\u3088\u308a\u52b9\u679c\u7684\u3067\u3059\u3002 +Fishing.SubSkill.MasterAngler.Stat=\u91e3\u308a\u306e\u6700\u4f4e\u5f85\u3061\u6642\u9593\u77ed\u7e2e: &a-{0} \u79d2 +Fishing.SubSkill.MasterAngler.Stat.Extra=\u91e3\u308a\u306e\u6700\u5927\u5f85\u3061\u6642\u9593\u77ed\u7e2e: &a-{0} \u79d2 +Fishing.SubSkill.IceFishing.Name=\u30a2\u30a4\u30b9\u30d5\u30a3\u30c3\u30b7\u30f3\u30b0 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.SubSkill.IceFishing.Stat=\u30a2\u30a4\u30b9\u30d5\u30a3\u30c3\u30b7\u30f3\u30b0 Fishing.Chance.Raining=&9 \u96e8\u30dc\u30fc\u30ca\u30b9 Fishing.Listener=\u91e3\u308a: Fishing.Ability.TH.MagicFound=&7\u9b54\u6cd5\u3092\u611f\u3058\u307e\u3059\u3002 @@ -253,33 +274,33 @@ Fishing.SkillName=\u91e3\u308a # 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=&a**\u7dd1\u8272\u306e\u89aa\u6307** +Herbalism.Ability.GTh.Fail=**\u30b0\u30ea\u30fc\u30f3\u30b5\u30e0 \u5931\u6557** +Herbalism.Ability.GTh=&a**\u30b0\u30ea\u30fc\u30f3\u30b5\u30e0** Herbalism.Ability.Lower=&7\u30af\u30ef\u3092\u4e0b\u3052\u305f\u3002 Herbalism.Ability.Ready=&3\u30af\u30ef\u3092&6\u6e96\u5099&3\u3057\u305f\u3002 -Herbalism.Ability.ShroomThumb.Fail=**\u30ad\u30ce\u30b3\u306e\u89aa\u6307 \u5931\u6557** +Herbalism.Ability.ShroomThumb.Fail=**\u30b7\u30e5\u30eb\u30fc\u30e0\u30b5\u30e0 \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.Name=\u30b0\u30ea\u30fc\u30f3\u30b5\u30e0 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: &a \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.Stat=\u30b0\u30ea\u30fc\u30f3\u30b5\u30e0\u306e\u78ba\u7387 +Herbalism.SubSkill.GreenThumb.Stat.Extra=\u30b0\u30ea\u30fc\u30f3\u30b5\u30e0 \u30b9\u30c6\u30fc\u30b8: &a \u4f5c\u7269\u306f\u30b9\u30c6\u30fc\u30b8 {0} \u306b\u6210\u9577 +Herbalism.Effect.4=\u30b0\u30ea\u30fc\u30f3\u30b5\u30e0 (\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: &a\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.DoubleDrops.Stat=\u30c9\u30ed\u30c3\u30d7\u4e8c\u500d\u306e\u78ba\u7387 +Herbalism.SubSkill.HylianLuck.Name=\u30cf\u30a4\u30ea\u30a2\u30f3\u30e9\u30c3\u30af 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.HylianLuck.Stat=\u30cf\u30a4\u30ea\u30a2\u30f3\u30e9\u30c3\u30af\u306e\u78ba\u7387 +Herbalism.SubSkill.ShroomThumb.Name=\u30b7\u30e5\u30eb\u30fc\u30e0\u30b5\u30e0 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=&a\u30cf\u30a4\u30e9\u30eb\u306e\u904b\u306f\u4eca\u65e5\u306e\u3042\u306a\u305f\u306b\u3064\u3044\u3066\u3044\u307e\u3059\uff01 +Herbalism.SubSkill.ShroomThumb.Stat=\u30b7\u30e5\u30eb\u30fc\u30e0\u30b5\u30e0\u306e\u78ba\u7387 +Herbalism.HylianLuck=&a\u30cf\u30a4\u30ea\u30a2\u30f3\u30e9\u30c3\u30af\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** @@ -294,12 +315,12 @@ Mining.Ability.Locked.1=\u30ed\u30c3\u30af\u3055\u308c\u308b\u307e\u3067 {0}+ \u 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=&7\u30d4\u30c3\u30b1\u30eb\u3092\u4e0b\u3052\u305f\u3002 Mining.Ability.Ready=&3\u30d4\u30c3\u30b1\u30eb\u3092&6\u6e96\u5099&3\u3057\u305f\u3002 -Mining.SubSkill.SuperBreaker.Name=\u30b9\u30fc\u30d1\u30fc\u30d6\u30ec\u30fc\u30ab\u30fc +Mining.SubSkill.SuperBreaker.Name=\u30b9\u30fc\u30d1\u30fc\u30d6\u30ec\u30a4\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.SuperBreaker.Stat=\u30b9\u30fc\u30d1\u30fc\u30d6\u30ec\u30a4\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: &e{0} +Mining.SubSkill.DoubleDrops.Stat=\u30c9\u30ed\u30c3\u30d7\u4e8c\u500d\u306e\u78ba\u7387: &e{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:&a \u30e9\u30f3\u30af {0}/{1} &7({2}) @@ -311,16 +332,16 @@ Mining.SubSkill.DemolitionsExpertise.Description=TNT\u306b\u3088\u308b\u30c0\u30 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=&a**\u30b9\u30fc\u30d1\u30fc\u30d6\u30ec\u30fc\u30ab\u30fc \u30a2\u30af\u30c6\u30a3\u30d9\u30fc\u30c8** -Mining.Skills.SuperBreaker.Refresh=&e\u30b9\u30fc\u30d1\u30fc\u30d6\u30ec\u30fc\u30ab\u30fc &a\u30a2\u30d3\u30ea\u30c6\u30a3\u304c\u56de\u5fa9\u3057\u307e\u3057\u305f\uff01 -Mining.Skills.SuperBreaker.Other.Off=&e{0}\u304c &f\u30b9\u30fc\u30d1\u30fc\u30d6\u30ec\u30fc\u30ab\u30fc &a\u3092\u6d88\u8017\u3057\u305f -Mining.Skills.SuperBreaker.Other.On=&a{0}&2\u304c &c\u30b9\u30fc\u30d1\u30fc\u30d6\u30ec\u30fc\u30ab\u30fc &2\u3092\u4f7f\u3063\u305f\uff01 +Mining.Skills.SuperBreaker.Off=**\u30b9\u30fc\u30d1\u30fc\u30d6\u30ec\u30a4\u30ab\u30fc \u3092\u6d88\u8017\u3057\u305f** +Mining.Skills.SuperBreaker.On=&a**\u30b9\u30fc\u30d1\u30fc\u30d6\u30ec\u30a4\u30ab\u30fc \u30a2\u30af\u30c6\u30a3\u30d9\u30fc\u30c8** +Mining.Skills.SuperBreaker.Other.Off=&e{0}\u304c &f\u30b9\u30fc\u30d1\u30fc\u30d6\u30ec\u30a4\u30ab\u30fc &a\u3092\u6d88\u8017\u3057\u305f +Mining.Skills.SuperBreaker.Other.On=&a{0}&2\u304c &c\u30b9\u30fc\u30d1\u30fc\u30d6\u30ec\u30a4\u30ab\u30fc &2\u3092\u4f7f\u3063\u305f\uff01 +Mining.Skills.SuperBreaker.Refresh=&e\u30b9\u30fc\u30d1\u30fc\u30d6\u30ec\u30a4\u30ab\u30fc &a\u30a2\u30d3\u30ea\u30c6\u30a3\u304c\u56de\u5fa9\u3057\u307e\u3057\u305f\uff01 # Blast Mining Mining.Blast.Boom=&7**BOOM** Mining.Blast.Cooldown= -Mining.Blast.Effect=+{0} ore yield, {1}x \u30c9\u30ed\u30c3\u30d7 +Mining.Blast.Effect=\u9271\u77f3 +{0} \u306e\u53ce\u91cf, {1}x \u30c9\u30ed\u30c3\u30d7 Mining.Blast.Other.On=&a{0}&2 \u304c &c\u30d6\u30e9\u30b9\u30c8\u30de\u30a4\u30cb\u30f3\u30b0 &2\u3092\u4f7f\u3063\u305f\uff01 Mining.Blast.Refresh=&e\u30d6\u30e9\u30b9\u30c8\u30de\u30a4\u30cb\u30f3\u30b0[GREEN]]\u30a2\u30d3\u30ea\u30c6\u30a3\u304c\u56de\u5fa9\u3057\u307e\u3057\u305f\uff01 @@ -333,18 +354,18 @@ 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.Name=\u30ea\u30da\u30a2\u30de\u30b9\u30bf\u30ea\u30fc Repair.SubSkill.RepairMastery.Description=\u4fee\u7406\u91cf\u306e\u5897\u52a0 -Repair.SubSkill.RepairMastery.Stat=\u4fee\u7406 \u7df4\u5ea6: &aExtra {0} durability restored -Repair.SubSkill.SuperRepair.Name=\u30b9\u30fc\u30d1\u30fc\u4fee\u7406 +Repair.SubSkill.RepairMastery.Stat=\u30ea\u30da\u30a2\u30de\u30b9\u30bf\u30ea\u30fc: &a\u8ffd\u52a0 {0} \u8010\u4e45\u529b\u56de\u5fa9 +Repair.SubSkill.SuperRepair.Name=\u30b9\u30fc\u30d1\u30fc\u30ea\u30da\u30a2 Repair.SubSkill.SuperRepair.Description=\u4e8c\u91cd\u306e\u52b9\u679c -Repair.SubSkill.SuperRepair.Stat=\u30b9\u30fc\u30d1\u30fc\u4fee\u7406 \u78ba\u7387 +Repair.SubSkill.SuperRepair.Stat=\u30b9\u30fc\u30d1\u30fc\u30ea\u30da\u30a2\u306e\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.Name=\u30a2\u30eb\u30ab\u30f3\u30d5\u30a9\u30fc\u30b8\u30f3\u30b0 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: &e\u30e9\u30f3\u30af {0}/{1} -Repair.SubSkill.ArcaneForging.Stat.Extra=&3\u96e3\u89e3\u306a\u935b\u9020 \u30aa\u30c3\u30ba:&7 \u6210\u529f &a{0}&7%, \u5931\u6557 &c{1}&7% +Repair.SubSkill.ArcaneForging.Stat=\u30a2\u30eb\u30ab\u30f3\u30d5\u30a9\u30fc\u30b8\u30f3\u30b0: &e\u30e9\u30f3\u30af {0}/{1} +Repair.SubSkill.ArcaneForging.Stat.Extra=&3\u30a2\u30eb\u30ab\u30f3\u30d5\u30a9\u30fc\u30b8\u30f3\u30b0 \u30aa\u30c3\u30ba:&7 \u6210\u529f &a{0}&7%, \u5931\u6557 &c{1}&7% Repair.Error=&4\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=&4\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: @@ -372,13 +393,13 @@ Salvage.SubSkill.UnderstandingTheArt.Description=\u3042\u306a\u305f\u306f\u305f\ 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: &a\u6700\u5927&e{0}\u500b&a\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.Name=\u30a2\u30eb\u30ab\u30f3\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: &e\u30e9\u30f3\u30af {0}/{1} +Salvage.SubSkill.ArcaneSalvage.Stat=\u30a2\u30eb\u30ab\u30f3\u30b5\u30eb\u30d9\u30fc\u30b8: &e\u30e9\u30f3\u30af {0}/{1} Salvage.Ability.Bonus.0=\u30b9\u30af\u30e9\u30c3\u30d7\u30b3\u30ec\u30af\u30bf\u30fc Salvage.Ability.Bonus.1=&a\u6700\u5927&e{0}\u500b&a\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=&7\u30d5\u30eb\u30a8\u30f3\u30c1\u30e3\u30f3\u30c8 \u78ba\u7387 -Salvage.Arcane.ExtractPartial=&7\u90e8\u5206\u7684\u306a\u30a8\u30f3\u30c1\u30e3\u30f3\u30c8 \u78ba\u7387 +Salvage.Arcane.ExtractFull=&7\u30d5\u30eb\u30a8\u30f3\u30c1\u30e3\u30f3\u30c8\u306e\u78ba\u7387 +Salvage.Arcane.ExtractPartial=&7\u90e8\u5206\u7684\u306a\u30a8\u30f3\u30c1\u30e3\u30f3\u30c8\u306e\u78ba\u7387 Salvage.Skills.Success=&a\u30a2\u30a4\u30c6\u30e0\u3092\u30b5\u30eb\u30d9\u30fc\u30b8\uff01 Salvage.Skills.Adept.Damaged=&4\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=&e{1} &c\u3092\u30b5\u30eb\u30d9\u30fc\u30b8\u3059\u308b\u305f\u3081\u306b\u306f &e{0} &c\u30ec\u30d9\u30eb\u304c\u5fc5\u8981\u3067\u3059\u3002 @@ -399,7 +420,7 @@ Anvil.Unbreakable=\u3053\u306e\u30a2\u30a4\u30c6\u30e0\u306f\u58ca\u308c\u307e\u # SWORDS Swords.Ability.Lower=&7\u5263\u3092\u4e0b\u3052\u305f\u3002 Swords.Ability.Ready=&3\u5263\u3092&6\u6e96\u5099&3\u3057\u305f\u3002 -Swords.Combat.Rupture.Note=[[GREY]]\u6ce8\u610f\uff1a&e 0.5\u79d2\u3054\u3068\u306b1tick\u304c\u767a\u751f\u3057\u307e\u3059\u3002 +Swords.Combat.Rupture.Note=&7\u6ce8\u610f\uff1a&e 0.5\u79d2\u3054\u3068\u306b1tick\u304c\u767a\u751f\u3057\u307e\u3059\u3002 Swords.Combat.Bleeding.Started=&4 \u3042\u306a\u305f\u306f\u51fa\u8840\u3057\u3066\u3044\u307e\u3059\uff01 Swords.Combat.Bleeding.Stopped=&7\u51fa\u8840\u304c &a\u6b62\u307e\u308a\u307e\u3057\u305f&7\uff01 Swords.Combat.Bleeding=&a**\u30a8\u30cd\u30df\u30fc \u51fa\u8840** @@ -408,10 +429,10 @@ Swords.Combat.Countered=&a**\u30ab\u30a6\u30f3\u30bf\u30fc\u653b\u6483** Swords.Combat.SS.Struck=&4Struck 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.CounterAttack.Stat=\u30ab\u30a6\u30f3\u30bf\u30fc\u653b\u6483\u306e\u78ba\u7387 +Swords.SubSkill.SerratedStrikes.Name=\u30bb\u30ec\u30fc\u30b7\u30e7\u30f3\u30b9\u30c8\u30e9\u30a4\u30af 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.SerratedStrikes.Stat=\u30bb\u30ec\u30fc\u30b7\u30e7\u30f3\u30b9\u30c8\u30e9\u30a4\u30af\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 @@ -420,17 +441,17 @@ 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=\u7834\u88c2\u306e\u78ba\u7387 Swords.SubSkill.Rupture.Stat.Extra=\u7834\u88c2: &a{0} ticks [{1} DMG vs Player] [{2} DMG vs Mobs] -Swords.Effect.4=\u92f8\u6b6f\u72b6\u306e\u653b\u6483\u306e\u7834\u88c2+ +Swords.Effect.4=\u30bb\u30ec\u30fc\u30b7\u30e7\u30f3\u30b9\u30c8\u30e9\u30a4\u30af\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=&a**\u92f8\u6b6f\u72b6\u306e\u653b\u6483 \u30a2\u30af\u30c6\u30a3\u30d9\u30fc\u30c8** -Swords.Skills.SS.Refresh=&e\u92f8\u6b6f\u72b6\u306e\u653b\u6483 &a\u30a2\u30d3\u30ea\u30c6\u30a3\u304c\u56de\u5fa9\u3057\u307e\u3057\u305f\uff01 -Swords.Skills.SS.Other.Off=&e{0}\u304c &f\u92f8\u6b6f\u72b6\u306e\u653b\u6483 &a\u3092\u6d88\u8017\u3057\u305f -Swords.Skills.SS.Other.On=&a{0}&2 \u304c &c\u92f8\u6b6f\u72b6\u306e\u653b\u6483 &2\u3092\u4f7f\u3063\u305f\uff01 +Swords.Skills.SS.Off=**\u30bb\u30ec\u30fc\u30b7\u30e7\u30f3\u30b9\u30c8\u30e9\u30a4\u30af \u3092\u6d88\u8017\u3057\u305f** +Swords.Skills.SS.On=&a**\u30bb\u30ec\u30fc\u30b7\u30e7\u30f3\u30b9\u30c8\u30e9\u30a4\u30af \u30a2\u30af\u30c6\u30a3\u30d9\u30fc\u30c8** +Swords.Skills.SS.Refresh=&e\u30bb\u30ec\u30fc\u30b7\u30e7\u30f3\u30b9\u30c8\u30e9\u30a4\u30af &a\u30a2\u30d3\u30ea\u30c6\u30a3\u304c\u56de\u5fa9\u3057\u307e\u3057\u305f\uff01 +Swords.Skills.SS.Other.Off=&e{0}\u304c &f\u30bb\u30ec\u30fc\u30b7\u30e7\u30f3\u30b9\u30c8\u30e9\u30a4\u30af &a\u3092\u6d88\u8017\u3057\u305f +Swords.Skills.SS.Other.On=&a{0}&2 \u304c &c\u30bb\u30ec\u30fc\u30b7\u30e7\u30f3\u30b9\u30c8\u30e9\u30a4\u30af &2\u3092\u4f7f\u3063\u305f\uff01 # TAMING Taming.Ability.Bonus.0=\u74b0\u5883\u306b\u914d\u616e @@ -451,19 +472,19 @@ Taming.Ability.Locked.2=\u30ed\u30c3\u30af\u3055\u308c\u308b\u307e\u3067 {0}+ \u 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.Combat.Chance.Gore=\u6d41\u8840\u306e\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.Name=\u30b3\u30fc\u30eb\u30aa\u30d6\u30b6\u30ef\u30a4\u30eb\u30c9 Taming.SubSkill.CallOfTheWild.Description=\u52d5\u7269\u3092\u53ec\u559a\u3059\u308b\u3002 Taming.SubSkill.CallOfTheWild.Description.2=&7COTW: \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.Name=\u6d41\u8840 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 @@ -477,15 +498,16 @@ Taming.SubSkill.Pummel.TargetMessage=\u72fc\u306b\u30ce\u30c3\u30af\u30d0\u30c3\ Taming.Listener.Wolf=&8\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]]{1}[[GRAY]]\u304c[[DARK_AQUA]]{0}[[GRAY]]\u500b\u5fc5\u8981\u3067\u3059\u3002 -Taming.Summon.Name.Format=[[GOLD]](COTW) [[WHITE]]{0} {1} +Taming.Summon.COTW.Success.WithoutLifespan=&a(\u30b3\u30fc\u30eb\u30aa\u30d6\u30b6\u30ef\u30a4\u30eb\u30c9) &7\u3042\u306a\u305f\u306f&6{0}&7\u3092\u53ec\u559a\u3057\u307e\u3057\u305f&7 +Taming.Summon.COTW.Success.WithLifespan=&a(\u30b3\u30fc\u30eb\u30aa\u30d6\u30b6\u30ef\u30a4\u30eb\u30c9) &6{0}&7\u3092\u53ec\u559a\u3057\u307e\u3057\u305f\u304c\u3001\u6301\u7d9a\u6642\u9593\u306f&6{1}&7\u79d2\u3067\u3059\u3002 +Taming.Summon.COTW.Limit=&a(\u30b3\u30fc\u30eb\u30aa\u30d6\u30b6\u30ef\u30a4\u30eb\u30c9) &6{0}&7\u306f\u540c\u6642\u306b&6{1}&7\u5339\u3057\u304b\u53ec\u559a\u3067\u304d\u307e\u305b\u3093\u3002 +Taming.Summon.COTW.TimeExpired=&a(\u30b3\u30fc\u30eb\u30aa\u30d6\u30b6\u30ef\u30a4\u30eb\u30c9) &7\u6642\u9593\u5207\u308c\u3067&6{0}&7\u304c\u7acb\u3061\u53bb\u308a\u307e\u3057\u305f\u3002 +Taming.Summon.COTW.Removed=&a(\u30b3\u30fc\u30eb\u30aa\u30d6\u30b6\u30ef\u30a4\u30eb\u30c9) &7\u3042\u306a\u305f\u306e\u53ec\u559a\u3057\u305f&6{0}&7\u306f\u30ef\u30fc\u30eb\u30c9\u304b\u3089\u6d88\u3048\u307e\u3057\u305f\u3002 +Taming.Summon.COTW.BreedingDisallowed=&a(\u30b3\u30fc\u30eb\u30aa\u30d6\u30b6\u30ef\u30a4\u30eb\u30c9) &4\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=&a(\u30b3\u30fc\u30eb\u30aa\u30d6\u30b6\u30ef\u30a4\u30eb\u30c9) &e{1}&7\u304c&3{0}&7\u500b\u5fc5\u8981\u3067\u3059\u3002 +Taming.Summon.Name.Format=&6(COTW) &f{0} {1} # UNARMED -Unarmed.Ability.Bonus.0=\u9244\u8155\u30b9\u30bf\u30a4\u30eb +Unarmed.Ability.Bonus.0=\u30b9\u30c1\u30fc\u30eb\u30a2\u30fc\u30e0\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=&a\u30a2\u30a4\u30a2\u30f3\u30b0\u30ea\u30c3\u30d7\u304c\u6b66\u88c5\u89e3\u9664\u3092\u9632\u304e\u307e\u3057\u305f\uff01 @@ -496,18 +518,18 @@ Unarmed.SubSkill.Berserk.Description=+50% \u30c0\u30e1\u30fc\u30b8, \u5f31\u3044 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.Disarm.Stat=\u6b66\u88c5\u89e3\u9664\u306e\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.SteelArmStyle.Name=\u30b9\u30c1\u30fc\u30eb\u30a2\u30fc\u30e0\u30b9\u30bf\u30a4\u30eb +Unarmed.SubSkill.SteelArmStyle.Description=\u6642\u9593\u304c\u7d4c\u3064\u3068\u8155\u304c\u786c\u304f\u306a\u308b +Unarmed.SubSkill.ArrowDeflect.Name=\u30a2\u30ed\u30fc\u30c7\u30a3\u30d5\u30ec\u30af\u30b7\u30e7\u30f3 Unarmed.SubSkill.ArrowDeflect.Description=\u77e2\u3092\u305d\u3089\u3059\u3002 -Unarmed.SubSkill.ArrowDeflect.Stat=\u77e2\u3092\u305d\u3089\u3059 \u78ba\u7387 +Unarmed.SubSkill.ArrowDeflect.Stat=\u77e2\u3092\u305d\u3089\u3059\u306e\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.IronGrip.Stat=\u30a2\u30a4\u30a2\u30f3\u30b0\u30ea\u30c3\u30d7\u306e\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: @@ -527,9 +549,14 @@ Woodcutting.SubSkill.TreeFeller.Description=\u6728\u3092\u7206\u767a\u3055\u305b 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.KnockOnWood.Name=\u30ce\u30c3\u30af\u30aa\u30f3\u30a6\u30c3\u30c9 +Woodcutting.SubSkill.KnockOnWood.Description=\u30c4\u30ea\u30fc\u30fb\u30d5\u30a7\u30e9\u30fc\u3092\u4f7f\u7528\u3057\u3066\u3044\u308b\u5834\u5408\u3001\u3055\u3089\u306b\u304a\u5f97\u306a\u30b0\u30c3\u30ba\u3092\u63a2\u3059\u3053\u3068\u304c\u3067\u304d\u308b\u3002 +Woodcutting.SubSkill.KnockOnWood.Stat=\u30ce\u30c3\u30af\u30aa\u30f3\u30a6\u30c3\u30c9 +Woodcutting.SubSkill.KnockOnWood.Loot.Normal=\u6728\u304b\u3089\u306e\u6a19\u6e96\u7684\u306a\u30a2\u30a4\u30c6\u30e0 +Woodcutting.SubSkill.KnockOnWood.Loot.Rank2=\u6728\u304b\u3089\u306e\u6a19\u6e96\u7684\u306a\u30a2\u30a4\u30c6\u30e0\u3068\u7d4c\u9a13\u5024\u30aa\u30fc\u30d6 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.HarvestLumber.Stat=\u30c9\u30ed\u30c3\u30d7\u4e8c\u500d\u306e\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 @@ -579,6 +606,7 @@ Commands.Cooldowns.Header=&6--= &amcMMO \u30a2\u30d3\u30ea\u30c6\u30a3 \u30af\u3 Commands.Cooldowns.Row.N=\ &c{0}&f - &6\u6b8b\u308a {1} \u79d2 Commands.Cooldowns.Row.Y=\ &b{0}&f - &2\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.Cooldown=\u3053\u306e\u30b3\u30de\u30f3\u30c9\u3092\u518d\u5ea6\u4f7f\u7528\u3059\u308b\u524d\u306b {0} \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= &c\u30d7\u30ec\u30a4\u30e4\u30fc\u304c\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306b\u5b58\u5728\u3057\u307e\u305b\u3093\uff01 @@ -696,6 +724,8 @@ Commands.Scoreboard.Help.2=&3/mcscoreboard&b keep &f - mcMMO\u30b9\u30b3\u30a2\u Commands.Scoreboard.Help.3=&3/mcscoreboard&b time [n] &f - mcMMO\u30b9\u30b3\u30a2\u30dc\u30fc\u30c9\u3092&dn&f\u79d2\u5f8c\u306b\u30af\u30ea\u30a2\u3059\u308b Commands.Scoreboard.Tip.Keep=&6\u30d2\u30f3\u30c8: \u30b9\u30b3\u30a2\u30dc\u30fc\u30c9\u304c\u8868\u793a\u3055\u308c\u3066\u3044\u308b\u9593\u306b&c/mcscoreboard keep&6\u3092\u4f7f\u7528\u3057\u3066\u6d88\u3048\u306a\u3044\u3088\u3046\u306b\u3059\u308b\u3002 Commands.Scoreboard.Tip.Clear=&6\u30d2\u30f3\u30c8: &c/mcscoreboard clear&6\u3092\u4f7f\u7528\u3057\u3066\u30b9\u30b3\u30a2\u30dc\u30fc\u30c9\u3092\u6d88\u53bb\u3059\u308b\u3002 +Commands.XPBar.Reset=&6mcMMO\u306eXP Bar\u306e\u8a2d\u5b9a\u304c\u30ea\u30bb\u30c3\u30c8\u3055\u308c\u307e\u3057\u305f\u3002 +Commands.XPBar.SettingChanged=&6a{0} &6\u306eXP\u30d0\u30fc\u8a2d\u5b9a\u3092 &a{1} \u306b\u5909\u66f4\u3057\u307e\u3057\u305f\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 &9{0}&e \u30ea\u30fc\u30c0\u30fc\u30dc\u30fc\u30c9-- @@ -706,6 +736,7 @@ Commands.Usage.0=&c\u9069\u5207\u306a\u4f7f\u7528\u6cd5\u306f /{0} Commands.Usage.1=&c\u9069\u5207\u306a\u4f7f\u7528\u6cd5\u306f /{0} {1} Commands.Usage.2=&c\u9069\u5207\u306a\u4f7f\u7528\u6cd5\u306f /{0} {1} {2} Commands.Usage.3=&c\u9069\u5207\u306a\u4f7f\u7528\u6cd5\u306f /{0} {1} {2} {3} +Commands.Usage.3.XP=&c\u9069\u5207\u306a\u4f7f\u7528\u6cd5\u306f /{0} {1} {2} {3} &7(\u6700\u5f8c\u306b-s\u3092\u5165\u308c\u308b\u3053\u3068\u3067\u3001\u30d7\u30ec\u30a4\u30e4\u30fc\u306b\u77e5\u3089\u305b\u305a\u306b\u30b3\u30de\u30f3\u30c9\u3092\u5b9f\u884c\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059) Commands.Usage.FullClassName=\u30af\u30e9\u30b9\u540d Commands.Usage.Level=\u30ec\u30d9\u30eb Commands.Usage.Message=\u30e1\u30c3\u30bb\u30fc\u30b8 @@ -828,7 +859,7 @@ Commands.xprate.modified=&cXP\u30ec\u30fc\u30c8\u306f{0}\u306b\u5909\u66f4\u3055 Commands.xprate.over=&cmcMMO XP\u30ec\u30fc\u30c8\u30a4\u30d9\u30f3\u30c8\u304c\u7d42\u308f\u308a\u307e\u3057\u305f\uff01 Commands.xprate.proper.0=&cXP\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=&cXP\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=&cXP\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=&cxp\u30a4\u30d9\u30f3\u30c8\u304b\u3092\u793a\u3059\u305f\u3081\u306btrue\u307e\u305f\u306ffalse\u3092\u6307\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002 Commands.NegativeNumberWarn=\u8ca0\u306e\u5024\u3092\u4f7f\u308f\u306a\u3044\u3067\u304f\u3060\u3055\u3044\u3002 Commands.Event.Start=&amcMMO&6 \u30a4\u30d9\u30f3\u30c8\uff01 Commands.Event.Stop=&amcMMO&3 \u30a4\u30d9\u30f3\u30c8\u7d42\u4e86\uff01 @@ -857,100 +888,99 @@ Guides.Page.OutOfRange=\u305d\u306e\u30da\u30fc\u30b8\u306f\u5b58\u5728\u3057\u3 Guides.Usage=\u4f7f\u3044\u65b9\u306f /{0} ? [\u30da\u30fc\u30b8] \u3067\u3059\u3002 ## Acrobatics Guides.Acrobatics.Section.0=&3\u30a2\u30af\u30ed\u30d0\u30c6\u30a3\u30c3\u30af\u306b\u3064\u3044\u3066\uff1a\n&e\u30a2\u30af\u30ed\u30d0\u30c6\u30a3\u30c3\u30af\u306f\u3001mcMMO\u3067\u512a\u96c5\u306b\u52d5\u304f\u82b8\u8853\u3067\u3059\u3002\n&e\u30a2\u30af\u30ed\u30d0\u30c6\u30a3\u30c3\u30af\u306f\u3001mcMMO\u3067\u512a\u96c5\u306b\u52d5\u304f\u82b8\u8853\u3067\u3059\u3002\n\n&3XP\u7372\u5f97\uff1a\n&e\u3053\u306e\u30b9\u30ad\u30eb\u3067XP\u3092\u7372\u5f97\u3059\u308b\u306b\u306f\u3001\u6226\u95d8\u3067\u8eb1\u3059\u304b\\&en\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=&3\u53d7\u3051\u8eab\u306f\u3069\u306e\u3088\u3046\u306b\u6a5f\u80fd\u3057\u307e\u3059\u304b\uff1f\r\n&e\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&e\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.1=&3\u53d7\u3051\u8eab\u306f\u3069\u306e\u3088\u3046\u306b\u6a5f\u80fd\u3057\u307e\u3059\u304b\uff1f\n&e\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&e\u843d\u4e0b\u4e2d\u306b\u30b9\u30cb\u30fc\u30af\u3059\u308b\u3053\u3068\u3067\u78ba\u7387\u3092\u500d\u5897\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002 Guides.Acrobatics.Section.2=&3\u8eb1\u3059\u306f\u3069\u306e\u3088\u3046\u306b\u6a5f\u80fd\u3057\u307e\u3059\u304b\uff1f\n&e\u8eb1\u3059\u306f\u78ba\u7387\u3067\u6226\u95d8\u3067\u8ca0\u50b7\u3057\u305f\u3068\u304d\u306b\\n&e\u53d7\u3051\u305f\u30c0\u30e1\u30fc\u30b8\u3092\u534a\u5206\u306b\u3057\u307e\u3059\u3002\\n&e\u30b9\u30ad\u30eb\u30ec\u30d9\u30eb\u306b\u95a2\u4fc2\u3057\u3066\u3044\u307e\u3059\u3002 ## Alchemy -Guides.Alchemy.Section.0=&3\u932c\u91d1\u8853\u306b\u3064\u3044\u3066\uff1a\n&e\u932c\u91d1\u8853\u306f\u30dd\u30fc\u30b7\u30e7\u30f3\u306e\u91b8\u9020\u306b\u95a2\u3059\u308b\u3082\u306e\u3067\u3059\u3002\n&e\u30dd\u30fc\u30b7\u30e7\u30f3\u306e\u91b8\u9020\u6642\u9593\u3092\u77ed\u7e2e\u3057\u3066\u3001\n&e\u65b0\u3057\u3044\u8ffd\u52a0\u3055\u308c\u305f\u30dd\u30fc\u30b7\u30e7\u30f3\u3092\u5165\u624b\u3067\u304d\u307e\u3059\u3002\n\n\n&3XP \u7372\u5f97:\n&e\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=&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) +Guides.Alchemy.Section.1=&3\u89e6\u5a92\u306e\u52b9\u679c\u306f\uff1f\n&e\u89e6\u5a92\u306f\u91b8\u9020\u306e\u901f\u5ea6\u3092\u901f\u3081\u3001\n&e\u30ec\u30d9\u30eb1000\u3067\u6700\u59274\u500d\u306e\u901f\u5ea6\u306b\u306a\u308a\u307e\u3059\u3002\n&e\u3053\u306e\u30a2\u30d3\u30ea\u30c6\u30a3\u306f\u30c7\u30d5\u30a9\u30eb\u30c8\u3067\u306f\u30ec\u30d9\u30eb100\u3067\u30a2\u30f3\u30ed\u30c3\u30af\u3055\u308c\u308b\u3002 +Guides.Alchemy.Section.2=&3\u8abf\u5408\u306e\u52b9\u679c\u306f\uff1f\n&e\u8abf\u5408\u3067\u306f\u6750\u6599\u3092\u4f7f\u3063\u3066\u3001\u3088\u308a\u591a\u304f\u306e\u30dd\u30fc\u30b7\u30e7\u30f3\u3092\u4f5c\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\n&e\u3069\u306e\u6750\u6599\u304c\u30a2\u30f3\u30ed\u30c3\u30af\u3055\u308c\u308b\u304b\u306f\u3001\u30e9\u30f3\u30af\u306b\u3088\u3063\u3066\u6c7a\u5b9a\u3055\u308c\u307e\u3059\u3002\n&e\u89e3\u9664\u3067\u304d\u308b\u30e9\u30f3\u30af\u306f\uff18\u3064\u3067\u3059\u3002 +Guides.Alchemy.Section.3=&3\u8abf\u5408 \u30c6\u30a3\u30a21\u306e\u6750\u6599\uff1a\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\u8abf\u5408 \u30c6\u30a3\u30a22\u306e\u6750\u6599\uff1a\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\u8abf\u5408 \u30c6\u30a3\u30a24\u306e\u6750\u6599\uff1a\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\u8abf\u5408 \u30c6\u30a3\u30a26\u306e\u6750\u6599\uff1a\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=&3\u5f13\u306b\u3064\u3044\u3066\uff1a\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. +Guides.Archery.Section.1=&3\u30b9\u30ad\u30eb\u30b7\u30e7\u30c3\u30c8\u306e\u52b9\u679c\u306f\uff1f\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\u5e7b\u60d1\u306e\u52b9\u679c\u306f\uff1f\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\u30a2\u30ed\u30fc\u30ea\u30c8\u30ea\u30fc\u30d6\u306e\u52b9\u679c\u306f\uff1f\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=&3\u65a7\u306b\u3064\u3044\u3066\uff1a\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. +Guides.Axes.Section.1=&3\u30b9\u30ab\u30eb\u30b9\u30d7\u30ea\u30c3\u30bf\u30fc\u306e\u52b9\u679c\u306f\uff1f\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\u30af\u30ea\u30c6\u30a3\u30ab\u30eb\u30b9\u30c8\u30e9\u30a4\u30af\u306e\u52b9\u679c\u306f\uff1f\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\u30a2\u30c3\u30af\u30b9\u30de\u30b9\u30bf\u30ea\u30fc\u306e\u52b9\u679c\u306f\uff1f\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\u30a2\u30fc\u30de\u30fc\u30a4\u30f3\u30d1\u30af\u30c8\u306e\u52b9\u679c\u306f\uff1f\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\u30b0\u30ec\u30fc\u30bf\u30fc\u30a4\u30f3\u30d1\u30af\u30c8\u306e\u52b9\u679c\u306f\uff1f\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=&3\u6398\u524a\u306b\u3064\u3044\u3066\uff1a\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. +Guides.Excavation.Section.1=&3\u4e92\u63db\u6027\u306e\u3042\u308b\u30d6\u30ed\u30c3\u30af\uff1a\n&eGrass, Dirt, Sand, Clay, Gravel, Mycelium, Soul Sand, Snow +Guides.Excavation.Section.2=&3\u30ae\u30ac\u30c9\u30ea\u30eb\u30d6\u30ec\u30fc\u30ab\u30fc\u3092\u4f7f\u3046\u306b\u306f\u3069\u3046\u3059\u308c\u3070\u3044\u3044\u3067\u3059\u304b\uff1f\uff1a\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\u30ae\u30ac\u30c9\u30ea\u30eb\u30d6\u30ec\u30fc\u30ab\u30fc\u3068\u306f\uff1f\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\u8003\u53e4\u5b66\u306e\u52b9\u679c\u306f\uff1f\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\u6398\u524a\u306b\u3064\u3044\u3066\u306e\u6ce8\u610f\u4e8b\u9805:\n&eExcavation drops are completely customizeable\n&eSo results vary server to server. ## Fishing Guides.Fishing.Section.0=&3\u91e3\u308a\u306b\u3064\u3044\u3066\uff1a\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. +Guides.Fishing.Section.1=&3\u30c8\u30ec\u30b8\u30e3\u30fc\u30cf\u30f3\u30bf\u30fc\u306e\u52b9\u679c\u306f\uff1f\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\u30a2\u30a4\u30b9\u30d5\u30a3\u30c3\u30b7\u30f3\u30b0\u306e\u52b9\u679c\u306f\uff1f\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\u30de\u30b9\u30bf\u30fc\u30a2\u30f3\u30b0\u30e9\u30fc\u306e\u52b9\u679c\u306f\uff1f\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\u30b7\u30a7\u30a4\u30af\u306f\u3069\u306e\u3088\u3046\u306b\u52d5\u4f5c\u3057\u307e\u3059\u304b\uff1f\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\u6f01\u5e2b\u306e\u98df\u4e8b\u306e\u52b9\u679c\u306f\uff1f\n&eThis passive skill increases the amount of hunger restored \n&efrom eating fish. +Guides.Fishing.Section.6=&3\u91e3\u308a\u306b\u95a2\u3059\u308b\u6ce8\u610f\u4e8b\u9805:\n&eFishing drops are completely customizable,\n&eso results vary server to server. ## Herbalism Guides.Herbalism.Section.0=&3\u8fb2\u696d\u306b\u3064\u3044\u3066\uff1a\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. +Guides.Herbalism.Section.1=&3\u4e92\u63db\u6027\u306e\u3042\u308b\u30d6\u30ed\u30c3\u30af\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\u30b0\u30ea\u30fc\u30f3\u30c6\u30e9\u306e\u52b9\u679c\u306f\uff1f\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\u30b0\u30ea\u30fc\u30f3\u30b5\u30e0\uff08\u4f5c\u7269\uff09\u306e\u52b9\u679c\u306f\uff1f\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\u30b0\u30ea\u30fc\u30f3\u30b5\u30e0\uff08\u4e38\u77f3/\u77f3\u30ec\u30f3\u30ac/\u571f\uff09\u306e\u52b9\u679c\u306f\uff1f\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\u8fb2\u5bb6\u306e\u98df\u4e8b\u306e\u52b9\u679c\u306f\uff1f\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\u30cf\u30a4\u30ea\u30a2\u30f3\u30e9\u30c3\u30af\u306e\u52b9\u679c\u306f\uff1f\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\u30c9\u30ed\u30c3\u30d7\u4e8c\u500d\u306e\u52b9\u679c\u306f\uff1f\n&eThis passive ability gives players more yield from their\n&eharvests. ## Mining Guides.Mining.Section.0=&3\u63a1\u6398\u306b\u3064\u3044\u3066\uff1a\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. +Guides.Mining.Section.1=&3\u4e92\u63db\u6027\u306e\u3042\u308b\u30d6\u30ed\u30c3\u30af:\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\u30b9\u30fc\u30d1\u30fc\u30d6\u30ec\u30a4\u30ab\u30fc\u3092\u4f7f\u3046\u306b\u306f\u3069\u3046\u3059\u308c\u3070\u3044\u3044\u3067\u3059\u304b\uff1f\uff1a\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\u30b9\u30fc\u30d1\u30fc\u30d6\u30ec\u30a4\u30ab\u30fc\u3068\u306f\uff1f\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\u30d6\u30e9\u30b9\u30c8\u30de\u30a4\u30cb\u30f3\u30b0\u3092\u4f7f\u3046\u306b\u306f\u3069\u3046\u3059\u308c\u3070\u3044\u3044\u3067\u3059\u304b\uff1f\uff1a\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\u30d6\u30e9\u30b9\u30c8\u30de\u30a4\u30cb\u30f3\u30b0\u306e\u52b9\u679c\u306f\uff1f\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=&3\u4fee\u7406\u306b\u3064\u3044\u3066\uff1a\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. +Guides.Repair.Section.1=&3\u4fee\u7406\u3092\u4f7f\u3046\u306b\u306f\u3069\u3046\u3059\u308c\u3070\u3044\u3044\u3067\u3059\u304b\uff1f\uff1a\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\u30ea\u30da\u30a2\u30de\u30b9\u30bf\u30ea\u30fc\u306e\u52b9\u679c\u306f\uff1f\n&eRepair Mastery increases the repair amount. The extra amount\n&erepaired is influenced by your Repair skill level. +Guides.Repair.Section.3=&3\u30b9\u30fc\u30d1\u30fc\u30ea\u30da\u30a2\u306e\u52b9\u679c\u306f\uff1f\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\u30a2\u30eb\u30ab\u30f3\u30d5\u30a9\u30fc\u30b8\u30f3\u30b0\u306e\u52b9\u679c\u306f\uff1f\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=&3\u30b5\u30eb\u30d9\u30fc\u30b8\u306b\u3064\u3044\u3066\uff1a\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. +Guides.Salvage.Section.1=&3\u30b5\u30eb\u30d9\u30fc\u30b8\u3092\u4f7f\u3046\u306b\u306f\u3069\u3046\u3059\u308c\u3070\u3044\u3044\u3067\u3059\u304b\uff1f\uff1a\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\u30a2\u30c9\u30d0\u30f3\u30b9\u30c9\u30b5\u30eb\u30d9\u30fc\u30b8\u306e\u52b9\u679c\u306f\uff1f\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\u3053\u308c\u304c\u3069\u306e\u3088\u3046\u306b\u52d5\u4f5c\u3059\u308b\u304b\u3092\u8aac\u660e\u3059\u308b\u305f\u3081\u306b\u3001\u4ee5\u4e0b\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059:\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\u30a2\u30eb\u30ab\u30f3\u30b5\u30eb\u30d9\u30fc\u30b8\u306e\u52b9\u679c\u306f\uff1f\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=&3\u5263\u306b\u3064\u3044\u3066\uff1a\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 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. +Guides.Swords.Section.1=&3\u30bb\u30ec\u30fc\u30b7\u30e7\u30f3\u30b9\u30c8\u30e9\u30a4\u30af\u306e\u52b9\u679c\u306f\uff1f\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\u30ab\u30a6\u30f3\u30bf\u30fc\u653b\u6483\u306e\u52b9\u679c\u306f\uff1f\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\u7834\u88c2\u306e\u52b9\u679c\u306f\uff1f\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=&3\u8abf\u6559\u306b\u3064\u3044\u3066\uff1a\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=[DARK_AQUA]]How 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. +Guides.Taming.Section.1=&3\u30b3\u30fc\u30eb\u30aa\u30d6\u30b6\u30ef\u30a4\u30eb\u30c9\u306e\u52b9\u679c\u306f\uff1f\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\u30d3\u30fc\u30b9\u30c8\u30ed\u30a2\u306e\u52b9\u679c\u306f\uff1f\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\u6d41\u8840\u306e\u52b9\u679c\u306f\uff1f\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\u92ed\u3044\u722a\u306e\u52b9\u679c\u306f\uff1f\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\u74b0\u5883\u914d\u616e\u306e\u52b9\u679c\u306f\uff1f\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\u539a\u3044\u6bdb\u76ae\u306e\u52b9\u679c\u306f\uff1f\n&eThis passive ability will reduce damage and make wolves\n&efire resistant. +Guides.Taming.Section.7=&3\u885d\u6483\u8010\u6027\u306e\u52b9\u679c\u306f\uff1f\n&eThis passive ability reduces damage done to wolves\n&efrom explosions. +Guides.Taming.Section.8=&3\u30d5\u30a1\u30fc\u30b9\u30c8\u30d5\u30fc\u30c9\u30b5\u30fc\u30d3\u30b9\u306e\u52b9\u679c\u306f\uff1f\n&eThis passive ability gives wolves a chance to heal whenever\nðey perform an attack. ## Unarmed Guides.Unarmed.Section.0=&3\u7d20\u624b\u306b\u3064\u3044\u3066\uff1a\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. +Guides.Unarmed.Section.1=&3\u30d0\u30fc\u30b5\u30fc\u30ab\u30fc\u306e\u52b9\u679c\u306f\uff1f\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\u30b9\u30c1\u30fc\u30eb\u30a2\u30fc\u30e0\u30b9\u30bf\u30a4\u30eb\u306e\u52b9\u679c\u306f\uff1f\n&eSteel Arm Style increases the damage dealt when hitting mobs or\n&eplayers with your fists. +Guides.Unarmed.Section.3=&3\u30a2\u30ed\u30fc\u30c7\u30a3\u30d5\u30ec\u30af\u30b7\u30e7\u30f3\u306e\u52b9\u679c\u306f\uff1f\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\u30a2\u30a4\u30a2\u30f3\u30b0\u30ea\u30c3\u30d7\u306e\u52b9\u679c\u306f\uff1f\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\u6b66\u88c5\u89e3\u9664\u306e\u52b9\u679c\u306f\uff1f\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=&3\u6728\u3053\u308a\u306b\u3064\u3044\u3066\uff1a\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. +Guides.Woodcutting.Section.1=&3\u30c4\u30ea\u30fc\u30d5\u30a7\u30e9\u30fc\u306e\u52b9\u679c\u306f\uff1f\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\u30ea\u30fc\u30d5\u30d6\u30ed\u30ef\u30fc\u306e\u52b9\u679c\u306f\uff1f\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\u30c9\u30ed\u30c3\u30d7\u4e8c\u500d\u306e\u52b9\u679c\u306f\uff1f\n&eThis passive ability gives you a chance to obtain an extra\n&eblock for every log you chop. # INSPECT Inspect.Offline= &c\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 @@ -972,7 +1002,7 @@ Item.FluxPickaxe.Lore.1=&7\u9271\u77f3\u304c\u88fd\u932c\u3055\u308c\u3066\u30c9 Item.FluxPickaxe.Lore.2=&7\u88fd\u932c\u30ec\u30d9\u30eb {0}+ \u304c\u5fc5\u8981 # TELEPORTATION -Teleport.Commencing=&6({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.Commencing=&6({0})&7\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=&4\u30c6\u30ec\u30dd\u30fc\u30c8\u306f\u30ad\u30e3\u30f3\u30bb\u30eb\u3055\u308c\u307e\u3057\u305f\u3002 # SKILLS @@ -986,6 +1016,8 @@ Skills.Stats={0}&a{1}&3 XP(&7{2}&3/&7{3}&3) Skills.ChildStats={0}&a{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 &e({0}\u79d2) +Skills.TooTired.Named=&7(&6{0}&e {1}\u79d2&7) +Skills.TooTired.Extra=&6{0} &e\u30b9\u30fc\u30d1\u30fc\u30a2\u30d3\u30ea\u30c6\u30a3CD - {1} Skills.Cancelled=&6{0} &c\u30ad\u30e3\u30f3\u30bb\u30eb\uff01 Skills.ConfirmOrCancel=&a\u3082\u3046\u4e00\u5ea6\u53f3\u30af\u30ea\u30c3\u30af\u3057\u3066&6{0}&a\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=&7\u3053\u306e\u30a2\u30d3\u30ea\u30c6\u30a3\u3092\u4f7f\u3046\u305f\u3081\u306b\u306f&e{0}&7\u30ec\u30d9\u30eb\u306e&3{1}&7\u304c\u5fc5\u8981\u3067\u3059\u3002 @@ -1042,12 +1074,12 @@ Smelting.SubSkill.FuelEfficiency.Description=\u88fd\u932c\u6642\u306b\u7ac8\u306 Smelting.SubSkill.FuelEfficiency.Stat=\u71c3\u6599\u52b9\u7387 \u4e57\u6570: &e{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.SubSkill.SecondSmelt.Stat=\u7b2c\u4e8c\u7cbe\u932c\u306e\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.SubSkill.FluxMining.Stat=\u30d5\u30e9\u30c3\u30af\u30b9\u30de\u30a4\u30cb\u30f3\u30b0\u306e\u78ba\u7387 Smelting.Listener=\u7cbe\u932c: Smelting.SkillName=\u7cbe\u932c @@ -1122,6 +1154,19 @@ Locale.Reloaded=&a\u30ed\u30b1\u30fc\u30eb \u30ea\u30ed\u30fc\u30c9\uff01 # Player Leveling Stuff LevelCap.PowerLevel=&6(&amcMMO&6) &c{0}&e\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=&6(&amcMMO&6) &6{1}&e\u306e\u30ec\u30d9\u30eb\u30ad\u30e3\u30c3\u30d7&c{0}&e\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 -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. +Commands.XPBar.Usage=\u4f7f\u3044\u65b9\u306f /mmoxpbar +Commands.Description.mmoxpbar=mcMMO XP\u30d0\u30fc\u306e\u30d7\u30ec\u30a4\u30e4\u30fc\u8a2d\u5b9a +Commands.Description.mmocompat=mcMMO\u306b\u3064\u3044\u3066\u306e\u60c5\u5831\u3068\u3001\u4e92\u63db\u6027\u30e2\u30fc\u30c9\u304b\u5b8c\u5168\u306b\u6a5f\u80fd\u3057\u3066\u3044\u308b\u304b\u3069\u3046\u304b\u306e\u60c5\u5831\u3002 +Compatibility.Layer.Unsupported=&a{0}&6\u306e\u4e92\u63db\u6027\u306f\u3001\u3053\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u306eMinecraft\u3067\u306f\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002 +Compatibility.Layer.PartialSupport=&a{0}&6\u306e\u4e92\u63db\u6027\u306f\u3053\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u306eMinecraft\u3067\u306f\u5b8c\u5168\u306b\u306f\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u304c\u3001mcMMO\u306f\u4e0d\u8db3\u3057\u3066\u3044\u308b\u6a5f\u80fd\u306e\u4e00\u90e8\u3092\u30a8\u30df\u30e5\u30ec\u30fc\u30c8\u3059\u308b\u305f\u3081\u306b\u30bb\u30ab\u30f3\u30c0\u30ea\u30b7\u30b9\u30c6\u30e0\u3092\u5b9f\u884c\u3057\u3066\u3044\u307e\u3059\u3002 +Commands.XPBar.DisableAll=&6 \u3059\u3079\u3066\u306emcMMO XP\u30d0\u30fc\u304c\u7121\u52b9\u306b\u306a\u3063\u305f\u306e\u3067\u3001/mmoxpbar reset\u3092\u4f7f\u7528\u3057\u3066\u30c7\u30d5\u30a9\u30eb\u30c8\u8a2d\u5b9a\u3092\u5fa9\u5143\u3002 +#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* \u30b3\u30f3\u30bd\u30fc\u30eb * +Chat.Channel.On=&6(&amcMMO-\u30c1\u30e3\u30c3\u30c8&6) &e\u30c1\u30e3\u30c3\u30c8\u30e1\u30c3\u30bb\u30fc\u30b8\u304c\u81ea\u52d5\u7684\u306b &a{0} &e\u30c1\u30e3\u30c3\u30c8\u30c1\u30e3\u30f3\u30cd\u30eb\u306b\u9001\u4fe1\u3055\u308c\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3057\u305f\u3002 +Chat.Channel.Off=&6(&amcMMO-\u30c1\u30e3\u30c3\u30c8&6) &7\u3042\u306a\u305f\u306e\u30c1\u30e3\u30c3\u30c8\u30e1\u30c3\u30bb\u30fc\u30b8\u306f\u3001\u7279\u5b9a\u306e\u30c1\u30e3\u30c3\u30c8\u30c1\u30e3\u30f3\u30cd\u30eb\u306b\u81ea\u52d5\u7684\u306b\u9001\u4fe1\u3055\u308c\u306a\u304f\u306a\u308a\u307e\u3059\u3002 +Chat.Spy.Party=&6[&eSPY&6-&a{2}&6] &r{0} &b\u2192 &r{1} +Broadcasts.LevelUpMilestone=&6(&amcMMO&6) {0} &7\u304c &3{2} \u3067\u30ec\u30d9\u30eb &a{1} &7\u306b\u5230\u9054\u3057\u307e\u3057\u305f\uff01 +Broadcasts.PowerLevelUpMilestone=&6(&amcMMO&6) {0}&7 \u306e\u30d1\u30ef\u30fc\u30ec\u30d9\u30eb\u304c &a{1} &7\u306b\u5230\u9054\u3057\u307e\u3057\u305f\uff01 \ No newline at end of file From a225d604ef7fd2ffb59454bed3905c3f09b81fa6 Mon Sep 17 00:00:00 2001 From: steve4744 Date: Mon, 25 Jan 2021 22:14:35 +0000 Subject: [PATCH 353/662] only add/remove scoreboards when teleporting if scoreboards are enabled (#4400) --- .../java/com/gmail/nossr50/listeners/PlayerListener.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java index b410a330d..284b1a2fd 100644 --- a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java @@ -72,10 +72,12 @@ public class PlayerListener implements Listener { /* WORLD BLACKLIST CHECK */ if(WorldBlacklist.isWorldBlacklisted(event.getPlayer().getWorld())) { //Remove scoreboards - ScoreboardManager.teardownPlayer(event.getPlayer()); + if(Config.getInstance().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()) && Config.getInstance().getScoreboardsEnabled()) { + //This only fires if they are travelling to a non-blacklisted world from a blacklisted world //Setup scoreboards ScoreboardManager.setupPlayer(event.getPlayer()); From c6d700c5a708ac98f6853e03697c5ea44bb81688 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 25 Jan 2021 14:37:23 -0800 Subject: [PATCH 354/662] Fixed Luck permission showing incorrect percentages to players using commands Fixed #4405 --- Changelog.txt | 5 +++ pom.xml | 2 +- .../util/random/RandomChanceSkill.java | 19 +++++++++++ .../util/random/RandomChanceSkillStatic.java | 6 ++++ .../nossr50/util/random/RandomChanceUtil.java | 33 ++++++++++++------- 5 files changed, 53 insertions(+), 12 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index aba172ec6..b6904175d 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,8 @@ +Version 2.1.173 + 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) + 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 diff --git a/pom.xml b/pom.xml index 77953dc4b..00ad0f7f4 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.172 + 2.1.173-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO 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 c77a9e9a1..92d91ec83 100644 --- a/src/main/java/com/gmail/nossr50/util/random/RandomChanceSkill.java +++ b/src/main/java/com/gmail/nossr50/util/random/RandomChanceSkill.java @@ -75,6 +75,25 @@ public class RandomChanceSkill implements RandomChanceExecution { this.maximumBonusLevelCap = RandomChanceUtil.getMaxBonusLevelCap(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; + + final McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); + if (player != null && mcMMOPlayer != null) { + this.skillLevel = mcMMOPlayer.getSkillLevel(subSkillType.getParentSkill()); + } else { + this.skillLevel = 0; + } + + 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); 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 ab5f33ecd..c96b71d6b 100644 --- a/src/main/java/com/gmail/nossr50/util/random/RandomChanceSkillStatic.java +++ b/src/main/java/com/gmail/nossr50/util/random/RandomChanceSkillStatic.java @@ -14,6 +14,12 @@ public class RandomChanceSkillStatic extends RandomChanceSkill { this.xPos = xPos; } + 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); 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 a6f27ef54..a59cd2861 100644 --- a/src/main/java/com/gmail/nossr50/util/random/RandomChanceUtil.java +++ b/src/main/java/com/gmail/nossr50/util/random/RandomChanceUtil.java @@ -45,12 +45,12 @@ public class RandomChanceUtil { } } - public static double getActivationChance(@NotNull SkillActivationType skillActivationType, @NotNull SubSkillType subSkillType, @Nullable Player player) { + 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 getRandomChanceExecutionSuccess(player, subSkillType, true); + return getRandomChanceExecutionSuccess(player, subSkillType, true, luckyOverride); case RANDOM_STATIC_CHANCE: - return getRandomStaticChanceExecutionSuccess(player, subSkillType); + return getRandomStaticChanceExecutionSuccess(player, subSkillType, luckyOverride); default: return 0.1337; } @@ -129,6 +129,10 @@ public class RandomChanceUtil { return getChanceOfSuccess(randomChance.getXPos(), randomChance.getProbabilityCap(), LINEAR_CURVE_VAR); } + 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); @@ -194,9 +198,14 @@ public class RandomChanceUtil { return calculateChanceOfSuccess(rcs); } - public static double getRandomStaticChanceExecutionSuccess(@Nullable Player player, @NotNull 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(); @@ -259,13 +268,15 @@ public class RandomChanceUtil { } public static String @NotNull [] calculateAbilityDisplayValues(@NotNull SkillActivationType skillActivationType, @NotNull Player player, @NotNull SubSkillType subSkillType) { - double successChance = getActivationChance(skillActivationType, subSkillType, player); + double successChance = getActivationChance(skillActivationType, subSkillType, player, false); + double successChanceLucky = getActivationChance(skillActivationType, subSkillType, player, true); + 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; } @@ -288,16 +299,16 @@ public class RandomChanceUtil { } public static String @NotNull [] calculateAbilityDisplayValuesCustom(@NotNull SkillActivationType skillActivationType, @NotNull Player player, @NotNull SubSkillType subSkillType, double multiplier) { - double successChance = getActivationChance(skillActivationType, subSkillType, player); + 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; } From cf21a5a1630141f06e213f5a3d23336b4d3bfe36 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 25 Jan 2021 15:02:58 -0800 Subject: [PATCH 355/662] Fishing no longer damages rod or drains hunger --- Changelog.txt | 1 + pom.xml | 4 +- .../nossr50/listeners/PlayerListener.java | 2 +- .../skills/fishing/FishingManager.java | 60 +++++++++---------- 4 files changed, 34 insertions(+), 33 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index b6904175d..9770716ec 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,4 +1,5 @@ Version 2.1.173 + 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) diff --git a/pom.xml b/pom.xml index 00ad0f7f4..2193bd517 100755 --- a/pom.xml +++ b/pom.xml @@ -212,12 +212,12 @@ net.kyori adventure-api - 4.3.0 + 4.4.0 net.kyori adventure-nbt - 4.3.0 + 4.4.0 net.kyori diff --git a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java index 284b1a2fd..d79256336 100644 --- a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java @@ -765,7 +765,7 @@ public class PlayerListener implements Listener { player.setVelocity(player.getEyeLocation().getDirection().multiply(10)); } - mcMMOPlayer.getFishingManager().setFishingRodCastTimestamp(); + //mcMMOPlayer.getFishingManager().setFishingRodCastTimestamp(); } } 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 9298665c8..0547f3f47 100644 --- a/src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java @@ -72,36 +72,36 @@ public class FishingManager extends SkillManager { 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) < 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) { From 85bf33fca0efae2e9347948ab57106583d5daa40 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 25 Jan 2021 15:06:39 -0800 Subject: [PATCH 356/662] Less XP orbs during Tree Feller + Knock on Wood Rank 2 --- Changelog.txt | 1 + .../gmail/nossr50/skills/woodcutting/WoodcuttingManager.java | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 9770716ec..b6f134509 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,4 +1,5 @@ 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) 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 cb076c652..a2bb23790 100644 --- a/src/main/java/com/gmail/nossr50/skills/woodcutting/WoodcuttingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/woodcutting/WoodcuttingManager.java @@ -308,8 +308,8 @@ public class WoodcuttingManager extends SkillManager { if(RankUtils.hasReachedRank(2, player, SubSkillType.WOODCUTTING_KNOCK_ON_WOOD)) { if(AdvancedConfig.getInstance().isKnockOnWoodXPOrbEnabled()) { - if(RandomChanceUtil.rollDice(75, 100)) { - int randOrbCount = Math.max(1, Misc.getRandom().nextInt(20)); + if(RandomChanceUtil.rollDice(10, 100)) { + int randOrbCount = Math.max(1, Misc.getRandom().nextInt(100)); Misc.spawnExperienceOrb(blockState.getLocation(), randOrbCount); } } From d9740bdfb858c67285bdeab7fb49b06f6e1a29d2 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 25 Jan 2021 15:09:51 -0800 Subject: [PATCH 357/662] kyori dependency 4.3.0 to 4.4.0 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 2193bd517..7266b8b10 100755 --- a/pom.xml +++ b/pom.xml @@ -237,7 +237,7 @@ net.kyori adventure-text-serializer-gson-legacy-impl - 4.3.0 + 4.4.0 org.apache.maven.scm From b94b14a06c9f91c0e84cc5abe16eb61b7c49fdcd Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 25 Jan 2021 17:23:46 -0800 Subject: [PATCH 358/662] Add missing adventure-key library --- pom.xml | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/pom.xml b/pom.xml index 7266b8b10..dea0cedd7 100755 --- a/pom.xml +++ b/pom.xml @@ -110,6 +110,7 @@ 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 @@ -207,7 +208,7 @@ net.kyori adventure-text-serializer-gson - 4.3.0 + 4.4.0 net.kyori @@ -219,6 +220,16 @@ adventure-nbt 4.4.0 + + net.kyori + adventure-key + 4.4.0 + + + net.kyori + adventure-text-serializer-gson-legacy-impl + 4.4.0 + net.kyori adventure-platform-bukkit @@ -234,11 +245,6 @@ adventure-platform-common 4.0.0-SNAPSHOT - - net.kyori - adventure-text-serializer-gson-legacy-impl - 4.4.0 - org.apache.maven.scm maven-scm-provider-gitexe From 998495f2682095d57fae247508deb760d872b381 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 25 Jan 2021 17:27:37 -0800 Subject: [PATCH 359/662] 2.1.173 --- Changelog.txt | 1 + pom.xml | 2 +- .../java/com/gmail/nossr50/skills/fishing/FishingManager.java | 2 -- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index b6f134509..e3b0fe1fb 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -4,6 +4,7 @@ Version 2.1.173 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) diff --git a/pom.xml b/pom.xml index dea0cedd7..d1e296837 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.173-SNAPSHOT + 2.1.173 mcMMO https://github.com/mcMMO-Dev/mcMMO 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 0547f3f47..b64de6a37 100644 --- a/src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java @@ -25,8 +25,6 @@ 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; From 46d69f2108c24e795cdae6128b4ce2320212715d Mon Sep 17 00:00:00 2001 From: snake Date: Wed, 27 Jan 2021 08:53:30 +0900 Subject: [PATCH 360/662] Replace old and wrong color codes with the correct color codes (#4408) --- src/main/resources/locale/locale_cs_CZ.properties | 12 ++++++------ src/main/resources/locale/locale_cy.properties | 4 ++-- src/main/resources/locale/locale_da.properties | 4 ++-- src/main/resources/locale/locale_de.properties | 14 +++++++------- src/main/resources/locale/locale_en_US.properties | 12 ++++++------ src/main/resources/locale/locale_es.properties | 12 ++++++------ src/main/resources/locale/locale_fi.properties | 4 ++-- src/main/resources/locale/locale_fr.properties | 6 +++--- src/main/resources/locale/locale_hu_HU.properties | 6 +++--- src/main/resources/locale/locale_it.properties | 6 +++--- src/main/resources/locale/locale_ja_JP.properties | 8 ++++---- src/main/resources/locale/locale_ko.properties | 6 +++--- src/main/resources/locale/locale_lt_LT.properties | 6 +++--- src/main/resources/locale/locale_nl.properties | 4 ++-- src/main/resources/locale/locale_pl.properties | 2 +- src/main/resources/locale/locale_pt_BR.properties | 8 ++++---- src/main/resources/locale/locale_ru.properties | 12 ++++++------ src/main/resources/locale/locale_sv.properties | 6 +++--- src/main/resources/locale/locale_th_TH.properties | 2 +- src/main/resources/locale/locale_zh_CN.properties | 10 +++++----- src/main/resources/locale/locale_zh_TW.properties | 12 ++++++------ 21 files changed, 78 insertions(+), 78 deletions(-) diff --git a/src/main/resources/locale/locale_cs_CZ.properties b/src/main/resources/locale/locale_cs_CZ.properties index d56a7d4b7..749584897 100644 --- a/src/main/resources/locale/locale_cs_CZ.properties +++ b/src/main/resources/locale/locale_cs_CZ.properties @@ -129,7 +129,7 @@ Herbalism.SkillName=Bylinkarstvi Herbalism.Skills.GTe.On=&a**ZELEN\u00c1 TERRA AKTIVOV\u00c1NA** 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\u017eil [[RED]Green Terra! +Herbalism.Skills.GTe.Other.On=&a{0}&2 pou\u017eil &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\u010deno doku\u010f {0}+ DOVEDNOST (T\u011a\u017dEN\u00cd V\u00ddBUCHEM) @@ -334,7 +334,7 @@ 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.Skillup=Dovednost v dolovani byla navysena o {0}. Celkem ({1}) -Ability.Generic.Refresh=[[GREEN]**SCHOPNOSTI OBNOVENY!** +Ability.Generic.Refresh=&a**SCHOPNOSTI OBNOVENY!** Ability.Generic.Template.Lock=&7{0} Ability.Generic.Template=&6{0}: &3{1} Combat.ArrowDeflect=&f**SIP VYCHYLEN** @@ -395,7 +395,7 @@ Commands.Party.Status=&8JM\u00c9NO: &f{0} {1} Commands.Party.ShareMode=&8M\u00d3D SD\u00cdLEN\u00cd: Commands.Party.ItemShare=&7P\u0158EDM\u011aT &3({0}) Commands.Party.ExpShare=&7EXP &3({0}) -Commands.Party.ItemShareCategories=&8Sd\u00edl\u00edm p\u0159edm\u011bty: &7[[ITALIC]]{0} +Commands.Party.ItemShareCategories=&8Sd\u00edl\u00edm p\u0159edm\u011bty: &7&o{0} Commands.Party.MembersNear=&8BL\u00cdZKO TEBE&3{0}&8/&3{1} Commands.Party.Accept=- Potvrdit pozvanku do party Commands.Party.Chat.Off=Chat jenom pro partu &cVypnuty @@ -413,7 +413,7 @@ Commands.Party.AlreadyExists=&4Parta {0} u\u017e existuje! Commands.Party.Kick=Byl jsi vyhozen z party {0}! Commands.Party.Leave=Opustil jsi party Commands.Party.Members.Header=-----[]&a\u010cLENOV\u00c9&c[]----- -Commands.Party.None=[RED]]Nejsi v zadne party. +Commands.Party.None=&cNejsi v zadne party. Commands.Party.Quit=- Opustil jsi svoji aktualni partu Commands.Party.Teleport= &c- Teleport ke clenovi party Commands.Party.Toggle=- Zapnout party chat @@ -569,7 +569,7 @@ Skills.Parents=RODI\u010cE 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 &6{0}&a. Lev\u00e9 tla\u010d\u00edtko ke zru\u0161en\u00ed. +Skills.ConfirmOrCancel=&aStiskn\u011bte znovu prav\u00e9 tla\u010d\u00edtko pro potvrzen\u00ed &6{0}&a. Lev\u00e9 tla\u010d\u00edtko ke zru\u0161en\u00ed. Stats.Header.Combat=&6-=BOJOVE DOVEDNOSTI=- Stats.Header.Gathering=&6-=SHROMAZDOVACI DOVEDNOSTI=- Stats.Header.Misc=Ostatni schopnosti @@ -587,7 +587,7 @@ Perks.ActivationTime.Desc=Prodlu\u017euje pou\u017eit\u00ed schopnosti na {0} se Perks.ActivationTime.Bonus=&6 ({0} s perkem V\u00fddr\u017enost) MOTD.Donate=&3Informace o p\u0159\u00edsp\u011bvc\u00edch: MOTD.Hardcore.DeathStatLoss.Stats=&6[mcMMO] &3Dovednost\u00ed penalizace kv\u016fli smrti : &4{0}% -MOTD.Hardcore.Vampirism.Stats=[GOLD]][mcMMO] &3Up\u00edrsk\u00e9 Cizen\u00ed Stat\u016f: &4{0}% +MOTD.Hardcore.Vampirism.Stats=&6[mcMMO] &3Up\u00edrsk\u00e9 Cizen\u00ed Stat\u016f: &4{0}% MOTD.PerksPrefix=[mcMMO Perky] MOTD.Version=&6[mcMMO] - verze &3{0} MOTD.Website=&6[mcMMO] &a{0}&e - Web mcMMO diff --git a/src/main/resources/locale/locale_cy.properties b/src/main/resources/locale/locale_cy.properties index 82417b8ed..bb3949078 100644 --- a/src/main/resources/locale/locale_cy.properties +++ b/src/main/resources/locale/locale_cy.properties @@ -171,7 +171,7 @@ Repair.Listener=Atgyweirio: Repair.SkillName=ATGYWEIRIO: 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=[[DARK RED]] Dydych chi ddim yn ddigon medrus i drwsio Aur. +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} @@ -442,7 +442,7 @@ 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=[GOLD]] - = GWRTHSEFYLL SGILIAU = - +Stats.Header.Combat=&6 - = GWRTHSEFYLL SGILIAU = - Stats.Header.Gathering=&6 -= CASGLU SGILIAU = = - Stats.Header.Misc=&6-=MISC SKILLS=- Stats.Own.Stats=&a[mcMMO] Ystadegau diff --git a/src/main/resources/locale/locale_da.properties b/src/main/resources/locale/locale_da.properties index 1e4f51f4d..610f17952 100644 --- a/src/main/resources/locale/locale_da.properties +++ b/src/main/resources/locale/locale_da.properties @@ -111,7 +111,7 @@ Herbalism.SubSkill.DoubleDrops.Description=G\u00f8r din normale udbytte dobblet Herbalism.Listener=Urtekundskab Herbalism.SkillName=NATURMEDICIN Herbalism.Skills.GTe.On=&a**GR\u00d8N TERRA AKTIVERET** -Herbalism.Skills.GTe.Refresh=[[GREEN]Din &eGr\u00f8nne Terra &aevne er genindl\u00e6st! +Herbalism.Skills.GTe.Refresh=&aDin &eGr\u00f8nne Terra &aevne er genindl\u00e6st! Herbalism.Skills.GTe.Other.Off=Gr\u00f8n Terra&a er aftaget i &e{0} Herbalism.Skills.GTe.Other.On=&a{0}&2 har brugt &cGr\u00f8n Terra! Herbalism.Skillup=Naturens Evne forbedret med {0}. Total ({1}) @@ -460,7 +460,7 @@ Perks.ActivationTime.Desc=Forl\u00e6nger 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\u00f8ds straf: &4{0}% -MOTD.Hardcore.Vampirism.Stats=&6[mcMMO] [[DARK_AQUA]Vampyr Statistik Igle: &4{0}% +MOTD.Hardcore.Vampirism.Stats=&6[mcMMO] &3Vampyr Statistik Igle: &4{0}% MOTD.PerksPrefix=[mcMMO Frynsegoder] MOTD.Version=&6[mcMMO] K\u00f8rer version &3{0} MOTD.Website=&6[mcMMO] &a{0}&e - mcMMO Hjemmeside diff --git a/src/main/resources/locale/locale_de.properties b/src/main/resources/locale/locale_de.properties index 171aa90d0..993399dee 100644 --- a/src/main/resources/locale/locale_de.properties +++ b/src/main/resources/locale/locale_de.properties @@ -60,7 +60,7 @@ 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.Ability.Ready.Extra = &3Du &6hebst&3 deine Axt. [[GRAY]]({0} ist f\u00FCr {1}s pausiert) +Axes.Ability.Ready.Extra = &3Du &6hebst&3 deine Axt. &7({0} ist f\u00FCr {1}s pausiert) Axes.Combat.CritStruck = &cDu wurdest &4SCHWER &cverwundet! Axes.Combat.CriticalHit = &4&lKRITISCHER TREFFER! Axes.Combat.GI.Proc = &a**Du landest einen &2GEWALTIGEN &aSchlag** @@ -89,15 +89,15 @@ Axes.SubSkill.SkullSplitter.Description = Verursacht einen Fl\u00E4chenschaden. Axes.SubSkill.SkullSplitter.Name = Sch\u00E4delspalter Axes.SubSkill.SkullSplitter.Stat = Sch\u00E4delspalter L\u00E4nge -Broadcasts.LevelUpMilestone = &6(&amcMMO&6) {0}&7 hat nun Level &a{1}&7 mit der F\u00E4higkeit [[DARK_AQUA]]{2}&7 erreicht! +Broadcasts.LevelUpMilestone = &6(&amcMMO&6) {0}&7 hat nun Level &a{1}&7 mit der F\u00E4higkeit &3{2}&7 erreicht! Chat.Channel.Off = &6(&amcMMO-Chat&6) &7Deine Nachrichten werden nicht l\u00E4nger automatisch an die spezifischen Kan\u00E4le 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\u2192 &r{1} -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.Spy.Party = &6[&eSPION&6-&a{2}&6] &r{0} &b\u2192�� &r{1} +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} Combat.ArrowDeflect = &a&o**Pfeil abgelenkt** Combat.BeastLore = &a&o**Biestkunde** @@ -882,7 +882,7 @@ 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) Skills.TooTired.Extra = &6{0} &eSuperf\u00E4higkeit CDs - {1} -Skills.TooTired.Named = [[GRAY]](&6{0}&e {1}s[[GRAY]]) +Skills.TooTired.Named = &7(&6{0}&e {1}s&7) Smelting.Ability.Locked.0 = GESPERRT bis {0}+ Skill (XP BOOST) Smelting.Ability.Locked.1 = GESPERRT bis {0}+ Skill (SCHMELZTIEGEL) diff --git a/src/main/resources/locale/locale_en_US.properties b/src/main/resources/locale/locale_en_US.properties index e9048c103..5a41eb424 100644 --- a/src/main/resources/locale/locale_en_US.properties +++ b/src/main/resources/locale/locale_en_US.properties @@ -145,7 +145,7 @@ 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 @@ -184,7 +184,7 @@ Axes.Ability.Bonus.4=Greater Impact Axes.Ability.Bonus.5=Deal {0} Bonus DMG to unarmored foes Axes.Ability.Lower=&7You lower your Axe. Axes.Ability.Ready=&3You &6ready&3 your Axe. -Axes.Ability.Ready.Extra=&3You &6ready&3 your Axe. [[GRAY]]({0} is on cooldown for {1}s) +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=&a**STRUCK WITH GREAT FORCE** @@ -641,11 +641,11 @@ Commands.Offline=This command does not work for offline players. Commands.NotLoaded=Player profile is not loaded yet. Commands.Party.Status=&8NAME: &f{0} {1} &8LEVEL: &3{2} Commands.Party.Status.Alliance=&8ALLY: &f{0} -Commands.Party.UnlockedFeatures=&8Unlocked Features: &7[[ITALIC]]{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[[ITALIC]]{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 @@ -997,7 +997,7 @@ 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. &e({0}s) -Skills.TooTired.Named=[[GRAY]](&6{0}&e {1}s[[GRAY]]) +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. @@ -1136,5 +1136,5 @@ 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 [[DARK_AQUA]]{2}&7! +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! \ 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 cdce790bd..ea9430b74 100644 --- a/src/main/resources/locale/locale_es.properties +++ b/src/main/resources/locale/locale_es.properties @@ -349,7 +349,7 @@ Combat.Gore=&a**MORDISCO** Combat.StruckByGore=**FUISTE MORDISQUEADO** Combat.TargetDazed=El objetivo fue &4aturdido Combat.TouchedFuzzy=&4Est\u00e1s confuso. Te sientes mareado. -mcMMO.Description=&3Sobre el proyecto&emcMMO&3:,&6mcMMO es un mod RPG de[[RED]codigo 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, +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=&aFuistes recompensado con {0} niveles en {1}! @@ -407,7 +407,7 @@ 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[[ITALIC]]{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\u00f3n al grupo Commands.Party.Chat.Off=S\u00f3lo chat de grupo &cdesactivado @@ -415,7 +415,7 @@ Commands.Party.Chat.On=S\u00f3lo chat de grupo &cactivado Commands.Party.Commands=&a--COMANDOS DEL GRUPO-- Commands.Party.Invite.0=ATENCI\u00d3N: &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=[RED]]- Invitacion de grupo enviada +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} @@ -430,7 +430,7 @@ Commands.Party.Quit=- Abandona tu grupo actual 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.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 @@ -444,7 +444,7 @@ Commands.PowerLevel.Leaderboard=--mcMMO-- Tabla de L\u00edderes: &9Nivel de Pode 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=[GREEN]]Tu {0} nivel de skill se reseteo 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: &9{0} @@ -604,7 +604,7 @@ Hardcore.DeathStatLoss.Name=Bonus de pena de muerte. 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] &e{0}&7 era demasiado inexperto para concederte algo de sabiduria. +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! diff --git a/src/main/resources/locale/locale_fi.properties b/src/main/resources/locale/locale_fi.properties index d322781f7..61694f81e 100644 --- a/src/main/resources/locale/locale_fi.properties +++ b/src/main/resources/locale/locale_fi.properties @@ -52,11 +52,11 @@ Mining.Ability.Ready=&a**VALMISTAUDUT ISKEM\u00c4\u00c4N HAKULLASI** Mining.Listener=Louhinta: Mining.SkillName=LOUHINTA Mining.Skills.SuperBreaker.Other.Off=Tehostettu hajoitus&a kului loppuun ajaksi &e{0} -Mining.Skills.SuperBreaker.Refresh=&aSinun [[YELLOW]Superrikkomis &a-taito on uudelleenlatautunut! +Mining.Skills.SuperBreaker.Refresh=&aSinun &eSuperrikkomis &a-taito on uudelleenlatautunut! Mining.Skillup=Louhimistaito kasvoi {0} tasolla. Kokonaism\u00e4\u00e4r\u00e4 ({1}) Mining.Blast.Boom=&7**BOOM** Mining.Blast.Radius.Increase=R\u00e4j\u00e4ytys Et\u00e4isyys Nousi: &e+{0} -Mining.Blast.Refresh=&aSinun [[YELLOW] R\u00e4j\u00e4ht\u00e4v\u00e4 Kaivuu &a-kyky on uudelleenlatautunut! +Mining.Blast.Refresh=&aSinun &e R\u00e4j\u00e4ht\u00e4v\u00e4 Kaivuu &a-kyky on uudelleenlatautunut! Repair.SubSkill.Repair.Name=Korjaus Repair.SubSkill.RepairMastery.Name=Korjaus Mestaruus Repair.SubSkill.RepairMastery.Description=Korotettu korjaus taso diff --git a/src/main/resources/locale/locale_fr.properties b/src/main/resources/locale/locale_fr.properties index c69bd5eb1..fac9a44b2 100644 --- a/src/main/resources/locale/locale_fr.properties +++ b/src/main/resources/locale/locale_fr.properties @@ -145,7 +145,7 @@ Acrobatics.SubSkill.Dodge.Name=Esquive Acrobatics.SubSkill.Dodge.Description=R\u00e9duit de moiti\u00e9 les d\u00e9g\u00e2ts re\u00e7us Acrobatics.SubSkill.Dodge.Stat=Chance d\'esquive Acrobatics.Listener=Acrobatie : -Acrobatics.Roll.Text=[[ITALIC]]**Roulade** +Acrobatics.Roll.Text=&o**Roulade** Acrobatics.SkillName=ACROBATIE #ALCHEMY Alchemy.SubSkill.Catalysis.Name=Catalyse @@ -630,11 +630,11 @@ Commands.Offline=Cette commande ne fonctionne pas sur les joueurs non connect\u0 Commands.NotLoaded=Le profil du joueur n\'est pas encore charg\u00e9. Commands.Party.Status=&8NOM: &f{0} {1} &8NIVEAU: &3{2} Commands.Party.Status.Alliance=&8ALLIANCES: &f{0} -Commands.Party.UnlockedFeatures=&8Fonctionnalit\u00e9s D\u00e9bloqu\u00e9es: &7[[ITALIC]]{0} +Commands.Party.UnlockedFeatures=&8Fonctionnalit\u00e9s D\u00e9bloqu\u00e9es: &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[[ITALIC]]{0} +Commands.Party.ItemShareCategories=&8Partage d\'objets: &7&o{0} Commands.Party.MembersNear=&8A C\u00d4T\u00c9 DE VOUS &3{0}&8/&3{1} Commands.Party.Accept=&a- Accepter l\'invitation de la guilde Commands.Party.Chat.Off=Canal guilde &cd\u00e9sactiv\u00e9 diff --git a/src/main/resources/locale/locale_hu_HU.properties b/src/main/resources/locale/locale_hu_HU.properties index 60776b3f7..ff06d011d 100644 --- a/src/main/resources/locale/locale_hu_HU.properties +++ b/src/main/resources/locale/locale_hu_HU.properties @@ -145,7 +145,7 @@ 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.Listener=Akrobatika: -Acrobatics.Roll.Text=[[ITALIC]]**Gurulva** +Acrobatics.Roll.Text=&o**Gurulva** Acrobatics.SkillName=AKROBATIKA #ALCHEMY Alchemy.SubSkill.Catalysis.Name=Katal\u00EDzis @@ -630,11 +630,11 @@ Commands.Offline=Ez a parancs nem haszn\u00E1lhat\u00F3 offline j\u00E1t\u00E9ko Commands.NotLoaded=A profilod m\u00E9g nincs bet\u00F6ltve. Commands.Party.Status=&8N\u00C9V: &f{0} {1} &8SZINT: &3{2} Commands.Party.Status.Alliance=&8SZ\u00D6VETS\u00C9GES: &f{0} -Commands.Party.UnlockedFeatures=&8Feloldott Funkci\u00F3k: &7[[ITALIC]]{0} +Commands.Party.UnlockedFeatures=&8Feloldott Funkci\u00F3k: &7&o{0} Commands.Party.ShareMode=&8Osztoz\u00E1s m\u00F3d: Commands.Party.ItemShare=&7T\u00C1RGY &3({0}) Commands.Party.ExpShare=&7TAPASZTALAT &3({0}) -Commands.Party.ItemShareCategories=&8T\u00E1rgyak Megoszt\u00E1sa: &7[[ITALIC]]{0} +Commands.Party.ItemShareCategories=&8T\u00E1rgyak Megoszt\u00E1sa: &7&o{0} Commands.Party.MembersNear=&8A K\u00D6ZELEDBEN &3{0}&8/&3{1} Commands.Party.Accept=&a- Party felk\u00E9r\u00E9s elfogad\u00E1sa Commands.Party.Chat.Off=Csak party Chat &ckikapcsolva diff --git a/src/main/resources/locale/locale_it.properties b/src/main/resources/locale/locale_it.properties index d6df1ef1e..8a502a849 100644 --- a/src/main/resources/locale/locale_it.properties +++ b/src/main/resources/locale/locale_it.properties @@ -149,7 +149,7 @@ 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.Listener=Acrobatica: -Acrobatics.Roll.Text=[[ITALIC]]**Capriola Eseguita** +Acrobatics.Roll.Text=&o**Capriola Eseguita** Acrobatics.SkillName=ACROBATICA #ALCHEMY @@ -643,11 +643,11 @@ Commands.Offline=Questo comando non funziona per i giocatori offline. Commands.NotLoaded=Il profilo del giocatore non \u00E8 ancora caricato. Commands.Party.Status=&8NOME: &f{0} {1} &8LIVELLO: &3{2} Commands.Party.Status.Alliance=&8ALLEATO: &f{0} -Commands.Party.UnlockedFeatures=&8Funzionalit\u00E0 Sbloccate: &7[[ITALIC]]{0} +Commands.Party.UnlockedFeatures=&8Funzionalit\u00E0 Sbloccate: &7&o{0} Commands.Party.ShareMode=&8MODALIT\u00E0 SPARTIZIONE: Commands.Party.ItemShare=&7OGGETTI &3({0}) Commands.Party.ExpShare=&7XP &3({0}) -Commands.Party.ItemShareCategories=&8Spartizione Oggetti: &7[[ITALIC]]{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 diff --git a/src/main/resources/locale/locale_ja_JP.properties b/src/main/resources/locale/locale_ja_JP.properties index 153967ba5..27105a6b1 100644 --- a/src/main/resources/locale/locale_ja_JP.properties +++ b/src/main/resources/locale/locale_ja_JP.properties @@ -148,7 +148,7 @@ 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.Roll.Text=&o**\u53d7\u3051\u8eab\u3092\u3057\u305f** Acrobatics.SkillName=\u30a2\u30af\u30ed\u30d0\u30c6\u30a3\u30c3\u30af # ALCHEMY @@ -657,11 +657,11 @@ Commands.Offline=\u3053\u306e\u30b3\u30de\u30f3\u30c9\u306f\u30aa\u30d5\u30e9\u3 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=&8\u540d\u524d: &f{0} {1} &8\u30ec\u30d9\u30eb: &3{2} Commands.Party.Status.Alliance=&8\u5473\u65b9: &f{0} -Commands.Party.UnlockedFeatures=&8\u30ed\u30c3\u30af\u89e3\u9664\u3055\u308c\u305f\u6a5f\u80fd: &7[[ITALIC]]{0} +Commands.Party.UnlockedFeatures=&8\u30ed\u30c3\u30af\u89e3\u9664\u3055\u308c\u305f\u6a5f\u80fd: &7&o{0} Commands.Party.ShareMode=&8\u5171\u6709\u30e2\u30fc\u30c9: Commands.Party.ItemShare=&7\u30a2\u30a4\u30c6\u30e0 &3({0}) Commands.Party.ExpShare=&7EXP &3({0}) -Commands.Party.ItemShareCategories=&8\u30a2\u30a4\u30c6\u30e0\u5171\u6709: &7[[ITALIC]]{0} +Commands.Party.ItemShareCategories=&8\u30a2\u30a4\u30c6\u30e0\u5171\u6709: &7&o{0} Commands.Party.MembersNear=&8\u3042\u306a\u305f\u306e\u8fd1\u304f\u306b &3{0}&8/&3{1} Commands.Party.Accept=&a- \u30d1\u30fc\u30c6\u30a3\u30fc\u62db\u5f85\u3092\u8a31\u8afe Commands.Party.Chat.Off=\u30d1\u30fc\u30c6\u30a3\u30fc\u30c1\u30e3\u30c3\u30c8\u304c&c\u30aa\u30d5&f\u306b\u5207\u308a\u66ff\u308f\u308a\u307e\u3057\u305f\u3002 @@ -1138,7 +1138,7 @@ Scoreboard.Misc.Ability=\u30a2\u30d3\u30ea\u30c6\u30a3 # DATABASE RECOVERY Profile.PendingLoad=&cmcMMO\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=&a\u3042\u306a\u305f\u306emcMMO\u30d7\u30ed\u30d5\u30a3\u30fc\u30eb\u304c\u8aad\u307f\u8fbc\u307e\u308c\u307e\u3057\u305f\u3002 -Profile.Loading.FailurePlayer=&cmcMMO\u306e\u30c7\u30fc\u30bf\u306e\u8aad\u307f\u8fbc\u307f\u306b\u554f\u984c\u304c\u3042\u308a\u307e\u3059\u3002&a{0}&c\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.FailurePlayer=&cmcMMO\u306e\u30c7\u30fc\u30bf\u306e\u8aad\u307f\u8fbc\u307f\u306b\u554f\u984c\u304c\u3042\u308a\u307e\u3059\u3002&a{0}&c\u56de\u8aad\u307f\u8fbc\u307f\u3092\u8a66\u3057\u307e\u3057\u305f\u3002&7 \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=&4[A]&c mcMMO\u306f&e{0}&c\u306e\u30d7\u30ec\u30fc\u30e4\u30fc\u30c7\u30fc\u30bf\u3092\u8aad\u307f\u8fbc\u3081\u307e\u305b\u3093\u3067\u3057\u305f\u3002 &d\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 # Holiday diff --git a/src/main/resources/locale/locale_ko.properties b/src/main/resources/locale/locale_ko.properties index e6f9e7c30..91f9ec262 100644 --- a/src/main/resources/locale/locale_ko.properties +++ b/src/main/resources/locale/locale_ko.properties @@ -503,11 +503,11 @@ Commands.Party.Header=-----[]&a\uD30C\uD2F0&c[]----- Commands.Party.Features.Header=-----[]&a\uD2B9\uC9D5&c[]----- Commands.Party.Status=&8\uC774\uB984: &f{0} {1} &8\uB808\uBCA8: &3{2} Commands.Party.Status.Alliance=&8\uB3D9\uB9F9: &f{0} -Commands.Party.UnlockedFeatures=&8\uD574\uC81C\uB41C \uD2B9\uC9D5: &7[[ITALIC]]{0} +Commands.Party.UnlockedFeatures=&8\uD574\uC81C\uB41C \uD2B9\uC9D5: &7&o{0} Commands.Party.ShareMode=&8\uACF5\uC720 \uBAA8\uB4DC: Commands.Party.ItemShare=&7\uC544\uC774\uD15C &3({0}) Commands.Party.ExpShare=&7EXP &3({0}) -Commands.Party.ItemShareCategories=&8\uACF5\uC720\uC911\uC778 \uC544\uC774\uD15C: &7[[ITALIC]]{0} +Commands.Party.ItemShareCategories=&8\uACF5\uC720\uC911\uC778 \uC544\uC774\uD15C: &7&o{0} Commands.Party.MembersNear=&8\uB2F9\uC2E0\uC758 \uADFC\uCC98 &3{0}&8/&3{1} Commands.Party.Accept=&a- \uD30C\uD2F0 \uCD08\uB300 \uD5C8\uC6A9 Commands.Party.Chat.Off=\uD30C\uD2F0 \uCC44\uD305\uC744 &c\uB055\uB2C8\uB2E4 @@ -921,7 +921,7 @@ Smelting.Ability.FluxMining=\uC720\uB3D9 \uCC44\uAD74 \uD655\uB960: &e{0} Smelting.Ability.FuelEfficiency=\uC720\uB3D9 \uD6A8\uC728\uC131 \uBC30\uC728: &e{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.SecondSmelt=\uB450\uBC88\uC9F8 \uC7AC\uB828 \uD655\uB960: &e{0} Smelting.Ability.VanillaXPBoost=\uBC14\uB2D0\uB77C XP \uBC30\uC728: &e{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 diff --git a/src/main/resources/locale/locale_lt_LT.properties b/src/main/resources/locale/locale_lt_LT.properties index f9d8bb9e4..16646315b 100644 --- a/src/main/resources/locale/locale_lt_LT.properties +++ b/src/main/resources/locale/locale_lt_LT.properties @@ -145,7 +145,7 @@ 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 @@ -630,11 +630,11 @@ Commands.Offline=This command does not work for offline players. Commands.NotLoaded=Žaidėjo profilis dar nepakrautas! Commands.Party.Status=&8NAME: &f{0} {1} &8LEVEL: &3{2} Commands.Party.Status.Alliance=&8ALLY: &f{0} -Commands.Party.UnlockedFeatures=&8Unlocked Features: &7[[ITALIC]]{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[[ITALIC]]{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 diff --git a/src/main/resources/locale/locale_nl.properties b/src/main/resources/locale/locale_nl.properties index 19dea9c04..e446f7162 100644 --- a/src/main/resources/locale/locale_nl.properties +++ b/src/main/resources/locale/locale_nl.properties @@ -132,7 +132,7 @@ 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 mee repareren Repair.Listener=Repareer: Repair.SkillName=REPAREER Repair.Skills.AdeptDiamond=&4Je bent nog niet sterk genoeg om diamant te repareren. @@ -231,7 +231,7 @@ Woodcutting.Skills.TreeFeller.Off= ** Boom Feller is uitgewerkt ** 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}[[DARK)GREEN]]heeft&cTree Feller&2gebruikt! +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}) diff --git a/src/main/resources/locale/locale_pl.properties b/src/main/resources/locale/locale_pl.properties index cf4f89579..dda260bdf 100644 --- a/src/main/resources/locale/locale_pl.properties +++ b/src/main/resources/locale/locale_pl.properties @@ -491,7 +491,7 @@ Commands.XPGain.Swords=Atak potworow Commands.XPGain.Taming=Oswoj zwierze, lub walcz ze swoimi wilkami. Commands.XPGain.Unarmed=Atak potworow Commands.XPGain.Woodcutting=\u0052\u0105\u0062\u0061\u006e\u0069\u0065 -Commands.XPGain=[[DARK_GRAY]Zdobyte do\u015bwiadczenie: &f{0} +Commands.XPGain=&8Zdobyte do\u015bwiadczenie: &f{0} Commands.xplock.locked=&6Tw\u00f3j pasek XP\'a jest zablokowany {0}! Commands.xplock.unlocked=&6Tw\u00f3j pasek XP\'a jest odblokowany {0}! Commands.xprate.modified=Modyfikator zdobywania do\u015bwiadczenia zosta\u0142 zmieniony na {0} diff --git a/src/main/resources/locale/locale_pt_BR.properties b/src/main/resources/locale/locale_pt_BR.properties index 9828d6340..67e55ef13 100644 --- a/src/main/resources/locale/locale_pt_BR.properties +++ b/src/main/resources/locale/locale_pt_BR.properties @@ -558,10 +558,10 @@ 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. &e({0}s) -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. [[YELLOW]]({0}s) -Skills.Cancelled=[[RED]]{0} cancelado! +Skills.Disarmed=&4Voce foi Desarmado! +Skills.NeedMore=&4Voce precisa de mais +Skills.TooTired=&cVoce esta cansado pra usar essa habilidade. &e({0}s) +Skills.Cancelled=&c{0} cancelado! Stats.Header.Combat=&6-=SKILLS DE COMBATE=- Stats.Header.Gathering=&6-=SKILLS DE RECOLHA=- diff --git a/src/main/resources/locale/locale_ru.properties b/src/main/resources/locale/locale_ru.properties index 7510220b4..537c0c2fe 100644 --- a/src/main/resources/locale/locale_ru.properties +++ b/src/main/resources/locale/locale_ru.properties @@ -477,7 +477,7 @@ Unarmed.Ability.Bonus.0=\u0421\u0442\u0438\u043b\u044c \"\u0416\u0435\u043b\u043 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: &e{0} Unarmed.Ability.Chance.Disarm=\u0428\u0430\u043d\u0441 \u0420\u0430\u0437\u043e\u0440\u0443\u0436\u0438\u0442\u044c: &e{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.Chance.IronGrip=\u0428\u0430\u043d\u0441 \u0416\u0435\u043b\u0435\u0437\u043d\u043e\u0439 \u0425\u0432\u0430\u0442\u043a\u0438: &e{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=&a\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=&7**\u041a\u0423\u041b\u0410\u041a\u0418 \u0412 \u041e\u0411\u042b\u0427\u041d\u041e\u041c \u0421\u041e\u0421\u0422\u041e\u042f\u041d\u0418\u0418** @@ -529,7 +529,7 @@ Woodcutting.SubSkill.NaturesBounty.Name=\u0429\u0435\u0434\u0440\u043e\u0441\u04 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.Off=&c**\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=&a**\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=&a\u0412\u0430\u0448\u0435 \u0443\u043c\u0435\u043d\u0438\u0435 &e\"\u041b\u0435\u0441\u043e\u0440\u0443\u0431\" &a\u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e! Woodcutting.Skills.TreeFeller.Other.Off=&a\u0423\u043c\u0435\u043d\u0438\u0435 \"&c\u041b\u0435\u0441\u043e\u0440\u0443\u0431&a\" \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u043b\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0443 &e{0} @@ -617,17 +617,17 @@ Commands.ModDescription=&a- \u041f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u04 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 &c\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 &a \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.Offline=&c \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=&a--\u0414\u0420\u0423\u0413\u0418\u0415 \u041a\u041e\u041c\u0410\u041d\u0414\u042b-- Commands.Party.Header=-----[]&a\u0413\u0420\u0423\u041f\u041f\u0410&c[]----- Commands.Party.Status=&8\u041d\u0410\u0417\u0412\u0410\u041d\u0418\u0415: &f{0} {1} Commands.Party.Status.Alliance=&8\u0421\u041e\u042e\u0417: &f{0} -Commands.Party.UnlockedFeatures=&8\u0420\u0410\u0417\u0411\u041b\u041e\u041a\u0418\u0420\u041e\u0412\u0410\u041d\u041d\u042b\u0415 \u0424\u0423\u041d\u041a\u0426\u0418\u0418: &7[[ITALIC]]{0} +Commands.Party.UnlockedFeatures=&8\u0420\u0410\u0417\u0411\u041b\u041e\u041a\u0418\u0420\u041e\u0412\u0410\u041d\u041d\u042b\u0415 \u0424\u0423\u041d\u041a\u0426\u0418\u0418: &7&o{0} Commands.Party.ShareMode=&8\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=&7\u041f\u0420\u0415\u0414\u041c\u0415\u0422 &3({0}) Commands.Party.ExpShare=&7\u041e\u041f\u042b\u0422 &3({0}) -Commands.Party.ItemShareCategories=&8\u0414\u0435\u043b\u0435\u0436 \u041f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u0432: &7[[ITALIC]]{0} +Commands.Party.ItemShareCategories=&8\u0414\u0435\u043b\u0435\u0436 \u041f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u0432: &7&o{0} Commands.Party.MembersNear=&8\u0412\u041e\u0417\u041b\u0415 \u0412\u0410\u0421 &3{0}&8/&3{1} Commands.Party.Accept=&a- \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 &c\u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d @@ -767,7 +767,7 @@ Party.Teleport.Disabled=&c\u0422\u0435\u043b\u0435\u043f\u043e\u0440\u0442\u0430 Party.Rename.Same=&c\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=&c\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=&7\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.Disband=&7\u0413\u0440\u0443\u043f\u043f\u0430 \u0431\u044b\u043b\u0430 \u0440\u0430\u0441\u043f\u0443\u0449\u0435\u043d\u0430 Party.Alliance.Formed=&7\u0412\u0430\u0448\u0430 \u0433\u0440\u0443\u043f\u043f\u0430 \u0442\u0435\u043f\u0435\u0440\u044c \u0432 \u0441\u043e\u044e\u0437\u0435 \u0441 &a{0} Party.Alliance.Disband=&7\u0412\u0430\u0448\u0430 \u0433\u0440\u0443\u043f\u043f\u0430 \u0431\u043e\u043b\u0435\u0435 \u043d\u0435 \u0432 \u0441\u043e\u044e\u0437\u0435 \u0441 &c{0} Party.Status.Locked=&4(\u0422\u041e\u041b\u042c\u041a\u041e \u041f\u041e \u041f\u0420\u0418\u0413\u041b\u0410\u0428\u0415\u041d\u0418\u042e) diff --git a/src/main/resources/locale/locale_sv.properties b/src/main/resources/locale/locale_sv.properties index 3896d58b6..852bca11f 100644 --- a/src/main/resources/locale/locale_sv.properties +++ b/src/main/resources/locale/locale_sv.properties @@ -17,7 +17,7 @@ Axes.SubSkill.CriticalStrikes.Description=Dubbel Skada Axes.SubSkill.AxeMastery.Description=L\u00e4gger till bonus skada Axes.SkillName=YXOR Axes.Skills.SS.On=&a**Skallsplittrare AKTIVERAD** -Axes.Skills.SS.Refresh=&aYour [[YELLOW]Skallsplittrar &af\u00f6rm\u00e5gan \u00e4r vederkvickad! +Axes.Skills.SS.Refresh=&aYour &eSkallsplittrar &af\u00f6rm\u00e5gan \u00e4r vederkvickad! Axes.Skills.SS.Other.On=&a{0}&2 har anv\u00e4nt &cSkallsplittrare! Axes.Skillup=Yxf\u00e4rdigheten har \u00f6kat med {0}. Totalt ({1}) Excavation.Ability.Ready=&a**DU H\u00d6JER DIN SPADE** @@ -30,7 +30,7 @@ Herbalism.Ability.GTh=&a**GR\u00d6NA FINGRAR** Herbalism.Ability.Ready=&a**DU H\u00d6JER DIN SKYFFEL** Herbalism.Listener=V\u00e4xtk\u00e4nnedom: Herbalism.Skills.GTe.Refresh=&aDina&eGr\u00f6na fingrar &af\u00f6rm\u00e5ga \u00e4r vederkvickad! -Herbalism.Skills.GTe.Other.Off=[[RED]Gr\u00f6na fingrar[GREEN]] har avklingat f\u00f6r &e{0} +Herbalism.Skills.GTe.Other.Off=&cGr\u00f6na fingrar&a har avklingat f\u00f6r &e{0} Herbalism.Skills.GTe.Other.On=&a{0}&2 har anv\u00e4nt &cGr\u00f6n Jord! Mining.Ability.Length=Superbrytarl\u00e4ngd: &e{0}s Mining.Ability.Lower=&7**DU S\u00c4NKER DIN HACKA** @@ -98,7 +98,7 @@ 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 &etr\u00e4df\u00e4llarkraft &ahar vederkvickats! +Woodcutting.Skills.TreeFeller.Refresh=&aDin &etr\u00e4df\u00e4llarkraft &ahar vederkvickats! Woodcutting.Skills.TreeFeller.Other.Off=tr\u00e5df\u00e4llning&a har avklingat f\u00f6r &e{0} Woodcutting.Skills.TreeFeller.Other.On=&a{0}&2 har anv\u00e4nt &cTr\u00e4d f\u00e4llare Woodcutting.Skills.TreeFeller.Splinter=DIN YXA SPLITTRAS I TUSEN BITAR! diff --git a/src/main/resources/locale/locale_th_TH.properties b/src/main/resources/locale/locale_th_TH.properties index 56695b922..69541c19b 100644 --- a/src/main/resources/locale/locale_th_TH.properties +++ b/src/main/resources/locale/locale_th_TH.properties @@ -393,7 +393,7 @@ Commands.Party.Status=&8\u0e0a\u0e37\u0e48\u0e2d: &f{0} {1} Commands.Party.ShareMode=&8\u0e42\u0e2b\u0e21\u0e14\u0e41\u0e1a\u0e48\u0e07\u0e1b\u0e31\u0e19: Commands.Party.ItemShare=&7\u0e2a\u0e34\u0e48\u0e07\u0e02\u0e2d\u0e07 &3({0}) Commands.Party.ExpShare=&7EXP &3({0}) -Commands.Party.ItemShareCategories=&8\u0e41\u0e1a\u0e48\u0e07\u0e1b\u0e31\u0e19\u0e2a\u0e34\u0e48\u0e07\u0e02\u0e2d\u0e07: &7[[ITALIC]]{0} +Commands.Party.ItemShareCategories=&8\u0e41\u0e1a\u0e48\u0e07\u0e1b\u0e31\u0e19\u0e2a\u0e34\u0e48\u0e07\u0e02\u0e2d\u0e07: &7&o{0} Commands.Party.MembersNear=&8\u0e17\u0e35\u0e48\u0e2d\u0e22\u0e39\u0e48\u0e43\u0e01\u0e25\u0e49\u0e04\u0e38\u0e13 &3{0}&8/&3{1} Commands.Party.Accept=- \u0e22\u0e34\u0e19\u0e22\u0e2d\u0e21\u0e04\u0e33\u0e40\u0e0a\u0e34\u0e0d Commands.Party.Chat.Off=Party Chat &c\u0e16\u0e39\u0e01\u0e1b\u0e34\u0e14 diff --git a/src/main/resources/locale/locale_zh_CN.properties b/src/main/resources/locale/locale_zh_CN.properties index 338737994..a98e2672a 100644 --- a/src/main/resources/locale/locale_zh_CN.properties +++ b/src/main/resources/locale/locale_zh_CN.properties @@ -145,7 +145,7 @@ 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.Roll.Text=&o**\u95ea\u907f** Acrobatics.SkillName=\u6742\u6280 #\u70bc\u91d1 Alchemy.SubSkill.Catalysis.Name=\u50ac\u5316 @@ -568,7 +568,7 @@ Commands.addlevels.AwardAll.2=\u4f60\u6240\u6709\u7684\u6280\u80fd\u7b49\u7ea7\u Commands.addlevels.AwardSkill.1=&a\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=&a\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.addxp.AwardSkill=&a\u4f60\u7684 {0} \u6280\u80fd\u83b7\u5f97\u4e86 {1} \u7ecf\u9a8c! Commands.Ability.Off=\u80fd\u529b\u4f7f\u7528\u5207\u6362 &c\u5173\u95ed Commands.Ability.On=\u80fd\u529b\u4f7f\u7528\u5207\u6362 &a\u5f00\u542f Commands.Ability.Toggle=\u80fd\u529b\u4f7f\u7528\u5df2\u5207\u6362\u4e3a &e{0} @@ -630,11 +630,11 @@ Commands.Offline=\u8fd9\u4e2a\u6307\u4ee4\u5bf9\u79bb\u7ebf\u73a9\u5bb6\u65e0\u6 Commands.NotLoaded=\u73a9\u5bb6\u8d44\u6599\u5c1a\u672a\u52a0\u8f7d\u3002 Commands.Party.Status=&8\u540d\u5b57: &f{0} {1} &8\u7b49\u7ea7: &3{2} Commands.Party.Status.Alliance=&8\u540c\u76df: &f{0} -Commands.Party.UnlockedFeatures=&8\u5df2\u89e3\u9501\u529f\u80fd: &7[[ITALIC]]{0} +Commands.Party.UnlockedFeatures=&8\u5df2\u89e3\u9501\u529f\u80fd: &7&o{0} Commands.Party.ShareMode=&8\u5171\u4eab\u6a21\u5f0f: Commands.Party.ItemShare=&7\u7269\u54c1 &3({0}) Commands.Party.ExpShare=&7\u7ecf\u9a8c &3({0}) -Commands.Party.ItemShareCategories=&8\u7269\u54c1\u5206\u914d: &7[[ITALIC]]{0} +Commands.Party.ItemShareCategories=&8\u7269\u54c1\u5206\u914d: &7&o{0} Commands.Party.MembersNear=&8\u4f60\u9644\u8fd1 &3{0}&8/&3{1} Commands.Party.Accept=&a- \u63a5\u53d7\u961f\u4f0d\u9080\u8bf7 Commands.Party.Chat.Off=\u53ea\u5141\u8bb8\u961f\u4f0d\u804a\u5929 &c\u5173\u95ed @@ -909,7 +909,7 @@ Guides.Mining.Section.0=&3\u5173\u4e8e\u6316\u77ff:\n&e\u6316\u77ff\u5305\u62ec\ Guides.Mining.Section.1=&3\u517c\u5bb9\u6750\u6599:\n&e\u77f3\u5934,\u7164\u77ff\u77f3,\u94c1\u77ff\u77f3,\u91d1\u77ff\u77f3,\u94bb\u77f3\u77ff\u77f3,\u7ea2\u77f3\u77ff\u77f3,\n&e\u9752\u91d1\u77f3\u77ff\u77f3,\u9ed1\u66dc\u77f3,\u82d4\u77f3,\u672b\u5730\u77f3,\n&e\u8424\u77f3,\u5730\u72f1\u5ca9. Guides.Mining.Section.2=&3\u5982\u4f55\u4f7f\u7528\u8d85\u7ea7\u788e\u77f3\u673a:\n&e\u628a\u9550\u5b50\u62ff\u5728\u4f60\u7684\u624b\u4e0a,\u6309\u4e0b\u53f3\u952e\u6765\u51c6\u5907\u4f60\u7684\u9550\u5b50.\n&e\u4f60\u5c06\u67094\u79d2\u949f\u7684\u65f6\u95f4\u6765\u6fc0\u53d1\u4f60\u7684\u6280\u80fd.\n&e\u5f53\u4f60\u6572\u4e0b\u5bf9\u5e94\u7684\u77f3\u5934\u4ee5\u540e,\u8d85\u7ea7\u788e\u77f3\u673a\u5c06\u88ab\u6fc0\u6d3b. Guides.Mining.Section.3=&3\u4ec0\u4e48\u662f\u8d85\u7ea7\u788e\u77f3\u673a?\n&e\u8d85\u7ea7\u788e\u77f3\u673a\u662f\u4e00\u4e2a\u4e3b\u52a8\u6280\u80fd\n&e\u5b83\u80fd\u4f7f\u4f60\u5728\u6316\u6389\u5bf9\u5e94\u77ff\u77f3\u7684\u65f6\u5019\u589e\u52a03\u500d\u6389\u843d\u51e0\u7387\n&e\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&e\u628a\u96f7\u7ba1\u62ff\u5728\u624b\u4e0a,\u9ed8\u8ba4\u7684\u60c5\u51b5\u4e0b\u662f\u6253\u706b\u5668.\n&e\u5728\u4e00\u5b9a\u8ddd\u79bb\u5185\u53f3\u952e\u70b9\u51fbTNT,\u8fd9\u5c06\u4f1a\u4f7f\u5f97TNT\u5728\u77ac\u95f4\u5185\u7206\u70b8. +Guides.Mining.Section.4=&3\u5982\u4f55\u4f7f\u7528\u7206\u7834\u5f00\u91c7:\n&e\u628a\u96f7\u7ba1\u62ff\u5728\u624b\u4e0a,\u9ed8\u8ba4\u7684\u60c5\u51b5\u4e0b\u662f\u6253\u706b\u5668.\n&e\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=&3\u4ec0\u4e48\u662f\u7206\u7834\u5f00\u91c7?\n&e\u7206\u7834\u5f00\u91c7\u662f\u4e00\u4e2a\u9700\u8981\u51b7\u5374\u65f6\u95f4\u7684\u6316\u77ff\u6280\u80fd\n&e\u5b83\u80fd\u4f7f\u4f60\u5728\u4f7f\u7528TNT\u70b8\u77ff\u65f6\u83b7\u5f97\u989d\u5916\u5956\u52b1\n&e\u7206\u7834\u5f00\u91c7\u603b\u5171\u67093\u4e2a\u529f\u80fd\n&e\u5927\u53f7\u70b8\u5f39:\u4f7f\u4f60\u7684TNT\u7206\u70b8\u8303\u56f4\u6269\u5927\n&e\u7206\u7834\u4e13\u5bb6:\u964d\u4f4e\u4f60\u53d7\u5230TNT\u7684\u7206\u70b8\u4f24\u5bb3\n&e\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=&3\u5173\u4e8e\u4fee\u7406:\n&e\u4fee\u7406\u53ef\u4ee5\u8ba9\u4f60\u4f7f\u7528\u94c1\u5757\u6765\u4fee\u7406\u76d4\u7532\u548c\u5de5\u5177.\n\n&3\u7ecf\u9a8c\u6765\u6e90:\n&e\u4f7f\u7528mcmmo\u7684\u94c1\u7827\u4fee\u7406\u5de5\u5177\u6216\u88c5\u5907. \n&emcmmo\u9ed8\u8ba4\u7684\u4fee\u7406\u53f0\u662f\u94c1\u5757\n&e\u4e0d\u8981\u4e0e\u7528\u7ecf\u9a8c\u4fee\u590d\u7684\u94c1\u7827\u6df7\u6dc6. diff --git a/src/main/resources/locale/locale_zh_TW.properties b/src/main/resources/locale/locale_zh_TW.properties index 01a0c15ac..d699f5d3b 100644 --- a/src/main/resources/locale/locale_zh_TW.properties +++ b/src/main/resources/locale/locale_zh_TW.properties @@ -414,14 +414,14 @@ 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 &c\u95dc\u9589 Commands.Notifications.On=\u5207\u63db\u80fd\u529b\u901a\u77e5\u70ba &a\u958b\u555f -Commands.Offline=[RED]]\u9019\u500b\u6307\u4ee4\u4e26\u4e0d\u9069\u7528\u65bc\u96e2\u7dda\u73a9\u5bb6. +Commands.Offline=&c\u9019\u500b\u6307\u4ee4\u4e26\u4e0d\u9069\u7528\u65bc\u96e2\u7dda\u73a9\u5bb6. Commands.Other=&a--\u5176\u4ed6\u6307\u4ee4-- Commands.Party.Header=-----[]&a\u968a\u4f0d&c[]----- Commands.Party.Status=&8\u540d\u5b57: &f{0} {1} Commands.Party.ShareMode=&8\u5206\u4eab\u6a21\u5f0f: Commands.Party.ItemShare=&7\u7269\u54c1 &3({0}) Commands.Party.ExpShare=&7\u7d93\u9a57\u503c &3({0}) -Commands.Party.ItemShareCategories=&8\u5171\u4eab\u7269\u54c1: &7[[ITALIC]]{0} +Commands.Party.ItemShareCategories=&8\u5171\u4eab\u7269\u54c1: &7&o{0} Commands.Party.MembersNear=&8\u63a5\u8fd1\u4f60 &3{0}&8/&3{1} Commands.Party.Accept=- \u63a5\u53d7\u968a\u4f0d\u9080\u8acb Commands.Party.Chat.Off=\u968a\u4f0d\u804a\u5929\u6a21\u5f0f&c\u53d6\u6d88 @@ -438,7 +438,7 @@ Commands.Party.ToggleShareCategory=&7\u968a\u4f0d\u5171\u4eab\u7684\u7269\u54c1& Commands.Party.AlreadyExists=&4\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.Members.Header=&c ----- [] &a\u6210\u54e1&c [] ----- Commands.Party.None=\u4f60\u4e0d\u5728\u968a\u4f0d\u4e2d. Commands.Party.Quit=- \u96e2\u958b\u4f60\u73fe\u5728\u7684\u968a\u4f0d Commands.Party.Teleport= &c- \u50b3\u9001\u5230\u968a\u4f0d\u6210\u54e1\u65c1 @@ -585,9 +585,9 @@ Guides.Header=&6-=&a{0} \u6307\u5357&6=- 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&e\u96dc\u6280\u53ef\u4ee5\u8b93\u4f60\u5728MMO\u88e1\u73a9\u5f97\u5f88\u512a\u96c5.\n&e\u5b83\u53ef\u4ee5\u8b93\u4f60\u5728\u6230\u9b25\u4e2d\u53ca\u74b0\u5883\u4e2d\u53d6\u5f97\u512a\u52e2.\n\n&3\u7d93\u9a57\u5982\u4f55\u7372\u53d6:\n&e\u5728\u6230\u9b25\u4e2d\u9583\u8eb2\u653b\u64ca\u6216\u5f9e\u9ad8\u8655\u589c\u843d\u5c07\n&e\u53ef\u7372\u5f97\u7d93\u9a57. +Guides.Acrobatics.Section.0=&3\u95dc\u65bc\u96dc\u6280:\n&e\u96dc\u6280\u53ef\u4ee5\u8b93\u4f60\u5728MMO\u88e1\u73a9\u5f97\u5f88\u512a\u96c5.\n&e\u5b83\u53ef\u4ee5\u8b93\u4f60\u5728\u6230\u9b25\u4e2d\u53ca\u74b0\u5883\u4e2d\u53d6\u5f97\u512a\u52e2.\n\n&3\u7d93\u9a57\u5982\u4f55\u7372\u53d6:\n&e\u5728\u6230\u9b25\u4e2d\u9583\u8eb2\u653b\u64ca\u6216\u5f9e\u9ad8\u8655\u589c\u843d\u5c07\n&e\u53ef\u7372\u5f97\u7d93\u9a57. Guides.Acrobatics.Section.1=&3\u4ec0\u9ebc\u662f\u7ffb\u6efe?\n&e\u4f60\u6709\u4e00\u5b9a\u7684\u6a5f\u7387\u53ef\u4ee5\u6e1b\u514d\u5f9e\u9ad8\u8655\u589c\u843d\n&e\u7684\u50b7\u5bb3. \u4f60\u53ef\u4ee5\u6309\u4f4f\u6f5b\u884c\u9375(\u9810\u8a2dshift)\n&e\u4f86\u5f97\u5230\u96d9\u500d\u7684\u7ffb\u6efe\u6a5f\u7387.\n&e\u9019\u5c07\u89f8\u767c\u5b8c\u7f8e\u8457\u9678\u800c\u4e0d\u53ea\u662f\u55ae\u7d14\u7684\u7ffb\u6efe.\n&e\u5b8c\u7f8e\u8457\u9678\u6548\u679c\u8207\u7ffb\u6efe\u985e\u4f3c,\u4f46\u6709\u5169\u500d\n&e\u7684\u89f8\u767c\u6a5f\u7387\u4e14\u53ef\u6e1b\u514d\u66f4\u591a\u50b7\u5bb3.\n&e\u7ffb\u6efe\u6a5f\u7387\u95dc\u4fc2\u5230\u4f60\u7684\u96dc\u6280\u7b49\u7d1a. -Guides.Acrobatics.Section.2=&3\u4ec0\u9ebc\u662f\u8ff4\u907f?\n[YELLOW]]\u8ff4\u907f\u662f\u6709\u6a5f\u7387\u6e1b \u514d\u5728\u6230\u9b25\u4e2d\n&e\u6575\u4eba\u5c0d\u4f60\u7684\u50b7\u5bb3.\n&e\u9019\u6a5f\u7387\u95dc\u4fc2\u5230\u4f60\u7684\u96dc\u6280\u7b49\u7d1a. +Guides.Acrobatics.Section.2=&3\u4ec0\u9ebc\u662f\u8ff4\u907f?\n&e\u8ff4\u907f\u662f\u6709\u6a5f\u7387\u6e1b \u514d\u5728\u6230\u9b25\u4e2d\n&e\u6575\u4eba\u5c0d\u4f60\u7684\u50b7\u5bb3.\n&e\u9019\u6a5f\u7387\u95dc\u4fc2\u5230\u4f60\u7684\u96dc\u6280\u7b49\u7d1a. Guides.Archery.Section.0=&3\u7bad\u8853:\n&e\u7bad\u8853\u662f\u7528\u5f13\u5c04\u7bad\u7684\u6280\u80fd.\n&e\u7bad\u8853\u6709\u5404\u7a2e\u52a0\u4e58\u6548\u679c,\u5982\u52a0\u4e58\u653b\u64ca\n&e\u6688\u7729\u5c0d\u624b\u7b49\u6548\u679c.\n&e\u6b64\u5916\u4f60\u4e5f\u6709\u6a5f\u7387\u56de\u6536\u5df2\u7d93\u5c04\u4e2d\u6575\u4eba\u7684\u7bad\n&e \u4ee5\u4e0a\u6a5f\u7387\u95dc\u4fc2\u5230\u7b49\u7d1a.\n\n&3\u7372\u53d6\u7d93\u9a57:\n&e\u8981\u7372\u5f97\u7d93\u9a57\u5fc5\u9808\u7528\u5f13\u5c04\u4e2d\u602a\u7269\u6216\u73a9\u5bb6. Guides.Archery.Section.1=&3\u4ec0\u9ebc\u662f\u6280\u8853\u5c04\u64ca?\n&e\u6280\u8853\u5c04\u64ca\u5c07\u52a0\u4e58\u4f60\u7684\u5c04\u7bad\u57fa\u672c\u653b\u64ca\u529b.\n&e\u52a0\u4e58\u7684\u7a0b\u5ea6\u95dc\u4fc2\u5230\u4f60\u7684\u7bad\u8853\u7b49\u7d1a.\n&e\u9810\u8a2d\u72c0\u614b\u4e0b, \u6bcf\u534750\u7d1a\u52a0\u4e5810%\u653b\u64ca\u529b, \n&e\u6700\u9ad8\u5230200%\u52a0\u4e58. Guides.Archery.Section.2=&3\u4ec0\u9ebc\u662f\u6688\u7729\u6548\u679c?\n&e\u7576\u4f60\u64ca\u4e2d\u76ee\u6a19\u6642\u6709\u88ab\u52d5\u6a5f\u7387\u4f7f\u76ee\u6a19\u6688\u7729.\n&e\u6688\u7dda\u89f8\u767c\u6642\u5c07\u5f37\u5236\u4f60\u7684\u76ee\u6a19\u5446\u6eef\u4e00\u5c0f\u6bb5\u6642\u9593.\n&e\u6688\u7729\u6548\u679c\u6709\u52a0\u4e584\u9ede\u50b7\u5bb3(2\u5fc3). @@ -619,7 +619,7 @@ Guides.Herbalism.Section.4=\u4ec0\u9ebc\u662f\u7da0\u624b\u6307(\u5375\u77f3/\u7 Guides.Herbalism.Section.5=&3\u4ec0\u9ebc\u662f\u8fb2\u592b\u79c1\u623f\u83dc?\n&e\u9019\u662f\u4e00\u500b\u88ab\u52d5\u6280\u80fd, \u53ef\u589e\u52a0\u4e0b\u5217\u98df\u7269\u7684\u98fd\u98df\u5ea6\u56de\u5fa9 -\n&e\u9eb5\u5305, \u9905\u4e7e, \u897f\u74dc, \u8611\u83c7\u6e6f, \u80e1\u863f\u8514, \u99ac\u9234\u85af. Guides.Herbalism.Section.6=&3\u4ec0\u9ebc\u662f\u6d77\u502b\u7684\u795d\u798f?\n&e\u9019\u662f\u4e00\u500b\u4e3b\u52d5\u6280\u80fd,\u6709\u6a5f\u7387\u5728\u7528\u528d\u7834\u58de\u7279\u5b9a\n&e\u65b9\u584a\u6642\u7372\u5f97\u7a00\u6709\u9053\u5177. Guides.Herbalism.Section.7=&3\u4ec0\u9ebc\u662f\u96d9\u500d\u6389\u843d?\n&e\u9019\u662f\u4e00\u500b\u88ab\u52d5\u6280\u80fd\u4f7f\u73a9\u5bb6\u80fd\u52a0\u500d\u6536\u7372. -Guides.Mining.Section.0=&3\u95dc\u65bc\u6316\u7926:\n&e\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&3\u5982\u4f55\u7372\u53d6\u7d93\u9a57:\n&e\u8981\u589e\u9032\u6316\u7926\u6280\u80fd,\u4f60\u5fc5\u9808\u7528\u93ac\u5b50\u6316\u7926.\n&e\u53ea\u6709\u6316\u6398\u6307\u5b9a\u7926\u7269\u80fd\u589e\u52a0\u7d93\u9a57. +Guides.Mining.Section.0=&3\u95dc\u65bc\u6316\u7926:\n&e\u6316\u7926\u7531\u63a1\u77f3\u8207\u63a1\u7926\u6240\u7d44\u6210. \u5b83\u63d0\u4f9b\u6316\u7926\u6642\n&e\u7684\u984d\u5916\u7926\u7269\u6389\u843d\u91cf.\n\n&3\u5982\u4f55\u7372\u53d6\u7d93\u9a57:\n&e\u8981\u589e\u9032\u6316\u7926\u6280\u80fd,\u4f60\u5fc5\u9808\u7528\u93ac\u5b50\u6316\u7926.\n&e\u53ea\u6709\u6316\u6398\u6307\u5b9a\u7926\u7269\u80fd\u589e\u52a0\u7d93\u9a57. Guides.Mining.Section.1=&3\u76f8\u5bb9\u7684\u7926\u7269:\n&e\u77f3\u982d, \u70ad\u7926\u8108, \u9435\u7926\u8108, \u91d1\u7926\u8108, \u947d\u77f3\u7926\u8108, \u7d05\u77f3\u7926\u8108,\n&e\u9752\u91d1\u77f3\u7926\u8108, \u9ed1\u66dc\u77f3, \u9752\u82d4\u77f3, \u7d42\u754c\u77f3,\n&e\u87a2\u5149\u77f3, \u9084\u6709\u5730\u7344\u77f3. Guides.Mining.Section.2=&3\u5982\u4f55\u4f7f\u7528\u8d85\u7d1a\u788e\u77f3\u6a5f:\n&e\u624b\u62ff\u8457\u93ac\u5b50\u9ede\u6ed1\u9f20\u53f3\u9375\u4ee5\u6e96\u5099\u597d\u958b\u555f\u6280\u80fd.\n&e\u4e00\u65e6\u958b\u555f\u6280\u80fd\u5c07\u6709\u6578\u79d2\u7684\u6642\u9593\u53ef\u4ee5\u8b93\u4f60\n&e\u5feb\u901f\u7834\u58de\u6307\u5b9a\u7926\u7269,\u53ea\u6709\u76f8\u5bb9\u7684\u7926\u7269\u53ef\u4ee5\n&e\u89f8\u767c\u6280\u80fd. Guides.Mining.Section.3=&3\u4ec0\u9ebc\u662f\u8d85\u7d1a\u788e\u77f3\u6a5f?\n&e\u8d85\u7d1a\u788e\u77f3\u6a5f\u662f\u4e00\u500b\u9700\u8981\u51b7\u537b\u6642\u9593\u7684\u6316\u7926\u6280\u80fd.\n&e\u5b83\u80fd\u4f7f\u4f60\u5728\u6316\u6389\u5c0d\u61c9\u7926\u77f3\u7684\u6642\u5019\u589e\u52a03\u500d\u6389\u843d\u6a5f\u7387.\n&e\u4e26\u4e14\u5728\u6280\u80fd\u6642\u9593\u5167\u77ac\u9593\u7834\u58de\u77f3\u982d\u548c\u7926\u77f3. From e584697b69c87c4437d228790f69c30256758464 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20Marczink=C3=B3?= Date: Wed, 27 Jan 2021 00:53:57 +0100 Subject: [PATCH 361/662] Update locale_hu_HU.properties (#4409) --- .../resources/locale/locale_hu_HU.properties | 37 +++++++++++++------ 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/src/main/resources/locale/locale_hu_HU.properties b/src/main/resources/locale/locale_hu_HU.properties index ff06d011d..d15562d7a 100644 --- a/src/main/resources/locale/locale_hu_HU.properties +++ b/src/main/resources/locale/locale_hu_HU.properties @@ -182,8 +182,9 @@ 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=&7Leengeded a balt\u00E1d -Axes.Ability.Ready=&6Felemeled&3 a balt\u00E1d +Axes.Ability.Lower=&7Leengeded a balt\u00E1d. +Axes.Ability.Ready=&6Felemeled&3 a balt\u00E1d. +Axes.Ability.Ready.Extra=&6Felemeled&3 a balt\u00E1d. [[GRAY]]({0} a v\u00E1rakoz\u00E1si id\u0151 ehhez {1}s) Axes.Combat.CritStruck=&4KRITIKUS sebz\u00E9st kapt\u00E1l! Axes.Combat.CriticalHit=KRITIKUS SEBZ\u00C9S! Axes.Combat.GI.Proc=&a**ER\u0150S \u00DCT\u00C9SSEL CSAPT\u00C1L** @@ -223,7 +224,7 @@ Excavation.SubSkill.Archaeology.Stat=R\u00E9g\u00E9szet Tapasztalatpont Es\u00E9 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.Off=**Giga F\u00FAr\u00F3-T\u00F6r\u0151 v\u00E9get \u00E9rt** Excavation.Skills.GigaDrillBreaker.On=&a**GIGA F\u00DAR\u00D3-T\u00D6R\u0150 AKTIV\u00C1LVA** Excavation.Skills.GigaDrillBreaker.Refresh=&aA &eGiga F\u00FAr\u00F3-T\u00F6r\u0151 &ak\u00E9pess\u00E9ged ism\u00E9t el\u00E9rhet\u0151! Excavation.Skills.GigaDrillBreaker.Other.Off=Giga F\u00FAr\u00F3-T\u00F6r\u0151&a kikapcsolva: &e{0} @@ -240,7 +241,7 @@ Fishing.Ability.Locked.2=LEZ\u00C1RVA {0}+ K\u00C9PESS\u00C9G SZINTIG (MESTER HO Fishing.SubSkill.TreasureHunter.Name=Kincsvad\u00E1sz Fishing.SubSkill.TreasureHunter.Description=Furcsa t\u00E1rgyak kihal\u00E1sz\u00E1sa Fishing.SubSkill.TreasureHunter.Stat=Kincsvad\u00E1sz Szint: &a{0}&3/&a{1} -Fishing.SubSkill.TreasureHunter.Stat.Extra=T\u00E1rgy Es\u00E9si Es\u00E9ly: &7\u00C1tlagos: &e{0} &aRendk\u00EDv\u00FCli: &e{1}\n&9Ritka: &e{2} &dEpikus: &e{3} &6Legend\u00E1s: &e{4} &bMythic: &e{5} +Fishing.SubSkill.TreasureHunter.Stat.Extra=T\u00E1rgy Es\u00E9si Es\u00E9ly: &7\u00C1tlagos: &e{0} &aRendk\u00EDv\u00FCli: &e{1}\n&9Ritka: &e{2} &dEpikus: &e{3} &6Legend\u00E1s: &e{4} &bM\u00EDtikus: &e{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 @@ -251,6 +252,9 @@ 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:&a Szint {0} Fishing.SubSkill.MasterAngler.Name=Mester Horg\u00E1sz +Fishing.SubSkill.MasterAngler.Description=A halak gyakrabban foghat\u00F3ak, jobban m\u0171k\u00F6dik ha egy cs\u00F3nakb\u00F3l horg\u00E1szol. +Fishing.SubSkill.MasterAngler.Stat=A horg\u00E1szat minimum v\u00E1rakoz\u00E1si idej\u00E9nek cs\u00F6kkent\u00E9se: &a-{0} m\u00E1sodperc +Fishing.SubSkill.MasterAngler.Stat.Extra=A horg\u00E1szat maximum v\u00E1rakoz\u00E1si idej\u00E9nek cs\u00F6kkent\u00E9se: &a-{0} m\u00E1sodperc 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 @@ -271,7 +275,7 @@ 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.Description=Automatikusan el\u00FCltet egy magot kap\u00E1val t\u00F6rt\u00E9n\u0151 betakar\u00EDt\u00E1sn\u00E1l Herbalism.SubSkill.GreenThumb.Stat=Es\u00E9ly Z\u00F6ld H\u00FCvelykre Herbalism.SubSkill.GreenThumb.Stat.Extra=Z\u00F6ld H\u00FCvelyk \u00C1llapota: &a A n\u00F6v\u00E9nyek a(z) {0} \u00E1llapotban n\u0151nek. Herbalism.Effect.4=Z\u00F6ld H\u00FCvelyk (Blokkok) @@ -483,8 +487,9 @@ Taming.Summon.COTW.Success.WithoutLifespan=&a(A Vadon Szava) &7Megid\u00E9zt\u00 Taming.Summon.COTW.Success.WithLifespan=&a(A Vadon Szava) &7Megid\u00E9zt\u00E9l egy &6{0}&7 \u00E9s az id\u0151tartama &6{1}&7 m\u00E1sodperc. Taming.Summon.COTW.Limit=&a(A Vadon Szava) &7Egyszerre csak &c{0} &7megid\u00E9zett &7{1} h\u00E1zi\u00E1llat lehet egyid\u0151ben. Taming.Summon.COTW.TimeExpired=&a(A Vadon Szava) &7Az id\u0151 v\u00E9get \u00E9r, &6{0}&7 elt\u00E1vozik. +Taming.Summon.COTW.Removed=&a(A Vadon Szava) &7A megid\u00E9zett &6{0}&7 elt\u0171nt ebb\u0151l a vil\u00E1gb\u00F3l. Taming.Summon.COTW.BreedingDisallowed=&a(A Vadon Szava) &cNem szapor\u00EDthatsz megid\u00E9zett \u00E1llatot. -Taming.Summon.COTW.NeedMoreItems=&a(A Vadon Szava) &7Sz\u00FCks\u00E9g van &e{0}&7 t\u00F6bb &3{1}&7(m) +Taming.Summon.COTW.NeedMoreItems=&a(A Vadon Szava) &7Sz\u00FCks\u00E9g van &e{0}&7 t\u00F6bb &3{1}&7(s) Taming.Summon.Name.Format=&6(COTW) &f{0} \u00E1llata {1} #UNARMED Unarmed.Ability.Bonus.0=Ac\u00E9l-\u00D6k\u00F6l St\u00EDlus @@ -528,6 +533,11 @@ 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.KnockOnWood.Name=Fa Kopogtat\u00E1s +Woodcutting.SubSkill.KnockOnWood.Description=Keress tov\u00E1bbi finoms\u00E1gokat a Fad\u00F6nt\u00E9s haszn\u00E1latakor +Woodcutting.SubSkill.KnockOnWood.Stat=Fa Kopogtat\u00E1s +Woodcutting.SubSkill.KnockOnWood.Loot.Normal=Standard zs\u00E1km\u00E1ny a f\u00E1kt\u00F3l +Woodcutting.SubSkill.KnockOnWood.Loot.Rank2=Standard zs\u00E1km\u00E1ny \u00E9s tapasztalat pontok a f\u00E1kt\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 @@ -580,6 +590,7 @@ Commands.Cooldowns.Header=&6--= &amcMMO K\u00E9pess\u00E9g V\u00E1rakoz\u00E1sok Commands.Cooldowns.Row.N=\ &c{0}&f - &6{1} m\u00E1sodperc maradt Commands.Cooldowns.Row.Y=\ &b{0}&f - &2K\u00E9szen \u00E1ll! Commands.Database.CooldownMS=V\u00E1rnod kell {0} ezredm\u00E1sodpercet, miel\u0151tt ism\u00E9t haszn\u00E1lod a parancsot. +Commands.Database.Cooldown=V\u00E1rnod kell {0} m\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.Disabled=Ez a parancs le van tiltva. Commands.DoesNotExist= &cA j\u00E1t\u00E9kos nincs az adatb\u00E1zisban! @@ -830,7 +841,7 @@ Commands.xplock.locked=&6Az XP s\u00E1v most le van z\u00E1rva {0}! Commands.xplock.unlocked=&6Az XP s\u00E1v most &aFELOLDVA&6! Commands.xprate.modified=&cAz XP AR\u00C1NYA m\u00F3dosult {0} Commands.xprate.over=&cmcMMO XP szorz\u00F3 esem\u00E9ny V\u00C9GE! -Commands.xprate.proper.0=&cAz XP sebess\u00E9g v\u00E1ltoztat\u00E1s\u00E1nak megfelel\u0151 haszn\u00E1lata: /xprate +Commands.xprate.proper.0=&cAz XP sebess\u00E9g v\u00E1ltoztat\u00E1s\u00E1nak megfelel\u0151 haszn\u00E1lata: /xprate Commands.xprate.proper.1=&cAz XP-alap\u00E9rtelmezett \u00E9rt\u00E9k helyes vissza\u00E1ll\u00EDt\u00E1sa: /xprate reset Commands.xprate.proper.2=&cAdjon 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! @@ -851,7 +862,7 @@ Notifications.Admin.Format.Others=&6(&amcMMO &3Admin&6) &7{0} Notifications.Admin.Format.Self=&6(&amcMMO&6) &7{0} # Event -XPRate.Event= &6mcMMO XP szorz\u00F3 event! Az XP ar\u00E1nya {0}x! +XPRate.Event=&6mcMMO XP szorz\u00F3 event! Az XP ar\u00E1nya {0}x! #GUIDES Guides.Available=&7A {0} seg\u00EDts\u00E9g el\u00E9rhet\u0151 - haszn\u00E1lat: /{1} ? [oldal] @@ -894,7 +905,7 @@ Guides.Excavation.Section.5=&3Megjegyz\u00E9sek az \u00C1s\u00E1sr\u00F3l:\n&eA Guides.Fishing.Section.0=&3A Horg\u00E1szatr\u00F3l:\n&eEzzel a k\u00E9pess\u00E9ggel a horg\u00E1sz\u00E1s ism\u00E9t izgalmas!\n&eTal\u00E1lj rejtett kincseket, vagy r\u00E1zz le t\u00E1rgyakat a \u00E9l\u0151l\u00E9nyekr\u0151l.\n\n&3Tapasztalatszerz\u00E9s:\n&eHorg\u00E1ssz. Guides.Fishing.Section.1=&3Hogyan m\u0171k\u00F6dik a kincsvad\u00E1szat?\n&eEz a k\u00E9pess\u00E9g lehet\u0151v\u00E9 teszi, hogy kincset tal\u00E1lj horg\u00E1sz\u00E1s k\u00F6zben, \n&ealacsony es\u00E9llyel fejlesztett t\u00E1rgyakra.\n&eMinden lehets\u00E9ges kincs a horg\u00E1sz\u00E1sban szintt\u0151l f\u00FCggetlen\u00FCl kifoghat\u00F3\n&e Azonban a kifog\u00E1s es\u00E9lye f\u00FCgg att\u00F3l, hogy a t\u00E1rgy milyen ritkas\u00E1g\u00FA.\n&eMin\u00E9l nagyobb a horg\u00E1sz\u00E1s szinted, ann\u00E1l nagyobb es\u00E9lyed van jobb kincseket tal\u00E1lni. Guides.Fishing.Section.2=&3Hogyan m\u0171k\u00F6dik a j\u00E9ghorg\u00E1szat?\n&eEz a passz\u00EDv k\u00E9pess\u00E9g lehet\u0151v\u00E9 teszi, hogy befagyott tavakban horg\u00E1ssz!\n&eHaszn\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=&3Hogyan m\u0171k\u00F6dik a Mester Horg\u00E1szat?\n&eEz a passz\u00EDv k\u00E9pess\u00E9g n\u00F6veli a fog\u00E1s es\u00E9ly\u00E9t horg\u00E1szat k\u00F6zben.\n&eMiut\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.3=&3Hogyan m\u0171k\u00F6dik a Mester Horg\u00E1szat?\n&eEz a passz\u00EDv k\u00E9pess\u00E9g n\u00F6veli a fog\u00E1s es\u00E9ly\u00E9t horg\u00E1szat k\u00F6zben.\n&eMiut\u00E1n feloldottad ezt a k\u00E9pess\u00E9get, jav\u00EDtja a halak fog\u00E1s\u00E1nak es\u00E9ly\u00E9t, ha cs\u00F3nakban horg\u00E1szol. Guides.Fishing.Section.4=&3Hogyan m\u0171k\u00F6dik a ler\u00E1z\u00E1s?\n&eEz 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&eAz \u00E9l\u0151l\u00E9nyek ugyan olyan t\u00E1rgyakat dobnak, mint amit hal\u00E1lukkor.\n&eValamint lehet\u0151s\u00E9g van ezzel olyan \u00E9l\u0151l\u00E9ny fejeket is szerezni, amelyeket \u00E1ltal\u00E1ban nem lehets\u00E9ges t\u00FAl\u00E9l\u0151 m\u00F3dban. Guides.Fishing.Section.5=&3Hogyan m\u0171k\u00F6dik a horg\u00E1sz di\u00E9ta?\n&eEz a passz\u00EDv k\u00E9pess\u00E9g n\u00F6veli az \u00E9telcs\u00EDk visszat\u00F6lt\u00E9s\u00E9t, ha halat eszel. Guides.Fishing.Section.6=&3Tudnival\u00F3 a horg\u00E1szatr\u00F3l:\n&eA fogott t\u00E1rgyak list\u00E1ja teljesen \u00E1ll\u00EDthat\u00F3, teh\u00E1t szervert\u0151l f\u00FCgg. @@ -986,6 +997,8 @@ 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. &e({0}s) +Skills.TooTired.Named=[[GRAY]](&6{0}&e {1}s[[GRAY]]) +Skills.TooTired.Extra=&6{0} &eSzuperk\u00E9pess\u00E9g v\u00E1rakoz\u00E1sok - {1} Skills.Cancelled=&6{0} &cMegszak\u00EDtva! Skills.ConfirmOrCancel=&aJobb klikkelj a meger\u0151s\u00EDt\u00E9shez. &6{0}&a. Bal klikkelj a megszak\u00EDt\u00E1shoz. Skills.AbilityGateRequirementFail=&7M\u00E9g &e{0}&7 szint sz\u00FCks\u00E9ges a(z) &3{1}&7b\u00F3l/b\u0151l, hogy haszn\u00E1lhasd ezt a szuper k\u00E9pess\u00E9get. @@ -1036,7 +1049,7 @@ 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: &e{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.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 @@ -1105,7 +1118,7 @@ Holiday.Anniversary=&9Boldog {0}. \u00C9vfordul\u00F3t!\n&9nossr50, \u00E9s az \ #Reminder Messages Reminder.Squelched=&7Eml\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. #Locale -Locale.Reloaded=&aFord\u00EDt\u00E1s \u00FAjrat\u00F6ltve! +Locale.Reloaded=&aA ford\u00EDt\u00E1s \u00FAjrat\u00F6ltve! #Player Leveling Stuff LevelCap.PowerLevel=&6(&amcMMO&6) &eEl\u00E9rted ezt a teljes\u00EDtm\u00E9nyszintet &c{0}&e. Ezen a ponton megsz\u0171nik a k\u00E9pess\u00E9gek szintje. LevelCap.Skill=&6(&amcMMO&6) &eEl\u00E9rted ezt a szintet &c{0}&e ebben &6{1}&e. Ezen a ponton megsz\u0171nik a k\u00E9pess\u00E9g szintje. @@ -1123,3 +1136,5 @@ Chat.Identity.Console=&6* Konzol * Chat.Channel.On=&6(&amcMMO-Chat&6) &eA chat \u00FCzeneteid mostant\u00F3l automatikusan a(z) &a{0}&e chat csatorn\u00E1ra ker\u00FClnek. Chat.Channel.Off=&6(&amcMMO-Chat&6) &7A chat \u00FCzeneteid a tov\u00E1bbiakban nem ker\u00FClnek automatikusan a meghat\u00E1rozott chat csatorn\u00E1kra. Chat.Spy.Party=&6[&eSPY&6-&a{2}&6] &r{0} &b\u2192 &r{1} +Broadcasts.LevelUpMilestone=&6(&amcMMO&6) {0}&7 el\u00E9rte a(z) &a{1}&7. [[DARK_AQUA]]{2}&7 szintet! +Broadcasts.PowerLevelUpMilestone=&6(&amcMMO&6) {0}&7 el\u00E9rte a(z) &a{1}&7. Er\u0151szintet! From 9a5b1406b341d63e6f5275f4ea27d65a573a24d2 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 26 Jan 2021 15:55:48 -0800 Subject: [PATCH 362/662] dev mode --- Changelog.txt | 4 ++++ pom.xml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index e3b0fe1fb..0ea128fcb 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,7 @@ +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) + 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 diff --git a/pom.xml b/pom.xml index d1e296837..23559a646 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.173 + 2.1.174-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO From 68c7de16a85af845aae1e7f471cacc98af01fcdf Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 26 Jan 2021 16:00:08 -0800 Subject: [PATCH 363/662] Really should rewrite this whole thing at a later date --- Changelog.txt | 1 - .../util/compat/CompatibilityManager.java | 10 +- .../DummyPlayerAttackCooldownToolLayer.java | 84 ++-- .../PlayerAttackCooldownToolLayer.java | 475 +++++++++--------- .../gmail/nossr50/util/nms/NMSVersion.java | 1 + 5 files changed, 287 insertions(+), 284 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 0ea128fcb..165b075c9 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,7 +1,6 @@ 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) - 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 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 3a5a64f2b..7a0a0e72a 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/CompatibilityManager.java +++ b/src/main/java/com/gmail/nossr50/util/compat/CompatibilityManager.java @@ -14,6 +14,7 @@ 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; @@ -102,7 +103,6 @@ public class CompatibilityManager { private void initPersistentDataLayer() { if(minecraftGameVersion.getMinorVersion().asInt() >= 14 || minecraftGameVersion.getMajorVersion().asInt() >= 2) { - persistentDataLayer = new SpigotPersistentDataLayer_1_14(); } else { @@ -138,11 +138,11 @@ public class CompatibilityManager { return isFullyCompatibleServerSoftware; } - public NMSVersion getNmsVersion() { + public @NotNull NMSVersion getNmsVersion() { return nmsVersion; } - private NMSVersion determineNMSVersion() { + private @NotNull NMSVersion determineNMSVersion() { if (minecraftGameVersion.getMajorVersion().asInt() == 1) { switch (minecraftGameVersion.getMinorVersion().asInt()) { case 12: @@ -160,8 +160,10 @@ public class CompatibilityManager { return NMSVersion.NMS_1_16_2; } else if(minecraftGameVersion.getPatchVersion().asInt() == 3) { return NMSVersion.NMS_1_16_3; - } else if(minecraftGameVersion.getPatchVersion().asInt() >= 4) { + } else if(minecraftGameVersion.getPatchVersion().asInt() == 4) { return NMSVersion.NMS_1_16_4; + } else if(minecraftGameVersion.getPatchVersion().asInt() >= 5) { + return NMSVersion.NMS_1_16_5; } } } 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 index 909f290b6..6cdb19037 100644 --- 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 @@ -1,42 +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 { - } -} +//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/PlayerAttackCooldownToolLayer.java b/src/main/java/com/gmail/nossr50/util/compat/layers/attackcooldown/PlayerAttackCooldownToolLayer.java index 539c1a0c4..5b0026198 100644 --- 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 @@ -1,237 +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: - 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!"); - } - } -} - +//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/nms/NMSVersion.java b/src/main/java/com/gmail/nossr50/util/nms/NMSVersion.java index 2f2597a0b..4b2ce5c57 100644 --- a/src/main/java/com/gmail/nossr50/util/nms/NMSVersion.java +++ b/src/main/java/com/gmail/nossr50/util/nms/NMSVersion.java @@ -21,6 +21,7 @@ public enum NMSVersion { 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"), //Version not known to this build of mcMMO UNSUPPORTED("unsupported"); From e63ce103a239927724b54cd43b6e1d49a55de100 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 26 Jan 2021 16:56:02 -0800 Subject: [PATCH 364/662] changelog adjustments --- Changelog.txt | 3 ++- .../com/gmail/nossr50/util/player/NotificationManager.java | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 165b075c9..a9620efe3 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,13 +1,14 @@ 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) + 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) + 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) 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 0ae24eafc..e616760a8 100644 --- a/src/main/java/com/gmail/nossr50/util/player/NotificationManager.java +++ b/src/main/java/com/gmail/nossr50/util/player/NotificationManager.java @@ -297,7 +297,7 @@ public class NotificationManager { String localeMessage = LocaleLoader.getString("Broadcasts.LevelUpMilestone", mmoPlayer.getPlayer().getDisplayName(), level, primarySkillType.getName()); Component message = Component.text(localeMessage).hoverEvent(levelMilestoneHover); - Bukkit.getScheduler().runTaskLater(mcMMO.p, () -> {audience.sendMessage(Identity.nil(), message);}, 0); + Bukkit.getScheduler().runTaskLater(mcMMO.p, () -> audience.sendMessage(Identity.nil(), message), 0); } } } @@ -332,7 +332,7 @@ public class NotificationManager { String localeMessage = LocaleLoader.getString("Broadcasts.PowerLevelUpMilestone", mmoPlayer.getPlayer().getDisplayName(), powerLevel); Component message = Component.text(localeMessage).hoverEvent(levelMilestoneHover); - Bukkit.getScheduler().runTaskLater(mcMMO.p, () -> {audience.sendMessage(Identity.nil(), message);}, 0); + Bukkit.getScheduler().runTaskLater(mcMMO.p, () -> audience.sendMessage(Identity.nil(), message), 0); } } } From 6ef0a36cb0b4c53a67b3c0f3c5eea6403a2b26f9 Mon Sep 17 00:00:00 2001 From: Elikill58 Date: Tue, 2 Feb 2021 23:57:05 +0100 Subject: [PATCH 365/662] Translate missing messages into french (#4418) --- .../resources/locale/locale_fr.properties | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/main/resources/locale/locale_fr.properties b/src/main/resources/locale/locale_fr.properties index fac9a44b2..e05fe4200 100644 --- a/src/main/resources/locale/locale_fr.properties +++ b/src/main/resources/locale/locale_fr.properties @@ -184,6 +184,7 @@ 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=&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\u00e7u un coup critique ! Axes.Combat.CriticalHit=COUP CRITIQUE ! Axes.Combat.GI.Proc=&a**FRAPP\u00c9 D\'UNE VIOLENTE INOU\u00cfE** @@ -251,6 +252,9 @@ Fishing.SubSkill.FishermansDiet.Name=R\u00e9gime de fermier Fishing.SubSkill.FishermansDiet.Description=Am\u00e9liore la nutrition des produits de la ferme Fishing.SubSkill.FishermansDiet.Stat=R\u00e9gime de fermier:&a Grade {0} Fishing.SubSkill.MasterAngler.Name=Ma\u00eetre P\u00eacheur +Fishing.SubSkill.MasterAngler.Description=Les poissons sont p\u00each\u00e9s plus fr\u00e9quemment, fonctionne mieux lorsque l\'on p\u00eache depuis un bateau. +Fishing.SubSkill.MasterAngler.Stat=R\u00e9duction minimum du temps de p\u00eache: &a-{0} secondes +Fishing.SubSkill.MasterAngler.Stat.Extra=R\u00e9duction maximum du temps de p\u00eache: &a-{0} secondes Fishing.SubSkill.IceFishing.Name=P\u00eache sur Glace Fishing.SubSkill.IceFishing.Description=Vous permet de p\u00eacher dans les biomes glac\u00e9s Fishing.SubSkill.IceFishing.Stat=P\u00eache sur Glace @@ -483,6 +487,7 @@ Taming.Summon.COTW.Success.WithoutLifespan=&a(Appel de la nature) &7Vous avez in Taming.Summon.COTW.Success.WithLifespan=&a(Appel de la nature) &7Vous avez invoqu\u00e9 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\u00e9s en m\u00eame 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\u00e9 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\u00e9. 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} @@ -528,6 +533,11 @@ Woodcutting.SubSkill.TreeFeller.Description=Fait exploser les arbres Woodcutting.SubSkill.TreeFeller.Stat=Dur\u00e9e 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\u00e9rience Woodcutting.SubSkill.HarvestLumber.Name=Double drops Woodcutting.SubSkill.HarvestLumber.Description=Double la quantit\u00e9 r\u00e9colt\u00e9e Woodcutting.SubSkill.HarvestLumber.Stat=Double Drop Chance @@ -579,6 +589,7 @@ Commands.Chat.Console=*Console* Commands.Cooldowns.Header=&6--= &aTemps d\'attente des capacit\u00e9s McMMO&6 =-- Commands.Cooldowns.Row.N=\ &c{0}&f - &6{1} secondes restantes Commands.Cooldowns.Row.Y=\ &b{0}&f - &2 Pr\u00eat ! +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. @@ -709,6 +720,7 @@ 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 \u00e0 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 @@ -985,6 +997,8 @@ Skills.Stats={0}&a{1}&3 XP (&7{2}&3/&7{3}&3) Skills.ChildStats={0}&a{1} Skills.MaxXP=Max Skills.TooTired=Vous \u00eates trop fatigu\u00e9 pour r\u00e9utiliser cette comp\u00e9tence maintenant. +Skills.TooTired.Named=&7(&6{0}&e {1}s&7) +Skills.TooTired.Extra=&6{0} &eSuper abilit\u00e9 - {1} Skills.Cancelled={0} annul\u00e9(e) ! Skills.ConfirmOrCancel=&aFa\u00eetes de nouveau un clic droit pour confirmer &6{0}&a. Clic gauche pour annuler. Skills.AbilityGateRequirementFail=&7Vous devez avoir &e{0}&7 niveaux suppl\u00e9mentaires en &3{1}&7 pour utilisez cette super abilit\u00e9. @@ -1114,3 +1128,13 @@ Commands.Description.mmocompat=Information \u00e0 propos de mcMMO, des compatibi Compatibility.Layer.Unsupported=&6Compatibilit\u00e9s pour &a{0}&6 n'est pas une version de Minecraft support\u00e9. Compatibility.Layer.PartialSupport=&6Compatibilit\u00e9s pour &a{0}&6 n'est pas une version de Minecraft support\u00e9, mais mcMMO utilise une version qui \u00e9mule certaines fonctionnalit\u00e9s manquantes. Commands.XPBar.DisableAll=&6 Toutes les barres d\'XP mcMMO sont d\u00e9sormais d\u00e9sactiv\u00e9s, utilisez /mmoxpbar reset pour remettre la configuration par d\u00e9faut. +#Options pour le chat moderne +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) &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\u2192 &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! From 6eb894ba3a69b94a9112287a97abbec50e7312bf Mon Sep 17 00:00:00 2001 From: Daniil Date: Wed, 3 Feb 2021 01:58:13 +0300 Subject: [PATCH 366/662] Update locale_ru.properties (#4411) Almost fully re-translated and updated to latest versions --- .../resources/locale/locale_ru.properties | 2212 ++++++++--------- 1 file changed, 1093 insertions(+), 1119 deletions(-) diff --git a/src/main/resources/locale/locale_ru.properties b/src/main/resources/locale/locale_ru.properties index 537c0c2fe..3878e1ab1 100644 --- a/src/main/resources/locale/locale_ru.properties +++ b/src/main/resources/locale/locale_ru.properties @@ -1,1166 +1,1140 @@ -#\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=&6\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=&6[ mcMMO&e @&3{0} &6\u0420\u0430\u043d\u0433 &3{1}&6 \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=\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\u0443\u043C\u0435\u043D\u0438\u0435 +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 \u0443\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=&6\u0421 \u0443\u0434\u0430\u0447\u0435\u0439 +JSON.JWrapper.Perks.Lucky=\u0428\u0430\u043D\u0441 \u0432\u044B\u0448\u0435 \u043D\u0430 {0}% +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=\u0421\u0442\u0440\u0435\u043B\u044C\u0431\u0430 +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=\u0420\u0430\u0437\u0431\u043E\u0440\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\u0438\u0442\u0435 nossr50 \u0438 \u0435\u0433\u043E \u0440\u0430\u0431\u043E\u0442\u0443 \u043D\u0430\u0434 mcMMO \u043D\u0430 Patreon\\! +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\u0435\u0441\u0442\u0438 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=&6[ mcMMO&e @&3{0} &6\u0420\u0430\u043D\u0433 &3{1}&6 \u0440\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\u0435\u0434\u0443\u044E\u0449\u0435\u0435 \u0443\u043B\u0443\u0447\u0448\u0435\u043D\u0438\u0435 \u043D\u0430 \u0443\u0440\u043E\u0432\u043D\u0435 {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\u0423\u0440. {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@ + #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 &cRolled \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=&c\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=\u0422\u0435\u0441\u0442 &c\u041A\u0443\u0432\u044B\u0440\u043E\u043A \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=&c\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. + +#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} - -#ACROBATICS -Acrobatics.Ability.Proc=&a**\u0418\u0437\u044f\u0449\u043d\u043e\u0435 \u041f\u0440\u0438\u0437\u0435\u043c\u043b\u0435\u043d\u0438\u0435 ** -Acrobatics.Combat.Proc=&a**\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: &e{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=&6\u0428\u0430\u043d\u0441 \u0441\u043a\u043e\u043b\u044c\u0436\u0435\u043d\u0438\u044f &e{0}%&6 \u0428\u0430\u043d\u0441 \u0438\u0437\u044f\u0449\u043d\u043e\u0433\u043e \u0441\u043a\u043e\u043b\u044c\u0436\u0435\u043d\u0438\u044f&e {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=&7\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 &e{0}%&7 \u0448\u0430\u043d\u0441 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0443\u0440\u043e\u043d, \u0438 &e{1}%&7 \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 &e{2}&7 \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 &e{3}%&7 \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 &c{4}&7 \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 &a{5}&7 \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: &e{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: &e{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: &a{0}&3/&a{1} -Alchemy.SubSkill.Concoctions.Stat.Extra=\u0418\u043d\u0433\u0440\u0438\u0434\u0438\u0435\u043d\u0442\u044b [&a{0}&3]: &a{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: &e{0} % -Archery.Combat.RetrieveChance=\u0428\u0430\u043d\u0441 \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u0421\u0442\u0440\u0435\u043b\u044b: &e{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: &e{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=&a**\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=&a**\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=&4\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: &e{0}% -Axes.Combat.CriticalHit=\u041a\u0420\u0418\u0422\u0418\u0427\u0415\u0421\u041a\u0418\u0419 \u0423\u0414\u0410\u0420! -Axes.Combat.GI.Proc=&a**\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=&4\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\": &e{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=&a**\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=&a\u0412\u0430\u0448\u0435 \u0443\u043c\u0435\u043d\u0438\u0435 &e\"\u0420\u0430\u0441\u043a\u0430\u043b\u044b\u0432\u0430\u0442\u0435\u043b\u044c\u0427\u0435\u0440\u0435\u043f\u043e\u0432\" &a\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\"&a \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u043b\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0443 &e{0} -Axes.Skills.SS.Other.On=&a{0}&2 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0443\u043c\u0435\u043d\u0438\u0435&c\"\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=&a**\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=&a**\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\": &e{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=&a**\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=&a\u0412\u0430\u0448\u0435 \u0443\u043c\u0435\u043d\u0438\u0435 &e\"\u041c\u0435\u0433\u0430 \u0411\u0443\u0440\" &a\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\"&a \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u043b\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0443 &e{0} -Excavation.Skills.GigaDrillBreaker.Other.On=&a{0}&2 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0443\u043c\u0435\u043d\u0438\u0435&c\"\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=&e&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=&7&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=&c&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=&7\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: &e{0} -Fishing.Ability.Info=\u041e\u0445\u043e\u0442\u043d\u0438\u043a \u0417\u0430 \u041c\u0430\u0433\u0438\u0435\u0439: &7 **\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: &e{0}/5 -Fishing.Ability.TH.DropRate=\u0428\u0430\u043d\u0441\u044b \u0414\u0440\u043e\u043f\u0430: &4\u041b\u043e\u0432\u0443\u0448\u043a\u0430: &e{0} &7\u041e\u0431\u044b\u0447\u043d\u044b\u0439: &e{1} &a\u041d\u0435\u043e\u0431\u044b\u0447\u043d\u044b\u0439: &e{2}\n&9\u0420\u0435\u0434\u043a\u0438\u0439: &e{3} &d\u042d\u043f\u0438\u0447\u0435\u0441\u043a\u0438\u0439: &e{4} &6\u041b\u0435\u0433\u0435\u043d\u0434\u0430\u0440\u043d\u044b\u0439: &e{5} &b\u041f\u043b\u0430\u0441\u0442\u0438\u043d\u043a\u0430: &e{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: &e{0} -Fishing.Ability.Shake=\u0428\u0430\u043d\u0441 \u0412\u0441\u0442\u0440\u044f\u0441\u043a\u0438: &e{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: &e\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: &a{0}&3/&a{1} -Fishing.SubSkill.TreasureHunter.Stat.Extra=\u0428\u0430\u043d\u0441 \u0434\u0440\u043e\u043f\u0430: &7\u041e\u0431\u044b\u0447\u043d\u044b\u0439: &e{0} &a\u041d\u0435\u043e\u0431\u044b\u0447\u043d\u044b\u0439: &e{1}\n&9\u0420\u0435\u0434\u043a\u0438\u0439: &e{2} &d\u042d\u043f\u0438\u0447\u0435\u0441\u043a\u0438\u0439: &e{3} &6\u041b\u0435\u0433\u0435\u043d\u0434\u0430\u0440\u043d\u044b\u0439: &e{4} &bMythic: &e{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:&a \u0420\u0430\u043d\u0433 {0} -Fishing.SubSkill.MasterAngler.Name=\u041c\u0430\u0441\u0442\u0435\u0440 \u0420\u044b\u0431\u043e\u043b\u043e\u0432 -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=&9 \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=&7\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=&7\u0412\u0420\u0415\u041c\u042f \u0412\u0417\u0420\u042b\u0412\u0410\u0422\u042c!!! -Fishing.Ability.TH.Poison=&7\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: &e{0} % -Herbalism.Ability.FD=\u0424\u0435\u0440\u043c\u0435\u0440\u0441\u043a\u0430\u044f \u0414\u0438\u0435\u0442\u0430: &e\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\": &e{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: &e{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: &e \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=&a**\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: &e{0} -Herbalism.Ability.Lower=&a**\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=&a**\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: &e{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: &a \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: &a\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=&a\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=&a**\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=&a\u0412\u0430\u0448\u0435 \u0443\u043c\u0435\u043d\u0438\u0435 &e\"\u041e\u0437\u0435\u043b\u0435\u043d\u0435\u043d\u0438\u0435\" &a\u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e! -Herbalism.Skills.GTe.Other.Off=&a \u0423\u043c\u0435\u043d\u0438\u0435 \"&c\u041e\u0437\u0435\u043b\u0435\u043d\u0435\u043d\u0438\u0435&a \" \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u043b\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0443 &e{0} -Herbalism.Skills.GTe.Other.On=&a{0}&2 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0443\u043c\u0435\u043d\u0438\u0435 &c \"\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\": &e{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=&a**\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=&a**\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:&a \u0420\u0430\u043d\u0433 {0}/{1} &7({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: &a+{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: &e{0} -Mining.Effect.DropChance=\u0428\u0430\u043d\u0441 \u0414\u0432\u043e\u0439\u043d\u043e\u0433\u043e \u0414\u0440\u043e\u043f\u0430: &e{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=&a**\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\"&a \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u043b\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0443 &e{0} -Mining.Skills.SuperBreaker.Other.On=&a{0}&2 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0443\u043c\u0435\u043d\u0438\u0435 &c\"\u0421\u0443\u043f\u0435\u0440 \u0414\u0440\u043e\u0431\u0438\u043b\u043a\u0430\"! -Mining.Skills.SuperBreaker.Refresh=&a\u0412\u0430\u0448\u0430 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c &e\u041a\u043e\u043f\u0430\u0442\u0435\u043b\u044c &a\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=&7**\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: &e+{0} -Mining.Blast.Rank=\u041f\u043e\u0434\u0440\u044b\u0432\u043d\u0430\u044f \u0414\u043e\u0431\u044b\u0447\u0430: &e \u0420\u0430\u043d\u0433 {0}/8 &7({1}) -Mining.Blast.Other.On=&a{0}&2 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0443\u043c\u0435\u043d\u0438\u0435 &c\"\u041f\u043e\u0434\u0440\u044b\u0432\u043d\u0430\u044f \u0414\u043e\u0431\u044b\u0447\u0430\"! -Mining.Blast.Refresh=&a\u0412\u0430\u0448\u0435 \u0443\u043c\u0435\u043d\u0438\u0435 &e\"\u041f\u043e\u0434\u0440\u044b\u0432\u043d\u0430\u044f \u0414\u043e\u0431\u044b\u0447\u0430\" &a\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: &a\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: &e\u0420\u0430\u043d\u0433 {0}/{1} -Repair.SubSkill.ArcaneForging.Stat.Extra=&3\u0412\u043e\u043b\u0448\u0435\u0431\u043d\u0430\u044f \u041a\u043e\u0432\u043a\u0430 \u0428\u0430\u043d\u0441\u044b:&7 \u0423\u0441\u043f\u0435\u0445 &a{0}&7%, \u041f\u0440\u043e\u0432\u0430\u043b &c{1}&7% -Repair.Error=&4mcMMO \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=&4\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=&4\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=&4\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=&4\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=&4\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 &e{0}&c, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u0440\u0435\u043c\u043e\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c &e{1} -Repair.Skills.FeltEasy=&7\u042d\u0442\u043e \u0431\u044b\u043b\u043e \u043b\u0435\u0433\u043a\u043e. -Repair.Skills.FullDurability=&7\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=&4\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: &e\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=&4\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: &e{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=&7\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: &e{0}% -Repair.Arcane.Chance.Success=&7\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\": &e{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=&a\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: &e\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: &a\u0420\u0430\u0437\u0431\u0435\u0440\u0438 \u0434\u043e &e{0}&a \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: &e\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 &e{0}&a \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=&7\u041f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e-\u0428\u0430\u043d\u0441 \u0427\u0430\u0440 -Salvage.Arcane.ExtractPartial=&7\u0427\u0430\u0441\u0442\u0438\u0447\u043d\u043e-\u0428\u0430\u043d\u0441 \u0427\u0430\u0440 -Salvage.Skills.Success=&a\u041f\u0440\u0435\u0434\u043c\u0435\u0442 \u041f\u0435\u0440\u0435\u0440\u0430\u0431\u043e\u0442\u0430\u043d! -Salvage.Skills.Adept.Damaged=&4\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 &e{0}&c \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c &e{1} -Salvage.Skills.TooDamaged=&4\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=&c\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=&c\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=&a\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=&4\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=&6\u0423 \u0432\u0430\u0441 \u0432\u044b\u0448\u043b\u043e \u0438\u0437\u0432\u043b\u0435\u0447\u044c &3{0}&6 \u0438\u0437 &e{1}&6. -Salvage.Skills.Lottery.Perfect=&a&l\u041f\u0440\u0435\u0432\u043e\u0441\u0445\u043e\u0434\u043d\u043e!&r&6 \u0412\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438 &3{1}&6 \u0431\u0435\u0437 \u043e\u0441\u043e\u0431\u044b \u0443\u0441\u0438\u043b\u0438\u0439 \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 &3{0}&6. -Salvage.Skills.Lottery.Untrained=&7\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 &c{0}&7 \u0438\u0437 &a{1}&7. -#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=&7**\u041c\u0415\u0427 \u0412 \u041e\u0411\u042b\u0427\u041d\u041e\u041c \u0421\u041e\u0421\u0422\u041e\u042f\u041d\u0418\u0418** -Swords.Ability.Ready=&3**\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=&7\u0417\u0410\u041c\u0415\u0422\u041a\u0410: &e1 \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: &e{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: &e{0} \u0442\u0438\u043a\u043e\u0432 -Swords.Combat.Bleed.Note=&7\u0417\u0410\u041c\u0415\u0422\u041a\u0410: &e1 \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=&4 \u0412\u044b \u0438\u0441\u0442\u0435\u043a\u0430\u0435\u0442\u0435 \u043a\u0440\u043e\u0432\u044c\u044e! -Swords.Combat.Bleeding.Stopped=&7\u041a\u0440\u043e\u0432\u043e\u0442\u0435\u0447\u0435\u043d\u0438\u0435 &a\u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u043b\u043e\u0441\u044c&7! -Swords.Combat.Bleeding=&a**\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: &e{0} -Swords.Combat.Counter.Hit=&4\u041f\u043e\u0440\u0430\u0436\u0435\u043d \u043a\u043e\u043d\u0442\u0440\u0430\u0442\u0430\u043a\u043e\u0439! -Swords.Combat.Countered=&a**\u041a\u041e\u041d\u0422\u0420\u0410\u0422\u0410\u041a\u0410** -Swords.Combat.SS.Struck=&4\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: &a{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=&a**\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=&a\u0412\u0430\u0448\u0435 \u0443\u043c\u0435\u043d\u0438\u0435 &e\"\u0420\u0435\u0436\u0443\u0449\u0438\u0439 \u0423\u0434\u0430\u0440\" &a\u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e! -Swords.Skills.SS.Other.Off=&a\u0423\u043c\u0435\u043d\u0438\u0435 \"&c\u0420\u0435\u0436\u0443\u0449\u0438\u0439 \u0443\u0434\u0430\u0440&a\" \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u043b\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0443 &e{0} -Swords.Skills.SS.Other.On=&a{0}&2 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0443\u043c\u0435\u043d\u0438\u0435 &c\"\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\": &e{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=&7COTW (\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=&7COTW (\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=&7COTW (\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=&8\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=&a\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.COTW.Success.WithoutLifespan=&a(\u0417\u043e\u0432 \u041f\u0440\u0435\u0434\u043a\u043e\u0432) &7\u0412\u044b \u043f\u0440\u0438\u0437\u0432\u0430\u043b\u0438 &6{0}&7 -Taming.Summon.COTW.Success.WithLifespan=&a(\u0417\u043e\u0432 \u041f\u0440\u0435\u0434\u043a\u043e\u0432) &7\u0412\u044b \u043f\u0440\u0438\u0437\u0432\u0430\u043b\u0438 &6{0}&7 \u043d\u0430 &6{1}&7 \u0441\u0435\u043a. -Taming.Summon.COTW.Limit=&a(\u0417\u043e\u0432 \u041f\u0440\u0435\u0434\u043a\u043e\u0432) &7\u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u043c\u0435\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e &c{0} &7\u043f\u0440\u0438\u0437\u0432\u0430\u043d\u043d\u044b\u0445 &7{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=&a(\u0417\u043e\u0432 \u041f\u0440\u0435\u0434\u043a\u043e\u0432) &7\u0412\u0440\u0435\u043c\u044f \u0432\u044b\u0448\u043b\u043e, \u0432\u0430\u0448\u0438 &6{0}&7 \u043e\u0442\u0441\u0442\u0443\u043f\u0430\u044e\u0442. -Taming.Summon.COTW.BreedingDisallowed=&a(\u0417\u043e\u0432 \u041f\u0440\u0435\u0434\u043a\u043e\u0432) &c\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=&a(\u0417\u043e\u0432 \u041f\u0440\u0435\u0434\u043a\u043e\u0432) &7\u0412\u043e\u043c \u043d\u0443\u0436\u043d\u043e \u043d\u0430 &e{0}&7 \u0431\u043e\u043b\u044c\u0448\u0435 &3{1}&7 -Taming.Summon.Name.Format=&6(\u0417\u043e\u0432 \u041f\u0440\u0435\u0434\u043a\u043e\u0432) &f{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\": &e{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: &e{0} -Unarmed.Ability.Chance.Disarm=\u0428\u0430\u043d\u0441 \u0420\u0430\u0437\u043e\u0440\u0443\u0436\u0438\u0442\u044c: &e{0} -Unarmed.Ability.Chance.IronGrip=\u0428\u0430\u043d\u0441 \u0416\u0435\u043b\u0435\u0437\u043d\u043e\u0439 \u0425\u0432\u0430\u0442\u043a\u0438: &e{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=&a\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=&7**\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=&3**\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=&a**\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=&a\u0423\u043c\u0435\u043d\u0438\u0435 \"&c\u0411\u0435\u0440\u0441\u0435\u0440\u043a&a\" \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u043b\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0443 &e{0} -Unarmed.Skills.Berserk.Other.On=&a{0}&2 \u0432\u043a\u043b\u044e\u0447\u0438\u043b &c\u0443\u043c\u0435\u043d\u0438\u0435 \"\u0411\u0435\u0440\u0441\u0435\u0440\u043a\"! -Unarmed.Skills.Berserk.Refresh=&a\u0412\u0430\u0448\u0435 \u0443\u043c\u0435\u043d\u0438\u0435 &e\"\u0411\u0435\u0440\u0441\u0435\u0440\u043a\" &a\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: &e{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\": &e{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=&c**\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=&a**\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=&a\u0412\u0430\u0448\u0435 \u0443\u043c\u0435\u043d\u0438\u0435 &e\"\u041b\u0435\u0441\u043e\u0440\u0443\u0431\" &a\u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e! -Woodcutting.Skills.TreeFeller.Other.Off=&a\u0423\u043c\u0435\u043d\u0438\u0435 \"&c\u041b\u0435\u0441\u043e\u0440\u0443\u0431&a\" \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u043b\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0443 &e{0} -Woodcutting.Skills.TreeFeller.Other.On=&a{0}&2 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0443\u043c\u0435\u043d\u0438\u0435 &c\"\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=&a**\u0423\u041c\u0415\u041d\u0418\u042f \u0412\u041e\u0421\u0421\u0422\u0410\u041d\u041e\u0412\u041b\u0415\u041d\u042b!** +# BEGIN STYLING +Ability.Generic.Refresh=&a**\u0423\u041C\u0415\u041D\u0418\u042F \u0412\u041E\u0421\u0421\u0422\u0410\u041D\u041E\u0412\u041B\u0415\u041D\u042B\\!** Ability.Generic.Template.Lock=&7{0} -Ability.Generic.Template=&6{0}: &3{1} -#COMBAT -Combat.ArrowDeflect=&f**\u0421\u0422\u0420\u0415\u041b\u0410 \u041e\u0422\u0421\u041a\u041e\u0427\u0418\u041b\u0410** -Combat.BeastLore=&a**\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=&3\u0417\u0434\u043e\u0440\u043e\u0432\u044c\u0435 (&a{0}&3/{1}) -Combat.BeastLoreOwner=&3\u0412\u043b\u0430\u0434\u0435\u043b\u0435\u0446 (&c{0}&3) -Combat.Gore=&a**\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 &4\u0428\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0430 -Combat.TouchedFuzzy=&4\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=&3\u041e \u043f\u0440\u043e\u044d\u043a\u0442\u0435 &emcMMO&3:,&6mcMMO \u044d\u0442\u043e &c\u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439&6 RPG \u043c\u043e\u0434, &6\u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u0432 \u0444\u0435\u0432\u0440\u0430\u043b\u0435 2011,&6\u043a\u043e\u043c\u043c\u0430\u043d\u0434\u043e\u0439 &9nossr50&6. \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.,&3\u041f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438:,&6 - &a\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 &c/mcmmo help&a \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,&6 - &a\u041d\u0430\u043f\u0435\u0447\u0430\u0442\u0430\u0439\u0442\u0435 &c/\u041d\u0410\u0417\u0412\u0410\u041d\u0418\u0415\u0423\u041c\u0415\u041d\u0418\u042f&a \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,&3\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438:,&6 - &anossr50 &9(Creator & Project Lead),&6 - &aelectronicboy &9(Dev),&6 - &akashike &9(Dev),&6 - &at00thpick1 &9(Classic Maintainer) -mcMMO.Description.FormerDevs=&3\u0411\u044b\u0432\u0448\u0438\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438: &aGJ, NuclearW, bm01, TfT_02, Glitchfinder -Commands.addlevels.AwardAll.1=&a\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=&a\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=&a\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=&a\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 &c\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 &a\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 &e{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 &c\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 &c\u0432\u043a\u043b\u044e\u0447\u0435\u043d -Commands.AdminToggle=&a- \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=&6--= &a\u041a\u0443\u043b\u0434\u0430\u0443\u043d\u044b \u0423\u043c\u0435\u043d\u0438\u0439 mcMMO&6 =-- -Commands.Cooldowns.Row.N=\\ &c{0}&f - &6{1} \u0441\u0435\u043a\u0443\u043d\u0434 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c -Commands.Cooldowns.Row.Y=\\ &b{0}&f - &2\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= &c\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 &e{0} -Commands.AdminChatSpy.Chat=&6[\u041f\u041e\u0414\u0421\u041b\u0423\u0428\u0418\u0412\u0410\u041d\u0418\u0415: &a{0}&6] &f{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 &e{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 &e\u0421\u0435\u0440\u0434\u0446\u0430&f. -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 &e\u041a\u0432\u0430\u0434\u0440\u0430\u0442\u044b&f. -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 &7\u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u043e&f. -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> &a- \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=&a\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> &a- \u0421\u043f\u0438\u0441\u043a\u0438 \u041b\u0438\u0434\u0435\u0440\u043e\u0432 -Commands.mcc.Header=---[]&e\u041a\u043e\u043c\u0430\u043d\u0434\u044b mcMMO&c[]--- -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=&a\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=&6-=\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&a - &6\u0420\u0430\u043d\u0433 &f#&a{0} -Commands.mcrank.Player=\u0426\u0415\u041b\u042c: &f{0} -Commands.mcrank.Skill=&e{0}&a - &6\u0420\u0430\u043d\u0433 &f#&a{1} -Commands.mcrank.Unranked=&f\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=&a{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=&6\u041f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430: \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 &c/mcrank&6 \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> &c - \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=&a\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=&a\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=&7\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=&7\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 &a{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: &a\u041b\u0418\u041d\u0415\u0419\u041d\u0418\u0419 &c\u0438 &a\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=&7\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=&7\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=&a- \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 &c\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 &a \u043d\u0430 -Commands.Offline=&c \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=&a--\u0414\u0420\u0423\u0413\u0418\u0415 \u041a\u041e\u041c\u0410\u041d\u0414\u042b-- -Commands.Party.Header=-----[]&a\u0413\u0420\u0423\u041f\u041f\u0410&c[]----- -Commands.Party.Status=&8\u041d\u0410\u0417\u0412\u0410\u041d\u0418\u0415: &f{0} {1} -Commands.Party.Status.Alliance=&8\u0421\u041e\u042e\u0417: &f{0} -Commands.Party.UnlockedFeatures=&8\u0420\u0410\u0417\u0411\u041b\u041e\u041a\u0418\u0420\u041e\u0412\u0410\u041d\u041d\u042b\u0415 \u0424\u0423\u041d\u041a\u0426\u0418\u0418: &7&o{0} -Commands.Party.ShareMode=&8\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=&7\u041f\u0420\u0415\u0414\u041c\u0415\u0422 &3({0}) -Commands.Party.ExpShare=&7\u041e\u041f\u042b\u0422 &3({0}) -Commands.Party.ItemShareCategories=&8\u0414\u0435\u043b\u0435\u0436 \u041f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u0432: &7&o{0} -Commands.Party.MembersNear=&8\u0412\u041e\u0417\u041b\u0415 \u0412\u0410\u0421 &3{0}&8/&3{1} -Commands.Party.Accept=&a- \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 &c\u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d -Commands.Party.Chat.On=\u0413\u0440\u0443\u043f\u043f\u043e\u0432\u043e\u0439 \u0427\u0430\u0442 &c\u0432\u043a\u043b\u044e\u0447\u0435\u043d -Commands.Party.Commands=&a--\u0413\u0420\u0423\u041f\u041f\u041e\u0412\u042b\u0415 \u041a\u041e\u041c\u0410\u041d\u0414\u042b-- -Commands.Party.Invite.0=&c\u0412\u041d\u0418\u041c\u0410\u041d\u0418\u0415: &a\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=&e\u041d\u0430\u043f\u0435\u0447\u0430\u0442\u0430\u0439\u0442\u0435 &a/party accept&e, \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=&a- \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=&a\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=&7\u0423\u0447\u0430\u0441\u0442\u043d\u0438\u043a \u0413\u0440\u0443\u043f\u043f\u044b: {0} -Commands.Party.PartyFull=&6{0}&c \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 &e{0}&c \u0432 &a{1}&c \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432 \u043d\u0435\u0439 \u0443\u0436\u0435 &3{2}&c \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 &a{0}&c \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432 \u043d\u0435\u0439 \u0443\u0436\u0435 &3{1}&c \u0438\u0433\u0440\u043e\u043a\u043e\u0432! -Commands.Party.Create=&7\u0421\u043e\u0437\u0434\u0430\u043d\u0430 \u0413\u0440\u0443\u043f\u043f\u0430: {0} -Commands.Party.Rename=&7\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0433\u0440\u0443\u043f\u043f\u044b \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043e \u043d\u0430: &f{0} -Commands.Party.SetSharing=&7\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: &3{1} -Commands.Party.ToggleShareCategory=&7\u0414\u0435\u043b\u0435\u0436 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430\u043c\u0438 \u0432 \u0433\u0440\u0443\u043f\u0435 \u0434\u043b\u044f &6{0} &7 &3{1} -Commands.Party.AlreadyExists=&4\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=-----[]&a\u0423\u0427\u0410\u0421\u0422\u041d\u0418\u041a\u0418&c[]----- -Commands.Party.None=\u0412\u044b \u043d\u0435 \u0432 \u0433\u0440\u0443\u043f\u043f\u0435. -Commands.Party.Quit=&a- \u041f\u043e\u043a\u0438\u043d\u0443\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0433\u0440\u0443\u043f\u043f\u0443 -Commands.Party.Teleport= &c- \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=&a- \u0412\u043a\u043b./\u043e\u0442\u043a\u043b. \u0433\u0440\u0443\u043f\u043f\u043e\u0432\u043e\u0439 \u0447\u0430\u0442 -Commands.Party1=&a- \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u0443\u044e \u0433\u0440\u0443\u043f\u043f\u0443 -Commands.Party2=&a- \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=&c-----[]&a\u0421\u041e\u042e\u0417 \u0413\u0420\u0423\u041f\u041f\u042b&c[]----- -Commands.Party.Alliance.Ally=&f{0} &8\u0412 \u0421\u041e\u042e\u0417\u0415 \u0421: &f{1} -Commands.Party.Alliance.Members.Header=&c-----[]&a\u0423\u0427\u0410\u0421\u0422\u041d\u0418\u041a\u0418 \u0421\u041e\u042e\u0417\u0410&c[]----- -Commands.Party.Alliance.Invite.0=\u0412\u041d\u0418\u041c\u0410\u041d\u0418\u0415: &a\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 &a/party alliance accept&e \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=&a\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=&c\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=&c\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 &3/party alliance disband -Commands.Party.Alliance.Help.0=&c\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=&c \u0434\u043b\u044f \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0441\u043e\u044e\u0437\u0430 &3/party alliance invite <\u0438\u0433\u0440\u043e\u043a>&c. -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 &a\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 &c\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} &a\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=&a\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 &e/ptp accept. &a\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 &c{0} &a\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 &a\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 &c\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&9 \u041e\u0431\u0449\u0435\u043c\u0443 \u0423\u0440\u043e\u0432\u043d\u044e &e-- -Commands.PowerLevel.Capped=&4\u041e\u0411\u0429\u0418\u0419 \u0423\u0420\u041e\u0412\u0415\u041d\u042c: &a{0} &4\u041c\u0410\u041a\u0421\u0418\u041c\u0410\u041b\u042c\u041d\u042b\u0419 \u0423\u0420\u041e\u0412\u0415\u041d\u042c: &e{1} -Commands.PowerLevel=&4\u041e\u0411\u0429\u0418\u0419 \u0423\u0420\u041e\u0412\u0415\u041d\u042c: &a{0} -Commands.Reset.All=&a\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=&a\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=&a-\u0421\u0431\u0440\u043e\u0441 \u0443\u0440\u043e\u0432\u043d\u044f \u043d\u0430\u0432\u044b\u043a\u0430 \u0434\u043e 0 -Commands.Scoreboard.Clear=&3\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=&3\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 &a/mcscoreboard clear&3. -Commands.Scoreboard.Timer=&3\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 &6{0}&3 \u0441\u0435\u043a\u0443\u043d\u0434. -Commands.Scoreboard.Help.0=&6 == &a\u041f\u043e\u043c\u043e\u0449\u044c \u043f\u043e &c/mcscoreboard&6 == -Commands.Scoreboard.Help.1=&3/mcscoreboard&b clear &f - \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=&3/mcscoreboard&b keep &f - \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=&3/mcscoreboard&b time [n] &f - \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 &dn&f \u0441\u0435\u043a\u0443\u043d\u0434 -Commands.Scoreboard.Tip.Keep=&6\u041f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430: \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 &c/mcscoreboard keep&6 \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=&6\u041f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430: \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 &c/mcscoreboard clear&6 \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 &9{0}&e \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=&a- \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=&a- \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=&7\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=&3-=[]=====[]&6 MMO \u0418\u043d\u0444\u043e &3[]=====[]=- -Commands.MmoInfo.SubSkillHeader=&6\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435:&e {0} -Commands.MmoInfo.DetailsHeader=&3-=[]=====[]&a \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 &3[]=====[]=- -Commands.MmoInfo.OldSkill=&7mcMMO \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=&3-=[]=====[]&6 \u041c\u0435\u0445\u0430\u043d\u0438\u043a\u0438 &3[]=====[]=- -Commands.MmoInfo.Stats=\u0421\u0422\u0410\u0422\u042b: {0} -Commands.Mmodebug.Toggle=mcMMO \u0420\u0415\u0416\u0418\u041c \u0414\u0415\u0411\u0410\u0413\u0410 &6{0}&7, \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=&4\u041d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u0430\u0432. -mcMMO.NoSkillNote=&8\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 &3{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 &3{0} [password]. -Party.Help.2=\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 &3{0} &c\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 &3{0} [password] &c\u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0435\u043d\u0438\u0442\u044c\u0441\u044f \u0438\u043b\u0438 &3{1} &c\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 &3{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 &3{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 &3 {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 &3{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 &3{0} -Party.Help.9=\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 &3{0} &c\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 &3{0} &c\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} &a\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} &a\u043f\u043e\u043a\u0438\u043d\u0443\u043b \u0432\u0430\u0448\u0443 \u0433\u0440\u0443\u043f\u043f\u0443 -Party.InformedOnNameChange=&6{0} &a\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 &f{1} -Party.InvalidName=&4\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=&c\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=&c\u042d\u0442\u0430 \u0433\u0440\u0443\u043f\u043f\u0430 \u0443\u0436\u0435 \u0437\u0430\u043a\u0440\u044b\u0442\u0430! -Party.IsntLocked=&c\u042d\u0442\u0430 \u0433\u0440\u0443\u043f\u043f\u0430 \u043d\u0435 \u0437\u0430\u043a\u0440\u044b\u0442\u0430! -Party.Locked=&c\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=&4{0} \u043d\u0435 \u0432 \u0433\u0440\u0443\u043f\u043f\u0435 -Party.NotOwner=&4\u0412\u044b \u043d\u0435 \u043b\u0438\u0434\u0435\u0440 \u0433\u0440\u0443\u043f\u043f\u044b. -Party.Owner.New=&a{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=&4\u0412\u044b \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043b\u0438\u0434\u0435\u0440 \u0433\u0440\u0443\u043f\u043f\u044b. -Party.Owner.Player=&a\u0422\u0435\u043f\u0435\u0440\u044c \u0432\u044b \u043b\u0438\u0434\u0435\u0440 \u0433\u0440\u0443\u043f\u043f\u044b. -Party.Password.None=&c\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=&c\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=&a\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=&a\u041f\u0430\u0440\u043e\u043b\u044c \u0433\u0440\u0443\u043f\u043f\u044b \u0431\u044b\u043b \u0443\u0434\u0430\u043b\u0435\u043d. -Party.Player.Invalid=&c\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=&4{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=&4{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=&a\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=&a{0} \u0442\u0435\u043b\u0435\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f \u043a \u0412\u0430\u043c. -Party.Teleport.Disabled=&c\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=&c\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=&c\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=&7\u0413\u0440\u0443\u043f\u043f\u0430 \u0440\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0430 -Party.Disband=&7\u0413\u0440\u0443\u043f\u043f\u0430 \u0431\u044b\u043b\u0430 \u0440\u0430\u0441\u043f\u0443\u0449\u0435\u043d\u0430 -Party.Alliance.Formed=&7\u0412\u0430\u0448\u0430 \u0433\u0440\u0443\u043f\u043f\u0430 \u0442\u0435\u043f\u0435\u0440\u044c \u0432 \u0441\u043e\u044e\u0437\u0435 \u0441 &a{0} -Party.Alliance.Disband=&7\u0412\u0430\u0448\u0430 \u0433\u0440\u0443\u043f\u043f\u0430 \u0431\u043e\u043b\u0435\u0435 \u043d\u0435 \u0432 \u0441\u043e\u044e\u0437\u0435 \u0441 &c{0} -Party.Status.Locked=&4(\u0422\u041e\u041b\u042c\u041a\u041e \u041f\u041e \u041f\u0420\u0418\u0413\u041b\u0410\u0428\u0415\u041d\u0418\u042e) -Party.LevelUp=&e\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=&c\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=&c\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=&c\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=&c\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=&c\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=&2(\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=&8\u041f\u041e\u041b\u0423\u0427\u0415\u041d\u041e \u041e\u041f\u042b\u0422\u0410: &f{0} -Commands.xplock.locked=&6\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=&6\u0412\u0430\u0448\u0430 \u043f\u0430\u043d\u0435\u043b\u044c \u043e\u043f\u044b\u0442\u0430 \u0442\u0435\u043f\u0435\u0440\u044c &a\u0420\u0410\u0417\u0411\u041b\u041e\u041a\u0418\u0420\u041e\u0412\u0410\u041d\u0410&6! -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=&amcMMO&6 \u0421\u043e\u0431\u044b\u0442\u0438\u0435! -Commands.Event.Stop=&amcMMO&3 \u0421\u043e\u0431\u044b\u0442\u0438\u0435 \u0417\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u043e\u0441\u044c! -Commands.Event.Stop.Subtitle=&a\u041d\u0430\u0434\u0435\u044e\u0441\u044c \u0442\u044b \u043f\u043e\u0432\u0435\u0441\u0435\u043b\u0438\u043b\u0441\u044f! -Commands.Event.XP=&3\u041c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043e\u043f\u044b\u0442\u0430 \u0441\u0435\u0439\u0447\u0430\u0441 &6{0}&3x -Commands.xprate.started.0=&6\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=&6\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=&e[\u0421\u0435\u0440\u0432\u0435\u0440] -Notifications.Admin.XPRate.Start.Self=&7\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 &6{0}x -Notifications.Admin.XPRate.End.Self=&7\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} &7\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} &7\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=&6(&amcMMO &3Admin&6) &7{0} -Notifications.Admin.Format.Self=&6(&amcMMO&6) &7{0} - -# Event -XPRate.Event=&6\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=&7\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=&6-=&a{0} \u0420\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e&6=- -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=&3\u041e \u043d\u0430\u0432\u044b\u043a\u0435 \u0410\u043a\u0440\u043e\u0431\u0430\u0442\u0438\u043a\u0430:\n&e\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&e\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&3\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u043f\u044b\u0442\u0430:\n&e\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&e\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=&3\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0443\u043c\u0435\u043d\u0438\u0435 \u041f\u0440\u044b\u0436\u043e\u043a?\n&e\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&e\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&e\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0443\u0434\u0432\u043e\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0448\u0430\u043d\u0441.\n&e\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&e\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&e\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&e\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=&3\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&e\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&e\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&e\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=&3\u041e \u043d\u0430\u0432\u044b\u043a\u0435 \u0410\u043b\u0445\u0438\u043c\u0438\u044f:\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\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u041a\u0430\u0442\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440?\n&e\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&e\u043c\u0430\u043a\u0441. \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e 4x \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 1000.\n&e\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=&3\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043e\u0442\u0432\u0430\u0440\u044b?\n&e\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&e\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&e\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=&3\u041e\u0442\u0432\u0430\u0440\u044b 1 \u0442\u0438\u0440\u0430 (\u0438\u043d\u0433\u0440\u0438\u0434\u0438\u0435\u043d\u0442\u044b):\n&e\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&e\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&e\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&e\u0418\u0433\u043b\u043e\u0431\u0440\u044e\u0445\n&e(\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0437\u0435\u043b\u044c\u044f) -Guides.Alchemy.Section.4=&3\u041e\u0442\u0432\u0430\u0440\u044b 2 \u0442\u0438\u0440\u0430 (\u0438\u043d\u0433\u0440\u0438\u0434\u0438\u0435\u043d\u0442\u044b):\n&e\u041c\u043e\u0440\u043a\u043e\u0432\u044c (\u0417\u0435\u043b\u044c\u0435 \u0421\u043a\u043e\u0440\u043e\u0441\u0442\u0438)\n&e\u0421\u043b\u0438\u0437\u044c (\u0417\u0435\u043b\u044c\u0435 \u0422\u0443\u043f\u043e\u0441\u0442\u0438)\n\n&3\u041e\u0442\u0432\u0430\u0440\u044b 3 \u0442\u0438\u0440\u0430 (\u0438\u043d\u0433\u0440\u0438\u0434\u0438\u0435\u043d\u0442\u044b):\n&e\u041a\u0432\u0430\u0440\u0446 (\u0417\u0435\u043b\u044c\u0435 \u041f\u043e\u0433\u043b\u043e\u0449\u0435\u043d\u0438\u044f)\n&e\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=&3\u041e\u0442\u0432\u0430\u0440\u044b 4 \u0442\u0438\u0440\u0430 (\u0438\u043d\u0433\u0440\u0438\u0434\u0438\u0435\u043d\u0442\u044b):\n&e\u042f\u0431\u043b\u043e\u043a\u043e (\u0417\u0435\u043b\u044c\u0435 \u0414\u043e\u043f. \u0417\u0434\u043e\u0440\u043e\u0432\u044c\u044f)\n&e\u0413\u043d\u0438\u043b\u0430\u044f \u041f\u043b\u043e\u0442\u044c (\u0417\u0435\u043b\u044c\u0435 \u0413\u043e\u043b\u043e\u0434\u0430)\n\n&3\u041e\u0442\u0432\u0430\u0440\u044b 5 \u0442\u0438\u0440\u0430 (\u0438\u043d\u0433\u0440\u0438\u0434\u0438\u0435\u043d\u0442\u044b):\n&e\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&e\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=&3\u041e\u0442\u0432\u0430\u0440\u044b 6 \u0442\u0438\u0440\u0430 (\u0438\u043d\u0433\u0440\u0438\u0434\u0438\u0435\u043d\u0442\u044b):\n&e\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&3\u041e\u0442\u0432\u0430\u0440\u044b 7 \u0442\u0438\u0440\u0430 (\u0438\u043d\u0433\u0440\u0438\u0434\u0438\u0435\u043d\u0442\u044b):\n&e\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&3\u041e\u0442\u0432\u0430\u0440\u044b 8 \u0442\u0438\u0440\u0430 (\u0438\u043d\u0433\u0440\u0438\u0434\u0438\u0435\u043d\u0442\u044b):\n&e\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=&3\u041e \u043d\u0430\u0432\u044b\u043a\u0435 \u041b\u0443\u043a\u0438:\n&e\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&e\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&e\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&e\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&3\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u043f\u044b\u0442\u0430:\n&e\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=&3\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&e\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&e\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&e\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&e\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&e\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=&3\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&e\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&e\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&e\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&e\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=&3\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&e\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&e\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&e\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&e\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&e100% \u043d\u0430 1000 \u0443\u0440\u043e\u0432\u043d\u0435. -##Axes -Guides.Axes.Section.0=&3\u041e \u043d\u0430\u0432\u044b\u043a\u0435 \u0422\u043e\u043f\u043e\u0440\u044b:\n&e\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&e\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&e\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&e\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&e\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&e\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&e\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&3\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u043f\u044b\u0442\u0430:\n&e\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&e\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=&3\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&e\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&e\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&e\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=&3\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&e\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&e\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&e\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&e\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&e\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=&3\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&e\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&e\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&e\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&e\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=&3\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&e\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&e\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&e\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=&3\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&e\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&e\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&e\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&e\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&e\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=&3\u041e \u043d\u0430\u0432\u044b\u043a\u0435 \u0420\u0430\u0441\u043a\u043e\u043f\u043a\u0438:\n&e\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&e\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&e\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&3\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u043f\u044b\u0442\u0430:\n&e\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&e\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=&3\u0421\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b:\n&e\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=&3\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&e\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&e\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&e\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=&3\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u041c\u0435\u0433\u0430 \u0411\u0443\u0440?\n&e\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&e\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&e\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=&3\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&e\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&e\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&e\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&e\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&e\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&e\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&e\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&e\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&e\u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u0439\u0442\u0438 \u0432 \u0413\u0440\u0430\u0432\u0438\u0438. -Guides.Excavation.Section.5=&3\u0417\u0430\u043c\u0435\u0442\u043a\u0438 \u043e \u043d\u0430\u0432\u044b\u043a\u0435 \u0420\u0430\u0441\u043a\u043e\u043f\u043a\u0438:\n&e\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&e\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=&3\u041e \u043d\u0430\u0432\u044b\u043a\u0435 \u0420\u044b\u0431\u043e\u043b\u043e\u0432\u0441\u0442\u0432\u043e:\n&e\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&e\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&3\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u043f\u044b\u0442\u0430:\n&e\u0412\u0441\u0435 \u043f\u0440\u043e\u0441\u0442\u043e - \u043b\u043e\u0432\u0438\u0442\u0435 \u0440\u044b\u0431\u0443. -Guides.Fishing.Section.1=&3\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&e\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&e\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&e\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&e\u0447\u0442\u043e\u0431\u044b \u0435\u0433\u043e \u043d\u0430\u0439\u0442\u0438.\n\n&e\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&e\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=&3\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&e\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&e\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&e\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=&3\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&e\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&e\u043f\u0440\u0438 \u043f\u043e\u0435\u0434\u0430\u043d\u0438\u0438 \u0440\u044b\u0431\u044b. -Guides.Fishing.Section.4=&3\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&e\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&e\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&e\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&e\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=&3\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&e\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&e\u043f\u0440\u0438 \u043f\u043e\u0435\u0434\u0430\u043d\u0438\u0438 \u0440\u044b\u0431\u044b. -Guides.Fishing.Section.6=&3\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&e\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&e\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=&3\u041e \u043d\u0430\u0432\u044b\u043a\u0435 \u0422\u0440\u0430\u0432\u043d\u0438\u0447\u0435\u0441\u0442\u0432\u043e:\n&e\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&3\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u043f\u044b\u0442\u0430:\n&e\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=&3\u0421\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0435 \u0440\u0430\u0441\u0442\u0435\u043d\u0438\u044f:\n&e\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&e\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&e\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=&3\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&e\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&e\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&e\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&e\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&e\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&e\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=&3\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&e\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&e\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&e\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=&3\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&e\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&e\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&e\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=&3\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&e\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&e\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&e\u041c\u043e\u0440\u043a\u043e\u0432\u0438 \u0438 \u041a\u0430\u0440\u0442\u043e\u0448\u043a\u0438. -Guides.Herbalism.Section.6=&3\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&e\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&e\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=&3\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&e\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=&3\u041e \u043d\u0430\u0432\u044b\u043a\u0435 \u0428\u0430\u0445\u0442\u0435\u0440\u0441\u0442\u0432\u043e:\n&e\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&e\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&3\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u043f\u044b\u0442\u0430:\n&e\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&e\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=&3\u0421\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0435 \u0411\u043b\u043e\u043a\u0438:\n&e\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&e\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&e\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=&3\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&e\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&e\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&e\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=&3\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u0421\u0443\u043f\u0435\u0440 \u0414\u0440\u043e\u0431\u0438\u043b\u043a\u0430?\n&e\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&e\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&e\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=&3\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&e\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&e\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&e\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=&3\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&e\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&e\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&e\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&e\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&e\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&e\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&e\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=&3\u041e \u043d\u0430\u0432\u044b\u043a\u0435 \u0420\u0435\u043c\u043e\u043d\u0442:\n&e\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&e\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432. \n\n&3\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u043f\u044b\u0442\u0430:\n&e\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&e\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&e\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=&3\u041a\u0430\u043a \u0440\u0435\u043c\u043e\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0435\u0449\u0438?\n&e\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&e\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=&3\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&e\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&e\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=&3\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&e\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&e\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&e\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=&3\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&e\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&e\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&e\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&e\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=&3\u041e \u043f\u0435\u0440\u0435\u0440\u0430\u0431\u043e\u0442\u043a\u0435:\n&e\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&e\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432.\n\n&3\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u043f\u044b\u0442\u0430:\n&e\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&e\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=&3\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&e\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&e\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&e\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&e\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=&3\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&e\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&e\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&e\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&e\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&e\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&e\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=&3\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&e\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&e\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&e(\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&e33,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&e\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&e\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&e\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=&3\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&e\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&e\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&e\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&e\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&e\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&e\u0431\u044b\u043b\u043e \u043d\u0430 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0435. -##Swords -Guides.Swords.Section.0=&3\u041e \u043d\u0430\u0432\u044b\u043a\u0435 \u041c\u0435\u0447\u0438:\n&e\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&3\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u043f\u044b\u0442\u0430:\n&e\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&e\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=&3\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&e\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&e\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&e\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&e\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=&3\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&e\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&e\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=&3\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&e\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&e\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&e\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&e\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=&3\u041e \u043d\u0430\u0432\u044b\u043a\u0435 \u0423\u043a\u0440\u043e\u0449\u0435\u043d\u0438\u0435:\n&e\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&e\u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0437\u0432\u0435\u0440\u0435\u0439.\n\n&3\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u043f\u044b\u0442\u0430:\n&e\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&e\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=&3\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&e\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&e\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&e\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=&3\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&e\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&e\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&e\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=&3\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0443\u043c\u0435\u043d\u0438\u0435 \u0423\u043a\u0443\u0441?\n&e\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&e\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=&3\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&e\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&e\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=&3\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&e\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&e\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&e\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=&3\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&e\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&e\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=&3\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&e\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&e\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=&3\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&e\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&e\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=&3\u041e \u043d\u0430\u0432\u044b\u043a\u0435 \u0411\u0435\u0437\u043e\u0440\u0443\u0436\u043d\u044b\u0439:\n&e\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&e\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&3\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u043f\u044b\u0442\u0430:\n&e\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&e\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=&3\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&e\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&e\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&e\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=&3\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&e\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&e\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=&3\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&e\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&e\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&e\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=&3\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&e\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&e\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=&3\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&e\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&e\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=&3\u041e \u043d\u0430\u0432\u044b\u043a\u0435 \u041b\u0435\u0441\u043e\u0440\u0443\u0431\u0441\u0442\u0432\u043e:\n&e\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&3\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u043f\u044b\u0442\u0430:\n&e\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=&3\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&e\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&e\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&e\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&e\u0432\u044b\u043f\u0430\u0434\u0443\u0442 \u0437\u0430 \u0440\u0430\u0437. -Guides.Woodcutting.Section.2=&3\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&e\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&e\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&e\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=&3\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&e\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&e\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=&8\u0423\u0420\u041e\u0412\u0415\u041d\u042c: &a{0} -Effects.Child.Overhaul=&3\u041d\u0410\u0421\u041b\u0415\u0414\u0421\u0422\u0412\u0415\u041d\u041d\u042b\u0419 \u0423\u0420.&e {0}&3: {1} -Effects.Child.ParentList=&a{0}&6(&3\u0423\u0420.&e{1}&6) -Effects.Level=&8\u0423\u0420\u041e\u0412\u0415\u041d\u042c: &a{0} &3\u041e\u041f\u042b\u0422&e(&6{1}&e/&6{2}&e) -Effects.Level.Overhaul=&6\u0423\u0420\u041e\u0412\u0415\u041d\u042c: &e{0} &3\u041e\u041f\u042b\u0422\u0410&e(&6{1}&e/&6{2}&e) +# 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=\u042D\u0424\u0424\u0415\u041A\u0422\u042B +Effects.SubSkills.Overhaul=\u041F\u043E\u0434\u043D\u0430\u0432\u044B\u043A\u0438 +Effects.Child.Overhaul=&3\u0414\u043E\u0447\u0435\u0440\u043D\u0438\u0439 \u0443\u0440.&e {0}&3\\: {1} +Effects.Child.ParentList=&a{0}&6(&3\u0423\u0440.&e{1}&6) +Effects.Level.Overhaul=&6\u0423\u0420\u041E\u0412\u0415\u041D\u042C\\: &e{0} &3\u041E\u041F\u042B\u0422\u0410&e(&6{1}&e/&6{2}&e) Effects.Parent=&6{0} - -Effects.Template=&3{0}: &a{1} -Commands.Stats.Self.Overhaul=\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430 -Commands.XPGain.Overhaul=&6\u041e\u043f\u044b\u0442\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043e: &3{0} -MOTD.Version.Overhaul=&6[mcMMO] &3Overhaul Era&6 - &3{0} -Overhaul.mcMMO.Header=&c[]=====[]&a mcMMO - Overhaul Era &c[]=====[] +Effects.Template=&3{0}\\: &a{1} +Commands.Stats.Self.Overhaul=\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043A\u0430 +Commands.XPGain.Overhaul=&6\u041F\u041E\u041B\u0423\u0427\u0415\u041D\u041E \u041E\u041F\u042B\u0422\u0410\\: &3{0} +MOTD.Version.Overhaul=&6[mcMMO] &3\u042D\u0440\u0430 \u043F\u0435\u0440\u0435\u043C\u0435\u043D&6 - &3{0} +Overhaul.mcMMO.Header=&c[]\\=\\=\\=\\=\\=[]&a mcMMO - \u042D\u0440\u0430 \u043F\u0435\u0440\u0435\u043C\u0435\u043D &c[]\\=\\=\\=\\=\\=[] Overhaul.mcMMO.Url.Wrap.Prefix=&c[| Overhaul.mcMMO.Url.Wrap.Suffix=&c|] -Overhaul.mcMMO.MmoInfo.Wiki=&e[&f\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u0441\u043a\u0438\u043b\u043b \u043d\u0430 Wiki!&e] +Overhaul.mcMMO.MmoInfo.Wiki=&e[&f\u041F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0435\u0442\u044C \u044D\u0442\u043E\u0442 \u043D\u0430\u0432\u044B\u043A \u0432 \u0432\u0438\u043A\u0438\\!&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} \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d \u0434\u043e &r&a&l{2}&r&f. -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} \u0443\u0432\u0435\u043B\u0438\u0447\u0435\u043D \u0434\u043E &r&a&l{2}&r&f. +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=\u0421\u0442\u0440\u0435\u043B\u044C\u0431\u0430 +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\u0435\u0440\u0441\u0442\u0432\u043E +Overhaul.Name.Repair=\u041F\u043E\u0447\u0438\u043D\u043A\u0430 +Overhaul.Name.Salvage=\u0420\u0430\u0437\u0431\u043E\u0440\u043A\u0430 +Overhaul.Name.Smelting=\u041F\u0435\u0440\u0435\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 +# /mcMMO Command Style Stuff +Commands.mcc.Header=&c---[]&a\u041A\u043E\u043C\u0430\u043D\u0434\u044B mcMMO&c[]--- +Commands.Other=&c---[]&a\u041E\u0421\u041E\u0411\u042B\u0415 \u041A\u041E\u041C\u0410\u041D\u0414\u042B&c[]--- +Commands.Party.Header=&c-----[]&a\u0413\u0420\u0423\u041F\u041F\u0410&c[]----- +Commands.Party.Features.Header=&c-----[]&a\u0424\u0423\u041D\u041A\u0426\u0418\u0418&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\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.&6{0} -XPBar.Alchemy=\u0410\u043b\u0445\u0438\u043c\u0438\u044f \u0443\u0440..&6{0} -XPBar.Archery=\u041b\u0443\u043a\u0438 \u0443\u0440.&6{0} -XPBar.Axes=\u0422\u043e\u043f\u043e\u0440\u044b \u0443\u0440.&6{0} -XPBar.Excavation=\u0420\u0430\u0441\u043a\u043e\u043f\u043a\u0438 \u0443\u0440.&6{0} -XPBar.Fishing=\u0420\u044b\u0431\u043e\u043b\u043e\u0432\u0441\u0442\u0432\u043e \u0443\u0440.&6{0} -XPBar.Herbalism=\u0422\u0440\u0430\u0432\u043d\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0443\u0440.&6{0} -XPBar.Mining=\u0428\u0430\u0445\u0442\u0435\u0440\u0441\u0442\u0432\u043e \u0443\u0440.&6{0} -XPBar.Repair=\u041f\u043e\u0447\u0438\u043d\u043a\u0430 \u0443\u0440.&6{0} -XPBar.Salvage=\u041f\u0435\u0440\u0435\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0443\u0440.&6{0} -XPBar.Smelting=\u0412\u044b\u043f\u043b\u0430\u0432\u043a\u0430 \u0443\u0440.&6{0} -XPBar.Swords=\u041c\u0435\u0447\u0438 \u0443\u0440.&6{0} -XPBar.Taming=\u0423\u043a\u0440\u043e\u0449\u0435\u043d\u0438\u0435 \u0443\u0440.&6{0} -XPBar.Unarmed=\u0411\u0435\u0437\u043e\u0440\u0443\u0436\u043d\u044b\u0439 \u0443\u0440.&6{0} -XPBar.Woodcutting=\u041b\u0435\u0441\u043e\u0440\u0443\u0431\u0441\u0442\u0432\u043e \u0443\u0440.&6{0} +XPBar.Template.EarlyGameBoost=&6\u041E\u0431\u0443\u0447\u0435\u043D\u0438\u0435 \u043D\u043E\u0432\u043E\u043C\u0443 \u043D\u0430\u0432\u044B\u043A\u0443... +XPBar.Acrobatics=\u0410\u043A\u0440\u043E\u0431\u0430\u0442\u0438\u043A\u0430 \u0443\u0440.&6{0} +XPBar.Alchemy=\u0410\u043B\u0445\u0438\u043C\u0438\u044F \u0443\u0440.&6{0} +XPBar.Archery=\u0421\u0442\u0440\u0435\u043B\u044C\u0431\u0430 \u0443\u0440.&6{0} +XPBar.Axes=\u0422\u043E\u043F\u043E\u0440\u044B \u0443\u0440.&6{0} +XPBar.Excavation=\u0420\u0430\u0441\u043A\u043E\u043F\u043A\u0438 \u0443\u0440.&6{0} +XPBar.Fishing=\u0420\u044B\u0431\u043E\u043B\u043E\u0432\u0441\u0442\u0432\u043E \u0443\u0440.&6{0} +XPBar.Herbalism=\u0422\u0440\u0430\u0432\u043D\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u0443\u0440.&6{0} +XPBar.Mining=\u0428\u0430\u0445\u0442\u0435\u0440\u0441\u0442\u0432\u043E \u0443\u0440.&6{0} +XPBar.Repair=\u041F\u043E\u0447\u0438\u043D\u043A\u0430 \u0443\u0440.&6{0} +XPBar.Salvage=\u0420\u0430\u0437\u0431\u043E\u0440\u043A\u0430 \u0443\u0440.&6{0} +XPBar.Smelting=\u041F\u0435\u0440\u0435\u043F\u043B\u0430\u0432\u043A\u0430 \u0443\u0440.&6{0} +XPBar.Swords=\u041C\u0435\u0447\u0438 \u0443\u0440.&6{0} +XPBar.Taming=\u0423\u043A\u0440\u043E\u0449\u0435\u043D\u0438\u0435 \u0443\u0440.&6{0} +XPBar.Unarmed=\u0411\u0435\u0437\u043E\u0440\u0443\u0436\u043D\u044B\u0439 \u0443\u0440.&6{0} +XPBar.Woodcutting=\u041B\u0435\u0441\u043E\u0440\u0443\u0431\u0441\u0442\u0432\u043E \u0443\u0440.&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 +# END STYLING + +#ACROBATICS +Acrobatics.Ability.Proc=&a**\u0413\u0440\u0430\u0446\u0438\u043E\u0437\u043D\u043E\u0435 \u043F\u0440\u0438\u0437\u0435\u043C\u043B\u0435\u043D\u0438\u0435** +Acrobatics.Combat.Proc=&a**\u0423\u043A\u043B\u043E\u043D\u0435\u043D\u0438\u0435** +Acrobatics.SubSkill.Roll.Stats=&6\u0428\u0430\u043D\u0441 \u041A\u0443\u0432\u044B\u0440\u043A\u0430 &e{0}%&6 \u0428\u0430\u043D\u0441 \u0413\u0440\u0430\u0446\u0438\u043E\u0437\u043D\u043E\u0433\u043E \u043A\u0443\u0432\u044B\u0440\u043A\u0430&e {1}% +Acrobatics.SubSkill.Roll.Stat=\u0428\u0430\u043D\u0441 \u041A\u0443\u0432\u044B\u0440\u043A\u0430 +Acrobatics.SubSkill.Roll.Stat.Extra=\u0428\u0430\u043D\u0441 \u0413\u0440\u0430\u0446\u0438\u043E\u0437\u043D\u043E\u0433\u043E \u043A\u0443\u0432\u044B\u0440\u043A\u0430 +Acrobatics.SubSkill.Roll.Name=\u041A\u0443\u0432\u044B\u0440\u043E\u043A +Acrobatics.SubSkill.Roll.Description=\u041F\u0440\u0438\u0437\u0435\u043C\u043B\u044F\u0439\u0442\u0435\u0441\u044C \u043F\u043E-\u0443\u043C\u043D\u043E\u043C\u0443 \u0434\u043B\u044F \u043D\u0438\u0432\u0435\u043B\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F \u0443\u0440\u043E\u043D\u0430. +Acrobatics.SubSkill.Roll.Chance=\u0428\u0430\u043D\u0441 \u041A\u0443\u0432\u044B\u0440\u043A\u0430\\: &e{0} % +Acrobatics.SubSkill.Roll.GraceChance=\u0428\u0430\u043D\u0441 \u0413\u0440\u0430\u0446\u0438\u043E\u0437\u043D\u043E\u0433\u043E \u043A\u0443\u0432\u044B\u0440\u043A\u0430\\: &e{0} +Acrobatics.SubSkill.Roll.Mechanics=&7\u041A\u0443\u0432\u044B\u0440\u043E\u043A - \u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0439 \u043F\u043E\u0434\u043D\u0430\u0432\u044B\u043A \u0441 \u043F\u0430\u0441\u0441\u0438\u0432\u043D\u044B\u043C \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442\u043E\u043C.!nasd\u041A\u043E\u0433\u0434\u0430 \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 \u0448\u0430\u043D\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 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043C\u043E\u0441\u0442\u0438 \u043E\u0442 \u0443\u0440\u043E\u0432\u043D\u044F \u043D\u0430\u0432\u044B\u043A\u0430. \u041D\u0430 \u0443\u0440\u043E\u0432\u043D\u0435 &e{6}&7 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044C &e{0}%&7 \u0448\u0430\u043D\u0441 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044C \u0443\u0440\u043E\u043D, \u0438 &e{1}%&7 \u0435\u0441\u043B\u0438 \u0430\u043A\u0442\u0438\u0432\u0438\u0440\u043E\u0432\u0430\u043D \u0418\u0437\u044F\u0449\u043D\u044B\u0439 \u043A\u0443\u0432\u044B\u0440\u043E\u043A.!nasd\u0428\u0430\u043D\u0441 \u0443\u0432\u0435\u043B\u0438\u0447\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 &e{2}&7, \u043D\u0430 \u043A\u043E\u0442\u043E\u0440\u043E\u043C \u043D\u0430\u0432\u044B\u043A \u0434\u043E\u0441\u0442\u0438\u0433\u0430\u0435\u0442 \u043C\u0430\u043A\u0441\u0438\u043C\u0443\u043C\u0430. \u041A\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 &e{3}%&7 \u0448\u0430\u043D\u0441\u0430 \u0443\u0441\u043F\u0435\u0445\u0430.!nasd\u0417\u0430\u0436\u0430\u0432 \u043A\u043D\u043E\u043F\u043A\u0443 \u043F\u0440\u0438\u0441\u0435\u0434\u0430, \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 \u043F\u0440\u0438\u0441\u0435\u0434\u0430 \u043F\u0435\u0440\u0435\u0432\u0435\u0434\u0435\u0442 \u0432\u0430\u0448\u0443 \u0441\u043F\u043E\u0441\u043E\u0431\u043D\u043E\u0441\u0442\u044C \u041A\u0443\u0432\u044B\u0440\u043E\u043A \u0432 \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0435 \u0413\u0440\u0430\u0446\u0438\u043E\u0437\u043D\u043E\u0433\u043E \u043A\u0443\u0432\u044B\u0440\u043A\u0430.!nasd\u041A\u0443\u0432\u044B\u0440\u043E\u043A \u043C\u043E\u0436\u0435\u0442 \u043D\u0438\u0432\u0435\u043B\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0434\u043E &c{4}&7 \u0443\u0440\u043E\u043D\u0430, \u0418\u0437\u044F\u0449\u043D\u044B\u0439 \u043A\u0443\u0432\u044B\u0440\u043E\u043A \u0434\u043E &a{5}&7 \u0443\u0440\u043E\u043D\u0430. +Acrobatics.SubSkill.GracefulRoll.Name=\u0413\u0440\u0430\u0446\u0438\u043E\u0437\u043D\u044B\u0439 \u043A\u0443\u0432\u044B\u0440\u043E\u043A +Acrobatics.SubSkill.GracefulRoll.Description=\u0412\u0434\u0432\u043E\u0435 \u044D\u0444\u0444\u0435\u043A\u0442\u0438\u0432\u043D\u0435\u0435 \u043E\u0431\u044B\u0447\u043D\u043E\u0433\u043E \u041A\u0443\u0432\u044B\u0440\u043A\u0430 +Acrobatics.SubSkill.Dodge.Name=\u0423\u043A\u043B\u043E\u043D\u0435\u043D\u0438\u0435 +Acrobatics.SubSkill.Dodge.Description=\u0423\u043C\u0435\u043D\u044C\u0448\u0435\u043D\u0438\u0435 \u0443\u0440\u043E\u043D\u0430 \u043E\u0442 \u0430\u0442\u0430\u043A\u0438 \u043D\u0430 \u043F\u043E\u043B\u043E\u0432\u0438\u043D\u0443 +Acrobatics.SubSkill.Dodge.Stat=\u0428\u0430\u043D\u0441 \u0423\u043A\u043B\u043E\u043D\u0435\u043D\u0438\u044F +Acrobatics.Listener=\u0410\u043A\u0440\u043E\u0431\u0430\u0442\u0438\u043A\u0430\\: +Acrobatics.Roll.Text=[[ITALIC]]**\u041A\u0443\u0432\u044B\u0440\u043E\u043A** +Acrobatics.SkillName=\u0410\u041A\u0420\u041E\u0411\u0410\u0422\u0418\u041A\u0410 +#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\u0435\u0434\u0438\u0435\u043D\u0442\u043E\u0432 +Alchemy.SubSkill.Concoctions.Stat=\u0420\u0430\u043D\u0433 \u041E\u0442\u0432\u0430\u0440\u043E\u0432\\: &a{0}&3/&a{1} +Alchemy.SubSkill.Concoctions.Stat.Extra=\u0418\u043D\u0433\u0440\u0435\u0434\u0438\u0435\u043D\u0442\u044B [&a{0}&3]\\: &a{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\u041E \u0414\u041E {0}+ \u041D\u0410\u0412\u042B\u041A\u0410 (\u041A\u0410\u0422\u0410\u041B\u0418\u0417\u0410\u0422\u041E\u0420) +Alchemy.SkillName=\u0410\u041B\u0425\u0418\u041C\u0418\u042F +#ARCHERY + + +Archery.SubSkill.SkillShot.Name=\u0423\u043C\u0435\u043B\u044B\u0439 \u0432\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\u0430\u043C\u0438 +Archery.SubSkill.SkillShot.Stat=\u0411\u043E\u043D\u0443\u0441\u043D\u044B\u0439 \u0443\u0440\u043E\u043D \u043E\u0442 \u0423\u043C\u0435\u043B\u043E\u0433\u043E \u0432\u044B\u0441\u0442\u0440\u0435\u043B\u0430 +Archery.SubSkill.Daze.Name=\u041E\u0448\u0435\u043B\u043E\u043C\u043B\u0435\u043D\u0438\u0435 +Archery.SubSkill.Daze.Description=\u0414\u0435\u0437\u043E\u0440\u0438\u0435\u043D\u0442\u0438\u0440\u0443\u0435\u0442 \u0438 \u043D\u0430\u043D\u043E\u0441\u0438\u0442 \u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0439 \u0443\u0440\u043E\u043D +Archery.SubSkill.Daze.Stat=\u0428\u0430\u043D\u0441 \u041E\u0448\u0435\u043B\u043E\u043C\u043B\u0435\u043D\u0438\u044F +Archery.SubSkill.ArrowRetrieval.Name=\u0412\u043E\u0437\u0432\u0440\u0430\u0442 \u0441\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\u0442\u0430 \u0441\u0442\u0440\u0435\u043B +Archery.SubSkill.ArcheryLimitBreak.Name=\u0417\u0430\u043F\u0440\u0435\u0434\u0435\u043B\u044C\u043D\u0430\u044F \u0441\u0442\u0440\u0435\u043B\u044C\u0431\u0430 +Archery.SubSkill.ArcheryLimitBreak.Description=\u0412\u044B \u043F\u0440\u0435\u0432\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=\u041C\u0430\u043A\u0441. \u0443\u0440\u043E\u043D \u0417\u0430\u043F\u0440\u0435\u0434\u0435\u043B\u044C\u043D\u043E\u0439 \u0441\u0442\u0440\u0435\u043B\u044C\u0431\u044B +Archery.Listener=\u0421\u0442\u0440\u0435\u043B\u044C\u0431\u0430\\: +Archery.SkillName=\u0421\u0422\u0420\u0415\u041B\u042C\u0411\u0410 +#AXES +Axes.Ability.Bonus.0=\u0412\u043B\u0430\u0434\u0435\u043D\u0438\u0435 \u0442\u043E\u043F\u043E\u0440\u043E\u043C +Axes.Ability.Bonus.1=\u0411\u043E\u043D\u0443\u0441 {0} \u0443\u0440\u043E\u043D\u0430 +Axes.Ability.Bonus.2=\u0411\u0440\u043E\u043D\u0435\u0431\u043E\u0439\u043D\u044B\u0439 \u0443\u0434\u0430\u0440 +Axes.Ability.Bonus.3=\u041D\u0430\u043D\u043E\u0441\u0438\u0442 {0} \u0431\u043E\u043D\u0443\u0441\u043D\u043E\u0433\u043E \u0443\u0440\u043E\u043D\u0430 \u0431\u0440\u043E\u043D\u0435 +Axes.Ability.Bonus.4=\u041C\u043E\u0449\u043D\u044B\u0439 \u0443\u0434\u0430\u0440 +Axes.Ability.Bonus.5=\u041D\u0430\u043D\u043E\u0441\u0438\u0442 {0} \u0431\u043E\u043D\u0443\u0441\u043D\u043E\u0433\u043E \u0443\u0440\u043E\u043D\u0430 \u043D\u0435\u0431\u0440\u043E\u043D\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u043C \u0432\u0440\u0430\u0433\u0430\u043C +Axes.Ability.Lower=&7\u0412\u044B \u043E\u043F\u0443\u0441\u0442\u0438\u043B\u0438 \u0441\u0432\u043E\u0439 \u0442\u043E\u043F\u043E\u0440. +Axes.Ability.Ready=&3\u0412\u044B &6\u043F\u043E\u0434\u0433\u043E\u0442\u043E\u0432\u0438\u043B\u0438&3 \u0441\u0432\u043E\u0439 \u0442\u043E\u043F\u043E\u0440. +Axes.Ability.Ready.Extra=&3\u0412\u044B &6\u043F\u043E\u0434\u0433\u043E\u0442\u043E\u0432\u0438\u043B\u0438&3 \u0441\u0432\u043E\u0439 \u0442\u043E\u043F\u043E\u0440. &7({0} \u043D\u0430 \u043E\u0442\u043A\u0430\u0442\u0435 {1}\u0441) +Axes.Combat.CritStruck=&4\u0412\u0430\u043C \u043D\u0430\u043D\u0435\u0441\u0435\u043D \u041A\u0420\u0418\u0422\u0418\u0427\u0415\u0421\u041A\u0418\u0419 \u0443\u0434\u0430\u0440\\! +Axes.Combat.CriticalHit=\u041A\u0420\u0418\u0422\u0418\u0427\u0415\u0421\u041A\u0418\u0419 \u0423\u0414\u0410\u0420\\! +Axes.Combat.GI.Proc=&a**\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 \u041C\u041E\u0429\u041D\u042B\u041C \u0423\u0414\u0410\u0420\u041E\u041C** +Axes.Combat.SS.Struck=&4\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.SubSkill.SkullSplitter.Name=\u0420\u0430\u0441\u043A\u0430\u043B\u044B\u0432\u0430\u0442\u0435\u043B\u044C \u0447\u0435\u0440\u0435\u043F\u043E\u0432 +Axes.SubSkill.SkullSplitter.Description=\u041D\u0430\u043D\u043E\u0441\u0438\u0442 \u0443\u0434\u0430\u0440 \u043F\u043E \u043E\u0431\u043B\u0430\u0441\u0442\u0438 +Axes.SubSkill.SkullSplitter.Stat=\u041F\u0440\u043E\u0434\u043E\u043B\u0436\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u044C \u0420\u0430\u0441\u043A\u0430\u043B\u044B\u0432\u0430\u0442\u0435\u043B\u044F \u0447\u0435\u0440\u0435\u043F\u043E\u0432 +Axes.SubSkill.CriticalStrikes.Name=\u041A\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043A\u0438\u0439 \u0443\u0434\u0430\u0440 +Axes.SubSkill.CriticalStrikes.Description=\u0414\u0432\u043E\u0439\u043D\u043E\u0439 \u0443\u0440\u043E\u043D +Axes.SubSkill.CriticalStrikes.Stat=\u0428\u0430\u043D\u0441 \u041A\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0433\u043E \u0443\u0434\u0430\u0440\u0430 +Axes.SubSkill.AxeMastery.Name=\u0412\u043B\u0430\u0434\u0435\u043D\u0438\u0435 \u0442\u043E\u043F\u043E\u0440\u043E\u043C +Axes.SubSkill.AxeMastery.Description=\u041D\u0430\u043D\u043E\u0441\u0438\u0442 \u0431\u043E\u043D\u0443\u0441\u043D\u044B\u0439 \u0443\u0440\u043E\u043D +Axes.SubSkill.AxesLimitBreak.Name=\u0417\u0430\u043F\u0440\u0435\u0434\u0435\u043B\u044C\u043D\u044B\u0435 \u0442\u043E\u043F\u043E\u0440\u044B +Axes.SubSkill.AxesLimitBreak.Description=\u0412\u044B \u043F\u0440\u0435\u0432\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=\u041C\u0430\u043A\u0441. \u0443\u0440\u043E\u043D \u0417\u0430\u043F\u0440\u0435\u0434\u0435\u043B\u044C\u043D\u044B\u0445 \u0442\u043E\u043F\u043E\u0440\u043E\u0432 +Axes.SubSkill.ArmorImpact.Name=\u0411\u0440\u043E\u043D\u0435\u0431\u043E\u0439\u043D\u044B\u0439 \u0443\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=\u041C\u043E\u0449\u043D\u044B\u0439 \u0443\u0434\u0430\u0440 +Axes.SubSkill.GreaterImpact.Description=\u041D\u0430\u043D\u043E\u0441\u0438\u0442 \u0431\u043E\u043D\u0443\u0441\u043D\u044B\u0439 \u0443\u0440\u043E\u043D\u0430 \u043D\u0435\u0431\u0440\u043E\u043D\u0438\u0440\u043E\u0432\u0430\u043D\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=**\u0420\u0430\u0441\u043A\u0430\u043B\u044B\u0432\u0430\u0442\u0435\u043B\u044C \u0447\u0435\u0440\u0435\u043F\u043E\u0432 \u043F\u0440\u0435\u043A\u0440\u0430\u0442\u0438\u043B \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435** +Axes.Skills.SS.On=&a**\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** +Axes.Skills.SS.Refresh=&a\u0412\u0430\u0448\u0435 \u0443\u043C\u0435\u043D\u0438\u0435 &e\u0420\u0430\u0441\u043A\u0430\u043B\u044B\u0432\u0430\u0442\u0435\u043B\u044C \u0447\u0435\u0440\u0435\u043F\u043E\u0432 &a\u0432\u043E\u0441\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E\\! +Axes.Skills.SS.Other.Off=\u0420\u0430\u0441\u043A\u0430\u043B\u044B\u0432\u0430\u0442\u0435\u043B\u044C \u0447\u0435\u0440\u0435\u043F\u043E\u0432&a \u043F\u0440\u0435\u043A\u0440\u0430\u0442\u0438\u043B \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0443 &e{0} +Axes.Skills.SS.Other.On=&a{0}&2 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043B &c\u0420\u0430\u0441\u043A\u0430\u043B\u044B\u0432\u0430\u0442\u0435\u043B\u044C \u0447\u0435\u0440\u0435\u043F\u043E\u0432\\! +#EXCAVATION +Excavation.Ability.Lower=&7\u0412\u044B \u043E\u043F\u0443\u0441\u0442\u0438\u043B\u0438 \u0441\u0432\u043E\u044E \u043B\u043E\u043F\u0430\u0442\u0443. +Excavation.Ability.Ready=&3\u0412\u044B &6\u043F\u043E\u0434\u0433\u043E\u0442\u043E\u0432\u0438\u043B\u0438&e \u0441\u0432\u043E\u044E \u043B\u043E\u043F\u0430\u0442\u0443. +Excavation.SubSkill.GigaDrillBreaker.Name=\u0413\u0438\u0433\u0430-\u0431\u0443\u0440 +Excavation.SubSkill.GigaDrillBreaker.Description=3x \u0434\u043E\u0431\u044B\u0447\u0430, 3x \u043E\u043F\u044B\u0442, +\u0441\u043A\u043E\u0440\u043E\u0441\u0442\u044C +Excavation.SubSkill.GigaDrillBreaker.Stat=\u041F\u0440\u043E\u0434\u043E\u043B\u0436\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u044C \u0413\u0438\u0433\u0430-\u0431\u0443\u0440\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\u0435 \u0442\u0430\u0439\u043D\u044B \u0437\u0435\u043C\u043B\u0438\\! \u041F\u043E\u0432\u044B\u0448\u0435\u043D\u0438\u0435 \u0443\u0440\u043E\u0432\u043D\u044F \u0443\u0432\u0435\u043B\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0448\u0430\u043D\u0441\u044B \u043F\u043E\u043B\u0443\u0447\u0435\u043D\u0438\u044F \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\\! +Excavation.SubSkill.Archaeology.Stat=\u0428\u0430\u043D\u0441 \u043F\u043E\u043B\u0443\u0447\u0435\u043D\u0438\u044F \u043E\u043F\u044B\u0442\u0430 \u0410\u0440\u0445\u0435\u043E\u043B\u043E\u0433\u0438\u0438 +Excavation.SubSkill.Archaeology.Stat.Extra=\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u043E\u043F\u044B\u0442\u0430 \u0410\u0440\u0445\u0435\u043E\u043B\u043E\u0433\u0438\u0438 +Excavation.Listener=\u0420\u0430\u0441\u043A\u043E\u043F\u043A\u0438\\: +Excavation.SkillName=\u0420\u0410\u0421\u041A\u041E\u041F\u041A\u0418 +Excavation.Skills.GigaDrillBreaker.Off=**\u0413\u0438\u0433\u0430-\u0431\u0443\u0440 \u043F\u0440\u0435\u043A\u0440\u0430\u0442\u0438\u043B \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435** +Excavation.Skills.GigaDrillBreaker.On=&a**\u0413\u0418\u0413\u0410-\u0411\u0423\u0420 \u0410\u041A\u0422\u0418\u0412\u0418\u0420\u041E\u0412\u0410\u041D** +Excavation.Skills.GigaDrillBreaker.Refresh=&a\u0412\u0430\u0448\u0435 \u0443\u043C\u0435\u043D\u0438\u0435 &e\u0413\u0438\u0433\u0430-\u0431\u0443\u0440 &a\u0432\u043E\u0441\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E\\! +Excavation.Skills.GigaDrillBreaker.Other.Off=\u0413\u0438\u0433\u0430-\u0431\u0443\u0440&a \u043F\u0440\u0435\u043A\u0440\u0430\u0442\u0438\u043B \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0443 &e{0} +Excavation.Skills.GigaDrillBreaker.Other.On=&a{0}&2 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043B &c\u0413\u0438\u0433\u0430-\u0431\u0443\u0440\\! +#FISHING +Fishing.ScarcityTip=&e&o\u0412 \u044D\u0442\u043E\u0439 \u0437\u043E\u043D\u0435 \u043D\u0435 \u043F\u0440\u0430\u043A\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u043D\u0435 \u043E\u0441\u0442\u0430\u043B\u043E\u0441\u044C \u0440\u044B\u0431\u044B - \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, \u0445\u043E\u0442\u044F \u0431\u044B \u043D\u0430 {0} \u0431\u043B\u043E\u043A\u043E\u0432 \u0434\u0430\u043B\u044C\u0448\u0435 \u043E\u0442\u0441\u044E\u0434\u0430. +Fishing.Scared=&7&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=&c&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 \u0432\u044B\u0437\u044B\u0432\u0435\u0442 \u0443\u0441\u0442\u0430\u043B\u043E\u0441\u0442\u044C \u0438 \u0438\u0437\u043D\u043E\u0441 \u0443\u0434\u043E\u0447\u043A\u0438\\! +Fishing.LowResourcesTip=&7\u0412\u044B \u043F\u043E\u043D\u0438\u043C\u0430\u0435\u0442\u0435, \u0447\u0442\u043E \u0432 \u044D\u0442\u043E\u043C \u0440\u0430\u0439\u043E\u043D\u0435 \u043E\u0441\u0442\u0430\u043B\u043E\u0441\u044C \u043C\u0430\u043B\u043E \u0440\u044B\u0431\u044B. \u041F\u043E\u043F\u0440\u043E\u0431\u0443\u0439\u0442\u0435 \u0440\u044B\u0431\u0430\u0447\u0438\u0442\u044C \u043D\u0430 {0} \u0431\u043B\u043E\u043A\u043E\u0432 \u0434\u0430\u043B\u044C\u0448\u0435 \u043E\u0442\u0441\u044E\u0434\u0430. +Fishing.Ability.Info=\u041E\u0445\u043E\u0442\u043D\u0438\u043A \u0437\u0430 \u0447\u0443\u0434\u0435\u0441\u0430\u043C\u0438\\: &7 **\u0421\u043E\u0432\u0435\u0440\u0448\u0435\u043D\u0441\u0442\u0432\u0443\u0435\u0442\u0441\u044F \u0441 \u0440\u0430\u043D\u0433\u043E\u043C \u041E\u0445\u043E\u0442\u043D\u0438\u043A\u0430 \u0437\u0430 \u0441\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 {0}+ \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 {0}+ \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 {0}+ \u041D\u0410\u0412\u042B\u041A\u0410 (\u041C\u0410\u0421\u0422\u0415\u0420-\u0420\u042B\u0411\u041E\u041B\u041E\u0412) +Fishing.SubSkill.TreasureHunter.Name=\u041E\u0445\u043E\u0442\u043D\u0438\u043A \u0437\u0430 \u0441\u043E\u043A\u0440\u043E\u0432\u0438\u0449\u0430\u043C\u0438 +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 \u0441\u043E\u043A\u0440\u043E\u0432\u0438\u0449\u0430\u043C\u0438\\: &a{0}&3/&a{1} +Fishing.SubSkill.TreasureHunter.Stat.Extra=\u0428\u0430\u043D\u0441 \u0434\u043E\u0431\u044B\u0447\u0438\\: &7\u041E\u0431\u044B\u0447\u043D\u043E\u0435\\: &e{0} &a\u041D\u0435\u043E\u0431\u044B\u0447\u043D\u043E\u0435\\: &e{1}!nasd&9\u0420\u0435\u0434\u043A\u043E\u0435\\: &e{2} &d\u042D\u043F\u0438\u0447\u0435\u0441\u043A\u043E\u0435\\: &e{3} &6\u041B\u0435\u0433\u0435\u043D\u0434\u0430\u0440\u043D\u043E\u0435\\: &e{4} &b\u041C\u0438\u0444\u0438\u0447\u0435\u0441\u043A\u043E\u0435\\: &e{5} +Fishing.SubSkill.MagicHunter.Name=\u041E\u0445\u043E\u0442\u043D\u0438\u043A \u0437\u0430 \u0447\u0443\u0434\u0435\u0441\u0430\u043C\u0438 +Fishing.SubSkill.MagicHunter.Description=\u041D\u0430\u0445\u043E\u0434\u043A\u0430 \u0437\u0430\u0447\u0430\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0445 \u043F\u0440\u0435\u0434\u043C\u0435\u0442\u043E\u0432 +Fishing.SubSkill.MagicHunter.Stat=\u0428\u0430\u043D\u0441 \u041E\u0445\u043E\u0442\u043D\u0438\u043A\u0430 \u0437\u0430 \u0447\u0443\u0434\u0435\u0441\u0430\u043C\u0438 +Fishing.SubSkill.Shake.Name=\u0412\u0441\u0442\u0440\u044F\u0441\u043A\u0430 +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 \u0438 \u0438\u0433\u0440\u043E\u043A\u043E\u0432 \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u0443\u0434\u043E\u0447\u043A\u0438 +Fishing.SubSkill.Shake.Stat=\u0428\u0430\u043D\u0441 \u0412\u0441\u0442\u0440\u044F\u0441\u043A\u0438 +Fishing.SubSkill.FishermansDiet.Name=\u0420\u044B\u0431\u0430\u0446\u043A\u0430\u044F \u0434\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 \u0434\u0438\u0435\u0442\u0430\\:&a \u0420\u0430\u043D\u0433 {0} +Fishing.SubSkill.MasterAngler.Name=\u041C\u0430\u0441\u0442\u0435\u0440-\u0440\u044B\u0431\u043E\u043B\u043E\u0432 +Fishing.SubSkill.MasterAngler.Description=\u0420\u044B\u0431\u0430 \u043B\u043E\u0432\u0438\u0442\u0441\u044F \u0447\u0430\u0449\u0435, \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u043B\u0443\u0447\u0448\u0435 \u043F\u0440\u0438 \u0440\u044B\u0431\u0430\u043B\u043A\u0435 \u0441 \u043B\u043E\u0434\u043A\u0438. +Fishing.SubSkill.MasterAngler.Stat=\u0423\u043C\u0435\u043D\u044C\u0448\u0435\u043D\u0438\u0435 \u043C\u0438\u043D\u0438\u043C\u0430\u043B\u044C\u043D\u043E\u0433\u043E \u043E\u0436\u0438\u0434\u0430\u043D\u0438\u044F \u043A\u043B\u0451\u0432\u0430\\: &a-{0} \u0441\u0435\u043A\u0443\u043D\u0434 +Fishing.SubSkill.MasterAngler.Stat.Extra=\u0423\u043C\u0435\u043D\u044C\u0448\u0435\u043D\u0438\u0435 \u043C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u043E\u0433\u043E \u043E\u0436\u0438\u0434\u0430\u043D\u0438\u044F \u043A\u043B\u0451\u0432\u0430\\: &a-{0} \u0441\u0435\u043A\u0443\u043D\u0434 +Fishing.SubSkill.IceFishing.Name=\u041F\u043E\u0434\u043B\u0435\u0434\u043D\u0430\u044F \u0440\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 \u0440\u044B\u0431\u0430\u043B\u043A\u0430 +Fishing.Chance.Raining=&9 \u0411\u043E\u043D\u0443\u0441 \u0434\u043E\u0436\u0434\u044F +Fishing.Listener=\u0420\u044B\u0431\u043E\u043B\u043E\u0432\u0441\u0442\u0432\u043E\\: +Fishing.Ability.TH.MagicFound=&7\u0422\u044B \u0447\u0443\u0432\u0441\u0442\u0432\u0443\u0435\u0448\u044C \u043D\u0435\u0447\u0442\u043E \u0447\u0443\u0434\u043E\u0442\u0432\u043E\u0440\u043D\u043E\u0435 \u043E\u0442 \u044D\u0442\u043E\u0433\u043E \u0443\u043B\u043E\u0432\u0430... +Fishing.Ability.TH.Boom=&7\u0412\u0420\u0415\u041C\u042F \u0412\u0417\u0420\u042B\u0412\u0410\u0422\u042C\\!\\!\\! +Fishing.Ability.TH.Poison=&7\u041F\u0430\u0445\u043D\u0435\u0442 \u0447\u0435\u043C-\u0442\u043E \u0441\u043E\u043C\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u043C... +Fishing.SkillName=\u0420\u042B\u0411\u041E\u041B\u041E\u0412\u0421\u0422\u0412\u041E +#HERBALISM +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.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=&a**\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.Lower=&7\u0412\u044B \u043E\u043F\u0443\u0441\u0442\u0438\u043B\u0438 \u0441\u0432\u043E\u044E \u043C\u043E\u0442\u044B\u0433\u0443. +Herbalism.Ability.Ready=&3\u0412\u044B &6\u043F\u043E\u0434\u0433\u043E\u0442\u043E\u0432\u0438\u043B\u0438&3 \u0441\u0432\u043E\u044E \u043C\u043E\u0442\u044B\u0433\u0443. +Herbalism.Ability.ShroomThumb.Fail=**\u0413\u0420\u0418\u0411\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.SubSkill.GreenTerra.Name=\u041E\u0437\u0435\u043B\u0435\u043D\u0435\u043D\u0438\u0435 +Herbalism.SubSkill.GreenTerra.Description=\u0420\u0430\u0441\u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0435\u043D\u0438\u0435 \u0437\u0435\u043B\u0435\u043D\u0438, 3x \u0434\u043E\u0431\u044B\u0447\u0430, \u0443\u043B\u0443\u0447\u0448\u0430\u0435\u0442 \u0416\u0438\u0432\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0435 \u043F\u0440\u0438\u043A\u043E\u0441\u043D\u043E\u0432\u0435\u043D\u0438\u0435 +Herbalism.SubSkill.GreenTerra.Stat=\u0414\u043B\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u044C \u041E\u0437\u0435\u043B\u0435\u043D\u0435\u043D\u0438\u044F +Herbalism.SubSkill.GreenThumb.Name=\u0416\u0438\u0432\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0435 \u043F\u0440\u0438\u043A\u043E\u0441\u043D\u043E\u0432\u0435\u043D\u0438\u0435 +Herbalism.SubSkill.GreenThumb.Description=\u0410\u0432\u0442\u043E\u043F\u043E\u0441\u0430\u0434\u043A\u0430 \u0440\u0430\u0441\u0442\u0435\u043D\u0438\u0439 \u043F\u0440\u0438 \u0441\u0431\u043E\u0440\u0435 \u0443\u0440\u043E\u0436\u0430\u044F \u043C\u043E\u0442\u044B\u0433\u043E\u0439 +Herbalism.SubSkill.GreenThumb.Stat=\u0428\u0430\u043D\u0441 \u0416\u0438\u0432\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0433\u043E \u043F\u0440\u0438\u043A\u043E\u0441\u043D\u043E\u0432\u0435\u043D\u0438\u044F +Herbalism.SubSkill.GreenThumb.Stat.Extra=\u0421\u0442\u0430\u0434\u0438\u044F \u0416\u0438\u0432\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0433\u043E \u043F\u0440\u0438\u043A\u043E\u0441\u043D\u043E\u0432\u0435\u043D\u0438\u044F\\: &a \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 \u043F\u0440\u0438\u043A\u043E\u0441\u043D\u043E\u0432\u0435\u043D\u0438\u0435 (\u0431\u043B\u043E\u043A\u0438) +Herbalism.SubSkill.GreenThumb.Description.2=\u041F\u043E\u043A\u0440\u044B\u0432\u0430\u0435\u0442 \u043A\u0438\u0440\u043F\u0438\u0447\u0438 \u043C\u0445\u043E\u043C \u0438\u043B\u0438 \u0440\u0430\u0441\u0442\u0438\u0442 \u0442\u0440\u0430\u0432\u0443 +Herbalism.SubSkill.FarmersDiet.Name=\u0424\u0435\u0440\u043C\u0435\u0440\u0441\u043A\u0430\u044F \u0434\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 \u0434\u0438\u0435\u0442\u0430\\: &a\u0420\u0430\u043D\u0433 {0} +Herbalism.SubSkill.DoubleDrops.Name=\u0414\u0432\u043E\u0439\u043D\u0430\u044F \u0434\u043E\u0431\u044B\u0447\u0430 +Herbalism.SubSkill.DoubleDrops.Description=\u0423\u0434\u0432\u0430\u0438\u0432\u0430\u0435\u0442 \u043E\u0431\u044B\u0447\u043D\u0443\u044E \u0434\u043E\u0431\u044B\u0447\u0443 +Herbalism.SubSkill.DoubleDrops.Stat=\u0428\u0430\u043D\u0441 \u0414\u0432\u043E\u0439\u043D\u043E\u0439 \u0434\u043E\u0431\u044B\u0447\u0438 +Herbalism.SubSkill.HylianLuck.Name=\u0425\u0430\u0439\u043B\u0438\u0439\u0441\u043A\u0430\u044F \u0443\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=\u0428\u0430\u043D\u0441 \u0425\u0430\u0439\u043B\u0438\u0439\u0441\u043A\u043E\u0439 \u0443\u0434\u0430\u0447\u0438 +Herbalism.SubSkill.ShroomThumb.Name=\u0413\u0440\u0438\u0431\u043D\u043E\u0435 \u043F\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 \u0434\u0451\u0440\u043D +Herbalism.SubSkill.ShroomThumb.Stat=\u0428\u0430\u043D\u0441 \u0413\u0440\u0438\u0431\u043D\u043E\u0433\u043E \u043F\u0440\u0438\u043A\u043E\u0441\u043D\u043E\u0432\u0435\u043D\u0438\u044F +Herbalism.HylianLuck=&a\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=**\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\u0438\u0435** +Herbalism.Skills.GTe.On=&a**\u041E\u0417\u0415\u041B\u0415\u041D\u0415\u041D\u0418\u0415 \u0410\u041A\u0422\u0418\u0412\u0418\u0420\u041E\u0412\u0410\u041D\u041E** +Herbalism.Skills.GTe.Refresh=&a\u0412\u0430\u0448\u0435 \u0443\u043C\u0435\u043D\u0438\u0435 &e\u041E\u0437\u0435\u043B\u0435\u043D\u0435\u043D\u0438\u0435 &a\u0432\u043E\u0441\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E\\! +Herbalism.Skills.GTe.Other.Off=\u041E\u0437\u0435\u043B\u0435\u043D\u0435\u043D\u0438\u0435&a \u043F\u0440\u0435\u043A\u0440\u0430\u0442\u0438\u043B\u043E \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0443 &e{0} +Herbalism.Skills.GTe.Other.On=&a{0}&2 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043B &c\u041E\u0437\u0435\u043B\u0435\u043D\u0435\u043D\u0438\u0435\\! +#MINING +Mining.Ability.Locked.0=\u0417\u0410\u0411\u041B\u041E\u041A\u0418\u0420\u041E\u0412\u0410\u041D\u041E \u0414\u041E {0}+ \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 {0}+ \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 {0}+ \u041D\u0410\u0412\u042B\u041A\u0410 (\u042D\u041A\u0421\u041F\u0415\u0420\u0422 \u0412\u0417\u0420\u042B\u0412\u041E\u0412) +Mining.Ability.Lower=&7\u0412\u044B \u043E\u043F\u0443\u0441\u0442\u0438\u043B\u0438 \u0441\u0432\u043E\u044E \u043A\u0438\u0440\u043A\u0443. +Mining.Ability.Ready=&3\u0412\u044B &6\u043F\u043E\u0434\u0433\u043E\u0442\u043E\u0432\u0438\u043B\u0438&3 \u0441\u0432\u043E\u044E \u043A\u0438\u0440\u043A\u0443. +Mining.SubSkill.SuperBreaker.Name=\u0421\u0443\u043F\u0435\u0440\u043A\u0440\u0443\u0448\u0438\u0442\u0435\u043B\u044C +Mining.SubSkill.SuperBreaker.Description=\u0421\u043A\u043E\u0440\u043E\u0441\u0442\u044C+, \u0448\u0430\u043D\u0441 \u0442\u0440\u043E\u0439\u043D\u043E\u0439 \u0434\u043E\u0431\u044B\u0447\u0438 +Mining.SubSkill.SuperBreaker.Stat=\u0414\u043B\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u044C \u0421\u0443\u043F\u0435\u0440\u043A\u0440\u0443\u0448\u0438\u0442\u0435\u043B\u044F +Mining.SubSkill.DoubleDrops.Name=\u0414\u0432\u043E\u0439\u043D\u0430\u044F \u0434\u043E\u0431\u044B\u0447\u0430 +Mining.SubSkill.DoubleDrops.Description=\u0423\u0434\u0432\u0430\u0438\u0432\u0430\u0435\u0442 \u043E\u0431\u044B\u0447\u043D\u0443\u044E \u0434\u043E\u0431\u044B\u0447\u0443 +Mining.SubSkill.DoubleDrops.Stat=\u0428\u0430\u043D\u0441 \u0414\u0432\u043E\u0439\u043D\u043E\u0439 \u0434\u043E\u0431\u044B\u0447\u0438 +Mining.SubSkill.BlastMining.Name=\u041F\u043E\u0434\u0440\u044B\u0432\u043D\u0430\u044F \u0434\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 \u0434\u0438\u043D\u0430\u043C\u0438\u0442\u0430 +Mining.SubSkill.BlastMining.Stat=\u041F\u043E\u0434\u0440\u044B\u0432\u043D\u0430\u044F \u0434\u043E\u0431\u044B\u0447\u0430\\:&a \u0420\u0430\u043D\u0433 {0}/{1} &7({2}) +Mining.SubSkill.BlastMining.Stat.Extra=\u0423\u0432\u0435\u043B\u0438\u0447\u0435\u043D\u0438\u0435 \u0440\u0430\u0434\u0438\u0443\u0441\u0430 \u0432\u0437\u0440\u044B\u0432\u0430\\: &a+{0} +Mining.SubSkill.BiggerBombs.Name=\u0411\u043E\u043B\u044C\u0448\u0438\u0435 \u0431\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 \u0434\u0438\u043D\u0430\u043C\u0438\u0442\u0430 +Mining.SubSkill.DemolitionsExpertise.Name=\u042D\u043A\u0441\u043F\u0435\u0440\u0442\u0438\u0437\u0430 \u043F\u043E\u0434\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 \u0434\u0438\u043D\u0430\u043C\u0438\u0442\u0430 +Mining.SubSkill.DemolitionsExpertise.Stat=\u0423\u043C\u0435\u043D\u044C\u0448\u0435\u043D\u0438\u0435 \u0443\u0440\u043E\u043D\u0430 \u042D\u043A\u0441\u043F\u0435\u0440\u0442\u0438\u0437\u044B \u043F\u043E\u0434\u0440\u044B\u0432\u043E\u0432 + +Mining.Listener=\u0428\u0430\u0445\u0442\u0435\u0440\u0441\u0442\u0432\u043E\\: +Mining.SkillName=\u0428\u0410\u0425\u0422\u0415\u0420\u0421\u0422\u0412\u041E +Mining.Skills.SuperBreaker.Off=**\u0421\u0443\u043F\u0435\u0440\u043A\u0440\u0443\u0448\u0438\u0442\u0435\u043B\u044C \u043F\u0440\u0435\u043A\u0440\u0430\u0442\u0438\u043B \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435** +Mining.Skills.SuperBreaker.On=&a**\u0421\u0423\u041F\u0415\u0420\u041A\u0420\u0423\u0428\u0418\u0422\u0415\u041B\u042C \u0410\u041A\u0422\u0418\u0412\u0418\u0420\u041E\u0412\u0410\u041D** +Mining.Skills.SuperBreaker.Other.Off=\u0421\u0443\u043F\u0435\u0440\u043A\u0440\u0443\u0448\u0438\u0442\u0435\u043B\u044C&a \u043F\u0440\u0435\u043A\u0440\u0430\u0442\u0438\u043B \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0443 &e{0} +Mining.Skills.SuperBreaker.Other.On=&a{0}&2 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043B &c\u0421\u0443\u043F\u0435\u0440\u043A\u0440\u0443\u0448\u0438\u0442\u0435\u043B\u044C\\! +Mining.Skills.SuperBreaker.Refresh=&a\u0412\u0430\u0448\u0435 \u0443\u043C\u0435\u043D\u0438\u0435 &e\u0421\u0443\u043F\u0435\u0440\u043A\u0440\u0443\u0448\u0438\u0442\u0435\u043B\u044C &a\u0432\u043E\u0441\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E\\! +#Blast Mining +Mining.Blast.Boom=&7**\u0411\u0423\u041C** +Mining.Blast.Cooldown= +Mining.Blast.Effect=+{0} \u0440\u0443\u0434\u044B, {1}x \u0434\u043E\u0431\u044B\u0447\u0430 +Mining.Blast.Other.On=&a{0}&2 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043B &c\u041F\u043E\u0434\u0440\u044B\u0432\u043D\u0443\u044E \u0434\u043E\u0431\u044B\u0447\u0443\\! +Mining.Blast.Refresh=&a\u0412\u0430\u0448\u0435 \u0443\u043C\u0435\u043D\u0438\u0435 &e\u041F\u043E\u0434\u0440\u044B\u0432\u043D\u0430\u044F \u0434\u043E\u0431\u044B\u0447\u0430 &a\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 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u043E\u0432 \u0438 \u0431\u0440\u043E\u043D\u0438 +Repair.SubSkill.GoldRepair.Name=\u0417\u043E\u043B\u043E\u0442\u043E\u0439 \u0440\u0435\u043C\u043E\u043D\u0442 ({0}+ \u041D\u0410\u0412\u042B\u041A) +Repair.SubSkill.GoldRepair.Description=\u0420\u0435\u043C\u043E\u043D\u0442 \u0437\u043E\u043B\u043E\u0442\u044B\u0445 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u043E\u0432 \u0438 \u0431\u0440\u043E\u043D\u0438 +Repair.SubSkill.IronRepair.Name=\u0416\u0435\u043B\u0435\u0437\u043D\u044B\u0439 \u0440\u0435\u043C\u043E\u043D\u0442 ({0}+ \u041D\u0410\u0412\u042B\u041A) +Repair.SubSkill.IronRepair.Description=\u0420\u0435\u043C\u043E\u043D\u0442 \u0436\u0435\u043B\u0435\u0437\u043D\u044B\u0445 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u043E\u0432 \u0438 \u0431\u0440\u043E\u043D\u0438 +Repair.SubSkill.StoneRepair.Name=\u041A\u0430\u043C\u0435\u043D\u043D\u044B\u0439 \u0440\u0435\u043C\u043E\u043D\u0442 ({0}+ \u041D\u0410\u0412\u042B\u041A) +Repair.SubSkill.StoneRepair.Description=\u0420\u0435\u043C\u043E\u043D\u0442 \u043A\u0430\u043C\u0435\u043D\u043D\u044B\u0445 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u043E\u0432 +Repair.SubSkill.RepairMastery.Name=\u041C\u0430\u0441\u0442\u0435\u0440\u0441\u0442\u0432\u043E \u0440\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\u0441\u0442\u0432\u043E \u0440\u0435\u043C\u043E\u043D\u0442\u0430\\: &a\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\u0440\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=\u0428\u0430\u043D\u0441 \u0421\u0443\u043F\u0435\u0440\u0440\u0435\u043C\u043E\u043D\u0442\u0430 +Repair.SubSkill.DiamondRepair.Name=\u0410\u043B\u043C\u0430\u0437\u043D\u044B\u0439 \u0440\u0435\u043C\u043E\u043D\u0442 ({0}+ \u041D\u0410\u0412\u042B\u041A) +Repair.SubSkill.DiamondRepair.Description=\u0420\u0435\u043C\u043E\u043D\u0442 \u0430\u043B\u043C\u0430\u0437\u043D\u044B\u0445 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u043E\u0432 \u0438 \u0431\u0440\u043E\u043D\u0438 +Repair.SubSkill.ArcaneForging.Name=\u0412\u043E\u043B\u0448\u0435\u0431\u043D\u0430\u044F \u043A\u043E\u0432\u043A\u0430 +Repair.SubSkill.ArcaneForging.Description=\u0420\u0435\u043C\u043E\u043D\u0442 \u0432\u043E\u043B\u0448\u0435\u0431\u043D\u044B\u0445 \u043F\u0440\u0435\u0434\u043C\u0435\u0442\u043E\u0432 +Repair.SubSkill.ArcaneForging.Stat=\u0412\u043E\u043B\u0448\u0435\u0431\u043D\u0430\u044F \u043A\u043E\u0432\u043A\u0430\\: &e\u0420\u0430\u043D\u0433 {0}/{1} +Repair.SubSkill.ArcaneForging.Stat.Extra=&3\u0428\u0430\u043D\u0441\u044B \u0412\u043E\u043B\u0448\u0435\u0431\u043D\u043E\u0439 \u043A\u043E\u0432\u043A\u0438\\:&7 \u0443\u0441\u043F\u0435\u0445 &a{0}&7%, \u043F\u0440\u043E\u0432\u0430\u043B &c{1}&7% +Repair.Error=&4\u0412 mcMMO \u043F\u0440\u043E\u0438\u0437\u043E\u0448\u043B\u0430 \u043E\u0448\u0438\u0431\u043A\u0430 \u043F\u0440\u0438 \u043F\u043E\u043F\u044B\u0442\u043A\u0435 \u043F\u043E\u0447\u0438\u043D\u0438\u0442\u044C \u044D\u0442\u043E\u0442 \u043F\u0440\u0435\u0434\u043C\u0435\u0442\\! +Repair.Listener.Anvil=&4\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=&4\u0412\u044B \u043D\u0435\u0434\u043E\u0441\u0442\u0430\u0442\u043E\u0447\u043D\u043E \u0443\u043C\u0435\u043B\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=&4\u0412\u044B \u043D\u0435\u0434\u043E\u0441\u0442\u0430\u0442\u043E\u0447\u043D\u043E \u0443\u043C\u0435\u043B\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=&4\u0412\u044B \u043D\u0435\u0434\u043E\u0441\u0442\u0430\u0442\u043E\u0447\u043D\u043E \u0443\u043C\u0435\u043B\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=&4\u0412\u044B \u043D\u0435\u0434\u043E\u0441\u0442\u0430\u0442\u043E\u0447\u043D\u043E \u0443\u043C\u0435\u043B\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=&c\u0423 \u0432\u0430\u0441 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u0443\u0440\u043E\u0432\u0435\u043D\u044C &e{0}&c, \u0447\u0442\u043E\u0431\u044B \u043E\u0442\u0440\u0435\u043C\u043E\u043D\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C &e{1} +Repair.Skills.FeltEasy=&7\u042D\u0442\u043E \u0431\u044B\u043B\u043E \u043B\u0435\u0433\u043A\u043E. +Repair.Skills.FullDurability=&7\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.StackedItems=&4\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.Pretty.Name=\u0420\u0435\u043C\u043E\u043D\u0442 +#Arcane Forging +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\u0434\u043E\u0441\u0442\u0430\u0442\u043E\u0447\u043D\u043E \u0443\u043C\u0435\u043B\u044B, \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=&a\u0412\u044B \u0441\u043E\u0445\u0440\u0430\u043D\u0438\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. +#SALVAGE +Salvage.Pretty.Name=\u0420\u0430\u0437\u0431\u043E\u0440\u043A\u0430 +Salvage.SubSkill.UnderstandingTheArt.Name=\u041F\u043E\u043D\u0438\u043C\u0430\u043D\u0438\u0435 \u0438\u0441\u043A\u0443\u0441\u0441\u0442\u0432\u0430 +Salvage.SubSkill.UnderstandingTheArt.Description=\u0412\u044B \u043D\u0435 \u043F\u0440\u043E\u0441\u0442\u043E \u043A\u043E\u043F\u0430\u0435\u0442\u0435\u0441\u044C \u0432 \u0441\u043E\u0441\u0435\u0434\u0441\u043A\u043E\u043C \u043C\u0443\u0441\u043E\u0440\u0435 - \u0432\u044B \u0437\u0430\u0431\u043E\u0442\u0438\u0442\u0435\u0441\u044C \u043E\u0431 \u043E\u043A\u0440\u0443\u0436\u0430\u044E\u0449\u0435\u0439 \u0441\u0440\u0435\u0434\u0435.!nasd\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 \u0445\u043B\u0430\u043C\u0430 +Salvage.SubSkill.ScrapCollector.Description=\u0420\u0430\u0437\u0431\u0438\u0440\u0430\u0439\u0442\u0435 \u043F\u0440\u0435\u0434\u043C\u0435\u0442\u044B \u043D\u0430 \u043C\u0430\u0442\u0435\u0440\u0438\u0430\u043B\u044B, \u043A\u0430\u0447\u0435\u0441\u0442\u0432\u043E \u0440\u0430\u0437\u0431\u043E\u0440\u043A\u0438 \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 \u0445\u043B\u0430\u043C\u0430\\: &a\u0420\u0430\u0437\u0431\u0438\u0440\u0430\u0439\u0442\u0435 \u0434\u043E &e{0}&a \u043F\u0440\u0435\u0434\u043C\u0435\u0442\u043E\u0432. \u0423\u0434\u0430\u0447\u0430 \u043F\u0440\u0438\u0433\u043E\u0434\u0438\u0442\u0441\u044F. +Salvage.SubSkill.ArcaneSalvage.Name=\u041C\u0430\u0433\u0438\u0447\u0435\u0441\u043A\u0430\u044F \u043F\u0435\u0440\u0435\u0440\u0430\u0431\u043E\u0442\u043A\u0430 +Salvage.SubSkill.ArcaneSalvage.Description=\u0418\u0437\u0432\u043B\u0435\u0447\u0435\u043D\u0438\u0435 \u0437\u0430\u0447\u0430\u0440\u043E\u0432\u0430\u043D\u0438\u0439 \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 \u043F\u0435\u0440\u0435\u0440\u0430\u0431\u043E\u0442\u043A\u0430\\: &e\u0420\u0430\u043D\u0433 {0}/{1} +Salvage.Ability.Bonus.0=\u041A\u043E\u043B\u043B\u0435\u043A\u0446\u0438\u043E\u043D\u0435\u0440 \u0445\u043B\u0430\u043C\u0430 +Salvage.Ability.Bonus.1=\u0420\u0430\u0437\u0431\u0438\u0440\u0430\u0439\u0442\u0435 \u0434\u043E &e{0}&a \u043F\u0440\u0435\u0434\u043C\u0435\u0442\u043E\u0432. \u0423\u0434\u0430\u0447\u0430 \u043F\u0440\u0438\u0433\u043E\u0434\u0438\u0442\u0441\u044F. +Salvage.Arcane.ExtractFull=&7\u0428\u0430\u043D\u0441 \u041C\u041F \u0432\u0441\u0435\u0445 \u0437\u0430\u0447\u0430\u0440\u043E\u0432\u0430\u043D\u0438\u0439 +Salvage.Arcane.ExtractPartial=&7\u0428\u0430\u043D\u0441 \u041C\u041F \u0447\u0430\u0441\u0442\u0438 \u0437\u0430\u0447\u0430\u0440\u043E\u0432\u0430\u043D\u0438\u0439 +Salvage.Skills.Success=&a\u041F\u0440\u0435\u0434\u043C\u0435\u0442 \u0440\u0430\u0437\u043E\u0431\u0440\u0430\u043D\\! +Salvage.Skills.Adept.Damaged=&4\u0412\u044B \u043D\u0435\u0434\u043E\u0441\u0442\u0430\u0442\u043E\u0447\u043D\u043E \u0443\u043C\u0435\u043B\u044B, \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=\u0423 \u0432\u0430\u0441 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u0443\u0440\u043E\u0432\u0435\u043D\u044C &e{0}&c, \u0447\u0442\u043E\u0431\u044B \u0440\u0430\u0437\u043E\u0431\u0440\u0430\u0442\u044C &e{1} +Salvage.Skills.TooDamaged=&4\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 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044C \u0435\u0433\u043E. +Salvage.Skills.ArcaneFailed=&c\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=&c\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=&a\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=&4\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\u0451 \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=\u0420\u0430\u0437\u0431\u043E\u0440\u043A\u0430\\: +Salvage.SkillName=\u0420\u0410\u0417\u0411\u041E\u0420\u041A\u0410 +Salvage.Skills.Lottery.Normal=&6\u0423 \u0432\u0430\u0441 \u0432\u044B\u0448\u043B\u043E \u0438\u0437\u0432\u043B\u0435\u0447\u044C &3{0}&6 \u043C\u0430\u0442\u0435\u0440\u0438\u0430\u043B\u043E\u0432 \u0438\u0437 &e{1}&6. +Salvage.Skills.Lottery.Perfect=&a&l\u041F\u0440\u0435\u0432\u043E\u0441\u0445\u043E\u0434\u043D\u043E\\!&r&6 \u0412\u044B \u0440\u0430\u0437\u043E\u0431\u0440\u0430\u043B\u0438 &3{1}&6 \u0431\u0435\u0437 \u043E\u0441\u043E\u0431\u044B \u0443\u0441\u0438\u043B\u0438\u0439 \u0438 \u043F\u043E\u043B\u0443\u0447\u0438\u043B\u0438 &3{0}&6 \u043C\u0430\u0442\u0435\u0440\u0438\u0430\u043B\u043E\u0432. +Salvage.Skills.Lottery.Untrained=&7\u0412\u044B \u043D\u0435\u0434\u043E\u0441\u0442\u0430\u0442\u043E\u0447\u043D\u044B \u0443\u043C\u0435\u043B\u044B \u0432 \u0420\u0430\u0437\u0431\u043E\u0440\u043A\u0435. \u0423 \u0432\u0430\u0441 \u0432\u044B\u0448\u043B\u043E \u0438\u0437\u0432\u043B\u0435\u0447\u044C \u043B\u0438\u0448\u044C &c{0}&7 \u043C\u0430\u0442\u0435\u0440\u0438\u0430\u043B\u043E\u0432 \u0438\u0437 &a{1}&7. +#Anvil (Shared between SALVAGE and REPAIR) +Anvil.Unbreakable=\u042D\u0442\u043E\u0442 \u043F\u0440\u0435\u0434\u043C\u0435\u0442 \u043D\u0435\u0440\u0430\u0437\u0440\u0443\u0448\u0438\u043C\\! +#SWORDS +Swords.Ability.Lower=&7\u0412\u044B \u043E\u043F\u0443\u0441\u0442\u0438\u043B\u0438 \u0441\u0432\u043E\u0439 \u043C\u0435\u0447. +Swords.Ability.Ready=&4\u0412\u044B &6\u043F\u043E\u0434\u0433\u043E\u0442\u043E\u0432\u0438\u043B\u0438&e \u0441\u0432\u043E\u0439 \u043C\u0435\u0447. +Swords.Combat.Rupture.Note=&7\u041F\u0420\u0418\u041C\u0415\u0427\u0410\u041D\u0418\u0415\\: &e1 \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.Bleeding.Started=&4 \u0412\u044B \u0438\u0441\u0442\u0435\u043A\u0430\u0435\u0442\u0435 \u043A\u0440\u043E\u0432\u044C\u044E\\! +Swords.Combat.Bleeding.Stopped=&7\u041A\u0440\u043E\u0432\u043E\u0442\u0435\u0447\u0435\u043D\u0438\u0435 &a\u043F\u0440\u0435\u043A\u0440\u0430\u0442\u0438\u043B\u043E\u0441\u044C&7\\! +Swords.Combat.Bleeding=&a**\u0412\u0420\u0410\u0413 \u0418\u0421\u0422\u0415\u041A\u0410\u0415\u0422 \u041A\u0420\u041E\u0412\u042C\u042E** +Swords.Combat.Counter.Hit=&4\u041F\u043E\u0440\u0430\u0436\u0435\u043D \u043A\u043E\u043D\u0442\u0440\u0430\u0442\u0430\u043A\u043E\u0439\\! +Swords.Combat.Countered=&a**\u041A\u041E\u041D\u0422\u0420\u0410\u0422\u0410\u041A\u0410** +Swords.Combat.SS.Struck=&4\u041F\u043E\u0440\u0430\u0436\u0435\u043D \u0420\u0423\u0411\u042F\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\u0430\u0435\u0442 \u0447\u0430\u0441\u0442\u044C \u0443\u0440\u043E\u043D\u0430 \u043F\u0440\u0438 \u043D\u0430\u043F\u0430\u0434\u0435\u043D\u0438\u0438\\! +Swords.SubSkill.CounterAttack.Stat=\u0428\u0430\u043D\u0441 \u041A\u043E\u043D\u0442\u0440\u0430\u0442\u0430\u043A\u0438 +Swords.SubSkill.SerratedStrikes.Name=\u0420\u0443\u0431\u044F\u0449\u0438\u0439 \u0443\u0434\u0430\u0440 +Swords.SubSkill.SerratedStrikes.Description=\u041D\u0430\u043D\u043E\u0441\u0438\u0442 \u0447\u0430\u0441\u0442\u044C \u0443\u0440\u043E\u043D\u0430 \u043F\u043E \u043F\u043B\u043E\u0449\u0430\u0434\u0438 \u0441 \u0448\u0430\u043D\u0441\u043E\u043C \u043F\u0440\u0438\u043C\u0435\u043D\u0438\u0442\u044C \u0420\u0430\u0437\u0440\u044B\u0432\\! +Swords.SubSkill.SerratedStrikes.Stat=\u0414\u043B\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u044C \u0420\u0443\u0431\u044F\u0449\u0435\u0433\u043E \u0443\u0434\u0430\u0440\u0430 +Swords.SubSkill.Rupture.Name=\u0420\u0430\u0437\u0440\u044B\u0432 +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 +Swords.SubSkill.Stab.Name=\u041F\u0440\u043E\u043D\u0437\u0430\u043D\u0438\u0435 +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 \u041F\u0440\u043E\u043D\u0437\u0430\u043D\u0438\u044F +Swords.SubSkill.SwordsLimitBreak.Name=\u0417\u0430\u043F\u0440\u0435\u0434\u0435\u043B\u044C\u043D\u044B\u0435 \u043C\u0435\u0447\u0438 +Swords.SubSkill.SwordsLimitBreak.Description=\u0412\u044B \u043F\u0440\u0435\u0432\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=\u041C\u0430\u043A\u0441. \u0443\u0440\u043E\u043D \u0417\u0430\u043F\u0440\u0435\u0434\u0435\u043B\u044C\u043D\u044B\u0445 \u043C\u0435\u0447\u0435\u0439 +Swords.SubSkill.Rupture.Stat=\u0428\u0430\u043D\u0441 \u0420\u0430\u0437\u0440\u044B\u0432\u0430 +Swords.SubSkill.Rupture.Stat.Extra=\u0420\u0430\u0437\u0440\u044B\u0432\\: &a{0} \u0442\u0438\u043A\u043E\u0432 [{1} \u0443\u0440\u043E\u043D \u0438\u0433\u0440\u043E\u043A\u0430\u043C] [{2} \u0443\u0440\u043E\u043D \u043C\u043E\u0431\u0430\u043C] +Swords.Effect.4=\u0420\u0443\u0431\u044F\u0449\u0438\u0439 \u0443\u0434\u0430\u0440 \u0420\u0430\u0437\u0440\u044B\u0432+ +Swords.Effect.5={0} \u0442\u0438\u043A\u043E\u0432 \u0420\u0430\u0437\u0440\u044B\u0432\u0430 +Swords.Listener=\u041C\u0435\u0447\u0438\\: +Swords.SkillName=\u041C\u0435\u0447\u0438 +Swords.Skills.SS.Off=**\u0420\u0443\u0431\u044F\u0449\u0438\u0439 \u0443\u0434\u0430\u0440 \u043F\u0440\u0435\u043A\u0440\u0430\u0442\u0438\u043B \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435** +Swords.Skills.SS.On=&a**\u0420\u0423\u0411\u042F\u0429\u0418\u0419 \u0423\u0414\u0410\u0420 \u0410\u041A\u0422\u0418\u0412\u0418\u0420\u041E\u0412\u0410\u041D** +Swords.Skills.SS.Refresh=&a\u0412\u0430\u0448\u0435 \u0443\u043C\u0435\u043D\u0438\u0435 &e\u0420\u0443\u0431\u044F\u0449\u0438\u0439 \u0443\u0434\u0430\u0440 &a\u0432\u043E\u0441\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E\\! +Swords.Skills.SS.Other.Off=\u0420\u0443\u0431\u044F\u0449\u0438\u0439 \u0443\u0434\u0430\u0440&a \u043F\u0440\u0435\u043A\u0440\u0430\u0442\u0438\u043B \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0443 &e{0} +Swords.Skills.SS.Other.On=&a{0}&2 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043B &c\u0420\u0443\u0431\u044F\u0449\u0438\u0439 \u0443\u0434\u0430\u0440\\! +#TAMING +Taming.Ability.Bonus.0=\u0417\u043D\u0430\u043D\u0438\u0435 \u0441\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 \u043C\u0435\u0445 +Taming.Ability.Bonus.3=1/{0} \u0443\u0440\u043E\u043D\u0430, \u043E\u0433\u043D\u0435\u0441\u0442\u043E\u0439\u043A\u043E\u0441\u0442\u044C +Taming.Ability.Bonus.4=\u0423\u0434\u0430\u0440\u043E\u043F\u0440\u043E\u0447\u043D\u043E\u0441\u0442\u044C +Taming.Ability.Bonus.5=\u0412\u0437\u0440\u044B\u0432\u044B \u043D\u0430\u043D\u043E\u0441\u044F\u0442 1/{0} \u043E\u0431\u044B\u0447\u043D\u043E\u0433\u043E \u0443\u0440\u043E\u043D\u0430 +Taming.Ability.Bonus.6=\u041E\u0441\u0442\u0440\u044B\u0435 \u043A\u043E\u0433\u0442\u0438 +Taming.Ability.Bonus.7=+{0} \u0443\u0440\u043E\u043D\u0430 +Taming.Ability.Bonus.8=\u0411\u044B\u0441\u0442\u0440\u043E\u0435 \u043F\u0438\u0442\u0430\u043D\u0438\u0435 +Taming.Ability.Bonus.9={0} \u0448\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\u0430\u044F \u0433\u043E\u043D\u0447\u0430\u044F +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 {0}+ \u041D\u0410\u0412\u042B\u041A\u0410 (\u0417\u041D\u0410\u041D\u0418\u0415 \u0421\u0420\u0415\u0414\u042B) +Taming.Ability.Locked.1=\u0417\u0410\u0411\u041B\u041E\u041A\u0418\u0420\u041E\u0412\u0410\u041D\u041E \u0414\u041E {0}+ \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 {0}+ \u041D\u0410\u0412\u042B\u041A\u0410 (\u0423\u0414\u0410\u0420\u041E\u041F\u0420\u041E\u0427\u041D\u041E\u0421\u0422\u042C) +Taming.Ability.Locked.3=\u0417\u0410\u0411\u041B\u041E\u041A\u0418\u0420\u041E\u0412\u0410\u041D\u041E \u0414\u041E {0}+ \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 {0}+ \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 {0}+ \u041D\u0410\u0412\u042B\u041A\u0410 (\u0421\u0412\u042F\u0422\u0410\u042F \u0413\u041E\u041D\u0427\u0410\u042F) +Taming.Combat.Chance.Gore=\u0428\u0430\u043D\u0441 \u0423\u043A\u0443\u0441\u0430 +Taming.SubSkill.BeastLore.Name=\u041F\u043E\u0437\u043D\u0430\u043D\u0438\u0435 \u0437\u0432\u0435\u0440\u0435\u0439 +Taming.SubSkill.BeastLore.Description=\u0423\u0434\u0430\u0440\u044C\u0442\u0435 \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=\u0423\u0434\u0430\u0440\u043E\u043F\u0440\u043E\u0447\u043D\u043E\u0441\u0442\u044C +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 \u043F\u0440\u0438\u0440\u043E\u0434\u044B +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=&7\u0417\u041F\\: \u041F\u0440\u0438\u0441\u044F\u0434\u044C\u0442\u0435 \u0438 \u043D\u0430\u0436\u043C\u0438\u0442\u0435 \u041B\u041A\u041C \u0441!nasd {0} {1} (\u041E\u0446\u0435\u043B\u043E\u0442), {2} {3} (\u0412\u043E\u043B\u043A), {4} {5} (\u041B\u043E\u0448\u0430\u0434\u044C) +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\u0430\u044F \u0433\u043E\u043D\u0447\u0430\u044F +Taming.SubSkill.HolyHound.Description=\u041B\u0435\u0447\u0435\u043D\u0438\u0435 \u0432\u043E\u043B\u0448\u0435\u0431\u0441\u0442\u0432\u043E\u043C \u0438 \u044F\u0434\u0430\u043C\u0438 +Taming.SubSkill.Gore.Name=\u0423\u043A\u0443\u0441 +Taming.SubSkill.Gore.Description=\u041A\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043A\u0438\u0439 \u0443\u0434\u0430\u0440, \u043F\u0440\u0438\u043C\u0435\u043D\u044F\u044E\u0449\u0438\u0439 \u0420\u0430\u0437\u0440\u044B\u0432 +Taming.SubSkill.SharpenedClaws.Name=\u041E\u0441\u0442\u0440\u044B\u0435 \u043A\u043E\u0433\u0442\u0438 +Taming.SubSkill.SharpenedClaws.Description=\u0411\u043E\u043D\u0443\u0441\u043D\u044B\u0439 \u0443\u0440\u043E\u043D +Taming.SubSkill.EnvironmentallyAware.Name=\u0417\u043D\u0430\u043D\u0438\u0435 \u0441\u0440\u0435\u0434\u044B +Taming.SubSkill.EnvironmentallyAware.Description=\u0411\u043E\u044F\u0437\u043D\u044C \u043A\u0430\u043A\u0442\u0443\u0441\u043E\u0432 \u0438 \u043B\u0430\u0432\u044B, \u0438\u043C\u043C\u0443\u043D\u0438\u0442\u0435\u0442 \u043A \u0443\u0440\u043E\u043D\u0443 \u043E\u0442 \u043F\u0430\u0434\u0435\u043D\u0438\u044F +Taming.SubSkill.ThickFur.Name=\u0413\u0443\u0441\u0442\u043E\u0439 \u043C\u0435\u0445 +Taming.SubSkill.ThickFur.Description=\u0421\u043D\u0438\u0436\u0435\u043D\u0438\u0435 \u0443\u0440\u043E\u043D\u0430, \u043E\u0433\u043D\u0435\u0441\u0442\u043E\u0439\u043A\u043E\u0441\u0442\u044C +Taming.SubSkill.Pummel.Name=\u0418\u0437\u0431\u0438\u0435\u043D\u0438\u0435 +Taming.SubSkill.Pummel.Description=\u0412\u0430\u0448\u0438 \u0432\u043E\u043B\u043A\u0438 \u0438\u043C\u0435\u044E\u0442 \u0448\u0430\u043D\u0441 \u043E\u0442\u0431\u0440\u043E\u0441\u0438\u0442\u044C \u0432\u0440\u0430\u0433\u043E\u0432 +Taming.SubSkill.Pummel.TargetMessage=\u0412\u044B \u0431\u044B\u043B\u0438 \u043E\u0442\u0431\u0440\u043E\u0448\u0435\u043D\u044B \u0432\u043E\u043B\u043A\u043E\u043C\\! +Taming.Listener.Wolf=&8\u0412\u0430\u0448 \u0432\u043E\u043B\u043A \u0445\u043E\u0447\u0435\u0442 \u0432\u0435\u0440\u043D\u0443\u0442\u0441\u044F \u043A \u0432\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.Summon.COTW.Success.WithoutLifespan=&a(\u0417\u043E\u0432 \u043F\u0440\u0438\u0440\u043E\u0434\u044B) &7\u0412\u044B \u043F\u0440\u0438\u0437\u0432\u0430\u043B\u0438 &6{0}&7 +Taming.Summon.COTW.Success.WithLifespan=&a(\u0417\u043E\u0432 \u043F\u0440\u0438\u0440\u043E\u0434\u044B) &7\u0412\u044B \u043F\u0440\u0438\u0437\u0432\u0430\u043B\u0438 &6{0}&7 \u043D\u0430 &6{1}&7 \u0441\u0435\u043A\u0443\u043D\u0434. +Taming.Summon.COTW.Limit=&a(\u0417\u043E\u0432 \u043F\u0440\u0438\u0440\u043E\u0434\u044B) &7\u041E\u0434\u043D\u043E\u0432\u0440\u0435\u043C\u0435\u043D\u043D\u043E \u043C\u043E\u0436\u043D\u043E \u0432\u044B\u0437\u0432\u0430\u0442\u044C \u0442\u043E\u043B\u044C\u043A\u043E{0} &7\u043F\u0438\u0442\u043E\u043C\u0446\u0435\u0432 &7{1}. +Taming.Summon.COTW.TimeExpired=&a(\u0417\u043E\u0432 \u043F\u0440\u0438\u0440\u043E\u0434\u044B) &7\u0412\u0440\u0435\u043C\u044F \u0432\u044B\u0448\u043B\u043E, \u0432\u0430\u0448 &6{0}&7 \u0443\u0445\u043E\u0434\u0438\u0442. +Taming.Summon.COTW.Removed=&a(\u0417\u043E\u0432 \u043F\u0440\u0438\u0440\u043E\u0434\u044B) &7\u041F\u0440\u0438\u0437\u0432\u0430\u043D\u043D\u044B\u0439 &6{0}&7 \u0438\u0441\u0447\u0435\u0437 \u0438\u0437 \u044D\u0442\u043E\u0433\u043E \u043C\u0438\u0440\u0430. +Taming.Summon.COTW.BreedingDisallowed=&a(\u0417\u043E\u0432 \u043F\u0440\u0438\u0440\u043E\u0434\u044B) &c\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=&a(\u0417\u043E\u0432 \u043F\u0440\u0438\u0440\u043E\u0434\u044B) &7\u0412\u0430\u043C \u043D\u0443\u0436\u043D\u043E \u043D\u0430 &e{0}&7 \u0431\u043E\u043B\u044C\u0448\u0435 &3{1} +Taming.Summon.Name.Format=&6(\u0417\u043E\u0432 \u041F\u0440\u0435\u0434\u043A\u043E\u0432) &f{0} {1} +#UNARMED +Unarmed.Ability.Bonus.0=\u0421\u0442\u0438\u043B\u044C \u0421\u0442\u0430\u043B\u044C\u043D\u043E\u0433\u043E \u043A\u0443\u043B\u0430\u043A\u0430 +Unarmed.Ability.Bonus.1=+{0} \u0443\u043B\u0443\u0447\u0448\u0435\u043D\u0438\u0435 \u0443\u0440\u043E\u043D\u0430 +Unarmed.Ability.IronGrip.Attacker=\u0423 \u0432\u0430\u0448\u0435\u0433\u043E \u043E\u043F\u043F\u043E\u043D\u0435\u043D\u0442\u0430 \u0416\u0435\u043B\u0435\u0437\u043D\u0430\u044F \u0445\u0432\u0430\u0442\u043A\u0430\\! +Unarmed.Ability.IronGrip.Defender=&a\u0412\u0430\u0448\u0430 \u0416\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=&7\u0412\u044B \u043E\u043F\u0443\u0441\u0442\u0438\u043B\u0438 \u0441\u0432\u043E\u0438 \u043A\u0443\u043B\u0430\u043A\u0438. +Unarmed.Ability.Ready=&3\u0412\u044B &6\u043F\u043E\u0434\u0433\u043E\u0442\u043E\u0432\u0438\u043B\u0438&e \u0441\u0432\u043E\u0438 \u043A\u0443\u043B\u0430\u043A\u0438. +Unarmed.SubSkill.Berserk.Name=\u0411\u0435\u0440\u0441\u0435\u0440\u043A +Unarmed.SubSkill.Berserk.Description=+50% \u043A \u0443\u0440\u043E\u043D\u0443, \u0440\u0430\u0437\u0440\u0443\u0448\u0435\u043D\u0438\u0435 \u043D\u0435\u0442\u0432\u0435\u0440\u0434\u044B\u0445 \u0431\u043B\u043E\u043A\u043E\u0432 +Unarmed.SubSkill.Berserk.Stat=\u0414\u043B\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u044C \u0411\u0435\u0440\u0441\u0435\u0440\u043A\u0430 +Unarmed.SubSkill.Disarm.Name=\u0420\u0430\u0437\u043E\u0440\u0443\u0436\u0435\u043D\u0438\u0435 +Unarmed.SubSkill.Disarm.Description=\u0412\u044B\u0431\u0438\u0432\u0430\u0435\u0442 \u043F\u0440\u0435\u0434\u043C\u0435\u0442 \u0438\u0437 \u0440\u0443\u043A \u043F\u0440\u043E\u0442\u0438\u0432\u043D\u0438\u043A\u0430 +Unarmed.SubSkill.Disarm.Stat=\u0428\u0430\u043D\u0441 \u0420\u0430\u0437\u043E\u0440\u0443\u0436\u0435\u043D\u0438\u044F +Unarmed.SubSkill.UnarmedLimitBreak.Name=\u0417\u0430\u043F\u0440\u0435\u0434\u0435\u043B\u044C\u043D\u0430\u044F \u0431\u0435\u0437\u043E\u0440\u0443\u0436\u043D\u043E\u0441\u0442\u044C +Unarmed.SubSkill.UnarmedLimitBreak.Description=\u0412\u044B \u043F\u0440\u0435\u0432\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=\u041C\u0430\u043A\u0441. \u0443\u0440\u043E\u043D \u0417\u0430\u043F\u0440\u0435\u0434\u0435\u043B\u044C\u043D\u043E\u0439 \u0431\u0435\u0437\u043E\u0440\u0443\u0436\u043D\u043E\u0441\u0442\u0438 +Unarmed.SubSkill.SteelArmStyle.Name=\u0421\u0442\u0438\u043B\u044C \u0421\u0442\u0430\u043B\u044C\u043D\u043E\u0433\u043E \u043A\u0443\u043B\u0430\u043A\u0430 +Unarmed.SubSkill.SteelArmStyle.Description=\u0423\u043A\u0440\u0435\u043F\u043B\u044F\u0435\u0442 \u0432\u0430\u0448 \u0443\u0434\u0430\u0440 \u0441 \u0442\u0435\u0447\u0435\u043D\u0438\u0435\u043C \u0432\u0440\u0435\u043C\u0435\u043D\u0438 +Unarmed.SubSkill.ArrowDeflect.Name=\u041E\u0442\u0440\u0430\u0436\u0435\u043D\u0438\u0435 \u0441\u0442\u0440\u0435\u043B +Unarmed.SubSkill.ArrowDeflect.Description=\u041E\u0442\u0440\u0430\u0436\u0430\u0435\u0442 \u0441\u0442\u0440\u0435\u043B\u044B +Unarmed.SubSkill.ArrowDeflect.Stat=\u0428\u0430\u043D\u0441 \u041E\u0442\u0440\u0430\u0436\u0435\u043D\u0438\u044F \u0441\u0442\u0440\u0435\u043B +Unarmed.SubSkill.IronGrip.Name=\u0416\u0435\u043B\u0435\u0437\u043D\u0430\u044F \u0445\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=\u0428\u0430\u043D\u0441 \u0416\u0435\u043B\u0435\u0437\u043D\u043E\u0439 \u0445\u0432\u0430\u0442\u043A\u0438 +Unarmed.SubSkill.BlockCracker.Name=\u041A\u0440\u0443\u0448\u0438\u0442\u0435\u043B\u044C \u0431\u043B\u043E\u043A\u043E\u0432 +Unarmed.SubSkill.BlockCracker.Description=\u0420\u0430\u0437\u0440\u0443\u0448\u0430\u0439\u0442\u0435 \u0441\u043A\u0430\u043B\u044B \u0441\u0432\u043E\u0438\u043C\u0438 \u043A\u0443\u043B\u0430\u043A\u0430\u043C\u0438 +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=**\u0411\u0435\u0440\u0441\u0435\u0440\u043A \u043F\u0440\u0435\u043A\u0440\u0430\u0442\u0438\u043B \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435** +Unarmed.Skills.Berserk.On=&a**\u0411\u0415\u0420\u0421\u0415\u0420\u041A \u0410\u041A\u0422\u0418\u0412\u0418\u0420\u041E\u0412\u0410\u041D** +Unarmed.Skills.Berserk.Other.Off=\u0411\u0435\u0440\u0441\u0435\u0440\u043A&a \u043F\u0440\u0435\u043A\u0440\u0430\u0442\u0438\u043B \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0443 &e{0} +Unarmed.Skills.Berserk.Other.On=&a{0}&2 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043B &c\u0411\u0435\u0440\u0441\u0435\u0440\u043A\u0430\\! +Unarmed.Skills.Berserk.Refresh=&a\u0412\u0430\u0448\u0435 \u0443\u043C\u0435\u043D\u0438\u0435 &e\u0411\u0435\u0440\u0441\u0435\u0440\u043A &a\u0432\u043E\u0441\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E\\! +#WOODCUTTING +Woodcutting.Ability.0=\u0421\u0434\u0443\u0432\u0430\u0442\u0435\u043B\u044C \u043B\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.Locked.0=\u0417\u0410\u0411\u041B\u041E\u041A\u0418\u0420\u041E\u0412\u0410\u041D\u041E \u0414\u041E {0}+ \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=\u0414\u0440\u043E\u0432\u043E\u0441\u0435\u043A +Woodcutting.SubSkill.TreeFeller.Description=\u0412\u0437\u0440\u044B\u0432\u0430\u0435\u0442 \u0434\u0435\u0440\u0435\u0432\u044C\u044F +Woodcutting.SubSkill.TreeFeller.Stat=\u0414\u043B\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u044C \u0414\u0440\u043E\u0432\u043E\u0441\u0435\u043A\u0430 +Woodcutting.SubSkill.LeafBlower.Name=\u0421\u0434\u0443\u0432\u0430\u0442\u0435\u043B\u044C \u043B\u0438\u0441\u0442\u044C\u0435\u0432 +Woodcutting.SubSkill.LeafBlower.Description=\u0421\u0434\u0443\u0432\u0430\u0439\u0442\u0435 \u043B\u0438\u0441\u0442\u044C\u044F \u043F\u0440\u043E\u0447\u044C +Woodcutting.SubSkill.KnockOnWood.Name=\u0421\u0442\u0443\u043A \u043F\u043E \u0434\u0435\u0440\u0435\u0432\u0443 +Woodcutting.SubSkill.KnockOnWood.Description=\u0411\u043E\u043B\u044C\u0448\u0435 \u0434\u043E\u0431\u044B\u0447\u0438 \u043F\u0440\u0438 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0438 \u0414\u0440\u043E\u0432\u043E\u0441\u0435\u043A\u0430 +Woodcutting.SubSkill.KnockOnWood.Stat=\u0421\u0442\u0443\u043A \u043F\u043E \u0434\u0435\u0440\u0435\u0432\u0443 +Woodcutting.SubSkill.KnockOnWood.Loot.Normal=\u041E\u0431\u044B\u0447\u043D\u0430\u044F \u0434\u043E\u0431\u044B\u0447\u0430 \u0441 \u0434\u0435\u0440\u0435\u0432\u044C\u0435\u0432 +Woodcutting.SubSkill.KnockOnWood.Loot.Rank2=\u041E\u0431\u044B\u0447\u043D\u0430\u044F \u0434\u043E\u0431\u044B\u0447\u0430 \u0438 \u043E\u043F\u044B\u0442 \u0441 \u0434\u0435\u0440\u0435\u0432\u044C\u0435\u0432 +Woodcutting.SubSkill.HarvestLumber.Name=\u0421\u0431\u043E\u0440 \u0434\u0440\u0435\u0432\u0435\u0441\u0438\u043D\u044B +Woodcutting.SubSkill.HarvestLumber.Description=\u0423\u043C\u0435\u043B\u043E \u043F\u043E\u043B\u0443\u0447\u0430\u0439\u0442\u0435 \u0431\u043E\u043B\u044C\u0448\u0435 \u0434\u0440\u0435\u0432\u0435\u0441\u0438\u043D\u044B +Woodcutting.SubSkill.HarvestLumber.Stat=\u0428\u0430\u043D\u0441 \u0414\u0432\u043E\u0439\u043D\u043E\u0439 \u0434\u043E\u0431\u044B\u0447\u0438 +Woodcutting.SubSkill.Splinter.Name=\u0412 \u0449\u0435\u043F\u043A\u0438 +Woodcutting.SubSkill.Splinter.Description=\u0421\u0440\u0443\u0431\u0430\u0439\u0442\u0435 \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=\u041A\u043E\u0440\u043E\u0432\u0430\u044F \u0445\u0438\u0440\u0443\u0440\u0433\u0438\u044F +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 \u043F\u0440\u0438\u0440\u043E\u0434\u044B +Woodcutting.SubSkill.NaturesBounty.Description=\u041F\u043E\u043B\u0443\u0447\u0430\u0439\u0442\u0435 \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=**\u0414\u0440\u043E\u0432\u043E\u0441\u0435\u043A \u043F\u0440\u0435\u043A\u0440\u0430\u0442\u0438\u043B \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435** +Woodcutting.Skills.TreeFeller.On=&a**\u0414\u0420\u041E\u0412\u041E\u0421\u0415\u041A \u0410\u041A\u0422\u0418\u0412\u0418\u0420\u041E\u0412\u0410\u041D** +Woodcutting.Skills.TreeFeller.Refresh=&a\u0412\u0430\u0448\u0435 \u0443\u043C\u0435\u043D\u0438\u0435 &e\u0414\u0440\u043E\u0432\u043E\u0441\u0435\u043A &a\u0432\u043E\u0441\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E\\! +Woodcutting.Skills.TreeFeller.Other.Off=\u0414\u0440\u043E\u0432\u043E\u0441\u0435\u043A&a \u043F\u0440\u0435\u043A\u0440\u0430\u0442\u0438\u043B\u043E \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0443 &e{0} +Woodcutting.Skills.TreeFeller.Other.On=&a{0}&2 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043B &c\u0414\u0440\u043E\u0432\u043E\u0441\u0435\u043A\u0430\\! +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 \u0431\u043E\u043B\u044C\u0448\u043E\u0435\\! +#ABILITIY + +#COMBAT +Combat.ArrowDeflect=&f**\u0421\u0422\u0420\u0415\u041B\u0410 \u041E\u0422\u0421\u041A\u041E\u0427\u0418\u041B\u0410** +Combat.BeastLore=&a**\u041F\u041E\u0417\u041D\u0410\u041D\u0418\u0415 \u0417\u0412\u0415\u0420\u0415\u0419** +Combat.BeastLoreHealth=&3\u0417\u0434\u043E\u0440\u043E\u0432\u044C\u0435 (&a{0}&3/{1}) +Combat.BeastLoreOwner=&3\u0425\u043E\u0437\u044F\u0438\u043D (&c{0}&3) +Combat.BeastLoreHorseSpeed=&3\u0421\u043A\u043E\u0440\u043E\u0441\u0442\u044C \u0434\u0432\u0438\u0436\u0435\u043D\u0438\u044F \u043B\u043E\u0448\u0430\u0434\u0438 (&a{0} \u0431\u043B\u043E\u043A\u043E\u0432/\u0441&3) +Combat.BeastLoreHorseJumpStrength=&3\u0421\u0438\u043B\u0430 \u043F\u0440\u044B\u0436\u043A\u0430 \u043B\u043E\u0448\u0430\u0434\u0438 (&a\u041C\u0430\u043A\u0441. {0} \u0431\u043B\u043E\u043A\u043E\u0432&3) +Combat.Gore=&a**\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 &4\u041E\u0448\u0435\u043B\u043E\u043C\u043B\u0435\u043D\u0430 +Combat.TouchedFuzzy=&4\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. +#COMMANDS +##generic +mcMMO.Description=&3\u041E \u043F\u0440\u043E\u0435\u043A\u0442\u0435 &emcMMO&3\\:,&6mcMMO \u044D\u0442\u043E RPG \u043C\u043E\u0434 &c\u0441 \u043E\u0442\u043A\u0440\u044B\u0442\u044B\u043C \u043A\u043E\u0434\u043E\u043C&6, &6\u0441\u043E\u0437\u0434\u0430\u043D\u043D\u044B\u0439 \u0432 \u0444\u0435\u0432\u0440\u0430\u043B\u0435 2011,&6\u0437\u0430 \u0430\u0432\u0442\u043E\u0440\u0441\u0442\u0432\u043E\u043C &9nossr50&6. \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.,&3\u041F\u043E\u0434\u0441\u043A\u0430\u0437\u043A\u0438\\:,&6 - &a\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 &c/mcmmo help&a \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,&6 - &a\u041D\u0430\u043F\u0435\u0447\u0430\u0442\u0430\u0439\u0442\u0435 &c/\u041D\u0410\u0417\u0412\u0410\u041D\u0418\u0415\u041D\u0410\u0412\u042B\u041A\u0410&a \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,&3\u0420\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A\u0438\\:,&6 - &anossr50 &9(\u0421\u043E\u0437\u0434\u0430\u0442\u0435\u043B\u044C \u0438 \u0420\u0443\u043A\u043E\u0432\u043E\u0434\u0438\u0442\u0435\u043B\u044C),&6 - &aelectronicboy &9(\u0420\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A),&6 - &akashike &9(\u0420\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A),&6 - &at00thpick1 &9(\u041F\u043E\u0434\u0434\u0435\u0440\u0436\u0430\u0442\u0435\u043B\u044C \u041A\u043B\u0430\u0441\u0441\u0438\u043A\u0438) +mcMMO.Description.FormerDevs=&3\u0411\u044B\u0432\u0448\u0438\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A\u0438\\: &aGJ, NuclearW, bm01, TfT_02, Glitchfinder +Commands.addlevels.AwardAll.1=&a\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=&a\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 \u0438\u0437\u043C\u0435\u043D\u0435\u043D \u043D\u0430 {1}. +Commands.addxp.AwardAll=&a\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=&a\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 &c\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 &a\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 \u043F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0435\u043D\u0430 \u0434\u043B\u044F &e{0} +Commands.AdminChat.Off=\u0420\u0435\u0436\u0438\u043C \u0430\u0434\u043C\u0438\u043D-\u0447\u0430\u0442\u0430 &c\u0432\u044B\u043A\u043B\u044E\u0447\u0435\u043D +Commands.AdminChat.On=\u0420\u0435\u0436\u0438\u043C \u0430\u0434\u043C\u0438\u043D-\u0447\u0430\u0442\u0430 &a\u0432\u043A\u043B\u044E\u0447\u0435\u043D +Commands.AdminToggle=&a- \u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435 \u0430\u0434\u043C\u0438\u043D-\u0447\u0430\u0442\u0430 +Commands.Chat.Console=*\u041A\u043E\u043D\u0441\u043E\u043B\u044C* +Commands.Cooldowns.Header=&6--\\= &a\u041E\u0442\u043A\u0430\u0442\u044B \u0443\u043C\u0435\u043D\u0438\u0439 mcMMO&6 \\=-- +Commands.Cooldowns.Row.N=\\ &c{0}&f - &6{1} \u0441\u0435\u043A\u0443\u043D\u0434 \u043E\u0441\u0442\u0430\u043B\u043E\u0441\u044C +Commands.Cooldowns.Row.Y=\\ &b{0}&f - &2\u0413\u043E\u0442\u043E\u0432\u043E\\! +Commands.Database.CooldownMS=\u0412\u044B \u0434\u043E\u043B\u0436\u043D\u044B \u043F\u043E\u0434\u043E\u0436\u0434\u0430\u0442\u044C {0} \u043C\u0438\u043B\u043B\u0438\u0441\u0435\u043A\u0443\u043D\u0434, \u043F\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043C \u0432\u043D\u043E\u0432\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.Cooldown=\u0412\u044B \u0434\u043E\u043B\u0436\u043D\u044B \u043F\u043E\u0434\u043E\u0436\u0434\u0430\u0442\u044C {0} \u0441\u0435\u043A\u0443\u043D\u0434, \u043F\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043C \u0432\u043D\u043E\u0432\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\u0451 \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442\u0441\u044F. \u041F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430, \u043F\u043E\u0434\u043E\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= &c\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 \u043E\u0442\u043A\u043B\u044E\u0447\u0435\u043D +Commands.GodMode.Enabled=\u0420\u0435\u0436\u0438\u043C \u0431\u043E\u0433\u0430 mcMMO \u0432\u043A\u043B\u044E\u0447\u0435\u043D +Commands.AdminChatSpy.Enabled=\u0421\u043B\u0435\u0436\u043A\u0430 \u0437\u0430 \u0447\u0430\u0442\u0430\u043C\u0438 \u0433\u0440\u0443\u043F\u043F mcMMO \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u0430 +Commands.AdminChatSpy.Disabled=\u0421\u043B\u0435\u0436\u043A\u0430 \u0437\u0430 \u0447\u0430\u0442\u0430\u043C\u0438 \u0433\u0440\u0443\u043F\u043F mcMMO \u043E\u0442\u043A\u043B\u044E\u0447\u0435\u043D\u0430 +Commands.AdminChatSpy.Toggle=\u0427\u0430\u0442 \u0433\u0440\u0443\u043F\u043F mcMMO \u043F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0435\u043D \u0434\u043B\u044F &e{0} +Commands.AdminChatSpy.Chat=&6[\u0428\u041F\u0418\u041A\\: &a{0}&6] &f{1} +Commands.GodMode.Forbidden=[mcMMO] \u0420\u0435\u0436\u0438\u043C \u0431\u043E\u0433\u0430 \u043D\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043D \u0432 \u044D\u0442\u043E\u043C \u043C\u0438\u0440\u0435 (\u043F\u0440\u043E\u0432\u0435\u0440\u044C\u0442\u0435 \u043F\u0440\u0430\u0432\u0430) +Commands.GodMode.Toggle=\u0420\u0435\u0436\u0438\u043C \u0431\u043E\u0433\u0430 \u043F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0435\u043D \u0434\u043B\u044F &e{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 &e\u0421\u0435\u0440\u0434\u0446\u0430&f. +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 &e\u041A\u0432\u0430\u0434\u0440\u0430\u0442\u044B&f. +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 &7\u043E\u0442\u043A\u043B\u044E\u0447\u0435\u043D\u043E&f. +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> &a- \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\u0431 \u0438\u0433\u0440\u043E\u043A\u0435 +Commands.Invite.Success=&a\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=<\u043D\u0430\u0432\u044B\u043A> <\u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0430> &a- \u0422\u0430\u0431\u043B\u0438\u0446\u0430 \u043B\u0438\u0434\u0435\u0440\u043E\u0432 +Commands.mcgod=&a- \u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0440\u0435\u0436\u0438\u043C \u0431\u043E\u0433\u0430 +Commands.mchud.Invalid=\u042D\u0442\u043E \u043D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u044B\u0439 \u0442\u0438\u043F HUD'\u0430. +Commands.mcpurge.Success=&a\u0411\u0430\u0437\u0430 \u0434\u0430\u043D\u043D\u044B\u0445 \u0443\u0441\u043F\u0435\u0448\u043D\u043E \u043E\u0447\u0438\u0449\u0435\u043D\u0430\\! +Commands.mcrank.Heading=&6-\\=\u041F\u0415\u0420\u0421\u041E\u041D\u0410\u041B\u042C\u041D\u042B\u0419 \u0420\u0415\u0419\u0422\u0418\u041D\u0413\\=- +Commands.mcrank.Overall=\u041E\u0431\u0449\u0438\u0439&a - &6\u0420\u0430\u043D\u0433 &f\\#&a{0} +Commands.mcrank.Player=&e\u0420\u0435\u0439\u0442\u0438\u043D\u0433 \u0434\u043B\u044F &f{0} +Commands.mcrank.Skill=&e{0}&a - &6\u0420\u0430\u043D\u0433 &f\\#&a{1} +Commands.mcrank.Unranked=&f\u0420\u044F\u0434\u043E\u0432\u043E\u0439 +Commands.mcrefresh.Success=\u041E\u0442\u043A\u0430\u0442\u044B {0} \u0431\u044B\u043B\u0438 \u0432\u043E\u0441\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u044B. +Commands.mcremove.Success=&a{0} \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=&6\u041F\u043E\u0434\u0441\u043A\u0430\u0437\u043A\u0430\\: \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 &c/mcrank&6, \u0447\u0442\u043E\u0431\u044B \u043F\u043E\u0441\u043C\u043E\u0442\u0440\u0435\u0442\u044C \u0441\u0432\u043E\u0439 \u0440\u0435\u0439\u0442\u0438\u043D\u0433\\! +Commands.mmoedit=[\u0438\u0433\u0440\u043E\u043A] <\u043D\u0430\u0432\u044B\u043A> <\u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435> &c - \u041C\u043E\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0446\u0435\u043B\u044C +Commands.mmoedit.AllSkills.1=&a\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=&a\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 \u0438\u0437\u043C\u0435\u043D\u0435\u043D \u043D\u0430 {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} \u043D\u0435 \u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \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=&7\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=&7\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 &a{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\\: &aLINEAR &c\u0438 &aEXPONENTIAL. +Commands.mcconvert.Experience.Same=\u0422\u0438\u043F \u0444\u043E\u0440\u043C\u0443\u043B\u044B {0} \u0443\u0436\u0435 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F +Commands.mcconvert.Experience.Start=&7\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=&7\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=&a- \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 &c\u043E\u0442\u043A\u043B\u044E\u0447\u0435\u043D\u044B +Commands.Notifications.On=\u0423\u0432\u0435\u0434\u043E\u043C\u043B\u0435\u043D\u0438\u044F \u043E\u0431 \u0443\u043C\u0435\u043D\u0438\u044F\u0445 &c\u0432\u043A\u043B\u044E\u0447\u0435\u043D\u044B +Commands.Offline=\u042D\u0442\u0430 \u043A\u043E\u043C\u0430\u043D\u0434\u0430 \u043D\u0435 \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0434\u043B\u044F \u0438\u0433\u0440\u043E\u043A\u043E\u0432 \u043D\u0435 \u0432 \u0441\u0435\u0442\u0438. +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.Party.Status=&8\u0418\u041C\u042F\\: &f{0} {1} &8\u0423\u0420\u041E\u0412\u0415\u041D\u042C\\: &e{2} +Commands.Party.Status.Alliance=&8\u0421\u041E\u042E\u0417\\: &f{0} +Commands.Party.UnlockedFeatures=&8\u0420\u0430\u0437\u0431\u043B\u043E\u043A\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0435 \u0444\u0443\u043D\u043A\u0446\u0438\u0438\\: &7[[ITALIC]]{0} +Commands.Party.ShareMode=&8\u0420\u0415\u0416\u0418\u041C \u0420\u0410\u0421\u041F\u0420\u0415\u0414\u0415\u041B\u0415\u041D\u0418\u042F\\: +Commands.Party.ItemShare=&7\u041F\u0420\u0415\u0414\u041C\u0415\u0422 &3({0}) +Commands.Party.ExpShare=&7\u041E\u041F\u042B\u0422 &3({0}) +Commands.Party.ItemShareCategories=&8\u0420\u0430\u0441\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u043F\u0440\u0435\u0434\u043C\u0435\u0442\u043E\u0432\\: &7[[ITALIC]]{0} +Commands.Party.MembersNear=&8\u0412\u041E\u0417\u041B\u0415 \u0412\u0410\u0421 &3{0}&8/&3{1} +Commands.Party.Accept=&a- \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=\u0420\u0435\u0436\u0438\u043C \u0447\u0430\u0442\u0430 \u0433\u0440\u0443\u043F\u043F\u044B &c\u043E\u0442\u043A\u043B\u044E\u0447\u0435\u043D +Commands.Party.Chat.On=\u0420\u0435\u0436\u0438\u043C \u0447\u0430\u0442\u0430 \u0433\u0440\u0443\u043F\u043F\u044B &c\u0432\u043A\u043B\u044E\u0447\u0435\u043D +Commands.Party.Commands=&c---[]&a\u041A\u041E\u041C\u0410\u041D\u0414\u042B \u0413\u0420\u0423\u041F\u041F\u042B&c[]--- +Commands.Party.Invite.0=&c\u0412\u041D\u0418\u041C\u0410\u041D\u0418\u0415\\: &a\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=&e\u0412\u0432\u0435\u0434\u0438\u0442\u0435 &a/party accept&e, \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=&a- \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=&a\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\u0438\u043D\u0438\u043B\u0438\u0441\u044C \u043A \u0433\u0440\u0443\u043F\u043F\u0435 {0} +Commands.Party.Join=&7\u041F\u0440\u0438\u0441\u043E\u0435\u0434\u0438\u043D\u0438\u043B\u0441\u044F \u043A \u0433\u0440\u0443\u043F\u043F\u0435\\: {0} +Commands.Party.PartyFull=&6{0}&c \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 &e{0}&c \u0432 &a{1}&c, \u043F\u043E\u0442\u043E\u043C\u0443 \u0447\u0442\u043E \u0432 \u043D\u0435\u0439 \u0443\u0436\u0435 &3{2}&c \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\u0438\u043D\u0438\u0442\u044C\u0441\u044F \u043A &a{0}&c, \u043F\u043E\u0442\u043E\u043C\u0443 \u0447\u0442\u043E \u0432 \u043D\u0435\u0439 \u0443\u0436\u0435 &3{1}&c \u0438\u0433\u0440\u043E\u043A\u043E\u0432\\! +Commands.Party.Create=&7\u0421\u043E\u0437\u0434\u0430\u043D\u0430 \u0433\u0440\u0443\u043F\u043F\u0430\\: {0} +Commands.Party.Rename=&7\u041D\u0430\u0437\u0432\u0430\u043D\u0438\u0435 \u0433\u0440\u0443\u043F\u043F\u044B \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u043E \u043D\u0430\\: &f{0} +Commands.Party.SetSharing=&7\u0420\u0430\u0441\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u0433\u0440\u0443\u043F\u043F\u044B {0} \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E \u043D\u0430\\: &3{1} +Commands.Party.ToggleShareCategory=&7\u0420\u0430\u0441\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u043F\u0440\u0435\u0434\u043C\u0435\u0442\u043E\u0432 \u0434\u043B\u044F &6{0} &7\u0431\u044B\u043B\u043E &3{1} +Commands.Party.AlreadyExists=&4\u0413\u0440\u0443\u043F\u043F\u0430 {0} \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442\\! +Commands.Party.Kick=&c\u0412\u044B \u0431\u044B\u043B\u0438 \u0432\u044B\u0433\u043D\u0430\u043D\u044B \u0438\u0437 \u0433\u0440\u0443\u043F\u043F\u044B &a{0}&c\\! +Commands.Party.Leave=&e\u0412\u044B \u043F\u043E\u043A\u0438\u043D\u0443\u043B\u0438 \u044D\u0442\u0443 \u0433\u0440\u0443\u043F\u043F\u0443 +Commands.Party.Members.Header=&c-----[]&a\u0423\u0427\u0410\u0421\u0422\u041D\u0418\u041A\u0418&c[]----- +Commands.Party.None=&c\u0412\u044B \u043D\u0435 \u0441\u043E\u0441\u0442\u043E\u0438\u0442\u0435 \u0432 \u0433\u0440\u0443\u043F\u043F\u0435. +Commands.Party.Quit=&a- \u041F\u043E\u043A\u0438\u043D\u0443\u0442\u044C \u0442\u0435\u043A\u0443\u0449\u0443\u044E \u0433\u0440\u0443\u043F\u043F\u0443 +Commands.Party.Teleport=&a- \u0422\u0435\u043B\u0435\u043F\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C\u0441\u044F \u043A \u0443\u0447\u0430\u0441\u0442\u043D\u0438\u043A\u0443 \u0433\u0440\u0443\u043F\u043F\u044B +Commands.Party.Toggle=&a- \u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0447\u0430\u0442 \u0433\u0440\u0443\u043F\u043F\u044B +Commands.Party1=&a- \u0421\u043E\u0437\u0434\u0430\u0442\u044C \u043D\u043E\u0432\u0443\u044E \u0433\u0440\u0443\u043F\u043F\u0443 +Commands.Party2=&a- \u041F\u0440\u0438\u0441\u043E\u0435\u0434\u0438\u043D\u0438\u0442\u044C\u0441\u044F \u043A \u0433\u0440\u0443\u043F\u043F\u0435 +Commands.Party.Alliance.Header=&c-----[]&a\u0421\u041E\u042E\u0417 \u0413\u0420\u0423\u041F\u041F\u042B&c[]----- +Commands.Party.Alliance.Ally=&f{0} &8\u0412 \u0421\u041E\u042E\u0417\u0415 \u0421\\: &f{1} +Commands.Party.Alliance.Members.Header=&c-----[]&a\u0423\u0427\u0410\u0421\u0422\u041D\u0418\u041A\u0418 \u0421\u041E\u042E\u0417\u0410&c[]----- +Commands.Party.Alliance.Invite.0=\u0412\u041D\u0418\u041C\u0410\u041D\u0418\u0415\\: &a\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=\u0412\u0432\u0435\u0434\u0438\u0442\u0435 &a/party alliance accept&e, \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=&a\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=&c\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=&c\u0412\u0430\u0448\u0430 \u0433\u0440\u0443\u043F\u043F\u0430 \u0443\u0436\u0435 \u0432 \u0441\u043E\u044E\u0437\u0435. \u0420\u0430\u0441\u0444\u043E\u0440\u043C\u0438\u0440\u0443\u0439\u0442\u0435 \u0435\u0433\u043E \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E &3/party alliance disband +Commands.Party.Alliance.Help.0=&c\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=&c \u0434\u043B\u044F \u0437\u0430\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u044F \u0441\u043E\u044E\u0437\u0430 &3/party alliance invite <\u0438\u0433\u0440\u043E\u043A>&c. +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 &a\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 &c\u043E\u0442\u043A\u043B\u044E\u0447\u0435\u043D\u0430 +Commands.ptp.NoRequests=&c\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=&c[mcMMO] \u0423 \u0432\u0430\u0441 \u043D\u0435\u0442 \u043F\u0440\u0430\u0432 \u043D\u0430 \u0442\u0435\u043B\u0435\u043F\u043E\u0440\u0442\u0430\u0446\u0438\u044E \u0432 \u043C\u0438\u0440 {0}. +Commands.ptp.Request1=&e{0} &a\u0437\u0430\u043F\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0442\u0435\u043B\u0435\u043F\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C\u0441\u044F \u043A \u0432\u0430\u043C. +Commands.ptp.Request2=&a\u0414\u043B\u044F \u0442\u0435\u043B\u0435\u043F\u043E\u0440\u0442\u0430\u0446\u0438\u0438 \u0432\u0432\u0435\u0434\u0438\u0442\u0435 &e/ptp accept&a. \u0417\u0430\u043F\u0440\u043E\u0441 \u0431\u0443\u0434\u0435\u0442 \u043E\u0442\u043C\u0435\u043D\u0435\u043D \u0447\u0435\u0440\u0435\u0437 &c{0} &a\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 &a\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 &c\u043E\u0442\u043A\u043B\u044E\u0447\u0435\u043D\u043E +Commands.ptp.RequestExpired=&c\u0413\u0440\u0443\u043F\u043F\u043E\u0432\u043E\u0439 \u0437\u0430\u043F\u0440\u043E\u0441 \u043D\u0430 \u0442\u0435\u043B\u0435\u043F\u043E\u0440\u0442\u0430\u0446\u0438\u044E \u0438\u0441\u0442\u0435\u043A\\! +Commands.PowerLevel.Leaderboard=&e--T\u0430\u0431\u043B\u0438\u0446\u0430 \u043B\u0438\u0434\u0435\u0440\u043E\u0432&9 \u043F\u043E \u0443\u0440\u043E\u0432\u043D\u044E \u0441\u0438\u043B\u044B &emcMMO-- +Commands.PowerLevel.Capped=&4\u0423\u0420\u041E\u0412\u0415\u041D\u042C \u0421\u0418\u041B\u042B\\: &a{0} &4\u041C\u0410\u041A\u0421. \u0423\u0420\u041E\u0412\u0415\u041D\u042C\\: &e{1} +Commands.PowerLevel=&4\u0423\u0420\u041E\u0412\u0415\u041D\u042C \u0421\u0418\u041B\u042B\\: &a{0} +Commands.Reset.All=&a\u0412\u0441\u0435 \u0432\u0430\u0448\u0438 \u0443\u0440\u043E\u0432\u043D\u0438 \u043D\u0430\u0432\u044B\u043A\u043E\u0432 \u0431\u044B\u043B\u0438 \u0443\u0441\u043F\u0435\u0448\u043D\u043E \u0441\u0431\u0440\u043E\u0448\u0435\u043D\u044B. +Commands.Reset.Single=&a\u0412\u0430\u0448 \u0443\u0440\u043E\u0432\u0435\u043D\u044C \u043D\u0430\u0432\u044B\u043A\u0430 {0} \u0431\u044B\u043B \u0443\u0441\u043F\u0435\u0448\u043D\u043E \u0441\u0431\u0440\u043E\u0448\u0435\u043D. +Commands.Reset=&a- \u0421\u0431\u0440\u043E\u0441 \u0443\u0440\u043E\u0432\u043D\u044F \u043D\u0430\u0432\u044B\u043A\u0430 \u0434\u043E 0 +Commands.Scoreboard.Clear=&3\u0422\u0430\u0431\u043B\u0438\u0446\u0430 mcMMO \u0443\u0431\u0440\u0430\u043D\u0430. +Commands.Scoreboard.NoBoard=&c\u0422\u0430\u0431\u043B\u0438\u0446\u0430 mcMMO \u043D\u0435 \u0430\u043A\u0442\u0438\u0432\u043D\u0430. +Commands.Scoreboard.Keep=&3\u0422\u0430\u0431\u043B\u0438\u0446\u0430 mcMMO \u0431\u0443\u0434\u0435\u0442 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C\u0441\u044F \u043F\u043E\u043A\u0430 \u0432\u044B \u043D\u0435 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0435 &a/mcscoreboard clear&3. +Commands.Scoreboard.Timer=&3\u0422\u0430\u0431\u043B\u0438\u0446\u0430 mcMMO \u0438\u0441\u0447\u0435\u0437\u043D\u0435\u0442 \u0447\u0435\u0440\u0435\u0437 &6{0}&3 \u0441\u0435\u043A\u0443\u043D\u0434. +Commands.Scoreboard.Help.0=&6 \\=\\= &a\u041F\u043E\u043C\u043E\u0449\u044C \u043F\u043E &c/mcscoreboard&6 \\=\\= +Commands.Scoreboard.Help.1=&3/mcscoreboard&b clear &f - \u0443\u0431\u0440\u0430\u0442\u044C \u0442\u0430\u0431\u043B\u0438\u0446\u0443 mcMMO +Commands.Scoreboard.Help.2=&3/mcscoreboard&b keep &f - \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 mcMMO +Commands.Scoreboard.Help.3=&3/mcscoreboard&b time [n] &f - \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 &dn&f \u0441\u0435\u043A\u0443\u043D\u0434 +Commands.Scoreboard.Tip.Keep=&6\u041F\u043E\u0434\u0441\u043A\u0430\u0437\u043A\u0430\\: \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 &c/mcscoreboard keep&6 \u0432\u043E \u0432\u0440\u0435\u043C\u044F \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0430 \u0442\u0430\u0431\u043B\u0438\u0446\u044B, \u0447\u0442\u043E\u0431\u044B \u043E\u043D\u0430 \u043D\u0435 \u0438\u0441\u0447\u0435\u0437\u0430\u043B\u0430. +Commands.Scoreboard.Tip.Clear=&6\u041F\u043E\u0434\u0441\u043A\u0430\u0437\u043A\u0430\\: \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 &c/mcscoreboard clear&6 \u0447\u0442\u043E\u0431\u044B \u0443\u0431\u0440\u0430\u0442\u044C \u0442\u0430\u0431\u043B\u0438\u0446\u0443. +Commands.XPBar.Reset=&6\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u0448\u043A\u0430\u043B\u044B \u043E\u043F\u044B\u0442\u0430 \u0434\u043B\u044F mcMMO \u0431\u044B\u043B\u0438 \u0441\u0431\u0440\u043E\u0448\u0435\u043D\u044B. +Commands.XPBar.SettingChanged=&6\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430 \u0448\u043A\u0430\u043B\u044B \u043E\u043F\u044B\u0442\u0430 \u0434\u043B\u044F &a{0}&6 \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u0430 \u043D\u0430 &a{1} +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.ChildSkill=\u0414\u043E\u0447\u0435\u0440\u043D\u0438\u0435 \u043D\u0430\u0432\u044B\u043A\u0438 \u043D\u0435\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043B\u044C\u043D\u044B \u0434\u043B\u044F \u044D\u0442\u043E\u0439 \u043A\u043E\u043C\u0430\u043D\u0434\u044B\\! +Commands.Skill.Leaderboard=--mcMMO &9{0}&e \u0442\u0430\u0431\u043B\u0438\u0446\u0430 \u043B\u0438\u0434\u0435\u0440\u043E\u0432-- +Commands.SkillInfo=&a- \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=&a- \u041F\u043E\u0441\u043C\u043E\u0442\u0440\u0435\u0442\u044C \u0441\u0432\u043E\u0438 \u0441\u0442\u0430\u0442\u044B mcMMO +Commands.ToggleAbility=&a- \u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0430\u043A\u0442\u0438\u0432\u0430\u0446\u0438\u044E \u0443\u043C\u0435\u043D\u0438\u0439 \u0447\u0435\u0440\u0435\u0437 \u041F\u041A\u041C +Commands.Usage.0=&c\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=&c\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=&c\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=&c\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.3.XP=&c\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}&7 (\u0412\u044B \u043C\u043E\u0436\u0435\u0442\u0435 \u0434\u043E\u0431\u0430\u0432\u0438\u0442\u044C -s \u0432 \u043A\u043E\u043D\u0446\u0435 \u0434\u043B\u044F \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u044F \u043A\u043E\u043C\u0430\u043D\u0434\u044B \u0431\u0435\u0437 \u0438\u043D\u0444\u043E\u0440\u043C\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F \u043E\u0431 \u044D\u0442\u043E\u043C \u0438\u0433\u0440\u043E\u043A\u0430) +Commands.Usage.FullClassName=\u043A\u043B\u0430\u0441\u0441 +Commands.Usage.Level=\u0443\u0440\u043E\u0432\u0435\u043D\u044C +Commands.Usage.Message=\u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435 +Commands.Usage.Page=\u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0430 +Commands.Usage.PartyName=\u0438\u043C\u044F +Commands.Usage.Password=\u043F\u0430\u0440\u043E\u043B\u044C +Commands.Usage.Player=\u0438\u0433\u0440\u043E\u043A +Commands.Usage.Rate=\u0447\u0430\u0441\u0442\u043E\u0442\u0430 +Commands.Usage.Skill=\u043D\u0430\u0432\u044B\u043A +Commands.Usage.SubSkill=\u043F\u043E\u0434\u043D\u0430\u0432\u044B\u043A +Commands.Usage.XP=\u043E\u043F\u044B\u0442 +Commands.Description.mmoinfo=\u041F\u0440\u043E\u0447\u0438\u0442\u0430\u0439\u0442\u0435 \u043F\u043E\u0434\u0440\u043E\u0431\u043D\u0435\u0435 \u043E \u043D\u0430\u0432\u044B\u043A\u0435 \u0438\u043B\u0438 \u043C\u0435\u0445\u0430\u043D\u0438\u043A\u0435. +Commands.MmoInfo.Mystery=&7\u0412\u044B \u0435\u0449\u0435 \u043D\u0435 \u0440\u0430\u0437\u0431\u043B\u043E\u043A\u0438\u0440\u043E\u0432\u0430\u043B\u0438 \u044D\u0442\u043E\u0442 \u043D\u0430\u0432\u044B\u043A, \u043D\u043E \u043A\u043E\u0433\u0434\u0430 \u0440\u0430\u0437\u0431\u043B\u043E\u043A\u0438\u0440\u0443\u0435\u0442\u0435, \u0441\u043C\u043E\u0436\u0435\u0442\u0435 \u043F\u0440\u043E\u0447\u0438\u0442\u0430\u0442\u044C \u043E \u043D\u0435\u043C \u0442\u0443\u0442\\! +Commands.MmoInfo.NoMatch=\u042D\u0442\u043E\u0433\u043E \u043F\u043E\u0434\u043D\u0430\u0432\u044B\u043A\u0430 \u043D\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442\\! +Commands.MmoInfo.Header=&3-\\=[]\\=\\=\\=\\=\\=[]&6 MMO \u0438\u043D\u0444\u043E. &3[]\\=\\=\\=\\=\\=[]\\=- +Commands.MmoInfo.SubSkillHeader=&6\u041D\u0430\u0437\u0432\u0430\u043D\u0438\u0435\\:&e {0} +Commands.MmoInfo.DetailsHeader=&3-\\=[]\\=\\=\\=\\=\\=[]&a \u041F\u043E\u0434\u0440\u043E\u0431\u043D\u0435\u0435 &3[]\\=\\=\\=\\=\\=[]\\=- +Commands.MmoInfo.OldSkill=&7\u041D\u0430\u0432\u044B\u043A\u0438 mcMMO \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, \u0438 \u043A \u0441\u043E\u0436\u0430\u043B\u0435\u043D\u0438\u044E \u0434\u0430\u043D\u043D\u044B\u0439 \u043D\u0430\u0432\u044B\u043A \u043F\u043E\u043A\u0430 \u043D\u0435 \u0431\u044B\u043B \u043F\u0435\u0440\u0435\u0440\u0430\u0431\u043E\u0442\u0430\u043D \u0438 \u043D\u0435\u0434\u043E\u0441\u0442\u0430\u0435\u0442 \u043E\u043F\u0438\u0441\u0430\u043D\u0438\u044F. \u041D\u043E\u0432\u0430\u044F \u0441\u0438\u0441\u0442\u0435\u043C\u0430 \u043F\u043E\u0437\u0432\u043E\u043B\u0438\u0442 \u0441\u043E\u0437\u0434\u0430\u0432\u0430\u0442\u044C \u043D\u0430\u0432\u044B\u043A\u0438 \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. +Commands.MmoInfo.Mechanics=&3-\\=[]\\=\\=\\=\\=\\=[]&6 \u041C\u0435\u0445\u0430\u043D\u0438\u043A\u0438 &3[]\\=\\=\\=\\=\\=[]\\=- +Commands.MmoInfo.Stats=\u0421\u0422\u0410\u0422\u042B\\: {0} +Commands.Mmodebug.Toggle=\u0420\u0435\u0436\u0438\u043C \u043E\u0442\u043B\u0430\u0434\u043A\u0438 mcMMO &6{0}&7, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u0443 \u0441\u043D\u043E\u0432\u0430 \u0434\u043B\u044F \u043F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u044F. \u0412 \u0440\u0435\u0436\u0438\u043C\u0435 \u043E\u0442\u043B\u0430\u0434\u043A\u0438 \u0432\u044B \u043C\u043E\u0436\u0435\u0442\u0435 \u0431\u0438\u0442\u044C \u0431\u043B\u043E\u043A\u0438, \u0447\u0442\u043E\u0431\u044B \u043F\u0440\u043E\u0441\u043C\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044C \u043F\u043E\u043B\u0435\u0437\u043D\u0443\u044E \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044E, \u0442\u0440\u0435\u0431\u0443\u0435\u043C\u0443\u044E \u0434\u043B\u044F \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u043A\u0438. +mcMMO.NoInvites=&c\u0421\u0435\u0439\u0447\u0430\u0441 \u0443 \u0432\u0430\u0441 \u043D\u0435\u0442 \u043F\u0440\u0438\u0433\u043B\u0430\u0448\u0435\u043D\u0438\u0439 +mcMMO.NoPermission=&4\u041D\u0435\u0434\u043E\u0441\u0442\u0430\u0442\u043E\u0447\u043D\u043E \u043F\u0440\u0430\u0432. +mcMMO.NoSkillNote=&8\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 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D \u0437\u0434\u0435\u0441\u044C. +##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 (\u043F\u0440\u043E\u0432\u0435\u0440\u044C\u0442\u0435 \u043F\u0440\u0430\u0432\u0430) +Party.Help.0=&c\u041F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u043E\u0435 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0435 &3{0} <\u0438\u0433\u0440\u043E\u043A> [\u043F\u0430\u0440\u043E\u043B\u044C]. +Party.Help.1=&c\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 &3{0} <\u043D\u0430\u0437\u0432\u0430\u043D\u0438\u0435> [\u043F\u0430\u0440\u043E\u043B\u044C]. +Party.Help.2=&c\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 &3{0} &c\u0434\u043B\u044F \u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0439 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0438 +Party.Help.3=&c\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 &3{0} <\u0438\u0433\u0440\u043E\u043A> [\u043F\u0430\u0440\u043E\u043B\u044C]&c, \u0447\u0442\u043E\u0431\u044B \u043F\u0440\u0438\u0441\u043E\u0435\u0434\u0438\u043D\u0438\u0442\u044C\u0441\u044F \u0438\u043B\u0438 &3{1}&c, \u0447\u0442\u043E\u0431\u044B \u0432\u044B\u0439\u0442\u0438 +Party.Help.4=&c\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 \u0441\u0432\u043E\u044E \u0433\u0440\u0443\u043F\u043F\u0443, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 &3{0} +Party.Help.5=&c\u0427\u0442\u043E\u0431\u044B \u0437\u0430\u0449\u0438\u0442\u0438\u0442\u044C \u0441\u0432\u043E\u044E \u0433\u0440\u0443\u043F\u043F\u0443 \u043F\u0430\u0440\u043E\u043B\u0435\u043C, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 &3{0} <\u043F\u0430\u0440\u043E\u043B\u044C> +Party.Help.6=\u0427\u0442\u043E\u0431\u044B \u0432\u044B\u0433\u043D\u0430\u0442\u044C \u0438\u0433\u0440\u043E\u043A\u0430 \u0438\u0437 \u0441\u0432\u043E\u0435\u0439 \u0433\u0440\u0443\u043F\u043F\u044B, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 &3{0} <\u0438\u0433\u0440\u043E\u043A> +Party.Help.7=\u0427\u0442\u043E\u0431\u044B \u043F\u0435\u0440\u0435\u0434\u0430\u0442\u044C \u043F\u0440\u0430\u0432\u0430 \u0443\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u044F \u0441\u0432\u043E\u0435\u0439 \u0433\u0440\u0443\u043F\u043F\u043E\u0439, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 &3{0} <\u0438\u0433\u0440\u043E\u043A> +Party.Help.8=&c\u0427\u0442\u043E\u0431\u044B \u0440\u0430\u0441\u0444\u043E\u0440\u043C\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0441\u0432\u043E\u044E \u0433\u0440\u0443\u043F\u043F\u0443, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 &3{0} +Party.Help.9=&c\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 &3{0} &c\u0434\u043B\u044F \u0440\u0430\u0441\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u043F\u0440\u0435\u0434\u043C\u0435\u0442\u043E\u0432 \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=&c\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 &3{0} &c\u0434\u043B\u044F \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u044F \u0440\u0430\u0441\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u044F \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} &a\u043F\u0440\u0438\u0441\u043E\u0435\u0434\u0438\u043D\u0438\u043B\u0441\u044F \u043A \u0432\u0430\u0448\u0435\u0439 \u0433\u0440\u0443\u043F\u043F\u0435 +Party.InformedOnQuit={0} &a\u043F\u043E\u043A\u0438\u043D\u0443\u043B \u0432\u0430\u0448\u0443 \u0433\u0440\u0443\u043F\u043F\u0443 +Party.InformedOnNameChange=&6{0} &a\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 &f{1} +Party.InvalidName=&4\u042D\u0442\u043E \u043D\u0435\u0434\u043E\u043F\u0443\u0441\u0442\u0438\u043C\u043E\u0435 \u043D\u0430\u0437\u0432\u0430\u043D\u0438\u0435 \u0433\u0440\u0443\u043F\u043F\u044B. +Party.Invite.Self=&c\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=&c\u042D\u0442\u0430 \u0433\u0440\u0443\u043F\u043F\u0430 \u0443\u0436\u0435 \u0437\u0430\u043A\u0440\u044B\u0442\u0430\\! +Party.IsntLocked=&c\u042D\u0442\u0430 \u0433\u0440\u0443\u043F\u043F\u0430 \u043D\u0435 \u0437\u0430\u043A\u0440\u044B\u0442\u0430\\! +Party.Locked=&c\u0413\u0440\u0443\u043F\u043F\u0430 \u0437\u0430\u043A\u0440\u044B\u0442\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=&4{0} \u043D\u0435\u0442 \u0432 \u0432\u0430\u0448\u0435\u0439 \u0433\u0440\u0443\u043F\u043F\u0435 +Party.NotOwner=&4\u0412\u044B \u043D\u0435 \u043B\u0438\u0434\u0435\u0440 \u0433\u0440\u0443\u043F\u043F\u044B. +Party.Target.NotOwner=&4{0} \u043D\u0435 \u043B\u0438\u0434\u0435\u0440 \u0433\u0440\u0443\u043F\u043F\u044B. +Party.Owner.New=&a{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=&4\u0412\u044B \u0431\u043E\u043B\u044C\u0448\u0435 \u043D\u0435 \u043B\u0438\u0434\u0435\u0440 \u0433\u0440\u0443\u043F\u043F\u044B. +Party.Owner.Player =&a\u0422\u0435\u043F\u0435\u0440\u044C \u0432\u044B \u043B\u0438\u0434\u0435\u0440 \u0433\u0440\u0443\u043F\u043F\u044B. +Party.Password.None=&c\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\u0438\u043D\u0438\u0442\u044C\u0441\u044F. +Party.Password.Incorrect=&c\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u044B\u0439 \u043F\u0430\u0440\u043E\u043B\u044C \u0433\u0440\u0443\u043F\u043F\u044B. +Party.Password.Set=&a\u041F\u0430\u0440\u043E\u043B\u044C \u0433\u0440\u0443\u043F\u043F\u044B \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D \u043D\u0430 {0} +Party.Password.Removed=&a\u041F\u0430\u0440\u043E\u043B\u044C \u0433\u0440\u0443\u043F\u043F\u044B \u0431\u044B\u043B \u0443\u0434\u0430\u043B\u0435\u043D. +Party.Player.Invalid=&c\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=&4{0} \u043D\u0435 \u0432 \u0441\u0435\u0442\u0438\\! +Party.Player.InSameParty=&c{0} \u0443\u0436\u0435 \u043D\u0430\u0445\u043E\u0434\u0438\u0442\u0441\u044F \u0432 \u0432\u0430\u0448\u0435\u0439 \u0433\u0440\u0443\u043F\u043F\u0435\\! +Party.PlayerNotInParty=&4{0} \u043D\u0435 \u0441\u043E\u0441\u0442\u043E\u0438\u0442 \u0432 \u0433\u0440\u0443\u043F\u043F\u0435 +Party.Specify=&c\u0412\u044B \u0434\u043E\u043B\u0436\u043D\u044B \u0443\u043A\u0430\u0437\u0430\u0442\u044C \u0433\u0440\u0443\u043F\u043F\u0443. +Party.Teleport.Dead=&c\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=&c\u0417\u0430 \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0438\u0435 {0} \u0441\u0435\u043A\u0443\u043D\u0434 \u0432\u044B \u043F\u043E\u043B\u0443\u0447\u0438\u043B\u0438 \u0443\u0440\u043E\u043D, \u0442\u0435\u043B\u0435\u043F\u043E\u0440\u0442\u0430\u0446\u0438\u044F \u043E\u0442\u043C\u0435\u043D\u0435\u043D\u0430. +Party.Teleport.Player=&a\u0412\u044B \u0442\u0435\u043B\u0435\u043F\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u043B\u0438\u0441\u044C \u043A {0}. +Party.Teleport.Self=&c\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\u0435\u0431\u0435\\! +Party.Teleport.Target=&a{0} \u0442\u0435\u043B\u0435\u043F\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u043B\u0441\u044F \u043A \u0432\u0430\u043C. +Party.Teleport.Disabled=&c\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=&c\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=&c\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=&7\u0413\u0440\u0443\u043F\u043F\u0430 \u043E\u0442\u043A\u0440\u044B\u0442\u0430 +Party.Disband=&7\u0413\u0440\u0443\u043F\u043F\u0430 \u0440\u0430\u0441\u0444\u043E\u0440\u043C\u0438\u0440\u043E\u0432\u0430\u043D\u0430 +Party.Alliance.Formed=&7\u0412\u0430\u0448\u0430 \u0433\u0440\u0443\u043F\u043F\u0430 \u0442\u0435\u043F\u0435\u0440\u044C \u0432 \u0441\u043E\u044E\u0437\u0435 \u0441 &a{0} +Party.Alliance.Disband=&7\u0412\u0430\u0448 \u0441\u043E\u044E\u0437 \u0441 &c{0} &7\u0440\u0430\u0441\u043F\u0430\u043B\u0441\u044F +Party.Status.Locked=&4(\u0422\u041E\u041B\u042C\u041A\u041E \u041F\u041E \u041F\u0420\u0418\u0413\u041B\u0410\u0428\u0415\u041D\u0418\u042E) +Party.Status.Unlocked=&2(\u041E\u0422\u041A\u0420\u042B\u0422\u0410) +Party.LevelUp=&e\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}. \u0412\u0441\u0435\u0433\u043E ({1}) +Party.Feature.Chat=\u0427\u0430\u0442 \u0433\u0440\u0443\u043F\u043F\u044B +Party.Feature.Teleport=\u0422\u0435\u043B\u0435\u043F\u043E\u0440\u0442\u0430\u0446\u0438\u044F \u0433\u0440\u0443\u043F\u043F\u044B +Party.Feature.Alliance=\u0421\u043E\u044E\u0437\u044B +Party.Feature.ItemShare=\u0420\u0430\u0441\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u043F\u0440\u0435\u0434\u043C\u0435\u0442\u043E\u0432 +Party.Feature.XpShare=\u0420\u0430\u0441\u043F\u0440\u0435\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=\u0417\u0410\u0411\u041B\u041E\u041A\u0418\u0420\u041E\u0412\u0410\u041D\u041E \u0414\u041E {0}+ (\u0422\u0415\u041B\u0415\u041F\u041E\u0420\u0422\u0410\u0426\u0418\u042F \u0413\u0420\u0423\u041F\u041F\u042B) +Party.Feature.Locked.Alliance=\u0417\u0410\u0411\u041B\u041E\u041A\u0418\u0420\u041E\u0412\u0410\u041D\u041E \u0414\u041E {0}+ (\u0421\u041E\u042E\u0417\u042B) +Party.Feature.Locked.ItemShare=\u0417\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=\u0417\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=&c\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=&c\u0422\u0435\u043B\u0435\u043F\u043E\u0440\u0442\u0430\u0446\u0438\u044F \u0433\u0440\u0443\u043F\u043F\u044B \u0435\u0449\u0435 \u043D\u0435 \u0440\u0430\u0437\u0431\u043B\u043E\u043A\u0438\u0440\u043E\u0432\u0430\u043D\u0430. +Party.Feature.Disabled.3=&c\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=&c\u0420\u0430\u0441\u043F\u0440\u0435\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=&c\u0420\u0430\u0441\u043F\u0440\u0435\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.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.ItemShare.Category.Loot=\u0414\u043E\u0431\u044B\u0447\u0430 +Party.ItemShare.Category.Mining=\u0428\u0430\u0445\u0442\u0435\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\u0430\u0434\u0435\u043D\u0438\u0435 +Commands.XPGain.Alchemy=\u0412\u0430\u0440\u043A\u0430 \u0437\u0435\u043B\u0438\u0439 +Commands.XPGain.Archery=\u0423\u0431\u0438\u0439\u0441\u0442\u0432\u043E \u043C\u043E\u043D\u0441\u0442\u0440\u043E\u0432 +Commands.XPGain.Axes=\u0423\u0431\u0438\u0439\u0441\u0442\u0432\u043E \u043C\u043E\u043D\u0441\u0442\u0440\u043E\u0432 +Commands.XPGain.Child=\u041F\u043E\u043B\u0443\u0447\u0430\u0435\u0442 \u0443\u0440\u043E\u0432\u043D\u0438 \u043E\u0442 \u0440\u043E\u0434\u0438\u0442\u0435\u043B\u044C\u0441\u043A\u043E\u0433\u043E \u043D\u0430\u0432\u044B\u043A\u0430 +Commands.XPGain.Excavation=\u0420\u0430\u0441\u043A\u043E\u043F\u043A\u0438 \u0438 \u043F\u043E\u0438\u0441\u043A \u0441\u043E\u043A\u0440\u043E\u0432\u0438\u0449 +Commands.XPGain.Fishing=\u0420\u044B\u0431\u0430\u043B\u043A\u0430 (\u043E\u0447\u0435\u0432\u0438\u0434\u043D\u043E) +Commands.XPGain.Herbalism=\u0421\u0431\u043E\u0440 \u0442\u0440\u0430\u0432 +Commands.XPGain.Mining=\u0414\u043E\u0431\u044B\u0447\u0430 \u043A\u0430\u043C\u043D\u0435\u0439 \u0438 \u0440\u0443\u0434 +Commands.XPGain.Repair=\u0420\u0435\u043C\u043E\u043D\u0442 \u0432\u0435\u0449\u0435\u0439 +Commands.XPGain.Swords=\u0423\u0431\u0438\u0439\u0441\u0442\u0432\u043E \u043C\u043E\u043D\u0441\u0442\u0440\u043E\u0432 +Commands.XPGain.Taming=\u041F\u0440\u0438\u0440\u0443\u0447\u0435\u043D\u0438\u0435 \u0436\u0438\u0432\u043E\u0442\u043D\u044B\u0445 \u0438\u043B\u0438 \u0441\u0440\u0430\u0436\u0435\u043D\u0438\u0435 \u0432\u043C\u0435\u0441\u0442\u0435 \u0441 \u0432\u043E\u043B\u043A\u0430\u043C\u0438 +Commands.XPGain.Unarmed=\u0423\u0431\u0438\u0439\u0441\u0442\u0432\u043E \u043C\u043E\u043D\u0441\u0442\u0440\u043E\u0432 +Commands.XPGain.Woodcutting=\u0420\u0443\u0431\u043A\u0430 \u0434\u0435\u0440\u0435\u0432\u044C\u0435\u0432 +Commands.XPGain=&8\u041F\u041E\u041B\u0423\u0427\u0415\u041D\u041E \u041E\u041F\u042B\u0422\u0410\\: &f{0} +Commands.xplock.locked=&6\u0412\u0430\u0448\u0430 \u043F\u0430\u043D\u0435\u043B\u044C \u043E\u043F\u044B\u0442\u0430 \u0442\u0435\u043F\u0435\u0440\u044C \u0437\u0430\u0444\u0438\u043A\u0441\u0438\u0440\u043E\u0432\u0430\u043D\u0430 \u043D\u0430 {0}\\! +Commands.xplock.unlocked=&6\u0412\u0430\u0448\u0430 \u043F\u0430\u043D\u0435\u043B\u044C \u043E\u043F\u044B\u0442\u0430 \u0442\u0435\u043F\u0435\u0440\u044C &a\u0420\u0410\u0417\u0411\u041B\u041E\u041A\u0418\u0420\u041E\u0412\u0410\u041D\u0410&6\\! +Commands.xprate.modified=&c\u041C\u041D\u041E\u0416\u0418T\u0415\u041B\u042C \u041E\u041F\u042BT\u0410 \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D \u043D\u0430 {0} +Commands.xprate.over=&c\u0421\u043E\u0431\u044B\u0442\u0438\u0435 \u043C\u043D\u043E\u0436\u0438\u0442\u0435\u043B\u044F \u043E\u043F\u044B\u0442\u0430 mcMMO \u0417\u0410\u0412\u0415\u0420\u0428\u0415\u041D\u041E\\!\\! +Commands.xprate.proper.0=&c\u041F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u043E\u0435 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u044F \u0434\u043B\u044F \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F \u043C\u043D\u043E\u0436\u0438\u0442\u0435\u043B\u044F \u043E\u043F\u044B\u0442\u0430 /xprate <\u0447\u0438\u0441\u043B\u043E> +Commands.xprate.proper.1=&c\u041F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u043E\u0435 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0435 \u0434\u043B\u044F \u0441\u0431\u0440\u043E\u0441\u0430 \u043C\u043D\u043E\u0436\u0438\u0442\u0435\u043B\u044F \u043E\u043F\u044B\u0442\u0430 /xprate reset +Commands.xprate.proper.2=&c\u041F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430, \u0432\u044B\u0431\u0435\u0440\u0438\u0442\u0435 true(\u0434\u0430) \u0438\u043B\u0438 false(\u043D\u0435\u0442), \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 \u0441\u043E\u0431\u044B\u0442\u0438\u0435\u043C \u043C\u043D\u043E\u0436\u0438\u0442\u0435\u043B\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=&amcMMO&6 \u0441\u043E\u0431\u044B\u0442\u0438\u0435\\! +Commands.Event.Stop=&amcMMO&3 \u0441\u043E\u0431\u044B\u0442\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u043E\\! +Commands.Event.Stop.Subtitle=&a\u041D\u0430\u0434\u0435\u044E\u0441\u044C, \u0432\u044B \u043F\u043E\u0432\u0435\u0441\u0435\u043B\u0438\u043B\u0438\u0441\u044C\\! +Commands.Event.XP=&3\u041C\u043D\u043E\u0436\u0438\u0442\u0435\u043B\u044C \u043E\u043F\u044B\u0442\u0430 \u0441\u0435\u0439\u0447\u0430\u0441 &6{0}&3x +Commands.xprate.started.0=&6\u0421\u041E\u0411\u042B\u0418T\u0415 \u041C\u041D\u041E\u0416\u0418T\u0415\u041B\u042F \u041E\u041F\u042BT\u0410 mcMMO \u041D\u0410\u0427\u0410\u041B\u041E\u0421\u042C\\! +Commands.xprate.started.1=&6\u041C\u041D\u041E\u0416\u0418T\u0415\u041B\u042C \u041E\u041F\u042BT\u0410 mcMMO \u0421\u0415\u0419\u0427\u0410\u0421 {0}x\\! + +# Admin Notifications +Server.ConsoleName=&e[\u0421\u0435\u0440\u0432\u0435\u0440] +Notifications.Admin.XPRate.Start.Self=&7\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 &6{0}x +Notifications.Admin.XPRate.End.Self=&7\u0412\u044B \u0437\u0430\u0432\u0435\u0440\u0448\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} &7\u0437\u0430\u0432\u0435\u0440\u0448\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} &7\u043D\u0430\u0447\u0430\u043B \u0438\u043B\u0438 \u0438\u0437\u043C\u0435\u043D\u0438\u043B \u0441\u043E\u0431\u044B\u0442\u0438\u0435 \u043C\u043D\u043E\u0436\u0438\u0442\u0435\u043B\u044F \u043E\u043F\u044B\u0442\u0430 {1}x +Notifications.Admin.Format.Others=&6(&amcMMO &3\u0430\u0434\u043C\u0438\u043D&6) &7{0} +Notifications.Admin.Format.Self=&6(&amcMMO&6) &7{0} + +# Event +XPRate.Event=&6\u0412 mcMMO \u0441\u043E\u0431\u044B\u0442\u0438\u0435 \u043C\u043D\u043E\u0436\u0438\u0442\u0435\u043B\u044F \u043E\u043F\u044B\u0442\u0430\\! \u041C\u043D\u043E\u0436\u0438\u0442\u0435\u043B\u044C \u043E\u043F\u044B\u0442\u0430 - {0}x\\! + +#GUIDES +Guides.Available=&7\u0414\u043E\u0441\u0442\u0443\u043F\u043D\u043E \u0440\u0443\u043A\u043E\u0432\u043E\u0434\u0441\u0442\u0432\u043E \u0434\u043B\u044F {0} - \u0432\u0432\u0435\u0434\u0438\u0442\u0435 /{1} ? [\u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0430] +Guides.Header=&6-\\=&a\u0420\u0443\u043A\u043E\u0432\u043E\u0434\u0441\u0442\u0432\u043E {0} &6\\=- +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\u043E\u0439 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B \u043D\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 - \u0435\u0441\u0442\u044C \u043B\u0438\u0448\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=&3\u041E \u043D\u0430\u0432\u044B\u043A\u0435 \u0410\u043A\u0440\u043E\u0431\u0430\u0442\u0438\u043A\u0430\\:!nasd&e\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.!nasd&e\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.!nasd!nasd&3\u041F\u043E\u043B\u0443\u0447\u0435\u043D\u0438\u0435 \u043E\u043F\u044B\u0442\u0430\\:!nasd&e\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 !nasd&e\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=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u041A\u0443\u0432\u044B\u0440\u043E\u043A?!nasd&e\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\u0430\u0435\u043C\u044B\u0439 \u043F\u0440\u0438 \u043F\u0430\u0434\u0435\u043D\u0438\u0438.!nasd&e\u0415\u0441\u043B\u0438 \u0432\u043E \u0432\u0440\u0435\u043C\u044F \u043F\u0430\u0434\u0435\u043D\u0438\u044F \u0434\u0435\u0440\u0436\u0430\u0442\u044C \u043A\u043D\u043E\u043F\u043A\u0443 \u043F\u0440\u0438\u0441\u0435\u0434\u0430,!nasd&e\u0442\u043E \u044D\u0442\u043E\u0442 \u0448\u0430\u043D\u0441 \u043C\u043E\u0436\u043D\u043E \u0443\u0434\u0432\u043E\u0438\u0442\u044C.!nasd&e\u042D\u0442\u043E \u0432\u044B\u0437\u043E\u0432\u0435\u0442 \u0413\u0440\u0430\u0446\u0438\u043E\u0437\u043D\u044B\u0439 \u043A\u0443\u0432\u044B\u0440\u043E\u043A, \u0432\u043C\u0435\u0441\u0442\u043E \u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u043E\u0433\u043E.!nasd&e\u0413\u0440\u0430\u0446\u0438\u043E\u0437\u043D\u044B\u0435 \u043A\u0443\u0432\u044B\u0440\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!nasd&e\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.!nasd&e\u0428\u0430\u043D\u0441 \u043D\u0430 \u0443\u0434\u0430\u0447\u043D\u044B\u0439 \u041A\u0443\u0432\u044B\u0440\u043E\u043A \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043E\u0442 \u0443\u0440\u043E\u0432\u043D\u044F \u043D\u0430\u0432\u044B\u043A\u0430. +Guides.Acrobatics.Section.2=&3\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?!nasd&e\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 \u0448\u0430\u043D\u0441 \u0443\u043A\u043B\u043E\u043D\u0438\u0442\u044C\u0441\u044F!nasd&e\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.!nasd&e\u0428\u0430\u043D\u0441 \u043D\u0430 \u0443\u0434\u0430\u0447\u043D\u043E\u0435 \u0423\u043A\u043B\u043E\u043D\u0435\u043D\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043E\u0442 \u0443\u0440\u043E\u0432\u043D\u044F \u043D\u0430\u0432\u044B\u043A\u0430. +##Alchemy +Guides.Alchemy.Section.0=&3\u041E \u043D\u0430\u0432\u044B\u043A\u0435 \u0410\u043B\u0445\u0438\u043C\u0438\u044F\\:!nasd&e\u0410\u043B\u0445\u0438\u043C\u0438\u044F - \u044D\u0442\u043E \u043F\u0440\u043E\u0438\u0437\u0432\u043E\u0434\u0441\u0442\u0432\u043E \u0437\u0435\u043B\u0438\u0439.!nasd&e\u041E\u043D\u0430 \u043E\u0431\u0435\u0441\u043F\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0443\u0441\u043A\u043E\u0440\u0435\u043D\u0438\u0435 \u0432\u0430\u0440\u043A\u0438 \u0437\u0435\u043B\u0438\u0439, \u0430 \u0442\u0430\u043A\u0436\u0435!nasd&e\u0434\u043E\u0431\u0430\u0432\u043B\u044F\u0435\u0442 \u043D\u043E\u0432\u044B\u0435, \u0440\u0430\u043D\u0435\u0435 \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0435 \u0437\u0435\u043B\u0438\u0439.!nasd!nasd!nasd&3\u041F\u041E\u041B\u0423\u0427\u0415\u041D\u0418 \u041E\u041F\u042BT\u0410\\:!nasd&e\u0427\u0442\u043E\u0431\u044B \u043F\u043E\u043B\u0443\u0447\u0438\u0442\u044C \u043E\u043F\u044B\u0442 \u0432 \u044D\u0442\u043E\u043C \u043D\u0430\u0432\u044B\u043A\u0435, \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E \u0432\u0430\u0440\u0438\u0442\u044C \u0437\u0435\u043B\u044C\u044F. +Guides.Alchemy.Section.1=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u041A\u0430\u0442\u0430\u043B\u0438\u0437\u0430\u0442\u043E\u0440?!nasd&e\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 \u0432\u0430\u0440\u043A\u0438 \u0434\u043E!nasd&e\u0441\u043A\u043E\u0440\u043E\u0441\u0442\u0438 4x \u043D\u0430 \u0443\u0440\u043E\u0432\u043D\u0435 1000.!nasd&e\u042D\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.Alchemy.Section.2=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u041E\u0442\u0432\u0430\u0440\u044B?!nasd&e\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\u0435\u0434\u0438\u0435\u043D\u0442\u0430\u043C\u0438.!nasd&e\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\u0435\u0434\u0438\u0435\u043D\u0442\u044B!nasd&e\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=&3\u0418\u043D\u0433\u0440\u0435\u0434\u0438\u0435\u043D\u0442\u044B 1 \u0440\u0430\u043D\u0433\u0430 \u041E\u0442\u0432\u0430\u0440\u043E\u0432\\:!nasd&e\u041E\u0433\u043D\u0435\u043D\u043D\u044B\u0439 \u043F\u043E\u0440\u043E\u0448\u043E\u043A, \u041C\u0430\u0440\u0438\u043D\u043E\u0432\u0430\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,!nasd&e\u0421\u0432\u0435\u0442\u043E\u043A\u0430\u043C\u0435\u043D\u043D\u0430\u044F \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 \u043C\u043E\u0440\u043A\u043E\u0432\u044C,!nasd&e\u0421\u0433\u0443\u0441\u0442\u043E\u043A \u043C\u0430\u0433\u043C\u044B, \u041D\u0435\u0437\u0435\u0440\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,!nasd&e\u0418\u0433\u043B\u043E\u0431\u0440\u044E\u0445!nasd&e(\u0412\u0430\u043D\u0438\u043B\u044C\u043D\u044B\u0435 \u0437\u0435\u043B\u044C\u044F) +Guides.Alchemy.Section.4=&3\u0418\u043D\u0433\u0440\u0435\u0434\u0438\u0435\u043D\u0442\u044B 2 \u0440\u0430\u043D\u0433\u0430 \u041E\u0442\u0432\u0430\u0440\u043E\u0432\\:!nasd&e\u041C\u043E\u0440\u043A\u043E\u0432\u044C (\u0417\u0435\u043B\u044C\u0435 \u0441\u043A\u043E\u0440\u043E\u0441\u0442\u0438)!nasd&e\u0421\u043B\u0438\u0437\u044C (\u0417\u0435\u043B\u044C\u0435 \u0442\u0443\u043F\u043E\u0441\u0442\u0438)!nasd!nasd&3\u0418\u043D\u0433\u0440\u0435\u0434\u0438\u0435\u043D\u0442\u044B 3 \u0440\u0430\u043D\u0433\u0430 \u041E\u0442\u0432\u0430\u0440\u043E\u0432\\:!nasd&e\u041A\u0432\u0430\u0440\u0446 (\u0417\u0435\u043B\u044C\u0435 \u043F\u043E\u0433\u043B\u043E\u0449\u0435\u043D\u0438\u044F)!nasd&e\u041C\u0443\u0445\u043E\u043C\u043E\u0440 (\u0417\u0435\u043B\u044C\u0435 \u043F\u0440\u044B\u0433\u0443\u0447\u0435\u0441\u0442\u0438) +Guides.Alchemy.Section.5=&3\u0418\u043D\u0433\u0440\u0435\u0434\u0438\u0435\u043D\u0442\u044B 4 \u0440\u0430\u043D\u0433\u0430 \u041E\u0442\u0432\u0430\u0440\u043E\u0432\\:!nasd&e\u042F\u0431\u043B\u043E\u043A\u043E (\u0417\u0435\u043B\u044C\u0435 \u0434\u043E\u043F. \u0437\u0434\u043E\u0440\u043E\u0432\u044C\u044F)!nasd&e\u0413\u043D\u0438\u043B\u0430\u044F \u041F\u043B\u043E\u0442\u044C (\u0417\u0435\u043B\u044C\u0435 \u0433\u043E\u043B\u043E\u0434\u0430)!nasd!nasd&3\u0418\u043D\u0433\u0440\u0435\u0434\u0438\u0435\u043D\u0442\u044B 5 \u0440\u0430\u043D\u0433\u0430 \u041E\u0442\u0432\u0430\u0440\u043E\u0432\\:!nasd&e\u041A\u043E\u0440\u0438\u0447\u043D\u0435\u0432\u044B\u0439 \u0433\u0440\u0438\u0431 (\u0417\u0435\u043B\u044C\u0435 \u0442\u043E\u0448\u043D\u043E\u0442\u044B)!nasd&e\u0427\u0435\u0440\u043D\u0438\u043B\u044C\u043D\u044B\u0439 \u043C\u0435\u0448\u043E\u043A (\u0417\u0435\u043B\u044C\u0435 \u0441\u043B\u0435\u043F\u043E\u0442\u044B) +Guides.Alchemy.Section.6=&3\u0418\u043D\u0433\u0440\u0435\u0434\u0438\u0435\u043D\u0442\u044B 6 \u0440\u0430\u043D\u0433\u0430 \u041E\u0442\u0432\u0430\u0440\u043E\u0432\\:!nasd&e\u041F\u0430\u043F\u043E\u0440\u043E\u0442\u043D\u0438\u043A (\u0417\u0435\u043B\u044C\u0435 \u043D\u0430\u0441\u044B\u0449\u0435\u043D\u0438\u044F)!nasd!nasd&3\u0418\u043D\u0433\u0440\u0435\u0434\u0438\u0435\u043D\u0442\u044B 7 \u0440\u0430\u043D\u0433\u0430 \u041E\u0442\u0432\u0430\u0440\u043E\u0432\\:!nasd&e\u042F\u0434\u043E\u0432\u0438\u0442\u044B\u0439 \u043A\u0430\u0440\u0442\u043E\u0444\u0435\u043B\u044C (\u0417\u0435\u043B\u044C\u0435 \u0437\u0430\u0433\u043D\u0438\u0432\u0430\u043D\u0438\u044F)!nasd!nasd&3\u0418\u043D\u0433\u0440\u0435\u0434\u0438\u0435\u043D\u0442\u044B 8 \u0440\u0430\u043D\u0433\u0430 \u041E\u0442\u0432\u0430\u0440\u043E\u0432\\:!nasd&e\u041E\u0431\u044B\u0447\u043D\u043E\u0435 \u0437\u043E\u043B\u043E\u0442\u043E\u0435 \u044F\u0431\u043B\u043E\u043A\u043E (\u0417\u0435\u043B\u044C\u0435 \u0437\u0430\u0449\u0438\u0442\u044B) +##Archery +Guides.Archery.Section.0=&3\u041E \u043D\u0430\u0432\u044B\u043A\u0435 \u0421\u0442\u0440\u0435\u043B\u044C\u0431\u0430\\:!nasd&e\u041D\u0430\u0432\u044B\u043A \u0421\u0442\u0440\u0435\u043B\u044C\u0431\u044B \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u0435\u043D \u043D\u0430 \u0432\u0430\u0448\u0438 \u043B\u0443\u043A \u0438 \u0441\u0442\u0440\u0435\u043B\u044B.!nasd&e\u041E\u043D \u0434\u0430\u0435\u0442 \u0440\u0430\u0437\u043B\u0438\u0447\u043D\u044B\u0435 \u0431\u043E\u043D\u0443\u0441\u044B, \u0432\u0440\u043E\u0434\u0435 \u0443\u0432\u0435\u043B\u0438\u0447\u0435\u043D\u0438\u0435 \u0443\u0440\u043E\u043D\u0430,!nasd&e\u0432\u043E\u0437\u0440\u0430\u0441\u0442\u0430\u044E\u0449\u0435\u0433\u043E \u0441 \u0443\u0440\u043E\u0432\u043D\u0435\u043C, \u0430 \u0442\u0430\u043A\u0436\u0435 \u0443\u043C\u0435\u043D\u0438\u0435 \u043E\u0448\u0435\u043B\u043E\u043C\u0438\u0442\u044C!nasd&e\u043F\u0440\u043E\u0442\u0438\u0432\u043D\u0438\u043A\u0430 \u0432 \u041F\u0432\u041F. \u0422\u0430\u043A\u0436\u0435 \u0432\u044B \u043F\u043E\u043B\u0443\u0447\u0430\u0435\u0442\u0435 \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E\u0441\u0442\u044C!nasd&e\u0432\u0435\u0440\u043D\u0443\u0442\u044C \u0447\u0430\u0441\u0442\u044C \u0441\u0442\u0440\u0435\u043B \u0441 \u043F\u043E\u0432\u0435\u0440\u0436\u0435\u043D\u043D\u044B\u0445 \u0432\u0440\u0430\u0433\u043E\u0432.!nasd!nasd&3\u041F\u041E\u041B\u0423\u0427\u0415\u041D\u0418\u0415 \u041E\u041F\u042B\u0422\u0410\\:!nasd&e\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\u0435, \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E \u0441\u0442\u0440\u0435\u043B\u044F\u0442\u044C!nasd&e\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=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u0423\u043C\u0435\u043B\u044B\u0439 \u0432\u044B\u0441\u0442\u0440\u0435\u043B?!nasd&e\u0423\u043C\u0435\u043B\u044B\u0439 \u0432\u044B\u0441\u0442\u0440\u0435\u043B \u043D\u0430\u043D\u043E\u0441\u0438\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.!nasd&e\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 \u0432\u044B\u0441\u0442\u0440\u0435\u043B\u0435 \u0440\u0430\u0441\u0442\u0435\u0442 \u0441!nasd&e \u0432\u0430\u0448\u0438\u043C \u0443\u0440\u043E\u0432\u043D\u0435\u043C \u043D\u0430\u0432\u044B\u043A\u0430 \u0421\u0442\u0440\u0435\u043B\u044C\u0431\u044B. !nasd&e\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 \u0443\u0432\u0435\u043B\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044F \u043D\u0430 10% !nasd&e\u043A\u0430\u0436\u0434\u044B\u0435 50 \u0443\u0440\u043E\u0432\u043D\u0435\u0439, \u0432\u043F\u043B\u043E\u0442\u044C \u0434\u043E 200% \u0431\u043E\u043D\u0443\u0441\u043D\u043E\u0433\u043E \u0443\u0440\u043E\u043D\u0430. +Guides.Archery.Section.2=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u041E\u0448\u0435\u043B\u043E\u043C\u043B\u0435\u043D\u0438\u0435?!nasd&e\u0412\u044B \u0438\u043C\u0435\u0435\u0442\u0435 \u043F\u0430\u0441\u0441\u0438\u0432\u043D\u044B\u0439 \u0448\u0430\u043D\u0441 \u041E\u0448\u0435\u043B\u043E\u043C\u0438\u0442\u044C \u0434\u0440\u0443\u0433\u0438\u0445 \u0438\u0433\u0440\u043E\u043A\u043E\u0432,!nasd&e\u0441\u0442\u0440\u0435\u043B\u044F\u044F \u0432 \u043D\u0438\u0445. \u041E\u0448\u0435\u043B\u043E\u043C\u043B\u0435\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 !nasd&e\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\u0431\u043E\u043B\u044C\u0448\u043E\u0433\u043E \u0432\u0440\u0435\u043C\u0435\u043D\u0438.!nasd&e\u041E\u0448\u0435\u043B\u043E\u043C\u043B\u0435\u043D\u0438\u0435 \u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u043E \u043D\u0430\u043D\u043E\u0441\u0438\u0442 4 \u0443\u0440\u043E\u043D\u0430 (2 \u0441\u0435\u0440\u0434\u0446\u0430). +Guides.Archery.Section.3=&3\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 \u0441\u0442\u0440\u0435\u043B?!nasd&e\u0423 \u0432\u0430\u0441 \u0435\u0441\u0442\u044C \u043F\u0430\u0441\u0441\u0438\u0432\u043D\u044B\u0439 \u0448\u0430\u043D\u0441 \u0432\u0435\u0440\u043D\u0443\u0442\u044C \u0447\u0430\u0441\u0442\u044C \u0441\u0432\u043E\u0438\u0445!nasd&e\u0441\u0442\u0440\u0435\u043B \u043F\u043E\u0441\u043B\u0435 \u0443\u0431\u0438\u0439\u0441\u0442\u0432\u0430 \u043C\u043E\u0431\u0430 \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u043B\u0443\u043A\u0430.!nasd&e\u042D\u0442\u043E\u0442 \u0448\u0430\u043D\u0441 \u0440\u0430\u0441\u0442\u0435\u0442 \u0441 \u0443\u0440\u043E\u0432\u043D\u0435\u043C \u043D\u0430\u0432\u044B\u043A\u0430 \u0421\u0442\u0440\u0435\u043B\u044C\u0431\u044B.!nasd&e\u0423\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, \u0432\u043F\u043B\u043E\u0442\u044C!nasd&e\u0434\u043E 100% \u043D\u0430 1000 \u0443\u0440\u043E\u0432\u043D\u0435. +##Axes +Guides.Axes.Section.0=&3\u041E \u043D\u0430\u0432\u044B\u043A\u0435 \u0422\u043E\u043F\u043E\u0440\u044B\\:!nasd&e\u0421 \u043D\u0430\u0432\u044B\u043A\u043E\u043C \u0422\u043E\u043F\u043E\u0440\u044B \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!nasd&e\u0442\u043E\u043B\u044C\u043A\u043E \u0434\u043B\u044F \u0440\u0443\u0431\u043A\u0438 \u043B\u0435\u0441\u0430\\! \u0412\u044B \u0441\u043C\u043E\u0436\u0435\u0442\u0435 \u043A\u0440\u043E\u043C\u0441\u0430\u0442\u044C \u043C\u043E\u0431\u043E\u0432!nasd&e\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!nasd&e\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.!nasd&e\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!nasd&e\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.!nasd&e\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.!nasd&3\u041F\u041E\u041B\u0423\u0427\u0415\u041D\u0418\u0415 \u041E\u041F\u042B\u0422\u0410\\:!nasd&e\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 !nasd&e\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=&3\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 \u0447\u0435\u0440\u0435\u043F\u043E\u0432?!nasd&e\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!nasd&e\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,!nasd&e\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=&3\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 \u0443\u0434\u0430\u0440?!nasd&e\u041A\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043A\u0438\u0439 \u0443\u0434\u0430\u0440 - \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!nasd&e\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.!nasd&e\u041A\u0430\u0436\u0434\u044B\u0435 2 \u0443\u0440\u043E\u0432\u043D\u044F \u043D\u0430\u0432\u044B\u043A\u0430 \u0422\u043E\u043F\u043E\u0440\u043E\u0432 \u0434\u0430\u044E\u0442 \u0432\u0430\u043C +0,1%!nasd&e\u0448\u0430\u043D\u0441 \u043D\u0430\u043D\u0435\u0441\u0442\u0438 \u041A\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043A\u0438\u0439 \u0443\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!nasd&e\u0443\u0440\u043E\u043D x2, \u0430 \u0434\u0440\u0443\u0433\u0438\u0435 \u0438\u0433\u0440\u043E\u043A\u0438 x1,5. +Guides.Axes.Section.3=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u041C\u0430\u0441\u0442\u0435\u0440\u0441\u0442\u0432\u043E \u0442\u043E\u043F\u043E\u0440\u0430?!nasd&e\u041C\u0430\u0441\u0442\u0435\u0440\u0441\u0442\u0432\u043E \u0442\u043E\u043F\u043E\u0440\u0430 - \u043F\u0430\u0441\u0441\u0438\u0432\u043D\u043E\u0435 \u0443\u043C\u0435\u043D\u0438\u0435, \u043A\u043E\u0442\u043E\u0440\u043E\u0435 \u043D\u0430\u043D\u043E\u0441\u0438\u0442!nasd&e\u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0439 \u0443\u0440\u043E\u043D \u043F\u0440\u0438 \u0432\u0430\u0448\u0438\u0445 \u0430\u0442\u0430\u043A\u0430\u0445 \u0442\u043E\u043F\u043E\u0440\u043E\u043C.!nasd&e\u0411\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!nasd&e\u043D\u0430\u0432\u044B\u043A\u0430, \u0432\u043F\u043B\u043E\u0442\u044C \u0434\u043E 4 \u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0433\u043E \u0443\u0440\u043E\u043D\u0430 \u043D\u0430 200 \u0443\u0440\u043E\u0432\u043D\u0435. +Guides.Axes.Section.4=&3\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 \u0443\u0434\u0430\u0440?!nasd&e\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\\!!nasd&e\u0411\u0440\u043E\u043D\u0435\u0431\u043E\u0439\u043D\u044B\u0439 \u0443\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!nasd&e\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 \u0443\u0440\u043E\u0432\u043D\u044F \u043D\u0430\u0432\u044B\u043A\u0430. +Guides.Axes.Section.5=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u041C\u043E\u0449\u043D\u044B\u0439 \u0443\u0434\u0430\u0440?!nasd&e\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 \u041C\u043E\u0449\u043D\u044B\u0439 \u0443\u0434\u0430\u0440, \u0441\u0440\u0430\u0436\u0430\u044F\u0441\u044C \u0441 !nasd&e\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, !nasd&e\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 \u044D\u0444\u0444\u0435\u043A\u0442!nasd&e\u0441\u0438\u043B\u044C\u043D\u043E\u0433\u043E \u043E\u0442\u043A\u0438\u0434\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\u043A\u0438\u0434\u044B\u0432\u0430\u043D\u0438\u0435 II!nasd&e\u041A \u0442\u043E\u043C\u0443 \u0436\u0435 \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=&3\u041E \u043D\u0430\u0432\u044B\u043A\u0435 \u0420\u0430\u0441\u043A\u043E\u043F\u043A\u0438\\:!nasd&e\u0420\u0430\u0441\u043A\u043E\u043F\u043A\u0438 - \u043F\u0440\u043E\u0446\u0435\u0441\u0441 \u043A\u043E\u043F\u0430\u043D\u0438\u044F \u0437\u0435\u043C\u043B\u0438 \u0432 \u043F\u043E\u0438\u0441\u043A\u0430\u0445 \u0441\u043E\u043A\u0440\u043E\u0432\u0438\u0449.!nasd&e\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.!nasd&e\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 \u043C\u043E\u0436\u0435\u0442\u0435 \u043D\u0430\u0439\u0442\u0438.!nasd!nasd&3\u041F\u041E\u041B\u0423\u0427\u0415\u041D\u0418\u0415 \u041E\u041F\u042B\u0422\u0410\\:!nasd&e\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.!nasd&e\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=&3\u041F\u043E\u0434\u0445\u043E\u0434\u044F\u0449\u0438\u0435 \u0431\u043B\u043E\u043A\u0438\\:!nasd&e\u0414\u0435\u0440\u043D, \u0417\u0435\u043C\u043B\u044F, \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, \u0421\u043D\u0435\u0433 +Guides.Excavation.Section.2=&3\u041A\u0430\u043A \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u0443\u043C\u0435\u043D\u0438\u0435 \u0413\u0438\u0433\u0430-\u0431\u0443\u0440\\:!nasd&e\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\u043E\u0434\u0433\u043E\u0442\u043E\u0432\u0438\u0442\u044C \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442.!nasd&e\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 \u043D\u0430\u0447\u0430\u043B\u0430 \u0434\u043E\u0431\u044B\u0447\u0438!nasd&e\u043F\u043E\u0434\u0445\u043E\u0434\u044F\u0449\u0438\u0445 \u0431\u043B\u043E\u043A\u043E\u0432, \u0447\u0442\u043E \u0430\u043A\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u0413\u0438\u0433\u0430-\u0431\u0443\u0440. +Guides.Excavation.Section.3=&3\u0427\u0442\u043E \u0442\u0430\u043A\u043E\u0435 \u0413\u0438\u0433\u0430-\u0431\u0443\u0440?!nasd&e\u0413\u0438\u0433\u0430-\u0431\u0443\u0440 - \u044D\u0442\u043E \u0443\u043C\u0435\u043D\u0438\u0435 \u0441 \u043E\u0442\u043A\u0430\u0442\u043E\u043C, \u0441\u0432\u044F\u0437\u0430\u043D\u043D\u043E\u0435!nasd&e\u0441 \u043D\u0430\u0432\u044B\u043A\u043E\u043C \u0420\u0430\u0441\u043A\u043E\u043F\u043E\u043A. \u041E\u043D\u043E \u0443\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u0448\u0430\u043D\u0441!nasd&e\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!nasd&e\u0440\u0430\u0437\u0440\u0443\u0448\u0430\u0442\u044C \u043F\u043E\u0434\u0445\u043E\u0434\u044F\u0449\u0438\u0435 \u0431\u043B\u043E\u043A\u0438 \u0441 \u043E\u0434\u043D\u043E\u0433\u043E \u0443\u0434\u0430\u0440\u0430. +Guides.Excavation.Section.4=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u0410\u0440\u0445\u0435\u043E\u043B\u043E\u0433\u0438\u044F?!nasd&e\u0412\u0441\u0435 \u0441\u043E\u043A\u0440\u043E\u0432\u0438\u0449\u0430 \u043D\u0430\u0432\u044B\u043A\u0430 \u0420\u0430\u0441\u043A\u043E\u043F\u043E\u043A \u0438\u043C\u0435\u044E\u0442 \u0441\u0432\u043E\u0439!nasd&e\u0442\u0440\u0435\u0431\u0443\u0435\u043C\u044B\u0439 \u0443\u0440\u043E\u0432\u0435\u043D\u044C \u043D\u0430\u0432\u044B\u043A\u0430, \u0442\u0430\u043A \u0447\u0442\u043E \u0441\u043B\u043E\u0436\u043D\u043E \u0441\u043A\u0430\u0437\u0430\u0442\u044C,!nasd&e\u043D\u0430\u0441\u043A\u043E\u043B\u044C\u043A\u043E \u0441\u0438\u043B\u044C\u043D\u043E \u0432\u0430\u043C \u043F\u043E\u043C\u043E\u0436\u0435\u0442 \u044D\u0442\u043E\u0442 \u043D\u0430\u0432\u044B\u043A.!nasd&e\u041F\u0440\u043E\u0441\u0442\u043E \u043F\u043E\u043C\u043D\u0438\u0442\u0435, \u0447\u0442\u043E \u0447\u0435\u043C \u0432\u044B\u0448\u0435 \u0432\u0430\u0448 \u043D\u0430\u0432\u044B\u043A \u0420\u0430\u0441\u043A\u043E\u043F\u043E\u043A,!nasd&e\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.!nasd&e\u0422\u0430\u043A\u0436\u0435 \u043D\u0435 \u0437\u0430\u0431\u044B\u0432\u0430\u0439\u0442\u0435, \u0447\u0442\u043E \u0434\u043B\u044F \u043A\u0430\u0436\u0434\u043E\u0433\u043E \u0441\u043E\u0432\u043C\u0435\u0441\u0442\u0438\u043C\u043E\u0433\u043E!nasd&e\u0441 \u0420\u0430\u0441\u043A\u043E\u043F\u043A\u0430\u043C\u0438 \u0431\u043B\u043E\u043A\u0430 \u0438\u043C\u0435\u044E\u0442\u0441\u044F \u0441\u0432\u043E\u0438 \u0443\u043D\u0438\u043A\u0430\u043B\u044C\u043D\u044B\u0435 \u0441\u043E\u043A\u0440\u043E\u0432\u0438\u0449\u0430.!nasd&e\u0414\u0440\u0443\u0433\u0438\u043C\u0438 \u0441\u043B\u043E\u0432\u0430\u043C\u0438, \u0432 \u0437\u0435\u043C\u043B\u0435 \u0432\u044B \u043D\u0430\u0439\u0434\u0435\u0442\u0435 \u0434\u0440\u0443\u0433\u0438\u0435 \u0441\u043E\u043A\u0440\u043E\u0432\u0438\u0449\u0430,!nasd&e\u043D\u0435\u0436\u0435\u043B\u0438, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, \u0432 \u0433\u0440\u0430\u0432\u0438\u0438. +Guides.Excavation.Section.5=&3\u041F\u0440\u0438\u043C\u0435\u0447\u0430\u043D\u0438\u044F \u043E \u0420\u0430\u0441\u043A\u043E\u043F\u043A\u0430\u0445\\:!nasd&e\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.!nasd&e\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=&3\u041E \u043D\u0430\u0432\u044B\u043A\u0435 \u0420\u044B\u0431\u043E\u043B\u043E\u0432\u0441\u0442\u0432\u043E\\:!nasd&e\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\\!!nasd&e\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\\!!nasd!nasd&3\u041F\u041E\u041B\u0423\u0427\u0415\u041D\u0418\u0415 \u041E\u041F\u042B\u0422\u0410\\:!nasd&e\u041B\u043E\u0432\u0438\u0442\u0435 \u0440\u044B\u0431\u0443. +Guides.Fishing.Section.1=&3\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 \u0441\u043E\u043A\u0440\u043E\u0432\u0438\u0449\u0430\u043C\u0438?!nasd&e\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!nasd&e\u0432\u0440\u0435\u043C\u044F \u0440\u044B\u0431\u0430\u043B\u043A\u0438, \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.!nasd&e\u0412\u0441\u0435 \u0441\u043E\u043A\u0440\u043E\u0432\u0438\u0449\u0430 \u0420\u044B\u0431\u043E\u043B\u043E\u0432\u0441\u0442\u0432\u0430 \u0438\u043C\u0435\u044E\u0442 \u0448\u0430\u043D\u0441!nasd&e\u043F\u043E\u0439\u043C\u0430\u0442\u044C\u0441\u044F \u043D\u0430 \u043B\u044E\u0431\u043E\u043C \u0443\u0440\u043E\u0432\u043D\u0435. \u0428\u0430\u043D\u0441 \u0432\u044B\u043F\u0430\u0434\u0435\u043D\u0438\u044F!nasd&e\u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043E\u0442 \u0440\u0435\u0434\u043A\u043E\u0441\u0442\u0438 \u0441\u043E\u043A\u0440\u043E\u0432\u0438\u0449\u0430.!nasd&e\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,!nasd&e\u0442\u0435\u043C \u0431\u043E\u043B\u044C\u0448\u0435 \u0448\u0430\u043D\u0441 \u043D\u0430\u0439\u0442\u0438 \u0445\u043E\u0440\u043E\u0448\u0438\u0435 \u0441\u043E\u043A\u0440\u043E\u0432\u0438\u0449\u0430. +Guides.Fishing.Section.2=&3\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 \u0440\u044B\u0431\u0430\u043B\u043A\u0430?!nasd&e\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!nasd&e\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!nasd&e\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=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u041C\u0430\u0441\u0442\u0435\u0440-\u0440\u044B\u0431\u043E\u043B\u043E\u0432?!nasd&&e\u042D\u0442\u043E\u0442 \u043F\u0430\u0441\u0441\u0438\u0432\u043D\u044B\u0439 \u043D\u0430\u0432\u044B\u043A \u0443\u0432\u0435\u043B\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0448\u0430\u043D\u0441 \u0443\u043B\u043E\u0432\u0430 \u0432\u043E \u0432\u0440\u0435\u043C\u044F \u0440\u044B\u0431\u0430\u043B\u043A\u0438.!nasd&e\u041A\u043E\u0433\u0434\u0430 \u0432\u044B \u0440\u0430\u0437\u0431\u043B\u043E\u043A\u0438\u0440\u0443\u0435\u0442\u0435 \u044D\u0442\u043E \u0443\u043C\u0435\u043D\u0438\u0435, \u0440\u044B\u0431\u0430\u043B\u043A\u0430 \u0432 \u043B\u043E\u0434\u043A\u0435!nasd&e\u0443\u0432\u0435\u043B\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0448\u0430\u043D\u0441\u044B \u043F\u043E\u0439\u043C\u0430\u0442\u044C \u0440\u044B\u0431\u0443. +Guides.Fishing.Section.4=&3\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?!nasd&e\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\u044B\u0442\u0440\u044F\u0445\u0438\u0432\u0430\u0442\u044C \u043F\u0440\u0435\u0434\u043C\u0435\u0442\u044B!nasd&e\u0438\u0437 \u043C\u043E\u0431\u043E\u0432, \u0446\u0435\u043F\u043B\u044F\u044F \u0438\u0445 \u0443\u0434\u043E\u0447\u043A\u043E\u0439.!nasd&e\u042D\u0442\u043E \u0431\u0443\u0434\u0443\u0442 \u043F\u0440\u0435\u0434\u043C\u0435\u0442\u044B, \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u0432\u044B\u043F\u0430\u0434\u0430\u044E\u0442 \u0438\u0437 \u043D\u0438\u0445 \u043F\u0440\u0438 \u0441\u043C\u0435\u0440\u0442\u0438.!nasd&e\u0422\u0430\u043A\u0436\u0435 \u0435\u0441\u0442\u044C \u0448\u0430\u043D\u0441 \u043F\u043E\u043B\u0443\u0447\u0438\u0442\u044C \u0447\u0435\u0440\u0435\u043F\u0430 \u043C\u043E\u0431\u043E\u0432, \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u043E\u0431\u044B\u0447\u043D\u043E!nasd&e\u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B \u0432 \u0440\u0435\u0436\u0438\u043C\u0435 \u0432\u044B\u0436\u0438\u0432\u0430\u043D\u0438\u044F. +Guides.Fishing.Section.5=&3\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 \u0434\u0438\u0435\u0442\u0430?!nasd&e\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!nasd&e\u043F\u0440\u0438 \u043F\u043E\u0435\u0434\u0430\u043D\u0438\u0438 \u0440\u044B\u0431\u044B. +Guides.Fishing.Section.6=&3\u041F\u0440\u0438\u043C\u0435\u0447\u0430\u043D\u0438\u044F \u043E \u0420\u044B\u0431\u043E\u043B\u043E\u0432\u0441\u0442\u0432\u0435\\:!nasd&e\u041F\u0440\u0435\u0434\u043C\u0435\u0442\u044B \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\u0438\u0432\u0430\u0435\u043C\u044B,!nasd&e\u0442\u0430\u043A \u0447\u0442\u043E \u043D\u0430 \u0440\u0430\u0437\u043D\u044B\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u0445 \u0438 \u0434\u043E\u0431\u044B\u0447\u0430 \u043C\u043E\u0436\u0435\u0442 \u0431\u044B\u0442\u044C \u0440\u0430\u0437\u043D\u0430\u044F. +##Herbalism +Guides.Herbalism.Section.0=&3\u041E \u043D\u0430\u0432\u044B\u043A\u0435 \u0422\u0440\u0430\u0432\u043D\u0438\u0447\u0435\u0441\u0442\u0432\u043E\\:!nasd&e\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.!nasd!nasd&3\u041F\u041E\u041B\u0423\u0427\u0415\u041D\u0418\u0415 \u041E\u041F\u042B\u0422\u0410\\:!nasd&e\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=&3\u041F\u043E\u0434\u0445\u043E\u0434\u044F\u0449\u0438\u0435 \u0440\u0430\u0441\u0442\u0435\u043D\u0438\u044F\\:!nasd&e\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, !nasd&e\u0422\u044B\u043A\u0432\u044B, \u0421\u0430\u0445\u0430\u0440\u043D\u044B\u0439 \u0442\u0440\u043E\u0441\u0442\u043D\u0438\u043A, \u041A\u0430\u043A\u0430\u043E-\u0431\u043E\u0431\u044B, \u0426\u0432\u0435\u0442\u044B, \u041A\u0430\u043A\u0442\u0443\u0441\u044B,!nasd&e\u0413\u0440\u0438\u0431\u044B, \u041D\u0435\u0437\u0435\u0440\u0441\u043A\u0438\u0439 \u043D\u0430\u0440\u043E\u0441\u0442, \u041A\u0443\u0432\u0448\u0438\u043D\u043A\u0438, \u041B\u0438\u0430\u043D\u044B. +Guides.Herbalism.Section.2=&3\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?!nasd&e\u041E\u0437\u0435\u043B\u0435\u043D\u0435\u043D\u0438\u0435 - \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u0435 \u0443\u043C\u0435\u043D\u0438\u0435, \u043A\u043E\u0442\u043E\u0440\u043E\u0435!nasd&e\u0430\u043A\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u0442\u0441\u044F \u043D\u0430\u0436\u0430\u0442\u0438\u0435\u043C \u041F\u041A\u041C \u0441 \u043C\u043E\u0442\u044B\u0433\u043E\u0439 \u0432 \u0440\u0443\u043A\u0435.!nasd&e\u041E\u0437\u0435\u043B\u0435\u043D\u0435\u043D\u0438\u0435 \u0434\u0430\u0435\u0442 \u0448\u0430\u043D\u0441 3x \u0434\u043E\u0431\u044B\u0447\u0438 \u043F\u0440\u0438 \u0441\u0431\u043E\u0440\u0435!nasd&e\u0440\u0430\u0441\u0442\u0435\u043D\u0438\u0439. \u0422\u0430\u043A\u0436\u0435 \u043E\u043D\u043E \u0434\u0430\u0435\u0442 \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E\u0441\u0442\u044C !nasd&e\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 !nasd&e\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. +Guides.Herbalism.Section.3=&3\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 \u043F\u0440\u0438\u043A\u043E\u0441\u043D\u043E\u0432\u0435\u043D\u0438\u0435 (\u043D\u0430 \u0443\u0440\u043E\u0436\u0430\u0439)?!nasd&e\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!nasd&e\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. !nasd&e\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=&3\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 \u043F\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)?!nasd&e\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!nasd&e"\u0436\u0438\u0432\u044B\u0435" \u0432\u0430\u0440\u0438\u0430\u043D\u0442\u044B. \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!nasd&e\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\u0435\u0447\u043A\u043E. +Guides.Herbalism.Section.5=&3\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 \u0434\u0438\u0435\u0442\u0430?!nasd&e\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!nasd&e\u043F\u0440\u0438 \u043F\u043E\u0435\u0434\u0430\u043D\u0438\u0438 \u0445\u043B\u0435\u0431\u0430, \u043F\u0435\u0447\u0435\u043D\u044C\u044F, \u0430\u0440\u0431\u0443\u0437\u0430, \u0433\u0440\u0438\u0431\u043D\u043E\u0433\u043E \u0441\u0443\u043F\u0430,!nasd&e\u043C\u043E\u0440\u043A\u043E\u0432\u0438 \u0438 \u043A\u0430\u0440\u0442\u043E\u0448\u043A\u0438. +Guides.Herbalism.Section.6=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u0425\u0430\u0439\u043B\u0438\u0439\u0441\u043A\u0430\u044F \u0443\u0434\u0430\u0447\u0430?!nasd&e\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!nasd&e\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=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u0414\u0432\u043E\u0439\u043D\u0430\u044F \u0434\u043E\u0431\u044B\u0447\u0430?!nasd&e\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\u0435 \u0443\u0440\u043E\u0436\u0430\u044F \u043F\u0440\u0438!nasd&e\u0432\u043E \u0432\u0440\u0435\u043C\u044F \u0435\u0433\u043E \u0441\u0431\u043E\u0440\u0430. +##Mining +Guides.Mining.Section.0=&3\u041E \u043D\u0430\u0432\u044B\u043A\u0435 \u0428\u0430\u0445\u0442\u0435\u0440\u0441\u0442\u0432\u043E\\:!nasd&e\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,!nasd&e\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.!nasd!nasd&3\u041F\u041E\u041B\u0423\u0427\u0415\u041D\u0418\u0415 \u041E\u041F\u042B\u0422\u0410\\:!nasd&e\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.!nasd&e\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=&3\u041F\u043E\u0434\u0445\u043E\u0434\u044F\u0449\u0438\u0435 \u0431\u043B\u043E\u043A\u0438\\:!nasd&e\u041A\u0430\u043C\u0435\u043D\u044C, \u041A\u0430\u043C\u0435\u043D\u043D\u044B\u0439 \u0443\u0433\u043E\u043B\u044C, \u0416\u0435\u043B\u0435\u0437\u043D\u0430\u044F \u0440\u0443\u0434\u0430, \u0417\u043E\u043B\u043E\u0442\u0430\u044F \u0440\u0443\u0434\u0430, \u0410\u043B\u043C\u0430\u0437\u043D\u0430\u044F \u0440\u0443\u0434\u0430,!nasd&e\u0420\u0435\u0434\u0441\u0442\u043E\u0443\u043D\u043E\u0432\u0430\u044F \u0440\u0443\u0434\u0430, \u041B\u0430\u0437\u0443\u0440\u0438\u0442\u043E\u0432\u0430\u044F \u0440\u0443\u0434\u0430, \u041E\u0431\u0441\u0438\u0434\u0438\u0430\u043D, \u0417\u0430\u043C\u0448\u0435\u043B\u044B\u0439 \u0431\u0443\u043B\u044B\u0436\u043D\u0438\u043A,!nasd&e\u042D\u043D\u0434\u0435\u0440\u043D\u044F\u043A, \u0421\u0432\u0435\u0442\u044F\u0449\u0438\u0439\u0441\u044F \u043A\u0430\u043C\u0435\u043D\u044C, \u041D\u0435\u0437\u0435\u0440\u0430\u043A. +Guides.Mining.Section.2=&3\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\u043A\u0440\u0443\u0448\u0438\u0442\u0435\u043B\u044C\\:!nasd&e\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\u043E\u0434\u0433\u043E\u0442\u043E\u0432\u0438\u0442\u044C \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442.!nasd&e\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 \u043D\u0430\u0447\u0430\u043B\u0430 \u0434\u043E\u0431\u044B\u0447\u0438!nasd&e\u043F\u043E\u0434\u0445\u043E\u0434\u044F\u0449\u0438\u0445 \u0431\u043B\u043E\u043A\u043E\u0432, \u0447\u0442\u043E \u0430\u043A\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u0421\u0443\u043F\u0435\u0440\u043A\u0440\u0443\u0448\u0438\u0442\u0435\u043B\u044C. +Guides.Mining.Section.3=&3\u0427\u0442\u043E \u0442\u0430\u043A\u043E\u0435 \u0421\u0443\u043F\u0435\u0440\u043A\u0440\u0443\u0448\u0438\u0442\u0435\u043B\u044C?!nasd&e\u0421\u0443\u043F\u0435\u0440\u043A\u0440\u0443\u0448\u0438\u0442\u0435\u043B\u044C - \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.!nasd&e\u041E\u043D\u043E \u0443\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u0448\u0430\u043D\u0441 \u043F\u043E\u043B\u0443\u0447\u0438\u0442\u044C \u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0435 \u043F\u0440\u0435\u0434\u043C\u0435\u0442\u044B \u0438!nasd&e\u0440\u0430\u0437\u0440\u0443\u0448\u0430\u0435\u0442 \u043F\u043E\u0434\u0445\u043E\u0434\u044F\u0449\u0438\u0435 \u0431\u043B\u043E\u043A\u0438 \u0441 \u043E\u0434\u043D\u043E\u0433\u043E \u0443\u0434\u0430\u0440\u0430. +Guides.Mining.Section.4=&3\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 \u0434\u043E\u0431\u044B\u0447\u0430\\:!nasd&e\u0421 \u043A\u0438\u0440\u043A\u043E\u0439 \u0432 \u0440\u0443\u043A\u0435,!nasd&e\u043F\u0440\u0438\u0441\u044F\u0434\u044C\u0442\u0435 \u0438 \u043D\u0430\u0436\u043C\u0438\u0442\u0435 \u041F\u041A\u041C \u043F\u043E \u0434\u0438\u043D\u0430\u043C\u0438\u0442\u0443 \u0441 \u0440\u0430\u0441\u0441\u0442\u043E\u044F\u043D\u0438\u044F. \u042D\u0442\u043E !nasd&e\u043C\u0433\u043D\u043E\u0432\u0435\u043D\u043D\u043E \u043F\u0440\u0438\u0432\u0435\u0434\u0435\u0442 \u043A \u043F\u043E\u0434\u0440\u044B\u0432\u0443 \u0434\u0438\u043D\u0430\u043C\u0438\u0442\u0430. +Guides.Mining.Section.5=&3\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 \u0434\u043E\u0431\u044B\u0447\u0430?!nasd&e\u041F\u043E\u0434\u0440\u044B\u0432\u043D\u0430\u044F \u0434\u043E\u0431\u044B\u0447\u0430 - \u0443\u043C\u0435\u043D\u0438\u0435 \u0441 \u043E\u0442\u043A\u0430\u0442\u043E\u043C, \u0441\u0432\u044F\u0437\u0430\u043D\u043D\u043E\u0435 \u0441 \u043D\u0430\u0432\u044B\u043A\u043E\u043C!nasd&e\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 \u0434\u043E\u0431\u044B\u0447\u0435 \u0441 \u0434\u0438\u043D\u0430\u043C\u0438\u0442\u043E\u043C \u0438 \u043F\u043E\u0437\u0432\u043E\u043B\u044F\u0435\u0442!nasd&e\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\u043E\u0431\u0435\u043D\u043D\u043E\u0441\u0442\u0438 \u041F\u043E\u0434\u0440\u044B\u0432\u043D\u043E\u0439 \u0434\u043E\u0431\u044B\u0447\u0438. !nasd&e\u041F\u0435\u0440\u0432\u0430\u044F - \u0443\u043C\u0435\u043D\u0438\u0435 \u0411\u043E\u043B\u044C\u0448\u0438\u0435 \u0431\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!nasd&e\u0432\u0437\u0440\u044B\u0432\u0430 \u0434\u0438\u043D\u0430\u043C\u0438\u0442\u0430. \u0412\u0442\u043E\u0440\u0430\u044F - \u0443\u043C\u0435\u043D\u0438\u0435 \u042D\u043A\u0441\u043F\u0435\u0440\u0442\u0438\u0437\u0430 \u043F\u043E\u0434\u0440\u044B\u0432\u043E\u0432, \u043A\u043E\u0442\u043E\u0440\u043E\u0435 \u0443\u043C\u0435\u043D\u044C\u0448\u0430\u0435\u0442 !nasd&e\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!nasd&e\u0434\u043E\u0431\u044B\u0447\u0438 \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\u043E\u0431\u044B\u0447\u0438 \u043F\u043E\u043B\u0435\u0437\u043D\u044B\u0445 \u0440\u0443\u0434. +##Repair +Guides.Repair.Section.0=&3\u041E \u043D\u0430\u0432\u044B\u043A\u0435 \u0420\u0435\u043C\u043E\u043D\u0442\\:!nasd&e\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!nasd&e\u0431\u0440\u043E\u043D\u0438 \u0438 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u043E\u0432.!nasd!nasd&3\u041F\u043E\u043B\u0443\u0447\u0435\u043D\u0438\u0435 \u043E\u043F\u044B\u0442\u0430\\:!nasd&e\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 \u043D\u0430\u043A\u043E\u0432\u0430\u043B\u044C\u043D\u044E mcMMO. !nasd&e\u041D\u0430\u043A\u043E\u0432\u0430\u043B\u044C\u043D\u0435\u0439 \u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u043F\u043E\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u043D\u044B\u0439 \u0436\u0435\u043B\u0435\u0437\u043D\u044B\u0439 \u0431\u043B\u043E\u043A, \u0438 \u0435\u0451!nasd&e\u043D\u0435 \u0441\u043B\u0435\u0434\u0443\u0435\u0442 \u043F\u0443\u0442\u0430\u0442\u044C \u0441 \u043E\u0431\u044B\u0447\u043D\u043E\u0439 \u043D\u0430\u043A\u043E\u0432\u0430\u043B\u044C\u043D\u0435\u0439. +Guides.Repair.Section.1=&3\u041A\u0430\u043A \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u043D\u0430\u0432\u044B\u043A \u0420\u0435\u043C\u043E\u043D\u0442?!nasd&e\u0420\u0430\u0437\u043C\u0435\u0441\u0442\u0438\u0442\u0435 \u043D\u0430\u043A\u043E\u0432\u0430\u043B\u044C\u043D\u044E mcMMO \u0438 \u043A\u043B\u0438\u043A\u043D\u0438\u0442\u0435 \u043F\u043E \u043D\u0435\u0439 \u041F\u041A\u041C \u0434\u043B\u044F!nasd&e\u043F\u043E\u0447\u0438\u043D\u043A\u0438 \u043F\u0440\u0435\u0434\u043C\u0435\u0442\u0430 \u0432 \u0440\u0443\u043A\u0435. \u0420\u0430\u0441\u0445\u043E\u0434\u0443\u0435\u0442 1 \u0441\u044B\u0440\u044C\u0435 \u0437\u0430 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0435. +Guides.Repair.Section.2=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u041C\u0430\u0441\u0442\u0435\u0440\u0441\u0442\u0432\u043E \u0440\u0435\u043C\u043E\u043D\u0442\u0430?!nasd&e\u0423\u043C\u0435\u043D\u0438\u0435 \u041C\u0430\u0441\u0442\u0435\u0440\u0441\u0442\u0432\u043E \u0440\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.!nasd&e\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=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u0421\u0443\u043F\u0435\u0440\u0440\u0435\u043C\u043E\u043D\u0442?!nasd&e\u0421\u0443\u043F\u0435\u0440\u0440\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!nasd&e\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!nasd&e\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=&3\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 \u043A\u043E\u0432\u043A\u0430?!nasd&e\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!nasd&e\u0441 \u043E\u043F\u0440\u0435\u0434\u0435\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. !nasd&e\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,!nasd&e\u0441\u043D\u0438\u0437\u0438\u0442\u044C\u0441\u044F, \u0438\u043B\u0438 \u0432\u043E\u0432\u0441\u0435 \u0438\u0441\u0447\u0435\u0437\u043D\u0443\u0442\u044C. +##Salvage +Guides.Salvage.Section.0=&3\u041E \u0420\u0430\u0437\u0431\u043E\u0440\u043A\u0435\\:!nasd&e\u0420\u0430\u0437\u0431\u043E\u0440\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!nasd&e\u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u043E\u0432.!nasd!nasd&3\u041F\u041E\u041B\u0423\u0427\u0415\u041D\u0418\u0415 \u041E\u041F\u042B\u0422\u0410\\:!nasd&e\u0420\u0430\u0437\u0431\u043E\u0440\u043A\u0430 \u044D\u0442\u043E \u0434\u043E\u0447\u0435\u0440\u043D\u0438\u0439 \u043D\u0430\u0432\u044B\u043A \u041F\u043E\u0447\u0438\u043D\u043A\u0438 \u0438 \u0420\u044B\u0431\u0430\u043B\u043A\u0438. \u0412\u0430\u0448 \u0443\u0440\u043E\u0432\u0435\u043D\u044C!nasd&e\u0440\u0430\u0437\u0431\u043E\u0440\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=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0420\u0430\u0437\u0431\u043E\u0440\u043A\u0430?!nasd&e\u0420\u0430\u0437\u043C\u0435\u0441\u0442\u0438\u0442\u0435 \u0420\u0430\u0437\u0431\u043E\u0440\u043E\u0447\u043D\u0443\u044E \u043D\u0430\u043A\u043E\u0432\u0430\u043B\u044C\u043D\u044E mcMMO \u0438 \u043A\u043B\u0438\u043A\u043D\u0438\u0442\u0435 \u043F\u043E !nasd&e\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. \u042D\u0442\u043E \u0443\u043D\u0438\u0447\u0442\u043E\u0436\u0438\u0442!nasd&e\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\u044B\u0435 \u043D\u0430 \u043D\u0435\u0433\u043E \u043C\u0430\u0442\u0435\u0440\u0438\u0430\u043B\u044B.!nasd!nasd&e\u041D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, \u0440\u0430\u0437\u0431\u043E\u0440\u043A\u0430 \u0436\u0435\u043B\u0435\u0437\u043D\u043E\u0439 \u043A\u0438\u0440\u043A\u0438 \u0432\u0435\u0440\u043D\u0435\u0442 \u0432\u0430\u043C \u0436\u0435\u043B\u0435\u0437\u043D\u044B\u0435 \u0441\u043B\u0438\u0442\u043A\u0438. +Guides.Salvage.Section.2=&3\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 \u0440\u0430\u0437\u0431\u043E\u0440\u043A\u0430?!nasd&e\u042D\u0442\u043E \u0443\u043C\u0435\u043D\u0438\u0435 \u043F\u043E\u0437\u0432\u043E\u043B\u044F\u0435\u0442 \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.!nasd&e\u041A\u0430\u0447\u0435\u0441\u0442\u0432\u043E \u0440\u0430\u0437\u0431\u043E\u0440\u043A\u0438 \u043F\u043E\u0432\u044B\u0448\u0430\u0435\u0442\u0441\u044F \u0432\u043C\u0435\u0441\u0442\u0435 \u0441 \u0443\u0440\u043E\u0432\u043D\u0435\u043C. \u0427\u0435\u043C \u043E\u043D\u043E \u0431\u043E\u043B\u044C\u0448\u0435,!nasd&e\u0442\u0435\u043C \u0431\u043E\u043B\u044C\u0448\u0435 \u043C\u0430\u0442\u0435\u0440\u0438\u0430\u043B\u043E\u0432 \u0432\u044B \u0441\u043C\u043E\u0436\u0435\u0442\u0435 \u043F\u043E\u043B\u0443\u0447\u0438\u0442\u044C \u043E\u0431\u0440\u0430\u0442\u043D\u043E.!nasd&e\u0421 \u0423\u043B\u0443\u0447\u0448\u0435\u043D\u043D\u043E\u0439 \u0440\u0430\u0437\u0431\u043E\u0440\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,!nasd&e\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 \u043F\u043E\u0432\u0440\u0435\u0436\u0434\u0435\u043D. \u0412\u0430\u043C \u043D\u0435 \u043D\u0443\u0436\u043D\u043E \u0432\u043E\u043B\u043D\u043E\u0432\u0430\u0442\u044C\u0441\u044F!nasd&e\u043E\u0431 \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=&3\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\\:!nasd&e\u041F\u0440\u0435\u0434\u043F\u043E\u043B\u043E\u0436\u0438\u043C \u043C\u044B \u0440\u0430\u0437\u0431\u0438\u0440\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%.!nasd&e\u042D\u0442\u043E \u0437\u043D\u0430\u0447\u0438\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!nasd&e\u043F\u043E\u043B\u0443\u0447\u0438\u0442\u044C - \u0432\u0441\u0435\u0433\u043E 2 (\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!nasd&e33,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\u0435 \u043A\u0430\u0447\u0435\u0441\u0442\u0432\u043E!nasd&e\u0440\u0430\u0437\u0431\u043E\u0440\u043A\u0438 \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.!nasd&e\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 "\u043F\u043E\u043B\u043D\u0443\u044E \u0441\u0442\u043E\u0438\u043C\u043E\u0441\u0442\u044C",!nasd&e\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=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u041C\u0430\u0433\u0438\u0447\u0435\u0441\u043A\u0430\u044F \u0440\u0430\u0437\u0431\u043E\u0440\u043A\u0430?!nasd&e\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!nasd&e\u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u0442\u0435 \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!nasd&e\u0432\u044B \u043C\u043E\u0436\u0435\u0442\u0435 \u043F\u043E\u043B\u0443\u0447\u0438\u0442\u044C \u043F\u043E\u043B\u043D\u0443\u044E \u0432\u0441\u0435 \u0438\u043B\u0438 \u043B\u0438\u0448\u044C \u0447\u0430\u0441\u0442\u044C \u0437\u0430\u0447\u0430\u0440\u043E\u0432\u0430\u043D\u0438\u0439.!nasd!nasd&e\u041A\u043E\u0433\u0434\u0430 \u0432\u044B \u0438\u0437\u0432\u043B\u0435\u043A\u0430\u0435\u0442\u0435 \u0447\u0430\u0441\u0442\u044C \u0437\u0430\u0447\u0430\u0440\u043E\u0432\u0430\u043D\u0438\u0439, \u0442\u043E \u0437\u0430\u0447\u0430\u0440\u043E\u0432\u0430\u043D\u0438\u044F!nasd&e\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\u044F,!nasd&e\u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u0431\u044B\u043B\u0438 \u043D\u0430 \u043F\u0440\u0435\u0434\u043C\u0435\u0442\u0435. +##Smelting +Guides.Smelting.Section.0=\u0421\u043A\u043E\u0440\u043E... +##Swords +Guides.Swords.Section.0=&3\u041E \u043D\u0430\u0432\u044B\u043A\u0435 \u041C\u0435\u0447\u0438\\:!nasd&e\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.!nasd!nasd&3\u041F\u041E\u041B\u0423\u0427\u0415\u041D\u0418\u0415 \u041E\u041F\u042B\u0422\u0410\\:!nasd&e\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!nasd&e\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=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u0420\u0443\u0431\u044F\u0449\u0438\u0439 \u0443\u0434\u0430\u0440?!nasd&e\u0420\u0443\u0431\u044F\u0449\u0438\u0439 \u0443\u0434\u0430\u0440 - \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!nasd&e\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!nasd&e\u0443\u0434\u0430\u0440 \u043F\u043E \u043E\u0431\u043B\u0430\u0441\u0442\u0438, \u0447\u0442\u043E \u043D\u0430\u043D\u043E\u0441\u044F\u0449\u0438\u0439 \u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u043E 25% \u0443\u0440\u043E\u043D\u0430!nasd&e\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=&3\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?!nasd&e\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!nasd&e\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=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u0420\u0430\u0437\u0440\u044B\u0432?!nasd&e\u0420\u044B\u0437\u0440\u044B\u0432 \u043D\u0430\u043D\u043E\u0441\u0438\u0442 \u043F\u0440\u043E\u0442\u0438\u0432\u043D\u0438\u043A\u0430\u043C \u0443\u0440\u043E\u043D \u043A\u0430\u0436\u0434\u044B\u0435 2 \u0441\u0435\u043A\u0443\u043D\u0434\u044B.!nasd&e\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!nasd&e\u0438\u043B\u0438 \u043D\u0435 \u043D\u0430\u0441\u0442\u0443\u043F\u0438\u0442 \u0441\u043C\u0435\u0440\u0442\u044C.!nasd&e\u041F\u0440\u043E\u0434\u043E\u043B\u0436\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u044C \u044D\u0444\u0444\u0435\u043A\u0442\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043E\u0442 \u0443\u0440\u043E\u0432\u043D\u044F \u043D\u0430\u0432\u044B\u043A\u0430 \u041C\u0435\u0447\u0435\u0439. +##Taming +Guides.Taming.Section.0=&3\u041E \u043D\u0430\u0432\u044B\u043A\u0435 \u0423\u043A\u0440\u043E\u0449\u0435\u043D\u0438\u0435\\:!nasd&e\u0423\u043A\u0440\u043E\u0449\u0435\u043D\u0438\u0435 \u0434\u0430\u0435\u0442 \u0440\u0430\u0437\u043B\u0438\u0447\u043D\u044B\u0435 \u0431\u043E\u043D\u0443\u0441\u044B \u0432 \u0431\u0438\u0442\u0432\u0430\u0445 \u0432\u043C\u0435\u0441\u0442\u0435!nasd&e\u0441 \u043F\u0440\u0438\u0440\u0443\u0447\u0435\u043D\u043D\u044B\u043C\u0438 \u0432\u043E\u043B\u043A\u0430\u043C\u0438.!nasd!nasd&3\u041F\u041E\u041B\u0423\u0427\u0415\u041D\u0418\u0415 \u041E\u041F\u042B\u0422\u0410\\:!nasd&e\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!nasd&e\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=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u0417\u043E\u0432 \u043F\u0440\u0438\u0440\u043E\u0434\u044B?!nasd&e\u0417\u043E\u0432 \u043F\u0440\u0438\u0440\u043E\u0434\u044B - \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!nasd&e\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!nasd&e\u0441\u0434\u0435\u043B\u0430\u0442\u044C \u043F\u0440\u0438\u0441\u0435\u0432 \u0438 \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=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u041F\u043E\u0437\u043D\u0430\u043D\u0438\u0435 \u0437\u0432\u0435\u0440\u0435\u0439?!nasd&e\u041F\u043E\u0437\u043D\u0430\u043D\u0438\u0435 \u0437\u0432\u0435\u0440\u0435\u0439 \u043F\u043E\u0437\u0432\u043E\u043B\u044F\u0435\u0442 \u043F\u0440\u043E\u0432\u0435\u0440\u044F\u0442\u044C \u043F\u0438\u0442\u043E\u043C\u0446\u0435\u0432!nasd&e\u0438 \u043F\u043E\u043B\u0443\u0447\u0430\u0442\u044C \u0441\u0442\u0430\u0442\u044B \u043E \u043D\u0438\u0445. \u041A\u043B\u0438\u043A\u043D\u0438\u0442\u0435 \u041B\u041A\u041C \u043A\u043E\u0441\u0442\u044C\u044E \u043F\u043E \u0432\u043E\u043B\u043A\u0443 \u0438\u043B\u0438 !nasd&e\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 \u041F\u043E\u0437\u043D\u0430\u043D\u0438\u0435 \u0437\u0432\u0435\u0440\u0435\u0439. +Guides.Taming.Section.3=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u0423\u043A\u0443\u0441?!nasd&e\u0423\u043A\u0443\u0441 - \u043F\u0430\u0441\u0441\u0438\u0432\u043D\u043E\u0435 \u0443\u043C\u0435\u043D\u0438\u0435, \u0434\u0430\u044E\u0449\u0435\u0435 \u0448\u0430\u043D\u0441 \u0442\u043E\u0433\u043E, \u0447\u0442\u043E!nasd&e\u0430\u0442\u0430\u043A\u0430 \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=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u041E\u0441\u0442\u0440\u044B\u0435 \u043A\u043E\u0433\u0442\u0438?!nasd&e\u041E\u0441\u0442\u0440\u044B\u0435 \u043A\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 \u0431\u043E\u043D\u0443\u0441\u043D\u044B\u0439!nasd&e\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=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u0417\u043D\u0430\u043D\u0438\u0435 \u0441\u0440\u0435\u0434\u044B?!nasd&e\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\u044E\u0449\u0435\u0435 \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!nasd&e\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 \u043A\u0430\u043A\u0442\u0443\u0441 \u0438\u043B\u0438 \u043B\u0430\u0432\u0430. \u041E\u043D\u043E \u0442\u0430\u043A\u0436\u0435!nasd&e\u0434\u0430\u0435\u0442 \u0432\u0430\u0448\u0438\u043C \u0432\u043E\u043B\u043A\u0430\u043C \u0438\u043C\u043C\u0443\u043D\u0438\u0442\u0435\u0442 \u043A \u043F\u043E\u043B\u0443\u0447\u0435\u043D\u0438\u044E \u0443\u0440\u043E\u043D\u0430 \u043F\u0440\u0438 \u043F\u0430\u0434\u0435\u043D\u0438\u0438. +Guides.Taming.Section.6=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u0413\u0443\u0441\u0442\u043E\u0439 \u043C\u0435\u0445?!nasd&e\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\u044E\u0449\u0435\u0435 \u043F\u043E\u043B\u0443\u0447\u0430\u0435\u043C\u044B\u0439 \u0432\u0430\u0448\u0438\u043C\u0438!nasd&e\u0432\u043E\u043B\u043A\u0430\u043C\u0438 \u0443\u0440\u043E\u043D \u0438 \u043D\u0430\u0434\u0435\u043B\u044F\u044E\u0449\u0435\u0435 \u0438\u0445 \u043E\u0433\u043D\u0435\u0441\u0442\u043E\u0439\u043A\u043E\u0441\u0442\u044C\u044E. +Guides.Taming.Section.7=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u0423\u0434\u0430\u0440\u043E\u043F\u0440\u043E\u0447\u043D\u043E\u0441\u0442\u044C?!nasd&e\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\u044E\u0449\u0435\u0435 \u043F\u043E\u043B\u0443\u0447\u0430\u0435\u043C\u044B\u0439!nasd&e\u0432\u0430\u0448\u0438\u043C\u0438 \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=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u0411\u044B\u0441\u0442\u0440\u043E\u0435 \u043F\u0438\u0442\u0430\u043D\u0438\u0435?!nasd&e\u042D\u0442\u043E \u043F\u0430\u0441\u0441\u0438\u0432\u043D\u043E\u0435 \u0443\u043C\u0435\u043D\u0438\u0435, \u0434\u0430\u044E\u0449\u0435\u0435 \u0432\u0430\u0448\u0438\u043C \u0432\u043E\u043B\u043A\u0430\u043C \u0448\u0430\u043D\u0441!nasd&e\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=&3\u041E \u043D\u0430\u0432\u044B\u043A\u0435 \u0411\u0435\u0437\u043E\u0440\u0443\u0436\u043D\u044B\u0439\\:!nasd&e\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!nasd&e\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.!nasd!nasd&3\u041F\u041E\u041B\u0423\u0427\u0415\u041D\u0418\u0415 \u041E\u041F\u042B\u0422\u0410\\:!nasd&e\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!nasd&e\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=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u0411\u0435\u0440\u0441\u0435\u0440\u043A?!nasd&e\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.!nasd&e\u0412 \u0440\u0435\u0436\u0438\u043C\u0435 \u0431\u0435\u0440\u0441\u0435\u0440\u043A\u0430 \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!nasd&e\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 \u043D\u0435\u0442\u0432\u0435\u0440\u0434\u044B \u0431\u043B\u043E\u043A\u0438, \u0432\u0440\u043E\u0434\u0435 \u0437\u0435\u043C\u043B\u0438 \u0438 \u0434\u0435\u0440\u043D\u0430. +Guides.Unarmed.Section.2=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u0421\u0442\u0438\u043B\u044C \u0421\u0442\u0430\u043B\u044C\u043D\u043E\u0433\u043E \u043A\u0443\u043B\u0430\u043A\u0430?!nasd&e\u0421\u0442\u0438\u043B\u044C \u0421\u0442\u0430\u043B\u044C\u043D\u043E\u0433\u043E \u043A\u0443\u043B\u0430\u043A\u0430 \u0443\u0432\u0435\u043B\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0443\u0440\u043E\u043D, \u043D\u0430\u043D\u043E\u0441\u0438\u043C\u044B\u0439!nasd&e\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=&3\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 \u0441\u0442\u0440\u0435\u043B?!nasd&e\u041E\u0442\u0440\u0430\u0436\u0435\u043D\u0438\u0435 \u0441\u0442\u0440\u0435\u043B - \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!nasd&e\u043E\u0442\u0440\u0430\u0436\u0430\u0442\u044C \u0441\u0442\u0440\u0435\u043B\u044B, \u0432\u044B\u043F\u0443\u0449\u0435\u043D\u043D\u044B\u0435 \u0441\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.!nasd&e\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\u0438\u043D\u0435\u043D\u0438\u044F \u0432\u0430\u043C \u0432\u0440\u0435\u0434\u0430. +Guides.Unarmed.Section.4=&3\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 \u0445\u0432\u0430\u0442\u043A\u0430?!nasd&e\u0416\u0435\u043B\u0435\u0437\u043D\u0430\u044F \u0445\u0432\u0430\u0442\u043A\u0430 - \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!nasd&e\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=&3\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?!nasd&e\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\u044E\u0449\u0435\u0435 \u0440\u0430\u0437\u043E\u0440\u0443\u0436\u0430\u0442\u044C \u0434\u0440\u0443\u0433\u0438\u0445 \u0438\u0433\u0440\u043E\u043A\u043E\u0432,!nasd&e\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=&3\u041E \u043D\u0430\u0432\u044B\u043A\u0435 \u041B\u0435\u0441\u043E\u0440\u0443\u0431\u0441\u0442\u0432\u043E\\:!nasd&e\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.!nasd!nasd&3\u041F\u041E\u041B\u0423\u0427\u0415\u041D\u0418\u0415 \u041E\u041F\u042B\u0422\u0410\\:!nasd&e\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=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u0414\u0440\u043E\u0432\u043E\u0441\u0435\u043A?!nasd&e\u0414\u0440\u043E\u0432\u043E\u0441\u0435\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!nasd&e\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, !nasd&e\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, \u0430 \u0432\u0441\u0435 \u0431\u043B\u043E\u043A\u0438 \u0434\u0440\u0435\u0432\u0435\u0441\u0438\u043D\u044B!nasd&e\u0432\u044B\u043F\u0430\u0434\u0443\u0442 \u0437\u0430 \u0440\u0430\u0437. +Guides.Woodcutting.Section.2=&3\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 \u043B\u0438\u0441\u0442\u044C\u0435\u0432?!nasd&e\u0421\u0434\u0443\u0432\u0430\u0442\u0435\u043B\u044C \u043B\u0438\u0441\u0442\u044C\u0435\u0432 - \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!nasd&e\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. !nasd&e\u042D\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=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u0414\u0432\u043E\u0439\u043D\u0430\u044F \u0434\u043E\u0431\u044B\u0447\u0430?!nasd&e\u042D\u0442\u043E \u043F\u0430\u0441\u0441\u0438\u0432\u043D\u043E\u0435 \u0443\u043C\u0435\u043D\u0438\u0435, \u0434\u0430\u044E\u0449\u0435\u0435 \u0448\u0430\u043D\u0441 \u0432\u044B\u043F\u0430\u0434\u0435\u043D\u0438\u044F!nasd&e\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. #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 &e{0} -Inspect.Stats=&amcMMO \u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430 \u0434\u043b\u044f &e{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\u0423 \u0432\u0430\u0441 \u043D\u0435\u0442 \u043F\u0440\u0430\u0432 \u043F\u0440\u043E\u0432\u0435\u0440\u044F\u0442\u044C \u0438\u0433\u0440\u043E\u043A\u043E\u0432 \u043D\u0435 \u0432 \u0441\u0435\u0442\u0438\\! +Inspect.OfflineStats=\u0421\u0442\u0430\u0442\u044B mcMMO \u0438\u0433\u0440\u043E\u043A\u0430 \u043D\u0435 \u0441\u0435\u0442\u0438 &e{0} +Inspect.Stats=&a\u0421\u0442\u0430\u0442\u044B mcMMO &e{0} +Inspect.TooFar=\u0412\u044B \u0441\u043B\u0438\u0448\u043A\u043E\u043C \u0434\u0430\u043B\u0435\u043A\u043E, \u0447\u0442\u043E\u0431\u044B \u043F\u0440\u043E\u0432\u0435\u0440\u044F\u0442\u044C \u044D\u0442\u043E\u0433\u043E \u0438\u0433\u0440\u043E\u043A\u0430\\! #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=&7\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 &e{0}&c \u0431\u043e\u043b\u044c\u0448\u0435 &6{1}&c! -Item.NotEnough=\u0412\u0430\u043c \u043d\u0443\u0436\u043d\u043e &e{0}&c \u0431\u043e\u043b\u044c\u0448\u0435 &6{1}&c! -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! &e({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. &e({0}s) -Item.FluxPickaxe.Name=\u041f\u043b\u0430\u0432\u0438\u043b\u044c\u043d\u0430\u044f \u041a\u0438\u0440\u043a\u0430 -Item.FluxPickaxe.Lore.1=&7\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=&7\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**\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** +Item.ChimaeraWing.Name=\u041A\u0440\u044B\u043B\u044C\u044F \u0425\u0438\u043C\u0435\u0440\u044B +Item.ChimaeraWing.Lore=&7\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 \u0435\u0449\u0451 &e{0}&c \u0448\u0442\u0443\u043A &6{1}&c\\! +Item.NotEnough=\u0412\u0430\u043C \u043D\u0443\u0436\u043D\u043E \u0435\u0449\u0451 &e{0}&c \u0448\u0442\u0443\u043A &6{1}&c\\! +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\\! &e({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. &e({0}s) +Item.FluxPickaxe.Name=\u0424\u043B\u044E\u0441\u043E\u0432\u0430\u044F \u043A\u0438\u0440\u043A\u0430 +Item.FluxPickaxe.Lore.1=&7\u0418\u043C\u0435\u0435\u0442 \u0448\u0430\u043D\u0441 \u043C\u0433\u043D\u043E\u0432\u0435\u043D\u043D\u043E \u043F\u0435\u0440\u0435\u043F\u043B\u0430\u0432\u0438\u0442\u044C \u0440\u0443\u0434\u0443. +Item.FluxPickaxe.Lore.2=&7\u041D\u0443\u0436\u0435\u043D \u0443\u0440\u043E\u0432\u0435\u043D\u044C \u041F\u0435\u0440\u0435\u043F\u043B\u0430\u0432\u043A\u0438 {0}+ #TELEPORTATION -Teleport.Commencing=&7\u0422\u0435\u043b\u0435\u043f\u043e\u0440\u0442\u0430\u0446\u0438\u044f \u0447\u0435\u0440\u0435\u0437 &6({0}) &7\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=&4\u0422\u0435\u043b\u0435\u043f\u043e\u0440\u0442\u0430\u0446\u0438\u044f \u043e\u0442\u043c\u0435\u043d\u0435\u043d\u0430! +Teleport.Commencing=&7\u0422\u0435\u043B\u0435\u043F\u043E\u0440\u0442\u0430\u0446\u0438\u044F \u0447\u0435\u0440\u0435\u0437 &6({0}) &7\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=&4\u0422\u0435\u043B\u0435\u043F\u043E\u0440\u0442\u0430\u0446\u0438\u044F \u043E\u0442\u043C\u0435\u043D\u0435\u043D\u0430\\! #SKILLS -Skills.Child=&6(\u041d\u0410\u0421\u041b\u0415\u0414\u0421\u0422\u0412\u0415\u041d\u041d\u042b\u0419 \u041d\u0410\u0412\u042b\u041a) -Skills.Disarmed=&4\u0412\u044b \u043e\u0431\u0435\u0437\u043e\u0440\u0443\u0436\u0435\u043d\u044b! -Skills.Header=-----[]&a{0}&c[]----- -Skills.NeedMore=&4\u0412\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0435 &7{0} -Skills.NeedMore.Extra=&4\u0412\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0435 &7{0}{1} -Skills.Parents=\u0420\u041e\u0414\u0418\u0422\u0415\u041b\u042c\u0421\u041a\u0418\u0419 -Skills.Stats={0}&a{1}&3 \u041e\u041f\u042b\u0422(&7{2}&3/&7{3}&3) +Skills.Child=&6(\u0414\u041E\u0427\u0415\u0420\u041D\u0418\u0419 \u041D\u0410\u0412\u042B\u041A) +Skills.Disarmed=&4\u0412\u044B \u043E\u0431\u0435\u0437\u043E\u0440\u0443\u0436\u0435\u043D\u044B\\! +Skills.Header=-----[] &a{0}&c []----- +Skills.NeedMore=&4\u0412\u0430\u043C \u043D\u0443\u0436\u043D\u043E \u0431\u043E\u043B\u044C\u0448\u0435 &7{0} +Skills.NeedMore.Extra=&4\u0412\u0430\u043C \u043D\u0443\u0436\u043D\u043E \u0431\u043E\u043B\u044C\u0448\u0435 &7{0}{1} +Skills.Parents= \u0420\u041E\u0414\u0418\u0422\u0415\u041B\u042C\u0421\u041A\u0418\u0419 +Skills.Stats={0}&a{1}&3 \u041E\u041F\u042B\u0422(&7{2}&3/&7{3}&3) Skills.ChildStats={0}&a{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=&a\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 &6{0}&a. \u041b\u041a\u041c \u0434\u043b\u044f \u043e\u0442\u043c\u0435\u043d\u044b. -Skills.AbilityGateRequirementFail=&7\u0412\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0435\u0449\u0435 &e{0}&7 \u0443\u0440\u043e\u0432\u043d\u0435\u0439 &3{1}&7 \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.MaxXP=\u041C\u0430\u043A\u0441. +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. &e({0}\u0441) +Skills.TooTired.Named=&7(&6{0}&e {1}\u0441&7) +Skills.TooTired.Extra=&6{0} &e\u041E\u0442\u043A\u0430\u0442\u044B \u0441\u0443\u043F\u0435\u0440\u0443\u043C\u0435\u043D\u0438\u0439 - {1} +Skills.Cancelled=&7{0} &c\u043E\u0442\u043C\u0435\u043D\u0435\u043D\\! +Skills.ConfirmOrCancel=&a\u041D\u0430\u0436\u043C\u0438\u0442\u0435 \u041F\u041A\u041C \u0435\u0449\u0451 \u0440\u0430\u0437 \u0434\u043B\u044F \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043D\u0438\u044F &6{0}&a. \u041B\u041A\u041C \u0434\u043B\u044F \u043E\u0442\u043C\u0435\u043D\u044B. +Skills.AbilityGateRequirementFail=&7\u0412\u0430\u043C \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E \u0435\u0449\u0451 &e{0}&7 \u0443\u0440\u043E\u0432\u043D\u0435\u0439 &3{1}&7, \u0447\u0442\u043E\u0431\u044B \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u0434\u0430\u043D\u043D\u043E\u0435 \u0443\u043C\u0435\u043D\u0438\u0439. #STATISTICS -Stats.Header.Combat=&6-=\u0411\u041e\u0415\u0412\u042b\u0415 \u041d\u0410\u0412\u042b\u041a\u0418=- -Stats.Header.Gathering=&6-=\u041d\u0410\u0412\u042b\u041a\u0418 \u0421\u0411\u041e\u0420\u0410=- -Stats.Header.Misc=&6-=\u0420\u0410\u0417\u041d\u042b\u0415 \u041d\u0410\u0412\u042b\u041a\u0418=- -Stats.Own.Stats=&a[mcMMO] \u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430 +Stats.Header.Combat=&6-\\=\u0411\u041E\u0415\u0412\u042B\u0415 \u041D\u0410\u0412\u042B\u041A\u0418\\=- +Stats.Header.Gathering=&6-\\=\u041D\u0410\u0412\u042B\u041A\u0418 \u0421\u0411\u041E\u0420\u0410\\=- +Stats.Header.Misc=&6-\\=\u0420\u0410\u0417\u041D\u042B\u0415 \u041D\u0410\u0412\u042B\u041A\u0418\\=- +Stats.Own.Stats=&a[mcMMO] \u0421\u0442\u0430\u0442\u044B #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.XP.Name=\u041E\u043F\u044B\u0442 +Perks.XP.Desc=\u041F\u043E\u043B\u0443\u0447\u0430\u0439\u0442\u0435 \u0431\u043E\u043B\u044C\u0448\u0435 \u043E\u043F\u044B\u0442\u0430 \u0432 \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u043D\u043E\u043C \u043D\u0430\u0432\u044B\u043A\u0435. 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=&6 ({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=&6 ({0}% \u0441 \u0421\u0447\u0430\u0441\u0442\u043b\u0438\u0432\u044b\u043c \u041f\u0435\u0440\u043a\u043e\u043c) +Perks.Lucky.Desc=\u0414\u0430\u0435\u0442 {0} \u043D\u0430\u0432\u044B\u043A\u0430\u043C \u0438 \u0443\u043C\u0435\u043D\u0438\u044F\u043C \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. +Perks.Lucky.Desc.Login=\u0414\u0430\u0435\u0442 \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u043C \u043D\u0430\u0432\u044B\u043A\u0430\u043C \u0438 \u0443\u043C\u0435\u043D\u0438\u044F\u043C \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. +Perks.Lucky.Bonus=&6 ({0} \u0441 \u0423\u0434\u0430\u0447\u0435\u0439) +Perks.Cooldowns.Name=\u0411\u044B\u0441\u0442\u0440\u043E\u0435 \u0432\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 \u0432\u0440\u0435\u043C\u044F \u043E\u0442\u043A\u0430\u0442\u043E\u0432 \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=&6 ({0}% \u0441 \u0412\u044B\u043D\u043E\u0441\u043B\u0438\u0432\u043E\u0441\u0442\u044C\u044E) #HARDCORE -Hardcore.Mode.Disabled=&6[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=&6[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=&6[mcMMO] &4\u0412\u044b \u043f\u043e\u0442\u0435\u0440\u044f\u043b\u0438 &9{0}&4 \u043f\u0440\u0438 \u0441\u043c\u0435\u0440\u0442\u0438. -Hardcore.DeathStatLoss.PercentageChanged=&6[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=&6[mcMMO] &e{0}&7 \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=&6[mcMMO] &3\u0412\u044b \u0443\u043a\u0440\u0430\u043b\u0438 &9{0}&3 \u0443\u0440\u043e\u0432\u043d\u0435\u0439 \u0443 &e{1}. -Hardcore.Vampirism.Victim.Failure=&6[mcMMO] &e{0}&7 \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=&6[mcMMO] &e{0}&4 \u0443\u043a\u0440\u0430\u043b \u0443 \u0432\u0430\u0441 &9{1}&4 \u0443\u0440\u043e\u0432\u043d\u0435\u0439! -Hardcore.Vampirism.PercentageChanged=&6[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] \u0420\u0435\u0436\u0438\u043C \u0445\u0430\u0440\u0434\u043A\u043E\u0440\u0430 {0} \u043E\u0442\u043A\u043B\u044E\u0447\u0435\u043D \u0434\u043B\u044F {1}. +Hardcore.Mode.Enabled=&6[mcMMO] \u0420\u0435\u0436\u0438\u043C \u0445\u0430\u0440\u0434\u043A\u043E\u0440\u0430 {0} \u0432\u043A\u043B\u044E\u0447\u0435\u043D \u0434\u043B\u044F {1}. +Hardcore.DeathStatLoss.Name=\u0428\u0442\u0440\u0430\u0444 \u043D\u0430\u0432\u044B\u043A\u043E\u0432 \u0437\u0430 \u0441\u043C\u0435\u0440\u0442\u044C +Hardcore.DeathStatLoss.PlayerDeath=&6[mcMMO] &4\u0412\u044B \u043F\u043E\u0442\u0435\u0440\u044F\u043B\u0438 &9{0}&4 \u0443\u0440\u043E\u0432\u043D\u0435\u0439 \u043F\u0440\u0438 \u0441\u043C\u0435\u0440\u0442\u0438. +Hardcore.DeathStatLoss.PercentageChanged=&6[mcMMO] \u041F\u0440\u043E\u0446\u0435\u043D\u0442 \u043F\u043E\u0442\u0435\u0440\u0438 \u0441\u0442\u0430\u0442\u043E\u0432 \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=&6[mcMMO] &e{0}&7 \u0431\u044B\u043B \u0441\u043B\u0438\u0448\u043A\u043E\u043C \u043D\u0435\u0443\u043C\u0435\u043B, \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=&6[mcMMO] &3\u0412\u044B \u0443\u043A\u0440\u0430\u043B\u0438 &9{0}&3 \u0443\u0440\u043E\u0432\u043D\u0435\u0439 \u0443 &e{1}. +Hardcore.Vampirism.Victim.Failure=&6[mcMMO] &e{0}&7 \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=&6[mcMMO] &e{0}&4 \u0443\u043A\u0440\u0430\u043B \u0443 \u0432\u0430\u0441 &9{1}&4 \u0443\u0440\u043E\u0432\u043D\u0435\u0439\\! +Hardcore.Vampirism.PercentageChanged=&6[mcMMO] \u041F\u0440\u043E\u0446\u0435\u043D\u0442 \u043F\u043E\u0433\u043B\u043E\u0449\u0435\u043D\u0438\u044F \u0441\u0442\u0430\u0442\u043E\u0432 \u0431\u044B\u043B \u0438\u0437\u043C\u0435\u043D\u0435\u043D \u043D\u0430 {0}. #MOTD -MOTD.Donate=&3\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=&6[mcMMO] &3\u0420\u0435\u0436\u0438\u043c \u0425\u0430\u0440\u0434\u043a\u043e\u0440 \u0432\u043a\u043b\u044e\u0447\u0435\u043d: &4{0} -MOTD.Hardcore.DeathStatLoss.Stats=&6[mcMMO] &3\u041d\u0430\u0432\u044b\u043a \u0421\u043c\u0435\u0440\u0442\u043d\u043e\u0439 \u041a\u0430\u0437\u043d\u0438: &4{0}% -MOTD.Hardcore.Vampirism.Stats=&6[mcMMO] &3\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: &4{0}% -MOTD.PerksPrefix=[mcMMO Perks] -MOTD.Version=&6[mcMMO] \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432\u0435\u0440\u0441\u0438\u044f &3{0} -MOTD.Website=&6[mcMMO] &a{0}&e - \u0421\u0430\u0439\u0442 mcMMO +MOTD.Donate=&3\u041F\u043E\u0436\u0435\u0440\u0442\u0432\u043E\u0432\u0430\u043D\u0438\u044F\\: +MOTD.Hardcore.Enabled=&6[mcMMO] &3\u0420\u0435\u0436\u0438\u043C \u0445\u0430\u0440\u0434\u043A\u043E\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D\\: &4{0} +MOTD.Hardcore.DeathStatLoss.Stats=&6[mcMMO] &3\u0428\u0442\u0440\u0430\u0444 \u043D\u0430\u0432\u044B\u043A\u043E\u0432 \u0437\u0430 \u0441\u043C\u0435\u0440\u0442\u044C\\: &4{0}% +MOTD.Hardcore.Vampirism.Stats=&6[mcMMO] &3\u041F\u043E\u0433\u043B\u043E\u0449\u0435\u043D\u0438\u0435 \u0441\u0442\u0430\u0442\u043E\u0432 \u043E\u0442 \u0412\u0430\u043C\u043F\u0438\u0440\u0438\u0437\u043C\u0430\\: &4{0}% +MOTD.PerksPrefix=&6[mcMMO \u043E\u0441\u043E\u0431\u0435\u043D\u043D\u043E\u0441\u0442\u0438] +MOTD.Version=&6[mcMMO] \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F \u0432\u0435\u0440\u0441\u0438\u044F &3{0} +MOTD.Website=&6[mcMMO] &a{0}&e - \u0441\u0430\u0439\u0442 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: &e{0}x -Smelting.Ability.FluxMining=\u0428\u0430\u043d\u0441 \u041f\u043e\u0442\u043e\u043a\u043e\u0432\u043e\u0439 \u0414\u043e\u0431\u044b\u0447\u0438: &e{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: &e{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: &e{0} -Smelting.Ability.VanillaXPBoost=\u041c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u044c \u041e\u043f\u044b\u0442\u0430: &e{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: &e{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=&a\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=\u041F\u043E\u043D\u0438\u043C\u0430\u043D\u0438\u0435 \u0438\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 \u0441\u043B\u0438\u0448\u043A\u043E\u043C \u043C\u043D\u043E\u0433\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.!nasd\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=\u041C\u043D\u043E\u0436\u0438\u0442\u0435\u043B\u044C \u043E\u0431\u044B\u0447\u043D\u043E\u0433\u043E \u043E\u043F\u044B\u0442\u0430\\: &e{0}x +Smelting.Ability.Locked.0=\u0417\u0410\u0411\u041B\u041E\u041A\u0418\u0420\u041E\u0412\u0410\u041D\u041E \u0414\u041E {0}+ \u041D\u0410\u0412\u042B\u041A\u0410 (\u0423\u0412\u0415\u041B\u0418\u0427\u0415\u041D\u0418\u0415 \u041E\u0411\u042B\u0427\u041D\u041E\u0413\u041E \u041E\u041F\u042B\u0422\u0410) +Smelting.Ability.Locked.1=\u0417\u0410\u0411\u041B\u041E\u041A\u0418\u0420\u041E\u0412\u0410\u041D\u041E \u0414\u041E {0}+ \u041D\u0410\u0412\u042B\u041A\u0410 (\u0424\u041B\u042E\u0421\u041E\u0412\u0410\u042F \u0414\u041E\u0411\u042B\u0427\u0410) +Smelting.SubSkill.FuelEfficiency.Name=\u042D\u0444\u0444\u0435\u043A\u0442\u0438\u0432\u043D\u043E\u0441\u0442\u044C \u0442\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 \u043F\u0440\u0438 \u043F\u0435\u0440\u0435\u043F\u043B\u0430\u043A\u0438 \u0432 \u043F\u0435\u0447\u0438 +Smelting.SubSkill.FuelEfficiency.Stat=\u041C\u043D\u043E\u0436\u0438\u0442\u0435\u043B\u044C \u044D\u0444\u0444\u0435\u043A\u0442\u0438\u0432\u043D\u043E\u0441\u0442\u0438 \u0442\u043E\u043F\u043B\u0438\u0432\u0430\\: &e{0}x +Smelting.SubSkill.SecondSmelt.Name=\u0412\u0442\u043E\u0440\u0430\u044F \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 \u043F\u0435\u0440\u0435\u043F\u043B\u0430\u0432\u043A\u0435 +Smelting.SubSkill.SecondSmelt.Stat=\u0428\u0430\u043D\u0441 \u0412\u0442\u043E\u0440\u043E\u0439 \u043F\u043B\u0430\u0432\u043A\u0438 +Smelting.Effect.4=\u0423\u0432\u0435\u043B\u0438\u0447\u0435\u043D\u0438\u0435 \u043E\u0431\u044B\u0447\u043D\u043E\u0433\u043E \u043E\u043F\u044B\u0442\u0430 +Smelting.Effect.5=\u0423\u0432\u0435\u043B\u0438\u0447\u0435\u043D\u0438\u0435 \u043E\u0431\u044B\u0447\u043D\u043E\u0433\u043E \u043E\u043F\u044B\u0442\u0430, \u043F\u043E\u043B\u0443\u0447\u0430\u0435\u043C\u043E\u0433\u043E \u043F\u0440\u0438 \u043F\u0435\u0440\u0435\u043F\u043B\u0430\u0432\u043A\u0435 +Smelting.SubSkill.FluxMining.Name=\u0424\u043B\u044E\u0441\u043E\u0432\u0430\u044F \u0434\u043E\u0431\u044B\u0447\u0430 +Smelting.SubSkill.FluxMining.Description=\u0428\u0430\u043D\u0441 \u043C\u0433\u043D\u043E\u0432\u0435\u043D\u043D\u043E\u0439 \u043F\u0435\u0440\u0435\u043F\u043B\u0430\u0432\u043A\u0438 \u0440\u0443\u0434 \u0432\u043E \u0432\u0440\u0435\u043C\u044F \u0434\u043E\u0431\u044B\u0447\u0438 +Smelting.SubSkill.FluxMining.Stat=\u0428\u0430\u043D\u0441 \u0424\u043B\u044E\u0441\u043E\u0432\u043E\u0439 \u0434\u043E\u0431\u044B\u0447\u0438 +Smelting.Listener=\u041F\u0435\u0440\u0435\u043F\u043B\u0430\u0432\u043A\u0430\\: +Smelting.SkillName=\u041F\u0415\u0420\u0415\u041F\u041B\u0410\u0412\u041A\u0410 #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=\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044E \u0443\u0440\u043E\u0432\u043D\u0435\u0439 mcMMO +Commands.Description.adminchat=\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0430\u0434\u043C\u0438\u043D-\u0447\u0430\u0442 mcMMO \u0438\u043B\u0438 \u043E\u0442\u043E\u0441\u043B\u0430\u0442\u044C \u0442\u0443\u0434\u0430 \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 \u0448\u0442\u0440\u0430\u0444 \u0445\u0430\u0440\u0434\u043A\u043E\u0440\u0430 mcMMO \u0438\u043B\u0438 \u043F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C \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=\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C \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 \u043E\u0442\u043A\u0430\u0442\u044B \u0443\u043C\u0435\u043D\u0438\u0439 mcMMO +Commands.Description.mcchatspy=\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0441\u043B\u0435\u0436\u043A\u0443 \u0437\u0430 \u0447\u0430\u0442\u0430\u043C\u0438 \u0433\u0440\u0443\u043F\u043F mcMMO +Commands.Description.mcgod=\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C \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 HUD 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=\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C \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\u0441\u044F \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=\u0421\u0431\u0440\u043E\u0441\u0438\u0442\u044C \u0432\u0441\u0435 \u043E\u0442\u043A\u0430\u0442\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\u0442\u044C \u0441\u0432\u043E\u0435\u0439 \u0442\u0430\u0431\u043B\u0438\u0446\u0435\u0439 mcMMO +Commands.Description.mcstats=\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0432\u0430\u0448\u0438 \u0443\u0440\u043E\u0432\u043D\u0438 \u0438 \u043E\u043F\u044B\u0442 mcMMO +Commands.Description.mctop=\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0442\u0430\u0431\u043B\u0438\u0446\u0443 \u043B\u0438\u0434\u0435\u0440\u043E\u0432 mcMMO +Commands.Description.mmoedit=\u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C \u0443\u0440\u043E\u0432\u0435\u043D\u044C mcMMO \u0434\u043B\u044F \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0435\u0439 +Commands.Description.mmodebug=\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0440\u0435\u0436\u0438\u043C \u043E\u0442\u043B\u0430\u0434\u043A\u0438, \u043A\u043E\u0442\u043E\u0440\u044B\u0439 \u0432\u044B\u0432\u043E\u0434\u0438\u0442 \u043F\u043E\u043B\u0435\u0437\u043D\u0443\u044E \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044E \u043F\u0440\u0438 \u0443\u0434\u0430\u0440\u0430\u0445 \u043F\u043E \u0431\u043B\u043E\u043A\u0430\u043C +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 /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 \u0433\u0440\u0443\u043F\u043F\u044B mcMMO +Commands.Description.partychat=\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0447\u0430\u0442 \u0433\u0440\u0443\u043F\u043F\u044B mcMMO \u0438\u043B\u0438 \u043E\u0442\u043E\u0441\u043B\u0430\u0442\u044C \u0442\u0443\u0434\u0430 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435 +Commands.Description.ptp=\u0422\u0435\u043B\u0435\u043F\u043E\u0440\u0442\u0430\u0446\u0438\u044F \u043A \u0447\u043B\u0435\u043D\u0430\u043C \u0433\u0440\u0443\u043F\u043F\u044B mcMMO +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 \u0412\u0430\u043C\u043F\u0438\u0440\u0438\u0437\u043C\u0430 \u0432 mcMMO \u0438\u043B\u0438 \u043F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0440\u0435\u0436\u0438\u043C \u0412\u0430\u043C\u043F\u0438\u0440\u0438\u0437\u043C\u0430 +Commands.Description.xplock=\u0417\u0430\u0444\u0438\u043A\u0441\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0448\u043A\u0430\u043B\u0443 \u043E\u043F\u044B\u0442\u0430 mcMMO \u043D\u0430 \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u043D\u043E\u043C \u043D\u0430\u0432\u044B\u043A\u0435 +Commands.Description.xprate=\u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C \u043C\u043D\u043E\u0436\u0438\u0442\u0435\u043B\u044C \u043E\u043F\u044B\u0442\u0430 mcMMO \u0438\u043B\u0438 \u043D\u0430\u0447\u0430\u0442\u044C \u0441\u043E\u0431\u044B\u0442\u0438\u0435 \u043C\u043D\u043E\u0436\u0438\u0442\u0435\u043B\u044F \u043E\u043F\u044B\u0442\u0430 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=\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. #SCOREBOARD HEADERS -Scoreboard.Header.PlayerStats=&e\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430 mcMMO -Scoreboard.Header.PlayerCooldowns=&e\u041a\u0443\u043b\u0434\u0430\u0443\u043d\u044b mcMMO -Scoreboard.Header.PlayerRank=&e\u0420\u0430\u043d\u0436\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 mcMMO -Scoreboard.Header.PlayerInspect=&e\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430 mcMMO: -Scoreboard.Header.PowerLevel=&c\u0423\u0440\u043e\u0432\u0435\u043d\u044c \u0421\u0438\u043b\u044b -Scoreboard.Misc.PowerLevel=&6\u0423\u0440\u043e\u0432\u0435\u043d\u044c \u0421\u0438\u043b\u044b -Scoreboard.Misc.Level=&3\u0423\u0440\u043e\u0432\u0435\u043d\u044c -Scoreboard.Misc.CurrentXP=&a\u0422\u0435\u043a\u0443\u0449\u0438\u0439 \u043e\u043f\u044b\u0442 -Scoreboard.Misc.RemainingXP=&e\u041e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u043e\u043f\u044b\u0442 -Scoreboard.Misc.Cooldown=&d\u041a\u0443\u043b\u0434\u0430\u0443\u043d -Scoreboard.Misc.Overall=&6\u041e\u0431\u0449\u0438\u0439 -Recovery.Notice=\u0423\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0435: mcMMO &4\u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435.&c \u041f\u043e\u0432\u0442\u043e\u0440 5 \u0440\u0430\u0437... -Recovery.Success=&a\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 &b\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&e\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&l\u043d\u0435 \u0431\u0443\u0434\u0435\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0443\u0440\u043e\u0432\u043d\u0438 mcMMO&e \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c\u044b\u0439 \u0432\u0430\u043c\u0438 \u043e\u043f\u044b\u0442 &l\u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d&e. -Recovery.AdminFailureNotice=&4[A]&c 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 &e{0}&c. &d\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\u0421\u0442\u0430\u0442\u044B mcMMO +Scoreboard.Header.PlayerCooldowns=&e\u041E\u0442\u043A\u0430\u0442\u044B mcMMO +Scoreboard.Header.PlayerRank=&e\u0420\u0435\u0439\u0442\u0438\u043D\u0433 mcMMO +Scoreboard.Header.PlayerInspect=&e\u0421\u0442\u0430\u0442\u044B mcMMO\\: {0} +Scoreboard.Header.PowerLevel=&c\u0423\u0440\u043E\u0432\u0435\u043D\u044C \u0441\u0438\u043B\u044B +Scoreboard.Misc.PowerLevel=&6\u0423\u0440\u043E\u0432\u0435\u043D\u044C \u0441\u0438\u043B\u044B +Scoreboard.Misc.Level=&3\u0423\u0440\u043E\u0432\u0435\u043D\u044C +Scoreboard.Misc.CurrentXP=&a\u0422\u0435\u043A\u0443\u0449\u0438\u0439 \u043E\u043F\u044B\u0442 +Scoreboard.Misc.RemainingXP=&e\u041E\u0441\u0442\u0430\u043B\u043E\u0441\u044C \u043E\u043F\u044B\u0442\u0430 +Scoreboard.Misc.Cooldown=&d\u041E\u0442\u043A\u0430\u0442 +Scoreboard.Misc.Overall=&6\u0412\u0441\u0435\u0433\u043E +Scoreboard.Misc.Ability=\u0423\u043C\u0435\u043D\u0438\u0435 #DATABASE RECOVERY -Profile.PendingLoad=&c\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=&a\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=&cmcMMO \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 &a{0}&c \u0440\u0430\u0437.&c \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=&4[A]&c 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 &e{0}&c. &d\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\u0412\u0430\u0448 \u043F\u0440\u043E\u0444\u0438\u043B\u044C mcMMO \u0435\u0449\u0451 \u043D\u0435 \u0431\u044B\u043B \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043D. +Profile.Loading.Success=&a\u0412\u0430\u0448 \u043F\u0440\u043E\u0444\u0438\u043B\u044C mcMMO \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u043B\u0441\u044F. +Profile.Loading.FailurePlayer=&cmcMMO \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 \u0443\u0436\u0435 &a{0}&c \u0440\u0430\u0437. \u0412\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\u0446\u0438\u0438 \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 \u043F\u043E\u043A\u0430 \u0432\u044B \u043D\u0435 \u043F\u043E\u043A\u0438\u043D\u0435\u0442\u0435 \u0438\u0433\u0440\u0443. \u041F\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, \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 \u043D\u0430\u0432\u044B\u043A\u0438. +Profile.Loading.FailureNotice=&4[\u0410]&c mcMMO \u043D\u0435 \u0441\u043C\u043E\u0433\u043B \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044C \u0434\u0430\u043D\u043D\u044B\u0435 \u0438\u0433\u0440\u043E\u043A\u0430 &e{0}&c. &d\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. \u041F\u043E\u043F\u044B\u0442\u043E\u043A \u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0438 \u0434\u0430\u043D\u043D\u044B\u0445 {1}. #Holiday -Holiday.AprilFools.Levelup=&6{0} \u0442\u0435\u043f\u0435\u0440\u044c \u0443\u0440\u043e\u0432\u043d\u044f &a{1}&6! -Holiday.Anniversary=&9\u0421 {0} \u0413\u043e\u0434\u043e\u0432\u0449\u0438\u043d\u043e\u0439!\n&9\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} \u0442\u0435\u043F\u0435\u0440\u044C \u0443\u0440\u043E\u0432\u043D\u044F &a{1}&6\\! +Holiday.Anniversary=&9\u0421 {0} \u0413\u043E\u0434\u043E\u0432\u0449\u0438\u043D\u043E\u0439\\!!nasd&9\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, \u0434\u0430 \u0431\u0443\u0434\u0443\u0442 \u0444\u0435\u0439\u0435\u0440\u0432\u0435\u0440\u043A\u0438\\! +#Reminder Messages +Reminder.Squelched=&7\u041D\u0430\u043F\u043E\u043C\u0438\u043D\u0430\u043D\u0438\u0435\\: \u0412 \u043D\u0430\u0441\u0442\u043E\u044F\u0449\u0435\u0435 \u0432\u0440\u0435\u043C\u044F \u0432\u044B \u043D\u0435 \u043F\u043E\u043B\u0443\u0447\u0430\u0435\u0442\u0435 \u0443\u0432\u0435\u0434\u043E\u043C\u043B\u0435\u043D\u0438\u044F \u043E\u0442 mcMMO; \u0447\u0442\u043E\u0431\u044B \u0432\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0443\u0432\u0435\u0434\u043E\u043C\u043B\u0435\u043D\u0438\u044F, \u043F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430, \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u0443 /mc!nasdotify \u0441\u043D\u043E\u0432\u0430. \u042D\u0442\u043E \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0435 \u043F\u043E\u0447\u0430\u0441\u043E\u0432\u043E\u0435 \u043D\u0430\u043F\u043E\u043C\u0438\u043D\u0430\u043D\u0438\u0435. #Locale -Locale.Reloaded=&a\u041b\u043e\u043a\u0430\u043b\u044c \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u0430! +Locale.Reloaded=&a\u041B\u043E\u043A\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u044F \u043F\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043D\u0430\\! #Player Leveling Stuff -LevelCap.PowerLevel=&6(&amcMMO&6) &e\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 &c{0}&e. \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=&6(&amcMMO&6) &e\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 &c{0}&e \u0434\u043b\u044f &6{1}&e. \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. -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. +LevelCap.PowerLevel=&6(&amcMMO&6) &e\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 &c{0}&e. \u0412\u0430\u0448\u0438 \u043D\u0430\u0432\u044B\u043A\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=&6(&amcMMO&6) &e\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 &c{0}&e \u0434\u043B\u044F &6{1}&e. \u0412\u0430\u0448\u0438 \u043D\u0430\u0432\u044B\u043A\u0438 \u0431\u043E\u043B\u044C\u0448\u0435 \u043D\u0435 \u0431\u0443\u0434\u0443\u0442 \u0443\u043B\u0443\u0447\u0448\u0430\u0442\u044C\u0441\u044F. +Commands.XPBar.Usage=\u041F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u043E\u0435 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0435 - /mmoxpbar <\u043D\u0430\u0432\u044B\u043A | reset> +Commands.Description.mmoxpbar=\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u0438\u0433\u0440\u043E\u043A\u0430 \u0434\u043B\u044F \u0448\u043A\u0430\u043B\u044B \u043E\u043F\u044B\u0442\u0430 mcMMO +Commands.Description.mmocompat=\u0418\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F \u043E mcMMO \u0438 \u043E \u0442\u043E\u043C, \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u043B\u0438 \u0440\u0435\u0436\u0438\u043C \u0441\u043E\u0432\u043C\u0435\u0441\u0442\u0438\u043C\u043E\u0441\u0442\u0438 \u0438\u043B\u0438 \u043D\u0435\u0442. +Compatibility.Layer.Unsupported=&6\u0421\u043E\u0432\u043C\u0435\u0441\u0442\u0438\u043C\u043E\u0441\u0442\u044C \u0434\u043B\u044F &{0}&6 \u043D\u0435 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044F \u044D\u0442\u043E\u0439 \u0432\u0435\u0440\u0441\u0438\u0435\u0439 Minecraft. +Compatibility.Layer.PartialSupport=&6\u0421\u043E\u0432\u043C\u0435\u0441\u0442\u0438\u043C\u043E\u0441\u0442\u044C \u0434\u043B\u044F &{0}&6 \u043D\u0435 \u043F\u043E\u043B\u043D\u043E\u0441\u0442\u044C\u044E \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044F \u044D\u0442\u043E\u0439 \u0432\u0435\u0440\u0441\u0438\u0435\u0439 Minecraft, \u043D\u043E mcMMO \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442 \u0432\u0442\u043E\u0440\u0438\u0447\u043D\u0443\u044E \u0441\u0438\u0441\u0442\u0435\u043C\u0443 \u0434\u043B\u044F \u044D\u043C\u0443\u043B\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F \u043D\u0435\u043A\u043E\u0442\u043E\u0440\u044B\u0445 \u043D\u0435\u0434\u043E\u0441\u0442\u0430\u044E\u0449\u0438\u0445 \u0444\u0443\u043D\u043A\u0446\u0438\u0439. +Commands.XPBar.DisableAll=&6 \u0412\u0441\u0435 \u0448\u043A\u0430\u043B\u044B \u043E\u043F\u044B\u0442\u0430 mcMMO \u043E\u0442\u043A\u043B\u044E\u0447\u0435\u043D\u044B, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 /mmoxpbar \u0434\u043B\u044F \u0441\u0431\u0440\u043E\u0441\u0430 \u043D\u0430\u0441\u0442\u0440\u043E\u0435\u043A. +#Modern Chat Settings +Chat.Style.Admin=&b(\u0410) &r{0} &b\u2192 &r{1} +Chat.Style.Party=&a(\u0413) &r{0} &a\u2192 &r{1} +Chat.Style.Party.Leader=&a(\u0413) &r{0} &6\u2192 &r{1} +Chat.Identity.Console=&6* \u041A\u043E\u043D\u0441\u043E\u043B\u044C * +Chat.Channel.On=&6(&amcMMO-\u0447\u0430\u0442&6) &e\u0412\u0430\u0448\u0438 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F \u0431\u0443\u0434\u0443\u0442 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u0434\u043E\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u044B \u0432 \u043A\u0430\u043D\u0430\u043B \u0447\u0430\u0442\u0430 &a{0}. +Chat.Channel.Off=&6(&amcMMO-\u0447\u0430\u0442&6) &e\u0412\u0430\u0448\u0438 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F \u0431\u043E\u043B\u044C\u0448\u0435 \u043D\u0435 \u0431\u0443\u0434\u0443\u0442 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u0434\u043E\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u044B \u0432 \u043A\u0430\u043D\u0430\u043B \u0447\u0430\u0442\u0430. +Chat.Spy.Party=&6[&e\u0428\u041F\u0418\u041A&6-&a{2}&6] &r{0} &b\u2192 &r{1} +Broadcasts.LevelUpMilestone=&6(&amcMMO&6) {0}&7 \u0434\u043E\u0441\u0442\u0438\u0433 \u0443\u0440\u043E\u0432\u043D\u044F &a{1}&7 \u0432 &e{2}&7\\! +Broadcasts.PowerLevelUpMilestone=&6(&amcMMO&6) {0}&7 \u0434\u043E\u0441\u0442\u0438\u0433 \u0443\u0440\u043E\u0432\u043D\u044F \u0441\u0438\u043B\u044B &a{1}&7\\! From 2b4c84b1e8102877d6d1e932a97d10a7f5a65d58 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Wed, 3 Feb 2021 14:47:33 -0800 Subject: [PATCH 367/662] Update changelog --- Changelog.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Changelog.txt b/Changelog.txt index a9620efe3..a8875cb9b 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,6 +1,8 @@ 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) 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 From 1c1abe9a2acc76069dd7814e3bdce5ff4e690934 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Wed, 3 Feb 2021 15:01:32 -0800 Subject: [PATCH 368/662] Added SubSkillBlockEvent & GreenThumb + ShroomThumb now fire it --- Changelog.txt | 5 ++++ .../SubSkillBlockEvent.java | 23 +++++++++++++++++++ .../nossr50/listeners/PlayerListener.java | 23 +++++++++++-------- .../com/gmail/nossr50/util/EventUtils.java | 18 ++++++++++++++- 4 files changed, 59 insertions(+), 10 deletions(-) create mode 100644 src/main/java/com/gmail/nossr50/events/skills/secondaryabilities/SubSkillBlockEvent.java diff --git a/Changelog.txt b/Changelog.txt index a8875cb9b..3d433517b 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -3,6 +3,11 @@ Version 2.1.174 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) 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. 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 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/listeners/PlayerListener.java b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java index d79256336..0261adabc 100644 --- a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java @@ -817,19 +817,24 @@ public class PlayerListener implements Listener { FakePlayerAnimationEvent fakeSwing = new FakePlayerAnimationEvent(event.getPlayer()); //PlayerAnimationEvent compat if (herbalismManager.canGreenThumbBlock(blockState)) { - 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); + //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); + 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); + } } } break; diff --git a/src/main/java/com/gmail/nossr50/util/EventUtils.java b/src/main/java/com/gmail/nossr50/util/EventUtils.java index b1f99de72..e1f2d1b97 100644 --- a/src/main/java/com/gmail/nossr50/util/EventUtils.java +++ b/src/main/java/com/gmail/nossr50/util/EventUtils.java @@ -28,6 +28,7 @@ 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; @@ -190,13 +191,28 @@ public final 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 From 369b34406e3dcccb32e394e22d72dfaf7283295a Mon Sep 17 00:00:00 2001 From: nossr50 Date: Wed, 3 Feb 2021 15:08:21 -0800 Subject: [PATCH 369/662] Green Thumb (Plants) now fires a SubSkillBlockEvent --- Changelog.txt | 2 ++ .../skills/herbalism/HerbalismManager.java | 15 ++++++++++----- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 3d433517b..2a1353c21 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -5,9 +5,11 @@ Version 2.1.174 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 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 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 d1d920359..4a8104dd9 100644 --- a/src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java +++ b/src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java @@ -754,11 +754,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); } From 890d270147b0663555a38bfa73600c8beb3fa6a2 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Wed, 3 Feb 2021 15:14:18 -0800 Subject: [PATCH 370/662] 2.1.174 --- Changelog.txt | 1 + pom.xml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index 2a1353c21..e4e002a4b 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -10,6 +10,7 @@ Version 2.1.174 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 diff --git a/pom.xml b/pom.xml index 23559a646..b73e6b7e5 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.174-SNAPSHOT + 2.1.174 mcMMO https://github.com/mcMMO-Dev/mcMMO From 085c8dbf68b8503f84b92c8adbde94631707effe Mon Sep 17 00:00:00 2001 From: nossr50 Date: Wed, 3 Feb 2021 15:19:34 -0800 Subject: [PATCH 371/662] Dev mode --- Changelog.txt | 2 ++ pom.xml | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index e4e002a4b..80ebd177f 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,5 @@ +Version 2.1.175 + 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) diff --git a/pom.xml b/pom.xml index b73e6b7e5..411fa1606 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.174 + 2.1.175-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO From f9144e624ab9d96f052dfe18ecded6703a2f33ff Mon Sep 17 00:00:00 2001 From: t00thpick1 Date: Fri, 12 Feb 2021 17:18:52 -0500 Subject: [PATCH 372/662] Prepare for negative Y values --- .../nossr50/listeners/BlockListener.java | 5 +- .../java/com/gmail/nossr50/util/Misc.java | 7 ++ .../util/blockmeta/BitSetChunkStore.java | 100 +++++++++++++----- .../nossr50/util/blockmeta/ChunkStore.java | 3 + .../util/blockmeta/ChunkStoreTest.java | 54 +++++++++- 5 files changed, 138 insertions(+), 31 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java index a6d8e7900..863a09ac3 100644 --- a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java @@ -148,10 +148,13 @@ 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); + if (movedBlock.getY() >= Misc.getWorldMinCompat(movedBlock.getWorld())) // Very weird that the event is giving us these, they shouldn't exist + mcMMO.getPlaceStore().setTrue(movedBlock); for (Block block : event.getBlocks()) { movedBlock = block.getRelative(direction); + if (movedBlock.getY() < Misc.getWorldMinCompat(movedBlock.getWorld())) // Very weird that the event is giving us these, they shouldn't exist + continue; mcMMO.getPlaceStore().setTrue(movedBlock); } } diff --git a/src/main/java/com/gmail/nossr50/util/Misc.java b/src/main/java/com/gmail/nossr50/util/Misc.java index 9b74f110c..5f19031d6 100644 --- a/src/main/java/com/gmail/nossr50/util/Misc.java +++ b/src/main/java/com/gmail/nossr50/util/Misc.java @@ -9,6 +9,7 @@ import com.gmail.nossr50.util.player.UserManager; import com.google.common.collect.ImmutableSet; import org.bukkit.Location; import org.bukkit.Material; +import org.bukkit.World; import org.bukkit.block.BlockState; import org.bukkit.entity.*; import org.bukkit.inventory.ItemStack; @@ -259,6 +260,12 @@ public final class Misc { } } + public static int getWorldMinCompat(World world) + { + // TODO this method should access the world min variable in a version safe manner so that we don't restrict usage to new versions of spigot only + return 0; + } + public static void printProgress(int convertedUsers, int progressInterval, long startMillis) { if ((convertedUsers % progressInterval) == 0) { mcMMO.p.getLogger().info(String.format("Conversion progress: %d users at %.2f users/second", convertedUsers, convertedUsers / (double) ((System.currentTimeMillis() - startMillis) / TIME_CONVERSION_FACTOR))); diff --git a/src/main/java/com/gmail/nossr50/util/blockmeta/BitSetChunkStore.java b/src/main/java/com/gmail/nossr50/util/blockmeta/BitSetChunkStore.java index 272710aeb..4830c9045 100644 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/BitSetChunkStore.java +++ b/src/main/java/com/gmail/nossr50/util/blockmeta/BitSetChunkStore.java @@ -1,5 +1,6 @@ package com.gmail.nossr50.util.blockmeta; +import com.gmail.nossr50.util.Misc; import org.bukkit.Bukkit; import org.bukkit.World; import org.jetbrains.annotations.NotNull; @@ -10,12 +11,13 @@ import java.util.BitSet; import java.util.UUID; public class BitSetChunkStore implements ChunkStore { - private static final int CURRENT_VERSION = 8; + 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 worldHeight; + 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; @@ -23,15 +25,16 @@ public class BitSetChunkStore implements ChunkStore { private transient boolean dirty = false; public BitSetChunkStore(@NotNull World world, int cx, int cz) { - this(world.getUID(), world.getMaxHeight(), cx, cz); + this(world.getUID(), Misc.getWorldMinCompat(world), world.getMaxHeight(), cx, cz); } - private BitSetChunkStore(@NotNull UUID worldUid, int worldHeight, int cx, int cz) { + private BitSetChunkStore(@NotNull UUID worldUid, int worldMin, int worldMax, int cx, int cz) { this.cx = cx; this.cz = cz; this.worldUid = worldUid; - this.worldHeight = worldHeight; - this.store = new BitSet(16 * 16 * worldHeight); + this.worldMin = worldMin; + this.worldMax = worldMax; + this.store = new BitSet(16 * 16 * (worldMax - worldMin)); } @Override @@ -54,6 +57,16 @@ public class BitSetChunkStore implements ChunkStore { return cz; } + @Override + public int getChunkMin() { + return worldMin; + } + + @Override + public int getChunkMax() { + return worldMax; + } + @Override public @NotNull UUID getWorldId() { return worldUid; @@ -86,22 +99,34 @@ public class BitSetChunkStore implements ChunkStore { } private int coordToIndex(int x, int y, int z) { - return coordToIndex(x, y, z, worldHeight); + return coordToIndex(x, y, z, worldMin, worldMax); } - private static int coordToIndex(int x, int y, int z, int worldHeight) { - if (x < 0 || x >= 16 || y < 0 || y >= worldHeight || z < 0 || z >= 16) - throw new IndexOutOfBoundsException(String.format("x: %d y: %d z: %d World Height: %d", x, y, z, worldHeight)); - return (z * 16 + x) + (256 * y); + 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 getWorldHeight(@NotNull UUID worldUid, int storedWorldHeight) + private static int getWorldMin(@NotNull UUID worldUid, int storedWorldMin) { 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) - return storedWorldHeight; + return storedWorldMin; + + return Misc.getWorldMinCompat(world); + } + + private static int getWorldMax(@NotNull UUID worldUid, int storedWorldMax) + { + 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) + return storedWorldMax; return world.getMaxHeight(); } @@ -114,7 +139,8 @@ public class BitSetChunkStore implements ChunkStore { out.writeLong(worldUid.getMostSignificantBits()); out.writeInt(cx); out.writeInt(cz); - out.writeInt(worldHeight); + 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(); @@ -129,7 +155,7 @@ public class BitSetChunkStore implements ChunkStore { // Can be used to determine the format of the file int fileVersionNumber = in.readInt(); - if (magic != MAGIC_NUMBER || fileVersionNumber != CURRENT_VERSION) + if (magic != MAGIC_NUMBER || fileVersionNumber < 8) throw new IOException(); long lsb = in.readLong(); @@ -138,21 +164,38 @@ public class BitSetChunkStore implements ChunkStore { int cx = in.readInt(); int cz = in.readInt(); - int worldHeight = 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 currentWorldHeight = getWorldHeight(worldUid, worldHeight); + int currentWorldMin = getWorldMin(worldUid, worldMin); + int currentWorldMax = getWorldMax(worldUid, worldMax); - boolean worldHeightShrunk = currentWorldHeight < worldHeight; - // Lop off extra data if world height has shrunk - if (worldHeightShrunk) - stored.clear(coordToIndex(16, currentWorldHeight, 16, worldHeight), stored.length()); + // 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, currentWorldHeight, cx, cz); + BitSetChunkStore chunkStore = new BitSetChunkStore(worldUid, currentWorldMin, currentWorldMax, cx, cz); chunkStore.store.or(stored); - chunkStore.dirty = worldHeightShrunk; // In the expanded case there is no reason to re-write it unless the data changes + chunkStore.dirty = currentWorldMin != worldMin || currentWorldMax != worldMax; return chunkStore; } @@ -203,7 +246,7 @@ public class BitSetChunkStore implements ChunkStore { private int cx; private int cz; - private int worldHeight; + private int worldMax; private UUID worldUid; private boolean[][][] store; @@ -226,19 +269,20 @@ public class BitSetChunkStore implements ChunkStore { cz = in.readInt(); store = (boolean[][][]) in.readObject(); - worldHeight = store[0][0].length; + worldMax = store[0][0].length; } public @NotNull BitSetChunkStore convert() { - int currentWorldHeight = getWorldHeight(worldUid, worldHeight); + int currentWorldMin = getWorldMin(worldUid, 0); + int currentWorldMax = getWorldMax(worldUid, worldMax); - BitSetChunkStore converted = new BitSetChunkStore(worldUid, currentWorldHeight, cx, cz); + 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 < worldHeight && y < currentWorldHeight; y++) { + for (int y = 0; y < worldMax && y < currentWorldMax; y++) { converted.store.set(converted.coordToIndex(x, y, z), store[x][z][y]); } } diff --git a/src/main/java/com/gmail/nossr50/util/blockmeta/ChunkStore.java b/src/main/java/com/gmail/nossr50/util/blockmeta/ChunkStore.java index e21006628..632cde2e2 100644 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/ChunkStore.java +++ b/src/main/java/com/gmail/nossr50/util/blockmeta/ChunkStore.java @@ -36,6 +36,9 @@ public interface ChunkStore { */ int getChunkZ(); + int getChunkMin(); + int getChunkMax(); + @NotNull UUID getWorldId(); /** diff --git a/src/test/java/com/gmail/nossr50/util/blockmeta/ChunkStoreTest.java b/src/test/java/com/gmail/nossr50/util/blockmeta/ChunkStoreTest.java index 450cd7222..99e61dbe5 100644 --- a/src/test/java/com/gmail/nossr50/util/blockmeta/ChunkStoreTest.java +++ b/src/test/java/com/gmail/nossr50/util/blockmeta/ChunkStoreTest.java @@ -1,6 +1,7 @@ package com.gmail.nossr50.util.blockmeta; import com.gmail.nossr50.TestUtil; +import com.gmail.nossr50.util.Misc; import com.google.common.io.Files; import org.bukkit.Bukkit; import org.bukkit.World; @@ -22,7 +23,7 @@ import static org.mockito.Mockito.mock; * 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. */ @RunWith(PowerMockRunner.class) -@PrepareForTest(Bukkit.class) +@PrepareForTest({ Bukkit.class, Misc.class }) public class ChunkStoreTest { private static File tempDir; @BeforeClass @@ -76,6 +77,34 @@ public class ChunkStoreTest { assertEqual(original, deserialized); } + @Test + public void testNegativeWorldMin() throws IOException { + PowerMockito.mockStatic(Misc.class); + Mockito.when(Misc.getWorldMinCompat(mockWorld)).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 + public 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); + + PowerMockito.mockStatic(Misc.class); + Mockito.when(Misc.getWorldMinCompat(mockWorld)).thenReturn(-64); + ChunkStore deserialized = BitSetChunkStore.Serialization.readChunkStore(new DataInputStream(new ByteArrayInputStream(serializedBytes))); + assertEqualIgnoreMinMax(original, deserialized); + } + @Test public void testChunkCoords() throws IOException { for (int x = -96; x < 0; x++) { @@ -175,14 +204,25 @@ public class ChunkStoreTest { } private void assertEqual(ChunkStore expected, ChunkStore actual) + { + Assert.assertEquals(expected.getChunkMin(), actual.getChunkMin()); + Assert.assertEquals(expected.getChunkMax(), actual.getChunkMax()); + assertEqualIgnoreMinMax(expected, actual); + } + + private void assertEqualIgnoreMinMax(ChunkStore expected, ChunkStore actual) { Assert.assertEquals(expected.getChunkX(), actual.getChunkX()); Assert.assertEquals(expected.getChunkZ(), actual.getChunkZ()); Assert.assertEquals(expected.getWorldId(), actual.getWorldId()); - for (int y = 0; y < 256; y++) + 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++) Assert.assertTrue(expected.isTrue(x, y, z) == actual.isTrue(x, y, z)); + } } private static byte[] serializeChunkstore(@NotNull ChunkStore chunkStore) throws IOException { @@ -231,6 +271,16 @@ public class ChunkStoreTest { return cz; } + @Override + public int getChunkMin() { + return 0; + } + + @Override + public int getChunkMax() { + return store[0][0].length; + } + @Override public @NotNull UUID getWorldId() { return worldUid; From b8932802b7726119fccb1305f99119a9229ebba3 Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Thu, 18 Feb 2021 18:58:25 +0100 Subject: [PATCH 373/662] Added Maven workflow to validate pull requests and commits (#4432) * Create maven workflow * Also run it when the workflow file was modified * Added local Maven cache * I know how to count :eyes: --- .github/workflows/maven.yml | 51 +++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 .github/workflows/maven.yml diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml new file mode 100644 index 000000000..447aa61ba --- /dev/null +++ b/.github/workflows/maven.yml @@ -0,0 +1,51 @@ +# 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 1.8 JDK + - name: Java 1.8 setup + uses: actions/setup-java@v1.4.3 + with: + java-package: jdk + java-version: 1.8 + + # 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 From db2c0e89e779e0b062743d9520c472951490a0c8 Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Tue, 23 Feb 2021 21:28:45 +0100 Subject: [PATCH 374/662] Fixed #4438 and also normalized some stuff (#4439) --- src/main/java/com/gmail/nossr50/mcMMO.java | 63 ++++++++++++---------- 1 file changed, 35 insertions(+), 28 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index 0b52bb832..ef9f39442 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -52,7 +52,6 @@ import com.gmail.nossr50.util.skills.RankUtils; 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; @@ -62,11 +61,14 @@ import org.bukkit.event.HandlerList; import org.bukkit.metadata.FixedMetadataValue; import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.java.JavaPlugin; +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.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; @@ -124,24 +126,24 @@ public class mcMMO extends JavaPlugin { private static boolean isRetroModeEnabled; /* Metadata Values */ - public final static String REPLANT_META_KEY = "mcMMO: Recently Replanted"; + public static final 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 DODGE_TRACKER = "mcMMO: Dodge Tracker"; public static final String CUSTOM_DAMAGE_METAKEY = "mcMMO: Custom Damage"; - public final static String travelingBlock = "mcMMO: Traveling Block"; - public final static String blockMetadataKey = "mcMMO: Piston Tracking"; - public final static String tntMetadataKey = "mcMMO: Tracked TNT"; - public final static String customNameKey = "mcMMO: Custom Name"; - public final static String customVisibleKey = "mcMMO: Name Visibility"; - public final static String droppedItemKey = "mcMMO: Tracked Item"; - public final static String infiniteArrowKey = "mcMMO: Infinite Arrow"; - public final static String 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 disarmedItemKey = "mcMMO: Disarmed Item"; - public final static String playerDataKey = "mcMMO: Player Data"; - public final static String databaseCommandKey = "mcMMO: Processing Database Command"; + public static final String travelingBlock = "mcMMO: Traveling Block"; + public static final String blockMetadataKey = "mcMMO: Piston Tracking"; + public static final String tntMetadataKey = "mcMMO: Tracked TNT"; + public static final String customNameKey = "mcMMO: Custom Name"; + public static final String customVisibleKey = "mcMMO: Name Visibility"; + public static final String droppedItemKey = "mcMMO: Tracked Item"; + public static final String infiniteArrowKey = "mcMMO: Infinite Arrow"; + public static final String trackedArrow = "mcMMO: Tracked Arrow"; + public static final String bowForceKey = "mcMMO: Bow Force"; + public static final String arrowDistanceKey = "mcMMO: Arrow Distance"; + public static final String BONUS_DROPS_METAKEY = "mcMMO: Double Drops"; + public static final String disarmedItemKey = "mcMMO: Disarmed Item"; + public static final String playerDataKey = "mcMMO: Player Data"; + public static final String databaseCommandKey = "mcMMO: Processing Database Command"; public static FixedMetadataValue metadataValue; @@ -158,7 +160,9 @@ public class mcMMO extends JavaPlugin { //Platform Manager platformManager = new PlatformManager(); + //Filter out any debug messages (if debug/verbose logging is not enabled) getLogger().setFilter(new LogFilter(this)); + metadataValue = new FixedMetadataValue(this, true); PluginManager pluginManager = getServer().getPluginManager(); @@ -273,6 +277,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 @@ -284,6 +291,7 @@ public class mcMMO extends JavaPlugin { //Init smelting tracker smeltingTracker = new SmeltingTracker(); + //Set up Adventure's audiences audiences = BukkitAudiences.create(this); transientMetadataTools = new TransientMetadataTools(this); @@ -347,8 +355,9 @@ public class mcMMO extends JavaPlugin { holidayManager.saveAnniversaryFiles(); placeStore.closeAll(); } - - catch (Exception e) { e.printStackTrace(); } + catch (Exception e) { + e.printStackTrace(); + } if (Config.getInstance().getBackupsEnabled()) { // Remove other tasks BEFORE starting the Backup, or we just cancel it straight away. @@ -358,14 +367,12 @@ 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()); } } @@ -682,9 +689,9 @@ public class mcMMO extends JavaPlugin { } } - 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); } /** From ef1a8f81946eb3cab98e0a41bb337b612f3102af Mon Sep 17 00:00:00 2001 From: w1tcherrr <70418164+w1tcherrr@users.noreply.github.com> Date: Tue, 23 Feb 2021 21:29:24 +0100 Subject: [PATCH 375/662] Updated locale_de.properties language file (german) (#4423) * Fixed various grammatical and spelling mistakes. Made some adjustments to the colour scheme to make the design more consistent. * Changed mistakes in UTF-8 encoding --- .../resources/locale/locale_de.properties | 608 +++++++++--------- 1 file changed, 304 insertions(+), 304 deletions(-) diff --git a/src/main/resources/locale/locale_de.properties b/src/main/resources/locale/locale_de.properties index 993399dee..7b6b534b5 100644 --- a/src/main/resources/locale/locale_de.properties +++ b/src/main/resources/locale/locale_de.properties @@ -4,24 +4,24 @@ Ability.Generic.Template = &3{0}: &a{1} Ability.Generic.Template.Custom = &3{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.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.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.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.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\u00E4ltst 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.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: @@ -41,45 +41,45 @@ 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.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.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.SubSkill.SkillShot.Stat = Skillshot Bonus-Schaden Axes.Ability.Bonus.0 = Axtmeister -Axes.Ability.Bonus.1 = {0} Bonus Schaden. +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.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.Ability.Bonus.5 = Verursacht {0} Bonus-Schaden gegen Gegner ohne R\u00FCstung. +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\u00FCr {1}s pausiert) -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.Combat.CritStruck = &cDu wurdest &4schwer &cverwundet! +Axes.Combat.CriticalHit = &4&Kritischer 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\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.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.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.SubSkill.AxesLimitBreak.Stat = Bonus-Schaden durch \u00DCberwindung Axes.SubSkill.CriticalStrikes.Description = Doppelter Schaden. Axes.SubSkill.CriticalStrikes.Name = Kritischer Treffer Axes.SubSkill.CriticalStrikes.Stat = Chance f\u00FCr kritischen Treffer @@ -106,20 +106,20 @@ Combat.BeastLoreHorseJumpStrength = &3Pferde-Sprungst\u00E4rke (&aMaximal {0} Bl Combat.BeastLoreHorseSpeed =&3Pferde-Laufgeschwindigkeit (&a{0} Bl\u00F6cke/s&3) Combat.BeastLoreOwner = &3Besitzer (&c{0}&3) Combat.Gore = &a&o**Aufgeschlitzt** -Combat.StruckByGore = &a&o**du wurdest 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.TouchedFuzzy = &a&o**Du wurdest ungl\u00FCcklich ber\u00FChrt, ein Schwindelgef\u00FChl 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.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.AdminToggle = &a- Schalte den Admin-Chat 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 @@ -127,55 +127,55 @@ Commands.Cooldowns.Row.Y = &b{0}&f - &2Bereit! Commands.Database.Cooldown = Du musst {0} Sekunden warten bis du diesen Befehl wieder ausf\u00FChren kannst! Commands.Database.CooldownMS = Du musst {0}ms warten bis du diesen Befehl wieder ausf\u00FChren 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 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.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 = \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.mmocompat = Information about mcMMO and whether or not its in compatibility mode or fully functional. -Commands.Description.mmodebug = (De)aktiviere den Debugging-Modus, welcher n\u00FCtzliche Informationen ausgibt, wenn du einen Block schl\u00E4gst -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.mmoxpbar = Player settings for mcMMO XP bars -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.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.mmocompat = Informationen dar\u00FCber, ob mcMMO im Kompatibilit\u00E4tsmodus oder voll funktionsf\u00E4hig ist. +Commands.Description.mmodebug = (De)aktiviere den Debugging-Modus, welcher n\u00FCtzliche Informationen ausgibt, wenn du einen Block schl\u00E4gst. +Commands.Description.mmoedit = Editiere die Skill-Level eines Spielers. +Commands.Description.mmoinfo = Lese Details \u00FCber 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\u00FCr die mcMMO Erfahrungsleisten. +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 Erfahrungsleiste auf einen bestimmten Skill fest. +Commands.Description.xprate = \u00C4ndere 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\u00DF! -Commands.Event.XP = &3Erfahrungs Rate ist jetzt &6{0}&3x +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\u00FCr &e{0} 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.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 @@ -196,16 +196,16 @@ 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.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.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.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 @@ -215,20 +215,20 @@ 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 = &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.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.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 @@ -237,14 +237,14 @@ 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.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.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.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. @@ -253,23 +253,23 @@ 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.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.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.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.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.3.XP = &cDie korrekte Verwendung /{0} {1} {2} {3}&7 (Du kannst auch -s an das Ende des Befehls hinzuf\u00FC"gen, damit der Spieler nicht benachrichtigt wird) +Commands.Usage.3.XP = &cDie korrekte Verwendung ist /{0} {1} {2} {3}&7 (Du kannst auch -s an das Ende des Befehls hinzuf\u00FC"gen, damit der Spieler nicht benachrichtigt wird.) Commands.Usage.FullClassName = Klassenname Commands.Usage.Level = Level Commands.Usage.Message = Nachricht @@ -284,7 +284,7 @@ Commands.Usage.XP = Erfahrung Commands.XPBar.DisableAll = &6Alle mcMMO Erfahrungsleisten wurden deaktiviert, benutze /mmoxpbar reset um die Standardeinstellungen wiederherzustellen. Commands.XPBar.Reset = &6Die Erfahrungsleisten-Einstellungen f\u00FCr mcMMO wurden zur\u00FCckgesetzt. Commands.XPBar.SettingChanged = &6Die Erfahrungsleisten-Einstellungen f\u00FCr &a{0}&6 wurden gesetzt auf: &a{1} -Commands.XPBar.Usage = Proper usage is /mmoxpbar +Commands.XPBar.Usage = Die korrekte Verwendung ist /mmoxpbar Commands.XPGain = &8XP ZUWACHS: &f{0} Commands.XPGain.Acrobatics = Fallen Commands.XPGain.Alchemy = Tr\u00E4nke brauen @@ -292,7 +292,7 @@ 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.Fishing = Angeln Commands.XPGain.Herbalism = Ernten Commands.XPGain.Mining = Erze und Steine abbauen Commands.XPGain.Overhaul = &6Erfahrungserhalt: &3{0} @@ -308,14 +308,14 @@ 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.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.Finish = &7Konvertierung vollendet - es wird jetzt die {0} Erfahrungskurve 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.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! @@ -339,7 +339,7 @@ Commands.ptp.Enabled = Party-Teleportierung &aaktiviert Commands.ptp.NoRequests = Du hast aktuell keine Teleportierungsanfragen. 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.Request2 = &aUm zu teleportieren tippe &e/ptp accept&a. Die Anfrage l\u00E4uft 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! @@ -362,141 +362,141 @@ Effects.Parent = &6{0} - Effects.SubSkills.Overhaul = F\u00E4higkeiten Effects.Template = &3{0}: &a{1} -Excavation.Ability.Lower = &a&o**Du senkst deine Schaufel ...** -Excavation.Ability.Ready = &a&o**Du hebst deine Schaufel!** +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.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.Archaeology.Stat = Arch\u00E4ologie Erfahrungspunkte-Chance Excavation.SubSkill.Archaeology.Stat.Extra = Arch\u00E4ologie Erfahrungspunkte-Anzahl -Excavation.SubSkill.GigaDrillBreaker.Description = Dreifache Droprate, Dreifache Erfahrung und Bonus Geschwindigkeit. +Excavation.SubSkill.GigaDrillBreaker.Description = Dreifache Droprate, dreifache Erfahrung und Bonus-Geschwindigkeit. Excavation.SubSkill.GigaDrillBreaker.Name = Gigabohrer Excavation.SubSkill.GigaDrillBreaker.Stat = Gigabohrer-Dauer -Fishing.Ability.Info = Zauberj\u00E4ger: &7 **Verbessert sich mit Schatzj\u00E4ger Rang** +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.Ability.TH.MagicFound = &bDu f\u00FChlst etwas Magisches in diesem Fang... +Fishing.Ability.TH.Poison = &7Irgendetwas stinkt hier... Fishing.Chance.Raining = &9Regen-Bonus -Fishing.Exhausting = &c&oUnsachgem\u00E4\u00DFe Nutzung der Angelrute f\u00FChrt zu Erm\u00FCdung und abnutzen der Rute. +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.LowResourcesTip = &7Dein Gesp\u00FCr 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.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.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.Description = Finde verzauberte Gegenst\u00E4nde. Fishing.SubSkill.MagicHunter.Name = Zauber-J\u00E4ger Fishing.SubSkill.MagicHunter.Stat = Zauber-J\u00E4ger Chance Fishing.SubSkill.MasterAngler.Description = Fische k\u00F6nnen h\u00E4ufiger 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} seconds -Fishing.SubSkill.MasterAngler.Stat.Extra = Maximalwartezeit beim Angeln reduziert um: &a-{0} seconds -Fishing.SubSkill.Shake.Description = Rei\u00DFe Gegenst\u00E4nde weg von Lebewesen und Spielern mit deiner Angel +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 = Rei\u00DFe mit deiner Angel Gegenst\u00E4nde weg von Lebewesen und Spielern. 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}\n&9Selten: &e{2} &dEpisch: &e{3} &6Legend\u00E4r: &e{4} &bMythic: &e{5} +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}\n&9Selten: &e{2} &dEpisch: &e{3} &6Legend\u00E4r: &e{4} &bMythic: &e{5} 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.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\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. -Guides.Alchemy.Section.2 = &3Wie funktioniert Gebr\u00E4u?\n&eGebr\u00E4u 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.2 = &3Wie funktioniert Gebr\u00E4u?\n&eGebr\u00E4u 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 freizuschalten. Guides.Alchemy.Section.3 = &3Gebr\u00E4u 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\u00E4u Tier 2 Zutaten:\n&eKarotte (Eile)\n&eSchleimball (Langsamkeit)\n\n&3Gebr\u00E4u Tier 3 Zutaten:\n&eQuarz (Absoption)\n&eRoter Pilz (Springen) +Guides.Alchemy.Section.4 = &3Gebr\u00E4u Tier 2 Zutaten:\n&eKarotte (Eile)\n&eSchleimball (Langsamkeit)\n\n&3Gebr\u00E4u Tier 3 Zutaten:\n&eQuarz (Absorption)\n&eRoter Pilz (Sprungkraft) Guides.Alchemy.Section.5 = &3Gebr\u00E4u Tier 4 Zutaten:\n&eApfel (Gesundheitsboost)\n&eVerrottetes Fleisch (Hunger)\n\n&3Gebr\u00E4u Tier 5 Zutaten:\n&eBrauner Pilz(\u00DCbelkeit)\n&eTintensack (Blindheit) Guides.Alchemy.Section.6 = &3Gebr\u00E4u Tier 6 Zutaten:\n&eGras (S\u00E4ttigung)\n\n&3Gebr\u00E4u Tier 7 Zutaten:\n&eGiftige Kartoffel (Verwesung)\n\n&3Gebr\u00E4u 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.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.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.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.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.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.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.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\u00DCber Kr\u00E4uterkunde\n&eIn Kr\u00E4uterkunde geht es um das Ernten.\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.1 = &3Kompatible Pflanzen:\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 einzuhauchen 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\u00E4uterkunde 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.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\u00E4uterkunde-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.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 Bl\u00F6cke 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.2 = &3Wie funktioniert der 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 der Super-Brecher\n&eaktiviert. +Guides.Mining.Section.3 = &3Was ist der 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.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\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.0 = &3\u00DCber 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\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.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 werden, 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.3 = &3Zur Verbildlichung ein Beispiel:\n&eVerwerten wir eine Goldspitzhacke 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.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.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.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.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 Materialien 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.0 = &3\u00DCber Holzf\u00E4ller:\n&eIm Holzf\u00E4llen geht es um das F\u00E4llen von B\u00E4umen.\n\n&3XP ZUWACHS:\n&eDu bekommst 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. @@ -514,46 +514,46 @@ Hardcore.Vampirism.Victim.Failure = &6[mcMMO] &e{0}&7 hat es nicht geschafft Wis Hardcore.Vampirism.Victim.Success = &6[mcMMO] &e{0}&4 hat&9{1}&4 Level von dir gestohlen! 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.Ability.GTh = &a**Gr\u00FCner Daumen** +Herbalism.Ability.GTh.Fail = **Gr\u00FCner 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\u00FCne 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.Off = &a&o**Gr\u00FCnes Land ist ausgelaufen** +Herbalism.Skills.GTe.On = &a&o**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.Description = Verdoppelt die normale Ausbeute (Loot). +Herbalism.SubSkill.DoubleDrops.Name = Doppeldrops (Alle Pflanzen) Herbalism.SubSkill.DoubleDrops.Stat = Doppeldrop Chance -Herbalism.SubSkill.FarmersDiet.Description = Erh\u00F6ht Effektivit\u00E4t von geernteter Nahrung +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.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.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.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 +Herbalism.SubSkill.ShroomThumb.Description = Verbreite Myzel auf Gras und Erde. +Herbalism.SubSkill.ShroomThumb.Name = Pilz-Zehe +Herbalism.SubSkill.ShroomThumb.Stat = Pilz-Zehe Chance Holiday.Anniversary = &9Alles gute zu mcMMO's {0} j\u00E4hrigen Geburtstag!\n&9In Ehren von nossr50 und all den anderen flei\u00DFigen Entwicklern, hier ist 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.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! @@ -563,7 +563,7 @@ 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.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. @@ -631,34 +631,34 @@ 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 -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.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&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\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.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\u00F6ht den Explosions-Radius +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.Description = Bonus beim Abbauen 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.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.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 @@ -668,8 +668,8 @@ 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 +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. Overhaul.Levelup = &l{0} erh\u00F6ht auf &r&a&l{2}&r&f. Overhaul.Name.Acrobatics = Akrobatik @@ -692,16 +692,16 @@ Overhaul.mcMMO.MmoInfo.Wiki = &e[&fLese \u00FCber 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\u00FCndet mit &c{0} -Party.Alliance.Formed = &7Deine Gruppe ist jetzt verb\u00FCndet mit &a{0} -Party.Disband = &7Die Gruppe wurde aufgel\u00F6st +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.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) @@ -713,19 +713,19 @@ 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.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.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! @@ -734,22 +734,22 @@ 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.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\u00FCtzt. +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.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 @@ -762,7 +762,7 @@ 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.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. @@ -777,15 +777,15 @@ 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.Desc = Erhalte mehr Erfahrung in bestimmten Skills. Perks.XP.Name = Erfahrung -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 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. +Profile.Loading.FailureNotice = &4[A] &cmcMMO konnte die Spielerdaten von &e{0}&c leider nicht laden. Bitte \u00DCberpr\u00FCfe deine Datenbankeinstellungen. &dVersuche: {1}. +Profile.Loading.FailurePlayer = &cmcMMO hat Probleme beim Laden deiner Daten nach &a{0}&c Versuchen. &8Kontaktiere den Serveradmin bez\u00FCglich dieses Problems. mcMMO wird weiterhin versuchen, deine Daten zu laden, bis du den Server verl\u00E4sst. 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. -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. +Reminder.Squelched = &7Erinnerung: Du erh\u00E4lst aktuell keinerlei Benachrichtigungen von mcMMO, um dies zu \u00E4ndern, nutze den /mcnotify Befehl. Dies ist eine st\u00FCndliche, automatische Erinnerung. Repair.Arcane.Downgrade = Zauber-Wert des Gegenstands vermindert. Repair.Arcane.Fail = Der Gegenstands wurde entzaubert. @@ -795,33 +795,33 @@ Repair.Error = &4mcMMO ist beim Versuch dieses Item zu reparieren auf einen Fehl 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.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.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.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 = &3Arkanes Schmieden Chancen:&7 Erfolg &a{0}&7%, Verlust &c{1}&7% -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.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.Description = Erh\u00F6ht den Reparatur-Wert. +Repair.SubSkill.RepairMastery.Name = Reparaturmeister 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.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 @@ -846,7 +846,7 @@ Salvage.Skills.TooDamaged = &4Das Item ist zu besch\u00E4digt um verwertet zu we 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.ScrapCollector.Description = Verschrotte einen Gegenstand, um Materialien zur\u00FCckzugewinnen, eine perfekte Verschrottung erfordert Gl\u00FCck und Geschick. +Salvage.SubSkill.ScrapCollector.Description = Verschrotte einen Gegenstand, um Materialien zur\u00FCckzugewinnen; eine perfekte Verschrottung erfordert Gl\u00FCck und Geschick. Salvage.SubSkill.ScrapCollector.Name = Schrottsammler Salvage.SubSkill.ScrapCollector.Stat = Schrottsammler: &aVerschrotte bis zu &e{0}&a Gegenst\u00E4nde. Hierbei spielt Gl\u00FCck eine gewisse Rolle. 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. @@ -871,11 +871,11 @@ Skills.AbilityGateRequirementFail = &7Du ben\u00F6tigst &e{0}&7 weitere Level in 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.ConfirmOrCancel = &aErneuter Rechtsklick zur Best\u00E4tigung &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 = &4Du brauchst mehr &7{0}. Skills.NeedMore.Extra = &4Du ben\u00F6tigst mehr &7{0}{1}! Skills.Overhaul.Header = &c[]=====[]&a {0} &c[]=====[] Skills.Parents = ELTERN @@ -884,22 +884,22 @@ Skills.TooTired = Du bist zu m\u00FCde um diese F\u00E4higkeit zu verwenden. &e( Skills.TooTired.Extra = &6{0} &eSuperf\u00E4higkeit CDs - {1} Skills.TooTired.Named = &7(&6{0}&e {1}s&7) -Smelting.Ability.Locked.0 = GESPERRT bis {0}+ Skill (XP BOOST) -Smelting.Ability.Locked.1 = GESPERRT bis {0}+ Skill (SCHMELZTIEGEL) +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.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.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 Öfen +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.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.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 @@ -908,28 +908,28 @@ Stats.Header.Gathering = &6-=Sammelskills=- 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.Ability.Lower = &7&o**Du senkst dein Sschwert.** +Swords.Ability.Ready = &a&o**Du hebst dein Schwert...** +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.Countered = &a**Gegenangriff** Swords.Combat.Rupture.Note = &7INFO: &eEin Tick passiert jede halbe Sekunde! -Swords.Combat.SS.Struck = &4Getroffen von S\u00C4GEZAHNSCHLAG! +Swords.Combat.SS.Struck = &4Getroffen von S\u00E4gezahnschlag! 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.SkillName = Sschwert +Swords.Skills.SS.Off = &a&o**S\u00E4gezahnschlag abgenutzt** +Swords.Skills.SS.On = &a&o**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.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.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] @@ -941,55 +941,55 @@ 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.SubSkill.SwordsLimitBreak.Stat = Bonus-Schaden durch \u00DCberwindung Taming.Ability.Bonus.0 = Umweltbewusst -Taming.Ability.Bonus.1 = W\u00F6lfe weichen Gefahren aus +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.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.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.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.Listener.Wolf = &8Dein Wolf l\u00E4uft zu dir zur\u00FCck... Taming.SkillName = Z\u00C4HMEN -Taming.SubSkill.BeastLore.Description = Knochenschlag inspiziert W\u00F6lfe und Ozelots +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 = 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.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.Description = Chance auf Heilung bei Attacke (Wolf). Taming.SubSkill.FastFoodService.Name = Schnell-Imbiss -Taming.SubSkill.Gore.Description = Kritische Treffer verursachen Blutung +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.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.Description = Reduktion von Explosions-Schaden. Taming.SubSkill.ShockProof.Name = Schock-Sicher -Taming.SubSkill.ThickFur.Description = Verminderter Schaden, Feuer-Resistent +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\u00F6nnen nicht gez\u00FCchtet werden. +Taming.Summon.COTW.BreedingDisallowed = &a(Ruf der Wildnis) &cBeschworene Tiere k\u00F6nnen nicht gez\u00FCchtet 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\u00F6tigst &e{0}&7 mehr von &3{1} +Taming.Summon.COTW.NeedMoreItems = &a(Ruf der Wildnis) &7Du ben\u00F6tigst &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. @@ -1003,30 +1003,30 @@ 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.Ability.Lower = &7&o**Du senkst deine F\u00E4uste.** +Unarmed.Ability.Ready = &a&o**Du hebste deine F\u00E4uste...** 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.On = &a**Berserker aktiviertT** +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.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.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.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.Description = L\u00E4sst Gegenstand aus der Hand des Feindes fallen. Unarmed.SubSkill.Disarm.Name = Entwaffnen Unarmed.SubSkill.Disarm.Stat = Entwaffnen Chance -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.SubSkill.SteelArmStyle.Description = Verst\u00E4rkt deinen Arm mit der Zeit +Unarmed.SubSkill.IronGrip.Description = Sch\u00FCtzt dich davor, entwaffnet zu werden. +Unarmed.SubSkill.IronGrip.Name = Eiserner Griff +Unarmed.SubSkill.IronGrip.Stat = Eiserner Griff Chance +Unarmed.SubSkill.SteelArmStyle.Description = Verst\u00E4rkt deinen Arm mit der Zeit. Unarmed.SubSkill.SteelArmStyle.Name = St\u00E4hlerner Arm Unarmed.SubSkill.UnarmedLimitBreak.Description = Durchbreche deine Grenzen! Unarmed.SubSkill.UnarmedLimitBreak.Name = \u00DCberwindung @@ -1036,34 +1036,34 @@ UpdateChecker.NewAvailable = Eine neue Version von mcMMO ist auf Spigot erh\u00E 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.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.Off = &a&o**Baumf\u00E4ller abgelaufen** +Woodcutting.Skills.TreeFeller.On = &a&o**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.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.Description = Verdoppelt die Ausbeute. +Woodcutting.SubSkill.HarvestLumber.Name = Doppeldrops Woodcutting.SubSkill.HarvestLumber.Stat = Doppeldrop Chance -Woodcutting.SubSkill.KnockOnWood.Description = Zus\u00E4tliche Drops durch Baumf\u00E4ller +Woodcutting.SubSkill.KnockOnWood.Description = Zus\u00E4tliche Drops durch Baumf\u00E4ller. Woodcutting.SubSkill.KnockOnWood.Loot.Normal = Standard-Loot von B\u00E4umen Woodcutting.SubSkill.KnockOnWood.Loot.Rank2 = Standard-Loot von B\u00E4umen und Erfahrungspunkte Woodcutting.SubSkill.KnockOnWood.Name = Auf Holz geklopft Woodcutting.SubSkill.KnockOnWood.Stat = Auf Holz geklopft -Woodcutting.SubSkill.LeafBlower.Description = Bl\u00E4st Bl\u00E4tter davon +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.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.Description = L\u00E4sst B\u00E4ume explodieren. Woodcutting.SubSkill.TreeFeller.Name = Baumf\u00E4ller Woodcutting.SubSkill.TreeFeller.Stat = Baumf\u00E4ller L\u00E4nge From 06e38c991a0b133d994f40c9225cd47b9a1aeb22 Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Thu, 25 Feb 2021 03:03:07 +0100 Subject: [PATCH 376/662] Updated dependencies (also fixes #4404) (#4440) --- pom.xml | 17 +++++++++-------- src/main/java/com/gmail/nossr50/mcMMO.java | 7 ++++--- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/pom.xml b/pom.xml index 411fa1606..485f4d7f9 100755 --- a/pom.xml +++ b/pom.xml @@ -101,6 +101,7 @@ 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 @@ -208,27 +209,27 @@ net.kyori adventure-text-serializer-gson - 4.4.0 + 4.5.1 net.kyori adventure-api - 4.4.0 + 4.5.1 net.kyori adventure-nbt - 4.4.0 + 4.5.1 net.kyori adventure-key - 4.4.0 + 4.5.1 net.kyori adventure-text-serializer-gson-legacy-impl - 4.4.0 + 4.5.1 net.kyori @@ -253,13 +254,13 @@ org.bstats bstats-bukkit - 1.8 + 2.2.1 compile org.spigotmc spigot-api - 1.16.4-R0.1-SNAPSHOT + 1.16.5-R0.1-SNAPSHOT provided @@ -307,7 +308,7 @@ org.mockito mockito-core - 3.4.6 + 3.8.0 test diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index ef9f39442..858160043 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -55,6 +55,7 @@ import com.gmail.nossr50.worldguard.WorldGuardManager; 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; @@ -258,12 +259,12 @@ public class mcMMO extends JavaPlugin { if(Config.getInstance().getIsMetricsEnabled()) { metrics = new Metrics(this, 3894); - metrics.addCustomChart(new Metrics.SimplePie("version", () -> getDescription().getVersion())); + metrics.addCustomChart(new SimplePie("version", () -> getDescription().getVersion())); if(Config.getInstance().getIsRetroMode()) - metrics.addCustomChart(new Metrics.SimplePie("leveling_system", () -> "Retro")); + metrics.addCustomChart(new SimplePie("leveling_system", () -> "Retro")); else - metrics.addCustomChart(new Metrics.SimplePie("leveling_system", () -> "Standard")); + metrics.addCustomChart(new SimplePie("leveling_system", () -> "Standard")); } } catch (Throwable t) { From 82b030409197479c7a14b1bbb617440122febb45 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 26 Feb 2021 15:28:50 -0800 Subject: [PATCH 377/662] Don't set smelt stacks to above item's max stack size --- Changelog.txt | 1 + .../nossr50/listeners/InventoryListener.java | 3 +- .../skills/smelting/SmeltingManager.java | 30 +++++++++++++------ 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 80ebd177f..0ad9d4d38 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,4 +1,5 @@ Version 2.1.175 + Fixed a bug where mcMMO would occasionally give a 65 item stack from a double smelt on a furnace Version 2.1.174 Some legacy color codes in our locale file were swapped to &-code equivalents (thanks ViaSnake) diff --git a/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java b/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java index bf78964d6..c3a0aa838 100644 --- a/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java @@ -116,7 +116,8 @@ public class InventoryListener implements Listener { //Profile doesn't exist if(offlineProfile != null) { - event.setResult(offlineProfile.getSmeltingManager().smeltProcessing(smelting, event.getResult())); + //Process smelting + offlineProfile.getSmeltingManager().smeltProcessing(event); } } } 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 518718765..0ad1a4803 100644 --- a/src/main/java/com/gmail/nossr50/skills/smelting/SmeltingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/smelting/SmeltingManager.java @@ -12,7 +12,9 @@ import com.gmail.nossr50.util.random.RandomChanceUtil; import com.gmail.nossr50.util.skills.RankUtils; import com.gmail.nossr50.util.skills.SkillActivationType; import org.bukkit.event.inventory.FurnaceBurnEvent; +import org.bukkit.event.inventory.FurnaceSmeltEvent; import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; public class SmeltingManager extends SkillManager { public SmeltingManager(McMMOPlayer mcMMOPlayer) { @@ -108,19 +110,29 @@ public class SmeltingManager extends SkillManager { } } - public ItemStack smeltProcessing(ItemStack smelting, ItemStack result) { + public void smeltProcessing(@NotNull FurnaceSmeltEvent furnaceSmeltEvent) { + ItemStack sourceItemStack = furnaceSmeltEvent.getSource(); + ItemStack resultItemStack = furnaceSmeltEvent.getResult(); - applyXpGain(Smelting.getResourceXp(smelting), XPGainReason.PVE, XPGainSource.PASSIVE); + applyXpGain(Smelting.getResourceXp(sourceItemStack), XPGainReason.PVE, XPGainSource.PASSIVE); //Add XP + int itemLimit = resultItemStack.getMaxStackSize(); - if (Config.getInstance().getDoubleDropsEnabled(PrimarySkillType.SMELTING, result.getType()) - && isSecondSmeltSuccessful() && result.getAmount() < 64) { - ItemStack newResult = result.clone(); + processDoubleSmelt(furnaceSmeltEvent, resultItemStack, itemLimit); + } - newResult.setAmount(result.getAmount() + 1); - return newResult; + private void processDoubleSmelt(@NotNull FurnaceSmeltEvent furnaceSmeltEvent, @NotNull ItemStack resultItemStack, int itemLimit) { + //TODO: Permission check work around, could store it as NBT on the furnace + //We don't do permission checks because this can be for an offline player and Bukkit has nothing to grab permissions for offline players + + //Process double smelt + if (Config.getInstance().getDoubleDropsEnabled(PrimarySkillType.SMELTING, resultItemStack.getType()) + && resultItemStack.getAmount() < itemLimit + && isSecondSmeltSuccessful()) { + + ItemStack newResult = resultItemStack.clone(); + newResult.setAmount(Math.min(resultItemStack.getAmount() + 1, itemLimit)); //Don't go over max stack limits + furnaceSmeltEvent.setResult(newResult); } - - return result; } public int vanillaXPBoost(int experience) { From 735a90fb353d84f2b1e0218fb39e6d7ab64354b2 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 26 Feb 2021 16:06:13 -0800 Subject: [PATCH 378/662] Fix arrow dupe bug Fixes #4430 --- Changelog.txt | 1 + .../nossr50/listeners/EntityListener.java | 11 ++- .../com/gmail/nossr50/util/ItemUtils.java | 88 ++++++++++++++++++- .../gmail/nossr50/util/MaterialMapStore.java | 15 ++++ 4 files changed, 108 insertions(+), 7 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 0ad9d4d38..323dd3a7a 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,5 +1,6 @@ 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 Version 2.1.174 Some legacy color codes in our locale file were swapped to &-code equivalents (thanks ViaSnake) diff --git a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java index ede2081e6..1d05c5eb6 100644 --- a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java @@ -19,6 +19,7 @@ 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.ItemUtils; import com.gmail.nossr50.util.Misc; import com.gmail.nossr50.util.Permissions; import com.gmail.nossr50.util.compat.layers.persistentdata.AbstractPersistentDataLayer; @@ -156,8 +157,7 @@ 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; } @@ -174,10 +174,9 @@ public class EntityListener implements Listener { if(!projectile.hasMetadata(mcMMO.arrowDistanceKey)) projectile.setMetadata(mcMMO.arrowDistanceKey, new FixedMetadataValue(pluginRef, projectile.getLocation())); - for (Enchantment enchantment : player.getInventory().getItemInMainHand().getEnchantments().keySet()) { - if (enchantment.getKey().equals(piercingEnchantment)) { - return; - } + //Check both hands + if(ItemUtils.doesPlayerHaveEnchantmentInHands(player, "piercing")) { + return; } if (RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.ARCHERY_ARROW_RETRIEVAL, player)) { diff --git a/src/main/java/com/gmail/nossr50/util/ItemUtils.java b/src/main/java/com/gmail/nossr50/util/ItemUtils.java index 62c8d2165..46c68183b 100644 --- a/src/main/java/com/gmail/nossr50/util/ItemUtils.java +++ b/src/main/java/com/gmail/nossr50/util/ItemUtils.java @@ -10,6 +10,7 @@ import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.mcMMO; 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; @@ -18,6 +19,7 @@ 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; @@ -35,14 +37,98 @@ 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 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. * diff --git a/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java b/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java index 8a0c378ed..3c88edd47 100644 --- a/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java +++ b/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java @@ -49,6 +49,7 @@ public class MaterialMapStore { 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 final @NotNull HashSet enchantables; @@ -88,6 +89,7 @@ public class MaterialMapStore { diamondTools = new HashSet<>(); netheriteTools = new HashSet<>(); bows = new HashSet<>(); + crossbows = new HashSet<>(); stringTools = new HashSet<>(); tools = new HashSet<>(); @@ -447,6 +449,7 @@ public class MaterialMapStore { fillTridents(); fillStringTools(); fillBows(); + fillCrossbows(); //Tools collection tools.addAll(woodTools); @@ -464,6 +467,10 @@ public class MaterialMapStore { bows.add("bow"); } + private void fillCrossbows() { + crossbows.add("crossbow"); + } + private void fillStringTools() { stringTools.add("bow"); stringTools.add("fishing_rod"); @@ -771,6 +778,14 @@ public class MaterialMapStore { return bows.contains(id); } + 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()); } From 713b0619c34711041096ba49753f9515b7abbdd4 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 26 Feb 2021 16:18:15 -0800 Subject: [PATCH 379/662] You can now disable Green Thumb for specific crops (the auto replanting) in config.yml --- Changelog.txt | 1 + src/main/java/com/gmail/nossr50/config/Config.java | 4 ++++ .../gmail/nossr50/skills/herbalism/HerbalismManager.java | 8 +++++--- src/main/resources/config.yml | 8 ++++++++ 4 files changed, 18 insertions(+), 3 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 323dd3a7a..4d892cafb 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,6 +1,7 @@ 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 Version 2.1.174 Some legacy color codes in our locale file were swapped to &-code equivalents (thanks ViaSnake) diff --git a/src/main/java/com/gmail/nossr50/config/Config.java b/src/main/java/com/gmail/nossr50/config/Config.java index cc8549303..81d727339 100644 --- a/src/main/java/com/gmail/nossr50/config/Config.java +++ b/src/main/java/com/gmail/nossr50/config/Config.java @@ -9,6 +9,7 @@ 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.util.ArrayList; @@ -597,4 +598,7 @@ public class Config extends AutoUpdateConfigLoader { 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/skills/herbalism/HerbalismManager.java b/src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java index 4a8104dd9..0d3279b1c 100644 --- a/src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java +++ b/src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java @@ -182,8 +182,10 @@ public class HerbalismManager extends SkillManager { //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()); + if(Config.getInstance().isGreenThumbReplantableCrop(originalBreak.getType())) { + if(!getPlayer().isSneaking()) { + greenThumbActivated = processGreenThumbPlants(originalBreak, blockBreakEvent, isGreenTerraActive()); + } } } @@ -688,7 +690,7 @@ public class HerbalismManager extends SkillManager { */ private boolean processGreenThumbPlants(BlockState blockState, BlockBreakEvent blockBreakEvent, boolean greenTerra) { if (!ItemUtils.isHoe(blockBreakEvent.getPlayer().getInventory().getItemInMainHand()) - && !ItemUtils.isAxe(blockBreakEvent.getPlayer().getInventory().getItemInMainHand())) { + && !ItemUtils.isAxe(blockBreakEvent.getPlayer().getInventory().getItemInMainHand())) { return false; } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index ad1a09e69..a853f697f 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -451,6 +451,14 @@ Skills: Tree_Feller_Sounds: true Level_Cap: 0 +# 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 ### From 4eecd344942b5ff509210c48014596ef85c63498 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 26 Feb 2021 17:48:20 -0800 Subject: [PATCH 380/662] 2.1.175 - Hotfix --- Changelog.txt | 2 ++ pom.xml | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index 4d892cafb..5a4497562 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -2,6 +2,8 @@ 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) diff --git a/pom.xml b/pom.xml index 485f4d7f9..cc7ccea82 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.175-SNAPSHOT + 2.1.175 mcMMO https://github.com/mcMMO-Dev/mcMMO From ac618cf48a4bd5d8207811c18282b54a5482bad2 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 2 Mar 2021 11:15:52 -0800 Subject: [PATCH 381/662] Add another measure to stop item stacks from becoming illegal sizes from double smelt --- Changelog.txt | 3 ++ pom.xml | 2 +- .../nossr50/listeners/InventoryListener.java | 2 +- .../skills/smelting/SmeltingManager.java | 28 +++++++++++++++---- 4 files changed, 28 insertions(+), 7 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 5a4497562..a0da56a3d 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,6 @@ +Version 2.1.176 + Added another measure to prevent item stacks from reaching 65 from double smelt + 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 diff --git a/pom.xml b/pom.xml index cc7ccea82..9c3b05df6 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.175 + 2.1.176-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO diff --git a/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java b/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java index c3a0aa838..c110de94c 100644 --- a/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java @@ -117,7 +117,7 @@ public class InventoryListener implements Listener { //Profile doesn't exist if(offlineProfile != null) { //Process smelting - offlineProfile.getSmeltingManager().smeltProcessing(event); + offlineProfile.getSmeltingManager().smeltProcessing(event, furnace); } } } 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 0ad1a4803..0f1b342f9 100644 --- a/src/main/java/com/gmail/nossr50/skills/smelting/SmeltingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/smelting/SmeltingManager.java @@ -11,6 +11,7 @@ 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.Furnace; import org.bukkit.event.inventory.FurnaceBurnEvent; import org.bukkit.event.inventory.FurnaceSmeltEvent; import org.bukkit.inventory.ItemStack; @@ -110,23 +111,40 @@ public class SmeltingManager extends SkillManager { } } - public void smeltProcessing(@NotNull FurnaceSmeltEvent furnaceSmeltEvent) { + public void smeltProcessing(@NotNull FurnaceSmeltEvent furnaceSmeltEvent, @NotNull Furnace furnace) { ItemStack sourceItemStack = furnaceSmeltEvent.getSource(); ItemStack resultItemStack = furnaceSmeltEvent.getResult(); applyXpGain(Smelting.getResourceXp(sourceItemStack), XPGainReason.PVE, XPGainSource.PASSIVE); //Add XP - int itemLimit = resultItemStack.getMaxStackSize(); - processDoubleSmelt(furnaceSmeltEvent, resultItemStack, itemLimit); + + processDoubleSmelt(furnaceSmeltEvent, resultItemStack, furnace); } - private void processDoubleSmelt(@NotNull FurnaceSmeltEvent furnaceSmeltEvent, @NotNull ItemStack resultItemStack, int itemLimit) { + private void processDoubleSmelt(@NotNull FurnaceSmeltEvent furnaceSmeltEvent, @NotNull ItemStack resultItemStack, @NotNull Furnace furnace) { + int itemLimit = resultItemStack.getMaxStackSize(); + + //Check for viewers + if(furnace.getInventory().getViewers().size() > 0) { + itemLimit = itemLimit - 1; //Lower max size to prevent exploit, the exploit involves an open window and a stack at 63 which is about to double smelt, instructions to replicate below + /* + Momshroom02/26/2021 + 1) have max (or close to it) smelting. + 2) put more than half a stack of an ore in a furnace and wait for it to smelt. + 3) have your inv full except for one items worth of whatever the furnace product is. (so like a stack of 63 iron and the rest of your inv is full). + 4) shift click on the furnace output to remove only one item-- leaving 63. + 5) let one more item smelt so the furnace appears to have 64 + 6) manually drag (don't shift click) the stack of product out of the furnace- it'll be 65 items + when you drop that and pick it up with only one free space in your inv, it'll look like there's more than one left on the ground, but for me, there was only one, and the "dupe" was visual only-- idk about VK's player. + */ + } + //TODO: Permission check work around, could store it as NBT on the furnace //We don't do permission checks because this can be for an offline player and Bukkit has nothing to grab permissions for offline players //Process double smelt if (Config.getInstance().getDoubleDropsEnabled(PrimarySkillType.SMELTING, resultItemStack.getType()) - && resultItemStack.getAmount() < itemLimit + && resultItemStack.getAmount() < itemLimit //We take away 1 because there's a certain "exploit" when certain plugins are used in combination && isSecondSmeltSuccessful()) { ItemStack newResult = resultItemStack.clone(); From afd2b509009acf8c4d185cd831d1103ec13ec9f7 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 2 Mar 2021 11:24:44 -0800 Subject: [PATCH 382/662] Remove unecessary comment --- .../java/com/gmail/nossr50/skills/smelting/SmeltingManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 0f1b342f9..d5b203c42 100644 --- a/src/main/java/com/gmail/nossr50/skills/smelting/SmeltingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/smelting/SmeltingManager.java @@ -144,7 +144,7 @@ public class SmeltingManager extends SkillManager { //Process double smelt if (Config.getInstance().getDoubleDropsEnabled(PrimarySkillType.SMELTING, resultItemStack.getType()) - && resultItemStack.getAmount() < itemLimit //We take away 1 because there's a certain "exploit" when certain plugins are used in combination + && resultItemStack.getAmount() < itemLimit && isSecondSmeltSuccessful()) { ItemStack newResult = resultItemStack.clone(); From e38bc14e860c5c50a2fc5d46ae87a0a8f9e0b19f Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 2 Mar 2021 13:54:20 -0800 Subject: [PATCH 383/662] Sometimes I hate being dyslexic, fixing illegal stack sizes in smelting.. again --- .../nossr50/listeners/InventoryListener.java | 2 +- .../skills/smelting/SmeltingManager.java | 52 +++++++------------ 2 files changed, 21 insertions(+), 33 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java b/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java index c110de94c..c3a0aa838 100644 --- a/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java @@ -117,7 +117,7 @@ public class InventoryListener implements Listener { //Profile doesn't exist if(offlineProfile != null) { //Process smelting - offlineProfile.getSmeltingManager().smeltProcessing(event, furnace); + offlineProfile.getSmeltingManager().smeltProcessing(event); } } } 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 d5b203c42..f6b52646b 100644 --- a/src/main/java/com/gmail/nossr50/skills/smelting/SmeltingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/smelting/SmeltingManager.java @@ -11,7 +11,6 @@ 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.Furnace; import org.bukkit.event.inventory.FurnaceBurnEvent; import org.bukkit.event.inventory.FurnaceSmeltEvent; import org.bukkit.inventory.ItemStack; @@ -111,48 +110,37 @@ public class SmeltingManager extends SkillManager { } } - public void smeltProcessing(@NotNull FurnaceSmeltEvent furnaceSmeltEvent, @NotNull Furnace furnace) { - ItemStack sourceItemStack = furnaceSmeltEvent.getSource(); - ItemStack resultItemStack = furnaceSmeltEvent.getResult(); + public void smeltProcessing(@NotNull FurnaceSmeltEvent furnaceSmeltEvent) { + applyXpGain(Smelting.getResourceXp(furnaceSmeltEvent.getSource()), XPGainReason.PVE, XPGainSource.PASSIVE); //Add XP - applyXpGain(Smelting.getResourceXp(sourceItemStack), XPGainReason.PVE, XPGainSource.PASSIVE); //Add XP - - - processDoubleSmelt(furnaceSmeltEvent, resultItemStack, furnace); + processDoubleSmelt(furnaceSmeltEvent); } - private void processDoubleSmelt(@NotNull FurnaceSmeltEvent furnaceSmeltEvent, @NotNull ItemStack resultItemStack, @NotNull Furnace furnace) { - int itemLimit = resultItemStack.getMaxStackSize(); - - //Check for viewers - if(furnace.getInventory().getViewers().size() > 0) { - itemLimit = itemLimit - 1; //Lower max size to prevent exploit, the exploit involves an open window and a stack at 63 which is about to double smelt, instructions to replicate below - /* - Momshroom02/26/2021 - 1) have max (or close to it) smelting. - 2) put more than half a stack of an ore in a furnace and wait for it to smelt. - 3) have your inv full except for one items worth of whatever the furnace product is. (so like a stack of 63 iron and the rest of your inv is full). - 4) shift click on the furnace output to remove only one item-- leaving 63. - 5) let one more item smelt so the furnace appears to have 64 - 6) manually drag (don't shift click) the stack of product out of the furnace- it'll be 65 items - when you drop that and pick it up with only one free space in your inv, it'll look like there's more than one left on the ground, but for me, there was only one, and the "dupe" was visual only-- idk about VK's player. - */ - } - - //TODO: Permission check work around, could store it as NBT on the furnace - //We don't do permission checks because this can be for an offline player and Bukkit has nothing to grab permissions for offline players + private void processDoubleSmelt(@NotNull FurnaceSmeltEvent furnaceSmeltEvent) { + ItemStack resultItemStack = furnaceSmeltEvent.getResult(); + /* + doubleSmeltCondition should be equal to the max + */ //Process double smelt if (Config.getInstance().getDoubleDropsEnabled(PrimarySkillType.SMELTING, resultItemStack.getType()) - && resultItemStack.getAmount() < itemLimit + && canDoubleSmeltItemStack(resultItemStack) //Effectively two less than max stack size && isSecondSmeltSuccessful()) { - ItemStack newResult = resultItemStack.clone(); - newResult.setAmount(Math.min(resultItemStack.getAmount() + 1, itemLimit)); //Don't go over max stack limits - furnaceSmeltEvent.setResult(newResult); + ItemStack doubleSmeltStack = resultItemStack.clone(); //TODO: Necessary? + doubleSmeltStack.setAmount(resultItemStack.getAmount() + 1); //Add one + furnaceSmeltEvent.setResult(doubleSmeltStack); //Set result } } + private boolean canDoubleSmeltItemStack(@NotNull ItemStack itemStack) { + int resultAmount = itemStack.getAmount(); //Amount before double smelt + int itemLimit = itemStack.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) { return experience * getVanillaXpMultiplier(); } From 4bd9ee0aa5698a21d5f6da9a58c0de254962f4b2 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 2 Mar 2021 15:17:55 -0800 Subject: [PATCH 384/662] Never expect bukkit API to be intuitive --- .../nossr50/listeners/InventoryListener.java | 2 +- .../skills/smelting/SmeltingManager.java | 22 +++++++++++++------ 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java b/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java index c3a0aa838..c110de94c 100644 --- a/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java @@ -117,7 +117,7 @@ public class InventoryListener implements Listener { //Profile doesn't exist if(offlineProfile != null) { //Process smelting - offlineProfile.getSmeltingManager().smeltProcessing(event); + offlineProfile.getSmeltingManager().smeltProcessing(event, furnace); } } } 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 f6b52646b..ddda94ba1 100644 --- a/src/main/java/com/gmail/nossr50/skills/smelting/SmeltingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/smelting/SmeltingManager.java @@ -11,8 +11,10 @@ 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.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; @@ -110,13 +112,13 @@ public class SmeltingManager extends SkillManager { } } - public void smeltProcessing(@NotNull FurnaceSmeltEvent furnaceSmeltEvent) { + public void smeltProcessing(@NotNull FurnaceSmeltEvent furnaceSmeltEvent, @NotNull Furnace furnace) { applyXpGain(Smelting.getResourceXp(furnaceSmeltEvent.getSource()), XPGainReason.PVE, XPGainSource.PASSIVE); //Add XP - processDoubleSmelt(furnaceSmeltEvent); + processDoubleSmelt(furnaceSmeltEvent, furnace); } - private void processDoubleSmelt(@NotNull FurnaceSmeltEvent furnaceSmeltEvent) { + private void processDoubleSmelt(@NotNull FurnaceSmeltEvent furnaceSmeltEvent, @NotNull Furnace furnace) { ItemStack resultItemStack = furnaceSmeltEvent.getResult(); /* doubleSmeltCondition should be equal to the max @@ -124,7 +126,7 @@ public class SmeltingManager extends SkillManager { //Process double smelt if (Config.getInstance().getDoubleDropsEnabled(PrimarySkillType.SMELTING, resultItemStack.getType()) - && canDoubleSmeltItemStack(resultItemStack) //Effectively two less than max stack size + && canDoubleSmeltItemStack(furnace) //Effectively two less than max stack size && isSecondSmeltSuccessful()) { ItemStack doubleSmeltStack = resultItemStack.clone(); //TODO: Necessary? @@ -133,9 +135,15 @@ public class SmeltingManager extends SkillManager { } } - private boolean canDoubleSmeltItemStack(@NotNull ItemStack itemStack) { - int resultAmount = itemStack.getAmount(); //Amount before double smelt - int itemLimit = itemStack.getMaxStackSize(); + private boolean canDoubleSmeltItemStack(@NotNull Furnace furnace) { + FurnaceInventory furnaceInventory = furnace.getInventory(); + ItemStack furnaceResult = furnaceInventory.getResult(); + + if(furnaceResult == null) + return false; + + 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; From 37610f76ceb3accd7ca353e2f9242a87855d4a54 Mon Sep 17 00:00:00 2001 From: Riley Park Date: Wed, 3 Mar 2021 21:56:44 -0800 Subject: [PATCH 385/662] Deploy to repository --- pom.xml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/pom.xml b/pom.xml index 9c3b05df6..360fd26c2 100755 --- a/pom.xml +++ b/pom.xml @@ -16,6 +16,16 @@ GitHub jar + + + neetgames + https://nexus.neetgames.com/repository/maven-releases/ + + + neetgames + https://nexus.neetgames.com/repository/maven-snapshots/ + + ${project.artifactId} ${basedir}/src/main/java From 5baccd626fbe9e0afdf296d49578151c36e348d3 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 4 Mar 2021 15:17:48 -0800 Subject: [PATCH 386/662] 2.1.176 - Small hotfix before bringing down endgame --- Changelog.txt | 2 +- pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index a0da56a3d..0152c7b63 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,5 +1,5 @@ Version 2.1.176 - Added another measure to prevent item stacks from reaching 65 from double smelt + 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 diff --git a/pom.xml b/pom.xml index 360fd26c2..6da24ef72 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.176-SNAPSHOT + 2.1.176 mcMMO https://github.com/mcMMO-Dev/mcMMO From a425ebcd106cb0e6a106ebe92c4129f2d7653f8f Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 5 Mar 2021 14:03:31 -0800 Subject: [PATCH 387/662] Add magma blocks to the things wolves avoid --- Changelog.txt | 3 +++ pom.xml | 2 +- src/main/java/com/gmail/nossr50/listeners/EntityListener.java | 1 + .../java/com/gmail/nossr50/skills/taming/TamingManager.java | 2 +- 4 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 0152c7b63..16cd6453b 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,6 @@ +Version 2.1.177 + Environmentally aware will now protect Wolves from Magma blocks + Version 2.1.176 Another fix for Double Smelt bringing item stack size to illegal values diff --git a/pom.xml b/pom.xml index 6da24ef72..cae199ec1 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.176 + 2.1.177-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO diff --git a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java index 1d05c5eb6..f354bd404 100644 --- a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java @@ -573,6 +573,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()); 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 6a902dd43..eb42b9899 100644 --- a/src/main/java/com/gmail/nossr50/skills/taming/TamingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/taming/TamingManager.java @@ -261,7 +261,7 @@ public class TamingManager extends SkillManager { player.sendMessage(message); } - public void processEnvironmentallyAware(Wolf wolf, double damage) { + public void processEnvironmentallyAware(@NotNull Wolf wolf, double damage) { if (damage > wolf.getHealth()) { return; } From 72264205d097c3e2c20eec06f775a1de9a02ba73 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 5 Mar 2021 14:27:53 -0800 Subject: [PATCH 388/662] Update player names immediately when change is detected --- Changelog.txt | 1 + .../database/FlatfileDatabaseManager.java | 18 ++++++++++++++---- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 16cd6453b..abede221e 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,5 +1,6 @@ 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 Version 2.1.176 Another fix for Double Smelt bringing item stack size to illegal values diff --git a/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java index 4c9753373..a00553eb5 100644 --- a/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java @@ -14,6 +14,7 @@ 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.player.UserManager; import com.gmail.nossr50.util.text.StringUtils; import org.bukkit.OfflinePlayer; import org.jetbrains.annotations.NotNull; @@ -477,6 +478,7 @@ public final class FlatfileDatabaseManager implements DatabaseManager { } public PlayerProfile loadPlayerProfile(String playerName, UUID uuid, boolean create) { + boolean updateRequired = false; BufferedReader in = null; String usersFilePath = mcMMO.getUsersFilePath(); @@ -504,11 +506,12 @@ public final class FlatfileDatabaseManager implements DatabaseManager { // Update playerName in database after name change if (!character[USERNAME].equalsIgnoreCase(playerName)) { - mcMMO.p.debug("Name change detected: " + character[USERNAME] + " => " + playerName); +// mcMMO.p.debug("Name change detected: " + character[USERNAME] + " => " + playerName); character[USERNAME] = playerName; + updateRequired = true; //Flag profile to update } - return loadFromLine(character); + return loadFromLine(character, updateRequired); } // Didn't find the player, create a new one @@ -563,7 +566,7 @@ public final class FlatfileDatabaseManager implements DatabaseManager { String[] character = line.split(":"); try { - destination.saveUser(loadFromLine(character)); + destination.saveUser(loadFromLine(character, false)); } catch (Exception e) { e.printStackTrace(); @@ -1146,7 +1149,7 @@ public final class FlatfileDatabaseManager implements DatabaseManager { } } - private PlayerProfile loadFromLine(String[] character) { + private PlayerProfile loadFromLine(@NotNull String[] character, boolean updateRequired) { Map skills = getSkillMapFromLine(character); // Skill levels Map skillsXp = new EnumMap<>(PrimarySkillType.class); // Skill & XP Map skillsDATS = new EnumMap<>(SuperAbilityType.class); // Ability & Cooldown @@ -1212,6 +1215,13 @@ public final class FlatfileDatabaseManager implements DatabaseManager { uniquePlayerDataMap.put(UniqueDataType.CHIMAERA_WING_DATS, 0); } + PlayerProfile playerProfile = new PlayerProfile(character[USERNAME], uuid, skills, skillsXp, skillsDATS, mobHealthbarType, scoreboardTipsShown, uniquePlayerDataMap); + + if(updateRequired) { + playerProfile.markProfileDirty(); + playerProfile.scheduleSyncSave(); //Save profile since fields have changed + } + return new PlayerProfile(character[USERNAME], uuid, skills, skillsXp, skillsDATS, mobHealthbarType, scoreboardTipsShown, uniquePlayerDataMap); } From b59d1afdb41a69dbb9df95b3bfb086109ffbce74 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 5 Mar 2021 14:48:05 -0800 Subject: [PATCH 389/662] Vanished players are treated as if they are offline for inspect command Fixed #4444 --- Changelog.txt | 5 +++++ .../commands/player/InspectCommand.java | 19 +++++++++++++------ .../util/scoreboards/ScoreboardManager.java | 19 ++++++++++++++++++- .../util/scoreboards/ScoreboardWrapper.java | 12 ++++++++++++ 4 files changed, 48 insertions(+), 7 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index abede221e..98c5994af 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,6 +1,11 @@ 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) + + 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 Version 2.1.176 Another fix for Double Smelt bringing item stack size to illegal values 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 3e54ffa8b..a65fa1cf2 100644 --- a/src/main/java/com/gmail/nossr50/commands/player/InspectCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/player/InspectCommand.java @@ -36,7 +36,9 @@ public class InspectCommand implements TabExecutor { return true; } - if (Config.getInstance().getScoreboardsEnabled() && sender instanceof Player && Config.getInstance().getInspectUseBoard()) { + if (Config.getInstance().getScoreboardsEnabled() + && sender instanceof Player + && Config.getInstance().getInspectUseBoard()) { ScoreboardManager.enablePlayerInspectScoreboard((Player) sender, profile); if (!Config.getInstance().getInspectUseChat()) { @@ -63,16 +65,21 @@ public class InspectCommand implements TabExecutor { } else { Player target = mcMMOPlayer.getPlayer(); + boolean isVanished = false; 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))) { + isVanished = true; + } + + //Only distance check players who are online and not vanished + if (!isVanished && 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().getScoreboardsEnabled() + && sender instanceof Player + && Config.getInstance().getInspectUseBoard()) { + ScoreboardManager.enablePlayerInspectScoreboard((Player) sender, mcMMOPlayer); if (!Config.getInstance().getInspectUseChat()) { return true; 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 ad32306ae..e6358ee2d 100644 --- a/src/main/java/com/gmail/nossr50/util/scoreboards/ScoreboardManager.java +++ b/src/main/java/com/gmail/nossr50/util/scoreboards/ScoreboardManager.java @@ -21,6 +21,7 @@ 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.*; @@ -327,7 +328,7 @@ public class ScoreboardManager { changeScoreboard(wrapper, Config.getInstance().getStatsScoreboardTime()); } - public static void enablePlayerInspectScoreboard(Player player, PlayerProfile targetProfile) { + public static void enablePlayerInspectScoreboard(@NotNull Player player, @NotNull PlayerProfile targetProfile) { ScoreboardWrapper wrapper = getWrapper(player); if(wrapper == null) { @@ -343,6 +344,22 @@ public class ScoreboardManager { } } + 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, Config.getInstance().getInspectScoreboardTime()); + } + } + public static void enablePlayerCooldownScoreboard(Player player) { ScoreboardWrapper wrapper = getWrapper(player); 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 56c7650dc..ad61aede0 100644 --- a/src/main/java/com/gmail/nossr50/util/scoreboards/ScoreboardWrapper.java +++ b/src/main/java/com/gmail/nossr50/util/scoreboards/ScoreboardWrapper.java @@ -25,6 +25,7 @@ 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; @@ -322,6 +323,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; From 31076e6ba96a7dced8fac7032c17a0b2cc789871 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 5 Mar 2021 14:54:11 -0800 Subject: [PATCH 390/662] Change PlayerFishEvent priority to HIGH instead of HIGHEST --- Changelog.txt | 1 + src/main/java/com/gmail/nossr50/listeners/PlayerListener.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index 98c5994af..121562136 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -2,6 +2,7 @@ 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 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. diff --git a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java index 0261adabc..340c8cac0 100644 --- a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java @@ -258,7 +258,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())) From 92efd5976083c9b0d7fb36e26dd8500b93a8d826 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 5 Mar 2021 15:13:14 -0800 Subject: [PATCH 391/662] Better compatibility with other fishing plugins Fixes #4428 --- Changelog.txt | 3 ++ .../McMMOReplaceVanillaTreasureEvent.java | 41 +++++++++++++++++++ .../nossr50/listeners/PlayerListener.java | 13 +++++- 3 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/gmail/nossr50/events/McMMOReplaceVanillaTreasureEvent.java diff --git a/Changelog.txt b/Changelog.txt index 121562136..566a3e035 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -3,10 +3,13 @@ Version 2.1.177 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 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 a Salmon 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 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/listeners/PlayerListener.java b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java index 340c8cac0..707658235 100644 --- a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java @@ -8,6 +8,7 @@ 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; @@ -291,12 +292,20 @@ public class PlayerListener implements Listener { if(event.getCaught() != null) { Item fishingCatch = (Item) event.getCaught(); - if (Config.getInstance(). getFishingOverrideTreasures() && + 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)); + + ItemStack replacementCatch = new ItemStack(Material.AIR); + + McMMOReplaceVanillaTreasureEvent replaceVanillaTreasureEvent = new McMMOReplaceVanillaTreasureEvent(fishingCatch, replacementCatch); + Bukkit.getPluginManager().callEvent(replaceVanillaTreasureEvent); + + //Replace + replacementCatch = replaceVanillaTreasureEvent.getReplacementItemStack(); + fishingCatch.setItemStack(replacementCatch); } if (Permissions.vanillaXpBoost(player, PrimarySkillType.FISHING)) { From 5e35a65fbf6f59628c2b2d8823ca46315f3c2487 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 5 Mar 2021 15:17:41 -0800 Subject: [PATCH 392/662] 2.1.177 --- pom.xml | 2 +- .../com/gmail/nossr50/database/FlatfileDatabaseManager.java | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index cae199ec1..19bee8b55 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.177-SNAPSHOT + 2.1.177 mcMMO https://github.com/mcMMO-Dev/mcMMO diff --git a/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java index a00553eb5..efa77fb9a 100644 --- a/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java @@ -14,7 +14,6 @@ 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.player.UserManager; import com.gmail.nossr50.util.text.StringUtils; import org.bukkit.OfflinePlayer; import org.jetbrains.annotations.NotNull; From 89c368e481fecdd7e375b6dc46e08c20eb706905 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 5 Mar 2021 15:39:23 -0800 Subject: [PATCH 393/662] changelog tweaks --- Changelog.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 566a3e035..a798cd303 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -3,13 +3,13 @@ Version 2.1.177 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 treasures are overridden (AIR instead of SALMON) + 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 a Salmon 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 + 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 From 12d0a220daac7b855f627f01f977e9a017baac51 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 5 Mar 2021 20:14:48 -0800 Subject: [PATCH 394/662] 2.1.178 --- Changelog.txt | 6 ++++++ pom.xml | 2 +- .../java/com/gmail/nossr50/listeners/PlayerListener.java | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index a798cd303..80254b1b8 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,9 @@ +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 diff --git a/pom.xml b/pom.xml index 19bee8b55..5bdb6cb7c 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.177 + 2.1.178 mcMMO https://github.com/mcMMO-Dev/mcMMO diff --git a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java index 707658235..b32083055 100644 --- a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java @@ -298,7 +298,7 @@ public class PlayerListener implements Listener { fishingCatch.getItemStack().getType() != Material.TROPICAL_FISH && fishingCatch.getItemStack().getType() != Material.PUFFERFISH) { - ItemStack replacementCatch = new ItemStack(Material.AIR); + ItemStack replacementCatch = new ItemStack(Material.SALMON, 1); McMMOReplaceVanillaTreasureEvent replaceVanillaTreasureEvent = new McMMOReplaceVanillaTreasureEvent(fishingCatch, replacementCatch); Bukkit.getPluginManager().callEvent(replaceVanillaTreasureEvent); From 8e5f2b804bf54b2c74004f4eeb007402db702be3 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sun, 7 Mar 2021 14:20:40 -0800 Subject: [PATCH 395/662] dev mode --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 5bdb6cb7c..c52ee9a2b 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.178 + 2.1.179-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO From f9097087fea194267e92cebacbcfe52c7ef89687 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sun, 7 Mar 2021 14:28:47 -0800 Subject: [PATCH 396/662] Fixed a bug where player levels were wiped on FlatFile database if players changed nicknames --- Changelog.txt | 7 +++++++ .../database/FlatfileDatabaseManager.java | 21 ++++++++++--------- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 80254b1b8..9f22ab842 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,10 @@ +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) diff --git a/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java index efa77fb9a..afd53ecc7 100644 --- a/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java @@ -477,7 +477,7 @@ public final class FlatfileDatabaseManager implements DatabaseManager { } public PlayerProfile loadPlayerProfile(String playerName, UUID uuid, boolean create) { - boolean updateRequired = false; +// boolean updateRequired = false; BufferedReader in = null; String usersFilePath = mcMMO.getUsersFilePath(); @@ -505,12 +505,13 @@ public final class FlatfileDatabaseManager implements DatabaseManager { // Update playerName in database after name change if (!character[USERNAME].equalsIgnoreCase(playerName)) { -// mcMMO.p.debug("Name change detected: " + character[USERNAME] + " => " + playerName); + //TODO: A proper fix for changed names + mcMMO.p.debug("Name change detected: " + character[USERNAME] + " => " + playerName); character[USERNAME] = playerName; - updateRequired = true; //Flag profile to update +// updateRequired = true; //Flag profile to update } - return loadFromLine(character, updateRequired); + return loadFromLine(character); } // Didn't find the player, create a new one @@ -565,7 +566,7 @@ public final class FlatfileDatabaseManager implements DatabaseManager { String[] character = line.split(":"); try { - destination.saveUser(loadFromLine(character, false)); + destination.saveUser(loadFromLine(character)); } catch (Exception e) { e.printStackTrace(); @@ -1148,7 +1149,7 @@ public final class FlatfileDatabaseManager implements DatabaseManager { } } - private PlayerProfile loadFromLine(@NotNull String[] character, boolean updateRequired) { + 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 @@ -1216,10 +1217,10 @@ public final class FlatfileDatabaseManager implements DatabaseManager { PlayerProfile playerProfile = new PlayerProfile(character[USERNAME], uuid, skills, skillsXp, skillsDATS, mobHealthbarType, scoreboardTipsShown, uniquePlayerDataMap); - if(updateRequired) { - playerProfile.markProfileDirty(); - playerProfile.scheduleSyncSave(); //Save profile since fields have changed - } +// if(updateRequired) { +// playerProfile.markProfileDirty(); +// playerProfile.scheduleSyncSave(); //Save profile since fields have changed +// } return new PlayerProfile(character[USERNAME], uuid, skills, skillsXp, skillsDATS, mobHealthbarType, scoreboardTipsShown, uniquePlayerDataMap); } From 935ab22477c7924c5093ddbef92b03c7b69a179f Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sun, 7 Mar 2021 14:33:22 -0800 Subject: [PATCH 397/662] 2.1.179 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index c52ee9a2b..44adca431 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.179-SNAPSHOT + 2.1.179 mcMMO https://github.com/mcMMO-Dev/mcMMO From 4402484d47609582427fc02cfd1cbe6457dbb271 Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Tue, 9 Mar 2021 17:15:11 +0100 Subject: [PATCH 398/662] Fixed NoClassDefFoundError caused by latest Adventure-platform snapshot. (#4446) * Bumped adventure versions * Added Unit Test to ensure Adventure being set up correctly --- pom.xml | 10 +++--- .../gmail/nossr50/util/text/TextUtils.java | 5 ++- .../nossr50/util/text/TextUtilsTest.java | 33 +++++++++++++++++++ 3 files changed, 42 insertions(+), 6 deletions(-) create mode 100644 src/test/java/com/gmail/nossr50/util/text/TextUtilsTest.java diff --git a/pom.xml b/pom.xml index 44adca431..bf8fbfddd 100755 --- a/pom.xml +++ b/pom.xml @@ -219,27 +219,27 @@ net.kyori adventure-text-serializer-gson - 4.5.1 + 4.7.0 net.kyori adventure-api - 4.5.1 + 4.7.0 net.kyori adventure-nbt - 4.5.1 + 4.7.0 net.kyori adventure-key - 4.5.1 + 4.7.0 net.kyori adventure-text-serializer-gson-legacy-impl - 4.5.1 + 4.7.0 net.kyori diff --git a/src/main/java/com/gmail/nossr50/util/text/TextUtils.java b/src/main/java/com/gmail/nossr50/util/text/TextUtils.java index b8d71500e..1d3c001d5 100644 --- a/src/main/java/com/gmail/nossr50/util/text/TextUtils.java +++ b/src/main/java/com/gmail/nossr50/util/text/TextUtils.java @@ -16,9 +16,12 @@ 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 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..d46673168 --- /dev/null +++ b/src/test/java/com/gmail/nossr50/util/text/TextUtilsTest.java @@ -0,0 +1,33 @@ +package com.gmail.nossr50.util.text; + +import org.junit.Assert; +import org.junit.Test; + +import net.kyori.adventure.text.TextComponent; +import net.kyori.adventure.text.format.NamedTextColor; + +/** + * 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 + * + */ +public class TextUtilsTest { + + @Test + public 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); + + Assert.assertEquals("Looks like Adventure is not working correctly.", + NamedTextColor.DARK_RED, component.color()); + } +} From f4976e5ecb288840936adb97ed6de416903a11e2 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 9 Mar 2021 13:56:03 -0800 Subject: [PATCH 399/662] switch SQL from latin1 to utf8mb4 --- Changelog.txt | 3 +++ pom.xml | 2 +- .../gmail/nossr50/database/SQLDatabaseManager.java | 12 +++++++----- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 9f22ab842..a14f8001f 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,6 @@ +Version 2.1.180 + mcMMO now uses UTF-8 compliant encoding for SQL databases (utf8mb4) + 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) diff --git a/pom.xml b/pom.xml index bf8fbfddd..01d2a5a7e 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.179 + 2.1.180-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO diff --git a/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java index a8a1fd326..68b20d5dd 100644 --- a/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java @@ -38,6 +38,8 @@ public final class SQLDatabaseManager implements DatabaseManager { private final ReentrantLock massUpdateLock = new ReentrantLock(); + private final String ENCODING = "utf8mb4"; //This is compliant with UTF-8 while "utf8" is not, confusing but this is how it is. + protected SQLDatabaseManager() { String connectionString = "jdbc:mysql://" + Config.getInstance().getMySQLServerName() + ":" + Config.getInstance().getMySQLServerPort() + "/" + Config.getInstance().getMySQLDatabaseName(); @@ -814,7 +816,7 @@ 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=" + ENCODING + " AUTO_INCREMENT=1;"); tryClose(createStatement); } tryClose(resultSet); @@ -828,7 +830,7 @@ public final class SQLDatabaseManager implements DatabaseManager { + "`mobhealthbar` varchar(50) NOT NULL DEFAULT '" + Config.getInstance().getMobHealthbarDefault() + "'," + "`scoreboardtips` int(10) NOT NULL DEFAULT '0'," + "PRIMARY KEY (`user_id`)) " - + "DEFAULT CHARSET=latin1;"); + + "DEFAULT CHARSET=" + ENCODING + ";"); tryClose(createStatement); } tryClose(resultSet); @@ -853,7 +855,7 @@ 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=" + ENCODING + ";"); tryClose(createStatement); } tryClose(resultSet); @@ -881,7 +883,7 @@ 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=" + ENCODING + ";"); tryClose(createStatement); } tryClose(resultSet); @@ -906,7 +908,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=" + ENCODING + ";"); tryClose(createStatement); } tryClose(resultSet); From 6c69cd2aea04a503a9e76b9e8e05a89edfa77daf Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 9 Mar 2021 15:10:00 -0800 Subject: [PATCH 400/662] Fixed several SQL bugs + SQL db is now fully UTF-8 compatible --- Changelog.txt | 2 + .../nossr50/database/SQLDatabaseManager.java | 101 ++++++++++++++++-- .../datatypes/database/UpgradeType.java | 3 +- .../nossr50/util/upgrade/UpgradeManager.java | 2 +- .../{upgrades.yml => upgrades_overhaul.yml} | 1 + 5 files changed, 99 insertions(+), 10 deletions(-) rename src/main/resources/{upgrades.yml => upgrades_overhaul.yml} (92%) diff --git a/Changelog.txt b/Changelog.txt index a14f8001f..1189b47c7 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,5 +1,7 @@ Version 2.1.180 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 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) diff --git a/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java index 68b20d5dd..a7ee6eb95 100644 --- a/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java @@ -26,6 +26,9 @@ import java.util.concurrent.locks.ReentrantLock; public final class SQLDatabaseManager implements DatabaseManager { private static final String ALL_QUERY_VERSION = "total"; + public static final String MOBHEALTHBAR_VARCHAR = "VARCHAR(50)"; + public static final String UUID_VARCHAR = "VARCHAR(36)"; + public static final String USER_VARCHAR = "VARCHAR(40)"; private final String tablePrefix = Config.getInstance().getMySQLTablePrefix(); private final Map cachedUserIDs = new HashMap<>(); @@ -38,7 +41,7 @@ public final class SQLDatabaseManager implements DatabaseManager { private final ReentrantLock massUpdateLock = new ReentrantLock(); - private final String ENCODING = "utf8mb4"; //This is compliant with UTF-8 while "utf8" is not, confusing but this is how it is. + private final String CHARSET_SQL = "utf8mb4"; //This is compliant with UTF-8 while "utf8" is not, confusing but this is how it is. protected SQLDatabaseManager() { String connectionString = "jdbc:mysql://" + Config.getInstance().getMySQLServerName() @@ -816,7 +819,7 @@ 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=" + ENCODING + " AUTO_INCREMENT=1;"); + + "UNIQUE KEY `uuid` (`uuid`)) DEFAULT CHARSET=" + CHARSET_SQL + " AUTO_INCREMENT=1;"); tryClose(createStatement); } tryClose(resultSet); @@ -830,7 +833,7 @@ public final class SQLDatabaseManager implements DatabaseManager { + "`mobhealthbar` varchar(50) NOT NULL DEFAULT '" + Config.getInstance().getMobHealthbarDefault() + "'," + "`scoreboardtips` int(10) NOT NULL DEFAULT '0'," + "PRIMARY KEY (`user_id`)) " - + "DEFAULT CHARSET=" + ENCODING + ";"); + + "DEFAULT CHARSET=" + CHARSET_SQL + ";"); tryClose(createStatement); } tryClose(resultSet); @@ -855,7 +858,7 @@ 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=" + ENCODING + ";"); + + "DEFAULT CHARSET=" + CHARSET_SQL + ";"); tryClose(createStatement); } tryClose(resultSet); @@ -883,7 +886,7 @@ 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=" + ENCODING + ";"); + + "DEFAULT CHARSET=" + CHARSET_SQL + ";"); tryClose(createStatement); } tryClose(resultSet); @@ -908,7 +911,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=" + ENCODING + ";"); + + "DEFAULT CHARSET=" + CHARSET_SQL + ";"); tryClose(createStatement); } tryClose(resultSet); @@ -1031,12 +1034,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); @@ -1193,6 +1198,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 { @@ -1203,6 +1209,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..."); @@ -1214,6 +1221,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..."); @@ -1224,6 +1232,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..."); @@ -1234,6 +1243,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..."); @@ -1245,6 +1255,7 @@ 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..."); @@ -1255,6 +1266,7 @@ public final class SQLDatabaseManager implements DatabaseManager { 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..."); @@ -1283,6 +1295,8 @@ public final class SQLDatabaseManager implements DatabaseManager { } } } + + mcMMO.getUpgradeManager().setUpgradeCompleted(UpgradeType.ADD_SQL_INDEXES); } catch (SQLException ex) { printErrors(ex); @@ -1313,6 +1327,8 @@ public final class SQLDatabaseManager implements DatabaseManager { 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"); } + + mcMMO.getUpgradeManager().setUpgradeCompleted(UpgradeType.ADD_UUIDS); } catch (SQLException ex) { printErrors(ex); @@ -1379,6 +1395,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); @@ -1414,6 +1432,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); @@ -1445,6 +1465,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); @@ -1557,4 +1579,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/datatypes/database/UpgradeType.java b/src/main/java/com/gmail/nossr50/datatypes/database/UpgradeType.java index 412af6fbc..13faa75b7 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/database/UpgradeType.java +++ b/src/main/java/com/gmail/nossr50/datatypes/database/UpgradeType.java @@ -16,5 +16,6 @@ public enum UpgradeType { ADD_UNIQUE_PLAYER_DATA, FIX_SPELLING_NETHERITE_SALVAGE, FIX_SPELLING_NETHERITE_REPAIR, - FIX_NETHERITE_SALVAGE_QUANTITIES + FIX_NETHERITE_SALVAGE_QUANTITIES, + SQL_CHARSET_UTF8MB4 } 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..55c747ffd 100644 --- a/src/main/java/com/gmail/nossr50/util/upgrade/UpgradeManager.java +++ b/src/main/java/com/gmail/nossr50/util/upgrade/UpgradeManager.java @@ -11,7 +11,7 @@ public class UpgradeManager extends ConfigLoader { 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); diff --git a/src/main/resources/upgrades.yml b/src/main/resources/upgrades_overhaul.yml similarity index 92% rename from src/main/resources/upgrades.yml rename to src/main/resources/upgrades_overhaul.yml index 3a60fb42c..df0290061 100644 --- a/src/main/resources/upgrades.yml +++ b/src/main/resources/upgrades_overhaul.yml @@ -11,3 +11,4 @@ Upgrades_Finished: FIX_SPELLING_NETHERITE_REPAIR: false FIX_NETHERITE_SALVAGE_QUANTITIES: false ADD_UUIDS: false + SQL_CHARSET_UTF8MB4: false From e8a0e6e4a48acb65ca3647e6a95f5504de4f6abe Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 9 Mar 2021 19:47:35 -0800 Subject: [PATCH 401/662] Don't upgrade old party DB schema from 8 years ago (band-aid fix, real fix coming later) --- .../com/gmail/nossr50/party/PartyManager.java | 140 +++++++++--------- 1 file changed, 70 insertions(+), 70 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/party/PartyManager.java b/src/main/java/com/gmail/nossr50/party/PartyManager.java index 6a1591a70..c825694b9 100644 --- a/src/main/java/com/gmail/nossr50/party/PartyManager.java +++ b/src/main/java/com/gmail/nossr50/party/PartyManager.java @@ -586,10 +586,10 @@ 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; @@ -693,72 +693,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. From e95b7f72a7bd2749609eb08d3822b6beea6df54a Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 11 Mar 2021 11:58:27 -0800 Subject: [PATCH 402/662] Add some safety measures to loading a user from FlatFile --- .../database/FlatfileDatabaseManager.java | 156 ++++++++++-------- 1 file changed, 83 insertions(+), 73 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java index afd53ecc7..d3a761792 100644 --- a/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java @@ -31,6 +31,49 @@ public final class FlatfileDatabaseManager implements DatabaseManager { private final File usersFile; private static final Object fileWritingLock = new Object(); + public static int USERNAME_INDEX = 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 static int DATA_ENTRY_COUNT = COOLDOWN_CHIMAERA_WING + 1; //Update this everytime new data is added + protected FlatfileDatabaseManager() { usersFile = new File(mcMMO.getUsersFilePath()); checkStructure(); @@ -127,7 +170,7 @@ public final class FlatfileDatabaseManager implements DatabaseManager { while ((line = in.readLine()) != null) { String[] character = line.split(":"); - String name = character[USERNAME]; + String name = character[USERNAME_INDEX]; long lastPlayed = 0; boolean rewrite = false; try { @@ -204,7 +247,7 @@ public final class FlatfileDatabaseManager implements DatabaseManager { 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)) { + if (!worked && line.split(":")[USERNAME_INDEX].equalsIgnoreCase(playerName)) { mcMMO.p.getLogger().info("User found, removing..."); worked = true; continue; // Skip the player @@ -267,13 +310,28 @@ public final class FlatfileDatabaseManager implements DatabaseManager { 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"); + boolean goodData = true; + + //Check for incomplete or corrupted data + if(!line.contains(":")) + continue; + + String[] splitData = line.split(":"); + + //This would be rare, but check the splitData for having enough entries to contain a username + + if(splitData.length < USERNAME_INDEX) { //UUID have been in mcMMO DB for a very long time so any user without + //Something is wrong if we don't have enough split data to have an entry for a username + mcMMO.p.getLogger().severe("mcMMO found some corrupted data in mcmmo.users and is removing it."); + continue; } - else { - // Otherwise write the new player information + + 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, playerName, uuid, writer); wroteUser = true; } @@ -494,20 +552,20 @@ public final class FlatfileDatabaseManager implements DatabaseManager { // 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)) { + if (!character[USERNAME_INDEX].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))) { + else if ((uuid != null && !character[UUID_INDEX].equalsIgnoreCase(uuid.toString())) || (uuid == null && !character[USERNAME_INDEX].equalsIgnoreCase(playerName))) { continue; } // Update playerName in database after name change - if (!character[USERNAME].equalsIgnoreCase(playerName)) { + if (!character[USERNAME_INDEX].equalsIgnoreCase(playerName)) { //TODO: A proper fix for changed names - mcMMO.p.debug("Name change detected: " + character[USERNAME] + " => " + playerName); - character[USERNAME] = playerName; + mcMMO.p.debug("Name change detected: " + character[USERNAME_INDEX] + " => " + playerName); + character[USERNAME_INDEX] = playerName; // updateRequired = true; //Flag profile to update } @@ -607,7 +665,7 @@ public final class FlatfileDatabaseManager implements DatabaseManager { while ((line = in.readLine()) != null) { String[] character = line.split(":"); - if (!worked && character[USERNAME].equalsIgnoreCase(userName)) { + if (!worked && character[USERNAME_INDEX].equalsIgnoreCase(userName)) { if (character.length < 42) { mcMMO.p.getLogger().severe("Could not update UUID for " + userName + "!"); mcMMO.p.getLogger().severe("Database entry is invalid."); @@ -666,14 +724,14 @@ public final class FlatfileDatabaseManager implements DatabaseManager { while (((line = in.readLine()) != null)) { String[] character = line.split(":"); - if (!fetchedUUIDs.isEmpty() && fetchedUUIDs.containsKey(character[USERNAME])) { + if (!fetchedUUIDs.isEmpty() && fetchedUUIDs.containsKey(character[USERNAME_INDEX])) { if (character.length < 42) { - mcMMO.p.getLogger().severe("Could not update UUID for " + character[USERNAME] + "!"); + mcMMO.p.getLogger().severe("Could not update UUID for " + character[USERNAME_INDEX] + "!"); mcMMO.p.getLogger().severe("Database entry is invalid."); continue; } - character[UUID_INDEX] = fetchedUUIDs.remove(character[USERNAME]).toString(); + character[UUID_INDEX] = fetchedUUIDs.remove(character[USERNAME_INDEX]).toString(); line = org.apache.commons.lang.StringUtils.join(character, ":") + ":"; } @@ -724,7 +782,7 @@ public final class FlatfileDatabaseManager implements DatabaseManager { while ((line = in.readLine()) != null) { String[] character = line.split(":"); - users.add(character[USERNAME]); + users.add(character[USERNAME_INDEX]); } } catch (Exception e) { @@ -782,7 +840,7 @@ public final class FlatfileDatabaseManager implements DatabaseManager { while ((line = in.readLine()) != null) { String[] data = line.split(":"); - playerName = data[USERNAME]; + playerName = data[USERNAME_INDEX]; int powerLevel = 0; Map skills = getSkillMapFromLine(data); @@ -882,8 +940,8 @@ public final class FlatfileDatabaseManager implements DatabaseManager { String[] character = line.split(":"); // Prevent the same username from being present multiple times - if (!usernames.add(character[USERNAME])) { - character[USERNAME] = "_INVALID_OLD_USERNAME_'"; + if (!usernames.add(character[USERNAME_INDEX])) { + character[USERNAME_INDEX] = "_INVALID_OLD_USERNAME_'"; updated = true; if (character.length < UUID_INDEX + 1 || character[UUID_INDEX].equals("NULL")) { continue; @@ -922,7 +980,7 @@ public final class FlatfileDatabaseManager implements DatabaseManager { } int cap = Config.getInstance().getLevelCap(skill); if (Integer.parseInt(character[index]) > cap) { - mcMMO.p.getLogger().warning("Truncating " + skill.getName() + " to configured max level for player " + character[USERNAME]); + mcMMO.p.getLogger().warning("Truncating " + skill.getName() + " to configured max level for player " + character[USERNAME_INDEX]); character[index] = cap + ""; updated = true; } @@ -1044,11 +1102,11 @@ public final class FlatfileDatabaseManager implements DatabaseManager { } if (corrupted) { - mcMMO.p.debug("Updating corrupted database line for player " + character[USERNAME]); + mcMMO.p.debug("Updating corrupted database line for player " + character[USERNAME_INDEX]); } if (oldVersion != null) { - mcMMO.p.debug("Updating database line from before version " + oldVersion + " for player " + character[USERNAME]); + mcMMO.p.debug("Updating database line from before version " + oldVersion + " for player " + character[USERNAME_INDEX]); } updated |= corrupted; @@ -1215,14 +1273,7 @@ public final class FlatfileDatabaseManager implements DatabaseManager { uniquePlayerDataMap.put(UniqueDataType.CHIMAERA_WING_DATS, 0); } - PlayerProfile playerProfile = new PlayerProfile(character[USERNAME], uuid, skills, skillsXp, skillsDATS, mobHealthbarType, scoreboardTipsShown, uniquePlayerDataMap); - -// if(updateRequired) { -// playerProfile.markProfileDirty(); -// playerProfile.scheduleSyncSave(); //Save profile since fields have changed -// } - - return new PlayerProfile(character[USERNAME], uuid, skills, skillsXp, skillsDATS, mobHealthbarType, scoreboardTipsShown, uniquePlayerDataMap); + return new PlayerProfile(character[USERNAME_INDEX], uuid, skills, skillsXp, skillsDATS, mobHealthbarType, scoreboardTipsShown, uniquePlayerDataMap); } private Map getSkillMapFromLine(String[] character) { @@ -1285,47 +1336,6 @@ public final class FlatfileDatabaseManager implements DatabaseManager { } } - - 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; From 72116d809bc8d44c6dabd125fe3d684895e2eebe Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 11 Mar 2021 12:00:11 -0800 Subject: [PATCH 403/662] Add another error message if mcMMO finds something unexpected in the database --- .../gmail/nossr50/database/FlatfileDatabaseManager.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java index d3a761792..ef4f7ff5f 100644 --- a/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java @@ -310,16 +310,15 @@ public final class FlatfileDatabaseManager implements DatabaseManager { boolean wroteUser = false; // While not at the end of the file while ((line = in.readLine()) != null) { - boolean goodData = true; - //Check for incomplete or corrupted data - if(!line.contains(":")) + if(!line.contains(":")) { + mcMMO.p.getLogger().severe("mcMMO found some unexpected data in mcmmo.users and is removing it"); continue; + } String[] splitData = line.split(":"); //This would be rare, but check the splitData for having enough entries to contain a username - if(splitData.length < USERNAME_INDEX) { //UUID have been in mcMMO DB for a very long time so any user without //Something is wrong if we don't have enough split data to have an entry for a username mcMMO.p.getLogger().severe("mcMMO found some corrupted data in mcmmo.users and is removing it."); From 7755875dbf3d9c852ab6a28fbfcdb188b1f9219e Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 11 Mar 2021 12:02:21 -0800 Subject: [PATCH 404/662] Some refactoring of FlatFileDatabaseManager --- src/main/java/com/gmail/nossr50/commands/MHDCommand.java | 6 +++--- .../com/gmail/nossr50/database/DatabaseManagerFactory.java | 4 ++-- ...leDatabaseManager.java => FlatFileDatabaseManager.java} | 7 +++---- 3 files changed, 8 insertions(+), 9 deletions(-) rename src/main/java/com/gmail/nossr50/database/{FlatfileDatabaseManager.java => FlatFileDatabaseManager.java} (99%) diff --git a/src/main/java/com/gmail/nossr50/commands/MHDCommand.java b/src/main/java/com/gmail/nossr50/commands/MHDCommand.java index a85fe9426..d3b547acc 100644 --- a/src/main/java/com/gmail/nossr50/commands/MHDCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/MHDCommand.java @@ -1,7 +1,7 @@ package com.gmail.nossr50.commands; import com.gmail.nossr50.config.Config; -import com.gmail.nossr50.database.FlatfileDatabaseManager; +import com.gmail.nossr50.database.FlatFileDatabaseManager; import com.gmail.nossr50.database.SQLDatabaseManager; import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.mcMMO; @@ -27,8 +27,8 @@ public class MHDCommand implements TabExecutor { sender.sendMessage("Mob health reset"); return true; } - if (mcMMO.getDatabaseManager() instanceof FlatfileDatabaseManager) { - FlatfileDatabaseManager m = (FlatfileDatabaseManager) mcMMO.getDatabaseManager(); + if (mcMMO.getDatabaseManager() instanceof FlatFileDatabaseManager) { + FlatFileDatabaseManager m = (FlatFileDatabaseManager) mcMMO.getDatabaseManager(); m.resetMobHealthSettings(); for (McMMOPlayer player : UserManager.getPlayers()) { player.getProfile().setMobHealthbarType(Config.getInstance().getMobHealthbarDefault()); diff --git a/src/main/java/com/gmail/nossr50/database/DatabaseManagerFactory.java b/src/main/java/com/gmail/nossr50/database/DatabaseManagerFactory.java index 24013a3a8..b6981403b 100644 --- a/src/main/java/com/gmail/nossr50/database/DatabaseManagerFactory.java +++ b/src/main/java/com/gmail/nossr50/database/DatabaseManagerFactory.java @@ -23,7 +23,7 @@ public class DatabaseManagerFactory { mcMMO.p.debug("Falling back on " + (Config.getInstance().getUseMySQL() ? "SQL" : "Flatfile") + " database"); } - return Config.getInstance().getUseMySQL() ? new SQLDatabaseManager() : new FlatfileDatabaseManager(); + return Config.getInstance().getUseMySQL() ? new SQLDatabaseManager() : new FlatFileDatabaseManager(); } /** @@ -60,7 +60,7 @@ public class DatabaseManagerFactory { switch (type) { case FLATFILE: mcMMO.p.getLogger().info("Using FlatFile Database"); - return new FlatfileDatabaseManager(); + return new FlatFileDatabaseManager(); case SQL: mcMMO.p.getLogger().info("Using SQL Database"); diff --git a/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java similarity index 99% rename from src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java rename to src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java index ef4f7ff5f..e5da7aff4 100644 --- a/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java @@ -22,7 +22,7 @@ import org.jetbrains.annotations.Nullable; import java.io.*; import java.util.*; -public final class FlatfileDatabaseManager implements DatabaseManager { +public final class FlatFileDatabaseManager implements DatabaseManager { private final HashMap> playerStatHash = new HashMap<>(); private final List powerLevels = new ArrayList<>(); private long lastUpdate = 0; @@ -74,7 +74,7 @@ public final class FlatfileDatabaseManager implements DatabaseManager { public static int DATA_ENTRY_COUNT = COOLDOWN_CHIMAERA_WING + 1; //Update this everytime new data is added - protected FlatfileDatabaseManager() { + protected FlatFileDatabaseManager() { usersFile = new File(mcMMO.getUsersFilePath()); checkStructure(); updateLeaderboards(); @@ -339,8 +339,7 @@ public final class FlatfileDatabaseManager implements DatabaseManager { /* * If we couldn't find the user in the DB we need to add him */ - if(!wroteUser) - { + if(!wroteUser) { writeUserToLine(profile, playerName, uuid, writer); } From d77c8c88a31a09203ad9e98dbde8fe85d93d80a7 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 11 Mar 2021 12:16:33 -0800 Subject: [PATCH 405/662] Less spammy corrupt data reporting --- .../nossr50/database/FlatFileDatabaseManager.java | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java index e5da7aff4..988389ccd 100644 --- a/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java @@ -299,6 +299,7 @@ public final class FlatFileDatabaseManager implements DatabaseManager { BufferedReader in = null; FileWriter out = null; String usersFilePath = mcMMO.getUsersFilePath(); + boolean corruptDataFound = false; synchronized (fileWritingLock) { try { @@ -312,7 +313,12 @@ public final class FlatFileDatabaseManager implements DatabaseManager { while ((line = in.readLine()) != null) { //Check for incomplete or corrupted data if(!line.contains(":")) { - mcMMO.p.getLogger().severe("mcMMO found some unexpected data in mcmmo.users and is removing it"); + + if(!corruptDataFound) { + mcMMO.p.getLogger().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; } @@ -321,7 +327,12 @@ public final class FlatFileDatabaseManager implements DatabaseManager { //This would be rare, but check the splitData for having enough entries to contain a username if(splitData.length < USERNAME_INDEX) { //UUID have been in mcMMO DB for a very long time so any user without //Something is wrong if we don't have enough split data to have an entry for a username - mcMMO.p.getLogger().severe("mcMMO found some corrupted data in mcmmo.users and is removing it."); + + if(!corruptDataFound) { + mcMMO.p.getLogger().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; } From 2203d61c104b6899d0267d5c9e8ca3d7e10483a2 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 11 Mar 2021 13:11:11 -0800 Subject: [PATCH 406/662] More safety against corrupt data when loading data for FlatFile --- .../database/FlatFileDatabaseManager.java | 125 ++++++++++++------ .../com/gmail/nossr50/party/PartyManager.java | 2 - .../nossr50/util/text/TextUtilsTest.java | 5 +- 3 files changed, 87 insertions(+), 45 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java index 988389ccd..8f556520f 100644 --- a/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java @@ -385,6 +385,7 @@ public final class FlatFileDatabaseManager implements DatabaseManager { } private void writeUserToLine(PlayerProfile profile, String playerName, UUID uuid, StringBuilder writer) { + // FlyingMonkey_:0:::0:0:0:0:0:0:0:0:0:0:5:0:156:460: writer.append(playerName).append(":"); writer.append(profile.getSkillLevel(PrimarySkillType.MINING)).append(":"); writer.append(":"); @@ -936,6 +937,8 @@ public final class FlatFileDatabaseManager implements DatabaseManager { HashSet players = new HashSet<>(); while ((line = in.readLine()) != null) { + String oldVersion = null; + // Remove empty lines from the file if (line.isEmpty()) { continue; @@ -968,8 +971,6 @@ public final class FlatFileDatabaseManager implements DatabaseManager { continue; } - String oldVersion = null; - if (character.length > 33 && !character[33].isEmpty()) { // Removal of Spout Support // Version 1.4.07-dev2 @@ -984,11 +985,21 @@ public final class FlatFileDatabaseManager implements DatabaseManager { 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.parseInt(character[index]) > cap) { + int skillLevel = 0; + + try { + skillLevel = Integer.parseInt(character[index]); + } catch (NumberFormatException e) { + mcMMO.p.getLogger().severe("Repairing some corrupt or unexpected data in mcmmo.users it is possible some data may be lost."); + } + + if (skillLevel > cap) { mcMMO.p.getLogger().warning("Truncating " + skill.getName() + " to configured max level for player " + character[USERNAME_INDEX]); character[index] = cap + ""; updated = true; @@ -1224,34 +1235,34 @@ public final class FlatFileDatabaseManager implements DatabaseManager { MobHealthbarType mobHealthbarType; int scoreboardTipsShown; - // TODO on updates, put new values in a try{} ? + String username = character[USERNAME_INDEX]; - skillsXp.put(PrimarySkillType.TAMING, (float) Integer.parseInt(character[EXP_TAMING])); - skillsXp.put(PrimarySkillType.MINING, (float) Integer.parseInt(character[EXP_MINING])); - skillsXp.put(PrimarySkillType.REPAIR, (float) Integer.parseInt(character[EXP_REPAIR])); - skillsXp.put(PrimarySkillType.WOODCUTTING, (float) Integer.parseInt(character[EXP_WOODCUTTING])); - skillsXp.put(PrimarySkillType.UNARMED, (float) Integer.parseInt(character[EXP_UNARMED])); - skillsXp.put(PrimarySkillType.HERBALISM, (float) Integer.parseInt(character[EXP_HERBALISM])); - skillsXp.put(PrimarySkillType.EXCAVATION, (float) Integer.parseInt(character[EXP_EXCAVATION])); - skillsXp.put(PrimarySkillType.ARCHERY, (float) Integer.parseInt(character[EXP_ARCHERY])); - skillsXp.put(PrimarySkillType.SWORDS, (float) Integer.parseInt(character[EXP_SWORDS])); - skillsXp.put(PrimarySkillType.AXES, (float) Integer.parseInt(character[EXP_AXES])); - skillsXp.put(PrimarySkillType.ACROBATICS, (float) Integer.parseInt(character[EXP_ACROBATICS])); - skillsXp.put(PrimarySkillType.FISHING, (float) Integer.parseInt(character[EXP_FISHING])); - skillsXp.put(PrimarySkillType.ALCHEMY, (float) Integer.parseInt(character[EXP_ALCHEMY])); + 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 - skillsDATS.put(SuperAbilityType.SUPER_BREAKER, Integer.valueOf(character[COOLDOWN_SUPER_BREAKER])); + tryLoadSkillCooldownFromRawData(skillsDATS, character, SuperAbilityType.SUPER_BREAKER, COOLDOWN_SUPER_BREAKER, username); // 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])); + 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 - skillsDATS.put(SuperAbilityType.SERRATED_STRIKES, Integer.valueOf(character[COOLDOWN_SERRATED_STRIKES])); - skillsDATS.put(SuperAbilityType.SKULL_SPLITTER, Integer.valueOf(character[COOLDOWN_SKULL_SPLITTER])); + tryLoadSkillCooldownFromRawData(skillsDATS, character, SuperAbilityType.SERRATED_STRIKES, COOLDOWN_SERRATED_STRIKES, username); + tryLoadSkillCooldownFromRawData(skillsDATS, character, SuperAbilityType.SKULL_SPLITTER, COOLDOWN_SKULL_SPLITTER, username); // Acrobatics - Unused - skillsDATS.put(SuperAbilityType.BLAST_MINING, Integer.valueOf(character[COOLDOWN_BLAST_MINING])); + tryLoadSkillCooldownFromRawData(skillsDATS, character, SuperAbilityType.BLAST_MINING, COOLDOWN_BLAST_MINING, username); try { mobHealthbarType = MobHealthbarType.valueOf(character[HEALTHBAR]); @@ -1285,26 +1296,60 @@ public final class FlatFileDatabaseManager implements DatabaseManager { return new PlayerProfile(character[USERNAME_INDEX], uuid, skills, skillsXp, skillsDATS, mobHealthbarType, scoreboardTipsShown, uniquePlayerDataMap); } - private Map getSkillMapFromLine(String[] character) { - Map skills = new EnumMap<>(PrimarySkillType.class); // Skill & Level + 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) { + mcMMO.p.getLogger().severe("Data corruption when trying to load the value for skill "+superAbilityType.toString()+" for player named " + userName+ " setting value to zero"); + e.printStackTrace(); + } + } - 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])); + private void tryLoadSkillFloatValuesFromRawData(@NotNull Map skillMap, @NotNull String[] character, @NotNull PrimarySkillType primarySkillType, int expTaming, @NotNull String userName) { + try { + float valueFromString = Integer.parseInt(character[expTaming]); + skillMap.put(primarySkillType, valueFromString); + } catch (NumberFormatException e) { + skillMap.put(primarySkillType, 0F); + mcMMO.p.getLogger().severe("Data corruption when trying to load the value for skill "+primarySkillType.toString()+" for player named " + userName+ " setting value to zero"); + e.printStackTrace(); + } + } + + private void tryLoadSkillIntValuesFromRawData(@NotNull Map skillMap, @NotNull String[] character, @NotNull PrimarySkillType primarySkillType, int expTaming, @NotNull String userName) { + try { + int valueFromString = Integer.parseInt(character[expTaming]); + skillMap.put(primarySkillType, valueFromString); + } catch (NumberFormatException e) { + skillMap.put(primarySkillType, 0); + mcMMO.p.getLogger().severe("Data corruption when trying to load the value for skill "+primarySkillType.toString()+" for player named " + userName+ " setting value to zero"); + e.printStackTrace(); + } + } + + private @NotNull Map getSkillMapFromLine(@NotNull String[] character) { + Map skills = new EnumMap<>(PrimarySkillType.class); // Skill & Level + String username = character[USERNAME_INDEX]; + + 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.ACROBATICS, SKILLS_ACROBATICS, 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; } diff --git a/src/main/java/com/gmail/nossr50/party/PartyManager.java b/src/main/java/com/gmail/nossr50/party/PartyManager.java index c825694b9..1aae85dc0 100644 --- a/src/main/java/com/gmail/nossr50/party/PartyManager.java +++ b/src/main/java/com/gmail/nossr50/party/PartyManager.java @@ -2,14 +2,12 @@ package com.gmail.nossr50.party; import com.gmail.nossr50.config.Config; import com.gmail.nossr50.datatypes.chat.ChatChannel; -import com.gmail.nossr50.datatypes.database.UpgradeType; 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; diff --git a/src/test/java/com/gmail/nossr50/util/text/TextUtilsTest.java b/src/test/java/com/gmail/nossr50/util/text/TextUtilsTest.java index d46673168..fee41b9b3 100644 --- a/src/test/java/com/gmail/nossr50/util/text/TextUtilsTest.java +++ b/src/test/java/com/gmail/nossr50/util/text/TextUtilsTest.java @@ -1,10 +1,9 @@ package com.gmail.nossr50.util.text; -import org.junit.Assert; -import org.junit.Test; - import net.kyori.adventure.text.TextComponent; import net.kyori.adventure.text.format.NamedTextColor; +import org.junit.Assert; +import org.junit.Test; /** * This Unit Test checks if Adventure was set up correctly and works as expected. From eb1e657af1b66e4b45e53d89c6a5e3ddfba4fdea Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 11 Mar 2021 14:10:29 -0800 Subject: [PATCH 407/662] Simplify data validation + listen to exceptions again --- .../database/FlatFileDatabaseManager.java | 246 ++++-------------- 1 file changed, 47 insertions(+), 199 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java index 8f556520f..4a2d47e21 100644 --- a/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java @@ -557,29 +557,37 @@ public final class FlatFileDatabaseManager implements DatabaseManager { while ((line = in.readLine()) != null) { // Find if the line contains the player we want. - String[] character = line.split(":"); + String[] rawSplitData = line.split(":"); + + if(rawSplitData.length < (USERNAME_INDEX + 1)) { + //Users without a name aren't worth it + mcMMO.p.getLogger().severe("Corrupted data was found in mcmmo.users, removing it from the database"); + } // 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_INDEX].equalsIgnoreCase(playerName)) { + if (rawSplitData[UUID_INDEX].equalsIgnoreCase("NULL") + || rawSplitData[UUID_INDEX].isEmpty() + || rawSplitData[UUID_INDEX].equalsIgnoreCase("")) { + if (!rawSplitData[USERNAME_INDEX].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_INDEX].equalsIgnoreCase(playerName))) { + else if ((uuid != null && !rawSplitData[UUID_INDEX].equalsIgnoreCase(uuid.toString())) || (uuid == null && !rawSplitData[USERNAME_INDEX].equalsIgnoreCase(playerName))) { continue; } // Update playerName in database after name change - if (!character[USERNAME_INDEX].equalsIgnoreCase(playerName)) { + if (!rawSplitData[USERNAME_INDEX].equalsIgnoreCase(playerName)) { //TODO: A proper fix for changed names - mcMMO.p.debug("Name change detected: " + character[USERNAME_INDEX] + " => " + playerName); - character[USERNAME_INDEX] = playerName; + mcMMO.p.debug("Name change detected: " + rawSplitData[USERNAME_INDEX] + " => " + playerName); + rawSplitData[USERNAME_INDEX] = playerName; // updateRequired = true; //Flag profile to update } - return loadFromLine(character); + return loadFromLine(rawSplitData); } // Didn't find the player, create a new one @@ -930,6 +938,7 @@ public final class FlatFileDatabaseManager implements DatabaseManager { synchronized (fileWritingLock) { try { + boolean corruptDataNotice = false; in = new BufferedReader(new FileReader(usersFilePath)); StringBuilder writer = new StringBuilder(); String line; @@ -937,213 +946,52 @@ public final class FlatFileDatabaseManager implements DatabaseManager { HashSet players = new HashSet<>(); while ((line = in.readLine()) != null) { - String oldVersion = null; - // Remove empty lines from the file if (line.isEmpty()) { continue; } - // Length checks depend on last character being ':' + // Length checks depend on last rawSplitData being ':' if (line.charAt(line.length() - 1) != ':') { line = line.concat(":"); } - boolean updated = false; - String[] character = line.split(":"); + + String[] rawSplitData = line.split(":"); + + //Not enough data found to have a name so we remove the data + if(rawSplitData.length < USERNAME_INDEX + 1) { + if(!corruptDataNotice) { + mcMMO.p.getLogger().severe("Removing corrupt data from mcmmo.users"); + corruptDataNotice = true; + } + + continue; + } // Prevent the same username from being present multiple times - if (!usernames.add(character[USERNAME_INDEX])) { - character[USERNAME_INDEX] = "_INVALID_OLD_USERNAME_'"; - updated = true; - if (character.length < UUID_INDEX + 1 || character[UUID_INDEX].equals("NULL")) { + if (!usernames.add(rawSplitData[USERNAME_INDEX])) { + //TODO: Check if the commented out code was even necessary + rawSplitData[USERNAME_INDEX] = "_INVALID_OLD_USERNAME_'"; + if (rawSplitData.length < UUID_INDEX + 1 || rawSplitData[UUID_INDEX].equals("NULL")) { + mcMMO.p.getLogger().severe("Fixing duplicate player names found in mcmmo.users"); 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]))) { + if (rawSplitData.length >= (UUID_INDEX + 1) //TODO: Test this condition + && (!rawSplitData[UUID_INDEX].isEmpty() + && !rawSplitData[UUID_INDEX].equals("NULL") && !players.add(rawSplitData[UUID_INDEX]))) { + + mcMMO.p.getLogger().severe("Removing duplicate player data from mcmmo.users"); + mcMMO.p.getLogger().info("Duplicate Data: "+line); 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; - } - - 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); - int skillLevel = 0; - - try { - skillLevel = Integer.parseInt(character[index]); - } catch (NumberFormatException e) { - mcMMO.p.getLogger().severe("Repairing some corrupt or unexpected data in mcmmo.users it is possible some data may be lost."); - } - - if (skillLevel > cap) { - mcMMO.p.getLogger().warning("Truncating " + skill.getName() + " to configured max level for player " + character[USERNAME_INDEX]); - 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_INDEX]); - } - - if (oldVersion != null) { - mcMMO.p.debug("Updating database line from before version " + oldVersion + " for player " + character[USERNAME_INDEX]); - } - - 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 = org.apache.commons.lang.StringUtils.join(character, ":") + ":"; + //Correctly size the data (null entries for missing values) + if(line.length() < DATA_ENTRY_COUNT) { //TODO: Test this condition + String[] correctSizeSplitData = Arrays.copyOf(rawSplitData, DATA_ENTRY_COUNT); + line = org.apache.commons.lang.StringUtils.join(rawSplitData, ":") + ":"; } writer.append(line).append("\r\n"); @@ -1162,7 +1010,7 @@ public final class FlatFileDatabaseManager implements DatabaseManager { in.close(); } catch (IOException e) { - // Ignore + e.printStackTrace(); } } if (out != null) { @@ -1170,7 +1018,7 @@ public final class FlatFileDatabaseManager implements DatabaseManager { out.close(); } catch (IOException e) { - // Ignore + e.printStackTrace(); } } } From 91204262f507cb1f214720d2f394e09904adc0e8 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 11 Mar 2021 14:48:21 -0800 Subject: [PATCH 408/662] More tweaks to handling corrupt data for flat file --- .../database/FlatFileDatabaseManager.java | 49 +++++++++++-------- 1 file changed, 28 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java index 4a2d47e21..c8b09ec5f 100644 --- a/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java @@ -384,8 +384,7 @@ public final class FlatFileDatabaseManager implements DatabaseManager { } } - private void writeUserToLine(PlayerProfile profile, String playerName, UUID uuid, StringBuilder writer) { - // FlyingMonkey_:0:::0:0:0:0:0:0:0:0:0:0:5:0:156:460: + private void writeUserToLine(PlayerProfile profile, String playerName, @Nullable UUID uuid, StringBuilder writer) { writer.append(playerName).append(":"); writer.append(profile.getSkillLevel(PrimarySkillType.MINING)).append(":"); writer.append(":"); @@ -582,7 +581,7 @@ public final class FlatFileDatabaseManager implements DatabaseManager { // Update playerName in database after name change if (!rawSplitData[USERNAME_INDEX].equalsIgnoreCase(playerName)) { //TODO: A proper fix for changed names - mcMMO.p.debug("Name change detected: " + rawSplitData[USERNAME_INDEX] + " => " + playerName); + mcMMO.p.getLogger().info("Name change detected: " + rawSplitData[USERNAME_INDEX] + " => " + playerName); rawSplitData[USERNAME_INDEX] = playerName; // updateRequired = true; //Flag profile to update } @@ -931,6 +930,8 @@ public final class FlatFileDatabaseManager implements DatabaseManager { * Checks that the file is present and valid */ private void checkStructure() { + boolean corruptDataFound = false; + if (usersFile.exists()) { BufferedReader in = null; FileWriter out = null; @@ -938,7 +939,7 @@ public final class FlatFileDatabaseManager implements DatabaseManager { synchronized (fileWritingLock) { try { - boolean corruptDataNotice = false; + in = new BufferedReader(new FileReader(usersFilePath)); StringBuilder writer = new StringBuilder(); String line; @@ -958,11 +959,17 @@ public final class FlatFileDatabaseManager implements DatabaseManager { String[] rawSplitData = line.split(":"); - //Not enough data found to have a name so we remove the data - if(rawSplitData.length < USERNAME_INDEX + 1) { - if(!corruptDataNotice) { + //Not enough data found to be considered a user reliably (NOTE: not foolproof) + if(rawSplitData.length < (UUID_INDEX + 1)) { + if(!corruptDataFound) { mcMMO.p.getLogger().severe("Removing corrupt data from mcmmo.users"); - corruptDataNotice = true; + corruptDataFound = true; + } + + if(rawSplitData.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 + && rawSplitData[0] != null && !rawSplitData[0].isEmpty()) { + //This user may have had a name so declare it + mcMMO.p.getLogger().severe("Not enough data found to recover corrupted player data for user: "+rawSplitData[0]); } continue; @@ -991,10 +998,14 @@ public final class FlatFileDatabaseManager implements DatabaseManager { //Correctly size the data (null entries for missing values) if(line.length() < DATA_ENTRY_COUNT) { //TODO: Test this condition String[] correctSizeSplitData = Arrays.copyOf(rawSplitData, DATA_ENTRY_COUNT); - line = org.apache.commons.lang.StringUtils.join(rawSplitData, ":") + ":"; + line = org.apache.commons.lang.StringUtils.join(correctSizeSplitData, ":") + ":"; + rawSplitData = line.split(":"); + PlayerProfile temporaryProfile = loadFromLine(rawSplitData); + writeUserToLine(temporaryProfile, rawSplitData[USERNAME_INDEX], temporaryProfile.getUniqueId(), writer); + } else { + writer.append(line).append("\r\n"); } - writer.append(line).append("\r\n"); } // Write the new file @@ -1024,13 +1035,9 @@ public final class FlatFileDatabaseManager implements DatabaseManager { } } - 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); + if(corruptDataFound) + mcMMO.p.getLogger().info("Corrupt data was found and removed, everything should be working fine. It is possible some player data was lost."); + return; } @@ -1153,9 +1160,9 @@ public final class FlatFileDatabaseManager implements DatabaseManager { } } - private void tryLoadSkillFloatValuesFromRawData(@NotNull Map skillMap, @NotNull String[] character, @NotNull PrimarySkillType primarySkillType, int expTaming, @NotNull String userName) { + private void tryLoadSkillFloatValuesFromRawData(@NotNull Map skillMap, @NotNull String[] character, @NotNull PrimarySkillType primarySkillType, int index, @NotNull String userName) { try { - float valueFromString = Integer.parseInt(character[expTaming]); + float valueFromString = Integer.parseInt(character[index]); skillMap.put(primarySkillType, valueFromString); } catch (NumberFormatException e) { skillMap.put(primarySkillType, 0F); @@ -1164,9 +1171,9 @@ public final class FlatFileDatabaseManager implements DatabaseManager { } } - private void tryLoadSkillIntValuesFromRawData(@NotNull Map skillMap, @NotNull String[] character, @NotNull PrimarySkillType primarySkillType, int expTaming, @NotNull String userName) { + private void tryLoadSkillIntValuesFromRawData(@NotNull Map skillMap, @NotNull String[] character, @NotNull PrimarySkillType primarySkillType, int index, @NotNull String userName) { try { - int valueFromString = Integer.parseInt(character[expTaming]); + int valueFromString = Integer.parseInt(character[index]); skillMap.put(primarySkillType, valueFromString); } catch (NumberFormatException e) { skillMap.put(primarySkillType, 0); From 0979ef555b2d0a7d44a953e7dff1a67f4b2f4047 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 11 Mar 2021 14:59:11 -0800 Subject: [PATCH 409/662] More tweaks to data recovery messages --- .../gmail/nossr50/database/FlatFileDatabaseManager.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java index c8b09ec5f..f95a36b57 100644 --- a/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java @@ -962,15 +962,17 @@ public final class FlatFileDatabaseManager implements DatabaseManager { //Not enough data found to be considered a user reliably (NOTE: not foolproof) if(rawSplitData.length < (UUID_INDEX + 1)) { if(!corruptDataFound) { - mcMMO.p.getLogger().severe("Removing corrupt data from mcmmo.users"); + mcMMO.p.getLogger().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; } if(rawSplitData.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 && rawSplitData[0] != null && !rawSplitData[0].isEmpty()) { - //This user may have had a name so declare it - mcMMO.p.getLogger().severe("Not enough data found to recover corrupted player data for user: "+rawSplitData[0]); + if(rawSplitData[0].length() <= 16 && rawSplitData[0].length() >= 3) { + mcMMO.p.getLogger().severe("Not enough data found to recover corrupted player data for user: "+rawSplitData[0]); + } } + //This user may have had a name so declare it continue; } From 7d5bcf3ebf275379de0347b79d933c9c74c894ff Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 11 Mar 2021 15:11:03 -0800 Subject: [PATCH 410/662] 2.1.180 --- Changelog.txt | 7 +++++++ pom.xml | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index 1189b47c7..9c544563c 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,8 +1,15 @@ 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) diff --git a/pom.xml b/pom.xml index 01d2a5a7e..425a419d4 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.180-SNAPSHOT + 2.1.180 mcMMO https://github.com/mcMMO-Dev/mcMMO From 4a048b47cbffa50ba87f6f99ad475e23d12c9836 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 12 Mar 2021 16:25:14 -0800 Subject: [PATCH 411/662] Refactor DB code a bit and fix console spam when using the Plan plugin Fixes #4450 --- Changelog.txt | 7 + pom.xml | 2 +- .../com/gmail/nossr50/api/DatabaseAPI.java | 2 +- .../com/gmail/nossr50/api/ExperienceAPI.java | 18 ++- .../database/ConvertDatabaseCommand.java | 2 +- .../commands/database/McremoveCommand.java | 2 +- .../experience/ExperienceCommand.java | 18 ++- .../experience/SkillresetCommand.java | 16 +- .../commands/player/InspectCommand.java | 2 +- .../nossr50/database/DatabaseManager.java | 24 +-- .../database/FlatFileDatabaseManager.java | 140 +++++++++++------- .../nossr50/database/SQLDatabaseManager.java | 69 +++++---- .../database/FormulaConversionTask.java | 2 +- .../player/PlayerProfileLoadingTask.java | 8 +- 14 files changed, 187 insertions(+), 125 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 9c544563c..22cfc4169 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,10 @@ +Version 2.1.181 + 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 diff --git a/pom.xml b/pom.xml index 425a419d4..5d8c2bdd5 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.180 + 2.1.181-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO diff --git a/src/main/java/com/gmail/nossr50/api/DatabaseAPI.java b/src/main/java/com/gmail/nossr50/api/DatabaseAPI.java index 544a23124..8f2879549 100644 --- a/src/main/java/com/gmail/nossr50/api/DatabaseAPI.java +++ b/src/main/java/com/gmail/nossr50/api/DatabaseAPI.java @@ -22,7 +22,7 @@ public class DatabaseAPI { * @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); + PlayerProfile playerProfile = mcMMO.getDatabaseManager().loadPlayerProfile(uuid, null); 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 69a4e1e28..be325c281 100644 --- a/src/main/java/com/gmail/nossr50/api/ExperienceAPI.java +++ b/src/main/java/com/gmail/nossr50/api/ExperienceAPI.java @@ -13,6 +13,8 @@ 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 org.bukkit.Bukkit; +import org.bukkit.OfflinePlayer; import org.bukkit.block.BlockState; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; @@ -714,7 +716,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)); } @@ -1126,8 +1127,6 @@ public final class ExperienceAPI { } } - - // Utility methods follow. private static void addOfflineXP(UUID playerUniqueId, PrimarySkillType skill, int XP) { PlayerProfile profile = getOfflineProfile(playerUniqueId); @@ -1144,8 +1143,10 @@ public final class ExperienceAPI { profile.scheduleAsyncSave(); } - private static PlayerProfile getOfflineProfile(UUID uuid) { - PlayerProfile profile = mcMMO.getDatabaseManager().loadPlayerProfile(uuid); + private static PlayerProfile getOfflineProfile(UUID uuid) throws InvalidPlayerException { + OfflinePlayer offlinePlayer = Bukkit.getServer().getOfflinePlayer(uuid); + String playerName = offlinePlayer.getName(); + PlayerProfile profile = mcMMO.getDatabaseManager().loadPlayerProfile(uuid, playerName); if (!profile.isLoaded()) { throw new InvalidPlayerException(); @@ -1155,9 +1156,10 @@ public final class ExperienceAPI { } @Deprecated - private static PlayerProfile getOfflineProfile(String playerName) { - UUID uuid = mcMMO.p.getServer().getOfflinePlayer(playerName).getUniqueId(); - PlayerProfile profile = mcMMO.getDatabaseManager().loadPlayerProfile(uuid); + private static PlayerProfile getOfflineProfile(String playerName) throws InvalidPlayerException { + OfflinePlayer offlinePlayer = Bukkit.getServer().getOfflinePlayer(playerName); + UUID uuid = offlinePlayer.getUniqueId(); + PlayerProfile profile = mcMMO.getDatabaseManager().loadPlayerProfile(uuid, playerName); if (!profile.isLoaded()) { throw new InvalidPlayerException(); 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 327d7da8b..6bbee5f9f 100644 --- a/src/main/java/com/gmail/nossr50/commands/database/ConvertDatabaseCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/database/ConvertDatabaseCommand.java @@ -54,7 +54,7 @@ public class ConvertDatabaseCommand implements CommandExecutor { UserManager.clearAll(); for (Player player : mcMMO.p.getServer().getOnlinePlayers()) { - PlayerProfile profile = oldDatabase.loadPlayerProfile(player.getUniqueId()); + PlayerProfile profile = oldDatabase.loadPlayerProfile(player.getUniqueId(), null); if (profile.isLoaded()) { mcMMO.getDatabaseManager().saveUser(profile); 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 731a35524..56b817337 100644 --- a/src/main/java/com/gmail/nossr50/commands/database/McremoveCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/database/McremoveCommand.java @@ -22,7 +22,7 @@ public class McremoveCommand implements TabExecutor { if (args.length == 1) { String playerName = CommandUtils.getMatchedPlayerName(args[0]); - if (UserManager.getOfflinePlayer(playerName) == null && CommandUtils.unloadedProfile(sender, mcMMO.getDatabaseManager().loadPlayerProfile(playerName, false))) { + if (UserManager.getOfflinePlayer(playerName) == null && CommandUtils.unloadedProfile(sender, mcMMO.getDatabaseManager().loadPlayerProfile(playerName))) { return true; } 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 2443e6d62..11684ebf8 100644 --- a/src/main/java/com/gmail/nossr50/commands/experience/ExperienceCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/experience/ExperienceCommand.java @@ -97,14 +97,20 @@ 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); + OfflinePlayer offlinePlayer = mcMMO.p.getServer().getOfflinePlayer(playerName); + PlayerProfile profile; + uuid = offlinePlayer.getUniqueId(); + profile = mcMMO.getDatabaseManager().loadPlayerProfile(uuid, null); + + //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, isSilent(args)); 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 3df1976d9..9b97fa77a 100644 --- a/src/main/java/com/gmail/nossr50/commands/experience/SkillresetCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/experience/SkillresetCommand.java @@ -80,13 +80,19 @@ public class SkillresetCommand implements TabExecutor { 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); + uuid = player.getUniqueId(); + PlayerProfile profile = mcMMO.getDatabaseManager().loadPlayerProfile(uuid, playerName); + + //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); 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 a65fa1cf2..a65004417 100644 --- a/src/main/java/com/gmail/nossr50/commands/player/InspectCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/player/InspectCommand.java @@ -30,7 +30,7 @@ public class InspectCommand 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) { - PlayerProfile profile = mcMMO.getDatabaseManager().loadPlayerProfile(playerName, false); // Temporary Profile + PlayerProfile profile = mcMMO.getDatabaseManager().loadPlayerProfile(playerName); // Temporary Profile if (!CommandUtils.isLoaded(sender, profile)) { return true; diff --git a/src/main/java/com/gmail/nossr50/database/DatabaseManager.java b/src/main/java/com/gmail/nossr50/database/DatabaseManager.java index c41401296..7b6fc41cd 100644 --- a/src/main/java/com/gmail/nossr50/database/DatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/DatabaseManager.java @@ -6,6 +6,7 @@ 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.entity.Player; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -83,19 +84,16 @@ public interface DatabaseManager { */ void 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 - PlayerProfile loadPlayerProfile(String playerName, boolean createNew); + @NotNull PlayerProfile loadPlayerProfile(@NotNull String playerName); /** * Load a player from the database. @@ -103,19 +101,7 @@ public interface DatabaseManager { * @param uuid The uuid of the player to load from the database * @return The player's data, or an unloaded PlayerProfile if not found */ - PlayerProfile loadPlayerProfile(UUID uuid); - - /** - * 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 - */ - PlayerProfile loadPlayerProfile(String playerName, UUID uuid, boolean createNew); + @NotNull PlayerProfile loadPlayerProfile(@NotNull UUID uuid, @Nullable String playerName); /** * Get all users currently stored in the database. diff --git a/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java index f95a36b57..a767a481b 100644 --- a/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java @@ -14,8 +14,8 @@ 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.text.StringUtils; import org.bukkit.OfflinePlayer; +import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -461,6 +461,11 @@ public final class FlatFileDatabaseManager implements DatabaseManager { return skills; } + public @NotNull PlayerProfile newUser(@NotNull Player player) { + newUser(player.getName(), player.getUniqueId()); + return new PlayerProfile(player.getName(), player.getUniqueId(), true); + } + public void newUser(String playerName, UUID uuid) { BufferedWriter out = null; synchronized (fileWritingLock) { @@ -534,17 +539,15 @@ public final class FlatFileDatabaseManager implements DatabaseManager { } } - @Deprecated - public PlayerProfile loadPlayerProfile(String playerName, boolean create) { - return loadPlayerProfile(playerName, null, false); + public @NotNull PlayerProfile loadPlayerProfile(@NotNull String playerName) { + return loadPlayerByName(playerName); } - public PlayerProfile loadPlayerProfile(UUID uuid) { - return loadPlayerProfile("", uuid, false); + public @NotNull PlayerProfile loadPlayerProfile(@NotNull UUID uuid, @Nullable String playerName) { + return loadPlayerByUUID(uuid, playerName); } - public PlayerProfile loadPlayerProfile(String playerName, UUID uuid, boolean create) { -// boolean updateRequired = false; + private @NotNull PlayerProfile loadPlayerByUUID(@NotNull UUID uuid, @Nullable String playerName) { BufferedReader in = null; String usersFilePath = mcMMO.getUsersFilePath(); @@ -558,68 +561,105 @@ public final class FlatFileDatabaseManager implements DatabaseManager { // Find if the line contains the player we want. String[] rawSplitData = line.split(":"); - if(rawSplitData.length < (USERNAME_INDEX + 1)) { - //Users without a name aren't worth it - mcMMO.p.getLogger().severe("Corrupted data was found in mcmmo.users, removing it from the database"); - } - - // Compare names because we don't have a valid uuid for that player even - // if input uuid is not null - if (rawSplitData[UUID_INDEX].equalsIgnoreCase("NULL") - || rawSplitData[UUID_INDEX].isEmpty() - || rawSplitData[UUID_INDEX].equalsIgnoreCase("")) { - if (!rawSplitData[USERNAME_INDEX].equalsIgnoreCase(playerName)) { - continue; - } - } - - // If input uuid is not null then we should compare uuids - else if ((uuid != null && !rawSplitData[UUID_INDEX].equalsIgnoreCase(uuid.toString())) || (uuid == null && !rawSplitData[USERNAME_INDEX].equalsIgnoreCase(playerName))) { + /* Don't read corrupt data */ + if(rawSplitData.length < (UUID_INDEX + 1)) { continue; } - // Update playerName in database after name change + /* Does this entry have a UUID? */ + if (rawSplitData[UUID_INDEX].equalsIgnoreCase("NULL") + || rawSplitData[UUID_INDEX].isEmpty() + || rawSplitData[UUID_INDEX].equalsIgnoreCase("")) { + continue; //No UUID entry found for this data in the DB, go to next entry + } + + // Compare provided UUID to DB + if (!rawSplitData[UUID_INDEX].equalsIgnoreCase(uuid.toString())) { + continue; //Doesn't match, go to the next entry + } + + /* + * UUID Matched! + * Making it this far means the current data line is considered a match + */ + + + /* Check for nickname changes and update since we are here anyways */ if (!rawSplitData[USERNAME_INDEX].equalsIgnoreCase(playerName)) { - //TODO: A proper fix for changed names - mcMMO.p.getLogger().info("Name change detected: " + rawSplitData[USERNAME_INDEX] + " => " + playerName); + //mcMMO.p.getLogger().info("Name updated for player: " + rawSplitData[USERNAME_INDEX] + " => " + playerName); rawSplitData[USERNAME_INDEX] = playerName; -// updateRequired = true; //Flag profile to update } return loadFromLine(rawSplitData); } - - // 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) { + } catch (Exception e) { e.printStackTrace(); - } - finally { + } 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) { + } catch (IOException e) { // Ignore } } } } - // Return unloaded profile - if (uuid == null) { - return new PlayerProfile(playerName); + /* + * No match was found in the file + */ + + return grabUnloadedProfile(uuid, playerName); //Create an empty new profile and return + } + + private @NotNull PlayerProfile loadPlayerByName(@NotNull String playerName) { + 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[] 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, null); + } + + private @NotNull PlayerProfile grabUnloadedProfile(@NotNull UUID uuid, @Nullable String playerName) { + if(playerName == null) { + playerName = ""; //No name for you boy! } return new PlayerProfile(playerName, uuid); @@ -1205,8 +1245,6 @@ public final class FlatFileDatabaseManager implements DatabaseManager { return skills; } - - public DatabaseType getDatabaseType() { return DatabaseType.FLATFILE; } diff --git a/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java index a7ee6eb95..e011b9312 100644 --- a/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java @@ -16,6 +16,7 @@ import com.gmail.nossr50.runnables.database.UUIDUpdateAsyncTask; import com.gmail.nossr50.util.Misc; import org.apache.tomcat.jdbc.pool.DataSource; import org.apache.tomcat.jdbc.pool.PoolProperties; +import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitRunnable; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -506,6 +507,24 @@ public final class SQLDatabaseManager implements DatabaseManager { } } + @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); + } else { + return loadPlayerProfile(player.getUniqueId(), player.getName()); + } + } catch (SQLException e) { + e.printStackTrace(); + } + + return new PlayerProfile(player.getName(), player.getUniqueId(), false); + } + private int newUser(Connection connection, String playerName, UUID uuid) { ResultSet resultSet = null; PreparedStatement statement = null; @@ -544,20 +563,24 @@ 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); + } } - public PlayerProfile loadPlayerProfile(UUID uuid) { - return loadPlayerProfile("", uuid, false, true); + public @NotNull PlayerProfile loadPlayerProfile(@NotNull UUID uuid, @Nullable String playerName) { + return loadPlayerFromDB(uuid, playerName); } - public PlayerProfile loadPlayerProfile(String playerName, UUID uuid, boolean create) { - return loadPlayerProfile(playerName, uuid, create, true); - } + 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."); + } - private PlayerProfile loadPlayerProfile(String playerName, UUID uuid, boolean create, boolean retry) { PreparedStatement statement = null; Connection connection = null; ResultSet resultSet = null; @@ -567,16 +590,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, false); } // There is such a user writeMissingRows(connection, id); @@ -604,7 +619,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 = ? " @@ -641,15 +659,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, false); } public void convertUsers(DatabaseManager destination) { 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 f8b231b58..5447feb64 100644 --- a/src/main/java/com/gmail/nossr50/runnables/database/FormulaConversionTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/database/FormulaConversionTask.java @@ -32,7 +32,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."); 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 b97818ebf..8944fb043 100644 --- a/src/main/java/com/gmail/nossr50/runnables/player/PlayerProfileLoadingTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/player/PlayerProfileLoadingTask.java @@ -42,7 +42,13 @@ public class PlayerProfileLoadingTask extends BukkitRunnable { return; } - PlayerProfile profile = mcMMO.getDatabaseManager().loadPlayerProfile(player.getName(), player.getUniqueId(), true); + PlayerProfile profile = mcMMO.getDatabaseManager().loadPlayerProfile(player.getUniqueId(), player.getName()); + + 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()) { From 75db0af01d8db3ce5168f18f3c4d36e33e008b52 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 12 Mar 2021 16:37:21 -0800 Subject: [PATCH 412/662] More console spam reduction for database operations --- Changelog.txt | 1 + .../com/gmail/nossr50/database/FlatFileDatabaseManager.java | 4 ---- .../java/com/gmail/nossr50/database/SQLDatabaseManager.java | 4 ++-- .../gmail/nossr50/runnables/database/UUIDUpdateAsyncTask.java | 2 +- 4 files changed, 4 insertions(+), 7 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 22cfc4169..d9fe87d35 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,4 +1,5 @@ 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) diff --git a/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java index a767a481b..46c36d07f 100644 --- a/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java @@ -78,10 +78,6 @@ public final class FlatFileDatabaseManager implements DatabaseManager { usersFile = new File(mcMMO.getUsersFilePath()); checkStructure(); updateLeaderboards(); - - if (mcMMO.getUpgradeManager().shouldUpgrade(UpgradeType.ADD_UUIDS)) { - new UUIDUpdateAsyncTask(mcMMO.p, getStoredUsers()).start(); - } } public void purgePowerlessUsers() { diff --git a/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java index e011b9312..05d621243 100644 --- a/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java @@ -1337,6 +1337,8 @@ 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); @@ -1347,8 +1349,6 @@ 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 { 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 fe87185aa..fe7a029a7 100644 --- a/src/main/java/com/gmail/nossr50/runnables/database/UUIDUpdateAsyncTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/database/UUIDUpdateAsyncTask.java @@ -99,7 +99,7 @@ public class UUIDUpdateAsyncTask implements Runnable { position += batch.size(); plugin.getLogger().info(String.format("Conversion progress: %d/%d users", position, userNames.size())); - if (position == userNames.size()) { + if (position +1 >= userNames.size()) { mcMMO.getUpgradeManager().setUpgradeCompleted(UpgradeType.ADD_UUIDS); awaiter.countDown(); plugin.getLogger().info("UUID checks completed"); From 6cec253243bba1f661e2374cd0cbe18bb84721aa Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 12 Mar 2021 17:07:14 -0800 Subject: [PATCH 413/662] 2.1.181 --- pom.xml | 2 +- .../nossr50/api/exceptions/McMMOPlayerNotFoundException.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 5d8c2bdd5..fb224f530 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.181-SNAPSHOT + 2.1.181 mcMMO https://github.com/mcMMO-Dev/mcMMO 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 d2df14a70..374c04a9a 100644 --- a/src/main/java/com/gmail/nossr50/api/exceptions/McMMOPlayerNotFoundException.java +++ b/src/main/java/com/gmail/nossr50/api/exceptions/McMMOPlayerNotFoundException.java @@ -7,6 +7,6 @@ public class McMMOPlayerNotFoundException extends RuntimeException { private static final long serialVersionUID = 761917904993202836L; 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()); + super("McMMOPlayer object was not found for [NOTE: This can mean the profile is not loaded yet! : " + player.getName() + " " + player.getUniqueId()); } } From 06990c858e1e442a3850b8e4ffad8a03fc6a097d Mon Sep 17 00:00:00 2001 From: w1tcherrr <70418164+w1tcherrr@users.noreply.github.com> Date: Tue, 16 Mar 2021 21:03:53 +0100 Subject: [PATCH 414/662] Fixed mistakes in german locale file (#4454) * Fixed mistakes * Update src/main/resources/locale/locale_de.properties Co-authored-by: TheBusyBiscuit * Update src/main/resources/locale/locale_de.properties Co-authored-by: TheBusyBiscuit * More Fixes Co-authored-by: TheBusyBiscuit --- .../resources/locale/locale_de.properties | 60 +++++++++---------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/src/main/resources/locale/locale_de.properties b/src/main/resources/locale/locale_de.properties index 7b6b534b5..87cfc4240 100644 --- a/src/main/resources/locale/locale_de.properties +++ b/src/main/resources/locale/locale_de.properties @@ -17,7 +17,7 @@ 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\u00E4ltst 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.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\u00E4ltst du im Fall die Duck-Taste (standardm\u00E4\u00DFig 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 @@ -62,7 +62,7 @@ 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\u00FCr {1}s pausiert) Axes.Combat.CritStruck = &cDu wurdest &4schwer &cverwundet! -Axes.Combat.CriticalHit = &4&Kritischer Treffer! +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\u00E4delspalter getroffen** @@ -233,7 +233,7 @@ Commands.Party.PartyFull.InviteAccept = Du kannst der Party &a{0}&c nicht beitre 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.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. @@ -242,7 +242,7 @@ Commands.Party.ToggleShareCategory = &7Party Item teilen f\u00FCr&6{0} &7wurde & 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 = &4Gesamtlevel: &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 @@ -262,14 +262,14 @@ Commands.Skill.ChildSkill = Unterskills sind f\u00FCr diesen Befehl nicht benutz 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 = &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.3.XP = &cDie korrekte Verwendung ist /{0} {1} {2} {3}&7 (Du kannst auch -s an das Ende des Befehls hinzuf\u00FC"gen, damit der Spieler nicht benachrichtigt wird.) +Commands.Usage.3.XP = &cDie korrekte Verwendung ist /{0} {1} {2} {3}&7 (Du kannst auch -s an das Ende des Befehls hinzuf\u00FCgen, damit der Spieler nicht benachrichtigt wird.) Commands.Usage.FullClassName = Klassenname Commands.Usage.Level = Level Commands.Usage.Message = Nachricht @@ -285,7 +285,7 @@ Commands.XPBar.DisableAll = &6Alle mcMMO Erfahrungsleisten wurden deaktiviert, b Commands.XPBar.Reset = &6Die Erfahrungsleisten-Einstellungen f\u00FCr mcMMO wurden zur\u00FCckgesetzt. Commands.XPBar.SettingChanged = &6Die Erfahrungsleisten-Einstellungen f\u00FCr &a{0}&6 wurden gesetzt auf: &a{1} Commands.XPBar.Usage = Die korrekte Verwendung ist /mmoxpbar -Commands.XPGain = &8XP ZUWACHS: &f{0} +Commands.XPGain = &8XP-Zuwachs: &f{0} Commands.XPGain.Acrobatics = Fallen Commands.XPGain.Alchemy = Tr\u00E4nke brauen Commands.XPGain.Archery = Monster angreifen @@ -379,12 +379,12 @@ Excavation.SubSkill.GigaDrillBreaker.Description = Dreifache Droprate, dreifache Excavation.SubSkill.GigaDrillBreaker.Name = Gigabohrer Excavation.SubSkill.GigaDrillBreaker.Stat = Gigabohrer-Dauer -Fishing.Ability.Info = Zauberj\u00E4ger: &7 **Verbessert sich mit Schatzj\u00E4ger-Rang** +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.MagicFound = &bDu f\u00FChlst etwas Magisches an diesem Fang... Fishing.Ability.TH.Poison = &7Irgendetwas stinkt hier... Fishing.Chance.Raining = &9Regen-Bonus Fishing.Exhausting = &c&oUnsachgem\u00E4\u00DFe Nutzung der Angelrute f\u00FChrt zu Erm\u00FCdung und Abnutzen der Rute. @@ -557,7 +557,7 @@ 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! -Item.ChimaeraWing.Fail = &c**CHIMAERA FL\u00DCGEL GESCHEITERT!** +Item.ChimaeraWing.Fail = &c**Chimaera Fl\u00FCgel 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! @@ -595,7 +595,7 @@ 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.LevelRequirement = Level-Voraussetzung JSON.Locked = -=[NICHT VERF\u00DCGBAR]=- JSON.Mining = Bergbau JSON.Notification.SuperAbility = {0} @@ -610,7 +610,7 @@ 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.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! @@ -666,7 +666,7 @@ Mining.SubSkill.SuperBreaker.Stat = Superbrecher L\u00E4nge 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.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. @@ -715,7 +715,7 @@ 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.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} . @@ -823,7 +823,7 @@ 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 +Repair.SubSkill.SuperRepair.Stat = Chance auf Super-Reparatur Salvage.Ability.Bonus.0 = Fortgeschrittenes Verwerten Salvage.Ability.Bonus.1 = Max Ertrag {0} Item zerst\u00F6rt @@ -845,7 +845,7 @@ Salvage.Skills.Success = &aItem verwertet! Salvage.Skills.TooDamaged = &4Das Item ist zu besch\u00E4digt um verwertet zu werden. 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.ArcaneSalvage.Stat = Magische Bergung: &eRang {0}/{1} Salvage.SubSkill.ScrapCollector.Description = Verschrotte einen Gegenstand, um Materialien zur\u00FCckzugewinnen; eine perfekte Verschrottung erfordert Gl\u00FCck und Geschick. Salvage.SubSkill.ScrapCollector.Name = Schrottsammler Salvage.SubSkill.ScrapCollector.Stat = Schrottsammler: &aVerschrotte bis zu &e{0}&a Gegenst\u00E4nde. Hierbei spielt Gl\u00FCck eine gewisse Rolle. @@ -856,13 +856,13 @@ 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.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.PowerLevel = &6Gesamt-Level Scoreboard.Misc.RemainingXP = Verbliebene XP Server.ConsoleName = &e[Server] @@ -884,9 +884,9 @@ Skills.TooTired = Du bist zu m\u00FCde um diese F\u00E4higkeit zu verwenden. &e( Skills.TooTired.Extra = &6{0} &eSuperf\u00E4higkeit CDs - {1} Skills.TooTired.Named = &7(&6{0}&e {1}s&7) -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.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 @@ -895,7 +895,7 @@ 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.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 @@ -906,12 +906,12 @@ Smelting.SubSkill.UnderstandingTheArt.Stat = Vanilla Erfahrungsmultiplikator: &e Stats.Header.Combat = &6-=Kampfskills=- Stats.Header.Gathering = &6-=Sammelskills=- Stats.Header.Misc = &6-=Weitere Skills=- -Stats.Own.Stats = &aSkill Statistik +Stats.Own.Stats = &aSkill-Statistik -Swords.Ability.Lower = &7&o**Du senkst dein Sschwert.** +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 = &4 Du blutest! +Swords.Combat.Bleeding.Started = &4Du blutest! Swords.Combat.Bleeding.Stopped = &7Das Bluten hat &aaufgeh\u00F6rt&7! Swords.Combat.Counter.Hit = &4Treffer durch Gegenangriff! Swords.Combat.Countered = &a**Gegenangriff** @@ -920,7 +920,7 @@ Swords.Combat.SS.Struck = &4Getroffen von S\u00E4gezahnschlag! Swords.Effect.4 = S\u00E4gezahnschlag, Blutung+ Swords.Effect.5 = {0} Ticks Blutung Swords.Listener = Schwert: -Swords.SkillName = Sschwert +Swords.SkillName = Schwert Swords.Skills.SS.Off = &a&o**S\u00E4gezahnschlag abgenutzt** Swords.Skills.SS.On = &a&o**S\u00E4gezahnschlag aktiviert** Swords.Skills.SS.Other.Off = {0}s &cS\u00E4gezahnschlag&a ist &aabgenutzt. @@ -983,7 +983,7 @@ 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.Description = Reduktion von Explosionsschaden. Taming.SubSkill.ShockProof.Name = Schock-Sicher Taming.SubSkill.ThickFur.Description = Verminderter Schaden, Feuer-Resistenz Taming.SubSkill.ThickFur.Name = Dicker Pelz @@ -1030,7 +1030,7 @@ Unarmed.SubSkill.SteelArmStyle.Description = Verst\u00E4rkt deinen Arm mit der Z Unarmed.SubSkill.SteelArmStyle.Name = St\u00E4hlerner Arm Unarmed.SubSkill.UnarmedLimitBreak.Description = Durchbreche deine Grenzen! Unarmed.SubSkill.UnarmedLimitBreak.Name = \u00DCberwindung -Unarmed.SubSkill.UnarmedLimitBreak.Stat = Bonus Schaden durch \u00DCberwindung +Unarmed.SubSkill.UnarmedLimitBreak.Stat = Bonus-Schaden durch \u00DCberwindung UpdateChecker.NewAvailable = Eine neue Version von mcMMO ist auf Spigot erh\u00E4ltlich! UpdateChecker.Outdated = Du verwendest eine veraltete mcMMO Version! @@ -1088,9 +1088,9 @@ XPBar.Woodcutting = Holzf\u00E4llen 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! -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.Description = &3\u00DCber 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\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),&6 - &aAnseba &9(\u00DCberarbeitung Deutsche \u00DCbersetzung), &3N\u00FCtzliche 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.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. mcMMO.Template.Prefix = &6(&amcMMO&6) &7{0} From b181fb4568d5183a695bd9b69816ffe0a07e4e78 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 16 Mar 2021 13:12:45 -0700 Subject: [PATCH 415/662] Update changelog --- Changelog.txt | 4 ++++ pom.xml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index d9fe87d35..edab3d0bc 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,7 @@ +Version 2.1.182 + Fixed several errors in de locale (Thanks TheBusyBiscuit & w1tcherrr) + + 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 diff --git a/pom.xml b/pom.xml index fb224f530..1a9cd6cfe 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.181 + 2.1.182-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO From 444d5edd66cd463671edc13a61f1a5bf44e65ec5 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 16 Mar 2021 13:16:17 -0700 Subject: [PATCH 416/662] Fixed double smelt not working if furnace was empty --- Changelog.txt | 1 + .../java/com/gmail/nossr50/skills/smelting/SmeltingManager.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index edab3d0bc..3821b79a4 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,5 +1,6 @@ Version 2.1.182 Fixed several errors in de locale (Thanks TheBusyBiscuit & w1tcherrr) + Fixed a bug where double smelt never succeeded if the furnace was empty Version 2.1.181 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 ddda94ba1..0c0e0cb23 100644 --- a/src/main/java/com/gmail/nossr50/skills/smelting/SmeltingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/smelting/SmeltingManager.java @@ -140,7 +140,7 @@ public class SmeltingManager extends SkillManager { ItemStack furnaceResult = furnaceInventory.getResult(); if(furnaceResult == null) - return false; + 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(); From 49d4e979301ad8d411a06d7e8a5e7abf0f8b07e5 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 16 Mar 2021 14:05:33 -0700 Subject: [PATCH 417/662] Some safety redundancy --- Changelog.txt | 2 +- src/main/java/com/gmail/nossr50/mcMMO.java | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 3821b79a4..d555798e5 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,7 +1,7 @@ Version 2.1.182 Fixed several errors in de locale (Thanks TheBusyBiscuit & w1tcherrr) Fixed a bug where double smelt never succeeded if the furnace was empty - + Added some safety so that mcMMO automatic save interval is never more frequent than 1 minute Version 2.1.181 mcMMO no longer pointlessly tries to check for missing UUIDs for FlatFile database diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index 858160043..334d26886 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -621,7 +621,11 @@ 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, Config.getInstance().getSaveInterval() * minute); + new SaveTimerTask().runTaskTimer(this, saveIntervalTicks, saveIntervalTicks); // Cleanup the backups folder From dc2c099231ebbd718b155ea7e063ee88777f1714 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 16 Mar 2021 16:36:16 -0700 Subject: [PATCH 418/662] Add warning about the plugin conflict between mcMMO and ChatControlRed --- Changelog.txt | 1 + src/main/java/com/gmail/nossr50/mcMMO.java | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/Changelog.txt b/Changelog.txt index d555798e5..1b1eabf16 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -2,6 +2,7 @@ Version 2.1.182 Fixed several errors in de locale (Thanks TheBusyBiscuit & w1tcherrr) Fixed a bug where double smelt never succeeded if the furnace was empty Added some safety so that mcMMO automatic save interval is never more frequent than 1 minute + Added a warning when mcMMO detects ChatControlRed running on the server which has an unresolved severe plugin conflict with mcMMO Version 2.1.181 mcMMO no longer pointlessly tries to check for missing UUIDs for FlatFile database diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index 334d26886..a47bc357c 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -266,6 +266,13 @@ public class mcMMO extends JavaPlugin { else metrics.addCustomChart(new SimplePie("leveling_system", () -> "Standard")); } + + //TODO: Remove this when ChatControlRed fixes itself + if(pluginManager.getPlugin("ChatControlRed") != null) { + getLogger().severe("mcMMO has detected ChatControlRed on your server, users have reported a severe plugin conflict between these two plugins which degrades server performance and wastes many server resources."); + getLogger().severe("It is HIGHLY RECOMMENDED that you do --NOT-- use ChatControlRed until this issue is resolved!"); + } + } catch (Throwable t) { getLogger().severe("There was an error while enabling mcMMO!"); From 312206eda50ec2b13f17f7e65c2136f8ac73dae7 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 16 Mar 2021 16:43:25 -0700 Subject: [PATCH 419/662] Tweak save debug messages --- src/main/java/com/gmail/nossr50/party/PartyManager.java | 3 ++- src/main/java/com/gmail/nossr50/runnables/SaveTimerTask.java | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/gmail/nossr50/party/PartyManager.java b/src/main/java/com/gmail/nossr50/party/PartyManager.java index 1aae85dc0..52d3836a5 100644 --- a/src/main/java/com/gmail/nossr50/party/PartyManager.java +++ b/src/main/java/com/gmail/nossr50/party/PartyManager.java @@ -642,6 +642,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!"); @@ -651,7 +653,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(); 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(); } } From 667b9a22264a88774f6c0057a7a22a019bffa1d2 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Wed, 17 Mar 2021 09:59:18 -0700 Subject: [PATCH 420/662] Remove ChatControlRed warning pending further proof of bug --- Changelog.txt | 1 - src/main/java/com/gmail/nossr50/mcMMO.java | 11 ++++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 1b1eabf16..d555798e5 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -2,7 +2,6 @@ Version 2.1.182 Fixed several errors in de locale (Thanks TheBusyBiscuit & w1tcherrr) Fixed a bug where double smelt never succeeded if the furnace was empty Added some safety so that mcMMO automatic save interval is never more frequent than 1 minute - Added a warning when mcMMO detects ChatControlRed running on the server which has an unresolved severe plugin conflict with mcMMO Version 2.1.181 mcMMO no longer pointlessly tries to check for missing UUIDs for FlatFile database diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index a47bc357c..93e24696f 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -267,11 +267,12 @@ public class mcMMO extends JavaPlugin { metrics.addCustomChart(new SimplePie("leveling_system", () -> "Standard")); } - //TODO: Remove this when ChatControlRed fixes itself - if(pluginManager.getPlugin("ChatControlRed") != null) { - getLogger().severe("mcMMO has detected ChatControlRed on your server, users have reported a severe plugin conflict between these two plugins which degrades server performance and wastes many server resources."); - getLogger().severe("It is HIGHLY RECOMMENDED that you do --NOT-- use ChatControlRed until this issue is resolved!"); - } + //Can't confirm this bug myself as the plugin is premium +// //TODO: Remove this when ChatControlRed fixes itself +// if(pluginManager.getPlugin("ChatControlRed") != null) { +// getLogger().severe("mcMMO has detected ChatControlRed on your server, users have reported a severe plugin conflict between these two plugins which degrades server performance and wastes many server resources."); +// getLogger().severe("It is HIGHLY RECOMMENDED that you do --NOT-- use ChatControlRed until this issue is resolved!"); +// } } catch (Throwable t) { From 076d7a7f87b64719cff6a5779dfa840d9fd92542 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Wed, 17 Mar 2021 10:03:54 -0700 Subject: [PATCH 421/662] Remove hardcore and vampirism commands --- Changelog.txt | 1 + .../commands/hardcore/HardcoreCommand.java | 128 +++++++++--------- .../commands/hardcore/VampirismCommand.java | 128 +++++++++--------- .../commands/CommandRegistrationManager.java | 44 +++--- src/main/resources/plugin.yml | 88 ++++++------ 5 files changed, 194 insertions(+), 195 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index d555798e5..2d248159f 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,4 +1,5 @@ Version 2.1.182 + 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 Added some safety so that mcMMO automatic save interval is never more frequent than 1 minute 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..e3697be36 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 : 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 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..8bdfa83f9 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 : 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 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 215c160d8..3f93437a7 100644 --- a/src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java +++ b/src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java @@ -12,8 +12,6 @@ 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.*; @@ -363,25 +361,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"); @@ -473,8 +471,8 @@ public final class CommandRegistrationManager { registerSkillresetCommand(); // Hardcore Commands - registerHardcoreCommand(); - registerVampirismCommand(); +// registerHardcoreCommand(); +// registerVampirismCommand(); // Party Commands registerPartyCommand(); diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 70499738e..508e96ee8 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -156,14 +156,14 @@ 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 @@ -833,7 +833,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 @@ -854,7 +854,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 @@ -876,23 +876,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.*: @@ -1283,23 +1283,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.*: From c7a8d74963e5e5ee3823408a50194201795ac42e Mon Sep 17 00:00:00 2001 From: nossr50 Date: Wed, 17 Mar 2021 10:39:05 -0700 Subject: [PATCH 422/662] Add customboost 'mcmmo.perks.xp.customboost.all' perk permission node --- Changelog.txt | 1 + src/main/java/com/gmail/nossr50/util/Permissions.java | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index 2d248159f..ddd170a27 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,4 +1,5 @@ Version 2.1.182 + 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 diff --git a/src/main/java/com/gmail/nossr50/util/Permissions.java b/src/main/java/com/gmail/nossr50/util/Permissions.java index c72b048b9..21df34696 100644 --- a/src/main/java/com/gmail/nossr50/util/Permissions.java +++ b/src/main/java/com/gmail/nossr50/util/Permissions.java @@ -124,7 +124,12 @@ public final class Permissions { 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 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"); } From 13a2d0344407279e9e993f064be88e4af1fb0ff2 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 18 Mar 2021 13:11:03 -0700 Subject: [PATCH 423/662] Remove silent exceptions --- Changelog.txt | 1 + .../gmail/nossr50/util/scoreboards/ScoreboardWrapper.java | 8 +++++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index ddd170a27..5491f971c 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -4,6 +4,7 @@ Version 2.1.182 Fixed several errors in de locale (Thanks TheBusyBiscuit & w1tcherrr) Fixed a bug where double smelt never succeeded if the furnace was empty Added some safety so that mcMMO automatic save interval is never more frequent than 1 minute + Removed a few "silent" exceptions for scoreboards & mcMMO Version 2.1.181 mcMMO no longer pointlessly tries to check for missing UUIDs for FlatFile database 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 ad61aede0..2ba8715f5 100644 --- a/src/main/java/com/gmail/nossr50/util/scoreboards/ScoreboardWrapper.java +++ b/src/main/java/com/gmail/nossr50/util/scoreboards/ScoreboardWrapper.java @@ -126,7 +126,8 @@ public class ScoreboardWrapper { try { cooldownTask.cancel(); } - catch (Throwable ignored) { + catch (Exception e) { + e.printStackTrace(); } cooldownTask = null; @@ -430,8 +431,9 @@ public class ScoreboardWrapper { try { updateTask.cancel(); } - catch (Throwable ignored) { - } // catch NullPointerException and IllegalStateException and any Error; don't care + catch (Exception e) { + e.printStackTrace(); + } updateTask = null; From 4f08c6955707c2a7766af3aa431eedf77082f2ed Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 18 Mar 2021 13:18:30 -0700 Subject: [PATCH 424/662] Add UltraPermission warning to mcMMO --- Changelog.txt | 3 ++- src/main/java/com/gmail/nossr50/mcMMO.java | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index 5491f971c..9c4980063 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -4,7 +4,8 @@ Version 2.1.182 Fixed several errors in de locale (Thanks TheBusyBiscuit & w1tcherrr) Fixed a bug where double smelt never succeeded if the furnace was empty Added some safety so that mcMMO automatic save interval is never more frequent than 1 minute - Removed a few "silent" exceptions for scoreboards & mcMMO + Removed a few silent exceptions for scoreboards & mcMMO + Added warning about UltraPermissions to mcMMO Version 2.1.181 mcMMO no longer pointlessly tries to check for missing UUIDs for FlatFile database diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index 93e24696f..25dcfea14 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -74,6 +74,10 @@ import java.util.ArrayList; import java.util.List; public class mcMMO extends JavaPlugin { + public static final String ULTRA_PERMISSONS = "UltraPermissons"; + public static final String UP_WARNING_2 = "Stop using " + ULTRA_PERMISSONS + " with mcMMO immediately!"; + public static final String UP_WARNING_1 = "mcMMO has detected " + ULTRA_PERMISSONS + " on your server, users have reported a severe plugin conflict between these two plugins which severely degrades server performance"; + public static final String UP_WARNING_3 = "The author of UltraPermissions has passed away and its unlikely this issue will ever be solved"; /* Managers */ private static PlatformManager platformManager; private static ChunkManager placeStore; @@ -273,7 +277,17 @@ public class mcMMO extends JavaPlugin { // getLogger().severe("mcMMO has detected ChatControlRed on your server, users have reported a severe plugin conflict between these two plugins which degrades server performance and wastes many server resources."); // getLogger().severe("It is HIGHLY RECOMMENDED that you do --NOT-- use ChatControlRed until this issue is resolved!"); // } + if(pluginManager.getPlugin(ULTRA_PERMISSONS) != null) { + Bukkit.getScheduler().runTaskTimer(this, () -> { + getLogger().severe(UP_WARNING_1); + getLogger().severe(UP_WARNING_2); + getLogger().severe(UP_WARNING_3); + Bukkit.broadcastMessage(UP_WARNING_1); + Bukkit.broadcastMessage(UP_WARNING_2); + Bukkit.broadcastMessage(UP_WARNING_3); + }, 0L, 1200L); + } } catch (Throwable t) { getLogger().severe("There was an error while enabling mcMMO!"); From 49f1154e6581960c6d0792827134018f574e3baf Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 18 Mar 2021 15:15:43 -0700 Subject: [PATCH 425/662] NPE fix for McMMOPlayerExperienceEvent --- Changelog.txt | 1 + .../events/experience/McMMOPlayerExperienceEvent.java | 8 +++++++- src/main/java/com/gmail/nossr50/mcMMO.java | 9 +++++---- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 9c4980063..da135f2bc 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -6,6 +6,7 @@ Version 2.1.182 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 Version 2.1.181 mcMMO no longer pointlessly tries to check for missing UUIDs for FlatFile database 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 73829b7a0..44ad7d078 100644 --- a/src/main/java/com/gmail/nossr50/events/experience/McMMOPlayerExperienceEvent.java +++ b/src/main/java/com/gmail/nossr50/events/experience/McMMOPlayerExperienceEvent.java @@ -29,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; } diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index 25dcfea14..335a7afbc 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -74,10 +74,6 @@ import java.util.ArrayList; import java.util.List; public class mcMMO extends JavaPlugin { - public static final String ULTRA_PERMISSONS = "UltraPermissons"; - public static final String UP_WARNING_2 = "Stop using " + ULTRA_PERMISSONS + " with mcMMO immediately!"; - public static final String UP_WARNING_1 = "mcMMO has detected " + ULTRA_PERMISSONS + " on your server, users have reported a severe plugin conflict between these two plugins which severely degrades server performance"; - public static final String UP_WARNING_3 = "The author of UltraPermissions has passed away and its unlikely this issue will ever be solved"; /* Managers */ private static PlatformManager platformManager; private static ChunkManager placeStore; @@ -152,6 +148,11 @@ public class mcMMO extends JavaPlugin { public static FixedMetadataValue metadataValue; + public static final String ULTRA_PERMISSONS = "UltraPermissons"; + public static final String UP_WARNING_2 = "Stop using " + ULTRA_PERMISSONS + " with mcMMO immediately!"; + public static final String UP_WARNING_1 = "mcMMO has detected " + ULTRA_PERMISSONS + " on your server, users have reported a severe plugin conflict between these two plugins which severely degrades server performance"; + public static final String UP_WARNING_3 = "The author of UltraPermissions has passed away and its unlikely this issue will ever be solved"; + public mcMMO() { p = this; } From 71d1f42cf4c9ccb0b615bf9a5baa179d8b68a06f Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 18 Mar 2021 15:28:42 -0700 Subject: [PATCH 426/662] Tweak changelog --- Changelog.txt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index da135f2bc..0c6534d55 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -2,12 +2,15 @@ Version 2.1.182 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 + 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 + NOTES: + 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 From f52effb0fb383a486129e22f983cf8d042d954e7 Mon Sep 17 00:00:00 2001 From: Pablo <26825567+Pabsb@users.noreply.github.com> Date: Mon, 22 Mar 2021 15:13:51 -0500 Subject: [PATCH 427/662] Add '.all' to all existing perk xp multipliers (#4460) * Add '.all' to all existing perk xp multipliers Added '.all' usage for all existing perk xp mulipliers to enable use of mcmmo.perks.xp..all * Fixed a statement error --- .../com/gmail/nossr50/util/Permissions.java | 37 +++++++++++++++---- 1 file changed, 30 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/util/Permissions.java b/src/main/java/com/gmail/nossr50/util/Permissions.java index 21df34696..a64c476f3 100644 --- a/src/main/java/com/gmail/nossr50/util/Permissions.java +++ b/src/main/java/com/gmail/nossr50/util/Permissions.java @@ -118,16 +118,39 @@ 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 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)); + || permissible.hasPermission("mcmmo.perks.xp.customboost." + skill.toString().toLowerCase(Locale.ENGLISH)); } From 317dc814a4481dc7536ae57e854c6a87584e8ca9 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 23 Mar 2021 13:20:55 -0700 Subject: [PATCH 428/662] Add comment about power level cap issue --- .../java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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 fb68f24ea..6921ad78a 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java +++ b/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java @@ -775,7 +775,9 @@ public class McMMOPlayer implements Identified { * @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 ((primarySkillType.getMaxLevel() <= getSkillLevel(primarySkillType)) + || (Config.getInstance().getPowerLevelCap() <= getPowerLevel())) { return 0; } From e40ab38bbd22f46e47b7e81e9832b0cf9b02efa0 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 25 Mar 2021 13:42:20 -0700 Subject: [PATCH 429/662] Sweet Berry bushes now grant XP when harvested and no longer activate tools --- Changelog.txt | 2 + .../nossr50/listeners/PlayerListener.java | 5 +- .../skills/herbalism/HerbalismManager.java | 57 ++++++++++++++++++- .../gmail/nossr50/util/MaterialMapStore.java | 1 + 4 files changed, 63 insertions(+), 2 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 0c6534d55..14831e829 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,4 +1,6 @@ Version 2.1.182 + Players now receive XP from harvesting Sweet Berry bushes (double XP for harvesting fully grown berries) + 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) diff --git a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java index b32083055..269d65967 100644 --- a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java @@ -841,10 +841,13 @@ public class PlayerListener implements Listener { 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)) { + if (herbalismManager.processShroomThumb(blockState) + && EventUtils.simulateBlockBreak(block, player, false)) { blockState.update(true); } } + } else { + herbalismManager.processBerryBushHarvesting(blockState); } break; 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 0d3279b1c..ab2cdcba4 100644 --- a/src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java +++ b/src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java @@ -40,6 +40,7 @@ import org.bukkit.entity.Player; import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.PlayerInventory; +import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.Collection; @@ -62,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; @@ -69,7 +74,57 @@ 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); + } + + //Check for double drops + if(checkDoubleDrop(blockState)) { + + if(mmoPlayer.isDebugMode()) { + mmoPlayer.getPlayer().sendMessage("Double Drops succeeded for Berry Bush"); + } + + //Add metadata to mark this block for double or triple drops + markForBonusDrops(blockState); + } + + applyXpGain(xpReward, XPGainReason.PVE, XPGainSource.SELF); + } + } } public boolean canUseHylianLuck() { diff --git a/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java b/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java index 3c88edd47..04564574b 100644 --- a/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java +++ b/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java @@ -1265,6 +1265,7 @@ public class MaterialMapStore { toolBlackList.add("stonecutter"); toolBlackList.add("lodestone"); toolBlackList.add("respawn_anchor"); + toolBlackList.add("sweet_berry_bush"); } public boolean isIntendedToolPickaxe(Material material) { From eea922c31f30e7ee900d053b3521faacbe3a3ae6 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 25 Mar 2021 14:08:22 -0700 Subject: [PATCH 430/662] TODO: Look into double drops for berry bushes --- Changelog.txt | 1 + .../database/FlatFileDatabaseManager.java | 2 -- .../nossr50/listeners/EntityListener.java | 31 +++++++++++++++++++ src/main/java/com/gmail/nossr50/mcMMO.java | 7 +---- .../skills/herbalism/HerbalismManager.java | 20 ++++++------ src/main/resources/config.yml | 1 + 6 files changed, 44 insertions(+), 18 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 14831e829..cec01067c 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -9,6 +9,7 @@ Version 2.1.182 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: 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. diff --git a/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java index 46c36d07f..ca2c78681 100644 --- a/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java @@ -6,13 +6,11 @@ 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 org.bukkit.OfflinePlayer; import org.bukkit.entity.Player; diff --git a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java index f354bd404..000f60797 100644 --- a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java @@ -1,10 +1,13 @@ package com.gmail.nossr50.listeners; +import com.gmail.nossr50.api.ItemSpawnReason; 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.meta.BonusDropMeta; 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.interfaces.InteractType; import com.gmail.nossr50.events.fake.FakeEntityDamageByEntityEvent; @@ -31,6 +34,7 @@ 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; @@ -41,6 +45,7 @@ import org.bukkit.event.Cancellable; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; +import org.bukkit.event.block.BlockDropItemEvent; import org.bukkit.event.entity.*; import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import org.bukkit.inventory.ItemStack; @@ -52,6 +57,8 @@ import org.bukkit.potion.PotionEffectType; import org.bukkit.projectiles.ProjectileSource; import org.jetbrains.annotations.NotNull; +import java.util.HashSet; + public class EntityListener implements Listener { private final mcMMO pluginRef; private final @NotNull AbstractPersistentDataLayer persistentDataLayer; @@ -67,6 +74,30 @@ public class EntityListener implements Listener { persistentDataLayer = mcMMO.getCompatibilityManager().getPersistentDataLayer(); } +// @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) { if(event.getEntity() instanceof LivingEntity) { diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index 335a7afbc..cc3143e5a 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -272,12 +272,6 @@ public class mcMMO extends JavaPlugin { metrics.addCustomChart(new SimplePie("leveling_system", () -> "Standard")); } - //Can't confirm this bug myself as the plugin is premium -// //TODO: Remove this when ChatControlRed fixes itself -// if(pluginManager.getPlugin("ChatControlRed") != null) { -// getLogger().severe("mcMMO has detected ChatControlRed on your server, users have reported a severe plugin conflict between these two plugins which degrades server performance and wastes many server resources."); -// getLogger().severe("It is HIGHLY RECOMMENDED that you do --NOT-- use ChatControlRed until this issue is resolved!"); -// } if(pluginManager.getPlugin(ULTRA_PERMISSONS) != null) { Bukkit.getScheduler().runTaskTimer(this, () -> { getLogger().severe(UP_WARNING_1); @@ -290,6 +284,7 @@ public class mcMMO extends JavaPlugin { }, 0L, 1200L); } } + catch (Throwable t) { getLogger().severe("There was an error while enabling mcMMO!"); 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 ab2cdcba4..f4bf66b1d 100644 --- a/src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java +++ b/src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java @@ -111,16 +111,16 @@ public class HerbalismManager extends SkillManager { mmoPlayer.getPlayer().sendMessage("Bush XP: " + xpReward); } - //Check for double drops - if(checkDoubleDrop(blockState)) { - - if(mmoPlayer.isDebugMode()) { - mmoPlayer.getPlayer().sendMessage("Double Drops succeeded for Berry Bush"); - } - - //Add metadata to mark this block for double or triple drops - markForBonusDrops(blockState); - } +// //Check for double drops +// if(checkDoubleDrop(blockState)) { +// +// if(mmoPlayer.isDebugMode()) { +// mmoPlayer.getPlayer().sendMessage("Double Drops succeeded for Berry Bush"); +// } +// +// //Add metadata to mark this block for double or triple drops +// markForBonusDrops(blockState); +// } applyXpGain(xpReward, XPGainReason.PVE, XPGainSource.SELF); } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index a853f697f..bc640f363 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -464,6 +464,7 @@ Green_Thumb_Replanting_Crops: ### Bonus_Drops: Herbalism: + Sweet_Berry_Bush: true Weeping_Vines: true Twisting_Vines: true Shroomlight: true From fc3e580550167d11521d97573c08d3f9201157c0 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 25 Mar 2021 14:13:16 -0700 Subject: [PATCH 431/662] Fix NPE with Scoreboards when updating --- Changelog.txt | 1 + .../util/scoreboards/ScoreboardWrapper.java | 14 ++++++++------ 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index cec01067c..dc5998fdd 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,4 +1,5 @@ Version 2.1.182 + Fixed a NPE with Scoreboards enabled when trying to update scoreboards Players now receive XP from harvesting Sweet Berry bushes (double XP for harvesting fully grown berries) 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 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 2ba8715f5..e35bb958b 100644 --- a/src/main/java/com/gmail/nossr50/util/scoreboards/ScoreboardWrapper.java +++ b/src/main/java/com/gmail/nossr50/util/scoreboards/ScoreboardWrapper.java @@ -428,14 +428,16 @@ public class ScoreboardWrapper { * Load new values into the sidebar. */ private void updateSidebar() { - try { - updateTask.cancel(); - } - catch (Exception e) { - e.printStackTrace(); + if(updateTask != null) { + try { + updateTask.cancel(); + } catch (Exception e) { + e.printStackTrace(); + } + + updateTask = null; } - updateTask = null; if (sidebarType == SidebarType.NONE) { return; From 7c8e14fd745057c51b5a59a169e62b01a0953c0d Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 25 Mar 2021 14:49:36 -0700 Subject: [PATCH 432/662] Featherboard compatibility --- Changelog.txt | 2 ++ .../nossr50/datatypes/player/McMMOPlayer.java | 10 ++++++ .../util/scoreboards/ScoreboardManager.java | 25 +++++++++++-- .../util/scoreboards/ScoreboardWrapper.java | 35 ++++++++++++++++--- .../resources/locale/locale_en_US.properties | 3 +- 5 files changed, 68 insertions(+), 7 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index dc5998fdd..a1418d5bc 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,5 +1,7 @@ Version 2.1.182 Fixed a NPE with Scoreboards enabled when trying to update scoreboards + Fixed an error when using mcMMO with Featherboard that broke mcMMO skill boards when using certain commands + Added 'Scoreboard.Recovery' locale key Players now receive XP from harvesting Sweet Berry bushes (double XP for harvesting fully grown berries) 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 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 6921ad78a..cbcbbdba5 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java +++ b/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java @@ -118,6 +118,8 @@ public class McMMOPlayer implements Identified { private final FixedMetadataValue playerMetadata; private final String playerName; + private PrimarySkillType lastSkillShownScoreboard = PrimarySkillType.values()[0]; + public McMMOPlayer(Player player, PlayerProfile profile) { this.playerName = player.getName(); UUID uuid = player.getUniqueId(); @@ -186,6 +188,14 @@ public class McMMOPlayer implements Identified { 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 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 e6358ee2d..b6bb064b5 100644 --- a/src/main/java/com/gmail/nossr50/util/scoreboards/ScoreboardManager.java +++ b/src/main/java/com/gmail/nossr50/util/scoreboards/ScoreboardManager.java @@ -285,6 +285,9 @@ public class ScoreboardManager { // **** Setup methods **** // public static void enablePlayerSkillScoreboard(Player player, PrimarySkillType skill) { + McMMOPlayer mmoPlayer = UserManager.getPlayer(player); + mmoPlayer.setLastSkillShownScoreboard(skill); + ScoreboardWrapper wrapper = getWrapper(player); if(wrapper == null) { @@ -300,6 +303,25 @@ public class ScoreboardManager { } } + 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, Config.getInstance().getSkillScoreboardTime()); + } + } + public static void enablePlayerSkillLevelUpScoreboard(Player player, PrimarySkillType skill) { ScoreboardWrapper wrapper = getWrapper(player); @@ -528,8 +550,7 @@ public class ScoreboardManager { return mcMMO.p.getServer().getScoreboardManager(); } - - private static void changeScoreboard(ScoreboardWrapper wrapper, int displayTime) { + public static void changeScoreboard(ScoreboardWrapper wrapper, int displayTime) { if (displayTime == -1) { wrapper.showBoardWithNoRevert(); } 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 e35bb958b..e2669d4c0 100644 --- a/src/main/java/com/gmail/nossr50/util/scoreboards/ScoreboardWrapper.java +++ b/src/main/java/com/gmail/nossr50/util/scoreboards/ScoreboardWrapper.java @@ -14,9 +14,11 @@ 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 org.apache.commons.lang.Validate; +import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitRunnable; @@ -43,7 +45,7 @@ public class ScoreboardWrapper { // Internal usage variables (should exist) private SidebarType sidebarType; private Objective sidebarObjective; - private final Objective powerObjective; + private Objective powerObjective; // Parameter variables (May be null / invalid) private Scoreboard oldBoard = null; @@ -51,14 +53,27 @@ public class ScoreboardWrapper { public PrimarySkillType targetSkill = null; private PlayerProfile targetProfile = null; public int leaderboardPage = -1; + private boolean registered = false; public ScoreboardWrapper(Player player, Scoreboard scoreboard) { this.player = player; this.playerName = player.getName(); this.scoreboard = scoreboard; + initBoard(); + } + + private void initBoard() { sidebarType = SidebarType.NONE; - sidebarObjective = this.scoreboard.registerNewObjective(ScoreboardManager.SIDEBAR_OBJECTIVE, "dummy", SIDE_OBJECTIVE); - powerObjective = this.scoreboard.registerNewObjective(ScoreboardManager.POWER_OBJECTIVE, "dummy", POWER_OBJECTIVE); + 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 (Config.getInstance().getPowerLevelTagsEnabled()) { powerObjective.setDisplayName(ScoreboardManager.TAG_POWER_LEVEL); @@ -399,7 +414,19 @@ 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 diff --git a/src/main/resources/locale/locale_en_US.properties b/src/main/resources/locale/locale_en_US.properties index 5a41eb424..efb979f8d 100644 --- a/src/main/resources/locale/locale_en_US.properties +++ b/src/main/resources/locale/locale_en_US.properties @@ -1137,4 +1137,5 @@ Chat.Channel.On=&6(&amcMMO-Chat&6) &eYour chat messages will now be automaticall 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! \ No newline at end of file +Broadcasts.PowerLevelUpMilestone=&6(&amcMMO&6) {0}&7 has reached a Power level of &a{1}&7! +Scoreboard.Recovery=Attempting to recover mcMMO scoreboard... \ No newline at end of file From b189614d8de1b5ab76ae4a636c6cb02eb9829fc3 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 25 Mar 2021 14:51:28 -0700 Subject: [PATCH 433/662] 2.1.182 --- Changelog.txt | 7 ++++--- pom.xml | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index a1418d5bc..c1e06d24d 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,8 +1,8 @@ Version 2.1.182 - Fixed a NPE with Scoreboards enabled when trying to update scoreboards - Fixed an error when using mcMMO with Featherboard that broke mcMMO skill boards when using certain commands - Added 'Scoreboard.Recovery' locale key 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 @@ -15,6 +15,7 @@ Version 2.1.182 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 diff --git a/pom.xml b/pom.xml index 1a9cd6cfe..59f9f9864 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.182-SNAPSHOT + 2.1.182 mcMMO https://github.com/mcMMO-Dev/mcMMO From 80e9111f78e84fc161d6876c5830478f5cf7dc8e Mon Sep 17 00:00:00 2001 From: Daniil Z Date: Tue, 30 Mar 2021 01:02:48 +0300 Subject: [PATCH 434/662] Update Russian localization (#4465) --- src/main/resources/locale/locale_ru.properties | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/resources/locale/locale_ru.properties b/src/main/resources/locale/locale_ru.properties index 3878e1ab1..54f768564 100644 --- a/src/main/resources/locale/locale_ru.properties +++ b/src/main/resources/locale/locale_ru.properties @@ -1138,3 +1138,4 @@ Chat.Channel.Off=&6(&amcMMO-\u0447\u0430\u0442&6) &e\u0412\u0430\u0448\u0438 \u0 Chat.Spy.Party=&6[&e\u0428\u041F\u0418\u041A&6-&a{2}&6] &r{0} &b\u2192 &r{1} Broadcasts.LevelUpMilestone=&6(&amcMMO&6) {0}&7 \u0434\u043E\u0441\u0442\u0438\u0433 \u0443\u0440\u043E\u0432\u043D\u044F &a{1}&7 \u0432 &e{2}&7\\! Broadcasts.PowerLevelUpMilestone=&6(&amcMMO&6) {0}&7 \u0434\u043E\u0441\u0442\u0438\u0433 \u0443\u0440\u043E\u0432\u043D\u044F \u0441\u0438\u043B\u044B &a{1}&7\\! +Scoreboard.Recovery=\u041F\u043E\u043F\u044B\u0442\u043A\u0430 \u0432\u043E\u0441\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C \u0440\u0430\u0431\u043E\u0442\u0443 \u0442\u0430\u0431\u043B\u0438\u0446\u044B mcMMO... From df56d93aaa964cf5d4e954f535677fb1984747e9 Mon Sep 17 00:00:00 2001 From: Daniel Jarski <30324210+QuantumToasted@users.noreply.github.com> Date: Mon, 29 Mar 2021 17:08:40 -0500 Subject: [PATCH 435/662] Added Donkeys and Mules to the list of animals that display stats (#4282) ...in Beast Lore. I improperly assumed that donkeys and mules have fixed jump and movement speeds, but ones that are *bred* have variable stats just like horses. --- .../java/com/gmail/nossr50/skills/taming/TamingManager.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) 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 eb42b9899..3b7f6315d 100644 --- a/src/main/java/com/gmail/nossr50/skills/taming/TamingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/taming/TamingManager.java @@ -249,8 +249,9 @@ public class TamingManager extends SkillManager { message = message.concat(LocaleLoader.getString("Combat.BeastLoreHealth", target.getHealth(), target.getMaxHealth())); - if (beast instanceof Horse) { - Horse horse = (Horse) beast; + // Bred mules & donkeys can actually have horse-like stats, but llamas cannot. + if (beast instanceof AbstractHorse && !(beast instanceof Llama)) { + AbstractHorse horse = (AbstractHorse) 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; From c27b8dbd66cd6d1b0f4f0b988d95f1c72c739522 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 29 Mar 2021 15:11:08 -0700 Subject: [PATCH 436/662] Update changelog --- Changelog.txt | 4 ++++ pom.xml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index c1e06d24d..58e7b3e83 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,7 @@ +Version 2.1.183 + Updated Russian locale (thanks ImDaniX) + Added Donkeys to beat lore (thanks QuantumToasted) + 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 diff --git a/pom.xml b/pom.xml index 59f9f9864..d5b073f02 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.182 + 2.1.183-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO From fbd2eeb93d6104c374358a6902fd3922b0a5b070 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 29 Mar 2021 15:14:54 -0700 Subject: [PATCH 437/662] Avoid NPE on beast lore jump strength checks --- .../nossr50/skills/taming/TamingManager.java | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) 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 3b7f6315d..859892c20 100644 --- a/src/main/java/com/gmail/nossr50/skills/taming/TamingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/taming/TamingManager.java @@ -29,6 +29,7 @@ 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; @@ -251,12 +252,16 @@ public class TamingManager extends SkillManager { // Bred mules & donkeys can actually have horse-like stats, but llamas cannot. if (beast instanceof AbstractHorse && !(beast instanceof Llama)) { - AbstractHorse horse = (AbstractHorse) 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)); + 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); From d98bcea845f05197016b656c85033552c5f02f7f Mon Sep 17 00:00:00 2001 From: mldriscoll <53544431+mldriscoll@users.noreply.github.com> Date: Mon, 29 Mar 2021 23:22:24 +0100 Subject: [PATCH 438/662] Correcting references to the Potion of Leaping being made with Red Mushrooms (#4290) Co-authored-by: MLD Co-authored-by: Robert Alan Chapton --- src/main/resources/locale/locale_en_US.properties | 15 ++++++++------- src/main/resources/potions.yml | 2 +- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/main/resources/locale/locale_en_US.properties b/src/main/resources/locale/locale_en_US.properties index efb979f8d..3038d17b1 100644 --- a/src/main/resources/locale/locale_en_US.properties +++ b/src/main/resources/locale/locale_en_US.properties @@ -875,13 +875,14 @@ Guides.Acrobatics.Section.0=&3About Acrobatics:\n&eAcrobatics is the art of movi 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=&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) +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]]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=&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. 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 From f69c678f6c96aebd105b3119b2dd740e74001357 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 29 Mar 2021 15:23:48 -0700 Subject: [PATCH 439/662] Update changelog --- Changelog.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/Changelog.txt b/Changelog.txt index 58e7b3e83..aee814a51 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,6 +1,7 @@ Version 2.1.183 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) Version 2.1.182 Players now receive XP from harvesting Sweet Berry bushes (double XP for harvesting fully grown berries) From ae538d8c7215bae9cd705549ac2de2fce83fb599 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 29 Mar 2021 16:09:47 -0700 Subject: [PATCH 440/662] Sweet berry bush exploit fix --- Changelog.txt | 1 + .../nossr50/listeners/PlayerListener.java | 42 ++++++++++--------- 2 files changed, 23 insertions(+), 20 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index aee814a51..dbbeff792 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -2,6 +2,7 @@ Version 2.1.183 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 Version 2.1.182 Players now receive XP from harvesting Sweet Berry bushes (double XP for harvesting fully grown berries) diff --git a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java index 269d65967..f4938c319 100644 --- a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java @@ -824,30 +824,32 @@ public class PlayerListener implements Listener { } } - FakePlayerAnimationEvent fakeSwing = new FakePlayerAnimationEvent(event.getPlayer()); //PlayerAnimationEvent compat - 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); + FakePlayerAnimationEvent fakeSwing = new FakePlayerAnimationEvent(event.getPlayer()); //PlayerAnimationEvent compat + if(!event.isCancelled() || event.useInteractedBlock() != Event.Result.DENY) { + 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)) { - 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); + /* 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); } - } else { - herbalismManager.processBerryBushHarvesting(blockState); } break; From fdefea323577308354b059d076a5263195317fcf Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 30 Mar 2021 15:37:01 -0700 Subject: [PATCH 441/662] treasures.yml now has specific entries for Standard/Retro --- Changelog.txt | 5 + .../config/skills/salvage/SalvageConfig.java | 2 +- .../treasure/FishingTreasureConfig.java | 2 +- .../config/treasure/TreasureConfig.java | 42 +++++- .../nossr50/datatypes/treasure/Treasure.java | 5 - src/main/java/com/gmail/nossr50/mcMMO.java | 6 +- src/main/resources/treasures.yml | 121 +++++++++++++----- 7 files changed, 138 insertions(+), 45 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index dbbeff792..f48887c4b 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,9 +1,14 @@ Version 2.1.183 + 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 + 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 + 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 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 f01f41940..66e107d09 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 @@ -43,7 +43,7 @@ public class SalvageConfig extends ConfigLoader { 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); + config.set("Salvageables." + namespacedkey.toUpperCase() + ".MaximumQuantity", 4); //TODO: Doesn't make sense to default to 4 for everything } try { diff --git a/src/main/java/com/gmail/nossr50/config/treasure/FishingTreasureConfig.java b/src/main/java/com/gmail/nossr50/config/treasure/FishingTreasureConfig.java index 41fa349ce..bfd814889 100755 --- a/src/main/java/com/gmail/nossr50/config/treasure/FishingTreasureConfig.java +++ b/src/main/java/com/gmail/nossr50/config/treasure/FishingTreasureConfig.java @@ -164,7 +164,7 @@ public class FishingTreasureConfig extends ConfigLoader { } if (dropLevel < 0) { - reason.add(treasureName + " has an invalid Drop_Level: " + dropLevel); + reason.add("Fishing Config: " + treasureName + " has an invalid Drop_Level: " + dropLevel); } /* 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 370f2baa3..6e02731c9 100755 --- a/src/main/java/com/gmail/nossr50/config/treasure/TreasureConfig.java +++ b/src/main/java/com/gmail/nossr50/config/treasure/TreasureConfig.java @@ -3,6 +3,7 @@ package com.gmail.nossr50.config.treasure; import com.gmail.nossr50.config.ConfigLoader; 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; @@ -14,6 +15,7 @@ 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; @@ -21,6 +23,9 @@ import java.util.List; public class TreasureConfig extends ConfigLoader { 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 LEGACY_DROP_LEVEL = ".Drop_Level"; private static TreasureConfig instance; public HashMap> excavationMap = new HashMap<>(); @@ -60,6 +65,7 @@ public class TreasureConfig extends ConfigLoader { } private void loadTreasures(String type) { + boolean updatedFile = false; boolean isExcavation = type.equals("Excavation"); boolean isHylian = type.equals("Hylian_Luck"); @@ -103,7 +109,29 @@ 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"); + int legacyDropLevel = config.getInt(type + "." + treasureName + LEGACY_DROP_LEVEL, -1); + int dropLevel = -1; + + if(legacyDropLevel >= 0) { + //Config needs to be updated to be more specific + mcMMO.p.getLogger().info("(" + treasureName + ") Updating Drop_Level in treasures.yml for treasure to match new expected format"); + config.set(type + "." + treasureName + LEGACY_DROP_LEVEL, null); + config.set(type + "." + treasureName + LEVEL_REQUIREMENT_RETRO_MODE, legacyDropLevel * 10); + config.set(type + "." + treasureName + LEVEL_REQUIREMENT_STANDARD_MODE, legacyDropLevel); + updatedFile = true; + } + + if(mcMMO.isRetroModeEnabled()) { + dropLevel = config.getInt(type + "." + treasureName + LEVEL_REQUIREMENT_RETRO_MODE, 0); + } else { + dropLevel = config.getInt(type + "." + treasureName + LEVEL_REQUIREMENT_STANDARD_MODE, 0); + } + + if(dropLevel < 0) { + mcMMO.p.getLogger().info("Treasure drop level wasn't valid, using a default value."); + //Set it to the "max" if we don't have a drop level + dropLevel = 0; + } if (xp < 0) { reason.add(treasureName + " has an invalid XP value: " + xp); @@ -113,9 +141,6 @@ public class TreasureConfig extends ConfigLoader { reason.add(treasureName + " has an invalid Drop_Chance: " + dropChance); } - if (dropLevel < 0) { - reason.add(treasureName + " has an invalid Drop_Level: " + dropLevel); - } /* * Itemstack @@ -219,6 +244,15 @@ public class TreasureConfig extends ConfigLoader { } } } + + //Apply our fix + if(updatedFile) { + try { + config.save(getFile()); + } catch (IOException e) { + e.printStackTrace(); + } + } } private void AddHylianTreasure(String dropper, HylianTreasure treasure) { 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/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index cc3143e5a..66d698d1c 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -163,6 +163,9 @@ public class mcMMO extends JavaPlugin { @Override public void onEnable() { try { + //Store this value so other plugins can check it + isRetroModeEnabled = Config.getInstance().getIsRetroMode(); + //Platform Manager platformManager = new PlatformManager(); @@ -190,9 +193,6 @@ public class mcMMO extends JavaPlugin { return; } - //Store this value so other plugins can check it - isRetroModeEnabled = Config.getInstance().getIsRetroMode(); - if (getServer().getName().equals("Cauldron") || getServer().getName().equals("MCPC+")) { checkModConfigs(); } diff --git a/src/main/resources/treasures.yml b/src/main/resources/treasures.yml index 24de2fb86..f791b7416 100755 --- a/src/main/resources/treasures.yml +++ b/src/main/resources/treasures.yml @@ -1,133 +1,174 @@ # # 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 + Drop_Level: + Standard: 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 + Drop_Level: + Standard: 10 + Retro_Mode: 1000 Drops_From: [Gravel] BONE: Amount: 1 XP: 30 Drop_Chance: 10.0 - Drop_Level: 20 + Drop_Level: + Standard: 20 + Retro_Mode: 200 Drops_From: [Gravel] APPLE: Amount: 1 XP: 100 Drop_Chance: 0.1 - Drop_Level: 25 + Drop_Level: + Standard: 25 + Retro_Mode: 250 Drops_From: [Grass_Block, Mycelium] SLIME_BALL: Amount: 1 XP: 100 Drop_Chance: 5.0 - Drop_Level: 15 + Drop_Level: + Standard: 15 + Retro_Mode: 150 Drops_From: [Clay] BUCKET: Amount: 1 XP: 100 Drop_Chance: 0.1 - Drop_Level: 50 + Drop_Level: + Standard: 50 + Retro_Mode: 500 Drops_From: [Clay] NETHERRACK: Amount: 1 XP: 30 Drop_Chance: 0.5 - Drop_Level: 85 + Drop_Level: + Standard: 85 + Retro_Mode: 850 Drops_From: [Gravel] RED_MUSHROOM: Amount: 1 XP: 80 Drop_Chance: 0.5 - Drop_Level: 50 + Drop_Level: + Standard: 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 + Drop_Level: + Standard: 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 + Drop_Level: + Standard: 25 + Retro_Mode: 250 Drops_From: [Grass_Block] SOUL_SAND: Amount: 1 XP: 80 Drop_Chance: 0.5 - Drop_Level: 65 + Drop_Level: + Standard: 65 + Retro_Mode: 650 Drops_From: [Sand, Red_Sand] CLOCK: Amount: 1 XP: 100 Drop_Chance: 0.1 - Drop_Level: 50 + Drop_Level: + Standard: 50 + Retro_Mode: 500 Drops_From: [Clay] COBWEB: Amount: 1 XP: 150 Drop_Chance: 5.0 - Drop_Level: 75 + Drop_Level: + Standard: 75 + Retro_Mode: 750 Drops_From: [Clay] STRING: Amount: 1 XP: 200 Drop_Chance: 5.0 - Drop_Level: 25 + Drop_Level: + Standard: 25 + Retro_Mode: 250 Drops_From: [Clay] GLOWSTONE_DUST: Amount: 1 XP: 80 Drop_Chance: 5.0 - Drop_Level: 5 + Drop_Level: + Standard: 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 + Drop_Level: + Standard: 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 + Drop_Level: + Standard: 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 + Drop_Level: + Standard: 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 + Drop_Level: + Standard: 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 + Drop_Level: + Standard: 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 + Drop_Level: + Standard: 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 @@ -138,53 +179,71 @@ Hylian_Luck: Amount: 1 XP: 0 Drop_Chance: 100.0 - Drop_Level: 0 + Drop_Level: + Standard: 0 + Retro_Mode: 0 Drops_From: [Bushes] PUMPKIN_SEEDS: Amount: 1 XP: 0 Drop_Chance: 100.0 - Drop_Level: 0 + Drop_Level: + Standard: 0 + Retro_Mode: 0 Drops_From: [Bushes] COCOA_BEANS: Amount: 1 XP: 0 Drop_Chance: 100.0 - Drop_Level: 0 + Drop_Level: + Standard: 0 + Retro_Mode: 0 Drops_From: [Bushes] CARROT: Amount: 1 XP: 0 Drop_Chance: 100.0 - Drop_Level: 0 + Drop_Level: + Standard: 0 + Retro_Mode: 0 Drops_From: [Flowers] POTATO: Amount: 1 XP: 0 Drop_Chance: 100.0 - Drop_Level: 0 + Drop_Level: + Standard: 0 + Retro_Mode: 0 Drops_From: [Flowers] APPLE: Amount: 1 XP: 0 Drop_Chance: 100.0 - Drop_Level: 0 + Drop_Level: + Standard: 0 + Retro_Mode: 0 Drops_From: [Flowers] EMERALD: Amount: 1 XP: 0 Drop_Chance: 100.0 - Drop_Level: 0 + Drop_Level: + Standard: 0 + Retro_Mode: 0 Drops_From: [Pots] DIAMOND: Amount: 1 XP: 0 Drop_Chance: 100.0 - Drop_Level: 0 + Drop_Level: + Standard: 0 + Retro_Mode: 0 Drops_From: [Pots] GOLD_NUGGET: Amount: 1 XP: 0 Drop_Chance: 100.0 - Drop_Level: 0 + Drop_Level: + Standard: 0 + Retro_Mode: 0 Drops_From: [Pots] \ No newline at end of file From 6b309f628ac4bdc4cf360abc5a09e6191981b0dc Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 30 Mar 2021 15:43:05 -0700 Subject: [PATCH 442/662] Roll will not have an mmoinfo read out for now --- Changelog.txt | 2 + .../skills/subskills/acrobatics/Roll.java | 51 ++++++++++--------- .../nossr50/listeners/EntityListener.java | 7 --- 3 files changed, 29 insertions(+), 31 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index f48887c4b..b57dc6259 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -4,10 +4,12 @@ Version 2.1.183 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) 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 4ea8ad156..2f57a321b 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 @@ -370,31 +370,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 = AdvancedConfig.getInstance().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 = 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,halfMaxSkillValue); + 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 = AdvancedConfig.getInstance().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 = 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,halfMaxSkillValue); } /** diff --git a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java index 000f60797..414bbde52 100644 --- a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java @@ -1,13 +1,10 @@ package com.gmail.nossr50.listeners; -import com.gmail.nossr50.api.ItemSpawnReason; 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.meta.BonusDropMeta; 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.interfaces.InteractType; import com.gmail.nossr50.events.fake.FakeEntityDamageByEntityEvent; @@ -34,7 +31,6 @@ 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; @@ -45,7 +41,6 @@ import org.bukkit.event.Cancellable; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; -import org.bukkit.event.block.BlockDropItemEvent; import org.bukkit.event.entity.*; import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import org.bukkit.inventory.ItemStack; @@ -57,8 +52,6 @@ import org.bukkit.potion.PotionEffectType; import org.bukkit.projectiles.ProjectileSource; import org.jetbrains.annotations.NotNull; -import java.util.HashSet; - public class EntityListener implements Listener { private final mcMMO pluginRef; private final @NotNull AbstractPersistentDataLayer persistentDataLayer; From 0577701fd72795477dca4ef0dd262904f7cb89ca Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 30 Mar 2021 15:54:25 -0700 Subject: [PATCH 443/662] Tweak mmoinfo --- .../commands/skills/MmoInfoCommand.java | 20 ++++--------------- 1 file changed, 4 insertions(+), 16 deletions(-) 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 e562e9429..0169c3918 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/MmoInfoCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/MmoInfoCommand.java @@ -71,22 +71,10 @@ public class MmoInfoCommand implements TabExecutor { 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()) { From aa734c8b1a5d6f6267cfa0c105946e9a81d2dc12 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 30 Mar 2021 16:04:33 -0700 Subject: [PATCH 444/662] Acrobatics XP from falling no longer requires the Roll subskill --- Changelog.txt | 1 + .../nossr50/datatypes/skills/subskills/acrobatics/Roll.java | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/Changelog.txt b/Changelog.txt index b57dc6259..4e2babd43 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,4 +1,5 @@ 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) 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 2f57a321b..f13f5b922 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 @@ -6,6 +6,7 @@ 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; @@ -83,6 +84,9 @@ public class Roll extends AcrobaticsSubSkill { entityDamageEvent.setCancelled(true); return true; } + } else if(Permissions.skillEnabled(player, PrimarySkillType.ACROBATICS)) { + //Give XP Anyways + SkillUtils.applyXpGain(mcMMOPlayer, getPrimarySkill(), calculateRollXP(player, ((EntityDamageEvent) event).getFinalDamage(), false), XPGainReason.PVE); } } From 0d955c3a945b18c063a0a90d59a4f5b7ea0a36cb Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 30 Mar 2021 16:11:26 -0700 Subject: [PATCH 445/662] 2.1.183 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index d5b073f02..488916a86 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.183-SNAPSHOT + 2.1.183 mcMMO https://github.com/mcMMO-Dev/mcMMO From a3cc5200056ce23d2b4c0c542f44b447231e2917 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Wed, 31 Mar 2021 14:59:29 -0700 Subject: [PATCH 446/662] Correct key for drop level in default file --- pom.xml | 2 +- .../config/treasure/TreasureConfig.java | 1 - src/main/resources/treasures.yml | 60 +++++++++---------- 3 files changed, 31 insertions(+), 32 deletions(-) diff --git a/pom.xml b/pom.xml index 488916a86..b7a395d84 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.183 + 2.1.184-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO 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 6e02731c9..a4f13e402 100755 --- a/src/main/java/com/gmail/nossr50/config/treasure/TreasureConfig.java +++ b/src/main/java/com/gmail/nossr50/config/treasure/TreasureConfig.java @@ -141,7 +141,6 @@ public class TreasureConfig extends ConfigLoader { reason.add(treasureName + " has an invalid Drop_Chance: " + dropChance); } - /* * Itemstack */ diff --git a/src/main/resources/treasures.yml b/src/main/resources/treasures.yml index f791b7416..22203b508 100755 --- a/src/main/resources/treasures.yml +++ b/src/main/resources/treasures.yml @@ -7,7 +7,7 @@ Excavation: XP: 3000 Drop_Chance: 0.05 Drop_Level: - Standard: 75 + 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: @@ -15,7 +15,7 @@ Excavation: XP: 30 Drop_Chance: 10.0 Drop_Level: - Standard: 10 + Standard_Mode: 10 Retro_Mode: 1000 Drops_From: [Gravel] BONE: @@ -23,7 +23,7 @@ Excavation: XP: 30 Drop_Chance: 10.0 Drop_Level: - Standard: 20 + Standard_Mode: 20 Retro_Mode: 200 Drops_From: [Gravel] APPLE: @@ -31,7 +31,7 @@ Excavation: XP: 100 Drop_Chance: 0.1 Drop_Level: - Standard: 25 + Standard_Mode: 25 Retro_Mode: 250 Drops_From: [Grass_Block, Mycelium] SLIME_BALL: @@ -39,7 +39,7 @@ Excavation: XP: 100 Drop_Chance: 5.0 Drop_Level: - Standard: 15 + Standard_Mode: 15 Retro_Mode: 150 Drops_From: [Clay] BUCKET: @@ -47,7 +47,7 @@ Excavation: XP: 100 Drop_Chance: 0.1 Drop_Level: - Standard: 50 + Standard_Mode: 50 Retro_Mode: 500 Drops_From: [Clay] NETHERRACK: @@ -55,7 +55,7 @@ Excavation: XP: 30 Drop_Chance: 0.5 Drop_Level: - Standard: 85 + Standard_Mode: 85 Retro_Mode: 850 Drops_From: [Gravel] RED_MUSHROOM: @@ -63,7 +63,7 @@ Excavation: XP: 80 Drop_Chance: 0.5 Drop_Level: - Standard: 50 + Standard_Mode: 50 Retro_Mode: 500 Drops_From: [Dirt, Coarse_Dirt, Podzol, Grass_Block, Mycelium] BROWN_MUSHROOM: @@ -71,7 +71,7 @@ Excavation: XP: 80 Drop_Chance: 0.5 Drop_Level: - Standard: 50 + Standard_Mode: 50 Retro_Mode: 500 Drops_From: [Dirt, Coarse_Dirt, Podzol, Grass_Block, Mycelium] EGG: @@ -79,7 +79,7 @@ Excavation: XP: 100 Drop_Chance: 1.0 Drop_Level: - Standard: 25 + Standard_Mode: 25 Retro_Mode: 250 Drops_From: [Grass_Block] SOUL_SAND: @@ -87,7 +87,7 @@ Excavation: XP: 80 Drop_Chance: 0.5 Drop_Level: - Standard: 65 + Standard_Mode: 65 Retro_Mode: 650 Drops_From: [Sand, Red_Sand] CLOCK: @@ -95,7 +95,7 @@ Excavation: XP: 100 Drop_Chance: 0.1 Drop_Level: - Standard: 50 + Standard_Mode: 50 Retro_Mode: 500 Drops_From: [Clay] COBWEB: @@ -103,7 +103,7 @@ Excavation: XP: 150 Drop_Chance: 5.0 Drop_Level: - Standard: 75 + Standard_Mode: 75 Retro_Mode: 750 Drops_From: [Clay] STRING: @@ -111,7 +111,7 @@ Excavation: XP: 200 Drop_Chance: 5.0 Drop_Level: - Standard: 25 + Standard_Mode: 25 Retro_Mode: 250 Drops_From: [Clay] GLOWSTONE_DUST: @@ -119,7 +119,7 @@ Excavation: XP: 80 Drop_Chance: 5.0 Drop_Level: - Standard: 5 + Standard_Mode: 5 Retro_Mode: 50 Drops_From: [Dirt, Coarse_Dirt, Podzol, Grass_Block, Sand, Red_Sand, Mycelium] MUSIC_DISC_13: @@ -127,7 +127,7 @@ Excavation: XP: 3000 Drop_Chance: 0.05 Drop_Level: - Standard: 25 + 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: @@ -135,7 +135,7 @@ Excavation: XP: 3000 Drop_Chance: 0.05 Drop_Level: - Standard: 25 + 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: @@ -143,7 +143,7 @@ Excavation: XP: 1000 Drop_Chance: 0.13 Drop_Level: - Standard: 35 + 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: @@ -151,7 +151,7 @@ Excavation: XP: 100 Drop_Chance: 1.33 Drop_Level: - Standard: 35 + Standard_Mode: 35 Retro_Mode: 350 Drops_From: [Dirt, Coarse_Dirt, Podzol, Grass_Block, Mycelium] QUARTZ: @@ -159,7 +159,7 @@ Excavation: XP: 100 Drop_Chance: 0.5 Drop_Level: - Standard: 85 + 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: @@ -167,7 +167,7 @@ Excavation: XP: 3000 Drop_Chance: 0.05 Drop_Level: - Standard: 25 + Standard_Mode: 25 Retro_Mode: 250 Drops_From: [Dirt, Coarse_Dirt, Podzol, Grass_Block, Sand, Red_Sand, Gravel, Clay, Mycelium, Soul_Sand, Soul_Soil] # @@ -180,7 +180,7 @@ Hylian_Luck: XP: 0 Drop_Chance: 100.0 Drop_Level: - Standard: 0 + Standard_Mode: 0 Retro_Mode: 0 Drops_From: [Bushes] PUMPKIN_SEEDS: @@ -188,7 +188,7 @@ Hylian_Luck: XP: 0 Drop_Chance: 100.0 Drop_Level: - Standard: 0 + Standard_Mode: 0 Retro_Mode: 0 Drops_From: [Bushes] COCOA_BEANS: @@ -196,7 +196,7 @@ Hylian_Luck: XP: 0 Drop_Chance: 100.0 Drop_Level: - Standard: 0 + Standard_Mode: 0 Retro_Mode: 0 Drops_From: [Bushes] CARROT: @@ -204,7 +204,7 @@ Hylian_Luck: XP: 0 Drop_Chance: 100.0 Drop_Level: - Standard: 0 + Standard_Mode: 0 Retro_Mode: 0 Drops_From: [Flowers] POTATO: @@ -212,7 +212,7 @@ Hylian_Luck: XP: 0 Drop_Chance: 100.0 Drop_Level: - Standard: 0 + Standard_Mode: 0 Retro_Mode: 0 Drops_From: [Flowers] APPLE: @@ -220,7 +220,7 @@ Hylian_Luck: XP: 0 Drop_Chance: 100.0 Drop_Level: - Standard: 0 + Standard_Mode: 0 Retro_Mode: 0 Drops_From: [Flowers] EMERALD: @@ -228,7 +228,7 @@ Hylian_Luck: XP: 0 Drop_Chance: 100.0 Drop_Level: - Standard: 0 + Standard_Mode: 0 Retro_Mode: 0 Drops_From: [Pots] DIAMOND: @@ -236,7 +236,7 @@ Hylian_Luck: XP: 0 Drop_Chance: 100.0 Drop_Level: - Standard: 0 + Standard_Mode: 0 Retro_Mode: 0 Drops_From: [Pots] GOLD_NUGGET: @@ -244,6 +244,6 @@ Hylian_Luck: XP: 0 Drop_Chance: 100.0 Drop_Level: - Standard: 0 + Standard_Mode: 0 Retro_Mode: 0 Drops_From: [Pots] \ No newline at end of file From f01efd92f50648fc472c8ceabe4f61c18c2b0b4e Mon Sep 17 00:00:00 2001 From: nossr50 Date: Wed, 31 Mar 2021 15:06:59 -0700 Subject: [PATCH 447/662] Correct bad default config files --- Changelog.txt | 6 ++++++ .../gmail/nossr50/config/treasure/TreasureConfig.java | 11 +++++++++++ 2 files changed, 17 insertions(+) diff --git a/Changelog.txt b/Changelog.txt index 4e2babd43..d6d819885 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,9 @@ +Version 2.1.184 + 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) 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 a4f13e402..1dd4a7217 100755 --- a/src/main/java/com/gmail/nossr50/config/treasure/TreasureConfig.java +++ b/src/main/java/com/gmail/nossr50/config/treasure/TreasureConfig.java @@ -25,6 +25,7 @@ public class TreasureConfig extends ConfigLoader { 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 LEVEL_REQUIREMENT_INVALID = ".Level_Requirement.Standard"; public static final String LEGACY_DROP_LEVEL = ".Drop_Level"; private static TreasureConfig instance; @@ -112,6 +113,16 @@ public class TreasureConfig extends ConfigLoader { int legacyDropLevel = config.getInt(type + "." + treasureName + LEGACY_DROP_LEVEL, -1); int dropLevel = -1; + int badDefaults = config.getInt(type + "." + treasureName + LEVEL_REQUIREMENT_INVALID, -1); + + //Hacky fix for bad keys in treasures.yml defaults + if(badDefaults != -1) { + config.set(type + "." + treasureName + LEVEL_REQUIREMENT_INVALID, null); + config.set(type + "." + treasureName + LEVEL_REQUIREMENT_STANDARD_MODE, badDefaults); + updatedFile = true; + } + + if(legacyDropLevel >= 0) { //Config needs to be updated to be more specific mcMMO.p.getLogger().info("(" + treasureName + ") Updating Drop_Level in treasures.yml for treasure to match new expected format"); From a2ba406fe5f6d217ec7b87fc155de14506397e14 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Wed, 31 Mar 2021 15:14:00 -0700 Subject: [PATCH 448/662] Removed April Fools event --- Changelog.txt | 1 + .../gmail/nossr50/commands/McmmoCommand.java | 2 +- .../nossr50/commands/skills/AprilCommand.java | 398 ++++----- .../java/com/gmail/nossr50/config/Config.java | 2 - .../nossr50/listeners/PlayerListener.java | 26 +- src/main/java/com/gmail/nossr50/mcMMO.java | 12 - .../nossr50/runnables/CheckDateTask.java | 46 +- .../nossr50/runnables/skills/AprilTask.java | 112 +-- .../gmail/nossr50/util/HolidayManager.java | 772 +++++++++--------- src/main/resources/config.yml | 1 - 10 files changed, 679 insertions(+), 693 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index d6d819885..269b0af14 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,4 +1,5 @@ Version 2.1.184 + Removed April Fools event Fixed a bug where the default treasures.yml file had incorrect keys (see notes) NOTES: diff --git a/src/main/java/com/gmail/nossr50/commands/McmmoCommand.java b/src/main/java/com/gmail/nossr50/commands/McmmoCommand.java index 23b4c8658..9c09763ca 100644 --- a/src/main/java/com/gmail/nossr50/commands/McmmoCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/McmmoCommand.java @@ -35,7 +35,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/skills/AprilCommand.java b/src/main/java/com/gmail/nossr50/commands/skills/AprilCommand.java index 819205ca1..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,199 +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.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; - } -} +//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/config/Config.java b/src/main/java/com/gmail/nossr50/config/Config.java index 81d727339..18c87f528 100644 --- a/src/main/java/com/gmail/nossr50/config/Config.java +++ b/src/main/java/com/gmail/nossr50/config/Config.java @@ -243,8 +243,6 @@ public class Config extends AutoUpdateConfigLoader { * GENERAL SETTINGS */ - public boolean isAprilFoolsAllowed() { return config.getBoolean("General.AprilFoolsEvent", true); } - /* General Settings */ public boolean getIsMetricsEnabled() { return config.getBoolean("Metrics.bstats", true); } diff --git a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java index f4938c319..ab1c46c93 100644 --- a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java @@ -971,17 +971,17 @@ 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; - - if (!mcMMO.getHolidayManager().isAprilFirst()) { - return; - } - - mcMMO.getHolidayManager().handleStatisticEvent(event); - } +// +// @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) +// public void onPlayerStatisticIncrementEvent(PlayerStatisticIncrementEvent event) { +// /* WORLD BLACKLIST CHECK */ +// if(WorldBlacklist.isWorldBlacklisted(event.getPlayer().getWorld())) +// return; +// +// if (!mcMMO.getHolidayManager().isAprilFirst()) { +// return; +// } +// +// mcMMO.getHolidayManager().handleStatisticEvent(event); +// } } diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index 66d698d1c..f24170690 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -19,7 +19,6 @@ 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.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; @@ -82,7 +81,6 @@ public class mcMMO extends JavaPlugin { 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; @@ -238,7 +236,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 @@ -371,7 +368,6 @@ public class mcMMO extends JavaPlugin { ScoreboardManager.teardownAll(); formulaManager.saveFormula(); - holidayManager.saveAnniversaryFiles(); placeStore.closeAll(); } catch (Exception e) { @@ -444,10 +440,6 @@ public class mcMMO extends JavaPlugin { return formulaManager; } - public static HolidayManager getHolidayManager() { - return holidayManager; - } - public static ChunkManager getPlaceStore() { return placeStore; } @@ -675,10 +667,6 @@ 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, 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); diff --git a/src/main/java/com/gmail/nossr50/runnables/CheckDateTask.java b/src/main/java/com/gmail/nossr50/runnables/CheckDateTask.java index b11b73d45..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, 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/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/util/HolidayManager.java b/src/main/java/com/gmail/nossr50/util/HolidayManager.java index 7004245f6..f89937844 100644 --- a/src/main/java/com/gmail/nossr50/util/HolidayManager.java +++ b/src/main/java/com/gmail/nossr50/util/HolidayManager.java @@ -1,388 +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.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; - } - } - } - - 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/resources/config.yml b/src/main/resources/config.yml index bc640f363..563a4dc0c 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -49,7 +49,6 @@ General: RetroMode: Enabled: true Locale: en_US - AprilFoolsEvent: true MOTD_Enabled: true EventBroadcasts: true EventInfoOnPlayerJoin: true From 0ae83420e600c0b3e7680dfbff48549b927d88a2 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Wed, 31 Mar 2021 15:53:21 -0700 Subject: [PATCH 449/662] 2.1.184 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b7a395d84..e0acdc7b7 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.184-SNAPSHOT + 2.1.184 mcMMO https://github.com/mcMMO-Dev/mcMMO From 72958bb0f3b3a55d5c1b9e448a423276742cb8b8 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 2 Apr 2021 08:32:56 -0700 Subject: [PATCH 450/662] Herbalism XP exploit fix --- Changelog.txt | 3 ++ pom.xml | 2 +- .../nossr50/listeners/PlayerListener.java | 4 +- .../skills/herbalism/HerbalismManager.java | 45 ++++++++++++++----- 4 files changed, 40 insertions(+), 14 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 269b0af14..fcb6d12e9 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,6 @@ +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) diff --git a/pom.xml b/pom.xml index e0acdc7b7..0707083c3 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.184 + 2.1.185-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO diff --git a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java index ab1c46c93..7a8262600 100644 --- a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java @@ -848,7 +848,9 @@ public class PlayerListener implements Listener { } } } else { - herbalismManager.processBerryBushHarvesting(blockState); + if(!event.getPlayer().isSneaking()) { + herbalismManager.processBerryBushHarvesting(blockState); + } } } break; 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 f4bf66b1d..c4d4b6a32 100644 --- a/src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java +++ b/src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java @@ -29,6 +29,7 @@ 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.Bukkit; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Block; @@ -40,6 +41,7 @@ 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; @@ -111,22 +113,41 @@ public class HerbalismManager extends SkillManager { mmoPlayer.getPlayer().sendMessage("Bush XP: " + xpReward); } -// //Check for double drops -// if(checkDoubleDrop(blockState)) { -// -// if(mmoPlayer.isDebugMode()) { -// mmoPlayer.getPlayer().sendMessage("Double Drops succeeded for Berry Bush"); -// } -// -// //Add metadata to mark this block for double or triple drops -// markForBonusDrops(blockState); -// } - - applyXpGain(xpReward, XPGainReason.PVE, XPGainSource.SELF); + 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; From 1e91ba156d062c4743c86d5fc1ab4e80e657a442 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 2 Apr 2021 08:33:09 -0700 Subject: [PATCH 451/662] 2.1.185 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 0707083c3..c730c8298 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.185-SNAPSHOT + 2.1.185 mcMMO https://github.com/mcMMO-Dev/mcMMO From 0cb3d91f0ea49d4821153665370e99bc8f75f58f Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 2 Apr 2021 08:55:04 -0700 Subject: [PATCH 452/662] dev mode --- Changelog.txt | 3 +++ pom.xml | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index fcb6d12e9..f6dfd2839 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,6 @@ +Version 2.1.186 + + Version 2.1.185 Fixed an exploit for Herbalism diff --git a/pom.xml b/pom.xml index c730c8298..c595513b0 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.185 + 2.1.186-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO From 48bf79055aaa526f2a85a412dd101726138ba622 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 2 Apr 2021 11:00:11 -0700 Subject: [PATCH 453/662] Rupture has been reworked --- Changelog.txt | 15 + .../com/gmail/nossr50/api/AbilityAPI.java | 10 +- .../datatypes/meta/RuptureTaskMeta.java | 25 + .../nossr50/datatypes/player/McMMOPlayer.java | 12 +- src/main/java/com/gmail/nossr50/mcMMO.java | 5 +- .../runnables/skills/BleedTimerTask.java | 428 +++++++++--------- .../nossr50/runnables/skills/RuptureTask.java | 142 ++++++ .../skills/herbalism/HerbalismManager.java | 1 - .../nossr50/skills/swords/SwordsManager.java | 65 ++- .../nossr50/skills/taming/TamingManager.java | 21 +- .../nossr50/util/TransientMetadataTools.java | 5 + .../nossr50/util/skills/CombatUtils.java | 6 +- .../util/skills/ParticleEffectUtils.java | 43 +- src/main/resources/advanced.yml | 6 - 14 files changed, 507 insertions(+), 277 deletions(-) create mode 100644 src/main/java/com/gmail/nossr50/datatypes/meta/RuptureTaskMeta.java create mode 100644 src/main/java/com/gmail/nossr50/runnables/skills/RuptureTask.java diff --git a/Changelog.txt b/Changelog.txt index f6dfd2839..526ae90e8 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,4 +1,19 @@ Version 2.1.186 + Rupture has been reworked to solve a few outstanding issues (see notes) + Removed 'Skills.Swords.Rupture.MaxTicks' from advanced.yml + Removed 'Skills.Swords.Rupture.BaseTicks' from advanced.yml + 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 + + 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 since your last attack on the target have transpired 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 Version 2.1.185 diff --git a/src/main/java/com/gmail/nossr50/api/AbilityAPI.java b/src/main/java/com/gmail/nossr50/api/AbilityAPI.java index 5922ecbe6..ad68b9d7e 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.mcMMO; 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(mcMMO.RUPTURE_META_KEY)) { + return true; + } + } + + return false; } } 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/player/McMMOPlayer.java b/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java index cbcbbdba5..94face6c1 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java +++ b/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java @@ -10,6 +10,7 @@ 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; @@ -23,7 +24,6 @@ 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; @@ -1080,7 +1080,15 @@ public class McMMOPlayer implements Identified { */ public void logout(boolean syncSave) { Player thisPlayer = getPlayer(); - BleedTimerTask.bleedOut(getPlayer()); + if(getPlayer().hasMetadata(mcMMO.RUPTURE_META_KEY)) { + RuptureTaskMeta ruptureTaskMeta = (RuptureTaskMeta) getPlayer().getMetadata(mcMMO.RUPTURE_META_KEY); + + //Punish a logout + ruptureTaskMeta.getRuptureTimerTask().explode(); + ruptureTaskMeta.getRuptureTimerTask().explode(); + ruptureTaskMeta.getRuptureTimerTask().explode(); + } + cleanup(); if (syncSave) { diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index f24170690..9e442355b 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -27,7 +27,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; @@ -126,6 +125,7 @@ public class mcMMO extends JavaPlugin { /* Metadata Values */ public static final String REPLANT_META_KEY = "mcMMO: Recently Replanted"; + public static final String RUPTURE_META_KEY = "mcMMO: RuptureTask"; 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"; @@ -641,9 +641,6 @@ public class mcMMO extends JavaPlugin { // Cleanup the backups folder new CleanBackupsTask().runTaskAsynchronously(mcMMO.p); - // Bleed timer (Runs every 0.5 seconds) - new BleedTimerTask().runTaskTimer(this, Misc.TICK_CONVERSION_FACTOR, (Misc.TICK_CONVERSION_FACTOR / 2)); - // Old & Powerless User remover long purgeIntervalTicks = Config.getInstance().getPurgeInterval() * 60L * 60L * Misc.TICK_CONVERSION_FACTOR; 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 aee720282..49298c2bb 100644 --- a/src/main/java/com/gmail/nossr50/runnables/skills/BleedTimerTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/skills/BleedTimerTask.java @@ -1,214 +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 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 = 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()) { - //We only want to count slots that contain armor. - 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 @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); - } -} +//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 = 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()) { +// //We only want to count slots that contain armor. +// 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 @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/RuptureTask.java b/src/main/java/com/gmail/nossr50/runnables/skills/RuptureTask.java new file mode 100644 index 000000000..681578577 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/runnables/skills/RuptureTask.java @@ -0,0 +1,142 @@ +package com.gmail.nossr50.runnables.skills; + +import com.gmail.nossr50.datatypes.player.McMMOPlayer; +import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.util.MobHealthbarUtils; +import com.gmail.nossr50.util.skills.ParticleEffectUtils; +import com.google.common.base.Objects; +import org.bukkit.entity.LivingEntity; +import org.bukkit.scheduler.BukkitRunnable; +import org.jetbrains.annotations.NotNull; + +public class RuptureTask extends BukkitRunnable { + + public static final int FIVE_SECOND_DURATION = 20 * 5; + public static final int DAMAGE_TICK_INTERVAL = 10; + + private final @NotNull McMMOPlayer ruptureSource; + private final @NotNull LivingEntity targetEntity; + private final int ruptureRank; + private final int expireTick; + + private int ruptureTick; + private int damageTickTracker; + private final double damageValue; //TODO: Make configurable + + public RuptureTask(@NotNull McMMOPlayer ruptureSource, @NotNull LivingEntity targetEntity, int ruptureRank, double damageValue) { + this.ruptureSource = ruptureSource; + this.targetEntity = targetEntity; + this.ruptureRank = ruptureRank; + this.expireTick = FIVE_SECOND_DURATION; + this.damageValue = damageValue; + + this.ruptureTick = 0; + this.damageTickTracker = 0; + } + + @Override + public void run() { + //Check validity + if(targetEntity.isValid()) { + ruptureTick += 1; //Advance rupture tick by 1. + damageTickTracker += 1; //Increment damage tick tracker + + //Rupture hasn't ended yet + if(ruptureTick < expireTick) { + + //Is it time to damage? + if(damageTickTracker >= DAMAGE_TICK_INTERVAL) { + damageTickTracker = 0; //Reset + ParticleEffectUtils.playBleedEffect(targetEntity); //Animate + + if(targetEntity.getHealth() > 0.01) { + double healthBeforeRuptureIsApplied = targetEntity.getHealth(); + double damagedHealth = healthBeforeRuptureIsApplied - getTickDamage(); + + if(damagedHealth <= 0) { + mcMMO.p.getLogger().severe("DEBUG: Miscalculating Rupture tick damage"); + } else { + targetEntity.setHealth(damagedHealth); //Hurt entity without the unwanted side effects of damage() + + //TODO: Do we need to set last damage? Double check + double finalDamage = healthBeforeRuptureIsApplied - targetEntity.getHealth(); + + //Update health bars + MobHealthbarUtils.handleMobHealthbars(targetEntity, finalDamage, mcMMO.p); + + if(finalDamage <= 0) { + mcMMO.p.getLogger().severe("DEBUG: Miscalculating final damage for Rupture"); + } else { + //Actually should this even be done? + targetEntity.setLastDamage(finalDamage); + } + } + } + } + } else { + explode(); + } + } else { + targetEntity.removeMetadata(mcMMO.RUPTURE_META_KEY, mcMMO.p); + this.cancel(); //Task no longer needed + } + } + + public void explode() { + ParticleEffectUtils.playBleedEffect(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); + this.cancel(); //Task no longer needed + } + + private double getTickDamage() { + double tickDamage = damageValue; + + if(targetEntity.getHealth() <= tickDamage) { + tickDamage = targetEntity.getHealth() - 0.01; + + if(tickDamage <= 0) { + tickDamage = 0; + } + } + + return tickDamage; + } + + private int getExplosionDamage() { + //TODO: Balance pass + return ruptureRank * 10; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + RuptureTask that = (RuptureTask) o; + return ruptureRank == that.ruptureRank && expireTick == that.expireTick && ruptureTick == that.ruptureTick && damageTickTracker == that.damageTickTracker && Double.compare(that.damageValue, damageValue) == 0 && Objects.equal(ruptureSource, that.ruptureSource) && Objects.equal(targetEntity, that.targetEntity); + } + + @Override + public int hashCode() { + return Objects.hashCode(ruptureSource, targetEntity, ruptureRank, expireTick, ruptureTick, damageTickTracker, damageValue); + } + + @Override + public String toString() { + return "RuptureTimerTask{" + + "ruptureSource=" + ruptureSource + + ", targetEntity=" + targetEntity + + ", ruptureRank=" + ruptureRank + + ", expireTick=" + expireTick + + ", ruptureTick=" + ruptureTick + + ", damageTickTracker=" + damageTickTracker + + ", damageValue=" + damageValue + + '}'; + } +} 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 c4d4b6a32..85f87ed51 100644 --- a/src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java +++ b/src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java @@ -29,7 +29,6 @@ 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.Bukkit; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Block; 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 1c3fa3766..87efaffda 100644 --- a/src/main/java/com/gmail/nossr50/skills/swords/SwordsManager.java +++ b/src/main/java/com/gmail/nossr50/skills/swords/SwordsManager.java @@ -1,12 +1,15 @@ package com.gmail.nossr50.skills.swords; +import com.gmail.nossr50.config.AdvancedConfig; 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.Permissions; @@ -60,32 +63,50 @@ public class SwordsManager extends SkillManager { * * @param target The defending entity */ - public void ruptureCheck(@NotNull LivingEntity target) throws IllegalStateException { - if(BleedTimerTask.isBleedOperationAllowed()) { - if (RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.SWORDS_RUPTURE, getPlayer())) { + public void processRupture(@NotNull LivingEntity target) throws IllegalStateException { + if(target.hasMetadata(mcMMO.REPLANT_META_KEY)) { + if(mmoPlayer.isDebugMode()) { + mmoPlayer.getPlayer().sendMessage("Rupture task ongoing for target " + target.toString()); + RuptureTaskMeta ruptureTaskMeta = (RuptureTaskMeta) target.getMetadata(mcMMO.RUPTURE_META_KEY); + RuptureTask ruptureTask = (RuptureTask) target.getMetadata(mcMMO.RUPTURE_META_KEY); + mmoPlayer.getPlayer().sendMessage(ruptureTask.toString()); + } - if (target instanceof Player) { - Player defender = (Player) target; + return; //Don't apply bleed + } - //Don't start or add to a bleed if they are blocking - if(defender.isBlocking()) - return; + if (RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.SWORDS_RUPTURE, getPlayer())) { - if (NotificationManager.doesPlayerUseNotifications(defender)) { - if(!BleedTimerTask.isBleeding(defender)) - NotificationManager.sendPlayerInformation(defender, NotificationType.SUBSKILL_MESSAGE, "Swords.Combat.Bleeding.Started"); - } - } + if (target instanceof Player) { + Player defender = (Player) target; - BleedTimerTask.add(target, getPlayer(), getRuptureBleedTicks(), RankUtils.getRank(getPlayer(), SubSkillType.SWORDS_RUPTURE), getToolTier(getPlayer().getInventory().getItemInMainHand())); + //Don't start or add to a bleed if they are blocking + if(defender.isBlocking()) + return; - if (mmoPlayer.useChatNotifications()) { - NotificationManager.sendPlayerInformation(getPlayer(), NotificationType.SUBSKILL_MESSAGE, "Swords.Combat.Bleeding"); + if (NotificationManager.doesPlayerUseNotifications(defender)) { + NotificationManager.sendPlayerInformation(defender, NotificationType.SUBSKILL_MESSAGE, "Swords.Combat.Bleeding.Started"); } } + + double tickDamageValue = target instanceof Player ? AdvancedConfig.getInstance().getRuptureDamagePlayer() : AdvancedConfig.getInstance().getRuptureDamageMobs(); + + RuptureTask ruptureTask = new RuptureTask(mmoPlayer, target, RankUtils.getRank(mmoPlayer.getPlayer(), SubSkillType.SWORDS_RUPTURE), tickDamageValue); + RuptureTaskMeta ruptureTaskMeta = new RuptureTaskMeta(mcMMO.p, ruptureTask); + + ruptureTask.runTaskTimer(mcMMO.p, 0, 1); + target.setMetadata(mcMMO.RUPTURE_META_KEY, 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); @@ -112,14 +133,8 @@ 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; + public int getRuptureBleedTicks() { + return RuptureTask.FIVE_SECOND_DURATION / RuptureTask.DAMAGE_TICK_INTERVAL; } /** 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 859892c20..23a12081b 100644 --- a/src/main/java/com/gmail/nossr50/skills/taming/TamingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/taming/TamingManager.java @@ -12,7 +12,6 @@ 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.skills.SkillManager; import com.gmail.nossr50.util.Misc; import com.gmail.nossr50.util.Permissions; @@ -168,21 +167,13 @@ public class TamingManager extends SkillManager { * @param damage The initial damage */ public double gore(@NotNull LivingEntity target, double damage) { - if(BleedTimerTask.isBleedOperationAllowed()) { - if (!RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.TAMING_GORE, getPlayer())) { - return 0; - } +// if (target instanceof Player) { +// NotificationManager.sendPlayerInformation((Player)target, NotificationType.SUBSKILL_MESSAGE, "Combat.StruckByGore"); +// } +// +// NotificationManager.sendPlayerInformation(getPlayer(), NotificationType.SUBSKILL_MESSAGE, "Combat.Gore"); - 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"); - - damage = (damage * Taming.goreModifier) - damage; - } + damage = (damage * Taming.goreModifier) - damage; return damage; } diff --git a/src/main/java/com/gmail/nossr50/util/TransientMetadataTools.java b/src/main/java/com/gmail/nossr50/util/TransientMetadataTools.java index b84e8c60e..6a55c5a43 100644 --- a/src/main/java/com/gmail/nossr50/util/TransientMetadataTools.java +++ b/src/main/java/com/gmail/nossr50/util/TransientMetadataTools.java @@ -33,6 +33,11 @@ public class TransientMetadataTools { livingEntity.removeMetadata(mcMMO.travelingBlock, pluginRef); } + if(livingEntity.hasMetadata(mcMMO.REPLANT_META_KEY)) { + livingEntity.removeMetadata(mcMMO.REPLANT_META_KEY, pluginRef); + } + + //Cleanup mob metadata mcMMO.getCompatibilityManager().getPersistentDataLayer().removeMobFlags(livingEntity); } 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 f2ab26669..f28f6762e 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java @@ -12,7 +12,6 @@ import com.gmail.nossr50.events.fake.FakeEntityDamageByEntityEvent; import com.gmail.nossr50.events.fake.FakeEntityDamageEvent; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.party.PartyManager; -import com.gmail.nossr50.runnables.skills.AwardCombatXpTask; import com.gmail.nossr50.skills.acrobatics.AcrobaticsManager; import com.gmail.nossr50.skills.archery.ArcheryManager; import com.gmail.nossr50.skills.axes.AxesManager; @@ -41,6 +40,7 @@ import org.bukkit.potion.PotionEffectType; import org.bukkit.projectiles.ProjectileSource; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import com.gmail.nossr50.runnables.skills.AwardCombatXpTask; import java.util.EnumMap; import java.util.HashMap; @@ -96,7 +96,7 @@ public final class CombatUtils { if(target.getHealth() - event.getFinalDamage() >= 1) { if (swordsManager.canUseRupture()) { - swordsManager.ruptureCheck(target); + swordsManager.processRupture(target); } } @@ -714,7 +714,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(target); break; case AXES: 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 40fad662b..8d0f75937 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/ParticleEffectUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/ParticleEffectUtils.java @@ -1,17 +1,19 @@ 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.bukkit.Effect; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.World; +import org.apache.commons.lang.math.RandomUtils; +import org.bukkit.*; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; +import java.util.ArrayList; +import java.util.Arrays; + public final class ParticleEffectUtils { private ParticleEffectUtils() {} @@ -27,9 +29,40 @@ public final class ParticleEffectUtils { return; } - livingEntity.getWorld().playEffect(livingEntity.getEyeLocation(), Effect.STEP_SOUND, Material.REDSTONE_WIRE); + 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; + + Location locA = new Location(world, x - offSetVal, y, z); + Location locB = new Location(world, x + offSetVal, y, z); + Location locC = new Location(world, x, y + offSetVal, z); + Location locD = new Location(world, x, y - offSetVal, z); + Location locE = new Location(world, x, y, z + offSetVal); + Location locF = new Location(world, x, y, z - offSetVal); + + Location locG = new Location(world, x + offSetVal, y, z + offSetVal); + Location locH = new Location(world, x - offSetVal, y, z - offSetVal); + Location locI = new Location(world, x - offSetVal, y - offSetVal, z - offSetVal); + Location locJ = new Location(world, x + offSetVal, y - offSetVal, z + offSetVal); + Location locK = new Location(world, x - offSetVal, y + offSetVal, z - offSetVal); + Location locL = new Location(world, x - offSetVal, y + offSetVal, z - offSetVal); + + Location[] particleLocations = new Location[]{ locA, locB, locC, locD, locE, locF, locG, locH, locI, locJ, locK, locL}; + + for(Location location : particleLocations) { + if(RandomUtils.nextInt(100) > 30) { + //TODO: Change + livingEntity.getWorld().playEffect(location, Effect.STEP_SOUND, Material.REDSTONE_WIRE); + } + } } + public static void playDodgeEffect(Player player) { if (!Config.getInstance().getDodgeEffectEnabled()) { return; diff --git a/src/main/resources/advanced.yml b/src/main/resources/advanced.yml index e9979909c..90a783a72 100644 --- a/src/main/resources/advanced.yml +++ b/src/main/resources/advanced.yml @@ -465,13 +465,7 @@ Skills: # 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 - CounterAttack: - # ChanceMax: Maximum chance of triggering a counter attack # MaxBonusLevel: On this level, the chance to Counter will be ChanceMax: 30.0 From affecfeeebb1d97bafab94661c12c2a193230e82 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 2 Apr 2021 12:02:21 -0700 Subject: [PATCH 454/662] Added config options for Rupture and updated the Swords command --- Changelog.txt | 19 ++++- .../commands/skills/SwordsCommand.java | 48 +++++++----- .../gmail/nossr50/config/AdvancedConfig.java | 78 +++++++------------ .../nossr50/runnables/skills/RuptureTask.java | 65 ++++++++-------- .../gmail/nossr50/skills/swords/Swords.java | 2 - .../nossr50/skills/swords/SwordsManager.java | 9 ++- src/main/resources/advanced.yml | 46 ++++++++--- .../resources/locale/locale_en_US.properties | 6 +- 8 files changed, 149 insertions(+), 124 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 526ae90e8..89fef502a 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,11 +1,26 @@ Version 2.1.186 Rupture has been reworked to solve a few outstanding issues (see notes) - Removed 'Skills.Swords.Rupture.MaxTicks' from advanced.yml - Removed 'Skills.Swords.Rupture.BaseTicks' from advanced.yml 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 '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 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 1e6bf1d72..4ca8749e6 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/SwordsCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/SwordsCommand.java @@ -1,6 +1,7 @@ package com.gmail.nossr50.commands.skills; 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.locale.LocaleLoader; @@ -19,15 +20,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 +45,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(AdvancedConfig.getInstance().getRuptureDurationSeconds(true)); + ruptureLengthSecondsAgainstMobs = String.valueOf(AdvancedConfig.getInstance().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(AdvancedConfig.getInstance().getRuptureTickDamage(true, ruptureRank)); + rupturePureTickDamageAgainstMobs = String.valueOf(AdvancedConfig.getInstance().getRuptureTickDamage(false, ruptureRank)); + + ruptureExplosionDamageAgainstPlayers = String.valueOf(AdvancedConfig.getInstance().getRuptureExplosionDamage(true, ruptureRank)); + ruptureExplosionDamageAgainstMobs = String.valueOf(AdvancedConfig.getInstance().getRuptureExplosionDamage(false, ruptureRank)); + + ruptureChanceToApply = String.valueOf(AdvancedConfig.getInstance().getRuptureChanceToApplyOnHit(ruptureRank)); + ruptureChanceToApplyLucky = String.valueOf(AdvancedConfig.getInstance().getRuptureChanceToApplyOnHit(ruptureRank) * 1.33); } // SERRATED STRIKES @@ -61,7 +70,7 @@ 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); } @@ -70,22 +79,21 @@ public class SwordsCommand extends SkillCommand { 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(); - 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, + rupturePureTickDamageAgainstPlayers, + rupturePureTickDamageAgainstMobs, + ruptureExplosionDamageAgainstPlayers, + ruptureExplosionDamageAgainstMobs)); messages.add(LocaleLoader.getString("Swords.Combat.Rupture.Note")); } diff --git a/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java b/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java index bb8f8167e..37784f28e 100644 --- a/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java +++ b/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java @@ -5,6 +5,9 @@ import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.datatypes.skills.subskills.AbstractSubSkill; import com.gmail.nossr50.mcMMO; import net.md_5.bungee.api.ChatColor; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.List; @@ -310,25 +313,6 @@ public class AdvancedConfig extends AutoUpdateConfigLoader { } /* 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!"); @@ -665,13 +649,11 @@ public class AdvancedConfig extends AutoUpdateConfigLoader { 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 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); } @@ -700,7 +682,6 @@ public class AdvancedConfig extends AutoUpdateConfigLoader { //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); } @@ -712,9 +693,7 @@ public class AdvancedConfig extends AutoUpdateConfigLoader { 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 int getIceFishingUnlockLevel() { return config.getInt("Skills.Fishing.IceFishing.UnlockLevel", 50); } - 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); } @@ -737,23 +716,15 @@ public class AdvancedConfig extends AutoUpdateConfigLoader { public double getRepairMasteryMaxBonus() { return config.getDouble("Skills.Repair.RepairMastery.MaxBonusPercentage", 200.0D); } public int getRepairMasteryMaxLevel() { return config.getInt("Skills.Repair.RepairMastery.MaxBonusLevel", 100); } - /* Arcane Forging */ - //public int getArcaneForgingRankLevel(int rank) { return config.getInt("Skills.Repair.ArcaneForging.Rank_Levels.Rank_" + rank); } - 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 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); } - /* SALVAGE */ - //public double getSalvageMaxPercentage() { return config.getDouble("Skills.Salvage.MaxPercentage", 100.0D); } - //public int getSalvageMaxPercentageLevel() { return config.getInt("Skills.Salvage.MaxPercentageLevel", 1000); } - public boolean getArcaneSalvageEnchantDowngradeEnabled() { return config.getBoolean("Skills.Salvage.ArcaneSalvage.EnchantDowngradeEnabled", true); } public boolean getArcaneSalvageEnchantLossEnabled() { return config.getBoolean("Skills.Salvage.ArcaneSalvage.EnchantLossEnabled", 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); } @@ -765,19 +736,35 @@ public class AdvancedConfig extends AutoUpdateConfigLoader { 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); } - /* 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 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 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); } @@ -785,24 +772,15 @@ public class AdvancedConfig extends AutoUpdateConfigLoader { 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 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 int getEnviromentallyAwareUnlock() { return config.getInt("Skills.Taming.EnvironmentallyAware.UnlockLevel", 100); } - - /*public int getThickFurUnlock() { return config.getInt("Skills.Taming.ThickFur.UnlockLevel", 250); }*/ public double getThickFurModifier() { return config.getDouble("Skills.Taming.ThickFur.Modifier", 2.0D); } - /*public int getHolyHoundUnlock() {return config.getInt("Skills.Taming.HolyHound.UnlockLevel", 375); }*/ - - /*public int getShockProofUnlock() { return config.getInt("Skills.Taming.ShockProof.UnlockLevel", 500); }*/ public double getShockProofModifier() { return config.getDouble("Skills.Taming.ShockProof.Modifier", 6.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); } diff --git a/src/main/java/com/gmail/nossr50/runnables/skills/RuptureTask.java b/src/main/java/com/gmail/nossr50/runnables/skills/RuptureTask.java index 681578577..4ef254b57 100644 --- a/src/main/java/com/gmail/nossr50/runnables/skills/RuptureTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/skills/RuptureTask.java @@ -1,37 +1,38 @@ package com.gmail.nossr50.runnables.skills; +import com.gmail.nossr50.config.AdvancedConfig; import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.MobHealthbarUtils; 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 FIVE_SECOND_DURATION = 20 * 5; public static final int DAMAGE_TICK_INTERVAL = 10; private final @NotNull McMMOPlayer ruptureSource; private final @NotNull LivingEntity targetEntity; - private final int ruptureRank; private final int expireTick; private int ruptureTick; private int damageTickTracker; - private final double damageValue; //TODO: Make configurable + private final double pureTickDamage; //TODO: Make configurable + private final double explosionDamage; //TODO: Make configurable - public RuptureTask(@NotNull McMMOPlayer ruptureSource, @NotNull LivingEntity targetEntity, int ruptureRank, double damageValue) { + public RuptureTask(@NotNull McMMOPlayer ruptureSource, @NotNull LivingEntity targetEntity, double pureTickDamage, double explosionDamage) { this.ruptureSource = ruptureSource; this.targetEntity = targetEntity; - this.ruptureRank = ruptureRank; - this.expireTick = FIVE_SECOND_DURATION; - this.damageValue = damageValue; + this.expireTick = AdvancedConfig.getInstance().getRuptureDurationSeconds(targetEntity instanceof Player); this.ruptureTick = 0; this.damageTickTracker = 0; + this.pureTickDamage = pureTickDamage; + this.explosionDamage = explosionDamage; } @Override @@ -48,10 +49,11 @@ public class RuptureTask extends BukkitRunnable { if(damageTickTracker >= DAMAGE_TICK_INTERVAL) { damageTickTracker = 0; //Reset ParticleEffectUtils.playBleedEffect(targetEntity); //Animate + double finalDamage = 0; //Used for mob health bars and setting last damage if(targetEntity.getHealth() > 0.01) { double healthBeforeRuptureIsApplied = targetEntity.getHealth(); - double damagedHealth = healthBeforeRuptureIsApplied - getTickDamage(); + double damagedHealth = healthBeforeRuptureIsApplied - calculateAdjustedTickDamage(); if(damagedHealth <= 0) { mcMMO.p.getLogger().severe("DEBUG: Miscalculating Rupture tick damage"); @@ -59,10 +61,7 @@ public class RuptureTask extends BukkitRunnable { targetEntity.setHealth(damagedHealth); //Hurt entity without the unwanted side effects of damage() //TODO: Do we need to set last damage? Double check - double finalDamage = healthBeforeRuptureIsApplied - targetEntity.getHealth(); - - //Update health bars - MobHealthbarUtils.handleMobHealthbars(targetEntity, finalDamage, mcMMO.p); + finalDamage = healthBeforeRuptureIsApplied - targetEntity.getHealth(); if(finalDamage <= 0) { mcMMO.p.getLogger().severe("DEBUG: Miscalculating final damage for Rupture"); @@ -72,6 +71,9 @@ public class RuptureTask extends BukkitRunnable { } } } + + //Update Health bars + MobHealthbarUtils.handleMobHealthbars(targetEntity, finalDamage, mcMMO.p); } } else { explode(); @@ -95,8 +97,8 @@ public class RuptureTask extends BukkitRunnable { this.cancel(); //Task no longer needed } - private double getTickDamage() { - double tickDamage = damageValue; + private double calculateAdjustedTickDamage() { + double tickDamage = pureTickDamage; if(targetEntity.getHealth() <= tickDamage) { tickDamage = targetEntity.getHealth() - 0.01; @@ -109,9 +111,21 @@ public class RuptureTask extends BukkitRunnable { return tickDamage; } - private int getExplosionDamage() { - //TODO: Balance pass - return ruptureRank * 10; + 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 @@ -119,24 +133,11 @@ public class RuptureTask extends BukkitRunnable { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; RuptureTask that = (RuptureTask) o; - return ruptureRank == that.ruptureRank && expireTick == that.expireTick && ruptureTick == that.ruptureTick && damageTickTracker == that.damageTickTracker && Double.compare(that.damageValue, damageValue) == 0 && Objects.equal(ruptureSource, that.ruptureSource) && Objects.equal(targetEntity, that.targetEntity); + 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, ruptureRank, expireTick, ruptureTick, damageTickTracker, damageValue); - } - - @Override - public String toString() { - return "RuptureTimerTask{" + - "ruptureSource=" + ruptureSource + - ", targetEntity=" + targetEntity + - ", ruptureRank=" + ruptureRank + - ", expireTick=" + expireTick + - ", ruptureTick=" + ruptureTick + - ", damageTickTracker=" + damageTickTracker + - ", damageValue=" + damageValue + - '}'; + return Objects.hashCode(ruptureSource, targetEntity, expireTick, ruptureTick, damageTickTracker, pureTickDamage, explosionDamage); } } 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..0c2bd8fad 100644 --- a/src/main/java/com/gmail/nossr50/skills/swords/Swords.java +++ b/src/main/java/com/gmail/nossr50/skills/swords/Swords.java @@ -3,8 +3,6 @@ package com.gmail.nossr50.skills.swords; import com.gmail.nossr50.config.AdvancedConfig; public class Swords { - public static int bleedMaxTicks = AdvancedConfig.getInstance().getRuptureMaxTicks(); - public static double counterAttackModifier = AdvancedConfig.getInstance().getCounterModifier(); public static double serratedStrikesModifier = AdvancedConfig.getInstance().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 87efaffda..a24ee24e4 100644 --- a/src/main/java/com/gmail/nossr50/skills/swords/SwordsManager.java +++ b/src/main/java/com/gmail/nossr50/skills/swords/SwordsManager.java @@ -89,9 +89,10 @@ public class SwordsManager extends SkillManager { } } - double tickDamageValue = target instanceof Player ? AdvancedConfig.getInstance().getRuptureDamagePlayer() : AdvancedConfig.getInstance().getRuptureDamageMobs(); + RuptureTask ruptureTask = new RuptureTask(mmoPlayer, target, + AdvancedConfig.getInstance().getRuptureTickDamage(target instanceof Player, getRuptureRank()), + AdvancedConfig.getInstance().getRuptureExplosionDamage(target instanceof Player, getRuptureRank())); - RuptureTask ruptureTask = new RuptureTask(mmoPlayer, target, RankUtils.getRank(mmoPlayer.getPlayer(), SubSkillType.SWORDS_RUPTURE), tickDamageValue); RuptureTaskMeta ruptureTaskMeta = new RuptureTaskMeta(mcMMO.p, ruptureTask); ruptureTask.runTaskTimer(mcMMO.p, 0, 1); @@ -133,8 +134,8 @@ public class SwordsManager extends SkillManager { return 1; } - public int getRuptureBleedTicks() { - return RuptureTask.FIVE_SECOND_DURATION / RuptureTask.DAMAGE_TICK_INTERVAL; + public int getRuptureBleedTicks(boolean isTargetPlayer) { + return AdvancedConfig.getInstance().getRuptureDurationSeconds(isTargetPlayer) / RuptureTask.DAMAGE_TICK_INTERVAL; } /** diff --git a/src/main/resources/advanced.yml b/src/main/resources/advanced.yml index 90a783a72..2bf6ebf2f 100644 --- a/src/main/resources/advanced.yml +++ b/src/main/resources/advanced.yml @@ -454,17 +454,41 @@ 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 + 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 diff --git a/src/main/resources/locale/locale_en_US.properties b/src/main/resources/locale/locale_en_US.properties index 3038d17b1..4e702d860 100644 --- a/src/main/resources/locale/locale_en_US.properties +++ b/src/main/resources/locale/locale_en_US.properties @@ -406,7 +406,7 @@ Anvil.Unbreakable=This item is unbreakable! #SWORDS Swords.Ability.Lower=&7You lower your sword. Swords.Ability.Ready=&3You &6ready&3 your Sword. -Swords.Combat.Rupture.Note=&7NOTE: &e1 Tick happens every 0.5 seconds! +Swords.Combat.Rupture.Note=&7NOTE: Pure tick damage is dealt twice a second during Rupture and bypasses resistances but IS never lethal, an explosion goes off after 5 seconds with is reduced by armor and other resistances. Swords.Combat.Bleeding.Started=&4 You're bleeding! Swords.Combat.Bleeding.Stopped=&7The bleeding has &astopped&7! Swords.Combat.Bleeding=&a**ENEMY BLEEDING** @@ -420,7 +420,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 @@ -428,7 +428,7 @@ 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: &a{0} ticks [{1} DMG vs Player] [{2} DMG vs Mobs] +Swords.SubSkill.Rupture.Stat.Extra=Rupture: Duration in seconds: &a{0} vs Players, {1} vs Mobs. Pure Tick Damage: {2} vs Players, {3} vs Mobs. Explosion Damage: {4} vs Players, {5} vs Mobs Swords.Effect.4=Serrated Strikes Rupture+ Swords.Effect.5={0} Tick Rupture Swords.Listener=Swords: From a58a3d91dce388387fa1e8b8a8d7068c73928846 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 2 Apr 2021 12:13:54 -0700 Subject: [PATCH 455/662] tweak locale / command output --- Changelog.txt | 2 ++ .../com/gmail/nossr50/commands/skills/SwordsCommand.java | 9 ++++----- src/main/resources/locale/locale_en_US.properties | 6 ++++-- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 89fef502a..46a178ee0 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -7,6 +7,8 @@ Version 2.1.186 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 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 4ca8749e6..3fbe8726f 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/SwordsCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/SwordsCommand.java @@ -89,11 +89,10 @@ public class SwordsCommand extends SkillCommand { + (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", ruptureChanceToApplyLucky) : "")); messages.add(getStatMessage(true, true, SubSkillType.SWORDS_RUPTURE, ruptureLengthSecondsAgainstPlayers, - ruptureLengthSecondsAgainstMobs, - rupturePureTickDamageAgainstPlayers, - rupturePureTickDamageAgainstMobs, - ruptureExplosionDamageAgainstPlayers, - ruptureExplosionDamageAgainstMobs)); + ruptureLengthSecondsAgainstMobs)); + + 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")); } diff --git a/src/main/resources/locale/locale_en_US.properties b/src/main/resources/locale/locale_en_US.properties index 4e702d860..64aab7ea8 100644 --- a/src/main/resources/locale/locale_en_US.properties +++ b/src/main/resources/locale/locale_en_US.properties @@ -406,7 +406,7 @@ Anvil.Unbreakable=This item is unbreakable! #SWORDS Swords.Ability.Lower=&7You lower your sword. Swords.Ability.Ready=&3You &6ready&3 your Sword. -Swords.Combat.Rupture.Note=&7NOTE: Pure tick damage is dealt twice a second during Rupture and bypasses resistances but IS never lethal, an explosion goes off after 5 seconds with is reduced by armor and other resistances. +Swords.Combat.Rupture.Note=&7(Rupture Note): Periodic damage is dealt twice a second and bypasses armor, explosion damage does not Swords.Combat.Bleeding.Started=&4 You're bleeding! Swords.Combat.Bleeding.Stopped=&7The bleeding has &astopped&7! Swords.Combat.Bleeding=&a**ENEMY BLEEDING** @@ -428,7 +428,9 @@ 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: Duration in seconds: &a{0} vs Players, {1} vs Mobs. Pure Tick Damage: {2} vs Players, {3} vs Mobs. Explosion Damage: {4} vs Players, {5} vs Mobs +Swords.SubSkill.Rupture.Stat.Extra=[[DARK_AQUA]]Rupture Duration: &e{0}&a vs Players, &e{1}&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: From 48afb81174145810961604e5a86aa6cfd0f50629 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 2 Apr 2021 12:16:40 -0700 Subject: [PATCH 456/662] Another locale tweak --- src/main/resources/locale/locale_en_US.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/locale/locale_en_US.properties b/src/main/resources/locale/locale_en_US.properties index 64aab7ea8..7d827f50e 100644 --- a/src/main/resources/locale/locale_en_US.properties +++ b/src/main/resources/locale/locale_en_US.properties @@ -406,7 +406,7 @@ Anvil.Unbreakable=This item is unbreakable! #SWORDS Swords.Ability.Lower=&7You lower your sword. Swords.Ability.Ready=&3You &6ready&3 your Sword. -Swords.Combat.Rupture.Note=&7(Rupture Note): Periodic damage is dealt twice a second and bypasses armor, explosion damage does not +Swords.Combat.Rupture.Note=&7(Rupture Note): Periodic damage is non-lethal occuring twice a second and bypasses armor, explosion damage is lethal and does not bypass armor/resistances Swords.Combat.Bleeding.Started=&4 You're bleeding! Swords.Combat.Bleeding.Stopped=&7The bleeding has &astopped&7! Swords.Combat.Bleeding=&a**ENEMY BLEEDING** @@ -428,7 +428,7 @@ 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=[[DARK_AQUA]]Rupture Duration: &e{0}&a vs Players, &e{1}&a 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+ From 002887e24421c7bd0d130996d74a8a6a5455bb0a Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Sat, 3 Apr 2021 03:47:43 +0200 Subject: [PATCH 457/662] Sanitize ability buffs when using Item Frames (#4475) * Remove skill ability buffs from items when placed into Item Frames * Ensure compatibility on versions before 1.16 --- .../nossr50/listeners/PlayerListener.java | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java index 7a8262600..b8b9153c2 100644 --- a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java @@ -973,6 +973,43 @@ public class PlayerListener implements Listener { } } } + + /** + * 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(); + + // 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); + } + } + // // @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) // public void onPlayerStatisticIncrementEvent(PlayerStatisticIncrementEvent event) { From a2ee4be86a7719d768ccb7bf93af2458ee85b31f Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 2 Apr 2021 20:31:19 -0700 Subject: [PATCH 458/662] Fix some bugs with Rupture and fix a small memory leak --- Changelog.txt | 4 ++- .../commands/skills/MmoInfoCommand.java | 1 - .../commands/skills/SwordsCommand.java | 3 +- .../gmail/nossr50/config/AdvancedConfig.java | 3 -- .../nossr50/listeners/EntityListener.java | 6 +++- .../nossr50/listeners/PlayerListener.java | 1 + src/main/java/com/gmail/nossr50/mcMMO.java | 1 + .../nossr50/runnables/skills/RuptureTask.java | 28 ++++++++----------- .../nossr50/skills/swords/SwordsManager.java | 13 +++++---- .../gmail/nossr50/util/MobHealthbarUtils.java | 2 +- .../nossr50/util/TransientMetadataTools.java | 12 +++++--- .../nossr50/util/skills/CombatUtils.java | 5 ++-- .../util/skills/ParticleEffectUtils.java | 9 +++--- 13 files changed, 44 insertions(+), 44 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 46a178ee0..5d8e8ce0f 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,5 +1,7 @@ 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 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 @@ -27,7 +29,7 @@ Version 2.1.186 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 since your last attack on the target have transpired Rupture "explodes" dealing a large amount of damage, this damage is not pure and is affected by armor etc. + 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 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 0169c3918..e724ee8cd 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/MmoInfoCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/MmoInfoCommand.java @@ -2,7 +2,6 @@ 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.util.Permissions; 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 3fbe8726f..69a5e86ec 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/SwordsCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/SwordsCommand.java @@ -1,7 +1,6 @@ package com.gmail.nossr50.commands.skills; 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.locale.LocaleLoader; @@ -56,7 +55,7 @@ public class SwordsCommand extends SkillCommand { ruptureExplosionDamageAgainstPlayers = String.valueOf(AdvancedConfig.getInstance().getRuptureExplosionDamage(true, ruptureRank)); ruptureExplosionDamageAgainstMobs = String.valueOf(AdvancedConfig.getInstance().getRuptureExplosionDamage(false, ruptureRank)); - ruptureChanceToApply = String.valueOf(AdvancedConfig.getInstance().getRuptureChanceToApplyOnHit(ruptureRank)); + ruptureChanceToApply = String.valueOf(AdvancedConfig.getInstance().getRuptureChanceToApplyOnHit(ruptureRank) + "%"); ruptureChanceToApplyLucky = String.valueOf(AdvancedConfig.getInstance().getRuptureChanceToApplyOnHit(ruptureRank) * 1.33); } diff --git a/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java b/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java index 37784f28e..7e6f8e8a3 100644 --- a/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java +++ b/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java @@ -5,9 +5,6 @@ import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.datatypes.skills.subskills.AbstractSubSkill; import com.gmail.nossr50.mcMMO; import net.md_5.bungee.api.ChatColor; -import org.bukkit.entity.LivingEntity; -import org.bukkit.entity.Player; -import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java index 414bbde52..f01a13d71 100644 --- a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java @@ -489,6 +489,10 @@ public class EntityListener implements Listener { if(WorldBlacklist.isWorldBlacklisted(event.getEntity().getWorld())) return; + if(event.getEntity().hasMetadata(mcMMO.EXPLOSION_FROM_RUPTURE)) { + event.getEntity().removeMetadata(mcMMO.EXPLOSION_FROM_RUPTURE, mcMMO.p); + } + if(event.getEntity() instanceof Player) { Player player = (Player) event.getEntity(); @@ -661,7 +665,7 @@ public class EntityListener implements Listener { */ @EventHandler(priority = EventPriority.LOWEST) public void onEntityDeathLowest(EntityDeathEvent event) { - mcMMO.getTransientMetadataTools().cleanAllMobMetadata(event.getEntity()); + mcMMO.getTransientMetadataTools().cleanAllLivingEntityMetadata(event.getEntity()); } /** diff --git a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java index b8b9153c2..481258b96 100644 --- a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java @@ -546,6 +546,7 @@ public class PlayerListener implements Listener { //Use a sync save if the server is shutting down to avoid race conditions mcMMOPlayer.logout(mcMMO.isServerShutdownExecuted()); + mcMMO.getTransientMetadataTools().cleanAllLivingEntityMetadata(event.getPlayer()); } /** diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index 9e442355b..cdeb9768b 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -125,6 +125,7 @@ public class mcMMO extends JavaPlugin { /* Metadata Values */ public static final String REPLANT_META_KEY = "mcMMO: Recently Replanted"; + public static final String EXPLOSION_FROM_RUPTURE = "mcMMO: Rupture Explosion"; public static final String RUPTURE_META_KEY = "mcMMO: RuptureTask"; public static final String FISH_HOOK_REF_METAKEY = "mcMMO: Fish Hook Tracker"; public static final String DODGE_TRACKER = "mcMMO: Dodge Tracker"; diff --git a/src/main/java/com/gmail/nossr50/runnables/skills/RuptureTask.java b/src/main/java/com/gmail/nossr50/runnables/skills/RuptureTask.java index 4ef254b57..9e4f3ee2b 100644 --- a/src/main/java/com/gmail/nossr50/runnables/skills/RuptureTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/skills/RuptureTask.java @@ -8,6 +8,7 @@ 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.metadata.FixedMetadataValue; import org.bukkit.scheduler.BukkitRunnable; import org.jetbrains.annotations.NotNull; @@ -27,7 +28,7 @@ public class RuptureTask extends BukkitRunnable { public RuptureTask(@NotNull McMMOPlayer ruptureSource, @NotNull LivingEntity targetEntity, double pureTickDamage, double explosionDamage) { this.ruptureSource = ruptureSource; this.targetEntity = targetEntity; - this.expireTick = AdvancedConfig.getInstance().getRuptureDurationSeconds(targetEntity instanceof Player); + this.expireTick = AdvancedConfig.getInstance().getRuptureDurationSeconds(targetEntity instanceof Player) * 20; this.ruptureTick = 0; this.damageTickTracker = 0; @@ -44,12 +45,10 @@ public class RuptureTask extends BukkitRunnable { //Rupture hasn't ended yet if(ruptureTick < expireTick) { - //Is it time to damage? if(damageTickTracker >= DAMAGE_TICK_INTERVAL) { damageTickTracker = 0; //Reset ParticleEffectUtils.playBleedEffect(targetEntity); //Animate - double finalDamage = 0; //Used for mob health bars and setting last damage if(targetEntity.getHealth() > 0.01) { double healthBeforeRuptureIsApplied = targetEntity.getHealth(); @@ -59,21 +58,8 @@ public class RuptureTask extends BukkitRunnable { mcMMO.p.getLogger().severe("DEBUG: Miscalculating Rupture tick damage"); } else { targetEntity.setHealth(damagedHealth); //Hurt entity without the unwanted side effects of damage() - - //TODO: Do we need to set last damage? Double check - finalDamage = healthBeforeRuptureIsApplied - targetEntity.getHealth(); - - if(finalDamage <= 0) { - mcMMO.p.getLogger().severe("DEBUG: Miscalculating final damage for Rupture"); - } else { - //Actually should this even be done? - targetEntity.setLastDamage(finalDamage); - } } } - - //Update Health bars - MobHealthbarUtils.handleMobHealthbars(targetEntity, finalDamage, mcMMO.p); } } else { explode(); @@ -84,8 +70,15 @@ public class RuptureTask extends BukkitRunnable { } } + public void refreshRupture() { + damageTickTracker = DAMAGE_TICK_INTERVAL; + ruptureTick = 0; + } + public void explode() { - ParticleEffectUtils.playBleedEffect(targetEntity); //Animate + 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()); @@ -94,6 +87,7 @@ public class RuptureTask extends BukkitRunnable { } targetEntity.removeMetadata(mcMMO.RUPTURE_META_KEY, mcMMO.p); + this.cancel(); //Task no longer needed } 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 a24ee24e4..66d285934 100644 --- a/src/main/java/com/gmail/nossr50/skills/swords/SwordsManager.java +++ b/src/main/java/com/gmail/nossr50/skills/swords/SwordsManager.java @@ -63,19 +63,20 @@ public class SwordsManager extends SkillManager { * * @param target The defending entity */ - public void processRupture(@NotNull LivingEntity target) throws IllegalStateException { - if(target.hasMetadata(mcMMO.REPLANT_META_KEY)) { + public void processRupture(@NotNull LivingEntity target) { + if(target.hasMetadata(mcMMO.RUPTURE_META_KEY)) { + RuptureTaskMeta ruptureTaskMeta = (RuptureTaskMeta) target.getMetadata(mcMMO.RUPTURE_META_KEY); + if(mmoPlayer.isDebugMode()) { mmoPlayer.getPlayer().sendMessage("Rupture task ongoing for target " + target.toString()); - RuptureTaskMeta ruptureTaskMeta = (RuptureTaskMeta) target.getMetadata(mcMMO.RUPTURE_META_KEY); - RuptureTask ruptureTask = (RuptureTask) target.getMetadata(mcMMO.RUPTURE_META_KEY); - mmoPlayer.getPlayer().sendMessage(ruptureTask.toString()); + mmoPlayer.getPlayer().sendMessage(ruptureTaskMeta.getRuptureTimerTask().toString()); } + ruptureTaskMeta.getRuptureTimerTask().refreshRupture(); return; //Don't apply bleed } - if (RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.SWORDS_RUPTURE, getPlayer())) { + if (RandomChanceUtil.rollDice(AdvancedConfig.getInstance().getRuptureChanceToApplyOnHit(getRuptureRank()), 100)) { if (target instanceof Player) { Player defender = (Player) target; diff --git a/src/main/java/com/gmail/nossr50/util/MobHealthbarUtils.java b/src/main/java/com/gmail/nossr50/util/MobHealthbarUtils.java index 57c7afe92..9c1f6b76e 100644 --- a/src/main/java/com/gmail/nossr50/util/MobHealthbarUtils.java +++ b/src/main/java/com/gmail/nossr50/util/MobHealthbarUtils.java @@ -131,7 +131,7 @@ 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; StringBuilder healthbar = new StringBuilder(color + ""); diff --git a/src/main/java/com/gmail/nossr50/util/TransientMetadataTools.java b/src/main/java/com/gmail/nossr50/util/TransientMetadataTools.java index 6a55c5a43..b32945525 100644 --- a/src/main/java/com/gmail/nossr50/util/TransientMetadataTools.java +++ b/src/main/java/com/gmail/nossr50/util/TransientMetadataTools.java @@ -2,16 +2,17 @@ package com.gmail.nossr50.util; import com.gmail.nossr50.mcMMO; import org.bukkit.entity.LivingEntity; +import org.jetbrains.annotations.NotNull; public class TransientMetadataTools { public static final String OLD_NAME_METAKEY = TransientMetadataTools.OLD_NAME_METAKEY; private final mcMMO pluginRef; - public TransientMetadataTools(mcMMO pluginRef) { + public TransientMetadataTools(@NotNull mcMMO pluginRef) { this.pluginRef = pluginRef; } - public void cleanAllMobMetadata(LivingEntity livingEntity) { + public void cleanAllLivingEntityMetadata(@NotNull LivingEntity livingEntity) { //Since its not written anywhere, apparently the GC won't touch objects with metadata still present on them if (livingEntity.hasMetadata(mcMMO.customNameKey)) { livingEntity.setCustomName(livingEntity.getMetadata(mcMMO.customNameKey).get(0).asString()); @@ -33,10 +34,13 @@ public class TransientMetadataTools { livingEntity.removeMetadata(mcMMO.travelingBlock, pluginRef); } - if(livingEntity.hasMetadata(mcMMO.REPLANT_META_KEY)) { - livingEntity.removeMetadata(mcMMO.REPLANT_META_KEY, pluginRef); + if(livingEntity.hasMetadata(mcMMO.RUPTURE_META_KEY)) { + livingEntity.removeMetadata(mcMMO.RUPTURE_META_KEY, pluginRef); } + if(livingEntity.hasMetadata(mcMMO.EXPLOSION_FROM_RUPTURE)) { + livingEntity.removeMetadata(mcMMO.EXPLOSION_FROM_RUPTURE, pluginRef); + } //Cleanup mob metadata mcMMO.getCompatibilityManager().getPersistentDataLayer().removeMobFlags(livingEntity); 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 f28f6762e..615ad89eb 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java @@ -12,6 +12,7 @@ import com.gmail.nossr50.events.fake.FakeEntityDamageByEntityEvent; import com.gmail.nossr50.events.fake.FakeEntityDamageEvent; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.party.PartyManager; +import com.gmail.nossr50.runnables.skills.AwardCombatXpTask; import com.gmail.nossr50.skills.acrobatics.AcrobaticsManager; import com.gmail.nossr50.skills.archery.ArcheryManager; import com.gmail.nossr50.skills.axes.AxesManager; @@ -40,7 +41,6 @@ import org.bukkit.potion.PotionEffectType; import org.bukkit.projectiles.ProjectileSource; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import com.gmail.nossr50.runnables.skills.AwardCombatXpTask; import java.util.EnumMap; import java.util.HashMap; @@ -93,8 +93,7 @@ public final class CombatUtils { mcMMOPlayer.checkAbilityActivation(PrimarySkillType.SWORDS); } - if(target.getHealth() - event.getFinalDamage() >= 1) - { + if(target.getHealth() - event.getFinalDamage() > 0) { if (swordsManager.canUseRupture()) { swordsManager.processRupture(target); } 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 8d0f75937..f63b5dd83 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/ParticleEffectUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/ParticleEffectUtils.java @@ -1,19 +1,18 @@ 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.*; +import org.bukkit.Effect; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; -import java.util.ArrayList; -import java.util.Arrays; - public final class ParticleEffectUtils { private ParticleEffectUtils() {} From d25784bf4145fb9bc7a8f014cb47a1bfbe35b03c Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 2 Apr 2021 20:33:48 -0700 Subject: [PATCH 459/662] Give XP when sneaking for bushes --- Changelog.txt | 1 + src/main/java/com/gmail/nossr50/listeners/PlayerListener.java | 4 +--- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 5d8e8ce0f..e92404700 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -2,6 +2,7 @@ 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 diff --git a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java index 481258b96..bf4b3faa0 100644 --- a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java @@ -849,9 +849,7 @@ public class PlayerListener implements Listener { } } } else { - if(!event.getPlayer().isSneaking()) { - herbalismManager.processBerryBushHarvesting(blockState); - } + herbalismManager.processBerryBushHarvesting(blockState); } } break; From 3e60dfcf989020951f1905160864eb1579edbbf7 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 2 Apr 2021 20:37:05 -0700 Subject: [PATCH 460/662] 2.1.186 --- Changelog.txt | 3 +++ pom.xml | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index e92404700..6fb6bce10 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -34,6 +34,9 @@ Version 2.1.186 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 diff --git a/pom.xml b/pom.xml index c595513b0..6a7cbf897 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.186-SNAPSHOT + 2.1.186 mcMMO https://github.com/mcMMO-Dev/mcMMO From e8577e4a9e3c045dd87e8115bdd120151d604490 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sat, 3 Apr 2021 09:46:01 -0700 Subject: [PATCH 461/662] Fix ClassCastException for Rupture Fixes #4476 --- Changelog.txt | 3 +++ pom.xml | 2 +- .../java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java | 2 +- .../java/com/gmail/nossr50/skills/swords/SwordsManager.java | 2 +- 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 6fb6bce10..545e4df50 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,6 @@ +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) diff --git a/pom.xml b/pom.xml index 6a7cbf897..4c017cff6 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.186 + 2.1.187-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO 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 94face6c1..ec2ff905d 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java +++ b/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java @@ -1081,7 +1081,7 @@ public class McMMOPlayer implements Identified { public void logout(boolean syncSave) { Player thisPlayer = getPlayer(); if(getPlayer().hasMetadata(mcMMO.RUPTURE_META_KEY)) { - RuptureTaskMeta ruptureTaskMeta = (RuptureTaskMeta) getPlayer().getMetadata(mcMMO.RUPTURE_META_KEY); + RuptureTaskMeta ruptureTaskMeta = (RuptureTaskMeta) getPlayer().getMetadata(mcMMO.RUPTURE_META_KEY).get(0); //Punish a logout ruptureTaskMeta.getRuptureTimerTask().explode(); 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 66d285934..d6d07b62e 100644 --- a/src/main/java/com/gmail/nossr50/skills/swords/SwordsManager.java +++ b/src/main/java/com/gmail/nossr50/skills/swords/SwordsManager.java @@ -65,7 +65,7 @@ public class SwordsManager extends SkillManager { */ public void processRupture(@NotNull LivingEntity target) { if(target.hasMetadata(mcMMO.RUPTURE_META_KEY)) { - RuptureTaskMeta ruptureTaskMeta = (RuptureTaskMeta) target.getMetadata(mcMMO.RUPTURE_META_KEY); + RuptureTaskMeta ruptureTaskMeta = (RuptureTaskMeta) target.getMetadata(mcMMO.RUPTURE_META_KEY).get(0); if(mmoPlayer.isDebugMode()) { mmoPlayer.getPlayer().sendMessage("Rupture task ongoing for target " + target.toString()); From 716272fefcffed9ce039c0a8a43c3efc0ed47bd0 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sat, 3 Apr 2021 09:46:41 -0700 Subject: [PATCH 462/662] 2.1.187 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 4c017cff6..2da80d8f9 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.187-SNAPSHOT + 2.1.187 mcMMO https://github.com/mcMMO-Dev/mcMMO From fe713c9931f4b269be890d51ca61d1cc8a0cde2f Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sat, 3 Apr 2021 09:53:34 -0700 Subject: [PATCH 463/662] dev mode --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 2da80d8f9..a10e1f840 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.187 + 2.1.188-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO From db55635f0dec5eee1bd6dde0c4bc80218446404c Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sun, 4 Apr 2021 18:23:13 -0700 Subject: [PATCH 464/662] Tweak UP warning --- src/main/java/com/gmail/nossr50/mcMMO.java | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index cdeb9768b..7f05b0732 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -148,9 +148,6 @@ public class mcMMO extends JavaPlugin { public static FixedMetadataValue metadataValue; public static final String ULTRA_PERMISSONS = "UltraPermissons"; - public static final String UP_WARNING_2 = "Stop using " + ULTRA_PERMISSONS + " with mcMMO immediately!"; - public static final String UP_WARNING_1 = "mcMMO has detected " + ULTRA_PERMISSONS + " on your server, users have reported a severe plugin conflict between these two plugins which severely degrades server performance"; - public static final String UP_WARNING_3 = "The author of UltraPermissions has passed away and its unlikely this issue will ever be solved"; public mcMMO() { p = this; @@ -271,15 +268,7 @@ public class mcMMO extends JavaPlugin { } if(pluginManager.getPlugin(ULTRA_PERMISSONS) != null) { - Bukkit.getScheduler().runTaskTimer(this, () -> { - getLogger().severe(UP_WARNING_1); - getLogger().severe(UP_WARNING_2); - getLogger().severe(UP_WARNING_3); - - Bukkit.broadcastMessage(UP_WARNING_1); - Bukkit.broadcastMessage(UP_WARNING_2); - Bukkit.broadcastMessage(UP_WARNING_3); - }, 0L, 1200L); + getLogger().info("mcMMO has detected UltraPermissions is running, make sure to keep both mcMMO and UltraPermissions updated as older versions of UltraPermissions had performance degradation issues when used in conjunction with mcMMO"); } } From 3b7f416ed99b281436713ecf1a0a6feb072e0f26 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 5 Apr 2021 12:39:49 -0700 Subject: [PATCH 465/662] Up default ShakeChance and remove useless entries --- Changelog.txt | 6 ++++++ src/main/resources/advanced.yml | 9 +-------- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 545e4df50..b3306a5f5 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,5 +1,11 @@ Version 2.1.187 Fixed a ClassCastException error involving Rupture + 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, these entries were a mistake) + Modified the warning about UltraPermissions + + NOTES: + The latest versions of UltraPermissions should play nicely with mcMMO, but older versions do not. Make sure to update UltraPermissions. Version 2.1.186 Rupture has been reworked to solve a few outstanding issues (see notes) diff --git a/src/main/resources/advanced.yml b/src/main/resources/advanced.yml index 2bf6ebf2f..2ff9795d4 100644 --- a/src/main/resources/advanced.yml +++ b/src/main/resources/advanced.yml @@ -206,14 +206,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: From c5f46665250ca56d8f574747625a97fe243768e1 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 5 Apr 2021 12:47:03 -0700 Subject: [PATCH 466/662] Fixing Shake showing the wrong chance to succeed --- Changelog.txt | 1 + .../java/com/gmail/nossr50/skills/fishing/FishingManager.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index b3306a5f5..30e41741c 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,5 +1,6 @@ Version 2.1.187 Fixed a ClassCastException error involving Rupture + 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, these entries were a mistake) Modified the warning about UltraPermissions 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 b64de6a37..22f8eecc7 100644 --- a/src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java @@ -198,7 +198,7 @@ public class FishingManager extends SkillManager { } public double getShakeChance() { - return AdvancedConfig.getInstance().getShakeChance(getLootTier()); + return AdvancedConfig.getInstance().getShakeChance(RankUtils.getRank(mmoPlayer.getPlayer(), SubSkillType.FISHING_SHAKE)); } protected int getVanillaXPBoostModifier() { From 2d11b7befcdb3b3125c2aab22b05a12306812e90 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 5 Apr 2021 13:41:37 -0700 Subject: [PATCH 467/662] Fixed treasures only requiring level 0 --- Changelog.txt | 9 +- .../config/treasure/TreasureConfig.java | 117 +++++++++++++----- src/main/resources/treasures.yml | 62 +++++----- 3 files changed, 126 insertions(+), 62 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 30e41741c..8811d09a8 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,13 +1,18 @@ -Version 2.1.187 - Fixed a ClassCastException error involving Rupture +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, these entries were a mistake) Modified the warning about UltraPermissions NOTES: + This update makes changes to treasures.yml automatically to apply the fix, you don't need to do anything The latest versions of UltraPermissions should play nicely with mcMMO, but older versions do not. Make sure to update UltraPermissions. +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) 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 1dd4a7217..eb9030d71 100755 --- a/src/main/java/com/gmail/nossr50/config/treasure/TreasureConfig.java +++ b/src/main/java/com/gmail/nossr50/config/treasure/TreasureConfig.java @@ -25,8 +25,10 @@ public class TreasureConfig extends ConfigLoader { 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 LEVEL_REQUIREMENT_INVALID = ".Level_Requirement.Standard"; + 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<>(); @@ -66,7 +68,7 @@ public class TreasureConfig extends ConfigLoader { } private void loadTreasures(String type) { - boolean updatedFile = false; + boolean shouldWeUpdateFile = false; boolean isExcavation = type.equals("Excavation"); boolean isHylian = type.equals("Hylian_Luck"); @@ -110,38 +112,38 @@ public class TreasureConfig extends ConfigLoader { int xp = config.getInt(type + "." + treasureName + ".XP"); double dropChance = config.getDouble(type + "." + treasureName + ".Drop_Chance"); - int legacyDropLevel = config.getInt(type + "." + treasureName + LEGACY_DROP_LEVEL, -1); + 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; - int badDefaults = config.getInt(type + "." + treasureName + LEVEL_REQUIREMENT_INVALID, -1); - - //Hacky fix for bad keys in treasures.yml defaults - if(badDefaults != -1) { - config.set(type + "." + treasureName + LEVEL_REQUIREMENT_INVALID, null); - config.set(type + "." + treasureName + LEVEL_REQUIREMENT_STANDARD_MODE, badDefaults); - updatedFile = true; - } - - - if(legacyDropLevel >= 0) { - //Config needs to be updated to be more specific - mcMMO.p.getLogger().info("(" + treasureName + ") Updating Drop_Level in treasures.yml for treasure to match new expected format"); - config.set(type + "." + treasureName + LEGACY_DROP_LEVEL, null); - config.set(type + "." + treasureName + LEVEL_REQUIREMENT_RETRO_MODE, legacyDropLevel * 10); - config.set(type + "." + treasureName + LEVEL_REQUIREMENT_STANDARD_MODE, legacyDropLevel); - updatedFile = true; - } - if(mcMMO.isRetroModeEnabled()) { - dropLevel = config.getInt(type + "." + treasureName + LEVEL_REQUIREMENT_RETRO_MODE, 0); + dropLevel = config.getInt(type + "." + treasureName + LEVEL_REQUIREMENT_RETRO_MODE, -1); } else { - dropLevel = config.getInt(type + "." + treasureName + LEVEL_REQUIREMENT_STANDARD_MODE, 0); + dropLevel = config.getInt(type + "." + treasureName + LEVEL_REQUIREMENT_STANDARD_MODE, -1); } - if(dropLevel < 0) { - mcMMO.p.getLogger().info("Treasure drop level wasn't valid, using a default value."); - //Set it to the "max" if we don't have a drop level - dropLevel = 0; + 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) { @@ -256,7 +258,7 @@ public class TreasureConfig extends ConfigLoader { } //Apply our fix - if(updatedFile) { + if(shouldWeUpdateFile) { try { config.save(getFile()); } catch (IOException e) { @@ -265,6 +267,63 @@ public class TreasureConfig extends ConfigLoader { } } + 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) { + switch (dropLevelKeyConversionType) { + case LEGACY: + return config.getInt(type + "." + treasureName + LEGACY_DROP_LEVEL, -1); + case WRONG_KEY_STANDARD: + return config.getInt(type + "." + treasureName + WRONG_KEY_VALUE_STANDARD, -1); + case WRONG_KEY_RETRO: + return config.getInt(type + "." + treasureName + WRONG_KEY_VALUE_RETRO, -1); + } + + return -1; + } + + private enum DropLevelKeyConversionType { + LEGACY, + WRONG_KEY_STANDARD, + WRONG_KEY_RETRO + } + private void AddHylianTreasure(String dropper, HylianTreasure treasure) { if (!hylianMap.containsKey(dropper)) hylianMap.put(dropper, new ArrayList<>()); diff --git a/src/main/resources/treasures.yml b/src/main/resources/treasures.yml index 22203b508..ad3ae1464 100755 --- a/src/main/resources/treasures.yml +++ b/src/main/resources/treasures.yml @@ -6,7 +6,7 @@ Excavation: Amount: 1 XP: 3000 Drop_Chance: 0.05 - Drop_Level: + 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] @@ -14,7 +14,7 @@ Excavation: Amount: 1 XP: 30 Drop_Chance: 10.0 - Drop_Level: + Level_Requirement: Standard_Mode: 10 Retro_Mode: 1000 Drops_From: [Gravel] @@ -22,7 +22,7 @@ Excavation: Amount: 1 XP: 30 Drop_Chance: 10.0 - Drop_Level: + Level_Requirement: Standard_Mode: 20 Retro_Mode: 200 Drops_From: [Gravel] @@ -30,7 +30,7 @@ Excavation: Amount: 1 XP: 100 Drop_Chance: 0.1 - Drop_Level: + Level_Requirement: Standard_Mode: 25 Retro_Mode: 250 Drops_From: [Grass_Block, Mycelium] @@ -38,7 +38,7 @@ Excavation: Amount: 1 XP: 100 Drop_Chance: 5.0 - Drop_Level: + Level_Requirement: Standard_Mode: 15 Retro_Mode: 150 Drops_From: [Clay] @@ -46,7 +46,7 @@ Excavation: Amount: 1 XP: 100 Drop_Chance: 0.1 - Drop_Level: + Level_Requirement: Standard_Mode: 50 Retro_Mode: 500 Drops_From: [Clay] @@ -54,7 +54,7 @@ Excavation: Amount: 1 XP: 30 Drop_Chance: 0.5 - Drop_Level: + Level_Requirement: Standard_Mode: 85 Retro_Mode: 850 Drops_From: [Gravel] @@ -62,7 +62,7 @@ Excavation: Amount: 1 XP: 80 Drop_Chance: 0.5 - Drop_Level: + Level_Requirement: Standard_Mode: 50 Retro_Mode: 500 Drops_From: [Dirt, Coarse_Dirt, Podzol, Grass_Block, Mycelium] @@ -70,7 +70,7 @@ Excavation: Amount: 1 XP: 80 Drop_Chance: 0.5 - Drop_Level: + Level_Requirement: Standard_Mode: 50 Retro_Mode: 500 Drops_From: [Dirt, Coarse_Dirt, Podzol, Grass_Block, Mycelium] @@ -78,7 +78,7 @@ Excavation: Amount: 1 XP: 100 Drop_Chance: 1.0 - Drop_Level: + Level_Requirement: Standard_Mode: 25 Retro_Mode: 250 Drops_From: [Grass_Block] @@ -86,7 +86,7 @@ Excavation: Amount: 1 XP: 80 Drop_Chance: 0.5 - Drop_Level: + Level_Requirement: Standard_Mode: 65 Retro_Mode: 650 Drops_From: [Sand, Red_Sand] @@ -94,7 +94,7 @@ Excavation: Amount: 1 XP: 100 Drop_Chance: 0.1 - Drop_Level: + Level_Requirement: Standard_Mode: 50 Retro_Mode: 500 Drops_From: [Clay] @@ -102,7 +102,7 @@ Excavation: Amount: 1 XP: 150 Drop_Chance: 5.0 - Drop_Level: + Level_Requirement: Standard_Mode: 75 Retro_Mode: 750 Drops_From: [Clay] @@ -110,7 +110,7 @@ Excavation: Amount: 1 XP: 200 Drop_Chance: 5.0 - Drop_Level: + Level_Requirement: Standard_Mode: 25 Retro_Mode: 250 Drops_From: [Clay] @@ -118,7 +118,7 @@ Excavation: Amount: 1 XP: 80 Drop_Chance: 5.0 - Drop_Level: + Level_Requirement: Standard_Mode: 5 Retro_Mode: 50 Drops_From: [Dirt, Coarse_Dirt, Podzol, Grass_Block, Sand, Red_Sand, Mycelium] @@ -126,7 +126,7 @@ Excavation: Amount: 1 XP: 3000 Drop_Chance: 0.05 - Drop_Level: + 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] @@ -134,7 +134,7 @@ Excavation: Amount: 1 XP: 3000 Drop_Chance: 0.05 - Drop_Level: + 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] @@ -142,7 +142,7 @@ Excavation: Amount: 1 XP: 1000 Drop_Chance: 0.13 - Drop_Level: + 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] @@ -150,7 +150,7 @@ Excavation: Amount: 1 XP: 100 Drop_Chance: 1.33 - Drop_Level: + Level_Requirement: Standard_Mode: 35 Retro_Mode: 350 Drops_From: [Dirt, Coarse_Dirt, Podzol, Grass_Block, Mycelium] @@ -158,7 +158,7 @@ Excavation: Amount: 1 XP: 100 Drop_Chance: 0.5 - Drop_Level: + 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] @@ -166,20 +166,20 @@ Excavation: Amount: 1 XP: 3000 Drop_Chance: 0.05 - Drop_Level: + 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: + Level_Requirement: Standard_Mode: 0 Retro_Mode: 0 Drops_From: [Bushes] @@ -187,7 +187,7 @@ Hylian_Luck: Amount: 1 XP: 0 Drop_Chance: 100.0 - Drop_Level: + Level_Requirement: Standard_Mode: 0 Retro_Mode: 0 Drops_From: [Bushes] @@ -195,7 +195,7 @@ Hylian_Luck: Amount: 1 XP: 0 Drop_Chance: 100.0 - Drop_Level: + Level_Requirement: Standard_Mode: 0 Retro_Mode: 0 Drops_From: [Bushes] @@ -203,7 +203,7 @@ Hylian_Luck: Amount: 1 XP: 0 Drop_Chance: 100.0 - Drop_Level: + Level_Requirement: Standard_Mode: 0 Retro_Mode: 0 Drops_From: [Flowers] @@ -211,7 +211,7 @@ Hylian_Luck: Amount: 1 XP: 0 Drop_Chance: 100.0 - Drop_Level: + Level_Requirement: Standard_Mode: 0 Retro_Mode: 0 Drops_From: [Flowers] @@ -219,7 +219,7 @@ Hylian_Luck: Amount: 1 XP: 0 Drop_Chance: 100.0 - Drop_Level: + Level_Requirement: Standard_Mode: 0 Retro_Mode: 0 Drops_From: [Flowers] @@ -227,7 +227,7 @@ Hylian_Luck: Amount: 1 XP: 0 Drop_Chance: 100.0 - Drop_Level: + Level_Requirement: Standard_Mode: 0 Retro_Mode: 0 Drops_From: [Pots] @@ -235,7 +235,7 @@ Hylian_Luck: Amount: 1 XP: 0 Drop_Chance: 100.0 - Drop_Level: + Level_Requirement: Standard_Mode: 0 Retro_Mode: 0 Drops_From: [Pots] @@ -243,7 +243,7 @@ Hylian_Luck: Amount: 1 XP: 0 Drop_Chance: 100.0 - Drop_Level: + Level_Requirement: Standard_Mode: 0 Retro_Mode: 0 Drops_From: [Pots] \ No newline at end of file From 4c237b2e9c687ff2d3e576e91130f28523619fa4 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 5 Apr 2021 13:50:27 -0700 Subject: [PATCH 468/662] Tweak UP msg, remove debug msg about unused keys --- Changelog.txt | 3 ++- .../gmail/nossr50/config/AutoUpdateConfigLoader.java | 10 +++++----- src/main/java/com/gmail/nossr50/mcMMO.java | 4 +++- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 8811d09a8..187e97474 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -3,8 +3,9 @@ Version 2.1.188 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, these entries were a mistake) + 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 diff --git a/src/main/java/com/gmail/nossr50/config/AutoUpdateConfigLoader.java b/src/main/java/com/gmail/nossr50/config/AutoUpdateConfigLoader.java index 63189aea2..831dcf144 100644 --- a/src/main/java/com/gmail/nossr50/config/AutoUpdateConfigLoader.java +++ b/src/main/java/com/gmail/nossr50/config/AutoUpdateConfigLoader.java @@ -53,11 +53,11 @@ public abstract class AutoUpdateConfigLoader extends ConfigLoader { if (!newKeys.isEmpty() || !oldKeys.isEmpty()) { needSave = true; } - - for (String key : oldKeys) { - plugin.debug("Detected potentially unused key: " + key); - //config.set(key, null); - } +// +// 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)); diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index 7f05b0732..21a393f7d 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -268,7 +268,9 @@ public class mcMMO extends JavaPlugin { } if(pluginManager.getPlugin(ULTRA_PERMISSONS) != null) { - getLogger().info("mcMMO has detected UltraPermissions is running, make sure to keep both mcMMO and UltraPermissions updated as older versions of UltraPermissions had performance degradation issues when used in conjunction with mcMMO"); + Bukkit.getScheduler().runTaskLater(this, () -> { + getLogger().severe("mcMMO and UltraPermissions have a severe conflict resulting in extreme server performance degradation, an update will be available soon (according to the UltraPermission devs) that will fix this issue. For now it is not advised to use these plugins at the same time. It is advised that you keep mcMMO and UltraPermission up to date."); + }, 20); } } From 2db7d832163d73c6c62e964ee1f8511a8693a292 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 5 Apr 2021 13:50:59 -0700 Subject: [PATCH 469/662] 2.1.188 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a10e1f840..a4566da14 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.188-SNAPSHOT + 2.1.188 mcMMO https://github.com/mcMMO-Dev/mcMMO From eb8af696058b42f9434e51101839728f2b9ba6cf Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 5 Apr 2021 13:56:16 -0700 Subject: [PATCH 470/662] Update changelog --- Changelog.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index 187e97474..fab94830a 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -9,7 +9,7 @@ Version 2.1.188 NOTES: This update makes changes to treasures.yml automatically to apply the fix, you don't need to do anything - The latest versions of UltraPermissions should play nicely with mcMMO, but older versions do not. Make sure to update UltraPermissions. + UltraPermissions devs are working on a fix for the performance issue bug Version 2.1.187 Fixed a ClassCastException error involving Rupture From c526208da4f08c289a9e666812e04451ae78f9a4 Mon Sep 17 00:00:00 2001 From: TheSummerGrinch <66258844+TheSummerGrinch@users.noreply.github.com> Date: Tue, 6 Apr 2021 00:50:14 +0200 Subject: [PATCH 471/662] Various improvements to grammar and consistency. (#4479) --- .../resources/locale/locale_nl.properties | 70 +++++++++---------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/src/main/resources/locale/locale_nl.properties b/src/main/resources/locale/locale_nl.properties index e446f7162..23150baba 100644 --- a/src/main/resources/locale/locale_nl.properties +++ b/src/main/resources/locale/locale_nl.properties @@ -1,8 +1,8 @@ -Acrobatics.Ability.Proc=&a**VeiligeLanding** +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: &e{0} @@ -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=&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=Kritische Klap +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: &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 @@ -69,7 +69,7 @@ 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.IceFishing.Name=Ijs Vissen Fishing.SubSkill.IceFishing.Description=Stelt je in staat om te vissen in de ijzige biomen @@ -84,7 +84,7 @@ 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 @@ -110,7 +110,7 @@ Mining.SkillName=MIJNBOUW Mining.Skills.SuperBreaker.Off= ** Super Breaker is uitgewerkt ** 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 toegenomen met {0}. Totaal: ({1}) +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}) @@ -127,18 +127,18 @@ 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=&4Je 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=&4Je bent nog niet sterk genoeg om diamant te repareren. -Repair.Skills.AdeptGold=&4Je bent niet goed genoeg om goud 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 sterk genoeg om steen 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}) @@ -164,9 +164,9 @@ 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.Off=**Gekartelde Slag is uitgewerkt** Swords.Skills.SS.On=&a**GEKARTELDE SLAG GEACTIVEERD** -Swords.Skills.SS.Refresh=&aJe &eGekarteld Slag &a kracht is hersteld! +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}) @@ -180,13 +180,13 @@ 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=&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 @@ -266,17 +266,17 @@ Commands.mmoedit.Modified.2={0} is aangepast voor {1}. 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.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 groep uitnodiging +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 groep uitnodiging ontvangen voor {0} van {1} +Commands.Party.Invite.0=ALERT: &aJij hebt een groepsuitnodiging ontvangen voor {0} van {1} Commands.Party.Invite=- Verstuur groepsuitnodiging Commands.Party.Join=&7heeft zich aangesloten bij de groep: {0} Commands.Party.Create=&7Groep aangemaakt: {0} @@ -286,21 +286,21 @@ 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=-----[]&aLEDEN&c[]----- -Commands.Party.None=Je bent niet in een groep. +Commands.Party.None=Je zit niet in een groep. Commands.Party.Quit=- Verlaat je huidige groep -Commands.Party.Teleport= &c- 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.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 &9{0}&e Ranglijst -- -Commands.Stats.Self=Je status -Commands.Stats=- Laat je mcMMO statussen zien +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 @@ -309,8 +309,8 @@ Commands.Usage.Password=wachtwoord Commands.Usage.Player=speler Commands.Usage.Skill=Niveau Commands.Usage.XP=xp -mcMMO.NoPermission=&4Te wijning permissions. -mcMMO.NoSkillNote=&8als 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 &3{0} [password]. Party.Help.10=Gebruik &3{0} &com XP delen met groepsleden te activeren @@ -321,9 +321,9 @@ 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=&4{0} zit niet in jou groep +Party.NotInYourParty=&4{0} zit niet in jouw groep Party.NotOwner=&4Jij bent niet de groepsleider. -Party.Owner.New=&a{0} is de nieuwe groep leider. +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. @@ -337,8 +337,8 @@ 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=&a Je hebt geteleporteerd naar {0}. -Party.Teleport.Target=&a{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! @@ -373,7 +373,7 @@ 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=&6XP EVENEMENT VOOR MCMMO IS BEGONNEN! XPRate.Event=&6mcMMO is momenteel in een XP verdubbeling evenement! XP verdubbeling is {0}x! @@ -383,7 +383,7 @@ 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 &e{0} Inspect.Stats=&amcMMO Statistieken voor &e{0} @@ -392,8 +392,8 @@ Item.ChimaeraWing.Fail=**CHIMAERA VLEUGEL MISLUKT** Item.ChimaeraWing.Pass=**CHIMAERA VLEUGEL** Item.ChimaeraWing.Name=Chimaera Vleugel Item.ChimaeraWing.Lore=&7 Teleporteert je naar je bed. -Item.Injured.Wait=Je bent recent gewond geraakt en je moet wachter om dit te gebruiken. &e({0}s) -Teleport.Commencing=&7Teleport poging in &6({0}) &7seconden, Sta stil AUB... +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) From 44c820089c9c1785ca25f22e5fe4e916ef525ca1 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 6 Apr 2021 14:48:53 -0700 Subject: [PATCH 472/662] remove UP warning --- src/main/java/com/gmail/nossr50/mcMMO.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index 21a393f7d..99d7a461f 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -266,12 +266,6 @@ public class mcMMO extends JavaPlugin { else metrics.addCustomChart(new SimplePie("leveling_system", () -> "Standard")); } - - if(pluginManager.getPlugin(ULTRA_PERMISSONS) != null) { - Bukkit.getScheduler().runTaskLater(this, () -> { - getLogger().severe("mcMMO and UltraPermissions have a severe conflict resulting in extreme server performance degradation, an update will be available soon (according to the UltraPermission devs) that will fix this issue. For now it is not advised to use these plugins at the same time. It is advised that you keep mcMMO and UltraPermission up to date."); - }, 20); - } } catch (Throwable t) { From ef48fbee8927601ddb5881565d7bfa268d1df170 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 6 Apr 2021 15:01:51 -0700 Subject: [PATCH 473/662] dev mode + update changelog --- Changelog.txt | 14 ++++++++++++++ pom.xml | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index fab94830a..214066e89 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,17 @@ +Version 2.1.189 + Removed UP warning + + NOTES: + Ultra Permissions is SAFE to use with mcMMO + 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. + + UltraPermissions is as efficient as LuckPerms + I have done a lot of profiling of UltraPermissions via Spark in the last few hours, I also compared it to LuckPerms. I wasn't expecting it, but UltraPermissions runs just as fast as LuckPerms if not faster. So it has no performance issues whatsoever from my point of view. + + Use whatever permission plugin you like, there will be no difference between using LuckPerms or UltraPermissions with mcMMO. + + If you had issues with UltraPermissions please contact the UP devs + If you experience lag with mcMMO and UltraPermissions, we are trying to determine the culprit. It is likely the culprit is from another plugin doing bad things with the UltraPermissions API. Please get in contact with the UltraPermission devs if you run into issues ( @MATRIX | Timo K. & @Liz3 ). Neither I nor they can replicate it so we need you guys to provide more data. 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 diff --git a/pom.xml b/pom.xml index a4566da14..577fc927d 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.188 + 2.1.189-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO From 6336101992e5441fd1d74d55297406a9ea8841e5 Mon Sep 17 00:00:00 2001 From: Mich3l3k <47540709+Mich3l3k@users.noreply.github.com> Date: Thu, 8 Apr 2021 01:10:50 +0200 Subject: [PATCH 474/662] Update locale_pl.properties (#4470) You're welcome :D I will translate Guides soon --- .../resources/locale/locale_pl.properties | 1678 +++++++++++------ 1 file changed, 1121 insertions(+), 557 deletions(-) diff --git a/src/main/resources/locale/locale_pl.properties b/src/main/resources/locale/locale_pl.properties index dda260bdf..4cbc5109c 100644 --- a/src/main/resources/locale/locale_pl.properties +++ b/src/main/resources/locale/locale_pl.properties @@ -1,577 +1,1141 @@ -Acrobatics.Ability.Proc=&a**Mi\u0119kkie L\u0105dowanie** -Acrobatics.Combat.Proc=&a**Unikni\u0119to** -Acrobatics.DodgeChance=Szansa na Unik: &e{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: &e{0} -Acrobatics.SubSkill.Roll.GraceChance=Szansa na \u0141agodny Przewr\u00f3t: &e{0} -Acrobatics.Roll.Text=**Przewr\u00f3t** -Acrobatics.SkillName=AKROBATYKA -Acrobatics.Skillup=Umiejetnosc akrobatyka wzrosla o {0}. Razem ({1}) -Archery.Combat.DazeChance=Szansa na Oszolomienie: &e{0} -Archery.Combat.RetrieveChance=Szansa na Odzyskanie Strza\u0142: &e{0} -Archery.Combat.SkillshotBonus=Dodatkowe Obra\u017cenia dla Umiej\u0119tno\u015bci: &e{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=&7**CHOWASZ SIEKIERE** -Axes.Ability.Ready=&a**PRZYGOTOWUJESZ SWOJ\u0104 SIEKIERE** -Axes.Combat.CritStruck=&4Trafiono cie krytycznie! -Axes.Combat.CritChance=Szansa na Trafienie Krytyczne: &e{0} -Axes.Combat.CriticalHit=TRAFIENIE KRYTYCZNE! -Axes.Combat.GI.Proc=&a**UDERZONO Z WIELK\u0104 MOC\u0104** -Axes.Combat.GI.Struck=TRAFIENIE KRYTYCZNE! -Axes.Combat.SS.Length=D\u0142ugo\u015bc \u0141amacza Czaszki: &e{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=&a**\u0141amacz Czaszek AKTYWOWANY** -Axes.Skills.SS.Refresh=&aTwoja zdolno\u015b\u0107 &e\u0141amacz Czaszek &ajest ju\u017c dost\u0119pna! -Axes.Skills.SS.Other.Off=\u0141amacz Czaszek&a si\u0119 sko\u0144czy\u0142 &e{0} -Axes.Skills.SS.Other.On=&a{0}&2 u\u017cy\u0142 &c\u0141amacza Czaszki! -Axes.Skillup=Umiej\u0119tno\u015b\u0107 \u015bcinania wzros\u0142a o {0}. Razem ({1}) -Excavation.Ability.Lower=&7**CHOWASZ \u0141OPAT\u0118** -Excavation.Ability.Ready=&a**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: &e{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=&a**MIA\u017bDZ\u0104CE WIERT\u0141O AKTYWOWANE** -Excavation.Skills.GigaDrillBreaker.Refresh=&aTwoja zdolno\u015b\u0107 &eMia\u017cdz\u0105ce Wiert\u0142o &ajest ju\u017c dost\u0119pna! -Excavation.Skills.GigaDrillBreaker.Other.Off=Mia\u017cdz\u0105ce Wiert\u0142o&a si\u0119 sko\u0144czy\u0142o &e{0} -Excavation.Skills.GigaDrillBreaker.Other.On=&a{0}&2 u\u017cy\u0142 &cMia\u017cdz\u0105ce Wiert\u0142o! -Excavation.Skillup=Umiej\u0119tno\u015b\u0107 wykopalisk wzros\u0142a o {0}. Razem({1}) -Fishing.Ability.Chance=Szansa na zlapanie ryby: &e{0} -Fishing.Ability.Info=Magiczny \u0141owca: &7 **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: &e{0}/5 -Fishing.Ability.TH.MagicRate=Szanse na Magicznego \u0141owc\u0119: &e{0} -Fishing.Ability.Shake=Szansa na Wstrz\u0105s: &e{0} -Fishing.Ability.IceFishing=Lodowe lowienie ryb: Idz lowic ryby w lodzie -Fishing.Ability.FD=Dieta Rybaka: &eRanga {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.IceFishing.Name=Lodowe lowienie ryb -Fishing.SubSkill.IceFishing.Description=Pozwala na lowienie ryb w zimowych biomach -Fishing.Chance.Raining=&9 Bonus od Deszczu -Fishing.Listener=Rybactwo -Fishing.Ability.TH.MagicFound=&7Wyczuwasz 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: &e{0} -Herbalism.Ability.FD=Dieta Farmera: &ePoziom {0} -Herbalism.Ability.GTe.Length=D\u0142ugo\u015b\u0107 ?Green Terra?: &e{0}s -Herbalism.Ability.GTe.NeedMore=Potrzebujesz wi\u0119cej nasion aby u\u017cy\u0107 Zielonego \u017bycia. -Herbalism.Ability.GTh.Chance=Szansa na Zielony Palec: &e{0} -Herbalism.Ability.GTh.Fail=&a**ZIELONY PALEC SI\u0118 NIE UDA\u0141** -Herbalism.Ability.GTh.Stage=Etap Zielonego Dotyku: &e Ro\u015bliny rosn\u0105 w etapie {0} -Herbalism.Ability.GTh=&a**ZIELONY PALEC** -Herbalism.Ability.HylianLuck=Szansa na Szczescie Hylian: &e{0} -Herbalism.Ability.Lower=&7**CHOWASZ SWOJ\u0104 MOTYKE** -Herbalism.Ability.Ready=&a**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=&aSzczescie Hyrule jest dzisiaj z Toba! -Herbalism.Listener=Zielarstwo -Herbalism.SkillName=ZIELARSTWO -Herbalism.Skills.GTe.On=&a**?GREEN TERRA? AKTYWOWANA** -Herbalism.Skills.GTe.Refresh=&aTwoja zdolno\u015b\u0107 &e?Green Terra?&ajest ju\u017c gotowa! -Herbalism.Skills.GTe.Other.Off=?Green Terra?&a si\u0119 sko\u0144czy\u0142o &e{0} -Herbalism.Skills.GTe.Other.On=&a{0}&2 u\u017cy\u0142 &c?Green Terra?! -Herbalism.Skillup=Umiej\u0119tno\u015b\u0107 zielarstwa wzros\u0142a o {0}. Ca\u0142kowicie ({1}) -Mining.Ability.Length=D\u0142ugo\u015bc Super Kopacza: &e{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=&7**CHOWASZ SW\u00d3J KILOF** -Mining.Ability.Ready=&a**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: &e{0} -Mining.Effect.DropChance=Szansa na Podw\u00f3jny Drop: &e{0} -Mining.Listener=G\u00f3rnictwo -Mining.SkillName=GORNICTWO -Mining.Skills.SuperBreaker.Off=**Super \u0141amacz si\u0119 sko\u0144czy\u0142** -Mining.Skills.SuperBreaker.On=&a**SUPER \u0141AMACZ AKTYWOWANY** -Mining.Skills.SuperBreaker.Other.Off=Super Kopacz&a si\u0119 sko\u0144czy\u0142 &e{0} -Mining.Skills.SuperBreaker.Other.On=&a{0}&2 u\u017cy\u0142 &cSuper Kopacza! -Mining.Skills.SuperBreaker.Refresh=&aTwoja zdolno\u015b\u0107 &eSuper \u0141amacz &ajest ju\u017c dost\u0119pna! -Mining.Skillup=Umiejetnosc Gornictwa wzrosla o {0}. Calkowicie ({1}) -Mining.Blast.Boom=&7**BOOM** -Mining.Blast.Radius.Increase=Zasi\u0119g zwi\u0119kszony o: &e+{0} -Mining.Blast.Rank=Szybki Kopacz: &e Ranga {0}/8 &7({1}) -Mining.Blast.Other.On=&a{0}&2 u\u017cy\u0142 &cSzybkiego Kopacza! -Mining.Blast.Refresh=&aTwoja zdolno\u015b\u0107 &eB\u0142yskawiczny Kopacz &ajest 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=&4mcMMO napotka\u0142 problem pr\u00f3buj\u0105c naprawi\u0107 ten przedmiot! -Repair.Listener.Anvil=&4Postawi\u0142e\u015b kowad\u0142o - kowad\u0142a s\u0142u\u017c\u0105 do naprawiania narz\u0119dzi i zbroi. -Repair.Listener.Anvil2=&4Postawi\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=&4Nie masz odpowiedniego poziomu aby Odzyskiwa\u0107 przedmioty. -Repair.Skills.AdeptDiamond=&4Masz za niski poziom aby naprawia\u0107 diament. -Repair.Skills.AdeptGold=&4Masz za niski poziom aby naprawia\u0107 z\u0142oto. -Repair.Skills.AdeptIron=&4Masz za niski poziom aby naprawia\u0107 \u017celazo. -Repair.Skills.AdeptStone=&4Masz za niski poziom aby naprawi\u0107 kamie\u0144. -Repair.Skills.Adept=Musisz mie\u0107 &e{0}&c poziom \u017ceby naprawi\u0107 &e{1} -Repair.Skills.FeltEasy=&7Bu\u0142ka z mas\u0142em. -Repair.Skills.FullDurability=&7Ten przedmiot jest ju\u017c w pe\u0142ni sprawny. -Repair.Skills.SalvageSuccess=&7Przedmiot Odzyskany! -Repair.Skills.NotFullDurability=&4Nie mo\u017cesz odzyska\u0107 uszkodzonych przedmiot\u00f3w. -Repair.Skills.Mastery=Mistrzostwo Napraw: &e {0} dodatkowej wytrzyma\u0142o\u015bci dla przedmiot\u00f3w -Repair.Skills.StackedItems=&4Nie mo\u017cesz naprawia\u0107 zestackowanych przedmiot\u00f3w. -Repair.Skills.Super.Chance=Szansa Super Naprawy: &e{0} -Repair.Skillup=Umiejetnosc naprawiania wzrosla o {0}. Razem ({1}) -Repair.Pretty.Name=Naprawa -Salvage.Pretty.Name=Przetapianie -Repair.Arcane.Chance.Downgrade=&7AF Szansa na zdegradowanie: &e{0}% -Repair.Arcane.Chance.Success=&7AF Szanse na sukces: &e{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=&aNasyci\u0142e\u015b ten przedmiot magiczn\u0105 moc\u0105. -Repair.Arcane.Rank=Kowalstwo Ezoteryczne: &eRanga {0}/4 -Swords.Ability.Lower=&7**CHOWASZ SW\u00d3J MIECZ** -Swords.Ability.Ready=&a **PODNIOSLES SWOJ MIECZ** -Swords.Combat.Bleed.Chance=Szansa na Krwawienie: &e{0} -Swords.Combat.Bleed.Length=D\u0142ugo\u015bc Krwotoku: &e{0} ticks -Swords.Combat.Bleed.Note=&7NOTE: &e1 tykni\u0119cie zdarza si\u0119 co 2 sekundy -Swords.Combat.Bleeding.Started=&4 Krwawisz! -Swords.Combat.Bleeding.Stopped=&7Krwawienie &austa\u0142o&7! -Swords.Combat.Bleeding=&a**PRZECIWNIK KRAWI** -Swords.Combat.Counter.Chance=Szansa na Kontratak: &e{0} -Swords.Combat.Counter.Hit=&4Kontratak! -Swords.Combat.Countered=&a**KONTR-ATAK** -Swords.Combat.SS.Struck=&4Zosta\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=&a**?Z\u0104BKOWANY? ATAK AKTYWOWANY** -Swords.Skills.SS.Refresh=&aTw\u00f3j &eZ\u0105bkowany Atak &ajest ju\u017c dost\u0119pny! -Swords.Skills.SS.Other.Off=Z\u0105bkowany Atak&a si\u0119 sko\u0144czy\u0142 &e{0} -Swords.Skills.SS.Other.On=&a{0}&2 u\u017cy\u0142 &cZ\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: &e{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: &e{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=&7COTW (Ocelot): Kucnij i kliknij LPM {0} z ryb\u0105 w r\u0119ce -Taming.Effect.15=&7COTW (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=&8Tw\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=&aPrzywo\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: &e{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: &e{0} -Unarmed.Ability.Chance.Disarm=Szansa na Rozbrojenie: &e{0} -Unarmed.Ability.Chance.IronGrip=Szansa za Zelazny Chwyt: &e{0} -Unarmed.Ability.IronGrip.Attacker=Tw\u00f3j przeciwnik ma \u017celazny u\u015bcisk! -Unarmed.Ability.IronGrip.Defender=&aTw\u00f3j \u017belazny Uchwyt uchroni\u0142 ci\u0119 przed Rozbrojeniem! -Unarmed.Ability.Lower=&7**OPUSZCZASZ SWOJE PI\u0118\u015aCI** -Unarmed.Ability.Ready=&a**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=&a**BERSERK AKTYWOWANY** -Unarmed.Skills.Berserk.Other.Off=Berserk&a si\u0119 sko\u0144czy\u0142 &e{0} -Unarmed.Skills.Berserk.Other.On=&a{0}&2 u\u017cy\u0142 &cBerserka! -Unarmed.Skills.Berserk.Refresh=&aTwoja zdolno\u015b\u0107 &eBerserka &ajest 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: &e{0} -Woodcutting.Ability.Length=D\u0142ugo\u015bc Powalacza Drzew: &e{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=\u0052\u0105\u0062\u0061\u006e\u0069\u0065 -Woodcutting.SkillName=\u0052\u0105\u0062\u0061\u006e\u0069\u0065 -Woodcutting.Skills.TreeFeller.Off=**Powalacz Drzew si\u0119 sko\u0144czy\u0142** -Woodcutting.Skills.TreeFeller.On=&a**POWALACZ DRZEW AKTYWOWANY** -Woodcutting.Skills.TreeFeller.Refresh=&aTwoja zdolno\u015b\u0107 &ePowalacz Drzew &a jest ju\u017c dost\u0119pna! -Woodcutting.Skills.TreeFeller.Other.Off=Powalenie Drzewa&a si\u0119 sko\u0144czy\u0142o &e{0} -Woodcutting.Skills.TreeFeller.Other.On=&a{0}&2 u\u017cy\u0142 &cPowalacza 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=&a**UMIEJ\u0118TNO\u015aCI DOST\u0118PNE!** +#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\u0119tno\u015b\u0107 +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\u0119\u015bliwe Perki +JSON.JWrapper.Perks.Lucky={0}% Lepszej Szansy +JSON.Hover.Tips=Wskaz\u00f3wka +JSON.Acrobatics=Akrobatyka +JSON.Alchemy=Alchemia +JSON.Archery=\u0141ucznictwo +JSON.Axes=Siekiery +JSON.Excavation=Wykopalisko +JSON.Fishing=Rybarz +JSON.Herbalism=Zielarstwo +JSON.Mining=G\u00f3rnictwo +JSON.Repair=Naprawiacz +JSON.Salvage=Odzyskiwacz +JSON.Swords=Miecze +JSON.Taming=Tresowanie +JSON.Unarmed=Niezr\u0119czno\u015b\u0107 +JSON.Woodcutting=\u015acinacz Drzew +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\u0142umaczenie mcMMO na inne j\u0119zyki! +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\u0119pne 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\u00f3ba &c\u0141agodnego przewrotu +JSON.Acrobatics.SubSkill.Roll.Details.Tips=Je\u015bli b\u0119dziesz kuca\u0142 w czasie spadania, otrzymasz tylko po\u0142ow\u0119 obra\u017ce\u0144! +Anvil.SingleItemStack=&cNie mo\u017cesz odzyska\u0107 ani naprawi\u0107 stos\u00f3w przedmiot\u00f3w, kt\u00f3re zawieraj\u0105 wi\u0119cej ni\u017c 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\u015aWIE\u017bONO UMIEJ\u0118TNO\u015aCI!** Ability.Generic.Template.Lock=&7{0} -Ability.Generic.Template=&6{0}: &3{1} -Combat.ArrowDeflect=&f**ODBICIE STRZALY** -Combat.BeastLore=&a**WIEDZA O ZWIERZETACH** -Combat.BeastLoreHealth=&3\u017bycie (&a{0}&3/{1}) -Combat.BeastLoreOwner=&3Wlasciciel (&c{0}&3) -Combat.Gore=&a**KRWOTOK** -Combat.StruckByGore=**WYKRWAWIASZ SI\u0118** -Combat.TargetDazed=Cel zostal &4oszolomiony. -Combat.TouchedFuzzy=&4Zostales oszolomiony. -mcMMO.Description=&3O &emcMMO&3 Project:,&6mcMMO jest &copen source&6 modem RPG stworzonym w lutym 2011 r.,&6przez &9nossr50&6. Celem jest wprowadzenie doswiadczen RPG.,&3Porady:,&6 - &aUzywaj &c/mcmmo help&a by zobaczyc komendy,&6 - &aPisz &c/NAZWA_UMIEJETNOSCI&a by zobaczyc informacje na jej temat,&3Programisci:,&6 - &anossr50 &9(Zalozyciel),&6 - &aGJ &9(Manager projektu),&6 - &aNuclearW &9(Developer),&6 - &abm01 &9(Developer),&6 - &aTfT_02 &9(Developer),&6 - &aGlitchfinder &9(Developer),&6 - &at00thpick1 &9(Developer),&3Przydatne linki:,&6 - &ahttps://github.com/mcMMO-Dev/mcMMO/issues&6 Zglaszanie bled\u00f3w,&6 - &a#mcmmo @ irc.esper.net&6 IRC Chat, -Commands.addlevels.AwardAll.1=&aOtrzyma\u0142e\u015b {0} poziom\u00f3w we wszystkich dziedzinach! -Commands.addlevels.AwardAll.2=Wszystkie dziedziny zosta\u0142y zmienione na poziom {0}. -Commands.addlevels.AwardSkill.1=&aZdoby\u0142e\u015b {0} poziom\u00f3w w dziedzinie {1}! -Commands.addlevels.AwardSkill.2={0} zosta\u0142 zmieniony dla {1}. -Commands.addxp.AwardAll=&aOtrzyma\u0142e\u015b {0} XP\'a we wszystkich dziedzinach! -Commands.addxp.AwardSkill=&aOtrzyma\u0142e\u015b {0} XP\'a we dziedzinie {1}! -Commands.Ability.Off=Umiej\u0119tno\u015b\u0107 wy\u0142\u0105czona &c -Commands.Ability.On=Umiej\u0119tno\u015b\u0107 w\u0142\u0105czona &a -Commands.AdminChat.Off=Czat tylko dla adminow &c Wylaczony -Commands.AdminChat.On=Czat tylko dla adminow &c 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= &c- Pokazuje informacje o graczu -Commands.Party.Invite.Accepted=&aZaproszenie zaakceptowane. Do\u0142\u0105czy\u0142e\u015b do dru\u017cyny {0} -Commands.Invite.Success=&aPomyslnie wyslano zaproszenie -Commands.Leaderboards= &c- Rankingi -Commands.mcc.Header=---[]&emcMMO Komendy&c[]--- -Commands.mcgod=- W\u0142\u0105cza/Wy\u0142\u0105cza Nie\u015bmiertelno\u015b\u0107 -Commands.mchud.Invalid=Nie ma takiego Typu Interfejsu. -Commands.mcpurge.Success=&aBaza danych zosta\u0142a wyczyszczona! -Commands.mcrank.Heading=&6-=OSOBISTE RANKINGI=- -Commands.mcrank.Overall=Og\u00f3lne Statystyki&a - &6Ranga &f#&a{0} -Commands.mcrank.Player=CEL: &f{0} -Commands.mcrank.Skill={0}&a - &6Ranga &f#&a{1} +# 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.SubSkills.Overhaul=Sub-umiej\u0119tno\u015bci +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\u0119 umiej\u0119tno\u015b\u0107 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\u0142o/a do &r&a&l{2}&r&f. +Overhaul.Name.Acrobatics=Akrobatyka +Overhaul.Name.Alchemy=Alchemia +Overhaul.Name.Archery=\u0141ucznictwo +Overhaul.Name.Axes=Siekiery +Overhaul.Name.Excavation=Wykopalisko +Overhaul.Name.Fishing=Rybarz +Overhaul.Name.Herbalism=Zielarstwo +Overhaul.Name.Mining=G\u00f3rnictwo +Overhaul.Name.Repair=Naprawiacz +Overhaul.Name.Salvage=Odzyskiwacz +Overhaul.Name.Smelting=Przepalanie +Overhaul.Name.Swords=Miecze +Overhaul.Name.Taming=Tresowanie +Overhaul.Name.Unarmed=Niezr\u0119czno\u015b\u0107 +Overhaul.Name.Woodcutting=\u015acinacz Drzew +# /mcMMO Command Style Stuff +Commands.mcc.Header=&c---[]&amcMMO Komendy&c[]--- +Commands.Other=&c---[]&aSPECJALNE KOMENDY&c[]--- +Commands.Party.Header=&c-----[]&aDRU\u017bYNA&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\u0119tno\u015bci... +XPBar.Acrobatics=Akrobatyka Lv.&6{0} +XPBar.Alchemy=Alchemia Lv.&6{0} +XPBar.Archery=\u0141ucznictwo Lv.&6{0} +XPBar.Axes=Siekiery Lv.&6{0} +XPBar.Excavation=Wykopalisko Lv.&6{0} +XPBar.Fishing=Rybarz Lv.&6{0} +XPBar.Herbalism=Zielarstwo Lv.&6{0} +XPBar.Mining=G\u00f3rnictwo 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\u0119czno\u015b\u0107 Lv.&6{0} +XPBar.Woodcutting=\u015acinacz Drzew 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**\u0141askawe L\u0105dowanie** +Acrobatics.Combat.Proc=&a**Unik** +Acrobatics.SubSkill.Roll.Stats=&6Szansa na &e{0}%&6 Szansa na \u0142\u0105ske&e {1}% +Acrobatics.SubSkill.Roll.Stat=Szansa na +Acrobatics.SubSkill.Roll.Stat.Extra=Szansa na \u0141agodny Przewr\u00f3t +Acrobatics.SubSkill.Roll.Name=Przewr\u00f3t +Acrobatics.SubSkill.Roll.Description=Wyl\u0105duj strategicznie, aby unikn\u0105\u0107 uszkodze\u0144. +Acrobatics.SubSkill.Roll.Chance=Szansa na Przewr\u00f3t: &e{0} +Acrobatics.SubSkill.Roll.GraceChance=Szansa na \u0142agodny przewr\u00f3t: &e{0} +Acrobatics.SubSkill.Roll.Mechanics=&7Przewr\u00f3t to biernie aktywna Sub-Umiej\u0119tno\u015b\u0107.\nZawsze kiedy otrzymujesz obra\u017cenia od wysoko\u015bci, jest szansa, \u017ce zostan\u0105 one zredukowane bazuj\u0105c na poziomie umiej\u0119tno\u015bci, na poziomie &e{6}%&7 masz &e{0}%&7 szansy na zablokowanie obra\u017ce\u0144, i &e{1}%&7 je\u015bli aktywujesz \u0142agony przewr\u00f3t.\nSzansa na sukces jest skalowana w zale\u017cno\u015bci od twojego poziomu umiej\u0119tno\u015bci na liniowej krzywej, a\u017c do poziomu &e{2}&7 gdzie osi\u0105ga maximum, ka\u017cdy poziom akrobatyki daje Ci &e{3}%&7 szansy na sukces.\nPrzytrzymuj\u0105c przycisk skradania si\u0119, mo\u017cesz podwoi\u0107 swoje szanse, aby unikn\u0105\u0107 obra\u017ce\u0144 od upadku! Przytrzymywanie shiftu zamienia Przewr\u00f3t na \u0141agodny Przewr\u00f3t. +Acrobatics.SubSkill.GracefulRoll.Name=\u0141agodny przewr\u00f3t +Acrobatics.SubSkill.GracefulRoll.Description=Podwaja efekt normalnego przewrotu. +Acrobatics.SubSkill.Dodge.Name=Unik +Acrobatics.SubSkill.Dodge.Description=Redukuje obra\u017cenia od ataku o po\u0142ow\u0119 +Acrobatics.SubSkill.Dodge.Stat=Szansa na unik +Acrobatics.Listener=Akrobatyka: +Acrobatics.Roll.Text=&o**Przewr\u00f3t** +Acrobatics.SkillName=AKROBATYKA +#ALCHEMY +Alchemy.SubSkill.Catalysis.Name=Kataliza +Alchemy.SubSkill.Catalysis.Description=Zwi\u0119ksza szybko\u015b\u0107 warzenia mikstur. +Alchemy.SubSkill.Catalysis.Stat=Szybko\u015b\u0107 warzenia mikstur. +Alchemy.SubSkill.Concoctions.Name=Mikstury +Alchemy.SubSkill.Concoctions.Description=Warz mikstury z wi\u0119ksz\u0105 ilo\u015bci\u0105 sk\u0142adnik\u00f3w. +Alchemy.SubSkill.Concoctions.Stat=Ranking mikstur: &a{0}&3/&a{1} +Alchemy.SubSkill.Concoctions.Stat.Extra=Sk\u0142adniki [&a{0}&3]: &a{1} +Alchemy.Listener=Alchemia: +Alchemy.Ability.Locked.0=ZABLOKOWANE DO {0}+ UMIEJ\u0118TNO\u015aCI (KATALIZA) +Alchemy.SkillName=ALCHEMIA +#ARCHERY + + +Archery.SubSkill.SkillShot.Name=Umiej\u0119tne strzelanie +Archery.SubSkill.SkillShot.Description=Zwi\u0119ksza obra\u017cenia zadawane \u0142ukiem +Archery.SubSkill.SkillShot.Stat=Premia do obra\u017ce\u0144 od \u0142uku +Archery.SubSkill.Daze.Name=Oszo\u0142omienie +Archery.SubSkill.Daze.Description=Osza\u0142amia wroga i zadaje dodatkowe obra\u017cenia +Archery.SubSkill.Daze.Stat=Szansa na oszo\u0142omienie +Archery.SubSkill.ArrowRetrieval.Name=Odzyskiwanie strza\u0142 +Archery.SubSkill.ArrowRetrieval.Description=Szansa na odzyskanie strza\u0142 ze zw\u0142ok +Archery.SubSkill.ArrowRetrieval.Stat=Szansa na odzyskanie strza\u0142y +Archery.SubSkill.ArcheryLimitBreak.Name=Prze\u0142amywanie granic \u0142ucznictwa +Archery.SubSkill.ArcheryLimitBreak.Description=Prze\u0142am swoje limity. Znacznie zwi\u0119ksza obra\u017cenia zadawane przeciwnikom! +Archery.SubSkill.ArcheryLimitBreak.Stat=Maksymalne obra\u017cenia Prze\u0142amywanie Limit\u00f3w. +Archery.Listener=\u0141ucznictwo: +Archery.SkillName=\u0141UCZNICTWO +#AXES +Axes.Ability.Bonus.0=Mistrz Siekiery +Axes.Ability.Bonus.1=Bonusowe {0} obra\u017ce\u0144 +Axes.Ability.Bonus.2=Uderzenie zbroi +Axes.Ability.Bonus.3=Zadaje {0} dodatkowych obra\u017ce\u0144 zbroi +Axes.Ability.Bonus.4=Wi\u0119kszy Wp\u0142yw +Axes.Ability.Bonus.5=Zadaje {0} dodatkowych obra\u017ce\u0144 przeciwnikom bez zbroi. +Axes.Ability.Lower=&7Opuszczasz sw\u00f3j top\u00f3r. +Axes.Ability.Ready=&6Przygotuj&3 sw\u00f3j top\u00f3r. +Axes.Ability.Ready.Extra=&6Przygotuj&3 sw\u00f3j top\u00f3r. &7({0} pozosta\u0142o {1}s czasu odnowienia) +Axes.Combat.CritStruck=&4Zosta\u0142e\u015b KRYTYCZNIE trafiony! +Axes.Combat.CriticalHit=KRYTYCZNE UDERZENIE! +Axes.Combat.GI.Proc=&a**UDERZAJ Z WIELK\u0104 SI\u0141\u0104** +Axes.Combat.GI.Struck=**UDERZENIE Z WI\u0118KSZYM WP\u0141YWEM** +Axes.Combat.SS.Struck=&4Uderzono przez PRZECINACZ CZASZEK! +Axes.SubSkill.SkullSplitter.Name=Przecinacz czaszek +Axes.SubSkill.SkullSplitter.Description=Zadaje obra\u017cenia AoE +Axes.SubSkill.SkullSplitter.Stat=Trwanie Przecinacza Czaszek +Axes.SubSkill.CriticalStrikes.Name=Trafienie krytyczne +Axes.SubSkill.CriticalStrikes.Description=Podw\u00f3jne obra\u017cenia +Axes.SubSkill.CriticalStrikes.Stat=Szansa na trafienie krytyczne +Axes.SubSkill.AxeMastery.Name=Mistrz Siekiery +Axes.SubSkill.AxeMastery.Description=Dodaje dodatkowe obra\u017cenia +Axes.SubSkill.AxesLimitBreak.Name=Prze\u0142amanie limit\u00f3w siekier +Axes.SubSkill.AxesLimitBreak.Description=Prze\u0142amujesz swoje granice. Zwi\u0119ksza obra\u017cenia zadawane przeciwnikom. +Axes.SubSkill.AxesLimitBreak.Stat=Maksymalne obra\u017cenia Prze\u0142amanie Limit\u00f3w +Axes.SubSkill.ArmorImpact.Name=Uderzenie pancerza +Axes.SubSkill.ArmorImpact.Description=Uderzenie z si\u0142\u0105 wystarczaj\u0105c\u0105 do zniszczenia zbroi +Axes.SubSkill.GreaterImpact.Name=Wi\u0119kszy wp\u0142yw +Axes.SubSkill.GreaterImpact.Description=Zadaje dodatkowe obra\u017cenia dla byt\u00f3w bez zbroi. +Axes.Listener=Siekiery: +Axes.SkillName=SIEKIERY +Axes.Skills.SS.Off=**Przecinacz Czaszek zosta\u0142 zu\u017cyty** +Axes.Skills.SS.On=&a**Przecinacz Czaszek AKTYWOWANY** +Axes.Skills.SS.Refresh=&aTw\u00f3j &ePrzecinacz Czaszek &azosta\u0142 od\u015bwie\u017cony! +Axes.Skills.SS.Other.Off=Przecinacz czaszek zosta\u0142 zu\u017cyty na &e{0} +Axes.Skills.SS.Other.On=&a{0}&2 u\u017cy\u0142 &cPrzecinacz Czaszek! +#EXCAVATION +Excavation.Ability.Lower=&7Opuszczasz swoj\u0105 \u0142opat\u0119. +Excavation.Ability.Ready=&6Przygotowujesz&3 swoj\u0105 \u0141opat\u0119. +Excavation.SubSkill.GigaDrillBreaker.Name=Giga Wiert\u0142ol +Excavation.SubSkill.GigaDrillBreaker.Description=3x Cz\u0119stotliwo\u015b\u0107 dropu, 3x EXP, +Pr\u0119dko\u015b\u0107 +Excavation.SubSkill.GigaDrillBreaker.Stat=Czas odnowienia Giga Wiert\u0142a +Excavation.SubSkill.Archaeology.Name=Archeologia +Excavation.SubSkill.Archaeology.Description=Odkryj tajemnice tego \u015bwiata! Wysokie poziomy umiej\u0119tno\u015bci zwi\u0119kszaj\u0105 Twoje szanse na znalezienie kul do\u015bwiadczenia, gdy znajdziesz skarb! +Excavation.SubSkill.Archaeology.Stat=Szansa Archeologii na kul\u0119 do\u015bwiadczenia +Excavation.SubSkill.Archaeology.Stat.Extra=Liczba z Archeologii na kul\u0119 do\u015bwiadczenia +Excavation.Listener=Wykopalisko: +Excavation.SkillName=WYKOPALISKO +Excavation.Skills.GigaDrillBreaker.Off=**Giga Wiert\u0142o przesta\u0142o dzia\u0142a\u0107** +Excavation.Skills.GigaDrillBreaker.On=&a**GIGA WIERT\u0141O AKTYWOWANO** +Excavation.Skills.GigaDrillBreaker.Refresh=&aTwoja umiej\u0119tno\u015b\u0107 &eGiga Wiert\u0142o &azosta\u0142a od\u015bwie\u017cona! +Excavation.Skills.GigaDrillBreaker.Other.Off=Giga Wiert\u0142o&a przesta\u0142o dzia\u0142a\u0107 na &e{0} +Excavation.Skills.GigaDrillBreaker.Other.On=&a{0}&2 u\u017cy\u0142/a &cGiga Wiert\u0142o! +#FISHING +Fishing.ScarcityTip=&e&oTen obszar cierpi z powodu prze\u0142owienia. Zarzu\u0107 w\u0119dk\u0119 w inne miejsce, aby z\u0142owi\u0107 wi\u0119cej ryb. Co najmniej {0} bloki dalej. +Fishing.Scared=&7&oChaotyczne ruchy odstraszaj\u0105 ryby! +Fishing.Exhausting=&c&oNiew\u0142a\u015bciwe u\u017cycie w\u0119dki spowoduje zm\u0119czenie i zu\u017cycie w\u0119dki! +Fishing.LowResourcesTip=&7Wyczuwasz, \u017ce na tym obszarze nie zosta\u0142o wiele ryb. Spr\u00f3buj \u0142owi\u0107 co najmniej {0} bloki dalej. +Fishing.Ability.Info=Magic Hunter: &7 **Ulepsz z rang\u0105 \u0141owca Nagr\u00f3d** +Fishing.Ability.Locked.0=ZABLOKOWANE DO {0}+ UMIEJ\u0118TNO\u015a\u0106 (POTRZ\u0104SANIE) +Fishing.Ability.Locked.1=ZABLOKOWANE DO {0}+ UMIEJ\u0118TNO\u015a\u0106 (MRO\u0179NE PO\u0141OWY) +Fishing.Ability.Locked.2=ZABLOKOWANE DO {0}+ UMIEJ\u0118TNO\u015a\u0106 (MISTRZ \u0141OWIENIA) +Fishing.SubSkill.TreasureHunter.Name=\u0141owca Nagr\u00f3d +Fishing.SubSkill.TreasureHunter.Description=Fish up misc. objects +Fishing.SubSkill.TreasureHunter.Stat=Ranga \u0141owcy Nagr\u00f3d: &a{0}&3/&a{1} +Fishing.SubSkill.TreasureHunter.Stat.Extra=Cz\u0119stotliwo\u015b\u0107 dropu: &7Zwyk\u0142e: &e{0} &aNiezwyk\u0142e: &e{1}\n&9Rzadkie: &e{2} &dEpickie: &e{3} &6Legendarne: &e{4} &bMityczne: &e{5} +Fishing.SubSkill.MagicHunter.Name=\u0141owca Magii +Fishing.SubSkill.MagicHunter.Description=Znajd\u017a zakl\u0119te przedmioty +Fishing.SubSkill.MagicHunter.Stat=Szansa \u0142owcy magii +Fishing.SubSkill.Shake.Name=Potrz\u0105sanie +Fishing.SubSkill.Shake.Description=Strz\u0105\u015bnij przedmioty z mob\u00f3w lub w\u0119dki gracza. +Fishing.SubSkill.Shake.Stat=Szansa na Potrz\u0105\u015bni\u0119cie +Fishing.SubSkill.FishermansDiet.Name=Dieta rybaka +Fishing.SubSkill.FishermansDiet.Description=Poprawia g\u0142\u00f3d przywracany z ryb +Fishing.SubSkill.FishermansDiet.Stat=Ranga Diety Rybaka:&a {0} +Fishing.SubSkill.MasterAngler.Name=Mistrz w\u0119dkarstwa +Fishing.SubSkill.MasterAngler.Description=Ryby \u0142owione s\u0105 cz\u0119\u015bciej, lepiej sprawdza si\u0119 podczas \u0142owienia z \u0142odzi. +Fishing.SubSkill.MasterAngler.Stat=Skr\u00f3cenie czasu oczekiwania na w\u0119dkowanie: &a-{0} seconds +Fishing.SubSkill.MasterAngler.Stat.Extra=Skr\u00f3cenie maksymalnego czasu oczekiwania na w\u0119dkowanie: &a-{0} seconds +Fishing.SubSkill.IceFishing.Name=Ice Fishing +Fishing.SubSkill.IceFishing.Description=Pozwala \u0142owi\u0107 w lodowatych biomach +Fishing.SubSkill.IceFishing.Stat=Mro\u017ane Po\u0142owy +Fishing.Chance.Raining=&9 Premia za deszcz +Fishing.Listener=W\u0119dkarstwo: +Fishing.Ability.TH.MagicFound=&7Z tym haczykiem czujesz odrobin\u0119 magii... +Fishing.Ability.TH.Boom=&7BOOM TIME!!! +Fishing.Ability.TH.Poison=&7 +Fishing.SkillName=W\u0118DKARSTWO +#HERBALISM +Herbalism.Ability.GTe.NeedMore=Potrzebujesz wi\u0119cej nasion, aby rozprzestrzeni\u0107 Zielona Tera. +Herbalism.Ability.GTh.Fail=**ZIELONA TERA ZAWODZI** +Herbalism.Ability.GTh=&a**GREEN THUMB** +Herbalism.Ability.Lower=&7Opuszczasz swoj\u0105 motyk\u0119. +Herbalism.Ability.Ready=&6Przygotowujesz&3 swoj\u0105 motyk\u0119. +Herbalism.Ability.ShroomThumb.Fail=**HALUCYNKI ZAWODZ\u0104** +Herbalism.SubSkill.GreenTerra.Name=Zielony L\u0105d +Herbalism.SubSkill.GreenTerra.Description=Rozprzestrze\u0144 Terr\u0119, 3x Drops, Boosts Green Thumb +Herbalism.SubSkill.GreenTerra.Stat=Czas odnowienia Zielonej Terry +Herbalism.SubSkill.GreenThumb.Name=Zielona R\u0105czka +Herbalism.SubSkill.GreenThumb.Description=Automatycznie sadzi nasiona, kiedy uprawisz ziemi\u0119. +Herbalism.SubSkill.GreenThumb.Stat=Szansa na Zielona R\u0105czka +Herbalism.SubSkill.GreenThumb.Stat.Extra=Etap Zielonej R\u0105czki: &a Uprawy rosn\u0105 w fazie {0} +Herbalism.Effect.4=Zielona R\u0105czka (Bloki) +Herbalism.SubSkill.GreenThumb.Description.2=Spraw, aby ceg\u0142y by\u0142y omsza\u0142e lub spraw, aby trawa uros\u0142a +Herbalism.SubSkill.FarmersDiet.Name=Dieta Farmera +Herbalism.SubSkill.FarmersDiet.Description=Zwi\u0119ksza g\u0142\u00f3d przywracany z \u017cywno\u015bci uprawianej +Herbalism.SubSkill.FarmersDiet.Stat=Ranga Diety Farmera: &a {0} +Herbalism.SubSkill.DoubleDrops.Name=Podw\u00f3jny \u0142up +Herbalism.SubSkill.DoubleDrops.Description=Podwaja normalny \u0142up +Herbalism.SubSkill.DoubleDrops.Stat=Szansa na podw\u00f3jny drop +Herbalism.SubSkill.HylianLuck.Name=Wielkie Szcz\u0119\u015bcie +Herbalism.SubSkill.HylianLuck.Description=Daje niewielk\u0105 szans\u0119 na znale\u017aenie rzadkich przedmiot\u00f3w +Herbalism.SubSkill.HylianLuck.Stat=Szansa na Wielkie Szcz\u0119\u015bcie +Herbalism.SubSkill.ShroomThumb.Name=Halucynki +Herbalism.SubSkill.ShroomThumb.Description=Roz\u0142\u00f3\u017c grzybni\u0119 na ziemi i trawie +Herbalism.SubSkill.ShroomThumb.Stat=Szansa na Halucynki +Herbalism.HylianLuck=&aSzcz\u0119\u015bcie Hyrule jest dzi\u015b z tob\u0105! +Herbalism.SkillName=ZIELARSTWO +Herbalism.Skills.GTe.Off=**Zielona Terra wy\u0142\u0105czy\u0142a si\u0119** +Herbalism.Skills.GTe.On=&a**ZIELONA TERRA AKTYWOWANA** +Herbalism.Skills.GTe.Refresh=&aTwoja umiej\u0119tno\u015b\u0107 &eZielona Terra &azosta\u0142a od\u015bwie\u017cona! +Herbalism.Skills.GTe.Other.Off=Zielona Terra&a zosta\u0142a wy\u0142\u0105czona na &e{0} +Herbalism.Skills.GTe.Other.On=&a{0}&2 u\u017cy\u0142/a &cZielona Terra! +#MINING +Mining.Ability.Locked.0=ZABLOKOWANE DO {0}+ UMIEJ\u0118TNO\u015a\u0106 (PODMUCH G\u00d3RNICTWA) +Mining.Ability.Locked.1=ZABLOKOWANE DO {0}+ UMIEJ\u0118TNO\u015a\u0106 (WI\u0118KSZE BOMBY) +Mining.Ability.Locked.2=ZABLOKOWANE DO {0}+ UMIEJ\u0118TNO\u015a\u0106 (EKSPERTYZY ROZBI\u00d3RKI) +Mining.Ability.Lower=&7Opuszczasz sw\u00f3j kilof. +Mining.Ability.Ready=&3You &6ready&3 Tw\u00f3j kilof. +Mining.SubSkill.SuperBreaker.Name=Super Niszczyciel +Mining.SubSkill.SuperBreaker.Description=Pr\u0119dko\u015b\u0107+, Szansa na potr\u00f3jny \u0142up +Mining.SubSkill.SuperBreaker.Stat=Trwanie: Super Niszczyciel +Mining.SubSkill.DoubleDrops.Name=Podw\u00f3jny drop +Mining.SubSkill.DoubleDrops.Description=Podwaja normalny \u0142up +Mining.SubSkill.DoubleDrops.Stat=Podw\u00f3jna szansa na upuszczenie +Mining.SubSkill.BlastMining.Name=Podmuch G\u00f3rnictwa +Mining.SubSkill.BlastMining.Description=Premie do wydobywania z TNT +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=Wi\u0119ksze bomby +Mining.SubSkill.BiggerBombs.Description=Zwi\u0119ksza promie\u0144 wybuchu +Mining.SubSkill.DemolitionsExpertise.Name=Ekspertyzy Rozbi\u00f3rki +Mining.SubSkill.DemolitionsExpertise.Description=Zmniejsza obra\u017cenia zadawane TNT +Mining.SubSkill.DemolitionsExpertise.Stat=Zmniejszenie obra\u017ce\u0144 od eksperta od wyburze\u0144 +Mining.Listener=G\u00f3rnictwo: +Mining.SkillName=G\u00d3RNICTWO +Mining.Skills.SuperBreaker.Off=**Super Niszczyciel wy\u0142\u0105czy\u0142 si\u0119** +Mining.Skills.SuperBreaker.On=&a**SUPER NISZCZYCIEL AKTYWOWANY** +Mining.Skills.SuperBreaker.Other.Off=Super Niszczyciel&a wy\u0142\u0105czy\u0142 si\u0119 na for &e{0} +Mining.Skills.SuperBreaker.Other.On=&a{0}&2 u\u017cy\u0142 &cSuper Niszczyciel! +Mining.Skills.SuperBreaker.Refresh=&aTwoja umiej\u0119tno\u015b\u0107 &eSuper Niszczyciel &azosta\u0142a od\u015bwie\u017cona! +#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\u0119dzi i Zbroi +Repair.SubSkill.GoldRepair.Name=Naprawa Z\u0142ota ({0}+ UMIEJ\u0118TNO\u015a\u0106) +Repair.SubSkill.GoldRepair.Description=Naprawa z\u0142otych narz\u0119dzi & zbroi +Repair.SubSkill.IronRepair.Name=Naprawa \u017belaza ({0}+ UMIEJ\u0118TNO\u015a\u0106) +Repair.SubSkill.IronRepair.Description=Naprawa \u017celaznych narz\u0119dzi & zbroi +Repair.SubSkill.StoneRepair.Name=Naprawa Kamienia ({0}+ UMIEJ\u0118TNO\u015a\u0106) +Repair.SubSkill.StoneRepair.Description=Naprawa kamiennych narz\u0119dzi +Repair.SubSkill.RepairMastery.Name=Mistrz napraw +Repair.SubSkill.RepairMastery.Description=Zwi\u0119kszona kwota naprawy +Repair.SubSkill.RepairMastery.Stat=Mistrz napraw: &aDodatkowo przywr\u00f3cono {0} wytrzyma\u0142o\u015bci. +Repair.SubSkill.SuperRepair.Name=Super Naprawa +RepairRepair.SubSkill.SuperRepair.Description=Podwojona skuteczno\u015b\u0107 +Repair.SubSkill.SuperRepair.Stat=Szansa na Super Napraw\u0119 +Repair.SubSkill.DiamondRepair.Name=Naprawa Diament\u00f3w ({0}+ SKILL) +Repair.SubSkill.DiamondRepair.Description=Napraw diamentowe narz\u0119dzia i zbroj\u0119 +Repair.SubSkill.ArcaneForging.Name=Tajemne Fa\u0142szowanie +Repair.SubSkill.ArcaneForging.Description=Naprawa magicznych przedmiot\u00f3w +Repair.SubSkill.ArcaneForging.Stat=Ranga Tajemnego Fa\u0142szowania: &e {0}/{1} +Repair.SubSkill.ArcaneForging.Stat.Extra=&3Szansa na Tajemne Fa\u0142szowanie:&7 Powodzenie: &a{0}&7%, Niepowodzenie: &c{1}&7% +Repair.Error=&4mcMMO napotka\u0142 b\u0142\u0105d podczas pr\u00f3by naprawy tego przedmiotu! +Repair.Listener.Anvil=&4r Umie\u015bci\u0142e\u015b kowad\u0142o, kowad\u0142a mog\u0105 naprawia\u0107 narz\u0119dzia i zbroj\u0119. +Repair.Listener=Naprawianie: +Repair.SkillName=NAPRAWIANIE +Repair.Skills.AdeptDiamond=&4Nie masz wystarczaj\u0105cych umiej\u0119tno\u015bci, aby naprawi\u0107 Diament. +Repair.Skills.AdeptGold=&4Nie masz wystarczaj\u0105cych umiej\u0119tno\u015bci, aby naprawi\u0107 z\u0142oto. +Repair.Skills.AdeptIron=&4Nie masz wystarczaj\u0105cych umiej\u0119tno\u015bci, aby naprawi\u0107 \u017celazo. +Repair.Skills.AdeptStone=&4Nie masz wystarczaj\u0105cych umiej\u0119tno\u015bci, aby naprawi\u0107 Stone. +Repair.Skills.Adept=&cMusisz mie\u0107 &e{0}&c poziom, aby naprawi\u0107 &e{1} +Repair.Skills.FeltEasy=&7To by\u0142o \u0142atwe. +Repair.Skills.FullDurability=&7To znaczy przy pe\u0142nej trwa\u0142o\u015bci. +Repair.Skills.StackedItems=&4Nie mo\u017cesz naprawia\u0107 u\u0142o\u017conych w stos przedmiot\u00f3w. +Repair.Pretty.Name=Naprawianie +#Arcane Forging +Repair.Arcane.Downgrade=W przypadku tego przedmiotu zmniejszono tajemn\u0105 moc. +Repair.Arcane.Fail=Tajemna moc na sta\u0142e opu\u015bci\u0142a przedmiot. +Repair.Arcane.Lost=Nie mia\u0142e\u015b wystarczaj\u0105cych umiej\u0119tno\u015bci, aby zachowa\u0107 jakiekolwiek zakl\u0119cia. +Repair.Arcane.Perfect=&aUtrzyma\u0142e\u015b/a\u015b tajemn\u0105 moc w tym przedmiocie. +#SALVAGE +Salvage.Pretty.Name=Odzyskiwanie +Salvage.SubSkill.UnderstandingTheArt.Name=Zrozumie\u0107 sztuk\u0119 +Salvage.SubSkill.UnderstandingTheArt.Description=Nie tylko przekopujesz \u015bmieci s\u0105siad\u00f3w, ale tak\u017ce dbasz o \u015brodowisko. +\nWzmacnia r\u00f3\u017cne w\u0142a\u015bciwo\u015bci Odzyskiwacza. +Salvage.SubSkill.ScrapCollector.Name=Zbieracz z\u0142omu +Salvage.SubSkill.ScrapCollector.Description=Odzyskaj materia\u0142y z przedmiotu, idealne odzyskanie zale\u017cy od umiej\u0119tno\u015bci i szcz\u0119\u015bcia. +Salvage.SubSkill.ScrapCollector.Stat=Zbieracz z\u0142omu: &aOdzyskaj do & e {0} & jednej rzeczy. W gr\u0119 wchodzi troch\u0119 szcz\u0119\u015bcia. +Salvage.SubSkill.ArcaneSalvage.Name=Tajemne odzyskiwanie +Salvage.SubSkill.ArcaneSalvage.Description=Wydobywaj zakl\u0119cia z przedmiot\u00f3w +Salvage.SubSkill.ArcaneSalvage.Stat=Ranga Tajemnego odzyskiwania: &e {0}/{1} +Salvage.Ability.Bonus.0=Zbieracz z\u0142omu +Salvage.Ability.Bonus.1= +Salvage.Arcane.ExtractFull=&7 Szansa na pe\u0142ne zakl\u0119cia +Salvage.Arcane.ExtractPartial=&7 Szansa na cz\u0119\u015bciowe zakl\u0119cia +Salvage.Skills.Success=&aOdzyskano przedmiot! +Salvage.Skills.Adept.Damaged=&4Nie masz wystarczaj\u0105cych umiej\u0119tno\u015bci, aby odzyska\u0107 uszkodzone przedmioty. +Salvage.Skills.Adept.Level=Musisz by\u0107 na poziomie & e {0} & c, aby odzyska\u0107 & e {1} +Salvage.Skills.TooDamaged=&4Ten przedmiot jest zbyt uszkodzony, aby go uratowa\u0107. +Salvage.Skills.ArcaneFailed=&cNie uda\u0142o Ci si\u0119 wydoby\u0107 wiedzy zawartej w tym elemencie. +Salvage.Skills.ArcanePartial=&cUda\u0142o Ci si\u0119 tylko wydoby\u0107 cz\u0119\u015b\u0107 wiedzy zawartej w tym elemencie. +Salvage.Skills.ArcaneSuccess=&aJeste\u015b w stanie wydoby\u0107 ca\u0142\u0105 wiedz\u0119 zawart\u0105 w tym elemencie! +Salvage.Listener.Anvil=&4Umie\u015bci\u0142e\u015b/a\u015b kowad\u0142o, u\u017cyj go do zbroi i narz\u0119dzi. +Salvage.Listener=Odzyskiwanie: +Salvage.SkillName=ODZYSKIWANIE +Salvage.Skills.Lottery.Normal=&6Uda\u0142o Ci si\u0119 odzyska\u0107 & 3 {0} & 6 materia\u0142\u00f3w z & e {1} & 6. +Salvage.Skills.Lottery.Perfect=&a&lPerfekcyjnie! & r & 6 Odzyska\u0142e\u015b/a\u015b & 3 {1} & 6 bez wysi\u0142ku, odzyskuj\u0105c & 3 {0} & 6 materia\u0142\u00f3w. +Salvage.Skills.Lottery.Untrained=&7Nie jeste\u015b odpowiednio przeszkolony w odzyskiwaniu. Uda\u0142o Ci si\u0119 odzyska\u0107 tylko & c {0} & 7 materia\u0142\u00f3w z & a {1} & 7. +#Anvil (Shared between SALVAGE and REPAIR) +Anvil.Unbreakable=Ten przedmiot jest niezniszczalny! +#SWORDS +Swords.Ability.Lower=&7Opuszczasz sw\u00f3j miecz. +Swords.Ability.Ready=&6Przygotowujesz&3 sw\u00f3j miecz. +Swords.Combat.Rupture.Note=&7NOTATKA: &e1 P\u0119kni\u0119cie zdarza si\u0119 co 0,5 sekundy! +Swords.Combat.Bleeding.Started=&4 Krwawisz! +Swords.Combat.Bleeding.Stopped=&7Krwawienie ju\u017c si\u0119 zatrzyma\u0142o&7! +Swords.Combat.Bleeding=&a**PRZECIWNIK KRWAWI** +Swords.Combat.Counter.Hit=&4Zaatakuj kontraatakiem! +Swords.Combat.Countered=&a**KONTRAATAK** +Swords.Combat.SS.Struck=&4Uderzone ZW\u0118Z\u0141YMI STRIKAMI! +Swords.SubSkill.CounterAttack.Name=Kontratak +Swords.SubSkill.CounterAttack.Description=Odbij cz\u0119\u015b\u0107 obra\u017ce\u0144, gdy zostaniesz zaatakowany! +Swords.SubSkill.CounterAttack.Stat=Szansa na kontratak +Swords.SubSkill.SerratedStrikes.Name=Z\u0105bkowane uderzenia +Swords.SubSkill.SerratedStrikes.Description=Zadaje dodatkowe obra\u017cenia AoE z szans\u0105 na Pot\u0119\u017cne krwawienie! +Swords.SubSkill.SerratedStrikes.Stat=Z\u0105bkowana d\u0142ugo\u015b\u0107 uderze\u0144 +Swords.SubSkill.Rupture.Name=Pot\u0119\u017cne krwawienie +Swords.SubSkill.Rupture.Description=Zastosuj pot\u0119\u017cne krwawienie DoT +Swords.SubSkill.Stab.Name=Sztylet +Swords.SubSkill.Stab.Description=Dodaje dodatkowe obra\u017cenia do twoich atak\u00f3w. +Swords.SubSkill.Stab.Stat=Obra\u017cenia d\u017agni\u0119cia +Swords.SubSkill.SwordsLimitBreak.Name=Prze\u0142amywanie limit\u00f3w miecza +Swords.SubSkill.SwordsLimitBreak.Description=Prze\u0142amywanie limit\u00f3w. Zwi\u0119kszone obra\u017cenia zadawane trudnym przeciwnikom. Przeznaczony dla PVP, zale\u017cnie od ustawie\u0144 serwera, czy zwi\u0119kszy obra\u017cenia w PVE, czy nie. +Swords.SubSkill.SwordsLimitBreak.Stat=Prze\u0142amywanie limit\u00f3w max obra\u017ce\u0144 +Swords.SubSkill.Rupture.Stat=Szansa na Rozerwanie +Swords.SubSkill.Rupture.Stat.Extra=Rozerwanie: &a{0} ticks [{1} DMG vs Gracz] [{2} DMG vs Moby] +Swords.Effect.4=Krwawienie+ z\u0105bkowane uderzenia +Swords.Effect.5={0} Tick Rupture +Swords.Listener=Miecze: +Swords.SkillName=MIECZE +Swords.Skills.SS.Off=**Z\u0105bkowane Uderzenia przesta\u0142y dzia\u0142a\u0107** +Swords.Skills.SS.On=&a**AKTYWOWANE Z\u0104BKOWANE UDERZENIA** +Swords.Skills.SS.Refresh=&aTwoje &eZ\u0105bkowane uderzenia zosta\u0142y od\u015bwie\u017cone! +Swords.Skills.SS.Other.Off=Z\u0105bkowane uderzenia & a przesta\u0142y dzia\u0142a\u0107 na & e {0} +Swords.Skills.SS.Other.On=&a{0}&2u\u017cy\u0142 & cZ\u0105bkowane uderzenia! +#TAMING +Taming.Ability.Bonus.0=Przyjazny \u015brodowisku +Taming.Ability.Bonus.1=Wilki unikaj\u0105 niebezpiecze\u0144stwa +Taming.Ability.Bonus.2=Grube futro +Taming.Ability.Bonus.3=1/{0} Obra\u017ce\u0144, odporno\u015b\u0107 na ogie\u0144 +Taming.Ability.Bonus.4=Odporno\u015b\u0107 na wstrz\u0105sy +Taming.Ability.Bonus.5=Materia\u0142y wybuchowe zadaj\u0105 1/{0} normalnych obra\u017ce\u0144 +Taming.Ability.Bonus.6=Zaostrzone pazury +Taming.Ability.Bonus.7=+{0} Obra\u017ce\u0144 +Taming.Ability.Bonus.8=Us\u0142ugi 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\u0119 lub trucizn\u0119 +Taming.Ability.Locked.0=ZABLOKOWANE DO {0}+ UMIEJ\u0118TNO\u015a\u0106 (PRZYJAZNY \u015aRODOWISKU) +Taming.Ability.Locked.1=ZABLOKOWANE DO {0}+ UMIEJ\u0118TNO\u015a\u0106 (GRUBE FUTRO) +Taming.Ability.Locked.2=ZABLOKOWANE DO {0}+ UMIEJ\u0118TNO\u015a\u0106 (ODPORNO\u015a\u0106 NA WSTRZ\u0104SY) +Taming.Ability.Locked.3=ZABLOKOWANE DO {0}+ UMIEJ\u0118TNO\u015a\u0106 (ZAOSTRZONE PAZURY) +Taming.Ability.Locked.4=ZABLOKOWANE DO {0}+UMIEJ\u0118TNO\u015a\u0106 (SERWIS FAST FOOD) +Taming.Ability.Locked.5=ZABLOKOWANE DO {0}+ UMIEJ\u0118TNO\u015a\u0106 (NIESKALANY PIES) +Taming.Combat.Chance.Gore=Szansa na Przelew Krwi +Taming.SubSkill.BeastLore.Name=Wiedza Bestii +Taming.SubSkill.BeastLore.Description=Walenie ko\u015bci\u0105 kontroluje koty i psy. +Taming.SubSkill.ShockProof.Name=Odporno\u015b\u0107 na wstrz\u0105sy +Taming.SubSkill.ShockProof.Description=Redukcja obra\u017ce\u0144 od wybuchu +Taming.SubSkill.CallOfTheWild.Name=Zew natury +Taming.SubSkill.CallOfTheWild.Description=Wzywa zwierze na Twoj\u0105 stron\u0119 +Taming.SubSkill.CallOfTheWild.Description.2=&7Zew natury: Kucnij i kliknij lewym przyciskiem myszy \n {0} {1} (Kot), {2} {3} (Pies), {4} {5} (Ko\u0144) +Taming.SubSkill.FastFoodService.Name=Serwis Fast Food +Taming.SubSkill.FastFoodService.Description=Szansa wilk\u00f3w na uleczenie przy ataku +Taming.SubSkill.HolyHound.Name=Nieskalany Pies +Taming.SubSkill.HolyHound.Description=Uleczono przez Magi\u0119 & Trucizn\u0119 +Taming.SubSkill.Gore.Name=Przelew Krwi +Taming.SubSkill.Gore.Description=Krytyczne Uderzenie, kt\u00f3re nak\u0142ada Rozerwanie. +Taming.SubSkill.SharpenedClaws.Name=Zaostrzone pazury +Taming.SubSkill.SharpenedClaws.Description=Dodatkowe obra\u017cenia +Taming.SubSkill.EnvironmentallyAware.Name=Przyjazny \u015brodowisku +Taming.SubSkill.EnvironmentallyAware.Description=Kaktus/Lawa Fobia, Odporny na obra\u017cenia od upadku. +Taming.SubSkill.ThickFur.Name=Grube futro +Taming.SubSkill.ThickFur.Description=Redukcja obra\u017ce\u0144, Odporno\u015b\u0107 na ogie\u0144 +Taming.SubSkill.Pummel.Name=Odepchni\u0119cie +Taming.SubSkill.Pummel.Description=Twoje wilki maj\u0105 szans\u0119 odepchn\u0105\u0107 wrog\u00f3w +Taming.SubSkill.Pummel.TargetMessage=Zosta\u0142e\u015b/a\u015b odepchni\u0119ty przez wilka! +Taming.Listener.Wolf=&8Tw\u00f3j wilk wraca do Ciebie... +Taming.Listener=Tresowanie: +Taming.SkillName=TRESOWANIE +Taming.Summon.COTW.Success.WithoutLifespan=&a(Zew natury) &7Wezwa\u0142e\u015b/a\u015b &6{0}&7 +Taming.Summon.COTW.Success.WithLifespan=&a(Zew natury) &7Wezwa\u0142e\u015b/a\u015b &6{0}&7 na czas &6{1}&7 sekund. +Taming.Summon.COTW.Limit=&a(Zew natury) &7Mo\u017cesz mie\u0107 tylko &c{0} &7wezwanych &7{1} w tym samym czasie. +Taming.Summon.COTW.TimeExpired=&a(Zew natury) &7Czas si\u0119 sko\u0144czy\u0142, Tw\u00f3j &6{0}&7 odlatuje. +Taming.Summon.COTW.Removed=&a(Zew natury) &7Tw\u00f3j przywo\u0142any &6{0}&7 znikn\u0105\u0142 z tego \u015bwiata :c +Taming.Summon.COTW.BreedingDisallowed=&a(Zew natury) &cNie mo\u017cesz rozmna\u017ca\u0107 przywo\u0142anego zwierz\u0119cia. +Taming.Summon.COTW.NeedMoreItems=&a(Zew natury) &7Potrzebujesz wi\u0119cej &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\u00f3j przeciwnik ma \u017celazny u\u015bcisk! +Unarmed.Ability.IronGrip.Defender=&aTw\u00f3j \u017celazny u\u015bcisk uchroni\u0142 ci\u0119 przed rozbrojeniem! +Unarmed.Ability.Lower=&7Opuszczasz pi\u0119\u015bci. +Unarmed.Ability.Ready=&3You &6ready&3twoje pi\u0119\u015bci. +Unarmed.SubSkill.Berserk.Name=Sza\u0142 +Unarmed.SubSkill.Berserk.Description=+50% DMG, \u0141amie s\u0142abe materia\u0142y +Unarmed.SubSkill.Berserk.Stat=D\u0142ugo\u015b\u0107 Sza\u0142u +Unarmed.SubSkill.Disarm.Name=Rozbraja\u0107 +Unarmed.SubSkill.Disarm.Description=Upuszcza trzymany w d\u0142oni przedmiot przeciwnika +Unarmed.SubSkill.Disarm.Stat=Szansa na rozbrojenie +Unarmed.SubSkill.UnarmedLimitBreak.Name=Nieuzbrojone prze\u0142amanie limitu +Unarmed.SubSkill.UnarmedLimitBreak.Description=Prze\u0142amywanie granic. Zwi\u0119kszone obra\u017cenia zadawane trudnym przeciwnikom. Przeznaczony dla PVP, zale\u017cnie od ustawie\u0144 serwera, czy zwi\u0119kszy obra\u017cenia 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\u0119 +Unarmed.SubSkill.ArrowDeflect.Name=Odbicie strza\u0142 +Unarmed.SubSkill.ArrowDeflect.Description=Odbij strza\u0142y +Unarmed.SubSkill.ArrowDeflect.Stat=Szansa na odbicie strza\u0142y +Unarmed.SubSkill.IronGrip.Name=Iron Grip +Unarmed.SubSkill.IronGrip.Description=Zapobiega rozbrojeniu +Unarmed.SubSkill.IronGrip.Stat=Szansa na \u017celazny chwyt +Unarmed.SubSkill.BlockCracker.Name= +Unarmed.SubSkill.BlockCracker.Description=Rozbijaj ska\u0142y pi\u0119\u015bciami +Unarmed.Listener=Niezr\u0119czno\u015b\u0107: +Unarmed.SkillName=NIEZR\u0118CZNO\u015a\u0106 +Unarmed.Skills.Berserk.Off=**Sza\u0142 si\u0119 sko\u0144czy\u0142** +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\u0142y od\u015bwie\u017cone! + +#WOODCUTTING +Woodcutting.Ability.0=Dmuchawa do li\u015bci +Woodcutting.Ability.1=Zdmuchuje li\u015bcie +Woodcutting.Ability.Locked.0=ZABLOKOWANE DO {0}+ UMIEJ\u0118TNO\u015a\u0106 (DMUCHAWA DO LI\u015aCI) +Woodcutting.SubSkill.TreeFeller.Name=\u015acinacz Drzew +Woodcutting.SubSkill.TreeFeller.Description=Spraw, by drzewa eksplodowa\u0142y +Woodcutting.SubSkill.TreeFeller.Stat=Tree Feller Length +Woodcutting.SubSkill.LeafBlower.Name=Dmuchawa do li\u015bci +Woodcutting.SubSkill.LeafBlower.Description=Zdmuchuje li\u015bcie +Woodcutting.SubSkill.KnockOnWood.Name=Stukni\u0119cie w Drewno +Woodcutting.SubSkill.KnockOnWood.Description=Znajd\u017a dodatkowe przedmioty podczas korzystania z \u015acinacz Drzew +Woodcutting.SubSkill.KnockOnWood.Stat=Stukni\u0119cie w Drewno +Woodcutting.SubSkill.KnockOnWood.Loot.Normal=Standardowy \u0142up z drzewa +Woodcutting.SubSkill.KnockOnWood.Loot.Rank2=Standardowy \u0142up z drzew i kul do\u015bwiadczenia +Woodcutting.SubSkill.HarvestLumber.Name=\u017bniwa Budulca +Woodcutting.SubSkill.HarvestLumber.Description=Umiej\u0119tnie wydobywanie wi\u0119cej drewna +Woodcutting.SubSkill.HarvestLumber.Stat=Podw\u00f3jna szansa \u0142upu +Woodcutting.SubSkill.Splinter.Name=Kawa\u0142ki +Woodcutting.SubSkill.Splinter.Description=Ci\u0119cie drzew bardziej efektywnie. +Woodcutting.SubSkill.BarkSurgeon.Name=Chirurg Kory +Woodcutting.SubSkill.BarkSurgeon.Description=Wydobywaj przydatne materia\u0142y podczas \u015bcinania drzew. +Woodcutting.SubSkill.NaturesBounty.Name=Nagroda natury +Woodcutting.SubSkill.NaturesBounty.Description=Zbieraj do\u015bwiadczenie z natury. +Woodcutting.Listener=\u015acinacz Drzew: +Woodcutting.SkillName=\u015aCINACZ DRZEW +Woodcutting.Skills.TreeFeller.Off=**\u015acinacz Drzew przesta\u0142 dzia\u0142a\u0107** +Woodcutting.Skills.TreeFeller.On=&a**\u015aCINACZ DRZEW AKTYWOWANY** +Woodcutting.Skills.TreeFeller.Refresh=&aTwoja umiej\u0119tno\u015b\u015b &e\u015acinacz Drzew &azosta\u0142a od\u015bwie\u017cona! +Woodcutting.Skills.TreeFeller.Other.Off=\u015acinacz Drzew&a przesta\u0142 dzia\u0142a\u0107 na &e{0} +Woodcutting.Skills.TreeFeller.Other.On=&a{0}&2 u\u017cy\u0142 &c\u015acinacz Drzew! +Woodcutting.Skills.TreeFeller.Splinter=TW\u00d3J TOP\u00d3R ROZKLEJA SI\u0118 NA DZIESI\u0104TKI KAWA\u0141K\u00d3W! +Woodcutting.Skills.TreeFeller.Threshold=To drzewo jest zbyt du\u017ce! +#ABILITIY + +#COMBAT +Combat.ArrowDeflect=&f**UGINANIE STRZA\u0141** +Combat.BeastLore=&a**WIEDZA BESTII** +Combat.BeastLoreHealth=&3Zdrowie (&a{0}&3/{1}) +Combat.BeastLoreOwner=&3W\u0142a\u015bciciel (&c{0}&3) +Combat.BeastLoreHorseSpeed=&3Pr\u0119dko\u015b\u0107 konia (&a{0} bloki/s&3) +Combat.BeastLoreHorseJumpStrength=&3Si\u0142a skoku konia (&aMax {0} blok\u00f3w&3) +Combat.Gore=&a**ROZLANA KREW** +Combat.StruckByGore=**ZOSTA\u0141E\u015a ZRANIONY** +Combat.TargetDazed=Cel by\u0142 &4Oszo\u0142omiony +Combat.TouchedFuzzy=&4Czy\u0107 sko\u0142owanie. +#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\u015bci wra\u017ce\u0144 z gry RPG.,&3Wskaz\u00f3wki:,&6 - &aU\u017cyj &c/mcmmo help&a by zobaczy\u0107 komendy,&6 - &aWpisz &c/NAZWA_UMI\u0118J\u0118TNO\u015aCI&a by zobaczy\u0107 detale konkertnej umiej\u0119tno\u015bci,&3Deweloperzy:,&6 - &anossr50 &9(Tw\u00f3rca & Kierownik Projektu),&6 - &aelectronicboy &9(Dev),&6 - &akashike &9(Dev),&6 - &at00thpick1 &9(Opiekun wersji Classic) +mcMMO.Description.FormerDevs=&3Byli tw\u00f3rcy: &aGJ, NuclearW, bm01, TfT_02, Glitchfinder +Commands.addlevels.AwardAll.1=&aZostano nagrodzonym {0} we wszystkich poziomach! +Commands.addlevels.AwardAll.2=Wszystkie umiej\u0119tno\u015bci zosta\u0142y zmodyfikowane o {0}. +Commands.addlevels.AwardSkill.1=&aZostano nagrodzonym o {0} poziomy/\u00f3w w {1}! +Commands.addlevels.AwardSkill.2={0} zosta\u0142o/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\u017cywanie umiej\u0119tno\u015bci: &cWy\u0142\u0105czone +Commands.Ability.On=U\u017cywanie umiej\u0119tno\u015bci &aW\u0142\u0105czone +Commands.Ability.Toggle=Zmieniono u\u017cywanie umiej\u0119tno\u015bci dla &e{0} +Commands.AdminChat.Off=Admin Chat &cW\u0142\u0105czone +Commands.AdminChat.On=Admin Chat &cWy\u0142\u0105czone +Commands.AdminToggle=&a- Prze\u0142\u0105cz czat Admin\u00f3w +Commands.Chat.Console=*Konsola* +Commands.Cooldowns.Header=&6--= &amcMMO Czas Odnowienia Umiej\u0119tno\u015bci&6 =-- +Commands.Cooldowns.Row.N=\ &c{0}&f - &6Pozosta\u0142o sekund: {1} +Commands.Cooldowns.Row.Y=\ &b{0}&f - &2Gotowe! +Commands.Database.CooldownMS=Musisz odczeka\u0107 {0} milisekund zanim u\u017cyjesz tej komendy. +Commands.Database.Cooldown=Musisz odczeka\u0107 {0} sekund zanim u\u017cyjesz tej komendy ponownie. +Commands.Database.Processing=Twoje poprzednie polecenie jest nadal przetwarzane. Prosz\u0119 czeka\u0107. +Commands.Disabled=Ta komenda jest wy\u0142\u0105czona. +Commands.DoesNotExist= &cTen gracz nie istnieje w bazie danych! +Commands.GodMode.Disabled=mcMMO Godmode Wy\u0142\u0105czony +Commands.GodMode.Enabled=mcMMO Godmode W\u0142\u0105czony +Commands.AdminChatSpy.Enabled=mcMMO Podgl\u0105danie czat\u00f3w dru\u017cyn w\u0142\u0105czone +Commands.AdminChatSpy.Disabled=mcMMO Podgl\u0105danie czat\u00f3w dru\u017cyn wy\u0142\u0105czone +Commands.AdminChatSpy.Toggle=mcMMO Czat w grupie zosta\u0142 prze\u0142\u0105czony dla &e{0} +Commands.AdminChatSpy.Chat=&6[SPY: &a{0}&6] &f{1} +Commands.GodMode.Forbidden=[mcMMO] Godmode nie jest dozwolony na tym \u015bwiecie (Zobacz Permisje) +Commands.GodMode.Toggle=Tryb Godmode zosta\u0142 prze\u0142\u0105czony dla &e{0} +Commands.Healthbars.Changed.HEARTS=[mcMMO] Tw\u00f3j typ wy\u015bwietlania paska zdrowia zosta\u0142 zmieniony na &cZdrowie&f. +Commands.Healthbars.Changed.BAR=[mcMMO] Tw\u00f3j typ wy\u015bwietlania paska zdrowia zosta\u0142 zmieniony na &eBar&f. +Commands.Healthbars.Changed.DISABLED=[mcMMO] Twoje paski zdrowia mob\u00f3w zosta\u0142y &7wy\u0142\u0105czone&f. +Commands.Healthbars.Invalid=B\u0142\u0119dny pasek zdrowia! +Commands.Inspect= &a- Zobacz szczeg\u00f3\u0142owe informacje o graczu +Commands.Invite.Success=&aPomy\u015blnie wys\u0142ano zaproszenie. +Commands.Leaderboards= &a- Rankingi +Commands.mcgod=&a- Prze\u0142\u0105cz GodMode +Commands.mchud.Invalid=To nie jest prawid\u0142owy typ HUD. +Commands.mcpurge.Success=&aBaza danych zosta\u0142a pomy\u015blnie wyczyszczona! +Commands.mcrank.Heading=&6-=RANGI OSOBISTE=- +Commands.mcrank.Overall=Og\u00f3lne&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=Umiejetnosci &c{0} zostaly odnowione. -Commands.mcremove.Success=&a{0} zosta\u0142 usuni\u0119ty z bazy danych! -Commands.mctop.Tip=&6Porada: Wpisz &c/mcrank&6 aby zobaczy\u0107 swoje rankingi! -Commands.mmoedit=[player] &c - Modyfikuje cel -Commands.mmoedit.Modified.1=&aTw\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 &cwylaczone -Commands.Notifications.On=Informacje na temat umiejetnosci &awlaczone -Commands.Other=&a--POZOSTA\u0141E KOMENDY-- -Commands.Party.Header=-----[]&aDRUZYNA&c[]----- -Commands.Party.ShareMode=&8TRYB DZIELENIA SIE: +Commands.mcrefresh.Success={0} - Czas odnowienia od\u015bwie\u017cony. +Commands.mcremove.Success=&a{0} - Pomy\u015blnie usuni\u0119to z bany danych! +Commands.mctop.Tip=&6Tip: U\u017cyj &c/mcrank&6 aby wy\u015bwietli\u0107 wszystkie swoje osobiste rangi! +Commands.mmoedit=[player] &a - Modifikuj cel +Commands.mmoedit.AllSkills.1=&aPoziom wszystkich Twoim umiej\u0119tno\u015bci zmieniono na {0}! +Commands.mmoedit.Modified.1=&aTw\u00f3j poziom {0} zmieniono na {1}! +Commands.mmoedit.Modified.2={0} zosta\u0142/a zmodyfikowana dla {1}. +Commands.mcconvert.Database.Same=Ju\u017c u\u017cywasz 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\u0144czona; {1} ma teraz wszystkie dane z bazy danych {0}. +Commands.mmoshowdb=Aktualna baza danych w u\u017cyciu to &a{0} +Commands.mcconvert.Experience.Invalid=Nieznany typ formu\u0142y! Prawod\u0142owe typy to: &aLINIOWY &ci &aEXPONENTIAL. +Commands.mcconvert.Experience.Same=Aktualny typ formu\u0142y to {0} +Commands.mcconvert.Experience.Start=&7Rozpoczynanie konwersji z {0} do {1} krzywej +Commands.mcconvert.Experience.Finish=&7Uko\u0144czono konwersj\u0119 formu\u0142y; teraz korzystam z {0} \u015bredniejj XP. +Commands.ModDescription=&a- Przeczytaj kr\u00f3tki opis moda +Commands.NoConsole=Tej komendy nie mo\u017cesz u\u017cy\u0107 przez konsol\u0119. +Commands.Notifications.Off=Prze\u0142\u0105czono powiadomienia o umiej\u0119tno\u015bciach: &cWy\u0142\u0105czono +Commands.Notifications.On=Prze\u0142\u0105czono powiadomienia o umiej\u0119tno\u015bciach: &aW\u0142\u0105czono +Commands.Offline=Ta komenda nie dzia\u0142a na graczy off-line. +Commands.NotLoaded=Profil gracza nie jest jeszcze za\u0142adowany. +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\u0118PNIANIA: Commands.Party.ItemShare=&7PRZEDMIOT &3({0}) Commands.Party.ExpShare=&7EXP &3({0}) -Commands.Party.MembersNear=&8OBOK CIEBIE &3{0}&8/&3{1} -Commands.Party.Accept=- Akceptuje zaproszenie grupy -Commands.Party.Chat.Off=Czat wy\u0142acznie dla dru\u017cyny &cOff -Commands.Party.Chat.On=Czat wy\u0142acznie dla dru\u017cyny w\u0142\u0105czony &c -Commands.Party.Commands=&a--KOMENDY DLA DRU\u017bYN-- -Commands.Party.Invite.0=ALERT: &aOtrzyma\u0142e\u015b zaproszenie do dru\u017cyny {0} od {1} -Commands.Party.Invite.1=Wpisz &a/party accept&e by akceptowac zaproszenie -Commands.Party.Invite=- Wysyla zaproszenie do druzyny -Commands.Party.Join=&7Dolaczono do druzyny: {0} -Commands.Party.Create=&7Utworzono druzyne: {0} -Commands.Party.Rename=&7Nazwa druzyny zmieniona na: &f{0} -Commands.Party.SetSharing=&7Druzyny {0} dzielenie sie przedmiotami ustawiono na: &3{1} -Commands.Party.AlreadyExists=&4Druzyna {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=-----[]&aCZLONKOWIE&c[]----- -Commands.Party.None=Nie jestes w druzynie. -Commands.Party.Quit=- Opuszcza obecn\u0105 dru\u017cyne -Commands.Party.Teleport= &c- 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 &aaktywna -Commands.ptp.Disabled=Teleportacja druzynowa &cwylaczona -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} &achce sie steleportowac do Ciebie. -Commands.ptp.Request2=&aBy sie steleportowac, wpisz &e/ptp accept. &aZadanie wygasa po &c{0} &asekundach. -Commands.ptp.AcceptAny.Disabled=Potwierdzenie zadania teleportacji druzynowej &cwylaczone -Commands.ptp.RequestExpired=Zadanie druzynowego teleportu wygaslo! -Commands.PowerLevel.Leaderboard=--mcMMO&9 Poziom Mocy &eRanking-- -Commands.PowerLevel.Capped=&4POZIOM MOCY: &a{0} &4MAKSYMALNY POZIOM: &e{1} +Commands.Party.ItemShareCategories=&8Udost\u0119pnianie przedmiot\u00f3w: &7&o{0} +Commands.Party.MembersNear=&8BLISKO CIEBIE &3{0}&8/&3{1} +Commands.Party.Accept=&a- Zaakceptuj zaproszenie do dru\u017cyny +Commands.Party.Chat.Off=Czat dru\u017cyny &cWy\u0142\u0105czono +Commands.Party.Chat.On=Czat dru\u017cyny &aW\u0142\u0105czono +Commands.Party.Commands=&c---[]&aKOMENDY DRU\u017bYNY&c[]--- +Commands.Party.Invite.0=&cALERT: &aOtrzyma\u0142e\u015b zaproszenie do dru\u017cyny {0} od {1} +Commands.Party.Invite.1=&eWpisz &a/party accept&e aby zaakceptowa\u0107 zaproszenie +Commands.Party.Invite=&a- Wy\u015blij zaproszenie do dru\u017cyny +Commands.Party.Invite.Accepted=&aZaproszenie Zaakceptowane. Do\u0142\u0105czy\u0142e\u015b do dru\u017cyny {0} +Commands.Party.Join=&7Do\u0142\u0105czy\u0142 do dru\u017cyny: {0} +Commands.Party.PartyFull=&6{0}&c jest pe\u0142na! +Commands.Party.PartyFull.Invite=Nie mo\u017cesz zaprosi\u0107 &e{0}&c do &a{1}&c, poniewa\u017c dru\u017cyna ma ju\u017c &3{2}&c cz\u0142onk\u00f3w! +Commands.Party.PartyFull.InviteAccept=Nie mo\u017cesz do\u0142\u0105czy\u0107 do &a{0}&c, poniewa\u017c dru\u017cyna ma ju\u017c &3{1}&c cz\u0142onk\u00f3w! +Commands.Party.Create=&7Stworzone dru\u017cyny: {0} +Commands.Party.Rename=&7Nazwa dru\u017cyny zmieniona na: &f{0} +Commands.Party.SetSharing=&7Udost\u0119pnianie dru\u017cyny {0} ustawione na: &3{1} +Commands.Party.ToggleShareCategory=&7Udost\u0119pnianie przedmiot\u00f3w dru\u017cyny &6{0} &7zosta\u0142o &3{1} +Commands.Party.AlreadyExists=&4PDru\u017cyna {0} ju\u017c istnieje! +Commands.Party.Kick=&cZosta\u0142e\u015b/a\u015b wyrzucony/a z dru\u017cyny &a{0}&c! +Commands.Party.Leave=&eOpuszczono dru\u017cyn\u0119 +Commands.Party.Members.Header=&c-----[]&aCZ\u0141ONKOWIE&c[]----- +Commands.Party.None=&cNie jeste\u015b w dru\u017cynie. +Commands.Party.Quit=&a- Opu\u015b\u0107 swoj\u0105 dru\u017cyn\u0119 +Commands.Party.Teleport=&a- Teleportuj do cz\u0142onka dru\u017cyny +Commands.Party.Toggle=&a- Prze\u0142\u0105cz czat dru\u017cyny +Commands.Party1=&a- Stw\u00f3rz now\u0105 dru\u017cyn\u0119 +Commands.Party2=&a- Do\u0142\u0105cz do dru\u017cyny +Commands.Party.Alliance.Header=&c-----[]&aSOJUSZ DRU\u017bYN&c[]----- +Commands.Party.Alliance.Ally=&f{0} &8JEST ZWI\u0104ZANY/A Z: &f{1} +Commands.Party.Alliance.Members.Header=&c-----[]&aCZ\u0141ONKOWIE SOJUSZU&c[]----- +Commands.Party.Alliance.Invite.0=ALERT: &aOtrzyma\u0142e\u015b zaproszenie do sojuszu w dru\u017cynie {0} do {1} +Commands.Party.Alliance.Invite.1=Wpisz &a/party alliance accept&e aby zaakceptowa\u0107 zaproszenie +Commands.Party.Alliance.Invite.Accepted=&aZaproszenie do sojuszu zaakceptowane. +Commands.Party.Alliance.None=&cTwoja dru\u017cyna nie ma sojuszu. +Commands.Party.Alliance.AlreadyAllies=&cTwoja dru\u017cyna ma ju\u017c sojusz. Rozwi\u0105\u017c sojusz &3/party alliance disband +Commands.Party.Alliance.Help.0=&cTa dru\u017cyna nie zawar\u0142a jeszcze sojuszu. Mo\u017cesz +Commands.Party.Alliance.Help.1=&czaprosi\u0107 lidera u\u017cywaj\u0105c &3/party alliance invite &c. +Commands.ptp.Enabled=Teleportowanie w dru\u017cynie &aew\u0142\u0105czone +Commands.ptp.Disabled=Teleportowanie w dru\u017cynie &cwy\u0142\u0105czone +Commands.ptp.NoRequests=&cNie masz aktualnie pr\u00f3\u015bb o teleportacj\u0119 +Commands.ptp.NoWorldPermissions=&c[mcMMO] Nie masz permisji, aby zteleportowa\u0107 si\u0119 do \u015bwiata {0}. +Commands.ptp.Request1=&e{0} &awys\u0142a\u0142/a pro\u015bb\u0119 o teleportacj\u0119. +Commands.ptp.Request2=&aAby zaakceptowa\u0107, wpisz &e/ptp accept&a. Pro\u015bba wyga\u015bnie za &c{0} &asekund. +Commands.ptp.AcceptAny.Enabled=Potwierdzanie teleportowania w dru\u017cynie &aw\u0142\u0105czone +Commands.ptp.AcceptAny.Disabled=Potwierdzanie teleportowania w dru\u017cynie &cwy\u0142\u0105czone +Commands.ptp.RequestExpired=&cPro\u015bba o teleport dru\u017cyny wygas\u0142a! +Commands.PowerLevel.Leaderboard=&e--mcMMO&9 Poziom Mocy &elider\u00f3w-- +Commands.PowerLevel.Capped=&4POZIOM MOCY: &a{0} &4MAX POZIOM: &e{1} Commands.PowerLevel=&4POZIOM MOCY: &a{0} -Commands.Reset.All=&aWszystkie twoje umiej\u0119tno\u015bci zosta\u0142y zresetowane. -Commands.Reset.Single=&aTw\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 &9{0}&e 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.Reset.All=&aWszystkie Twoje poziomy umiej\u0119tno\u015bci pomy\u015blnie zresetowano. +Commands.Reset.Single=&aPoziom Twojej umiej\u0119tno\u015bci {0} pomy\u015blnie zresetowano. +Commands.Reset=&a- Zresetuj poziom umiej\u0119tno\u015bci do 0 +Commands.Scoreboard.Clear=&3mcMMO Tablica wynik\u00f3w oczyszczona. +Commands.Scoreboard.NoBoard=&cTablica wynik\u00f3w mcMMO jest nieaktywna. +Commands.Scoreboard.Keep=&3Tablica wynik\u00f3w mcMMO pozostanie, p\u00f3ki nie u\u017cyjesz &a/mcscoreboard clear&3. +Commands.Scoreboard.Timer=&3Tablica wynik\u00f3w 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\u015bci tablic\u0119 wynik\u00f3w mcMMO +Commands.Scoreboard.Help.2=&3/mcscoreboard&b keep &f - utrzymuj tablic\u0119 wynik\u00f3w mcMMO +Commands.Scoreboard.Help.3=&3/mcscoreboard&b time [n] &f - wyczy\u015b\u0107 tablic\u0119 wynik\u00f3w McMMO za &dn&f sekund +Commands.Scoreboard.Tip.Keep=&6Wskaz\u00f3wka: U\u017cyj &c/mcscoreboard keep&6 while the scoreboard is shown to keep it from going away. +Commands.Scoreboard.Tip.Clear=&6Wskaz\u00f3wka: U\u017cyj &c/mcscoreboard clear&6 pozby\u0107 si\u0119 tablicy wynik\u00f3w. +Commands.XPBar.Reset=&6Ustawienia paska XP Bar dla mcMMO zosta\u0142y zresetowane. +Commands.XPBar.SettingChanged=&6Ustawienia paska XP Bar dla &a{0}&6 zosta\u0142/a ustawiony/a na &a{1} +Commands.Skill.Invalid=To nie jest poprawna nazwa umiej\u0119tno\u015bci! +Commands.Skill.ChildSkill=Umiej\u0119tno\u015bci dziecka nie s\u0105 wa\u017cne dla tego polecenia! +Commands.Skill.Leaderboard=--mcMMO &9{0}&e Tablica Wynik\u00f3w-- +Commands.SkillInfo=&a- Poka\u017c informacje dot. konkretnej umiej\u0119tno\u015bci +Commands.Stats=&a- Poka\u017c swoje statystyki mcMMO +Commands.ToggleAbility=&a- Prze\u0142\u0105cz aktywacj\u0119 umiej\u0119tno\u015bci prawym przyciskiem myszy +Commands.Usage.0=&cW\u0142a\u015bciwe u\u017cycie to /{0} +Commands.Usage.1=&cW\u0142a\u015bciwe u\u017cycie to /{0} {1} +Commands.Usage.2=&cW\u0142a\u015bciwe u\u017cycie to /{0} {1} {2} +Commands.Usage.3=&cW\u0142a\u015bciwe u\u017cycie to /{0} {1} {2} {3} +Commands.Usage.3.XP=&cW\u0142a\u015bciwe u\u017cycie to /{0} {1} {2} {3}&7 (Mo\u017cesz doda\u0107 -s, aby wykona\u0107 polecenie bez informowania o tym gracza) +Commands.Usage.FullClassName=nazwa klasy Commands.Usage.Level=poziom Commands.Usage.Message=wiadomo\u015b\u0107 Commands.Usage.Page=strona -Commands.Usage.Password=haslo +Commands.Usage.PartyName=nazwa +Commands.Usage.Password=has\u0142o Commands.Usage.Player=gracz -Commands.Usage.Skill=zdolno\u015b\u0107 +Commands.Usage.Rate=ocena +Commands.Usage.Skill=umiej\u0119tno\u015b\u0107 +Commands.Usage.SubSkill=sub-umiej\u0119tno\u015b\u0107 Commands.Usage.XP=xp -mcMMO.NoInvites=Nie masz zadnych zaproszen -mcMMO.NoPermission=&4Nie wystarczaj\u0105ce uprawnienia. -mcMMO.NoSkillNote=&8Je\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 &3{0} &cby dzielic sie przedmiotami z czlonkami druzyny -Party.Help.10=Uzyj &3{0} &cby aktywowac dzielenie sie XP z czlonkami druzyny -Party.InformedOnJoin={0} &adolaczyl do Twojej druzyny -Party.InformedOnQuit={0} &aopuscil Twoja druzyne -Party.InformedOnNameChange=&6{0} &azmienil nazwe druzyny na &f{1} -Party.InvalidName=&4Nie 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=&4{0} nie jest cz\u0142onkiem twojej dru\u017cyny. -Party.NotOwner=&4Nie jeste\u015b liderem grupy. -Party.Owner.New=&a{0} jest nowym liderem grupy. -Party.Owner.NotLeader=&4Nie jeste\u015b ju\u017c liderem grupy. -Party.Owner.Player=&aJeste\u015b teraz liderem grupy. -Party.Password.Incorrect=Has\u0142o grupy nieprawid\u0142owe. -Party.Password.Set=&aHaslo grupy zmienione na: {0} -Party.Password.Removed=&aHaslo druzyny zostalo wyczyszczone. -Party.Player.Invalid=Nie ma takiego gracza. -Party.NotOnline=&4{0} jest offline! -Party.Player.InSameParty={0} juz jest w Twojej druzynie! -Party.PlayerNotInParty=&4{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=&aTeleportowa\u0142e\u015b si\u0119 do {0}. -Party.Teleport.Self=Nie mo\u017cesz teleportowa\u0107 si\u0119 do samego siebie! +Commands.Description.mmoinfo=Przeczytaj szczeg\u00f3\u0142owe informacje o umiej\u0119tno\u015bci lub mechanice. +Commands.MmoInfo.Mystery=&7Nie odblokowa\u0142e\u015b/a\u015b jeszcze tej umiej\u0119tno\u015bci, ale kiedy to zrobisz, b\u0119dziesz m\u00f3g\u0142 przeczyta\u0107 o niej szczeg\u00f3\u0142y tutaj! +Commands.MmoInfo.NoMatch=Ta sub-umiej\u0119tno\u015b\u0107 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\u0119tno\u015bci MMO s\u0105 przekszta\u0142cane w ulepszony modu\u0142owy system umiej\u0119tno\u015bci, niestety ta umiej\u0119tno\u015b\u0107 nie zosta\u0142a jeszcze przekonwertowana i brakuje jej szczeg\u00f3\u0142owych statystyk. Nowy system pozwoli na szybsze udost\u0119pnianie nowych umiej\u0119tno\u015bci mcMMO i wi\u0119ksz\u0105 elastyczno\u015b\u0107 w przypadku istniej\u0105cych umiej\u0119tno\u015bci. +Commands.MmoInfo.Mechanics=&3-=[]=====[]&6 Mechanika &3[]=====[]=- +Commands.MmoInfo.Stats=STATYSTKI: {0} +Commands.Mmodebug.Toggle=mcMMO Tryb Debugowania jest teraz &6{0}&7, u\u017cyj tej komendy ponownie, aby prze\u0142\u0105czy\u0107. W trybie debugowania mo\u017cesz klika\u0107 bloki, aby wy\u015bwietli\u0107 przydatne informacje u\u017cywane do obs\u0142ugi. +mcMMO.NoInvites=&cYou have no invites at this time +mcMMO.NoPermission=&4Niewystarczaj\u0105ce uprawnienia. +mcMMO.NoSkillNote=&8Je\u015bli nie masz dost\u0119pu do danej umiej\u0119tno\u015bci, nie zostanie ona tutaj pokazana. +##party +Party.Forbidden=[mcMMO] Dru\u017cyny nie s\u0105 dozwolone na tym \u015bwiecie (Zobacz permisje) +Party.Help.0=&cPrawid\u0142owe u\u017cycie to &3{0} [has\u0142o]. +Party.Help.1=&cAby stworzy\u0107 dru\u017cyn\u0119, u\u017cyj &3{0} [has\u0142o]. +Party.Help.2=&cSkonsultuj si\u0119 z &3{0} &cpo wi\u0119cej informacji +Party.Help.3=&cu\u017cyj &3{0} [has\u0142o] &caby do\u0142\u0105czy\u0107 lub &3{1} &copu\u015bci\u0107 +Party.Help.4=&cAby zablokowa\u0107 lub odblokowa\u0107 dru\u017cyn\u0119, u\u017cyj &3{0} +Party.Help.5=&cAby zabezpieczy\u0107 swoj\u0105 dru\u017cyn\u0119 has\u0142em, u\u017cyj &3{0} +Party.Help.6=&cAby wyrzuci\u0107 gracza z dru\u017cyny, u\u017cyj &3{0} +Party.Help.7=&cAby przenie\u015b\u0107 w\u0142asno\u015b\u0107 swojej dro\u017cyny, u\u017cyj &3{0} +Party.Help.8=&cAby rozwi\u0105za\u0107 swoj\u0105 dru\u017cyn\u0119, u\u017cyj &3{0} +Party.Help.9=&cU\u017cyj &3{0} &caby udost\u0119pnia\u0107 przedmioty cz\u0142onkom dru\u017cyny +Party.Help.10=&cU\u017cyj &3{0} &cudost\u0119pnia\u0107 XP cz\u0142onkom dru\u017cyny +Party.InformedOnJoin={0} &ado\u0142\u0105czy\u0142/a do dru\u017cyny +Party.InformedOnQuit={0} &aopu\u015bci\u0142/a dru\u017cyn\u0119 +Party.InformedOnNameChange=&6{0} &austawi\u0142/a nazw\u0119 dru\u017cyny na &f{1} +Party.InvalidName=&4To nie jest prawid\u0142owa nazwa dru\u017cyny. +Party.Invite.Self=&cNie mo\u017cesz zaprosi\u0107 samego siebie! +Party.IsLocked=&cTa dru\u017cyna jest zablokowana! +Party.IsntLocked=&cTa dru\u017cyna nie jest zablokowana! +Party.Locked=&cDru\u017cyna jest zablokowana, tylko w\u0142a\u015bciciel/ka mo\u017ce zaprosi\u0107 nowych cz\u0142onk\u00f3w. +Party.NotInYourParty=&4{0} nie jest Twoj\u0105 dru\u017cyn\u0105 +Party.NotOwner=&4Nie jeste\u015b w\u0142a\u015bcicielem/k\u0105 dru\u017cyny. +Party.Target.NotOwner=&4{0} nie jest w\u0142a\u015bcicielem/k\u0105 dru\u017cyny. +Party.Owner.New=&a{0} jest nowym/\u0105 w\u0142a\u015bcicielem/k\u0105 dru\u017cyny. +Party.Owner.NotLeader=&4Nie jeste\u015b ju\u017c w\u0142a\u015bcicielem/k\u0105 dru\u017cyny. +Party.Owner.Player =&aJeste\u015b teraz w\u0142a\u015bcicielem/k\u0105 dru\u017cyny. +Party.Password.None=&cTa dru\u017cyna jest chroniona has\u0142em. Wpisz has\u0142o, aby do\u0142\u0105czy\u0107. +Party.Password.Incorrect=&cNiepoprawne has\u0142o. +Party.Password.Set=&aUstawiono has\u0142o dru\u017cyny na {0} +Party.Password.Removed=&aUsuni\u0119to has\u0142o dru\u017cyny. +Party.Player.Invalid=&cNie znaleziono takiego gracza. +Party.NotOnline=&4{0} nie jest on-line! +Party.Player.InSameParty=&c{0} ju\u017c jest w Twojej dru\u017cynie! +Party.PlayerNotInParty=&4{0} nie jest w dru\u017cynie +Party.Specify=&cMusisz poda\u0107 dru\u017cyn\u0119. +Party.Teleport.Dead=&cNie mo\u017cesz si\u0119 zteleportowa\u0107 do martwego przyjaciela. +Party.Teleport.Hurt=&cZosta\u0142e\u015b/a\u015b zraniony przez ostatnie {0} sekund i nie mo\u017cna si\u0119 teleportowa\u0107. +Party.Teleport.Player=&aTeleportowano do {0}. +Party.Teleport.Self=&cNie mo\u017cesz si\u0119 teleportowa\u0107 do siebie! Party.Teleport.Target=&a{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=&7Grupa jest otwarta dla wszystkich. -Party.Disband=&7Druzyna zostala rozwiazana -Party.Status.Locked=&4(TYLKO NA ZAPROSZENIE) -Party.ShareType.Xp=EXP -Party.ShareType.Item=PRZEDMIOTOWY +Party.Teleport.Disabled=&c{0} nie pozwala na dru\u017cynowe teleportowanie. +Party.Rename.Same=&cWpisz inn\u0105 nazw\u0119 jaskini, nie aktualn\u0105! +Party.Join.Self=&cNie mo\u017cesz do\u0142\u0105czy\u0107 do siebie! +Party.Unlocked=&7Dru\u017cyna jest odblokowana +Party.Disband=&7Dru\u017cyna zosta\u0142a rozwi\u0105zana +Party.Alliance.Formed=&7Twoja dru\u017cyna jest w sojuszu z &a{0} +Party.Alliance.Disband=&7Twoja dru\u017cyna nie jest ju\u017c w sojuszu z &c{0} +Party.Status.Locked=&4(TYLKO-ZAPROSZENI) +Party.Status.Unlocked=&2(OTWARTA) +Party.LevelUp=&eZwi\u0119kszono poziom dru\u017cyny: {0}. Aktualnie: ({1}) +Party.Feature.Chat=Czat Dru\u017cyny +Party.Feature.Teleport=Teleport dru\u017cyny +Party.Feature.Alliance=Sojusze +Party.Feature.ItemShare=Udost\u0119pnianie przedmiot\u00f3w +Party.Feature.XpShare=Udost\u0119pnianie XP +Party.Feature.Locked.Chat=ZABLOKOWANE DO {0}+ (CZAT DRU\u017bYNY) +Party.Feature.Locked.Teleport=ZABLOKOWANE DO {0}+ (TELEPORT DRU\u017bYNY) +Party.Feature.Locked.Alliance=ZABLOKOWANE DO {0}+ (SOJUSZE) +Party.Feature.Locked.ItemShare=ZABLOKOWANE DO {0}+ (UDOST\u0118PNIANIE PRZEDMIOT\u00d3W) +Party.Feature.Locked.XpShare=ZABLOKOWANE DO {0}+ UDOST\u0118PNIANIE XP) +Party.Feature.Disabled.1=&cNie odblokowano jeszcze czatu dry\u017cyny. +Party.Feature.Disabled.2=&cNie odblokowano jeszcze teleportu dru\u017cyny. +Party.Feature.Disabled.3=&cNie odblokowano jeszcze sojuszy dry\u017cyny. +Party.Feature.Disabled.4=&cNie odblokowano jeszcze udost\u0119pniani przedmiot\u00f3w. +Party.Feature.Disabled.5=&cNie odblokowano jeszcze udost\u0119pniania XP. +Party.ShareType.Xp=XP +Party.ShareType.Item=PRZEDMIOT +Party.ShareMode.None=\u017bADEN 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.Loot=\u0142up Party.ItemShare.Category.Mining=G\u00f3rnictwo -Party.ItemShare.Category.Herbalism=Zielarstwo -Party.ItemShare.Category.Woodcutting=\u0052\u0105\u0062\u0061\u006e\u0069\u0065 -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=\u0052\u0105\u0062\u0061\u006e\u0069\u0065 -Commands.XPGain=&8Zdobyte do\u015bwiadczenie: &f{0} -Commands.xplock.locked=&6Tw\u00f3j pasek XP\'a jest zablokowany {0}! -Commands.xplock.unlocked=&6Tw\u00f3j pasek XP\'a jest odblokowany {0}! -Commands.xprate.modified=Modyfikator zdobywania do\u015bwiadczenia zosta\u0142 zmieniony na {0} -Commands.xprate.over=&6Event&c 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=&6EVENT zwi\u0119kszonego zdobywania XP\'a w\u0142a\u015bnie si\u0119 zacz\u0105\u0142! -Commands.xprate.started.1=&6Mno\u017cnik zdobywania XP\'a wynosi {0}x! -XPRate.Event=&6mcMMO is currently in an XP rate event! XP rate is {0}x! -Effects.Effects=EFEKTY -Effects.Child=&8LVL: &a{0} -Effects.Level=&8Poziom: &a{0} &3Doswiadczenie&e(&6{1}&e/&6{2}&e) -Effects.Parent=&6{0} - -Effects.Template=&3{0}: &a{1} -Guides.Available=&7Przewodnik dla {0} jest dost\u0119pny - wpisz /{1} ? [strona] -Guides.Header=&6-=&a{0} Przewodnik&6=- -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 &e{0} -Inspect.Stats=&aStatystyki Gracza &e{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=&7Teleportuje Cie do Twojego l\u00f3zka. -Item.Generic.Wait=Musisz poczekac, nim bedziesz m\u00f3gl uzyc tego ponownie! &e({0}s) -Item.Injured.Wait=Zosta\u0142e\u015b ostatnio ranny i musisz poczeka\u0107 aby tego u\u017cy\u0107. &e({0}s) -Teleport.Commencing=&7Teleportacja za &6({0}) &7sekund, nie ruszaj sie... +Party.ItemShare.Category.Herbalism=Tresowanie +Party.ItemShare.Category.Woodcutting=\u015acinanie Drzew +Party.ItemShare.Category.Misc=R\u00f3\u017cne +##xp +Commands.XPGain.Acrobatics=Spadanie +Commands.XPGain.Alchemy=Warzenie Mikstur +Commands.XPGain.Archery=Atakowanie potwor\u00f3w +Commands.XPGain.Axes=Atakowanie potwor\u00f3w +Commands.XPGain.Child=Zyskuje poziomy dzi\u0119ki g\u0142\u00f3wnym umiej\u0119tno\u015bci\u0105 +Commands.XPGain.Excavation=Kopanie i znajdowanie skarb\u00f3w +Commands.XPGain.Fishing=\u0141owienie +Commands.XPGain.Herbalism=Zbieranie zi\u00f3\u0142 +Commands.XPGain.Mining=Kopanie kamienia & rud +Commands.XPGain.Repair=Naprawa +Commands.XPGain.Swords=Atakowanie potwor\u00f3w +Commands.XPGain.Taming=Rozmna\u017canie zwierz\u0105t, albo walka w/ z twoimi psami +Commands.XPGain.Unarmed=Atakowanie potwor\u00f3w +Commands.XPGain.Woodcutting=\u015acianie drzew +Commands.XPGain=&8ZDOBYWANIE XP: &f{0} +Commands.xplock.locked=&6Tw\u00f3j pasek XP jest teraz zablokowany na {0}! +Commands.xplock.unlocked=&6Tw\u00f3j pasek XP jest teraz &aODBLOKOWANY&6! +Commands.xprate.modified=&cMNO\u017bNIK XP zosta\u0142 zmieniony na {0} +Commands.xprate.over=&cEvent mcMMO XP w\u0142a\u015bnie si\u0119 sko\u0144czy\u0142!! +Commands.xprate.proper.0=&cW\u0142a\u015bciwe u\u017cycie do zmieny cz\u0119sto\u015bci XP to /xprate +Commands.xprate.proper.1=&cW\u0142a\u015bciwe u\u017cycie do zresetowania g\u0119sto\u015bci XP to /xprate reset +Commands.xprate.proper.2=&cPodaj warto\u015b\u0107 true lub false, aby wskaza\u0107, czy jest to event XP, czy nie. +Commands.NegativeNumberWarn=Nie u\u017cywaj liczb na minusie! +Commands.Event.Start=&amcMMO&6 Event! +Commands.Event.Stop=&amcMMO&3 Event Zako\u0144czony! +Commands.Event.Stop.Subtitle=&aMam nadziej\u0119, \u017ce mi\u0142o si\u0119 bawili\u015bcie! +Commands.Event.XP=&3Mno\u017cnik XP to teraz &6{0}&3x +Commands.xprate.started.0=&6XP EVENT mcMMO W\u0141A\u015aNIE SI\u0118 ROZPOCZ\u0104\u0141! +Commands.xprate.started.1=&6MNO\u017bNIK mcMMO XP WYNOSI TERAZ {0}x! + +# Admin Notifications +Server.ConsoleName=&e[Server] +Notifications.Admin.XPRate.Start.Self=&7Ustawi\u0142e\u015b/a\u015b globalny mno\u017cnik XP na &6{0}x +Notifications.Admin.XPRate.End.Self=&7Zako\u0144czy\u0142e\u015b/a\u015b event mno\u017cnika XP. +Notifications.Admin.XPRate.End.Others={0} &7zako\u0144czy\u0142/a event mcMMO XP. +Notifications.Admin.XPRate.Start.Others={0} &7rozpocz\u0105\u0142/\u0119\u0142a lub zmodyfikowa\u0142/a wydarzenie zwi\u0105zane z XP z globalnym mno\u017cnikiem {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\u017cnik XP to {0}x! + +#GUIDES +Guides.Available=&7Poradnik dla {0} jest dost\u0119pny - Wpisz /{1} ? [strona] +Guides.Header=&6-=&a{0} PORADNIK&6=- +Guides.Page.Invalid=Nieprawid\u0142owy numer strony! +Guides.Page.OutOfRange=Ta strona nie istnieje, jest/s\u0105 tylko {0} stron/a/y. +Guides.Usage= Prawod\u0142owe u\u017cycie to /{0} ? [strona] +##Acrobatics +Guides.Acrobatics.Section.0=&3O Akrobatyce:\n&eakrobatyka to sztuka poruszania si\u0119 z wdzi\u0119kiem w mcMMO.\n&eZapewnia premie bojowe i premie do obra\u017ce\u0144 otoczenia.\n\n&3ZDOBYWANIE XP:\n&eAby zdoby\u0107 PD w tej umiej\u0119tno\u015bci, musisz wykona\u0107 unik\n&ew walce lub przetrwa\u0107 upadki z wysoko\u015bci, kt\u00f3re ci\u0119 rani\u0105. +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=&3O Alchemi:\n&eAlchemia polega na warzeniu mikstur.\n&eZapewnia przyspieszenie czasu warzenia mikstury,\n&ea tak\u017ce dodanie nowych (wcze\u015bniej) nieosi\u0105galnych mikstur. \n\n\n&3ZDOBYWANIE XP:\n&eAby zdoby\u0107 XP tej umiej\u0119tno\u015bci, musisz warzy\u0107 mikstury. +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=&3O \u0141ucznictwie:\n&e\u0141ucznictwo polega na strzelaniu z \u0142uku strza\u0142.\n&eZapewnia r\u00f3\u017cne bonusy bojowe, takie jak zwi\u0119kszenie obra\u017ce\u0144,\n&ekt\u00f3re skaluje si\u0119 z twoim poziomem i daje mo\u017cliwo\u015b\u0107 oszo\u0142omienia\n&eprzeciwnik\u00f3w w PvP. W dodatku mo\u017cesz odzyska\u0107\n&ecz\u0119\u015b\u0107 strza\u0142 z martwych wrog\u00f3w.\n\n\n&3ZDOBYWANIE XP:\n&eAby zdoby\u0107 XP w tej umiej\u0119tno\u015bci, musisz strzela\u0107 do mob\u00f3w lub\n&edo innych graczy. +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=&3About Axes:\n&eZ umiej\u0119tno\u015bci\u0105 Topory mo\u017cesz zrobi\u0107 co\u015b wi\u0119cej\n&eni\u017c niszczy\u0107 lasy! Mo\u017cesz hakowa\u0107 i sieka\u0107 moby\n&ei graczy, aby zdobywa\u0107 XP, musisz atakowa\u0107 moby siekier\u0105 z efektem\n&eodrzucenie i zada\u0107 \u015bmiertelny cios.\n&eTw\u00f3j top\u00f3r r\u00f3wnie\u017c staje si\u0119 r\u0119cznym r\u0119bakiem,\n&eponiewa\u017c bardzo obni\u017casz poziom zbroi\n&przeciwnika wraz z poziomiem umiej\u0119tno\u015bci.\n&3ZDOBYWANIE XP:\n&eAby zdobywa\u0107 XP musisz atakowa\u0107 moby\n&elub graczy siekier\u0105. +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=&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=&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=&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=&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=&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=&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=&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 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=&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=&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=&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= &cNie masz uprawnie\u0144 do sprawdzania graczy offline! +Inspect.OfflineStats=Statystyki mcMMO dla gracza off-line &e{0} +Inspect.Stats=&Statystyki amcMMO dla &e{0} +Inspect.TooFar=Jeste\u015b za daleko, aby sprawdzi\u0107 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\u0119 do \u0142\u00f3\u017cka. +Item.ChimaeraWing.NotEnough=Potrzebujesz &e{0}&c wi\u0119cej o &6{1}&c! +Item.NotEnough=Potrzebujesz &e{0}&c wi\u0119cej o &6{1}&c! +Item.Generic.Wait=Musisz odczeka\u0107 zanim ponownie to u\u017cyjesz! &e({0}s) +Item.Injured.Wait=Niedawno by\u0142e\u015b kontuzjowany i musisz poczeka\u0107, zanim to wykorzystasz. &e({0}s) +Item.FluxPickaxe.Name=Topi\u0105cy Kilof +Item.FluxPickaxe.Lore.1=&7Ma szanse na natychmiastowe przepalenie rudy. +Item.FluxPickaxe.Lore.2=&7Wymaga poziomu &6Przepalanie: &7{0}+ +#TELEPORTATION +Teleport.Commencing=&7Rozpoczynanie teleportacji… Przez &6({0}) &7sekund, nie ruszaj si\u0119... Teleport.Cancelled=&4Teleportacja anulowana! -Skills.Disarmed=&4Zostales rozbrojony! -Skills.Header=-----[]&a{0}&c[]----- -Skills.NeedMore=&4Potrzebujesz wiecej +#SKILLS +Skills.Child=&6(SUB-UMIEJ\u0118TNO\u015aCI) +Skills.Disarmed=&4Zosta\u0142e\u015b rozbrojony! +Skills.Header=-----[] &a{0}&c []----- +Skills.NeedMore=&4Potrzebujesz wi\u0119cej &7{0} +Skills.NeedMore.Extra=&4Potrzebujesz wi\u0119cej &7{0}{1} +Skills.Parents= UMIEJ\u0118TNO\u015a\u0106 Skills.Stats={0}&a{1}&3 XP(&7{2}&3/&7{3}&3) -Skills.TooTired=Musisz odpoczac zanim ponownie uzyjesz tej umiejetnosci. -Skills.ConfirmOrCancel=&aPrawy-klik ponownie by potwierdzic &6{0}&a. Lewy-klik by anulowac. -Stats.Header.Combat=&6-=UMIEJ\u0118TNO\u015aCI BOJOWE=- -Stats.Header.Gathering=&6-=UMIEJ\u0118TNO\u015aCI ZBIERANIA=- -Stats.Header.Misc=&6-=ROZNE UMIEJETNOSCI=- +Skills.ChildStats={0}&a{1} +Skills.MaxXP=Max +Skills.TooTired=Jeste\u015b zbyt zm\u0119czony, aby ponownie u\u017cy\u0107 tej zdolno\u015bci. &e({0}s) +Skills.TooTired.Named=&7(&6{0}&e {1}s&7) +Skills.TooTired.Extra=&6{0} &eCzas Odnowienia Super Umiej\u0119tno\u015bci - {1} +Skills.Cancelled=&6{0} &canulowano! +Skills.ConfirmOrCancel=&aKliknij Prawy-przycisk-myszy, aby potwierdzi\u0107 &6{0}&a. Lewy, aby anulowa\u0107. +Skills.AbilityGateRequirementFail=&7Potrzebujesz wi\u0119kszy poziom o &e{0}&7, aby u\u017cy\u0107 super umiej\u0119tno\u015b\u0107 &3{1}&7. +#STATISTICS +Stats.Header.Combat=&6-=UMIEJ\u0118TNO\u015aCI WALKI=- +Stats.Header.Gathering=&6-=ZBI\u00d3R UMIEJ\u0118TNO\u015aCI=- +Stats.Header.Misc=&6-=R\u00d3\u017bNE UMIEJ\u0118TNO\u015aCI=- Stats.Own.Stats=&a[mcMMO] Statystyki +#PERKS Perks.XP.Name=Do\u015bwiadczenie -Perks.XP.Desc=Otrzymuje {0}x XP\'a. +Perks.XP.Desc=Otrzymuj zwi\u0119kszone XP w niekt\u00f3rych wiadomo\u015bciach. 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=&6 ({0} ze zdolno\u015bci\u0105 Szcz\u0119\u015bcia) -Perks.Cooldowns.Name=Szybka Regeneracja -Perks.Cooldowns.Desc=Zmniejsza czas odnowienia zdolno\u015bci o {0}. +Perks.Lucky.Desc=Daje {0} umiej\u0119tno\u015bci i zdolno\u015bci o 33.3% wi\u0119kszej szansy na aktywacje. +Perks.Lucky.Desc.Login=Daje niekt\u00f3rym umiej\u0119tno\u015bciom i zdolno\u015bciom o 33,3% wi\u0119ksz\u0105 szans\u0119 na aktywacj\u0119. +Perks.Lucky.Bonus=&6 ({0} z perkiem Szcz\u0119\u015bcie) +Perks.Cooldowns.Name=Szybki powr\u00f3t do zdrowia +Perks.Cooldowns.Desc=Skraca czas odnowienia 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=&6 ({0}s ze zdolno\u015bci\u0105 Wytrzyma\u0142o\u015bci) -MOTD.Donate=&3Informacje o Dotacji: -MOTD.Hardcore.DeathStatLoss.Stats=&6[mcMMO] &3Kara za \u015amier\u0107: &4{0}% -MOTD.Hardcore.Vampirism.Stats=&6[mcMMO] &3Statystyki Wampirycznych Pijawek: &4{0}% -MOTD.PerksPrefix=[mcMMO Zdolno\u015bci] -MOTD.Version=&6[mcMMO] Obecna Wersja &3{0} -MOTD.Website=&6[mcMMO] &a{0}&e - Strona mcMMO -Smelting.Ability.FuelEfficiency=Mnoznik wydajnosci paliwa: &e{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: &e{0} -Smelting.Ability.VanillaXPBoost=Vanilla mnoznik XP: &e{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=&aZloze 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. -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. +Perks.ActivationTime.Desc=Zwi\u0119ksza czas aktywacji umiej\u0119tno\u015bci o {0} sekund. +Perks.ActivationTime.Bonus=&6 ({0}s z perkiem Wytrzyma\u0142o\u015b\u0107) +#HARDCORE +Hardcore.Mode.Disabled=&6[mcMMO] Hardcore mode {0} wy\u0142\u0105czony dla {1}. +Hardcore.Mode.Enabled=&6[mcMMO] Hardcore mode {0} w\u0142\u0105czony dla {1}. +Hardcore.DeathStatLoss.Name=Skill Death Penalty +Hardcore.DeathStatLoss.PlayerDeath=&6[mcMMO] &4Straci\u0142e\u015b/a\u015b &9{0}&4 poziom\u00f3w przez \u015bmier\u0107. +Hardcore.DeathStatLoss.PercentageChanged=&6[mcMMO] Procent utraty statystyk zosta\u0142 zmieniony na {0}. +Hardcore.Vampirism.Name=Wampiryzm +Hardcore.Vampirism.Killer.Failure=&6[mcMMO] &e{0}&7 by\u0142/a zbyt niewykwalifikowany, aby udzieli\u0107 ci jakiejkolwiek wiedzy. +Hardcore.Vampirism.Killer.Success=&6[mcMMO] &3Ukrad\u0142e\u015b/a\u015b &9{0}&3 poziom\u00f3w od &e{1}. +Hardcore.Vampirism.Victim.Failure=&6[mcMMO] &e{0}&7 nie by\u0142 wstanie Ci ukra\u015b\u0107 umiej\u0119tno\u015bci! +Hardcore.Vampirism.Victim.Success=&6[mcMMO] &e{0}&4 ukrad\u0142/a &9{1}&4 poziom\u00f3w od Ciebie! +Hardcore.Vampirism.PercentageChanged=&6[mcMMO] Procent wampiryzmu zosta\u0142 zmieniony na {0}. +#MOTD +MOTD.Donate=&3Info o Donacjach: +MOTD.Hardcore.Enabled=&6[mcMMO] &3Hardcore Mode w\u0142\u0105czony: &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\u0107 Sztuk\u0119 +Smelting.SubSkill.UnderstandingTheArt.Description=Mo\u017ce sp\u0119dzasz za du\u017co czasu przepalaj\u0105c rudy w jaskini.\nTa umiej\u0119tno\u015b\u0107 wzmacnia r\u00f3\u017cne w\u0142a\u015bciwo\u015bci wytapiania. +Smelting.SubSkill.UnderstandingTheArt.Stat=Mno\u017cnik XP z piecyk\u00f3w: &e{0}x +Smelting.Ability.Locked.0=ZABLOKOWANE DO {0}+ UMIEJ\u0118TNO\u015a\u0106 (WZMOCNIEENIE XP VANILLA) +Smelting.Ability.Locked.1=ZABLOKOWANE DO {0}+ UMIEJ\u0118TNO\u015a\u0106 (G\u00d3RNICZE PRZEPALANIE) +Smelting.SubSkill.FuelEfficiency.Name=Efektywno\u015b\u0107 Paliwa +Smelting.SubSkill.FuelEfficiency.Description=Zwi\u0119ksza czas po jakim spala si\u0119 paliwo u\u017cywane w piecyku. +Smelting.SubSkill.FuelEfficiency.Stat=Mno\u017cnik efektywno\u015bci paliwa: &e{0}x +Smelting.SubSkill.SecondSmelt.Name=Podw\u00f3jne 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\u0119ksza XP dostawane za przepalanie w piecykach +Smelting.SubSkill.FluxMining.Name=G\u00f3rnicze 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\u017cytkownika +Commands.Description.adminchat=W\u0142\u0105cz/wy\u0142\u0105cz czat administratora mcMMO lub wysy\u0142anie wiadomo\u015bci na czacie administracyjnym +Commands.Description.addxp=Dodano mcMMO XP graczowi +Commands.Description.hardcore=Zmodyfikuj procent hardcore mcMMO lub w\u0142\u0105cz/wy\u0142\u0105cz tryb hardcore +Commands.Description.inspect=Wy\u015bwietl szczeg\u00f3\u0142owe informacje mcMMO o innym graczu +Commands.Description.mcability=W\u0142\u0105cz/wy\u0142\u0105cz przygotowywanie umiej\u0119tno\u015bci mcMMO po klikni\u0119ciu prawym przyciskiem myszy +Commands.Description.mccooldown=Zobacz wszystkie czasy odnowienia zdolno\u015bci mcMMO +Commands.Description.mcchatspy=W\u0142\u0105cz/wy\u0142\u0105cz mcMMO spy czat\u00f3w dru\u017cynowych +Commands.Description.mcgod=Prze\u0142\u0105cz mcMMO god-mode: w\u0142\u0105cz/wy\u0142\u0105cz +Commands.Description.mchud=Zmie\u0144 sw\u00f3j styl mcMMO HUD +Commands.Description.mcmmo=Poka\u017c kr\u00f3tki opis mcMMO +Commands.Description.mcnotify=W\u0142\u0105cz/wy\u0142\u0105cz mcMMO wy\u015bwietlanie powiadomie\u0144 o umiej\u0119tno\u015bciach na czacie +Commands.Description.mcpurge=Usu\u0144 u\u017cytkownik\u00f3w bez poziom\u00f3w umiej\u0119tno\u015bci mcMMO i u\u017cytkownik\u00f3w, kt\u00f3rzy nie nawi\u0105zali po\u0142\u0105czenia od ponad {0} miesi\u0119cy z baz\u0105 danych mcMMO. +Commands.Description.mcrank=Poka\u017c ranking mcMMO dla gracza +Commands.Description.mcrefresh=Od\u015bwie\u017c wszystkie czasy odnowienia mcMMO +Commands.Description.mcremove=Usu\u0144 gracza z bazy danych mcMMO +Commands.Description.mcscoreboard=Zarz\u0105dzaj tablic\u0105 wynik\u00f3w mcMMO +Commands.Description.mcstats=Poka\u017c swoje poziomy i XP w mcMMO +Commands.Description.mctop=Poka\u017c tablice lider\u00f3w mcMMO +Commands.Description.mmoedit=Edytuj poziomy mcMMO dla u\u017cytkownika +Commands.Description.mmodebug=Prze\u0142\u0105cz tryb debugowania, kt\u00f3ry wy\u015bwietla przydatne informacje po trafieniu w bloki +Commands.Description.mmoupdate=Przeprowad\u017a migracj\u0119 bazy danych mcMMO ze starej bazy danych do bie\u017c\u0105cej +Commands.Description.mcconvert=Konwertuje typy baz danych lub typy formu\u0142 do\u015bwiadczenia +Commands.Description.mmoshowdb=Poka\u017c nazw\u0119 bie\u017c\u0105cego typu bazy danych (do p\u00f3\u017aniejszego u\u017cycia /mmoupdate) +Commands.Description.party=Kontroluj r\u00f3\u017cne ustawienia dru\u017cyn mcMMO +Commands.Description.partychat=W\u0142\u0105cz / wy\u0142\u0105cz czat grupy mcMMO lub wysy\u0142anie wiadomo\u015bci czatu w grupie +Commands.Description.ptp=Teleportuj si\u0119 do cz\u0142onka dru\u017cyny mcMMO +Commands.Description.Skill=Wy\u015bwietl szczeg\u00f3\u0142owe informacje o umiej\u0119tno\u015bciach mcMMO dla gracza {0} +Commands.Description.skillreset=Zresetuj poziomy mcMMO dla u\u017cytkownika +Commands.Description.vampirism=Zmodyfikuj procent wampiryzmu mcMMO lub w\u0142\u0105cz/wy\u0142\u0105cz tryb wampiryzmu +Commands.Description.xplock=Zablokuj pasek mcMMO XP na okre\u015blonej umiej\u0119tno\u015bci mcMMO +Commands.Description.xprate=Zmie\u0144 ilo\u015b\u0107 mcMMO XP lub rozpocznij wydarzenie mcMMO XP +#UPDATE CHECKER +UpdateChecker.Outdated=U\u017cywasz przestarza\u0142ej wersji mcMMO! +UpdateChecker.NewAvailable=Jest nowa wersja dost\u0119pna 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\u0105ce XP +Scoreboard.Misc.Cooldown=&dCzas Odnowienia +Scoreboard.Misc.Overall=&6Og\u00f3lne +Scoreboard.Misc.Ability=Umiej\u0119tno\u015b\u0107 +#DATABASE RECOVERY +Profile.PendingLoad=&cTwoja baza danych graczy mcMMO nie zosta\u0142a jeszcze za\u0142adowana. +Profile.Loading.Success=&aTw\u00f3j profil mcMMO zosta\u0142 za\u0142adowany. +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\u00f3g\u0142 za\u0142adowa\u0107 danych odtwarzacza dla &e{0}&c. &dSprawd\u017a konfiguracj\u0119 bazy danych. Pr\u00f3by podj\u0119te do tej pory: {1}. +#Holiday +Holiday.AprilFools.Levelup=&6{0} jest teraz na poziomie &a{1}&6! +Holiday.Anniversary=&9Szcz\u0119\u015bliwej {0} rocznicy!\n&9Na cze\u015b\u0107 ca\u0142ej pracy nossr50 i wszystkich tw\u00f3rc\u00f3w, oto pokaz sztucznych ogni! +#Reminder Messages +Reminder.Squelched=&7Przypomnienie: Obecnie nie otrzymujesz powiadomie\u0144 od mcMMO, aby w\u0142\u0105czy\u0107 powiadomienia, uruchom ponownie komend\u0119 /mcnotify. To jest automatyczne przypomnienie godzinowe. +#Locale +Locale.Reloaded=&aPliki lokalne prze\u0142adowane! +#Player Leveling Stuff +LevelCap.PowerLevel=&6(&amcMMO&6) &eOsi\u0105gn\u0105\u0142e\u015b maksymalny poziom mocy wynosz\u0105cy &c{0}&e. Od tego momentu przestaniesz zdobywa\u0107 kolejne poziomy od tej umiej\u0119tno\u015bci. +LevelCap.Skill=&6(&amcMMO&6) &eOsi\u0105gn\u0105\u0142e\u015b maksymalny poziom &c{0}&e dla &6{1}&e. Od tego momentu przestaniesz zdobywa\u0107 kolejne poziomy tej umiej\u0119tno\u015bci. +Commands.XPBar.Usage=Prawid\u0142owe u\u017cycie to /mmoxpbar +Commands.Description.mmoxpbar=Ustawienia paska mcMMO XP dla gracza +Commands.Description.mmocompat=Informacje o mcMMO i czy jest w trybie zgodno\u015bci lub w pe\u0142ni funkcjonalna. +Compatibility.Layer.Unsupported=&6Kompatybilno\u015b\u0107 dla &a{0}&6 is nie jest wspierana dla tej wersji Minecraft. +Compatibility.Layer.PartialSupport=&6Kompatybilno\u015b\u0107 dla &a{0}&6 nie jest w pe\u0142ni wspierana dla tej wersji Minecraft, ale mcMMO uruchamia dodatkowy system, aby emulowa\u0107 niekt\u00f3re brakuj\u0105ce funkcje. +Commands.XPBar.DisableAll=&6 Wszystkie paski mcMMO XP s\u0105 teraz wy\u0142\u0105czone, u\u017cyj /mmoxpbar reset, aby przywr\u00f3ci\u0107 ustawienia domy\u015blne. +#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* Konsola * +Chat.Channel.On=&6(&amcMMO-Chat&6) &eTwoje wiadomo\u015bci czatu b\u0119d\u0105 teraz automatycznie dostarczane do kana\u0142u &a{0}&e. +Chat.Channel.Off=&6(&amcMMO-Chat&6) &7Twoje wiadomo\u015bci na czacie nie b\u0119d\u0105 ju\u017c automatycznie dostarczane do okre\u015blonych kana\u0142\u00f3w czatu. +Chat.Spy.Party=&6[&eSPY&6-&a{2}&6] &r{0} &b\u2192 &r{1} +Broadcasts.LevelUpMilestone=&6(&amcMMO&6) {0}&7 osi\u0105gn\u0105\u0142 poziom &a{1}&7 w &3{2}&7! +Broadcasts.PowerLevelUpMilestone=&6(&amcMMO&6) {0}&7 osi\u0105gn\u0105\u0142 poziom mocy &a{1}&7! +Scoreboard.Recovery=Pr\u00f3ba odzyskania tablicy wynik\u00f3w mcMMO... From 0636f578ddeebf12ff1019dfc5b2b4edd13f2d34 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Wed, 7 Apr 2021 16:16:04 -0700 Subject: [PATCH 475/662] Update changelog --- Changelog.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/Changelog.txt b/Changelog.txt index 214066e89..14423b85a 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,5 +1,6 @@ Version 2.1.189 Removed UP warning + Updated pl locale (Thanks Mich3l3k) NOTES: Ultra Permissions is SAFE to use with mcMMO From 5080d86e447b48eb2775f4520fab7fb1888e57ee Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 8 Apr 2021 10:39:07 -0700 Subject: [PATCH 476/662] Refactoring code part 1 to prep for adding a bunch of unit tests --- Changelog.txt | 1 + .../com/gmail/nossr50/api/ExperienceAPI.java | 5 +- .../java/com/gmail/nossr50/api/PartyAPI.java | 3 +- .../gmail/nossr50/commands/MHDCommand.java | 46 --- .../gmail/nossr50/commands/McmmoCommand.java | 3 +- .../nossr50/commands/McscoreboardCommand.java | 4 +- .../gmail/nossr50/commands/XprateCommand.java | 10 +- .../database/ConvertDatabaseCommand.java | 9 +- .../commands/database/McpurgeCommand.java | 3 +- .../commands/database/MmoshowdbCommand.java | 4 +- .../commands/party/PartyInfoCommand.java | 4 +- .../commands/party/PartyInviteCommand.java | 4 +- .../commands/party/PartyItemShareCommand.java | 4 +- .../commands/party/PartyXpShareCommand.java | 4 +- .../party/alliance/PartyAllianceCommand.java | 6 +- .../party/teleport/PtpAcceptCommand.java | 6 +- .../commands/party/teleport/PtpCommand.java | 13 +- .../commands/player/InspectCommand.java | 13 +- .../commands/player/MccooldownCommand.java | 6 +- .../commands/player/McrankCommand.java | 7 +- .../commands/player/McstatsCommand.java | 8 +- .../nossr50/commands/player/MctopCommand.java | 7 +- .../commands/skills/AcrobaticsCommand.java | 2 +- .../nossr50/commands/skills/SkillCommand.java | 15 +- .../commands/skills/SwordsCommand.java | 18 +- .../gmail/nossr50/config/AdvancedConfig.java | 38 +-- .../config/AutoUpdateConfigLoader.java | 12 +- .../gmail/nossr50/config/ConfigLoader.java | 24 +- .../{Config.java => GeneralConfig.java} | 93 +----- .../com/gmail/nossr50/config/RankConfig.java | 3 +- .../nossr50/database/DatabaseManager.java | 7 +- .../database/DatabaseManagerFactory.java | 17 +- .../database/FlatFileDatabaseManager.java | 282 ++++++------------ .../nossr50/database/SQLDatabaseManager.java | 82 ++--- .../datatypes/LevelUpBroadcastPredicate.java | 11 +- .../PowerLevelUpBroadcastPredicate.java | 11 +- .../gmail/nossr50/datatypes/party/Party.java | 11 +- .../nossr50/datatypes/party/PartyFeature.java | 4 +- .../datatypes/party/PartyTeleportRecord.java | 4 +- .../nossr50/datatypes/player/McMMOPlayer.java | 30 +- .../datatypes/player/PlayerProfile.java | 23 +- .../datatypes/skills/PrimarySkillType.java | 59 ++-- .../datatypes/skills/SubSkillType.java | 3 +- .../datatypes/skills/SuperAbilityType.java | 5 +- .../datatypes/skills/interfaces/Skill.java | 96 ++++++ .../skills/subskills/acrobatics/Roll.java | 110 ++++++- .../secondaryabilities/SubSkillEvent.java | 6 +- .../nossr50/listeners/BlockListener.java | 11 +- .../nossr50/listeners/EntityListener.java | 6 +- .../nossr50/listeners/InventoryListener.java | 7 +- .../nossr50/listeners/PlayerListener.java | 29 +- .../gmail/nossr50/listeners/SelfListener.java | 7 +- .../gmail/nossr50/locale/LocaleLoader.java | 5 +- src/main/java/com/gmail/nossr50/mcMMO.java | 76 +++-- .../com/gmail/nossr50/party/PartyManager.java | 13 +- .../com/gmail/nossr50/party/ShareHandler.java | 4 +- .../runnables/backups/CleanBackupsTask.java | 7 +- .../commands/McrankCommandDisplayTask.java | 3 +- .../commands/MctopCommandDisplayTask.java | 3 +- .../runnables/database/UserPurgeTask.java | 3 +- .../runnables/items/ChimaeraWingWarmup.java | 6 +- .../runnables/items/TeleportationWarmup.java | 6 +- .../runnables/party/PartyAutoKickTask.java | 3 +- .../player/PlayerProfileLoadingTask.java | 7 +- .../runnables/skills/AbilityDisableTask.java | 6 +- .../runnables/skills/BleedTimerTask.java | 4 +- .../nossr50/runnables/skills/RuptureTask.java | 4 +- .../runnables/skills/ToolLowerTask.java | 4 +- .../nossr50/skills/acrobatics/Acrobatics.java | 7 +- .../gmail/nossr50/skills/alchemy/Alchemy.java | 9 +- .../gmail/nossr50/skills/archery/Archery.java | 8 +- .../com/gmail/nossr50/skills/axes/Axes.java | 18 +- .../nossr50/skills/axes/AxesManager.java | 4 +- .../skills/excavation/ExcavationManager.java | 4 +- .../skills/fishing/FishingManager.java | 24 +- .../skills/herbalism/HerbalismManager.java | 5 +- .../nossr50/skills/mining/BlastMining.java | 7 +- .../nossr50/skills/mining/MiningManager.java | 18 +- .../nossr50/skills/repair/ArcaneForging.java | 6 +- .../gmail/nossr50/skills/repair/Repair.java | 9 +- .../nossr50/skills/repair/RepairManager.java | 14 +- .../gmail/nossr50/skills/salvage/Salvage.java | 13 +- .../skills/salvage/SalvageManager.java | 14 +- .../skills/smelting/SmeltingManager.java | 4 +- .../gmail/nossr50/skills/swords/Swords.java | 6 +- .../nossr50/skills/swords/SwordsManager.java | 9 +- .../gmail/nossr50/skills/taming/Taming.java | 12 +- .../nossr50/skills/taming/TamingManager.java | 22 +- .../skills/taming/TrackedTamingEntity.java | 3 +- .../gmail/nossr50/skills/unarmed/Unarmed.java | 4 +- .../skills/unarmed/UnarmedManager.java | 7 +- .../woodcutting/WoodcuttingManager.java | 10 +- .../com/gmail/nossr50/util/BlockUtils.java | 11 +- .../com/gmail/nossr50/util/ChimaeraWing.java | 29 +- .../com/gmail/nossr50/util/EventUtils.java | 6 +- .../gmail/nossr50/util/HardcoreManager.java | 10 +- .../com/gmail/nossr50/util/ItemUtils.java | 6 +- .../gmail/nossr50/util/MobHealthbarUtils.java | 7 +- .../com/gmail/nossr50/util/ModManager.java | 39 ++- .../java/com/gmail/nossr50/util/Motd.java | 5 +- .../com/gmail/nossr50/util/Permissions.java | 11 - .../commands/CommandRegistrationManager.java | 13 +- .../nossr50/util/commands/CommandUtils.java | 7 +- .../util/experience/FormulaManager.java | 3 +- .../util/player/NotificationManager.java | 22 +- .../nossr50/util/random/RandomChanceUtil.java | 12 +- .../util/scoreboards/ScoreboardManager.java | 33 +- .../util/scoreboards/ScoreboardWrapper.java | 5 +- .../nossr50/util/skills/CombatUtils.java | 3 +- .../util/skills/ParticleEffectUtils.java | 14 +- .../gmail/nossr50/util/skills/SkillUtils.java | 12 +- .../util/text/TextComponentFactory.java | 3 +- .../shatt/backup/ZipLibrary.java | 3 +- src/main/resources/plugin.yml | 3 - .../database/FlatFileDatabaseManagerTest.java | 119 ++++++++ 115 files changed, 993 insertions(+), 970 deletions(-) delete mode 100644 src/main/java/com/gmail/nossr50/commands/MHDCommand.java rename src/main/java/com/gmail/nossr50/config/{Config.java => GeneralConfig.java} (89%) create mode 100644 src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java diff --git a/Changelog.txt b/Changelog.txt index 14423b85a..8e1b2d0e6 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,4 +1,5 @@ Version 2.1.189 + Removed MHD command (it didn't do anything for a while now) Removed UP warning Updated pl locale (Thanks Mich3l3k) diff --git a/src/main/java/com/gmail/nossr50/api/ExperienceAPI.java b/src/main/java/com/gmail/nossr50/api/ExperienceAPI.java index be325c281..158aafa27 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; @@ -802,7 +801,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.getGeneralConfig().getLevelCap(getSkillType(skillType)); } /** @@ -813,7 +812,7 @@ public final class ExperienceAPI { * @return the overall power level cap */ public static int getPowerLevelCap() { - return Config.getInstance().getPowerLevelCap(); + return mcMMO.p.getGeneralConfig().getPowerLevelCap(); } /** diff --git a/src/main/java/com/gmail/nossr50/api/PartyAPI.java b/src/main/java/com/gmail/nossr50/api/PartyAPI.java index 97a2bbe40..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(); } /** 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 d3b547acc..000000000 --- a/src/main/java/com/gmail/nossr50/commands/MHDCommand.java +++ /dev/null @@ -1,46 +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 org.jetbrains.annotations.NotNull; - -import java.util.List; - -public class MHDCommand implements TabExecutor { - - @Override - public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull 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(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, String[] args) { - 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 9c09763ca..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; @@ -26,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"); } diff --git a/src/main/java/com/gmail/nossr50/commands/McscoreboardCommand.java b/src/main/java/com/gmail/nossr50/commands/McscoreboardCommand.java index 1afaa110e..4748a5708 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; @@ -32,7 +32,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; } diff --git a/src/main/java/com/gmail/nossr50/commands/XprateCommand.java b/src/main/java/com/gmail/nossr50/commands/XprateCommand.java index 150b97590..f5ad2641c 100644 --- a/src/main/java/com/gmail/nossr50/commands/XprateCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/XprateCommand.java @@ -1,7 +1,5 @@ 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; @@ -39,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"), @@ -47,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")); @@ -92,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"), @@ -100,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)); 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 6bbee5f9f..bc383cf99 100644 --- a/src/main/java/com/gmail/nossr50/commands/database/ConvertDatabaseCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/database/ConvertDatabaseCommand.java @@ -27,7 +27,13 @@ public class ConvertDatabaseCommand implements CommandExecutor { 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; + } + + oldDatabase.init(); if (previousType == DatabaseType.CUSTOM) { Class clazz; @@ -41,6 +47,7 @@ public class ConvertDatabaseCommand implements CommandExecutor { } oldDatabase = DatabaseManagerFactory.createCustomDatabaseManager((Class) clazz); + oldDatabase.init(); } catch (Throwable e) { e.printStackTrace(); sender.sendMessage(LocaleLoader.getString("Commands.mcconvert.Database.InvalidType", args[1])); 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 9bc472875..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,6 +1,5 @@ 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; @@ -17,7 +16,7 @@ public class McpurgeCommand implements TabExecutor { if (args.length == 0) { mcMMO.getDatabaseManager().purgePowerlessUsers(); - if (Config.getInstance().getOldUsersCutoff() != -1) { + if (mcMMO.p.getGeneralConfig().getOldUsersCutoff() != -1) { mcMMO.getDatabaseManager().purgeOldUsers(); } 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 aafae253e..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,8 +1,8 @@ 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; @@ -22,7 +22,7 @@ public class MmoshowdbCommand implements TabExecutor { return true; } - sender.sendMessage(LocaleLoader.getString("Commands.mmoshowdb", (Config.getInstance().getUseMySQL() ? "sql" : "flatfile"))); + sender.sendMessage(LocaleLoader.getString("Commands.mmoshowdb", (mcMMO.p.getGeneralConfig().getUseMySQL() ? "sql" : "flatfile"))); return true; } return false; 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 ec28ac529..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; @@ -85,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 7d6c6a8ca..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; @@ -53,7 +53,7 @@ public class PartyInviteCommand implements CommandExecutor { Party playerParty = mcMMOPlayer.getParty(); if (PartyManager.isPartyFull(target, playerParty)) { - player.sendMessage(LocaleLoader.getString("Commands.Party.PartyFull.Invite", target.getName(), playerParty.toString(), Config.getInstance().getPartyMaxSize())); + player.sendMessage(LocaleLoader.getString("Commands.Party.PartyFull.Invite", target.getName(), playerParty.toString(), mcMMO.p.getGeneralConfig().getPartyMaxSize())); 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 4b0d8fb23..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,11 +1,11 @@ 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.mcMMO; import com.gmail.nossr50.util.commands.CommandUtils; import com.gmail.nossr50.util.player.UserManager; import com.gmail.nossr50.util.text.StringUtils; @@ -28,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/PartyXpShareCommand.java b/src/main/java/com/gmail/nossr50/commands/party/PartyXpShareCommand.java index a8354914e..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,10 +1,10 @@ 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.mcMMO; import com.gmail.nossr50.util.commands.CommandUtils; import com.gmail.nossr50.util.player.UserManager; import com.gmail.nossr50.util.text.StringUtils; @@ -25,7 +25,7 @@ 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; } 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 d97edf3d7..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; @@ -51,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; } @@ -69,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; } 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 86728e272..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; @@ -35,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; @@ -48,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 893164435..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; @@ -76,7 +75,7 @@ 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; } @@ -91,7 +90,7 @@ public class PtpCommand implements TabExecutor { } long recentlyHurt = mcMMOPlayer.getRecentlyHurt(); - int hurtCooldown = Config.getInstance().getPTPCommandRecentlyHurtCooldown(); + int hurtCooldown = mcMMO.p.getGeneralConfig().getPTPCommandRecentlyHurtCooldown(); if (hurtCooldown > 0) { int timeRemaining = SkillUtils.calculateTimeLeft(recentlyHurt * Misc.TIME_CONVERSION_FACTOR, hurtCooldown, player); @@ -111,7 +110,7 @@ public class PtpCommand implements TabExecutor { return true; } - int ptpCooldown = Config.getInstance().getPTPCommandCooldown(); + int ptpCooldown = mcMMO.p.getGeneralConfig().getPTPCommandCooldown(); long ptpLastUse = mcMMOPlayer.getPartyTeleportRecord().getLastUse(); if (ptpCooldown > 0) { @@ -165,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(); @@ -194,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) { @@ -245,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/player/InspectCommand.java b/src/main/java/com/gmail/nossr50/commands/player/InspectCommand.java index a65004417..267ebca4f 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; @@ -36,12 +35,12 @@ public class InspectCommand implements TabExecutor { return true; } - if (Config.getInstance().getScoreboardsEnabled() + if (mcMMO.p.getGeneralConfig().getScoreboardsEnabled() && sender instanceof Player - && Config.getInstance().getInspectUseBoard()) { + && mcMMO.p.getGeneralConfig().getInspectUseBoard()) { ScoreboardManager.enablePlayerInspectScoreboard((Player) sender, profile); - if (!Config.getInstance().getInspectUseChat()) { + if (!mcMMO.p.getGeneralConfig().getInspectUseChat()) { return true; } } @@ -76,12 +75,12 @@ public class InspectCommand implements TabExecutor { return true; } - if (Config.getInstance().getScoreboardsEnabled() + if (mcMMO.p.getGeneralConfig().getScoreboardsEnabled() && sender instanceof Player - && Config.getInstance().getInspectUseBoard()) { + && mcMMO.p.getGeneralConfig().getInspectUseBoard()) { ScoreboardManager.enablePlayerInspectScoreboard((Player) sender, mcMMOPlayer); - if (!Config.getInstance().getInspectUseChat()) { + if (!mcMMO.p.getGeneralConfig().getInspectUseChat()) { return true; } } 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 74011a39c..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; @@ -30,10 +30,10 @@ public class MccooldownCommand implements TabExecutor { if (args.length == 0) { Player player = (Player) sender; - if (Config.getInstance().getScoreboardsEnabled() && Config.getInstance().getCooldownUseBoard()) { + if (mcMMO.p.getGeneralConfig().getScoreboardsEnabled() && mcMMO.p.getGeneralConfig().getCooldownUseBoard()) { ScoreboardManager.enablePlayerCooldownScoreboard(player); - if (!Config.getInstance().getCooldownUseChat()) { + if (!mcMMO.p.getGeneralConfig().getCooldownUseChat()) { return true; } } 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 5a781cdfb..4958cbc54 100644 --- a/src/main/java/com/gmail/nossr50/commands/player/McrankCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/player/McrankCommand.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.locale.LocaleLoader; import com.gmail.nossr50.mcMMO; @@ -91,7 +90,7 @@ 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))); @@ -108,8 +107,8 @@ public class McrankCommand implements TabExecutor { 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 87025fac5..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; @@ -33,10 +33,10 @@ public class McstatsCommand implements TabExecutor { Player player = (Player) sender; - if (Config.getInstance().getStatsUseBoard() && Config.getInstance().getScoreboardsEnabled()) { + if (mcMMO.p.getGeneralConfig().getStatsUseBoard() && mcMMO.p.getGeneralConfig().getScoreboardsEnabled()) { ScoreboardManager.enablePlayerStatsScoreboard(player); - if (!Config.getInstance().getStatsUseChat()) { + if (!mcMMO.p.getGeneralConfig().getStatsUseChat()) { return true; } } @@ -48,7 +48,7 @@ public class McstatsCommand implements TabExecutor { CommandUtils.printCombatSkills(player); CommandUtils.printMiscSkills(player); - int powerLevelCap = Config.getInstance().getPowerLevelCap(); + int powerLevelCap = mcMMO.p.getGeneralConfig().getPowerLevelCap(); if (powerLevelCap != Integer.MAX_VALUE) { player.sendMessage(LocaleLoader.getString("Commands.PowerLevel.Capped", UserManager.getPlayer(player).getPowerLevel(), powerLevelCap)); 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 63ed2726e..0ef35cd0f 100644 --- a/src/main/java/com/gmail/nossr50/commands/player/MctopCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/player/MctopCommand.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.skills.PrimarySkillType; import com.gmail.nossr50.locale.LocaleLoader; @@ -86,7 +85,7 @@ 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.0D; @@ -112,8 +111,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); } 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 9b6e8ea2f..bb963168f 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/AcrobaticsCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/AcrobaticsCommand.java @@ -69,7 +69,7 @@ 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); 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 e550913fa..3f35a7e7e 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/SkillCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/SkillCommand.java @@ -1,11 +1,10 @@ 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.commands.CommandUtils; @@ -74,7 +73,7 @@ public abstract class SkillCommand implements TabExecutor { float skillValue = mcMMOPlayer.getSkillLevel(skill); //Send the players a few blank lines to make finding the top of the skill command easier - if (AdvancedConfig.getInstance().doesSkillCommandSendBlankLines()) + if (mcMMO.p.getAdvancedConfig().doesSkillCommandSendBlankLines()) for (int i = 0; i < 2; i++) { player.sendMessage(""); } @@ -106,13 +105,13 @@ public abstract class SkillCommand implements TabExecutor { //Link Header - if (Config.getInstance().getUrlLinksEnabled()) { + if (mcMMO.p.getGeneralConfig().getUrlLinksEnabled()) { player.sendMessage(LocaleLoader.getString("Overhaul.mcMMO.Header")); TextComponentFactory.sendPlayerUrlHeader(player); } - if (Config.getInstance().getScoreboardsEnabled() && Config.getInstance().getSkillUseBoard()) { + if (mcMMO.p.getGeneralConfig().getScoreboardsEnabled() && mcMMO.p.getGeneralConfig().getSkillUseBoard()) { ScoreboardManager.enablePlayerSkillScoreboard(player, skill); } @@ -226,8 +225,8 @@ 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 abilityLengthVar = mcMMO.p.getAdvancedConfig().getAbilityLength(); + int abilityLengthCap = mcMMO.p.getAdvancedConfig().getAbilityLengthCap(); int length; @@ -268,7 +267,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)"; 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 69a5e86ec..83e0264c0 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/SwordsCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/SwordsCommand.java @@ -1,9 +1,9 @@ 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.player.UserManager; import com.gmail.nossr50.util.skills.CombatUtils; @@ -46,17 +46,17 @@ public class SwordsCommand extends SkillCommand { // SWORDS_RUPTURE if (canRupture) { int ruptureRank = RankUtils.getRank(player, SubSkillType.SWORDS_RUPTURE); - ruptureLengthSecondsAgainstPlayers = String.valueOf(AdvancedConfig.getInstance().getRuptureDurationSeconds(true)); - ruptureLengthSecondsAgainstMobs = String.valueOf(AdvancedConfig.getInstance().getRuptureDurationSeconds(false)); + ruptureLengthSecondsAgainstPlayers = String.valueOf(mcMMO.p.getAdvancedConfig().getRuptureDurationSeconds(true)); + ruptureLengthSecondsAgainstMobs = String.valueOf(mcMMO.p.getAdvancedConfig().getRuptureDurationSeconds(false)); - rupturePureTickDamageAgainstPlayers = String.valueOf(AdvancedConfig.getInstance().getRuptureTickDamage(true, ruptureRank)); - rupturePureTickDamageAgainstMobs = String.valueOf(AdvancedConfig.getInstance().getRuptureTickDamage(false, ruptureRank)); + rupturePureTickDamageAgainstPlayers = String.valueOf(mcMMO.p.getAdvancedConfig().getRuptureTickDamage(true, ruptureRank)); + rupturePureTickDamageAgainstMobs = String.valueOf(mcMMO.p.getAdvancedConfig().getRuptureTickDamage(false, ruptureRank)); - ruptureExplosionDamageAgainstPlayers = String.valueOf(AdvancedConfig.getInstance().getRuptureExplosionDamage(true, ruptureRank)); - ruptureExplosionDamageAgainstMobs = String.valueOf(AdvancedConfig.getInstance().getRuptureExplosionDamage(false, ruptureRank)); + ruptureExplosionDamageAgainstPlayers = String.valueOf(mcMMO.p.getAdvancedConfig().getRuptureExplosionDamage(true, ruptureRank)); + ruptureExplosionDamageAgainstMobs = String.valueOf(mcMMO.p.getAdvancedConfig().getRuptureExplosionDamage(false, ruptureRank)); - ruptureChanceToApply = String.valueOf(AdvancedConfig.getInstance().getRuptureChanceToApplyOnHit(ruptureRank) + "%"); - ruptureChanceToApplyLucky = String.valueOf(AdvancedConfig.getInstance().getRuptureChanceToApplyOnHit(ruptureRank) * 1.33); + ruptureChanceToApply = String.valueOf(mcMMO.p.getAdvancedConfig().getRuptureChanceToApplyOnHit(ruptureRank) + "%"); + ruptureChanceToApplyLucky = String.valueOf(mcMMO.p.getAdvancedConfig().getRuptureChanceToApplyOnHit(ruptureRank) * 1.33); } // SERRATED STRIKES diff --git a/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java b/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java index 7e6f8e8a3..fd2736190 100644 --- a/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java +++ b/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java @@ -6,25 +6,17 @@ 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; - private AdvancedConfig() { - super("advanced.yml"); + public AdvancedConfig(File dataFolder) { + super("advanced.yml", dataFolder); validate(); } - public static AdvancedConfig getInstance() { - if (instance == null) { - instance = new AdvancedConfig(); - } - - return instance; - } - @Override protected boolean validateKeys() { // Validate all the settings! @@ -68,15 +60,6 @@ public class AdvancedConfig extends AutoUpdateConfigLoader { reason.add("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!"); } @@ -85,21 +68,6 @@ public class AdvancedConfig extends AutoUpdateConfigLoader { reason.add("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) { diff --git a/src/main/java/com/gmail/nossr50/config/AutoUpdateConfigLoader.java b/src/main/java/com/gmail/nossr50/config/AutoUpdateConfigLoader.java index 831dcf144..30fa038cb 100644 --- a/src/main/java/com/gmail/nossr50/config/AutoUpdateConfigLoader.java +++ b/src/main/java/com/gmail/nossr50/config/AutoUpdateConfigLoader.java @@ -11,10 +11,20 @@ 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); } @@ -136,7 +146,7 @@ public abstract class AutoUpdateConfigLoader extends ConfigLoader { saveName += ".new"; } - BufferedWriter writer = new BufferedWriter(new FileWriter(new File(plugin.getDataFolder(), saveName))); + BufferedWriter writer = new BufferedWriter(new FileWriter(new File(dataFolder, saveName))); writer.write(output); writer.flush(); writer.close(); diff --git a/src/main/java/com/gmail/nossr50/config/ConfigLoader.java b/src/main/java/com/gmail/nossr50/config/ConfigLoader.java index 7fb7f19d1..4a168fa50 100644 --- a/src/main/java/com/gmail/nossr50/config/ConfigLoader.java +++ b/src/main/java/com/gmail/nossr50/config/ConfigLoader.java @@ -3,6 +3,7 @@ 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; @@ -12,16 +13,33 @@ public abstract class ConfigLoader { protected String fileName; protected final File configFile; protected FileConfiguration config; + protected @NotNull File dataFolder; - 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); + loadFile(); + } + + @Deprecated public ConfigLoader(String fileName) { this.fileName = fileName; - configFile = new File(plugin.getDataFolder(), fileName); + configFile = new File(mcMMO.p.getDataFolder(), fileName); loadFile(); } diff --git a/src/main/java/com/gmail/nossr50/config/Config.java b/src/main/java/com/gmail/nossr50/config/GeneralConfig.java similarity index 89% rename from src/main/java/com/gmail/nossr50/config/Config.java rename to src/main/java/com/gmail/nossr50/config/GeneralConfig.java index 18c87f528..e905a3ce1 100644 --- a/src/main/java/com/gmail/nossr50/config/Config.java +++ b/src/main/java/com/gmail/nossr50/config/GeneralConfig.java @@ -12,27 +12,19 @@ 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 Config extends AutoUpdateConfigLoader { - private static Config instance; +public class GeneralConfig extends AutoUpdateConfigLoader { - private Config() { - super("config.yml"); + public GeneralConfig(@NotNull File dataFolder) { + super("config.yml", dataFolder); validate(); } - public static Config getInstance() { - if (instance == null) { - instance = new Config(); - } - - return instance; - } - @Override protected void loadKeys() { @@ -63,47 +55,6 @@ public class Config extends AutoUpdateConfigLoader { 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!"); @@ -200,42 +151,6 @@ public class Config extends AutoUpdateConfigLoader { 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); } diff --git a/src/main/java/com/gmail/nossr50/config/RankConfig.java b/src/main/java/com/gmail/nossr50/config/RankConfig.java index 2fa1a353e..9bdf00947 100644 --- a/src/main/java/com/gmail/nossr50/config/RankConfig.java +++ b/src/main/java/com/gmail/nossr50/config/RankConfig.java @@ -2,6 +2,7 @@ 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; @@ -88,7 +89,7 @@ public class RankConfig extends AutoUpdateConfigLoader { * @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; diff --git a/src/main/java/com/gmail/nossr50/database/DatabaseManager.java b/src/main/java/com/gmail/nossr50/database/DatabaseManager.java index 7b6fc41cd..47baafe63 100644 --- a/src/main/java/com/gmail/nossr50/database/DatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/DatabaseManager.java @@ -1,7 +1,6 @@ package com.gmail.nossr50.database; import com.gmail.nossr50.api.exceptions.InvalidSkillException; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.datatypes.database.DatabaseType; import com.gmail.nossr50.datatypes.database.PlayerStat; import com.gmail.nossr50.datatypes.player.PlayerProfile; @@ -15,15 +14,13 @@ import java.util.Map; import java.util.UUID; public interface DatabaseManager { - // One month in milliseconds - long PURGE_TIME = 2630000000L * Config.getInstance().getOldUsersCutoff(); // During convertUsers, how often to output a status int progressInterval = 200; /** * Purge users with 0 power level from the database. */ - void purgePowerlessUsers(); + int purgePowerlessUsers(); /** * Purge users who haven't logged on in over a certain time frame from the database. @@ -76,6 +73,8 @@ public interface DatabaseManager { */ Map readRank(String playerName); + default void init() {}; + /** * Add a new user to the database. * diff --git a/src/main/java/com/gmail/nossr50/database/DatabaseManagerFactory.java b/src/main/java/com/gmail/nossr50/database/DatabaseManagerFactory.java index b6981403b..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,11 +59,11 @@ 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: mcMMO.p.getLogger().info("Using FlatFile Database"); - return new FlatFileDatabaseManager(); + return new FlatFileDatabaseManager(userFilePath, logger, purgeTime, startingLevel); case SQL: mcMMO.p.getLogger().info("Using SQL Database"); @@ -80,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/FlatFileDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java index ca2c78681..863d4f8f5 100644 --- a/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java @@ -1,15 +1,13 @@ package com.gmail.nossr50.database; import com.gmail.nossr50.api.exceptions.InvalidSkillException; -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.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.datatypes.skills.interfaces.Skill; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.Misc; import org.bukkit.OfflinePlayer; @@ -19,14 +17,20 @@ import org.jetbrains.annotations.Nullable; import java.io.*; import java.util.*; +import java.util.logging.Logger; public final class FlatFileDatabaseManager implements DatabaseManager { - private final HashMap> playerStatHash = new HashMap<>(); - private final List powerLevels = new ArrayList<>(); + public static final String IGNORED = "IGNORED"; + private final @NotNull HashMap> playerStatHash = new HashMap<>(); + 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 long UPDATE_WAIT_TIME = 600000L; // 10 minutes - private final File usersFile; + private final @NotNull File usersFile; private static final Object fileWritingLock = new Object(); public static int USERNAME_INDEX = 0; @@ -72,20 +76,26 @@ public final class FlatFileDatabaseManager implements DatabaseManager { public static int DATA_ENTRY_COUNT = COOLDOWN_CHIMAERA_WING + 1; //Update this everytime new data is added - protected FlatFileDatabaseManager() { - usersFile = new File(mcMMO.getUsersFilePath()); + protected FlatFileDatabaseManager(@NotNull String usersFilePath, @NotNull Logger logger, long purgeTime, int startingLevel) { + usersFile = new File(usersFilePath); + this.usersFilePath = usersFilePath; + this.logger = logger; + this.purgeTime = purgeTime; + this.startingLevel = startingLevel; + } + + public void init() { checkStructure(); updateLeaderboards(); } - public void purgePowerlessUsers() { + public int purgePowerlessUsers() { int purgedUsers = 0; - mcMMO.p.getLogger().info("Purging powerless users..."); + logger.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) { @@ -96,7 +106,7 @@ public final class FlatFileDatabaseManager implements DatabaseManager { while ((line = in.readLine()) != null) { String[] character = line.split(":"); - Map skills = getSkillMapFromLine(character); + Map skills = getSkillMapFromLine(character); boolean powerless = true; for (int skill : skills.values()) { @@ -120,7 +130,7 @@ public final class FlatFileDatabaseManager implements DatabaseManager { out.write(writer.toString()); } catch (IOException e) { - mcMMO.p.getLogger().severe("Exception while reading " + usersFilePath + " (Are you sure you formatted it correctly?)" + e.toString()); + logger.severe("Exception while reading " + usersFilePath + " (Are you sure you formatted it correctly?)" + e); } finally { if (in != null) { @@ -142,18 +152,18 @@ public final class FlatFileDatabaseManager implements DatabaseManager { } } - mcMMO.p.getLogger().info("Purged " + purgedUsers + " users from the database."); + logger.info("Purged " + purgedUsers + " users from the database."); + return purgedUsers; } public void purgeOldUsers() { int removedPlayers = 0; long currentTime = System.currentTimeMillis(); - mcMMO.p.getLogger().info("Purging old users..."); + logger.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) { @@ -179,7 +189,7 @@ public final class FlatFileDatabaseManager implements DatabaseManager { rewrite = true; } - if (currentTime - lastPlayed > PURGE_TIME) { + if (currentTime - lastPlayed > purgeTime) { removedPlayers++; } else { @@ -200,7 +210,7 @@ public final class FlatFileDatabaseManager implements DatabaseManager { out.write(writer.toString()); } catch (IOException e) { - mcMMO.p.getLogger().severe("Exception while reading " + usersFilePath + " (Are you sure you formatted it correctly?)" + e.toString()); + logger.severe("Exception while reading " + usersFilePath + " (Are you sure you formatted it correctly?)" + e); } finally { if (in != null) { @@ -222,7 +232,7 @@ public final class FlatFileDatabaseManager implements DatabaseManager { } } - mcMMO.p.getLogger().info("Purged " + removedPlayers + " users from the database."); + logger.info("Purged " + removedPlayers + " users from the database."); } public boolean removeUser(String playerName, UUID uuid) { @@ -231,7 +241,6 @@ public final class FlatFileDatabaseManager implements DatabaseManager { BufferedReader in = null; FileWriter out = null; - String usersFilePath = mcMMO.getUsersFilePath(); synchronized (fileWritingLock) { try { @@ -242,7 +251,7 @@ public final class FlatFileDatabaseManager implements DatabaseManager { 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)) { - mcMMO.p.getLogger().info("User found, removing..."); + logger.info("User found, removing..."); worked = true; continue; // Skip the player } @@ -254,7 +263,7 @@ public final class FlatFileDatabaseManager implements DatabaseManager { out.write(writer.toString()); } catch (Exception e) { - mcMMO.p.getLogger().severe("Exception while reading " + usersFilePath + " (Are you sure you formatted it correctly?)" + e.toString()); + logger.severe("Exception while reading " + usersFilePath + " (Are you sure you formatted it correctly?)" + e); } finally { if (in != null) { @@ -286,13 +295,12 @@ public final class FlatFileDatabaseManager implements DatabaseManager { //Not used in FlatFile } - public boolean saveUser(PlayerProfile profile) { + public boolean saveUser(@NotNull PlayerProfile profile) { String playerName = profile.getPlayerName(); UUID uuid = profile.getUniqueId(); BufferedReader in = null; FileWriter out = null; - String usersFilePath = mcMMO.getUsersFilePath(); boolean corruptDataFound = false; synchronized (fileWritingLock) { @@ -309,7 +317,7 @@ public final class FlatFileDatabaseManager implements DatabaseManager { if(!line.contains(":")) { if(!corruptDataFound) { - mcMMO.p.getLogger().severe("mcMMO found some unexpected or corrupted data in mcmmo.users and is removing it, it is possible some data has been lost."); + 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; } @@ -318,12 +326,11 @@ public final class FlatFileDatabaseManager implements DatabaseManager { String[] splitData = line.split(":"); - //This would be rare, but check the splitData for having enough entries to contain a username - if(splitData.length < USERNAME_INDEX) { //UUID have been in mcMMO DB for a very long time so any user without - //Something is wrong if we don't have enough split data to have an entry for a username + //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) { - mcMMO.p.getLogger().severe("mcMMO found some unexpected or corrupted data in mcmmo.users and is removing it, it is possible some data has been lost."); + 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; } @@ -378,7 +385,7 @@ public final class FlatFileDatabaseManager implements DatabaseManager { } } - private void writeUserToLine(PlayerProfile profile, String playerName, @Nullable UUID uuid, StringBuilder writer) { + private void writeUserToLine(PlayerProfile profile, @NotNull String playerName, @Nullable UUID uuid, StringBuilder writer) { writer.append(playerName).append(":"); writer.append(profile.getSkillLevel(PrimarySkillType.MINING)).append(":"); writer.append(":"); @@ -417,8 +424,7 @@ public final class FlatFileDatabaseManager implements DatabaseManager { 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(IGNORED).append(":"); //mob health bar writer.append(profile.getSkillLevel(PrimarySkillType.ALCHEMY)).append(":"); writer.append(profile.getSkillXpLevel(PrimarySkillType.ALCHEMY)).append(":"); writer.append(uuid != null ? uuid.toString() : "NULL").append(":"); @@ -430,7 +436,7 @@ public final class FlatFileDatabaseManager implements DatabaseManager { public @NotNull List readLeaderboard(@Nullable PrimarySkillType skill, int pageNumber, int statsPerPage) throws InvalidSkillException { //Fix for a plugin that people are using that is throwing SQL errors if(skill != null && skill.isChildSkill()) { - 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!"); + 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!"); } @@ -465,26 +471,26 @@ public final class FlatFileDatabaseManager implements DatabaseManager { synchronized (fileWritingLock) { try { // Open the file to write the player - out = new BufferedWriter(new FileWriter(mcMMO.getUsersFilePath(), true)); + out = new BufferedWriter(new FileWriter(usersFilePath, true)); - String startingLevel = AdvancedConfig.getInstance().getStartingLevel() + ":"; + String startingLevelStr = startingLevel + ":"; // Add the player to the end out.append(playerName).append(":"); - out.append(startingLevel); // Mining + out.append(startingLevelStr); // Mining out.append(":"); out.append(":"); out.append("0:"); // Xp - out.append(startingLevel); // Woodcutting + out.append(startingLevelStr); // 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(startingLevelStr); // Repair + out.append(startingLevelStr); // Unarmed + out.append(startingLevelStr); // Herbalism + out.append(startingLevelStr); // Excavation + out.append(startingLevelStr); // Archery + out.append(startingLevelStr); // Swords + out.append(startingLevelStr); // Axes + out.append(startingLevelStr); // Acrobatics out.append("0:"); // RepairXp out.append("0:"); // UnarmedXp out.append("0:"); // HerbalismXp @@ -494,7 +500,7 @@ public final class FlatFileDatabaseManager implements DatabaseManager { out.append("0:"); // AxesXp out.append("0:"); // AcrobaticsXp out.append(":"); - out.append(startingLevel); // Taming + out.append(startingLevelStr); // Taming out.append("0:"); // TamingXp out.append("0:"); // DATS out.append("0:"); // DATS @@ -504,12 +510,12 @@ public final class FlatFileDatabaseManager implements DatabaseManager { out.append("0:"); // DATS out.append("0:"); // DATS out.append(":"); - out.append(startingLevel); // Fishing + out.append(startingLevelStr); // 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(IGNORED).append(":"); // Mob Healthbar HUD + out.append(startingLevelStr); // Alchemy out.append("0:"); // AlchemyXp out.append(uuid != null ? uuid.toString() : "NULL").append(":"); // UUID out.append("0:"); // Scoreboard tips shown @@ -543,7 +549,6 @@ public final class FlatFileDatabaseManager implements DatabaseManager { private @NotNull PlayerProfile loadPlayerByUUID(@NotNull UUID uuid, @Nullable String playerName) { BufferedReader in = null; - String usersFilePath = mcMMO.getUsersFilePath(); synchronized (fileWritingLock) { try { @@ -580,7 +585,7 @@ public final class FlatFileDatabaseManager implements DatabaseManager { /* Check for nickname changes and update since we are here anyways */ if (!rawSplitData[USERNAME_INDEX].equalsIgnoreCase(playerName)) { - //mcMMO.p.getLogger().info("Name updated for player: " + rawSplitData[USERNAME_INDEX] + " => " + playerName); + //logger.info("Name updated for player: " + rawSplitData[USERNAME_INDEX] + " => " + playerName); rawSplitData[USERNAME_INDEX] = playerName; } @@ -610,7 +615,6 @@ public final class FlatFileDatabaseManager implements DatabaseManager { private @NotNull PlayerProfile loadPlayerByName(@NotNull String playerName) { BufferedReader in = null; - String usersFilePath = mcMMO.getUsersFilePath(); synchronized (fileWritingLock) { try { @@ -661,7 +665,6 @@ public final class FlatFileDatabaseManager implements DatabaseManager { public void convertUsers(DatabaseManager destination) { BufferedReader in = null; - String usersFilePath = mcMMO.getUsersFilePath(); int convertedUsers = 0; long startMillis = System.currentTimeMillis(); @@ -706,7 +709,6 @@ public final class FlatFileDatabaseManager implements DatabaseManager { int i = 0; BufferedReader in = null; FileWriter out = null; - String usersFilePath = mcMMO.getUsersFilePath(); synchronized (fileWritingLock) { try { @@ -718,8 +720,8 @@ public final class FlatFileDatabaseManager implements DatabaseManager { String[] character = line.split(":"); if (!worked && character[USERNAME_INDEX].equalsIgnoreCase(userName)) { if (character.length < 42) { - mcMMO.p.getLogger().severe("Could not update UUID for " + userName + "!"); - mcMMO.p.getLogger().severe("Database entry is invalid."); + logger.severe("Could not update UUID for " + userName + "!"); + logger.severe("Database entry is invalid."); continue; } @@ -735,10 +737,10 @@ public final class FlatFileDatabaseManager implements DatabaseManager { out.write(writer.toString()); } catch (Exception e) { - mcMMO.p.getLogger().severe("Exception while reading " + usersFilePath + " (Are you sure you formatted it correctly?)" + e.toString()); + logger.severe("Exception while reading " + usersFilePath + " (Are you sure you formatted it correctly?)" + e); } finally { - mcMMO.p.getLogger().info(i + " entries written while saving UUID for " + userName); + logger.info(i + " entries written while saving UUID for " + userName); if (in != null) { try { in.close(); @@ -764,7 +766,6 @@ public final class FlatFileDatabaseManager implements DatabaseManager { public boolean saveUserUUIDs(Map fetchedUUIDs) { BufferedReader in = null; FileWriter out = null; - String usersFilePath = mcMMO.getUsersFilePath(); int i = 0; synchronized (fileWritingLock) { @@ -777,8 +778,8 @@ public final class FlatFileDatabaseManager implements DatabaseManager { String[] character = line.split(":"); if (!fetchedUUIDs.isEmpty() && fetchedUUIDs.containsKey(character[USERNAME_INDEX])) { if (character.length < 42) { - mcMMO.p.getLogger().severe("Could not update UUID for " + character[USERNAME_INDEX] + "!"); - mcMMO.p.getLogger().severe("Database entry is invalid."); + logger.severe("Could not update UUID for " + character[USERNAME_INDEX] + "!"); + logger.severe("Database entry is invalid."); continue; } @@ -794,10 +795,10 @@ public final class FlatFileDatabaseManager implements DatabaseManager { out.write(writer.toString()); } catch (Exception e) { - mcMMO.p.getLogger().severe("Exception while reading " + usersFilePath + " (Are you sure you formatted it correctly?)" + e.toString()); + logger.severe("Exception while reading " + usersFilePath + " (Are you sure you formatted it correctly?)" + e); } finally { - mcMMO.p.getLogger().info(i + " entries written while saving UUID batch"); + logger.info(i + " entries written while saving UUID batch"); if (in != null) { try { in.close(); @@ -823,7 +824,6 @@ public final class FlatFileDatabaseManager implements DatabaseManager { public List getStoredUsers() { ArrayList users = new ArrayList<>(); BufferedReader in = null; - String usersFilePath = mcMMO.getUsersFilePath(); synchronized (fileWritingLock) { try { @@ -862,7 +862,6 @@ public final class FlatFileDatabaseManager implements DatabaseManager { return; } - String usersFilePath = mcMMO.getUsersFilePath(); lastUpdate = System.currentTimeMillis(); // Log when the last update was run powerLevels.clear(); // Clear old values from the power levels @@ -894,7 +893,7 @@ public final class FlatFileDatabaseManager implements DatabaseManager { playerName = data[USERNAME_INDEX]; int powerLevel = 0; - Map skills = getSkillMapFromLine(data); + Map skills = getSkillMapFromLine(data); powerLevel += putStat(acrobatics, playerName, skills.get(PrimarySkillType.ACROBATICS)); powerLevel += putStat(alchemy, playerName, skills.get(PrimarySkillType.ALCHEMY)); @@ -914,7 +913,7 @@ public final class FlatFileDatabaseManager implements DatabaseManager { } } catch (Exception e) { - mcMMO.p.getLogger().severe("Exception while reading " + usersFilePath + " during user " + playerName + " (Are you sure you formatted it correctly?) " + e.toString()); + logger.severe("Exception while reading " + usersFilePath + " during user " + playerName + " (Are you sure you formatted it correctly?) " + e); } finally { if (in != null) { @@ -969,7 +968,6 @@ public final class FlatFileDatabaseManager implements DatabaseManager { if (usersFile.exists()) { BufferedReader in = null; FileWriter out = null; - String usersFilePath = mcMMO.getUsersFilePath(); synchronized (fileWritingLock) { try { @@ -996,14 +994,14 @@ public final class FlatFileDatabaseManager implements DatabaseManager { //Not enough data found to be considered a user reliably (NOTE: not foolproof) if(rawSplitData.length < (UUID_INDEX + 1)) { if(!corruptDataFound) { - mcMMO.p.getLogger().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."); + 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; } if(rawSplitData.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 && rawSplitData[0] != null && !rawSplitData[0].isEmpty()) { if(rawSplitData[0].length() <= 16 && rawSplitData[0].length() >= 3) { - mcMMO.p.getLogger().severe("Not enough data found to recover corrupted player data for user: "+rawSplitData[0]); + logger.severe("Not enough data found to recover corrupted player data for user: "+rawSplitData[0]); } } //This user may have had a name so declare it @@ -1016,7 +1014,7 @@ public final class FlatFileDatabaseManager implements DatabaseManager { //TODO: Check if the commented out code was even necessary rawSplitData[USERNAME_INDEX] = "_INVALID_OLD_USERNAME_'"; if (rawSplitData.length < UUID_INDEX + 1 || rawSplitData[UUID_INDEX].equals("NULL")) { - mcMMO.p.getLogger().severe("Fixing duplicate player names found in mcmmo.users"); + logger.severe("Fixing duplicate player names found in mcmmo.users"); continue; } } @@ -1026,8 +1024,8 @@ public final class FlatFileDatabaseManager implements DatabaseManager { && (!rawSplitData[UUID_INDEX].isEmpty() && !rawSplitData[UUID_INDEX].equals("NULL") && !players.add(rawSplitData[UUID_INDEX]))) { - mcMMO.p.getLogger().severe("Removing duplicate player data from mcmmo.users"); - mcMMO.p.getLogger().info("Duplicate Data: "+line); + logger.severe("Removing duplicate player data from mcmmo.users"); + logger.info("Duplicate Data: "+line); continue; } @@ -1049,7 +1047,7 @@ public final class FlatFileDatabaseManager implements DatabaseManager { out.write(writer.toString()); } catch (IOException e) { - mcMMO.p.getLogger().severe("Exception while reading " + usersFilePath + " (Are you sure you formatted it correctly?)" + e.toString()); + logger.severe("Exception while reading " + usersFilePath + " (Are you sure you formatted it correctly?)" + e); } finally { if (in != null) { @@ -1072,7 +1070,7 @@ public final class FlatFileDatabaseManager implements DatabaseManager { } if(corruptDataFound) - mcMMO.p.getLogger().info("Corrupt data was found and removed, everything should be working fine. It is possible some player data was lost."); + logger.info("Corrupt data was found and removed, everything should be working fine. It is possible some player data was lost."); return; } @@ -1080,8 +1078,8 @@ public final class FlatFileDatabaseManager implements DatabaseManager { usersFile.getParentFile().mkdir(); try { - mcMMO.p.debug("Creating mcmmo.users file..."); - new File(mcMMO.getUsersFilePath()).createNewFile(); + logger.info("Creating mcmmo.users file..."); + new File(usersFilePath).createNewFile(); } catch (IOException e) { e.printStackTrace(); @@ -1119,11 +1117,10 @@ public final class FlatFileDatabaseManager implements DatabaseManager { } private PlayerProfile loadFromLine(@NotNull String[] character) { - Map skills = getSkillMapFromLine(character); // Skill levels - Map skillsXp = new EnumMap<>(PrimarySkillType.class); // Skill & XP + Map skills = getSkillMapFromLine(character); // Skill levels + Map skillsXp = new HashMap<>(); // Skill & XP Map skillsDATS = new EnumMap<>(SuperAbilityType.class); // Ability & Cooldown Map uniquePlayerDataMap = new EnumMap<>(UniqueDataType.class); - MobHealthbarType mobHealthbarType; int scoreboardTipsShown; String username = character[USERNAME_INDEX]; @@ -1155,12 +1152,12 @@ public final class FlatFileDatabaseManager implements DatabaseManager { // Acrobatics - Unused tryLoadSkillCooldownFromRawData(skillsDATS, character, SuperAbilityType.BLAST_MINING, COOLDOWN_BLAST_MINING, username); - try { - mobHealthbarType = MobHealthbarType.valueOf(character[HEALTHBAR]); - } - catch (Exception e) { - mobHealthbarType = Config.getInstance().getMobHealthbarDefault(); - } +// try { +// mobHealthbarType = MobHealthbarType.valueOf(character[HEALTHBAR]); +// } +// catch (Exception e) { +// mobHealthbarType = Config.getInstance().getMobHealthbarDefault(); +// } UUID uuid; try { @@ -1184,44 +1181,45 @@ public final class FlatFileDatabaseManager implements DatabaseManager { uniquePlayerDataMap.put(UniqueDataType.CHIMAERA_WING_DATS, 0); } - return new PlayerProfile(character[USERNAME_INDEX], uuid, skills, skillsXp, skillsDATS, mobHealthbarType, scoreboardTipsShown, uniquePlayerDataMap); + return new PlayerProfile(character[USERNAME_INDEX], uuid, skills, skillsXp, skillsDATS, null, scoreboardTipsShown, uniquePlayerDataMap); } 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) { - mcMMO.p.getLogger().severe("Data corruption when trying to load the value for skill "+superAbilityType.toString()+" for player named " + userName+ " setting value to zero"); + 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) { + private void tryLoadSkillFloatValuesFromRawData(@NotNull Map skillMap, @NotNull String[] character, @NotNull Skill primarySkillType, int index, @NotNull String userName) { try { float valueFromString = Integer.parseInt(character[index]); skillMap.put(primarySkillType, valueFromString); } catch (NumberFormatException e) { skillMap.put(primarySkillType, 0F); - mcMMO.p.getLogger().severe("Data corruption when trying to load the value for skill "+primarySkillType.toString()+" for player named " + userName+ " setting value to zero"); + 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) { + private void tryLoadSkillIntValuesFromRawData(@NotNull Map skillMap, @NotNull String[] character, @NotNull Skill skill, int index, @NotNull String userName) { try { int valueFromString = Integer.parseInt(character[index]); - skillMap.put(primarySkillType, valueFromString); + skillMap.put(skill, valueFromString); } catch (NumberFormatException e) { - skillMap.put(primarySkillType, 0); - mcMMO.p.getLogger().severe("Data corruption when trying to load the value for skill "+primarySkillType.toString()+" for player named " + userName+ " setting value to zero"); + skillMap.put(skill, 0); + logger.severe("Data corruption when trying to load the value for skill "+skill+" for player named " + userName+ " setting value to zero"); e.printStackTrace(); } } - private @NotNull Map getSkillMapFromLine(@NotNull String[] character) { - Map skills = new EnumMap<>(PrimarySkillType.class); // Skill & Level + private @NotNull Map getSkillMapFromLine(@NotNull String[] character) { + HashMap skills = new HashMap<>(); // 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); @@ -1232,7 +1230,6 @@ public final class FlatFileDatabaseManager implements DatabaseManager { 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.ACROBATICS, SKILLS_ACROBATICS, username); tryLoadSkillIntValuesFromRawData(skills, character, PrimarySkillType.FISHING, SKILLS_FISHING, username); tryLoadSkillIntValuesFromRawData(skills, character, PrimarySkillType.ALCHEMY, SKILLS_ALCHEMY, username); @@ -1243,93 +1240,10 @@ public final class FlatFileDatabaseManager implements DatabaseManager { return DatabaseType.FLATFILE; } + public File getUsersFile() { + return usersFile; + } + @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 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 = org.apache.commons.lang.StringUtils.join(character, ":") + ":"; - - 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 05d621243..debd4d2ba 100644 --- a/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java @@ -1,8 +1,6 @@ package com.gmail.nossr50.database; import com.gmail.nossr50.api.exceptions.InvalidSkillException; -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; @@ -11,6 +9,7 @@ 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.datatypes.skills.interfaces.Skill; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.runnables.database.UUIDUpdateAsyncTask; import com.gmail.nossr50.util.Misc; @@ -30,7 +29,7 @@ public final class SQLDatabaseManager implements DatabaseManager { public static final String MOBHEALTHBAR_VARCHAR = "VARCHAR(50)"; public static final String UUID_VARCHAR = "VARCHAR(36)"; public static final String USER_VARCHAR = "VARCHAR(40)"; - private final String tablePrefix = Config.getInstance().getMySQLTablePrefix(); + private final String tablePrefix = mcMMO.p.getGeneralConfig().getMySQLTablePrefix(); private final Map cachedUserIDs = new HashMap<>(); @@ -45,10 +44,10 @@ public final class SQLDatabaseManager implements DatabaseManager { private final String CHARSET_SQL = "utf8mb4"; //This is compliant with UTF-8 while "utf8" is not, confusing but this is how it is. 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.p.getGeneralConfig().getMySQLSSL()) connectionString += "?verifyServerCertificate=false"+ "&useSSL=true"+ @@ -67,16 +66,15 @@ public final class SQLDatabaseManager implements DatabaseManager { //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.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); @@ -88,11 +86,11 @@ public final class SQLDatabaseManager implements DatabaseManager { poolProperties = new PoolProperties(); poolProperties.setDriverClassName("com.mysql.jdbc.Driver"); 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); @@ -103,11 +101,11 @@ public final class SQLDatabaseManager implements DatabaseManager { poolProperties = new PoolProperties(); poolProperties.setDriverClassName("com.mysql.jdbc.Driver"); 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); @@ -115,11 +113,14 @@ public final class SQLDatabaseManager implements DatabaseManager { poolProperties.setValidationQuery("SELECT 1"); poolProperties.setValidationInterval(30000); loadPool = new DataSource(poolProperties); + } + @Override + public void init() { checkStructure(); } - public void purgePowerlessUsers() { + public int purgePowerlessUsers() { massUpdateLock.lock(); mcMMO.p.getLogger().info("Purging powerless users..."); @@ -152,11 +153,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; @@ -171,7 +173,7 @@ 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); @@ -331,7 +333,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, profile.getMobHealthbarType() == null ? mcMMO.p.getGeneralConfig().getMobHealthbarDefault().name() : profile.getMobHealthbarType().name()); statement.setInt(2, profile.getScoreboardTipsShown()); statement.setInt(3, id); success = (statement.executeUpdate() != 0); @@ -818,7 +820,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()) { @@ -834,21 +836,21 @@ public final class SQLDatabaseManager implements DatabaseManager { 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=" + 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()) { @@ -873,12 +875,12 @@ public final class SQLDatabaseManager implements DatabaseManager { 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 - PrimarySkillType.CHILD_SKILLS.size())) + "'"; createStatement = connection.createStatement(); createStatement.executeUpdate("CREATE TABLE IF NOT EXISTS `" + tablePrefix + "skills` (" + "`user_id` int(10) unsigned NOT NULL," @@ -901,7 +903,7 @@ public final class SQLDatabaseManager implements DatabaseManager { 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()) { @@ -932,9 +934,9 @@ public final class SQLDatabaseManager implements DatabaseManager { checkDatabaseStructure(connection, updateType); } - if (Config.getInstance().getTruncateSkills()) { + if (mcMMO.p.getGeneralConfig().getTruncateSkills()) { for (PrimarySkillType skill : PrimarySkillType.NON_CHILD_SKILLS) { - int cap = Config.getInstance().getLevelCap(skill); + int cap = mcMMO.p.getGeneralConfig().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(); @@ -1083,7 +1085,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(); @@ -1097,8 +1099,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 skills = new HashMap<>(); // Skill & Level + Map skillsXp = new HashMap<>(); // Skill & XP Map skillsDATS = new EnumMap<>(SuperAbilityType.class); // Ability & Cooldown Map uniqueData = new EnumMap<>(UniqueDataType.class); //Chimaera wing cooldown and other misc info MobHealthbarType mobHealthbarType; @@ -1158,7 +1160,7 @@ public final class SQLDatabaseManager implements DatabaseManager { mobHealthbarType = MobHealthbarType.valueOf(result.getString(OFFSET_OTHER + 1)); } catch (Exception e) { - mobHealthbarType = Config.getInstance().getMobHealthbarDefault(); + mobHealthbarType = mcMMO.p.getGeneralConfig().getMobHealthbarDefault(); } try { @@ -1270,7 +1272,7 @@ public final class SQLDatabaseManager implements DatabaseManager { } 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() + "'"); } } @@ -1579,7 +1581,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) { diff --git a/src/main/java/com/gmail/nossr50/datatypes/LevelUpBroadcastPredicate.java b/src/main/java/com/gmail/nossr50/datatypes/LevelUpBroadcastPredicate.java index 8820f7742..51ab29a14 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/LevelUpBroadcastPredicate.java +++ b/src/main/java/com/gmail/nossr50/datatypes/LevelUpBroadcastPredicate.java @@ -1,6 +1,5 @@ package com.gmail.nossr50.datatypes; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.datatypes.party.Party; import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.mcMMO; @@ -42,7 +41,7 @@ public class LevelUpBroadcastPredicate implements Predi Player listeningPlayer = (Player) t; //Party Member Check - if(Config.getInstance().isLevelUpBroadcastsPartyMembersOnly()) { + if(mcMMO.p.getGeneralConfig().isLevelUpBroadcastsPartyMembersOnly()) { McMMOPlayer mmoListeningPlayer = UserManager.getPlayer(listeningPlayer); if(mmoListeningPlayer == null) { @@ -68,8 +67,8 @@ public class LevelUpBroadcastPredicate implements Predi } //Distance checks - if(Config.getInstance().shouldLevelUpBroadcastsRestrictDistance()) { - if(!Misc.isNear(mmoBroadcastingPlayer.getPlayer().getLocation(), listeningPlayer.getLocation(), Config.getInstance().getLevelUpBroadcastRadius())) { + if(mcMMO.p.getGeneralConfig().shouldLevelUpBroadcastsRestrictDistance()) { + if(!Misc.isNear(mmoBroadcastingPlayer.getPlayer().getLocation(), listeningPlayer.getLocation(), mcMMO.p.getGeneralConfig().getLevelUpBroadcastRadius())) { return false; } } @@ -83,12 +82,12 @@ public class LevelUpBroadcastPredicate implements Predi return true; } else { //Send out to console - return Config.getInstance().shouldLevelUpBroadcastToConsole(); + return mcMMO.p.getGeneralConfig().shouldLevelUpBroadcastToConsole(); } } private static boolean isLevelUpBroadcastsSameWorldOnly() { - return Config.getInstance().isLevelUpBroadcastsSameWorldOnly(); + return mcMMO.p.getGeneralConfig().isLevelUpBroadcastsSameWorldOnly(); } @Override diff --git a/src/main/java/com/gmail/nossr50/datatypes/PowerLevelUpBroadcastPredicate.java b/src/main/java/com/gmail/nossr50/datatypes/PowerLevelUpBroadcastPredicate.java index 549255006..b50d731eb 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/PowerLevelUpBroadcastPredicate.java +++ b/src/main/java/com/gmail/nossr50/datatypes/PowerLevelUpBroadcastPredicate.java @@ -1,6 +1,5 @@ package com.gmail.nossr50.datatypes; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.datatypes.party.Party; import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.mcMMO; @@ -42,7 +41,7 @@ public class PowerLevelUpBroadcastPredicate implements Player listeningPlayer = (Player) t; //Party Member Check - if(Config.getInstance().isPowerLevelUpBroadcastsPartyMembersOnly()) { + if(mcMMO.p.getGeneralConfig().isPowerLevelUpBroadcastsPartyMembersOnly()) { McMMOPlayer mmoListeningPlayer = UserManager.getPlayer(listeningPlayer); if(mmoListeningPlayer == null) { @@ -68,8 +67,8 @@ public class PowerLevelUpBroadcastPredicate implements } //Distance checks - if(Config.getInstance().shouldPowerLevelUpBroadcastsRestrictDistance()) { - if(!Misc.isNear(mmoBroadcastingPlayer.getPlayer().getLocation(), listeningPlayer.getLocation(), Config.getInstance().getPowerLevelUpBroadcastRadius())) { + if(mcMMO.p.getGeneralConfig().shouldPowerLevelUpBroadcastsRestrictDistance()) { + if(!Misc.isNear(mmoBroadcastingPlayer.getPlayer().getLocation(), listeningPlayer.getLocation(), mcMMO.p.getGeneralConfig().getPowerLevelUpBroadcastRadius())) { return false; } } @@ -83,12 +82,12 @@ public class PowerLevelUpBroadcastPredicate implements return true; } else { //Send out to console - return Config.getInstance().shouldPowerLevelUpBroadcastToConsole(); + return mcMMO.p.getGeneralConfig().shouldPowerLevelUpBroadcastToConsole(); } } private static boolean isPowerLevelUpBroadcastsSameWorldOnly() { - return Config.getInstance().isPowerLevelUpBroadcastsSameWorldOnly(); + return mcMMO.p.getGeneralConfig().isPowerLevelUpBroadcastsSameWorldOnly(); } @Override 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 f185f24e5..fe7b9cb91 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/party/Party.java +++ b/src/main/java/com/gmail/nossr50/datatypes/party/Party.java @@ -1,7 +1,6 @@ package com.gmail.nossr50.datatypes.party; import com.gmail.nossr50.chat.SamePartyPredicate; -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.player.McMMOPlayer; @@ -204,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() { @@ -243,13 +242,13 @@ 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); } } @@ -260,7 +259,7 @@ public class Party { } public boolean hasReachedLevelCap() { - return Config.getInstance().getPartyLevelCap() < getLevel() + 1; + return mcMMO.p.getGeneralConfig().getPartyLevelCap() < getLevel() + 1; } public void setXpShareMode(ShareMode xpShareMode) { @@ -386,7 +385,7 @@ public class Party { 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)) { 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 dd215fb5a..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,8 +1,8 @@ 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.text.StringUtils; import org.bukkit.entity.Player; @@ -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/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 ec2ff905d..834d1c491 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java +++ b/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java @@ -1,9 +1,7 @@ package com.gmail.nossr50.datatypes.player; import com.gmail.nossr50.chat.author.PlayerAuthor; -import com.gmail.nossr50.config.AdvancedConfig; import com.gmail.nossr50.config.ChatConfig; -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.ChatChannel; @@ -200,9 +198,9 @@ public class McMMOPlayer implements Identified { { //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.getGeneralConfig().getLevelCap(primarySkillType)), primarySkillType.getName()); } //Updates from Party sources @@ -537,7 +535,7 @@ public class McMMOPlayer implements Identified { if(hasReachedPowerLevelCap()) return true; - return getSkillLevel(primarySkillType) >= Config.getInstance().getLevelCap(primarySkillType); + return getSkillLevel(primarySkillType) >= mcMMO.p.getGeneralConfig().getLevelCap(primarySkillType); } /** @@ -546,7 +544,7 @@ public class McMMOPlayer implements Identified { * @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(); } /** @@ -597,7 +595,7 @@ public class McMMOPlayer implements Identified { return; } - if (!Config.getInstance().getPartyXpNearMembersNeeded() || !PartyManager.getNearMembers(this).isEmpty()) { + if (!mcMMO.p.getGeneralConfig().getPartyXpNearMembersNeeded() || !PartyManager.getNearMembers(this).isEmpty()) { party.applyXpGain(modifyXpGain(skill, xp)); } } @@ -666,7 +664,7 @@ public class McMMOPlayer implements Identified { return; } - if (Config.getInstance().getLevelUpSoundsEnabled()) { + if (mcMMO.p.getGeneralConfig().getLevelUpSoundsEnabled()) { SoundManager.sendSound(player, player.getLocation(), SoundType.LEVEL_UP); } @@ -787,13 +785,13 @@ public class McMMOPlayer implements Identified { private float modifyXpGain(PrimarySkillType primarySkillType, float xp) { //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 ((primarySkillType.getMaxLevel() <= getSkillLevel(primarySkillType)) - || (Config.getInstance().getPowerLevelCap() <= getPowerLevel())) { + || (mcMMO.p.getGeneralConfig().getPowerLevelCap() <= getPowerLevel())) { return 0; } xp = (float) (xp / primarySkillType.getXpModifier() * ExperienceConfig.getInstance().getExperienceGainsGlobalMultiplier()); - if (Config.getInstance().getToolModsEnabled()) { + if (mcMMO.p.getGeneralConfig().getToolModsEnabled()) { CustomTool tool = mcMMO.getModManager().getTool(player.getInventory().getItemInMainHand()); if (tool != null) { @@ -863,8 +861,8 @@ public class McMMOPlayer implements Identified { } //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; @@ -881,7 +879,7 @@ public class McMMOPlayer implements Identified { //player.sendMessage(ability.getAbilityOn()); } - if (AdvancedConfig.getInstance().sendAbilityNotificationToOtherPlayers()) { + if (mcMMO.p.getAdvancedConfig().sendAbilityNotificationToOtherPlayers()) { SkillUtils.sendSkillMessage(player, NotificationType.SUPER_ABILITY_ALERT_OTHERS, ability.getAbilityPlayer()); } @@ -905,7 +903,7 @@ public class McMMOPlayer implements Identified { return; } - if (Config.getInstance().getAbilitiesOnlyActivateWhenSneaking() && !player.isSneaking()) { + if (mcMMO.p.getGeneralConfig().getAbilitiesOnlyActivateWhenSneaking() && !player.isSneaking()) { return; } @@ -942,7 +940,7 @@ public class McMMOPlayer implements Identified { } } - if (Config.getInstance().getAbilityMessagesEnabled()) { + if (mcMMO.p.getGeneralConfig().getAbilityMessagesEnabled()) { /* * * IF THE TOOL IS AN AXE @@ -1099,7 +1097,7 @@ public class McMMOPlayer implements Identified { UserManager.remove(thisPlayer); - if(Config.getInstance().getScoreboardsEnabled()) + if(mcMMO.p.getGeneralConfig().getScoreboardsEnabled()) ScoreboardManager.teardownPlayer(thisPlayer); if (inParty()) { 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 1d1cb53c2..eaad9f299 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/player/PlayerProfile.java +++ b/src/main/java/com/gmail/nossr50/datatypes/player/PlayerProfile.java @@ -1,18 +1,19 @@ 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; import com.gmail.nossr50.datatypes.skills.SuperAbilityType; +import com.gmail.nossr50.datatypes.skills.interfaces.Skill; 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.google.common.collect.ImmutableMap; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.HashMap; import java.util.Map; @@ -32,14 +33,14 @@ public class PlayerProfile { private int saveAttempts = 0; /* Skill Data */ - private final Map skills = new HashMap<>(); // Skill & Level - private final Map skillsXp = new HashMap<>(); // Skill & XP + 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..) // Store previous XP gains for diminished returns private final DelayQueue gainedSkillsXp = new DelayQueue<>(); - private final HashMap rollingSkillsXp = new HashMap<>(); + private final HashMap rollingSkillsXp = new HashMap<>(); @Deprecated public PlayerProfile(String playerName) { @@ -50,7 +51,7 @@ public class PlayerProfile { this.uuid = uuid; this.playerName = playerName; - mobHealthbarType = Config.getInstance().getMobHealthbarDefault(); + mobHealthbarType = mcMMO.p.getGeneralConfig().getMobHealthbarDefault(); scoreboardTipsShown = 0; for (SuperAbilityType superAbilityType : SuperAbilityType.values()) { @@ -58,7 +59,7 @@ public class PlayerProfile { } for (PrimarySkillType primarySkillType : PrimarySkillType.NON_CHILD_SKILLS) { - skills.put(primarySkillType, AdvancedConfig.getInstance().getStartingLevel()); + skills.put(primarySkillType, mcMMO.p.getAdvancedConfig().getStartingLevel()); skillsXp.put(primarySkillType, 0F); } @@ -67,20 +68,20 @@ public class PlayerProfile { } @Deprecated - public PlayerProfile(String playerName, boolean isLoaded) { + public PlayerProfile(@NotNull String playerName, boolean isLoaded) { this(playerName); this.loaded = isLoaded; } - public PlayerProfile(String playerName, UUID uuid, boolean isLoaded) { + public PlayerProfile(@NotNull String playerName, UUID uuid, boolean isLoaded) { this(playerName, uuid); 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, UUID uuid, Map levelData, Map xpData, Map cooldownData, @Nullable MobHealthbarType mobHealthbarType, int scoreboardTipsShown, Map uniqueProfileData) { this.playerName = playerName; this.uuid = uuid; - this.mobHealthbarType = mobHealthbarType; + mobHealthbarType = mcMMO.p.getGeneralConfig().getMobHealthbarDefault(); this.scoreboardTipsShown = scoreboardTipsShown; skills.putAll(levelData); 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 0673db147..fa8fd41c6 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/skills/PrimarySkillType.java +++ b/src/main/java/com/gmail/nossr50/datatypes/skills/PrimarySkillType.java @@ -1,7 +1,7 @@ package com.gmail.nossr50.datatypes.skills; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.config.experience.ExperienceConfig; +import com.gmail.nossr50.datatypes.skills.interfaces.Skill; import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.skills.SkillManager; @@ -33,7 +33,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -public enum PrimarySkillType { +public enum PrimarySkillType implements Skill { ACROBATICS(AcrobaticsManager.class, Color.WHITE, ImmutableList.of(SubSkillType.ACROBATICS_DODGE, SubSkillType.ACROBATICS_ROLL)), ALCHEMY(AlchemyManager.class, Color.FUCHSIA, @@ -122,6 +122,14 @@ public enum PrimarySkillType { this.subSkillTypes = subSkillTypes; } + public PrimarySkillType getPrimarySkill() { + return this; + } + + public String getPrimaryKeyName() { + return StringUtils.getCapitalized(this.toString()); + } + public Class getManagerClass() { return managerClass; } @@ -136,37 +144,37 @@ public enum PrimarySkillType { * @return the max level of this skill */ public int getMaxLevel() { - return Config.getInstance().getLevelCap(this); + return mcMMO.p.getGeneralConfig().getLevelCap(this); } public boolean isSuperAbilityUnlocked(Player player) { return RankUtils.getRank(player, getAbility().getSubSkillTypeDefinition()) >= 1; } public boolean getPVPEnabled() { - return Config.getInstance().getPVPEnabled(this); + return mcMMO.p.getGeneralConfig().getPVPEnabled(this); } public boolean getPVEEnabled() { - return Config.getInstance().getPVEEnabled(this); + return mcMMO.p.getGeneralConfig().getPVEEnabled(this); } public boolean getDoubleDropsDisabled() { - return Config.getInstance().getDoubleDropsDisabled(this); + return mcMMO.p.getGeneralConfig().getDoubleDropsDisabled(this); } public boolean getHardcoreStatLossEnabled() { - return Config.getInstance().getHardcoreStatLossEnabled(this); + return mcMMO.p.getGeneralConfig().getHardcoreStatLossEnabled(this); } public void setHardcoreStatLossEnabled(boolean enable) { - Config.getInstance().setHardcoreStatLossEnabled(this, enable); + mcMMO.p.getGeneralConfig().setHardcoreStatLossEnabled(this, enable); } public boolean getHardcoreVampirismEnabled() { - return Config.getInstance().getHardcoreVampirismEnabled(this); + return mcMMO.p.getGeneralConfig().getHardcoreVampirismEnabled(this); } public void setHardcoreVampirismEnabled(boolean enable) { - Config.getInstance().setHardcoreVampirismEnabled(this, enable); + mcMMO.p.getGeneralConfig().setHardcoreVampirismEnabled(this, enable); } public ToolType getTool() { @@ -182,7 +190,7 @@ public enum PrimarySkillType { } public static PrimarySkillType getSkill(String skillName) { - if (!Config.getInstance().getLocale().equalsIgnoreCase("en_US")) { + if (!mcMMO.p.getGeneralConfig().getLocale().equalsIgnoreCase("en_US")) { for (PrimarySkillType type : values()) { if (skillName.equalsIgnoreCase(LocaleLoader.getString(StringUtils.getCapitalized(type.name()) + ".SkillName"))) { return type; @@ -215,42 +223,17 @@ public enum PrimarySkillType { } } - public static PrimarySkillType bySecondaryAbility(SubSkillType subSkillType) { - for (PrimarySkillType type : values()) { - if (type.getSkillAbilities().contains(subSkillType)) { - return type; - } - } - return null; - } - - public static PrimarySkillType byAbility(SuperAbilityType ability) { - for (PrimarySkillType type : values()) { - if (type.getAbility() == ability) { - return type; - } - } - - return null; - } - public String getName() { return StringUtils.getCapitalized(LocaleLoader.getString(StringUtils.getCapitalized(this.toString()) + ".SkillName")); } -// public String getName() { -// return StringUtils.getCapitalized(StringUtils.getCapitalized(this.toString())); -// } - public boolean getPermissions(Player player) { return Permissions.skillEnabled(player, this); } -/* public void celebrateLevelUp(Player player) { - ParticleEffectUtils.fireworkParticleShower(player, skillColor); - }*/ - public boolean shouldProcess(Entity target) { return (target instanceof Player || (target instanceof Tameable && ((Tameable) target).isTamed())) ? getPVPEnabled() : getPVEEnabled(); } + + } 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 059df8db9..67b256a47 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/skills/SubSkillType.java +++ b/src/main/java/com/gmail/nossr50/datatypes/skills/SubSkillType.java @@ -1,5 +1,6 @@ package com.gmail.nossr50.datatypes.skills; +import com.gmail.nossr50.datatypes.skills.interfaces.Skill; import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.util.text.StringUtils; @@ -135,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 Skill.bySecondaryAbility(this); } /** * Returns the root address for this skill in the advanced.yml file 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 6d038332c..72c9fee69 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/skills/SuperAbilityType.java +++ b/src/main/java/com/gmail/nossr50/datatypes/skills/SuperAbilityType.java @@ -1,6 +1,5 @@ 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; @@ -112,11 +111,11 @@ public enum SuperAbilityType { } public int getCooldown() { - return Config.getInstance().getCooldown(this); + return mcMMO.p.getGeneralConfig().getCooldown(this); } public int getMaxLength() { - return Config.getInstance().getMaxLength(this); + return mcMMO.p.getGeneralConfig().getMaxLength(this); } public String getAbilityOn() { diff --git a/src/main/java/com/gmail/nossr50/datatypes/skills/interfaces/Skill.java b/src/main/java/com/gmail/nossr50/datatypes/skills/interfaces/Skill.java index 68cf7180e..a0487e0df 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/skills/interfaces/Skill.java +++ b/src/main/java/com/gmail/nossr50/datatypes/skills/interfaces/Skill.java @@ -1,6 +1,18 @@ package com.gmail.nossr50.datatypes.skills.interfaces; 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.skills.SkillManager; +import com.gmail.nossr50.util.text.StringUtils; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.List; public interface Skill { /** @@ -14,4 +26,88 @@ public interface Skill { * @return config file key name */ String getPrimaryKeyName(); + + Class getManagerClass(); + + SuperAbilityType getAbility(); + + /** + * Get the max level of this skill. + * + * @return the max level of this skill + */ + int getMaxLevel(); + + boolean isSuperAbilityUnlocked(Player player); + + boolean getPVPEnabled(); + + boolean getPVEEnabled(); + + boolean getDoubleDropsDisabled(); + + boolean getHardcoreStatLossEnabled(); + + void setHardcoreStatLossEnabled(boolean enable); + + boolean getHardcoreVampirismEnabled(); + + void setHardcoreVampirismEnabled(boolean enable); + + ToolType getTool(); + + List getSkillAbilities(); + + double getXpModifier(); + + // 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 + boolean isChildSkill(); + + static PrimarySkillType bySecondaryAbility(SubSkillType subSkillType) { + for (PrimarySkillType type : PrimarySkillType.values()) { + if (type.getSkillAbilities().contains(subSkillType)) { + return type; + } + } + + return null; + } + + static PrimarySkillType byAbility(SuperAbilityType ability) { + for (PrimarySkillType type : PrimarySkillType.values()) { + if (type.getAbility() == ability) { + return type; + } + } + + return null; + } + + static PrimarySkillType getSkill(@NotNull String skillName) { + if (!mcMMO.p.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")) { + mcMMO.p.getLogger().warning("Invalid mcMMO skill (" + skillName + ")"); //TODO: Localize + } + + return null; + } + + String getName(); + + boolean getPermissions(Player player); + + boolean shouldProcess(Entity target); } 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 f13f5b922..d81320761 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,6 +1,5 @@ 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; @@ -8,8 +7,11 @@ 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.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.skills.SkillManager; import com.gmail.nossr50.util.EventUtils; import com.gmail.nossr50.util.ItemUtils; import com.gmail.nossr50.util.Permissions; @@ -29,12 +31,14 @@ import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.SoundCategory; import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.event.Event; import org.bukkit.event.EventPriority; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.inventory.ItemStack; +import java.util.List; import java.util.Locale; public class Roll extends AcrobaticsSubSkill { @@ -200,7 +204,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)) { @@ -238,7 +242,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 @@ -381,7 +385,7 @@ public class Roll extends AcrobaticsSubSkill { // // //Chance to roll at half max skill // RandomChanceSkill rollHalfMaxSkill = new RandomChanceSkill(null, subSkillType); -// int halfMaxSkillValue = AdvancedConfig.getInstance().getMaxBonusLevel(SubSkillType.ACROBATICS_ROLL)/2; +// int halfMaxSkillValue = mcMMO.p.getAdvancedConfig().getMaxBonusLevel(SubSkillType.ACROBATICS_ROLL)/2; // rollHalfMaxSkill.setSkillLevel(halfMaxSkillValue); // // //Chance to graceful roll at full skill @@ -395,11 +399,11 @@ public class Roll extends AcrobaticsSubSkill { // //Chance Stat Calculations // rollChanceHalfMax = RandomChanceUtil.getRandomChanceExecutionChance(rollHalfMaxSkill); // graceChanceHalfMax = RandomChanceUtil.getRandomChanceExecutionChance(rollGraceHalfMaxSkill); -// damageThreshold = AdvancedConfig.getInstance().getRollDamageThreshold(); +// damageThreshold = mcMMO.p.getAdvancedConfig().getRollDamageThreshold(); // // chancePerLevel = RandomChanceUtil.getRandomChanceExecutionChance(rollOneSkillLevel); // -// double maxLevel = AdvancedConfig.getInstance().getMaxBonusLevel(SubSkillType.ACROBATICS_ROLL); +// double maxLevel = mcMMO.p.getAdvancedConfig().getMaxBonusLevel(SubSkillType.ACROBATICS_ROLL); // // return LocaleLoader.getString("Acrobatics.SubSkill.Roll.Mechanics", rollChanceHalfMax, graceChanceHalfMax, maxLevel, chancePerLevel, damageThreshold, damageThreshold * 2,halfMaxSkillValue); } @@ -436,4 +440,98 @@ public class Roll extends AcrobaticsSubSkill { { return player.getLocation().getBlock().getLocation(); } + + public String getPrimaryKeyName() { + return getPrimarySkill().getPrimaryKeyName(); + } + + @Override + public Class getManagerClass() { + return getPrimarySkill().getManagerClass(); + } + + @Override + public SuperAbilityType getAbility() { + return getPrimarySkill().getAbility(); + } + + @Override + public int getMaxLevel() { + return getPrimarySkill().getMaxLevel(); + } + + @Override + public boolean isSuperAbilityUnlocked(Player player) { + return getPrimarySkill().isSuperAbilityUnlocked(player); + } + + @Override + public boolean getPVPEnabled() { + return getPrimarySkill().getPVPEnabled(); + } + + @Override + public boolean getPVEEnabled() { + return getPrimarySkill().getPVEEnabled(); + } + + @Override + public boolean getDoubleDropsDisabled() { + return getPrimarySkill().getDoubleDropsDisabled(); + } + + @Override + public boolean getHardcoreStatLossEnabled() { + return getPrimarySkill().getHardcoreStatLossEnabled(); + } + + @Override + public void setHardcoreStatLossEnabled(boolean enable) { + getPrimarySkill().setHardcoreStatLossEnabled(enable); + } + + @Override + public boolean getHardcoreVampirismEnabled() { + return getPrimarySkill().getHardcoreVampirismEnabled(); + } + + @Override + public void setHardcoreVampirismEnabled(boolean enable) { + getPrimarySkill().setHardcoreVampirismEnabled(enable); + } + + @Override + public ToolType getTool() { + return getPrimarySkill().getTool(); + } + + @Override + public List getSkillAbilities() { + return getPrimarySkill().getSkillAbilities(); + } + + @Override + public double getXpModifier() { + return getPrimarySkill().getXpModifier(); + } + + @Override + public boolean isChildSkill() { + return getPrimarySkill().isChildSkill(); + } + + @Override + public String getName() { + return getPrimarySkill().getName(); + } + + @Override + public boolean getPermissions(Player player) { + return getPrimarySkill().getPermissions(player); + } + + @Override + public boolean shouldProcess(Entity target) { + return getPrimarySkill().shouldProcess(target); + } } 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..215a7f224 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,7 +1,7 @@ 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.interfaces.Skill; import com.gmail.nossr50.datatypes.skills.subskills.AbstractSubSkill; import com.gmail.nossr50.events.skills.McMMOPlayerSkillEvent; import org.bukkit.entity.Player; @@ -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, Skill.bySecondaryAbility(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, Skill.bySecondaryAbility(subSkillType)); this.subSkillType = subSkillType; this.resultModifier = resultModifier; } diff --git a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java index 863a09ac3..33b68076c 100644 --- a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java @@ -1,7 +1,6 @@ package com.gmail.nossr50.listeners; import com.gmail.nossr50.api.ItemSpawnReason; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.config.HiddenConfig; import com.gmail.nossr50.config.WorldBlacklist; import com.gmail.nossr50.config.experience.ExperienceConfig; @@ -79,9 +78,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 @@ -524,7 +523,7 @@ 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.hasWoodcuttingXP(blockState) && Config.getInstance().getTreeFellerSoundsEnabled()) { + if (mcMMOPlayer.getAbilityMode(SuperAbilityType.TREE_FELLER) && BlockUtils.hasWoodcuttingXP(blockState) && mcMMO.p.getGeneralConfig().getTreeFellerSoundsEnabled()) { SoundManager.sendSound(player, blockState.getLocation(), SoundType.FIZZ); } } @@ -579,7 +578,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(); diff --git a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java index f01a13d71..9042e1286 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; @@ -163,7 +161,7 @@ public class EntityListener implements Listener { projectile.setMetadata(mcMMO.infiniteArrowKey, mcMMO.metadataValue); } - projectile.setMetadata(mcMMO.bowForceKey, new FixedMetadataValue(pluginRef, Math.min(event.getForce() * AdvancedConfig.getInstance().getForceMultiplier(), 1.0))); + projectile.setMetadata(mcMMO.bowForceKey, new FixedMetadataValue(pluginRef, Math.min(event.getForce() * mcMMO.p.getAdvancedConfig().getForceMultiplier(), 1.0))); projectile.setMetadata(mcMMO.arrowDistanceKey, new FixedMetadataValue(pluginRef, projectile.getLocation())); //Cleanup metadata in 1 minute in case normal collection falls through CombatUtils.delayArrowMetaCleanup((Projectile) projectile); @@ -466,7 +464,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) diff --git a/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java b/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java index c110de94c..df4dd6e78 100644 --- a/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java @@ -1,6 +1,5 @@ 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; @@ -382,17 +381,17 @@ 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); } } diff --git a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java index bf4b3faa0..53e40ca14 100644 --- a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java @@ -1,6 +1,5 @@ package com.gmail.nossr50.listeners; -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.ChatChannel; @@ -73,11 +72,11 @@ public class PlayerListener implements Listener { /* WORLD BLACKLIST CHECK */ if(WorldBlacklist.isWorldBlacklisted(event.getPlayer().getWorld())) { //Remove scoreboards - if(Config.getInstance().getScoreboardsEnabled()) { + if(mcMMO.p.getGeneralConfig().getScoreboardsEnabled()) { ScoreboardManager.teardownPlayer(event.getPlayer()); } return; - } else if(WorldBlacklist.isWorldBlacklisted(event.getFrom().getWorld()) && Config.getInstance().getScoreboardsEnabled()) { + } 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 @@ -93,7 +92,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; } @@ -292,7 +291,7 @@ public class PlayerListener implements Listener { if(event.getCaught() != null) { Item fishingCatch = (Item) event.getCaught(); - if (Config.getInstance().getFishingOverrideTreasures() && + if (mcMMO.p.getGeneralConfig().getFishingOverrideTreasures() && fishingCatch.getItemStack().getType() != Material.SALMON && fishingCatch.getItemStack().getType() != Material.COD && fishingCatch.getItemStack().getType() != Material.TROPICAL_FISH && @@ -565,11 +564,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())); } } @@ -652,7 +651,7 @@ 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) @@ -700,7 +699,7 @@ 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)) { RepairManager repairManager = mcMMOPlayer.getRepairManager(); @@ -794,7 +793,7 @@ public class PlayerListener implements Listener { /* ACTIVATION & ITEM CHECKS */ if (BlockUtils.canActivateTools(blockState)) { - if (Config.getInstance().getAbilitiesEnabled()) { + if (mcMMO.p.getGeneralConfig().getAbilitiesEnabled()) { if (BlockUtils.canActivateHerbalism(blockState)) { mcMMOPlayer.processAbilityActivation(PrimarySkillType.HERBALISM); } @@ -860,7 +859,7 @@ public class PlayerListener implements Listener { } /* ACTIVATION CHECKS */ - if (Config.getInstance().getAbilitiesEnabled()) { + if (mcMMO.p.getGeneralConfig().getAbilitiesEnabled()) { mcMMOPlayer.processAbilityActivation(PrimarySkillType.AXES); mcMMOPlayer.processAbilityActivation(PrimarySkillType.EXCAVATION); mcMMOPlayer.processAbilityActivation(PrimarySkillType.HERBALISM); @@ -892,13 +891,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(); } @@ -951,7 +950,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); diff --git a/src/main/java/com/gmail/nossr50/listeners/SelfListener.java b/src/main/java/com/gmail/nossr50/listeners/SelfListener.java index 2ea4ac582..5bd3f5ec0 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; @@ -45,7 +44,7 @@ public class SelfListener implements Listener { //Reset the delay timer RankUtils.resetUnlockDelayTimer(); - if(Config.getInstance().getScoreboardsEnabled()) + if(mcMMO.p.getGeneralConfig().getScoreboardsEnabled()) ScoreboardManager.handleLevelUp(player, skill); } } @@ -55,7 +54,7 @@ public class SelfListener implements Listener { Player player = event.getPlayer(); if(player.isOnline()) { - if(Config.getInstance().getScoreboardsEnabled()) + if(mcMMO.p.getGeneralConfig().getScoreboardsEnabled()) ScoreboardManager.handleXp(player, event.getSkill()); } } @@ -64,7 +63,7 @@ public class SelfListener implements Listener { public void onAbility(McMMOPlayerAbilityActivateEvent event) { Player player = event.getPlayer(); if(player.isOnline()) { - if(Config.getInstance().getScoreboardsEnabled()) + if(mcMMO.p.getGeneralConfig().getScoreboardsEnabled()) ScoreboardManager.cooldownUpdate(event.getPlayer(), event.getSkill()); } } diff --git a/src/main/java/com/gmail/nossr50/locale/LocaleLoader.java b/src/main/java/com/gmail/nossr50/locale/LocaleLoader.java index f4f57ceaf..a3b285689 100644 --- a/src/main/java/com/gmail/nossr50/locale/LocaleLoader.java +++ b/src/main/java/com/gmail/nossr50/locale/LocaleLoader.java @@ -1,6 +1,5 @@ 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; @@ -130,7 +129,7 @@ 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]); @@ -140,7 +139,7 @@ public final class LocaleLoader { } 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"); diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index 99d7a461f..ef3ead515 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -9,7 +9,9 @@ import com.gmail.nossr50.config.mods.BlockConfigManager; import com.gmail.nossr50.config.mods.EntityConfigManager; import com.gmail.nossr50.config.mods.ToolConfigManager; import com.gmail.nossr50.config.skills.alchemy.PotionConfig; +import com.gmail.nossr50.config.skills.repair.RepairConfig; import com.gmail.nossr50.config.skills.repair.RepairConfigManager; +import com.gmail.nossr50.config.skills.salvage.SalvageConfig; import com.gmail.nossr50.config.skills.salvage.SalvageConfigManager; import com.gmail.nossr50.config.treasure.FishingTreasureConfig; import com.gmail.nossr50.config.treasure.TreasureConfig; @@ -146,8 +148,19 @@ public class mcMMO extends JavaPlugin { public static final String databaseCommandKey = "mcMMO: Processing Database Command"; public static FixedMetadataValue metadataValue; + private long purgeTime = 2630000000L; - public static final String ULTRA_PERMISSONS = "UltraPermissons"; + 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; @@ -159,8 +172,12 @@ public class mcMMO extends JavaPlugin { @Override public void onEnable() { try { + //Init configs + generalConfig = new GeneralConfig(getDataFolder()); + advancedConfig = new AdvancedConfig(getDataFolder()); + //Store this value so other plugins can check it - isRetroModeEnabled = Config.getInstance().getIsRetroMode(); + isRetroModeEnabled = generalConfig.getIsRetroMode(); //Platform Manager platformManager = new PlatformManager(); @@ -206,7 +223,11 @@ 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()); + databaseManager.init(); //Check for the newer API and tell them what to do if its missing checkForOutdatedAPI(); @@ -246,7 +267,7 @@ public class mcMMO extends JavaPlugin { placeStore = ChunkManagerFactory.getChunkManager(); // Get our ChunkletManager - if (Config.getInstance().getPTPCommandWorldPermissions()) { + if (generalConfig.getPTPCommandWorldPermissions()) { Permissions.generateWorldTeleportPermissions(); } @@ -257,11 +278,11 @@ public class mcMMO extends JavaPlugin { //If anonymous statistics are enabled then use them Metrics metrics; - if(Config.getInstance().getIsMetricsEnabled()) { + if(generalConfig.getIsMetricsEnabled()) { metrics = new Metrics(this, 3894); metrics.addCustomChart(new SimplePie("version", () -> getDescription().getVersion())); - if(Config.getInstance().getIsRetroMode()) + if(generalConfig.getIsRetroMode()) metrics.addCustomChart(new SimplePie("leveling_system", () -> "Retro")); else metrics.addCustomChart(new SimplePie("leveling_system", () -> "Standard")); @@ -350,7 +371,7 @@ public class mcMMO extends JavaPlugin { PartyManager.saveParties(); // Save our parties //TODO: Needed? - if(Config.getInstance().getScoreboardsEnabled()) + if(generalConfig.getScoreboardsEnabled()) ScoreboardManager.teardownAll(); formulaManager.saveFormula(); @@ -360,7 +381,7 @@ public class mcMMO extends JavaPlugin { e.printStackTrace(); } - if (Config.getInstance().getBackupsEnabled()) { + if (generalConfig.getBackupsEnabled()) { // Remove other tasks BEFORE starting the Backup, or we just cancel it straight away. try { ZipLibrary.mcMMOBackup(); @@ -532,7 +553,7 @@ public class mcMMO extends JavaPlugin { TreasureConfig.getInstance(); FishingTreasureConfig.getInstance(); HiddenConfig.getInstance(); - AdvancedConfig.getInstance(); + mcMMO.p.getAdvancedConfig(); PotionConfig.getInstance(); CoreSkillsConfig.getInstance(); SoundConfig.getInstance(); @@ -542,19 +563,19 @@ public class mcMMO extends JavaPlugin { 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); } @@ -609,7 +630,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); @@ -620,7 +641,7 @@ public class mcMMO extends JavaPlugin { long second = 20; long minute = second * 60; - long saveIntervalTicks = Math.max(minute, Config.getInstance().getSaveInterval() * minute); + long saveIntervalTicks = Math.max(minute, generalConfig.getSaveInterval() * minute); new SaveTimerTask().runTaskTimer(this, saveIntervalTicks, saveIntervalTicks); @@ -628,7 +649,7 @@ public class mcMMO extends JavaPlugin { new CleanBackupsTask().runTaskAsynchronously(mcMMO.p); // 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. @@ -638,7 +659,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. @@ -655,29 +676,29 @@ public class mcMMO extends JavaPlugin { 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."); } @@ -742,4 +763,15 @@ public class mcMMO extends JavaPlugin { serverShutdownExecuted = bool; } + public long getPurgeTime() { + return purgeTime; + } + + public @NotNull GeneralConfig getGeneralConfig() { + return generalConfig; + } + + public @NotNull AdvancedConfig getAdvancedConfig() { + return advancedConfig; + } } diff --git a/src/main/java/com/gmail/nossr50/party/PartyManager.java b/src/main/java/com/gmail/nossr50/party/PartyManager.java index 52d3836a5..4cd483329 100644 --- a/src/main/java/com/gmail/nossr50/party/PartyManager.java +++ b/src/main/java/com/gmail/nossr50/party/PartyManager.java @@ -1,6 +1,5 @@ package com.gmail.nossr50.party; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.datatypes.chat.ChatChannel; import com.gmail.nossr50.datatypes.interactions.NotificationType; import com.gmail.nossr50.datatypes.party.ItemShareType; @@ -61,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(); } /** @@ -153,7 +152,7 @@ public final class PartyManager { 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)) { @@ -171,7 +170,7 @@ public final class PartyManager { 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) @@ -439,9 +438,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; } @@ -810,7 +809,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/backups/CleanBackupsTask.java b/src/main/java/com/gmail/nossr50/runnables/backups/CleanBackupsTask.java index 114211c80..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; @@ -48,11 +47,11 @@ 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; @@ -60,7 +59,7 @@ public class CleanBackupsTask extends BukkitRunnable { else { 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/McrankCommandDisplayTask.java b/src/main/java/com/gmail/nossr50/runnables/commands/McrankCommandDisplayTask.java index 353e0ea04..1640d9301 100644 --- a/src/main/java/com/gmail/nossr50/runnables/commands/McrankCommandDisplayTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/commands/McrankCommandDisplayTask.java @@ -1,6 +1,5 @@ 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; @@ -30,7 +29,7 @@ public class McrankCommandDisplayTask extends BukkitRunnable { @Override public void run() { - if (useBoard && Config.getInstance().getScoreboardsEnabled()) { + if (useBoard && mcMMO.p.getGeneralConfig().getScoreboardsEnabled()) { displayBoard(); } 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..82ab947dd 100644 --- a/src/main/java/com/gmail/nossr50/runnables/commands/MctopCommandDisplayTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/commands/MctopCommandDisplayTask.java @@ -1,6 +1,5 @@ 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; @@ -34,7 +33,7 @@ public class MctopCommandDisplayTask extends BukkitRunnable { @Override public void run() { - if (useBoard && Config.getInstance().getScoreboardsEnabled()) { + if (useBoard && mcMMO.p.getGeneralConfig().getScoreboardsEnabled()) { displayBoard(); } 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 8ce66bfa8..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,6 +1,5 @@ package com.gmail.nossr50.runnables.database; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.mcMMO; import org.bukkit.scheduler.BukkitRunnable; @@ -13,7 +12,7 @@ public class UserPurgeTask extends BukkitRunnable { 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 b4ae92426..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; @@ -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 d3315d4ab..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; @@ -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 31d961bf6..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,7 +13,7 @@ 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() { 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 8944fb043..5dccb2cf1 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; @@ -97,16 +96,16 @@ public class PlayerProfileLoadingTask extends BukkitRunnable { 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, 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/skills/AbilityDisableTask.java b/src/main/java/com/gmail/nossr50/runnables/skills/AbilityDisableTask.java index 11cd015a6..cce276fc2 100644 --- a/src/main/java/com/gmail/nossr50/runnables/skills/AbilityDisableTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/skills/AbilityDisableTask.java @@ -1,7 +1,5 @@ package com.gmail.nossr50.runnables.skills; -import com.gmail.nossr50.config.AdvancedConfig; -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; @@ -41,7 +39,7 @@ public class AbilityDisableTask extends BukkitRunnable { // Fallthrough case BERSERK: - if (Config.getInstance().getRefreshChunksEnabled()) { + if (mcMMO.p.getGeneralConfig().getRefreshChunksEnabled()) { resendChunkRadiusAt(player); } // Fallthrough @@ -62,7 +60,7 @@ public class AbilityDisableTask extends BukkitRunnable { NotificationManager.sendPlayerInformation(player, NotificationType.ABILITY_OFF, ability.getAbilityOff()); } - if (AdvancedConfig.getInstance().sendAbilityNotificationToOtherPlayers()) { + if (mcMMO.p.getAdvancedConfig().sendAbilityNotificationToOtherPlayers()) { 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); 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 49298c2bb..839358afd 100644 --- a/src/main/java/com/gmail/nossr50/runnables/skills/BleedTimerTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/skills/BleedTimerTask.java @@ -57,7 +57,7 @@ // double damage; // // if (target instanceof Player) { -// damage = AdvancedConfig.getInstance().getRuptureDamagePlayer(); +// damage = mcMMO.p.getAdvancedConfig().getRuptureDamagePlayer(); // // //Above Bleed Rank 3 deals 50% more damage // if (containerEntry.getValue().toolTier >= 4 && containerEntry.getValue().bleedRank >= 3) @@ -78,7 +78,7 @@ // } // // } else { -// damage = AdvancedConfig.getInstance().getRuptureDamageMobs(); +// damage = mcMMO.p.getAdvancedConfig().getRuptureDamageMobs(); // //// debugMessage+="BaseDMG=["+damage+"], "; // diff --git a/src/main/java/com/gmail/nossr50/runnables/skills/RuptureTask.java b/src/main/java/com/gmail/nossr50/runnables/skills/RuptureTask.java index 9e4f3ee2b..e740a3fcd 100644 --- a/src/main/java/com/gmail/nossr50/runnables/skills/RuptureTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/skills/RuptureTask.java @@ -1,9 +1,7 @@ package com.gmail.nossr50.runnables.skills; -import com.gmail.nossr50.config.AdvancedConfig; import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.mcMMO; -import com.gmail.nossr50.util.MobHealthbarUtils; import com.gmail.nossr50.util.skills.ParticleEffectUtils; import com.google.common.base.Objects; import org.bukkit.entity.LivingEntity; @@ -28,7 +26,7 @@ public class RuptureTask extends BukkitRunnable { public RuptureTask(@NotNull McMMOPlayer ruptureSource, @NotNull LivingEntity targetEntity, double pureTickDamage, double explosionDamage) { this.ruptureSource = ruptureSource; this.targetEntity = targetEntity; - this.expireTick = AdvancedConfig.getInstance().getRuptureDurationSeconds(targetEntity instanceof Player) * 20; + this.expireTick = mcMMO.p.getAdvancedConfig().getRuptureDurationSeconds(targetEntity instanceof Player) * 20; this.ruptureTick = 0; this.damageTickTracker = 0; 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 5f8881ff0..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,9 +1,9 @@ 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; @@ -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/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/alchemy/Alchemy.java b/src/main/java/com/gmail/nossr50/skills/alchemy/Alchemy.java index 58ac14bee..7aaa1844d 100644 --- a/src/main/java/com/gmail/nossr50/skills/alchemy/Alchemy.java +++ b/src/main/java/com/gmail/nossr50/skills/alchemy/Alchemy.java @@ -1,6 +1,5 @@ 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; @@ -43,16 +42,16 @@ 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<>(); 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 a892b0a89..b980a6f34 100644 --- a/src/main/java/com/gmail/nossr50/skills/archery/Archery.java +++ b/src/main/java/com/gmail/nossr50/skills/archery/Archery.java @@ -1,9 +1,9 @@ package com.gmail.nossr50.skills.archery; import com.gmail.nossr50.api.ItemSpawnReason; -import com.gmail.nossr50.config.AdvancedConfig; 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; @@ -19,9 +19,9 @@ import java.util.List; public class Archery { 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(); @@ -72,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/axes/Axes.java b/src/main/java/com/gmail/nossr50/skills/axes/Axes.java index 7f1ba62df..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,18 +9,18 @@ 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) 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 ead48f6d8..6f2bbe08c 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; @@ -127,7 +127,7 @@ public class AxesManager extends SkillManager { } 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); } /** 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 14eda7e32..5412c9ef8 100644 --- a/src/main/java/com/gmail/nossr50/skills/excavation/ExcavationManager.java +++ b/src/main/java/com/gmail/nossr50/skills/excavation/ExcavationManager.java @@ -1,12 +1,12 @@ package com.gmail.nossr50.skills.excavation; import com.gmail.nossr50.api.ItemSpawnReason; -import com.gmail.nossr50.config.Config; 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; @@ -98,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/FishingManager.java b/src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java index 22f8eecc7..d4a4d266c 100644 --- a/src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java @@ -1,8 +1,6 @@ package com.gmail.nossr50.skills.fishing; import com.gmail.nossr50.api.ItemSpawnReason; -import com.gmail.nossr50.config.AdvancedConfig; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.config.experience.ExperienceConfig; import com.gmail.nossr50.config.treasure.FishingTreasureConfig; import com.gmail.nossr50.datatypes.experience.XPGainReason; @@ -198,11 +196,11 @@ public class FishingManager extends SkillManager { } public double getShakeChance() { - return AdvancedConfig.getInstance().getShakeChance(RankUtils.getRank(mmoPlayer.getPlayer(), SubSkillType.FISHING_SHAKE)); + 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()); } /** @@ -273,8 +271,8 @@ public class FishingManager extends SkillManager { int maxWaitReduction = getMasterAnglerTickMaxWaitReduction(masterAnglerRank, boatBonus, convertedLureBonus); //Ticks for minWait and maxWait never go below this value - int bonusCapMin = AdvancedConfig.getInstance().getFishingReductionMinWaitCap(); - int bonusCapMax = AdvancedConfig.getInstance().getFishingReductionMaxWaitCap(); + int bonusCapMin = mcMMO.p.getAdvancedConfig().getFishingReductionMinWaitCap(); + int bonusCapMax = mcMMO.p.getAdvancedConfig().getFishingReductionMaxWaitCap(); int reducedMinWaitTime = getReducedTicks(minWaitTicks, minWaitReduction, bonusCapMin); int reducedMaxWaitTime = getReducedTicks(maxWaitTicks, maxWaitReduction, bonusCapMax); @@ -337,7 +335,7 @@ public class FishingManager extends SkillManager { } public int getMasterAnglerTickMaxWaitReduction(int masterAnglerRank, boolean boatBonus, int emulatedLureBonus) { - int totalBonus = AdvancedConfig.getInstance().getFishingReductionMaxWaitTicks() * masterAnglerRank; + int totalBonus = mcMMO.p.getAdvancedConfig().getFishingReductionMaxWaitTicks() * masterAnglerRank; if(boatBonus) { totalBonus += getFishingBoatMaxWaitReduction(); @@ -349,7 +347,7 @@ public class FishingManager extends SkillManager { } public int getMasterAnglerTickMinWaitReduction(int masterAnglerRank, boolean boatBonus) { - int totalBonus = AdvancedConfig.getInstance().getFishingReductionMinWaitTicks() * masterAnglerRank; + int totalBonus = mcMMO.p.getAdvancedConfig().getFishingReductionMinWaitTicks() * masterAnglerRank; if(boatBonus) { totalBonus += getFishingBoatMinWaitReduction(); @@ -359,11 +357,11 @@ public class FishingManager extends SkillManager { } public int getFishingBoatMinWaitReduction() { - return AdvancedConfig.getInstance().getFishingBoatReductionMinWaitTicks(); + return mcMMO.p.getAdvancedConfig().getFishingBoatReductionMinWaitTicks(); } public int getFishingBoatMaxWaitReduction() { - return AdvancedConfig.getInstance().getFishingBoatReductionMaxWaitTicks(); + return mcMMO.p.getAdvancedConfig().getFishingBoatReductionMaxWaitTicks(); } public boolean isMagicHunterEnabled() { @@ -386,7 +384,7 @@ public class FishingManager extends SkillManager { 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; } @@ -447,7 +445,7 @@ public class FishingManager extends SkillManager { } if(fishingSucceeds) { - if (Config.getInstance().getFishingExtraFish()) { + if (mcMMO.p.getGeneralConfig().getFishingExtraFish()) { Misc.spawnItem(player.getEyeLocation(), fishingCatch.getItemStack(), ItemSpawnReason.FISHING_EXTRA_FISH); } @@ -579,7 +577,7 @@ 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; 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 85f87ed51..7cf4ce1c4 100644 --- a/src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java +++ b/src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java @@ -1,7 +1,6 @@ package com.gmail.nossr50.skills.herbalism; import com.gmail.nossr50.api.ItemSpawnReason; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.config.experience.ExperienceConfig; import com.gmail.nossr50.config.treasure.TreasureConfig; import com.gmail.nossr50.datatypes.BlockSnapshot; @@ -210,7 +209,7 @@ public class HerbalismManager extends SkillManager { public void processHerbalismBlockBreakEvent(BlockBreakEvent blockBreakEvent) { Player player = getPlayer(); - if (Config.getInstance().getHerbalismPreventAFK() && player.isInsideVehicle()) { + if (mcMMO.p.getGeneralConfig().getHerbalismPreventAFK() && player.isInsideVehicle()) { return; } @@ -257,7 +256,7 @@ public class HerbalismManager extends SkillManager { //TODO: The design of Green Terra needs to change, this is a mess if(Permissions.greenThumbPlant(getPlayer(), originalBreak.getType())) { - if(Config.getInstance().isGreenThumbReplantableCrop(originalBreak.getType())) { + if(mcMMO.p.getGeneralConfig().isGreenThumbReplantableCrop(originalBreak.getType())) { if(!getPlayer().isSneaking()) { greenThumbActivated = processGreenThumbPlants(originalBreak, blockBreakEvent, isGreenTerraActive()); } 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 4ca7756d2..f2df8399d 100644 --- a/src/main/java/com/gmail/nossr50/skills/mining/BlastMining.java +++ b/src/main/java/com/gmail/nossr50/skills/mining/BlastMining.java @@ -1,6 +1,5 @@ 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.player.UserManager; @@ -33,7 +32,7 @@ public class BlastMining { } protected int getLevel() { - return AdvancedConfig.getInstance().getBlastMiningRankLevel(this); + return mcMMO.p.getAdvancedConfig().getBlastMiningRankLevel(this); } @@ -42,13 +41,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); } 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 868cdaad1..b1ffd853a 100644 --- a/src/main/java/com/gmail/nossr50/skills/mining/MiningManager.java +++ b/src/main/java/com/gmail/nossr50/skills/mining/MiningManager.java @@ -1,8 +1,6 @@ package com.gmail.nossr50.skills.mining; import com.gmail.nossr50.api.ItemSpawnReason; -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; @@ -48,7 +46,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); } @@ -83,20 +81,20 @@ public class MiningManager extends SkillManager { } if (mmoPlayer.getAbilityMode(skill.getAbility())) { - SkillUtils.handleDurabilityChange(getPlayer().getInventory().getItemInMainHand(), Config.getInstance().getAbilityToolDamage()); + 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)) { - boolean useTriple = mmoPlayer.getAbilityMode(skill.getAbility()) && AdvancedConfig.getInstance().getAllowMiningTripleDrops(); + boolean useTriple = mmoPlayer.getAbilityMode(skill.getAbility()) && mcMMO.p.getAdvancedConfig().getAllowMiningTripleDrops(); BlockUtils.markDropsAsBonus(blockState, useTriple); } } @@ -249,11 +247,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); } /** @@ -266,7 +264,7 @@ public class MiningManager extends SkillManager { } public static int getDropMultiplier(int rank) { - return AdvancedConfig.getInstance().getDropMultiplier(rank); + return mcMMO.p.getAdvancedConfig().getDropMultiplier(rank); } /** 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 8e8e56a3c..aec9f007c 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; @@ -51,11 +49,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); } @@ -153,7 +151,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); } @@ -175,7 +173,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; } @@ -204,7 +202,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()); } /** @@ -213,7 +211,7 @@ 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()); } /* 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 0e94b0589..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,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.mcMMO; import org.bukkit.Material; public final class Salvage { @@ -12,15 +11,15 @@ public final class Salvage { */ private Salvage() {} - public static Material anvilMaterial = Config.getInstance().getSalvageAnvilMaterial(); + public static Material anvilMaterial = mcMMO.p.getGeneralConfig().getSalvageAnvilMaterial(); - /*public static int salvageMaxPercentageLevel = AdvancedConfig.getInstance().getSalvageMaxPercentageLevel(); - public static double salvageMaxPercentage = AdvancedConfig.getInstance().getSalvageMaxPercentage(); + /*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(); static int calculateSalvageableAmount(int currentDurability, short maxDurability, int baseAmount) { double percentDamaged = (maxDurability <= 0) ? 1D : (double) (maxDurability - currentDurability) / maxDurability; 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 2545a15d2..28afb1192 100644 --- a/src/main/java/com/gmail/nossr50/skills/salvage/SalvageManager.java +++ b/src/main/java/com/gmail/nossr50/skills/salvage/SalvageManager.java @@ -1,8 +1,6 @@ package com.gmail.nossr50.skills.salvage; import com.gmail.nossr50.api.ItemSpawnReason; -import com.gmail.nossr50.config.AdvancedConfig; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.config.experience.ExperienceConfig; import com.gmail.nossr50.datatypes.interactions.NotificationType; import com.gmail.nossr50.datatypes.player.McMMOPlayer; @@ -53,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); } @@ -168,7 +166,7 @@ public class SalvageManager extends SkillManager { Misc.spawnItemTowardsLocation(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); } @@ -220,11 +218,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) { @@ -293,7 +291,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/smelting/SmeltingManager.java b/src/main/java/com/gmail/nossr50/skills/smelting/SmeltingManager.java index 0c0e0cb23..e30100723 100644 --- a/src/main/java/com/gmail/nossr50/skills/smelting/SmeltingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/smelting/SmeltingManager.java @@ -1,11 +1,11 @@ package com.gmail.nossr50.skills.smelting; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.datatypes.experience.XPGainReason; 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; @@ -125,7 +125,7 @@ public class SmeltingManager extends SkillManager { */ //Process double smelt - if (Config.getInstance().getDoubleDropsEnabled(PrimarySkillType.SMELTING, resultItemStack.getType()) + if (mcMMO.p.getGeneralConfig().getDoubleDropsEnabled(PrimarySkillType.SMELTING, resultItemStack.getType()) && canDoubleSmeltItemStack(furnace) //Effectively two less than max stack size && isSecondSmeltSuccessful()) { 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 0c2bd8fad..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,9 +1,9 @@ package com.gmail.nossr50.skills.swords; -import com.gmail.nossr50.config.AdvancedConfig; +import com.gmail.nossr50.mcMMO; public class Swords { - public static double counterAttackModifier = AdvancedConfig.getInstance().getCounterModifier(); + public static double counterAttackModifier = mcMMO.p.getAdvancedConfig().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 d6d07b62e..b3a194d00 100644 --- a/src/main/java/com/gmail/nossr50/skills/swords/SwordsManager.java +++ b/src/main/java/com/gmail/nossr50/skills/swords/SwordsManager.java @@ -1,6 +1,5 @@ package com.gmail.nossr50.skills.swords; -import com.gmail.nossr50.config.AdvancedConfig; import com.gmail.nossr50.datatypes.interactions.NotificationType; import com.gmail.nossr50.datatypes.meta.RuptureTaskMeta; import com.gmail.nossr50.datatypes.player.McMMOPlayer; @@ -76,7 +75,7 @@ public class SwordsManager extends SkillManager { return; //Don't apply bleed } - if (RandomChanceUtil.rollDice(AdvancedConfig.getInstance().getRuptureChanceToApplyOnHit(getRuptureRank()), 100)) { + if (RandomChanceUtil.rollDice(mcMMO.p.getAdvancedConfig().getRuptureChanceToApplyOnHit(getRuptureRank()), 100)) { if (target instanceof Player) { Player defender = (Player) target; @@ -91,8 +90,8 @@ public class SwordsManager extends SkillManager { } RuptureTask ruptureTask = new RuptureTask(mmoPlayer, target, - AdvancedConfig.getInstance().getRuptureTickDamage(target instanceof Player, getRuptureRank()), - AdvancedConfig.getInstance().getRuptureExplosionDamage(target instanceof Player, getRuptureRank())); + mcMMO.p.getAdvancedConfig().getRuptureTickDamage(target instanceof Player, getRuptureRank()), + mcMMO.p.getAdvancedConfig().getRuptureExplosionDamage(target instanceof Player, getRuptureRank())); RuptureTaskMeta ruptureTaskMeta = new RuptureTaskMeta(mcMMO.p, ruptureTask); @@ -136,7 +135,7 @@ public class SwordsManager extends SkillManager { } public int getRuptureBleedTicks(boolean isTargetPlayer) { - return AdvancedConfig.getInstance().getRuptureDurationSeconds(isTargetPlayer) / RuptureTask.DAMAGE_TICK_INTERVAL; + return mcMMO.p.getAdvancedConfig().getRuptureDurationSeconds(isTargetPlayer) / RuptureTask.DAMAGE_TICK_INTERVAL; } /** 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 23a12081b..cd5f14545 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; @@ -64,9 +62,9 @@ public class TamingManager extends SkillManager { 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 @@ -75,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); @@ -273,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); @@ -459,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 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 9116c4fdf..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,6 +1,5 @@ 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; @@ -19,7 +18,7 @@ public class TrackedTamingEntity extends BukkitRunnable { this.callOfTheWildType = callOfTheWildType; this.livingEntity = livingEntity; - int tamingCOTWLength = Config.getInstance().getTamingCOTWLength(callOfTheWildType.getConfigEntityTypeEntry()); + int tamingCOTWLength = mcMMO.p.getGeneralConfig().getTamingCOTWLength(callOfTheWildType.getConfigEntityTypeEntry()); if (tamingCOTWLength > 0) { int length = tamingCOTWLength * Misc.TICK_CONVERSION_FACTOR; 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 73bf3dce9..668eae038 100644 --- a/src/main/java/com/gmail/nossr50/skills/unarmed/UnarmedManager.java +++ b/src/main/java/com/gmail/nossr50/skills/unarmed/UnarmedManager.java @@ -1,7 +1,6 @@ package com.gmail.nossr50.skills.unarmed; import com.gmail.nossr50.api.ItemSpawnReason; -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; @@ -113,7 +112,7 @@ public class UnarmedManager extends SkillManager { Item item = Misc.spawnItem(defender.getLocation(), defender.getInventory().getItemInMainHand(), ItemSpawnReason.UNARMED_DISARMED_ITEM); - if (item != null && AdvancedConfig.getInstance().getDisarmProtected()) { + if (item != null && mcMMO.p.getAdvancedConfig().getDisarmProtected()) { item.setMetadata(mcMMO.disarmedItemKey, UserManager.getPlayer(defender).getPlayerMetadata()); } @@ -167,8 +166,8 @@ public class UnarmedManager extends SkillManager { double finalBonus = bonus + 0.5 + (rank / 2); - if(AdvancedConfig.getInstance().isSteelArmDamageCustom()) { - return AdvancedConfig.getInstance().getSteelArmOverride(RankUtils.getRank(getPlayer(), SubSkillType.UNARMED_STEEL_ARM_STYLE), finalBonus); + if(mcMMO.p.getAdvancedConfig().isSteelArmDamageCustom()) { + return mcMMO.p.getAdvancedConfig().getSteelArmOverride(RankUtils.getRank(getPlayer(), SubSkillType.UNARMED_STEEL_ARM_STYLE), finalBonus); } else { return finalBonus; } 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 a2bb23790..49fa5bd20 100644 --- a/src/main/java/com/gmail/nossr50/skills/woodcutting/WoodcuttingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/woodcutting/WoodcuttingManager.java @@ -1,8 +1,6 @@ package com.gmail.nossr50.skills.woodcutting; import com.gmail.nossr50.api.ItemSpawnReason; -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; @@ -54,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) { @@ -72,7 +70,7 @@ public class WoodcuttingManager extends SkillManager { 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()) - && Config.getInstance().getDoubleDropsEnabled(PrimarySkillType.WOODCUTTING, material); + && mcMMO.p.getGeneralConfig().getDoubleDropsEnabled(PrimarySkillType.WOODCUTTING, material); } /** @@ -217,7 +215,7 @@ public class WoodcuttingManager extends SkillManager { for (BlockState blockState : treeFellerBlocks) { if (BlockUtils.hasWoodcuttingXP(blockState)) { - durabilityLoss += Config.getInstance().getAbilityToolDamage(); + durabilityLoss += mcMMO.p.getGeneralConfig().getAbilityToolDamage(); } } @@ -307,7 +305,7 @@ public class WoodcuttingManager extends SkillManager { Misc.spawnItemsFromCollection(Misc.getBlockCenter(blockState), block.getDrops(), ItemSpawnReason.TREE_FELLER_DISPLACED_BLOCK); if(RankUtils.hasReachedRank(2, player, SubSkillType.WOODCUTTING_KNOCK_ON_WOOD)) { - if(AdvancedConfig.getInstance().isKnockOnWoodXPOrbEnabled()) { + if(mcMMO.p.getAdvancedConfig().isKnockOnWoodXPOrbEnabled()) { if(RandomChanceUtil.rollDice(10, 100)) { int randOrbCount = Math.max(1, Misc.getRandom().nextInt(100)); Misc.spawnExperienceOrb(blockState.getLocation(), randOrbCount); diff --git a/src/main/java/com/gmail/nossr50/util/BlockUtils.java b/src/main/java/com/gmail/nossr50/util/BlockUtils.java index 8a443c119..e1944f738 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; @@ -53,7 +52,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)); } @@ -68,10 +67,10 @@ public final class BlockUtils { */ public static boolean shouldBeWatched(BlockState blockState) { return affectedByGigaDrillBreaker(blockState) || affectedByGreenTerra(blockState) || affectedBySuperBreaker(blockState) || hasWoodcuttingXP(blockState) - || Config.getInstance().getDoubleDropsEnabled(PrimarySkillType.MINING, blockState.getType()) - || Config.getInstance().getDoubleDropsEnabled(PrimarySkillType.EXCAVATION, blockState.getType()) - || Config.getInstance().getDoubleDropsEnabled(PrimarySkillType.WOODCUTTING, blockState.getType()) - || Config.getInstance().getDoubleDropsEnabled(PrimarySkillType.SMELTING, blockState.getType()); + || 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()); } /** diff --git a/src/main/java/com/gmail/nossr50/util/ChimaeraWing.java b/src/main/java/com/gmail/nossr50/util/ChimaeraWing.java index c1bccbca2..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,7 +148,7 @@ 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 @@ -165,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/EventUtils.java b/src/main/java/com/gmail/nossr50/util/EventUtils.java index e1f2d1b97..c2d181063 100644 --- a/src/main/java/com/gmail/nossr50/util/EventUtils.java +++ b/src/main/java/com/gmail/nossr50/util/EventUtils.java @@ -1,6 +1,5 @@ package com.gmail.nossr50.util; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.datatypes.experience.XPGainReason; import com.gmail.nossr50.datatypes.experience.XPGainSource; import com.gmail.nossr50.datatypes.party.Party; @@ -9,6 +8,7 @@ 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.datatypes.skills.SuperAbilityType; +import com.gmail.nossr50.datatypes.skills.interfaces.Skill; import com.gmail.nossr50.datatypes.skills.subskills.AbstractSubSkill; import com.gmail.nossr50.events.experience.McMMOPlayerLevelChangeEvent; import com.gmail.nossr50.events.experience.McMMOPlayerLevelDownEvent; @@ -409,7 +409,7 @@ public final class EventUtils { for (PrimarySkillType primarySkillType : PrimarySkillType.NON_CHILD_SKILLS) { String skillName = primarySkillType.toString(); int playerSkillLevel = playerProfile.getSkillLevel(primarySkillType); - int threshold = Config.getInstance().getHardcoreDeathStatPenaltyLevelThreshold(); + 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)); @@ -479,7 +479,7 @@ public final class EventUtils { } public static McMMOPlayerAbilityDeactivateEvent callAbilityDeactivateEvent(Player player, SuperAbilityType ability) { - McMMOPlayerAbilityDeactivateEvent event = new McMMOPlayerAbilityDeactivateEvent(player, PrimarySkillType.byAbility(ability)); + McMMOPlayerAbilityDeactivateEvent event = new McMMOPlayerAbilityDeactivateEvent(player, Skill.byAbility(ability)); mcMMO.p.getServer().getPluginManager().callEvent(event); return event; diff --git a/src/main/java/com/gmail/nossr50/util/HardcoreManager.java b/src/main/java/com/gmail/nossr50/util/HardcoreManager.java index 11b7e01c4..4e6152b1c 100644 --- a/src/main/java/com/gmail/nossr50/util/HardcoreManager.java +++ b/src/main/java/com/gmail/nossr50/util/HardcoreManager.java @@ -1,9 +1,9 @@ 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.worldguard.WorldGuardManager; @@ -22,8 +22,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; @@ -73,8 +73,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; diff --git a/src/main/java/com/gmail/nossr50/util/ItemUtils.java b/src/main/java/com/gmail/nossr50/util/ItemUtils.java index 46c68183b..2c66ff84f 100644 --- a/src/main/java/com/gmail/nossr50/util/ItemUtils.java +++ b/src/main/java/com/gmail/nossr50/util/ItemUtils.java @@ -1,7 +1,5 @@ package com.gmail.nossr50.util; -import com.gmail.nossr50.config.AdvancedConfig; -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; @@ -186,7 +184,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); } @@ -622,7 +620,7 @@ public final class ItemUtils { if(itemMeta == null) return; - itemMeta.addEnchant(Enchantment.DIG_SPEED, existingEnchantLevel + AdvancedConfig.getInstance().getEnchantBuff(), true); + itemMeta.addEnchant(Enchantment.DIG_SPEED, existingEnchantLevel + mcMMO.p.getAdvancedConfig().getEnchantBuff(), true); itemStack.setItemMeta(itemMeta); } diff --git a/src/main/java/com/gmail/nossr50/util/MobHealthbarUtils.java b/src/main/java/com/gmail/nossr50/util/MobHealthbarUtils.java index 9c1f6b76e..ff77f38e8 100644 --- a/src/main/java/com/gmail/nossr50/util/MobHealthbarUtils.java +++ b/src/main/java/com/gmail/nossr50/util/MobHealthbarUtils.java @@ -1,6 +1,5 @@ package com.gmail.nossr50.util; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.datatypes.MobHealthbarType; import com.gmail.nossr50.datatypes.meta.OldName; import com.gmail.nossr50.mcMMO; @@ -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; } @@ -63,12 +62,12 @@ public final class MobHealthbarUtils { } 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)); diff --git a/src/main/java/com/gmail/nossr50/util/ModManager.java b/src/main/java/com/gmail/nossr50/util/ModManager.java index 184b571b1..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; @@ -89,67 +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()); + 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) { @@ -167,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()); } /** @@ -185,7 +184,7 @@ public class ModManager { } public boolean isCustomEntity(Entity entity) { - if (!Config.getInstance().getEntityModsEnabled()) { + if (!mcMMO.p.getGeneralConfig().getEntityModsEnabled()) { return false; } @@ -227,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 a64c476f3..2dabff51e 100644 --- a/src/main/java/com/gmail/nossr50/util/Permissions.java +++ b/src/main/java/com/gmail/nossr50/util/Permissions.java @@ -26,7 +26,6 @@ public final class Permissions { */ public static boolean motd(Permissible permissible) { return permissible.hasPermission("mcmmo.motd"); } public static boolean levelUpBroadcast(Permissible permissible) { return permissible.hasPermission("mcmmo.broadcast.levelup"); } - public static boolean mobHealthDisplay(Permissible permissible) { return permissible.hasPermission("mcmmo.mobhealthdisplay"); } 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"); } @@ -34,8 +33,6 @@ 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"); } @@ -60,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")); } @@ -98,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"); } @@ -172,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"); } @@ -209,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/commands/CommandRegistrationManager.java b/src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java index 3f93437a7..ed98345a1 100644 --- a/src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java +++ b/src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java @@ -16,7 +16,6 @@ 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; @@ -283,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")); @@ -389,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"); @@ -455,7 +445,6 @@ public final class CommandRegistrationManager { registerMcnotifyCommand(); registerMcrefreshCommand(); registerMcscoreboardCommand(); - registerMHDCommand(); registerXprateCommand(); // Database Commands 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 de6f689fb..e7cee3107 100644 --- a/src/main/java/com/gmail/nossr50/util/commands/CommandUtils.java +++ b/src/main/java/com/gmail/nossr50/util/commands/CommandUtils.java @@ -1,6 +1,5 @@ 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; @@ -38,7 +37,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; } @@ -209,7 +208,7 @@ public final class CommandUtils { if (skill.isChildSkill()) { 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.getGeneralConfig().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)); @@ -258,7 +257,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) { 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 3c7ff308f..c82a6e00e 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; @@ -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.getGeneralConfig().getLevelCap(primarySkillType); while (experience > 0 && newLevel < maxLevel) { int experienceToNextLevel = getXPtoNextLevel(newLevel, formulaType); 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 e616760a8..fc7de2b28 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,5 @@ 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; @@ -50,7 +48,7 @@ public class NotificationManager { if(UserManager.getPlayer(player) == null || !UserManager.getPlayer(player).useChatNotifications()) return; - McMMOMessageType destination = AdvancedConfig.getInstance().doesNotificationUseActionBar(notificationType) ? McMMOMessageType.ACTION_BAR : McMMOMessageType.SYSTEM; + McMMOMessageType destination = mcMMO.p.getAdvancedConfig().doesNotificationUseActionBar(notificationType) ? McMMOMessageType.ACTION_BAR : McMMOMessageType.SYSTEM; Component message = TextComponentFactory.getNotificationTextComponentFromLocale(key); McMMOPlayerNotificationEvent customEvent = checkNotificationEvent(player, notificationType, destination, message); @@ -105,7 +103,7 @@ public class NotificationManager { if(UserManager.getPlayer(player) == null || !UserManager.getPlayer(player).useChatNotifications()) return; - McMMOMessageType destination = AdvancedConfig.getInstance().doesNotificationUseActionBar(notificationType) ? McMMOMessageType.ACTION_BAR : McMMOMessageType.SYSTEM; + McMMOMessageType destination = mcMMO.p.getAdvancedConfig().doesNotificationUseActionBar(notificationType) ? McMMOMessageType.ACTION_BAR : McMMOMessageType.SYSTEM; Component message = TextComponentFactory.getNotificationMultipleValues(key, values); McMMOPlayerNotificationEvent customEvent = checkNotificationEvent(player, notificationType, destination, message); @@ -137,7 +135,7 @@ public class NotificationManager { 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); @@ -155,7 +153,7 @@ public class NotificationManager { if(!mcMMOPlayer.useChatNotifications()) return; - McMMOMessageType destination = AdvancedConfig.getInstance().doesNotificationUseActionBar(NotificationType.LEVEL_UP_MESSAGE) ? McMMOMessageType.ACTION_BAR : McMMOMessageType.SYSTEM; + McMMOMessageType destination = mcMMO.p.getAdvancedConfig().doesNotificationUseActionBar(NotificationType.LEVEL_UP_MESSAGE) ? McMMOMessageType.ACTION_BAR : McMMOMessageType.SYSTEM; Component levelUpTextComponent = TextComponentFactory.getNotificationLevelUpTextComponent(skillName, levelsGained, newLevel); McMMOPlayerNotificationEvent customEvent = checkNotificationEvent(mcMMOPlayer.getPlayer(), NotificationType.LEVEL_UP_MESSAGE, destination, levelUpTextComponent); @@ -183,7 +181,7 @@ public class NotificationManager { 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(), @@ -197,7 +195,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()) @@ -274,13 +272,13 @@ public class NotificationManager { return; //Check if broadcasting is enabled - if(Config.getInstance().shouldLevelUpBroadcasts()) { + if(mcMMO.p.getGeneralConfig().shouldLevelUpBroadcasts()) { //Permission check if(!Permissions.levelUpBroadcast(mmoPlayer.getPlayer())) { return; } - int levelInterval = Config.getInstance().getLevelUpBroadcastInterval(); + int levelInterval = mcMMO.p.getGeneralConfig().getLevelUpBroadcastInterval(); int remainder = level % levelInterval; if(remainder == 0) { @@ -309,13 +307,13 @@ public class NotificationManager { return; //Check if broadcasting is enabled - if(Config.getInstance().shouldPowerLevelUpBroadcasts()) { + if(mcMMO.p.getGeneralConfig().shouldPowerLevelUpBroadcasts()) { //Permission check if(!Permissions.levelUpBroadcast(mmoPlayer.getPlayer())) { return; } - int levelInterval = Config.getInstance().getPowerLevelUpBroadcastInterval(); + int levelInterval = mcMMO.p.getGeneralConfig().getPowerLevelUpBroadcastInterval(); int remainder = powerLevel % levelInterval; if(remainder == 0) { 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 a59cd2861..67982ce59 100644 --- a/src/main/java/com/gmail/nossr50/util/random/RandomChanceUtil.java +++ b/src/main/java/com/gmail/nossr50/util/random/RandomChanceUtil.java @@ -1,10 +1,10 @@ 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.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; @@ -252,11 +252,11 @@ public class RandomChanceUtil { 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(); } @@ -328,10 +328,10 @@ public class RandomChanceUtil { } public static double getMaximumProbability(@NotNull SubSkillType subSkillType) { - return AdvancedConfig.getInstance().getMaximumProbability(subSkillType); + return mcMMO.p.getAdvancedConfig().getMaximumProbability(subSkillType); } public static double getMaxBonusLevelCap(@NotNull SubSkillType subSkillType) { - return AdvancedConfig.getInstance().getMaxBonusLevel(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 b6bb064b5..5ec4381b6 100644 --- a/src/main/java/com/gmail/nossr50/util/scoreboards/ScoreboardManager.java +++ b/src/main/java/com/gmail/nossr50/util/scoreboards/ScoreboardManager.java @@ -1,6 +1,5 @@ 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; @@ -72,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, @@ -153,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 { @@ -244,11 +243,11 @@ public class ScoreboardManager { } } - if (Config.getInstance().getPowerLevelTagsEnabled() && !dirtyPowerLevels.contains(playerName)) { + if (mcMMO.p.getGeneralConfig().getPowerLevelTagsEnabled() && !dirtyPowerLevels.contains(playerName)) { dirtyPowerLevels.add(playerName); } - if (Config.getInstance().getSkillLevelUpBoard()) { + if (mcMMO.p.getGeneralConfig().getSkillLevelUpBoard()) { enablePlayerSkillLevelUpScoreboard(player, skill); } @@ -299,7 +298,7 @@ public class ScoreboardManager { wrapper.setOldScoreboard(); wrapper.setTypeSkill(skill); - changeScoreboard(wrapper, Config.getInstance().getSkillScoreboardTime()); + changeScoreboard(wrapper, mcMMO.p.getGeneralConfig().getSkillScoreboardTime()); } } @@ -318,7 +317,7 @@ public class ScoreboardManager { wrapper.setOldScoreboard(); wrapper.setTypeSkill(primarySkillType); - changeScoreboard(wrapper, Config.getInstance().getSkillScoreboardTime()); + changeScoreboard(wrapper, mcMMO.p.getGeneralConfig().getSkillScoreboardTime()); } } @@ -333,7 +332,7 @@ public class ScoreboardManager { wrapper.setOldScoreboard(); wrapper.setTypeSkill(skill); - changeScoreboard(wrapper, Config.getInstance().getSkillLevelUpTime()); + changeScoreboard(wrapper, mcMMO.p.getGeneralConfig().getSkillLevelUpTime()); } } @@ -347,7 +346,7 @@ public class ScoreboardManager { wrapper.setOldScoreboard(); wrapper.setTypeSelfStats(); - changeScoreboard(wrapper, Config.getInstance().getStatsScoreboardTime()); + changeScoreboard(wrapper, mcMMO.p.getGeneralConfig().getStatsScoreboardTime()); } public static void enablePlayerInspectScoreboard(@NotNull Player player, @NotNull PlayerProfile targetProfile) { @@ -362,7 +361,7 @@ public class ScoreboardManager { wrapper.setOldScoreboard(); wrapper.setTypeInspectStats(targetProfile); - changeScoreboard(wrapper, Config.getInstance().getInspectScoreboardTime()); + changeScoreboard(wrapper, mcMMO.p.getGeneralConfig().getInspectScoreboardTime()); } } @@ -378,7 +377,7 @@ public class ScoreboardManager { wrapper.setOldScoreboard(); wrapper.setTypeInspectStats(targetMcMMOPlayer); - changeScoreboard(wrapper, Config.getInstance().getInspectScoreboardTime()); + changeScoreboard(wrapper, mcMMO.p.getGeneralConfig().getInspectScoreboardTime()); } } @@ -394,7 +393,7 @@ public class ScoreboardManager { wrapper.setOldScoreboard(); wrapper.setTypeCooldowns(); - changeScoreboard(wrapper, Config.getInstance().getCooldownScoreboardTime()); + changeScoreboard(wrapper, mcMMO.p.getGeneralConfig().getCooldownScoreboardTime()); } } @@ -411,7 +410,7 @@ public class ScoreboardManager { wrapper.setTypeSelfRank(); wrapper.acceptRankData(rank); - changeScoreboard(wrapper, Config.getInstance().getRankScoreboardTime()); + changeScoreboard(wrapper, mcMMO.p.getGeneralConfig().getRankScoreboardTime()); } } @@ -428,7 +427,7 @@ public class ScoreboardManager { wrapper.setTypeInspectRank(targetName); wrapper.acceptRankData(rank); - changeScoreboard(wrapper, Config.getInstance().getRankScoreboardTime()); + changeScoreboard(wrapper, mcMMO.p.getGeneralConfig().getRankScoreboardTime()); } } @@ -446,7 +445,7 @@ public class ScoreboardManager { wrapper.setTypeTop(skill, pageNumber); wrapper.acceptLeaderboardData(stats); - changeScoreboard(wrapper, Config.getInstance().getTopScoreboardTime()); + changeScoreboard(wrapper, mcMMO.p.getGeneralConfig().getTopScoreboardTime()); } } @@ -463,7 +462,7 @@ public class ScoreboardManager { wrapper.setTypeTopPower(pageNumber); wrapper.acceptLeaderboardData(stats); - changeScoreboard(wrapper, Config.getInstance().getTopScoreboardTime()); + changeScoreboard(wrapper, mcMMO.p.getGeneralConfig().getTopScoreboardTime()); } } @@ -517,7 +516,7 @@ public class ScoreboardManager { * @return the main targetBoard objective, or null if disabled */ public static @Nullable Objective getPowerLevelObjective() { - if (!Config.getInstance().getPowerLevelTagsEnabled()) { + if (!mcMMO.p.getGeneralConfig().getPowerLevelTagsEnabled()) { if(getScoreboardManager() == null) return null; 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 e2669d4c0..20f3d4d97 100644 --- a/src/main/java/com/gmail/nossr50/util/scoreboards/ScoreboardWrapper.java +++ b/src/main/java/com/gmail/nossr50/util/scoreboards/ScoreboardWrapper.java @@ -1,6 +1,5 @@ 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; @@ -75,7 +74,7 @@ public class ScoreboardWrapper { registered = true; } - if (Config.getInstance().getPowerLevelTagsEnabled()) { + if (mcMMO.p.getGeneralConfig().getPowerLevelTagsEnabled()) { powerObjective.setDisplayName(ScoreboardManager.TAG_POWER_LEVEL); powerObjective.setDisplaySlot(DisplaySlot.BELOW_NAME); @@ -225,7 +224,7 @@ public class ScoreboardWrapper { PlayerProfile profile = UserManager.getPlayer(player).getProfile(); - if (profile.getScoreboardTipsShown() >= Config.getInstance().getTipsAmount()) { + if (profile.getScoreboardTipsShown() >= mcMMO.p.getGeneralConfig().getTipsAmount()) { return; } 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 615ad89eb..e3dcf0e6f 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; @@ -536,7 +535,7 @@ public final class CombatUtils { * @return true if the player has access to the limit break */ public static boolean canUseLimitBreak(@NotNull Player player, LivingEntity target, @NotNull SubSkillType subSkillType) { - if(target instanceof Player || AdvancedConfig.getInstance().canApplyLimitBreakPVE()) { + if(target instanceof Player || mcMMO.p.getAdvancedConfig().canApplyLimitBreakPVE()) { return RankUtils.hasUnlockedSubskill(player, subSkillType) && Permissions.isSubSkillEnabled(player, subSkillType); } else { 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 f63b5dd83..a70f09471 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/ParticleEffectUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/ParticleEffectUtils.java @@ -1,6 +1,6 @@ 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; @@ -24,7 +24,7 @@ public final class ParticleEffectUtils { } public static void playBleedEffect(LivingEntity livingEntity) { - if (!Config.getInstance().getBleedEffectEnabled()) { + if (!mcMMO.p.getGeneralConfig().getBleedEffectEnabled()) { return; } @@ -63,7 +63,7 @@ public final class ParticleEffectUtils { public static void playDodgeEffect(Player player) { - if (!Config.getInstance().getDodgeEffectEnabled()) { + if (!mcMMO.p.getGeneralConfig().getDodgeEffectEnabled()) { return; } @@ -71,7 +71,7 @@ public final class ParticleEffectUtils { } public static void playFluxEffect(Location location) { - if (!Config.getInstance().getFluxEffectEnabled()) { + if (!mcMMO.p.getGeneralConfig().getFluxEffectEnabled()) { return; } @@ -100,7 +100,7 @@ public final class ParticleEffectUtils { } public static void playGreaterImpactEffect(LivingEntity livingEntity) { - if (!Config.getInstance().getGreaterImpactEffectEnabled()) { + if (!mcMMO.p.getGeneralConfig().getGreaterImpactEffectEnabled()) { return; } @@ -110,7 +110,7 @@ public final class ParticleEffectUtils { } public static void playCallOfTheWildEffect(LivingEntity livingEntity) { - if (!Config.getInstance().getCallOfTheWildEffectEnabled()) { + if (!mcMMO.p.getGeneralConfig().getCallOfTheWildEffectEnabled()) { return; } @@ -118,7 +118,7 @@ public final class ParticleEffectUtils { } public static void playAbilityDisabledEffect(Player player) { - if (!Config.getInstance().getAbilityDeactivationEffectEnabled()) { + if (!mcMMO.p.getGeneralConfig().getAbilityDeactivationEffectEnabled()) { } /*if (hasHeadRoom(player)) { 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 08b931764..434828dca 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; @@ -56,8 +54,8 @@ public final 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 abilityLengthVar = mcMMO.p.getAdvancedConfig().getAbilityLength(); + int abilityLengthCap = mcMMO.p.getAdvancedConfig().getAbilityLengthCap(); int length; @@ -125,7 +123,7 @@ public final 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") ? PrimarySkillType.getSkill(skillName) != null : isLocalizedSkill(skillName); } public static void sendSkillMessage(Player player, NotificationType notificationType, String key) { @@ -183,8 +181,8 @@ public final 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; diff --git a/src/main/java/com/gmail/nossr50/util/text/TextComponentFactory.java b/src/main/java/com/gmail/nossr50/util/text/TextComponentFactory.java index 2259c509f..5506b6685 100644 --- a/src/main/java/com/gmail/nossr50/util/text/TextComponentFactory.java +++ b/src/main/java/com/gmail/nossr50/util/text/TextComponentFactory.java @@ -1,6 +1,5 @@ package com.gmail.nossr50.util.text; -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; @@ -64,7 +63,7 @@ public class TextComponentFactory { public static void sendPlayerSubSkillWikiLink(Player player, String subskillformatted) { - if(!Config.getInstance().getUrlLinksEnabled()) + if(!mcMMO.p.getGeneralConfig().getUrlLinksEnabled()) return; TextComponent.Builder wikiLinkComponent = Component.text().content(LocaleLoader.getString("Overhaul.mcMMO.MmoInfo.Wiki")); diff --git a/src/main/java/net/shatteredlands/shatt/backup/ZipLibrary.java b/src/main/java/net/shatteredlands/shatt/backup/ZipLibrary.java index e60c8554b..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; @@ -27,7 +26,7 @@ public class ZipLibrary { 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."); } diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 508e96ee8..0a7c82b62 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -168,9 +168,6 @@ commands: 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 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..99a019c0d --- /dev/null +++ b/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java @@ -0,0 +1,119 @@ +package com.gmail.nossr50.database; + +import com.gmail.nossr50.TestUtil; +import com.gmail.nossr50.config.GeneralConfig; +import com.google.common.io.Files; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; + +import java.io.*; +import java.util.logging.Logger; + + +@PrepareForTest({GeneralConfig.class}) +@RunWith(PowerMockRunner.class) +public class FlatFileDatabaseManagerTest { + + public static final @NotNull String TEST_FILE_NAME = "test.mcmmo.users"; + 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 flatFileDatabaseManager; + + @Before + public void init() { + logger.info("Preparing new test..."); + tempDir = Files.createTempDir(); + flatFileDatabaseManager = new FlatFileDatabaseManager(tempDir.getPath() + File.separator + TEST_FILE_NAME, logger, PURGE_TIME, 0); + } + + @After + public void tearDown() { + logger.info("Tearing down after test..."); + TestUtil.recursiveDelete(tempDir); + flatFileDatabaseManager = null; + } + + private static 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 String[] splitDataBadDatabase = { + //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 + public void testPurgePowerlessUsers() { +// logger.info("testPurgePowerlessUsers"); +// Assert.assertNotNull(flatFileDatabaseManager); +// addDataToFile(flatFileDatabaseManager, normalDatabaseData); +// int purgeCount = flatFileDatabaseManager.purgePowerlessUsers(); +// Assert.assertEquals(purgeCount, 1); //1 User should have been purged + } + + private void addDataToFile(@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.severe("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 + } + } + } + + } +} \ No newline at end of file From eec5feb2bf1bb467392638c5504c819069e3d80b Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 8 Apr 2021 13:21:34 -0700 Subject: [PATCH 477/662] PrimarySkillType refactor and other refactors --- Changelog.txt | 3 + .../com/gmail/nossr50/api/ExperienceAPI.java | 25 +- .../java/com/gmail/nossr50/api/SkillAPI.java | 11 +- .../commands/experience/AddlevelsCommand.java | 3 +- .../commands/experience/AddxpCommand.java | 3 +- .../experience/ExperienceCommand.java | 14 +- .../commands/experience/MmoeditCommand.java | 3 +- .../experience/SkillresetCommand.java | 12 +- .../commands/hardcore/HardcoreCommand.java | 4 +- .../hardcore/HardcoreModeCommand.java | 258 ++++----- .../commands/hardcore/VampirismCommand.java | 2 +- .../commands/player/InspectCommand.java | 6 +- .../nossr50/commands/player/MctopCommand.java | 4 +- .../nossr50/commands/player/XPBarCommand.java | 5 +- .../commands/skills/HerbalismCommand.java | 3 +- .../commands/skills/MmoInfoCommand.java | 5 +- .../nossr50/commands/skills/SkillCommand.java | 12 +- .../commands/skills/SkillGuideCommand.java | 3 +- .../commands/skills/WoodcuttingCommand.java | 5 +- .../gmail/nossr50/config/GeneralConfig.java | 2 +- .../database/FlatFileDatabaseManager.java | 35 +- .../nossr50/database/SQLDatabaseManager.java | 20 +- .../nossr50/datatypes/player/McMMOPlayer.java | 164 ++++-- .../datatypes/player/PlayerProfile.java | 35 +- .../datatypes/skills/PrimarySkillType.java | 492 +++++++++--------- .../datatypes/skills/SubSkillType.java | 3 +- .../datatypes/skills/interfaces/Skill.java | 84 --- .../skills/subskills/acrobatics/Roll.java | 93 ---- .../abilities/McMMOPlayerAbilityEvent.java | 3 +- .../secondaryabilities/SubSkillEvent.java | 5 +- .../nossr50/listeners/BlockListener.java | 12 +- .../nossr50/listeners/PlayerListener.java | 14 +- .../gmail/nossr50/listeners/SelfListener.java | 4 +- .../gmail/nossr50/locale/LocaleLoader.java | 1 + src/main/java/com/gmail/nossr50/mcMMO.java | 12 +- .../commands/McrankCommandDisplayTask.java | 6 +- .../commands/MctopCommandDisplayTask.java | 4 +- .../database/FormulaConversionTask.java | 2 +- .../runnables/skills/AbilityDisableTask.java | 4 +- .../skills/acrobatics/AcrobaticsManager.java | 2 +- .../gmail/nossr50/skills/alchemy/Alchemy.java | 1 - .../skills/alchemy/AlchemyManager.java | 4 +- .../nossr50/skills/child/ChildConfig.java | 3 +- .../nossr50/skills/child/FamilyTree.java | 5 +- .../nossr50/skills/mining/MiningManager.java | 4 +- .../com/gmail/nossr50/util/EventUtils.java | 6 +- .../gmail/nossr50/util/HardcoreManager.java | 16 +- .../commands/CommandRegistrationManager.java | 2 +- .../nossr50/util/commands/CommandUtils.java | 23 +- .../util/experience/ExperienceBarManager.java | 4 +- .../util/player/NotificationManager.java | 4 +- .../util/scoreboards/ScoreboardManager.java | 20 +- .../util/scoreboards/ScoreboardWrapper.java | 15 +- .../nossr50/util/skills/CombatUtils.java | 24 +- .../gmail/nossr50/util/skills/RankUtils.java | 3 +- .../gmail/nossr50/util/skills/SkillTools.java | 450 ++++++++++++++++ .../gmail/nossr50/util/skills/SkillUtils.java | 8 +- .../gmail/nossr50/util/text/StringUtils.java | 29 ++ .../database/FlatFileDatabaseManagerTest.java | 1 - 59 files changed, 1204 insertions(+), 796 deletions(-) create mode 100644 src/main/java/com/gmail/nossr50/util/skills/SkillTools.java diff --git a/Changelog.txt b/Changelog.txt index 8e1b2d0e6..7e251df2a 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -2,6 +2,9 @@ Version 2.1.189 Removed MHD command (it didn't do anything for a while now) Removed UP warning Updated pl locale (Thanks Mich3l3k) + Fixed an IllegalPluginAccessException error that could happen during server shutdown + Minor performance optimizations to FlatFile database + Refactored a lot of code NOTES: Ultra Permissions is SAFE to use with mcMMO diff --git a/src/main/java/com/gmail/nossr50/api/ExperienceAPI.java b/src/main/java/com/gmail/nossr50/api/ExperienceAPI.java index 158aafa27..81873a699 100644 --- a/src/main/java/com/gmail/nossr50/api/ExperienceAPI.java +++ b/src/main/java/com/gmail/nossr50/api/ExperienceAPI.java @@ -35,7 +35,7 @@ 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; } /** @@ -78,9 +78,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 && !mcMMO.p.getSkillTools().isChildSkill(skill); } @Deprecated @@ -294,11 +294,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); } /** @@ -317,7 +318,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())); } /** @@ -625,7 +626,7 @@ public final class ExperienceAPI { PlayerProfile profile = getOfflineProfile(playerName); PrimarySkillType skill = getSkillType(skillType); - if (skill.isChildSkill()) { + if (mcMMO.p.getSkillTools().isChildSkill(skill)) { Set parentSkills = FamilyTree.getParents(skill); for (PrimarySkillType parentSkill : parentSkills) { @@ -656,7 +657,7 @@ public final class ExperienceAPI { PlayerProfile profile = getOfflineProfile(uuid); PrimarySkillType skill = getSkillType(skillType); - if (skill.isChildSkill()) { + if (mcMMO.p.getSkillTools().isChildSkill(skill)) { Set parentSkills = FamilyTree.getParents(skill); for (PrimarySkillType parentSkill : parentSkills) { @@ -762,7 +763,7 @@ public final class ExperienceAPI { int powerLevel = 0; PlayerProfile profile = getOfflineProfile(playerName); - for (PrimarySkillType type : PrimarySkillType.NON_CHILD_SKILLS) { + for (PrimarySkillType type : mcMMO.p.getSkillTools().NON_CHILD_SKILLS) { powerLevel += profile.getSkillLevel(type); } @@ -783,7 +784,7 @@ public final class ExperienceAPI { int powerLevel = 0; PlayerProfile profile = getOfflineProfile(uuid); - for (PrimarySkillType type : PrimarySkillType.NON_CHILD_SKILLS) { + for (PrimarySkillType type : mcMMO.p.getSkillTools().NON_CHILD_SKILLS) { powerLevel += profile.getSkillLevel(type); } @@ -1168,7 +1169,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(); @@ -1180,7 +1181,7 @@ public final class ExperienceAPI { private static PrimarySkillType getNonChildSkillType(String skillType) throws InvalidSkillException, UnsupportedOperationException { PrimarySkillType skill = getSkillType(skillType); - if (skill.isChildSkill()) { + if (mcMMO.p.getSkillTools().isChildSkill(skill)) { throw new UnsupportedOperationException("Child skills do not have XP"); } diff --git a/src/main/java/com/gmail/nossr50/api/SkillAPI.java b/src/main/java/com/gmail/nossr50/api/SkillAPI.java index cdb686af8..db98ed08a 100644 --- a/src/main/java/com/gmail/nossr50/api/SkillAPI.java +++ b/src/main/java/com/gmail/nossr50/api/SkillAPI.java @@ -1,6 +1,7 @@ package com.gmail.nossr50.api; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; +import com.gmail.nossr50.mcMMO; import java.util.ArrayList; import java.util.Arrays; @@ -30,7 +31,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(mcMMO.p.getSkillTools().NON_CHILD_SKILLS); } /** @@ -42,7 +43,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 +55,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 +67,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,7 +79,7 @@ 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) { 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 af3b3366c..ca54d293a 100644 --- a/src/main/java/com/gmail/nossr50/commands/experience/AddlevelsCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/experience/AddlevelsCommand.java @@ -5,6 +5,7 @@ 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; @@ -55,6 +56,6 @@ public class AddlevelsCommand extends ExperienceCommand { if(isSilent) return; - player.sendMessage(LocaleLoader.getString("Commands.addlevels.AwardSkill.1", value, skill.getName())); + 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 03ad449bb..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; @@ -49,6 +50,6 @@ public class AddxpCommand extends ExperienceCommand { if(isSilent) return; - player.sendMessage(LocaleLoader.getString("Commands.addxp.AwardSkill", value, skill.getName())); + player.sendMessage(LocaleLoader.getString("Commands.addxp.AwardSkill", value, mcMMO.p.getSkillTools().getLocalizedSkillName(skill))); } } 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 11684ebf8..f43c3e35f 100644 --- a/src/main/java/com/gmail/nossr50/commands/experience/ExperienceCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/experience/ExperienceCommand.java @@ -44,13 +44,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 && mcMMO.p.getSkillTools().isChildSkill(skill)) { sender.sendMessage(LocaleLoader.getString("Commands.Skill.ChildSkill")); return true; @@ -77,13 +77,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 && mcMMO.p.getSkillTools().isChildSkill(skill)) { sender.sendMessage(LocaleLoader.getString("Commands.Skill.ChildSkill")); return true; @@ -144,7 +144,7 @@ public abstract class ExperienceCommand implements TabExecutor { List playerNames = CommandUtils.getOnlinePlayerNames(sender); 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(); } @@ -165,13 +165,13 @@ 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, boolean isSilent) { if (skill == null) { - for (PrimarySkillType primarySkillType : PrimarySkillType.NON_CHILD_SKILLS) { + for (PrimarySkillType primarySkillType : mcMMO.p.getSkillTools().NON_CHILD_SKILLS) { handleCommand(player, profile, primarySkillType, value); } 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 ac8405525..93089ac69 100644 --- a/src/main/java/com/gmail/nossr50/commands/experience/MmoeditCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/experience/MmoeditCommand.java @@ -5,6 +5,7 @@ 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; @@ -61,6 +62,6 @@ public class MmoeditCommand extends ExperienceCommand { if(isSilent) return; - player.sendMessage(LocaleLoader.getString("Commands.mmoedit.Modified.1", skill.getName(), value)); + 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 9b97fa77a..72c1718cd 100644 --- a/src/main/java/com/gmail/nossr50/commands/experience/SkillresetCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/experience/SkillresetCommand.java @@ -50,7 +50,7 @@ public class SkillresetCommand implements TabExecutor { skill = null; } else { - skill = PrimarySkillType.getSkill(args[0]); + skill = mcMMO.p.getSkillTools().matchSkill(args[0]); } editValues((Player) sender, UserManager.getPlayer(sender.getName()).getProfile(), skill); @@ -70,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]); @@ -116,7 +116,7 @@ public class SkillresetCommand implements TabExecutor { List playerNames = CommandUtils.getOnlinePlayerNames(sender); 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(); } @@ -149,7 +149,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) { @@ -161,13 +161,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 : mcMMO.p.getSkillTools().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 e3697be36..d6b8de57b 100644 --- a/src/main/java/com/gmail/nossr50/commands/hardcore/HardcoreCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/hardcore/HardcoreCommand.java @@ -51,7 +51,7 @@ // // private void toggle(boolean enable, PrimarySkillType skill) { // if (skill == null) { -// for (PrimarySkillType primarySkillType : PrimarySkillType.NON_CHILD_SKILLS) { +// for (PrimarySkillType primarySkillType : mcMMO.p.getSkillTools().NON_CHILD_SKILLS) { // primarySkillType.setHardcoreStatLossEnabled(enable); // } // } @@ -59,6 +59,6 @@ // 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()))); +// 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 62206566a..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,129 +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.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); -} +//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 8bdfa83f9..fbeaee56b 100644 --- a/src/main/java/com/gmail/nossr50/commands/hardcore/VampirismCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/hardcore/VampirismCommand.java @@ -51,7 +51,7 @@ // // private void toggle(boolean enable, PrimarySkillType skill) { // if (skill == null) { -// for (PrimarySkillType primarySkillType : PrimarySkillType.NON_CHILD_SKILLS) { +// for (PrimarySkillType primarySkillType : mcMMO.p.getSkillTools().NON_CHILD_SKILLS) { // primarySkillType.setHardcoreVampirismEnabled(enable); // } // } 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 267ebca4f..5779147ea 100644 --- a/src/main/java/com/gmail/nossr50/commands/player/InspectCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/player/InspectCommand.java @@ -48,17 +48,17 @@ public class InspectCommand implements TabExecutor { sender.sendMessage(LocaleLoader.getString("Inspect.OfflineStats", playerName)); sender.sendMessage(LocaleLoader.getString("Stats.Header.Gathering")); - for (PrimarySkillType skill : PrimarySkillType.GATHERING_SKILLS) { + for (PrimarySkillType skill : mcMMO.p.getSkillTools().GATHERING_SKILLS) { sender.sendMessage(CommandUtils.displaySkill(profile, skill)); } sender.sendMessage(LocaleLoader.getString("Stats.Header.Combat")); - for (PrimarySkillType skill : PrimarySkillType.COMBAT_SKILLS) { + for (PrimarySkillType skill : mcMMO.p.getSkillTools().COMBAT_SKILLS) { sender.sendMessage(CommandUtils.displaySkill(profile, skill)); } sender.sendMessage(LocaleLoader.getString("Stats.Header.Misc")); - for (PrimarySkillType skill : PrimarySkillType.MISC_SKILLS) { + for (PrimarySkillType skill : mcMMO.p.getSkillTools().MISC_SKILLS) { sender.sendMessage(CommandUtils.displaySkill(profile, skill)); } 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 0ef35cd0f..04f0f82e1 100644 --- a/src/main/java/com/gmail/nossr50/commands/player/MctopCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/player/MctopCommand.java @@ -68,7 +68,7 @@ public class MctopCommand implements TabExecutor { @Override public List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, String[] args) { if (args.length == 1) { - return StringUtil.copyPartialMatches(args[0], PrimarySkillType.SKILL_NAMES, new ArrayList<>(PrimarySkillType.SKILL_NAMES.size())); + return StringUtil.copyPartialMatches(args[0], mcMMO.p.getSkillTools().LOCALIZED_SKILL_NAMES, new ArrayList<>(mcMMO.p.getSkillTools().LOCALIZED_SKILL_NAMES.size())); } return ImmutableList.of(); } @@ -122,7 +122,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 index ad24c60da..e780fa19d 100644 --- a/src/main/java/com/gmail/nossr50/commands/player/XPBarCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/player/XPBarCommand.java @@ -2,6 +2,7 @@ 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; @@ -51,7 +52,7 @@ public class XPBarCommand implements TabExecutor { if(SkillUtils.isSkill(skillName)) { - PrimarySkillType targetSkill = PrimarySkillType.getSkill(skillName); + PrimarySkillType targetSkill = mcMMO.p.getSkillTools().matchSkill(skillName); //Target setting String option = args[0].toLowerCase(); @@ -103,7 +104,7 @@ public class XPBarCommand implements TabExecutor { 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], 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(); } 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 3d4693b77..871d0066f 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/HerbalismCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/HerbalismCommand.java @@ -3,6 +3,7 @@ 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.skills.RankUtils; import com.gmail.nossr50.util.skills.SkillActivationType; @@ -93,7 +94,7 @@ public class HerbalismCommand extends SkillCommand { canGreenThumbPlants = RankUtils.hasUnlockedSubskill(player, SubSkillType.HERBALISM_GREEN_THUMB) && (Permissions.greenThumbPlant(player, Material.WHEAT) || Permissions.greenThumbPlant(player, Material.CARROT) || Permissions.greenThumbPlant(player, Material.POTATO) || Permissions.greenThumbPlant(player, Material.BEETROOT) || Permissions.greenThumbPlant(player, Material.NETHER_WART) || Permissions.greenThumbPlant(player, Material.COCOA)); canGreenThumbBlocks = RankUtils.hasUnlockedSubskill(player, SubSkillType.HERBALISM_GREEN_THUMB) && (Permissions.greenThumbBlock(player, Material.DIRT) || Permissions.greenThumbBlock(player, Material.COBBLESTONE) || Permissions.greenThumbBlock(player, Material.COBBLESTONE_WALL) || Permissions.greenThumbBlock(player, Material.STONE_BRICKS)); canFarmersDiet = canUseSubskill(player, SubSkillType.HERBALISM_FARMERS_DIET); - canDoubleDrop = canUseSubskill(player, SubSkillType.HERBALISM_DOUBLE_DROPS) && !skill.getDoubleDropsDisabled(); + canDoubleDrop = canUseSubskill(player, SubSkillType.HERBALISM_DOUBLE_DROPS) && !mcMMO.p.getGeneralConfig().getDoubleDropsDisabled(skill); canShroomThumb = canUseSubskill(player, SubSkillType.HERBALISM_SHROOM_THUMB); } 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 e724ee8cd..0c6436bf1 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/MmoInfoCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/MmoInfoCommand.java @@ -4,6 +4,7 @@ import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.datatypes.skills.SubSkillType; 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.text.TextComponentFactory; import com.google.common.collect.ImmutableList; @@ -45,7 +46,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; @@ -63,7 +64,7 @@ public class MmoInfoCommand implements TabExecutor { @Override public List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, String[] args) { if (args.length == 1) { - return StringUtil.copyPartialMatches(args[0], PrimarySkillType.SUBSKILL_NAMES, new ArrayList<>(PrimarySkillType.SUBSKILL_NAMES.size())); + return StringUtil.copyPartialMatches(args[0], mcMMO.p.getSkillTools().EXACT_SUBSKILL_NAMES, new ArrayList<>(mcMMO.p.getSkillTools().EXACT_SUBSKILL_NAMES.size())); } return ImmutableList.of(); } 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 3f35a7e7e..ab5c027ba 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/SkillCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/SkillCommand.java @@ -44,7 +44,7 @@ public abstract class SkillCommand implements TabExecutor { public SkillCommand(PrimarySkillType skill) { this.skill = skill; - skillName = skill.getName(); + skillName = mcMMO.p.getSkillTools().getLocalizedSkillName(skill); skillGuideCommand = new SkillGuideCommand(skill); } @@ -142,7 +142,7 @@ public abstract class SkillCommand implements TabExecutor { player.sendMessage(LocaleLoader.getString("Skills.Overhaul.Header", skillName)); - if(!skill.isChildSkill()) + if(!mcMMO.p.getSkillTools().isChildSkill(skill)) { /* * NON-CHILD SKILLS @@ -172,10 +172,10 @@ public abstract class SkillCommand implements TabExecutor { { if(i+1 < parentList.size()) { - parentMessage.append(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)))); parentMessage.append(ChatColor.GRAY).append(", "); } else { - parentMessage.append(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)))); } } @@ -188,7 +188,7 @@ public abstract class SkillCommand implements TabExecutor { } /* - if (!skill.isChildSkill()) { + if (!mcMMO.p.getSkillTools().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))); @@ -224,7 +224,7 @@ public abstract class SkillCommand implements TabExecutor { } protected String[] calculateLengthDisplayValues(Player player, float skillValue) { - int maxLength = skill.getAbility().getMaxLength(); + int maxLength = mcMMO.p.getSkillTools().getSuperAbilityMaxLength(mcMMO.p.getSkillTools().getSuperAbility(skill)); int abilityLengthVar = mcMMO.p.getAdvancedConfig().getAbilityLength(); int abilityLengthCap = mcMMO.p.getAdvancedConfig().getAbilityLengthCap(); 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 a7879bb8d..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,6 +2,7 @@ package com.gmail.nossr50.commands.skills; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.locale.LocaleLoader; +import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.text.StringUtils; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; @@ -18,7 +19,7 @@ public class SkillGuideCommand implements CommandExecutor { 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); } 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 a817a312d..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,6 +3,7 @@ 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.skills.RankUtils; import com.gmail.nossr50.util.skills.SkillActivationType; @@ -55,7 +56,9 @@ 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); diff --git a/src/main/java/com/gmail/nossr50/config/GeneralConfig.java b/src/main/java/com/gmail/nossr50/config/GeneralConfig.java index e905a3ce1..f40956695 100644 --- a/src/main/java/com/gmail/nossr50/config/GeneralConfig.java +++ b/src/main/java/com/gmail/nossr50/config/GeneralConfig.java @@ -164,7 +164,7 @@ public class GeneralConfig extends AutoUpdateConfigLoader { //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 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); } diff --git a/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java index 863d4f8f5..80d3f8ca7 100644 --- a/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java @@ -7,7 +7,6 @@ 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.datatypes.skills.interfaces.Skill; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.Misc; import org.bukkit.OfflinePlayer; @@ -21,7 +20,7 @@ import java.util.logging.Logger; public final class FlatFileDatabaseManager implements DatabaseManager { public static final String IGNORED = "IGNORED"; - private final @NotNull HashMap> playerStatHash = new HashMap<>(); + 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; @@ -106,7 +105,7 @@ public final class FlatFileDatabaseManager implements DatabaseManager { while ((line = in.readLine()) != null) { String[] character = line.split(":"); - Map skills = getSkillMapFromLine(character); + Map skills = getSkillMapFromLine(character); boolean powerless = true; for (int skill : skills.values()) { @@ -433,15 +432,15 @@ public final class FlatFileDatabaseManager implements DatabaseManager { writer.append("\r\n"); } - public @NotNull List readLeaderboard(@Nullable PrimarySkillType skill, int pageNumber, int statsPerPage) throws InvalidSkillException { + 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(skill != null && skill.isChildSkill()) { + if(primarySkillType != null && mcMMO.p.getSkillTools().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 = skill == null ? powerLevels : playerStatHash.get(skill); + 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())); @@ -450,9 +449,9 @@ public final class FlatFileDatabaseManager implements DatabaseManager { public Map readRank(String playerName) { updateLeaderboards(); - Map skills = new HashMap<>(); + Map skills = new EnumMap(PrimarySkillType.class); - for (PrimarySkillType skill : PrimarySkillType.NON_CHILD_SKILLS) { + for (PrimarySkillType skill : mcMMO.p.getSkillTools().NON_CHILD_SKILLS) { skills.put(skill, getPlayerRank(playerName, playerStatHash.get(skill))); } @@ -893,7 +892,7 @@ public final class FlatFileDatabaseManager implements DatabaseManager { playerName = data[USERNAME_INDEX]; int powerLevel = 0; - Map skills = getSkillMapFromLine(data); + Map skills = getSkillMapFromLine(data); powerLevel += putStat(acrobatics, playerName, skills.get(PrimarySkillType.ACROBATICS)); powerLevel += putStat(alchemy, playerName, skills.get(PrimarySkillType.ALCHEMY)); @@ -1117,8 +1116,8 @@ public final class FlatFileDatabaseManager implements DatabaseManager { } private PlayerProfile loadFromLine(@NotNull String[] character) { - Map skills = getSkillMapFromLine(character); // Skill levels - Map skillsXp = new HashMap<>(); // Skill & XP + 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; @@ -1193,7 +1192,7 @@ public final class FlatFileDatabaseManager implements DatabaseManager { } } - private void tryLoadSkillFloatValuesFromRawData(@NotNull Map skillMap, @NotNull String[] character, @NotNull Skill primarySkillType, int index, @NotNull String userName) { + 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); @@ -1204,19 +1203,19 @@ public final class FlatFileDatabaseManager implements DatabaseManager { } } - private void tryLoadSkillIntValuesFromRawData(@NotNull Map skillMap, @NotNull String[] character, @NotNull Skill skill, int index, @NotNull String userName) { + 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(skill, valueFromString); + skillMap.put(primarySkillType, valueFromString); } catch (NumberFormatException e) { - skillMap.put(skill, 0); - logger.severe("Data corruption when trying to load the value for skill "+skill+" for player named " + userName+ " setting value to zero"); + 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) { - HashMap skills = new HashMap<>(); // Skill & Level + 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); diff --git a/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java index debd4d2ba..c218401a2 100644 --- a/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java @@ -9,7 +9,6 @@ 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.datatypes.skills.interfaces.Skill; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.runnables.database.UUIDUpdateAsyncTask; import com.gmail.nossr50.util.Misc; @@ -29,6 +28,7 @@ public final class SQLDatabaseManager implements DatabaseManager { 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; private final String tablePrefix = mcMMO.p.getGeneralConfig().getMySQLTablePrefix(); private final Map cachedUserIDs = new HashMap<>(); @@ -274,7 +274,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 : mcMMO.p.getSkillTools().NON_CHILD_SKILLS) total += profile.getSkillLevel(primarySkillType); statement.setInt(14, total); statement.setInt(15, id); @@ -358,7 +358,7 @@ public final class SQLDatabaseManager implements DatabaseManager { List stats = new ArrayList<>(); //Fix for a plugin that people are using that is throwing SQL errors - if(skill != null && skill.isChildSkill()) { + if(skill != null && mcMMO.p.getSkillTools().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!"); } @@ -407,7 +407,7 @@ public final class SQLDatabaseManager implements DatabaseManager { try { connection = getConnection(PoolIdentifier.MISC); - for (PrimarySkillType primarySkillType : PrimarySkillType.NON_CHILD_SKILLS) { + for (PrimarySkillType primarySkillType : mcMMO.p.getSkillTools().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 " + @@ -880,7 +880,7 @@ public final class SQLDatabaseManager implements DatabaseManager { resultSet = statement.executeQuery(); if (!resultSet.next()) { String startingLevel = "'" + mcMMO.p.getAdvancedConfig().getStartingLevel() + "'"; - String totalLevel = "'" + (mcMMO.p.getAdvancedConfig().getStartingLevel() * (PrimarySkillType.values().length - PrimarySkillType.CHILD_SKILLS.size())) + "'"; + 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," @@ -935,7 +935,7 @@ public final class SQLDatabaseManager implements DatabaseManager { } if (mcMMO.p.getGeneralConfig().getTruncateSkills()) { - for (PrimarySkillType skill : PrimarySkillType.NON_CHILD_SKILLS) { + for (PrimarySkillType skill : mcMMO.p.getSkillTools().NON_CHILD_SKILLS) { int cap = mcMMO.p.getGeneralConfig().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); @@ -1099,8 +1099,8 @@ public final class SQLDatabaseManager implements DatabaseManager { } private PlayerProfile loadFromResult(String playerName, ResultSet result) throws SQLException { - Map skills = new HashMap<>(); // Skill & Level - Map skillsXp = new HashMap<>(); // Skill & XP + 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 MobHealthbarType mobHealthbarType; @@ -1294,10 +1294,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() != mcMMO.p.getSkillTools().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 : mcMMO.p.getSkillTools().NON_CHILD_SKILLS) { String skill_name = skill.name().toLowerCase(Locale.ENGLISH); try { 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 834d1c491..64f482fea 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java +++ b/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java @@ -1,5 +1,6 @@ package com.gmail.nossr50.datatypes.player; +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; @@ -66,7 +67,7 @@ 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; @@ -80,7 +81,7 @@ public class McMMOPlayer implements Identified { private final Player player; private final PlayerProfile profile; - private final Map skillManagers = new HashMap<>(); + private final Map skillManagers = new EnumMap(PrimarySkillType.class); private final ExperienceBarManager experienceBarManager; private Party party; @@ -99,10 +100,10 @@ public class McMMOPlayer implements Identified { private ChatChannel chatChannel; - private final Map abilityMode = new HashMap<>(); - private final Map abilityInformed = new HashMap<>(); + private final Map abilityMode = new EnumMap(SuperAbilityType.class); + private final Map abilityInformed = new EnumMap(SuperAbilityType.class); - private final Map toolMode = new HashMap<>(); + private final Map toolMode = new EnumMap(ToolType.class); private int recentlyHurt; private int respawnATS; @@ -131,20 +132,7 @@ public class McMMOPlayer implements Identified { 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); @@ -169,6 +157,69 @@ public class McMMOPlayer implements Identified { } } + 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() { return playerName; } @@ -200,7 +251,9 @@ public class McMMOPlayer implements Identified { if(hasReachedPowerLevelCap()) { NotificationManager.sendPlayerInformationChatOnly(player, "LevelCap.PowerLevel", String.valueOf(mcMMO.p.getGeneralConfig().getPowerLevelCap())); } else if(hasReachedLevelCap(primarySkillType)) { - NotificationManager.sendPlayerInformationChatOnly(player, "LevelCap.Skill", String.valueOf(mcMMO.p.getGeneralConfig().getLevelCap(primarySkillType)), primarySkillType.getName()); + NotificationManager.sendPlayerInformationChatOnly(player, "LevelCap.Skill", + String.valueOf(mcMMO.p.getGeneralConfig().getLevelCap(primarySkillType)), + mcMMO.p.getSkillTools().getLocalizedSkillName(primarySkillType)); } //Updates from Party sources @@ -227,7 +280,7 @@ public class McMMOPlayer implements Identified { public double getProgressInCurrentSkillLevel(PrimarySkillType primarySkillType) { - if(primarySkillType.isChildSkill()) { + if(mcMMO.p.getSkillTools().isChildSkill(primarySkillType)) { return 1.0D; } @@ -516,9 +569,9 @@ public class McMMOPlayer implements Identified { public int getPowerLevel() { int powerLevel = 0; - for (PrimarySkillType type : PrimarySkillType.NON_CHILD_SKILLS) { - if (type.getPermissions(player)) { - powerLevel += getSkillLevel(type); + for (PrimarySkillType primarySkillType : mcMMO.p.getSkillTools().NON_CHILD_SKILLS) { + if (Permissions.skillEnabled(player, primarySkillType)) { + powerLevel += getSkillLevel(primarySkillType); } } @@ -558,12 +611,12 @@ public class McMMOPlayer implements Identified { return; } - if (skill.isChildSkill()) { + if (mcMMO.p.getSkillTools().isChildSkill(skill)) { Set parentSkills = FamilyTree.getParents(skill); float splitXp = xp / parentSkills.size(); for (PrimarySkillType parentSkill : parentSkills) { - if (parentSkill.getPermissions(player)) { + if (Permissions.skillEnabled(player, parentSkill)) { beginXpGain(parentSkill, splitXp, xpGainReason, xpGainSource); } } @@ -607,7 +660,7 @@ public class McMMOPlayer implements Identified { * @param xp Experience amount to add */ public void applyXpGain(PrimarySkillType primarySkillType, float xp, XPGainReason xpGainReason, XPGainSource xpGainSource) { - if (!primarySkillType.getPermissions(player)) { + if (!Permissions.skillEnabled(player, primarySkillType)) { return; } @@ -615,7 +668,7 @@ public class McMMOPlayer implements Identified { Bukkit.getPluginManager().callEvent(mcMMOPlayerPreXpGainEvent); xp = mcMMOPlayerPreXpGainEvent.getXpGained(); - if (primarySkillType.isChildSkill()) { + if (mcMMO.p.getSkillTools().isChildSkill(primarySkillType)) { Set parentSkills = FamilyTree.getParents(primarySkillType); for (PrimarySkillType parentSkill : parentSkills) { @@ -784,12 +837,12 @@ public class McMMOPlayer implements Identified { */ private float modifyXpGain(PrimarySkillType primarySkillType, float xp) { //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 ((primarySkillType.getMaxLevel() <= getSkillLevel(primarySkillType)) + if ((mcMMO.p.getGeneralConfig().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 (mcMMO.p.getGeneralConfig().getToolModsEnabled()) { CustomTool tool = mcMMO.getModManager().getTool(player.getInventory().getItemInMainHand()); @@ -820,35 +873,36 @@ public class McMMOPlayer implements Identified { /** * 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); } @@ -856,7 +910,7 @@ public class McMMOPlayer implements Identified { return; } - if (EventUtils.callPlayerAbilityActivateEvent(player, skill).isCancelled()) { + if (EventUtils.callPlayerAbilityActivateEvent(player, primarySkillType).isCancelled()) { return; } @@ -869,37 +923,37 @@ public class McMMOPlayer implements Identified { //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()); } if (useChatNotifications()) { - NotificationManager.sendPlayerInformation(player, NotificationType.SUPER_ABILITY, ability.getAbilityOn()); + NotificationManager.sendPlayerInformation(player, NotificationType.SUPER_ABILITY, superAbilityType.getAbilityOn()); //player.sendMessage(ability.getAbilityOn()); } if (mcMMO.p.getAdvancedConfig().sendAbilityNotificationToOtherPlayers()) { - SkillUtils.sendSkillMessage(player, NotificationType.SUPER_ABILITY_ALERT_OTHERS, ability.getAbilityPlayer()); + SkillUtils.sendSkillMessage(player, NotificationType.SUPER_ABILITY_ALERT_OTHERS, superAbilityType.getAbilityPlayer()); } //Sounds SoundManager.worldSendSound(player.getWorld(), player.getLocation(), SoundType.ABILITY_ACTIVATED_GENERIC); // Enable the ability - profile.setAbilityDATS(ability, System.currentTimeMillis() + (ticks * Misc.TIME_CONVERSION_FACTOR)); - setAbilityMode(ability, true); + 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 (!skill.getPermissions(getPlayer())) { + public void processAbilityActivation(@NotNull PrimarySkillType primarySkillType) { + if (!Permissions.skillEnabled(getPlayer(), primarySkillType)) { return; } @@ -923,15 +977,15 @@ public class McMMOPlayer implements Identified { } } - 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 (isAbilityOnCooldown(ability)) { @@ -993,7 +1047,7 @@ public class McMMOPlayer implements Identified { String allCDStr = aSuperAbilityCD + ", " + bSuperAbilityCD; NotificationManager.sendPlayerInformation(player, NotificationType.TOOL, "Skills.TooTired.Extra", - primarySkillType.getName(), + mcMMO.p.getSkillTools().getLocalizedSkillName(primarySkillType), allCDStr); } 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 eaad9f299..0b2b3cbb9 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/player/PlayerProfile.java +++ b/src/main/java/com/gmail/nossr50/datatypes/player/PlayerProfile.java @@ -6,7 +6,6 @@ import com.gmail.nossr50.datatypes.experience.FormulaType; import com.gmail.nossr50.datatypes.experience.SkillXpGain; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.datatypes.skills.SuperAbilityType; -import com.gmail.nossr50.datatypes.skills.interfaces.Skill; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.runnables.player.PlayerProfileSaveTask; import com.gmail.nossr50.skills.child.FamilyTree; @@ -15,7 +14,7 @@ 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; @@ -33,14 +32,14 @@ public class PlayerProfile { private int saveAttempts = 0; /* 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 final DelayQueue gainedSkillsXp = new DelayQueue<>(); - private final HashMap rollingSkillsXp = new HashMap<>(); + private final Map rollingSkillsXp = new EnumMap(PrimarySkillType.class); @Deprecated public PlayerProfile(String playerName) { @@ -58,7 +57,7 @@ public class PlayerProfile { abilityDATS.put(superAbilityType, 0); } - for (PrimarySkillType primarySkillType : PrimarySkillType.NON_CHILD_SKILLS) { + for (PrimarySkillType primarySkillType : mcMMO.p.getSkillTools().NON_CHILD_SKILLS) { skills.put(primarySkillType, mcMMO.p.getAdvancedConfig().getStartingLevel()); skillsXp.put(primarySkillType, 0F); } @@ -78,7 +77,7 @@ public class PlayerProfile { this.loaded = isLoaded; } - public PlayerProfile(@NotNull String playerName, UUID uuid, Map levelData, Map xpData, Map cooldownData, @Nullable MobHealthbarType mobHealthbarType, int scoreboardTipsShown, Map uniqueProfileData) { + public PlayerProfile(@NotNull String playerName, UUID uuid, Map levelData, Map xpData, Map cooldownData, @Nullable MobHealthbarType mobHealthbarType, int scoreboardTipsShown, Map uniqueProfileData) { this.playerName = playerName; this.uuid = uuid; mobHealthbarType = mcMMO.p.getGeneralConfig().getMobHealthbarDefault(); @@ -257,7 +256,7 @@ public class PlayerProfile { */ public int getSkillLevel(PrimarySkillType skill) { - return skill.isChildSkill() ? getChildSkillLevel(skill) : skills.get(skill); + return mcMMO.p.getSkillTools().isChildSkill(skill) ? getChildSkillLevel(skill) : skills.get(skill); } public float getSkillXpLevelRaw(PrimarySkillType skill) { @@ -265,7 +264,7 @@ public class PlayerProfile { } public int getSkillXpLevel(PrimarySkillType skill) { - if(skill.isChildSkill()) { + if(mcMMO.p.getSkillTools().isChildSkill(skill)) { return 0; } @@ -273,7 +272,7 @@ public class PlayerProfile { } public void setSkillXpLevel(PrimarySkillType skill, float xpLevel) { - if (skill.isChildSkill()) { + if (mcMMO.p.getSkillTools().isChildSkill(skill)) { return; } @@ -300,7 +299,7 @@ public class PlayerProfile { * @param xp Amount of xp to remove */ public void removeXp(PrimarySkillType skill, int xp) { - if (skill.isChildSkill()) { + if (mcMMO.p.getSkillTools().isChildSkill(skill)) { return; } @@ -310,7 +309,7 @@ public class PlayerProfile { } public void removeXp(PrimarySkillType skill, float xp) { - if (skill.isChildSkill()) { + if (mcMMO.p.getSkillTools().isChildSkill(skill)) { return; } @@ -326,7 +325,7 @@ public class PlayerProfile { * @param level New level value for the skill */ public void modifySkill(PrimarySkillType skill, int level) { - if (skill.isChildSkill()) { + if (mcMMO.p.getSkillTools().isChildSkill(skill)) { return; } @@ -359,7 +358,7 @@ public class PlayerProfile { public void addXp(PrimarySkillType skill, float xp) { markProfileDirty(); - if (skill.isChildSkill()) { + if (mcMMO.p.getSkillTools().isChildSkill(skill)) { Set parentSkills = FamilyTree.getParents(skill); float dividedXP = (xp / parentSkills.size()); @@ -418,7 +417,7 @@ public class PlayerProfile { * @return the total amount of Xp until next level */ public int getXpToLevel(PrimarySkillType primarySkillType) { - if(primarySkillType.isChildSkill()) { + if(mcMMO.p.getSkillTools().isChildSkill(primarySkillType)) { return 0; } @@ -433,7 +432,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.getGeneralConfig().getLevelCap(parent)); } return sum / parents.size(); 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 fa8fd41c6..1e46c2ad2 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/skills/PrimarySkillType.java +++ b/src/main/java/com/gmail/nossr50/datatypes/skills/PrimarySkillType.java @@ -1,239 +1,259 @@ package com.gmail.nossr50.datatypes.skills; -import com.gmail.nossr50.config.experience.ExperienceConfig; -import com.gmail.nossr50.datatypes.skills.interfaces.Skill; -import com.gmail.nossr50.locale.LocaleLoader; -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.skills.RankUtils; -import com.gmail.nossr50.util.text.StringUtils; -import com.google.common.collect.ImmutableList; -import org.bukkit.Color; -import org.bukkit.entity.Entity; -import org.bukkit.entity.Player; -import org.bukkit.entity.Tameable; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -public enum PrimarySkillType implements Skill { - 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_STEEL_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, SubSkillType.WOODCUTTING_KNOCK_ON_WOOD)); - - private final Class managerClass; - private final Color skillColor; - private final SuperAbilityType ability; - private final ToolType tool; - private final List subSkillTypes; - - 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; - - 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); - } - - PrimarySkillType(Class managerClass, Color skillColor, List subSkillTypes) { - this(managerClass, skillColor, null, null, subSkillTypes); - } - - 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 PrimarySkillType getPrimarySkill() { - return this; - } - - public String getPrimaryKeyName() { - return StringUtils.getCapitalized(this.toString()); - } - - public Class getManagerClass() { - return managerClass; - } - - public SuperAbilityType getAbility() { - return ability; - } - - /** - * Get the max level of this skill. - * - * @return the max level of this skill - */ - public int getMaxLevel() { - return mcMMO.p.getGeneralConfig().getLevelCap(this); - } - - public boolean isSuperAbilityUnlocked(Player player) { return RankUtils.getRank(player, getAbility().getSubSkillTypeDefinition()) >= 1; } - - public boolean getPVPEnabled() { - return mcMMO.p.getGeneralConfig().getPVPEnabled(this); - } - - public boolean getPVEEnabled() { - return mcMMO.p.getGeneralConfig().getPVEEnabled(this); - } - - public boolean getDoubleDropsDisabled() { - return mcMMO.p.getGeneralConfig().getDoubleDropsDisabled(this); - } - - public boolean getHardcoreStatLossEnabled() { - return mcMMO.p.getGeneralConfig().getHardcoreStatLossEnabled(this); - } - - public void setHardcoreStatLossEnabled(boolean enable) { - mcMMO.p.getGeneralConfig().setHardcoreStatLossEnabled(this, enable); - } - - public boolean getHardcoreVampirismEnabled() { - return mcMMO.p.getGeneralConfig().getHardcoreVampirismEnabled(this); - } - - public void setHardcoreVampirismEnabled(boolean enable) { - mcMMO.p.getGeneralConfig().setHardcoreVampirismEnabled(this, enable); - } - - public ToolType getTool() { - return tool; - } - - public List getSkillAbilities() { - return subSkillTypes; - } - - public double getXpModifier() { - return ExperienceConfig.getInstance().getFormulaSkillModifier(this); - } - - public static PrimarySkillType getSkill(String skillName) { - if (!mcMMO.p.getGeneralConfig().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; - } - - // TODO: This is a little "hacky", we probably need to add something to distinguish child skills in the enum, or to use another enum for them - public boolean isChildSkill() { - switch (this) { - case SALVAGE: - case SMELTING: - return true; - - default: - return false; - } - } - - public String getName() { - return StringUtils.getCapitalized(LocaleLoader.getString(StringUtils.getCapitalized(this.toString()) + ".SkillName")); - } - - public boolean getPermissions(Player player) { - return Permissions.skillEnabled(player, this); - } - - public boolean shouldProcess(Entity target) { - return (target instanceof Player || (target instanceof Tameable && ((Tameable) target).isTamed())) ? getPVPEnabled() : getPVEEnabled(); - } - - +public enum PrimarySkillType { + ACROBATICS, + ALCHEMY, + ARCHERY, + AXES, + EXCAVATION, + FISHING, + HERBALISM, + MINING, + REPAIR, + SALVAGE, + SMELTING, + SWORDS, + TAMING, + UNARMED, + WOODCUTTING } + +//package com.gmail.nossr50.datatypes.skills; +// +//import com.gmail.nossr50.config.experience.ExperienceConfig; +//import com.gmail.nossr50.datatypes.skills.interfaces.Skill; +//import com.gmail.nossr50.locale.LocaleLoader; +//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.skills.RankUtils; +//import com.gmail.nossr50.util.text.StringUtils; +//import com.google.common.collect.ImmutableList; +//import org.bukkit.Color; +//import org.bukkit.entity.Entity; +//import org.bukkit.entity.Player; +//import org.bukkit.entity.Tameable; +// +//import java.util.ArrayList; +//import java.util.Collections; +//import java.util.List; +// +//public enum PrimarySkillType implements Skill { +// 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_STEEL_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, SubSkillType.WOODCUTTING_KNOCK_ON_WOOD)); +// +// private final Class managerClass; +// private final Color skillColor; +// private final SuperAbilityType ability; +// private final ToolType tool; +// private final List subSkillTypes; +// +// 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; +// +// 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 (mcMMO.p.getSkillTools().isChildSkill(skill)) { +// childSkills.add(skill); +// } +// else { +// nonChildSkills.add(skill); +// } +// +// for(SubSkillType subSkillType : skill.subSkillTypes) { +// subSkillNames.add(subSkillType.getNiceNameNoSpaces(subSkillType)); +// } +// +// names.add(mcMMO.p.getSkillTools().getLocalizedSkillName(skill)); +// } +// +// Collections.sort(names); +// SKILL_NAMES = ImmutableList.copyOf(names); +// SUBSKILL_NAMES = ImmutableList.copyOf(subSkillNames); +// +// CHILD_SKILLS = ImmutableList.copyOf(childSkills); +// NON_CHILD_SKILLS = ImmutableList.copyOf(nonChildSkills); +// } +// +// PrimarySkillType(Class managerClass, Color skillColor, List subSkillTypes) { +// this(managerClass, skillColor, null, null, subSkillTypes); +// } +// +// 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 PrimarySkillType getPrimarySkill() { +// return this; +// } +// +// public String getPrimaryKeyName() { +// return StringUtils.getCapitalized(this.toString()); +// } +// +// public Class getManagerClass() { +// return managerClass; +// } +// +// public SuperAbilityType getAbility() { +// return ability; +// } +// +// /** +// * Get the max level of this skill. +// * +// * @return the max level of this skill +// */ +// public int getMaxLevel() { +// return mcMMO.p.getGeneralConfig().getLevelCap(this); +// } +// +// public boolean isSuperAbilityUnlocked(Player player) { return RankUtils.getRank(player, getAbility().getSubSkillTypeDefinition()) >= 1; } +// +// public boolean getPVPEnabled() { +// return mcMMO.p.getGeneralConfig().getPVPEnabled(this); +// } +// +// public boolean getPVEEnabled() { +// return mcMMO.p.getGeneralConfig().getPVEEnabled(this); +// } +// +// public boolean getDoubleDropsDisabled() { +// return mcMMO.p.getGeneralConfig().getDoubleDropsDisabled(this); +// } +// +// public boolean getHardcoreStatLossEnabled() { +// return mcMMO.p.getGeneralConfig().getHardcoreStatLossEnabled(this); +// } +// +// public void setHardcoreStatLossEnabled(boolean enable) { +// mcMMO.p.getGeneralConfig().setHardcoreStatLossEnabled(this, enable); +// } +// +// public boolean getHardcoreVampirismEnabled() { +// return mcMMO.p.getGeneralConfig().getHardcoreVampirismEnabled(this); +// } +// +// public void setHardcoreVampirismEnabled(boolean enable) { +// mcMMO.p.getGeneralConfig().setHardcoreVampirismEnabled(this, enable); +// } +// +// public ToolType getTool() { +// return tool; +// } +// +// public List getSkillAbilities() { +// return subSkillTypes; +// } +// +// public double getXpModifier() { +// return ExperienceConfig.getInstance().getFormulaSkillModifier(this); +// } +// +// public static PrimarySkillType getSkill(String skillName) { +// if (!mcMMO.p.getGeneralConfig().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; +// } +// +// // TODO: This is a little "hacky", we probably need to add something to distinguish child skills in the enum, or to use another enum for them +// public boolean isChildSkill() { +// switch (this) { +// case SALVAGE: +// case SMELTING: +// return true; +// +// default: +// return false; +// } +// } +// +// public String getName() { +// return StringUtils.getCapitalized(LocaleLoader.getString(StringUtils.getCapitalized(this.toString()) + ".SkillName")); +// } +// +// public boolean getPermissions(Player player) { +// return Permissions.skillEnabled(player, this); +// } +// +// public boolean shouldProcess(Entity target) { +// return (target instanceof Player || (target instanceof Tameable && ((Tameable) target).isTamed())) ? getPVPEnabled() : getPVEEnabled(); +// } +// +// +//} 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 67b256a47..44d98b789 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/skills/SubSkillType.java +++ b/src/main/java/com/gmail/nossr50/datatypes/skills/SubSkillType.java @@ -2,6 +2,7 @@ package com.gmail.nossr50.datatypes.skills; import com.gmail.nossr50.datatypes.skills.interfaces.Skill; import com.gmail.nossr50.locale.LocaleLoader; +import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.text.StringUtils; import java.util.Locale; @@ -136,7 +137,7 @@ public enum SubSkillType { * If we add skills, those immutable lists need to be updated * @return */ - public PrimarySkillType getParentSkill() { return Skill.bySecondaryAbility(this); } + public PrimarySkillType getParentSkill() { return mcMMO.p.getSkillTools().getPrimarySkillBySubSkill(this); } /** * Returns the root address for this skill in the advanced.yml file diff --git a/src/main/java/com/gmail/nossr50/datatypes/skills/interfaces/Skill.java b/src/main/java/com/gmail/nossr50/datatypes/skills/interfaces/Skill.java index a0487e0df..e2fdd0457 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/skills/interfaces/Skill.java +++ b/src/main/java/com/gmail/nossr50/datatypes/skills/interfaces/Skill.java @@ -26,88 +26,4 @@ public interface Skill { * @return config file key name */ String getPrimaryKeyName(); - - Class getManagerClass(); - - SuperAbilityType getAbility(); - - /** - * Get the max level of this skill. - * - * @return the max level of this skill - */ - int getMaxLevel(); - - boolean isSuperAbilityUnlocked(Player player); - - boolean getPVPEnabled(); - - boolean getPVEEnabled(); - - boolean getDoubleDropsDisabled(); - - boolean getHardcoreStatLossEnabled(); - - void setHardcoreStatLossEnabled(boolean enable); - - boolean getHardcoreVampirismEnabled(); - - void setHardcoreVampirismEnabled(boolean enable); - - ToolType getTool(); - - List getSkillAbilities(); - - double getXpModifier(); - - // 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 - boolean isChildSkill(); - - static PrimarySkillType bySecondaryAbility(SubSkillType subSkillType) { - for (PrimarySkillType type : PrimarySkillType.values()) { - if (type.getSkillAbilities().contains(subSkillType)) { - return type; - } - } - - return null; - } - - static PrimarySkillType byAbility(SuperAbilityType ability) { - for (PrimarySkillType type : PrimarySkillType.values()) { - if (type.getAbility() == ability) { - return type; - } - } - - return null; - } - - static PrimarySkillType getSkill(@NotNull String skillName) { - if (!mcMMO.p.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")) { - mcMMO.p.getLogger().warning("Invalid mcMMO skill (" + skillName + ")"); //TODO: Localize - } - - return null; - } - - String getName(); - - boolean getPermissions(Player player); - - boolean shouldProcess(Entity target); } 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 d81320761..4ce3a8671 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 @@ -441,97 +441,4 @@ public class Roll extends AcrobaticsSubSkill { return player.getLocation().getBlock().getLocation(); } - public String getPrimaryKeyName() { - return getPrimarySkill().getPrimaryKeyName(); - } - - @Override - public Class getManagerClass() { - return getPrimarySkill().getManagerClass(); - } - - @Override - public SuperAbilityType getAbility() { - return getPrimarySkill().getAbility(); - } - - @Override - public int getMaxLevel() { - return getPrimarySkill().getMaxLevel(); - } - - @Override - public boolean isSuperAbilityUnlocked(Player player) { - return getPrimarySkill().isSuperAbilityUnlocked(player); - } - - @Override - public boolean getPVPEnabled() { - return getPrimarySkill().getPVPEnabled(); - } - - @Override - public boolean getPVEEnabled() { - return getPrimarySkill().getPVEEnabled(); - } - - @Override - public boolean getDoubleDropsDisabled() { - return getPrimarySkill().getDoubleDropsDisabled(); - } - - @Override - public boolean getHardcoreStatLossEnabled() { - return getPrimarySkill().getHardcoreStatLossEnabled(); - } - - @Override - public void setHardcoreStatLossEnabled(boolean enable) { - getPrimarySkill().setHardcoreStatLossEnabled(enable); - } - - @Override - public boolean getHardcoreVampirismEnabled() { - return getPrimarySkill().getHardcoreVampirismEnabled(); - } - - @Override - public void setHardcoreVampirismEnabled(boolean enable) { - getPrimarySkill().setHardcoreVampirismEnabled(enable); - } - - @Override - public ToolType getTool() { - return getPrimarySkill().getTool(); - } - - @Override - public List getSkillAbilities() { - return getPrimarySkill().getSkillAbilities(); - } - - @Override - public double getXpModifier() { - return getPrimarySkill().getXpModifier(); - } - - @Override - public boolean isChildSkill() { - return getPrimarySkill().isChildSkill(); - } - - @Override - public String getName() { - return getPrimarySkill().getName(); - } - - @Override - public boolean getPermissions(Player player) { - return getPrimarySkill().getPermissions(player); - } - - @Override - public boolean shouldProcess(Entity target) { - return getPrimarySkill().shouldProcess(target); - } } 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 706055df3..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,6 +3,7 @@ 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 { @@ -10,7 +11,7 @@ public class McMMOPlayerAbilityEvent extends McMMOPlayerSkillEvent { 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/secondaryabilities/SubSkillEvent.java b/src/main/java/com/gmail/nossr50/events/skills/secondaryabilities/SubSkillEvent.java index 215a7f224..7c0fb4ea9 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 @@ -4,6 +4,7 @@ import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.datatypes.skills.interfaces.Skill; 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 +21,7 @@ public class SubSkillEvent extends McMMOPlayerSkillEvent implements Cancellable */ @Deprecated public SubSkillEvent(Player player, SubSkillType subSkillType) { - super(player, Skill.bySecondaryAbility(subSkillType)); + super(player, mcMMO.p.getSkillTools().getPrimarySkillBySubSkill(subSkillType)); this.subSkillType = subSkillType; } @@ -33,7 +34,7 @@ public class SubSkillEvent extends McMMOPlayerSkillEvent implements Cancellable */ @Deprecated public SubSkillEvent(Player player, SubSkillType subSkillType, double resultModifier) { - super(player, Skill.bySecondaryAbility(subSkillType)); + super(player, mcMMO.p.getSkillTools().getPrimarySkillBySubSkill(subSkillType)); this.subSkillType = subSkillType; this.resultModifier = resultModifier; } diff --git a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java index 33b68076c..f72a9409f 100644 --- a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java @@ -228,10 +228,10 @@ public class BlockListener implements Listener { if(mcMMOPlayer == null) return; - if (blockState.getType() == Repair.anvilMaterial && PrimarySkillType.REPAIR.getPermissions(player)) { + if (blockState.getType() == Repair.anvilMaterial && Permissions.skillEnabled(player, PrimarySkillType.REPAIR)) { mcMMOPlayer.getRepairManager().placedAnvilCheck(); } - else if (blockState.getType() == Salvage.anvilMaterial && PrimarySkillType.SALVAGE.getPermissions(player)) { + else if (blockState.getType() == Salvage.anvilMaterial && Permissions.skillEnabled(player, PrimarySkillType.SALVAGE)) { mcMMOPlayer.getSalvageManager().placedAnvilCheck(); } } @@ -333,7 +333,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 (Permissions.skillEnabled(player, PrimarySkillType.HERBALISM)) { herbalismManager.processHerbalismBlockBreakEvent(event); } /* @@ -344,13 +344,13 @@ 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) && Permissions.skillEnabled(player, PrimarySkillType.MINING) && !mcMMO.getPlaceStore().isTrue(blockState)) { MiningManager miningManager = mcMMOPlayer.getMiningManager(); miningManager.miningBlockCheck(blockState); } /* WOOD CUTTING */ - else if (BlockUtils.hasWoodcuttingXP(blockState) && ItemUtils.isAxe(heldItem) && PrimarySkillType.WOODCUTTING.getPermissions(player) && !mcMMO.getPlaceStore().isTrue(blockState)) { + else if (BlockUtils.hasWoodcuttingXP(blockState) && ItemUtils.isAxe(heldItem) && Permissions.skillEnabled(player, PrimarySkillType.WOODCUTTING) && !mcMMO.getPlaceStore().isTrue(blockState)) { WoodcuttingManager woodcuttingManager = mcMMOPlayer.getWoodcuttingManager(); if (woodcuttingManager.canUseTreeFeller(heldItem)) { woodcuttingManager.processTreeFeller(blockState); @@ -365,7 +365,7 @@ public class BlockListener implements Listener { } /* 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) && Permissions.skillEnabled(player, PrimarySkillType.EXCAVATION) && !mcMMO.getPlaceStore().isTrue(blockState)) { ExcavationManager excavationManager = mcMMOPlayer.getExcavationManager(); excavationManager.excavationBlockCheck(blockState); diff --git a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java index 53e40ca14..16a50182b 100644 --- a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java @@ -273,7 +273,7 @@ public class PlayerListener implements Listener { return; } - if (!UserManager.hasPlayerDataKey(player) || !PrimarySkillType.FISHING.getPermissions(player)) { + if (!UserManager.hasPlayerDataKey(player) || !Permissions.skillEnabled(player, PrimarySkillType.FISHING)) { return; } @@ -359,7 +359,7 @@ public class PlayerListener implements Listener { return; } - if (!UserManager.hasPlayerDataKey(player) || !PrimarySkillType.FISHING.getPermissions(player)) { + if (!UserManager.hasPlayerDataKey(player) || !Permissions.skillEnabled(player, PrimarySkillType.FISHING)) { return; } @@ -654,7 +654,7 @@ public class PlayerListener implements Listener { if (!mcMMO.p.getGeneralConfig().getAbilitiesOnlyActivateWhenSneaking() || player.isSneaking()) { /* REPAIR CHECKS */ if (type == Repair.anvilMaterial - && PrimarySkillType.REPAIR.getPermissions(player) + && Permissions.skillEnabled(player, PrimarySkillType.REPAIR) && mcMMO.getRepairableManager().isRepairable(heldItem) && heldItem.getAmount() <= 1) { RepairManager repairManager = mcMMOPlayer.getRepairManager(); @@ -668,7 +668,7 @@ public class PlayerListener implements Listener { } /* SALVAGE CHECKS */ else if (type == Salvage.anvilMaterial - && PrimarySkillType.SALVAGE.getPermissions(player) + && Permissions.skillEnabled(player, PrimarySkillType.SALVAGE) && RankUtils.hasUnlockedSubskill(player, SubSkillType.SALVAGE_SCRAP_COLLECTOR) && mcMMO.getSalvageableManager().isSalvageable(heldItem) && heldItem.getAmount() <= 1) { @@ -701,7 +701,7 @@ public class PlayerListener implements Listener { 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 && Permissions.skillEnabled(player, PrimarySkillType.REPAIR) && mcMMO.getRepairableManager().isRepairable(heldItem)) { RepairManager repairManager = mcMMOPlayer.getRepairManager(); // Cancel repairing an enchanted item @@ -711,7 +711,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 && Permissions.skillEnabled(player, PrimarySkillType.SALVAGE) && mcMMO.getSalvageableManager().isSalvageable(heldItem)) { SalvageManager salvageManager = mcMMOPlayer.getSalvageManager(); // Cancel salvaging an enchanted item @@ -958,7 +958,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)); diff --git a/src/main/java/com/gmail/nossr50/listeners/SelfListener.java b/src/main/java/com/gmail/nossr50/listeners/SelfListener.java index 5bd3f5ec0..10da03550 100644 --- a/src/main/java/com/gmail/nossr50/listeners/SelfListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/SelfListener.java @@ -132,7 +132,7 @@ public class SelfListener implements Listener { return; } - if (primarySkillType.isChildSkill()) { + if (mcMMO.p.getSkillTools().isChildSkill(primarySkillType)) { return; } @@ -140,7 +140,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/locale/LocaleLoader.java b/src/main/java/com/gmail/nossr50/locale/LocaleLoader.java index a3b285689..2cfcc4052 100644 --- a/src/main/java/com/gmail/nossr50/locale/LocaleLoader.java +++ b/src/main/java/com/gmail/nossr50/locale/LocaleLoader.java @@ -129,6 +129,7 @@ public final class LocaleLoader { if (bundle == null) { Locale.setDefault(new Locale("en", "US")); Locale locale = null; + String[] myLocale = mcMMO.p.getGeneralConfig().getLocale().split("[-_ ]"); if (myLocale.length == 1) { diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index ef3ead515..2b19e5761 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -49,6 +49,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.util.skills.SmeltingTracker; import com.gmail.nossr50.util.upgrade.UpgradeManager; import com.gmail.nossr50.worldguard.WorldGuardManager; @@ -90,6 +91,9 @@ public class mcMMO extends JavaPlugin { private static ChatManager chatManager; private static CommandManager commandManager; //ACF private static TransientEntityTracker transientEntityTracker; + + private @NotNull SkillTools skillTools; + private static boolean serverShutdownExecuted = false; /* Adventure */ @@ -172,8 +176,10 @@ public class mcMMO extends JavaPlugin { @Override public void onEnable() { try { + generalConfig = new GeneralConfig(getDataFolder()); //Load before skillTools + skillTools = new SkillTools(this); //Load after general config + //Init configs - generalConfig = new GeneralConfig(getDataFolder()); advancedConfig = new AdvancedConfig(getDataFolder()); //Store this value so other plugins can check it @@ -767,6 +773,10 @@ public class mcMMO extends JavaPlugin { return purgeTime; } + public @NotNull SkillTools getSkillTools() { + return skillTools; + } + public @NotNull GeneralConfig getGeneralConfig() { return generalConfig; } 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 1640d9301..28d09f8aa 100644 --- a/src/main/java/com/gmail/nossr50/runnables/commands/McrankCommandDisplayTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/commands/McrankCommandDisplayTask.java @@ -46,13 +46,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 : mcMMO.p.getSkillTools().NON_CHILD_SKILLS) { +// if (!Permissions.skillEnabled(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 82ab947dd..babae32fd 100644 --- a/src/main/java/com/gmail/nossr50/runnables/commands/MctopCommandDisplayTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/commands/MctopCommandDisplayTask.java @@ -60,10 +60,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/FormulaConversionTask.java b/src/main/java/com/gmail/nossr50/runnables/database/FormulaConversionTask.java index 5447feb64..056b17dea 100644 --- a/src/main/java/com/gmail/nossr50/runnables/database/FormulaConversionTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/database/FormulaConversionTask.java @@ -58,7 +58,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 : mcMMO.p.getSkillTools().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/skills/AbilityDisableTask.java b/src/main/java/com/gmail/nossr50/runnables/skills/AbilityDisableTask.java index cce276fc2..e8cd9f70b 100644 --- a/src/main/java/com/gmail/nossr50/runnables/skills/AbilityDisableTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/skills/AbilityDisableTask.java @@ -63,7 +63,9 @@ public class AbilityDisableTask extends BukkitRunnable { if (mcMMO.p.getAdvancedConfig().sendAbilityNotificationToOtherPlayers()) { 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.isServerShutdownExecuted()) { + new AbilityCooldownTask(mcMMOPlayer, ability).runTaskLater(mcMMO.p, PerksUtils.handleCooldownPerks(player, ability.getCooldown()) * Misc.TICK_CONVERSION_FACTOR); + } } private void resendChunkRadiusAt(Player player) { 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 a4903e123..9641e6804 100644 --- a/src/main/java/com/gmail/nossr50/skills/acrobatics/AcrobaticsManager.java +++ b/src/main/java/com/gmail/nossr50/skills/acrobatics/AcrobaticsManager.java @@ -72,7 +72,7 @@ public class AcrobaticsManager extends SkillManager { return false; } - return skill.shouldProcess(damager); + return mcMMO.p.getSkillTools().canCombatSkillsTrigger(skill, damager); } return false; 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 7aaa1844d..8cb825f48 100644 --- a/src/main/java/com/gmail/nossr50/skills/alchemy/Alchemy.java +++ b/src/main/java/com/gmail/nossr50/skills/alchemy/Alchemy.java @@ -48,7 +48,6 @@ public final class Alchemy { public static final int INGREDIENT_SLOT = 3; - public static int catalysisUnlockLevel = RankUtils.getUnlockLevel(SubSkillType.ALCHEMY_CATALYSIS); public static int catalysisMaxBonusLevel = mcMMO.p.getAdvancedConfig().getCatalysisMaxBonusLevel(); public static double catalysisMinSpeed = mcMMO.p.getAdvancedConfig().getCatalysisMinSpeed(); public static double catalysisMaxSpeed = mcMMO.p.getAdvancedConfig().getCatalysisMaxSpeed(); 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 92050ae77..16b1dd2ac 100644 --- a/src/main/java/com/gmail/nossr50/skills/alchemy/AlchemyManager.java +++ b/src/main/java/com/gmail/nossr50/skills/alchemy/AlchemyManager.java @@ -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/child/ChildConfig.java b/src/main/java/com/gmail/nossr50/skills/child/ChildConfig.java index 66e3b48e6..3ac703ec8 100644 --- a/src/main/java/com/gmail/nossr50/skills/child/ChildConfig.java +++ b/src/main/java/com/gmail/nossr50/skills/child/ChildConfig.java @@ -2,6 +2,7 @@ package com.gmail.nossr50.skills.child; import com.gmail.nossr50.config.AutoUpdateConfigLoader; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; +import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.text.StringUtils; import org.bukkit.configuration.file.YamlConfiguration; @@ -20,7 +21,7 @@ public class ChildConfig extends AutoUpdateConfigLoader { FamilyTree.clearRegistrations(); // when reloading, need to clear statics - for (PrimarySkillType skill : PrimarySkillType.CHILD_SKILLS) { + for (PrimarySkillType skill : mcMMO.p.getSkillTools().CHILD_SKILLS) { plugin.debug("Finding parents of " + skill.name()); EnumSet parentSkills = EnumSet.noneOf(PrimarySkillType.class); 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 af0fbf95e..7a5639dc2 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.mcMMO; import java.util.Collections; import java.util.EnumSet; @@ -40,13 +41,13 @@ public class FamilyTree { } protected static void enforceChildSkill(PrimarySkillType skill) { - if (!skill.isChildSkill()) { + if (!mcMMO.p.getSkillTools().isChildSkill(skill)) { throw new IllegalArgumentException(skill.name() + " is not a child skill!"); } } protected static void enforceNotChildSkill(PrimarySkillType skill) { - if (skill.isChildSkill()) { + if (mcMMO.p.getSkillTools().isChildSkill(skill)) { throw new IllegalArgumentException(skill.name() + " is a child skill!"); } } 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 b1ffd853a..9cad29d7b 100644 --- a/src/main/java/com/gmail/nossr50/skills/mining/MiningManager.java +++ b/src/main/java/com/gmail/nossr50/skills/mining/MiningManager.java @@ -80,7 +80,7 @@ public class MiningManager extends SkillManager { return; } - if (mmoPlayer.getAbilityMode(skill.getAbility())) { + if (mmoPlayer.getAbilityMode(mcMMO.p.getSkillTools().getSuperAbility(skill))) { SkillUtils.handleDurabilityChange(getPlayer().getInventory().getItemInMainHand(), mcMMO.p.getGeneralConfig().getAbilityToolDamage()); } @@ -94,7 +94,7 @@ public class MiningManager extends SkillManager { //TODO: Make this readable if (RandomChanceUtil.checkRandomChanceExecutionSuccess(getPlayer(), SubSkillType.MINING_DOUBLE_DROPS, true)) { - boolean useTriple = mmoPlayer.getAbilityMode(skill.getAbility()) && mcMMO.p.getAdvancedConfig().getAllowMiningTripleDrops(); + boolean useTriple = mmoPlayer.getAbilityMode(mcMMO.p.getSkillTools().getSuperAbility(skill)) && mcMMO.p.getAdvancedConfig().getAllowMiningTripleDrops(); BlockUtils.markDropsAsBonus(blockState, useTriple); } } diff --git a/src/main/java/com/gmail/nossr50/util/EventUtils.java b/src/main/java/com/gmail/nossr50/util/EventUtils.java index c2d181063..d97c1c0ad 100644 --- a/src/main/java/com/gmail/nossr50/util/EventUtils.java +++ b/src/main/java/com/gmail/nossr50/util/EventUtils.java @@ -406,7 +406,7 @@ public final class EventUtils { experienceChanged = event.getExperienceChanged(); PlayerProfile playerProfile = UserManager.getPlayer(player).getProfile(); - for (PrimarySkillType primarySkillType : PrimarySkillType.NON_CHILD_SKILLS) { + for (PrimarySkillType primarySkillType : mcMMO.p.getSkillTools().NON_CHILD_SKILLS) { String skillName = primarySkillType.toString(); int playerSkillLevel = playerProfile.getSkillLevel(primarySkillType); int threshold = mcMMO.p.getGeneralConfig().getHardcoreDeathStatPenaltyLevelThreshold(); @@ -455,7 +455,7 @@ public final class EventUtils { PlayerProfile victimProfile = UserManager.getPlayer(victim).getProfile(); - for (PrimarySkillType primarySkillType : PrimarySkillType.NON_CHILD_SKILLS) { + for (PrimarySkillType primarySkillType : mcMMO.p.getSkillTools().NON_CHILD_SKILLS) { String skillName = primarySkillType.toString(); int victimSkillLevel = victimProfile.getSkillLevel(primarySkillType); @@ -479,7 +479,7 @@ public final class EventUtils { } public static McMMOPlayerAbilityDeactivateEvent callAbilityDeactivateEvent(Player player, SuperAbilityType ability) { - McMMOPlayerAbilityDeactivateEvent event = new McMMOPlayerAbilityDeactivateEvent(player, Skill.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/HardcoreManager.java b/src/main/java/com/gmail/nossr50/util/HardcoreManager.java index 4e6152b1c..3c2abfc38 100644 --- a/src/main/java/com/gmail/nossr50/util/HardcoreManager.java +++ b/src/main/java/com/gmail/nossr50/util/HardcoreManager.java @@ -34,8 +34,8 @@ public final class HardcoreManager { HashMap levelChanged = new HashMap<>(); HashMap experienceChanged = new HashMap<>(); - for (PrimarySkillType primarySkillType : PrimarySkillType.NON_CHILD_SKILLS) { - if (!primarySkillType.getHardcoreStatLossEnabled()) { + for (PrimarySkillType primarySkillType : mcMMO.p.getSkillTools().NON_CHILD_SKILLS) { + if (!mcMMO.p.getGeneralConfig().getHardcoreStatLossEnabled(primarySkillType)) { levelChanged.put(primarySkillType.toString(), 0); experienceChanged.put(primarySkillType.toString(), 0F); continue; @@ -86,8 +86,8 @@ public final class HardcoreManager { HashMap levelChanged = new HashMap<>(); HashMap experienceChanged = new HashMap<>(); - for (PrimarySkillType primarySkillType : PrimarySkillType.NON_CHILD_SKILLS) { - if (!primarySkillType.getHardcoreVampirismEnabled()) { + for (PrimarySkillType primarySkillType : mcMMO.p.getSkillTools().NON_CHILD_SKILLS) { + if (!mcMMO.p.getGeneralConfig().getHardcoreVampirismEnabled(primarySkillType)) { levelChanged.put(primarySkillType.toString(), 0); experienceChanged.put(primarySkillType.toString(), 0F); continue; @@ -135,8 +135,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 : mcMMO.p.getSkillTools().NON_CHILD_SKILLS) { + if (mcMMO.p.getGeneralConfig().getHardcoreStatLossEnabled(primarySkillType)) { enabled = true; break; } @@ -153,8 +153,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 : mcMMO.p.getSkillTools().NON_CHILD_SKILLS) { + if (mcMMO.p.getGeneralConfig().getHardcoreVampirismEnabled(primarySkillType)) { enabled = true; break; } 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 ed98345a1..83d305486 100644 --- a/src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java +++ b/src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java @@ -34,7 +34,7 @@ public final class CommandRegistrationManager { 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; 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 e7cee3107..0ccee19be 100644 --- a/src/main/java/com/gmail/nossr50/util/commands/CommandUtils.java +++ b/src/main/java/com/gmail/nossr50/util/commands/CommandUtils.java @@ -6,6 +6,7 @@ import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.Misc; +import com.gmail.nossr50.util.Permissions; import com.gmail.nossr50.util.player.UserManager; import com.gmail.nossr50.util.skills.SkillUtils; import com.gmail.nossr50.util.text.StringUtils; @@ -25,7 +26,7 @@ public final class CommandUtils { private CommandUtils() {} public static boolean isChildSkill(CommandSender sender, PrimarySkillType skill) { - if (skill == null || !skill.isChildSkill()) { + if (skill == null || !mcMMO.p.getSkillTools().isChildSkill(skill)) { return false; } @@ -169,7 +170,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) { @@ -183,7 +184,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) { @@ -197,7 +198,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) { @@ -205,7 +206,7 @@ public final class CommandUtils { } public static String displaySkill(PlayerProfile profile, PrimarySkillType skill) { - if (skill.isChildSkill()) { + if (mcMMO.p.getSkillTools().isChildSkill(skill)) { return LocaleLoader.getString("Skills.ChildStats", LocaleLoader.getString(StringUtils.getCapitalized(skill.toString()) + ".Listener") + " ", profile.getSkillLevel(skill)); } if (profile.getSkillLevel(skill) == mcMMO.p.getGeneralConfig().getLevelCap(skill)){ @@ -214,18 +215,18 @@ public final class CommandUtils { 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<>(); displayData.add(header); - for (PrimarySkillType skill : skillGroup) { - if (skill.getPermissions(inspect)) { - displayData.add(displaySkill(profile, skill)); + for (PrimarySkillType primarySkillType : skillGroup) { + if (Permissions.skillEnabled(inspectTarget, primarySkillType)) { + displayData.add(displaySkill(profile, primarySkillType)); } } 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 7a49a1260..ccc09be80 100644 --- a/src/main/java/com/gmail/nossr50/util/experience/ExperienceBarManager.java +++ b/src/main/java/com/gmail/nossr50/util/experience/ExperienceBarManager.java @@ -146,10 +146,10 @@ public class ExperienceBarManager { disabledBars.add(PrimarySkillType.SMELTING); } - private void informPlayer(@NotNull ExperienceBarManager.@NotNull XPBarSettingTarget settingTarget, @Nullable PrimarySkillType skillType) { + 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", skillType.getName(), settingTarget.toString()); + NotificationManager.sendPlayerInformationChatOnlyPrefixed(mcMMOPlayer.getPlayer(), "Commands.XPBar.SettingChanged", mcMMO.p.getSkillTools().getLocalizedSkillName(primarySkillType), settingTarget.toString()); } else { NotificationManager.sendPlayerInformationChatOnlyPrefixed(mcMMOPlayer.getPlayer(), "Commands.XPBar.Reset"); } 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 fc7de2b28..fb46db146 100644 --- a/src/main/java/com/gmail/nossr50/util/player/NotificationManager.java +++ b/src/main/java/com/gmail/nossr50/util/player/NotificationManager.java @@ -289,10 +289,10 @@ public class NotificationManager { .append(Component.newline()) .append(Component.text(LocalDate.now().toString())) .append(Component.newline()) - .append(Component.text(primarySkillType.getName()+" reached level "+level)).color(TextColor.fromHexString(HEX_BEIGE_COLOR)) + .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, primarySkillType.getName()); + String localeMessage = LocaleLoader.getString("Broadcasts.LevelUpMilestone", mmoPlayer.getPlayer().getDisplayName(), level, mcMMO.p.getSkillTools().getLocalizedSkillName(primarySkillType)); Component message = Component.text(localeMessage).hoverEvent(levelMilestoneHover); Bukkit.getScheduler().runTaskLater(mcMMO.p, () -> audience.sendMessage(Identity.nil(), message), 0); 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 5ec4381b6..9e081bcd6 100644 --- a/src/main/java/com/gmail/nossr50/util/scoreboards/ScoreboardManager.java +++ b/src/main/java/com/gmail/nossr50/util/scoreboards/ScoreboardManager.java @@ -91,14 +91,14 @@ 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().getLocalizedName())); + 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) { + if (primarySkillType == PrimarySkillType.MINING) { abilityLabelBuilder.put(SuperAbilityType.BLAST_MINING, getShortenedName(colors.get(i) + SuperAbilityType.BLAST_MINING.getLocalizedName())); } } @@ -113,14 +113,14 @@ 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().getLocalizedName())); + 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) { + if (primarySkillType == PrimarySkillType.MINING) { abilityLabelBuilder.put(SuperAbilityType.BLAST_MINING, formatAbility(SuperAbilityType.BLAST_MINING.getLocalizedName())); } } 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 20f3d4d97..cee2d135a 100644 --- a/src/main/java/com/gmail/nossr50/util/scoreboards/ScoreboardWrapper.java +++ b/src/main/java/com/gmail/nossr50/util/scoreboards/ScoreboardWrapper.java @@ -13,6 +13,7 @@ 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.Permissions; import com.gmail.nossr50.util.player.NotificationManager; import com.gmail.nossr50.util.player.UserManager; import com.gmail.nossr50.util.scoreboards.ScoreboardManager.SidebarType; @@ -488,7 +489,7 @@ public class ScoreboardWrapper { case SKILL_BOARD: Validate.notNull(targetSkill); - if (!targetSkill.isChildSkill()) { + if (!mcMMO.p.getSkillTools().isChildSkill(targetSkill)) { int currentXP = mcMMOPlayer.getSkillXpLevel(targetSkill); sidebarObjective.getScore(ScoreboardManager.LABEL_CURRENT_XP).setScore(currentXP); @@ -502,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) { @@ -518,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); @@ -573,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 : mcMMO.p.getSkillTools().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 (!Permissions.skillEnabled(player, skill)) { continue; } @@ -606,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 : mcMMO.p.getSkillTools().NON_CHILD_SKILLS) { + if (!Permissions.skillEnabled(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 e3dcf0e6f..2c9820a2c 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java @@ -342,7 +342,7 @@ public final class CombatUtils { } if (ItemUtils.isSword(player.getInventory().getItemInMainHand())) { - if (!PrimarySkillType.SWORDS.shouldProcess(target)) { + if (!mcMMO.p.getSkillTools().canCombatSkillsTrigger(PrimarySkillType.SWORDS, target)) { return; } @@ -380,30 +380,30 @@ 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 (Permissions.skillEnabled(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 (Permissions.skillEnabled(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 (Permissions.skillEnabled(player, PrimarySkillType.UNARMED)) { processUnarmedCombat(target, player, event); } } @@ -413,10 +413,10 @@ public final class CombatUtils { Wolf wolf = (Wolf) painSource; AnimalTamer tamer = wolf.getOwner(); - if (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) && Permissions.skillEnabled(master, PrimarySkillType.TAMING)) { processTamingCombat(target, master, wolf, event); } } @@ -425,17 +425,17 @@ public final class CombatUtils { Projectile arrow = (Projectile) painSource; ProjectileSource projectileSource = arrow.getShooter(); - if (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) && Permissions.skillEnabled(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) && Permissions.skillEnabled(player, PrimarySkillType.TAMING)) { McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); if(mcMMOPlayer == null) 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 f35239eec..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); 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..4fe98d5f7 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/util/skills/SkillTools.java @@ -0,0 +1,450 @@ +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.ImmutableSet; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.entity.Tameable; +import org.jetbrains.annotations.NotNull; + +import java.util.*; + +public class SkillTools { + private final mcMMO pluginRef; + + //TODO: Should these be hash sets instead of lists? + //TODO: Figure out which ones we don't need, this was copy pasted from a diff branch + public final ImmutableList LOCALIZED_SKILL_NAMES; + public final ImmutableList FORMATTED_SUBSKILL_NAMES; + public final ImmutableSet EXACT_SUBSKILL_NAMES; + public final List CHILD_SKILLS; + public final ImmutableList NON_CHILD_SKILLS; + public final ImmutableList COMBAT_SKILLS; + public final ImmutableList GATHERING_SKILLS; + public final ImmutableList MISC_SKILLS; + + private EnumMap subSkillParentRelationshipMap; //TODO: This disgusts me, but it will have to do until the new skill system is in place + private EnumMap superAbilityParentRelationshipMap; //TODO: This disgusts me, but it will have to do until the new skill system is in place + private EnumMap> primarySkillChildrenMap; //TODO: This disgusts me, but it will have to do until the new skill system is in place + + // The map below is for the super abilities which require readying a tool, its everything except blast mining + private EnumMap mainActivatedAbilityChildMap; //TODO: This disgusts me, but it will have to do until the new skill system is in place + private EnumMap primarySkillToolMap; //TODO: Christ.. + + public SkillTools(@NotNull mcMMO pluginRef) { + this.pluginRef = pluginRef; + + initSubSkillRelationshipMap(); + initPrimaryChildMap(); + initPrimaryToolMap(); + initSuperAbilityParentRelationships(); + + List childSkills = new ArrayList<>(); + List nonChildSkills = new ArrayList<>(); + + for (PrimarySkillType primarySkillType : PrimarySkillType.values()) { + if (isChildSkill(primarySkillType)) { + childSkills.add(primarySkillType); + } else { + nonChildSkills.add(primarySkillType); + } + } + + 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); + + LOCALIZED_SKILL_NAMES = ImmutableList.copyOf(buildLocalizedPrimarySkillNames()); + FORMATTED_SUBSKILL_NAMES = ImmutableList.copyOf(buildFormattedSubSkillNameList()); + EXACT_SUBSKILL_NAMES = ImmutableSet.copyOf(buildExactSubSkillNameList()); + + CHILD_SKILLS = ImmutableList.copyOf(childSkills); + NON_CHILD_SKILLS = ImmutableList.copyOf(nonChildSkills); + } + + //TODO: What is with this design? + private void initPrimaryToolMap() { + primarySkillToolMap = new EnumMap(PrimarySkillType.class); + + primarySkillToolMap.put(PrimarySkillType.AXES, ToolType.AXE); + primarySkillToolMap.put(PrimarySkillType.WOODCUTTING, ToolType.AXE); + primarySkillToolMap.put(PrimarySkillType.UNARMED, ToolType.FISTS); + primarySkillToolMap.put(PrimarySkillType.SWORDS, ToolType.SWORD); + primarySkillToolMap.put(PrimarySkillType.EXCAVATION, ToolType.SHOVEL); + primarySkillToolMap.put(PrimarySkillType.HERBALISM, ToolType.HOE); + primarySkillToolMap.put(PrimarySkillType.MINING, ToolType.PICKAXE); + } + + private void initSuperAbilityParentRelationships() { + superAbilityParentRelationshipMap = new EnumMap(SuperAbilityType.class); + mainActivatedAbilityChildMap = new EnumMap(PrimarySkillType.class); + + for(SuperAbilityType superAbilityType : SuperAbilityType.values()) { + try { + PrimarySkillType parent = getSuperAbilityParent(superAbilityType); + superAbilityParentRelationshipMap.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 + mainActivatedAbilityChildMap.put(parent, superAbilityType); + } + } catch (InvalidSkillException e) { + e.printStackTrace(); + } + } + } + + private 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()); + } + } + + /** + * Builds a list of localized {@link PrimarySkillType} names + * @return list of localized {@link PrimarySkillType} names + */ + private ArrayList buildLocalizedPrimarySkillNames() { + ArrayList localizedSkillNameList = new ArrayList<>(); + + for(PrimarySkillType primarySkillType : PrimarySkillType.values()) { + localizedSkillNameList.add(getLocalizedSkillName(primarySkillType)); + } + + Collections.sort(localizedSkillNameList); + + return localizedSkillNameList; + } + + /** + * Builds a map containing a HashSet of SubSkillTypes considered Children of PrimarySkillType + * Disgusting Hacky Fix until the new skill system is in place + */ + private void initPrimaryChildMap() { + primarySkillChildrenMap = new EnumMap>(PrimarySkillType.class); + + //Init the empty Hash Sets + for(PrimarySkillType primarySkillType : PrimarySkillType.values()) { + primarySkillChildrenMap.put(primarySkillType, new HashSet()); + } + + //Fill in the hash sets + for(SubSkillType subSkillType : SubSkillType.values()) { + PrimarySkillType parentSkill = subSkillParentRelationshipMap.get(subSkillType); + + //Add this subskill as a child + primarySkillChildrenMap.get(parentSkill).add(subSkillType); + } + } + + /** + * 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 ArrayList buildFormattedSubSkillNameList() { + ArrayList subSkillNameList = new ArrayList<>(); + + for(SubSkillType subSkillType : SubSkillType.values()) { + subSkillNameList.add(subSkillType.getNiceNameNoSpaces(subSkillType)); + } + + return subSkillNameList; + } + + private HashSet buildExactSubSkillNameList() { + HashSet subSkillNameExactSet = new HashSet<>(); + + for(SubSkillType subSkillType : SubSkillType.values()) { + subSkillNameExactSet.add(subSkillType.toString()); + } + + return subSkillNameExactSet; + } + + /** + * Builds a map containing the relationships of SubSkillTypes to PrimarySkillTypes + * Disgusting Hacky Fix until the new skill system is in place + */ + private void initSubSkillRelationshipMap() { + subSkillParentRelationshipMap = new EnumMap(SubSkillType.class); + + //Super hacky and disgusting + for(PrimarySkillType primarySkillType : PrimarySkillType.values()) { + for(SubSkillType subSkillType : SubSkillType.values()) { + String[] splitSubSkillName = subSkillType.toString().split("_"); + + if(primarySkillType.toString().equalsIgnoreCase(splitSubSkillName[0])) { + //Parent Skill Found + subSkillParentRelationshipMap.put(subSkillType, primarySkillType); + } + } + } + } + + /** + * 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) { + return RankUtils.getRank(player, getSuperAbility(primarySkillType).getSubSkillTypeDefinition()) >= 1; + } + + 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 List getSubSkills(PrimarySkillType primarySkillType) { + //TODO: Cache this! + return new ArrayList<>(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 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(PrimarySkillType primarySkillType, Player player) { + 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"; + } + + /** + * 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; + } + + // /** +// * Check if a block is affected by this ability. +// * +// * @param blockState the block to check +// * @param superAbilityType target super ability +// * @return true if the block is affected by this ability, false otherwise +// */ +// public boolean superAbilityBlockCheck(SuperAbilityType superAbilityType, BlockState blockState) { +// switch (superAbilityType) { +// case BERSERK: +// return (BlockUtils.affectedByGigaDrillBreaker(blockState) || blockState.getType() == Material.SNOW); +// +// case GIGA_DRILL_BREAKER: +// return BlockUtils.affectedByGigaDrillBreaker(blockState); +// +// case GREEN_TERRA: +// return BlockUtils.canMakeMossy(blockState); +// +// case SUPER_BREAKER: +// return BlockUtils.affectedBySuperBreaker(blockState); +// +// case TREE_FELLER: +// dfss +// +// default: +// return false; +// } +// } +} 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 434828dca..938ca2343 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/SkillUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/SkillUtils.java @@ -53,7 +53,7 @@ public final class SkillUtils { */ public static String[] calculateLengthDisplayValues(Player player, float skillValue, PrimarySkillType skill) { - int maxLength = skill.getAbility().getMaxLength(); + int maxLength = mcMMO.p.getSkillTools().getSuperAbilityMaxLength(mcMMO.p.getSkillTools().getSuperAbility(skill)); int abilityLengthVar = mcMMO.p.getAdvancedConfig().getAbilityLength(); int abilityLengthCap = mcMMO.p.getAdvancedConfig().getAbilityLengthCap(); @@ -123,7 +123,7 @@ public final class SkillUtils { * @return true if this is a valid skill, false otherwise */ public static boolean isSkill(String skillName) { - return mcMMO.p.getGeneralConfig().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) { @@ -189,10 +189,10 @@ public final class SkillUtils { 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); diff --git a/src/main/java/com/gmail/nossr50/util/text/StringUtils.java b/src/main/java/com/gmail/nossr50/util/text/StringUtils.java index db53feb31..34aac4fc8 100644 --- a/src/main/java/com/gmail/nossr50/util/text/StringUtils.java +++ b/src/main/java/com/gmail/nossr50/util/text/StringUtils.java @@ -31,6 +31,35 @@ public class StringUtils { 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 diff --git a/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java b/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java index 99a019c0d..97b235b65 100644 --- a/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java +++ b/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java @@ -6,7 +6,6 @@ import com.google.common.io.Files; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.junit.After; -import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; From 241df06707d04b8efd85b0f720f9c927c85d4596 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 8 Apr 2021 13:22:20 -0700 Subject: [PATCH 478/662] Don't need this anymore --- .../datatypes/skills/PrimarySkillType.java | 242 +----------------- 1 file changed, 1 insertion(+), 241 deletions(-) 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 1e46c2ad2..ceb75d12f 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/skills/PrimarySkillType.java +++ b/src/main/java/com/gmail/nossr50/datatypes/skills/PrimarySkillType.java @@ -16,244 +16,4 @@ public enum PrimarySkillType { TAMING, UNARMED, WOODCUTTING -} - -//package com.gmail.nossr50.datatypes.skills; -// -//import com.gmail.nossr50.config.experience.ExperienceConfig; -//import com.gmail.nossr50.datatypes.skills.interfaces.Skill; -//import com.gmail.nossr50.locale.LocaleLoader; -//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.skills.RankUtils; -//import com.gmail.nossr50.util.text.StringUtils; -//import com.google.common.collect.ImmutableList; -//import org.bukkit.Color; -//import org.bukkit.entity.Entity; -//import org.bukkit.entity.Player; -//import org.bukkit.entity.Tameable; -// -//import java.util.ArrayList; -//import java.util.Collections; -//import java.util.List; -// -//public enum PrimarySkillType implements Skill { -// 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_STEEL_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, SubSkillType.WOODCUTTING_KNOCK_ON_WOOD)); -// -// private final Class managerClass; -// private final Color skillColor; -// private final SuperAbilityType ability; -// private final ToolType tool; -// private final List subSkillTypes; -// -// 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; -// -// 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 (mcMMO.p.getSkillTools().isChildSkill(skill)) { -// childSkills.add(skill); -// } -// else { -// nonChildSkills.add(skill); -// } -// -// for(SubSkillType subSkillType : skill.subSkillTypes) { -// subSkillNames.add(subSkillType.getNiceNameNoSpaces(subSkillType)); -// } -// -// names.add(mcMMO.p.getSkillTools().getLocalizedSkillName(skill)); -// } -// -// Collections.sort(names); -// SKILL_NAMES = ImmutableList.copyOf(names); -// SUBSKILL_NAMES = ImmutableList.copyOf(subSkillNames); -// -// CHILD_SKILLS = ImmutableList.copyOf(childSkills); -// NON_CHILD_SKILLS = ImmutableList.copyOf(nonChildSkills); -// } -// -// PrimarySkillType(Class managerClass, Color skillColor, List subSkillTypes) { -// this(managerClass, skillColor, null, null, subSkillTypes); -// } -// -// 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 PrimarySkillType getPrimarySkill() { -// return this; -// } -// -// public String getPrimaryKeyName() { -// return StringUtils.getCapitalized(this.toString()); -// } -// -// public Class getManagerClass() { -// return managerClass; -// } -// -// public SuperAbilityType getAbility() { -// return ability; -// } -// -// /** -// * Get the max level of this skill. -// * -// * @return the max level of this skill -// */ -// public int getMaxLevel() { -// return mcMMO.p.getGeneralConfig().getLevelCap(this); -// } -// -// public boolean isSuperAbilityUnlocked(Player player) { return RankUtils.getRank(player, getAbility().getSubSkillTypeDefinition()) >= 1; } -// -// public boolean getPVPEnabled() { -// return mcMMO.p.getGeneralConfig().getPVPEnabled(this); -// } -// -// public boolean getPVEEnabled() { -// return mcMMO.p.getGeneralConfig().getPVEEnabled(this); -// } -// -// public boolean getDoubleDropsDisabled() { -// return mcMMO.p.getGeneralConfig().getDoubleDropsDisabled(this); -// } -// -// public boolean getHardcoreStatLossEnabled() { -// return mcMMO.p.getGeneralConfig().getHardcoreStatLossEnabled(this); -// } -// -// public void setHardcoreStatLossEnabled(boolean enable) { -// mcMMO.p.getGeneralConfig().setHardcoreStatLossEnabled(this, enable); -// } -// -// public boolean getHardcoreVampirismEnabled() { -// return mcMMO.p.getGeneralConfig().getHardcoreVampirismEnabled(this); -// } -// -// public void setHardcoreVampirismEnabled(boolean enable) { -// mcMMO.p.getGeneralConfig().setHardcoreVampirismEnabled(this, enable); -// } -// -// public ToolType getTool() { -// return tool; -// } -// -// public List getSkillAbilities() { -// return subSkillTypes; -// } -// -// public double getXpModifier() { -// return ExperienceConfig.getInstance().getFormulaSkillModifier(this); -// } -// -// public static PrimarySkillType getSkill(String skillName) { -// if (!mcMMO.p.getGeneralConfig().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; -// } -// -// // TODO: This is a little "hacky", we probably need to add something to distinguish child skills in the enum, or to use another enum for them -// public boolean isChildSkill() { -// switch (this) { -// case SALVAGE: -// case SMELTING: -// return true; -// -// default: -// return false; -// } -// } -// -// public String getName() { -// return StringUtils.getCapitalized(LocaleLoader.getString(StringUtils.getCapitalized(this.toString()) + ".SkillName")); -// } -// -// public boolean getPermissions(Player player) { -// return Permissions.skillEnabled(player, this); -// } -// -// public boolean shouldProcess(Entity target) { -// return (target instanceof Player || (target instanceof Tameable && ((Tameable) target).isTamed())) ? getPVPEnabled() : getPVEEnabled(); -// } -// -// -//} +} \ No newline at end of file From 74d0d2c3f91a2a79880676f3464d78f425bb8d79 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 8 Apr 2021 13:22:46 -0700 Subject: [PATCH 479/662] Comment these out for now --- src/main/java/com/gmail/nossr50/mcMMO.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index 2b19e5761..766bd3b8a 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -156,15 +156,15 @@ public class mcMMO extends JavaPlugin { 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; +// 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; From 80aac93fd2223fc5f65a3a99b2d194408df7a8c1 Mon Sep 17 00:00:00 2001 From: lexikiq Date: Thu, 8 Apr 2021 16:25:24 -0400 Subject: [PATCH 480/662] Fix death messages losing formatting (#4482) --- .../nossr50/listeners/PlayerListener.java | 56 ++++++++++++------- 1 file changed, 35 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java index 16a50182b..74e155622 100644 --- a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java @@ -12,6 +12,7 @@ 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; @@ -35,6 +36,7 @@ import org.bukkit.GameMode; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.BlockState; +import org.bukkit.conversations.Conversation; import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.*; import org.bukkit.entity.minecart.PoweredMinecart; @@ -43,11 +45,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; @@ -104,36 +108,46 @@ 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; + if (!(event.getDamager() instanceof LivingEntity)) + return; + // 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; - String deathMessage = event.getDeathMessage(); + Player player = (Player) event.getEntity(); + LivingEntity attacker = (LivingEntity) event.getDamager(); - /* WORLD GUARD MAIN FLAG CHECK */ - if(WorldGuardUtils.isWorldGuardLoaded()) - { - if(!WorldGuardManager.getInstance().hasMainFlag(event.getEntity())) - return; - } - - if (deathMessage == null) { + // we only want to handle player deaths + if ((player.getHealth() - event.getFinalDamage()) > 0) return; - } - Player player = event.getEntity(); - event.setDeathMessage(MobHealthbarUtils.fixDeathMessage(deathMessage, player)); + // 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); } /** From 611705bce1bdfbb4e9e62d98a1d977fc043755d1 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 8 Apr 2021 13:26:22 -0700 Subject: [PATCH 481/662] Update changelog --- Changelog.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index 7e251df2a..6cb8262d3 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,6 +1,7 @@ Version 2.1.189 + Fixed a bug that would remove components from death messages when players were killed by mobs (thanks lexikiq) Removed MHD command (it didn't do anything for a while now) - Removed UP warning + Removed UltraPermissions warning Updated pl locale (Thanks Mich3l3k) Fixed an IllegalPluginAccessException error that could happen during server shutdown Minor performance optimizations to FlatFile database From ccf5f3001132f02d143d7f629b06eed76193d72c Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 8 Apr 2021 13:31:07 -0700 Subject: [PATCH 482/662] Add a test to FlatFileDatabaseManagerTest (more to come) --- .../database/FlatFileDatabaseManagerTest.java | 20 ++++++++----------- 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java b/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java index 97b235b65..f8eaa4ff2 100644 --- a/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java +++ b/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java @@ -6,6 +6,7 @@ import com.google.common.io.Files; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.junit.After; +import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -16,7 +17,6 @@ import java.io.*; import java.util.logging.Logger; -@PrepareForTest({GeneralConfig.class}) @RunWith(PowerMockRunner.class) public class FlatFileDatabaseManagerTest { @@ -28,14 +28,12 @@ public class FlatFileDatabaseManagerTest { @Before public void init() { - logger.info("Preparing new test..."); tempDir = Files.createTempDir(); flatFileDatabaseManager = new FlatFileDatabaseManager(tempDir.getPath() + File.separator + TEST_FILE_NAME, logger, PURGE_TIME, 0); } @After public void tearDown() { - logger.info("Tearing down after test..."); TestUtil.recursiveDelete(tempDir); flatFileDatabaseManager = null; } @@ -55,11 +53,10 @@ public class FlatFileDatabaseManagerTest { @Test public void testPurgePowerlessUsers() { -// logger.info("testPurgePowerlessUsers"); -// Assert.assertNotNull(flatFileDatabaseManager); -// addDataToFile(flatFileDatabaseManager, normalDatabaseData); -// int purgeCount = flatFileDatabaseManager.purgePowerlessUsers(); -// Assert.assertEquals(purgeCount, 1); //1 User should have been purged + Assert.assertNotNull(flatFileDatabaseManager); + addDataToFile(flatFileDatabaseManager, normalDatabaseData); + int purgeCount = flatFileDatabaseManager.purgePowerlessUsers(); + Assert.assertEquals(purgeCount, 1); //1 User should have been purged } private void addDataToFile(@NotNull FlatFileDatabaseManager flatFileDatabaseManager, @NotNull String[] dataEntries) { @@ -68,7 +65,6 @@ public class FlatFileDatabaseManagerTest { FileWriter out = null; try { - StringBuilder writer = new StringBuilder(); for(String data : dataEntries) { @@ -79,7 +75,7 @@ public class FlatFileDatabaseManagerTest { out.write(writer.toString()); } catch (FileNotFoundException e) { e.printStackTrace(); - logger.severe("File not found"); + System.out.println("File not found"); } catch (IOException e) { e.printStackTrace(); } finally { @@ -94,12 +90,12 @@ public class FlatFileDatabaseManagerTest { } try { - logger.info("Added the following lines to the FlatFileDatabase for the purposes of the test..."); + System.out.println("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); + System.out.println(line); } } catch (IOException e) { e.printStackTrace(); From e76fb9ab1badc9759c06bbecd59c437f1e020549 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 8 Apr 2021 13:36:18 -0700 Subject: [PATCH 483/662] Update changelog --- Changelog.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Changelog.txt b/Changelog.txt index 6cb8262d3..a8a6d90af 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -6,6 +6,8 @@ Version 2.1.189 Fixed an IllegalPluginAccessException error that could happen during server shutdown Minor performance optimizations to FlatFile database Refactored a lot of code + (API) PrimarySkillType is now just an enum with nothing special going on, SkillTools will facilitate what it used to do - see mcMMO::getSkillTools + Added unit tests for FlatFileDatabaseManager NOTES: Ultra Permissions is SAFE to use with mcMMO From 56f9341f8e4be8d4c41be1cb85f8d8154f04381c Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 9 Apr 2021 07:54:34 -0700 Subject: [PATCH 484/662] Add mcMMO_Region_System.Enabled to persistent_data.yml (removed from hidden config) --- Changelog.txt | 2 ++ .../nossr50/commands/skills/MmoInfoCommand.java | 1 - .../java/com/gmail/nossr50/config/HiddenConfig.java | 5 ----- .../gmail/nossr50/config/PersistentDataConfig.java | 5 +++++ .../gmail/nossr50/datatypes/skills/SubSkillType.java | 1 - .../nossr50/datatypes/skills/interfaces/Skill.java | 12 ------------ .../datatypes/skills/subskills/acrobatics/Roll.java | 5 ----- .../skills/secondaryabilities/SubSkillEvent.java | 1 - .../com/gmail/nossr50/listeners/PlayerListener.java | 1 - src/main/java/com/gmail/nossr50/mcMMO.java | 2 -- .../com/gmail/nossr50/skills/alchemy/Alchemy.java | 2 -- src/main/java/com/gmail/nossr50/util/EventUtils.java | 1 - .../nossr50/util/blockmeta/ChunkManagerFactory.java | 5 ++--- src/main/resources/persistent_data.yml | 7 ++++++- .../database/FlatFileDatabaseManagerTest.java | 2 -- 15 files changed, 15 insertions(+), 37 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index a8a6d90af..fdfa4aa63 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,4 +1,6 @@ Version 2.1.189 + 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) Fixed a bug that would remove components from death messages when players were killed by mobs (thanks lexikiq) Removed MHD command (it didn't do anything for a while now) Removed UltraPermissions warning 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 0c6436bf1..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,6 +1,5 @@ package com.gmail.nossr50.commands.skills; -import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.listeners.InteractionManager; import com.gmail.nossr50.locale.LocaleLoader; diff --git a/src/main/java/com/gmail/nossr50/config/HiddenConfig.java b/src/main/java/com/gmail/nossr50/config/HiddenConfig.java index d4b646fd3..54cdf0ff0 100644 --- a/src/main/java/com/gmail/nossr50/config/HiddenConfig.java +++ b/src/main/java/com/gmail/nossr50/config/HiddenConfig.java @@ -9,7 +9,6 @@ public class HiddenConfig { private static HiddenConfig instance; private final String fileName; private YamlConfiguration config; - private boolean chunkletsEnabled; private int conversionRate; private boolean useEnchantmentBuffs; @@ -30,15 +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); } } - public boolean getChunkletsEnabled() { - return chunkletsEnabled; - } public int getConversionRate() { return conversionRate; diff --git a/src/main/java/com/gmail/nossr50/config/PersistentDataConfig.java b/src/main/java/com/gmail/nossr50/config/PersistentDataConfig.java index 10a7adcfc..2f9a23066 100644 --- a/src/main/java/com/gmail/nossr50/config/PersistentDataConfig.java +++ b/src/main/java/com/gmail/nossr50/config/PersistentDataConfig.java @@ -34,4 +34,9 @@ public class PersistentDataConfig extends AutoUpdateConfigLoader { 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/datatypes/skills/SubSkillType.java b/src/main/java/com/gmail/nossr50/datatypes/skills/SubSkillType.java index 44d98b789..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,6 +1,5 @@ package com.gmail.nossr50.datatypes.skills; -import com.gmail.nossr50.datatypes.skills.interfaces.Skill; import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.text.StringUtils; diff --git a/src/main/java/com/gmail/nossr50/datatypes/skills/interfaces/Skill.java b/src/main/java/com/gmail/nossr50/datatypes/skills/interfaces/Skill.java index e2fdd0457..68cf7180e 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/skills/interfaces/Skill.java +++ b/src/main/java/com/gmail/nossr50/datatypes/skills/interfaces/Skill.java @@ -1,18 +1,6 @@ package com.gmail.nossr50.datatypes.skills.interfaces; 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.skills.SkillManager; -import com.gmail.nossr50.util.text.StringUtils; -import org.bukkit.entity.Entity; -import org.bukkit.entity.Player; -import org.jetbrains.annotations.NotNull; - -import java.util.List; public interface Skill { /** 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 4ce3a8671..1a1c99fc9 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 @@ -7,11 +7,8 @@ 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.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.skills.SkillManager; import com.gmail.nossr50.util.EventUtils; import com.gmail.nossr50.util.ItemUtils; import com.gmail.nossr50.util.Permissions; @@ -31,14 +28,12 @@ import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.SoundCategory; import org.bukkit.enchantments.Enchantment; -import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.event.Event; import org.bukkit.event.EventPriority; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.inventory.ItemStack; -import java.util.List; import java.util.Locale; public class Roll extends AcrobaticsSubSkill { 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 7c0fb4ea9..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,7 +1,6 @@ package com.gmail.nossr50.events.skills.secondaryabilities; import com.gmail.nossr50.datatypes.skills.SubSkillType; -import com.gmail.nossr50.datatypes.skills.interfaces.Skill; import com.gmail.nossr50.datatypes.skills.subskills.AbstractSubSkill; import com.gmail.nossr50.events.skills.McMMOPlayerSkillEvent; import com.gmail.nossr50.mcMMO; diff --git a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java index 74e155622..5bd715662 100644 --- a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java @@ -36,7 +36,6 @@ import org.bukkit.GameMode; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.BlockState; -import org.bukkit.conversations.Conversation; import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.*; import org.bukkit.entity.minecart.PoweredMinecart; diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index 766bd3b8a..719883444 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -9,9 +9,7 @@ import com.gmail.nossr50.config.mods.BlockConfigManager; import com.gmail.nossr50.config.mods.EntityConfigManager; import com.gmail.nossr50.config.mods.ToolConfigManager; import com.gmail.nossr50.config.skills.alchemy.PotionConfig; -import com.gmail.nossr50.config.skills.repair.RepairConfig; import com.gmail.nossr50.config.skills.repair.RepairConfigManager; -import com.gmail.nossr50.config.skills.salvage.SalvageConfig; import com.gmail.nossr50.config.skills.salvage.SalvageConfigManager; import com.gmail.nossr50.config.treasure.FishingTreasureConfig; import com.gmail.nossr50.config.treasure.TreasureConfig; 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 8cb825f48..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,9 +1,7 @@ package com.gmail.nossr50.skills.alchemy; -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; diff --git a/src/main/java/com/gmail/nossr50/util/EventUtils.java b/src/main/java/com/gmail/nossr50/util/EventUtils.java index d97c1c0ad..e6d697852 100644 --- a/src/main/java/com/gmail/nossr50/util/EventUtils.java +++ b/src/main/java/com/gmail/nossr50/util/EventUtils.java @@ -8,7 +8,6 @@ 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.datatypes.skills.SuperAbilityType; -import com.gmail.nossr50.datatypes.skills.interfaces.Skill; import com.gmail.nossr50.datatypes.skills.subskills.AbstractSubSkill; import com.gmail.nossr50.events.experience.McMMOPlayerLevelChangeEvent; import com.gmail.nossr50.events.experience.McMMOPlayerLevelDownEvent; diff --git a/src/main/java/com/gmail/nossr50/util/blockmeta/ChunkManagerFactory.java b/src/main/java/com/gmail/nossr50/util/blockmeta/ChunkManagerFactory.java index e2c47662e..a1e61fd5c 100644 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/ChunkManagerFactory.java +++ b/src/main/java/com/gmail/nossr50/util/blockmeta/ChunkManagerFactory.java @@ -1,13 +1,12 @@ package com.gmail.nossr50.util.blockmeta; -import com.gmail.nossr50.config.HiddenConfig; +import com.gmail.nossr50.config.PersistentDataConfig; import org.jetbrains.annotations.NotNull; public class ChunkManagerFactory { public static @NotNull ChunkManager getChunkManager() { - HiddenConfig hConfig = HiddenConfig.getInstance(); - if (hConfig.getChunkletsEnabled()) { + if (PersistentDataConfig.getInstance().useBlockTracker()) { return new HashChunkManager(); } diff --git a/src/main/resources/persistent_data.yml b/src/main/resources/persistent_data.yml index 6b39879cd..8508ab84f 100644 --- a/src/main/resources/persistent_data.yml +++ b/src/main/resources/persistent_data.yml @@ -29,4 +29,9 @@ Persistent_Data: 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 \ No newline at end of file + 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/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java b/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java index f8eaa4ff2..57efb3381 100644 --- a/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java +++ b/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java @@ -1,7 +1,6 @@ package com.gmail.nossr50.database; import com.gmail.nossr50.TestUtil; -import com.gmail.nossr50.config.GeneralConfig; import com.google.common.io.Files; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -10,7 +9,6 @@ import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; import java.io.*; From e7978a6ad9468d9e09a3bd528e95a91cb5a3576f Mon Sep 17 00:00:00 2001 From: lexikiq Date: Fri, 9 Apr 2021 10:59:42 -0400 Subject: [PATCH 485/662] Fix deaths from skeletons showing health bars (#4483) * Fix deaths from skeletons showing health bars * Ignore human attackers --- .../nossr50/listeners/PlayerListener.java | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java index 5bd715662..f487a09ef 100644 --- a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java @@ -121,8 +121,21 @@ public class PlayerListener implements Listener { // we only care about players as this is for fixing player death messages if (!(event.getEntity() instanceof Player)) return; - if (!(event.getDamager() instanceof LivingEntity)) + 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; + + if (attacker instanceof HumanEntity) + return; + // world blacklist check if (WorldBlacklist.isWorldBlacklisted(event.getEntity().getWorld())) return; @@ -130,9 +143,6 @@ public class PlayerListener implements Listener { if (WorldGuardUtils.isWorldGuardLoaded() && !WorldGuardManager.getInstance().hasMainFlag((Player) event.getEntity())) return; - Player player = (Player) event.getEntity(); - LivingEntity attacker = (LivingEntity) event.getDamager(); - // we only want to handle player deaths if ((player.getHealth() - event.getFinalDamage()) > 0) return; From 6d057c577e7e91c163a57309d10b746926f576f0 Mon Sep 17 00:00:00 2001 From: Anseba <80766583+xAnseba@users.noreply.github.com> Date: Fri, 9 Apr 2021 18:37:21 +0200 Subject: [PATCH 486/662] Fixed minor mistakes in locale_de.properties (#4484) * Update locale_de.properties --- .../resources/locale/locale_de.properties | 140 +++++++++--------- 1 file changed, 70 insertions(+), 70 deletions(-) diff --git a/src/main/resources/locale/locale_de.properties b/src/main/resources/locale/locale_de.properties index 87cfc4240..74333581c 100644 --- a/src/main/resources/locale/locale_de.properties +++ b/src/main/resources/locale/locale_de.properties @@ -94,10 +94,10 @@ Broadcasts.LevelUpMilestone = &6(&amcMMO&6) {0}&7 hat nun Level &a{1}&7 mit der Chat.Channel.Off = &6(&amcMMO-Chat&6) &7Deine Nachrichten werden nicht l\u00E4nger automatisch an die spezifischen Kan\u00E4le 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\u2192�� &r{1} -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.Spy.Party = &6[&eSPION&6-&a{2}&6] &r{0} &b\u2192 &r{1} +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} Combat.ArrowDeflect = &a&o**Pfeil abgelenkt** Combat.BeastLore = &a&o**Biestkunde** @@ -112,9 +112,9 @@ Combat.TouchedFuzzy = &a&o**Du wurdest ungl\u00FCcklich ber\u00FChrt, ein Schwin 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.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 @@ -137,7 +137,7 @@ Commands.Description.mcability = Schalte die Bereitschaft von F\u00E4higkeiten b 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.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. @@ -151,7 +151,7 @@ Commands.Description.mctop = Zeige die Skill-Bestenlisten. Commands.Description.mmocompat = Informationen dar\u00FCber, ob mcMMO im Kompatibilit\u00E4tsmodus oder voll funktionsf\u00E4hig ist. Commands.Description.mmodebug = (De)aktiviere den Debugging-Modus, welcher n\u00FCtzliche Informationen ausgibt, wenn du einen Block schl\u00E4gst. Commands.Description.mmoedit = Editiere die Skill-Level eines Spielers. -Commands.Description.mmoinfo = Lese Details \u00FCber einen Skill oder andere Funktionen. +Commands.Description.mmoinfo = Zeige Details \u00FCber 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\u00FCr die mcMMO Erfahrungsleisten. @@ -174,7 +174,7 @@ Commands.GodMode.Forbidden = [mcMMO] Der Godmode ist in dieser Welt nicht erlaub 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.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. @@ -184,25 +184,25 @@ 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.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\u00F6glicht eine schnellere Ver\u00F6ffentlichung neuer mcMMO-Skills und eine gr\u00F6ßere Flexibilit\u00E4t 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\u00FCckg\u00E4ngig zu machen. Wenn der Debugging-Modus aktiviert wurde kannst du Bl\u00F6cke schlagen, um n\u00FCtzliche Informationen zu erhalten. Dies ist f\u00FCr den Support sehr n\u00FCtzlich. 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.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.AlreadyAllies = Deine Party ist bereits in einem B\u00FCndnis. Trenne es mit&3/party alliance disband&e. 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.Help.1 = &c Zum Verb\u00FCnden: &3/party alliance invite &c. +Commands.Party.Alliance.Invite.0 = ACHTUNG: &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[]----- @@ -216,7 +216,7 @@ 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.0 = ACHTUNG: &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}) @@ -231,7 +231,7 @@ 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.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} @@ -245,11 +245,11 @@ Commands.Party2 = &a- Tritt der Party eines Spielers bei. Commands.PowerLevel = &4Gesamtlevel: &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.Reset = &a- Setze ein Skill-Level auf 0 +Commands.Reset.All = &aAlle deine Skill-Level wurden erfolgreich zur\u00FCckgesetzt. +Commands.Reset.Single = &aDein {0} Skill-Level 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.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 @@ -281,10 +281,10 @@ Commands.Usage.Rate = Rate Commands.Usage.Skill = Skill Commands.Usage.SubSkill = F\u00E4higkeit Commands.Usage.XP = Erfahrung -Commands.XPBar.DisableAll = &6Alle mcMMO Erfahrungsleisten wurden deaktiviert, benutze /mmoxpbar reset um die Standardeinstellungen wiederherzustellen. +Commands.XPBar.DisableAll = &6Alle mcMMO Erfahrungsleisten wurden deaktiviert, benutze &c/mmoxpbar reset&6 um die Standardeinstellungen wiederherzustellen. Commands.XPBar.Reset = &6Die Erfahrungsleisten-Einstellungen f\u00FCr mcMMO wurden zur\u00FCckgesetzt. Commands.XPBar.SettingChanged = &6Die Erfahrungsleisten-Einstellungen f\u00FCr &a{0}&6 wurden gesetzt auf: &a{1} -Commands.XPBar.Usage = Die korrekte Verwendung ist /mmoxpbar +Commands.XPBar.Usage = Die korrekte Verwendung ist &a/mmoxpbar Commands.XPGain = &8XP-Zuwachs: &f{0} Commands.XPGain.Acrobatics = Fallen Commands.XPGain.Alchemy = Tr\u00E4nke brauen @@ -316,7 +316,7 @@ Commands.mcconvert.Experience.Finish = &7Konvertierung vollendet - es wird jetzt 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.mcgod = &a- Schalte den 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=- @@ -339,19 +339,19 @@ Commands.ptp.Enabled = Party-Teleportierung &aaktiviert Commands.ptp.NoRequests = Du hast aktuell keine Teleportierungsanfragen. 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.Request2 = &aZum Teleportieren tippe &e/ptp accept&a. Die Anfrage l\u00E4uft 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\u00FCr Skills 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.0 = &cKorrekte Eingabe f\u00FCr Erfahrungsratenwechsel: /xprate +Commands.xprate.proper.1 = &cKorrekte Eingabe f\u00FCr R\u00FCcksetzung 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\u00FCr Skills hat begonnen! Commands.xprate.started.1 = &6Die Erfahrungsrate f\u00FCr Skills liegt jetzt bei {0}x! -Compatibility.Layer.PartialSupport = &6Diese Version besitzt keine vollst\u00E4ndige Unterst\u00FCtzung f\u00FCr &a{0}&6, jedoch verwendet mcMMO ein System, was die fehlenden Features versucht zu emulieren. +Compatibility.Layer.PartialSupport = &6Diese Version besitzt keine vollst\u00E4ndige Unterst\u00FCtzung f\u00FCr &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. Effects.Child.Overhaul = &3Unterskill Level&e {0}&3: {1} @@ -375,7 +375,7 @@ Excavation.SubSkill.Archaeology.Description = Ergrabe die Sch\u00E4tze der Unter Excavation.SubSkill.Archaeology.Name = Arch\u00E4ologie Excavation.SubSkill.Archaeology.Stat = Arch\u00E4ologie Erfahrungspunkte-Chance Excavation.SubSkill.Archaeology.Stat.Extra = Arch\u00E4ologie Erfahrungspunkte-Anzahl -Excavation.SubSkill.GigaDrillBreaker.Description = Dreifache Droprate, dreifache Erfahrung und Bonus-Geschwindigkeit. +Excavation.SubSkill.GigaDrillBreaker.Description = Dreifache Droprate, dreifache Erfahrung und Bonus-Abbaugeschwindigkeit. Excavation.SubSkill.GigaDrillBreaker.Name = Gigabohrer Excavation.SubSkill.GigaDrillBreaker.Stat = Gigabohrer-Dauer @@ -395,8 +395,8 @@ 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.FishermansDiet.Stat = Fischers-Di\u00E4t:&a Rang {0} +Fishing.SubSkill.IceFishing.Description = Erm\u00F6glicht es dir in Eisbiomen zu angeln. Fishing.SubSkill.IceFishing.Name = Eisangeln Fishing.SubSkill.IceFishing.Stat = Eisangeln Fishing.SubSkill.MagicHunter.Description = Finde verzauberte Gegenst\u00E4nde. @@ -406,7 +406,7 @@ Fishing.SubSkill.MasterAngler.Description = Fische k\u00F6nnen h\u00E4ufiger gef 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 = Rei\u00DFe mit deiner Angel Gegenst\u00E4nde weg von Lebewesen und Spielern. +Fishing.SubSkill.Shake.Description = Entrei\u00DFe Lebewesen und Spielern mit deiner Angel Gegenst\u00E4nde. Fishing.SubSkill.Shake.Name = Rei\u00DFen Fishing.SubSkill.Shake.Stat = Rei\u00DFen Chance Fishing.SubSkill.TreasureHunter.Description = Angle verschiedene Objekte. @@ -414,10 +414,10 @@ 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}\n&9Selten: &e{2} &dEpisch: &e{3} &6Legend\u00E4r: &e{4} &bMythic: &e{5} -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.0 = &3\u00DCber 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\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 die Schleichen-Taste 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.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. Guides.Alchemy.Section.2 = &3Wie funktioniert Gebr\u00E4u?\n&eGebr\u00E4u 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 freizuschalten. Guides.Alchemy.Section.3 = &3Gebr\u00E4u 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) @@ -425,23 +425,23 @@ Guides.Alchemy.Section.4 = &3Gebr\u00E4u Tier 2 Zutaten:\n&eKarotte (Eile)\n&eSc Guides.Alchemy.Section.5 = &3Gebr\u00E4u Tier 4 Zutaten:\n&eApfel (Gesundheitsboost)\n&eVerrottetes Fleisch (Hunger)\n\n&3Gebr\u00E4u Tier 5 Zutaten:\n&eBrauner Pilz(\u00DCbelkeit)\n&eTintensack (Blindheit) Guides.Alchemy.Section.6 = &3Gebr\u00E4u Tier 6 Zutaten:\n&eGras (S\u00E4ttigung)\n\n&3Gebr\u00E4u Tier 7 Zutaten:\n&eGiftige Kartoffel (Verwesung)\n\n&3Gebr\u00E4u 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.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.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.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.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.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&eFange 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. @@ -449,15 +449,15 @@ Guides.Fishing.Section.4 = &3Wie funktioniert Rei\u00DFen?\n&eDiese F\u00E4higke 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\u00DCber Kr\u00E4uterkunde\n&eIn Kr\u00E4uterkunde geht es um das Ernten.\n\n&3XP ZUWACHS:\n&eErnte Pflanzen. +Guides.Herbalism.Section.0 = &3\u00DCber Kr\u00E4uterkunde\n&eIn Kr\u00E4uterkunde geht es um das Ernten.\n\n&3XP-Zuwachs:\n&eErnte Pflanzen. Guides.Herbalism.Section.1 = &3Kompatible Pflanzen:\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 einzuhauchen 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\u00E4uterkunde 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\u00E4uterkunde-Level ab. +Guides.Herbalism.Section.4 = &3Wie funktioniert der Gr\u00FCne Daumen (Bl\u00F6cke)?\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\u00E4uterkunde-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 Bl\u00F6cke geben XP. +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 Bl\u00F6cke 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\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 der Super-Brecher\n&eaktiviert. Guides.Mining.Section.3 = &3Was ist der 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. @@ -465,45 +465,45 @@ Guides.Mining.Section.4 = &3Wie benutzt man Z\u00FCndstoff?:\n&eHalte eine Spitz 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\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 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.0 = &3\u00DCber 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\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 werden, 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.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&eVerwerten wir eine Goldspitzhacke 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.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.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.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.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 Materialien 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 bekommst XP f\u00FCr das Abholzen von Baumst\u00E4mmen. +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 bekommst 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. 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.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. @@ -511,14 +511,14 @@ Hardcore.Vampirism.Killer.Success = &6[mcMMO] &3Du hast &9{0}&3 Level von &e{1} 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! +Hardcore.Vampirism.Victim.Success = &6[mcMMO] &e{0}&4 hat &9{1}&4 Level von dir gestohlen! Herbalism.Ability.GTe.NeedMore = Du brauchst mehr Samen um Gr\u00FCnes Land zu verbreiten. Herbalism.Ability.GTh = &a**Gr\u00FCner Daumen** Herbalism.Ability.GTh.Fail = **Gr\u00FCner 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\u00FCne Zehe gescheitert** +Herbalism.Ability.ShroomThumb.Fail = **Gr\u00FCner Daumen gescheitert** Herbalism.Effect.4 = Gr\u00FCner Daumen Herbalism.HylianLuck = &aHeute ist das Gl\u00FCck von Hyrule mit dir! Herbalism.Listener = Kr\u00E4uterkunde: @@ -546,10 +546,10 @@ Herbalism.SubSkill.HylianLuck.Description = Gibt eine kleine M\u00F6glichkeit, s 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 +Herbalism.SubSkill.ShroomThumb.Name = Pilz-Daumen +Herbalism.SubSkill.ShroomThumb.Stat = Pilz-Daumen Chance -Holiday.Anniversary = &9Alles gute zu mcMMO's {0} j\u00E4hrigen Geburtstag!\n&9In Ehren von nossr50 und all den anderen flei\u00DFigen Entwicklern, hier ist eine kleine Feuerwerk Show! +Holiday.Anniversary = &9Alles Gute zu mcMMO's {0} j\u00E4hrigen Geburtstag!\n&9In Ehren von nossr50 und all den anderen flei\u00DFigen 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! @@ -561,7 +561,7 @@ Item.ChimaeraWing.Fail = &c**Chimaera Fl\u00FCgel 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.ChimaeraWing.Pass = **Chimarea Fl\u00FCgel** 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 @@ -620,14 +620,14 @@ JSON.Woodcutting = Holzf\u00E4llen LevelCap.PowerLevel = &6(&amcMMO&6) &eDu hast das Level-Limit von &c{0}&e erreicht. Du kannst deine F\u00E4higkeiten nun nicht mehr weiter verbessern. LevelCap.Skill = &6(&amcMMO&6) &eDu hast das Level-Limit von &c{0}&e f\u00FCr &6{1}&e erreicht. Du kannst diese F\u00E4higkeit von nun an nicht mehr weiter verbessern. -Locale.Reloaded = &aDie Sprachdateien wurden neugeladen! +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 = &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 @@ -648,7 +648,7 @@ 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\u00F6ht den Explosions-Radius. +Mining.SubSkill.BiggerBombs.Description = Erh\u00F6ht den Explosionsradius. Mining.SubSkill.BiggerBombs.Name = Sprengmeister Mining.SubSkill.BlastMining.Description = Bonus beim Abbauen mit TNT. Mining.SubSkill.BlastMining.Name = Z\u00FCndstoff @@ -785,7 +785,7 @@ Profile.Loading.FailurePlayer = &cmcMMO hat Probleme beim Laden deiner Daten nac Profile.Loading.Success = &aDein Profil wurde geladen. Profile.PendingLoad = &cDeine mcMMO Daten wurden noch nicht geladen. -Reminder.Squelched = &7Erinnerung: Du erh\u00E4lst aktuell keinerlei Benachrichtigungen von mcMMO, um dies zu \u00E4ndern, nutze den /mcnotify Befehl. Dies ist eine st\u00FCndliche, automatische Erinnerung. +Reminder.Squelched = &7Erinnerung: Du erh\u00E4ltst aktuell keinerlei Benachrichtigungen von mcMMO, um dies zu \u00E4ndern, nutze den /mcnotify Befehl. Dies ist eine st\u00FCndliche, automatische Erinnerung. Repair.Arcane.Downgrade = Zauber-Wert des Gegenstands vermindert. Repair.Arcane.Fail = Der Gegenstands wurde entzaubert. @@ -863,7 +863,7 @@ Scoreboard.Misc.CurrentXP = &aAktuelle XP Scoreboard.Misc.Level = &3Level Scoreboard.Misc.Overall = &6Insgesamt Scoreboard.Misc.PowerLevel = &6Gesamt-Level -Scoreboard.Misc.RemainingXP = Verbliebene XP +Scoreboard.Misc.RemainingXP = Verbleibende XP Server.ConsoleName = &e[Server] @@ -890,7 +890,7 @@ 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.Description = M\u00F6glichkeit, um 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. @@ -936,7 +936,7 @@ Swords.SubSkill.Rupture.Stat.Extra = Entzweiung: &a{0} ticks [{1} Schaden gegen 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.Description = F\u00FCgt deinem Angriff extra Schaden hinzu. Swords.SubSkill.Stab.Name = Erstechen Swords.SubSkill.Stab.Stat = Schaden durch Erstechen Swords.SubSkill.SwordsLimitBreak.Description = \u00DCberschreite deine Grenzen. @@ -946,7 +946,7 @@ Swords.SubSkill.SwordsLimitBreak.Stat = Bonus-Schaden durch \u00DCberwindung 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.11 = Regenerierung ist 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 @@ -968,7 +968,7 @@ 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.Description.2 = &7Ruf der Wildnis: 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 Fallschaden Taming.SubSkill.EnvironmentallyAware.Name = Umweltbewusst @@ -1004,11 +1004,11 @@ 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&o**Du senkst deine F\u00E4uste.** -Unarmed.Ability.Ready = &a&o**Du hebste deine F\u00E4uste...** +Unarmed.Ability.Ready = &a&o**Du hebst deine F\u00E4uste...** Unarmed.Listener = Faustkampf: Unarmed.SkillName = Faustkampf Unarmed.Skills.Berserk.Off = **Berserker ausgelaufen** -Unarmed.Skills.Berserk.On = &a**Berserker aktiviertT** +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! @@ -1020,7 +1020,7 @@ 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.Description = L\u00E4sst den Gegenstand aus der Hand des Feindes fallen. Unarmed.SubSkill.Disarm.Name = Entwaffnen Unarmed.SubSkill.Disarm.Stat = Entwaffnen Chance Unarmed.SubSkill.IronGrip.Description = Sch\u00FCtzt dich davor, entwaffnet zu werden. From c1c32cb1fd745f799c4a8f0af5f456d75253e253 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 9 Apr 2021 10:19:34 -0700 Subject: [PATCH 487/662] Fix mcMMO saving copies of config files into the main server directory instead of the correct place --- .../config/AutoUpdateConfigLoader.java | 24 +++++++++----- .../gmail/nossr50/config/ConfigLoader.java | 33 ++++++++++--------- .../com/gmail/nossr50/config/RankConfig.java | 8 ++--- .../com/gmail/nossr50/config/SoundConfig.java | 5 +-- .../config/mods/CustomArmorConfig.java | 5 +-- .../config/mods/CustomBlockConfig.java | 3 +- .../config/mods/CustomEntityConfig.java | 7 ++-- .../nossr50/config/mods/CustomToolConfig.java | 5 +-- .../config/skills/repair/RepairConfig.java | 2 +- .../config/skills/salvage/SalvageConfig.java | 6 ++-- .../treasure/FishingTreasureConfig.java | 2 +- .../nossr50/skills/child/ChildConfig.java | 8 ++--- .../nossr50/util/upgrade/UpgradeManager.java | 5 +-- 13 files changed, 64 insertions(+), 49 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/config/AutoUpdateConfigLoader.java b/src/main/java/com/gmail/nossr50/config/AutoUpdateConfigLoader.java index 30fa038cb..f2c936a56 100644 --- a/src/main/java/com/gmail/nossr50/config/AutoUpdateConfigLoader.java +++ b/src/main/java/com/gmail/nossr50/config/AutoUpdateConfigLoader.java @@ -1,5 +1,6 @@ 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; @@ -31,7 +32,7 @@ public abstract class AutoUpdateConfigLoader extends ConfigLoader { protected void saveConfig() { try { - plugin.getLogger().info("Saving changes to config file - "+fileName); + mcMMO.p.getLogger().info("Saving changes to config file - "+fileName); config.save(configFile); } catch (IOException e) { e.printStackTrace(); @@ -39,13 +40,13 @@ public abstract class AutoUpdateConfigLoader extends ConfigLoader { } protected @NotNull FileConfiguration getInternalConfig() { - return YamlConfiguration.loadConfiguration(plugin.getResourceAsReader(fileName)); + 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); @@ -65,12 +66,12 @@ public abstract class AutoUpdateConfigLoader extends ConfigLoader { } // // for (String key : oldKeys) { -// plugin.debug("Detected potentially unused key: " + key); +// mcMMO.p.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)); } @@ -89,7 +90,7 @@ public abstract class AutoUpdateConfigLoader extends ConfigLoader { // 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))); + BufferedReader reader = new BufferedReader(new InputStreamReader(mcMMO.p.getResource(fileName))); LinkedHashMap comments = new LinkedHashMap<>(); StringBuilder temp = new StringBuilder(); @@ -139,14 +140,21 @@ public abstract class AutoUpdateConfigLoader extends ConfigLoader { } // 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(dataFolder, saveName))); + File newSaveFile = new File(dataFolder, saveName); + FileWriter fileWriter = new FileWriter(newSaveFile.getAbsolutePath()); + BufferedWriter writer = new BufferedWriter(fileWriter); writer.write(output); writer.flush(); writer.close(); diff --git a/src/main/java/com/gmail/nossr50/config/ConfigLoader.java b/src/main/java/com/gmail/nossr50/config/ConfigLoader.java index 4a168fa50..a1c75058d 100644 --- a/src/main/java/com/gmail/nossr50/config/ConfigLoader.java +++ b/src/main/java/com/gmail/nossr50/config/ConfigLoader.java @@ -9,11 +9,10 @@ import java.io.File; import java.util.List; public abstract class ConfigLoader { - protected static final mcMMO plugin = mcMMO.p; protected String fileName; protected final File configFile; protected FileConfiguration config; - protected @NotNull File dataFolder; + protected @NotNull final File dataFolder; public ConfigLoader(String relativePath, String fileName, @NotNull File dataFolder) { this.fileName = fileName; @@ -33,6 +32,7 @@ public abstract class ConfigLoader { 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(); } @@ -40,22 +40,23 @@ public abstract class ConfigLoader { public ConfigLoader(String fileName) { this.fileName = 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.debug("Creating mcMMO " + fileName + " File..."); try { - plugin.saveResource(fileName, false); // Normal files + mcMMO.p.saveResource(fileName, false); // Normal files } catch (IllegalArgumentException ex) { - plugin.saveResource(configFile.getParentFile().getName() + File.separator + fileName, false); // Mod files + mcMMO.p.saveResource(configFile.getParentFile().getName() + File.separator + fileName, false); // Mod files } } else { - plugin.debug("Loading mcMMO " + fileName + " File..."); + mcMMO.p.debug("Loading mcMMO " + fileName + " File..."); } config = YamlConfiguration.loadConfiguration(configFile); @@ -69,7 +70,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(); @@ -77,12 +78,12 @@ public abstract class ConfigLoader { protected void validate() { if (validateKeys()) { - plugin.debug("No errors found in " + fileName + "!"); + mcMMO.p.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.getLogger().warning("Errors were found in " + fileName + "! mcMMO was disabled!"); + mcMMO.p.getServer().getPluginManager().disablePlugin(mcMMO.p); + mcMMO.p.noErrorsInConfigFiles = false; } } @@ -91,16 +92,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/RankConfig.java b/src/main/java/com/gmail/nossr50/config/RankConfig.java index 9bdf00947..d164d64ca 100644 --- a/src/main/java/com/gmail/nossr50/config/RankConfig.java +++ b/src/main/java/com/gmail/nossr50/config/RankConfig.java @@ -127,7 +127,7 @@ public class RankConfig extends AutoUpdateConfigLoader { String key = getRankAddressKey(subSkillType, rank, retroMode); int defaultValue = getInternalConfig().getInt(key); config.set(key, defaultValue); - plugin.getLogger().info(key +" SET -> " + defaultValue); + mcMMO.p.getLogger().info(key +" SET -> " + defaultValue); } /** @@ -145,10 +145,10 @@ public class RankConfig extends AutoUpdateConfigLoader { if(badSkillSetup.isEmpty()) return; - plugin.getLogger().info("(FIXING CONFIG) mcMMO is correcting a few mistakes found in your skill rank config setup"); + mcMMO.p.getLogger().info("(FIXING CONFIG) mcMMO is correcting a few mistakes found in your skill rank config setup"); for(SubSkillType subSkillType : badSkillSetup) { - plugin.getLogger().info("(FIXING CONFIG) Resetting rank config settings for skill named - "+subSkillType.toString()); + mcMMO.p.getLogger().info("(FIXING CONFIG) Resetting rank config settings for skill named - "+subSkillType.toString()); fixBadEntries(subSkillType); } } @@ -180,7 +180,7 @@ public class RankConfig extends AutoUpdateConfigLoader { if(prevRank > curRank) { //We're going to allow this but we're going to warn them - plugin.getLogger().info("(CONFIG ISSUE) 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.toString()+" set up poorly, sequential ranks should have ascending requirements"); badSkillSetup.add(subSkillType); } } diff --git a/src/main/java/com/gmail/nossr50/config/SoundConfig.java b/src/main/java/com/gmail/nossr50/config/SoundConfig.java index 734e770aa..61960803d 100644 --- a/src/main/java/com/gmail/nossr50/config/SoundConfig.java +++ b/src/main/java/com/gmail/nossr50/config/SoundConfig.java @@ -1,5 +1,6 @@ package com.gmail.nossr50.config; +import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.sounds.SoundType; public class SoundConfig extends AutoUpdateConfigLoader { @@ -31,7 +32,7 @@ public class SoundConfig extends AutoUpdateConfigLoader { { if(config.getDouble("Sounds."+soundType.toString()+".Volume") < 0) { - plugin.getLogger().info("[mcMMO] Sound volume cannot be below 0 for "+soundType.toString()); + mcMMO.p.getLogger().info("[mcMMO] Sound volume cannot be below 0 for "+soundType.toString()); return false; } @@ -40,7 +41,7 @@ public class SoundConfig extends AutoUpdateConfigLoader { { if(config.getDouble("Sounds."+soundType.toString()+".Pitch") < 0) { - plugin.getLogger().info("[mcMMO] Sound pitch cannot be below 0 for "+soundType.toString()); + mcMMO.p.getLogger().info("[mcMMO] Sound pitch cannot be below 0 for "+soundType.toString()); return false; } } 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 76686f82d..94c30580a 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; @@ -62,7 +63,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 +71,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..881b483fe 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; @@ -66,7 +67,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; } 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 549836152..64155043d 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; @@ -32,8 +33,8 @@ public class CustomEntityConfig extends ConfigLoader { 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."); + 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 +49,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 104fb3726..28dd85b58 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; @@ -70,7 +71,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 +79,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/skills/repair/RepairConfig.java b/src/main/java/com/gmail/nossr50/config/skills/repair/RepairConfig.java index c5ff8846c..02066fc98 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 @@ -182,7 +182,7 @@ public class RepairConfig extends ConfigLoader { 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/salvage/SalvageConfig.java b/src/main/java/com/gmail/nossr50/config/skills/salvage/SalvageConfig.java index 66e107d09..47bc7acea 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 @@ -200,12 +200,12 @@ public class SalvageConfig extends ConfigLoader { 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/treasure/FishingTreasureConfig.java b/src/main/java/com/gmail/nossr50/config/treasure/FishingTreasureConfig.java index bfd814889..dc129344d 100755 --- a/src/main/java/com/gmail/nossr50/config/treasure/FishingTreasureConfig.java +++ b/src/main/java/com/gmail/nossr50/config/treasure/FishingTreasureConfig.java @@ -348,7 +348,7 @@ public class FishingTreasureConfig extends ConfigLoader { Enchantment enchantment = EnchantmentUtils.getByName(enchantmentName); if (enchantment == null) { - plugin.getLogger().warning("Skipping invalid enchantment in " + FILENAME + ": " + enchantmentName); + mcMMO.p.getLogger().warning("Skipping invalid enchantment in " + FILENAME + ": " + enchantmentName); continue; } 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 3ac703ec8..4944fb97c 100644 --- a/src/main/java/com/gmail/nossr50/skills/child/ChildConfig.java +++ b/src/main/java/com/gmail/nossr50/skills/child/ChildConfig.java @@ -17,12 +17,12 @@ public class ChildConfig extends AutoUpdateConfigLoader { @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 : mcMMO.p.getSkillTools().CHILD_SKILLS) { - plugin.debug("Finding parents of " + skill.name()); + 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 @@ -34,7 +34,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; } @@ -53,7 +53,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/util/upgrade/UpgradeManager.java b/src/main/java/com/gmail/nossr50/util/upgrade/UpgradeManager.java index 55c747ffd..3ed01d378 100644 --- a/src/main/java/com/gmail/nossr50/util/upgrade/UpgradeManager.java +++ b/src/main/java/com/gmail/nossr50/util/upgrade/UpgradeManager.java @@ -2,6 +2,7 @@ package com.gmail.nossr50.util.upgrade; import com.gmail.nossr50.config.ConfigLoader; import com.gmail.nossr50.datatypes.database.UpgradeType; +import com.gmail.nossr50.mcMMO; import java.util.Arrays; import java.util.EnumSet; @@ -40,7 +41,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 +61,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()]))); } } From 29613bc3243dec61ca5b27cb8e5d7b2a32a808a3 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 9 Apr 2021 10:46:12 -0700 Subject: [PATCH 488/662] Add back and deprecate most of the members of PrimarySkillType --- Changelog.txt | 3 +- .../datatypes/skills/PrimarySkillType.java | 216 +++++++++++++++++- .../nossr50/listeners/BlockListener.java | 3 +- .../gmail/nossr50/util/skills/SkillTools.java | 37 +-- 4 files changed, 226 insertions(+), 33 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index fdfa4aa63..e801e84f4 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -8,7 +8,8 @@ Version 2.1.189 Fixed an IllegalPluginAccessException error that could happen during server shutdown Minor performance optimizations to FlatFile database Refactored a lot of code - (API) PrimarySkillType is now just an enum with nothing special going on, SkillTools will facilitate what it used to do - see mcMMO::getSkillTools + (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) Added unit tests for FlatFileDatabaseManager NOTES: 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 ceb75d12f..24f215191 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/skills/PrimarySkillType.java +++ b/src/main/java/com/gmail/nossr50/datatypes/skills/PrimarySkillType.java @@ -1,5 +1,15 @@ package com.gmail.nossr50.datatypes.skills; +import com.gmail.nossr50.config.GeneralConfig; +import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.util.Permissions; +import com.gmail.nossr50.util.skills.SkillTools; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + public enum PrimarySkillType { ACROBATICS, ALCHEMY, @@ -15,5 +25,209 @@ public enum PrimarySkillType { SWORDS, TAMING, UNARMED, - WOODCUTTING + WOODCUTTING; + + /* + * 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) + */ + + /** + * 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); + } + + /** + * 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 + */ + @Deprecated + public boolean isSuperAbilityUnlocked(@NotNull Player player) { return mcMMO.p.getSkillTools().isSuperAbilityUnlocked(this, player); } + + /** + * 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 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 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 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 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 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 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 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 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) { + return mcMMO.p.getSkillTools().matchSkill(skillName); + } + + /** + * 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() { + return mcMMO.p.getSkillTools().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) { + return mcMMO.p.getSkillTools().getPrimarySkillBySubSkill(subSkillType); + } + + /** + * 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 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); + } + + /** + * 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 mcMMO.p.getSkillTools().canCombatSkillsTrigger(this, target); + } } \ No newline at end of file diff --git a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java index f72a9409f..bdcb2833f 100644 --- a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java @@ -350,7 +350,8 @@ public class BlockListener implements Listener { } /* WOOD CUTTING */ - else if (BlockUtils.hasWoodcuttingXP(blockState) && ItemUtils.isAxe(heldItem) && Permissions.skillEnabled(player, PrimarySkillType.WOODCUTTING) && !mcMMO.getPlaceStore().isTrue(blockState)) { + else if (BlockUtils.hasWoodcuttingXP(blockState) && ItemUtils.isAxe(heldItem) + && Permissions.skillEnabled(player, PrimarySkillType.WOODCUTTING) && !mcMMO.getPlaceStore().isTrue(blockState)) { WoodcuttingManager woodcuttingManager = mcMMOPlayer.getWoodcuttingManager(); if (woodcuttingManager.canUseTreeFeller(heldItem)) { woodcuttingManager.processTreeFeller(blockState); diff --git a/src/main/java/com/gmail/nossr50/util/skills/SkillTools.java b/src/main/java/com/gmail/nossr50/util/skills/SkillTools.java index 4fe98d5f7..846c7c413 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/SkillTools.java +++ b/src/main/java/com/gmail/nossr50/util/skills/SkillTools.java @@ -267,7 +267,9 @@ public class SkillTools { } public boolean isSuperAbilityUnlocked(PrimarySkillType primarySkillType, Player player) { - return RankUtils.getRank(player, getSuperAbility(primarySkillType).getSubSkillTypeDefinition()) >= 1; + SuperAbilityType superAbilityType = mcMMO.p.getSkillTools().getSuperAbility(primarySkillType); + SubSkillType subSkillType = superAbilityType.getSubSkillTypeDefinition(); + return RankUtils.hasUnlockedSubskill(player, subSkillType); } public boolean getPVPEnabled(PrimarySkillType primarySkillType) { @@ -361,6 +363,10 @@ public class SkillTools { return "SuperAbility." + StringUtils.getPrettyCamelCaseName(superAbilityType) + ".Refresh"; } + public int getLevelCap(@NotNull PrimarySkillType primarySkillType) { + return mcMMO.p.getGeneralConfig().getLevelCap(primarySkillType); + } + /** * Get the permissions for this ability. * @@ -418,33 +424,4 @@ public class SkillTools { public @NotNull ImmutableList getMiscSkills() { return MISC_SKILLS; } - - // /** -// * Check if a block is affected by this ability. -// * -// * @param blockState the block to check -// * @param superAbilityType target super ability -// * @return true if the block is affected by this ability, false otherwise -// */ -// public boolean superAbilityBlockCheck(SuperAbilityType superAbilityType, BlockState blockState) { -// switch (superAbilityType) { -// case BERSERK: -// return (BlockUtils.affectedByGigaDrillBreaker(blockState) || blockState.getType() == Material.SNOW); -// -// case GIGA_DRILL_BREAKER: -// return BlockUtils.affectedByGigaDrillBreaker(blockState); -// -// case GREEN_TERRA: -// return BlockUtils.canMakeMossy(blockState); -// -// case SUPER_BREAKER: -// return BlockUtils.affectedBySuperBreaker(blockState); -// -// case TREE_FELLER: -// dfss -// -// default: -// return false; -// } -// } } From cfdcc9dee5a50f8d6c169578d5aa46280aa33de4 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 9 Apr 2021 10:48:08 -0700 Subject: [PATCH 489/662] Shorten notes --- Changelog.txt | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index e801e84f4..49a67eaaa 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -7,22 +7,17 @@ Version 2.1.189 Updated pl locale (Thanks Mich3l3k) Fixed an IllegalPluginAccessException error that could happen during server shutdown Minor performance optimizations to FlatFile database + Minor performance optimizations to misc parts of the codebase Refactored a lot of code (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) Added unit tests for FlatFileDatabaseManager NOTES: Ultra Permissions is SAFE to use with mcMMO 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. - UltraPermissions is as efficient as LuckPerms - I have done a lot of profiling of UltraPermissions via Spark in the last few hours, I also compared it to LuckPerms. I wasn't expecting it, but UltraPermissions runs just as fast as LuckPerms if not faster. So it has no performance issues whatsoever from my point of view. - - Use whatever permission plugin you like, there will be no difference between using LuckPerms or UltraPermissions with mcMMO. - - If you had issues with UltraPermissions please contact the UP devs - If you experience lag with mcMMO and UltraPermissions, we are trying to determine the culprit. It is likely the culprit is from another plugin doing bad things with the UltraPermissions API. Please get in contact with the UltraPermission devs if you run into issues ( @MATRIX | Timo K. & @Liz3 ). Neither I nor they can replicate it so we need you guys to provide more data. 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 From be44c0e417768c847b6460bea03587cd958847f4 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 9 Apr 2021 11:13:27 -0700 Subject: [PATCH 490/662] Update SkillTools --- .../com/gmail/nossr50/api/ExperienceAPI.java | 2 +- .../nossr50/database/SQLDatabaseManager.java | 2 +- .../nossr50/datatypes/player/McMMOPlayer.java | 14 ++-- .../datatypes/player/PlayerProfile.java | 2 +- .../datatypes/skills/PrimarySkillType.java | 5 +- .../datatypes/skills/SuperAbilityType.java | 2 +- .../skills/subskills/acrobatics/Roll.java | 2 +- .../nossr50/listeners/BlockListener.java | 12 +-- .../nossr50/listeners/PlayerListener.java | 12 +-- .../commands/McrankCommandDisplayTask.java | 2 +- .../nossr50/util/commands/CommandUtils.java | 5 +- .../util/experience/FormulaManager.java | 2 +- .../util/scoreboards/ScoreboardWrapper.java | 5 +- .../nossr50/util/skills/CombatUtils.java | 12 +-- .../gmail/nossr50/util/skills/SkillTools.java | 73 +++++++++++-------- .../nossr50/util/skills/SmeltingTracker.java | 3 +- 16 files changed, 81 insertions(+), 74 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/api/ExperienceAPI.java b/src/main/java/com/gmail/nossr50/api/ExperienceAPI.java index 81873a699..bc15b7043 100644 --- a/src/main/java/com/gmail/nossr50/api/ExperienceAPI.java +++ b/src/main/java/com/gmail/nossr50/api/ExperienceAPI.java @@ -802,7 +802,7 @@ public final class ExperienceAPI { * @throws InvalidSkillException if the given skill is not valid */ public static int getLevelCap(String skillType) { - return mcMMO.p.getGeneralConfig().getLevelCap(getSkillType(skillType)); + return mcMMO.p.getSkillTools().getLevelCap(getSkillType(skillType)); } /** diff --git a/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java index c218401a2..462fd6d66 100644 --- a/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java @@ -936,7 +936,7 @@ public final class SQLDatabaseManager implements DatabaseManager { if (mcMMO.p.getGeneralConfig().getTruncateSkills()) { for (PrimarySkillType skill : mcMMO.p.getSkillTools().NON_CHILD_SKILLS) { - int cap = mcMMO.p.getGeneralConfig().getLevelCap(skill); + 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(); 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 64f482fea..e851fb110 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java +++ b/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java @@ -252,7 +252,7 @@ public class McMMOPlayer implements Identified { NotificationManager.sendPlayerInformationChatOnly(player, "LevelCap.PowerLevel", String.valueOf(mcMMO.p.getGeneralConfig().getPowerLevelCap())); } else if(hasReachedLevelCap(primarySkillType)) { NotificationManager.sendPlayerInformationChatOnly(player, "LevelCap.Skill", - String.valueOf(mcMMO.p.getGeneralConfig().getLevelCap(primarySkillType)), + String.valueOf(mcMMO.p.getSkillTools().getLevelCap(primarySkillType)), mcMMO.p.getSkillTools().getLocalizedSkillName(primarySkillType)); } @@ -570,7 +570,7 @@ public class McMMOPlayer implements Identified { int powerLevel = 0; for (PrimarySkillType primarySkillType : mcMMO.p.getSkillTools().NON_CHILD_SKILLS) { - if (Permissions.skillEnabled(player, primarySkillType)) { + if (mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, primarySkillType)) { powerLevel += getSkillLevel(primarySkillType); } } @@ -588,7 +588,7 @@ public class McMMOPlayer implements Identified { if(hasReachedPowerLevelCap()) return true; - return getSkillLevel(primarySkillType) >= mcMMO.p.getGeneralConfig().getLevelCap(primarySkillType); + return getSkillLevel(primarySkillType) >= mcMMO.p.getSkillTools().getLevelCap(primarySkillType); } /** @@ -616,7 +616,7 @@ public class McMMOPlayer implements Identified { float splitXp = xp / parentSkills.size(); for (PrimarySkillType parentSkill : parentSkills) { - if (Permissions.skillEnabled(player, parentSkill)) { + if (mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, parentSkill)) { beginXpGain(parentSkill, splitXp, xpGainReason, xpGainSource); } } @@ -660,7 +660,7 @@ public class McMMOPlayer implements Identified { * @param xp Experience amount to add */ public void applyXpGain(PrimarySkillType primarySkillType, float xp, XPGainReason xpGainReason, XPGainSource xpGainSource) { - if (!Permissions.skillEnabled(player, primarySkillType)) { + if (!mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, primarySkillType)) { return; } @@ -837,7 +837,7 @@ public class McMMOPlayer implements Identified { */ private float modifyXpGain(PrimarySkillType primarySkillType, float xp) { //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.getGeneralConfig().getLevelCap(primarySkillType) <= getSkillLevel(primarySkillType)) + if ((mcMMO.p.getSkillTools().getLevelCap(primarySkillType) <= getSkillLevel(primarySkillType)) || (mcMMO.p.getGeneralConfig().getPowerLevelCap() <= getPowerLevel())) { return 0; } @@ -953,7 +953,7 @@ public class McMMOPlayer implements Identified { } public void processAbilityActivation(@NotNull PrimarySkillType primarySkillType) { - if (!Permissions.skillEnabled(getPlayer(), primarySkillType)) { + if (!mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(getPlayer(), primarySkillType)) { return; } 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 0b2b3cbb9..3fc0d6d70 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/player/PlayerProfile.java +++ b/src/main/java/com/gmail/nossr50/datatypes/player/PlayerProfile.java @@ -432,7 +432,7 @@ public class PlayerProfile { int sum = 0; for (PrimarySkillType parent : parents) { - sum += Math.min(getSkillLevel(parent), mcMMO.p.getGeneralConfig().getLevelCap(parent)); + 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/PrimarySkillType.java b/src/main/java/com/gmail/nossr50/datatypes/skills/PrimarySkillType.java index 24f215191..cad2245c1 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/skills/PrimarySkillType.java +++ b/src/main/java/com/gmail/nossr50/datatypes/skills/PrimarySkillType.java @@ -8,6 +8,7 @@ import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; +import java.util.ArrayList; import java.util.List; public enum PrimarySkillType { @@ -140,7 +141,7 @@ public enum PrimarySkillType { */ @Deprecated public List getSkillAbilities() { - return mcMMO.p.getSkillTools().getSubSkills(this); + return new ArrayList<>(mcMMO.p.getSkillTools().getSubSkills(this)); } /** @@ -217,7 +218,7 @@ public enum PrimarySkillType { */ @Deprecated public boolean getPermissions(Player player) { - return Permissions.skillEnabled(player, this); + return mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, this); } /** 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 72c9fee69..6e4de8d78 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/skills/SuperAbilityType.java +++ b/src/main/java/com/gmail/nossr50/datatypes/skills/SuperAbilityType.java @@ -111,7 +111,7 @@ public enum SuperAbilityType { } public int getCooldown() { - return mcMMO.p.getGeneralConfig().getCooldown(this); + return mcMMO.p.getSkillTools().getSuperAbilityCooldown(this); } public int getMaxLength() { 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 1a1c99fc9..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 @@ -83,7 +83,7 @@ public class Roll extends AcrobaticsSubSkill { entityDamageEvent.setCancelled(true); return true; } - } else if(Permissions.skillEnabled(player, PrimarySkillType.ACROBATICS)) { + } else if(mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, PrimarySkillType.ACROBATICS)) { //Give XP Anyways SkillUtils.applyXpGain(mcMMOPlayer, getPrimarySkill(), calculateRollXP(player, ((EntityDamageEvent) event).getFinalDamage(), false), XPGainReason.PVE); } diff --git a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java index bdcb2833f..4ac4cec47 100644 --- a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java @@ -228,10 +228,10 @@ public class BlockListener implements Listener { if(mcMMOPlayer == null) return; - if (blockState.getType() == Repair.anvilMaterial && Permissions.skillEnabled(player, PrimarySkillType.REPAIR)) { + if (blockState.getType() == Repair.anvilMaterial && mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, PrimarySkillType.REPAIR)) { mcMMOPlayer.getRepairManager().placedAnvilCheck(); } - else if (blockState.getType() == Salvage.anvilMaterial && Permissions.skillEnabled(player, PrimarySkillType.SALVAGE)) { + else if (blockState.getType() == Salvage.anvilMaterial && mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, PrimarySkillType.SALVAGE)) { mcMMOPlayer.getSalvageManager().placedAnvilCheck(); } } @@ -333,7 +333,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 (Permissions.skillEnabled(player, PrimarySkillType.HERBALISM)) { + if (mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, PrimarySkillType.HERBALISM)) { herbalismManager.processHerbalismBlockBreakEvent(event); } /* @@ -344,14 +344,14 @@ public class BlockListener implements Listener { } /* MINING */ - else if (BlockUtils.affectedBySuperBreaker(blockState) && ItemUtils.isPickaxe(heldItem) && Permissions.skillEnabled(player, PrimarySkillType.MINING) && !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.hasWoodcuttingXP(blockState) && ItemUtils.isAxe(heldItem) - && Permissions.skillEnabled(player, PrimarySkillType.WOODCUTTING) && !mcMMO.getPlaceStore().isTrue(blockState)) { + && mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, PrimarySkillType.WOODCUTTING) && !mcMMO.getPlaceStore().isTrue(blockState)) { WoodcuttingManager woodcuttingManager = mcMMOPlayer.getWoodcuttingManager(); if (woodcuttingManager.canUseTreeFeller(heldItem)) { woodcuttingManager.processTreeFeller(blockState); @@ -366,7 +366,7 @@ public class BlockListener implements Listener { } /* EXCAVATION */ - else if (BlockUtils.affectedByGigaDrillBreaker(blockState) && ItemUtils.isShovel(heldItem) && Permissions.skillEnabled(player, PrimarySkillType.EXCAVATION) && !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); diff --git a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java index f487a09ef..40c57adf7 100644 --- a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java @@ -296,7 +296,7 @@ public class PlayerListener implements Listener { return; } - if (!UserManager.hasPlayerDataKey(player) || !Permissions.skillEnabled(player, PrimarySkillType.FISHING)) { + if (!UserManager.hasPlayerDataKey(player) || !mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, PrimarySkillType.FISHING)) { return; } @@ -382,7 +382,7 @@ public class PlayerListener implements Listener { return; } - if (!UserManager.hasPlayerDataKey(player) || !Permissions.skillEnabled(player, PrimarySkillType.FISHING)) { + if (!UserManager.hasPlayerDataKey(player) || !mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, PrimarySkillType.FISHING)) { return; } @@ -677,7 +677,7 @@ public class PlayerListener implements Listener { if (!mcMMO.p.getGeneralConfig().getAbilitiesOnlyActivateWhenSneaking() || player.isSneaking()) { /* REPAIR CHECKS */ if (type == Repair.anvilMaterial - && Permissions.skillEnabled(player, PrimarySkillType.REPAIR) + && mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, PrimarySkillType.REPAIR) && mcMMO.getRepairableManager().isRepairable(heldItem) && heldItem.getAmount() <= 1) { RepairManager repairManager = mcMMOPlayer.getRepairManager(); @@ -691,7 +691,7 @@ public class PlayerListener implements Listener { } /* SALVAGE CHECKS */ else if (type == Salvage.anvilMaterial - && Permissions.skillEnabled(player, PrimarySkillType.SALVAGE) + && mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, PrimarySkillType.SALVAGE) && RankUtils.hasUnlockedSubskill(player, SubSkillType.SALVAGE_SCRAP_COLLECTOR) && mcMMO.getSalvageableManager().isSalvageable(heldItem) && heldItem.getAmount() <= 1) { @@ -724,7 +724,7 @@ public class PlayerListener implements Listener { if (!mcMMO.p.getGeneralConfig().getAbilitiesOnlyActivateWhenSneaking() || player.isSneaking()) { /* REPAIR CHECKS */ - if (type == Repair.anvilMaterial && Permissions.skillEnabled(player, PrimarySkillType.REPAIR) && 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 @@ -734,7 +734,7 @@ public class PlayerListener implements Listener { } } /* SALVAGE CHECKS */ - else if (type == Salvage.anvilMaterial && Permissions.skillEnabled(player, PrimarySkillType.SALVAGE) && 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 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 28d09f8aa..b589357c0 100644 --- a/src/main/java/com/gmail/nossr50/runnables/commands/McrankCommandDisplayTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/commands/McrankCommandDisplayTask.java @@ -47,7 +47,7 @@ public class McrankCommandDisplayTask extends BukkitRunnable { sender.sendMessage(LocaleLoader.getString("Commands.mcrank.Player", playerName)); for (PrimarySkillType skill : mcMMO.p.getSkillTools().NON_CHILD_SKILLS) { -// if (!Permissions.skillEnabled(player, skill)) { +// if (!mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, skill)) { // continue; // } 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 0ccee19be..adb2d4851 100644 --- a/src/main/java/com/gmail/nossr50/util/commands/CommandUtils.java +++ b/src/main/java/com/gmail/nossr50/util/commands/CommandUtils.java @@ -6,7 +6,6 @@ import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.Misc; -import com.gmail.nossr50.util.Permissions; import com.gmail.nossr50.util.player.UserManager; import com.gmail.nossr50.util.skills.SkillUtils; import com.gmail.nossr50.util.text.StringUtils; @@ -209,7 +208,7 @@ public final class CommandUtils { if (mcMMO.p.getSkillTools().isChildSkill(skill)) { return LocaleLoader.getString("Skills.ChildStats", LocaleLoader.getString(StringUtils.getCapitalized(skill.toString()) + ".Listener") + " ", profile.getSkillLevel(skill)); } - if (profile.getSkillLevel(skill) == mcMMO.p.getGeneralConfig().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)); @@ -225,7 +224,7 @@ public final class CommandUtils { displayData.add(header); for (PrimarySkillType primarySkillType : skillGroup) { - if (Permissions.skillEnabled(inspectTarget, primarySkillType)) { + if (mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(inspectTarget, primarySkillType)) { displayData.add(displaySkill(profile, primarySkillType)); } } 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 c82a6e00e..f7478e24c 100644 --- a/src/main/java/com/gmail/nossr50/util/experience/FormulaManager.java +++ b/src/main/java/com/gmail/nossr50/util/experience/FormulaManager.java @@ -88,7 +88,7 @@ public class FormulaManager { public int[] calculateNewLevel(PrimarySkillType primarySkillType, int experience, FormulaType formulaType) { int newLevel = 0; int remainder = 0; - int maxLevel = mcMMO.p.getGeneralConfig().getLevelCap(primarySkillType); + int maxLevel = mcMMO.p.getSkillTools().getLevelCap(primarySkillType); while (experience > 0 && newLevel < maxLevel) { int experienceToNextLevel = getXPtoNextLevel(newLevel, formulaType); 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 cee2d135a..9c23627da 100644 --- a/src/main/java/com/gmail/nossr50/util/scoreboards/ScoreboardWrapper.java +++ b/src/main/java/com/gmail/nossr50/util/scoreboards/ScoreboardWrapper.java @@ -13,7 +13,6 @@ 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.Permissions; import com.gmail.nossr50.util.player.NotificationManager; import com.gmail.nossr50.util.player.UserManager; import com.gmail.nossr50.util.scoreboards.ScoreboardManager.SidebarType; @@ -580,7 +579,7 @@ public class ScoreboardWrapper { powerLevel += level; // TODO: Verify that this is what we want - calculated in power level but not displayed - if (!Permissions.skillEnabled(player, skill)) { + if (!mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, skill)) { continue; } @@ -608,7 +607,7 @@ public class ScoreboardWrapper { Player player = mcMMO.p.getServer().getPlayerExact(playerName); for (PrimarySkillType skill : mcMMO.p.getSkillTools().NON_CHILD_SKILLS) { - if (!Permissions.skillEnabled(player, skill)) { + 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 2c9820a2c..934a3e07b 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java @@ -384,7 +384,7 @@ public final class CombatUtils { return; } - if (Permissions.skillEnabled(player, PrimarySkillType.SWORDS)) { + if (mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, PrimarySkillType.SWORDS)) { processSwordCombat(target, player, event); } @@ -394,7 +394,7 @@ public final class CombatUtils { return; } - if (Permissions.skillEnabled(player, PrimarySkillType.AXES)) { + if (mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, PrimarySkillType.AXES)) { processAxeCombat(target, player, event); } } @@ -403,7 +403,7 @@ public final class CombatUtils { return; } - if (Permissions.skillEnabled(player, PrimarySkillType.UNARMED)) { + if (mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, PrimarySkillType.UNARMED)) { processUnarmedCombat(target, player, event); } } @@ -416,7 +416,7 @@ public final class CombatUtils { if (tamer instanceof Player && mcMMO.p.getSkillTools().canCombatSkillsTrigger(PrimarySkillType.TAMING, target)) { Player master = (Player) tamer; - if (!Misc.isNPCEntityExcludingVillagers(master) && Permissions.skillEnabled(master, PrimarySkillType.TAMING)) { + if (!Misc.isNPCEntityExcludingVillagers(master) && mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(master, PrimarySkillType.TAMING)) { processTamingCombat(target, master, wolf, event); } } @@ -428,14 +428,14 @@ public final class CombatUtils { if (projectileSource instanceof Player && mcMMO.p.getSkillTools().canCombatSkillsTrigger(PrimarySkillType.ARCHERY, target)) { Player player = (Player) projectileSource; - if (!Misc.isNPCEntityExcludingVillagers(player) && Permissions.skillEnabled(player, PrimarySkillType.ARCHERY)) { + 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) && Permissions.skillEnabled(player, PrimarySkillType.TAMING)) { + if (target.getType() != EntityType.CREEPER && !Misc.isNPCEntityExcludingVillagers(player) && mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, PrimarySkillType.TAMING)) { McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); if(mcMMOPlayer == null) diff --git a/src/main/java/com/gmail/nossr50/util/skills/SkillTools.java b/src/main/java/com/gmail/nossr50/util/skills/SkillTools.java index 846c7c413..cf61f7b96 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/SkillTools.java +++ b/src/main/java/com/gmail/nossr50/util/skills/SkillTools.java @@ -11,6 +11,7 @@ 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; @@ -27,19 +28,19 @@ public class SkillTools { public final ImmutableList LOCALIZED_SKILL_NAMES; public final ImmutableList FORMATTED_SUBSKILL_NAMES; public final ImmutableSet EXACT_SUBSKILL_NAMES; - public final List CHILD_SKILLS; + public final ImmutableList CHILD_SKILLS; public final ImmutableList NON_CHILD_SKILLS; public final ImmutableList COMBAT_SKILLS; public final ImmutableList GATHERING_SKILLS; public final ImmutableList MISC_SKILLS; - private EnumMap subSkillParentRelationshipMap; //TODO: This disgusts me, but it will have to do until the new skill system is in place - private EnumMap superAbilityParentRelationshipMap; //TODO: This disgusts me, but it will have to do until the new skill system is in place - private EnumMap> primarySkillChildrenMap; //TODO: This disgusts me, but it will have to do until the new skill system is in place + private ImmutableMap subSkillParentRelationshipMap; + private ImmutableMap superAbilityParentRelationshipMap; + private ImmutableMap> primarySkillChildrenMap; // The map below is for the super abilities which require readying a tool, its everything except blast mining - private EnumMap mainActivatedAbilityChildMap; //TODO: This disgusts me, but it will have to do until the new skill system is in place - private EnumMap primarySkillToolMap; //TODO: Christ.. + private ImmutableMap mainActivatedAbilityChildMap; + private ImmutableMap primarySkillToolMap; public SkillTools(@NotNull mcMMO pluginRef) { this.pluginRef = pluginRef; @@ -72,39 +73,43 @@ public class SkillTools { NON_CHILD_SKILLS = ImmutableList.copyOf(nonChildSkills); } - //TODO: What is with this design? private void initPrimaryToolMap() { - primarySkillToolMap = new EnumMap(PrimarySkillType.class); + EnumMap tempToolMap = new EnumMap(PrimarySkillType.class); - primarySkillToolMap.put(PrimarySkillType.AXES, ToolType.AXE); - primarySkillToolMap.put(PrimarySkillType.WOODCUTTING, ToolType.AXE); - primarySkillToolMap.put(PrimarySkillType.UNARMED, ToolType.FISTS); - primarySkillToolMap.put(PrimarySkillType.SWORDS, ToolType.SWORD); - primarySkillToolMap.put(PrimarySkillType.EXCAVATION, ToolType.SHOVEL); - primarySkillToolMap.put(PrimarySkillType.HERBALISM, ToolType.HOE); - primarySkillToolMap.put(PrimarySkillType.MINING, ToolType.PICKAXE); + 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); } private void initSuperAbilityParentRelationships() { - superAbilityParentRelationshipMap = new EnumMap(SuperAbilityType.class); - mainActivatedAbilityChildMap = new EnumMap(PrimarySkillType.class); + EnumMap tempAbilityParentRelationshipMap = new EnumMap(SuperAbilityType.class); + EnumMap tempMainActivatedAbilityChildMap = new EnumMap(PrimarySkillType.class); for(SuperAbilityType superAbilityType : SuperAbilityType.values()) { try { PrimarySkillType parent = getSuperAbilityParent(superAbilityType); - superAbilityParentRelationshipMap.put(superAbilityType, parent); + 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 - mainActivatedAbilityChildMap.put(parent, superAbilityType); + tempMainActivatedAbilityChildMap.put(parent, superAbilityType); } } catch (InvalidSkillException e) { e.printStackTrace(); } } + + superAbilityParentRelationshipMap = ImmutableMap.copyOf(tempAbilityParentRelationshipMap); + mainActivatedAbilityChildMap = ImmutableMap.copyOf(tempMainActivatedAbilityChildMap); } - private PrimarySkillType getSuperAbilityParent(SuperAbilityType superAbilityType) throws InvalidSkillException { + private @NotNull PrimarySkillType getSuperAbilityParent(SuperAbilityType superAbilityType) throws InvalidSkillException { switch(superAbilityType) { case BERSERK: return PrimarySkillType.UNARMED; @@ -130,7 +135,7 @@ public class SkillTools { * Builds a list of localized {@link PrimarySkillType} names * @return list of localized {@link PrimarySkillType} names */ - private ArrayList buildLocalizedPrimarySkillNames() { + private @NotNull ArrayList buildLocalizedPrimarySkillNames() { ArrayList localizedSkillNameList = new ArrayList<>(); for(PrimarySkillType primarySkillType : PrimarySkillType.values()) { @@ -147,11 +152,11 @@ public class SkillTools { * Disgusting Hacky Fix until the new skill system is in place */ private void initPrimaryChildMap() { - primarySkillChildrenMap = new EnumMap>(PrimarySkillType.class); + EnumMap> tempPrimaryChildMap = new EnumMap>(PrimarySkillType.class); //Init the empty Hash Sets for(PrimarySkillType primarySkillType : PrimarySkillType.values()) { - primarySkillChildrenMap.put(primarySkillType, new HashSet()); + tempPrimaryChildMap.put(primarySkillType, new HashSet<>()); } //Fill in the hash sets @@ -159,8 +164,10 @@ public class SkillTools { PrimarySkillType parentSkill = subSkillParentRelationshipMap.get(subSkillType); //Add this subskill as a child - primarySkillChildrenMap.get(parentSkill).add(subSkillType); + tempPrimaryChildMap.get(parentSkill).add(subSkillType); } + + primarySkillChildrenMap = ImmutableMap.copyOf(tempPrimaryChildMap); } /** @@ -168,7 +175,7 @@ public class SkillTools { * Used in tab completion mostly * @return a list of formatted sub skill names */ - private ArrayList buildFormattedSubSkillNameList() { + private @NotNull ArrayList buildFormattedSubSkillNameList() { ArrayList subSkillNameList = new ArrayList<>(); for(SubSkillType subSkillType : SubSkillType.values()) { @@ -178,7 +185,7 @@ public class SkillTools { return subSkillNameList; } - private HashSet buildExactSubSkillNameList() { + private @NotNull HashSet buildExactSubSkillNameList() { HashSet subSkillNameExactSet = new HashSet<>(); for(SubSkillType subSkillType : SubSkillType.values()) { @@ -193,7 +200,7 @@ public class SkillTools { * Disgusting Hacky Fix until the new skill system is in place */ private void initSubSkillRelationshipMap() { - subSkillParentRelationshipMap = new EnumMap(SubSkillType.class); + EnumMap tempSubParentMap = new EnumMap(SubSkillType.class); //Super hacky and disgusting for(PrimarySkillType primarySkillType : PrimarySkillType.values()) { @@ -202,10 +209,12 @@ public class SkillTools { if(primarySkillType.toString().equalsIgnoreCase(splitSubSkillName[0])) { //Parent Skill Found - subSkillParentRelationshipMap.put(subSkillType, primarySkillType); + tempSubParentMap.put(subSkillType, primarySkillType); } } } + + subSkillParentRelationshipMap = ImmutableMap.copyOf(tempSubParentMap); } /** @@ -292,9 +301,9 @@ public class SkillTools { return primarySkillToolMap.get(primarySkillType); } - public List getSubSkills(PrimarySkillType primarySkillType) { + public Set getSubSkills(PrimarySkillType primarySkillType) { //TODO: Cache this! - return new ArrayList<>(primarySkillChildrenMap.get(primarySkillType)); + return primarySkillChildrenMap.get(primarySkillType); } public double getXpModifier(PrimarySkillType primarySkillType) { @@ -323,7 +332,7 @@ public class SkillTools { return StringUtils.getCapitalized(LocaleLoader.getString(StringUtils.getCapitalized(primarySkillType.toString()) + ".SkillName")); } - public boolean doesPlayerHaveSkillPermission(PrimarySkillType primarySkillType, Player player) { + public boolean doesPlayerHaveSkillPermission(Player player, PrimarySkillType primarySkillType) { return Permissions.skillEnabled(player, primarySkillType); } @@ -364,7 +373,7 @@ public class SkillTools { } public int getLevelCap(@NotNull PrimarySkillType primarySkillType) { - return mcMMO.p.getGeneralConfig().getLevelCap(primarySkillType); + return mcMMO.p.getSkillTools().getLevelCap(primarySkillType); } /** diff --git a/src/main/java/com/gmail/nossr50/util/skills/SmeltingTracker.java b/src/main/java/com/gmail/nossr50/util/skills/SmeltingTracker.java index 630991341..dfa313181 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/SmeltingTracker.java +++ b/src/main/java/com/gmail/nossr50/util/skills/SmeltingTracker.java @@ -3,7 +3,6 @@ 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.Permissions; import com.gmail.nossr50.util.player.UserManager; import org.bukkit.Bukkit; import org.bukkit.ChatColor; @@ -89,7 +88,7 @@ public class SmeltingTracker { } public void processFurnaceOwnership(Furnace furnace, Player player) { - if(!Permissions.skillEnabled(player, PrimarySkillType.SMELTING)) + if(!mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, PrimarySkillType.SMELTING)) return; //Don't swap ownership if its the same player From 323f4964203d1aacab87a5d9fa6ddb9fa7afdb18 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 9 Apr 2021 11:15:07 -0700 Subject: [PATCH 491/662] Fix infinite loop --- src/main/java/com/gmail/nossr50/util/skills/SkillTools.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gmail/nossr50/util/skills/SkillTools.java b/src/main/java/com/gmail/nossr50/util/skills/SkillTools.java index cf61f7b96..280eb1db1 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/SkillTools.java +++ b/src/main/java/com/gmail/nossr50/util/skills/SkillTools.java @@ -373,7 +373,7 @@ public class SkillTools { } public int getLevelCap(@NotNull PrimarySkillType primarySkillType) { - return mcMMO.p.getSkillTools().getLevelCap(primarySkillType); + return mcMMO.p.getGeneralConfig().getLevelCap(primarySkillType); } /** From 834ccc946ac4734e4aab373f89fa2ec51590369b Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 9 Apr 2021 16:45:58 -0700 Subject: [PATCH 492/662] FlatFileDatabaseManager refactor + adding tests part 1 --- Changelog.txt | 5 +- .../database/ConvertDatabaseCommand.java | 3 - .../nossr50/database/DatabaseManager.java | 2 - .../gmail/nossr50/database/ExpectedType.java | 12 + .../database/FlatFileDataContainer.java | 5 + .../nossr50/database/FlatFileDataFlag.java | 14 + .../database/FlatFileDataProcessor.java | 303 ++++++++++++++++++ .../database/FlatFileDatabaseManager.java | 148 ++++++--- .../nossr50/database/SQLDatabaseManager.java | 3 - .../flatfile/CategorizedFlatFileData.java | 50 +++ .../CategorizedFlatFileDataBuilder.java | 33 ++ .../datatypes/skills/PrimarySkillType.java | 19 +- src/main/java/com/gmail/nossr50/mcMMO.java | 1 - .../gmail/nossr50/util/skills/SkillTools.java | 187 +++++------ .../database/FlatFileDatabaseManagerTest.java | 80 ++++- .../nossr50/util/skills/SkillToolsTest.java | 16 + 16 files changed, 721 insertions(+), 160 deletions(-) create mode 100644 src/main/java/com/gmail/nossr50/database/ExpectedType.java create mode 100644 src/main/java/com/gmail/nossr50/database/FlatFileDataContainer.java create mode 100644 src/main/java/com/gmail/nossr50/database/FlatFileDataFlag.java create mode 100644 src/main/java/com/gmail/nossr50/database/FlatFileDataProcessor.java create mode 100644 src/main/java/com/gmail/nossr50/database/flatfile/CategorizedFlatFileData.java create mode 100644 src/main/java/com/gmail/nossr50/database/flatfile/CategorizedFlatFileDataBuilder.java create mode 100644 src/test/java/com/gmail/nossr50/util/skills/SkillToolsTest.java diff --git a/Changelog.txt b/Changelog.txt index 49a67eaaa..932a69327 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,4 +1,7 @@ Version 2.1.189 + Rewrote how FlatFileDatabase verifies data integrity + Added unit tests for FlatFileDatabaseManager (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) Fixed a bug that would remove components from death messages when players were killed by mobs (thanks lexikiq) @@ -12,9 +15,9 @@ Version 2.1.189 (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) - Added unit tests for FlatFileDatabaseManager NOTES: + The tests added for FlatFileDatabase will help make sure bugs don't result in any loss of data Ultra Permissions is SAFE to use with mcMMO 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. 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 bc383cf99..1667e9111 100644 --- a/src/main/java/com/gmail/nossr50/commands/database/ConvertDatabaseCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/database/ConvertDatabaseCommand.java @@ -33,8 +33,6 @@ public class ConvertDatabaseCommand implements CommandExecutor { return true; } - oldDatabase.init(); - if (previousType == DatabaseType.CUSTOM) { Class clazz; @@ -47,7 +45,6 @@ public class ConvertDatabaseCommand implements CommandExecutor { } oldDatabase = DatabaseManagerFactory.createCustomDatabaseManager((Class) clazz); - oldDatabase.init(); } catch (Throwable e) { e.printStackTrace(); sender.sendMessage(LocaleLoader.getString("Commands.mcconvert.Database.InvalidType", args[1])); diff --git a/src/main/java/com/gmail/nossr50/database/DatabaseManager.java b/src/main/java/com/gmail/nossr50/database/DatabaseManager.java index 47baafe63..831ec579a 100644 --- a/src/main/java/com/gmail/nossr50/database/DatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/DatabaseManager.java @@ -73,8 +73,6 @@ public interface DatabaseManager { */ Map readRank(String playerName); - default void init() {}; - /** * Add a new user to the database. * 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..57da078fb --- /dev/null +++ b/src/main/java/com/gmail/nossr50/database/ExpectedType.java @@ -0,0 +1,12 @@ +package com.gmail.nossr50.database; + +public enum ExpectedType { + STRING, + INTEGER, + BOOLEAN, + FLOAT, + DOUBLE, + UUID, + IGNORED, + OUT_OF_RANGE +} diff --git a/src/main/java/com/gmail/nossr50/database/FlatFileDataContainer.java b/src/main/java/com/gmail/nossr50/database/FlatFileDataContainer.java new file mode 100644 index 000000000..5559714a7 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/database/FlatFileDataContainer.java @@ -0,0 +1,5 @@ +package com.gmail.nossr50.database; + +//Marker interface +public interface FlatFileDataContainer { +} 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..12dab5a84 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/database/FlatFileDataFlag.java @@ -0,0 +1,14 @@ +package com.gmail.nossr50.database; + +public enum FlatFileDataFlag { + INCOMPLETE, + BAD_VALUES, + MISSING_NAME, + DUPLICATE_NAME_FIXABLE, + DUPLICATE_NAME_NOT_FIXABLE, + DUPLICATE_UUID, + MISSING_OR_NULL_UUID, + TOO_INCOMPLETE, + JUNK, + EMPTY, +} 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..52f2fed51 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/database/FlatFileDataProcessor.java @@ -0,0 +1,303 @@ +package com.gmail.nossr50.database; + +import com.gmail.nossr50.database.flatfile.CategorizedFlatFileData; +import com.gmail.nossr50.database.flatfile.CategorizedFlatFileDataBuilder; +import org.jetbrains.annotations.NotNull; + +import java.io.File; +import java.util.*; +import java.util.logging.Logger; + +import static com.gmail.nossr50.database.FlatFileDatabaseManager.*; + +public class FlatFileDataProcessor { + public static final String INVALID_OLD_USERNAME = "_INVALID_OLD_USERNAME_"; + private @NotNull List categorizedDataList; + private @NotNull List flatFileDataFlags; + private final @NotNull File userFile; + private final @NotNull Logger logger; + private final HashSet names; + private final HashSet uuids; + private int uniqueProcessingID; + boolean corruptDataFound; + + public FlatFileDataProcessor(@NotNull File userFile, @NotNull Logger logger) { + this.userFile = userFile; + this.logger = logger; + categorizedDataList = new ArrayList<>(); + flatFileDataFlags = new ArrayList<>(); + names = new HashSet<>(); + uuids = new HashSet<>(); + uniqueProcessingID = 0; + } + + public void processData(@NotNull String lineData) { + CategorizedFlatFileDataBuilder builder = new CategorizedFlatFileDataBuilder(lineData, uniqueProcessingID); + uniqueProcessingID++; + + /* + * Is the line empty? + */ + if (lineData.isEmpty()) { + registerData(builder.appendFlag(FlatFileDataFlag.EMPTY)); + return; + } + + //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(":"); + + //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; + } + + 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; + } + } else { + registerData(builder.appendFlag(FlatFileDataFlag.JUNK)); + return; + } + } + + /* + * Check for duplicate names + */ + + boolean nameIsDupe = false; + 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); + } + + if(strOfUUID.isEmpty() || strOfUUID.equalsIgnoreCase("NULL")) { + invalidUUID = true; + reportBadDataLine("Empty/null UUID for user", "Empty/null", lineData); + builder.appendFlag(FlatFileDataFlag.MISSING_OR_NULL_UUID); + } + + UUID uuid = null; + + try { + uuid = UUID.fromString(strOfUUID); + } catch (IllegalArgumentException e) { + invalidUUID = true; + //UUID does not conform + + reportBadDataLine("Invalid UUID data found for user", strOfUUID, lineData); + e.printStackTrace(); + } + + //Duplicate UUID is no good, reject them + if(uuid != null && uuids.contains(uuid)) { + registerData(builder.appendFlag(FlatFileDataFlag.DUPLICATE_UUID)); + return; + } + + if(names.contains(name)) { + //Duplicate entry + nameIsDupe = true; + + //We can accept them if they are a duped name if they have a unique UUID + if(invalidUUID) { + //Reject the data + reportBadDataLine("Duplicate user found and due to a missing UUID their data had to be discarded", name, lineData); + + registerData(builder.appendFlag(FlatFileDataFlag.DUPLICATE_NAME_NOT_FIXABLE)); + return; + } else { + builder.appendFlag(FlatFileDataFlag.DUPLICATE_NAME_FIXABLE); + } + } + + //Make sure the data is up to date schema wise + if(splitDataLine.length < DATA_ENTRY_COUNT) { + String[] correctSizeSplitData = Arrays.copyOf(splitDataLine, DATA_ENTRY_COUNT); + lineData = org.apache.commons.lang.StringUtils.join(correctSizeSplitData, ":") + ":"; + splitDataLine = lineData.split(":"); + builder.appendFlag(FlatFileDataFlag.INCOMPLETE); + builder.setStringDataRepresentation(lineData); + } + + /* + * After establishing this data has at least an identity we check for bad data + * Bad Value checks + */ + + //Check each data for bad values + boolean[] badDataValues = new boolean[DATA_ENTRY_COUNT]; + boolean anyBadData = false; + + for(int i = 0; i < DATA_ENTRY_COUNT; i++) { + if(shouldNotBeEmpty(splitDataLine[i], i)) { + badDataValues[i] = true; + anyBadData = true; + reportBadDataLine("Data is empty when it should not be at index", "[EMPTY]", lineData); + continue; + } + + boolean isCorrectType = isOfExpectedType(splitDataLine[i], getExpectedValueType(i)); + + if(!isCorrectType) { + reportBadDataLine("Data is not of correct type", splitDataLine[i], lineData); + anyBadData = true; + badDataValues[i] = true; + } + } + + if(anyBadData) { + builder.appendFlag(FlatFileDataFlag.BAD_VALUES); + } + } + + public boolean shouldNotBeEmpty(String data, int index) { + if(getExpectedValueType(index) == ExpectedType.IGNORED) { + return false; + } else { + return 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.severe("FlatFileDatabaseBuilder Warning: " + warning + " - " + context); + logger.severe("FlatFileDatabaseBuilder: (Line Data) - " + dataLine); + } + + private int getMinimumSplitDataLength() { + return UUID_INDEX + 1; + } + + private void registerData(@NotNull CategorizedFlatFileDataBuilder builder) { + CategorizedFlatFileData categorizedFlatFileData = builder.build(); + categorizedDataList.add(categorizedFlatFileData); + flatFileDataFlags.addAll(categorizedFlatFileData.getDataFlags()); + } + + public @NotNull ExpectedType getExpectedValueType(int dataIndex) { + switch(dataIndex) { + case USERNAME_INDEX: + return ExpectedType.STRING; + case 2: //Used to be for something, no longer used + case 3: //Used to be for something, no longer used + case HEALTHBAR: + 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 LAST_LOGIN: + 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; + default: + return ExpectedType.OUT_OF_RANGE; + } + } + + public @NotNull List getCategorizedDataList() { + return categorizedDataList; + } + + public @NotNull List getFlatFileDataFlags() { + return flatFileDataFlags; + } + + public int getDataFlagCount() { + return flatFileDataFlags.size(); + } +} diff --git a/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java index 80d3f8ca7..33c88deab 100644 --- a/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java @@ -32,48 +32,48 @@ public final class FlatFileDatabaseManager implements DatabaseManager { private final @NotNull File usersFile; private static final Object fileWritingLock = new Object(); - public static int USERNAME_INDEX = 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 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 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 int DATA_ENTRY_COUNT = COOLDOWN_CHIMAERA_WING + 1; //Update this everytime new data is added + public static final int DATA_ENTRY_COUNT = COOLDOWN_CHIMAERA_WING + 1; //Update this everytime new data is added protected FlatFileDatabaseManager(@NotNull String usersFilePath, @NotNull Logger logger, long purgeTime, int startingLevel) { usersFile = new File(usersFilePath); @@ -81,11 +81,18 @@ public final class FlatFileDatabaseManager implements DatabaseManager { this.logger = logger; this.purgeTime = purgeTime; this.startingLevel = startingLevel; - } - public void init() { - checkStructure(); - updateLeaderboards(); + checkFileHealthAndStructure(); + List flatFileDataFlags = checkFileHealthAndStructure(); + + if(flatFileDataFlags != null) { + if(flatFileDataFlags.size() > 0) { + logger.info("Detected "+flatFileDataFlags.size() + " data entries which need correction."); + } + } + + checkFileHealthAndStructure(); +// updateLeaderboards(); } public int purgePowerlessUsers() { @@ -855,7 +862,7 @@ public final class FlatFileDatabaseManager implements DatabaseManager { /** * Update the leader boards. */ - private void updateLeaderboards() { + public 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; @@ -958,11 +965,45 @@ public final class FlatFileDatabaseManager implements DatabaseManager { playerStatHash.put(PrimarySkillType.ALCHEMY, alchemy); } + public @Nullable List checkFileHealthAndStructure() { + FlatFileDataProcessor dataProcessor = null; + int dataFlagCount = 0; + + if (usersFile.exists()) { + BufferedReader bufferedReader = null; + + synchronized (fileWritingLock) { + + dataProcessor = new FlatFileDataProcessor(usersFile, logger); + + try { + String currentLine; + bufferedReader = new BufferedReader(new FileReader(usersFilePath)); + while ((currentLine = bufferedReader.readLine()) != null) { + dataProcessor.processData(currentLine); + } + } catch (IOException e) { + e.printStackTrace(); + } + + dataFlagCount = dataProcessor.getDataFlagCount(); + } + } + + if(dataProcessor == null || dataProcessor.getFlatFileDataFlags() == null) { + return null; + } else { + return dataProcessor.getFlatFileDataFlags(); + } + } + + /** * Checks that the file is present and valid */ - private void checkStructure() { + public int checkFileHealthAndStructureOld() { boolean corruptDataFound = false; + boolean oldDataFound = false; if (usersFile.exists()) { BufferedReader in = null; @@ -1030,6 +1071,7 @@ public final class FlatFileDatabaseManager implements DatabaseManager { //Correctly size the data (null entries for missing values) if(line.length() < DATA_ENTRY_COUNT) { //TODO: Test this condition + oldDataFound = true; String[] correctSizeSplitData = Arrays.copyOf(rawSplitData, DATA_ENTRY_COUNT); line = org.apache.commons.lang.StringUtils.join(correctSizeSplitData, ":") + ":"; rawSplitData = line.split(":"); @@ -1070,8 +1112,6 @@ public final class FlatFileDatabaseManager implements DatabaseManager { if(corruptDataFound) logger.info("Corrupt data was found and removed, everything should be working fine. It is possible some player data was lost."); - - return; } usersFile.getParentFile().mkdir(); @@ -1083,6 +1123,14 @@ public final class FlatFileDatabaseManager implements DatabaseManager { catch (IOException e) { e.printStackTrace(); } + + if(corruptDataFound) { + return 1; + } else if(oldDataFound) { + return 2; + } else { + return 0; + } } private Integer getPlayerRank(String playerName, List statsList) { @@ -1239,7 +1287,7 @@ public final class FlatFileDatabaseManager implements DatabaseManager { return DatabaseType.FLATFILE; } - public File getUsersFile() { + public @NotNull File getUsersFile() { return usersFile; } diff --git a/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java index 462fd6d66..9f09d77f2 100644 --- a/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java @@ -113,10 +113,7 @@ public final class SQLDatabaseManager implements DatabaseManager { poolProperties.setValidationQuery("SELECT 1"); poolProperties.setValidationInterval(30000); loadPool = new DataSource(poolProperties); - } - @Override - public void init() { checkStructure(); } 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..341d3d949 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/database/flatfile/CategorizedFlatFileData.java @@ -0,0 +1,50 @@ +package com.gmail.nossr50.database.flatfile; + +import com.gmail.nossr50.database.FlatFileDataContainer; +import com.gmail.nossr50.database.FlatFileDataFlag; +import com.gmail.nossr50.database.FlatFileDatabaseManager; +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 stringDataRepresentation; + private final int uniqueProcessingId; + private final boolean[] badDataIndexes; + + protected CategorizedFlatFileData(int uniqueProcessingId, @NotNull HashSet dataFlags, @NotNull String stringDataRepresentation) { + this.uniqueProcessingId = uniqueProcessingId; + this.dataFlags = dataFlags; + this.stringDataRepresentation = stringDataRepresentation; + badDataIndexes = new boolean[FlatFileDatabaseManager.DATA_ENTRY_COUNT]; + } + + protected CategorizedFlatFileData(int uniqueProcessingId, @NotNull HashSet dataFlags, @NotNull String stringDataRepresentation, boolean[] badDataIndexes) { + this.uniqueProcessingId = uniqueProcessingId; + this.dataFlags = dataFlags; + this.stringDataRepresentation = stringDataRepresentation; + this.badDataIndexes = badDataIndexes; + } + + public @NotNull Set getDataFlags() { + return dataFlags; + } + + public @NotNull String getStringDataRepresentation() { + return stringDataRepresentation; + } + + public int getUniqueProcessingId() { + return uniqueProcessingId; + } + + public boolean isHealthyData() { + return dataFlags.size() == 0; + } + + public boolean[] getBadDataIndexes() { + return badDataIndexes; + } +} diff --git a/src/main/java/com/gmail/nossr50/database/flatfile/CategorizedFlatFileDataBuilder.java b/src/main/java/com/gmail/nossr50/database/flatfile/CategorizedFlatFileDataBuilder.java new file mode 100644 index 000000000..205403a3e --- /dev/null +++ b/src/main/java/com/gmail/nossr50/database/flatfile/CategorizedFlatFileDataBuilder.java @@ -0,0 +1,33 @@ +package com.gmail.nossr50.database.flatfile; + +import com.gmail.nossr50.database.FlatFileDataFlag; +import org.jetbrains.annotations.NotNull; + +import java.util.HashSet; + +public class CategorizedFlatFileDataBuilder { + private final @NotNull HashSet dataFlags; + private @NotNull String stringDataRepresentation; + private final int uniqueProcessingId; + + public CategorizedFlatFileDataBuilder(@NotNull String stringDataRepresentation, int uniqueProcessingId) { + this.uniqueProcessingId = uniqueProcessingId; + this.stringDataRepresentation = stringDataRepresentation; + dataFlags = new HashSet<>(); + } + + public CategorizedFlatFileDataBuilder appendFlag(@NotNull FlatFileDataFlag dataFlag) { + dataFlags.add(dataFlag); + return this; + } + + public CategorizedFlatFileData build() { + assert dataFlags.size() > 0; + return new CategorizedFlatFileData(uniqueProcessingId, dataFlags, stringDataRepresentation); + } + + public CategorizedFlatFileDataBuilder setStringDataRepresentation(@NotNull String stringDataRepresentation) { + this.stringDataRepresentation = stringDataRepresentation; + return this; + } +} 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 cad2245c1..f8abfa255 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/skills/PrimarySkillType.java +++ b/src/main/java/com/gmail/nossr50/datatypes/skills/PrimarySkillType.java @@ -27,6 +27,7 @@ public enum PrimarySkillType { TAMING, UNARMED, WOODCUTTING; +// boolean issueWarning = true; /* * Everything below here will be removed in 2.2 (Tridents & Crossbows) @@ -47,6 +48,20 @@ public enum PrimarySkillType { * Everything below here will be removed in 2.2 (Tridents & Crossbows) */ + +// 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; +// } +// } + /** * WARNING: Being removed in an upcoming update, you should be using mcMMO.getSkillTools() instead * @return the max level of this skill @@ -65,7 +80,9 @@ public enum PrimarySkillType { * @deprecated this is being removed in an upcoming update, you should be using mcMMO.getSkillTools() instead */ @Deprecated - public boolean isSuperAbilityUnlocked(@NotNull Player player) { return mcMMO.p.getSkillTools().isSuperAbilityUnlocked(this, player); } + public boolean isSuperAbilityUnlocked(@NotNull Player player) { + return mcMMO.p.getSkillTools().isSuperAbilityUnlocked(this, player); + } /** * WARNING: Being removed in an upcoming update, you should be using mcMMO.getSkillTools() instead diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index 719883444..69982d932 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -231,7 +231,6 @@ public class mcMMO extends JavaPlugin { this.purgeTime = 2630000000L * generalConfig.getOldUsersCutoff(); databaseManager = DatabaseManagerFactory.getDatabaseManager(mcMMO.getUsersFilePath(), getLogger(), purgeTime, mcMMO.p.getAdvancedConfig().getStartingLevel()); - databaseManager.init(); //Check for the newer API and tell them what to do if its missing checkForOutdatedAPI(); diff --git a/src/main/java/com/gmail/nossr50/util/skills/SkillTools.java b/src/main/java/com/gmail/nossr50/util/skills/SkillTools.java index 280eb1db1..ae33665aa 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/SkillTools.java +++ b/src/main/java/com/gmail/nossr50/util/skills/SkillTools.java @@ -10,6 +10,7 @@ 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.annotations.VisibleForTesting; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; @@ -23,57 +24,70 @@ import java.util.*; public class SkillTools { private final mcMMO pluginRef; - //TODO: Should these be hash sets instead of lists? //TODO: Figure out which ones we don't need, this was copy pasted from a diff branch - public final ImmutableList LOCALIZED_SKILL_NAMES; - public final ImmutableList FORMATTED_SUBSKILL_NAMES; - public final ImmutableSet EXACT_SUBSKILL_NAMES; - public final ImmutableList CHILD_SKILLS; - public final ImmutableList NON_CHILD_SKILLS; - public final ImmutableList COMBAT_SKILLS; - public final ImmutableList GATHERING_SKILLS; - public final ImmutableList MISC_SKILLS; + 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 @NotNull ImmutableList NON_CHILD_SKILLS; + public final @NotNull ImmutableList COMBAT_SKILLS; + public final @NotNull ImmutableList GATHERING_SKILLS; + public final @NotNull ImmutableList MISC_SKILLS; - private ImmutableMap subSkillParentRelationshipMap; - private ImmutableMap superAbilityParentRelationshipMap; - private ImmutableMap> primarySkillChildrenMap; + 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 ImmutableMap mainActivatedAbilityChildMap; - private ImmutableMap primarySkillToolMap; + private final ImmutableMap mainActivatedAbilityChildMap; + private final ImmutableMap primarySkillToolMap; public SkillTools(@NotNull mcMMO pluginRef) { this.pluginRef = pluginRef; - initSubSkillRelationshipMap(); - initPrimaryChildMap(); - initPrimaryToolMap(); - initSuperAbilityParentRelationships(); + /* + * Setup subskill -> parent relationship map + */ + EnumMap tempSubParentMap = new EnumMap(SubSkillType.class); - List childSkills = new ArrayList<>(); - List nonChildSkills = new ArrayList<>(); + //Super hacky and disgusting + for(PrimarySkillType primarySkillType1 : PrimarySkillType.values()) { + for(SubSkillType subSkillType : SubSkillType.values()) { + String[] splitSubSkillName = subSkillType.toString().split("_"); - for (PrimarySkillType primarySkillType : PrimarySkillType.values()) { - if (isChildSkill(primarySkillType)) { - childSkills.add(primarySkillType); - } else { - nonChildSkills.add(primarySkillType); + if(primarySkillType1.toString().equalsIgnoreCase(splitSubSkillName[0])) { + //Parent Skill Found + tempSubParentMap.put(subSkillType, primarySkillType1); + } } } - 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); + subSkillParentRelationshipMap = ImmutableMap.copyOf(tempSubParentMap); - LOCALIZED_SKILL_NAMES = ImmutableList.copyOf(buildLocalizedPrimarySkillNames()); - FORMATTED_SUBSKILL_NAMES = ImmutableList.copyOf(buildFormattedSubSkillNameList()); - EXACT_SUBSKILL_NAMES = ImmutableSet.copyOf(buildExactSubSkillNameList()); + /* + * Setup primary -> (collection) subskill map + */ - CHILD_SKILLS = ImmutableList.copyOf(childSkills); - NON_CHILD_SKILLS = ImmutableList.copyOf(nonChildSkills); - } + EnumMap> tempPrimaryChildMap = new EnumMap>(PrimarySkillType.class); - private void initPrimaryToolMap() { + //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); @@ -85,9 +99,12 @@ public class SkillTools { tempToolMap.put(PrimarySkillType.MINING, ToolType.PICKAXE); primarySkillToolMap = ImmutableMap.copyOf(tempToolMap); - } - private void initSuperAbilityParentRelationships() { + /* + * Setup ability -> primary map + * Setup primary -> ability map + */ + EnumMap tempAbilityParentRelationshipMap = new EnumMap(SuperAbilityType.class); EnumMap tempMainActivatedAbilityChildMap = new EnumMap(PrimarySkillType.class); @@ -107,6 +124,40 @@ public class SkillTools { 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); + } else { + 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 { @@ -131,45 +182,6 @@ public class SkillTools { } } - /** - * Builds a list of localized {@link PrimarySkillType} names - * @return list of localized {@link PrimarySkillType} names - */ - private @NotNull ArrayList buildLocalizedPrimarySkillNames() { - ArrayList localizedSkillNameList = new ArrayList<>(); - - for(PrimarySkillType primarySkillType : PrimarySkillType.values()) { - localizedSkillNameList.add(getLocalizedSkillName(primarySkillType)); - } - - Collections.sort(localizedSkillNameList); - - return localizedSkillNameList; - } - - /** - * Builds a map containing a HashSet of SubSkillTypes considered Children of PrimarySkillType - * Disgusting Hacky Fix until the new skill system is in place - */ - private void initPrimaryChildMap() { - EnumMap> tempPrimaryChildMap = new EnumMap>(PrimarySkillType.class); - - //Init the empty Hash Sets - for(PrimarySkillType primarySkillType : PrimarySkillType.values()) { - tempPrimaryChildMap.put(primarySkillType, 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); - } - /** * Makes a list of the "nice" version of sub skill names * Used in tab completion mostly @@ -196,25 +208,20 @@ public class SkillTools { } /** - * Builds a map containing the relationships of SubSkillTypes to PrimarySkillTypes - * Disgusting Hacky Fix until the new skill system is in place + * Builds a list of localized {@link PrimarySkillType} names + * @return list of localized {@link PrimarySkillType} names */ - private void initSubSkillRelationshipMap() { - EnumMap tempSubParentMap = new EnumMap(SubSkillType.class); + @VisibleForTesting + private @NotNull ArrayList buildLocalizedPrimarySkillNames() { + ArrayList localizedSkillNameList = new ArrayList<>(); - //Super hacky and disgusting for(PrimarySkillType primarySkillType : PrimarySkillType.values()) { - for(SubSkillType subSkillType : SubSkillType.values()) { - String[] splitSubSkillName = subSkillType.toString().split("_"); - - if(primarySkillType.toString().equalsIgnoreCase(splitSubSkillName[0])) { - //Parent Skill Found - tempSubParentMap.put(subSkillType, primarySkillType); - } - } + localizedSkillNameList.add(getLocalizedSkillName(primarySkillType)); } - subSkillParentRelationshipMap = ImmutableMap.copyOf(tempSubParentMap); + Collections.sort(localizedSkillNameList); + + return localizedSkillNameList; } /** diff --git a/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java b/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java index 57efb3381..2603a2aad 100644 --- a/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java +++ b/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java @@ -1,48 +1,62 @@ package com.gmail.nossr50.database; import com.gmail.nossr50.TestUtil; +import com.gmail.nossr50.datatypes.database.DatabaseType; import com.google.common.io.Files; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.junit.After; -import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.powermock.modules.junit4.PowerMockRunner; import java.io.*; +import java.util.List; import java.util.logging.Logger; +import static org.junit.Assert.*; + @RunWith(PowerMockRunner.class) public class FlatFileDatabaseManagerTest { public static final @NotNull String TEST_FILE_NAME = "test.mcmmo.users"; + public static final int HEALTHY_RETURN_CODE = 0; 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 flatFileDatabaseManager; + private static @Nullable FlatFileDatabaseManager db; @Before public void init() { + assertNull(db); tempDir = Files.createTempDir(); - flatFileDatabaseManager = new FlatFileDatabaseManager(tempDir.getPath() + File.separator + TEST_FILE_NAME, logger, PURGE_TIME, 0); + db = new FlatFileDatabaseManager(tempDir.getPath() + File.separator + TEST_FILE_NAME, logger, PURGE_TIME, 0); } @After public void tearDown() { TestUtil.recursiveDelete(tempDir); - flatFileDatabaseManager = null; + db = null; } + //Nothing wrong with this database private static 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 String[] splitDataBadDatabase = { + private static String[] corruptDatabaseData = { + "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:", + "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 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 @@ -51,12 +65,60 @@ public class FlatFileDatabaseManagerTest { @Test public void testPurgePowerlessUsers() { - Assert.assertNotNull(flatFileDatabaseManager); - addDataToFile(flatFileDatabaseManager, normalDatabaseData); - int purgeCount = flatFileDatabaseManager.purgePowerlessUsers(); - Assert.assertEquals(purgeCount, 1); //1 User should have been purged + assertNotNull(db); + addDataToFile(db, normalDatabaseData); + int purgeCount = db.purgePowerlessUsers(); + assertEquals(purgeCount, 1); //1 User should have been purged } + @Test + public void testCheckFileHealthAndStructure() { + assertNotNull(db); + + addDataToFile(db, badDatabaseData); + + List dataFlags = db.checkFileHealthAndStructure(); + assertNotNull(dataFlags); + assertNotEquals(dataFlags.size(), 0); + } + + @Test + public void testFindDuplicateNames() { + + } + + @Test + public void testFindDuplicateUUIDs() { + + } + + @Test + public void testFindCorruptData() { + + } + + @Test + public void testFindEmptyNames() { + + } + + @Test + public void testFindBadValues() { + + } + + @Test + public void testFindOutdatedData() { + + } + + @Test + public void testGetDatabaseType() { + assertNotNull(db); + assertEquals(db.getDatabaseType(), DatabaseType.FLATFILE); + } + + private void addDataToFile(@NotNull FlatFileDatabaseManager flatFileDatabaseManager, @NotNull String[] dataEntries) { String filePath = flatFileDatabaseManager.getUsersFile().getAbsolutePath(); BufferedReader in = null; 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 From aca1d6c0b15be0a8e17e1e9b975196884eda4b05 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 12 Apr 2021 09:02:50 -0700 Subject: [PATCH 493/662] Add test to find duplicate names - FlatFileDatabaseManagerTest --- .../nossr50/database/FlatFileDataProcessor.java | 15 ++++++++++++--- .../database/FlatFileDatabaseManager.java | 3 --- .../CategorizedFlatFileDataBuilder.java | 1 - .../database/FlatFileDatabaseManagerTest.java | 17 ++++++++++++++--- 4 files changed, 26 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/database/FlatFileDataProcessor.java b/src/main/java/com/gmail/nossr50/database/FlatFileDataProcessor.java index 52f2fed51..6bac0bc1b 100644 --- a/src/main/java/com/gmail/nossr50/database/FlatFileDataProcessor.java +++ b/src/main/java/com/gmail/nossr50/database/FlatFileDataProcessor.java @@ -113,6 +113,9 @@ public class FlatFileDataProcessor { return; } + uuids.add(uuid); + + if(names.contains(name)) { //Duplicate entry nameIsDupe = true; @@ -129,6 +132,8 @@ public class FlatFileDataProcessor { } } + names.add(name); + //Make sure the data is up to date schema wise if(splitDataLine.length < DATA_ENTRY_COUNT) { String[] correctSizeSplitData = Arrays.copyOf(splitDataLine, DATA_ENTRY_COUNT); @@ -151,7 +156,7 @@ public class FlatFileDataProcessor { if(shouldNotBeEmpty(splitDataLine[i], i)) { badDataValues[i] = true; anyBadData = true; - reportBadDataLine("Data is empty when it should not be at index", "[EMPTY]", lineData); + reportBadDataLine("Data is empty when it should not be at index", "[index=" + i + "]", lineData); continue; } @@ -167,6 +172,8 @@ public class FlatFileDataProcessor { if(anyBadData) { builder.appendFlag(FlatFileDataFlag.BAD_VALUES); } + + registerData(builder); } public boolean shouldNotBeEmpty(String data, int index) { @@ -239,8 +246,10 @@ public class FlatFileDataProcessor { switch(dataIndex) { case USERNAME_INDEX: return ExpectedType.STRING; - case 2: //Used to be for something, no longer used - case 3: //Used to be for something, no longer used + 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: return ExpectedType.IGNORED; case SKILLS_MINING: diff --git a/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java index 33c88deab..41ee427d1 100644 --- a/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java @@ -967,7 +967,6 @@ public final class FlatFileDatabaseManager implements DatabaseManager { public @Nullable List checkFileHealthAndStructure() { FlatFileDataProcessor dataProcessor = null; - int dataFlagCount = 0; if (usersFile.exists()) { BufferedReader bufferedReader = null; @@ -985,8 +984,6 @@ public final class FlatFileDatabaseManager implements DatabaseManager { } catch (IOException e) { e.printStackTrace(); } - - dataFlagCount = dataProcessor.getDataFlagCount(); } } diff --git a/src/main/java/com/gmail/nossr50/database/flatfile/CategorizedFlatFileDataBuilder.java b/src/main/java/com/gmail/nossr50/database/flatfile/CategorizedFlatFileDataBuilder.java index 205403a3e..0723ff3ef 100644 --- a/src/main/java/com/gmail/nossr50/database/flatfile/CategorizedFlatFileDataBuilder.java +++ b/src/main/java/com/gmail/nossr50/database/flatfile/CategorizedFlatFileDataBuilder.java @@ -22,7 +22,6 @@ public class CategorizedFlatFileDataBuilder { } public CategorizedFlatFileData build() { - assert dataFlags.size() > 0; return new CategorizedFlatFileData(uniqueProcessingId, dataFlags, stringDataRepresentation); } diff --git a/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java b/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java index 2603a2aad..16ffb2106 100644 --- a/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java +++ b/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java @@ -48,6 +48,11 @@ public class FlatFileDatabaseManagerTest { "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 String[] duplicateNameDatabaseData = { + "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:", + "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:631e3896-da2a-4077-974b-d047859d76bc:0:0:", + }; + private static String[] corruptDatabaseData = { "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:", @@ -66,7 +71,7 @@ public class FlatFileDatabaseManagerTest { @Test public void testPurgePowerlessUsers() { assertNotNull(db); - addDataToFile(db, normalDatabaseData); + replaceDataInFile(db, normalDatabaseData); int purgeCount = db.purgePowerlessUsers(); assertEquals(purgeCount, 1); //1 User should have been purged } @@ -75,7 +80,7 @@ public class FlatFileDatabaseManagerTest { public void testCheckFileHealthAndStructure() { assertNotNull(db); - addDataToFile(db, badDatabaseData); + replaceDataInFile(db, badDatabaseData); List dataFlags = db.checkFileHealthAndStructure(); assertNotNull(dataFlags); @@ -84,7 +89,13 @@ public class FlatFileDatabaseManagerTest { @Test public void testFindDuplicateNames() { + assertNotNull(db); + replaceDataInFile(db, duplicateNameDatabaseData); + + List dataFlags = db.checkFileHealthAndStructure(); + assertNotNull(dataFlags); + assertTrue(dataFlags.contains(FlatFileDataFlag.DUPLICATE_NAME_FIXABLE)); } @Test @@ -119,7 +130,7 @@ public class FlatFileDatabaseManagerTest { } - private void addDataToFile(@NotNull FlatFileDatabaseManager flatFileDatabaseManager, @NotNull String[] dataEntries) { + private void replaceDataInFile(@NotNull FlatFileDatabaseManager flatFileDatabaseManager, @NotNull String[] dataEntries) { String filePath = flatFileDatabaseManager.getUsersFile().getAbsolutePath(); BufferedReader in = null; FileWriter out = null; From 60013c710bce88af76352eef64b8f07fd87c9ad3 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 12 Apr 2021 09:33:43 -0700 Subject: [PATCH 494/662] Add more tests to FlatFileDatabaseManagerTest --- .../nossr50/database/FlatFileDataFlag.java | 2 +- .../database/FlatFileDataProcessor.java | 22 ++++--- .../database/FlatFileDatabaseManagerTest.java | 64 +++++++++++++------ 3 files changed, 60 insertions(+), 28 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/database/FlatFileDataFlag.java b/src/main/java/com/gmail/nossr50/database/FlatFileDataFlag.java index 12dab5a84..deae836b3 100644 --- a/src/main/java/com/gmail/nossr50/database/FlatFileDataFlag.java +++ b/src/main/java/com/gmail/nossr50/database/FlatFileDataFlag.java @@ -10,5 +10,5 @@ public enum FlatFileDataFlag { MISSING_OR_NULL_UUID, TOO_INCOMPLETE, JUNK, - EMPTY, + EMPTY_LINE, } diff --git a/src/main/java/com/gmail/nossr50/database/FlatFileDataProcessor.java b/src/main/java/com/gmail/nossr50/database/FlatFileDataProcessor.java index 6bac0bc1b..fe415fc79 100644 --- a/src/main/java/com/gmail/nossr50/database/FlatFileDataProcessor.java +++ b/src/main/java/com/gmail/nossr50/database/FlatFileDataProcessor.java @@ -39,7 +39,7 @@ public class FlatFileDataProcessor { * Is the line empty? */ if (lineData.isEmpty()) { - registerData(builder.appendFlag(FlatFileDataFlag.EMPTY)); + registerData(builder.appendFlag(FlatFileDataFlag.EMPTY_LINE)); return; } @@ -61,6 +61,10 @@ public class FlatFileDataProcessor { corruptDataFound = true; } + //Flag as junk (corrupt) + builder.appendFlag(FlatFileDataFlag.JUNK); + + //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) { @@ -68,10 +72,10 @@ public class FlatFileDataProcessor { registerData(builder.appendFlag(FlatFileDataFlag.TOO_INCOMPLETE)); return; } - } else { - registerData(builder.appendFlag(FlatFileDataFlag.JUNK)); - return; } + + registerData(builder.appendFlag(FlatFileDataFlag.JUNK)); + return; } /* @@ -132,13 +136,13 @@ public class FlatFileDataProcessor { } } - names.add(name); + if(!name.isEmpty()) + names.add(name); //Make sure the data is up to date schema wise if(splitDataLine.length < DATA_ENTRY_COUNT) { - String[] correctSizeSplitData = Arrays.copyOf(splitDataLine, DATA_ENTRY_COUNT); - lineData = org.apache.commons.lang.StringUtils.join(correctSizeSplitData, ":") + ":"; - splitDataLine = lineData.split(":"); + splitDataLine = Arrays.copyOf(splitDataLine, DATA_ENTRY_COUNT+1); + lineData = org.apache.commons.lang.StringUtils.join(splitDataLine, ":") + ":"; builder.appendFlag(FlatFileDataFlag.INCOMPLETE); builder.setStringDataRepresentation(lineData); } @@ -180,7 +184,7 @@ public class FlatFileDataProcessor { if(getExpectedValueType(index) == ExpectedType.IGNORED) { return false; } else { - return data.isEmpty(); + return data == null || data.isEmpty(); } } diff --git a/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java b/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java index 16ffb2106..f9ca5fbf9 100644 --- a/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java +++ b/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java @@ -42,26 +42,50 @@ public class FlatFileDatabaseManagerTest { } //Nothing wrong with this database - private static String[] normalDatabaseData = { + 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 String[] duplicateNameDatabaseData = { + 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:", + "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:" //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:", + "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:", + "" //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:", + "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[] duplicateNameDatabaseData = { "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:", "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:631e3896-da2a-4077-974b-d047859d76bc:0:0:", }; - private static String[] corruptDatabaseData = { + 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 String[] badDatabaseData = { + 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 @@ -70,7 +94,6 @@ public class FlatFileDatabaseManagerTest { @Test public void testPurgePowerlessUsers() { - assertNotNull(db); replaceDataInFile(db, normalDatabaseData); int purgeCount = db.purgePowerlessUsers(); assertEquals(purgeCount, 1); //1 User should have been purged @@ -78,8 +101,6 @@ public class FlatFileDatabaseManagerTest { @Test public void testCheckFileHealthAndStructure() { - assertNotNull(db); - replaceDataInFile(db, badDatabaseData); List dataFlags = db.checkFileHealthAndStructure(); @@ -89,38 +110,37 @@ public class FlatFileDatabaseManagerTest { @Test public void testFindDuplicateNames() { - assertNotNull(db); - - replaceDataInFile(db, duplicateNameDatabaseData); - - List dataFlags = db.checkFileHealthAndStructure(); - assertNotNull(dataFlags); - assertTrue(dataFlags.contains(FlatFileDataFlag.DUPLICATE_NAME_FIXABLE)); + addDataAndCheckForFlag(db, duplicateNameDatabaseData, FlatFileDataFlag.DUPLICATE_NAME_FIXABLE); } @Test public void testFindDuplicateUUIDs() { - + addDataAndCheckForFlag(db, duplicateUUIDDatabaseData, FlatFileDataFlag.DUPLICATE_UUID); } @Test public void testFindCorruptData() { - + addDataAndCheckForFlag(db, corruptDatabaseData, FlatFileDataFlag.JUNK); } @Test public void testFindEmptyNames() { + addDataAndCheckForFlag(db, emptyNameDatabaseData, FlatFileDataFlag.MISSING_NAME); + } + @Test + public void testFindEmptyLine() { + addDataAndCheckForFlag(db, emptyLineDatabaseData, FlatFileDataFlag.EMPTY_LINE); } @Test public void testFindBadValues() { - + addDataAndCheckForFlag(db, badDatabaseData, FlatFileDataFlag.BAD_VALUES); } @Test public void testFindOutdatedData() { - + addDataAndCheckForFlag(db, outdatedDatabaseData, FlatFileDataFlag.INCOMPLETE); } @Test @@ -182,4 +202,12 @@ public class FlatFileDatabaseManagerTest { } } + + private void addDataAndCheckForFlag(@NotNull FlatFileDatabaseManager targetDatabase, @NotNull String[] data, @NotNull FlatFileDataFlag flag) { + replaceDataInFile(targetDatabase, data); + + List dataFlags = targetDatabase.checkFileHealthAndStructure(); + assertNotNull(dataFlags); + assertTrue(dataFlags.contains(flag)); + } } \ No newline at end of file From 85f3221a6057fb709e5cbd3be21e382c8554c6e6 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 12 Apr 2021 12:55:31 -0700 Subject: [PATCH 495/662] FlatFileDataProcessor will handle fixing and repairing the data --- .../database/FlatFileDataContainer.java | 5 - .../nossr50/database/FlatFileDataFlag.java | 5 +- .../database/FlatFileDataProcessor.java | 120 +++++++------ .../database/FlatFileDatabaseManager.java | 168 ++++-------------- .../flatfile/BadCategorizedFlatFileData.java | 42 +++++ .../flatfile/CategorizedFlatFileData.java | 44 +++-- .../CategorizedFlatFileDataBuilder.java | 32 ---- .../flatfile/FlatFileDataBuilder.java | 42 +++++ .../flatfile/FlatFileDataContainer.java | 21 +++ .../flatfile/FlatFileSaveDataProcessor.java | 117 ++++++++++++ .../database/FlatFileDatabaseManagerTest.java | 46 +++-- 11 files changed, 380 insertions(+), 262 deletions(-) delete mode 100644 src/main/java/com/gmail/nossr50/database/FlatFileDataContainer.java create mode 100644 src/main/java/com/gmail/nossr50/database/flatfile/BadCategorizedFlatFileData.java delete mode 100644 src/main/java/com/gmail/nossr50/database/flatfile/CategorizedFlatFileDataBuilder.java create mode 100644 src/main/java/com/gmail/nossr50/database/flatfile/FlatFileDataBuilder.java create mode 100644 src/main/java/com/gmail/nossr50/database/flatfile/FlatFileDataContainer.java create mode 100644 src/main/java/com/gmail/nossr50/database/flatfile/FlatFileSaveDataProcessor.java diff --git a/src/main/java/com/gmail/nossr50/database/FlatFileDataContainer.java b/src/main/java/com/gmail/nossr50/database/FlatFileDataContainer.java deleted file mode 100644 index 5559714a7..000000000 --- a/src/main/java/com/gmail/nossr50/database/FlatFileDataContainer.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.gmail.nossr50.database; - -//Marker interface -public interface FlatFileDataContainer { -} diff --git a/src/main/java/com/gmail/nossr50/database/FlatFileDataFlag.java b/src/main/java/com/gmail/nossr50/database/FlatFileDataFlag.java index deae836b3..58c3f6892 100644 --- a/src/main/java/com/gmail/nossr50/database/FlatFileDataFlag.java +++ b/src/main/java/com/gmail/nossr50/database/FlatFileDataFlag.java @@ -4,10 +4,9 @@ public enum FlatFileDataFlag { INCOMPLETE, BAD_VALUES, MISSING_NAME, - DUPLICATE_NAME_FIXABLE, - DUPLICATE_NAME_NOT_FIXABLE, + DUPLICATE_NAME, DUPLICATE_UUID, - MISSING_OR_NULL_UUID, + BAD_UUID_DATA, //Can be because it is missing, null, or just not compatible data TOO_INCOMPLETE, JUNK, EMPTY_LINE, diff --git a/src/main/java/com/gmail/nossr50/database/FlatFileDataProcessor.java b/src/main/java/com/gmail/nossr50/database/FlatFileDataProcessor.java index fe415fc79..674cfc47b 100644 --- a/src/main/java/com/gmail/nossr50/database/FlatFileDataProcessor.java +++ b/src/main/java/com/gmail/nossr50/database/FlatFileDataProcessor.java @@ -1,30 +1,27 @@ package com.gmail.nossr50.database; -import com.gmail.nossr50.database.flatfile.CategorizedFlatFileData; -import com.gmail.nossr50.database.flatfile.CategorizedFlatFileDataBuilder; +import com.gmail.nossr50.database.flatfile.FlatFileDataBuilder; +import com.gmail.nossr50.database.flatfile.FlatFileDataContainer; +import com.gmail.nossr50.database.flatfile.FlatFileSaveDataProcessor; import org.jetbrains.annotations.NotNull; -import java.io.File; import java.util.*; import java.util.logging.Logger; import static com.gmail.nossr50.database.FlatFileDatabaseManager.*; public class FlatFileDataProcessor { - public static final String INVALID_OLD_USERNAME = "_INVALID_OLD_USERNAME_"; - private @NotNull List categorizedDataList; - private @NotNull List flatFileDataFlags; - private final @NotNull File userFile; + 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; boolean corruptDataFound; - public FlatFileDataProcessor(@NotNull File userFile, @NotNull Logger logger) { - this.userFile = userFile; + public FlatFileDataProcessor(@NotNull Logger logger) { this.logger = logger; - categorizedDataList = new ArrayList<>(); + flatFileDataContainers = new ArrayList<>(); flatFileDataFlags = new ArrayList<>(); names = new HashSet<>(); uuids = new HashSet<>(); @@ -32,16 +29,7 @@ public class FlatFileDataProcessor { } public void processData(@NotNull String lineData) { - CategorizedFlatFileDataBuilder builder = new CategorizedFlatFileDataBuilder(lineData, uniqueProcessingID); - uniqueProcessingID++; - - /* - * Is the line empty? - */ - if (lineData.isEmpty()) { - registerData(builder.appendFlag(FlatFileDataFlag.EMPTY_LINE)); - return; - } + assert !lineData.isEmpty(); //Make sure the data line is "correct" if(lineData.charAt(lineData.length() - 1) != ':') { @@ -53,6 +41,11 @@ public class FlatFileDataProcessor { //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 @@ -82,7 +75,6 @@ public class FlatFileDataProcessor { * Check for duplicate names */ - boolean nameIsDupe = false; boolean invalidUUID = false; String name = splitDataLine[USERNAME_INDEX]; @@ -91,12 +83,17 @@ public class FlatFileDataProcessor { 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.MISSING_OR_NULL_UUID); + builder.appendFlag(FlatFileDataFlag.BAD_UUID_DATA); + + anyBadData = true; } UUID uuid = null; @@ -104,36 +101,23 @@ public class FlatFileDataProcessor { try { uuid = UUID.fromString(strOfUUID); } catch (IllegalArgumentException e) { - invalidUUID = true; //UUID does not conform - + invalidUUID = true; + badDataValues[UUID_INDEX] = true; reportBadDataLine("Invalid UUID data found for user", strOfUUID, lineData); - e.printStackTrace(); + builder.appendFlag(FlatFileDataFlag.BAD_UUID_DATA); } //Duplicate UUID is no good, reject them - if(uuid != null && uuids.contains(uuid)) { + if(!invalidUUID && uuid != null && uuids.contains(uuid)) { registerData(builder.appendFlag(FlatFileDataFlag.DUPLICATE_UUID)); return; } uuids.add(uuid); - if(names.contains(name)) { - //Duplicate entry - nameIsDupe = true; - - //We can accept them if they are a duped name if they have a unique UUID - if(invalidUUID) { - //Reject the data - reportBadDataLine("Duplicate user found and due to a missing UUID their data had to be discarded", name, lineData); - - registerData(builder.appendFlag(FlatFileDataFlag.DUPLICATE_NAME_NOT_FIXABLE)); - return; - } else { - builder.appendFlag(FlatFileDataFlag.DUPLICATE_NAME_FIXABLE); - } + builder.appendFlag(FlatFileDataFlag.DUPLICATE_NAME); } if(!name.isEmpty()) @@ -141,10 +125,17 @@ public class FlatFileDataProcessor { //Make sure the data is up to date schema wise if(splitDataLine.length < DATA_ENTRY_COUNT) { - splitDataLine = Arrays.copyOf(splitDataLine, DATA_ENTRY_COUNT+1); - lineData = org.apache.commons.lang.StringUtils.join(splitDataLine, ":") + ":"; + 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.setStringDataRepresentation(lineData); + builder.setSplitStringData(splitDataLine); } /* @@ -153,9 +144,6 @@ public class FlatFileDataProcessor { */ //Check each data for bad values - boolean[] badDataValues = new boolean[DATA_ENTRY_COUNT]; - boolean anyBadData = false; - for(int i = 0; i < DATA_ENTRY_COUNT; i++) { if(shouldNotBeEmpty(splitDataLine[i], i)) { badDataValues[i] = true; @@ -175,6 +163,7 @@ public class FlatFileDataProcessor { if(anyBadData) { builder.appendFlag(FlatFileDataFlag.BAD_VALUES); + builder.appendBadDataValues(badDataValues); } registerData(builder); @@ -240,13 +229,15 @@ public class FlatFileDataProcessor { return UUID_INDEX + 1; } - private void registerData(@NotNull CategorizedFlatFileDataBuilder builder) { - CategorizedFlatFileData categorizedFlatFileData = builder.build(); - categorizedDataList.add(categorizedFlatFileData); - flatFileDataFlags.addAll(categorizedFlatFileData.getDataFlags()); + private void registerData(@NotNull FlatFileDataBuilder builder) { + FlatFileDataContainer flatFileDataContainer = builder.build(); + flatFileDataContainers.add(flatFileDataContainer); + + if(flatFileDataContainer.getDataFlags() != null) + flatFileDataFlags.addAll(flatFileDataContainer.getDataFlags()); } - public @NotNull ExpectedType getExpectedValueType(int dataIndex) { + public @NotNull ExpectedType getExpectedValueType(int dataIndex) throws IndexOutOfBoundsException { switch(dataIndex) { case USERNAME_INDEX: return ExpectedType.STRING; @@ -297,13 +288,13 @@ public class FlatFileDataProcessor { return ExpectedType.FLOAT; case UUID_INDEX: return ExpectedType.UUID; - default: - return ExpectedType.OUT_OF_RANGE; } + + throw new IndexOutOfBoundsException(); } - public @NotNull List getCategorizedDataList() { - return categorizedDataList; + public @NotNull List getFlatFileDataContainers() { + return flatFileDataContainers; } public @NotNull List getFlatFileDataFlags() { @@ -313,4 +304,23 @@ public class FlatFileDataProcessor { 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 = FlatFileSaveDataProcessor.getPreparedSaveDataLine(dataContainer); + + if(splitData == null) + continue; + + 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 index 41ee427d1..37e58b2eb 100644 --- a/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java @@ -20,6 +20,7 @@ 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; @@ -965,24 +966,45 @@ public final class FlatFileDatabaseManager implements DatabaseManager { playerStatHash.put(PrimarySkillType.ALCHEMY, alchemy); } + /** + * Makes sure that the users file has valid entries + * @return + */ public @Nullable List checkFileHealthAndStructure() { FlatFileDataProcessor dataProcessor = null; if (usersFile.exists()) { BufferedReader bufferedReader = null; + FileWriter fileWriter = null; synchronized (fileWritingLock) { - dataProcessor = new FlatFileDataProcessor(usersFile, logger); + dataProcessor = new FlatFileDataProcessor(logger); try { String currentLine; bufferedReader = new BufferedReader(new FileReader(usersFilePath)); + + //Analyze the data while ((currentLine = bufferedReader.readLine()) != null) { + 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) { + logger.info("Saving the updated and or repaired FlatFile Database..."); + fileWriter = new FileWriter(usersFilePath); + //Write data to file + fileWriter.write(dataProcessor.processDataForSave().toString()); + } } catch (IOException e) { e.printStackTrace(); + } finally { + closeResources(bufferedReader, fileWriter); } } } @@ -994,139 +1016,23 @@ public final class FlatFileDatabaseManager implements DatabaseManager { } } - - /** - * Checks that the file is present and valid - */ - public int checkFileHealthAndStructureOld() { - boolean corruptDataFound = false; - boolean oldDataFound = false; - - if (usersFile.exists()) { - BufferedReader in = null; - FileWriter out = null; - - 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 rawSplitData being ':' - if (line.charAt(line.length() - 1) != ':') { - line = line.concat(":"); - } - - String[] rawSplitData = line.split(":"); - - //Not enough data found to be considered a user reliably (NOTE: not foolproof) - if(rawSplitData.length < (UUID_INDEX + 1)) { - 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; - } - - if(rawSplitData.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 - && rawSplitData[0] != null && !rawSplitData[0].isEmpty()) { - if(rawSplitData[0].length() <= 16 && rawSplitData[0].length() >= 3) { - logger.severe("Not enough data found to recover corrupted player data for user: "+rawSplitData[0]); - } - } - //This user may have had a name so declare it - - continue; - } - - // Prevent the same username from being present multiple times - if (!usernames.add(rawSplitData[USERNAME_INDEX])) { - //TODO: Check if the commented out code was even necessary - rawSplitData[USERNAME_INDEX] = "_INVALID_OLD_USERNAME_'"; - if (rawSplitData.length < UUID_INDEX + 1 || rawSplitData[UUID_INDEX].equals("NULL")) { - logger.severe("Fixing duplicate player names found in mcmmo.users"); - continue; - } - } - - // Prevent the same player from being present multiple times - if (rawSplitData.length >= (UUID_INDEX + 1) //TODO: Test this condition - && (!rawSplitData[UUID_INDEX].isEmpty() - && !rawSplitData[UUID_INDEX].equals("NULL") && !players.add(rawSplitData[UUID_INDEX]))) { - - logger.severe("Removing duplicate player data from mcmmo.users"); - logger.info("Duplicate Data: "+line); - continue; - } - - //Correctly size the data (null entries for missing values) - if(line.length() < DATA_ENTRY_COUNT) { //TODO: Test this condition - oldDataFound = true; - String[] correctSizeSplitData = Arrays.copyOf(rawSplitData, DATA_ENTRY_COUNT); - line = org.apache.commons.lang.StringUtils.join(correctSizeSplitData, ":") + ":"; - rawSplitData = line.split(":"); - PlayerProfile temporaryProfile = loadFromLine(rawSplitData); - writeUserToLine(temporaryProfile, rawSplitData[USERNAME_INDEX], temporaryProfile.getUniqueId(), writer); - } else { - writer.append(line).append("\r\n"); - } - - } - - // 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) { - e.printStackTrace(); - } - } - if (out != null) { - try { - out.close(); - } - catch (IOException e) { - e.printStackTrace(); - } - } - } + private void closeResources(BufferedReader bufferedReader, FileWriter fileWriter) { + if(bufferedReader != null) { + try { + bufferedReader.close(); + } + catch (IOException e) { + e.printStackTrace(); } - - if(corruptDataFound) - logger.info("Corrupt data was found and removed, everything should be working fine. It is possible some player data was lost."); } - usersFile.getParentFile().mkdir(); - - try { - logger.info("Creating mcmmo.users file..."); - new File(usersFilePath).createNewFile(); - } - catch (IOException e) { - e.printStackTrace(); - } - - if(corruptDataFound) { - return 1; - } else if(oldDataFound) { - return 2; - } else { - return 0; + if (fileWriter != null) { + try { + fileWriter.close(); + } + catch (IOException e) { + e.printStackTrace(); + } } } 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 index 341d3d949..8ed0478cb 100644 --- a/src/main/java/com/gmail/nossr50/database/flatfile/CategorizedFlatFileData.java +++ b/src/main/java/com/gmail/nossr50/database/flatfile/CategorizedFlatFileData.java @@ -1,8 +1,7 @@ package com.gmail.nossr50.database.flatfile; -import com.gmail.nossr50.database.FlatFileDataContainer; import com.gmail.nossr50.database.FlatFileDataFlag; -import com.gmail.nossr50.database.FlatFileDatabaseManager; +import com.google.common.base.Objects; import org.jetbrains.annotations.NotNull; import java.util.HashSet; @@ -10,30 +9,21 @@ import java.util.Set; public class CategorizedFlatFileData implements FlatFileDataContainer { private final @NotNull Set dataFlags; - private final @NotNull String stringDataRepresentation; + private final @NotNull String[] splitData; private final int uniqueProcessingId; - private final boolean[] badDataIndexes; - protected CategorizedFlatFileData(int uniqueProcessingId, @NotNull HashSet dataFlags, @NotNull String stringDataRepresentation) { + protected CategorizedFlatFileData(int uniqueProcessingId, @NotNull HashSet dataFlags, @NotNull String[] splitData) { this.uniqueProcessingId = uniqueProcessingId; this.dataFlags = dataFlags; - this.stringDataRepresentation = stringDataRepresentation; - badDataIndexes = new boolean[FlatFileDatabaseManager.DATA_ENTRY_COUNT]; - } - - protected CategorizedFlatFileData(int uniqueProcessingId, @NotNull HashSet dataFlags, @NotNull String stringDataRepresentation, boolean[] badDataIndexes) { - this.uniqueProcessingId = uniqueProcessingId; - this.dataFlags = dataFlags; - this.stringDataRepresentation = stringDataRepresentation; - this.badDataIndexes = badDataIndexes; + this.splitData = splitData; } public @NotNull Set getDataFlags() { return dataFlags; } - public @NotNull String getStringDataRepresentation() { - return stringDataRepresentation; + public @NotNull String[] getSplitData() { + return splitData; } public int getUniqueProcessingId() { @@ -44,7 +34,25 @@ public class CategorizedFlatFileData implements FlatFileDataContainer { return dataFlags.size() == 0; } - public boolean[] getBadDataIndexes() { - return badDataIndexes; + @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/CategorizedFlatFileDataBuilder.java b/src/main/java/com/gmail/nossr50/database/flatfile/CategorizedFlatFileDataBuilder.java deleted file mode 100644 index 0723ff3ef..000000000 --- a/src/main/java/com/gmail/nossr50/database/flatfile/CategorizedFlatFileDataBuilder.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.gmail.nossr50.database.flatfile; - -import com.gmail.nossr50.database.FlatFileDataFlag; -import org.jetbrains.annotations.NotNull; - -import java.util.HashSet; - -public class CategorizedFlatFileDataBuilder { - private final @NotNull HashSet dataFlags; - private @NotNull String stringDataRepresentation; - private final int uniqueProcessingId; - - public CategorizedFlatFileDataBuilder(@NotNull String stringDataRepresentation, int uniqueProcessingId) { - this.uniqueProcessingId = uniqueProcessingId; - this.stringDataRepresentation = stringDataRepresentation; - dataFlags = new HashSet<>(); - } - - public CategorizedFlatFileDataBuilder appendFlag(@NotNull FlatFileDataFlag dataFlag) { - dataFlags.add(dataFlag); - return this; - } - - public CategorizedFlatFileData build() { - return new CategorizedFlatFileData(uniqueProcessingId, dataFlags, stringDataRepresentation); - } - - public CategorizedFlatFileDataBuilder setStringDataRepresentation(@NotNull String stringDataRepresentation) { - this.stringDataRepresentation = stringDataRepresentation; - return this; - } -} 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/FlatFileSaveDataProcessor.java b/src/main/java/com/gmail/nossr50/database/flatfile/FlatFileSaveDataProcessor.java new file mode 100644 index 000000000..1e109cbcf --- /dev/null +++ b/src/main/java/com/gmail/nossr50/database/flatfile/FlatFileSaveDataProcessor.java @@ -0,0 +1,117 @@ +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.*; +import static com.gmail.nossr50.database.FlatFileDatabaseManager.UUID_INDEX; + +public class FlatFileSaveDataProcessor { + + 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.JUNK) + || 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) + || dataContainer.getDataFlags().contains(FlatFileDataFlag.EMPTY_LINE)) { + 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 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 LAST_LOGIN: + return String.valueOf(System.currentTimeMillis() / 1000); //This is just to shorten the value + 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/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java b/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java index f9ca5fbf9..32a424ea0 100644 --- a/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java +++ b/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java @@ -48,28 +48,34 @@ public class FlatFileDatabaseManagerTest { "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:", - "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:" //This user is missing data added after UUID index + "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:", - "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:", + "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:", - "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:" + "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 = { - "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:", - "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:631e3896-da2a-4077-974b-d047859d76bc: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: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 = { @@ -109,38 +115,43 @@ public class FlatFileDatabaseManagerTest { } @Test - public void testFindDuplicateNames() { - addDataAndCheckForFlag(db, duplicateNameDatabaseData, FlatFileDataFlag.DUPLICATE_NAME_FIXABLE); + public void testFindFixableDuplicateNames() { + overwriteDataAndCheckForFlag(db, duplicateNameDatabaseData, FlatFileDataFlag.DUPLICATE_NAME); } @Test public void testFindDuplicateUUIDs() { - addDataAndCheckForFlag(db, duplicateUUIDDatabaseData, FlatFileDataFlag.DUPLICATE_UUID); + overwriteDataAndCheckForFlag(db, duplicateUUIDDatabaseData, FlatFileDataFlag.DUPLICATE_UUID); + } + + @Test() + public void findBadUUIDData() { + overwriteDataAndCheckForFlag(db, badUUIDDatabaseData, FlatFileDataFlag.BAD_UUID_DATA); } @Test public void testFindCorruptData() { - addDataAndCheckForFlag(db, corruptDatabaseData, FlatFileDataFlag.JUNK); + overwriteDataAndCheckForFlag(db, corruptDatabaseData, FlatFileDataFlag.JUNK); } @Test public void testFindEmptyNames() { - addDataAndCheckForFlag(db, emptyNameDatabaseData, FlatFileDataFlag.MISSING_NAME); + overwriteDataAndCheckForFlag(db, emptyNameDatabaseData, FlatFileDataFlag.MISSING_NAME); } - @Test - public void testFindEmptyLine() { - addDataAndCheckForFlag(db, emptyLineDatabaseData, FlatFileDataFlag.EMPTY_LINE); - } +// @Test +// public void testFindEmptyLine() { +// overwriteDataAndCheckForFlag(db, emptyLineDatabaseData, FlatFileDataFlag.EMPTY_LINE); +// } @Test public void testFindBadValues() { - addDataAndCheckForFlag(db, badDatabaseData, FlatFileDataFlag.BAD_VALUES); + overwriteDataAndCheckForFlag(db, badDatabaseData, FlatFileDataFlag.BAD_VALUES); } @Test public void testFindOutdatedData() { - addDataAndCheckForFlag(db, outdatedDatabaseData, FlatFileDataFlag.INCOMPLETE); + overwriteDataAndCheckForFlag(db, outdatedDatabaseData, FlatFileDataFlag.INCOMPLETE); } @Test @@ -149,7 +160,6 @@ public class FlatFileDatabaseManagerTest { assertEquals(db.getDatabaseType(), DatabaseType.FLATFILE); } - private void replaceDataInFile(@NotNull FlatFileDatabaseManager flatFileDatabaseManager, @NotNull String[] dataEntries) { String filePath = flatFileDatabaseManager.getUsersFile().getAbsolutePath(); BufferedReader in = null; @@ -203,7 +213,7 @@ public class FlatFileDatabaseManagerTest { } - private void addDataAndCheckForFlag(@NotNull FlatFileDatabaseManager targetDatabase, @NotNull String[] data, @NotNull FlatFileDataFlag flag) { + private void overwriteDataAndCheckForFlag(@NotNull FlatFileDatabaseManager targetDatabase, @NotNull String[] data, @NotNull FlatFileDataFlag flag) { replaceDataInFile(targetDatabase, data); List dataFlags = targetDatabase.checkFileHealthAndStructure(); From 9f22cef175996cd97dc70135cb158e93da09d1b5 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 12 Apr 2021 13:18:41 -0700 Subject: [PATCH 496/662] More tests --- .../nossr50/database/FlatFileDataFlag.java | 5 +- .../database/FlatFileDataProcessor.java | 51 +++++++++++-------- .../flatfile/CategorizedFlatFileData.java | 2 +- .../flatfile/FlatFileSaveDataProcessor.java | 6 +-- .../database/FlatFileDataProcessorTest.java | 23 +++++++++ .../database/FlatFileDatabaseManagerTest.java | 7 +-- .../FlatFileSaveDataProcessorTest.java | 27 ++++++++++ 7 files changed, 87 insertions(+), 34 deletions(-) create mode 100644 src/test/java/com/gmail/nossr50/database/FlatFileDataProcessorTest.java create mode 100644 src/test/java/com/gmail/nossr50/database/flatfile/FlatFileSaveDataProcessorTest.java diff --git a/src/main/java/com/gmail/nossr50/database/FlatFileDataFlag.java b/src/main/java/com/gmail/nossr50/database/FlatFileDataFlag.java index 58c3f6892..b67fe2806 100644 --- a/src/main/java/com/gmail/nossr50/database/FlatFileDataFlag.java +++ b/src/main/java/com/gmail/nossr50/database/FlatFileDataFlag.java @@ -6,8 +6,7 @@ public enum FlatFileDataFlag { MISSING_NAME, DUPLICATE_NAME, DUPLICATE_UUID, - BAD_UUID_DATA, //Can be because it is missing, null, or just not compatible data + BAD_UUID_DATA, //Can be because it is missing, null, or corrupted or some other reason TOO_INCOMPLETE, - JUNK, - EMPTY_LINE, + 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 index 674cfc47b..ddda18143 100644 --- a/src/main/java/com/gmail/nossr50/database/FlatFileDataProcessor.java +++ b/src/main/java/com/gmail/nossr50/database/FlatFileDataProcessor.java @@ -16,7 +16,7 @@ public class FlatFileDataProcessor { private final @NotNull Logger logger; private final HashSet names; private final HashSet uuids; - private int uniqueProcessingID; + private int uniqueProcessingID; //TODO: Not being used, should we use it? boolean corruptDataFound; public FlatFileDataProcessor(@NotNull Logger logger) { @@ -55,7 +55,7 @@ public class FlatFileDataProcessor { } //Flag as junk (corrupt) - builder.appendFlag(FlatFileDataFlag.JUNK); + 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 @@ -67,7 +67,7 @@ public class FlatFileDataProcessor { } } - registerData(builder.appendFlag(FlatFileDataFlag.JUNK)); + registerData(builder.appendFlag(FlatFileDataFlag.CORRUPTED_OR_UNRECOGNIZABLE)); return; } @@ -123,20 +123,8 @@ public class FlatFileDataProcessor { if(!name.isEmpty()) names.add(name); - //Make sure the data is up to date schema wise - 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); - } + //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 @@ -169,6 +157,26 @@ public class FlatFileDataProcessor { 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(String data, int index) { if(getExpectedValueType(index) == ExpectedType.IGNORED) { return false; @@ -221,8 +229,9 @@ public class FlatFileDataProcessor { } private void reportBadDataLine(String warning, String context, String dataLine) { - logger.severe("FlatFileDatabaseBuilder Warning: " + warning + " - " + context); - logger.severe("FlatFileDatabaseBuilder: (Line Data) - " + 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() { @@ -237,7 +246,7 @@ public class FlatFileDataProcessor { flatFileDataFlags.addAll(flatFileDataContainer.getDataFlags()); } - public @NotNull ExpectedType getExpectedValueType(int dataIndex) throws IndexOutOfBoundsException { + public static @NotNull ExpectedType getExpectedValueType(int dataIndex) throws IndexOutOfBoundsException { switch(dataIndex) { case USERNAME_INDEX: return ExpectedType.STRING; @@ -316,6 +325,8 @@ public class FlatFileDataProcessor { 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"); } diff --git a/src/main/java/com/gmail/nossr50/database/flatfile/CategorizedFlatFileData.java b/src/main/java/com/gmail/nossr50/database/flatfile/CategorizedFlatFileData.java index 8ed0478cb..500be9c4f 100644 --- a/src/main/java/com/gmail/nossr50/database/flatfile/CategorizedFlatFileData.java +++ b/src/main/java/com/gmail/nossr50/database/flatfile/CategorizedFlatFileData.java @@ -12,7 +12,7 @@ public class CategorizedFlatFileData implements FlatFileDataContainer { private final @NotNull String[] splitData; private final int uniqueProcessingId; - protected CategorizedFlatFileData(int uniqueProcessingId, @NotNull HashSet dataFlags, @NotNull String[] splitData) { + public CategorizedFlatFileData(int uniqueProcessingId, @NotNull HashSet dataFlags, @NotNull String[] splitData) { this.uniqueProcessingId = uniqueProcessingId; this.dataFlags = dataFlags; this.splitData = splitData; diff --git a/src/main/java/com/gmail/nossr50/database/flatfile/FlatFileSaveDataProcessor.java b/src/main/java/com/gmail/nossr50/database/flatfile/FlatFileSaveDataProcessor.java index 1e109cbcf..eb06d1dab 100644 --- a/src/main/java/com/gmail/nossr50/database/flatfile/FlatFileSaveDataProcessor.java +++ b/src/main/java/com/gmail/nossr50/database/flatfile/FlatFileSaveDataProcessor.java @@ -6,7 +6,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import static com.gmail.nossr50.database.FlatFileDatabaseManager.*; -import static com.gmail.nossr50.database.FlatFileDatabaseManager.UUID_INDEX; public class FlatFileSaveDataProcessor { @@ -18,11 +17,10 @@ public class FlatFileSaveDataProcessor { //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.JUNK) + 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) - || dataContainer.getDataFlags().contains(FlatFileDataFlag.EMPTY_LINE)) { + || dataContainer.getDataFlags().contains(FlatFileDataFlag.TOO_INCOMPLETE)) { return null; } 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..2acbd41f8 --- /dev/null +++ b/src/test/java/com/gmail/nossr50/database/FlatFileDataProcessorTest.java @@ -0,0 +1,23 @@ +package com.gmail.nossr50.database; + +import org.junit.Test; + +public class FlatFileDataProcessorTest { + + @SuppressWarnings("ResultOfMethodCallIgnored") + @Test + public void testGetExpectedValueType() { + for(int i = 0; i < FlatFileDatabaseManager.DATA_ENTRY_COUNT; i++) { + FlatFileDataProcessor.getExpectedValueType(i); + } + } + + @SuppressWarnings("ResultOfMethodCallIgnored") + @Test(expected = IndexOutOfBoundsException.class) + public void testGetExpectedValueTypeException() { + for(int i = 0; i < FlatFileDatabaseManager.DATA_ENTRY_COUNT+1; i++) { + FlatFileDataProcessor.getExpectedValueType(i); + } + } + +} \ No newline at end of file diff --git a/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java b/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java index 32a424ea0..795f89e96 100644 --- a/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java +++ b/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java @@ -131,7 +131,7 @@ public class FlatFileDatabaseManagerTest { @Test public void testFindCorruptData() { - overwriteDataAndCheckForFlag(db, corruptDatabaseData, FlatFileDataFlag.JUNK); + overwriteDataAndCheckForFlag(db, corruptDatabaseData, FlatFileDataFlag.CORRUPTED_OR_UNRECOGNIZABLE); } @Test @@ -139,11 +139,6 @@ public class FlatFileDatabaseManagerTest { overwriteDataAndCheckForFlag(db, emptyNameDatabaseData, FlatFileDataFlag.MISSING_NAME); } -// @Test -// public void testFindEmptyLine() { -// overwriteDataAndCheckForFlag(db, emptyLineDatabaseData, FlatFileDataFlag.EMPTY_LINE); -// } - @Test public void testFindBadValues() { overwriteDataAndCheckForFlag(db, badDatabaseData, FlatFileDataFlag.BAD_VALUES); diff --git a/src/test/java/com/gmail/nossr50/database/flatfile/FlatFileSaveDataProcessorTest.java b/src/test/java/com/gmail/nossr50/database/flatfile/FlatFileSaveDataProcessorTest.java new file mode 100644 index 000000000..8b10772fa --- /dev/null +++ b/src/test/java/com/gmail/nossr50/database/flatfile/FlatFileSaveDataProcessorTest.java @@ -0,0 +1,27 @@ +package com.gmail.nossr50.database.flatfile; + +import com.gmail.nossr50.database.FlatFileDatabaseManager; +import org.junit.Test; + +import java.util.HashSet; + +public class FlatFileSaveDataProcessorTest { + + @Test + public void getPreparedSaveDataLine() { + } + + @Test + public void repairBadData() { + } + + @Test + public void getZeroInitialisedData() { + } + + @Test(expected = AssertionError.class) + public void testTooManyDataEntriesSplitString() { + FlatFileDataContainer dataContainer = new CategorizedFlatFileData(0, new HashSet<>(), new String[FlatFileDatabaseManager.DATA_ENTRY_COUNT + 1]); + FlatFileSaveDataProcessor.getPreparedSaveDataLine(dataContainer); + } +} \ No newline at end of file From 5b4af3f9cedc62839f32e3bbfbe03105b17f622d Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 12 Apr 2021 16:59:35 -0700 Subject: [PATCH 497/662] Add loadFromFile test --- pom.xml | 10 +++ .../database/FlatFileDatabaseManager.java | 32 +++++--- .../database/FlatFileDatabaseManagerTest.java | 79 ++++++++++++++++++- src/test/resources/baddatadb.users | 23 ++++++ 4 files changed, 130 insertions(+), 14 deletions(-) create mode 100644 src/test/resources/baddatadb.users diff --git a/pom.xml b/pom.xml index 577fc927d..c39db8f41 100755 --- a/pom.xml +++ b/pom.xml @@ -65,6 +65,16 @@ + + org.apache.maven.plugins + maven-surefire-plugin + 2.16 + + false + 1 + + + org.apache.maven.plugins maven-release-plugin diff --git a/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java index 37e58b2eb..8d20ef811 100644 --- a/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java @@ -76,26 +76,29 @@ public final class FlatFileDatabaseManager implements DatabaseManager { public static final int DATA_ENTRY_COUNT = COOLDOWN_CHIMAERA_WING + 1; //Update this everytime new data is added - protected FlatFileDatabaseManager(@NotNull String usersFilePath, @NotNull Logger logger, long purgeTime, int startingLevel) { - usersFile = new File(usersFilePath); - this.usersFilePath = usersFilePath; + 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; - checkFileHealthAndStructure(); - List flatFileDataFlags = checkFileHealthAndStructure(); + if(!testing) { + List flatFileDataFlags = checkFileHealthAndStructure(); - if(flatFileDataFlags != null) { - if(flatFileDataFlags.size() > 0) { - logger.info("Detected "+flatFileDataFlags.size() + " data entries which need correction."); + if(flatFileDataFlags != null) { + if(flatFileDataFlags.size() > 0) { + logger.info("Detected "+flatFileDataFlags.size() + " data entries which need correction."); + } } } - - checkFileHealthAndStructure(); -// 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; @@ -971,6 +974,8 @@ public final class FlatFileDatabaseManager implements DatabaseManager { * @return */ public @Nullable List checkFileHealthAndStructure() { + ArrayList flagsFound = null; + logger.info("(" + usersFile.getPath() + ") Validating database file.."); FlatFileDataProcessor dataProcessor = null; if (usersFile.exists()) { @@ -996,6 +1001,7 @@ public final class FlatFileDatabaseManager implements DatabaseManager { //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 @@ -1009,10 +1015,10 @@ public final class FlatFileDatabaseManager implements DatabaseManager { } } - if(dataProcessor == null || dataProcessor.getFlatFileDataFlags() == null) { + if(flagsFound == null || flagsFound.size() == 0) { return null; } else { - return dataProcessor.getFlatFileDataFlags(); + return flagsFound; } } diff --git a/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java b/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java index 795f89e96..5fdc3781f 100644 --- a/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java +++ b/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java @@ -9,10 +9,18 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; import org.powermock.modules.junit4.PowerMockRunner; import java.io.*; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.URL; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; import java.util.List; +import java.util.Objects; import java.util.logging.Logger; import static org.junit.Assert.*; @@ -23,6 +31,8 @@ public class FlatFileDatabaseManagerTest { public static final @NotNull String TEST_FILE_NAME = "test.mcmmo.users"; public static final int HEALTHY_RETURN_CODE = 0; + public static final 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 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:"; private static File tempDir; private final static @NotNull Logger logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); private final long PURGE_TIME = 2630000000L; @@ -32,7 +42,7 @@ public class FlatFileDatabaseManagerTest { public void init() { assertNull(db); tempDir = Files.createTempDir(); - db = new FlatFileDatabaseManager(tempDir.getPath() + File.separator + TEST_FILE_NAME, logger, PURGE_TIME, 0); + db = new FlatFileDatabaseManager(new File(tempDir.getPath() + File.separator + TEST_FILE_NAME), logger, PURGE_TIME, 0, true); } @After @@ -155,6 +165,73 @@ public class FlatFileDatabaseManagerTest { assertEquals(db.getDatabaseType(), DatabaseType.FLATFILE); } + @Test + public void testLoadFromFile() { + Path resourceDirectory = Paths.get("src","test","resources"); + String absolutePath = resourceDirectory.toFile().getAbsolutePath(); + + ClassLoader classLoader = getClass().getClassLoader(); + URI resourceFileURI = null; + + try { + resourceFileURI = classLoader.getResource("baddatadb.users").toURI(); + } catch (URISyntaxException e) { + e.printStackTrace(); + } + + assertNotNull(resourceFileURI); + File fromResourcesFile = new File(resourceFileURI); + assertNotNull(resourceFileURI); + File copyOfFile = new File(tempDir.getPath() + File.separator + "baddatafile.users"); + + 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); + System.out.println("File Path: "+copyOfFile.getAbsolutePath()); + assertEquals(BAD_FILE_LINE_ONE.split(":"), dataFromFile.get(0)); + assertEquals(dataFromFile.get(22)[0], "nossr51"); + assertEquals(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 void replaceDataInFile(@NotNull FlatFileDatabaseManager flatFileDatabaseManager, @NotNull String[] dataEntries) { String filePath = flatFileDatabaseManager.getUsersFile().getAbsolutePath(); BufferedReader in = null; 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: From f7339277f8f78d31c412b3dfca7abb24354552da Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 13 Apr 2021 12:41:23 -0700 Subject: [PATCH 498/662] Add more tests, fix null name bug --- Changelog.txt | 7 +- .../com/gmail/nossr50/api/ExperienceAPI.java | 13 +- .../java/com/gmail/nossr50/api/SkillAPI.java | 3 +- .../experience/ExperienceCommand.java | 7 +- .../experience/SkillresetCommand.java | 3 +- .../commands/hardcore/HardcoreCommand.java | 2 +- .../commands/hardcore/VampirismCommand.java | 2 +- .../nossr50/commands/skills/SkillCommand.java | 5 +- .../nossr50/database/DatabaseManager.java | 8 +- .../database/FlatFileDatabaseManager.java | 106 +++++-- .../nossr50/database/SQLDatabaseManager.java | 28 +- .../nossr50/datatypes/player/McMMOPlayer.java | 9 +- .../datatypes/player/PlayerProfile.java | 64 ++-- .../datatypes/skills/PrimarySkillType.java | 2 +- .../gmail/nossr50/listeners/SelfListener.java | 3 +- .../commands/McrankCommandDisplayTask.java | 3 +- .../database/FormulaConversionTask.java | 3 +- .../nossr50/skills/child/FamilyTree.java | 6 +- .../com/gmail/nossr50/util/EventUtils.java | 5 +- .../gmail/nossr50/util/HardcoreManager.java | 9 +- .../nossr50/util/commands/CommandUtils.java | 5 +- .../util/scoreboards/ScoreboardWrapper.java | 7 +- .../gmail/nossr50/util/skills/SkillTools.java | 26 +- .../database/FlatFileDatabaseManagerTest.java | 290 +++++++++++++++++- src/test/resources/healthydb.users | 3 + 25 files changed, 491 insertions(+), 128 deletions(-) create mode 100644 src/test/resources/healthydb.users diff --git a/Changelog.txt b/Changelog.txt index 932a69327..c11aa9f27 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,5 +1,10 @@ Version 2.1.189 + 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 + Fixed a bug where FlatFileDatabase users could have their names saved as "null" (names will be fixed the next time the player logs in) Rewrote how FlatFileDatabase verifies data integrity + (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) Added unit tests for FlatFileDatabaseManager (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 @@ -17,7 +22,7 @@ Version 2.1.189 (API) Some members of PrimarySkillType were removed and not deprecated (such as the field constants) NOTES: - The tests added for FlatFileDatabase will help make sure bugs don't result in any loss of data + I spent over 20 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 Ultra Permissions is SAFE to use with mcMMO 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. diff --git a/src/main/java/com/gmail/nossr50/api/ExperienceAPI.java b/src/main/java/com/gmail/nossr50/api/ExperienceAPI.java index bc15b7043..a7055bbb5 100644 --- a/src/main/java/com/gmail/nossr50/api/ExperienceAPI.java +++ b/src/main/java/com/gmail/nossr50/api/ExperienceAPI.java @@ -12,6 +12,7 @@ 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.Bukkit; import org.bukkit.OfflinePlayer; import org.bukkit.block.BlockState; @@ -80,7 +81,7 @@ public final class ExperienceAPI { public static boolean isNonChildSkill(String skillType) { PrimarySkillType skill = mcMMO.p.getSkillTools().matchSkill(skillType); - return skill != null && !mcMMO.p.getSkillTools().isChildSkill(skill); + return skill != null && !SkillTools.isChildSkill(skill); } @Deprecated @@ -626,7 +627,7 @@ public final class ExperienceAPI { PlayerProfile profile = getOfflineProfile(playerName); PrimarySkillType skill = getSkillType(skillType); - if (mcMMO.p.getSkillTools().isChildSkill(skill)) { + if (SkillTools.isChildSkill(skill)) { Set parentSkills = FamilyTree.getParents(skill); for (PrimarySkillType parentSkill : parentSkills) { @@ -657,7 +658,7 @@ public final class ExperienceAPI { PlayerProfile profile = getOfflineProfile(uuid); PrimarySkillType skill = getSkillType(skillType); - if (mcMMO.p.getSkillTools().isChildSkill(skill)) { + if (SkillTools.isChildSkill(skill)) { Set parentSkills = FamilyTree.getParents(skill); for (PrimarySkillType parentSkill : parentSkills) { @@ -763,7 +764,7 @@ public final class ExperienceAPI { int powerLevel = 0; PlayerProfile profile = getOfflineProfile(playerName); - for (PrimarySkillType type : mcMMO.p.getSkillTools().NON_CHILD_SKILLS) { + for (PrimarySkillType type : SkillTools.NON_CHILD_SKILLS) { powerLevel += profile.getSkillLevel(type); } @@ -784,7 +785,7 @@ public final class ExperienceAPI { int powerLevel = 0; PlayerProfile profile = getOfflineProfile(uuid); - for (PrimarySkillType type : mcMMO.p.getSkillTools().NON_CHILD_SKILLS) { + for (PrimarySkillType type : SkillTools.NON_CHILD_SKILLS) { powerLevel += profile.getSkillLevel(type); } @@ -1181,7 +1182,7 @@ public final class ExperienceAPI { private static PrimarySkillType getNonChildSkillType(String skillType) throws InvalidSkillException, UnsupportedOperationException { PrimarySkillType skill = getSkillType(skillType); - if (mcMMO.p.getSkillTools().isChildSkill(skill)) { + if (SkillTools.isChildSkill(skill)) { throw new UnsupportedOperationException("Child skills do not have XP"); } diff --git a/src/main/java/com/gmail/nossr50/api/SkillAPI.java b/src/main/java/com/gmail/nossr50/api/SkillAPI.java index db98ed08a..be8315a28 100644 --- a/src/main/java/com/gmail/nossr50/api/SkillAPI.java +++ b/src/main/java/com/gmail/nossr50/api/SkillAPI.java @@ -2,6 +2,7 @@ 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; @@ -31,7 +32,7 @@ public final class SkillAPI { * @return a list of strings with valid skill names */ public static List getNonChildSkills() { - return getListFromEnum(mcMMO.p.getSkillTools().NON_CHILD_SKILLS); + return getListFromEnum(SkillTools.NON_CHILD_SKILLS); } /** 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 f43c3e35f..4e84f8bff 100644 --- a/src/main/java/com/gmail/nossr50/commands/experience/ExperienceCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/experience/ExperienceCommand.java @@ -7,6 +7,7 @@ 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; @@ -50,7 +51,7 @@ public abstract class ExperienceCommand implements TabExecutor { skill = null; } - if (skill != null && mcMMO.p.getSkillTools().isChildSkill(skill)) + if (skill != null && SkillTools.isChildSkill(skill)) { sender.sendMessage(LocaleLoader.getString("Commands.Skill.ChildSkill")); return true; @@ -83,7 +84,7 @@ public abstract class ExperienceCommand implements TabExecutor { skill = null; } - if (skill != null && mcMMO.p.getSkillTools().isChildSkill(skill)) + if (skill != null && SkillTools.isChildSkill(skill)) { sender.sendMessage(LocaleLoader.getString("Commands.Skill.ChildSkill")); return true; @@ -171,7 +172,7 @@ public abstract class ExperienceCommand implements TabExecutor { protected void editValues(Player player, PlayerProfile profile, PrimarySkillType skill, int value, boolean isSilent) { if (skill == null) { - for (PrimarySkillType primarySkillType : mcMMO.p.getSkillTools().NON_CHILD_SKILLS) { + for (PrimarySkillType primarySkillType : SkillTools.NON_CHILD_SKILLS) { handleCommand(player, profile, primarySkillType, 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 72c1718cd..4b558d422 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; @@ -167,7 +168,7 @@ public class SkillresetCommand implements TabExecutor { protected void editValues(Player player, PlayerProfile profile, PrimarySkillType skill) { if (skill == null) { - for (PrimarySkillType primarySkillType : mcMMO.p.getSkillTools().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 d6b8de57b..4a8656e37 100644 --- a/src/main/java/com/gmail/nossr50/commands/hardcore/HardcoreCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/hardcore/HardcoreCommand.java @@ -51,7 +51,7 @@ // // private void toggle(boolean enable, PrimarySkillType skill) { // if (skill == null) { -// for (PrimarySkillType primarySkillType : mcMMO.p.getSkillTools().NON_CHILD_SKILLS) { +// for (PrimarySkillType primarySkillType : SkillTools.NON_CHILD_SKILLS) { // primarySkillType.setHardcoreStatLossEnabled(enable); // } // } 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 fbeaee56b..037c34e11 100644 --- a/src/main/java/com/gmail/nossr50/commands/hardcore/VampirismCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/hardcore/VampirismCommand.java @@ -51,7 +51,7 @@ // // private void toggle(boolean enable, PrimarySkillType skill) { // if (skill == null) { -// for (PrimarySkillType primarySkillType : mcMMO.p.getSkillTools().NON_CHILD_SKILLS) { +// for (PrimarySkillType primarySkillType : SkillTools.NON_CHILD_SKILLS) { // primarySkillType.setHardcoreVampirismEnabled(enable); // } // } 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 ab5c027ba..6e2926062 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/SkillCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/SkillCommand.java @@ -15,6 +15,7 @@ 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; @@ -142,7 +143,7 @@ public abstract class SkillCommand implements TabExecutor { player.sendMessage(LocaleLoader.getString("Skills.Overhaul.Header", skillName)); - if(!mcMMO.p.getSkillTools().isChildSkill(skill)) + if(!SkillTools.isChildSkill(skill)) { /* * NON-CHILD SKILLS @@ -188,7 +189,7 @@ public abstract class SkillCommand implements TabExecutor { } /* - if (!mcMMO.p.getSkillTools().isChildSkill(skill)) { + 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))); diff --git a/src/main/java/com/gmail/nossr50/database/DatabaseManager.java b/src/main/java/com/gmail/nossr50/database/DatabaseManager.java index 831ec579a..914a35aa2 100644 --- a/src/main/java/com/gmail/nossr50/database/DatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/DatabaseManager.java @@ -5,6 +5,7 @@ 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; @@ -92,12 +93,17 @@ public interface DatabaseManager { */ @NotNull PlayerProfile loadPlayerProfile(@NotNull String playerName); + default @NotNull PlayerProfile loadPlayerProfile(@NotNull OfflinePlayer offlinePlayer) { + return loadPlayerProfile(offlinePlayer.getUniqueId(), offlinePlayer.getName()); + } + /** * 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 + * @deprecated Use {@link DatabaseManager#loadPlayerProfile(org.bukkit.OfflinePlayer)} if possible */ + @Deprecated @NotNull PlayerProfile loadPlayerProfile(@NotNull UUID uuid, @Nullable String playerName); /** diff --git a/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java index 8d20ef811..42a65c868 100644 --- a/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java @@ -9,12 +9,15 @@ 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; @@ -28,6 +31,7 @@ public final class FlatFileDatabaseManager implements DatabaseManager { private final @NotNull Logger logger; private final long purgeTime; private final int startingLevel; + private boolean testing; private final long UPDATE_WAIT_TIME = 600000L; // 10 minutes private final @NotNull File usersFile; @@ -82,6 +86,7 @@ public final class FlatFileDatabaseManager implements DatabaseManager { this.logger = logger; this.purgeTime = purgeTime; this.startingLevel = startingLevel; + this.testing = testing; if(!testing) { List flatFileDataFlags = checkFileHealthAndStructure(); @@ -218,6 +223,10 @@ public final class FlatFileDatabaseManager implements DatabaseManager { // 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); @@ -321,8 +330,19 @@ public final class FlatFileDatabaseManager implements DatabaseManager { String line; boolean wroteUser = false; + if(testing) { + System.out.println("-- saveUser bufferedreader feed --"); + } // While not at the end of the file while ((line = in.readLine()) != null) { + if(testing) { + System.out.println(line); + } + if(line.startsWith("#")) { + writer.append(line).append("\r\n"); + continue; + } + //Check for incomplete or corrupted data if(!line.contains(":")) { @@ -365,6 +385,11 @@ public final class FlatFileDatabaseManager implements DatabaseManager { writeUserToLine(profile, playerName, uuid, writer); } + if(testing) { + System.out.println("-- saveUser (FileWriter contents before save) --"); + System.out.println(writer.toString()); + } + // Write the new file out = new FileWriter(usersFilePath); out.write(writer.toString()); @@ -445,7 +470,7 @@ public final class FlatFileDatabaseManager implements DatabaseManager { 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 && mcMMO.p.getSkillTools().isChildSkill(primarySkillType)) { + 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!"); } @@ -462,7 +487,7 @@ public final class FlatFileDatabaseManager implements DatabaseManager { Map skills = new EnumMap(PrimarySkillType.class); - for (PrimarySkillType skill : mcMMO.p.getSkillTools().NON_CHILD_SKILLS) { + for (PrimarySkillType skill : SkillTools.NON_CHILD_SKILLS) { skills.put(skill, getPlayerRank(playerName, playerStatHash.get(skill))); } @@ -549,15 +574,19 @@ public final class FlatFileDatabaseManager implements DatabaseManager { } } + public @NotNull PlayerProfile loadPlayerProfile(@NotNull OfflinePlayer offlinePlayer) { + return loadPlayerByUUID(offlinePlayer.getUniqueId(), offlinePlayer.getName(), offlinePlayer.isOnline()); + } + public @NotNull PlayerProfile loadPlayerProfile(@NotNull String playerName) { return loadPlayerByName(playerName); } public @NotNull PlayerProfile loadPlayerProfile(@NotNull UUID uuid, @Nullable String playerName) { - return loadPlayerByUUID(uuid, playerName); + return loadPlayerByUUID(uuid, playerName, false); } - private @NotNull PlayerProfile loadPlayerByUUID(@NotNull UUID uuid, @Nullable String playerName) { + private @NotNull PlayerProfile loadPlayerByUUID(@NotNull UUID uuid, @Nullable String playerName, boolean isOnline) { BufferedReader in = null; synchronized (fileWritingLock) { @@ -594,9 +623,13 @@ public final class FlatFileDatabaseManager implements DatabaseManager { /* Check for nickname changes and update since we are here anyways */ - if (!rawSplitData[USERNAME_INDEX].equalsIgnoreCase(playerName)) { - //logger.info("Name updated for player: " + rawSplitData[USERNAME_INDEX] + " => " + playerName); - rawSplitData[USERNAME_INDEX] = playerName; + if(playerName != null) { + if(isOnline) { + if (!rawSplitData[USERNAME_INDEX].equalsIgnoreCase(playerName)) { + //logger.info("Name updated for player: " + rawSplitData[USERNAME_INDEX] + " => " + playerName); + rawSplitData[USERNAME_INDEX] = playerName; + } + } } return loadFromLine(rawSplitData); @@ -969,15 +1002,39 @@ public final class FlatFileDatabaseManager implements DatabaseManager { playerStatHash.put(PrimarySkillType.ALCHEMY, alchemy); } - /** - * Makes sure that the users file has valid entries - * @return - */ + 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("yyyy/MM/dd HH:mm:ss"); + 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()) { + initEmptyDB(); + } + if (usersFile.exists()) { BufferedReader bufferedReader = null; FileWriter fileWriter = null; @@ -988,10 +1045,18 @@ public final class FlatFileDatabaseManager implements DatabaseManager { 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; @@ -1005,6 +1070,9 @@ public final class FlatFileDatabaseManager implements DatabaseManager { logger.info("Saving the updated and or repaired FlatFile Database..."); fileWriter = new FileWriter(usersFilePath); //Write data to file + if(dbCommentDate != null) + fileWriter.write(dbCommentDate); + fileWriter.write(dataProcessor.processDataForSave().toString()); } } catch (IOException e) { @@ -1078,6 +1146,7 @@ public final class FlatFileDatabaseManager implements DatabaseManager { Map skillsDATS = new EnumMap<>(SuperAbilityType.class); // Ability & Cooldown Map uniquePlayerDataMap = new EnumMap<>(UniqueDataType.class); int scoreboardTipsShown; + long lastLogin; String username = character[USERNAME_INDEX]; @@ -1108,13 +1177,6 @@ public final class FlatFileDatabaseManager implements DatabaseManager { // Acrobatics - Unused tryLoadSkillCooldownFromRawData(skillsDATS, character, SuperAbilityType.BLAST_MINING, COOLDOWN_BLAST_MINING, username); -// try { -// mobHealthbarType = MobHealthbarType.valueOf(character[HEALTHBAR]); -// } -// catch (Exception e) { -// mobHealthbarType = Config.getInstance().getMobHealthbarDefault(); -// } - UUID uuid; try { uuid = UUID.fromString(character[UUID_INDEX]); @@ -1137,7 +1199,13 @@ public final class FlatFileDatabaseManager implements DatabaseManager { uniquePlayerDataMap.put(UniqueDataType.CHIMAERA_WING_DATS, 0); } - return new PlayerProfile(character[USERNAME_INDEX], uuid, skills, skillsXp, skillsDATS, null, scoreboardTipsShown, uniquePlayerDataMap); + try { + lastLogin = Long.parseLong(character[LAST_LOGIN]); + } catch (Exception e) { + lastLogin = System.currentTimeMillis(); + } + + return new PlayerProfile(character[USERNAME_INDEX], uuid, skills, skillsXp, skillsDATS, scoreboardTipsShown, uniquePlayerDataMap, lastLogin); } private void tryLoadSkillCooldownFromRawData(@NotNull Map cooldownMap, @NotNull String[] character, @NotNull SuperAbilityType superAbilityType, int cooldownSuperBreaker, @NotNull String userName) { diff --git a/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java index 9f09d77f2..6599e707c 100644 --- a/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java @@ -12,6 +12,7 @@ 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.entity.Player; @@ -174,8 +175,7 @@ public final class SQLDatabaseManager implements DatabaseManager { } catch (SQLException ex) { printErrors(ex); - } - finally { + } finally { tryClose(statement); tryClose(connection); massUpdateLock.unlock(); @@ -271,7 +271,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 : mcMMO.p.getSkillTools().NON_CHILD_SKILLS) + for (PrimarySkillType primarySkillType : SkillTools.NON_CHILD_SKILLS) total += profile.getSkillLevel(primarySkillType); statement.setInt(14, total); statement.setInt(15, id); @@ -330,7 +330,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 ? mcMMO.p.getGeneralConfig().getMobHealthbarDefault().name() : profile.getMobHealthbarType().name()); + statement.setString(1, MobHealthbarType.HEARTS.name()); statement.setInt(2, profile.getScoreboardTipsShown()); statement.setInt(3, id); success = (statement.executeUpdate() != 0); @@ -355,7 +355,7 @@ public final class SQLDatabaseManager implements DatabaseManager { List stats = new ArrayList<>(); //Fix for a plugin that people are using that is throwing SQL errors - if(skill != null && mcMMO.p.getSkillTools().isChildSkill(skill)) { + 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!"); } @@ -404,7 +404,7 @@ public final class SQLDatabaseManager implements DatabaseManager { try { connection = getConnection(PoolIdentifier.MISC); - for (PrimarySkillType primarySkillType : mcMMO.p.getSkillTools().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 " + @@ -932,7 +932,7 @@ public final class SQLDatabaseManager implements DatabaseManager { } if (mcMMO.p.getGeneralConfig().getTruncateSkills()) { - for (PrimarySkillType skill : mcMMO.p.getSkillTools().NON_CHILD_SKILLS) { + 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); @@ -1152,14 +1152,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 = mcMMO.p.getGeneralConfig().getMobHealthbarDefault(); - } - try { scoreboardTipsShown = result.getInt(OFFSET_OTHER + 2); } @@ -1174,7 +1166,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) { @@ -1291,10 +1283,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() != mcMMO.p.getSkillTools().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 : mcMMO.p.getSkillTools().NON_CHILD_SKILLS) { + for (PrimarySkillType skill : SkillTools.NON_CHILD_SKILLS) { String skill_name = skill.name().toLowerCase(Locale.ENGLISH); try { 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 e851fb110..e6c3a22d9 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java +++ b/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java @@ -51,6 +51,7 @@ import com.gmail.nossr50.util.player.UserManager; 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.SkillTools; import com.gmail.nossr50.util.skills.SkillUtils; import com.gmail.nossr50.util.sounds.SoundManager; import com.gmail.nossr50.util.sounds.SoundType; @@ -280,7 +281,7 @@ public class McMMOPlayer implements Identified { public double getProgressInCurrentSkillLevel(PrimarySkillType primarySkillType) { - if(mcMMO.p.getSkillTools().isChildSkill(primarySkillType)) { + if(SkillTools.isChildSkill(primarySkillType)) { return 1.0D; } @@ -569,7 +570,7 @@ public class McMMOPlayer implements Identified { public int getPowerLevel() { int powerLevel = 0; - for (PrimarySkillType primarySkillType : mcMMO.p.getSkillTools().NON_CHILD_SKILLS) { + for (PrimarySkillType primarySkillType : SkillTools.NON_CHILD_SKILLS) { if (mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, primarySkillType)) { powerLevel += getSkillLevel(primarySkillType); } @@ -611,7 +612,7 @@ public class McMMOPlayer implements Identified { return; } - if (mcMMO.p.getSkillTools().isChildSkill(skill)) { + if (SkillTools.isChildSkill(skill)) { Set parentSkills = FamilyTree.getParents(skill); float splitXp = xp / parentSkills.size(); @@ -668,7 +669,7 @@ public class McMMOPlayer implements Identified { Bukkit.getPluginManager().callEvent(mcMMOPlayerPreXpGainEvent); xp = mcMMOPlayerPreXpGainEvent.getXpGained(); - if (mcMMO.p.getSkillTools().isChildSkill(primarySkillType)) { + if (SkillTools.isChildSkill(primarySkillType)) { Set parentSkills = FamilyTree.getParents(primarySkillType); for (PrimarySkillType parentSkill : parentSkills) { 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 3fc0d6d70..f2e4306fe 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/player/PlayerProfile.java +++ b/src/main/java/com/gmail/nossr50/datatypes/player/PlayerProfile.java @@ -1,7 +1,6 @@ package com.gmail.nossr50.datatypes.player; 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; @@ -10,6 +9,7 @@ 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; @@ -27,10 +27,11 @@ public class PlayerProfile { 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 EnumMap<>(PrimarySkillType.class); // Skill & Level private final Map skillsXp = new EnumMap<>(PrimarySkillType.class); // Skill & XP @@ -50,20 +51,22 @@ public class PlayerProfile { this.uuid = uuid; this.playerName = playerName; - mobHealthbarType = mcMMO.p.getGeneralConfig().getMobHealthbarDefault(); scoreboardTipsShown = 0; for (SuperAbilityType superAbilityType : SuperAbilityType.values()) { abilityDATS.put(superAbilityType, 0); } - for (PrimarySkillType primarySkillType : mcMMO.p.getSkillTools().NON_CHILD_SKILLS) { - skills.put(primarySkillType, mcMMO.p.getAdvancedConfig().getStartingLevel()); + for (PrimarySkillType primarySkillType : SkillTools.NON_CHILD_SKILLS) { + int startingLvl = mcMMO.p != null ? mcMMO.p.getAdvancedConfig().getStartingLevel() : 0; //TODO: Setup the mock since this was to avoid setting up a mock in a test + + skills.put(primarySkillType, startingLvl); skillsXp.put(primarySkillType, 0F); } //Misc Cooldowns uniquePlayerData.put(UniqueDataType.CHIMAERA_WING_DATS, 0); //Chimaera wing + lastLogin = System.currentTimeMillis(); } @Deprecated @@ -77,10 +80,9 @@ public class PlayerProfile { this.loaded = isLoaded; } - public PlayerProfile(@NotNull String playerName, UUID uuid, Map levelData, Map xpData, Map cooldownData, @Nullable MobHealthbarType mobHealthbarType, int scoreboardTipsShown, Map uniqueProfileData) { + public PlayerProfile(@NotNull String playerName, UUID uuid, Map levelData, Map xpData, Map cooldownData, int scoreboardTipsShown, Map uniqueProfileData, @Nullable Long lastLogin) { this.playerName = playerName; this.uuid = uuid; - mobHealthbarType = mcMMO.p.getGeneralConfig().getMobHealthbarDefault(); this.scoreboardTipsShown = scoreboardTipsShown; skills.putAll(levelData); @@ -89,6 +91,9 @@ public class PlayerProfile { uniquePlayerData.putAll(uniqueProfileData); loaded = true; + + if(lastLogin != null) + this.lastLogin = lastLogin; } public void scheduleAsyncSave() { @@ -115,7 +120,7 @@ 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) { @@ -149,6 +154,19 @@ 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 System.currentTimeMillis(); + else + return lastLogin; + } + public String getPlayerName() { return playerName; } @@ -167,20 +185,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 */ @@ -256,7 +260,7 @@ public class PlayerProfile { */ public int getSkillLevel(PrimarySkillType skill) { - return mcMMO.p.getSkillTools().isChildSkill(skill) ? getChildSkillLevel(skill) : skills.get(skill); + return SkillTools.isChildSkill(skill) ? getChildSkillLevel(skill) : skills.get(skill); } public float getSkillXpLevelRaw(PrimarySkillType skill) { @@ -264,7 +268,7 @@ public class PlayerProfile { } public int getSkillXpLevel(PrimarySkillType skill) { - if(mcMMO.p.getSkillTools().isChildSkill(skill)) { + if(SkillTools.isChildSkill(skill)) { return 0; } @@ -272,7 +276,7 @@ public class PlayerProfile { } public void setSkillXpLevel(PrimarySkillType skill, float xpLevel) { - if (mcMMO.p.getSkillTools().isChildSkill(skill)) { + if (SkillTools.isChildSkill(skill)) { return; } @@ -299,7 +303,7 @@ public class PlayerProfile { * @param xp Amount of xp to remove */ public void removeXp(PrimarySkillType skill, int xp) { - if (mcMMO.p.getSkillTools().isChildSkill(skill)) { + if (SkillTools.isChildSkill(skill)) { return; } @@ -309,7 +313,7 @@ public class PlayerProfile { } public void removeXp(PrimarySkillType skill, float xp) { - if (mcMMO.p.getSkillTools().isChildSkill(skill)) { + if (SkillTools.isChildSkill(skill)) { return; } @@ -325,7 +329,7 @@ public class PlayerProfile { * @param level New level value for the skill */ public void modifySkill(PrimarySkillType skill, int level) { - if (mcMMO.p.getSkillTools().isChildSkill(skill)) { + if (SkillTools.isChildSkill(skill)) { return; } @@ -358,7 +362,7 @@ public class PlayerProfile { public void addXp(PrimarySkillType skill, float xp) { markProfileDirty(); - if (mcMMO.p.getSkillTools().isChildSkill(skill)) { + if (SkillTools.isChildSkill(skill)) { Set parentSkills = FamilyTree.getParents(skill); float dividedXP = (xp / parentSkills.size()); @@ -417,7 +421,7 @@ public class PlayerProfile { * @return the total amount of Xp until next level */ public int getXpToLevel(PrimarySkillType primarySkillType) { - if(mcMMO.p.getSkillTools().isChildSkill(primarySkillType)) { + if(SkillTools.isChildSkill(primarySkillType)) { return 0; } 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 f8abfa255..22ab7f4a6 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/skills/PrimarySkillType.java +++ b/src/main/java/com/gmail/nossr50/datatypes/skills/PrimarySkillType.java @@ -191,7 +191,7 @@ public enum PrimarySkillType { */ @Deprecated public boolean isChildSkill() { - return mcMMO.p.getSkillTools().isChildSkill(this); + return SkillTools.isChildSkill(this); } /** diff --git a/src/main/java/com/gmail/nossr50/listeners/SelfListener.java b/src/main/java/com/gmail/nossr50/listeners/SelfListener.java index 10da03550..2e21d3b72 100644 --- a/src/main/java/com/gmail/nossr50/listeners/SelfListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/SelfListener.java @@ -12,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; @@ -132,7 +133,7 @@ public class SelfListener implements Listener { return; } - if (mcMMO.p.getSkillTools().isChildSkill(primarySkillType)) { + if (SkillTools.isChildSkill(primarySkillType)) { return; } 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 b589357c0..8b3c96dfe 100644 --- a/src/main/java/com/gmail/nossr50/runnables/commands/McrankCommandDisplayTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/commands/McrankCommandDisplayTask.java @@ -4,6 +4,7 @@ import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.mcMMO; 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; @@ -46,7 +47,7 @@ public class McrankCommandDisplayTask extends BukkitRunnable { sender.sendMessage(LocaleLoader.getString("Commands.mcrank.Heading")); sender.sendMessage(LocaleLoader.getString("Commands.mcrank.Player", playerName)); - for (PrimarySkillType skill : mcMMO.p.getSkillTools().NON_CHILD_SKILLS) { + for (PrimarySkillType skill : SkillTools.NON_CHILD_SKILLS) { // if (!mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, skill)) { // continue; // } 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 056b17dea..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,6 +10,7 @@ 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; @@ -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 : mcMMO.p.getSkillTools().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/skills/child/FamilyTree.java b/src/main/java/com/gmail/nossr50/skills/child/FamilyTree.java index 7a5639dc2..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,7 +1,7 @@ package com.gmail.nossr50.skills.child; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; -import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.util.skills.SkillTools; import java.util.Collections; import java.util.EnumSet; @@ -41,13 +41,13 @@ public class FamilyTree { } protected static void enforceChildSkill(PrimarySkillType skill) { - if (!mcMMO.p.getSkillTools().isChildSkill(skill)) { + if (!SkillTools.isChildSkill(skill)) { throw new IllegalArgumentException(skill.name() + " is not a child skill!"); } } protected static void enforceNotChildSkill(PrimarySkillType skill) { - if (mcMMO.p.getSkillTools().isChildSkill(skill)) { + if (SkillTools.isChildSkill(skill)) { throw new IllegalArgumentException(skill.name() + " is a child skill!"); } } diff --git a/src/main/java/com/gmail/nossr50/util/EventUtils.java b/src/main/java/com/gmail/nossr50/util/EventUtils.java index e6d697852..828f43906 100644 --- a/src/main/java/com/gmail/nossr50/util/EventUtils.java +++ b/src/main/java/com/gmail/nossr50/util/EventUtils.java @@ -35,6 +35,7 @@ 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; @@ -405,7 +406,7 @@ public final class EventUtils { experienceChanged = event.getExperienceChanged(); PlayerProfile playerProfile = UserManager.getPlayer(player).getProfile(); - for (PrimarySkillType primarySkillType : mcMMO.p.getSkillTools().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(); @@ -454,7 +455,7 @@ public final class EventUtils { PlayerProfile victimProfile = UserManager.getPlayer(victim).getProfile(); - for (PrimarySkillType primarySkillType : mcMMO.p.getSkillTools().NON_CHILD_SKILLS) { + for (PrimarySkillType primarySkillType : SkillTools.NON_CHILD_SKILLS) { String skillName = primarySkillType.toString(); int victimSkillLevel = victimProfile.getSkillLevel(primarySkillType); diff --git a/src/main/java/com/gmail/nossr50/util/HardcoreManager.java b/src/main/java/com/gmail/nossr50/util/HardcoreManager.java index 3c2abfc38..491074a5e 100644 --- a/src/main/java/com/gmail/nossr50/util/HardcoreManager.java +++ b/src/main/java/com/gmail/nossr50/util/HardcoreManager.java @@ -6,6 +6,7 @@ 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; @@ -34,7 +35,7 @@ public final class HardcoreManager { HashMap levelChanged = new HashMap<>(); HashMap experienceChanged = new HashMap<>(); - for (PrimarySkillType primarySkillType : mcMMO.p.getSkillTools().NON_CHILD_SKILLS) { + for (PrimarySkillType primarySkillType : SkillTools.NON_CHILD_SKILLS) { if (!mcMMO.p.getGeneralConfig().getHardcoreStatLossEnabled(primarySkillType)) { levelChanged.put(primarySkillType.toString(), 0); experienceChanged.put(primarySkillType.toString(), 0F); @@ -86,7 +87,7 @@ public final class HardcoreManager { HashMap levelChanged = new HashMap<>(); HashMap experienceChanged = new HashMap<>(); - for (PrimarySkillType primarySkillType : mcMMO.p.getSkillTools().NON_CHILD_SKILLS) { + for (PrimarySkillType primarySkillType : SkillTools.NON_CHILD_SKILLS) { if (!mcMMO.p.getGeneralConfig().getHardcoreVampirismEnabled(primarySkillType)) { levelChanged.put(primarySkillType.toString(), 0); experienceChanged.put(primarySkillType.toString(), 0F); @@ -135,7 +136,7 @@ public final class HardcoreManager { public static boolean isStatLossEnabled() { boolean enabled = false; - for (PrimarySkillType primarySkillType : mcMMO.p.getSkillTools().NON_CHILD_SKILLS) { + for (PrimarySkillType primarySkillType : SkillTools.NON_CHILD_SKILLS) { if (mcMMO.p.getGeneralConfig().getHardcoreStatLossEnabled(primarySkillType)) { enabled = true; break; @@ -153,7 +154,7 @@ public final class HardcoreManager { public static boolean isVampirismEnabled() { boolean enabled = false; - for (PrimarySkillType primarySkillType : mcMMO.p.getSkillTools().NON_CHILD_SKILLS) { + 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/commands/CommandUtils.java b/src/main/java/com/gmail/nossr50/util/commands/CommandUtils.java index adb2d4851..d40403ddd 100644 --- a/src/main/java/com/gmail/nossr50/util/commands/CommandUtils.java +++ b/src/main/java/com/gmail/nossr50/util/commands/CommandUtils.java @@ -7,6 +7,7 @@ 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 com.gmail.nossr50.util.skills.SkillUtils; import com.gmail.nossr50.util.text.StringUtils; import com.google.common.collect.ImmutableList; @@ -25,7 +26,7 @@ public final class CommandUtils { private CommandUtils() {} public static boolean isChildSkill(CommandSender sender, PrimarySkillType skill) { - if (skill == null || !mcMMO.p.getSkillTools().isChildSkill(skill)) { + if (skill == null || !SkillTools.isChildSkill(skill)) { return false; } @@ -205,7 +206,7 @@ public final class CommandUtils { } public static String displaySkill(PlayerProfile profile, PrimarySkillType skill) { - if (mcMMO.p.getSkillTools().isChildSkill(skill)) { + if (SkillTools.isChildSkill(skill)) { return LocaleLoader.getString("Skills.ChildStats", LocaleLoader.getString(StringUtils.getCapitalized(skill.toString()) + ".Listener") + " ", profile.getSkillLevel(skill)); } if (profile.getSkillLevel(skill) == mcMMO.p.getSkillTools().getLevelCap(skill)){ 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 9c23627da..be3e97cb4 100644 --- a/src/main/java/com/gmail/nossr50/util/scoreboards/ScoreboardWrapper.java +++ b/src/main/java/com/gmail/nossr50/util/scoreboards/ScoreboardWrapper.java @@ -16,6 +16,7 @@ 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; @@ -488,7 +489,7 @@ public class ScoreboardWrapper { case SKILL_BOARD: Validate.notNull(targetSkill); - if (!mcMMO.p.getSkillTools().isChildSkill(targetSkill)) { + if (!SkillTools.isChildSkill(targetSkill)) { int currentXP = mcMMOPlayer.getSkillXpLevel(targetSkill); sidebarObjective.getScore(ScoreboardManager.LABEL_CURRENT_XP).setScore(currentXP); @@ -573,7 +574,7 @@ public class ScoreboardWrapper { // Calculate power level here int powerLevel = 0; - for (PrimarySkillType skill : mcMMO.p.getSkillTools().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; @@ -606,7 +607,7 @@ public class ScoreboardWrapper { Integer rank; Player player = mcMMO.p.getServer().getPlayerExact(playerName); - for (PrimarySkillType skill : mcMMO.p.getSkillTools().NON_CHILD_SKILLS) { + 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/SkillTools.java b/src/main/java/com/gmail/nossr50/util/skills/SkillTools.java index ae33665aa..8d50873c5 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/SkillTools.java +++ b/src/main/java/com/gmail/nossr50/util/skills/SkillTools.java @@ -29,7 +29,7 @@ public class SkillTools { public final @NotNull ImmutableList FORMATTED_SUBSKILL_NAMES; public final @NotNull ImmutableSet EXACT_SUBSKILL_NAMES; public final @NotNull ImmutableList CHILD_SKILLS; - public final @NotNull ImmutableList NON_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; @@ -42,6 +42,16 @@ public class SkillTools { 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; @@ -130,18 +140,18 @@ public class SkillTools { */ List childSkills = new ArrayList<>(); - List nonChildSkills = new ArrayList<>(); +// List nonChildSkills = new ArrayList<>(); for (PrimarySkillType primarySkillType : PrimarySkillType.values()) { - if (isChildSkill(primarySkillType)) { + if (isChildSkill(primarySkillType)) childSkills.add(primarySkillType); - } else { - nonChildSkills.add(primarySkillType); - } +// } { +// nonChildSkills.add(primarySkillType); +// } } CHILD_SKILLS = ImmutableList.copyOf(childSkills); - NON_CHILD_SKILLS = ImmutableList.copyOf(nonChildSkills); +// NON_CHILD_SKILLS = ImmutableList.copyOf(nonChildSkills); /* * Build categorized skill lists @@ -318,7 +328,7 @@ public class SkillTools { } // TODO: This is a little "hacky", we probably need to add something to distinguish child skills in the enum, or to use another enum for them - public boolean isChildSkill(PrimarySkillType primarySkillType) { + public static boolean isChildSkill(PrimarySkillType primarySkillType) { switch (primarySkillType) { case SALVAGE: case SMELTING: diff --git a/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java b/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java index 5fdc3781f..30314b1fb 100644 --- a/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java +++ b/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java @@ -2,6 +2,11 @@ package com.gmail.nossr50.database; import com.gmail.nossr50.TestUtil; 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.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -9,18 +14,14 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; import org.powermock.modules.junit4.PowerMockRunner; import java.io.*; import java.net.URI; import java.net.URISyntaxException; -import java.net.URL; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; +import java.util.*; import java.util.logging.Logger; import static org.junit.Assert.*; @@ -30,17 +31,39 @@ import static org.junit.Assert.*; public class FlatFileDatabaseManagerTest { public static final @NotNull String TEST_FILE_NAME = "test.mcmmo.users"; - public static final int HEALTHY_RETURN_CODE = 0; - public static final 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 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 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:2020:HEARTS:13:130:588fe472-1c82-4c4e-9aa1-7eefccb277e3:1111:999:"; + public static final @NotNull String HEALTHY_DB_LINE_ONE_UUID_STR = "588fe472-1c82-4c4e-9aa1-7eefccb277e3"; 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; + @Before public void init() { assertNull(db); + //noinspection UnstableApiUsage tempDir = Files.createTempDir(); db = new FlatFileDatabaseManager(new File(tempDir.getPath() + File.separator + TEST_FILE_NAME), logger, PURGE_TIME, 0, true); } @@ -108,6 +131,249 @@ public class FlatFileDatabaseManagerTest { "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 + public 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); + //The above profile should be "zero" initialized + + //Save the zero version and see if it looks correct + assertNotNull(db); + assertFalse(db.getUsersFile().exists()); + db.checkFileHealthAndStructure(); + 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(playerName); + 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 + public void testLoadByName() { + + } + + @Test + public void testLoadByUUID() { + /* + * This test uses a file provided in test resources + */ + + ClassLoader classLoader = getClass().getClassLoader(); + URI resourceFileURI = null; + + try { + resourceFileURI = classLoader.getResource(DB_HEALTHY).toURI(); + } catch (URISyntaxException e) { + e.printStackTrace(); + } + + assertNotNull(resourceFileURI); + File fromResourcesFile = new File(resourceFileURI); + assertNotNull(resourceFileURI); + File copyOfFile = new File(tempDir.getPath() + File.separator + DB_HEALTHY); + + if(copyOfFile.exists()) { + //noinspection ResultOfMethodCallIgnored + copyOfFile.delete(); + } + + assertTrue(fromResourcesFile.exists()); + + try { + //noinspection UnstableApiUsage + Files.copy(fromResourcesFile, copyOfFile); + } catch (IOException e) { + e.printStackTrace(); + } + + assertNotNull(copyOfFile); + + + + /* + * 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(copyOfFile); + System.out.println("File Path: "+copyOfFile.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); + + FlatFileDatabaseManager db_a = new FlatFileDatabaseManager(copyOfFile, logger, PURGE_TIME, 0, true); + List flagsFound = db_a.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_a.loadPlayerProfile(uuid, null); + testHealthyDataProfileValues(db_a, playerName, uuid, profile); + } + + private void testHealthyDataProfileValues(FlatFileDatabaseManager flatFileDatabaseManager, String playerName, UUID uuid, PlayerProfile playerProfile) { + PlayerProfile profile = flatFileDatabaseManager.loadPlayerProfile(uuid, null); + 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; + +// System.out.println("Checking expected values for: "+primarySkillType); +// System.out.println("Profile Level Value: "+profile.getSkillLevel(primarySkillType)); +// System.out.println("Expected Lvl Value: "+getExpectedLevelHealthyDBEntryOne(primarySkillType)); +// System.out.println("Profile Exp Value: "+profile.getSkillXpLevelRaw(primarySkillType)); +// System.out.println("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 + public void testOverwriteName() { + + } + + @Test + public void testDataNotFound() { + //Save the zero version and see if it looks correct + assertNotNull(db); + assertFalse(db.getUsersFile().exists()); + db.checkFileHealthAndStructure(); + assertTrue(db.getUsersFile().exists()); //Users file should have been created from the above com.gmail.nossr50.database.FlatFileDatabaseManager.checkFileHealthAndStructure + 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 public void testPurgePowerlessUsers() { replaceDataInFile(db, normalDatabaseData); @@ -167,14 +433,11 @@ public class FlatFileDatabaseManagerTest { @Test public void testLoadFromFile() { - Path resourceDirectory = Paths.get("src","test","resources"); - String absolutePath = resourceDirectory.toFile().getAbsolutePath(); - ClassLoader classLoader = getClass().getClassLoader(); URI resourceFileURI = null; try { - resourceFileURI = classLoader.getResource("baddatadb.users").toURI(); + resourceFileURI = classLoader.getResource(DB_BADDATA).toURI(); } catch (URISyntaxException e) { e.printStackTrace(); } @@ -182,7 +445,7 @@ public class FlatFileDatabaseManagerTest { assertNotNull(resourceFileURI); File fromResourcesFile = new File(resourceFileURI); assertNotNull(resourceFileURI); - File copyOfFile = new File(tempDir.getPath() + File.separator + "baddatafile.users"); + File copyOfFile = new File(tempDir.getPath() + File.separator + DB_BADDATA); if(copyOfFile.exists()) { copyOfFile.delete(); @@ -282,7 +545,6 @@ public class FlatFileDatabaseManagerTest { } } } - } private void overwriteDataAndCheckForFlag(@NotNull FlatFileDatabaseManager targetDatabase, @NotNull String[] data, @NotNull FlatFileDataFlag flag) { diff --git a/src/test/resources/healthydb.users b/src/test/resources/healthydb.users new file mode 100644 index 000000000..38c671177 --- /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:2020: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:0:HEARTS:0:0:e0d07db8-f7e8-43c7-9ded-864dfc6f3b7c:5:1600906906: \ No newline at end of file From e6239936d2b1a41213d44d4e3d556c17e427b64e Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 13 Apr 2021 13:40:24 -0700 Subject: [PATCH 499/662] Add lastlogin tests --- .../gmail/nossr50/database/ExpectedType.java | 1 + .../nossr50/database/FlatFileDataFlag.java | 1 + .../database/FlatFileDataProcessor.java | 18 ++- .../database/FlatFileDatabaseManager.java | 19 ++- ...taProcessor.java => FlatFileDataUtil.java} | 7 +- .../datatypes/player/PlayerProfile.java | 2 +- .../database/FlatFileDatabaseManagerTest.java | 124 +++++++++++++----- ...sorTest.java => FlatFileDataUtilTest.java} | 4 +- src/test/resources/healthydb.users | 6 +- src/test/resources/missinglastlogin.users | 4 + 10 files changed, 130 insertions(+), 56 deletions(-) rename src/main/java/com/gmail/nossr50/database/flatfile/{FlatFileSaveDataProcessor.java => FlatFileDataUtil.java} (96%) rename src/test/java/com/gmail/nossr50/database/flatfile/{FlatFileSaveDataProcessorTest.java => FlatFileDataUtilTest.java} (82%) create mode 100644 src/test/resources/missinglastlogin.users diff --git a/src/main/java/com/gmail/nossr50/database/ExpectedType.java b/src/main/java/com/gmail/nossr50/database/ExpectedType.java index 57da078fb..ab3ad7c9c 100644 --- a/src/main/java/com/gmail/nossr50/database/ExpectedType.java +++ b/src/main/java/com/gmail/nossr50/database/ExpectedType.java @@ -3,6 +3,7 @@ package com.gmail.nossr50.database; public enum ExpectedType { STRING, INTEGER, + LONG, BOOLEAN, FLOAT, DOUBLE, diff --git a/src/main/java/com/gmail/nossr50/database/FlatFileDataFlag.java b/src/main/java/com/gmail/nossr50/database/FlatFileDataFlag.java index b67fe2806..b80c39e15 100644 --- a/src/main/java/com/gmail/nossr50/database/FlatFileDataFlag.java +++ b/src/main/java/com/gmail/nossr50/database/FlatFileDataFlag.java @@ -3,6 +3,7 @@ package com.gmail.nossr50.database; public enum FlatFileDataFlag { INCOMPLETE, BAD_VALUES, + LAST_LOGIN_SCHEMA_UPGRADE, MISSING_NAME, DUPLICATE_NAME, DUPLICATE_UUID, diff --git a/src/main/java/com/gmail/nossr50/database/FlatFileDataProcessor.java b/src/main/java/com/gmail/nossr50/database/FlatFileDataProcessor.java index ddda18143..1b9651089 100644 --- a/src/main/java/com/gmail/nossr50/database/FlatFileDataProcessor.java +++ b/src/main/java/com/gmail/nossr50/database/FlatFileDataProcessor.java @@ -2,8 +2,9 @@ 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.FlatFileSaveDataProcessor; +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; @@ -134,16 +135,19 @@ public class FlatFileDataProcessor { //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; - reportBadDataLine("Data is empty when it should not be at index", "[index=" + i + "]", lineData); continue; } boolean isCorrectType = isOfExpectedType(splitDataLine[i], getExpectedValueType(i)); if(!isCorrectType) { - reportBadDataLine("Data is not of correct type", splitDataLine[i], lineData); anyBadData = true; badDataValues[i] = true; } @@ -177,7 +181,7 @@ public class FlatFileDataProcessor { } - public boolean shouldNotBeEmpty(String data, int index) { + public boolean shouldNotBeEmpty(@Nullable String data, int index) { if(getExpectedValueType(index) == ExpectedType.IGNORED) { return false; } else { @@ -255,6 +259,7 @@ public class FlatFileDataProcessor { 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: @@ -269,7 +274,6 @@ public class FlatFileDataProcessor { case SKILLS_TAMING: case SKILLS_FISHING: case SKILLS_ALCHEMY: - case LAST_LOGIN: case COOLDOWN_BERSERK: case COOLDOWN_GIGA_DRILL_BREAKER: case COOLDOWN_TREE_FELLER: @@ -297,6 +301,8 @@ public class FlatFileDataProcessor { return ExpectedType.FLOAT; case UUID_INDEX: return ExpectedType.UUID; + case OVERHAUL_LAST_LOGIN: + return ExpectedType.LONG; } throw new IndexOutOfBoundsException(); @@ -320,7 +326,7 @@ public class FlatFileDataProcessor { //Fix our data if needed and prepare it to be saved for(FlatFileDataContainer dataContainer : flatFileDataContainers) { - String[] splitData = FlatFileSaveDataProcessor.getPreparedSaveDataLine(dataContainer); + String[] splitData = FlatFileDataUtil.getPreparedSaveDataLine(dataContainer); if(splitData == null) continue; diff --git a/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java index 42a65c868..97c77aeb5 100644 --- a/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java @@ -70,15 +70,16 @@ public final class FlatFileDatabaseManager implements DatabaseManager { 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 LAST_LOGIN = 37; + 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 = COOLDOWN_CHIMAERA_WING + 1; //Update this everytime new data is added + 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; @@ -666,6 +667,10 @@ public final class FlatFileDatabaseManager implements DatabaseManager { String line; while ((line = in.readLine()) != null) { + if(line.startsWith("#")) { + continue; + } + // Find if the line contains the player we want. String[] rawSplitData = line.split(":"); @@ -718,6 +723,10 @@ public final class FlatFileDatabaseManager implements DatabaseManager { String line; while ((line = in.readLine()) != null) { + if(line.startsWith("#")) { + continue; + } + String[] character = line.split(":"); try { @@ -1071,7 +1080,7 @@ public final class FlatFileDatabaseManager implements DatabaseManager { fileWriter = new FileWriter(usersFilePath); //Write data to file if(dbCommentDate != null) - fileWriter.write(dbCommentDate); + fileWriter.write(dbCommentDate + "\r\n"); fileWriter.write(dataProcessor.processDataForSave().toString()); } @@ -1200,9 +1209,9 @@ public final class FlatFileDatabaseManager implements DatabaseManager { } try { - lastLogin = Long.parseLong(character[LAST_LOGIN]); + lastLogin = Long.parseLong(character[OVERHAUL_LAST_LOGIN]); } catch (Exception e) { - lastLogin = System.currentTimeMillis(); + lastLogin = -1; } return new PlayerProfile(character[USERNAME_INDEX], uuid, skills, skillsXp, skillsDATS, scoreboardTipsShown, uniquePlayerDataMap, lastLogin); diff --git a/src/main/java/com/gmail/nossr50/database/flatfile/FlatFileSaveDataProcessor.java b/src/main/java/com/gmail/nossr50/database/flatfile/FlatFileDataUtil.java similarity index 96% rename from src/main/java/com/gmail/nossr50/database/flatfile/FlatFileSaveDataProcessor.java rename to src/main/java/com/gmail/nossr50/database/flatfile/FlatFileDataUtil.java index eb06d1dab..e4048cdf0 100644 --- a/src/main/java/com/gmail/nossr50/database/flatfile/FlatFileSaveDataProcessor.java +++ b/src/main/java/com/gmail/nossr50/database/flatfile/FlatFileDataUtil.java @@ -7,7 +7,7 @@ import org.jetbrains.annotations.Nullable; import static com.gmail.nossr50.database.FlatFileDatabaseManager.*; -public class FlatFileSaveDataProcessor { +public class FlatFileDataUtil { public static @Nullable String[] getPreparedSaveDataLine(@NotNull FlatFileDataContainer dataContainer) { if(dataContainer.getDataFlags() == null) { @@ -64,6 +64,7 @@ public class FlatFileSaveDataProcessor { 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: @@ -80,8 +81,8 @@ public class FlatFileSaveDataProcessor { case SKILLS_FISHING: case SKILLS_ALCHEMY: return String.valueOf(startingLevel); - case LAST_LOGIN: - return String.valueOf(System.currentTimeMillis() / 1000); //This is just to shorten the value + case OVERHAUL_LAST_LOGIN: + return String.valueOf(-1L); case COOLDOWN_BERSERK: case COOLDOWN_GIGA_DRILL_BREAKER: case COOLDOWN_TREE_FELLER: 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 f2e4306fe..1295a6d05 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/player/PlayerProfile.java +++ b/src/main/java/com/gmail/nossr50/datatypes/player/PlayerProfile.java @@ -162,7 +162,7 @@ public class PlayerProfile { @Deprecated public @NotNull Long getLastLogin() { if(lastLogin == null) - return System.currentTimeMillis(); + return -1L; else return lastLogin; } diff --git a/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java b/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java index 30314b1fb..48a1481b7 100644 --- a/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java +++ b/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java @@ -19,14 +19,13 @@ import org.powermock.modules.junit4.PowerMockRunner; import java.io.*; import java.net.URI; import java.net.URISyntaxException; -import java.nio.file.Path; -import java.nio.file.Paths; import java.util.*; import java.util.logging.Logger; import static org.junit.Assert.*; +//TODO: Test update leaderboards @RunWith(PowerMockRunner.class) public class FlatFileDatabaseManagerTest { @@ -35,8 +34,10 @@ public class FlatFileDatabaseManagerTest { 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:2020:HEARTS:13:130:588fe472-1c82-4c4e-9aa1-7eefccb277e3:1111:999:"; + 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; @@ -157,21 +158,99 @@ public class FlatFileDatabaseManagerTest { } @Test - public void testLoadByName() { + public 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); + System.out.println("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 + public 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); + System.out.println("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 public void testLoadByUUID() { + File dbFile = prepareDatabaseTestResource(DB_HEALTHY); + /* - * This test uses a file provided in test resources + * 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); + System.out.println("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, null); + PlayerProfile profile2 = db.loadPlayerProfile(uuid, playerName); + PlayerProfile profile3 = db.loadPlayerProfile(uuid, "incorrectName"); + PlayerProfile profile4 = db.loadPlayerProfile(new UUID(0, 1), "shouldBeUnloaded"); + assertFalse(profile4.isLoaded()); + + //Three possible ways to load the thing + testHealthyDataProfileValues(playerName, uuid, profile1); + testHealthyDataProfileValues(playerName, uuid, profile2); + testHealthyDataProfileValues(playerName, uuid, profile3); + } + + private File prepareDatabaseTestResource(@NotNull String dbFileName) { ClassLoader classLoader = getClass().getClassLoader(); URI resourceFileURI = null; try { - resourceFileURI = classLoader.getResource(DB_HEALTHY).toURI(); + resourceFileURI = classLoader.getResource(dbFileName).toURI(); } catch (URISyntaxException e) { e.printStackTrace(); } @@ -179,7 +258,7 @@ public class FlatFileDatabaseManagerTest { assertNotNull(resourceFileURI); File fromResourcesFile = new File(resourceFileURI); assertNotNull(resourceFileURI); - File copyOfFile = new File(tempDir.getPath() + File.separator + DB_HEALTHY); + File copyOfFile = new File(tempDir.getPath() + File.separator + dbFileName); if(copyOfFile.exists()) { //noinspection ResultOfMethodCallIgnored @@ -196,37 +275,10 @@ public class FlatFileDatabaseManagerTest { } assertNotNull(copyOfFile); - - - - /* - * 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(copyOfFile); - System.out.println("File Path: "+copyOfFile.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); - - FlatFileDatabaseManager db_a = new FlatFileDatabaseManager(copyOfFile, logger, PURGE_TIME, 0, true); - List flagsFound = db_a.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_a.loadPlayerProfile(uuid, null); - testHealthyDataProfileValues(db_a, playerName, uuid, profile); + return copyOfFile; } - private void testHealthyDataProfileValues(FlatFileDatabaseManager flatFileDatabaseManager, String playerName, UUID uuid, PlayerProfile playerProfile) { - PlayerProfile profile = flatFileDatabaseManager.loadPlayerProfile(uuid, null); + 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()); diff --git a/src/test/java/com/gmail/nossr50/database/flatfile/FlatFileSaveDataProcessorTest.java b/src/test/java/com/gmail/nossr50/database/flatfile/FlatFileDataUtilTest.java similarity index 82% rename from src/test/java/com/gmail/nossr50/database/flatfile/FlatFileSaveDataProcessorTest.java rename to src/test/java/com/gmail/nossr50/database/flatfile/FlatFileDataUtilTest.java index 8b10772fa..ee6e71ffb 100644 --- a/src/test/java/com/gmail/nossr50/database/flatfile/FlatFileSaveDataProcessorTest.java +++ b/src/test/java/com/gmail/nossr50/database/flatfile/FlatFileDataUtilTest.java @@ -5,7 +5,7 @@ import org.junit.Test; import java.util.HashSet; -public class FlatFileSaveDataProcessorTest { +public class FlatFileDataUtilTest { @Test public void getPreparedSaveDataLine() { @@ -22,6 +22,6 @@ public class FlatFileSaveDataProcessorTest { @Test(expected = AssertionError.class) public void testTooManyDataEntriesSplitString() { FlatFileDataContainer dataContainer = new CategorizedFlatFileData(0, new HashSet<>(), new String[FlatFileDatabaseManager.DATA_ENTRY_COUNT + 1]); - FlatFileSaveDataProcessor.getPreparedSaveDataLine(dataContainer); + FlatFileDataUtil.getPreparedSaveDataLine(dataContainer); } } \ No newline at end of file diff --git a/src/test/resources/healthydb.users b/src/test/resources/healthydb.users index 38c671177..7ce5ccbad 100644 --- a/src/test/resources/healthydb.users +++ b/src/test/resources/healthydb.users @@ -1,3 +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:2020: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:0:HEARTS:0:0:e0d07db8-f7e8-43c7-9ded-864dfc6f3b7c:5:1600906906: \ No newline at end of file +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 From d9e195f63a9141bb3df20df7d34e81208fc773f0 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 13 Apr 2021 15:22:21 -0700 Subject: [PATCH 500/662] Add a newUser test --- Changelog.txt | 2 + pom.xml | 6 + .../nossr50/database/DatabaseManager.java | 10 +- .../database/FlatFileDatabaseManager.java | 202 +++++++----------- .../nossr50/database/SQLDatabaseManager.java | 27 ++- .../datatypes/player/PlayerProfile.java | 24 ++- src/main/java/com/gmail/nossr50/mcMMO.java | 9 + .../player/PlayerProfileLoadingTask.java | 2 + .../nossr50/util/commands/CommandUtils.java | 2 +- .../database/FlatFileDatabaseManagerTest.java | 61 +++++- 10 files changed, 191 insertions(+), 154 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index c11aa9f27..8a704c845 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -5,6 +5,8 @@ Version 2.1.189 Rewrote how FlatFileDatabase verifies data integrity (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) Added Added unit tests for FlatFileDatabaseManager (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 diff --git a/pom.xml b/pom.xml index c39db8f41..231bd7f4b 100755 --- a/pom.xml +++ b/pom.xml @@ -220,6 +220,12 @@ + + com.github.seeseemelk + MockBukkit-v1.16 + 0.25.0 + test + co.aikar acf-bukkit diff --git a/src/main/java/com/gmail/nossr50/database/DatabaseManager.java b/src/main/java/com/gmail/nossr50/database/DatabaseManager.java index 914a35aa2..3f9ac7a77 100644 --- a/src/main/java/com/gmail/nossr50/database/DatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/DatabaseManager.java @@ -76,11 +76,11 @@ public interface DatabaseManager { /** * 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 */ - void newUser(String playerName, UUID uuid); + @NotNull PlayerProfile newUser(String playerName, UUID uuid); @NotNull PlayerProfile newUser(@NotNull Player player); @@ -101,11 +101,13 @@ public interface DatabaseManager { * 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 - * @deprecated Use {@link DatabaseManager#loadPlayerProfile(org.bukkit.OfflinePlayer)} if possible + * @deprecated Use {@link DatabaseManager#loadPlayerProfile(org.bukkit.OfflinePlayer)} or {@link DatabaseManager#loadPlayerProfile(java.util.UUID)} if possible */ @Deprecated @NotNull PlayerProfile loadPlayerProfile(@NotNull UUID uuid, @Nullable String playerName); + @NotNull PlayerProfile loadPlayerProfile(@NotNull UUID uuid); + /** * Get all users currently stored in the database. * diff --git a/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java index 97c77aeb5..8d4f8ea30 100644 --- a/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java @@ -31,7 +31,7 @@ public final class FlatFileDatabaseManager implements DatabaseManager { private final @NotNull Logger logger; private final long purgeTime; private final int startingLevel; - private boolean testing; + private final boolean testing; private final long UPDATE_WAIT_TIME = 600000L; // 10 minutes private final @NotNull File usersFile; @@ -97,6 +97,8 @@ public final class FlatFileDatabaseManager implements DatabaseManager { logger.info("Detected "+flatFileDataFlags.size() + " data entries which need correction."); } } + + updateLeaderboards(); } } @@ -193,29 +195,31 @@ public final class FlatFileDatabaseManager implements DatabaseManager { String name = character[USERNAME_INDEX]; long lastPlayed = 0; boolean rewrite = false; + try { - lastPlayed = Long.parseLong(character[37]) * Misc.TIME_CONVERSION_FACTOR; - } - catch (NumberFormatException e) { + lastPlayed = Long.parseLong(character[OVERHAUL_LAST_LOGIN]); + } catch (NumberFormatException e) { e.printStackTrace(); } - if (lastPlayed == 0) { + + if (lastPlayed == -1) { OfflinePlayer player = mcMMO.p.getServer().getOfflinePlayer(name); - lastPlayed = player.getLastPlayed(); - rewrite = true; + + if(player.getLastPlayed() != 0) { + lastPlayed = player.getLastPlayed(); + rewrite = true; + } } if (currentTime - lastPlayed > purgeTime) { removedPlayers++; - } - else { + } else { if (rewrite) { // Rewrite their data with a valid time - character[37] = Long.toString(lastPlayed); + character[OVERHAUL_LAST_LOGIN] = Long.toString(lastPlayed); String newLine = org.apache.commons.lang.StringUtils.join(character, ":"); writer.append(newLine).append("\r\n"); - } - else { + } else { writer.append(line).append("\r\n"); } } @@ -421,51 +425,52 @@ public final class FlatFileDatabaseManager implements DatabaseManager { } } - private void writeUserToLine(PlayerProfile profile, @NotNull String playerName, @Nullable UUID uuid, StringBuilder writer) { + public void writeUserToLine(@NotNull PlayerProfile profile, @NotNull String playerName, @Nullable UUID uuid, @NotNull Appendable writer) throws IOException { 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(":"); + writer.append(String.valueOf(profile.getSkillLevel(PrimarySkillType.MINING))).append(":"); + writer.append(IGNORED).append(":"); + writer.append(IGNORED).append(":"); + writer.append(String.valueOf(profile.getSkillXpLevel(PrimarySkillType.MINING))).append(":"); + writer.append(String.valueOf(profile.getSkillLevel(PrimarySkillType.WOODCUTTING))).append(":"); + writer.append(String.valueOf(profile.getSkillXpLevel(PrimarySkillType.WOODCUTTING))).append(":"); + writer.append(String.valueOf(profile.getSkillLevel(PrimarySkillType.REPAIR))).append(":"); + writer.append(String.valueOf(profile.getSkillLevel(PrimarySkillType.UNARMED))).append(":"); + writer.append(String.valueOf(profile.getSkillLevel(PrimarySkillType.HERBALISM))).append(":"); + writer.append(String.valueOf(profile.getSkillLevel(PrimarySkillType.EXCAVATION))).append(":"); + writer.append(String.valueOf(profile.getSkillLevel(PrimarySkillType.ARCHERY))).append(":"); + writer.append(String.valueOf(profile.getSkillLevel(PrimarySkillType.SWORDS))).append(":"); + writer.append(String.valueOf(profile.getSkillLevel(PrimarySkillType.AXES))).append(":"); + writer.append(String.valueOf(profile.getSkillLevel(PrimarySkillType.ACROBATICS))).append(":"); + writer.append(String.valueOf(profile.getSkillXpLevel(PrimarySkillType.REPAIR))).append(":"); + writer.append(String.valueOf(profile.getSkillXpLevel(PrimarySkillType.UNARMED))).append(":"); + writer.append(String.valueOf(profile.getSkillXpLevel(PrimarySkillType.HERBALISM))).append(":"); + writer.append(String.valueOf(profile.getSkillXpLevel(PrimarySkillType.EXCAVATION))).append(":"); + writer.append(String.valueOf(profile.getSkillXpLevel(PrimarySkillType.ARCHERY))).append(":"); + writer.append(String.valueOf(profile.getSkillXpLevel(PrimarySkillType.SWORDS))).append(":"); + writer.append(String.valueOf(profile.getSkillXpLevel(PrimarySkillType.AXES))).append(":"); + writer.append(String.valueOf(profile.getSkillXpLevel(PrimarySkillType.ACROBATICS))).append(":"); + writer.append(IGNORED).append(":"); + writer.append(String.valueOf(profile.getSkillLevel(PrimarySkillType.TAMING))).append(":"); + writer.append(String.valueOf(profile.getSkillXpLevel(PrimarySkillType.TAMING))).append(":"); + writer.append(String.valueOf(profile.getAbilityDATS(SuperAbilityType.BERSERK))).append(":"); + writer.append(String.valueOf(profile.getAbilityDATS(SuperAbilityType.GIGA_DRILL_BREAKER))).append(":"); + writer.append(String.valueOf(profile.getAbilityDATS(SuperAbilityType.TREE_FELLER))).append(":"); + writer.append(String.valueOf(profile.getAbilityDATS(SuperAbilityType.GREEN_TERRA))).append(":"); + writer.append(String.valueOf(profile.getAbilityDATS(SuperAbilityType.SERRATED_STRIKES))).append(":"); + writer.append(String.valueOf(profile.getAbilityDATS(SuperAbilityType.SKULL_SPLITTER))).append(":"); + writer.append(String.valueOf(profile.getAbilityDATS(SuperAbilityType.SUPER_BREAKER))).append(":"); + writer.append(IGNORED).append(":"); + writer.append(String.valueOf(profile.getSkillLevel(PrimarySkillType.FISHING))).append(":"); + writer.append(String.valueOf(profile.getSkillXpLevel(PrimarySkillType.FISHING))).append(":"); + writer.append(String.valueOf(profile.getAbilityDATS(SuperAbilityType.BLAST_MINING))).append(":"); + writer.append(IGNORED).append(":"); //Legacy last login writer.append(IGNORED).append(":"); //mob health bar - writer.append(profile.getSkillLevel(PrimarySkillType.ALCHEMY)).append(":"); - writer.append(profile.getSkillXpLevel(PrimarySkillType.ALCHEMY)).append(":"); + writer.append(String.valueOf(profile.getSkillLevel(PrimarySkillType.ALCHEMY))).append(":"); + writer.append(String.valueOf(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(String.valueOf(profile.getScoreboardTipsShown())).append(":"); + writer.append(String.valueOf(profile.getUniqueData(UniqueDataType.CHIMAERA_WING_DATS))).append(":"); + writer.append(String.valueOf(profile.getLastLogin())).append(":"); //overhaul last login writer.append("\r\n"); } @@ -498,81 +503,21 @@ public final class FlatFileDatabaseManager implements DatabaseManager { } public @NotNull PlayerProfile newUser(@NotNull Player player) { - newUser(player.getName(), player.getUniqueId()); - return new PlayerProfile(player.getName(), player.getUniqueId(), true); + return new PlayerProfile(player.getName(), player.getUniqueId(), true, startingLevel); } - public void newUser(String playerName, UUID uuid) { - BufferedWriter out = null; + public @NotNull PlayerProfile newUser(@NotNull String playerName, @NotNull UUID uuid) { + PlayerProfile playerProfile = new PlayerProfile(playerName, uuid, true, startingLevel); + synchronized (fileWritingLock) { - try { - // Open the file to write the player - out = new BufferedWriter(new FileWriter(usersFilePath, true)); - - String startingLevelStr = startingLevel + ":"; - - // Add the player to the end - out.append(playerName).append(":"); - out.append(startingLevelStr); // Mining - out.append(":"); - out.append(":"); - out.append("0:"); // Xp - out.append(startingLevelStr); // Woodcutting - out.append("0:"); // WoodCuttingXp - out.append(startingLevelStr); // Repair - out.append(startingLevelStr); // Unarmed - out.append(startingLevelStr); // Herbalism - out.append(startingLevelStr); // Excavation - out.append(startingLevelStr); // Archery - out.append(startingLevelStr); // Swords - out.append(startingLevelStr); // Axes - out.append(startingLevelStr); // 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(startingLevelStr); // 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(startingLevelStr); // Fishing - out.append("0:"); // FishingXp - out.append("0:"); // Blast Mining - out.append(String.valueOf(System.currentTimeMillis() / Misc.TIME_CONVERSION_FACTOR)).append(":"); // LastLogin - out.append(IGNORED).append(":"); // Mob Healthbar HUD - out.append(startingLevelStr); // 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) { + try (BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(usersFilePath, true))) { + writeUserToLine(playerProfile, playerName, uuid, bufferedWriter); + } catch (Exception e) { e.printStackTrace(); } - finally { - if (out != null) { - try { - out.close(); - } - catch (IOException e) { - // Ignore - } - } - } } + + return playerProfile; } public @NotNull PlayerProfile loadPlayerProfile(@NotNull OfflinePlayer offlinePlayer) { @@ -587,6 +532,10 @@ public final class FlatFileDatabaseManager implements DatabaseManager { return loadPlayerByUUID(uuid, playerName, false); } + public @NotNull PlayerProfile loadPlayerProfile(@NotNull UUID uuid) { + return loadPlayerByUUID(uuid, null, false); + } + private @NotNull PlayerProfile loadPlayerByUUID(@NotNull UUID uuid, @Nullable String playerName, boolean isOnline) { BufferedReader in = null; @@ -700,7 +649,7 @@ public final class FlatFileDatabaseManager implements DatabaseManager { } //Return a new blank profile - return new PlayerProfile(playerName, null); + return new PlayerProfile(playerName, new UUID(0, 0), startingLevel); } private @NotNull PlayerProfile grabUnloadedProfile(@NotNull UUID uuid, @Nullable String playerName) { @@ -708,7 +657,7 @@ public final class FlatFileDatabaseManager implements DatabaseManager { playerName = ""; //No name for you boy! } - return new PlayerProfile(playerName, uuid); + return new PlayerProfile(playerName, uuid, 0); } public void convertUsers(DatabaseManager destination) { @@ -731,8 +680,7 @@ public final class FlatFileDatabaseManager implements DatabaseManager { try { destination.saveUser(loadFromLine(character)); - } - catch (Exception e) { + } catch (Exception e) { e.printStackTrace(); } convertedUsers++; diff --git a/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java index 6599e707c..01c14ed16 100644 --- a/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java @@ -1,6 +1,7 @@ package com.gmail.nossr50.database; import com.gmail.nossr50.api.exceptions.InvalidSkillException; +import com.gmail.nossr50.config.AdvancedConfig; import com.gmail.nossr50.datatypes.MobHealthbarType; import com.gmail.nossr50.datatypes.database.DatabaseType; import com.gmail.nossr50.datatypes.database.PlayerStat; @@ -491,19 +492,19 @@ 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 @@ -513,7 +514,7 @@ public final class SQLDatabaseManager implements DatabaseManager { int id = newUser(connection, player.getName(), player.getUniqueId()); if (id == -1) { - return new PlayerProfile(player.getName(), player.getUniqueId(), false); + return new PlayerProfile(player.getName(), player.getUniqueId(), false, mcMMO.p.getAdvancedConfig().getStartingLevel()); } else { return loadPlayerProfile(player.getUniqueId(), player.getName()); } @@ -521,7 +522,7 @@ public final class SQLDatabaseManager implements DatabaseManager { e.printStackTrace(); } - return new PlayerProfile(player.getName(), player.getUniqueId(), false); + return new PlayerProfile(player.getName(), player.getUniqueId(), false, mcMMO.p.getAdvancedConfig().getStartingLevel()); } private int newUser(Connection connection, String playerName, UUID uuid) { @@ -567,7 +568,7 @@ public final class SQLDatabaseManager implements DatabaseManager { return loadPlayerFromDB(null, playerName); } catch (RuntimeException e) { e.printStackTrace(); - return new PlayerProfile(playerName, false); + return new PlayerProfile(playerName, false, mcMMO.p.getAdvancedConfig().getStartingLevel()); } } @@ -575,6 +576,12 @@ public final class SQLDatabaseManager implements DatabaseManager { return loadPlayerFromDB(uuid, playerName); } + @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."); @@ -590,7 +597,7 @@ public final class SQLDatabaseManager implements DatabaseManager { if (id == -1) { // There is no such user - return new PlayerProfile(playerName, false); + return new PlayerProfile(playerName, mcMMO.p.getAdvancedConfig().getStartingLevel()); } // There is such a user writeMissingRows(connection, id); @@ -659,7 +666,7 @@ public final class SQLDatabaseManager implements DatabaseManager { } //Return empty profile - return new PlayerProfile(playerName, false); + return new PlayerProfile(playerName, mcMMO.p.getAdvancedConfig().getStartingLevel()); } public void convertUsers(DatabaseManager destination) { 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 1295a6d05..81d2d8417 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/player/PlayerProfile.java +++ b/src/main/java/com/gmail/nossr50/datatypes/player/PlayerProfile.java @@ -43,11 +43,13 @@ public class PlayerProfile { private final Map rollingSkillsXp = new EnumMap(PrimarySkillType.class); @Deprecated - public PlayerProfile(String playerName) { - this(playerName, null); + //TODO: Add deprecated constructor w/o startinglevel + public PlayerProfile(String playerName, int startingLevel) { + this(playerName, null, startingLevel); } - public PlayerProfile(String playerName, UUID uuid) { + //TODO: Add deprecated constructor w/o startinglevel + public PlayerProfile(String playerName, UUID uuid, int startingLevel) { this.uuid = uuid; this.playerName = playerName; @@ -58,9 +60,7 @@ public class PlayerProfile { } for (PrimarySkillType primarySkillType : SkillTools.NON_CHILD_SKILLS) { - int startingLvl = mcMMO.p != null ? mcMMO.p.getAdvancedConfig().getStartingLevel() : 0; //TODO: Setup the mock since this was to avoid setting up a mock in a test - - skills.put(primarySkillType, startingLvl); + skills.put(primarySkillType, startingLevel); skillsXp.put(primarySkillType, 0F); } @@ -70,13 +70,13 @@ public class PlayerProfile { } @Deprecated - public PlayerProfile(@NotNull String playerName, boolean isLoaded) { - this(playerName); + public PlayerProfile(@NotNull String playerName, boolean isLoaded, int startingLvl) { + this(playerName, startingLvl); this.loaded = isLoaded; } - public PlayerProfile(@NotNull 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; } @@ -167,6 +167,10 @@ public class PlayerProfile { return lastLogin; } + public void updateLastLogin() { + this.lastLogin = System.currentTimeMillis(); + } + public String getPlayerName() { return playerName; } diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index 69982d932..5e08bc34e 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -59,8 +59,10 @@ 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; @@ -168,6 +170,13 @@ public class mcMMO extends JavaPlugin { p = this; } + + protected mcMMO(JavaPluginLoader loader, PluginDescriptionFile description, File dataFolder, File file) + { + super(loader, description, dataFolder, file); + } + + /** * Things to be run when the plugin is enabled. */ 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 5dccb2cf1..95c0ddc71 100644 --- a/src/main/java/com/gmail/nossr50/runnables/player/PlayerProfileLoadingTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/player/PlayerProfileLoadingTask.java @@ -92,6 +92,8 @@ public class PlayerProfileLoadingTask extends BukkitRunnable { return; } + mcMMOPlayer.getProfile().updateLastLogin(); + mcMMOPlayer.setupPartyData(); UserManager.track(mcMMOPlayer); mcMMOPlayer.actualizeRespawnATS(); 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 d40403ddd..cda34dd8b 100644 --- a/src/main/java/com/gmail/nossr50/util/commands/CommandUtils.java +++ b/src/main/java/com/gmail/nossr50/util/commands/CommandUtils.java @@ -86,7 +86,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; diff --git a/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java b/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java index 48a1481b7..71f5de649 100644 --- a/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java +++ b/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java @@ -6,14 +6,20 @@ 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.player.PlayerProfileLoadingTask; 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.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.core.classloader.annotations.SuppressStaticInitializationFor; import org.powermock.modules.junit4.PowerMockRunner; import java.io.*; @@ -26,9 +32,10 @@ import static org.junit.Assert.*; //TODO: Test update leaderboards -@RunWith(PowerMockRunner.class) public class FlatFileDatabaseManagerTest { + public mcMMO plugin; + 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:"; @@ -137,7 +144,7 @@ public class FlatFileDatabaseManagerTest { //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); + PlayerProfile testProfile = new PlayerProfile(playerName, uuid, 0); //The above profile should be "zero" initialized //Save the zero version and see if it looks correct @@ -208,6 +215,56 @@ public class FlatFileDatabaseManagerTest { testHealthyDataProfileValues(playerName, uuid, profile); } + @Test + public 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)); + } + + 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 public void testLoadByUUID() { File dbFile = prepareDatabaseTestResource(DB_HEALTHY); From 22b24b47741b53e6180673122d7aaa4328c7dcec Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 13 Apr 2021 17:25:56 -0700 Subject: [PATCH 501/662] JUnit 5 time --- pom.xml | 54 +++++-- .../database/FlatFileDataProcessor.java | 2 + .../database/FlatFileDatabaseManager.java | 134 +++++++++++------- .../nossr50/database/SQLDatabaseManager.java | 1 - .../database/FlatFileDatabaseManagerTest.java | 99 ++++++++++--- 5 files changed, 202 insertions(+), 88 deletions(-) diff --git a/pom.xml b/pom.xml index 231bd7f4b..38b04da11 100755 --- a/pom.xml +++ b/pom.xml @@ -11,6 +11,11 @@ scm:git:git@github.com:mcMMO-Dev/mcMMO.git HEAD + + + UTF-8 + + https://github.com/mcMMO-Dev/mcMMO/issues GitHub @@ -66,13 +71,12 @@ - org.apache.maven.plugins maven-surefire-plugin - 2.16 - - false - 1 - + 2.22.2 + + + maven-failsafe-plugin + 2.22.2 @@ -219,6 +223,17 @@ + + + + + + + + + + + com.github.seeseemelk @@ -271,6 +286,12 @@ net.kyori adventure-platform-common 4.0.0-SNAPSHOT + + + net.kyori + adventure-nbt + + org.apache.maven.scm @@ -314,9 +335,21 @@ - junit - junit-dep - 4.11 + org.junit.jupiter + junit-jupiter-api + 5.7.1 + test + + + org.junit.jupiter + junit-jupiter-engine + 5.7.1 + test + + + org.junit.vintage + junit-vintage-engine + 5.6.2 test @@ -349,7 +382,4 @@ 19.0.0 - - UTF-8 - diff --git a/src/main/java/com/gmail/nossr50/database/FlatFileDataProcessor.java b/src/main/java/com/gmail/nossr50/database/FlatFileDataProcessor.java index 1b9651089..a232d86cd 100644 --- a/src/main/java/com/gmail/nossr50/database/FlatFileDataProcessor.java +++ b/src/main/java/com/gmail/nossr50/database/FlatFileDataProcessor.java @@ -119,6 +119,8 @@ public class FlatFileDataProcessor { if(names.contains(name)) { builder.appendFlag(FlatFileDataFlag.DUPLICATE_NAME); + anyBadData = true; + badDataValues[USERNAME_INDEX] = true; } if(!name.isEmpty()) diff --git a/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java index 8d4f8ea30..b47477651 100644 --- a/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java @@ -174,6 +174,7 @@ public final class FlatFileDatabaseManager implements DatabaseManager { return purgedUsers; } + //TODO: Test this public void purgeOldUsers() { int removedPlayers = 0; long currentTime = System.currentTimeMillis(); @@ -211,7 +212,7 @@ public final class FlatFileDatabaseManager implements DatabaseManager { } } - if (currentTime - lastPlayed > purgeTime) { + if (lastPlayed != -1 && lastPlayed != 0 && currentTime - lastPlayed > purgeTime) { removedPlayers++; } else { if (rewrite) { @@ -425,53 +426,53 @@ public final class FlatFileDatabaseManager implements DatabaseManager { } } - public void writeUserToLine(@NotNull PlayerProfile profile, @NotNull String playerName, @Nullable UUID uuid, @NotNull Appendable writer) throws IOException { - writer.append(playerName).append(":"); - writer.append(String.valueOf(profile.getSkillLevel(PrimarySkillType.MINING))).append(":"); - writer.append(IGNORED).append(":"); - writer.append(IGNORED).append(":"); - writer.append(String.valueOf(profile.getSkillXpLevel(PrimarySkillType.MINING))).append(":"); - writer.append(String.valueOf(profile.getSkillLevel(PrimarySkillType.WOODCUTTING))).append(":"); - writer.append(String.valueOf(profile.getSkillXpLevel(PrimarySkillType.WOODCUTTING))).append(":"); - writer.append(String.valueOf(profile.getSkillLevel(PrimarySkillType.REPAIR))).append(":"); - writer.append(String.valueOf(profile.getSkillLevel(PrimarySkillType.UNARMED))).append(":"); - writer.append(String.valueOf(profile.getSkillLevel(PrimarySkillType.HERBALISM))).append(":"); - writer.append(String.valueOf(profile.getSkillLevel(PrimarySkillType.EXCAVATION))).append(":"); - writer.append(String.valueOf(profile.getSkillLevel(PrimarySkillType.ARCHERY))).append(":"); - writer.append(String.valueOf(profile.getSkillLevel(PrimarySkillType.SWORDS))).append(":"); - writer.append(String.valueOf(profile.getSkillLevel(PrimarySkillType.AXES))).append(":"); - writer.append(String.valueOf(profile.getSkillLevel(PrimarySkillType.ACROBATICS))).append(":"); - writer.append(String.valueOf(profile.getSkillXpLevel(PrimarySkillType.REPAIR))).append(":"); - writer.append(String.valueOf(profile.getSkillXpLevel(PrimarySkillType.UNARMED))).append(":"); - writer.append(String.valueOf(profile.getSkillXpLevel(PrimarySkillType.HERBALISM))).append(":"); - writer.append(String.valueOf(profile.getSkillXpLevel(PrimarySkillType.EXCAVATION))).append(":"); - writer.append(String.valueOf(profile.getSkillXpLevel(PrimarySkillType.ARCHERY))).append(":"); - writer.append(String.valueOf(profile.getSkillXpLevel(PrimarySkillType.SWORDS))).append(":"); - writer.append(String.valueOf(profile.getSkillXpLevel(PrimarySkillType.AXES))).append(":"); - writer.append(String.valueOf(profile.getSkillXpLevel(PrimarySkillType.ACROBATICS))).append(":"); - writer.append(IGNORED).append(":"); - writer.append(String.valueOf(profile.getSkillLevel(PrimarySkillType.TAMING))).append(":"); - writer.append(String.valueOf(profile.getSkillXpLevel(PrimarySkillType.TAMING))).append(":"); - writer.append(String.valueOf(profile.getAbilityDATS(SuperAbilityType.BERSERK))).append(":"); - writer.append(String.valueOf(profile.getAbilityDATS(SuperAbilityType.GIGA_DRILL_BREAKER))).append(":"); - writer.append(String.valueOf(profile.getAbilityDATS(SuperAbilityType.TREE_FELLER))).append(":"); - writer.append(String.valueOf(profile.getAbilityDATS(SuperAbilityType.GREEN_TERRA))).append(":"); - writer.append(String.valueOf(profile.getAbilityDATS(SuperAbilityType.SERRATED_STRIKES))).append(":"); - writer.append(String.valueOf(profile.getAbilityDATS(SuperAbilityType.SKULL_SPLITTER))).append(":"); - writer.append(String.valueOf(profile.getAbilityDATS(SuperAbilityType.SUPER_BREAKER))).append(":"); - writer.append(IGNORED).append(":"); - writer.append(String.valueOf(profile.getSkillLevel(PrimarySkillType.FISHING))).append(":"); - writer.append(String.valueOf(profile.getSkillXpLevel(PrimarySkillType.FISHING))).append(":"); - writer.append(String.valueOf(profile.getAbilityDATS(SuperAbilityType.BLAST_MINING))).append(":"); - writer.append(IGNORED).append(":"); //Legacy last login - writer.append(IGNORED).append(":"); //mob health bar - writer.append(String.valueOf(profile.getSkillLevel(PrimarySkillType.ALCHEMY))).append(":"); - writer.append(String.valueOf(profile.getSkillXpLevel(PrimarySkillType.ALCHEMY))).append(":"); - writer.append(uuid != null ? uuid.toString() : "NULL").append(":"); - writer.append(String.valueOf(profile.getScoreboardTipsShown())).append(":"); - writer.append(String.valueOf(profile.getUniqueData(UniqueDataType.CHIMAERA_WING_DATS))).append(":"); - writer.append(String.valueOf(profile.getLastLogin())).append(":"); //overhaul last login - writer.append("\r\n"); + public void writeUserToLine(@NotNull PlayerProfile profile, @NotNull String playerName, @Nullable UUID uuid, @NotNull Appendable appendable) throws IOException { + appendable.append(playerName).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(uuid != null ? uuid.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 { @@ -510,9 +511,23 @@ public final class FlatFileDatabaseManager implements DatabaseManager { PlayerProfile playerProfile = new PlayerProfile(playerName, uuid, true, startingLevel); synchronized (fileWritingLock) { - try (BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(usersFilePath, true))) { - writeUserToLine(playerProfile, playerName, uuid, bufferedWriter); - } catch (Exception e) { + 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, playerName, uuid, stringBuilder); + fileWriter.write(stringBuilder.toString()); + } catch (Exception e) { + e.printStackTrace(); + } + } catch (IOException e) { e.printStackTrace(); } } @@ -536,7 +551,17 @@ public final class FlatFileDatabaseManager implements DatabaseManager { return loadPlayerByUUID(uuid, null, false); } - private @NotNull PlayerProfile loadPlayerByUUID(@NotNull UUID uuid, @Nullable String playerName, boolean isOnline) { + /** + * Find and load a player by UUID + * + * @param uuid target uuid + * @param playerName target player name + * @param replaceName name to replace if the found name differs + * @return a profile with the targets data or an unloaded profile if no data was found + * @deprecated only use this if you know what you are doing, replacing the name can cause havoc + */ + @Deprecated + public @NotNull PlayerProfile loadPlayerByUUID(@NotNull UUID uuid, @Nullable String playerName, boolean replaceName) { BufferedReader in = null; synchronized (fileWritingLock) { @@ -574,7 +599,8 @@ public final class FlatFileDatabaseManager implements DatabaseManager { /* Check for nickname changes and update since we are here anyways */ if(playerName != null) { - if(isOnline) { + if(replaceName) { + logger.info("A users name is being updated, this can happen from either a call to our API or they simply changed their name"); if (!rawSplitData[USERNAME_INDEX].equalsIgnoreCase(playerName)) { //logger.info("Name updated for player: " + rawSplitData[USERNAME_INDEX] + " => " + playerName); rawSplitData[USERNAME_INDEX] = playerName; @@ -1162,7 +1188,7 @@ public final class FlatFileDatabaseManager implements DatabaseManager { lastLogin = -1; } - return new PlayerProfile(character[USERNAME_INDEX], uuid, skills, skillsXp, skillsDATS, scoreboardTipsShown, uniquePlayerDataMap, lastLogin); + 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) { diff --git a/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java index 01c14ed16..a937efb0b 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.api.exceptions.InvalidSkillException; -import com.gmail.nossr50.config.AdvancedConfig; import com.gmail.nossr50.datatypes.MobHealthbarType; import com.gmail.nossr50.datatypes.database.DatabaseType; import com.gmail.nossr50.datatypes.database.PlayerStat; diff --git a/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java b/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java index 71f5de649..d9cd5051d 100644 --- a/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java +++ b/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java @@ -6,36 +6,28 @@ 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.player.PlayerProfileLoadingTask; 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.After; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.core.classloader.annotations.SuppressStaticInitializationFor; -import org.powermock.modules.junit4.PowerMockRunner; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import java.io.*; import java.net.URI; import java.net.URISyntaxException; -import java.util.*; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; import java.util.logging.Logger; -import static org.junit.Assert.*; - +import static org.junit.jupiter.api.Assertions.*; //TODO: Test update leaderboards +//This class uses JUnit5/Jupiter public class FlatFileDatabaseManagerTest { - public mcMMO plugin; - 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:"; @@ -68,7 +60,7 @@ public class FlatFileDatabaseManagerTest { int expectedScoreboardTips = 1111; Long expectedLastLogin = 2020L; - @Before + @BeforeEach public void init() { assertNull(db); //noinspection UnstableApiUsage @@ -76,7 +68,7 @@ public class FlatFileDatabaseManagerTest { db = new FlatFileDatabaseManager(new File(tempDir.getPath() + File.separator + TEST_FILE_NAME), logger, PURGE_TIME, 0, true); } - @After + @AfterEach public void tearDown() { TestUtil.recursiveDelete(tempDir); db = null; @@ -184,7 +176,6 @@ public class FlatFileDatabaseManagerTest { assertEquals(-1, (long) profile.getLastLogin()); } - @Test public void testLoadByName() { File healthyDB = prepareDatabaseTestResource(DB_HEALTHY); @@ -244,6 +235,47 @@ public class FlatFileDatabaseManagerTest { 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 + public 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, playerName); + 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) { @@ -466,7 +498,32 @@ public class FlatFileDatabaseManagerTest { @Test public 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 + public void testUpdateName() { + //TODO: The code in this test didn't actually trigger the save, so I'll have to do something else to test saving +// UUID uuid = UUID.fromString(HEALTHY_DB_LINE_ONE_UUID_STR); //Entrant "nossr50" +// String playerName = "the_new_name_man"; +// +// File file = prepareDatabaseTestResource(DB_HEALTHY); //Existing DB +// db = new FlatFileDatabaseManager(file, logger, PURGE_TIME, 0, true); +// db.checkFileHealthAndStructure(); +// ArrayList splitDataLines = getSplitDataFromFile(db.getUsersFile()); +// String oldName = "nossr50"; +// assertEquals(oldName, splitDataLines.get(0)[0]); //Name comparison +// assertEquals(uuid.toString(), splitDataLines.get(0)[FlatFileDatabaseManager.UUID_INDEX]); //UUID Comparison +// +// //Now we load the player and their name should get replaced +// PlayerProfile profile = db.loadPlayerByUUID(uuid, playerName, true); +// assertEquals(playerName, profile.getPlayerName()); +// +// splitDataLines = getSplitDataFromFile(db.getUsersFile()); //Load the file again +// assertNotEquals(oldName, splitDataLines.get(0)[0]); //Name comparison +// assertEquals(playerName, splitDataLines.get(0)[0]); //Name comparison } @Test @@ -573,9 +630,9 @@ public class FlatFileDatabaseManagerTest { //This makes sure our private method is working before the tests run afterwards ArrayList dataFromFile = getSplitDataFromFile(copyOfFile); System.out.println("File Path: "+copyOfFile.getAbsolutePath()); - assertEquals(BAD_FILE_LINE_ONE.split(":"), dataFromFile.get(0)); + assertArrayEquals(BAD_FILE_LINE_ONE.split(":"), dataFromFile.get(0)); assertEquals(dataFromFile.get(22)[0], "nossr51"); - assertEquals(BAD_DATA_FILE_LINE_TWENTY_THREE.split(":"), dataFromFile.get(22)); + 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(); From 700a7f4d35869dd4fe29d236ae33c22aef9e8a97 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Wed, 14 Apr 2021 15:50:13 -0700 Subject: [PATCH 502/662] Fix ArrayIndexOutOfBounds for certain events due to spigot API bug Fixes #4488 --- Changelog.txt | 5 +- .../nossr50/listeners/BlockListener.java | 31 +- .../java/com/gmail/nossr50/util/Misc.java | 6 - .../util/blockmeta/BitSetChunkStore.java | 8 +- .../util/compat/CompatibilityLayer.java | 2 +- .../util/compat/CompatibilityManager.java | 39 ++ .../layers/world/WorldCompatibilityLayer.java | 11 + .../world/WorldCompatibilityLayer_1_16_4.java | 16 + .../util/blockmeta/ChunkStoreTest.java | 339 +++++++++++++++++- 9 files changed, 429 insertions(+), 28 deletions(-) create mode 100644 src/main/java/com/gmail/nossr50/util/compat/layers/world/WorldCompatibilityLayer.java create mode 100644 src/main/java/com/gmail/nossr50/util/compat/layers/world/WorldCompatibilityLayer_1_16_4.java diff --git a/Changelog.txt b/Changelog.txt index 8a704c845..d8c941814 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,5 +1,6 @@ Version 2.1.189 FlatFileDB now stores the last login of users again (was completely non functional for a while) + mcMMO will once again purge old users if the config option is on (see notes) Newly created flat file databases (mcmmo.users file) will have a comment line at the top noting the date the database was created Fixed a bug where FlatFileDatabase users could have their names saved as "null" (names will be fixed the next time the player logs in) Rewrote how FlatFileDatabase verifies data integrity @@ -24,7 +25,9 @@ Version 2.1.189 (API) Some members of PrimarySkillType were removed and not deprecated (such as the field constants) NOTES: - I spent over 20 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 + 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. + 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 Ultra Permissions is SAFE to use with mcMMO 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. diff --git a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java index 4ac4cec47..06c3a7c2e 100644 --- a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java @@ -20,6 +20,7 @@ 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.*; +import com.gmail.nossr50.util.compat.layers.world.WorldCompatibilityLayer; import com.gmail.nossr50.util.player.UserManager; import com.gmail.nossr50.util.skills.SkillUtils; import com.gmail.nossr50.util.sounds.SoundManager; @@ -147,13 +148,21 @@ public class BlockListener implements Listener { // Get opposite direction so we get correct block BlockFace direction = event.getDirection(); Block movedBlock = event.getBlock().getRelative(direction); - if (movedBlock.getY() >= Misc.getWorldMinCompat(movedBlock.getWorld())) // Very weird that the event is giving us these, they shouldn't exist + + WorldCompatibilityLayer worldCompatibilityLayer = mcMMO.getCompatibilityManager().getWorldCompatibilityLayer(); + + World world = movedBlock.getWorld(); + + //Spigot makes bad things happen in its API + if(event.getBlock().getY() < worldCompatibilityLayer.getMaxWorldHeight(world) || event.getBlock().getY() >= worldCompatibilityLayer.getMinWorldHeight(world)) { mcMMO.getPlaceStore().setTrue(movedBlock); + } for (Block block : event.getBlocks()) { - movedBlock = block.getRelative(direction); - if (movedBlock.getY() < Misc.getWorldMinCompat(movedBlock.getWorld())) // Very weird that the event is giving us these, they shouldn't exist - continue; + if(block.getY() < worldCompatibilityLayer.getMaxWorldHeight(world) || block.getY() >= worldCompatibilityLayer.getMinWorldHeight(world)) { + mcMMO.getPlaceStore().setTrue(block.getRelative(direction)); + } + mcMMO.getPlaceStore().setTrue(movedBlock); } } @@ -185,13 +194,21 @@ public class BlockListener implements Listener { @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onBlockFormEvent(BlockFormEvent event) { - /* WORLD BLACKLIST CHECK */ - if(WorldBlacklist.isWorldBlacklisted(event.getBlock().getWorld())) - return; + World world = event.getBlock().getWorld(); + /* WORLD BLACKLIST CHECK */ { + if(WorldBlacklist.isWorldBlacklisted(world)) + return; + } BlockState newState = event.getNewState(); if(ExperienceConfig.getInstance().preventStoneLavaFarming()) { + WorldCompatibilityLayer worldCompatibilityLayer = mcMMO.getCompatibilityManager().getWorldCompatibilityLayer(); + + if(event.getBlock().getY() > worldCompatibilityLayer.getMaxWorldHeight(world) || event.getBlock().getY() < worldCompatibilityLayer.getMinWorldHeight(world)) { + return; + } + if(newState.getType() != Material.OBSIDIAN && ExperienceConfig.getInstance().doesBlockGiveSkillXP(PrimarySkillType.MINING, newState.getBlockData())) { mcMMO.getPlaceStore().setTrue(newState); diff --git a/src/main/java/com/gmail/nossr50/util/Misc.java b/src/main/java/com/gmail/nossr50/util/Misc.java index 5f19031d6..bd5058856 100644 --- a/src/main/java/com/gmail/nossr50/util/Misc.java +++ b/src/main/java/com/gmail/nossr50/util/Misc.java @@ -260,12 +260,6 @@ public final class Misc { } } - public static int getWorldMinCompat(World world) - { - // TODO this method should access the world min variable in a version safe manner so that we don't restrict usage to new versions of spigot only - return 0; - } - public static void printProgress(int convertedUsers, int progressInterval, long startMillis) { if ((convertedUsers % progressInterval) == 0) { mcMMO.p.getLogger().info(String.format("Conversion progress: %d users at %.2f users/second", convertedUsers, convertedUsers / (double) ((System.currentTimeMillis() - startMillis) / TIME_CONVERSION_FACTOR))); diff --git a/src/main/java/com/gmail/nossr50/util/blockmeta/BitSetChunkStore.java b/src/main/java/com/gmail/nossr50/util/blockmeta/BitSetChunkStore.java index 4830c9045..ef5dc5459 100644 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/BitSetChunkStore.java +++ b/src/main/java/com/gmail/nossr50/util/blockmeta/BitSetChunkStore.java @@ -1,5 +1,6 @@ package com.gmail.nossr50.util.blockmeta; +import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.Misc; import org.bukkit.Bukkit; import org.bukkit.World; @@ -25,7 +26,7 @@ public class BitSetChunkStore implements ChunkStore { private transient boolean dirty = false; public BitSetChunkStore(@NotNull World world, int cx, int cz) { - this(world.getUID(), Misc.getWorldMinCompat(world), world.getMaxHeight(), cx, cz); + this(world.getUID(), mcMMO.getCompatibilityManager().getWorldCompatibilityLayer().getMinWorldHeight(world), world.getMaxHeight(), cx, cz); } private BitSetChunkStore(@NotNull UUID worldUid, int worldMin, int worldMax, int cx, int cz) { @@ -109,15 +110,14 @@ public class BitSetChunkStore implements ChunkStore { return (z * 16 + x) + (256 * (y + yOffset)); } - private static int getWorldMin(@NotNull UUID worldUid, int storedWorldMin) - { + private static int getWorldMin(@NotNull UUID worldUid, int storedWorldMin) { 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) return storedWorldMin; - return Misc.getWorldMinCompat(world); + return mcMMO.getCompatibilityManager().getWorldCompatibilityLayer().getMinWorldHeight(world); } private static int getWorldMax(@NotNull UUID worldUid, int storedWorldMax) 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 7a0a0e72a..6f34d3a89 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/CompatibilityManager.java +++ b/src/main/java/com/gmail/nossr50/util/compat/CompatibilityManager.java @@ -10,9 +10,12 @@ import com.gmail.nossr50.util.compat.layers.persistentdata.SpigotPersistentDataL import com.gmail.nossr50.util.compat.layers.persistentdata.SpigotPersistentDataLayer_1_14; import com.gmail.nossr50.util.compat.layers.skills.AbstractMasterAnglerCompatibility; import com.gmail.nossr50.util.compat.layers.skills.MasterAnglerCompatibilityLayer; +import com.gmail.nossr50.util.compat.layers.world.WorldCompatibilityLayer; +import com.gmail.nossr50.util.compat.layers.world.WorldCompatibilityLayer_1_16_4; import com.gmail.nossr50.util.nms.NMSVersion; import com.gmail.nossr50.util.platform.MinecraftGameVersion; import com.gmail.nossr50.util.text.StringUtils; +import org.bukkit.World; import org.bukkit.command.CommandSender; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -37,6 +40,7 @@ public class CompatibilityManager { private AbstractPersistentDataLayer persistentDataLayer; private AbstractBungeeSerializerCompatibilityLayer bungeeSerializerCompatibilityLayer; private AbstractMasterAnglerCompatibility masterAnglerCompatibility; + private WorldCompatibilityLayer worldCompatibilityLayer; public CompatibilityManager(MinecraftGameVersion minecraftGameVersion) { mcMMO.p.getLogger().info("Loading compatibility layers..."); @@ -67,10 +71,31 @@ public class CompatibilityManager { initPersistentDataLayer(); initBungeeSerializerLayer(); initMasterAnglerLayer(); + initWorldCompatibilityLayer(); isFullyCompatibleServerSoftware = true; } + private void initWorldCompatibilityLayer() { + if(minecraftGameVersion.getMinorVersion().asInt() >= 16 && minecraftGameVersion.getPatchVersion().asInt() >= 4 || minecraftGameVersion.getMajorVersion().asInt() >= 2) { + if(hasNewWorldMinHeightAPI()) { + worldCompatibilityLayer = new WorldCompatibilityLayer_1_16_4(); + } + } else { + worldCompatibilityLayer = new WorldCompatibilityLayer() { + @Override + public int getMinWorldHeight(@NotNull World world) { + return WorldCompatibilityLayer.super.getMinWorldHeight(world); + } + + @Override + public int getMaxWorldHeight(@NotNull World world) { + return WorldCompatibilityLayer.super.getMaxWorldHeight(world); + } + }; + } + } + private void initMasterAnglerLayer() { if(minecraftGameVersion.getMinorVersion().asInt() >= 16 || minecraftGameVersion.getMajorVersion().asInt() >= 2) { if(hasNewFishingHookAPI()) { @@ -81,6 +106,16 @@ public class CompatibilityManager { } } + private boolean hasNewWorldMinHeightAPI() { + try { + Class checkForClass = Class.forName("org.bukkit.World"); + checkForClass.getMethod("getMinHeight"); + return true; + } catch (ClassNotFoundException | NoSuchMethodException e) { + return false; + } + } + private boolean hasNewFishingHookAPI() { try { Class checkForClass = Class.forName("org.bukkit.entity.FishHook"); @@ -182,4 +217,8 @@ public class CompatibilityManager { public @Nullable AbstractMasterAnglerCompatibility getMasterAnglerCompatibilityLayer() { return masterAnglerCompatibility; } + + public @NotNull WorldCompatibilityLayer getWorldCompatibilityLayer() { + return worldCompatibilityLayer; + } } diff --git a/src/main/java/com/gmail/nossr50/util/compat/layers/world/WorldCompatibilityLayer.java b/src/main/java/com/gmail/nossr50/util/compat/layers/world/WorldCompatibilityLayer.java new file mode 100644 index 000000000..a8f970987 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/util/compat/layers/world/WorldCompatibilityLayer.java @@ -0,0 +1,11 @@ +package com.gmail.nossr50.util.compat.layers.world; + +import com.gmail.nossr50.util.compat.CompatibilityLayer; +import org.bukkit.World; +import org.jetbrains.annotations.NotNull; + +public interface WorldCompatibilityLayer extends CompatibilityLayer { + default int getMinWorldHeight(@NotNull World world) { return 0; } + + default int getMaxWorldHeight(@NotNull World world) { return 255; } +} diff --git a/src/main/java/com/gmail/nossr50/util/compat/layers/world/WorldCompatibilityLayer_1_16_4.java b/src/main/java/com/gmail/nossr50/util/compat/layers/world/WorldCompatibilityLayer_1_16_4.java new file mode 100644 index 000000000..4e67aaf5c --- /dev/null +++ b/src/main/java/com/gmail/nossr50/util/compat/layers/world/WorldCompatibilityLayer_1_16_4.java @@ -0,0 +1,16 @@ +package com.gmail.nossr50.util.compat.layers.world; + +import org.bukkit.World; +import org.jetbrains.annotations.NotNull; + +public class WorldCompatibilityLayer_1_16_4 implements WorldCompatibilityLayer { + @Override + public int getMinWorldHeight(@NotNull World world) { + return world.getMinHeight(); + } + + @Override + public int getMaxWorldHeight(@NotNull World world) { + return world.getMaxHeight(); + } +} diff --git a/src/test/java/com/gmail/nossr50/util/blockmeta/ChunkStoreTest.java b/src/test/java/com/gmail/nossr50/util/blockmeta/ChunkStoreTest.java index 99e61dbe5..0812f9142 100644 --- a/src/test/java/com/gmail/nossr50/util/blockmeta/ChunkStoreTest.java +++ b/src/test/java/com/gmail/nossr50/util/blockmeta/ChunkStoreTest.java @@ -1,20 +1,34 @@ package com.gmail.nossr50.util.blockmeta; import com.gmail.nossr50.TestUtil; -import com.gmail.nossr50.util.Misc; +import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.util.compat.CompatibilityManager; +import com.gmail.nossr50.util.compat.layers.world.WorldCompatibilityLayer; +import com.gmail.nossr50.util.platform.PlatformManager; import com.google.common.io.Files; -import org.bukkit.Bukkit; -import org.bukkit.World; -import org.bukkit.block.Block; +import org.bukkit.*; +import org.bukkit.block.*; +import org.bukkit.block.data.BlockData; +import org.bukkit.entity.Entity; +import org.bukkit.inventory.ItemStack; +import org.bukkit.metadata.MetadataValue; +import org.bukkit.plugin.Plugin; +import org.bukkit.util.BoundingBox; +import org.bukkit.util.RayTraceResult; +import org.bukkit.util.Vector; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.junit.*; 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 org.powermock.reflect.Whitebox; import java.io.*; +import java.util.Collection; +import java.util.List; import java.util.UUID; import static org.mockito.Mockito.mock; @@ -23,7 +37,7 @@ import static org.mockito.Mockito.mock; * 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. */ @RunWith(PowerMockRunner.class) -@PrepareForTest({ Bukkit.class, Misc.class }) +@PrepareForTest({ Bukkit.class, mcMMO.class}) public class ChunkStoreTest { private static File tempDir; @BeforeClass @@ -37,6 +51,10 @@ public class ChunkStoreTest { } private World mockWorld; + private CompatibilityManager compatibilityManager; + private WorldCompatibilityLayer worldCompatibilityLayer; + private PlatformManager platformManager; + @Before public void setUpMock(){ UUID worldUUID = UUID.randomUUID(); @@ -46,6 +64,39 @@ public class ChunkStoreTest { Mockito.when(mockWorld.getWorldFolder()).thenReturn(tempDir); PowerMockito.mockStatic(Bukkit.class); Mockito.when(Bukkit.getWorld(worldUUID)).thenReturn(mockWorld); + + platformManager = mock(PlatformManager.class); + compatibilityManager = mock(CompatibilityManager.class); + worldCompatibilityLayer = mock(WorldCompatibilityLayer.class); + + Whitebox.setInternalState(mcMMO.class, "platformManager", platformManager); + Mockito.when(mcMMO.getCompatibilityManager()).thenReturn(compatibilityManager); + + Assert.assertNotNull(mcMMO.getCompatibilityManager()); + Mockito.when(platformManager.getCompatibilityManager()).thenReturn(compatibilityManager); + Mockito.when(platformManager.getCompatibilityManager().getWorldCompatibilityLayer()).thenReturn(worldCompatibilityLayer); + Assert.assertNotNull(mcMMO.getCompatibilityManager().getWorldCompatibilityLayer()); + Mockito.when(worldCompatibilityLayer.getMinWorldHeight(mockWorld)).thenReturn(0); + Mockito.when(worldCompatibilityLayer.getMaxWorldHeight(mockWorld)).thenReturn(255); + } + + @Test + public void testSetTrue() { + Mockito.when(mcMMO.getCompatibilityManager().getWorldCompatibilityLayer().getMinWorldHeight(mockWorld)).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++) { + TestBlock testBlock = new TestBlock(x, y, z, mockWorld); + hashChunkManager.setTrue(testBlock); + Assert.assertTrue(hashChunkManager.isTrue(testBlock)); + hashChunkManager.setFalse(testBlock); + Assert.assertFalse(hashChunkManager.isTrue(testBlock)); + } + } + } } @Test @@ -79,8 +130,7 @@ public class ChunkStoreTest { @Test public void testNegativeWorldMin() throws IOException { - PowerMockito.mockStatic(Misc.class); - Mockito.when(Misc.getWorldMinCompat(mockWorld)).thenReturn(-64); + Mockito.when(mcMMO.getCompatibilityManager().getWorldCompatibilityLayer().getMinWorldHeight(mockWorld)).thenReturn(-64); BitSetChunkStore original = new BitSetChunkStore(mockWorld, 1, 2); original.setTrue(14, -32, 12); @@ -99,8 +149,7 @@ public class ChunkStoreTest { original.setTrue(13, 3, 12); byte[] serializedBytes = serializeChunkstore(original); - PowerMockito.mockStatic(Misc.class); - Mockito.when(Misc.getWorldMinCompat(mockWorld)).thenReturn(-64); + Mockito.when(mcMMO.getCompatibilityManager().getWorldCompatibilityLayer().getMinWorldHeight(mockWorld)).thenReturn(-64); ChunkStore deserialized = BitSetChunkStore.Serialization.readChunkStore(new DataInputStream(new ByteArrayInputStream(serializedBytes))); assertEqualIgnoreMinMax(original, deserialized); } @@ -360,4 +409,276 @@ public class ChunkStoreTest { super.writeUTF(str); } } + + private class TestBlock implements Block { + + private final int x, y, z; + private final @NotNull World world; + + private TestBlock(int x, int y, int z, World world) { + this.x = x; + this.y = y; + this.z = z; + this.world = world; + } + + @Override + public byte getData() { + return 0; + } + + @NotNull + @Override + public BlockData getBlockData() { + return null; + } + + @NotNull + @Override + public Block getRelative(int modX, int modY, int modZ) { + return null; + } + + @NotNull + @Override + public Block getRelative(@NotNull BlockFace face) { + return null; + } + + @NotNull + @Override + public Block getRelative(@NotNull BlockFace face, int distance) { + return null; + } + + @NotNull + @Override + public Material getType() { + return null; + } + + @Override + public byte getLightLevel() { + return 0; + } + + @Override + public byte getLightFromSky() { + return 0; + } + + @Override + public byte getLightFromBlocks() { + return 0; + } + + @NotNull + @Override + public World getWorld() { + return world; + } + + @Override + public int getX() { + return x; + } + + @Override + public int getY() { + return y; + } + + @Override + public int getZ() { + return z; + } + + @NotNull + @Override + public Location getLocation() { + return null; + } + + @Nullable + @Override + public Location getLocation(@Nullable Location loc) { + return null; + } + + @NotNull + @Override + public Chunk getChunk() { + return null; + } + + @Override + public void setBlockData(@NotNull BlockData data) { + + } + + @Override + public void setBlockData(@NotNull BlockData data, boolean applyPhysics) { + + } + + @Override + public void setType(@NotNull Material type) { + + } + + @Override + public void setType(@NotNull Material type, boolean applyPhysics) { + + } + + @Nullable + @Override + public BlockFace getFace(@NotNull Block block) { + return null; + } + + @NotNull + @Override + public BlockState getState() { + return null; + } + + @NotNull + @Override + public Biome getBiome() { + return null; + } + + @Override + public void setBiome(@NotNull Biome bio) { + + } + + @Override + public boolean isBlockPowered() { + return false; + } + + @Override + public boolean isBlockIndirectlyPowered() { + return false; + } + + @Override + public boolean isBlockFacePowered(@NotNull BlockFace face) { + return false; + } + + @Override + public boolean isBlockFaceIndirectlyPowered(@NotNull BlockFace face) { + return false; + } + + @Override + public int getBlockPower(@NotNull BlockFace face) { + return 0; + } + + @Override + public int getBlockPower() { + return 0; + } + + @Override + public boolean isEmpty() { + return false; + } + + @Override + public boolean isLiquid() { + return false; + } + + @Override + public double getTemperature() { + return 0; + } + + @Override + public double getHumidity() { + return 0; + } + + @NotNull + @Override + public PistonMoveReaction getPistonMoveReaction() { + return null; + } + + @Override + public boolean breakNaturally() { + return false; + } + + @Override + public boolean breakNaturally(@Nullable ItemStack tool) { + return false; + } + + @Override + public boolean applyBoneMeal(@NotNull BlockFace face) { + return false; + } + + @NotNull + @Override + public Collection getDrops() { + return null; + } + + @NotNull + @Override + public Collection getDrops(@Nullable ItemStack tool) { + return null; + } + + @NotNull + @Override + public Collection getDrops(@NotNull ItemStack tool, @Nullable Entity entity) { + return null; + } + + @Override + public boolean isPassable() { + return false; + } + + @Nullable + @Override + public RayTraceResult rayTrace(@NotNull Location start, @NotNull Vector direction, double maxDistance, @NotNull FluidCollisionMode fluidCollisionMode) { + return null; + } + + @NotNull + @Override + public BoundingBox getBoundingBox() { + return null; + } + + @Override + public void setMetadata(@NotNull String metadataKey, @NotNull MetadataValue newMetadataValue) { + + } + + @NotNull + @Override + public List getMetadata(@NotNull String metadataKey) { + return null; + } + + @Override + public boolean hasMetadata(@NotNull String metadataKey) { + return false; + } + + @Override + public void removeMetadata(@NotNull String metadataKey, @NotNull Plugin owningPlugin) { + + } + } } From bb57e6d464fe9ed11c07d178779ed379f42540d3 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Wed, 14 Apr 2021 16:38:19 -0700 Subject: [PATCH 503/662] actually a radius now.. although not really --- .../java/com/gmail/nossr50/util/blockmeta/ChunkStoreTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/com/gmail/nossr50/util/blockmeta/ChunkStoreTest.java b/src/test/java/com/gmail/nossr50/util/blockmeta/ChunkStoreTest.java index 0812f9142..bafb3f01b 100644 --- a/src/test/java/com/gmail/nossr50/util/blockmeta/ChunkStoreTest.java +++ b/src/test/java/com/gmail/nossr50/util/blockmeta/ChunkStoreTest.java @@ -86,9 +86,9 @@ public class ChunkStoreTest { HashChunkManager hashChunkManager = new HashChunkManager(); int radius = 2; //Could be anything but drastically changes test time - for(int x = -radius; x < radius; x++) { + for(int x = -radius; x <= radius; x++) { for(int y = mockWorld.getMinHeight(); y < mockWorld.getMaxHeight(); y++) { - for(int z = -radius; z < radius; z++) { + for(int z = -radius; z <= radius; z++) { TestBlock testBlock = new TestBlock(x, y, z, mockWorld); hashChunkManager.setTrue(testBlock); Assert.assertTrue(hashChunkManager.isTrue(testBlock)); From 729a91443aef9de6302067edf3aa8861650fa774 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Wed, 14 Apr 2021 16:48:48 -0700 Subject: [PATCH 504/662] 2.1.189 --- Changelog.txt | 25 ++++++++++++------------- pom.xml | 2 +- 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index d8c941814..3fa51b47b 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,14 +1,18 @@ Version 2.1.189 - FlatFileDB now stores the last login of users again (was completely non functional for a while) - mcMMO will once again purge old users if the config option is on (see notes) - Newly created flat file databases (mcmmo.users file) will have a comment line at the top noting the date the database was created - Fixed a bug where FlatFileDatabase users could have their names saved as "null" (names will be fixed the next time the player logs in) 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) (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) Added - Added unit tests for FlatFileDatabaseManager (see notes) + (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) 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) @@ -17,18 +21,13 @@ Version 2.1.189 Removed UltraPermissions warning Updated pl locale (Thanks Mich3l3k) Fixed an IllegalPluginAccessException error that could happen during server shutdown - Minor performance optimizations to FlatFile database Minor performance optimizations to misc parts of the codebase - Refactored a lot of code - (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. - 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 - Ultra Permissions is SAFE to use with mcMMO + 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 diff --git a/pom.xml b/pom.xml index 38b04da11..0b72bc524 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.189-SNAPSHOT + 2.1.189 mcMMO https://github.com/mcMMO-Dev/mcMMO From c9b03836008a84e73905ec9431506f1825706626 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Wed, 14 Apr 2021 18:14:50 -0700 Subject: [PATCH 505/662] Fix null error in BitSetChunkStore --- Changelog.txt | 20 ++++++++++--------- pom.xml | 2 +- .../util/compat/CompatibilityManager.java | 15 +++++++++++++- 3 files changed, 26 insertions(+), 11 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 3fa51b47b..51aff52e3 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,4 +1,7 @@ +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) @@ -7,21 +10,20 @@ Version 2.1.189 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) - 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) - Fixed a bug that would remove components from death messages when players were killed by mobs (thanks lexikiq) - 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 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) diff --git a/pom.xml b/pom.xml index 0b72bc524..fd3627104 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.189 + 2.1.190-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO 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 6f34d3a89..1b78a55df 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/CompatibilityManager.java +++ b/src/main/java/com/gmail/nossr50/util/compat/CompatibilityManager.java @@ -77,9 +77,22 @@ public class CompatibilityManager { } private void initWorldCompatibilityLayer() { - if(minecraftGameVersion.getMinorVersion().asInt() >= 16 && minecraftGameVersion.getPatchVersion().asInt() >= 4 || minecraftGameVersion.getMajorVersion().asInt() >= 2) { + if((minecraftGameVersion.getMinorVersion().asInt() >= 16 && minecraftGameVersion.getPatchVersion().asInt() >= 4) + || minecraftGameVersion.getMajorVersion().asInt() >= 2) { if(hasNewWorldMinHeightAPI()) { worldCompatibilityLayer = new WorldCompatibilityLayer_1_16_4(); + } else { + worldCompatibilityLayer = new WorldCompatibilityLayer() { + @Override + public int getMinWorldHeight(@NotNull World world) { + return WorldCompatibilityLayer.super.getMinWorldHeight(world); + } + + @Override + public int getMaxWorldHeight(@NotNull World world) { + return WorldCompatibilityLayer.super.getMaxWorldHeight(world); + } + }; } } else { worldCompatibilityLayer = new WorldCompatibilityLayer() { From f2357a04ae4f2dbe851b8c2cf7bdedd33ecb16e3 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Wed, 14 Apr 2021 18:15:10 -0700 Subject: [PATCH 506/662] 2.1.190 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index fd3627104..bb75b4ba3 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.190-SNAPSHOT + 2.1.190 mcMMO https://github.com/mcMMO-Dev/mcMMO From b9201b89b80fe69cf3dbdf4e6ad93ed3e350ecac Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 15 Apr 2021 09:38:30 -0700 Subject: [PATCH 507/662] Fix block tracking logic --- Changelog.txt | 3 + pom.xml | 2 +- .../nossr50/listeners/BlockListener.java | 80 +++++++++++-------- .../com/gmail/nossr50/util/BlockUtils.java | 10 +++ 4 files changed, 60 insertions(+), 35 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 51aff52e3..68e662288 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,6 @@ +Version 2.1.191 + Fixed a critical bug related to our BlockTracker + Some minor optimizations to our Block events Version 2.1.190 Fixed a null error in BitSetChunkStore Version 2.1.189 diff --git a/pom.xml b/pom.xml index bb75b4ba3..31d49fbbc 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.190 + 2.1.191-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO diff --git a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java index 06c3a7c2e..658793842 100644 --- a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java @@ -123,10 +123,14 @@ public class BlockListener implements Listener { BlockFace direction = event.getDirection(); Block movedBlock; + WorldCompatibilityLayer worldCompatibilityLayer = mcMMO.getCompatibilityManager().getWorldCompatibilityLayer(); - for (Block b : event.getBlocks()) { - movedBlock = b.getRelative(direction); - mcMMO.getPlaceStore().setTrue(movedBlock); + for (Block block : event.getBlocks()) { + movedBlock = block.getRelative(direction); + + if(BlockUtils.isWithinWorldBounds(worldCompatibilityLayer, movedBlock)) { + mcMMO.getPlaceStore().setTrue(movedBlock); + } } } @@ -151,19 +155,15 @@ public class BlockListener implements Listener { WorldCompatibilityLayer worldCompatibilityLayer = mcMMO.getCompatibilityManager().getWorldCompatibilityLayer(); - World world = movedBlock.getWorld(); - //Spigot makes bad things happen in its API - if(event.getBlock().getY() < worldCompatibilityLayer.getMaxWorldHeight(world) || event.getBlock().getY() >= worldCompatibilityLayer.getMinWorldHeight(world)) { + if(BlockUtils.isWithinWorldBounds(worldCompatibilityLayer, movedBlock)) { mcMMO.getPlaceStore().setTrue(movedBlock); } for (Block block : event.getBlocks()) { - if(block.getY() < worldCompatibilityLayer.getMaxWorldHeight(world) || block.getY() >= worldCompatibilityLayer.getMinWorldHeight(world)) { + if(BlockUtils.isWithinWorldBounds(worldCompatibilityLayer, block)) { mcMMO.getPlaceStore().setTrue(block.getRelative(direction)); } - - mcMMO.getPlaceStore().setTrue(movedBlock); } } @@ -180,11 +180,16 @@ 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)) { + WorldCompatibilityLayer worldCompatibilityLayer = mcMMO.getCompatibilityManager().getWorldCompatibilityLayer(); + Block block = blockState.getBlock(); + + if(BlockUtils.isWithinWorldBounds(worldCompatibilityLayer, block)) { + mcMMO.getPlaceStore().setTrue(block); + } } } @@ -195,23 +200,19 @@ public class BlockListener implements Listener { public void onBlockFormEvent(BlockFormEvent event) { World world = event.getBlock().getWorld(); - /* WORLD BLACKLIST CHECK */ { - if(WorldBlacklist.isWorldBlacklisted(world)) - return; - } - BlockState newState = event.getNewState(); + /* WORLD BLACKLIST CHECK */ + if(WorldBlacklist.isWorldBlacklisted(world)) + return; if(ExperienceConfig.getInstance().preventStoneLavaFarming()) { + BlockState newState = event.getNewState(); WorldCompatibilityLayer worldCompatibilityLayer = mcMMO.getCompatibilityManager().getWorldCompatibilityLayer(); - if(event.getBlock().getY() > worldCompatibilityLayer.getMaxWorldHeight(world) || event.getBlock().getY() < worldCompatibilityLayer.getMinWorldHeight(world)) { - return; - } - - if(newState.getType() != Material.OBSIDIAN - && ExperienceConfig.getInstance().doesBlockGiveSkillXP(PrimarySkillType.MINING, newState.getBlockData())) { - mcMMO.getPlaceStore().setTrue(newState); + if(newState.getType() != Material.OBSIDIAN && ExperienceConfig.getInstance().doesBlockGiveSkillXP(PrimarySkillType.MINING, newState.getBlockData())) { + if(BlockUtils.isWithinWorldBounds(worldCompatibilityLayer, newState.getBlock())) { + mcMMO.getPlaceStore().setTrue(newState); + } } } } @@ -224,16 +225,23 @@ 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())) - mcMMO.getPlaceStore().setTrue(blockState); /* WORLD BLACKLIST CHECK */ - if(WorldBlacklist.isWorldBlacklisted(event.getBlock().getWorld())) { + if(WorldBlacklist.isWorldBlacklisted(block.getWorld())) { return; } + WorldCompatibilityLayer worldCompatibilityLayer = mcMMO.getCompatibilityManager().getWorldCompatibilityLayer(); + + if(BlockUtils.isWithinWorldBounds(worldCompatibilityLayer, block)) { + mcMMO.getPlaceStore().setTrue(blockState); + } + + Player player = event.getPlayer(); if (!UserManager.hasPlayerDataKey(player)) { @@ -260,18 +268,21 @@ public class BlockListener implements Listener { */ @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onBlockMultiPlace(BlockMultiPlaceEvent event) { - for (BlockState replacedBlockState : event.getReplacedBlockStates()) - { + for (BlockState replacedBlockState : event.getReplacedBlockStates()) { BlockState blockState = replacedBlockState.getBlock().getState(); + Block block = blockState.getBlock(); + + WorldCompatibilityLayer worldCompatibilityLayer = mcMMO.getCompatibilityManager().getWorldCompatibilityLayer(); /* Check if the blocks placed should be monitored so they do not give out XP in the future */ - mcMMO.getPlaceStore().setTrue(blockState); + if(BlockUtils.isWithinWorldBounds(worldCompatibilityLayer, block)) { + mcMMO.getPlaceStore().setTrue(blockState); + } } } @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onBlockGrow(BlockGrowEvent event) - { + public void onBlockGrow(BlockGrowEvent event) { Block block = event.getBlock(); World world = block.getWorld(); @@ -280,10 +291,11 @@ public class BlockListener implements Listener { 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 (block.getY() >= world.getMaxHeight()) - return; + WorldCompatibilityLayer worldCompatibilityLayer = mcMMO.getCompatibilityManager().getWorldCompatibilityLayer(); - mcMMO.getPlaceStore().setFalse(block); + if(BlockUtils.isWithinWorldBounds(worldCompatibilityLayer, block)) { + mcMMO.getPlaceStore().setFalse(block); + } } /** diff --git a/src/main/java/com/gmail/nossr50/util/BlockUtils.java b/src/main/java/com/gmail/nossr50/util/BlockUtils.java index e1944f738..b81a54631 100644 --- a/src/main/java/com/gmail/nossr50/util/BlockUtils.java +++ b/src/main/java/com/gmail/nossr50/util/BlockUtils.java @@ -7,14 +7,17 @@ import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.skills.repair.Repair; import com.gmail.nossr50.skills.salvage.Salvage; +import com.gmail.nossr50.util.compat.layers.world.WorldCompatibilityLayer; 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; @@ -285,4 +288,11 @@ public final class BlockUtils { public static boolean isPartOfTree(Block rayCast) { return hasWoodcuttingXP(rayCast.getState()) || isNonWoodPartOfTree(rayCast.getType()); } + + public static boolean isWithinWorldBounds(@NotNull WorldCompatibilityLayer worldCompatibilityLayer, @NotNull Block block) { + World world = block.getWorld(); + + return block.getY() > worldCompatibilityLayer.getMinWorldHeight(world) || block.getY() < worldCompatibilityLayer.getMaxWorldHeight(world); + } + } From 4f5f3aff8078cef9ad156065dab428278342a386 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 15 Apr 2021 10:43:48 -0700 Subject: [PATCH 508/662] Oops --- pom.xml | 8 ++++---- src/main/java/com/gmail/nossr50/util/BlockUtils.java | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index 31d49fbbc..7de8380b8 100755 --- a/pom.xml +++ b/pom.xml @@ -212,15 +212,15 @@ sk89q-repo https://maven.sk89q.com/repo/ + + sonatype-oss + https://oss.sonatype.org/content/repositories/snapshots/ + aikar https://repo.aikar.co/content/groups/aikar/ - - sonatype-oss - https://oss.sonatype.org/content/repositories/snapshots/ - diff --git a/src/main/java/com/gmail/nossr50/util/BlockUtils.java b/src/main/java/com/gmail/nossr50/util/BlockUtils.java index b81a54631..d1cb63a2a 100644 --- a/src/main/java/com/gmail/nossr50/util/BlockUtils.java +++ b/src/main/java/com/gmail/nossr50/util/BlockUtils.java @@ -292,7 +292,7 @@ public final class BlockUtils { public static boolean isWithinWorldBounds(@NotNull WorldCompatibilityLayer worldCompatibilityLayer, @NotNull Block block) { World world = block.getWorld(); - return block.getY() > worldCompatibilityLayer.getMinWorldHeight(world) || block.getY() < worldCompatibilityLayer.getMaxWorldHeight(world); + return block.getY() > worldCompatibilityLayer.getMinWorldHeight(world) && block.getY() < worldCompatibilityLayer.getMaxWorldHeight(world); } } From e42eeb1dc42041c927756c6c6cc630bff6c71bbc Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 15 Apr 2021 11:53:23 -0700 Subject: [PATCH 509/662] Fix FlatFile leaderboards not working in certain situations + added leaderboards unit test --- Changelog.txt | 4 ++- .../database/FlatFileDatabaseManager.java | 24 ++++++++++++------ .../database/flatfile/LeaderboardStatus.java | 7 ++++++ .../java/com/gmail/nossr50/util/Misc.java | 1 - .../util/blockmeta/BitSetChunkStore.java | 1 - .../database/FlatFileDatabaseManagerTest.java | 25 +++++++++++++------ .../nossr50/util/text/TextUtilsTest.java | 7 +++--- 7 files changed, 47 insertions(+), 22 deletions(-) create mode 100644 src/main/java/com/gmail/nossr50/database/flatfile/LeaderboardStatus.java diff --git a/Changelog.txt b/Changelog.txt index 68e662288..96f6fbb21 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,6 +1,8 @@ Version 2.1.191 - Fixed a critical bug related to our BlockTracker + Fixed an exploit + 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 diff --git a/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java index b47477651..dd85cccf5 100644 --- a/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java @@ -1,6 +1,7 @@ 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; @@ -89,6 +90,10 @@ public final class FlatFileDatabaseManager implements DatabaseManager { this.startingLevel = startingLevel; this.testing = testing; + if(!usersFile.exists()) { + initEmptyDB(); + } + if(!testing) { List flatFileDataFlags = checkFileHealthAndStructure(); @@ -882,10 +887,10 @@ public final class FlatFileDatabaseManager implements DatabaseManager { /** * Update the leader boards. */ - public void updateLeaderboards() { + 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; + return LeaderboardStatus.TOO_SOON_TO_UPDATE; } lastUpdate = System.currentTimeMillis(); // Log when the last update was run @@ -915,6 +920,10 @@ public final class FlatFileDatabaseManager implements DatabaseManager { String line; while ((line = in.readLine()) != null) { + + if(line.startsWith("#")) + continue; + String[] data = line.split(":"); playerName = data[USERNAME_INDEX]; int powerLevel = 0; @@ -940,8 +949,8 @@ public final class FlatFileDatabaseManager implements DatabaseManager { } catch (Exception e) { logger.severe("Exception while reading " + usersFilePath + " during user " + playerName + " (Are you sure you formatted it correctly?) " + e); - } - finally { + return LeaderboardStatus.FAILED; + } finally { if (in != null) { try { in.close(); @@ -951,6 +960,7 @@ public final class FlatFileDatabaseManager implements DatabaseManager { } } } + } SkillComparator c = new SkillComparator(); @@ -983,6 +993,8 @@ public final class FlatFileDatabaseManager implements DatabaseManager { playerStatHash.put(PrimarySkillType.TAMING, taming); playerStatHash.put(PrimarySkillType.FISHING, fishing); playerStatHash.put(PrimarySkillType.ALCHEMY, alchemy); + + return LeaderboardStatus.UPDATED; } private void initEmptyDB() { @@ -1014,10 +1026,6 @@ public final class FlatFileDatabaseManager implements DatabaseManager { logger.info("(" + usersFile.getPath() + ") Validating database file.."); FlatFileDataProcessor dataProcessor = null; - if(!usersFile.exists()) { - initEmptyDB(); - } - if (usersFile.exists()) { BufferedReader bufferedReader = null; FileWriter fileWriter = null; 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/util/Misc.java b/src/main/java/com/gmail/nossr50/util/Misc.java index bd5058856..9b74f110c 100644 --- a/src/main/java/com/gmail/nossr50/util/Misc.java +++ b/src/main/java/com/gmail/nossr50/util/Misc.java @@ -9,7 +9,6 @@ import com.gmail.nossr50.util.player.UserManager; import com.google.common.collect.ImmutableSet; import org.bukkit.Location; import org.bukkit.Material; -import org.bukkit.World; import org.bukkit.block.BlockState; import org.bukkit.entity.*; import org.bukkit.inventory.ItemStack; diff --git a/src/main/java/com/gmail/nossr50/util/blockmeta/BitSetChunkStore.java b/src/main/java/com/gmail/nossr50/util/blockmeta/BitSetChunkStore.java index ef5dc5459..d850cec06 100644 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/BitSetChunkStore.java +++ b/src/main/java/com/gmail/nossr50/util/blockmeta/BitSetChunkStore.java @@ -1,7 +1,6 @@ package com.gmail.nossr50.util.blockmeta; import com.gmail.nossr50.mcMMO; -import com.gmail.nossr50.util.Misc; import org.bukkit.Bukkit; import org.bukkit.World; import org.jetbrains.annotations.NotNull; diff --git a/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java b/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java index d9cd5051d..e00d3f3ae 100644 --- a/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java +++ b/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java @@ -1,6 +1,7 @@ package com.gmail.nossr50.database; import com.gmail.nossr50.TestUtil; +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; @@ -24,7 +25,6 @@ import java.util.logging.Logger; import static org.junit.jupiter.api.Assertions.*; -//TODO: Test update leaderboards //This class uses JUnit5/Jupiter public class FlatFileDatabaseManagerTest { @@ -65,7 +65,11 @@ public class FlatFileDatabaseManagerTest { assertNull(db); //noinspection UnstableApiUsage tempDir = Files.createTempDir(); - db = new FlatFileDatabaseManager(new File(tempDir.getPath() + File.separator + TEST_FILE_NAME), logger, PURGE_TIME, 0, true); + db = new FlatFileDatabaseManager(new File(getTemporaryUserFilePath()), logger, PURGE_TIME, 0, true); + } + + private @NotNull String getTemporaryUserFilePath() { + return tempDir.getPath() + File.separator + TEST_FILE_NAME; } @AfterEach @@ -131,6 +135,17 @@ public class FlatFileDatabaseManagerTest { "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 + public void testDefaultInit() { + db = new FlatFileDatabaseManager(getTemporaryUserFilePath(), logger, PURGE_TIME, 0); + } + + @Test + public void testUpdateLeaderboards() { + assertNotNull(db); + assertEquals(LeaderboardStatus.UPDATED, db.updateLeaderboards()); + } + @Test public void testSaveUser() { //Make a Profile to save and check to see if it worked @@ -141,8 +156,6 @@ public class FlatFileDatabaseManagerTest { //Save the zero version and see if it looks correct assertNotNull(db); - assertFalse(db.getUsersFile().exists()); - db.checkFileHealthAndStructure(); assertTrue(db.getUsersFile().exists()); //Users file should have been created from the above com.gmail.nossr50.database.FlatFileDatabaseManager.checkFileHealthAndStructure assertNotNull(db.getUsersFile()); @@ -530,9 +543,7 @@ public class FlatFileDatabaseManagerTest { public void testDataNotFound() { //Save the zero version and see if it looks correct assertNotNull(db); - assertFalse(db.getUsersFile().exists()); - db.checkFileHealthAndStructure(); - assertTrue(db.getUsersFile().exists()); //Users file should have been created from the above com.gmail.nossr50.database.FlatFileDatabaseManager.checkFileHealthAndStructure + assertTrue(db.getUsersFile().exists()); assertNotNull(db.getUsersFile()); //Check for the "unloaded" profile diff --git a/src/test/java/com/gmail/nossr50/util/text/TextUtilsTest.java b/src/test/java/com/gmail/nossr50/util/text/TextUtilsTest.java index fee41b9b3..da1e021db 100644 --- a/src/test/java/com/gmail/nossr50/util/text/TextUtilsTest.java +++ b/src/test/java/com/gmail/nossr50/util/text/TextUtilsTest.java @@ -2,8 +2,8 @@ package com.gmail.nossr50.util.text; import net.kyori.adventure.text.TextComponent; import net.kyori.adventure.text.format.NamedTextColor; -import org.junit.Assert; -import org.junit.Test; +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. @@ -26,7 +26,6 @@ public class TextUtilsTest { */ TextComponent component = TextUtils.colorizeText(inputText); - Assert.assertEquals("Looks like Adventure is not working correctly.", - NamedTextColor.DARK_RED, component.color()); + Assertions.assertEquals(NamedTextColor.DARK_RED, component.color(), "Looks like Adventure is not working correctly."); } } From 522f40f0feb8f07324588c7352909e8c4301c179 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 15 Apr 2021 11:54:05 -0700 Subject: [PATCH 510/662] 2.1.191 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 7de8380b8..930916e1b 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.191-SNAPSHOT + 2.1.191 mcMMO https://github.com/mcMMO-Dev/mcMMO From 1269652e94a614ac76fdbd18df2b39a9efbc2707 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 15 Apr 2021 11:59:27 -0700 Subject: [PATCH 511/662] Dev mode --- Changelog.txt | 2 +- pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 96f6fbb21..4ec46bbba 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,5 +1,5 @@ Version 2.1.191 - Fixed an exploit + 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 diff --git a/pom.xml b/pom.xml index 930916e1b..0b364e33f 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.191 + 2.1.192-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO From 48de5057a4bd7a3e65abc7be778c0e38bcda9279 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 15 Apr 2021 14:43:37 -0700 Subject: [PATCH 512/662] Fix another bug where usernames can be saved as null for FlatFileDB --- Changelog.txt | 16 + .../com/gmail/nossr50/api/DatabaseAPI.java | 32 +- .../com/gmail/nossr50/api/ExperienceAPI.java | 110 ++++++- .../database/ConvertDatabaseCommand.java | 2 +- .../experience/ExperienceCommand.java | 5 +- .../experience/SkillresetCommand.java | 7 +- .../nossr50/database/DatabaseManager.java | 14 +- .../database/FlatFileDatabaseManager.java | 267 ++++++++++------- .../nossr50/database/SQLDatabaseManager.java | 10 +- .../com/gmail/nossr50/database/UserQuery.java | 7 + .../gmail/nossr50/database/UserQueryFull.java | 31 ++ .../gmail/nossr50/database/UserQueryName.java | 7 + .../nossr50/database/UserQueryNameImpl.java | 20 ++ .../gmail/nossr50/database/UserQueryType.java | 7 + .../gmail/nossr50/database/UserQueryUUID.java | 11 + .../nossr50/database/UserQueryUUIDImpl.java | 23 ++ .../datatypes/player/PlayerProfile.java | 13 +- .../player/PlayerProfileLoadingTask.java | 2 +- .../database/FlatFileDatabaseManagerTest.java | 280 ++++++++++++++++-- 19 files changed, 686 insertions(+), 178 deletions(-) create mode 100644 src/main/java/com/gmail/nossr50/database/UserQuery.java create mode 100644 src/main/java/com/gmail/nossr50/database/UserQueryFull.java create mode 100644 src/main/java/com/gmail/nossr50/database/UserQueryName.java create mode 100644 src/main/java/com/gmail/nossr50/database/UserQueryNameImpl.java create mode 100644 src/main/java/com/gmail/nossr50/database/UserQueryType.java create mode 100644 src/main/java/com/gmail/nossr50/database/UserQueryUUID.java create mode 100644 src/main/java/com/gmail/nossr50/database/UserQueryUUIDImpl.java diff --git a/Changelog.txt b/Changelog.txt index 4ec46bbba..3361322de 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,19 @@ +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 + + NOTES: + I removed a lot of API that should honestly never have been added, this will break some plugins, those plugins will have to update. + 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 diff --git a/src/main/java/com/gmail/nossr50/api/DatabaseAPI.java b/src/main/java/com/gmail/nossr50/api/DatabaseAPI.java index 8f2879549..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, null); + 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 a7055bbb5..678f1346b 100644 --- a/src/main/java/com/gmail/nossr50/api/ExperienceAPI.java +++ b/src/main/java/com/gmail/nossr50/api/ExperienceAPI.java @@ -13,11 +13,11 @@ 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.Bukkit; 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; @@ -432,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. *
@@ -483,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. *
@@ -530,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. *
@@ -595,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. *
@@ -1129,25 +1207,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) throws InvalidPlayerException { - OfflinePlayer offlinePlayer = Bukkit.getServer().getOfflinePlayer(uuid); - String playerName = offlinePlayer.getName(); - PlayerProfile profile = mcMMO.getDatabaseManager().loadPlayerProfile(uuid, playerName); + private static @NotNull PlayerProfile getOfflineProfile(@NotNull UUID uuid) throws InvalidPlayerException { + PlayerProfile profile = mcMMO.getDatabaseManager().loadPlayerProfile(uuid); if (!profile.isLoaded()) { throw new InvalidPlayerException(); @@ -1156,11 +1231,18 @@ public final class ExperienceAPI { return profile; } - @Deprecated - private static PlayerProfile getOfflineProfile(String playerName) throws InvalidPlayerException { - OfflinePlayer offlinePlayer = Bukkit.getServer().getOfflinePlayer(playerName); - UUID uuid = offlinePlayer.getUniqueId(); - PlayerProfile profile = mcMMO.getDatabaseManager().loadPlayerProfile(uuid, playerName); + 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(); 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 1667e9111..8642bc922 100644 --- a/src/main/java/com/gmail/nossr50/commands/database/ConvertDatabaseCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/database/ConvertDatabaseCommand.java @@ -58,7 +58,7 @@ public class ConvertDatabaseCommand implements CommandExecutor { UserManager.clearAll(); for (Player player : mcMMO.p.getServer().getOnlinePlayers()) { - PlayerProfile profile = oldDatabase.loadPlayerProfile(player.getUniqueId(), null); + PlayerProfile profile = oldDatabase.loadPlayerProfile(player); if (profile.isLoaded()) { mcMMO.getDatabaseManager().saveUser(profile); 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 4e84f8bff..5f310828e 100644 --- a/src/main/java/com/gmail/nossr50/commands/experience/ExperienceCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/experience/ExperienceCommand.java @@ -97,12 +97,9 @@ 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 offlinePlayer = mcMMO.p.getServer().getOfflinePlayer(playerName); PlayerProfile profile; - uuid = offlinePlayer.getUniqueId(); - profile = mcMMO.getDatabaseManager().loadPlayerProfile(uuid, null); + profile = mcMMO.getDatabaseManager().loadPlayerProfile(playerName); //Check loading by UUID if (CommandUtils.unloadedProfile(sender, profile)) { 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 4b558d422..d4353224e 100644 --- a/src/main/java/com/gmail/nossr50/commands/experience/SkillresetCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/experience/SkillresetCommand.java @@ -79,11 +79,8 @@ 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); - uuid = player.getUniqueId(); - - PlayerProfile profile = mcMMO.getDatabaseManager().loadPlayerProfile(uuid, playerName); + OfflinePlayer offlinePlayer = mcMMO.p.getServer().getOfflinePlayer(playerName); + PlayerProfile profile = mcMMO.getDatabaseManager().loadPlayerProfile(offlinePlayer); //Check loading by UUID if (CommandUtils.unloadedProfile(sender, profile)) { diff --git a/src/main/java/com/gmail/nossr50/database/DatabaseManager.java b/src/main/java/com/gmail/nossr50/database/DatabaseManager.java index 3f9ac7a77..c377bbbfe 100644 --- a/src/main/java/com/gmail/nossr50/database/DatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/DatabaseManager.java @@ -1,5 +1,6 @@ package com.gmail.nossr50.database; +import com.gmail.nossr50.api.exceptions.InvalidPlayerException; import com.gmail.nossr50.api.exceptions.InvalidSkillException; import com.gmail.nossr50.datatypes.database.DatabaseType; import com.gmail.nossr50.datatypes.database.PlayerStat; @@ -93,18 +94,7 @@ public interface DatabaseManager { */ @NotNull PlayerProfile loadPlayerProfile(@NotNull String playerName); - default @NotNull PlayerProfile loadPlayerProfile(@NotNull OfflinePlayer offlinePlayer) { - return loadPlayerProfile(offlinePlayer.getUniqueId(), offlinePlayer.getName()); - } - - /** - * 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 - * @deprecated Use {@link DatabaseManager#loadPlayerProfile(org.bukkit.OfflinePlayer)} or {@link DatabaseManager#loadPlayerProfile(java.util.UUID)} if possible - */ - @Deprecated - @NotNull PlayerProfile loadPlayerProfile(@NotNull UUID uuid, @Nullable String playerName); + @NotNull PlayerProfile loadPlayerProfile(@NotNull OfflinePlayer offlinePlayer); @NotNull PlayerProfile loadPlayerProfile(@NotNull UUID uuid); diff --git a/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java index dd85cccf5..f301777b1 100644 --- a/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java @@ -17,6 +17,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.*; +import java.security.InvalidParameterException; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.*; @@ -341,14 +342,8 @@ public final class FlatFileDatabaseManager implements DatabaseManager { String line; boolean wroteUser = false; - if(testing) { - System.out.println("-- saveUser bufferedreader feed --"); - } // While not at the end of the file while ((line = in.readLine()) != null) { - if(testing) { - System.out.println(line); - } if(line.startsWith("#")) { writer.append(line).append("\r\n"); continue; @@ -384,7 +379,7 @@ public final class FlatFileDatabaseManager implements DatabaseManager { writer.append(line).append("\r\n"); //Not the user so write it to file and move on } else { //User found - writeUserToLine(profile, playerName, uuid, writer); + writeUserToLine(profile, writer); wroteUser = true; } } @@ -393,12 +388,7 @@ public final class FlatFileDatabaseManager implements DatabaseManager { * If we couldn't find the user in the DB we need to add him */ if(!wroteUser) { - writeUserToLine(profile, playerName, uuid, writer); - } - - if(testing) { - System.out.println("-- saveUser (FileWriter contents before save) --"); - System.out.println(writer.toString()); + writeUserToLine(profile, writer); } // Write the new file @@ -431,8 +421,8 @@ public final class FlatFileDatabaseManager implements DatabaseManager { } } - public void writeUserToLine(@NotNull PlayerProfile profile, @NotNull String playerName, @Nullable UUID uuid, @NotNull Appendable appendable) throws IOException { - appendable.append(playerName).append(":"); + 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(":"); @@ -473,7 +463,7 @@ public final class FlatFileDatabaseManager implements DatabaseManager { 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(uuid != null ? uuid.toString() : "NULL").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 @@ -527,7 +517,7 @@ public final class FlatFileDatabaseManager implements DatabaseManager { } try (FileWriter fileWriter = new FileWriter(usersFile)) { - writeUserToLine(playerProfile, playerName, uuid, stringBuilder); + writeUserToLine(playerProfile, stringBuilder); fileWriter.write(stringBuilder.toString()); } catch (Exception e) { e.printStackTrace(); @@ -541,103 +531,53 @@ public final class FlatFileDatabaseManager implements DatabaseManager { } public @NotNull PlayerProfile loadPlayerProfile(@NotNull OfflinePlayer offlinePlayer) { - return loadPlayerByUUID(offlinePlayer.getUniqueId(), offlinePlayer.getName(), offlinePlayer.isOnline()); + return processUserQuery(getUserQuery(offlinePlayer.getUniqueId(), offlinePlayer.getName())); } public @NotNull PlayerProfile loadPlayerProfile(@NotNull String playerName) { - return loadPlayerByName(playerName); - } - - public @NotNull PlayerProfile loadPlayerProfile(@NotNull UUID uuid, @Nullable String playerName) { - return loadPlayerByUUID(uuid, playerName, false); + return processUserQuery(getUserQuery(null, playerName)); } public @NotNull PlayerProfile loadPlayerProfile(@NotNull UUID uuid) { - return loadPlayerByUUID(uuid, null, false); + 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 + * 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 uuid target uuid - * @param playerName target player name - * @param replaceName name to replace if the found name differs + * @param userQuery the query * @return a profile with the targets data or an unloaded profile if no data was found - * @deprecated only use this if you know what you are doing, replacing the name can cause havoc */ - @Deprecated - public @NotNull PlayerProfile loadPlayerByUUID(@NotNull UUID uuid, @Nullable String playerName, boolean replaceName) { - BufferedReader in = null; - - 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[] rawSplitData = line.split(":"); - - /* Don't read corrupt data */ - if(rawSplitData.length < (UUID_INDEX + 1)) { - continue; - } - - /* Does this entry have a UUID? */ - if (rawSplitData[UUID_INDEX].equalsIgnoreCase("NULL") - || rawSplitData[UUID_INDEX].isEmpty() - || rawSplitData[UUID_INDEX].equalsIgnoreCase("")) { - continue; //No UUID entry found for this data in the DB, go to next entry - } - - // Compare provided UUID to DB - if (!rawSplitData[UUID_INDEX].equalsIgnoreCase(uuid.toString())) { - continue; //Doesn't match, go to the next entry - } - - /* - * UUID Matched! - * Making it this far means the current data line is considered a match - */ - - - /* Check for nickname changes and update since we are here anyways */ - if(playerName != null) { - if(replaceName) { - logger.info("A users name is being updated, this can happen from either a call to our API or they simply changed their name"); - if (!rawSplitData[USERNAME_INDEX].equalsIgnoreCase(playerName)) { - //logger.info("Name updated for player: " + rawSplitData[USERNAME_INDEX] + " => " + playerName); - rawSplitData[USERNAME_INDEX] = playerName; - } - } - } - - 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 - } - } - } + 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!"); } - - /* - * No match was found in the file - */ - - return grabUnloadedProfile(uuid, playerName); //Create an empty new profile and return } - private @NotNull PlayerProfile loadPlayerByName(@NotNull String playerName) { + private @NotNull PlayerProfile queryByName(@NotNull UserQueryName userQuery) { + String playerName = userQuery.getName(); BufferedReader in = null; synchronized (fileWritingLock) { @@ -646,19 +586,23 @@ public final class FlatFileDatabaseManager implements DatabaseManager { 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); @@ -679,10 +623,135 @@ public final class FlatFileDatabaseManager implements DatabaseManager { } } + //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! diff --git a/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java index a937efb0b..566a2e4f5 100644 --- a/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java @@ -15,6 +15,7 @@ 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; @@ -515,7 +516,7 @@ public final class SQLDatabaseManager implements DatabaseManager { if (id == -1) { return new PlayerProfile(player.getName(), player.getUniqueId(), false, mcMMO.p.getAdvancedConfig().getStartingLevel()); } else { - return loadPlayerProfile(player.getUniqueId(), player.getName()); + return loadPlayerProfile(player); } } catch (SQLException e) { e.printStackTrace(); @@ -571,7 +572,12 @@ public final class SQLDatabaseManager implements DatabaseManager { } } - public @NotNull PlayerProfile loadPlayerProfile(@NotNull UUID uuid, @Nullable String playerName) { + @Override + public @NotNull PlayerProfile loadPlayerProfile(@NotNull OfflinePlayer offlinePlayer) { + return loadPlayerFromDB(offlinePlayer.getUniqueId(), offlinePlayer.getName()); + } + + public @NotNull PlayerProfile loadPlayerProfile(@NotNull UUID uuid, @Nullable String playerName) { return loadPlayerFromDB(uuid, playerName); } 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/datatypes/player/PlayerProfile.java b/src/main/java/com/gmail/nossr50/datatypes/player/PlayerProfile.java index 81d2d8417..ff9ebbb70 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/player/PlayerProfile.java +++ b/src/main/java/com/gmail/nossr50/datatypes/player/PlayerProfile.java @@ -22,7 +22,7 @@ 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; @@ -49,7 +49,7 @@ public class PlayerProfile { } //TODO: Add deprecated constructor w/o startinglevel - public PlayerProfile(String playerName, UUID uuid, int startingLevel) { + public PlayerProfile(String playerName, @Nullable UUID uuid, int startingLevel) { this.uuid = uuid; this.playerName = playerName; @@ -100,10 +100,6 @@ public class PlayerProfile { 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); } @@ -126,8 +122,7 @@ public class PlayerProfile { 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."); } @@ -138,7 +133,7 @@ public class PlayerProfile { //Back out of async saving if we detect a server shutdown, this is not always going to be caught if(mcMMO.isServerShutdownExecuted() || useSync) - scheduleSyncSave(); //Execute sync saves immediately + new PlayerProfileSaveTask(this, true).runTask(mcMMO.p); else scheduleAsyncSave(); 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 95c0ddc71..5a82b43da 100644 --- a/src/main/java/com/gmail/nossr50/runnables/player/PlayerProfileLoadingTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/player/PlayerProfileLoadingTask.java @@ -41,7 +41,7 @@ public class PlayerProfileLoadingTask extends BukkitRunnable { return; } - PlayerProfile profile = mcMMO.getDatabaseManager().loadPlayerProfile(player.getUniqueId(), player.getName()); + PlayerProfile profile = mcMMO.getDatabaseManager().loadPlayerProfile(player); if(!profile.isLoaded()) { mcMMO.p.getLogger().info("Creating new data for player: "+player.getName()); diff --git a/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java b/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java index e00d3f3ae..e6001626a 100644 --- a/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java +++ b/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java @@ -9,18 +9,25 @@ 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.Location; +import org.bukkit.Material; +import org.bukkit.OfflinePlayer; +import org.bukkit.Statistic; +import org.bukkit.entity.EntityType; +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.BeforeEach; -import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.*; 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.*; @@ -60,6 +67,11 @@ public class FlatFileDatabaseManagerTest { int expectedScoreboardTips = 1111; Long expectedLastLogin = 2020L; + @BeforeAll + static void initBeforeAll() { + logger.setFilter(new DebugFilter()); + } + @BeforeEach public void init() { assertNull(db); @@ -175,7 +187,7 @@ public class FlatFileDatabaseManagerTest { //This makes sure our private method is working before the tests run afterwards ArrayList dataFromFile = getSplitDataFromFile(dbFile); - System.out.println("File Path: "+ dbFile.getAbsolutePath()); + 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); @@ -199,7 +211,7 @@ public class FlatFileDatabaseManagerTest { //This makes sure our private method is working before the tests run afterwards ArrayList dataFromFile = getSplitDataFromFile(healthyDB); - System.out.println("File Path: "+healthyDB.getAbsolutePath()); + 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); @@ -270,7 +282,7 @@ public class FlatFileDatabaseManagerTest { assertEquals(playerName, playerProfile.getPlayerName()); assertEquals(uuid, playerProfile.getUniqueId()); - PlayerProfile retrievedFromDisk = db.loadPlayerProfile(uuid, playerName); + PlayerProfile retrievedFromDisk = db.loadPlayerProfile(uuid); assertTrue(retrievedFromDisk.isLoaded()); assertEquals(playerName, retrievedFromDisk.getPlayerName()); assertEquals(uuid, retrievedFromDisk.getUniqueId()); @@ -320,7 +332,7 @@ public class FlatFileDatabaseManagerTest { //This makes sure our private method is working before the tests run afterwards ArrayList dataFromFile = getSplitDataFromFile(dbFile); - System.out.println("File Path: " + dbFile.getAbsolutePath()); + 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); @@ -335,16 +347,50 @@ public class FlatFileDatabaseManagerTest { String playerName = "nossr50"; UUID uuid = UUID.fromString("588fe472-1c82-4c4e-9aa1-7eefccb277e3"); - PlayerProfile profile1 = db.loadPlayerProfile(uuid, null); - PlayerProfile profile2 = db.loadPlayerProfile(uuid, playerName); - PlayerProfile profile3 = db.loadPlayerProfile(uuid, "incorrectName"); - PlayerProfile profile4 = db.loadPlayerProfile(new UUID(0, 1), "shouldBeUnloaded"); - assertFalse(profile4.isLoaded()); - - //Three possible ways to load the thing + PlayerProfile profile1 = db.loadPlayerProfile(uuid); testHealthyDataProfileValues(playerName, uuid, profile1); - testHealthyDataProfileValues(playerName, uuid, profile2); - testHealthyDataProfileValues(playerName, uuid, profile3); + + + assertFalse(db.loadPlayerProfile(new UUID(0, 1)).isLoaded()); //This profile should not exist and therefor will return unloaded + } + + @Test + public 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"); + + TestOfflinePlayer player = new TestOfflinePlayer(playerName, uuid); + PlayerProfile profile1 = db.loadPlayerProfile(player); + testHealthyDataProfileValues(playerName, uuid, profile1); + + String updatedName = "updatedName"; + TestOfflinePlayer updatedNamePlayer = new TestOfflinePlayer(updatedName, uuid); + PlayerProfile updatedNameProfile = db.loadPlayerProfile(updatedNamePlayer); + testHealthyDataProfileValues(updatedName, uuid, updatedNameProfile); + + TestOfflinePlayer shouldNotExist = new TestOfflinePlayer("doesntexist", new UUID(0, 1)); + PlayerProfile profile3 = db.loadPlayerProfile(shouldNotExist); + assertFalse(profile3.isLoaded()); } private File prepareDatabaseTestResource(@NotNull String dbFileName) { @@ -393,11 +439,11 @@ public class FlatFileDatabaseManagerTest { if(SkillTools.isChildSkill(primarySkillType)) continue; -// System.out.println("Checking expected values for: "+primarySkillType); -// System.out.println("Profile Level Value: "+profile.getSkillLevel(primarySkillType)); -// System.out.println("Expected Lvl Value: "+getExpectedLevelHealthyDBEntryOne(primarySkillType)); -// System.out.println("Profile Exp Value: "+profile.getSkillXpLevelRaw(primarySkillType)); -// System.out.println("Expected Exp Value: "+getExpectedExperienceHealthyDBEntryOne(primarySkillType)); +// 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); @@ -640,7 +686,7 @@ public class FlatFileDatabaseManagerTest { //This makes sure our private method is working before the tests run afterwards ArrayList dataFromFile = getSplitDataFromFile(copyOfFile); - System.out.println("File Path: "+copyOfFile.getAbsolutePath()); + 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)); @@ -688,7 +734,7 @@ public class FlatFileDatabaseManagerTest { out.write(writer.toString()); } catch (FileNotFoundException e) { e.printStackTrace(); - System.out.println("File not found"); + logger.info("File not found"); } catch (IOException e) { e.printStackTrace(); } finally { @@ -703,12 +749,12 @@ public class FlatFileDatabaseManagerTest { } try { - System.out.println("Added the following lines to the FlatFileDatabase for the purposes of the test..."); + 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) { - System.out.println(line); + logger.info(line); } } catch (IOException e) { e.printStackTrace(); @@ -731,4 +777,188 @@ public class FlatFileDatabaseManagerTest { assertNotNull(dataFlags); assertTrue(dataFlags.contains(flag)); } + + private class TestOfflinePlayer implements OfflinePlayer { + + private final @NotNull String name; + private final @NotNull UUID uuid; + + private TestOfflinePlayer(@NotNull String name, @NotNull UUID uuid) { + this.name = name; + this.uuid = uuid; + } + + @Override + public boolean isOnline() { + return false; + } + + @Nullable + @Override + public String getName() { + return name; + } + + @NotNull + @Override + public UUID getUniqueId() { + return uuid; + } + + @Override + public boolean isBanned() { + return false; + } + + @Override + public boolean isWhitelisted() { + return false; + } + + @Override + public void setWhitelisted(boolean value) { + + } + + @Nullable + @Override + public Player getPlayer() { + return null; + } + + @Override + public long getFirstPlayed() { + return 0; + } + + @Override + public long getLastPlayed() { + return 0; + } + + @Override + public boolean hasPlayedBefore() { + return false; + } + + @Nullable + @Override + public Location getBedSpawnLocation() { + return null; + } + + @Override + public void incrementStatistic(@NotNull Statistic statistic) throws IllegalArgumentException { + + } + + @Override + public void decrementStatistic(@NotNull Statistic statistic) throws IllegalArgumentException { + + } + + @Override + public void incrementStatistic(@NotNull Statistic statistic, int amount) throws IllegalArgumentException { + + } + + @Override + public void decrementStatistic(@NotNull Statistic statistic, int amount) throws IllegalArgumentException { + + } + + @Override + public void setStatistic(@NotNull Statistic statistic, int newValue) throws IllegalArgumentException { + + } + + @Override + public int getStatistic(@NotNull Statistic statistic) throws IllegalArgumentException { + return 0; + } + + @Override + public void incrementStatistic(@NotNull Statistic statistic, @NotNull Material material) throws IllegalArgumentException { + + } + + @Override + public void decrementStatistic(@NotNull Statistic statistic, @NotNull Material material) throws IllegalArgumentException { + + } + + @Override + public int getStatistic(@NotNull Statistic statistic, @NotNull Material material) throws IllegalArgumentException { + return 0; + } + + @Override + public void incrementStatistic(@NotNull Statistic statistic, @NotNull Material material, int amount) throws IllegalArgumentException { + + } + + @Override + public void decrementStatistic(@NotNull Statistic statistic, @NotNull Material material, int amount) throws IllegalArgumentException { + + } + + @Override + public void setStatistic(@NotNull Statistic statistic, @NotNull Material material, int newValue) throws IllegalArgumentException { + + } + + @Override + public void incrementStatistic(@NotNull Statistic statistic, @NotNull EntityType entityType) throws IllegalArgumentException { + + } + + @Override + public void decrementStatistic(@NotNull Statistic statistic, @NotNull EntityType entityType) throws IllegalArgumentException { + + } + + @Override + public int getStatistic(@NotNull Statistic statistic, @NotNull EntityType entityType) throws IllegalArgumentException { + return 0; + } + + @Override + public void incrementStatistic(@NotNull Statistic statistic, @NotNull EntityType entityType, int amount) throws IllegalArgumentException { + + } + + @Override + public void decrementStatistic(@NotNull Statistic statistic, @NotNull EntityType entityType, int amount) { + + } + + @Override + public void setStatistic(@NotNull Statistic statistic, @NotNull EntityType entityType, int newValue) { + + } + + @NotNull + @Override + public Map serialize() { + return null; + } + + @Override + public boolean isOp() { + return false; + } + + @Override + public void setOp(boolean value) { + + } + } + + private static class DebugFilter implements Filter { + + @Override + public boolean isLoggable(LogRecord record) { + return false; + } + } } \ No newline at end of file From 8fdc611fb0e083963c02dbf9e15b4e7b1fc4b1a6 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 15 Apr 2021 14:48:24 -0700 Subject: [PATCH 513/662] Add some code to a test to check for user names being updated --- .../database/FlatFileDatabaseManagerTest.java | 38 +++++++------------ 1 file changed, 14 insertions(+), 24 deletions(-) diff --git a/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java b/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java index e6001626a..bfc3c01f5 100644 --- a/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java +++ b/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java @@ -175,10 +175,23 @@ public class FlatFileDatabaseManagerTest { assertTrue(db.saveUser(testProfile)); //True means we saved the user //Check for the empty profile - PlayerProfile retrievedFromData = db.loadPlayerProfile(playerName); + 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 @@ -562,29 +575,6 @@ public class FlatFileDatabaseManagerTest { assertNotEquals(splitDataLines.get(1)[0], splitDataLines.get(0)[0]); //Name comparison } - @Test - public void testUpdateName() { - //TODO: The code in this test didn't actually trigger the save, so I'll have to do something else to test saving -// UUID uuid = UUID.fromString(HEALTHY_DB_LINE_ONE_UUID_STR); //Entrant "nossr50" -// String playerName = "the_new_name_man"; -// -// File file = prepareDatabaseTestResource(DB_HEALTHY); //Existing DB -// db = new FlatFileDatabaseManager(file, logger, PURGE_TIME, 0, true); -// db.checkFileHealthAndStructure(); -// ArrayList splitDataLines = getSplitDataFromFile(db.getUsersFile()); -// String oldName = "nossr50"; -// assertEquals(oldName, splitDataLines.get(0)[0]); //Name comparison -// assertEquals(uuid.toString(), splitDataLines.get(0)[FlatFileDatabaseManager.UUID_INDEX]); //UUID Comparison -// -// //Now we load the player and their name should get replaced -// PlayerProfile profile = db.loadPlayerByUUID(uuid, playerName, true); -// assertEquals(playerName, profile.getPlayerName()); -// -// splitDataLines = getSplitDataFromFile(db.getUsersFile()); //Load the file again -// assertNotEquals(oldName, splitDataLines.get(0)[0]); //Name comparison -// assertEquals(playerName, splitDataLines.get(0)[0]); //Name comparison - } - @Test public void testDataNotFound() { //Save the zero version and see if it looks correct From 8027b4741e85af4ebbddeac2981461336399a6cf Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 15 Apr 2021 14:48:54 -0700 Subject: [PATCH 514/662] 2.1.192 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 0b364e33f..320b75d5d 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.192-SNAPSHOT + 2.1.192 mcMMO https://github.com/mcMMO-Dev/mcMMO From 04459f1ea712c8ae4ca85516bcb47ca40c9fa60b Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 16 Apr 2021 09:55:44 -0700 Subject: [PATCH 515/662] Fix leaderboards & fix override locale bug Fixes #4493 Fixes #4492 --- Changelog.txt | 7 ++- pom.xml | 2 +- .../database/FlatFileDatabaseManager.java | 6 +- src/main/java/com/gmail/nossr50/mcMMO.java | 2 + .../database/FlatFileDatabaseManagerTest.java | 62 +++++++++++++++++++ 5 files changed, 73 insertions(+), 6 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 3361322de..179f32012 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,7 @@ +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 were working 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) @@ -11,9 +15,6 @@ Version 2.1.192 (API) Added com.gmail.nossr50.api.DatabaseAPI.doesPlayerExistInDB(java.lang.String) (Unit Tests) Added some more unit tests to FlatFileDB - NOTES: - I removed a lot of API that should honestly never have been added, this will break some plugins, those plugins will have to update. - 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 diff --git a/pom.xml b/pom.xml index 320b75d5d..3a19d20e1 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.192 + 2.1.193-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO diff --git a/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java index f301777b1..32f327614 100644 --- a/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java @@ -10,6 +10,7 @@ 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.blockmeta.HashChunkManager; import com.gmail.nossr50.util.skills.SkillTools; import org.bukkit.OfflinePlayer; import org.bukkit.entity.Player; @@ -484,15 +485,16 @@ public final class FlatFileDatabaseManager implements DatabaseManager { return statsList.subList(Math.min(fromIndex, statsList.size()), Math.min(fromIndex + statsPerPage, statsList.size())); } - public Map readRank(String playerName) { + public @NotNull HashMap readRank(String playerName) { updateLeaderboards(); - Map skills = new EnumMap(PrimarySkillType.class); + 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; diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index 5e08bc34e..a0b7ebf43 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -18,6 +18,7 @@ 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.locale.LocaleLoader; import com.gmail.nossr50.party.PartyManager; import com.gmail.nossr50.runnables.SaveTimerTask; import com.gmail.nossr50.runnables.backups.CleanBackupsTask; @@ -337,6 +338,7 @@ public class mcMMO extends JavaPlugin { transientEntityTracker = new TransientEntityTracker(); setServerShutdown(false); //Reset flag, used to make decisions about async saves + LocaleLoader.reloadLocale(); //Apply override locale } public static PlayerLevelUtils getPlayerLevelUtils() { diff --git a/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java b/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java index bfc3c01f5..feb796e9f 100644 --- a/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java +++ b/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java @@ -644,6 +644,36 @@ public class FlatFileDatabaseManagerTest { assertEquals(db.getDatabaseType(), DatabaseType.FLATFILE); } + @Test + public 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 public void testLoadFromFile() { ClassLoader classLoader = getClass().getClassLoader(); @@ -708,6 +738,38 @@ public class FlatFileDatabaseManagerTest { 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; From 739342160737dfafc61a5c23fd2e08fd2592f484 Mon Sep 17 00:00:00 2001 From: Warrior <50800980+Warriorrrr@users.noreply.github.com> Date: Fri, 16 Apr 2021 19:03:57 +0200 Subject: [PATCH 516/662] Some patches (#4494) Fixed blocks being dropped from blast mining even if yield was set to 0. Tree feller not working entirely if one fake block break event is cancelled. (Fixes #4189) Fixes no woodcutting xp being rewarded if a tree is too big while using tree feller. --- .../com/gmail/nossr50/datatypes/player/McMMOPlayer.java | 4 ++++ .../com/gmail/nossr50/skills/mining/MiningManager.java | 4 +++- .../nossr50/skills/woodcutting/WoodcuttingManager.java | 7 ++++++- 3 files changed, 13 insertions(+), 2 deletions(-) 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 e6c3a22d9..c68521e10 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java +++ b/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java @@ -941,6 +941,10 @@ public class McMMOPlayer implements Identified { //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(superAbilityType, System.currentTimeMillis() + (ticks * Misc.TIME_CONVERSION_FACTOR)); setAbilityMode(superAbilityType, true); 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 9cad29d7b..4ab9f6a17 100644 --- a/src/main/java/com/gmail/nossr50/skills/mining/MiningManager.java +++ b/src/main/java/com/gmail/nossr50/skills/mining/MiningManager.java @@ -157,8 +157,10 @@ public class MiningManager extends SkillManager { //TODO: Rewrite this garbage //TODO: Rewrite this garbage public void blastMiningDropProcessing(float yield, EntityExplodeEvent event) { - //Strip out only stuff that gives mining XP + if (yield == 0) + return; + //Strip out only stuff that gives mining XP List ores = new ArrayList<>(); List notOres = new ArrayList<>(); 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 49fa5bd20..3fd8f2ab9 100644 --- a/src/main/java/com/gmail/nossr50/skills/woodcutting/WoodcuttingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/woodcutting/WoodcuttingManager.java @@ -107,6 +107,11 @@ 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; } @@ -282,7 +287,7 @@ public class WoodcuttingManager extends SkillManager { Block block = blockState.getBlock(); if (!EventUtils.simulateBlockBreak(block, player, true)) { - break; // TODO: Shouldn't we use continue instead? + continue; } /* From 76ebd85afaac46d511107bab134e1dbef558964b Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 16 Apr 2021 10:05:21 -0700 Subject: [PATCH 517/662] Update changelog --- Changelog.txt | 4 ++++ src/main/java/com/gmail/nossr50/util/skills/SkillUtils.java | 3 +-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 179f32012..c44ad03f2 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -2,6 +2,10 @@ 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 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) + 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) 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 938ca2343..cdff05e8f 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/SkillUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/SkillUtils.java @@ -158,8 +158,7 @@ public final class SkillUtils { //1.13.2+ will have persistent metadata for this item AbstractPersistentDataLayer compatLayer = mcMMO.getCompatibilityManager().getPersistentDataLayer(); compatLayer.setSuperAbilityBoostedItem(heldItem, originalDigSpeed); - } - else { + } else { int duration = 0; int amplifier = 0; From fee2b93b4bb1fbb946ad5687576d31e2cccc1136 Mon Sep 17 00:00:00 2001 From: Mich3l3k <47540709+Mich3l3k@users.noreply.github.com> Date: Fri, 16 Apr 2021 19:06:30 +0200 Subject: [PATCH 518/662] Update locale_pl.properties (#4486) * Update locale_pl.properties Lots of minor bugs fixed and the woodcut has a better translated name (as well as the ability to woodcut etc.) And all guides have been translated :D * Update locale_pl.properties Guides.Salvage.* translated Fixed few mistakes And added support to the latest version of plugin (like swords update) --- .../resources/locale/locale_pl.properties | 190 +++++++++--------- 1 file changed, 96 insertions(+), 94 deletions(-) diff --git a/src/main/resources/locale/locale_pl.properties b/src/main/resources/locale/locale_pl.properties index 4cbc5109c..96bc89e2e 100644 --- a/src/main/resources/locale/locale_pl.properties +++ b/src/main/resources/locale/locale_pl.properties @@ -21,7 +21,7 @@ JSON.Alchemy=Alchemia JSON.Archery=\u0141ucznictwo JSON.Axes=Siekiery JSON.Excavation=Wykopalisko -JSON.Fishing=Rybarz +JSON.Fishing=Rybak JSON.Herbalism=Zielarstwo JSON.Mining=G\u00f3rnictwo JSON.Repair=Naprawiacz @@ -29,7 +29,7 @@ JSON.Salvage=Odzyskiwacz JSON.Swords=Miecze JSON.Taming=Tresowanie JSON.Unarmed=Niezr\u0119czno\u015b\u0107 -JSON.Woodcutting=\u015acinacz Drzew +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! @@ -88,7 +88,7 @@ Overhaul.Name.Alchemy=Alchemia Overhaul.Name.Archery=\u0141ucznictwo Overhaul.Name.Axes=Siekiery Overhaul.Name.Excavation=Wykopalisko -Overhaul.Name.Fishing=Rybarz +Overhaul.Name.Fishing=Rybak Overhaul.Name.Herbalism=Zielarstwo Overhaul.Name.Mining=G\u00f3rnictwo Overhaul.Name.Repair=Naprawiacz @@ -97,7 +97,7 @@ Overhaul.Name.Smelting=Przepalanie Overhaul.Name.Swords=Miecze Overhaul.Name.Taming=Tresowanie Overhaul.Name.Unarmed=Niezr\u0119czno\u015b\u0107 -Overhaul.Name.Woodcutting=\u015acinacz Drzew +Overhaul.Name.Woodcutting=Drwal # /mcMMO Command Style Stuff Commands.mcc.Header=&c---[]&amcMMO Komendy&c[]--- Commands.Other=&c---[]&aSPECJALNE KOMENDY&c[]--- @@ -112,7 +112,7 @@ XPBar.Alchemy=Alchemia Lv.&6{0} XPBar.Archery=\u0141ucznictwo Lv.&6{0} XPBar.Axes=Siekiery Lv.&6{0} XPBar.Excavation=Wykopalisko Lv.&6{0} -XPBar.Fishing=Rybarz Lv.&6{0} +XPBar.Fishing=Rybak Lv.&6{0} XPBar.Herbalism=Zielarstwo Lv.&6{0} XPBar.Mining=G\u00f3rnictwo Lv.&6{0} XPBar.Repair=Naprawiacz Lv.&6{0} @@ -121,7 +121,7 @@ XPBar.Smelting=Przepalanie Lv.&6{0} XPBar.Swords=Miecze Lv.&6{0} XPBar.Taming=Tresowanie Lv.&6{0} XPBar.Unarmed=Niezr\u0119czno\u015b\u0107 Lv.&6{0} -XPBar.Woodcutting=\u015acinacz Drzew 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 @@ -132,7 +132,7 @@ XPBar.Complex.Template={0} &3 {4}&f% &3(&f{1}&3/&f{2}&3) Acrobatics.Ability.Proc=&a**\u0141askawe L\u0105dowanie** Acrobatics.Combat.Proc=&a**Unik** Acrobatics.SubSkill.Roll.Stats=&6Szansa na &e{0}%&6 Szansa na \u0142\u0105ske&e {1}% -Acrobatics.SubSkill.Roll.Stat=Szansa na +Acrobatics.SubSkill.Roll.Stat=Szansa na Przewr\u00f3t Acrobatics.SubSkill.Roll.Stat.Extra=Szansa na \u0141agodny Przewr\u00f3t Acrobatics.SubSkill.Roll.Name=Przewr\u00f3t Acrobatics.SubSkill.Roll.Description=Wyl\u0105duj strategicznie, aby unikn\u0105\u0107 uszkodze\u0144. @@ -143,7 +143,7 @@ Acrobatics.SubSkill.GracefulRoll.Name=\u0141agodny przewr\u00f3t Acrobatics.SubSkill.GracefulRoll.Description=Podwaja efekt normalnego przewrotu. Acrobatics.SubSkill.Dodge.Name=Unik Acrobatics.SubSkill.Dodge.Description=Redukuje obra\u017cenia od ataku o po\u0142ow\u0119 -Acrobatics.SubSkill.Dodge.Stat=Szansa na unik +Acrobatics.SubSkill.Dodge.Stat=Szansa na Unik Acrobatics.Listener=Akrobatyka: Acrobatics.Roll.Text=&o**Przewr\u00f3t** Acrobatics.SkillName=AKROBATYKA @@ -267,7 +267,7 @@ Fishing.SkillName=W\u0118DKARSTWO #HERBALISM Herbalism.Ability.GTe.NeedMore=Potrzebujesz wi\u0119cej nasion, aby rozprzestrzeni\u0107 Zielona Tera. Herbalism.Ability.GTh.Fail=**ZIELONA TERA ZAWODZI** -Herbalism.Ability.GTh=&a**GREEN THUMB** +Herbalism.Ability.GTh=&a**ZIELONY L\u0104D** Herbalism.Ability.Lower=&7Opuszczasz swoj\u0105 motyk\u0119. Herbalism.Ability.Ready=&6Przygotowujesz&3 swoj\u0105 motyk\u0119. Herbalism.Ability.ShroomThumb.Fail=**HALUCYNKI ZAWODZ\u0104** @@ -304,22 +304,22 @@ Mining.Ability.Locked.0=ZABLOKOWANE DO {0}+ UMIEJ\u0118TNO\u015a\u0106 (PODMUCH Mining.Ability.Locked.1=ZABLOKOWANE DO {0}+ UMIEJ\u0118TNO\u015a\u0106 (WI\u0118KSZE BOMBY) Mining.Ability.Locked.2=ZABLOKOWANE DO {0}+ UMIEJ\u0118TNO\u015a\u0106 (EKSPERTYZY ROZBI\u00d3RKI) Mining.Ability.Lower=&7Opuszczasz sw\u00f3j kilof. -Mining.Ability.Ready=&3You &6ready&3 Tw\u00f3j kilof. +Mining.Ability.Ready=&6Przygotowujesz&3 sw\u00f3j kilof. Mining.SubSkill.SuperBreaker.Name=Super Niszczyciel Mining.SubSkill.SuperBreaker.Description=Pr\u0119dko\u015b\u0107+, Szansa na potr\u00f3jny \u0142up Mining.SubSkill.SuperBreaker.Stat=Trwanie: Super Niszczyciel Mining.SubSkill.DoubleDrops.Name=Podw\u00f3jny drop Mining.SubSkill.DoubleDrops.Description=Podwaja normalny \u0142up -Mining.SubSkill.DoubleDrops.Stat=Podw\u00f3jna szansa na upuszczenie +Mining.SubSkill.DoubleDrops.Stat=Podw\u00f3jna szansa na upuszczenie \u0142upu Mining.SubSkill.BlastMining.Name=Podmuch G\u00f3rnictwa Mining.SubSkill.BlastMining.Description=Premie do wydobywania z TNT -Mining.SubSkill.BlastMining.Stat=Blast Mining:&a Rank {0}/{1} &7({2}) -Mining.SubSkill.BlastMining.Stat.Extra=Blast Radius Increase: &a+{0} +Mining.SubSkill.BlastMining.Stat=Ranga Podmuchu G\u00f3rnictwa:&a {0}/{1} &7({2}) +Mining.SubSkill.BlastMining.Stat.Extra=Dodatkowy Zasi\u0119g Podmuchu G\u00f3rnictwa: &a+{0} Mining.SubSkill.BiggerBombs.Name=Wi\u0119ksze bomby Mining.SubSkill.BiggerBombs.Description=Zwi\u0119ksza promie\u0144 wybuchu -Mining.SubSkill.DemolitionsExpertise.Name=Ekspertyzy Rozbi\u00f3rki +Mining.SubSkill.DemolitionsExpertise.Name=Ekspertyza Rozbi\u00f3rki Mining.SubSkill.DemolitionsExpertise.Description=Zmniejsza obra\u017cenia zadawane TNT -Mining.SubSkill.DemolitionsExpertise.Stat=Zmniejszenie obra\u017ce\u0144 od eksperta od wyburze\u0144 +Mining.SubSkill.DemolitionsExpertise.Stat=Zmniejszenie obra\u017ce\u0144 od Eksperyza Rozbi\u00f3rki Mining.Listener=G\u00f3rnictwo: Mining.SkillName=G\u00d3RNICTWO Mining.Skills.SuperBreaker.Off=**Super Niszczyciel wy\u0142\u0105czy\u0142 si\u0119** @@ -405,7 +405,7 @@ Anvil.Unbreakable=Ten przedmiot jest niezniszczalny! #SWORDS Swords.Ability.Lower=&7Opuszczasz sw\u00f3j miecz. Swords.Ability.Ready=&6Przygotowujesz&3 sw\u00f3j miecz. -Swords.Combat.Rupture.Note=&7NOTATKA: &e1 P\u0119kni\u0119cie zdarza si\u0119 co 0,5 sekundy! +Swords.Combat.Rupture.Note=&7NOTATKA: &eP\u0119kni\u0119cie to okresowe obra\u017cenia, kt\u00f3re s\u0105 zadawane 2 razy na sekunde oraz omijaj\u0105 one zbroj\u0119! Swords.Combat.Bleeding.Started=&4 Krwawisz! Swords.Combat.Bleeding.Stopped=&7Krwawienie ju\u017c si\u0119 zatrzyma\u0142o&7! Swords.Combat.Bleeding=&a**PRZECIWNIK KRWAWI** @@ -427,7 +427,9 @@ Swords.SubSkill.SwordsLimitBreak.Name=Prze\u0142amywanie limit\u00f3w miecza Swords.SubSkill.SwordsLimitBreak.Description=Prze\u0142amywanie limit\u00f3w. Zwi\u0119kszone obra\u017cenia zadawane trudnym przeciwnikom. Przeznaczony dla PVP, zale\u017cnie od ustawie\u0144 serwera, czy zwi\u0119kszy obra\u017cenia w PVE, czy nie. Swords.SubSkill.SwordsLimitBreak.Stat=Prze\u0142amywanie limit\u00f3w max obra\u017ce\u0144 Swords.SubSkill.Rupture.Stat=Szansa na Rozerwanie -Swords.SubSkill.Rupture.Stat.Extra=Rozerwanie: &a{0} ticks [{1} DMG vs Gracz] [{2} DMG vs Moby] +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\u017cenia Rozerwania na tik: &e{0}&a przeciwko Graczom, &e{1}&a przeciwko Mobom. +Swords.SubSkill.Rupture.Stat.ExplosionDamage=[[DARK_AQUA]]Obra\u017cenia eksplozji Rozerwania: &e{0}&a przeciwko Graczom, &e{1}&a przeciwko Mobom. Swords.Effect.4=Krwawienie+ z\u0105bkowane uderzenia Swords.Effect.5={0} Tick Rupture Swords.Listener=Miecze: @@ -547,8 +549,8 @@ Woodcutting.SubSkill.BarkSurgeon.Name=Chirurg Kory Woodcutting.SubSkill.BarkSurgeon.Description=Wydobywaj przydatne materia\u0142y podczas \u015bcinania drzew. Woodcutting.SubSkill.NaturesBounty.Name=Nagroda natury Woodcutting.SubSkill.NaturesBounty.Description=Zbieraj do\u015bwiadczenie z natury. -Woodcutting.Listener=\u015acinacz Drzew: -Woodcutting.SkillName=\u015aCINACZ DRZEW +Woodcutting.Listener=Drwal: +Woodcutting.SkillName=DRWAL Woodcutting.Skills.TreeFeller.Off=**\u015acinacz Drzew przesta\u0142 dzia\u0142a\u0107** Woodcutting.Skills.TreeFeller.On=&a**\u015aCINACZ DRZEW AKTYWOWANY** Woodcutting.Skills.TreeFeller.Refresh=&aTwoja umiej\u0119tno\u015b\u015b &e\u015acinacz Drzew &azosta\u0142a od\u015bwie\u017cona! @@ -822,7 +824,7 @@ Party.ItemShare.Category.Herbalism=Tresowanie Party.ItemShare.Category.Woodcutting=\u015acinanie Drzew Party.ItemShare.Category.Misc=R\u00f3\u017cne ##xp -Commands.XPGain.Acrobatics=Spadanie +Commands.XPGain.Acrobatics=Spadanie z wysoko\u015bci Commands.XPGain.Alchemy=Warzenie Mikstur Commands.XPGain.Archery=Atakowanie potwor\u00f3w Commands.XPGain.Axes=Atakowanie potwor\u00f3w @@ -831,7 +833,7 @@ Commands.XPGain.Excavation=Kopanie i znajdowanie skarb\u00f3w Commands.XPGain.Fishing=\u0141owienie Commands.XPGain.Herbalism=Zbieranie zi\u00f3\u0142 Commands.XPGain.Mining=Kopanie kamienia & rud -Commands.XPGain.Repair=Naprawa +Commands.XPGain.Repair=Naprawa u\u017cywaj\u0105c specjalnego kowad\u0142a Commands.XPGain.Swords=Atakowanie potwor\u00f3w Commands.XPGain.Taming=Rozmna\u017canie zwierz\u0105t, albo walka w/ z twoimi psami Commands.XPGain.Unarmed=Atakowanie potwor\u00f3w @@ -872,88 +874,88 @@ Guides.Page.OutOfRange=Ta strona nie istnieje, jest/s\u0105 tylko {0} stron/a/y. Guides.Usage= Prawod\u0142owe u\u017cycie to /{0} ? [strona] ##Acrobatics Guides.Acrobatics.Section.0=&3O Akrobatyce:\n&eakrobatyka to sztuka poruszania si\u0119 z wdzi\u0119kiem w mcMMO.\n&eZapewnia premie bojowe i premie do obra\u017ce\u0144 otoczenia.\n\n&3ZDOBYWANIE XP:\n&eAby zdoby\u0107 PD w tej umiej\u0119tno\u015bci, musisz wykona\u0107 unik\n&ew walce lub przetrwa\u0107 upadki z wysoko\u015bci, kt\u00f3re ci\u0119 rani\u0105. -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. +Guides.Acrobatics.Section.1=&3Jak dzia\u0142a Przewr\u00f3t??\n&eMasz pasywn\u0105 szans\u0119, gdy odniesiesz obra\u017cenia od upadku, aby zneutralizowa\u0107 zadane obra\u017cenia. Mo\u017cesz przytrzyma\u0107 przycisk skradania si\u0119, aby podwoi\u0107 swoje szanse podczas upadku. To wyzwala \u014agodny Przwr\u00f3t zamiast standardowego. \u0141agodne Przewroty s\u0105 jak zwyk\u0142e, ale prawdopodobie\u0144stwo wyst\u0105pienia Przewrotu jest dwukrotnie wi\u0119ksze i zapewnia wi\u0119ksze bezpiecze\u0144stwo obra\u017ce\u0144 ni\u017c zwyk\u0142e Przewroty.\n&eSzansa na przewr\u00f3t zale\u017cy od poziomu Twojej umiej\u0119tno\u015bci. +Guides.Acrobatics.Section.2=&3Jak dzia\u0142a unik?\n&eUnik to pasywna szansa na zmniejszenie o po\u0142ow\u0119 otrzymywanych obra\u017ce\u0144, gdy odniesiesz obra\u017cenia w walce. Jest to powi\u0105zane z Twoim poziomem umiej\u0119tno\u015bci. ##Alchemy Guides.Alchemy.Section.0=&3O Alchemi:\n&eAlchemia polega na warzeniu mikstur.\n&eZapewnia przyspieszenie czasu warzenia mikstury,\n&ea tak\u017ce dodanie nowych (wcze\u015bniej) nieosi\u0105galnych mikstur. \n\n\n&3ZDOBYWANIE XP:\n&eAby zdoby\u0107 XP tej umiej\u0119tno\u015bci, musisz warzy\u0107 mikstury. -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) +Guides.Alchemy.Section.1=&3Jak dzia\u0142a Kataliza?\n&eSzybko\u015b\u0107 katalizy procesu warzenia, z maksymaln\u0105 pr\u0119dko\u015bci\u0105 4x na poziomie 1000. Ta umiej\u0119tno\u015b\u0107 jest domy\u015blnie odblokowywana na poziomie 100. +Guides.Alchemy.Section.2=&3Jak dzia\u0142aj\u0105 Mikstury?\n&eMikstury pozwalaj\u0105 na warzenie wi\u0119kszej liczby mikstur z niestandardowych sk\u0142adnik\u00f3w. To, kt\u00f3re specjalne sk\u0142adniki zostan\u0105 odblokowane, zale\u017cy od Twojej rangi. Do odblokowania jest 8 stopni. +Guides.Alchemy.Section.3=&3Sk\u0142adniki mikstur tieru 1:\n&eP\u0142omienny Proszek, Fermentowane Oko Paj\u0105ka, \u0141za Ghasta, Redstone,\n&eJasnopy\u0142, Cukier, Poz\u0142acany Arbuz, Z\u0142ota Marchewka,\n&eMagmowy Krem, Brodawka, Oko Paj\u0105ka, Proch, Lilia Wodna,\n&eRozdymka\n&e(Mikstury Wanilla) +Guides.Alchemy.Section.4=&3Sk\u0142adniki mikstur tieru 2:\n&eMarchwka (Miktura Szybko\u015bci)\n&eKulka Szlamu (Miktura Ot\u0119pienia)\n\n&3Sk\u0142adniki mikstur tieru 3:\n&eKwarc (Miksutra Absorpcji)\n&eMuchomor (Mikstura Skoku) +Guides.Alchemy.Section.5=&3Sk\u0142adniki mikstur tieru 4:\n&eJab\u0142ko (Mikstura boostu zdrowia)\n&eZgni\u0142e Mi\u0119so (PMiksutra G\u0142odu)\n\n&3Sk\u0142adniki mikstur tieru 5:\n&eBr\u0105zowy Grzyb (Mikstura Md\u0142o\u015bci)\n&eAtrament (Mikstura O\u015blepienia) +Guides.Alchemy.Section.6=&3Sk\u0142adniki mikstur tieru 6:\n&ePapro\u0107 (Mikstura Nasycenia)\n\n&3Sk\u0142adniki mikstur tieru 7:\n&eZatruty Ziemniak (Mikstura Rozk\u0142adu)\n\n&3Sk\u0142adniki mikstur tieru 8:\n&eZ\u0142ote Jab\u0142ko (Mikstura Odporno\u015bci) ##Archery Guides.Archery.Section.0=&3O \u0141ucznictwie:\n&e\u0141ucznictwo polega na strzelaniu z \u0142uku strza\u0142.\n&eZapewnia r\u00f3\u017cne bonusy bojowe, takie jak zwi\u0119kszenie obra\u017ce\u0144,\n&ekt\u00f3re skaluje si\u0119 z twoim poziomem i daje mo\u017cliwo\u015b\u0107 oszo\u0142omienia\n&eprzeciwnik\u00f3w w PvP. W dodatku mo\u017cesz odzyska\u0107\n&ecz\u0119\u015b\u0107 strza\u0142 z martwych wrog\u00f3w.\n\n\n&3ZDOBYWANIE XP:\n&eAby zdoby\u0107 XP w tej umiej\u0119tno\u015bci, musisz strzela\u0107 do mob\u00f3w lub\n&edo innych graczy. -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. +Guides.Archery.Section.1=&3Jak dzia\u0142a Umiej\u0119tne Strzelanie??\n&eUmiej\u0119tne strzelanie zapewnia dodatkowe obra\u017cenia strza\u0142om.\n&eDodatkowe obra\u017cenia rosn\u0105 wraz z poziomem \u0141ucznictwa.\n&ePrzy domy\u015blnych ustawieniach twoje obra\u017cenia zwi\u0119kszaj\u0105 si\u0119 o 10% co 50 poziom\u00f3w, do maksymalnie 200% dodatkowych obra\u017ce\u0144. +Guides.Archery.Section.2=&3Jak dzia\u0142a Oszo\u0142omienie?\n&eMasz pasywn\u0105 szans\u0119 oszo\u0142omienia innych graczy, gdy do nich strzelasz. Aktywacja Oszo\u0142omienia zmusza przeciwnik\u00f3w do patrzenia prosto w g\u00f3r\u0119 przez kr\u00f3tki czas. Strza\u0142a oszo\u0142omiaj\u0105ca zadaje dodatkowe 4 obra\u017cenia (2 serca). +Guides.Archery.Section.3=&3Jak dzia\u0142a Odzyskiwanie Strza\u0142?\n&eMasz pasywn\u0105 szans\u0119 na odzyskanie niekt\u00f3rych strza\u0142, gdy zabijesz \u0142ukiem. Ta szansa ro\u015bnie wraz ze zdobywaniem kolejnych poziom\u00f3w w \u0141ucznictwie. Domy\u015blnie zdolno\u015b\u0107 ta ro\u015bnie o 0,1% na poziom, do 100% na poziomie 1000. ##Axes -Guides.Axes.Section.0=&3About Axes:\n&eZ umiej\u0119tno\u015bci\u0105 Topory mo\u017cesz zrobi\u0107 co\u015b wi\u0119cej\n&eni\u017c niszczy\u0107 lasy! Mo\u017cesz hakowa\u0107 i sieka\u0107 moby\n&ei graczy, aby zdobywa\u0107 XP, musisz atakowa\u0107 moby siekier\u0105 z efektem\n&eodrzucenie i zada\u0107 \u015bmiertelny cios.\n&eTw\u00f3j top\u00f3r r\u00f3wnie\u017c staje si\u0119 r\u0119cznym r\u0119bakiem,\n&eponiewa\u017c bardzo obni\u017casz poziom zbroi\n&przeciwnika wraz z poziomiem umiej\u0119tno\u015bci.\n&3ZDOBYWANIE XP:\n&eAby zdobywa\u0107 XP musisz atakowa\u0107 moby\n&elub graczy siekier\u0105. -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. +Guides.Axes.Section.0=&3O Siekierach:\n&eZ umiej\u0119tno\u015bci\u0105 Topory mo\u017cesz zrobi\u0107 co\u015b wi\u0119cej\n&eni\u017c niszczy\u0107 lasy! Mo\u017cesz hakowa\u0107 i sieka\u0107 moby\n&ei graczy, aby zdobywa\u0107 XP, musisz atakowa\u0107 moby siekier\u0105 z efektem\n&eodrzucenie i zada\u0107 \u015bmiertelny cios.\n&eTw\u00f3j top\u00f3r r\u00f3wnie\u017c staje si\u0119 r\u0119cznym r\u0119bakiem,\n&eponiewa\u017c bardzo obni\u017casz poziom zbroi\n&eprzeciwnikom wraz z poziomiem umiej\u0119tno\u015bci.\n&3ZDOBYWANIE XP:\n&eAby zdobywa\u0107 XP musisz atakowa\u0107 moby\n&elub graczy siekier\u0105. +Guides.Axes.Section.1=&3Jak dzia\u0142a Przecinacz Czaszek?\n&eTa umiej\u0119tno\u015b\u0107 pozwala Ci zada\u0107 obra\u017cenia AoE (Obszarowe). Obra\u017cenia obszarowe zadaj\u0105 po\u0142ow\u0119 Twoich obra\u017ce\u0144, co czyni je dobrym sposobem do zabijania grup mob\u00f3w. +Guides.Axes.Section.2=&3Jak dzia\u0142a Trafienie Krytyczne?\n&eTrafienia krytyczne jest to pasywna umiej\u0119tno\u015b\u0107, kt\u00f3ra daje Ci mo\u017cliwo\u015b\u0107 zadania dodatkowych obra\u017ce\u0144. Przy domy\u015blnych ustawieniach co 2 poziom umiej\u0119tno\u015bci daje Ci 0.1% szansy na trafienie krytyczne, kt\u00f3re zadaje 2x mobom lub 1.5x przeciwko graczom. +Guides.Axes.Section.3=&3Jak dzia\u0142a Mistrz Siekier?\n&eJest to umiej\u0119tno\u015b\u0107 pasywna, kt\u00f3ra daje Ci mo\u017cliwo\u015b\u0107 zadania dodatkowych obra\u017ce\u0144 przy u\u017cyciu toporka. Obra\u017cenia zwi\u0119kszaj\u0105 si\u0119 o 1 co 50 poziom\u00f3w, do maksymalnie 4 obra\u017ce\u0144 na poziomie 200. +Guides.Axes.Section.4=&3Jak dzia\u0142a Uderzenie Pancerza?\n&eUderz z wystarczaj\u0105c\u0105 si\u0142\u0105, aby rozbi\u0107 zbroj\u0119! Uderzenie Pancerza posiada pasywn\u0105 umiej\u0119tno\u015b\u0107, kt\u00f3ra mo\u017ce uszkodzi\u0107 pancerz Twojego przeciwnika. Obra\u017cenia te s\u0105 zwi\u0119kszanie wraz z poziomem Siekiery. +Guides.Axes.Section.5=&3Jak dzia\u0142a Wi\u0119kszy Wp\u0142yw?\n&eZ ka\u017cdym uderzeniem masz coraz wi\u0119ksz\u0105 szanse na aktywacje Wi\u0119kszy Wp\u0142yw, gdy uderzasz gracza lub moba skiekier\u0105. Domy\u015blna szansa wynosi 25%. Pasywna umiej\u0119tno\u015b\u0107 posiada extremalny efekt odrzutu, podobny do Odrzutu II, jednak\u017ce zadaje ona wi\u0119cej obra\u017ce\u0144\n&eenchantment. Ponadto zadaje dodatkowe obra\u017cenia celowi. ##Excavation -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. +Guides.Excavation.Section.0=&3O Wykopalisku:\n&eWykopaliska to czynno\u015b\u0107 polegaj\u0105ca na wykopywaniu ziemi w celu znalezienia skarb\u00f3w..\n&eIm wi\u0119cej b\u0119dziesz kopa\u0107, tym wi\u0119cej znajdziesz skarb\u00f3w.\n\n&3ZDOBYWANIE XP:\n&eAby zdoby\u0107 XP w tej umiej\u0119tno\u015bci nale\u017cy kopa\u0107 \u0142opat\u0105. Tylko niekt\u00f3re rzeczy mo\u017cna wykopa\u0107, aby zdoby\u0107 skarby i EXP. Aby przygotowa\u0107 narz\u0119dzie wci\u015bnij prawy przycisk myszy z \u0142opat\u0105 w d\u0142oni. +Guides.Excavation.Section.1=&3Kompatybilne Materia\u0142y:\n&eTrawa, Ziemia, Piasek, Glina, \u017bwir, Mycelinium, Piasek Dusz, \u015anieg +Guides.Excavation.Section.2=&3Jak u\u017cy\u0107 Giga Wiert\u0142o:\n&eKliknij prawy przycisk z \u0142opat\u0105 w r\u0119ce, aby aktywowa\u0107 Giga Wiert\u0142o.\n&eGdy znajdziesz si\u0119 w tym stanie, masz oko\u0142o 4 sekund na kontakt z materia\u0142ami kompatybilnymi z Wykopalisko, aktywuje to Giga Wiert\u0142o. +Guides.Excavation.Section.3=&3Co to Giga Wiert\u0142o?\n&eGiga Wiert\u0142o to umiej\u0119tno\u015b\u0107 posiadaj\u0105ca czas odnowienia. Daje Ci potr\u00f3jn\u0105 szans\u0119 na znalezienie skarb\u00f3w oraz umo\u017cliwia natychmiastowe kopanie. +Guides.Excavation.Section.4=&3Jak dzia\u0142a Archeologia?\n&eKa\u017cdy skarb posiada sw\u00f3j wymagany poziom, dlatego otrzymujesz skarb w zale\u017clo\u015bci od Twojego poziomu umiej\u0119tno\u015bci. Pami\u0119taj im wy\u017cszy jest Tw\u00f3j poziom umiej\u0119tno\u015bci, tym wi\u0119cej skarb\u00f3w mo\u017cesz znale\u017a\u0107. Ka\u017cdy skarb, wykopywany z r\u00f3\u017cnych materia\u0142\u00f3w posiada swoj\u0105 unikalna list\u0119 przedmiot\u00f3w, kt\u00f3re si\u0119 w nim znajduj\u0105. Inny skarb otrzymasz z bruku, a zupe\u0142nie inny ze \u017cwiru. +Guides.Excavation.Section.5=&3Notatki o Wykopaliskach:\n&ePrzedmioty z wykopalisk s\u0105 w pe\u0142ni konfigurowalne, tak wi\u0119c wyniki r\u00f3\u017cni\u0105 si\u0119 mi\u0119dzy serwerami. ##Fishing -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. +Guides.Fishing.Section.0=&3O W\u0119dkarstwie:\n&eDzi\u0119ki umiej\u0119tno\u015bci W\u0119dkarstwo, w\u0119dkarstwo zn\u00f3w jest ekscytuj\u0105ce! Znajd\u017a ukryte skarby i strz\u0105\u015bnij przedmioty z mob\u00f3w.\n\n&3ZDOBYWANIE XP:\n&e\u0141owienie ryb. +Guides.Fishing.Section.1=&3Jak dzia\u0142a \u0141owca Skarb\u00f3w?\n&eTa umiej\u0119tno\u015b\u0107 pozwala ci znale\u017a\u0107 skarb z \u0142owienia z niewielk\u0105 szans\u0105 na zakl\u0119cie przedmiot\u00f3w. Ka\u017cdy mo\u017cliwy skarb dla w\u0119dkarzy ma szans\u0119 spa\u015b\u0107 na dowolnym poziomie. Zale\u017cy to jednak od rzadko\u015bci przedmiotu, jak cz\u0119sto b\u0119dzie on wypada\u0142. Im wy\u017cszy poziom umiej\u0119tno\u015bci \u0141owienie ryb, tym wi\u0119ksze masz szanse na znalezienie lepszych skarb\u00f3w. +Guides.Fishing.Section.2=&3Jak dzia\u0142aj\u0105 Mro\u017ane Po\u0142owy?\n&eTa umiej\u0119tno\u015b\u0107 pasywna pozwala \u0142owi\u0107 ryby w lodowych jeziorach! Wrzu\u0107 w\u0119dk\u0119 do lodowego jeziora, a stworzysz w lodzie ma\u0142\u0105 dziur\u0119 do \u0142owienia. +Guides.Fishing.Section.3=&3Jak dzia\u0142a Mistrz W\u0119dkarstwa?\n&eTa umiej\u0119tno\u015b\u0107 pasywna zwi\u0119ksza szans\u0119 brania podczas \u0142owienia. Po odblokowaniu tej umiej\u0119tno\u015bci \u0142owienie na \u0142odzi zwi\u0119ksza szanse na z\u0142owienie ryby. +Guides.Fishing.Section.4=&3Jak dzia\u0142a Potrz\u0105sanie?\n&eTa aktywna umiej\u0119tno\u015b\u0107 pozwala strz\u0105sa\u0107 przedmioty z mob\u00f3w poprzez zaczepienie ich w\u0119dk\u0105. Moby upuszczaj\u0105 przedmioty, kt\u00f3re normalnie upuszczaj\u0105 po \u015bmierci. Mo\u017cliwe jest r\u00f3wnie\u017c zdobycie czaszek mob\u00f3w, kt\u00f3re normalnie s\u0105 nieosi\u0105galne w trybie przetrwania. +Guides.Fishing.Section.5=&3Jak dzia\u0142a Dieta Rybaka?\n&eTa umiej\u0119tno\u015b\u0107 pasywna zwi\u0119ksza ilo\u015b\u0107 przywracanego g\u0142odu po jedzeniu ryby. +Guides.Fishing.Section.6=&3Notatki o W\u0119dkarstwie:\n&ePrzedmioty z \u0142owienia s\u0105 w pe\u0142ni konfigurowalne, tak wi\u0119c wyniki r\u00f3\u017cni\u0105 si\u0119 mi\u0119dzy serwerami. ##Herbalism -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. +Guides.Herbalism.Section.0=&3O Zielarstwie:\n&eZielarstwo polega na zbieraniu zi\u00f3\u0142 i ro\u015blin.\n\n\n&3ZDOBYWANIE XP:\n&eZbieraj ro\u015bliny i zio\u0142a. +Guides.Herbalism.Section.1=&3Kompatybilne ro\u015bliny:\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\u0142a Zielona Terra?\n&eZielona Terra to umiej\u0119tno\u015b\u0107 aktywna, mo\u017cesz przytrzyma\u0107 motyk\u0119 prawym przyciskiem myszy, aby aktywowa\u0107 Zielon\u0105 Terr\u0119. Zielona Terra daje graczom szans\u0119 na zdobycie 3x przedmiot\u00f3w ze zbioru ro\u015blin. Daje tak\u017ce graczom mo\u017cliwo\u015b\u0107 dzielenia \u017cycia na bloki i przekszta\u0142cania ich za pomoc\u0105 nasion z ekwipunku. +Guides.Herbalism.Section.3=&3Jak dzia\u0142a Zielona R\u0105czka (Nasiona)?\n&eTa pasywna umiej\u0119tno\u015b\u0107 automatycznie przesadza plony podczas zbioru. Twoja szansa na sukces zale\u017cy od umiej\u0119tno\u015bci zielarstwa. +Guides.Herbalism.Section.4=&3Jak dzia\u0142a Zielona R\u0105czka (Bruk/Kamienne Ceg\u0142y/Ziemia)?\n&eTa aktywna zdolno\u015b\u0107 pozwala zamieni\u0107 bloki w ich odpowiedniki „zwi\u0105zane z ro\u015blinami”. Mo\u017cesz to zrobi\u0107, klikaj\u0105c prawym przyciskiem myszy blok, trzymaj\u0105c jednocze\u015bnie nasiona. To poch\u0142onie 1 ziarno. +Guides.Herbalism.Section.5=&3Jak dzia\u0142a Dieta Farmera?\n&eTa umiej\u0119tno\u015b\u0107 pasywna zwi\u0119ksza ilo\u015b\u0107 przywracanego g\u0142odu podczas jedzenia chleba, ciastek, arbuz\u00f3w, zupy grzybowej, marchwi i ziemniak\u00f3w. +Guides.Herbalism.Section.6=&3Jak dzia\u0142a Wielkie Szcz\u0119\u015bcie?\n&eTa pasywna umiej\u0119tno\u015b\u0107 daje ci szans\u0119 na znalezienie rzadkich przedmiot\u00f3w, gdy niekt\u00f3re bloki zostan\u0105 rozbite mieczem. +Guides.Herbalism.Section.7=&3Jak dzia\u0142a Podw\u00f3jny \u0141up?\n&eTa pasywna umiej\u0119tno\u015b\u0107 zapewnia graczom wi\u0119ksze plony. ##Mining -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. +Guides.Mining.Section.0=&3O G\u00f3rnictwie:\n&eG\u00f3rnictwo obejmuje wydobywanie kamienia i rud. Zapewnia bonusy do ilo\u015bci upuszczanych materia\u0142\u00f3w podczas wydobywania.\n\n&3ZDOBYWANIE XP:\n&eAby zdoby\u0107 XP w tej umiej\u0119tno\u015bci, musisz kopa\u0107 z kilofem w d\u0142oni. Tylko niekt\u00f3re bloki zapewniaj\u0105 XP . +Guides.Mining.Section.1=&3Kompatybilne Minera\u0142y:\n&eKamie\u0144, Ruda W\u0119gla, Ruda \u017belaza, Ruda Z\u0142ota, Ruda Diamentu, Ruda Redstone,\n&eRuda Lapisu, Obsydian, Zamszony Bruk, Kamie\u0144 Endu,\n&eJasnog\u0142az, i Netherrack. +Guides.Mining.Section.2=&3Jak u\u017cy\u0107 Super Niszczyciela:\n&eKliknij prawy przycisk z kilofem w r\u0119ce, aby aktywowa\u0107 Super Niszczyciel.\n&eGdy znajdziesz si\u0119 w tym stanie, masz oko\u0142o 4 sekund na kontakt z materia\u0142ami kompatybilnymi z Wykopalisko, aktywuje to Super Niszczyciel. +Guides.Mining.Section.3=&3Co to Super Niszczyciel?\n&eSuper Niszczyciel to umiej\u0119tno\u015b\u0107, kt\u00f3rej czas odnowienia jest powi\u0105zany z umiej\u0119tno\u015bci\u0105 G\u00f3rnictwo. Potroi szans\u0119 na upuszczenie dodatkowych przedmiot\u00f3w i umo\u017cliwia natychmiastowe niszczenie przy wydobywaniu materia\u0142\u00f3w. +Guides.Mining.Section.4=&3Jak u\u017cy\u0107 Podm\u00f3ch G\u00f3rnictwa:\n&eZ kilofem w d\u0142oni kucnij i kliknij prawym przyciskiem myszy na TNT z daleka. Spowoduje to natychmiastow\u0105 eksplozj\u0119 TNT. +Guides.Mining.Section.5=&3Jak dzia\u0142\u0105 Podm\u00f3ch G\u00f3rnictwa?\n&ePodm\u00f3ch G\u00f3rnictwa to umiej\u0119tno\u015b\u0107, kt\u00f3rej czas odnowienia jest powi\u0105zany z umiej\u0119tno\u015bci\u0105 G\u00f3rnictwo. Daje bonusy podczas wydobywania z TNT i pozwala zdalnie zdetonowa\u0107 TNT. Podm\u00f3ch G\u00f3rnictwa sk\u0142ada si\u0119 z trzech cz\u0119\u015bci. Pierwsza cz\u0119\u015b\u0107 to Wi\u0119ksze Bomby, kt\u00f3ra zwi\u0119ksza zasi\u0119g ra\u017cenia. Druga to Eksportyza Rozbi\u00f3rki, kt\u00f3ra zmniejsza obra\u017cenia od wybuch\u00f3w TNT. Trzecia cz\u0119\u015b\u0107 po prostu zwi\u0119ksza ilo\u015b\u0107 rud zrzucanych z trotylu i zmniejsza ilo\u015b\u0107 upuszczanych gruzu. ##Repair -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. +Guides.Repair.Section.0=&3O Naprawianiu:\n&eNaprawa umo\u017cliwia u\u017cycie \u017celaznego bloku do naprawy zbroi i narz\u0119dzi .\n\n&3ZDOBYWANIE XP:\n&eNapraw narz\u0119dzia lub zbroj\u0119 za pomoc\u0105 kowad\u0142a mcMMO. Jest to domy\u015blnie \u017celazny blok i nie nale\u017cy go myli\u0107 z kowad\u0142em Vanilla. +Guides.Repair.Section.1=&3Jak naprawia\u0107 w mcMMO?\n&ePo\u0142\u00f3\u017c kowad\u0142o mcMMO i kliknij prawym przyciskiem myszy, aby naprawi\u0107 przedmiot, kt\u00f3ry aktualnie trzymasz. Przy ka\u017cdym u\u017cyciu zu\u017cywa 1 przedmiot (Na przyk\u0142ad przy \u017celaznych narz\u0119dziach zu\u017cyje jedno \u017celazo). +Guides.Repair.Section.2=&3Jak dzia\u0142a Mistrz Napraw?\n&ePoziom Mistrza Napraw zwi\u0119ksza si\u0119 wraz z naprawianymi przedmiotami. Dodatkow\u0105 przywr\u00f3con\u0105 wytrzyma\u0142o\u015b\u0107 zale\u017cy od poziomu Naprawianie. +Guides.Repair.Section.3=&3Jak dzia\u0142a Super Naprawa?\n&eSuper Naprawa to umiej\u0119tno\u015b\u0107 pasywna. Podczas naprawy przedmiotu daje graczom szans\u0119 na naprawienie przedmiotu z podw\u00f3jn\u0105 skuteczno\u015bci\u0105. +Guides.Repair.Section.4=&3Jak dzia\u0142a Tajemne Fa\u0142szowanie?\n&eTa pasywna umiej\u0119tno\u015b\u0107 pozwala naprawia\u0107 przedmioty z pewn\u0105 szans\u0105 na utrzymanie zakl\u0119\u0107. Zakl\u0119cia mog\u0105 pozosta\u0107 na dotychczasowych poziomach, zdegradowane do ni\u017cszych lub ca\u0142kowicie utracone. ##Salvage -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. +Guides.Salvage.Section.0=&3O odzyskiwaniu:\n&eUmie\u015bci\u0142e\u015b odzyskiwanie pozwala ci u\u017cy\u015b z\u0142otego bloku do odzyskania zbroi i narz\u0119dzi..\n\n&3ZDOBYWANIE XP:\n&eOdzyskiwanie to umiej\u0119tno\u015b\u0107 podrz\u0119dna Naprawy i W\u0119dkarstwa, wi\u0119c Tw\u00f3j poziom umiej\u0119tno\u015bci Odzyskiwania jest oparty na twoich poziomach umiej\u0119tno\u015bci W\u0119dkarstwa i Naprawy. +Guides.Salvage.Section.1=&3Jak u\u017cwa\u0107 Odzyskiwanie?\n&ePo\u0142\u00f3\u017c kowad\u0142o mcMMO (tj. z\u0142oty blok) i kliknij prawym przyciskiem myszy, aby odzyska\u0107 przedmioty z narz\u0119dzia, kt\u00f3ry aktualnie trzymasz. Spowoduje to zniszczenie przedmiotu i zwr\u00f3cenie materia\u0142\u00f3w u\u017cytych do wytworzenia przedmiotu. +Guides.Salvage.Section.2=&3Jak dzia\u0142a Zaawansowane Odzyskiwanie?\n&ePo odblokowaniu umiej\u0119tno\u015b\u0107 ta pozwala na odzyskanie uszkodzonych przedmiot\u00f3w. Procent zysku ro\u015bnie wraz ze wzrostem poziomu. Wy\u017csza wydajno\u015b\u0107 oznacza, \u017ce mo\u017cna odzyska\u0107 wi\u0119cej materia\u0142\u00f3w. Dzi\u0119ki zaawansowanemu odzyskowi zawsze otrzymasz 1 materia\u0142 z powrotem, chyba \u017ce przedmiot jest zbyt uszkodzony. Nie musisz wi\u0119c martwi\u0107 si\u0119 o niszczenie przedmiot\u00f3w, nie otrzymuj\u0105c niczego w zamian. +Guides.Salvage.Section.3=&3Aby pokaza\u0107 przyk\u0142ad, tutaj go opisujemy:\n&ePowiedzmy, \u017ce odzyskujemy z\u0142oty kilof, kt\u00f3ry jest uszkodzony o 20%, co oznacza, \u017ce maksymalna kwota, jak\u0105 mo\u017cesz zdoby\u0107, to tylko 2 (poniewa\u017c kilof jest tworzony z 3 sztabek - ka\u017cdy wart 33,33% wytrzyma\u0142o\u015bci), co jest r\u00f3wne 66% . Je\u015bli Tw\u00f3j procent wytrzyma\u0142o\u015bci jest ni\u017cszy ni\u017c 66%, nie jeste\u015b w stanie uzyska\u0107 2 sztabek. Je\u015bli jest powy\u017cej tej warto\u015bci, mo\u017cesz uzyska\u0107 „pe\u0142n\u0105 kwot\u0119”, co oznacza, \u017ce otrzymasz 2 sztabki. +Guides.Salvage.Section.4=&3Jak dzia\u0142a Tajemne Odzyskiwanie?\n&eTa umiej\u0119tno\u015b\u0107 pozwala zdoby\u0107 zakl\u0119te ksi\u0105\u017cki podczas odzyskiwania zakl\u0119tych przedmiot\u00f3w. W zale\u017cno\u015bci od twojego poziomu, szansa na pomy\u015blne wyodr\u0119bnienie pe\u0142nego lub cz\u0119\u015bciowego zakl\u0119cia jest r\u00f3\u017cna.\n\n&eKiedy zakl\u0119cie zostanie cz\u0119\u015bciowo wydobyte, ksi\u0119ga zakl\u0119\u0107 b\u0119dzie mia\u0142a ni\u017cszy poziom zakl\u0119cia w por\u00f3wnaniu z tym, co znajdowa\u0142o si\u0119 na przedmiocie. ##Smelting -Guides.Smelting.Section.0=Coming soon... +Guides.Smelting.Section.0=Wkr\u00f3tce... ##Swords -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 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. +Guides.Swords.Section.0=&3O Mieczach:\n&eTa umiej\u0119tno\u015b\u0107 zapewnia premie bojowe ka\u017cdemu, kto walczy mieczem..\n\n&3ZDOBYWANIE XP:\n&eXP jest zdobywane w oparciu o ilo\u015b\u0107 obra\u017ce\u0144 zadanych mobom lub innym graczom, gdy dzier\u017cysz miecz. . +Guides.Swords.Section.1=&3Jak dzia\u0142aj\u0105 Z\u0105bkowane Uderzenia?\n&eZ\u0105bkowane Uderzenia to umiej\u0119tno\u015b\u0107 aktywna, kt\u00f3r\u0105 mo\u017cna aktywowa\u0107, klikaj\u0105c prawym przyciskiem myszy mieczem. Ta umiej\u0119tno\u015b\u0107 pozwala na zadanie trafienia obszarowego. Ten obszar dzia\u0142ania zadaje dodatkowe 25% obra\u017ce\u0144 i wywo\u0142a efekt krwawienia trwaj\u0105cy 5 tik\u00f3w. +Guides.Swords.Section.2=&3Jak dzia\u0142a Kontraatak?\n&eKontratak to aktywna umiej\u0119tno\u015b\u0107. Podczas blokowania i przyjmowania trafie\u0144 od mob\u00f3w, b\u0119dziesz mia\u0142 szans\u0119 odbi\u0107 50% otrzymanych obra\u017ce\u0144. +Guides.Swords.Section.3=&3Jak dzia\u0142a Rozerwanie?\n&eRozerwanie powoduje, \u017ce wrogowie otrzymuj\u0105 obra\u017cenia co dwie sekundy. Cel b\u0119dzie krwawi\u0142 do momentu ust\u0105pienia efektu lub \u015bmierci, w zale\u017cno\u015bci od tego, co nast\u0105pi wcze\u015bniej. Poziom umiej\u0119tno\u015bci Miecze zwi\u0119ksza czas trwania krwawienia. ##Taming -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. +Guides.Taming.Section.0=&3O Oswajaniu:\n&eOswajanie zapewni graczom r\u00f3\u017cne bonusy bojowe podczas u\u017cywania oswojonych wilk\u00f3w.\n\n&3ZDOBYWANIE XP:\n&eAby zdoby\u0107 XP w tej umiej\u0119tno\u015bci, musisz oswoi\u0107 wilki lub oceloty i wyruszy\u0107 do walki ze swoimi sprzymierze\u0144cami. +Guides.Taming.Section.1=&3Jak dzia\u0142a Zew Natury?\n&eZew Natury to aktywna umiej\u0119tno\u015b\u0107, kt\u00f3ra pozwoli ci przywo\u0142a\u0107 wilka lub ocelota do swojego boku. Mo\u017cesz to zrobi\u0107 kucaj\u0105c (shift) + klikni\u0119cie lewym przyciskiem myszy, trzymaj\u0105c ko\u015bci lub ryb\u0119. +Guides.Taming.Section.2=&3Jak dzia\u0142a Wiedza Bestii?\n&eWiedza Bestii pozwala graczom na zbadanie zwierzak\u00f3w i sprawdzanie stanu wilk\u00f3w i ocelot\u00f3w. Kliknij lewym przyciskiem myszy na wilka lub ocelota, aby u\u017cy\u0107 Wiedzy Bestii. +Guides.Taming.Section.3=&3How does Gore work?\n&eKrwawienie to pasywna umiej\u0119tno\u015b\u0107, kt\u00f3ra ma szans\u0119 wywo\u0142a\u0107 efekt krwawienia na celach przez Twoich wilk\u00f3w. +Guides.Taming.Section.4=&3Jak dzia\u0142aj\u0105 Zaostrzone Pazury?\n&eZaostrzone Pazury zapewnia premi\u0119 do obra\u017ce\u0144 zadawanych przez wilki. Premia do obra\u017ce\u0144 zale\u017cy od Twojego poziomu Oswajania. +Guides.Taming.Section.5=&3Jak dzia\u0142a Sprzymierzeniec Natury?\n&eTa pasywna umiej\u0119tno\u015b\u0107 pozwoli wilkom teleportowa\u0107 si\u0119 do ciebie, gdy zbli\u017c\u0105 si\u0119 do niebezpiecze\u0144stw, takich jak kaktusy czy lawa. Zapewni tak\u017ce wilkom odporno\u015b\u0107 na obra\u017cenia od upadku. +Guides.Taming.Section.6=&3Jak dzia\u0142a grube futro??\n&eTa pasywna umiej\u0119tno\u015b\u0107 zmniejszy obra\u017cenia i sprawi, \u017ce wilki b\u0119d\u0105 odporne na ogie\u0144. +Guides.Taming.Section.7=&3Jak dzia\u0142a odporno\u015b\u0107 na wstrz\u0105sy?\n&eTa umiej\u0119tno\u015b\u0107 pasywna zmniejsza obra\u017cenia zadawane wilkom od eksplozji. +Guides.Taming.Section.8=&3Jak dzia\u0142a serwis Fast Food??\n&eTa pasywna umiej\u0119tno\u015b\u0107 daje wilkom szans\u0119 na uleczenie si\u0119, gdy wykonaj\u0105 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. @@ -962,10 +964,10 @@ Guides.Unarmed.Section.3=&3How does Arrow Deflect work?\n&eArrow Deflect is a pa 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=&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. +Guides.Woodcutting.Section.0=&3O Drwalu:\n&eDrwal polega na wycinaniu drzew.\n\n&3ZDOBYWANIE XP:\n&eXP jest zdobywany za ka\u017cdym razem, gdy niszczysz bloki k\u0142\u00f3d. +Guides.Woodcutting.Section.1=&3Jak dzia\u0142a \u015acinacz Drzew?\n&e\u015cinacz Drzew to aktywna umiej\u0119tno\u015b\u0107, mo\u0107na klikn\u0105\u0107 prawym przyciskiem trzymaj\u0105c siekier\u0119, aby aktywowa\u0107 \u015cinacz Drzew. Spowoduje to natychmiastowe zniszczenie ca\u0142ego drzewa, zrzucaj\u0105c jednocze\u015bnie wszystkie k\u0142ody. +Guides.Woodcutting.Section.2=&3Jak dzia\u0142a Dmuchawa Do Li\u015bci?\n&eDmuchawa do li\u015bci to umiej\u0119tno\u015b\u0107 pasywna, kt\u00f3ra powoduje, \u017ce bloki li\u015bci natychmiast si\u0119 niszcz\u0105 po uderzeniu siekier\u0105. Umiej\u0119tno\u015b\u0107 ta domy\u015blnie odblokowuje si\u0119 na poziomie 100. +Guides.Woodcutting.Section.3=&3Jak dzia\u0142a Podw\u00f3jny \u0141up?\n&eTa pasywna umiej\u0119tno\u015b\u0107 daje ci szans\u0119 na uzyskanie dodatkowego bloku za ka\u017cd\u0105 posiekan\u0105 k\u0142od\u0119. #INSPECT Inspect.Offline= &cNie masz uprawnie\u0144 do sprawdzania graczy offline! Inspect.OfflineStats=Statystyki mcMMO dla gracza off-line &e{0} @@ -982,7 +984,7 @@ Item.Generic.Wait=Musisz odczeka\u0107 zanim ponownie to u\u017cyjesz! &e({0}s) Item.Injured.Wait=Niedawno by\u0142e\u015b kontuzjowany i musisz poczeka\u0107, zanim to wykorzystasz. &e({0}s) Item.FluxPickaxe.Name=Topi\u0105cy Kilof Item.FluxPickaxe.Lore.1=&7Ma szanse na natychmiastowe przepalenie rudy. -Item.FluxPickaxe.Lore.2=&7Wymaga poziomu &6Przepalanie: &7{0}+ +Item.FluxPickaxe.Lore.2=&7Wymaga poziomu &6Przepalania: &7{0}+ #TELEPORTATION Teleport.Commencing=&7Rozpoczynanie teleportacji… Przez &6({0}) &7sekund, nie ruszaj si\u0119... Teleport.Cancelled=&4Teleportacja anulowana! From cfe1fd2b26b86cfb4f7cc5ee4ffd74f2531c7f9e Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 16 Apr 2021 10:07:02 -0700 Subject: [PATCH 519/662] Update changelog --- Changelog.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/Changelog.txt b/Changelog.txt index c44ad03f2..116167bbf 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -5,6 +5,7 @@ Version 2.1.193 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 From 81a3441d623a7bdf1f509214de0bd616769956f4 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 16 Apr 2021 10:07:36 -0700 Subject: [PATCH 520/662] 2.1.193 --- Changelog.txt | 2 +- pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 116167bbf..9ce8d58c1 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,7 +1,7 @@ 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 were working + (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) diff --git a/pom.xml b/pom.xml index 3a19d20e1..97c687111 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.193-SNAPSHOT + 2.1.193 mcMMO https://github.com/mcMMO-Dev/mcMMO From c29f311f1e5b370a5ce8f1e323d5d231abb75ab9 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 16 Apr 2021 12:24:02 -0700 Subject: [PATCH 521/662] More proper fix --- Changelog.txt | 3 +++ pom.xml | 2 +- src/main/java/com/gmail/nossr50/locale/LocaleLoader.java | 1 + src/main/java/com/gmail/nossr50/mcMMO.java | 3 +-- 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 9ce8d58c1..7227a5083 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,6 @@ +Version 2.1.194 + Fixed a bug where mcMMO didn't properly setup file paths for locale override + 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) diff --git a/pom.xml b/pom.xml index 97c687111..6cc309b22 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.193 + 2.1.194-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO diff --git a/src/main/java/com/gmail/nossr50/locale/LocaleLoader.java b/src/main/java/com/gmail/nossr50/locale/LocaleLoader.java index 2cfcc4052..cf8d5bfb0 100644 --- a/src/main/java/com/gmail/nossr50/locale/LocaleLoader.java +++ b/src/main/java/com/gmail/nossr50/locale/LocaleLoader.java @@ -152,6 +152,7 @@ public final class LocaleLoader { mcMMO.p.getLogger().log(Level.WARNING, "Failed to load locale from " + localePath, e); } } + bundle = ResourceBundle.getBundle(BUNDLE_ROOT, locale); enBundle = ResourceBundle.getBundle(BUNDLE_ROOT, Locale.US); } diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index a0b7ebf43..7b34c18e1 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -184,6 +184,7 @@ public class mcMMO extends JavaPlugin { @Override public void onEnable() { try { + setupFilePaths(); generalConfig = new GeneralConfig(getDataFolder()); //Load before skillTools skillTools = new SkillTools(this); //Load after general config @@ -207,7 +208,6 @@ public class mcMMO extends JavaPlugin { upgradeManager = new UpgradeManager(); - setupFilePaths(); modManager = new ModManager(); @@ -338,7 +338,6 @@ public class mcMMO extends JavaPlugin { transientEntityTracker = new TransientEntityTracker(); setServerShutdown(false); //Reset flag, used to make decisions about async saves - LocaleLoader.reloadLocale(); //Apply override locale } public static PlayerLevelUtils getPlayerLevelUtils() { From 16f79b9fbc7206303390516db1c0fb9ff6f3e8af Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 16 Apr 2021 13:50:41 -0700 Subject: [PATCH 522/662] Locale override now uses a specific file instead of weird name matching --- Changelog.txt | 8 +- .../experience/ExperienceCommand.java | 2 - .../experience/SkillresetCommand.java | 1 - .../nossr50/database/DatabaseManager.java | 1 - .../database/FlatFileDatabaseManager.java | 4 +- .../gmail/nossr50/locale/LocaleLoader.java | 169 ++++++++++++++++-- src/main/java/com/gmail/nossr50/mcMMO.java | 1 - .../database/FlatFileDatabaseManagerTest.java | 5 +- 8 files changed, 167 insertions(+), 24 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 7227a5083..0c88afb19 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,5 +1,11 @@ Version 2.1.194 - Fixed a bug where mcMMO didn't properly setup file paths for locale override + 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 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 5f310828e..4bd6b4eeb 100644 --- a/src/main/java/com/gmail/nossr50/commands/experience/ExperienceCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/experience/ExperienceCommand.java @@ -9,7 +9,6 @@ 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; @@ -19,7 +18,6 @@ import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.List; -import java.util.UUID; public abstract class ExperienceCommand implements TabExecutor { @Override 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 d4353224e..edc99e2ad 100644 --- a/src/main/java/com/gmail/nossr50/commands/experience/SkillresetCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/experience/SkillresetCommand.java @@ -22,7 +22,6 @@ 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 diff --git a/src/main/java/com/gmail/nossr50/database/DatabaseManager.java b/src/main/java/com/gmail/nossr50/database/DatabaseManager.java index c377bbbfe..586c8c0b6 100644 --- a/src/main/java/com/gmail/nossr50/database/DatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/DatabaseManager.java @@ -1,6 +1,5 @@ package com.gmail.nossr50.database; -import com.gmail.nossr50.api.exceptions.InvalidPlayerException; import com.gmail.nossr50.api.exceptions.InvalidSkillException; import com.gmail.nossr50.datatypes.database.DatabaseType; import com.gmail.nossr50.datatypes.database.PlayerStat; diff --git a/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java index 32f327614..dc1b40855 100644 --- a/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java @@ -10,7 +10,6 @@ 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.blockmeta.HashChunkManager; import com.gmail.nossr50.util.skills.SkillTools; import org.bukkit.OfflinePlayer; import org.bukkit.entity.Player; @@ -18,7 +17,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.*; -import java.security.InvalidParameterException; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.*; @@ -1074,7 +1072,7 @@ public final class FlatFileDatabaseManager implements DatabaseManager { try { // Open the file to write the player bufferedWriter = new BufferedWriter(new FileWriter(usersFilePath, true)); - DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"); + 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) { diff --git a/src/main/java/com/gmail/nossr50/locale/LocaleLoader.java b/src/main/java/com/gmail/nossr50/locale/LocaleLoader.java index cf8d5bfb0..0fed62f4f 100644 --- a/src/main/java/com/gmail/nossr50/locale/LocaleLoader.java +++ b/src/main/java/com/gmail/nossr50/locale/LocaleLoader.java @@ -4,18 +4,21 @@ 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; @@ -30,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) { @@ -44,11 +48,13 @@ public final class LocaleLoader { } //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 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 TextComponent getTextComponent(String key, Object... messageArguments) { @@ -75,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); } @@ -134,8 +139,7 @@ public final class LocaleLoader { 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]); } @@ -144,18 +148,155 @@ public final class LocaleLoader { } 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); + + 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) { + 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 " + localePath, 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); + } + + @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" + + "# 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" + + 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) { diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index 7b34c18e1..d182ecc02 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -18,7 +18,6 @@ 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.locale.LocaleLoader; import com.gmail.nossr50.party.PartyManager; import com.gmail.nossr50.runnables.SaveTimerTask; import com.gmail.nossr50.runnables.backups.CleanBackupsTask; diff --git a/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java b/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java index feb796e9f..62d13f69a 100644 --- a/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java +++ b/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java @@ -17,7 +17,10 @@ import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.junit.jupiter.api.*; +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 java.io.*; import java.net.URI; From 2c44590c526c30b865bb79f3b0a6a60d5be95e4f Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sun, 18 Apr 2021 17:21:37 -0700 Subject: [PATCH 523/662] world bounds tweak --- .../java/com/gmail/nossr50/util/BlockUtils.java | 3 ++- .../layers/world/WorldCompatibilityLayer.java | 2 +- .../nossr50/util/blockmeta/ChunkStoreTest.java | 17 +++++++++++++++++ 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/util/BlockUtils.java b/src/main/java/com/gmail/nossr50/util/BlockUtils.java index d1cb63a2a..135025952 100644 --- a/src/main/java/com/gmail/nossr50/util/BlockUtils.java +++ b/src/main/java/com/gmail/nossr50/util/BlockUtils.java @@ -292,7 +292,8 @@ public final class BlockUtils { public static boolean isWithinWorldBounds(@NotNull WorldCompatibilityLayer worldCompatibilityLayer, @NotNull Block block) { World world = block.getWorld(); - return block.getY() > worldCompatibilityLayer.getMinWorldHeight(world) && block.getY() < worldCompatibilityLayer.getMaxWorldHeight(world); + //pretty sure both height and min height are able to have blocks placed on them + return block.getY() >= worldCompatibilityLayer.getMinWorldHeight(world) && block.getY() <= worldCompatibilityLayer.getMaxWorldHeight(world); } } diff --git a/src/main/java/com/gmail/nossr50/util/compat/layers/world/WorldCompatibilityLayer.java b/src/main/java/com/gmail/nossr50/util/compat/layers/world/WorldCompatibilityLayer.java index a8f970987..115aeb7fb 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/layers/world/WorldCompatibilityLayer.java +++ b/src/main/java/com/gmail/nossr50/util/compat/layers/world/WorldCompatibilityLayer.java @@ -7,5 +7,5 @@ import org.jetbrains.annotations.NotNull; public interface WorldCompatibilityLayer extends CompatibilityLayer { default int getMinWorldHeight(@NotNull World world) { return 0; } - default int getMaxWorldHeight(@NotNull World world) { return 255; } + default int getMaxWorldHeight(@NotNull World world) { return 256; } } diff --git a/src/test/java/com/gmail/nossr50/util/blockmeta/ChunkStoreTest.java b/src/test/java/com/gmail/nossr50/util/blockmeta/ChunkStoreTest.java index bafb3f01b..b8e93d9cc 100644 --- a/src/test/java/com/gmail/nossr50/util/blockmeta/ChunkStoreTest.java +++ b/src/test/java/com/gmail/nossr50/util/blockmeta/ChunkStoreTest.java @@ -2,6 +2,7 @@ package com.gmail.nossr50.util.blockmeta; import com.gmail.nossr50.TestUtil; import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.util.BlockUtils; import com.gmail.nossr50.util.compat.CompatibilityManager; import com.gmail.nossr50.util.compat.layers.world.WorldCompatibilityLayer; import com.gmail.nossr50.util.platform.PlatformManager; @@ -97,6 +98,22 @@ public class ChunkStoreTest { } } } + + //Bot Block + TestBlock bottomBlock = new TestBlock(1337, 0, -1337, mockWorld); + Assert.assertFalse(hashChunkManager.isTrue(bottomBlock)); + + Assert.assertTrue(BlockUtils.isWithinWorldBounds(worldCompatibilityLayer, bottomBlock)); + hashChunkManager.setTrue(bottomBlock); + Assert.assertTrue(hashChunkManager.isTrue(bottomBlock)); + + //Top Block + TestBlock topBlock = new TestBlock(1337, 256, -1337, mockWorld); + Assert.assertFalse(hashChunkManager.isTrue(topBlock)); + + Assert.assertTrue(BlockUtils.isWithinWorldBounds(worldCompatibilityLayer, topBlock)); + hashChunkManager.setTrue(topBlock); + Assert.assertTrue(hashChunkManager.isTrue(topBlock)); } @Test From a844f2709386d01c3289c669678d91a4f428025e Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sun, 18 Apr 2021 17:28:27 -0700 Subject: [PATCH 524/662] Fix mistakes --- .../com/gmail/nossr50/util/BlockUtils.java | 2 +- .../util/blockmeta/ChunkStoreTest.java | 20 ++++++++++++++++--- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/util/BlockUtils.java b/src/main/java/com/gmail/nossr50/util/BlockUtils.java index 135025952..984ccbdaf 100644 --- a/src/main/java/com/gmail/nossr50/util/BlockUtils.java +++ b/src/main/java/com/gmail/nossr50/util/BlockUtils.java @@ -293,7 +293,7 @@ public final class BlockUtils { World world = block.getWorld(); //pretty sure both height and min height are able to have blocks placed on them - return block.getY() >= worldCompatibilityLayer.getMinWorldHeight(world) && block.getY() <= worldCompatibilityLayer.getMaxWorldHeight(world); + return block.getY() >= worldCompatibilityLayer.getMinWorldHeight(world) && block.getY() < worldCompatibilityLayer.getMaxWorldHeight(world); } } diff --git a/src/test/java/com/gmail/nossr50/util/blockmeta/ChunkStoreTest.java b/src/test/java/com/gmail/nossr50/util/blockmeta/ChunkStoreTest.java index b8e93d9cc..8876c99d6 100644 --- a/src/test/java/com/gmail/nossr50/util/blockmeta/ChunkStoreTest.java +++ b/src/test/java/com/gmail/nossr50/util/blockmeta/ChunkStoreTest.java @@ -40,6 +40,8 @@ import static org.mockito.Mockito.mock; @RunWith(PowerMockRunner.class) @PrepareForTest({ Bukkit.class, mcMMO.class}) public class ChunkStoreTest { + public static final int LEGACY_WORLD_HEIGHT_MAX = 256; + public static final int LEGACY_WORLD_HEIGHT_MIN = 0; private static File tempDir; @BeforeClass public static void setUpClass() { @@ -77,8 +79,20 @@ public class ChunkStoreTest { Mockito.when(platformManager.getCompatibilityManager()).thenReturn(compatibilityManager); Mockito.when(platformManager.getCompatibilityManager().getWorldCompatibilityLayer()).thenReturn(worldCompatibilityLayer); Assert.assertNotNull(mcMMO.getCompatibilityManager().getWorldCompatibilityLayer()); - Mockito.when(worldCompatibilityLayer.getMinWorldHeight(mockWorld)).thenReturn(0); - Mockito.when(worldCompatibilityLayer.getMaxWorldHeight(mockWorld)).thenReturn(255); + Mockito.when(worldCompatibilityLayer.getMinWorldHeight(mockWorld)).thenReturn(LEGACY_WORLD_HEIGHT_MIN); + Mockito.when(worldCompatibilityLayer.getMaxWorldHeight(mockWorld)).thenReturn(LEGACY_WORLD_HEIGHT_MAX); + } + + @Test(expected = IndexOutOfBoundsException.class) + public void testIndexOutOfBounds() { + Mockito.when(mcMMO.getCompatibilityManager().getWorldCompatibilityLayer().getMinWorldHeight(mockWorld)).thenReturn(-64); + HashChunkManager hashChunkManager = new HashChunkManager(); + + + //Top Block + TestBlock illegalHeightBlock = new TestBlock(1337, 256, -1337, mockWorld); + Assert.assertFalse(hashChunkManager.isTrue(illegalHeightBlock)); + hashChunkManager.setTrue(illegalHeightBlock); } @Test @@ -108,7 +122,7 @@ public class ChunkStoreTest { Assert.assertTrue(hashChunkManager.isTrue(bottomBlock)); //Top Block - TestBlock topBlock = new TestBlock(1337, 256, -1337, mockWorld); + TestBlock topBlock = new TestBlock(1337, 255, -1337, mockWorld); Assert.assertFalse(hashChunkManager.isTrue(topBlock)); Assert.assertTrue(BlockUtils.isWithinWorldBounds(worldCompatibilityLayer, topBlock)); From 317f966f73c2b2218bdc846ed6186475ac098e02 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sun, 18 Apr 2021 17:31:20 -0700 Subject: [PATCH 525/662] Fix comment Fixes #4496 --- src/main/java/com/gmail/nossr50/util/BlockUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gmail/nossr50/util/BlockUtils.java b/src/main/java/com/gmail/nossr50/util/BlockUtils.java index 984ccbdaf..dada7a1bf 100644 --- a/src/main/java/com/gmail/nossr50/util/BlockUtils.java +++ b/src/main/java/com/gmail/nossr50/util/BlockUtils.java @@ -292,7 +292,7 @@ public final class BlockUtils { public static boolean isWithinWorldBounds(@NotNull WorldCompatibilityLayer worldCompatibilityLayer, @NotNull Block block) { World world = block.getWorld(); - //pretty sure both height and min height are able to have blocks placed on them + //World min height = inclusive | World max height = exclusive return block.getY() >= worldCompatibilityLayer.getMinWorldHeight(world) && block.getY() < worldCompatibilityLayer.getMaxWorldHeight(world); } From aa562a4710bce1671804b3ecbd9e7bb55a3bf250 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sun, 18 Apr 2021 17:52:45 -0700 Subject: [PATCH 526/662] 2.1.194 --- Changelog.txt | 3 +++ pom.xml | 2 +- .../nossr50/database/SQLDatabaseManager.java | 24 ++++++++++++------- 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 0c88afb19..c1130eedf 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,4 +1,7 @@ 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) diff --git a/pom.xml b/pom.xml index 6cc309b22..95e3d1652 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.194-SNAPSHOT + 2.1.194 mcMMO https://github.com/mcMMO-Dev/mcMMO diff --git a/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java index 566a2e4f5..bdbed4983 100644 --- a/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java @@ -31,6 +31,7 @@ public final class SQLDatabaseManager implements DatabaseManager { 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<>(); @@ -44,6 +45,7 @@ public final class SQLDatabaseManager implements DatabaseManager { 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://" + mcMMO.p.getGeneralConfig().getMySQLServerName() @@ -60,10 +62,16 @@ public final class SQLDatabaseManager implements DatabaseManager { try { // Force driver to load if not yet loaded - Class.forName("com.mysql.jdbc.Driver"); - } - catch (ClassNotFoundException e) { - e.printStackTrace(); + 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. } @@ -71,7 +79,7 @@ public final class SQLDatabaseManager implements DatabaseManager { debug = mcMMO.p.getGeneralConfig().getMySQLDebug(); PoolProperties poolProperties = new PoolProperties(); - poolProperties.setDriverClassName("com.mysql.jdbc.Driver"); + poolProperties.setDriverClassName(driverPath); poolProperties.setUrl(connectionString); poolProperties.setUsername(mcMMO.p.getGeneralConfig().getMySQLUserName()); poolProperties.setPassword(mcMMO.p.getGeneralConfig().getMySQLUserPassword()); @@ -86,7 +94,7 @@ 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(mcMMO.p.getGeneralConfig().getMySQLUserName()); poolProperties.setPassword(mcMMO.p.getGeneralConfig().getMySQLUserPassword()); @@ -101,7 +109,7 @@ 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(mcMMO.p.getGeneralConfig().getMySQLUserName()); poolProperties.setPassword(mcMMO.p.getGeneralConfig().getMySQLUserPassword()); @@ -1018,7 +1026,7 @@ public final class SQLDatabaseManager implements DatabaseManager { break; case ADD_SQL_INDEXES: - checkUpgradeAddSQLIndexes(statement); +// checkUpgradeAddSQLIndexes(statement); break; case ADD_MOB_HEALTHBARS: From 77a7b9865966bdc7d46278cff8610909799994ad Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 19 Apr 2021 12:15:00 -0700 Subject: [PATCH 527/662] Dev mode --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 95e3d1652..9958e7d4c 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.194 + 2.1.195-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO From c8b1a171941fb1132164269849c2a7fc86edd6bc Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 19 Apr 2021 12:20:15 -0700 Subject: [PATCH 528/662] this should fix null connection error with MySQL Fixes #4497 --- .../java/com/gmail/nossr50/database/SQLDatabaseManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java index bdbed4983..dfa33b83f 100644 --- a/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java @@ -71,8 +71,8 @@ public final class SQLDatabaseManager implements DatabaseManager { e.printStackTrace(); ex.printStackTrace(); mcMMO.p.getLogger().severe("Neither driver found"); + return; } - return; //throw e; // aborts onEnable() Riking if you want to do this, fully implement it. } From 71edf0e9f4bcb6343eff91019fd17d0b1269c19e Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 19 Apr 2021 12:22:25 -0700 Subject: [PATCH 529/662] Update changelog --- Changelog.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Changelog.txt b/Changelog.txt index c1130eedf..2386f4465 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,6 @@ +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 From 9a4ec456adaefb92460dd1bd04f89f651b9aa4e0 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 19 Apr 2021 12:26:15 -0700 Subject: [PATCH 530/662] 2.1.195 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 9958e7d4c..401beec99 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.195-SNAPSHOT + 2.1.195 mcMMO https://github.com/mcMMO-Dev/mcMMO From 5416d1b36e2323117ad22d822b6d511fc649e0e4 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 19 Apr 2021 12:43:21 -0700 Subject: [PATCH 531/662] Add crossbows to enchantable items list --- Changelog.txt | 3 +++ pom.xml | 2 +- src/main/java/com/gmail/nossr50/util/MaterialMapStore.java | 1 + 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index 2386f4465..c5ecccd36 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,6 @@ +Version 2.1.196 + Crossbows can now be fished up with enchantments + Version 2.1.195 Fixed a null connection error which affected some SQL users diff --git a/pom.xml b/pom.xml index 401beec99..1c31c575e 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.195 + 2.1.196-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO diff --git a/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java b/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java index 04564574b..8395711a7 100644 --- a/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java +++ b/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java @@ -424,6 +424,7 @@ public class MaterialMapStore { enchantables.addAll(pickAxes); enchantables.addAll(tridents); enchantables.addAll(bows); + enchantables.addAll(crossbows); enchantables.add("shears"); enchantables.add("fishing_rod"); From 394e9e511013d7e73eb1737aaec1aff313b77ff1 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 19 Apr 2021 12:45:51 -0700 Subject: [PATCH 532/662] Update changelog --- Changelog.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Changelog.txt b/Changelog.txt index c5ecccd36..ffced64ac 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,6 +1,9 @@ Version 2.1.196 Crossbows can now be fished up with enchantments + NOTES: + Crossbows is not in the default fishing loot list, you'd have to add it yourself. + Version 2.1.195 Fixed a null connection error which affected some SQL users From 6d0fe4fb5803066c1f84451ce324550bc581e420 Mon Sep 17 00:00:00 2001 From: lexikiq Date: Tue, 20 Apr 2021 17:51:57 -0400 Subject: [PATCH 533/662] Add McMMOEntityDamageByRuptureEvent (#4498) --- .../fake/FakeEntityDamageByEntityEvent.java | 12 ++++---- .../McMMOEntityDamageByRuptureEvent.java | 23 +++++++++++++++ .../nossr50/listeners/EntityListener.java | 3 +- .../nossr50/runnables/skills/RuptureTask.java | 28 ++++++++++++------- 4 files changed, 49 insertions(+), 17 deletions(-) create mode 100644 src/main/java/com/gmail/nossr50/events/skills/rupture/McMMOEntityDamageByRuptureEvent.java 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 47a33199d..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; @@ -13,21 +13,21 @@ import java.util.Map; */ 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) { + @NotNull + public static EnumMap> getFunctionModifiers(@NotNull Map modifiers) { EnumMap> modifierFunctions = new EnumMap<>(DamageModifier.class); - Function ZERO = Functions.constant(-0.0); 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/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/listeners/EntityListener.java b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java index 9042e1286..56843cd35 100644 --- a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java @@ -8,6 +8,7 @@ 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.party.PartyManager; import com.gmail.nossr50.skills.archery.Archery; @@ -290,7 +291,7 @@ public class EntityListener implements Listener { */ @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) public void onEntityDamageByEntity(EntityDamageByEntityEvent event) { - if (event instanceof FakeEntityDamageByEntityEvent) { + if (event instanceof FakeEntityDamageByEntityEvent || event instanceof McMMOEntityDamageByRuptureEvent) { return; } diff --git a/src/main/java/com/gmail/nossr50/runnables/skills/RuptureTask.java b/src/main/java/com/gmail/nossr50/runnables/skills/RuptureTask.java index e740a3fcd..165ba9403 100644 --- a/src/main/java/com/gmail/nossr50/runnables/skills/RuptureTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/skills/RuptureTask.java @@ -1,6 +1,7 @@ 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.skills.ParticleEffectUtils; import com.google.common.base.Objects; @@ -45,18 +46,25 @@ public class RuptureTask extends BukkitRunnable { if(ruptureTick < expireTick) { //Is it time to damage? if(damageTickTracker >= DAMAGE_TICK_INTERVAL) { - damageTickTracker = 0; //Reset - ParticleEffectUtils.playBleedEffect(targetEntity); //Animate - if(targetEntity.getHealth() > 0.01) { - double healthBeforeRuptureIsApplied = targetEntity.getHealth(); - double damagedHealth = healthBeforeRuptureIsApplied - calculateAdjustedTickDamage(); + damageTickTracker = 0; //Reset timer + double healthBeforeRuptureIsApplied = targetEntity.getHealth(); - if(damagedHealth <= 0) { - mcMMO.p.getLogger().severe("DEBUG: Miscalculating Rupture tick damage"); - } else { - targetEntity.setHealth(damagedHealth); //Hurt entity without the unwanted side effects of damage() - } + //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; + + ParticleEffectUtils.playBleedEffect(targetEntity); //Animate + double damagedHealth = healthBeforeRuptureIsApplied - damage; + + targetEntity.setHealth(damagedHealth); //Hurt entity without the unwanted side effects of damage()} } } } else { From 9b4070d971bad8dd75999ee8211a2864ce7622c4 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 23 Apr 2021 10:20:20 -0700 Subject: [PATCH 534/662] Don't process null McMMOPlayer events Fixes #4499 --- Changelog.txt | 1 + .../com/gmail/nossr50/listeners/SelfListener.java | 12 ++++++++++++ 2 files changed, 13 insertions(+) diff --git a/Changelog.txt b/Changelog.txt index ffced64ac..1a6078a78 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,4 +1,5 @@ Version 2.1.196 + Fixed a possible null error for our SelfListener Crossbows can now be fished up with enchantments NOTES: diff --git a/src/main/java/com/gmail/nossr50/listeners/SelfListener.java b/src/main/java/com/gmail/nossr50/listeners/SelfListener.java index 2e21d3b72..0fe8eec9f 100644 --- a/src/main/java/com/gmail/nossr50/listeners/SelfListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/SelfListener.java @@ -33,6 +33,13 @@ public class SelfListener implements Listener { public void onPlayerLevelUp(McMMOPlayerLevelUpEvent event) { Player player = event.getPlayer(); PrimarySkillType skill = event.getSkill(); + + McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); + + //TODO: Handle proper validation at the event level + if(mcMMOPlayer == null || !mcMMOPlayer.getProfile().isLoaded()) + return; + if(player.isOnline()) { //Players can gain multiple levels especially during xprate events for(int i = 0; i < event.getLevelsGained(); i++) @@ -73,6 +80,11 @@ public class SelfListener implements Listener { 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()) { From 95c291d630b5ebe7c82078ae64e95714a50d8bf7 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 23 Apr 2021 10:30:26 -0700 Subject: [PATCH 535/662] Avoid the pitfalls of implementing an everchanging interface from a SNAPSHOT --- .../util/blockmeta/ChunkStoreTest.java | 300 ++---------------- 1 file changed, 19 insertions(+), 281 deletions(-) diff --git a/src/test/java/com/gmail/nossr50/util/blockmeta/ChunkStoreTest.java b/src/test/java/com/gmail/nossr50/util/blockmeta/ChunkStoreTest.java index 8876c99d6..7e8f542c6 100644 --- a/src/test/java/com/gmail/nossr50/util/blockmeta/ChunkStoreTest.java +++ b/src/test/java/com/gmail/nossr50/util/blockmeta/ChunkStoreTest.java @@ -87,10 +87,9 @@ public class ChunkStoreTest { public void testIndexOutOfBounds() { Mockito.when(mcMMO.getCompatibilityManager().getWorldCompatibilityLayer().getMinWorldHeight(mockWorld)).thenReturn(-64); HashChunkManager hashChunkManager = new HashChunkManager(); - - + //Top Block - TestBlock illegalHeightBlock = new TestBlock(1337, 256, -1337, mockWorld); + Block illegalHeightBlock = initMockBlock(1337, 256, -1337); Assert.assertFalse(hashChunkManager.isTrue(illegalHeightBlock)); hashChunkManager.setTrue(illegalHeightBlock); } @@ -104,7 +103,8 @@ public class ChunkStoreTest { for(int x = -radius; x <= radius; x++) { for(int y = mockWorld.getMinHeight(); y < mockWorld.getMaxHeight(); y++) { for(int z = -radius; z <= radius; z++) { - TestBlock testBlock = new TestBlock(x, y, z, mockWorld); + Block testBlock = initMockBlock(x, y, z); + hashChunkManager.setTrue(testBlock); Assert.assertTrue(hashChunkManager.isTrue(testBlock)); hashChunkManager.setFalse(testBlock); @@ -114,7 +114,7 @@ public class ChunkStoreTest { } //Bot Block - TestBlock bottomBlock = new TestBlock(1337, 0, -1337, mockWorld); + Block bottomBlock = initMockBlock(1337, 0, -1337); Assert.assertFalse(hashChunkManager.isTrue(bottomBlock)); Assert.assertTrue(BlockUtils.isWithinWorldBounds(worldCompatibilityLayer, bottomBlock)); @@ -122,7 +122,7 @@ public class ChunkStoreTest { Assert.assertTrue(hashChunkManager.isTrue(bottomBlock)); //Top Block - TestBlock topBlock = new TestBlock(1337, 255, -1337, mockWorld); + Block topBlock = initMockBlock(1337, 255, -1337); Assert.assertFalse(hashChunkManager.isTrue(topBlock)); Assert.assertTrue(BlockUtils.isWithinWorldBounds(worldCompatibilityLayer, topBlock)); @@ -270,9 +270,9 @@ public class ChunkStoreTest { } private interface Delegate { + void run(); } - private void assertThrows(@NotNull Delegate delegate, @NotNull Class clazz) { try { delegate.run(); @@ -315,6 +315,7 @@ public class ChunkStoreTest { } public static class LegacyChunkStore implements ChunkStore, Serializable { + private static final long serialVersionUID = -1L; transient private boolean dirty = false; public boolean[][][] store; @@ -323,7 +324,6 @@ public class ChunkStoreTest { 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; @@ -425,13 +425,13 @@ public class ChunkStoreTest { 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 @@ -439,277 +439,15 @@ public class ChunkStoreTest { str = "com.gmail.nossr50.util.blockmeta.chunkmeta.PrimitiveChunkStore"; super.writeUTF(str); } + } - - private class TestBlock implements Block { - - private final int x, y, z; - private final @NotNull World world; - - private TestBlock(int x, int y, int z, World world) { - this.x = x; - this.y = y; - this.z = z; - this.world = world; - } - - @Override - public byte getData() { - return 0; - } - - @NotNull - @Override - public BlockData getBlockData() { - return null; - } - - @NotNull - @Override - public Block getRelative(int modX, int modY, int modZ) { - return null; - } - - @NotNull - @Override - public Block getRelative(@NotNull BlockFace face) { - return null; - } - - @NotNull - @Override - public Block getRelative(@NotNull BlockFace face, int distance) { - return null; - } - - @NotNull - @Override - public Material getType() { - return null; - } - - @Override - public byte getLightLevel() { - return 0; - } - - @Override - public byte getLightFromSky() { - return 0; - } - - @Override - public byte getLightFromBlocks() { - return 0; - } - - @NotNull - @Override - public World getWorld() { - return world; - } - - @Override - public int getX() { - return x; - } - - @Override - public int getY() { - return y; - } - - @Override - public int getZ() { - return z; - } - - @NotNull - @Override - public Location getLocation() { - return null; - } - - @Nullable - @Override - public Location getLocation(@Nullable Location loc) { - return null; - } - - @NotNull - @Override - public Chunk getChunk() { - return null; - } - - @Override - public void setBlockData(@NotNull BlockData data) { - - } - - @Override - public void setBlockData(@NotNull BlockData data, boolean applyPhysics) { - - } - - @Override - public void setType(@NotNull Material type) { - - } - - @Override - public void setType(@NotNull Material type, boolean applyPhysics) { - - } - - @Nullable - @Override - public BlockFace getFace(@NotNull Block block) { - return null; - } - - @NotNull - @Override - public BlockState getState() { - return null; - } - - @NotNull - @Override - public Biome getBiome() { - return null; - } - - @Override - public void setBiome(@NotNull Biome bio) { - - } - - @Override - public boolean isBlockPowered() { - return false; - } - - @Override - public boolean isBlockIndirectlyPowered() { - return false; - } - - @Override - public boolean isBlockFacePowered(@NotNull BlockFace face) { - return false; - } - - @Override - public boolean isBlockFaceIndirectlyPowered(@NotNull BlockFace face) { - return false; - } - - @Override - public int getBlockPower(@NotNull BlockFace face) { - return 0; - } - - @Override - public int getBlockPower() { - return 0; - } - - @Override - public boolean isEmpty() { - return false; - } - - @Override - public boolean isLiquid() { - return false; - } - - @Override - public double getTemperature() { - return 0; - } - - @Override - public double getHumidity() { - return 0; - } - - @NotNull - @Override - public PistonMoveReaction getPistonMoveReaction() { - return null; - } - - @Override - public boolean breakNaturally() { - return false; - } - - @Override - public boolean breakNaturally(@Nullable ItemStack tool) { - return false; - } - - @Override - public boolean applyBoneMeal(@NotNull BlockFace face) { - return false; - } - - @NotNull - @Override - public Collection getDrops() { - return null; - } - - @NotNull - @Override - public Collection getDrops(@Nullable ItemStack tool) { - return null; - } - - @NotNull - @Override - public Collection getDrops(@NotNull ItemStack tool, @Nullable Entity entity) { - return null; - } - - @Override - public boolean isPassable() { - return false; - } - - @Nullable - @Override - public RayTraceResult rayTrace(@NotNull Location start, @NotNull Vector direction, double maxDistance, @NotNull FluidCollisionMode fluidCollisionMode) { - return null; - } - - @NotNull - @Override - public BoundingBox getBoundingBox() { - return null; - } - - @Override - public void setMetadata(@NotNull String metadataKey, @NotNull MetadataValue newMetadataValue) { - - } - - @NotNull - @Override - public List getMetadata(@NotNull String metadataKey) { - return null; - } - - @Override - public boolean hasMetadata(@NotNull String metadataKey) { - return false; - } - - @Override - public void removeMetadata(@NotNull String metadataKey, @NotNull Plugin owningPlugin) { - - } + @NotNull + private Block initMockBlock(int x, int y, int z) { + Block testBlock = mock(Block.class); + Mockito.when(testBlock.getX()).thenReturn(x); + Mockito.when(testBlock.getY()).thenReturn(y); + Mockito.when(testBlock.getZ()).thenReturn(z); + Mockito.when(testBlock.getWorld()).thenReturn(mockWorld); + return testBlock; } } From 9e7bb12dc3bb52dacf701a6a021fb849e3861c4e Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 23 Apr 2021 10:34:00 -0700 Subject: [PATCH 536/662] Also avoid issues in this test by mocking instead of implementing an ever changing interface --- .../database/FlatFileDatabaseManagerTest.java | 189 ++---------------- 1 file changed, 12 insertions(+), 177 deletions(-) diff --git a/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java b/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java index 62d13f69a..ca1ca9841 100644 --- a/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java +++ b/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java @@ -13,6 +13,7 @@ import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.OfflinePlayer; import org.bukkit.Statistic; +import org.bukkit.block.Block; import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; @@ -21,6 +22,7 @@ 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; @@ -34,6 +36,7 @@ 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 public class FlatFileDatabaseManagerTest { @@ -395,16 +398,16 @@ public class FlatFileDatabaseManagerTest { String playerName = "nossr50"; UUID uuid = UUID.fromString("588fe472-1c82-4c4e-9aa1-7eefccb277e3"); - TestOfflinePlayer player = new TestOfflinePlayer(playerName, uuid); + Player player = initMockPlayer(playerName, uuid); PlayerProfile profile1 = db.loadPlayerProfile(player); testHealthyDataProfileValues(playerName, uuid, profile1); String updatedName = "updatedName"; - TestOfflinePlayer updatedNamePlayer = new TestOfflinePlayer(updatedName, uuid); + Player updatedNamePlayer = initMockPlayer(updatedName, uuid); PlayerProfile updatedNameProfile = db.loadPlayerProfile(updatedNamePlayer); testHealthyDataProfileValues(updatedName, uuid, updatedNameProfile); - TestOfflinePlayer shouldNotExist = new TestOfflinePlayer("doesntexist", new UUID(0, 1)); + Player shouldNotExist = initMockPlayer("doesntexist", new UUID(0, 1)); PlayerProfile profile3 = db.loadPlayerProfile(shouldNotExist); assertFalse(profile3.isLoaded()); } @@ -833,180 +836,12 @@ public class FlatFileDatabaseManagerTest { assertTrue(dataFlags.contains(flag)); } - private class TestOfflinePlayer implements OfflinePlayer { - - private final @NotNull String name; - private final @NotNull UUID uuid; - - private TestOfflinePlayer(@NotNull String name, @NotNull UUID uuid) { - this.name = name; - this.uuid = uuid; - } - - @Override - public boolean isOnline() { - return false; - } - - @Nullable - @Override - public String getName() { - return name; - } - - @NotNull - @Override - public UUID getUniqueId() { - return uuid; - } - - @Override - public boolean isBanned() { - return false; - } - - @Override - public boolean isWhitelisted() { - return false; - } - - @Override - public void setWhitelisted(boolean value) { - - } - - @Nullable - @Override - public Player getPlayer() { - return null; - } - - @Override - public long getFirstPlayed() { - return 0; - } - - @Override - public long getLastPlayed() { - return 0; - } - - @Override - public boolean hasPlayedBefore() { - return false; - } - - @Nullable - @Override - public Location getBedSpawnLocation() { - return null; - } - - @Override - public void incrementStatistic(@NotNull Statistic statistic) throws IllegalArgumentException { - - } - - @Override - public void decrementStatistic(@NotNull Statistic statistic) throws IllegalArgumentException { - - } - - @Override - public void incrementStatistic(@NotNull Statistic statistic, int amount) throws IllegalArgumentException { - - } - - @Override - public void decrementStatistic(@NotNull Statistic statistic, int amount) throws IllegalArgumentException { - - } - - @Override - public void setStatistic(@NotNull Statistic statistic, int newValue) throws IllegalArgumentException { - - } - - @Override - public int getStatistic(@NotNull Statistic statistic) throws IllegalArgumentException { - return 0; - } - - @Override - public void incrementStatistic(@NotNull Statistic statistic, @NotNull Material material) throws IllegalArgumentException { - - } - - @Override - public void decrementStatistic(@NotNull Statistic statistic, @NotNull Material material) throws IllegalArgumentException { - - } - - @Override - public int getStatistic(@NotNull Statistic statistic, @NotNull Material material) throws IllegalArgumentException { - return 0; - } - - @Override - public void incrementStatistic(@NotNull Statistic statistic, @NotNull Material material, int amount) throws IllegalArgumentException { - - } - - @Override - public void decrementStatistic(@NotNull Statistic statistic, @NotNull Material material, int amount) throws IllegalArgumentException { - - } - - @Override - public void setStatistic(@NotNull Statistic statistic, @NotNull Material material, int newValue) throws IllegalArgumentException { - - } - - @Override - public void incrementStatistic(@NotNull Statistic statistic, @NotNull EntityType entityType) throws IllegalArgumentException { - - } - - @Override - public void decrementStatistic(@NotNull Statistic statistic, @NotNull EntityType entityType) throws IllegalArgumentException { - - } - - @Override - public int getStatistic(@NotNull Statistic statistic, @NotNull EntityType entityType) throws IllegalArgumentException { - return 0; - } - - @Override - public void incrementStatistic(@NotNull Statistic statistic, @NotNull EntityType entityType, int amount) throws IllegalArgumentException { - - } - - @Override - public void decrementStatistic(@NotNull Statistic statistic, @NotNull EntityType entityType, int amount) { - - } - - @Override - public void setStatistic(@NotNull Statistic statistic, @NotNull EntityType entityType, int newValue) { - - } - - @NotNull - @Override - public Map serialize() { - return null; - } - - @Override - public boolean isOp() { - return false; - } - - @Override - public void setOp(boolean value) { - - } + @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 { From e4b8b749873f931ae49420c14b45190346731ba4 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 23 Apr 2021 10:37:22 -0700 Subject: [PATCH 537/662] Optimize imports --- .../database/FlatFileDatabaseManagerTest.java | 7 ------- .../nossr50/util/blockmeta/ChunkStoreTest.java | 16 +++------------- 2 files changed, 3 insertions(+), 20 deletions(-) diff --git a/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java b/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java index ca1ca9841..17183de34 100644 --- a/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java +++ b/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java @@ -9,12 +9,6 @@ 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.Location; -import org.bukkit.Material; -import org.bukkit.OfflinePlayer; -import org.bukkit.Statistic; -import org.bukkit.block.Block; -import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -845,7 +839,6 @@ public class FlatFileDatabaseManagerTest { } private static class DebugFilter implements Filter { - @Override public boolean isLoggable(LogRecord record) { return false; diff --git a/src/test/java/com/gmail/nossr50/util/blockmeta/ChunkStoreTest.java b/src/test/java/com/gmail/nossr50/util/blockmeta/ChunkStoreTest.java index 7e8f542c6..6b2236e69 100644 --- a/src/test/java/com/gmail/nossr50/util/blockmeta/ChunkStoreTest.java +++ b/src/test/java/com/gmail/nossr50/util/blockmeta/ChunkStoreTest.java @@ -7,18 +7,10 @@ import com.gmail.nossr50.util.compat.CompatibilityManager; import com.gmail.nossr50.util.compat.layers.world.WorldCompatibilityLayer; import com.gmail.nossr50.util.platform.PlatformManager; import com.google.common.io.Files; -import org.bukkit.*; -import org.bukkit.block.*; -import org.bukkit.block.data.BlockData; -import org.bukkit.entity.Entity; -import org.bukkit.inventory.ItemStack; -import org.bukkit.metadata.MetadataValue; -import org.bukkit.plugin.Plugin; -import org.bukkit.util.BoundingBox; -import org.bukkit.util.RayTraceResult; -import org.bukkit.util.Vector; +import org.bukkit.Bukkit; +import org.bukkit.World; +import org.bukkit.block.Block; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import org.junit.*; import org.junit.runner.RunWith; import org.mockito.Mockito; @@ -28,8 +20,6 @@ import org.powermock.modules.junit4.PowerMockRunner; import org.powermock.reflect.Whitebox; import java.io.*; -import java.util.Collection; -import java.util.List; import java.util.UUID; import static org.mockito.Mockito.mock; From 989f7fd51b9908f2692dd2090126beacffc74779 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 23 Apr 2021 10:45:19 -0700 Subject: [PATCH 538/662] Fix Serrated Strikes not processing Rupture for additional targets --- Changelog.txt | 1 + src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index 1a6078a78..b94e0b445 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,4 +1,5 @@ Version 2.1.196 + Fixed a bug where Rupture never applied to additional targets during Serrated Strikes Fixed a possible null error for our SelfListener Crossbows can now be fished up with enchantments 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 934a3e07b..0de739abe 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java @@ -712,7 +712,7 @@ public final class CombatUtils { NotificationManager.sendPlayerInformation((Player)entity, NotificationType.SUBSKILL_MESSAGE, "Swords.Combat.SS.Struck"); } - UserManager.getPlayer(attacker).getSwordsManager().processRupture(target); + UserManager.getPlayer(attacker).getSwordsManager().processRupture(livingEntity); break; case AXES: From d67c561fed2d355baa2c7eea5e2cc61ce977e8b3 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 23 Apr 2021 10:46:59 -0700 Subject: [PATCH 539/662] Update changelog --- Changelog.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/Changelog.txt b/Changelog.txt index b94e0b445..489929118 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -2,6 +2,7 @@ Version 2.1.196 Fixed a bug where Rupture never applied to additional targets during Serrated Strikes Fixed a possible null error for our SelfListener Crossbows can now be fished up with enchantments + (API) Added McMMOEntityDamageByRuptureEvent (thanks qixils) NOTES: Crossbows is not in the default fishing loot list, you'd have to add it yourself. From f983f9596150bf1ac2a1456a65e37946c258661a Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 23 Apr 2021 11:13:59 -0700 Subject: [PATCH 540/662] Remove explosion from rupture, and rupture bug fixes and other tweaks --- Changelog.txt | 7 ++++ .../commands/skills/SwordsCommand.java | 4 +- .../nossr50/datatypes/player/McMMOPlayer.java | 6 +-- .../nossr50/listeners/PlayerListener.java | 27 ++++++------ .../nossr50/runnables/skills/RuptureTask.java | 42 +++++++++++-------- .../nossr50/skills/swords/SwordsManager.java | 7 ++-- .../nossr50/util/skills/CombatUtils.java | 4 +- .../resources/locale/locale_en_US.properties | 4 +- 8 files changed, 57 insertions(+), 44 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 489929118..de6f23d8a 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,11 +1,18 @@ 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: + 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 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 83e0264c0..954c39024 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/SwordsCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/SwordsCommand.java @@ -91,9 +91,9 @@ public class SwordsCommand extends SkillCommand { ruptureLengthSecondsAgainstMobs)); 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.SubSkill.Rupture.Stat.ExplosionDamage", ruptureExplosionDamageAgainstPlayers, ruptureExplosionDamageAgainstMobs)); - messages.add(LocaleLoader.getString("Swords.Combat.Rupture.Note")); + messages.add(LocaleLoader.getString("Swords.Combat.Rupture.Note.Update.One")); } if (canSerratedStrike) { 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 c68521e10..609b4012d 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java +++ b/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java @@ -1141,9 +1141,9 @@ public class McMMOPlayer implements Identified { RuptureTaskMeta ruptureTaskMeta = (RuptureTaskMeta) getPlayer().getMetadata(mcMMO.RUPTURE_META_KEY).get(0); //Punish a logout - ruptureTaskMeta.getRuptureTimerTask().explode(); - ruptureTaskMeta.getRuptureTimerTask().explode(); - ruptureTaskMeta.getRuptureTimerTask().explode(); + ruptureTaskMeta.getRuptureTimerTask().endRupture(); + ruptureTaskMeta.getRuptureTimerTask().endRupture(); + ruptureTaskMeta.getRuptureTimerTask().endRupture(); } cleanup(); diff --git a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java index 40c57adf7..0ffa69824 100644 --- a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java @@ -832,23 +832,24 @@ 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; + } + } + if (herbalismManager.canGreenThumbBlock(blockState)) { //call event for Green Thumb Block if(!EventUtils.callSubSkillBlockEvent(player, SubSkillType.HERBALISM_GREEN_THUMB, block).isCancelled()) { diff --git a/src/main/java/com/gmail/nossr50/runnables/skills/RuptureTask.java b/src/main/java/com/gmail/nossr50/runnables/skills/RuptureTask.java index 165ba9403..b38d77842 100644 --- a/src/main/java/com/gmail/nossr50/runnables/skills/RuptureTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/skills/RuptureTask.java @@ -7,13 +7,13 @@ 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.metadata.FixedMetadataValue; 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 = 2; private final @NotNull McMMOPlayer ruptureSource; private final @NotNull LivingEntity targetEntity; @@ -21,8 +21,9 @@ public class RuptureTask extends BukkitRunnable { private int ruptureTick; private int damageTickTracker; - private final double pureTickDamage; //TODO: Make configurable - private final double explosionDamage; //TODO: Make configurable + 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; @@ -31,6 +32,7 @@ public class RuptureTask extends BukkitRunnable { this.ruptureTick = 0; this.damageTickTracker = 0; + this.animationTick = ANIMATION_TICK_INTERVAL; //Play an animation right away this.pureTickDamage = pureTickDamage; this.explosionDamage = explosionDamage; } @@ -61,14 +63,20 @@ public class RuptureTask extends BukkitRunnable { if (event.isCancelled() || damage <= 0 || healthBeforeRuptureIsApplied - damage <= 0) return; - ParticleEffectUtils.playBleedEffect(targetEntity); //Animate + if(animationTick >= ANIMATION_TICK_INTERVAL) { + ParticleEffectUtils.playBleedEffect(targetEntity); //Animate + animationTick = 0; + } else { + animationTick++; + } + double damagedHealth = healthBeforeRuptureIsApplied - damage; targetEntity.setHealth(damagedHealth); //Hurt entity without the unwanted side effects of damage()} } } } else { - explode(); + endRupture(); } } else { targetEntity.removeMetadata(mcMMO.RUPTURE_META_KEY, mcMMO.p); @@ -81,18 +89,18 @@ public class RuptureTask extends BukkitRunnable { ruptureTick = 0; } - public void explode() { - 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); + 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); this.cancel(); //Task no longer needed } 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 b3a194d00..871f72ef1 100644 --- a/src/main/java/com/gmail/nossr50/skills/swords/SwordsManager.java +++ b/src/main/java/com/gmail/nossr50/skills/swords/SwordsManager.java @@ -63,6 +63,9 @@ public class SwordsManager extends SkillManager { * @param target The defending entity */ public void processRupture(@NotNull LivingEntity target) { + if(!canUseRupture()) + return; + if(target.hasMetadata(mcMMO.RUPTURE_META_KEY)) { RuptureTaskMeta ruptureTaskMeta = (RuptureTaskMeta) target.getMetadata(mcMMO.RUPTURE_META_KEY).get(0); @@ -134,10 +137,6 @@ public class SwordsManager extends SkillManager { return 1; } - public int getRuptureBleedTicks(boolean isTargetPlayer) { - return mcMMO.p.getAdvancedConfig().getRuptureDurationSeconds(isTargetPlayer) / RuptureTask.DAMAGE_TICK_INTERVAL; - } - /** * Handle the effects of the Counter Attack ability * 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 0de739abe..f51c876df 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java @@ -93,9 +93,7 @@ public final class CombatUtils { } if(target.getHealth() - event.getFinalDamage() > 0) { - if (swordsManager.canUseRupture()) { - swordsManager.processRupture(target); - } + swordsManager.processRupture(target); } //Add Stab Damage diff --git a/src/main/resources/locale/locale_en_US.properties b/src/main/resources/locale/locale_en_US.properties index 7d827f50e..5b32d2649 100644 --- a/src/main/resources/locale/locale_en_US.properties +++ b/src/main/resources/locale/locale_en_US.properties @@ -406,7 +406,7 @@ Anvil.Unbreakable=This item is unbreakable! #SWORDS Swords.Ability.Lower=&7You lower your sword. Swords.Ability.Ready=&3You &6ready&3 your Sword. -Swords.Combat.Rupture.Note=&7(Rupture Note): Periodic damage is non-lethal occuring twice a second and bypasses armor, explosion damage is lethal and does not bypass armor/resistances +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** @@ -944,7 +944,7 @@ Guides.Salvage.Section.4=&3How does Arcane Salvage work?\n&eThis ability allows Guides.Smelting.Section.0=Coming soon... ##Swords 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.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 From da1fcfe30a1d36ad7200645ddc887310dee38921 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 23 Apr 2021 11:26:35 -0700 Subject: [PATCH 541/662] 2.1.196 --- Changelog.txt | 1 + pom.xml | 2 +- .../nossr50/runnables/skills/RuptureTask.java | 64 ++++++++++++------- 3 files changed, 42 insertions(+), 25 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index de6f23d8a..720bcc707 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -10,6 +10,7 @@ Version 2.1.196 (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 diff --git a/pom.xml b/pom.xml index 1c31c575e..e53d470e9 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.196-SNAPSHOT + 2.1.196 mcMMO https://github.com/mcMMO-Dev/mcMMO diff --git a/src/main/java/com/gmail/nossr50/runnables/skills/RuptureTask.java b/src/main/java/com/gmail/nossr50/runnables/skills/RuptureTask.java index b38d77842..29c6d6e5b 100644 --- a/src/main/java/com/gmail/nossr50/runnables/skills/RuptureTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/skills/RuptureTask.java @@ -13,7 +13,7 @@ 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 = 2; + public static final int ANIMATION_TICK_INTERVAL = 1; private final @NotNull McMMOPlayer ruptureSource; private final @NotNull LivingEntity targetEntity; @@ -44,38 +44,22 @@ public class RuptureTask extends BukkitRunnable { 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 - double healthBeforeRuptureIsApplied = targetEntity.getHealth(); + if (applyRupture()) return; - //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; - - if(animationTick >= ANIMATION_TICK_INTERVAL) { - ParticleEffectUtils.playBleedEffect(targetEntity); //Animate - animationTick = 0; - } else { - animationTick++; - } - - double damagedHealth = healthBeforeRuptureIsApplied - damage; - - targetEntity.setHealth(damagedHealth); //Hurt entity without the unwanted side effects of damage()} - } + playAnimation(); } } else { + if(!applyRupture()) { + playAnimation(); + } + endRupture(); } } else { @@ -84,6 +68,38 @@ public class RuptureTask extends BukkitRunnable { } } + 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; From 0d2f370185d8f6a0ce86bb857fa0ed46742950e8 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 23 Apr 2021 15:08:57 -0700 Subject: [PATCH 542/662] Update our dependencies to their latest versions (where possibly) Also adds Guava as a dependency as version upgrading our dependencies resulted in the loss of the included Guava libraries --- pom.xml | 50 ++++++++----------- .../gmail/nossr50/util/skills/SkillTools.java | 2 +- src/test/java/com/gmail/nossr50/TestUtil.java | 17 ------- .../database/FlatFileDatabaseManagerTest.java | 13 ++++- .../util/blockmeta/ChunkStoreTest.java | 12 ++++- 5 files changed, 44 insertions(+), 50 deletions(-) delete mode 100644 src/test/java/com/gmail/nossr50/TestUtil.java diff --git a/pom.xml b/pom.xml index e53d470e9..cd3fddb4a 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.196 + 2.1.197-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO @@ -145,11 +145,10 @@ co.aikar:acf-bukkit - net.kyori.examination - com.gmail.nossr50.kyori.examination + com.gmail.nossr50.mcmmo.kyori.examination net.kyori.adventure @@ -223,24 +222,13 @@ - - - - - - - - - - - - - com.github.seeseemelk - MockBukkit-v1.16 - 0.25.0 - test - + + + + + + co.aikar acf-bukkit @@ -313,7 +301,7 @@ com.sk89q.worldguard worldguard-core - 7.0.1-SNAPSHOT + 7.0.4 @@ -337,13 +325,13 @@ org.junit.jupiter junit-jupiter-api - 5.7.1 + 5.8.0-M1 test org.junit.jupiter junit-jupiter-engine - 5.7.1 + 5.8.0-M1 test @@ -355,31 +343,37 @@ org.powermock powermock-module-junit4 - 2.0.7 + 2.0.9 test org.powermock powermock-api-mockito2 - 2.0.7 + 2.0.9 test org.mockito mockito-core - 3.8.0 + 3.9.0 test org.apache.tomcat tomcat-jdbc - 7.0.52 + 10.0.5 compile org.jetbrains annotations - 19.0.0 + 20.1.0 + + + com.google.guava + guava + 29.0-jre + compile diff --git a/src/main/java/com/gmail/nossr50/util/skills/SkillTools.java b/src/main/java/com/gmail/nossr50/util/skills/SkillTools.java index 8d50873c5..c8f88e65f 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/SkillTools.java +++ b/src/main/java/com/gmail/nossr50/util/skills/SkillTools.java @@ -10,7 +10,6 @@ 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.annotations.VisibleForTesting; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; @@ -18,6 +17,7 @@ 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.*; diff --git a/src/test/java/com/gmail/nossr50/TestUtil.java b/src/test/java/com/gmail/nossr50/TestUtil.java deleted file mode 100644 index 341bf4fc0..000000000 --- a/src/test/java/com/gmail/nossr50/TestUtil.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.gmail.nossr50; - -import org.jetbrains.annotations.NotNull; - -import java.io.File; - -//TODO: Move generic test stuff here -public class TestUtil { - 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/database/FlatFileDatabaseManagerTest.java b/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java index 17183de34..cd1cd6f54 100644 --- a/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java +++ b/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java @@ -1,6 +1,5 @@ package com.gmail.nossr50.database; -import com.gmail.nossr50.TestUtil; import com.gmail.nossr50.database.flatfile.LeaderboardStatus; import com.gmail.nossr50.datatypes.database.DatabaseType; import com.gmail.nossr50.datatypes.player.PlayerProfile; @@ -86,7 +85,7 @@ public class FlatFileDatabaseManagerTest { @AfterEach public void tearDown() { - TestUtil.recursiveDelete(tempDir); + recursiveDelete(tempDir); db = null; } @@ -844,4 +843,14 @@ public class FlatFileDatabaseManagerTest { 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/util/blockmeta/ChunkStoreTest.java b/src/test/java/com/gmail/nossr50/util/blockmeta/ChunkStoreTest.java index 6b2236e69..774b55f8d 100644 --- a/src/test/java/com/gmail/nossr50/util/blockmeta/ChunkStoreTest.java +++ b/src/test/java/com/gmail/nossr50/util/blockmeta/ChunkStoreTest.java @@ -1,6 +1,5 @@ package com.gmail.nossr50.util.blockmeta; -import com.gmail.nossr50.TestUtil; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.BlockUtils; import com.gmail.nossr50.util.compat.CompatibilityManager; @@ -40,7 +39,7 @@ public class ChunkStoreTest { @AfterClass public static void tearDownClass() { - TestUtil.recursiveDelete(tempDir); + recursiveDelete(tempDir); } private World mockWorld; @@ -440,4 +439,13 @@ public class ChunkStoreTest { Mockito.when(testBlock.getWorld()).thenReturn(mockWorld); return testBlock; } + + public static void recursiveDelete(@NotNull File directoryToBeDeleted) { + if (directoryToBeDeleted.isDirectory()) { + for (File file : directoryToBeDeleted.listFiles()) { + recursiveDelete(file); + } + } + directoryToBeDeleted.delete(); + } } From 882f6197c63f3f30ddc9454e47e96601de22dd7b Mon Sep 17 00:00:00 2001 From: snake Date: Tue, 1 Jun 2021 00:34:18 +0900 Subject: [PATCH 543/662] Update locale_ja_JP.propaties (#4529) * Update locale_ja_JP.propaties * Escape non-ASCII characters --- src/main/resources/locale/locale_ja_JP.properties | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/main/resources/locale/locale_ja_JP.properties b/src/main/resources/locale/locale_ja_JP.properties index 27105a6b1..5b4aa1f9c 100644 --- a/src/main/resources/locale/locale_ja_JP.properties +++ b/src/main/resources/locale/locale_ja_JP.properties @@ -128,7 +128,8 @@ XPBar.Woodcutting=\u6728\u3053\u308a 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 ### +# 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 @@ -442,7 +443,9 @@ 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\u306e\u78ba\u7387 -Swords.SubSkill.Rupture.Stat.Extra=\u7834\u88c2: &a{0} ticks [{1} DMG vs Player] [{2} DMG vs Mobs] +Swords.SubSkill.Rupture.Stat.Extra=&3\u7834\u88c2: &e{0}s&a vs \u30d7\u30ec\u30a4\u30e4\u30fc, &e{1}s&a vs Mobs. +Swords.SubSkill.Rupture.Stat.TickDamage=&3\u7834\u88c2\u306e\u30c6\u30a3\u30c3\u30af\u3042\u305f\u308a\u306e\u30c0\u30e1\u30fc\u30b8: &e{0}&a vs \u30d7\u30ec\u30a4\u30e4\u30fc, &e{1}&a vs Mobs. +Swords.SubSkill.Rupture.Stat.ExplosionDamage=&3\u7834\u88c2\u306e\u7206\u767a\u30c0\u30e1\u30fc\u30b8: &e{0}&a vs \u30d7\u30ec\u30a4\u30e4\u30fc, &e{1}&a vs Mobs Swords.Effect.4=\u30bb\u30ec\u30fc\u30b7\u30e7\u30f3\u30b9\u30c8\u30e9\u30a4\u30af\u306e\u7834\u88c2+ Swords.Effect.5={0} Tick \u7834\u88c2 Swords.Listener=\u5263: @@ -536,9 +539,9 @@ 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=&a**\u30d0\u30fc\u30b5\u30fc\u30ab\u30fc \u30a2\u30af\u30c6\u30a3\u30d9\u30fc\u30c8** -Unarmed.Skills.Berserk.Refresh=&e\u30d0\u30fc\u30b5\u30fc\u30ab\u30fc &a\u30a2\u30d3\u30ea\u30c6\u30a3\u304c\u56de\u5fa9\u3057\u307e\u3057\u305f\uff01 Unarmed.Skills.Berserk.Other.Off=&e{0}\u304c &f\u30d0\u30fc\u30b5\u30fc\u30ab\u30fc &a\u3092\u6d88\u8017\u3057\u305f Unarmed.Skills.Berserk.Other.On=&a{0}&2\u304c &c\u30d0\u30fc\u30b5\u30fc\u30ab\u30fc &2\u3092\u4f7f\u3063\u305f\uff01 +Unarmed.Skills.Berserk.Refresh=&e\u30d0\u30fc\u30b5\u30fc\u30ab\u30fc &a\u30a2\u30d3\u30ea\u30c6\u30a3\u304c\u56de\u5fa9\u3057\u307e\u3057\u305f\uff01 # WOODCUTTING Woodcutting.Ability.0=\u30ea\u30fc\u30d5\u30d6\u30ed\u30ef\u30fc @@ -891,6 +894,7 @@ Guides.Acrobatics.Section.0=&3\u30a2\u30af\u30ed\u30d0\u30c6\u30a3\u30c3\u30af\u Guides.Acrobatics.Section.1=&3\u53d7\u3051\u8eab\u306f\u3069\u306e\u3088\u3046\u306b\u6a5f\u80fd\u3057\u307e\u3059\u304b\uff1f\n&e\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&e\u843d\u4e0b\u4e2d\u306b\u30b9\u30cb\u30fc\u30af\u3059\u308b\u3053\u3068\u3067\u78ba\u7387\u3092\u500d\u5897\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002 Guides.Acrobatics.Section.2=&3\u8eb1\u3059\u306f\u3069\u306e\u3088\u3046\u306b\u6a5f\u80fd\u3057\u307e\u3059\u304b\uff1f\n&e\u8eb1\u3059\u306f\u78ba\u7387\u3067\u6226\u95d8\u3067\u8ca0\u50b7\u3057\u305f\u3068\u304d\u306b\\n&e\u53d7\u3051\u305f\u30c0\u30e1\u30fc\u30b8\u3092\u534a\u5206\u306b\u3057\u307e\u3059\u3002\\n&e\u30b9\u30ad\u30eb\u30ec\u30d9\u30eb\u306b\u95a2\u4fc2\u3057\u3066\u3044\u307e\u3059\u3002 ## Alchemy +Guides.Alchemy.Section.0=&3\u932c\u91d1\u8853\u306b\u3064\u3044\u3066\uff1a\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\u89e6\u5a92\u306e\u52b9\u679c\u306f\uff1f\n&e\u89e6\u5a92\u306f\u91b8\u9020\u306e\u901f\u5ea6\u3092\u901f\u3081\u3001\n&e\u30ec\u30d9\u30eb1000\u3067\u6700\u59274\u500d\u306e\u901f\u5ea6\u306b\u306a\u308a\u307e\u3059\u3002\n&e\u3053\u306e\u30a2\u30d3\u30ea\u30c6\u30a3\u306f\u30c7\u30d5\u30a9\u30eb\u30c8\u3067\u306f\u30ec\u30d9\u30eb100\u3067\u30a2\u30f3\u30ed\u30c3\u30af\u3055\u308c\u308b\u3002 Guides.Alchemy.Section.2=&3\u8abf\u5408\u306e\u52b9\u679c\u306f\uff1f\n&e\u8abf\u5408\u3067\u306f\u6750\u6599\u3092\u4f7f\u3063\u3066\u3001\u3088\u308a\u591a\u304f\u306e\u30dd\u30fc\u30b7\u30e7\u30f3\u3092\u4f5c\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\n&e\u3069\u306e\u6750\u6599\u304c\u30a2\u30f3\u30ed\u30c3\u30af\u3055\u308c\u308b\u304b\u306f\u3001\u30e9\u30f3\u30af\u306b\u3088\u3063\u3066\u6c7a\u5b9a\u3055\u308c\u307e\u3059\u3002\n&e\u89e3\u9664\u3067\u304d\u308b\u30e9\u30f3\u30af\u306f\uff18\u3064\u3067\u3059\u3002 Guides.Alchemy.Section.3=&3\u8abf\u5408 \u30c6\u30a3\u30a21\u306e\u6750\u6599\uff1a\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) @@ -1169,4 +1173,5 @@ Chat.Channel.On=&6(&amcMMO-\u30c1\u30e3\u30c3\u30c8&6) &e\u30c1\u30e3\u30c3\u30c Chat.Channel.Off=&6(&amcMMO-\u30c1\u30e3\u30c3\u30c8&6) &7\u3042\u306a\u305f\u306e\u30c1\u30e3\u30c3\u30c8\u30e1\u30c3\u30bb\u30fc\u30b8\u306f\u3001\u7279\u5b9a\u306e\u30c1\u30e3\u30c3\u30c8\u30c1\u30e3\u30f3\u30cd\u30eb\u306b\u81ea\u52d5\u7684\u306b\u9001\u4fe1\u3055\u308c\u306a\u304f\u306a\u308a\u307e\u3059\u3002 Chat.Spy.Party=&6[&eSPY&6-&a{2}&6] &r{0} &b\u2192 &r{1} Broadcasts.LevelUpMilestone=&6(&amcMMO&6) {0} &7\u304c &3{2} \u3067\u30ec\u30d9\u30eb &a{1} &7\u306b\u5230\u9054\u3057\u307e\u3057\u305f\uff01 -Broadcasts.PowerLevelUpMilestone=&6(&amcMMO&6) {0}&7 \u306e\u30d1\u30ef\u30fc\u30ec\u30d9\u30eb\u304c &a{1} &7\u306b\u5230\u9054\u3057\u307e\u3057\u305f\uff01 \ No newline at end of file +Broadcasts.PowerLevelUpMilestone=&6(&amcMMO&6) {0}&7 \u306e\u30d1\u30ef\u30fc\u30ec\u30d9\u30eb\u304c &a{1} &7\u306b\u5230\u9054\u3057\u307e\u3057\u305f\uff01 +Scoreboard.Recovery=mcMMO\u306e\u30b9\u30b3\u30a2\u30dc\u30fc\u30c9\u3092\u5fa9\u5143\u3057\u3088\u3046\u3068\u3057\u3066\u3044\u307e\u3059... \ No newline at end of file From be595f2568c04638f816a7ab0e7cb92d23b562fb Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 31 May 2021 08:37:07 -0700 Subject: [PATCH 544/662] Update changelog --- Changelog.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Changelog.txt b/Changelog.txt index 720bcc707..c256221d0 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,6 @@ +Version 2.1.197 + Updated Japanese locale (thanks ViaSnake) + Version 2.1.196 Removed the explosion from Rupture Adjusted Rupture to play its particle effect less often From 2875545fa40e12cbb2de449d1533dec6a2c46a09 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 31 May 2021 08:55:10 -0700 Subject: [PATCH 545/662] Update pt_BR locale --- Changelog.txt | 5 + .../resources/locale/locale_pt_BR.properties | 1614 +++++++++++------ 2 files changed, 1107 insertions(+), 512 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index c256221d0..17f51363b 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,5 +1,10 @@ Version 2.1.197 + This build of mcMMO should be more compatible with certain versions of ViaVersion Updated Japanese locale (thanks ViaSnake) + Updated Brazil Portuguese (pt_BR) locale (thanks Paulo Guilherme) + + NOTES: + 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 diff --git a/src/main/resources/locale/locale_pt_BR.properties b/src/main/resources/locale/locale_pt_BR.properties index 67e55ef13..d8ae1c7f1 100644 --- a/src/main/resources/locale/locale_pt_BR.properties +++ b/src/main/resources/locale/locale_pt_BR.properties @@ -1,581 +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\u00e7\u00e3o +JSON.JWrapper.Header=Detalhes +JSON.Type.Passive=Passivo +JSON.Type.Active=Ativo +JSON.Type.SuperAbility=Super Habilidade +JSON.Locked=-=[TRANCADO]=- +JSON.LevelRequirement=N\u00edvel necess\u00e1rio +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\u00e7\u00e3o +JSON.Fishing=Pesca +JSON.Herbalism=Herbalismo +JSON.Mining=Minera\u00e7\u00e3o +JSON.Repair=Repara\u00e7\u00e3o +JSON.Salvage=Recupera\u00e7\u00e3o +JSON.Swords=Espadas +JSON.Taming=Adestramento +JSON.Unarmed=Desarmado +JSON.Woodcutting=Corte de \u00c1rvore +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\u00ednguas! +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\u00f3ximo aprimoramento no n\u00edvel {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\u00ea estiver segurando o bot\u00e3o de agachar enquanto cai, pode evitar at\u00e9 o dobro do dano que voc\u00ea normalmente receberia! +Anvil.SingleItemStack=&cVoc\u00ea n\u00e3o 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\u00edsticas +Commands.XPGain.Overhaul=&6XP RECEBIDA: &3{0} +MOTD.Version.Overhaul=&6[mcMMO] &3Vers\u00e3o do plugin&6 - &3{0} +Overhaul.mcMMO.Header=&c[]=====[]&a mcMMO - Vers\u00e3o 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\u00e7\u00e3o +Overhaul.Name.Fishing=Pesca +Overhaul.Name.Herbalism=Herbalismo +Overhaul.Name.Mining=Minera\u00e7\u00e3o +Overhaul.Name.Repair=Repara\u00e7\u00e3o +Overhaul.Name.Salvage=Recupera\u00e7\u00e3o +Overhaul.Name.Smelting=Fundi\u00e7\u00e3o +Overhaul.Name.Swords=Espadas +Overhaul.Name.Taming=Adestramento +Overhaul.Name.Unarmed=Desarmado +Overhaul.Name.Woodcutting=Corte de \u00c1rvore +# /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\u00e7\u00e3o Nv.&6{0} +XPBar.Fishing=Pesca Nv.&6{0} +XPBar.Herbalism=Herbalismo Nv.&6{0} +XPBar.Mining=Minera\u00e7\u00e3o Nv.&6{0} +XPBar.Repair=Repara\u00e7\u00e3o Nv.&6{0} +XPBar.Salvage=Recupera\u00e7\u00e3o Nv.&6{0} +XPBar.Smelting=Fundi\u00e7\u00e3o Nv.&6{0} +XPBar.Swords=Espadas Nv.&6{0} +XPBar.Taming=Adestramento Nv.&6{0} +XPBar.Unarmed=Desarmado Nv.&6{0} +XPBar.Woodcutting=Corte de \u00c1rvore 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=&a**Aterrissagem Elegante** +Acrobatics.Ability.Proc=&a**Aterrissagem graciosa** Acrobatics.Combat.Proc=&a**Esquivou** -Acrobatics.DodgeChance=&cChance de Esquivar: &e{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.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\u00e1tegicamente 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 \u00e9 uma sub-habilidade ativa com um componente passivo.\nQuando voc\u00ea sofre dano de queda, voc\u00ea tem a chance de negar completamente o dano baseado no n\u00edvel da sua habilidade, no n\u00edvel &e{6}%&7 voc\u00ea tem &e{0}%&7 de chance de prevenir dano, e &e{1}%&7 se voc\u00ea ativar o rolamento gracioso.\nA chance de sucesso \u00e9 determinado pelo n\u00edvel da sua habilidade em uma curva linear at\u00e9 o n\u00edvel &e{2}&7 que \u00e9 quando ela chega em seu m\u00e1ximo, cada n\u00edvel de Acrobacia te d\u00e1 uma chance de &e{3}%&7 de sucesso.\nSegurando o bot\u00e3o de agachar, voc\u00ea consegue dobrar suas chances de evitar danos de queda e tamb\u00e9m consegue evitar at\u00e9 o dobro do dano de queda! Segurar o bot\u00e3o de agachar ir\u00e1 transformar seu teste normal em um Teste Gracioso.\nRolar ir\u00e1 prevenir at\u00e9 &c{4}&7 de dano. Rolagens graciosas evitar\u00e3o at\u00e9 &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=&cChance de Rolar: &e{0} -Acrobatics.Roll.GraceChance=&cChance de Rolar Melhor: &e{0} -Acrobatics.Roll.Text=**Rolou** +Acrobatics.Roll.Text=&o**Rolou** Acrobatics.SkillName=ACROBACIA -Acrobatics.Skillup=&eHabilidade 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\u00e1lise +Alchemy.SubSkill.Catalysis.Description=Aumenta a velocidade de prepara\u00e7\u00e3o da po\u00e7\u00e3o +Alchemy.SubSkill.Catalysis.Stat=Velocidade de prepara\u00e7\u00e3o +Alchemy.SubSkill.Concoctions.Name=Misturas +Alchemy.SubSkill.Concoctions.Description=Prepara po\u00e7\u00f5es 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=&cVelocidade de Infusao: &e{0} -Alchemy.Concoctions.Rank=&cClassificacao de misturas: &e{0}/{1} -Alchemy.Concoctions.Ingredients=&cIngredientes [&e{0}&c]: &e{1} +Alchemy.Ability.Locked.0=BLOQUEADO AT\u00c9 CHEGAR NO NÍVEL {0}+ HABILIDADE (CAT\U00e1LISE) Alchemy.SkillName=ALQUIMIA -Alchemy.Skillup=&eHabilidade de Alquimia aumentada para {0}. Total ({1}) -#ARCO -Archery.Combat.DazeChance=&cChance de Atordoar: &e{0} -Archery.Combat.RetrieveChance=&cChance de Recuperar Flechas: &e{0} -Archery.Combat.SkillshotBonus=&cDano Extra da Habilidade de Atirar: &e{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=&eHabilidade com Arcos aumentada para {0}. Total ({1}) +#ARQUEARIA +Archery.SubSkill.SkillShot.Name=Profici\u00eancia em Tiro +Archery.SubSkill.SkillShot.Description=Aumenta o dano com o arco +Archery.SubSkill.SkillShot.Stat=B\u00f4nus de dano com Profici\u00eancia 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\u00e7\u00e3o de Flechas +Archery.SubSkill.ArrowRetrieval.Description=Chance de recuperar flechas dos corpos +Archery.SubSkill.ArrowRetrieval.Stat=Chance de recupera\u00e7\u00e3o de flechas +Archery.SubSkill.ArcheryLimitBreak.Name=Quebra de Limite com arco +Archery.SubSkill.ArcheryLimitBreak.Description=Quebre seus limites. Aumento de dano contra inimigos dif\u00edceis. Feito para PVP, Fica a crit\u00e9 das configura\u00e7\u00f5es do servidor se vai ou n\u00e3o aumentar o dano no PVE. +Archery.SubSkill.ArcheryLimitBreak.Stat=DANO m\u00e1ximo 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=&7**VOCE ABAIXA SEU MACHADO** -Axes.Ability.Ready=&a**VOCE PREPARA SEU MACHADO** -Axes.Combat.CritStruck=&4Voce levou um dano CRITICO! -Axes.Combat.CritChance=&cChance de ataque critico: &e{0} -Axes.Combat.CriticalHit=&cDANO CRITICO! -Axes.Combat.GI.Proc=&a**GOLPEADO COM UMA GRANDE FORCA** +Axes.Ability.Bonus.0=Maestria com Machado +Axes.Ability.Bonus.1=B\u00f4nus 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\u00ea abaixou seu Machado. +Axes.Ability.Ready=&7Voc\u00ea est\u00e1 com seu Machado &6pronto. +Axes.Ability.Ready.Extra=&3Você &6est\u00e1 com seu&3 Machado pronto. &7({0} está em recarga por {1}s) +Axes.Combat.CritStruck=&4Voc\u00ea recebey um dano CR\u00cdTICO! +Axes.Combat.CriticalHit=&cDANO CRIT\u00cdCO! +Axes.Combat.GI.Proc=&a**GOLPEADO COM UMA GRANDE FOR\u00c7A** Axes.Combat.GI.Struck=&c**ATINGIDO POR UM GRANDE IMPACTO** -Axes.Combat.SS.Struck=&4Atingido por RACHA CRANIOS! -Axes.Combat.SS.Length=&cDuracao do Racha Cranios: &e{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.Combat.SS.Struck=&4Atingido por RACHA CR\u00c2NIO! +Axes.SubSkill.SkullSplitter.Name=Racha Cr\u00e2nio +Axes.SubSkill.SkullSplitter.Description=Deu dano em \u00e1rea +Axes.SubSkill.SkullSplitter.Stat=Dura\u00e7\u00e3o do Racha Cr\u00e2nio +Axes.SubSkill.CriticalStrikes.Name=Golpes cr\u00edticos +Axes.SubSkill.CriticalStrikes.Description=Dobra o dano +Axes.SubSkill.CriticalStrikes.Stat=Chance de Golpe cr\u00edtico +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\u00edceis. Feito para PVP, Fica a crit\u00e9 das configura\u00e7\u00f5es do servidor se vai ou n\u00e3o aumentar o dano no PVE. +Axes.SubSkill.AxesLimitBreak.Stat=DANO m\u00e1ximo com a quebra de limite +Axes.SubSkill.ArmorImpact.Name=Impacto na Armadura +Axes.SubSkill.ArmorImpact.Description=Ataca com for\u00e7a 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=&c**Racha Cranios foi desagastado** -Axes.Skills.SS.On=&a**Racha Cranios ATIVADO** -Axes.Skills.SS.Refresh=&aSua habilidade &eRacha Cranios &afoi refrescada! -Axes.Skills.SS.Other.Off=&cRacha Cranios&a foi desgastado para &e{0} -Axes.Skills.SS.Other.On=&a{0}&2 usou &cRacha Cranios! -Axes.Skillup=&eHabilidade com Machados foi aumentada para {0}. Total ({1}) +Axes.Skills.SS.Off=**Racha Cr\u00e2nio foi desativado** +Axes.Skills.SS.On=&a**Racha Cr\u00e2nio ATIVADO** +Axes.Skills.SS.Refresh=&aSua habilidade &eRacha Cr\u00e2nio &afoi recarregada! +Axes.Skills.SS.Other.Off=Racha Cr\u00e2nio&a foi desativada por &e{0} +Axes.Skills.SS.Other.On=&a{0}&2 usou &cRacha Cr\u00e2nio! -#EXCAVAcaO -Excavation.Ability.Lower=&7**VOCE ABAIXA SUA PA** -Excavation.Ability.Ready=&a**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=&cDuracao da Britadeira: &e{0}s -Excavation.Listener=Excavacao: -Excavation.SkillName=ESCAVACAO -Excavation.Skills.GigaDrillBreaker.Off=&c**Britadeira foi desgastada** -Excavation.Skills.GigaDrillBreaker.On=&a**BRITADEIRA ATIVADA** -Excavation.Skills.GigaDrillBreaker.Refresh=&aSua habilidade &eBritadeira &afoi refrescada! -Excavation.Skills.GigaDrillBreaker.Other.Off=&cBritadeira&a foi desativada para &e{0} -Excavation.Skills.GigaDrillBreaker.Other.On=&a{0}&2 usou &cBritadeira! -Excavation.Skillup=&eHabilidade de Escavacao aumentada para {0}. Total ({1}) +#ESCAVAÇÃO +Excavation.Ability.Lower=&7Voc\u00ea abaixou sua p\u00e1. +Excavation.Ability.Ready=Voc\u00ea est\u00e1 com a sua p\u00e1 &6pronta.&3 +Excavation.SubSkill.GigaDrillBreaker.Name=Super Broca +Excavation.SubSkill.GigaDrillBreaker.Description=3x Taxa de Drop, 3x EXP, +Velocidade +Excavation.SubSkill.GigaDrillBreaker.Stat=Dura\u00e7\u00e3o da Super Broca +Excavation.SubSkill.Archaeology.Name=Arqueologia +Excavation.SubSkill.Archaeology.Description=Descubra os segredos escondidos na terra! N\u00edvel alto dessa habilidade aumenta as suas chances de encontrar orbes de experi\u00eancia ao encontrar um tesouro! +Excavation.SubSkill.Archaeology.Stat=Chance de orbes de experi\u00eancia de Arqueologia +Excavation.SubSkill.Archaeology.Stat.Extra=Quantidade de orbes de experi\u00eancia de Arqueologia +Excavation.Listener=Escava\u00e7\u00e3o: +Excavation.SkillName=ESCAVA\u00c7\u00c3O +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=&cChance de Mordida: &e{0} -Fishing.Ability.Info=&cCacador Magico: &7 **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=&cRank de Cacador de Tesouro: &e{0}/{1} -Fishing.Ability.TH.DropRate=&c Chance de Drop: &4Armadilhas: &e{0} &7Comum: &e{1} &aIncomum: &e{2}\n&9Raro: &e{3} &depico: &e{4} &6LegenDario: &e{5} &bRegistro: &e{6} -Fishing.Ability.TH.MagicRate=&cChance de Cacador Magico: &e{0} -Fishing.Ability.Shake=&cChance de Sacudida: &e{0} -Fishing.Ability.IceFishing=&cPescando no Gelo: VA pescar no gelo -Fishing.Ability.FD=&cDieta do Pescador: &eRank {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=&9 Bonus de Chuva +Fishing.ScarcityTip=&e&oEsta \u00e1rea est\u00e1 sofrendo de pesca excessiva, pesque em outro lugar para pegar mais peixes. No min\u00edmo {0} blocos de dist\u00e2ncia. +Fishing.Scared=&7&oMovimentos ca\u00f3ticos ir\u00e3o assustar os peixes! +Fishing.Exhausting=&c&oUso impr\u00f3prio da vara de pesca vai causar fadiga e ir\u00e1 desgastar a vara! +Fishing.LowResourcesTip=&7Voc\u00ea sente que talvez n\u00e3o tenha muitos peixes sobrando nessa \u00e1rea. Tente pescar \u00e0 no m\u00ednimo {0} blocos de dist\u00e2ncia. +Fishing.Ability.Info=Ca\u00e7ador M\u00e1gico: &7 **Aumenta com o rank de Ca\u00e7ador de Tesouros** +Fishing.Ability.Locked.0=BLOQUEADO AT\u00c9 CHEGAR NO N\u00cdVEL {0}+ HABILIDADE (SACUDIR) +Fishing.Ability.Locked.1=BLOQUEADO AT\u00c9 CHEGAR NO N\u00cdVEL {0}+ HABILIDADE (PESCA NO GELO) +Fishing.Ability.Locked.2=BLOQUEADO AT\u00c9 CHEGAR NO N\u00cdVEL {0}+ HABILIDADE (MESTRE PESCADOR) +Fishing.SubSkill.TreasureHunter.Name=Ca\u00e7ador de Tesouros +Fishing.SubSkill.TreasureHunter.Description=Pesca itens diversos +Fishing.SubSkill.TreasureHunter.Stat=Rank de Ca\u00e7ador 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\u00c9pico{3} &6Lend\u00e1rio: &e{4} &bM\u00edstico: &e{5} +Fishing.SubSkill.MagicHunter.Name=Ca\u00e7ador M\u00e1gico +Fishing.SubSkill.MagicHunter.Description=Encontra itens de encantamentos +Fishing.SubSkill.MagicHunter.Stat=Chance do Ca\u00e7ador M\u00e1gico +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\u00e7\u00e3o de tempo de espera m\u00ednima do peixe: &a-{0} segundos +Fishing.SubSkill.MasterAngler.Stat.Extra=Redu\u00e7\u00e3o de tempo de espera m\u00e1xima 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\u00f4nus de chuva Fishing.Listener=Pesca: -Fishing.Ability.TH.MagicFound=&7VOCE sentiu um toque de magia nesta pescada... -Fishing.Ability.TH.Boom=&7EPOCA DE CRESCIMENTO!!! -Fishing.Ability.TH.Poison=&7Algo nao cheira bem... +Fishing.Ability.TH.MagicFound=&7voc\u00ea sente um toque de m\u00e1gica com essa fisgada... +Fishing.Ability.TH.Boom=&7HORA DO CRESCIMENTO!!! +Fishing.Ability.TH.Poison=&7Algo n\u00e3o cheira bem... Fishing.SkillName=PESCA -Fishing.Skillup=&eHabilidade de Pesca aumentada para {0}. Total ({1}) #HERBALISMO -Herbalism.Ability.DoubleDropChance=&cChance de Drop Duplo: &e{0} -Herbalism.Ability.FD=&cDieta do Fazendeiro: &eRank {0} -Herbalism.Ability.GTe.Length=&cDuracao da Terra Verde: &e{0}s -Herbalism.Ability.GTe.NeedMore=&cVOCE precisa de mais sementes para usar Terra Verde. -Herbalism.Ability.GTh.Chance=&cChance de Dedao Verde: &e{0} -Herbalism.Ability.GTh.Fail=&c**DEDAO VERDE FALHOU** -Herbalism.Ability.GTh.Stage=&cEstagio do Dedao Verde: &e As plantas crescem em estagio {0} -Herbalism.Ability.GTh=&a**DEDAO VERDE** -Herbalism.Ability.HylianLuck=&cChance de Sorte de Hylian: &e{0} -Herbalism.Ability.Lower=&7**VOCE ABAIXA SUA ENXADA** -Herbalism.Ability.Ready=&a**VOCE PREPARA SUA ENXADA** -Herbalism.Ability.ShroomThumb.Chance=&cChance de Dedo Cogumelo: &e{0} -Herbalism.Ability.ShroomThumb.Fail=&c**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=&aA Sorte de Hylian esta com VOCE hoje! +Herbalism.Ability.GTe.NeedMore=Voc\u00ea 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\u00ea abaixou sua enxada. +Herbalism.Ability.Ready=&3Voc\u00ea est\u00e1 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\u00e7\u00e3o 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\u00e1gio do Polegar Verde: &a Planta\u00e7\u00f5es crescem no est\u00e1gio {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\u00e1 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\u00e1 com voc\u00ea hoje! Herbalism.Listener=Herbalismo: Herbalism.SkillName=HERBALISMO -Herbalism.Skills.GTe.Off=&c**Terra Verde foi desagastado** -Herbalism.Skills.GTe.On=&a**TERRA VERDE ATIVADO** -Herbalism.Skills.GTe.Refresh=&aSua Habilidade &eTerra Verde &afoi refrescada! -Herbalism.Skills.GTe.Other.Off=&cTerra Verde&a foi desgastada para &e{0} +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! -Herbalism.Skillup=&eHabilidade de Herbalismo aumentada para {0}. Total ({1}) -#MINERAcaO -Mining.Ability.Length=&cDuracao do Super Quebrador: &e{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=&7**VOCE ABAIXA SUA PICARETA** -Mining.Ability.Ready=&a**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=&cDiminuicao de Dano da Pericia em Demolicao: &e{0} -Mining.Effect.DropChance=&cChance de Drop em Dobro: &e{0} -Mining.Listener=Mineracao: -Mining.SkillName=MINERACAO -Mining.Skills.SuperBreaker.Off=&c**Super Quebrador foi desgastado** -Mining.Skills.SuperBreaker.On=&a**SUPER QUEBRADOR ATIVADO** -Mining.Skills.SuperBreaker.Other.Off=&cSuper Quebrador&a foi desgastado para &e{0} -Mining.Skills.SuperBreaker.Other.On=&a{0}&2 usou &cSuper Quebrador! -Mining.Skills.SuperBreaker.Refresh=&aSua Habilidade &eSuper Quebrador &afoi refrescada! -Mining.Skillup=&eHabilidade de Mineracao foi aumentada para {0}. Total ({1}) +#MINERAÇÃO +Mining.Ability.Locked.0=BLOQUEADO AT\u00c9 CHEGAR NO N\u00cdVEL {0}+ HABILIDADE (MINERA\u00c7\u00c3O EXPLOSIVA) +Mining.Ability.Locked.1=BLOQUEADO AT\u00c9 CHEGAR NO N\u00cdVEL {0}+ HABILIDADE (BOMBAS MAIORES) +Mining.Ability.Locked.2=BLOQUEADO AT\u00c9 CHEGAR NO N\u00cdVEL {0}+ HABILIDADE (ESPECIALISTA EM DEMOLI\u00c7\u00c3O) +Mining.Ability.Lower=&7Voc\u00ea abaixou sua picareta. +Mining.Ability.Ready=&3Voc\u00ea est\u00e1 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\u00e7\u00e3o 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\u00e7\u00e3o Explosiva +Mining.SubSkill.BlastMining.Description=B\u00f4nus ao minerar com TNT +Mining.SubSkill.BlastMining.Stat=Minera\u00e7\u00e3o Explosiva:&a Rank {0}/{1} &7({2}) +Mining.SubSkill.BlastMining.Stat.Extra=Aumenta o raio das explos\u00f5es: &a+{0} +Mining.SubSkill.BiggerBombs.Name=Bombas Maiores +Mining.SubSkill.BiggerBombs.Description=Aumenta o raio das explos\u00f5es de TNT +Mining.SubSkill.DemolitionsExpertise.Name=Especialista em Demoli\u00e7\u00e3o +Mining.SubSkill.DemolitionsExpertise.Description=Diminui o dano recebido por explos\u00f5es de TNT +Mining.SubSkill.DemolitionsExpertise.Stat=Diminui\u00e7\u00e3o de dano do Especialista em Demoli\u00e7\u00e3o -#Mineracao Explosiva +Mining.Listener=Minera\u00e7\u00e3o: +Mining.SkillName=MINERA\u00c7\u00c3O +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! + +#Mineração Explosiva Mining.Blast.Boom=&7**BOOM** -Mining.Blast.Effect=+{0} Rendimento de Minerios, {1}x drops -Mining.Blast.Radius.Increase=&cAumento no Raio de explosao: &e+{0} -Mining.Blast.Rank=&cMineracao Explosiva: &e Rank {0}/{1} &7({2}) -Mining.Blast.Other.On=&a{0}&2 usou &cMineracao Explosiva! -Mining.Blast.Refresh=&aSua Habilidade &eMineracao Explosiva &afoi refrescada! +Mining.Blast.Cooldown= +Mining.Blast.Effect=+{0} min\u00e9rios de rendimento, {1}x drops +Mining.Blast.Other.On=&a{0}&2 usou &cMinera\u00e7\u00e3o Explosiva! +Mining.Blast.Refresh=&aSua habilidade &eMinera\u00e7\u00e3o Explosiva &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=&4mcMMO encontrou um erro ao reparar este item! -Repair.Listener.Anvil=&4VOCE colocou uma bigorna, bigornas podem reparar ferramentas e armaduras. -Repair.Listener=Reparacao: -Repair.SkillName=REPARACAO -Repair.Skills.AdeptDiamond=&4VOCE nao tem habilidade suficiente para reparar Diamante. -Repair.Skills.AdeptGold=&4VOCE nao tem habilidade suficiente para reparar Ouro. -Repair.Skills.AdeptIron=&4VOCE nao tem habilidade suficiente para reparar Ferro. -Repair.Skills.AdeptStone=&4VOCE nao tem habilidade suficiente para reparar Pedra. -Repair.Skills.Adept=&cVOCE precisa do NIVEL &e{0}&c para reparar &e{1} -Repair.Skills.FeltEasy=&7Isso foi facil. -Repair.Skills.FullDurability=&7A durabilidade disto esta completa. -Repair.Skills.Mastery=&cDominio de Reparacao: &e{0} de durabilidade restaurada a mais. -Repair.Skills.StackedItems=&4VOCE nao pode reparar items empilhados. -Repair.Skills.Super.Chance=&cChance de Super Reparo: &e{0} -Repair.Skillup=&eHabilidade de Reparacao aumentada para {0}. Total ({1}) -Repair.Pretty.Name=Reparar +#REPARAÇÃO +Repair.SubSkill.Repair.Name=Repara\u00e7\u00e3o +Repair.SubSkill.Repair.Description=Repara ferramentas e armaduras +Repair.SubSkill.GoldRepair.Name=Repara\u00e7\u00e3o de Ouro ({0}+ HABILIDADE) +Repair.SubSkill.GoldRepair.Description=Repara ferramentas e armaduras de ouro +Repair.SubSkill.IronRepair.Name=Repara\u00e7\u00e3o de Ferro ({0}+ HABILIDADE) +Repair.SubSkill.IronRepair.Description=Repara ferramentas e armaduras de ferro +Repair.SubSkill.StoneRepair.Name=Repara\u00e7\u00e3o 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\u00e1gicos +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\u00e7\u00e3o: +Repair.SkillName=REPARA\u00c7\u00c3O +Repair.Skills.AdeptDiamond=&4Voc\u00ea não tem habilidade o suficiente para reparar Diamante. +Repair.Skills.AdeptGold=&4Voc\u00ea não tem habilidade o suficiente para reparar Ouro. +Repair.Skills.AdeptIron=&4Voc\u00ea não tem habilidade o suficiente para reparar Ferro. +Repair.Skills.AdeptStone=&4Voc\u00ea não tem habilidade o suficiente para reparar Pedra. +Repair.Skills.Adept=&cVoc\u00ea deve estar no n\u00edvel &e{0}&c para reparar &e{1} +Repair.Skills.FeltEasy=&7Isso pareceu f\u00e1cil. +Repair.Skills.FullDurability=&7Isso j\u00e1 est\u00e1 com durabilidade m\u00e1xima. +Repair.Skills.StackedItems=&4Voc\u00ea n\u00e3o pode reparar itens empilhados. +Repair.Pretty.Name=Repara\u00e7\u00e3o -#Forjamento Misterioso -Repair.Arcane.Chance.Downgrade=&7Chance de rebaixar o FS: &e{0}% -Repair.Arcane.Chance.Success=&7Taxa de Sucesso do FS: &e{0}% -Repair.Arcane.Downgrade=&cPoder Misterioso foi diminuido para esse item. -Repair.Arcane.Fail=&cPoder Misterioso saiu permanentemente do item. -Repair.Arcane.Lost=&cVOCE nao foi habil suficiente para manter todos os encantamentos. -Repair.Arcane.Perfect=&aVOCE sustentou suas energias secretas neste item. -Repair.Arcane.Rank=&cForjamento Secreto: &eRank {0}/{1} +#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\u00ea n\u00e3o foi habilidoso o suficiente para manter os encantamentos. +Repair.Arcane.Perfect=&aVoc\u00ea manteve as energias arcanas neste item. -#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=&cSalvamento Misterioso: &eRank {0}/{1} -Salvage.Arcane.ExtractFull=&7Possibilidade de ENCANTAMENTO-Maximo do FS -Salvage.Arcane.ExtractPartial=&7Possibilidade de ENCANTAMENTO-PARCIAL do FS -Salvage.Skills.Success=&aItem salvo! -Salvage.Skills.Adept.Damaged=&4VOCE nao tem habilidade suficiente para salvar os itens danificados. -Salvage.Skills.Adept.Level=&cVOCE precisa do NIVEL &e{0}&c para salvar &e{1} -Salvage.Skills.TooDamaged=&4Este item esta muito gasto para ser salvo. -Salvage.Skills.ArcaneFailed=&cVOCE nao foi capaz de extrair o conhecimento contido neste item. -Salvage.Skills.ArcanePartial=&eVOCE so foi capaz de extrair alguns conhecimentos contidos neste item. -Salvage.Skills.ArcaneSuccess=&aVOCE e capaz de extrair todo o conhecimento contido neste item. -Salvage.Listener.Anvil=&4VOCE colocou uma Bigorna de Salvamento, use isto para salvar Ferramentas e Armaduras. -Salvage.Listener=Salvamento: -Salvage.SkillName=SALVAMENTO +#RECUPERAÇÃO +Salvage.Pretty.Name=Recupera\u00e7\u00e3o +Salvage.SubSkill.UnderstandingTheArt.Name=Entendendo a Arte +Salvage.SubSkill.UnderstandingTheArt.Description=Voc\u00ea n\u00e3o est\u00e1 s\u00f3 vasculhando o lixo de seus vizinhos, mas tamb\u00e9m est\u00e1 cuidando do meio ambiente.\nAumenta v\u00e1rias propriedades de Recupera\u00e7\u00e3o. +Salvage.SubSkill.ScrapCollector.Name=Coletor de Sucata +Salvage.SubSkill.ScrapCollector.Description=Recupera materiais de um item, uma recupera\u00e7\u00e3o 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\u00e7\u00e3o Arcana +Salvage.SubSkill.ArcaneSalvage.Description=Extrai encantamentos de um item +Salvage.SubSkill.ArcaneSalvage.Stat=Recupera\u00e7\u00e3o 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\u00ea n\u00e3o \u00e9 habilidoso o suficiente para recuperar itens danificados. +Salvage.Skills.Adept.Level=Voc\u00ea deve estar no n\u00edvel &e{0}&c para recuperar &e{1} +Salvage.Skills.TooDamaged=&4Esse item est\u00e1 muito danificado para ser recuperado. +Salvage.Skills.ArcaneFailed=&cVoc\u00ea n\u00e3o conseguiu extrair o conhecimento contido dentro deste item. +Salvage.Skills.ArcanePartial=&cVoc\u00ea s\u00f3 conseguiu extrair um pouco do conhecimento contido dentro deste item. +Salvage.Skills.ArcaneSuccess=&aVoc\u00ea conseguiu extrair todo o conhecimento contido dentro deste item! +Salvage.Listener.Anvil=&4Voc\u00ea colocou uma birgona de recupera\u00e7\u00e3o, use ela para recuperar ferramentas e armaduras. +Salvage.Listener=Recupera\u00e7\u00e3o: +Salvage.SkillName=RECUPERA\u00c7\u00c3O +Salvage.Skills.Lottery.Normal=&6Voc\u00ea conseguiu recuperar &3{0}&6 materiais de &e{1}&6. +Salvage.Skills.Lottery.Perfect=&a&lPerfeito!&r&6 Voc\u00ea recuperou &3{1}&6 sem esfoço algum, reavendo &3{0}&6 materiais. +Salvage.Skills.Lottery.Untrained=&7Voc\u00ea n\u00e3o est\u00e1 bem treinado em recupera\u00e7\u00e3o. S\u00f3 conseguiu recuperar &c{0}&7 materiais de &a{1}&7. + +#Bigorna (Compartilhado entre RECUPERAÇÃO E REPARAÇÃO) +Anvil.Unbreakable=Este item \u00e9 inquebrav\u00e9l! #ESPADAS -Swords.Ability.Lower=&7**VOCE ABAIXA SUA ESPADA** -Swords.Ability.Ready=&a**VOCE PREPARA SUA ESPADA** -Swords.Combat.Bleed.Chance=&cChance de Sangramento: &e{0} -Swords.Combat.Bleed.Length=&cTempo de Sangramento: &e{0} ticks -Swords.Combat.Bleed.Note=&7NOTA: &e1 Tick e igual a 2 segundos -Swords.Combat.Bleeding.Started=&4 VOCE esta sangrando! -Swords.Combat.Bleeding.Stopped=&7O Sangramento &aparou&7! +Swords.Ability.Lower=&7Voc\u00ea abaixou sua espada. +Swords.Ability.Ready=&3Voc\u00ea est\u00e1 com a sua espada &6pronta. +Swords.Combat.Rupture.Note.Update.One=&7(Nota de ruptura): O dano peri\u00f3dico n\u00e3o \u00e9 letal, acontece duas vezes por segundo e ignora armadura +Swords.Combat.Bleeding.Started=&4 Voc\u00ea est\u00e1 sangrando! +Swords.Combat.Bleeding.Stopped=&7O sangramento &aparou&7! Swords.Combat.Bleeding=&a**INIMIGO SANGRANDO** -Swords.Combat.Counter.Chance=&cChance de Contra-Ataque: &e{0} -Swords.Combat.Counter.Hit=&4Bateu como Contra-Ataque! -Swords.Combat.Countered=&a**CONTRA-ATACADO** -Swords.Combat.SS.Struck=&4Golpeado 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.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\u00e1 uma parte do dano em \u00e1rea com chance de aplicar Ruptura! +Swords.SubSkill.SerratedStrikes.Stat=Dura\u00e7\u00e3o 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\u00edceis. Feito para PVP, Fica a crit\u00e9 das configura\u00e7\u00f5es do servidor se vai ou n\u00e3o aumentar o dano no PVE. +Swords.SubSkill.SwordsLimitBreak.Stat=DANO m\u00e1ximo da Quebra de Limite +Swords.SubSkill.Rupture.Stat=Chance de Ruptura +Swords.SubSkill.Rupture.Stat.Extra=[[DARK_AQUA]]Dura\u00e7\u00e3o 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=&c**Ataques Cortantes desgastados** +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 refrescada! -Swords.Skills.SS.Other.Off=&cAtaques Cortantes&a foi desgastado para &e{0} -Swords.Skills.SS.Other.On=&a{0}&2 usou &cAtaque Cortantes! -Swords.Skillup=&eHabilidade com espadas aumentada para {0}. Total ({1}) -Swords.SS.Length=&cDuracao dos Ataques Cortantes: &e{0}s +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\u00eancia Ambiental +Taming.Ability.Bonus.1=Lobos evitam o perigo +Taming.Ability.Bonus.2=Pelo Grosso +Taming.Ability.Bonus.3=1/{0} Dano, Resist\u00eancia ao fogo +Taming.Ability.Bonus.4=Resist\u00eanCIA a impactos +Taming.Ability.Bonus.5=Explosivos d\u00e3o 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=&cChance de Coagulacao: &e{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=&7COTW: 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=&8Seu lobo fugiu de volta para VOCE... -Taming.Listener=Domesticar: -Taming.SkillName=DOMESTICAR -Taming.Skillup=&eHabilidade de Domesticar aumentada para {0}. Total ({1}) -Taming.Summon.Complete=&aInvocacao completa -Taming.Summon.Lifespan=&e ({0}s de Vida util) -Taming.Summon.Fail.Ocelot=&cVOCE tem muitas jaguatiricas por perto para invocar mais. -Taming.Summon.Fail.Wolf=&cVOCE tem muitos lobos por perto para invocar mais. -Taming.Summon.Fail.Horse=&cVOCE tem muitos cavalos por perto para invocar mais. -Taming.Summon.Fail.TooMany=&cVOCE atingiu o limite Maximo para poder invocar mais animais. &e({0}) -Taming.Summon.Name.Format={0}''s {1} +Taming.Ability.Bonus.7=+{0} Dano +Taming.Ability.Bonus.8=Servi\u00e7o de Fast Food +Taming.Ability.Bonus.9={0} Chance de curar ao atacar +Taming.Ability.Bonus.10=C\u00e3o Piedoso +Taming.Ability.Bonus.11=Recupere vida ao tomar dano m\u00e1gico ou por veneno +Taming.Ability.Locked.0=BLOQUEADO AT\u00c9 CHEGAR NO N\u00cdVEL {0}+ HABILIDADE (CONSCI\u00caNCIA AMBIENTAL) +Taming.Ability.Locked.1=BLOQUEADO AT\u00c9 CHEGAR NO N\u00cdVEL {0}+ HABILIDADE (PELO GROSSO) +Taming.Ability.Locked.2=BLOQUEADO AT\u00c9 CHEGAR NO N\u00cdVEL {0}+ HABILIDADE (RESIST\u00caNCIA A IMPACTOS) +Taming.Ability.Locked.3=BLOQUEADO AT\u00c9 CHEGAR NO N\u00cdVEL {0}+ HABILIDADE(GARRAS AFIADAS) +Taming.Ability.Locked.4=BLOQUEADO AT\u00c9 CHEGAR NO N\u00cdVEL {0}+ HABILIDADE (SERVI\u00c7O DE FAST FOOD) +Taming.Ability.Locked.5=BLOQUEADO AT\u00c9 CHEGAR NO N\u00cdVEL {0}+ HABILIDADE (C\u00c3O 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\u00eancia a impactos +Taming.SubSkill.ShockProof.Description=Redu\u00e7\u00e3o 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\u00e3o direito com\n {0} {1} (Jaguatirica), {2} {3} (Lobo), {4} {5} (Cavalo) +Taming.SubSkill.FastFoodService.Name=Servi\u00e7o de Fast Food +Taming.SubSkill.FastFoodService.Description=Chance de lobos curaram ao atacar +Taming.SubSkill.HolyHound.Name=C\u00e3o Piedoso +Taming.SubSkill.HolyHound.Description=Curado por magia e veneno +Taming.SubSkill.Gore.Name=Mordida +Taming.SubSkill.Gore.Description=Ataque cr\u00edtico que aplica Ruptura +Taming.SubSkill.SharpenedClaws.Name=Garras Afiadas +Taming.SubSkill.SharpenedClaws.Description=B\u00f4nus de dano +Taming.SubSkill.EnvironmentallyAware.Name=Consci\u00eancia Ambiental +Taming.SubSkill.EnvironmentallyAware.Description=Fobia de Cacto/Lava, Imune \u00e0 dano de queda +Taming.SubSkill.ThickFur.Name=Pelo Grosso +Taming.SubSkill.ThickFur.Description=Redu\u00e7\u00e3o de DANO, Resist\u00eancia ao fogo +Taming.SubSkill.Pummel.Name=Patada +Taming.SubSkill.Pummel.Description=Seus lobos t\u00eam chance de repelir inimigos +Taming.SubSkill.Pummel.TargetMessage=Voc\u00ea foi repelido por um lobo! +Taming.Listener.Wolf=&8Seu lobo corre de volta para voc\u00ea... +Taming.Listener=Adestramento: +Taming.SkillName=ADESTRAMENTO +Taming.Summon.COTW.Success.WithoutLifespan=&a(Chamado da Natureza) &7Voc\u00ea invocou um &6{0}&7 +Taming.Summon.COTW.Success.WithLifespan=&a(Call Of The Wild) &7Voc\u00ea invocou um &6{0}&7 e ele tem uma dura\u00e7\u00e3o de &6{1}&7 segundos. +Taming.Summon.COTW.Limit=&a(Call Of The Wild) &7Voc\u00ea s\u00f3 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\u00ea n\u00e3o pode procriar animais invocados. +Taming.Summon.COTW.NeedMoreItems=&a(Chamado da Natureza) &7Voc\u00ea 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=&cDuracao da Furia: &e{0}s -Unarmed.Ability.Bonus.0=Estilo Braco de Ferro -Unarmed.Ability.Bonus.1=+{0} de Dano Aprimorado -Unarmed.Ability.Chance.ArrowDeflect=&cChance de Desviar de Flechas: &e{0} -Unarmed.Ability.Chance.Disarm=&cChance de Desarmar: &e{0} -Unarmed.Ability.Chance.IronGrip=&cChance de Punho de Ferro: &e{0} -Unarmed.Ability.IronGrip.Attacker=&cSeu oponente tem um Punho de Ferro! -Unarmed.Ability.IronGrip.Defender=&aO seu punho de ferro impediu de ser desarmado! -Unarmed.Ability.Lower=&7**VOCE ABAIXA SEUS PUNHOS** -Unarmed.Ability.Ready=&a**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\u00e7o de A\u00e7o +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\u00ea ser desarmado! +Unarmed.Ability.Lower=&7Voc\u00ea abaixou seus punhos. +Unarmed.Ability.Ready=&3Voc\u00ea est\u00e1 com seus punhos &6prontos.. +Unarmed.SubSkill.Berserk.Name=F\u00faria +Unarmed.SubSkill.Berserk.Description=+50% de DANO, quebra materiais fr\u00e1geis +Unarmed.SubSkill.Berserk.Stat=Dura\u00e7\u00e3o da F\u00faria +Unarmed.SubSkill.Disarm.Name=Desarmar +Unarmed.SubSkill.Disarm.Description=Derruba o item que o inimigo tem nas m\u00e3os +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\u00edceis. Feito para PVP, Fica a crit\u00e9 das configura\u00e7\u00f5es do servidor se vai ou n\u00e3o aumentar o dano no PVE. +Unarmed.SubSkill.UnarmedLimitBreak.Stat=Dano m\u00e1ximo da quebra de limite +Unarmed.SubSkill.SteelArmStyle.Name=Estilo bra\u00e7o de A\u00e7o +Unarmed.SubSkill.SteelArmStyle.Description=Deixa seu bra\u00e7o 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\u00ea 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=&c**Furia foi desgastada** -Unarmed.Skills.Berserk.On=&a**FuRIA ATIVADA** -Unarmed.Skills.Berserk.Other.Off=&cFuria&a foi desgastada para &e{0} -Unarmed.Skills.Berserk.Other.On=&a{0}&2 usou &cFuria! -Unarmed.Skills.Berserk.Refresh=&aSua habilidade &eFuria &afoi refrescada! -Unarmed.Skillup=&eHabilidade de Desarmado aumentada para {0}. Total ({1}) +Unarmed.Skills.Berserk.Off=**F\u00faria foi desativada** +Unarmed.Skills.Berserk.On=&a**F\u00daRIA ATIVADA** +Unarmed.Skills.Berserk.Other.Off=F\u00faria&a foi desativada por &e{0} +Unarmed.Skills.Berserk.Other.On=&a{0}&2 usou &cBerserk! +Unarmed.Skills.Berserk.Refresh=&aSua &aHabilidade &eF\u00faria foi recarregada! -#WOODCUTTING +#C0RTE DE ÁRVORE Woodcutting.Ability.0=Soprador de Folhas Woodcutting.Ability.1=Sopra as folhas para longe -Woodcutting.Ability.Chance.DDrop=&cChance de Drop Duplo: &e{0} -Woodcutting.Ability.Length=&cDuracao do Derrubador de arvores: &e{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=&c**Derrubador de arvores foi desgastado** -Woodcutting.Skills.TreeFeller.On=&a**DERRUBADOR DE arvores FOI ATIVADO** -Woodcutting.Skills.TreeFeller.Refresh=&aSua habilidade &eDerrubador de arvores &afoi refrescada! -Woodcutting.Skills.TreeFeller.Other.Off=&cDerrubador de arvores&a foi desgastado para &e{0} -Woodcutting.Skills.TreeFeller.Other.On=&a{0}&2 usou &cDerrubador de arvores! -Woodcutting.Skills.TreeFeller.Splinter=&cSEU MACHADO SE DESPEDACOU EM DEZENAS DE PEDACOS! -Woodcutting.Skills.TreeFeller.Threshold=&cEsta arvore e muito grande! -Woodcutting.Skillup=&eHabilidade de Cortar Madeira aumentada para {0}. Total ({1}) +Woodcutting.Ability.Locked.0=BLOQUEADO AT\u00c9 CHEGAR NO N\u00cdVEL {0}+ HABILIDADE (SOPRADOR DE FOLHAS) +Woodcutting.SubSkill.TreeFeller.Name=Lenhador +Woodcutting.SubSkill.TreeFeller.Description=Explode \u00c1rvores +Woodcutting.SubSkill.TreeFeller.Stat=Dura\u00e7\u00e3o 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 \u00e1rvores +Woodcutting.SubSkill.KnockOnWood.Loot.Rank2=Drop normal de \u00e1rvores e de orbes de experi\u00eancia +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 \u00c1rvore de forma mais efici\u00eante. +Woodcutting.SubSkill.BarkSurgeon.Name=Cirurgi\u00e3o de Tronco +Woodcutting.SubSkill.BarkSurgeon.Description=Extrai materiais \u00fateis ao remover \u00c1rvores. +Woodcutting.SubSkill.NaturesBounty.Name=Generosidade da Natureza +Woodcutting.SubSkill.NaturesBounty.Description=Ganhe experi\u00eancia da natureza. +Woodcutting.Listener=Corte de \u00c1rvore: +Woodcutting.SkillName=CORTE DE \u00c1RVORE +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\u00c7OU EM V\u00c1RIOS PEDA\u00c7OS! +Woodcutting.Skills.TreeFeller.Threshold=Essa \u00c1rvore \u00e9 muito grande! -#ABILITIY -##generic -Ability.Generic.Refresh=&a**HABILIDADES REFRESCADAS!** -Ability.Generic.Template.Lock=&7{0} -Ability.Generic.Template=&c{0}: &e{1} +#HABILIDADE -#COMBAT -Combat.ArrowDeflect=&f**DESVIOU-SE DA FLECHA** -Combat.BeastLore=&a**CONHECIMENTO TOSCO** +#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.Gore=&a**MORDIDA** -Combat.StruckByGore=&c**VOCE FOI MORDIDO** -Combat.TargetDazed=Alvo foi &4Atordoado -Combat.TouchedFuzzy=&4Visoo turva. Sente tonturas. +Combat.BeastLoreHorseSpeed=&3Velocidade de movimento do cavalo (&a{0} blocos/s&3) +Combat.BeastLoreHorseJumpStrength=&3for\u00e7a do pulo do cavalo (&aMax\u00edmo de {0} blocos&3) +Combat.Gore=&a**Mordido** +Combat.StruckByGore=**VOC\u00ca FOI Mordido** +Combat.TargetDazed=Alvo est\u00e1 &4atordoado +Combat.TouchedFuzzy=&4vis\u00e3o turva. Sente tonturas. - -Commands.addlevels.AwardAll.1=&aVoce ganhou {0} leveis em todas suas skills! -Commands.addlevels.AwardAll.2=&cTodas suas skills foram alteradas para {0}. -Commands.addlevels.AwardSkill.1=&aVoce ganhou {0} leveis em {1}! -Commands.addlevels.AwardSkill.2=&c{0} foi modificado para {1}. -Commands.addxp.AwardAll=&aVoce ganhou {0} experiencias em todas skills! -Commands.addxp.AwardSkill=&aVoce ganhou {0} experiencias em {1}! -Commands.AdminChat.Off=Chat Admin &cDesligado -Commands.AdminChat.On=Chat de Admin &aLigado -Commands.AdminToggle=&c- Liga o Admin chat -Commands.Disabled=&cEste comando esta desabilitado. -Commands.DoesNotExist=&cPlayer nao existe na database! -Commands.GodMode.Disabled=&emcMMO Modo God desabilitado -Commands.GodMode.Enabled=&emcMMO Godmode Ligado -Commands.Invite.Accepted=&aConvite aceito. Voce se juntou ao grupo {0} -Commands.mmoedit=[player] &c - Modifica alvo -Commands.ModDescription=&c- Leia a descricao breve do mod -Commands.NoConsole=Esse comando nao suporta uso no console -Commands.Party.Accept=&c- Aceitar convite de grupo -Commands.Party.Chat.Off=Chat de grupo &cDesligado -Commands.Party.Commands=&a--COMANDOS DE GRUPO-- -Commands.Party.Invite.0=&cALERTA: &aVoce recebeu um convite para o grupo {0} de {1} -Commands.Party.Kick=&cVoce foi kickado do grupo {0}! -Commands.Party.Leave=&cVoce saiu do grupo -Commands.Party.None=&cVoce nao esta em um grupo. -Commands.Party.Quit=&c- Deixe seu grupo atual -Commands.PowerLevel.Leaderboard=&e--mcMMO&9 Nivel de Poder &ePodium-- +#COMANDOS +##genérico +mcMMO.Description=&3Sobre o Projeto &emcMMO &3:,&6mcMMO \u00e9 um &6mod de RPG &cOpen Source &6criado em fevereiro de 2011, &6pelo &9nossr50 &6.O objetivo dele \u00e9 fornecer uma experi\u00eancia de RPG de qualidade. &3Dicas:&6 - &aUse &c/mcmmo help&a para ver os comandos,&6 - &aDigite &c/NOMEDAHABILIDADE&a para ver informa\u00e7\u00f5es detalhadas sobre as habilidades, &3Desenvolvedores:&6 - &anossr50 &9(Criador e L\u00edder do Projeto),&6 - &aelectronicboy &9(Dev),&6 - &akashike &9(Dev),&6 - &at00thpick1 &9(Respons\u00e1vel pela vers\u00e3o cl\u00e1ssica) +mcMMO.Description.FormerDevs=&3Antigos desenvolvedores: &aGJ, NuclearW, bm01, TfT_02, Glitchfinder +Commands.addlevels.AwardAll.1=&aVoc\u00ea foi presenteado com {0} n\u00edveis em todas as habilidades! +Commands.addlevels.AwardAll.2=Todas as habilidades foram modificas por {0}. +Commands.addlevels.AwardSkill.1=&aVoc\u00ea foi presenteado com {0} n\u00edveis em {1}! +Commands.addlevels.AwardSkill.2={0} foi modificada(o) por {1}. +Commands.addxp.AwardAll=&aVoc\u00ea foi presenteado com {0} de experi\u00eancia em todas as habilidades! +Commands.addxp.AwardSkill=&aVoc\u00ea foi presenteado com {0} de experi\u00eancia 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\u00f3 para Admins &cDesativado +Commands.AdminChat.On=Chat s\u00f3 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\u00ea deve esperar {0} millisegundos antes de usar esse comando de novo. +Commands.Database.Cooldown=Voc\u00ea deve esperar {0} segundos antes de usar esse comando de novo. +Commands.Database.Processing=O comando anterior que voc\u00ea usou ainda est\u00e1 sendo processado. Por favor, aguarde. +Commands.Disabled=Este comando est\u00e1 desabilitado. +Commands.DoesNotExist= &cJogador n\u00e3o 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\u00e3o: &a{0}&6] &f{1} +Commands.GodMode.Forbidden=[mcMMO] God Mode n\u00e3o pode ser usado nesse mundo (Veja as permiss\u00f5es) +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\u00e7\u00f5es&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\u00e1lido! +Commands.Inspect= &a- veja informa\u00e7\u00f5es detalhadas do jogador +Commands.Invite.Success=&aConvite enviado com sucesso. +Commands.Leaderboards= &a- Leaderboards +Commands.mcgod=&a- GodMod alterado +Commands.mchud.Invalid=Esse n\u00e3o \u00e9 um tipo de HUD v\u00e1lido. +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\u00edveis de todas suas habilidades foram definidos para {0}! +Commands.mmoedit.Modified.1=&aSeu n\u00edvel em {0} foi definido para {1}! +Commands.mmoedit.Modified.2={0} foi modificado para {1}. +Commands.mcconvert.Database.Same=Voc\u00ea j\u00e1 est\u00e1 usando o banco de dados {0}! +Commands.mcconvert.Database.InvalidType={0} n\u00e3o \u00e9 um tipo de banco de dados v\u00e1lido. +Commands.mcconvert.Database.Start=&7Come\u00e7\u00e3ndo a convers\u00e3o de {0} para {1}... +Commands.mcconvert.Database.Finish=&7Migra\u00e7\u00e3o de banco de dados conclu\u00edda; o banco de dados {1} agora tem todos os dados do banco de dados {0}. +Commands.mmoshowdb=O banco de dados usado atualmente \u00e9 &a{0} +Commands.mcconvert.Experience.Invalid=Tipo de f\u00f3rmula de xp desconhecida! Os tipos v\u00e1lidos s\u00e3o: &aLINEAR &ce &aEXPONENCIAL. +Commands.mcconvert.Experience.Same=J\u00e1 est\u00e1 usando a f\u00f3rmula {0} +Commands.mcconvert.Experience.Start=&7Come\u00e7\u00e3ndo a convers\u00e3o de {0} para curva {1} +Commands.mcconvert.Experience.Finish=&7Convers\u00e3o de f\u00f3rmula conclu\u00edda; usando agora a curva {0} XP. +Commands.ModDescription=&a- Leia a descri\u00e7\u00e3o resumida do mod +Commands.NoConsole=Este comando n\u00e3o pode ser usado no console. +Commands.Notifications.Off=Notifica\u00e7\u00f5es de habilidade &cdesativada +Commands.Notifications.On=Notifica\u00e7\u00f5es de habilidade &aativada +Commands.Offline=Este comando n\u00e3o funciona para jogadores offline. +Commands.NotLoaded=O perfil do jogador ainda n\u00e3o foi carregada. +Commands.Party.Status=&8NOME: &f{0} {1} &8N\u00cdVEL: &3{2} +Commands.Party.Status.Alliance=&8ALIAN\u00c7A: &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\u00ca &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\u00ea entrou no grupo {0} +Commands.Party.Join=&7Entrou no Grupo: {0} +Commands.Party.PartyFull=&6{0}&c est\u00e1 cheio! +Commands.Party.PartyFull.Invite=Voce n\u00e3o pode convidar &e{0}&c para &a{1}&c porque j\u00e1 tem &3{2}&c jogadores nela! +Commands.Party.PartyFull.InviteAccept=Voc\u00ea n\u00e3o pode entrar em &a{0}&c porque j\u00e1 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\u00e1 existe! +Commands.Party.Kick=&cVoc\u00ea foi kickado do grupo &a{0}&c! +Commands.Party.Leave=&eVoc\u00ea saiu do grupo +Commands.Party.Members.Header=&c-----[]&aMEMBROS&c[]----- +Commands.Party.None=&cVoc\u00ea n\u00e3o est\u00e1 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\u00c7\u00c3 DO GRUPO&c[]----- +Commands.Party.Alliance.Ally=&f{0} &8IS ALIADO COM: &f{1} +Commands.Party.Alliance.Members.Header=&c-----[]&aMEMBROS DA ALIAN\u00c7A&c[]----- +Commands.Party.Alliance.Invite.0=ALERTa: &aVoc\u00ea recebeu um convite de alian\u00e7\u00e3 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\u00e7\u00e3 aceito. +Commands.Party.Alliance.None=&cO seu grupo n\u00e3o possui alian\u00e7\u00e3s. +Commands.Party.Alliance.AlreadyAllies=&cSeu grupo j\u00e1 possui uma alian\u00e7\u00e3. desfaça a alian\u00e7\u00e3 digitando &3/party alliance disband +Commands.Party.Alliance.Help.0=&cEsse grupo n\u00e3o possui uma alian\u00e7\u00e3. Convide o l\u00edder do grupo para formar a alian\u00e7\u00e3 +Commands.Party.Alliance.Help.1=&c para um alian\u00e7\u00e3 digitando &3/party alliance invite &c. +Commands.ptp.Enabled=Teletransporte do grupo &aativado +Commands.ptp.Disabled=Teletransporte do grupo &cdisativado +Commands.ptp.NoRequests=&cVoc\u00ea n\u00e3o possui pedidos de teletransporte no momento +Commands.ptp.NoWorldPermissions=&c[mcMMO] Voc\u00ea n\u00e3o tem permiss\u00e3o para teletransportar para o mundo {0}. +Commands.ptp.Request1=&e{0} &asolicitou teletransporte para voc\u00ea. +Commands.ptp.Request2=&aPara teletransportar, digite &e/ptp accept&a. Pedido expira em &c{0} &asegundos. +Commands.ptp.AcceptAny.Enabled=Confirma\u00e7\u00e3o de teletransporte de grupo &aativado +Commands.ptp.AcceptAny.Disabled=Confirma\u00e7\u00e3o de teletransporte de grupo &cdesativado +Commands.ptp.RequestExpired=&cPedido de teletransporte de grupo expirou! +Commands.PowerLevel.Leaderboard=&e--mcMMO &eLeaderboard de &9 N\u00edvel de Poder-- +Commands.PowerLevel.Capped=&4N\u00cdVEL DE PODER: &a{0} &4N\u00cdVEL M\u00c1XIMO: &e{1} Commands.PowerLevel=&4N\u00cdVEL DE PODER: &a{0} -Commands.Scoreboard.Clear=&3mcMMO scoreboard sumiu. -Commands.Scoreboard.NoBoard=&cThe mcMMO scoreboard nao esta ativo. -Commands.Scoreboard.Keep=&3O mcMMO scoreboard vai estar visivel ate voce usar &a/mcscoreboard clear&3. -Commands.Scoreboard.Timer=&3O mcMMO scoreboard vai sumir em &6{0}&3 segundos. +Commands.Reset.All=&aTodos os seus n\u00edveis de habilidade foram resetados com sucesso. +Commands.Reset.Single=&aSeu n\u00edvel da hablidade {0} foi resetado com sucesso. +Commands.Reset=&a- Reseta o n\u00edvel de uma habilidade para 0 +Commands.Scoreboard.Clear=&3Scoreboard do mcMMO foi limpo. +Commands.Scoreboard.NoBoard=&cO scoreboard do mcMMO n\u00e3o est\u00e1 ativo. +Commands.Scoreboard.Keep=&3O scoreboard do mcMMO ficar\u00e1 assim at\u00e9 que voc\u00ea use o comando &a/mcscoreboard clear&3. +Commands.Scoreboard.Timer=&3O scoreboard do mcMMO ser\u00e1 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 - oculta o McMMO scoreboard -Commands.Scoreboard.Help.2=&3/mcscoreboard&b keep &f - mantem o McMMO scoreboard visivel -Commands.Scoreboard.Help.3=&3/mcscoreboard&b time [n] &f - oculta o McMMO scoreboard depois de &dn&f segundos -Commands.Scoreboard.Tip.Keep=&6Dica: Use &c/mcscoreboard keep&6 enquanto ele estiver visivel para fazer com que ele fique sempre visivel . -Commands.Scoreboard.Tip.Clear=&6Dica: Use &c/mcscoreboard clear&6 para ocultar o McMMO scoreboard. -Commands.Stats.Self=SEUS STATS -mcMMO.NoPermission=&4Permissoes insuficientes. +Commands.Scoreboard.Help.1=&3/mcscoreboard&b clear &f - limpa o scoreboard do mcMMO +Commands.Scoreboard.Help.2=&3/mcscoreboard&b keep &f - mant\u00e9m 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\u00e1 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\u00e7\u00f5es da Barra de XP do mcMMO foram resetadas. +Commands.XPBar.SettingChanged=&6configura\u00e7\u00f5es da Barra de XP de &a{0}&6 agora foi definida para &a{1} +Commands.Skill.Invalid=Esse n\u00e3o \u00e9 um nome de habilidade v\u00e1lido! +Commands.Skill.ChildSkill=Habilidades dependentes n\u00e3o s\u00e3o v\u00e1lidas para esse comando! +Commands.Skill.Leaderboard=--mcMMO &9{0}&e Leaderboard-- +Commands.SkillInfo=&a- Veja informa\u00e7\u00f5es detalhadas sobre uma habilidade +Commands.Stats=&a- Veja as suas estat\u00edsticas do mcMMO +Commands.ToggleAbility=&a- Altere a ativa\u00e7\u00e3o da habilidade com o bot\u00e3o direito +Commands.Usage.0=&cO jeito certo de usar \u00e9 /{0} +Commands.Usage.1=&cO jeito certo de usar \u00e9 /{0} {1} +Commands.Usage.2=&cO jeito certo de usar \u00e9 /{0} {1} {2} +Commands.Usage.3=&cO jeito certo de usar \u00e9 /{0} {1} {2} {3} +Commands.Usage.3.XP=&cO jeito certo de usar \u00e9 /{0} {1} {2} {3}&7 (voc\u00ea 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\u00edvel +Commands.Usage.Message=mensagem +Commands.Usage.Page=p\u00e1gina +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\u00e2nica. +Commands.MmoInfo.Mystery=&7Voc\u00ea ainda n\u00e3o liberou essa habilidade, mas quando \u00e1-la, conseguir\u00e1 ler detalhes sobre ela aqui! +Commands.MmoInfo.NoMatch=Essa sub-habilidade n\u00e3o existe! +Commands.MmoInfo.Header=&3-=[]=====[]&6 Informa\u00e7\u00f5es do MMO &3[]=====[]=- +Commands.MmoInfo.SubSkillHeader=&6Nome:&e {0} +Commands.MmoInfo.DetailsHeader=&3-=[]=====[]&a Detalhes &3[]=====[]=- +Commands.MmoInfo.OldSkill=&7As habilidades do mcMMO est\u00e3o sendo convertidas para um sistema modular de habilidades aprimorado, infelizmente essa habilidade ainda n\u00e3o foi convertida e n\u00e3o possui estat\u00edsticas detalhadas. O novo sistema permitir\u00e1 libera\u00e7\u00f5es mais r\u00e1pidas de novas habilidades do mcMMO e maior flexibilidade com as habilidades existentes. +Commands.MmoInfo.Mechanics=&3-=[]=====[]&6 Mec\u00e2nicas &3[]=====[]=- +Commands.MmoInfo.Stats=Estat\u00edsticas: {0} +Commands.Mmodebug.Toggle=Modo de Debug do mcMMO agora \u00e9 &6{0}&7, use esse comando novamente para ativar ou desativar. Com o modo ativado, voc\u00ea pode bater em blocos para exibir informa\u00e7\u00f5es \u00fateis usadas para ajuda. +mcMMO.NoInvites=&cVoc\u00ea n\u00e3o possui convites no momento +mcMMO.NoPermission=&4permiss\u00f5es insuficientes. +mcMMO.NoSkillNote=&8Se voc\u00ea n\u00e3o tiver acesso a uma habilidade, ela n\u00e3o aparecer\u00e1 aqui. -##party -Party.Forbidden=[mcMMO] Partys nao soo permitidas nesse mundo (Veja as Permissoes) -Party.Help.0=&cO Correto e &3{0} [password]. -Party.Help.1=&cPara criar uma party, use &3{0} [password]. -Party.Help.2=&cConsulte &3{0} &cpara mais informacao -Party.Help.3=&cUse &3{0} [password] &cpara entrar ou &3{1} &cpara sair -Party.Help.4=&cPara travar ou destravar a party, use &3{0} -Party.Help.5=&cPara proteger sua party com senha, use &3{0} -Party.Help.6=&cPara chutar um player da party, use &3{0} -Party.Help.7=&cPara transferir o cargo de dono da party, use &3{0} -Party.Help.8=&cPara deletar sua party, use &3{0} -Party.Help.9=&cUse &3{0} &cpara compartilhar items com os membros da party -Party.Help.10=&cUse &3{0} &cpara compartilhar XP com os membros da party -Party.InformedOnJoin={0} &aentrou na sua party -Party.InformedOnQuit={0} &asaiu da sua party -Party.InformedOnNameChange=&6{0} &amudou o nome da party para &f{1} -Party.InvalidName=&4Isso nao e um nome VAlido. -Party.Invite.Self=&cVOCE nao pode convidar VOCE mesmo! -Party.IsLocked=&cEsta party ja esta travada! -Party.IsntLocked=&cEsta party nao esta travada. -Party.Locked=&cA party esta travada, somente os lideres podem convidar membros. -Party.NotInYourParty=&4{0} nao esta na sua party -Party.NotOwner=&4VOCE nao e o lider da party. -Party.Target.NotOwner=&4{0} nao e o lider da party. -Party.Owner.New=&a{0} e o novo lider da party. -Party.Owner.NotLeader=&4VOCE nao e mais o lider da party. -Party.Owner.Player =&aAgora VOCE e o lider da party. -Party.Password.None=&cEsta party esta protegida com senha. Informe a senha para entrar. -Party.Password.Incorrect=&cA senha da party esta incorreta. -Party.Password.Set=&aSenha da party mudada para {0} -Party.Password.Removed=&aA senha da party foi removida. -Party.Player.Invalid=&cIsto nao e um player VAlido. -Party.NotOnline=&4{0} nao esta online! -Party.Player.InSameParty=&c{0} ja esta na sua party! -Party.PlayerNotInParty=&4{0} nao esta na party -Party.Specify=&cVOCE precisa especificar a party. -Party.Teleport.Dead=&cVOCE nao pode teleportar a um membro morto. -Party.Teleport.Hurt=&cVOCE levou dano nos ultimos {0} segundos e nao pode teleportar. -Party.Teleport.Player=&aVOCE teleportou para {0}. -Party.Teleport.Self=&cVOCE nao pode teleportar VOCE mesmo! -Party.Teleport.Target=&a{0} teleportou para VOCE. -Party.Teleport.Disabled=&c{0} nao permitiu o teleporty por party. -Party.Rename.Same=&cEste ja e o nome da sua party! -Party.Join.Self=&cVOCE nao pode convidar VOCE mesmo! -Party.Unlocked=&7Party nao esta mais travada -Party.Disband=&7A party foi removida -Party.Alliance.Formed=&7Sua party agora e aliada de &a{0} -Party.Alliance.Disband=&7Sua party nao tem alianca com &c{0} -Party.Status.Locked=&4(SOMENTE-CONVIDA) +##grupo +Party.Forbidden=[mcMMO] Grupos n\u00e3o s\u00e3o permitidos neste mundo (Veja as permiss\u00f5es) +Party.Help.0=&cO jeito certo de usar \u00e9 &3{0} [senha]. +Party.Help.1=&cPara criar um grupo, use &3{0} [senha]. +Party.Help.2=&cConsulte &3{0} &cpara mais informa\u00e7\u00f5es +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\u00e3o \u00e9 um nome grupo v\u00e1lido. +Party.Invite.Self=&cVoc\u00ea n\u00e3o pode se convidar para seu pr\u00f3prio grupo! +Party.IsLocked=&cEste grupo j\u00e1 est\u00e1 fechado! +Party.IsntLocked=&cEste grupo n\u00e3o est\u00e1 fechado! +Party.Locked=&cGrupo fechado, apenas o l\u00edder pode convidar. +Party.NotInYourParty=&4{0} n\u00e3o est\u00e1 no seu grupo. +Party.NotOwner=&4voc\u00ea n\u00e3o \u00e9 o l\u00edder do grupo. +Party.Target.NotOwner=&4{0} n\u00e3o \u00e9 o l\u00edder do grupo. +Party.Owner.New=&a{0} \u00e9 o novo l\u00edder do grupo. +Party.Owner.NotLeader=&4Voc\u00ea n\u00e3o \u00e9 mais o l\u00edder do grupo. +Party.Owner.Player =&aAgora voc\u00ea \u00e9 o l\u00edder do grupo. +Party.Password.None=&cEste grupo est\u00e1 protegido por senha. Por favor, insira a senha para entrar. +Party.Password.Incorrect=&cA senha do grupo est\u00e1 incorreta. +Party.Password.Set=&aSenha do grupo definida como {0} +Party.Password.Removed=&aGrupo n\u00e3o tem mais senha. +Party.Player.Invalid=&cEsse n\u00e3o \u00e9 um jogador v\u00e1lido. +Party.NotOnline=&4{0} n\u00e3o est\u00e1 online! +Party.Player.InSameParty=&c{0} j\u00e1 est\u00e1 no seu grupo! +Party.PlayerNotInParty=&4{0} n\u00e3o est\u00e1 em um grupo +Party.Specify=&cVoc\u00ea tem que especificar o grupo. +Party.Teleport.Dead=&cVoc\u00ea n\u00e3o pode se teletransportar para um jogador morto. +Party.Teleport.Hurt=&cVoc\u00ea recebeu dano nos \u00faltimos {0} segundos e n\u00e3o pode se teletransportar. +Party.Teleport.Player=&aVoc\u00ea se teletransportou para {0}. +Party.Teleport.Self=&cVoc\u00ea n\u00e3o pode se teletransportar para si mesmo! +Party.Teleport.Target=&a{0} se teletransportou para voc\u00ea. +Party.Teleport.Disabled=&c{0} n\u00e3o permite teletransporte para membros do grupo. +Party.Rename.Same=&cEsse j\u00e1 \u00e9 o nome do seu grupo! +Party.Join.Self=&cVoc\u00ea n\u00e3o pode jutar-se a si mesmo! +Party.Unlocked=&7Grupo est\u00e1 aberto +Party.Disband=&7O grupo foi desfeito +Party.Alliance.Formed=&7O seu grupo agora \u00e9 aliado de &a{0} +Party.Alliance.Disband=&7O seu grupo n\u00e3o \u00e9 mais aliado de &c{0} +Party.Status.Locked=&4(APENAS POR CONVITE) Party.Status.Unlocked=&2(ABERTO) -Party.LevelUp=&eNIVEL 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=&cChat de Party nao esta destravado ainda. -Party.Feature.Disabled.2=&cTeleporte de Party nao esta destravado ainda. -Party.Feature.Disabled.3=&cAlianca de Party nao esta destravado ainda. -Party.Feature.Disabled.4=&cCompartilhar item nao esta destravado ainda. -Party.Feature.Disabled.5=&cCompartilhar XP nao esta destravado ainda. +Party.LevelUp=&eO n\u00edvel do grupo subiu para {0}. Total ({1}) +Party.Feature.Chat=Chat do grupo +Party.Feature.Teleport=Teletransporte de grupo +Party.Feature.Alliance=Alian\u00e7as +Party.Feature.ItemShare=Compartilhamento de itens +Party.Feature.XpShare=Compartilhamento de XP +Party.Feature.Locked.Chat=BLOQUEADO AT\u00c9 CHEGAR NO N\u00cdVEL {0}+ (CHAT D0 GRUPO) +Party.Feature.Locked.Teleport=BLOQUEADO AT\u00c9 CHEGAR NO N\u00cdVEL {0}+ (TELETRANSPORTE DE GRUPO) +Party.Feature.Locked.Alliance=BLOQUEADO AT\u00c9 CHEGAR NO N\u00cdVEL {0}+ (ALIAN\u00c7AS) +Party.Feature.Locked.ItemShare=BLOQUEADO AT\u00c9 CHEGAR NO N\u00cdVEL {0}+ (COMPARTILHAMENTO DE ITENS) +Party.Feature.Locked.XpShare=BLOQUEADO AT\u00c9 CHEGAR NO N\u00cdVEL {0}+ (COMPARTILHAMENTO DE XP) +Party.Feature.Disabled.1=&cChat do grupo ainda n\u00e3o foi desbloqueado. +Party.Feature.Disabled.2=&cTeletransporte de grupo ainda n\u00e3o foi desbloqueado. +Party.Feature.Disabled.3=&cAlian\u00e7s ainda n\u00e3o est\u00e1 desbloqueada. +Party.Feature.Disabled.4=&cCompartilhamento de itens com o grupo ainda n\u00e3o foi desbloqueado. +Party.Feature.Disabled.5=&cCompartilhamento de XP com o grupo ainda n\u00e3o 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\u00d3RIO Party.ItemShare.Category.Loot=Saque -Party.ItemShare.Category.Mining=Minerar +Party.ItemShare.Category.Mining=Minera\u00e7\u00e3o Party.ItemShare.Category.Herbalism=Herbalismo -Party.ItemShare.Category.Woodcutting=Cortar arvores -Party.ItemShare.Category.Misc=Variado +Party.ItemShare.Category.Woodcutting=Corte de \u00e1rvore +Party.ItemShare.Category.Misc=Diversos -Commands.XPGain.Acrobatics=CAINDO +##xp +Commands.XPGain.Acrobatics=Caindo +Commands.XPGain.Alchemy=Preparando Po\u00e7\u00f5es 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\u00edveis 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\u00e9rios +Commands.XPGain.Repair=Reparando Commands.XPGain.Swords=Atacando Monstros -Commands.XPGain.Taming=Domesticar animais, ou combater com os seus lobos -Commands.XPGain=&8XP ADQUIRIDO: &f{0} -Commands.xplock.locked=&6Sua barra de XP BAR est\u00e1 travada em {0}! -Commands.xplock.unlocked=&6Sua barra de XP foi &aDESTRAVADA&6! -Commands.xprate.over=&cEvento 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 \u00e1rvores +Commands.XPGain=&8XP GANHO: &f{0} +Commands.xplock.locked=&6Sua BARRA DE XP agora est\u00e1 em {0}! +Commands.xplock.unlocked=&6Sua BARRA DE XP agora est\u00e1 &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 \u00e9 /xprate +Commands.xprate.proper.1=&cO jeito certo de voltar para a configura\u00e7\u00e3o padr\u00e3o da taxa de XP \u00e9 /xprate reset +Commands.xprate.proper.2=&cPor favor, coloque true ou false para indicar se isso \u00e9 um evento de XP ou n\u00e3o +Commands.NegativeNumberWarn=N\u00e3 use n\u00fameros 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 \u00e9 &6{0}&3x +Commands.xprate.started.0=&6EVENTO DE XP DO mcMMO COME\u00c7OU! +Commands.xprate.started.1=&6TAXA DE XP DO mcMMO AGORA \u00c9 {0}x! +# Notificações para Admins +Server.ConsoleName=&e[Servidor] +Notifications.Admin.XPRate.Start.Self=&7Voc\u00ea definiu o multiplicador da taxa de XP global para &6{0}x +Notifications.Admin.XPRate.End.Self=&7Voc\u00ea 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=&6mcMMO 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 &e{0} -Inspect.Stats=&aEstatisticas do mcMMO para &e{0} -Inspect.TooFar=&cVoce 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. &e({0}s) +# Evento +XPRate.Event=&6mcMMO atualmente est\u00e1 tendo evento de taxa de XP! a taxa de XP atual \u00e9 {0}x! -Skills.Disarmed=&4Voce foi Desarmado! -Skills.NeedMore=&4Voce precisa de mais -Skills.TooTired=&cVoce esta cansado pra usar essa habilidade. &e({0}s) -Skills.Cancelled=&c{0} cancelado! +##GUIAS +Guides.Available=&7Guia de {0} dispon\u00edvel - digite /{1} ? [p\u00e1gina] +Guides.Header=&6-=&a{0} Guia&6=- +Guides.Page.Invalid=N\u00e3o \u00e9 um n\u00famero de p\u00e1gina v\u00e1lida! +Guides.Page.OutOfRange=Essa p\u00e1gina n\u00e3o existe, tem apenas {0} p\u00e1ginas totais. +Guides.Usage= Para usar digite /{0} ? [p\u00e1gina] +##Acrobacia +Guides.Acrobatics.Section.0=&3Sobre a acrob\u00e1cia:\n&eAcrobacia \u00e9 a arte de se mover graciosamente no mcMMO.\n&eEla d\u00e1 b\u00f4nus de combate e b\u00f4nus de dano no ambiente.\n\n&3COMO GANHAR XP:\n&ePara ganhar XP nesta habilidade, voc\u00ea precisa se esquivar\n&eem um combate ou sobreviver a quedas de alturas que te d\u00f5o dano. +Guides.Acrobatics.Section.1=&3Como rolar funciona?\n&eVoc\u00ea tem uma chance passiva quando sofre dano de queda\n&ede negar o dano. Voc\u00ea pode segurar o bot\u00e3o de se agachar para\n&edobrar suas chances durante uma queda.\n&eIsso aciona um rolamento gracioso ao inv\u00e9s de um normal.\n&eRolamentos graciosos s\u00e3o como rolamentos normais, mas tem duas vezes mais probabilidade de\n&eocorrerem e fornecem mais seguran\u00e7\u00e3 contra danos do que os rolamentos normais.\n&eA chance do rolamento est\u00e1 ligada ao seu n\u00edvel de habilidade +Guides.Acrobatics.Section.2=&3Como a esquiva funciona?\n&eEsquiva \u00e9 uma chance passiva de que quando voc\u00ea receber\n&edano em combate ele seja reduzido pela metade.\n&eIsso est\u00e1 ligado ao seu n\u00edvel de habilidade. +##Alquimia +Guides.Alchemy.Section.0=[[DARK_AQUA]]Sobre a alquimia:\n[[YELLOW]]Alquimia \u00e9 sobre prepara\u00e7\u00f5es de alquimia.\n[[YELLOW]]Ela d\u00e1 um aumento na velocidade do tempo de prepara\u00e7\u00e3o\n de po\u00e7\u00f5es bem como\n[[YELLOW]] a adi\u00e7\u00e3o de novas po\u00e7\u00f5es(antigamente) imposs\u00edveis de \nse conseguir no modo sobreviv\u00eancia.\n\n\n[[DARK_AQUA]]COMO GANHAR XP:\n[[YELLOW]]Para ganhar xp nessa habilidade, voc\u00ea precisa preparar po\u00e7\u00f5es. +Guides.Alchemy.Section.1=[[DARK_AQUA]]Como a cat\u00e1lise funciona?\n[[YELLOW]]Cat\u00e1lise aumenta o processo de prepara\u00e7\u00e3o, com a\n[[YELLOW]]velocidade m\u00e1xima de 4x no n\u00edvel 1000.\n[[YELLOW]]Essa habilidade \u00e9 desbloqueada por padr\u00e3o no n\u00edvel 100. +Guides.Alchemy.Section.2=[[DARK_AQUA]]Como as Misturas funcionam?\n[[YELLOW]]As misturas permitem a prepara\u00e7\u00e3o de mais po\u00e7\u00f5es com ingredientes personalizados.\n[[YELLOW]]Quais ingredientes especiais s\u00e3o desbloqueados \u00e9 determinado\n[[YELLOW]]pelo seu Rank. Existem 8 ranks para se desbloquear. +Guides.Alchemy.Section.3=[[DARK_AQUA]]Mistura de n\u00edvel 1, ingredientes:\n[[YELLOW]]P\u00f3 de Blaze, Olho de Aranha Fermentado, L\u00e1grima de ghast, Redstone,\n[[YELLOW]]P\u00f3 de pedra luminosa, A\u00e7\u00faar, Fatia de Melancia Reluzente, Cenoura Dourada,\n[[YELLOW]]Creme de Magma, Fungo do Nether, Olho de aranha, Enxofre, V\u00edtoria-r\u00e9gia,\n[[YELLOW]]Baiacu\n[[YELLOW]](Po\u00e7\u00f5es Cl\u00e1ssicas) +Guides.Alchemy.Section.4=[[DARK_AQUA]]Mistura de n\u00edvel 2, ingredientes:\n[[YELLOW]]Cenoura (Po\u00e7\u00e3o de Pressa)\n[[YELLOW]]Slimeball (Po\u00e7\u00e3o de Dullness)\n\n[[DARK_AQUA]]Mistura de n\u00edvel 3, ingredientes:\n[[YELLOW]]Quartzo (Po\u00e7\u00e3o de Absor\u00e7\u00e3o)\n[[YELLOW]]P\u00e9 de coelho (Po\u00e7\u00e3o de Salto) +Guides.Alchemy.Section.5=[[DARK_AQUA]]Mistura de n\u00edvel 4, ingredientes:\n[[YELLOW]]Ma\u00e7\u00e3 (Po\u00e7\u00e3o de Vida Extra)\n[[YELLOW]]Carne podre (Po\u00e7\u00e3o da Fome)\n\n[[DARK_AQUA]]Mistura de n\u00edvel 5, ingredientes:\n[[YELLOW]]Cogumelo Marrom (Po\u00e7\u00e3o da N\u00e1usea)\n[[YELLOW]]Bolsa de Tinta (Po\u00e7\u00e3o da Cegueira) +Guides.Alchemy.Section.6=[[DARK_AQUA]]Mistura de n\u00edvel 6, ingredientes:\n[[YELLOW]]Samambaia (Po\u00e7\u00e3o da Satura\u00e7\u00e3o)\n\n[[DARK_AQUA]]Mistura de n\u00edvel 7, ingredientes:\n[[YELLOW]]Batata venenosa (Po\u00e7\u00e3o de Decaimento)\n\n[[DARK_AQUA]]Mistura de n\u00edvel 8, ingredientes:\n[[YELLOW]]Ma\u00e7\u00e3 dourada normal (Po\u00e7\u00e3o de Resist\u00eancia) +##Arquearia +Guides.Archery.Section.0=&3Sobre arquearia:\n&eArquearia \u00e9 sobre atirar com arco e flecha\n&eEssa habilidade d\u00e1 v\u00e1rios b\u00f4nus de combate, como b\u00f4nus de dano\n&eque escala com o seu n\u00edvel e a habilidade de atordoar seus\n&eoponentes no PvP. Al\u00e9m disso, voc\u00ea 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\u00ea precisa atirar em mobs ou\n&eoutros jogadores. +Guides.Archery.Section.1=&3Profici\u00eancia em Tiro?\n&eA habilidade Profici\u00eancia em Tiro d\u00e1 dano adicional aos seus tiros.\n&eO b\u00f4nus de dano da Profici\u00eancia em Tiro aumenta conforme voc\u00ea\n&esobe de n\u00edvel em arquearia.\n&eCom as configura\u00e7\u00f5es padr\u00e3o, o seu dano com flechas aumenta em 10%\n&ea cada n\u00edvel, at\u00e9 um m\u00e1ximo de 200% de b\u00f4nus de dano. +Guides.Archery.Section.2=&3Como o Atordoamento funciona?\n&eVoc\u00ea tem uma chance passiva de atordoar outros jogadores quando\n&eatira neles. Quando o Atordoamento \u00e9 ativado, ele for\u00e7a o inimigo\n&ea olhar para cima por um curto per\u00edodo de tempo.\n&eUm tiro Atordoante tamb\u00e9m tem um dano adiconal de 4 (2 cora\u00e7\u00f5es). +Guides.Archery.Section.3=&3Como Recupera\u00e7\u00e3o de Flechas funciona?\n&eVoc\u00ea tem uma chance passiva de recuperar algumas flechas\n&equando voc\u00ea mata um mob com o arco.\n&eEssa chance aumenta conforme voc\u00ea sobe de n\u00edvel em Arquearia.\n&ePor padr\u00e3o, essa habilidade aumenta 0.1% por n\u00edvel, at\u00e9 um m\u00e1ximo de 100%\n&eno n\u00edvel 1000. +##Machados +Guides.Axes.Section.0=&3Sobre Machados:\n&eCom a habilidade de Machados voc\u00ea pode usar seu machado para muito mais coisas do que\n&eapenas desflorestamento! Voc\u00ea pode fazer picadinho de mobs \n&ee de jogadores para ganhar XP, batendo nos mobs com o efeito de\n&erepuls\u00e3o e inflingir cr\u00edticos MORTAIS em mobs e jogadores\n&eSeu machado tamb\u00e9m se torna um cortador de madeira port\u00e1til,\n&equebre a armadura dos inimigos com facilidade conforme seu n\u00edvel\n&eaumenta.\n&3COMO GANHAR XP:\n&ePara ganhar XP nesta habilidade, voc\u00ea precisa acertar mobs ou outros jogadores\n&eCom um machado. +Guides.Axes.Section.1=&3Como Racha Cr\u00e2nio funciona?\n&eEssa habilidade te permite dar dano em \u00e1rea.\n&eEsse dano em \u00e1rea da metade do dano que voc\u00ea deu\n&eno alvo principal, ent\u00e3o \u00e9 bom para matar grandes hordas de mobs. +Guides.Axes.Section.2=&3Como Golpes cr\u00edticos funciona?\n&eGolpes cr\u00edticos \u00e9 uma habildiade passiva que concede ao jogador a\n&echance de dar dano adicional.\n&eCom as configura\u00e7\u00f5es padr\u00e3o, cada 2 n\u00edveis te concede\n&e0.1% de chance de dar um Golpe cr\u00edtico, 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 \u00e9 uma habildiade passiva que concede dano adicional\n&eao seus golpes quando se est\u00e1 usando um Machado.\n&eCom as configura\u00e7\u00f5es padr\u00e3o, esse dano adicional aumenta em 1 a cada 50 n\u00edveis,\n&eat\u00e9 um m\u00e1ximo de 4 no n\u00edvel 200. +Guides.Axes.Section.4=&3Como o Impacto na armadura funciona?\n&eAtaca com for\u00e7a 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\u00ea sobe de n\u00edvel em Machados. +Guides.Axes.Section.5=&3Como Grande Impacto funciona?\n&eVoc\u00ea tem uma chance passiva de dar um Grande Impacto quando\n&ebate em um mob ou jogador com o seu machado.\n&ePor padr\u00e3o essa chance \u00e9 de 25%. Essa habilidade passiva tem um\n&eefeito de repuls\u00e3o muito grande, parecido com o encamento de\n&eRepuls\u00e3o II. Al\u00e9m disso, ele d\u00e1 dano adicional no alvo. +##ESCAVAÇÃO +Guides.Excavation.Section.0=&3Sobre Escava\u00e7\u00e3o:\n&eEscava\u00e7\u00e3o \u00e9 o ato de cavar terra para encontrar tesouros.\n&eAo escavar voc\u00ea encontrar\u00e1 tesouros.\n&eQuanto mais voc\u00ea faz isso, mais tesouros pode encontrar.\n\n&3COMO GANHAR XP:\n&ePara ganhar XP nesta habilidade, voc\u00ea deve cavar com uma p\u00e1.\n&eApenas certos materiais podem ser cavados para tesouros e XP. +Guides.Excavation.Section.1=&3M\u00e1terias compat\u00edveis:\n&eGrama, Terra, Areia, Argila, Cascalho, Mic\u00e9lio, Areia das Almas, Neve +Guides.Excavation.Section.2=&3Como usar a Super Broca:\n&eCom uma p\u00e1 na m\u00e3o, clique com o bot\u00e3o direito para preparar sua ferramenta\n&eQuando estiver neste estado, voc\u00ea tem cerca de 4 segundos para entrar\n&entrar em contato com M\u00e1terias compat\u00edveis com Escava\u00e7\u00e3o, isso ir\u00e1\n&eativar a Super Broca. +Guides.Excavation.Section.3=&3O que \u00e9 Super Broca?\n&eSuper Broca \u00e9 uma hablidade com cooldown\n&eligada com a habilidade de Escava\u00e7\u00e3o. Ela triplica sua chance\n&ede encontrar tesouros e ativa quebra instant\u00e2nea\n&ede M\u00e1terias de Escava\u00e7\u00e3o. +Guides.Excavation.Section.4=&3Como arqueologia funciona?\n&eCada tipo de tesouro de Escava\u00e7\u00e3o tem sue pr\u00f3prio\n&en\u00edvel de habilidade necess\u00e1rio para dropar, assim \u00e9\n&e dif\u00edcil dizer o quanto isso est\u00e1 te ajudando.\n&eApenas tenha em mente que quanto maior for sua habilidade de Escava\u00e7\u00e3o\n&mais tesouros podem ser encontrados.\n&eE tamb\u00e9m tenha em mente que cada tipo de material compat\u00edvel com\n&eEscava\u00e7\u00e3o tem sua pr\u00f3pria lista \u00fanica de tesouros.\n&eIResumindo, voc\u00ea encontrar\u00e1 diferentes tesouros em Terra\n&edo que em cascalho. +Guides.Excavation.Section.5=&3Notas sobre Escava\u00e7\u00e3o:\n&eOs drops de Escava\u00e7\u00e3o s\u00e3o totalmente costumiz\u00e1veis\n&eEnt\u00e3o os resultados variam de servidor para servidor. +##Pesca +Guides.Fishing.Section.0=&3Sobre Pesca:\n&eCom a habilidade de pesca, Pesca \u00e9 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\u00e7ador 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\u00edveis podem\n&edropar em qualquer n\u00edvel. No entanto, depende da raridade do item e da frequ\u00eancia com que ele dropa.\n&eQuanto maior for o n\u00edvel de pesca, melhor\n&es\u00e3o suas chances de encontrar tesouros. +Guides.Fishing.Section.2=&3Como Pesca no Gelo funciona?\n&eEsta habilidade passiva permite que voc\u00ea pesque em lagos de gelo!\n&eUse sua vara de pesca em um lago de gelo e a habilidade ir\u00e1\n&ecriar um pequeno buraco no gelo onde voc\u00ea poder\u00e1 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\u00ea 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\u00ea sacuda mobs fazendo-os derrubar itens\n&eHookando eles com a vara de pescar.\n&eMobs v\u00e3o dropar itens que normalmente dropariam ao morrer.\n&eTamb\u00e9m \u00e9 poss\u00edvel conseguir cr\u00e2nios de mobs, que normalmente s\u00e3o\n&eimposs\u00edveis de serem obtidos no modo de sobreviv\u00eancia. +Guides.Fishing.Section.5=&3Como Dieta de Pescador funciona?\n&eEsta \u00e9 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\u00e3o totalmente costumiz\u00e1veis\n&eEnt\u00e3o os resultados variam de servidor para servidor. +##Herbalismo +Guides.Herbalism.Section.0=&3Sobre Herbalismo:\n&eHerbalismo \u00e9 sobre coletar ervas e plantas.\n\n\n&3COMO GANHAR XP:\n&eColete plantas e ervas. +Guides.Herbalism.Section.1=&3Blocos compat\u00edveis\n&eTrigo, Batatas, Cenouras, Melancias, \n&eAb\u00f3bora, Cana-de-a\u00e7\u00facar, Sementes de Cacau, Flores, Cacto, Cogumelos,\n&eFundo do Nether, V\u00edtoria-r\u00e9gia, and Trepadeiras. +Guides.Herbalism.Section.2=&3Como Terra Verde Funciona?\n&eTerra Verde \u00e9 uma habildade ativa, voc\u00ea pode clicar com o bot\u00e3o 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\u00e9m da ao jogador a habilidade de\n&eespalhar a vida em blocos e transform\u00e1-lo usando sementes\n&edo seu invent\u00e1rio. +Guides.Herbalism.Section.3=&3Como Polegar Verde funciona (em planta\u00e7\u00e3o)?\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\u00ea transforme esses blocos\n&e em suas contra-partes"com plantas". Voc\u00ea consegue fazer isso usando o bot\u00e3o direito em\n&eum bloco, enquanto segura sementes. Isto ir\u00e1 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\u00e3es, 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\u00e3o 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\u00e7\u00e3o:\n&eMinera\u00e7\u00e3o consiste em minerar pedras e min\u00e9rios. Fornece b\u00f4nus\n&ena quantidade de materiais dropados enquanto minera.\n\n&3COMO GANHAR XP:\n&ePara ganhar XP nesta habilidade, voc\u00ea deve minerar com uma picareta na m\u00e3o.\n&eApenas alguns blocos d\u00e3o XP. +Guides.Mining.Section.1=&3Materiais compat\u00edveis:\n&ePedra, Min\u00e9rio de Carv\u00e3o, Min\u00e9rio de Ferro, Min\u00e9rio de Ouro, Min\u00e9rio de diamante, Min\u00e9rio de Redstone,\n&eMin\u00e9rio de l\u00e1pis-laz\u00fali, 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\u00e3os, clique com o bot\u00e3o direito para deixar sua picareta preparada.\n&eQuando ela estiver nesse estado, voc\u00ea tem cerca de 4 segundos para fazer contato\n&ecom materiais compat\u00edveis com minera\u00e7\u00e3o, o que ir\u00e1 ativar a Super\n&eQuebra. +Guides.Mining.Section.3=&3O que \u00e9 Super Quebra?\n&eSuper Quebra \u00e9 uma habilidade com cooldown vinculado a habilidade\n&eMinera\u00e7\u00e3o. Ele triplica sua chance de itens extras serem dropados e\n&ehabilita a quebra instant\u00e2nea de materiais de Minera\u00e7\u00e3o +Guides.Mining.Section.4=&3Como usar Minera\u00e7\u00e3o Explosiva:\n&eCom uma picareta na m\u00e3o,\n&eagache-se e clique com o bot\u00e3o direito do mouse em uma TNT \u00e0 dist\u00e2ncia. Isso far\u00e1 com que a TNT\n&eexploda instantaneamente. +Guides.Mining.Section.5=&3Como Minera\u00e7\u00e3o Explosiva funciona?\n&eMinera\u00e7\u00e3o \u00e9 uma habilidade com um cooldown vinculado a habilidade\n&eMinera\u00e7\u00e3o. A habilidade d\u00e1 b\u00f4nus ao minerar com TNT e permite que voc\u00ea\n&edetone TNT remotamente. Tem 3 partes da Minera\u00e7\u00e3o Explosiva.\n&eA primeira \u00e9 Bombas Maiores\n&eA segunda \u00e9 Especialista em Demoli\u00e7\u00e3o, que diminui o dano\n&eproveniente de explos\u00f5es de TNT. A terceira simplesmente aumenta a\n&equantidade de min\u00e9rios dropados usando TNT e diminui os\n&edetritos dropados. +##Reparação +Guides.Repair.Section.0=&3Sobre Repara\u00e7\u00e3o:\n&eRepara\u00e7\u00e3o peemite que voc\u00ea 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 \u00e9 um\n&epor padr\u00e3o, um bloco de ferro e n\u00e3o deve ser confundido com\n&eA bigorna do Minecraft cl\u00e1ssico. +Guides.Repair.Section.1=&3Como posso usar a Repara\u00e7\u00e3o?\n&eColoque uma bigorna do mcMMO e clique com o bot\u00e3o direito para reparar o item\n&eque voc\u00ea est\u00e1 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 \u00e9 influenciada pelo seu n\u00edvel de habilidade de Repara\u00e7\u00e3o. +Guides.Repair.Section.3=&3Como Super Reparo Funciona?\n&eSuper Reparo \u00e9 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\u00ea conserte itens com uma certa chance de\n&emanter seus encantamentos. Os encantamentos podem\n&emanter seus n\u00edveis atuais, diminuir de n\u00edvel,\n&eou perder totalmente o encantamento. +##Recuperação +Guides.Salvage.Section.0=&3Sobre Recupera\u00e7\u00e3o:\n&eRecupera\u00e7\u00e3o permite que voc\u00ea use um bloco de ouro para recuperar armaduras e\n&eferramentas.\n\n&3COMO GANHAR XP:\n&eRecupera\u00e7\u00e3o \u00e9 uma habilidade dependente de Repara\u00e7\u00e3o e Pesca, seu n\u00edvel de Repara\u00e7\u00e3o \u00e9 baseado em seus n\u00edveis das habilidades Pesca e Repara\u00e7\u00e3o. +Guides.Salvage.Section.1=&3Como posso usar Repara\u00e7\u00e3o?\n&eColoque uma bigorna de Recupera\u00e7\u00e3o do mcMMO e clique com o bot\u00e3o direito para Recuperar\n&eo item que voc\u00ea est\u00e1 segurando no momento. Isso ir\u00e1 quebrar o item,\n&ee ir\u00e1 te devolver os materiais usados para fabricar o item.\n\n&ePor exemplo, recuperar uma picareta de ferro lhe dar\u00e1 barras de ferro. +Guides.Salvage.Section.2=&3Como Repara\u00e7\u00e3o avan\u00e7ada funciona?\n&eQuando desbloqueada, essa habilidade permite que voc\u00ea repare itens danificados.\n&eA porcentagem de rendimento aumenta conforme voc\u00ea sobe de n\u00edvel. Um rendimento maior\n&e=significa que voc\u00ea pode obter mais materiais de volta.\n&eCom a Repara\u00e7\u00e3o avan\u00e7ada, voc\u00ea sempre receber\u00e1 1 material de volta,\n&ea menos que o item esteja muito danificado. Ent\u00e3o n\u00e3o tem que se preocupar\n&eem destruir um item sem recuperar nada. +Guides.Salvage.Section.3=&3Para ilustrar como isso funciona, aqui est\u00e1 um exemplo:\n&eDigamos que Recuperamos uma picareta de ouro que estava 20% danificada,\n&eisso significa que o valor m\u00e1ximo que voc\u00ea pode obter de volta \u00e9 apenas 2\n&e(Porque a picareta \u00e9 feita com 3 barras - cada uma conrespondendo a\n&e33,33% de durabilidade) O que \u00e9 igual a 66%. Se a sua porcentagem de\n&erendimento estiver abaixo de 66% voc\u00ea n\u00e3o vai conseguir recuperar 2 barras.\n&eSe estiver acima desse valor, voc\u00ea pode receber o "valor total",\n&eo que significa que voc\u00ea receber\u00e1 2 barras. +Guides.Salvage.Section.4=&3Como funciona Recupera\u00e7\u00e3o Arcana?\n&eEssa habilidade permite que voc\u00ea obtenha livros de encantamentos ao recuperar\n&eitens encantados. dependendo do seu n\u00edvel, a chance de\n&eextrair com sucesso um encantamento total ou parcial varia.\n\n&eQuando um encantamento \u00e9 parcialmente extra\u00eddo, o livro de\n&encantamento ter\u00e1 um n\u00edvel de encantamento menor em compara\u00e7\u00e3o\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\u00f4nus de combate para aqueles que lutam com uma\n&eespada.\n\n&3COMO GANHAR XP:\n&eXP \u00e9 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 \u00e9 uma habilidade ativa, voc\u00ea pode ativ\u00e1-la\n&eclicando com o bot\u00e3o direito com uma espada. Esta habilidade te permite dar \n&edano em \u00e1rea. Esse dano em \u00e1rea 25% de dano\n&eb\u00f4nus e pode causar Ruptura. +Guides.Swords.Section.2=&3Como Contra-Ataque funciona?\n&eContra-Ataque \u00e9 uma habilidade ativa. quando bloquear e receber\n&egolpes de mobs, voc\u00ea ter\u00e1 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\u00e1 sangrar at\u00c9 que o efeito acabe, ou ele morra, \n&eo que vier primeiro.\n&eA dura\u00e7\u00e3o do sangramento aumenta com o n\u00edvel da sua habilidade de Espadas. +##Adestramento +Guides.Taming.Section.0=&3Sobre Adestramento:\n&eAdestramento dar\u00e1 aos jogadores v\u00e1rios b\u00f4nus de combate ao usar\n&elobos domados.\n\n&3COMO GANHAR XP:\n&epara ganhar XP nessa habilidade voc\u00ea ter\u00e1 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 \u00e9 uma habilidade que te permite invocar\n&eum lobo ou uma jaguatirica do seu lado. Voc\u00ea pode fazer isso \n&eagachando + clicando com o bot\u00e3o 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\u00e7\u00e3o e verifiquem as\n&estat\u00edsticas de lobos e jaguatiricas. Clique com o bot\u00e3o esquerdo em um lobo ou jaguatirica para usar\n&eConhecimento de Feras. +Guides.Taming.Section.3=&3Como mordida funciona?\n&eMordida \u00e9 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\u00e1 b\u00f4nus de dano para o dano causado\n&epor lobos. O b\u00f4nus de dano depende do seu n\u00edvel de Adestramento. +Guides.Taming.Section.5=&3Como Consci\u00eancia Ambiental funciona?\n&eEssa habilidade passiva permitir\u00e1 que seus lobos se teletransportem para voc\u00ea quando\n&eeles se aproximarem de coisas perigosas como cacto e Lava. Tamb\u00e9m dar\u00e1\n&eimunidade a dano por queda para os lobos. +Guides.Taming.Section.6=&3Como Pelo Grosso funciona?\n&eEsta habilidade passiva reduzir\u00e1 o dano e faz os lobos serem \n&eresistentes ao fogo. +Guides.Taming.Section.7=&3Como Resist\u00eancia a impactos funciona?\n&eEsta habilidade passiva reduz o dano recebido pelos lobos\n&ede explos\u00f5es. +Guides.Taming.Section.8=&3Como Servi\u00e7o de Fast Food funciona?\n&eEsta habilidade passiva d\u00e1 aos lobos chance de se curarem sempre que\n&eatacarem. +##Desarmado +Guides.Unarmed.Section.0=&3Sobre Desarmado:\n&eDesarmado d\u00e1 aos jogadores v\u00e1rios b\u00f4nus de combate ao usar\n&eseus punhos como armas. \n\n&3GANHO DE XP:\n&eXP \u00e9 recebida baseada na quantidade de dano causada a mobs\n&eou em outros jogadores quando voc\u00ea est\u00e1 desarmado. +Guides.Unarmed.Section.1=&3Como F\u00faria funciona?\n&eF\u00faria \u00e9 uma habilidade ativa que \u00e9 ativada\n&e clicando com o bot\u00e3o direito. Enquanto estiver no modo de F\u00faria voc\u00ea dar\u00e1 50% mais de\n&edano e poder\u00e1 quebrar materiais fr\u00e1geis instantaneamente, como\n&eTerra e Grama. +Guides.Unarmed.Section.2=&3Como Estilo bra\u00e7o de A\u00e7o funciona?\n&eEstilo bra\u00e7o de A\u00e7o 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 \u00e9 uma habilidade passiva que te d\u00e1 chance\n&ede refletir flechas atiradas por Esqueletos ou outros jogadores.\n&eA flecha cair\u00e1 no ch\u00e3o sem causar danos ao jogador. +Guides.Unarmed.Section.4=&3Como Punho de ferro funciona?\n&ePunho de ferro \u00e9 uma habilidade passiva que neutraliza a habilidade desarmamento. Conforme seu \n&en\u00edvel de desarmado aumenta, a chance de prevenir que voc\u00ea seja desarmado tamb\u00e9m 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\u00e3o. +##Corte de Árvore +Guides.Woodcutting.Section.0=&3Sobre Corte de \u00c1rvore:\n&eCorte de \u00c1rvore \u00e9 sobre derrubar \u00c1rvores.\n\n&3COMO GANHAR XP:\n&eXP \u00e9 obtida sempre que voc\u00ea quebra blocos de madeira. +Guides.Woodcutting.Section.1=&3Como Lenhador funciona?\n&eLenhador \u00e9 uma habilidade ativa, voc\u00ea pode clicar com o bot\u00e3o direito\n&eenquanto segura um machado para ativar a habilidade Lenhador. Ir\u00e1\n&efazer com que a \u00c1rvore inteira seja quebrada instantaneamente, dropando todos\n&eos blocos de madeira de uma vez s\u00f3. +Guides.Woodcutting.Section.2=&3Como Soprador de Folhas funciona?\n&eSoprador de Folhas \u00e9 uma habilidade passiva que far\u00e1 com que os blocos de\n&efolha se quebrem instantaneamente uando atingido por um machado. Por padr\u00e3o\n&eessa habilidade \u00e9 desbloqueada no n\u00edvel 100. +Guides.Woodcutting.Section.3=&3Como Drops duplos funcionam?\n&eEsta habilidade passiva te d\u00e1 a chance de obter um bloco\n&eextra para cada bloco de madeira que voc\u00ea corta. -Stats.Header.Combat=&6-=SKILLS DE COMBATE=- -Stats.Header.Gathering=&6-=SKILLS DE RECOLHA=- -Stats.Header.Misc=&6-=OUTRAS SKILLS=- -Scoreboard.Header.PlayerCooldowns=&emcMMO Restantes -Scoreboard.Misc.CurrentXP=&aXP Atual -Scoreboard.Misc.RemainingXP=&eXP Restante -Scoreboard.Misc.Cooldown=&dFaltando +#INSPECIONAR +Inspect.Offline= &cVoc\u00ea n\u00e3o tem permiss\u00e3o para inspecionar jogadores offline! +Inspect.OfflineStats=Estat\u00edsticas do mcMMO do jogador offline &e{0} +Inspect.Stats=&aEstat\u00edsticas do mcMMO do jogador &e{0} +Inspect.TooFar=Voc\u00ea est\u00e1 muito longe para inspecionar esse jogador! + +#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\u00ea para a sua cama. +Item.ChimaeraWing.NotEnough=Voc\u00ea precisa &e{0}&c mais &6{1}&c! +Item.NotEnough=Voc\u00ea precisa &e{0}&c mais &6{1}&c! +Item.Generic.Wait=Voc\u00ea precisa esperar para poder usar isso de novo! &e({0}s) +Item.Injured.Wait=Voc\u00ea 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\u00e9rios. +Item.FluxPickaxe.Lore.2=&7Necessita de fundi\u00e7\u00e3o n\u00edvel {0}+ + +#TELETANSPORTE +Teleport.Commencing=&7Come\u00e7\u00e3ndo o teletransporte em &6({0}) &7segundos, por favor, fique parado... +Teleport.Cancelled=&4Teletransporte cancelado! + +#HABILIDADES +Skills.Child=&6(HABILIDADES DEPENDENTES) +Skills.Disarmed=&4Voc\u00ea foi desarmado! +Skills.Header=-----[] &a{0}&c []----- +Skills.NeedMore=&4Voc\u00ea precisa de mais &7{0} +Skills.NeedMore.Extra=&4Voc\u00ea 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\u00e1ximo +Skills.TooTired=Voc\u00ea est\u00e1 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\u00e3o direito de novo para confirmar &6{0}&a. clique no bot\u00e3o esquerdo para cancelar. +Skills.AbilityGateRequirementFail=&7Voc\u00ea precisa de mais &e{0}&7 n\u00edveis 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\u00edsticas + +#VANTAGENS +Perks.XP.Name=Experi\u00eancia +Perks.XP.Desc=Receba b\u00f4nus de XP em certas habilidades. +Perks.Lucky.Name=Sorte +Perks.Lucky.Desc=D\u00e1 33.3% a mais de chance de ativar habilidades {0}. +Perks.Lucky.Desc.Login=D\u00e1 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\u00e7\u00e3o r\u00e1pida +Perks.Cooldowns.Desc=Diminui o cooldown em {0}. +Perks.ActivationTime.Name=Resist\u00eancia +Perks.ActivationTime.Desc=Aumenta o tempo de ativa\u00e7\u00e3o de habilidades por {0} segundos. +Perks.ActivationTime.Bonus=&6 ({0}s com a vantagem de resist\u00eancia) + +#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\u00ea perdeu &9{0}&4 n\u00edveis por ter morrido. +Hardcore.DeathStatLoss.PercentageChanged=&6[mcMMO] A porcentagem de perda de estat\u00edsticas 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\u00ea robou &9{0}&3 n\u00edveis de &e{1}. +Hardcore.Vampirism.Victim.Failure=&6[mcMMO] &e{0}&7 n\u00e3o conseguiu roubar conhecimento de voc\u00ea! +Hardcore.Vampirism.Victim.Success=&6[mcMMO] &e{0}&4 roubou &9{1}&4 n\u00edveis de voc\u00ea! +Hardcore.Vampirism.PercentageChanged=&6[mcMMO] A porcentagem de roubo de estat\u00edsticas foi alterada para {0}. + +#MOTD +MOTD.Donate=&3Informa\u00e7\u00f5es de Doa\u00e7\u00e3o: +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\u00edsticas por Vampirismo: &4{0}% +MOTD.PerksPrefix=&6[Vantagens do mcMMO] +MOTD.Version=&6[mcMMO] Rodando na vers\u00e3o &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\u00ea esteja gastando muito tempo fundindo nas cavernas.\nAumenta v\u00e1rias propriedades de fundi\u00e7\u00e3o. +Smelting.SubSkill.UnderstandingTheArt.Stat=Multiplicador de XP Cl\u00e1ssico: &e{0}x +Smelting.Ability.Locked.0=BLOQUEADO AT\u00c9 CHEGAR NO NÍVEL {0}+ HABILIDADE (Multiplicador de XP Cl\u00e1ssico) +Smelting.Ability.Locked.1=BLOQUEADO AT\u00c9 CHEGAR NO NÍVEL {0}+ HABILIDADE (MINERA\u00c7\u00c3O DERRETEDORA) +Smelting.SubSkill.FuelEfficiency.Name=Efici\u00eancia do combust\u00edvel +Smelting.SubSkill.FuelEfficiency.Description=Aumenta o tempo de queima do combust\u00edvel usando fornalhas durante a fundi\u00e7\u00e3o +Smelting.SubSkill.FuelEfficiency.Stat=Multiplicador de efici\u00eancia de combust\u00edvel: &e{0}x +Smelting.SubSkill.SecondSmelt.Name=Segunda fundi\u00e7\u00e3o +Smelting.SubSkill.SecondSmelt.Description=Dobra os recursos obtidos com fundi\u00e7\u00e3o +Smelting.SubSkill.SecondSmelt.Stat=Chance da segunda fundi\u00e7\u00e3o +Smelting.Effect.4=Aumento de Xp cl\u00e1ssico +Smelting.Effect.5=Aumenta a XP cl\u00e1ssica obtida durante a fundi\u00e7\u00e3o +Smelting.SubSkill.FluxMining.Name=Minera\u00e7\u00e3o Derretedora +Smelting.SubSkill.FluxMining.Description=Chance de que os min\u00e9rios sejam fundidos instantaneamente durante a minera\u00e7\u00e3o +Smelting.SubSkill.FluxMining.Stat=Chance de minera\u00e7\u00e3o derretedora +Smelting.Listener=Fundi\u00e7\u00e3o: +Smelting.SkillName=FUNDI\u00c7\u00c3O + +#DESRIÇÃO DOS COMANDOS +Commands.Description.addlevels=Adiciona n\u00edveis 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\u00e7\u00f5es detalhadas do mcMMO de outro jogador +Commands.Description.mcability=Ative/destive habilidades usadas com o bot\u00e3o 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\u00e7\u00e3o resumida do mcMMO +Commands.Description.mcnotify=Ative/desative as notifica\u00e7\u00f5es de bate-papo das habilidades do mcMMO +Commands.Description.mcpurge=Retira jogadores sem n\u00edveis do mcMMO e jogadores que n\u00e3o 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\u00edvel do mcMMO e XP +Commands.Description.mctop=Mostra a leaderboard do mcMMO +Commands.Description.mmoedit=Edita o n\u00edvel do mcMMO de um jogador +Commands.Description.mmodebug=Ativa/desativa o modo de debug que mostra informa\u00e7\u00f5es \u00fateis quando voc\u00ea 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\u00f3rmula 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\u00e1rias configura\u00e7\u00f5es 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\u00e7\u00f5es detalhadas de habilidades do mcMMO para {0} +Commands.Description.skillreset=Reseta os n\u00edveis 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\u00edfica 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\u00ea est\u00e1 usando uma vers\u00e3o antiga do mcMMO! +UpdateChecker.NewAvailable=Tem uma nova vers\u00e3o dispon\u00edvel no Spigot. + +#CABEÇALHO DO SCOREBOARD +Scoreboard.Header.PlayerStats=&eEstat\u00edsticas do mcMMO +Scoreboard.Header.PlayerCooldowns=&eCooldowns do mcMMO +Scoreboard.Header.PlayerRank=&eRanks do mcMMO +Scoreboard.Header.PlayerInspect=&eEstat\u00edsticas do mcMMO: {0} +Scoreboard.Header.PowerLevel=&cN\u00edvel de poder +Scoreboard.Misc.PowerLevel=&6N\u00edvel de poder +Scoreboard.Misc.Level=&3N\u00edvel +Scoreboard.Misc.CurrentXP=&aXP atual +Scoreboard.Misc.RemainingXP=&eXP que ainda falta +Scoreboard.Misc.Cooldown=&dCooldown Scoreboard.Misc.Overall=&6Geral +Scoreboard.Misc.Ability=Habilidade -#DATABASE RECOVERY -Profile.Loading.Success=&aSeu perfil mcMMO foi carregado. -Profile.Loading.Failure=&cmcMMO still cannot load your data. You may want to &bcontact the server owner.\n&eYou can still play on the server, but you will have &lno mcMMO levels&e and any XP you get &lwill not be saved&e. -Profile.Loading.AdminFailureNotice=&4[A]&c mcMMO was unable to load the player data for &e{0}&c. &dPlease inspect your database setup. -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. +#RECUPERAÇÃO DE BANCO DE DADOS +Profile.PendingLoad=&cOs seus dados de jogador do mcMMO ainda n\u00e3o foram carregados. +Profile.Loading.Success=&aO seu perfil mcMMO foi carregado com sucesso. +Profile.Loading.FailurePlayer=&cmcMMO est\u00e1 tendo problemas para carregar seus dados, n\u00f3s tentamos carreg\u00e1-lo &a{0}&c vezes.&c Voc\u00ea pode tentar entrar em contato com os admins do servidor para falar sobre esse problema.O mcMMO tentar\u00e1 carregar seus dados at\u00e9 que voc\u00ea se desconecte, voc\u00ea n\u00e3o ganhar\u00e1 e nem ser\u00e1 capaz de usar suas habilidades enquanto os dados n\u00e3o estiverem carregados. +Profile.Loading.FailureNotice=&4[A]&c mcMMO n\u00e3o conseguiu carregar os dados do jogador &e{0}&c. &dPor favor, verifique a configura\u00e7\u00e3o do seu banco de dados. Quantidade de tentativas feitas at\u00e9 agora {1}. +#Feriados +Holiday.AprilFools.Levelup=&6{0} agora est\u00e1 no n\u00edvel &a{1}&6! +Holiday.Anniversary=&9Feliz Anivers\u00e1rio de {0} anos!\n&9 em homenagem a todo o trabalho de nossr50 e todos os seus desenvolvedores, aqui est\u00e1 um show pirot\u00e9cnico! +#Mensagens de lembrete +Reminder.Squelched=&7Reminder: No momento, voc\u00ea n\u00e3o est\u00e1 recebendo notifica\u00e7\u00f5es do mcMMO, para habilitar as notifica\u00e7\u00f5es, digite /mcnotify de novo. Este \u00e9 um lembrete autom\u00e1tico de hora em hora. +#Linguagem +Locale.Reloaded=&aLinguagem recarregada! +#Coisas de level up dos jogadores +LevelCap.PowerLevel=&6(&amcMMO&6) &eVoc\u00ea chegou no N\u00edvel de Poder m\u00e1ximo em &c{0}&e. Voc\u00ea ir\u00e1 parar de subir de n\u00edvel de habilidades de agora em diante. +LevelCap.Skill=&6(&amcMMO&6) &eVoc\u00ea chegou no n\u00edvel m\u00e1xima de &c{0}&e em &6{1}&e. Voc\u00ea ir\u00e1 parar de subir de n\u00edvel de agora em diante. +Commands.XPBar.Usage=O jeito certo de usar \u00e9 /mmoxpbar +Commands.Description.mmoxpbar=Configura\u00e7\u00f5es da barra de XP do Jogador do mcMMO +Commands.Description.mmocompat=Informa\u00e7\u00f5es sobre o mcMMO e se est\u00e1 ou n\u00e3o em modo de compatibilidade ou totalmente funcional. +Compatibility.Layer.Unsupported=&6Compatibilidade com &a{0}&6 n\u00e3o \u00e9 funcional com esta vers\u00e3o do Minecraft. +Compatibility.Layer.PartialSupport=&6Compatibilidade com &a{0}&6 n\u00e3o \u00e9 totalmente funcional com esta vers\u00e3o do Minecraft, mas o mcMMO est\u00e1 executando um sistema secund\u00e1rio para emular alguns dos recursos ausentes. +Commands.XPBar.DisableAll=&6 Todas as barras de XP do mcMMO est\u00e3o desativadas agora, use /mmoxpbar reset para restaurar as configura\u00e7\u00f5es padr\u00e3o. +#Configurações do Chat Moderno +Chat.Style.Admin=&b(A) &r{0} &b\u2192 &r{1} +Chat.Style.Party=&a(G) &r{0} &a\u2192 &r{1} +Chat.Style.Party.Leader=&a(G) &r{0} &6\u2192 &r{1} +Chat.Identity.Console=&6* Console * +Chat.Channel.On=&6(&amcMMO-Chat&6) &eSuas mensagens digitadas no chat ser\u00e3o enviadas automaticamente para o chat &a{0}. +Chat.Channel.Off=&6(&amcMMO-Chat&6) &7Suas mensagens digitadas n\u00e3o ser\u00e3o mais enviadas automaticamente para chats espec\u00edficos. +Chat.Spy.Party=&6[&eESPI\u00c3O&6-&a{2}&6] &r{0} &b\u2192 &r{1} +Broadcasts.LevelUpMilestone=&6(&amcMMO&6) {0}&7 chegou no n\u00edvel &a{1}&7 em &3{2}&7! +Broadcasts.PowerLevelUpMilestone=&6(&amcMMO&6) {0}&7 chegou no N\u00edvel de Poder &a{1}&7! +Scoreboard.Recovery=Tentando recuperar o scoreboard do mcMMO... \ No newline at end of file From eb10bcbc96212434a5e575e5ff31259f0c0b2343 Mon Sep 17 00:00:00 2001 From: lexikiq Date: Mon, 31 May 2021 12:08:06 -0400 Subject: [PATCH 546/662] Disable launching from Minecart Anti-AFK (#4508) --- src/main/java/com/gmail/nossr50/listeners/PlayerListener.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java index 0ffa69824..294911528 100644 --- a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java @@ -794,7 +794,6 @@ 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(); From cbaef4a092b07fe2e10aebd58845c2f94f0dfc32 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 31 May 2021 09:09:45 -0700 Subject: [PATCH 547/662] Update changelog --- Changelog.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/Changelog.txt b/Changelog.txt index 17f51363b..8749d5825 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,5 +1,6 @@ Version 2.1.197 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) From 6dbc7adf48132dfaa30c4cc29bee7bb3afa44e8d Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 3 Jun 2021 13:44:56 -0700 Subject: [PATCH 548/662] Add glow_squid, goat, and axolotl to experience.yml --- Changelog.txt | 3 +++ src/main/resources/experience.yml | 7 ++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index 8749d5825..5b90baac6 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -3,6 +3,9 @@ Version 2.1.197 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 + Added Axolotl to experience.yml + Added Glow_Squid to experience.yml NOTES: If you run into any issues with ViaVersion or ViaBackwards, use the latest dev builds for each. diff --git a/src/main/resources/experience.yml b/src/main/resources/experience.yml index 4cbbfd080..05025619b 100644 --- a/src/main/resources/experience.yml +++ b/src/main/resources/experience.yml @@ -488,6 +488,8 @@ Experience_Values: Fox: 1000 Panda: 1000 Bee: 100 + Goat: 250 + Axolotl: 600 Combat: Multiplier: Animals: 1.0 @@ -556,4 +558,7 @@ Experience_Values: Zombie_Pigman: 3.0 Zombified_Piglin: 3.0 Strider: 1.2 - Zoglin: 2.5 \ No newline at end of file + Zoglin: 2.5 + Goat: 1.5 + Axolotl: 1.75 + Glow_Squid: 1.5 From e74e1e6829705586cf8b3240aee0bf0a1dd50e9e Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 3 Jun 2021 14:04:08 -0700 Subject: [PATCH 549/662] Add Amethyst related blocks to experience.yml and update Super Breaker --- Changelog.txt | 9 +++++++++ .../gmail/nossr50/util/MaterialMapStore.java | 18 ++++++++++++------ src/main/resources/experience.yml | 8 ++++++++ 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 5b90baac6..136bbf1b3 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -6,6 +6,15 @@ Version 2.1.197 Added Goat to experience.yml Added Axolotl to experience.yml Added Glow_Squid to experience.yml + Updated Super Breaker to recognize the new mining blocks + 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 NOTES: If you run into any issues with ViaVersion or ViaBackwards, use the latest dev builds for each. diff --git a/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java b/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java index 8395711a7..15c962407 100644 --- a/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java +++ b/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java @@ -307,10 +307,6 @@ public class MaterialMapStore { intendedToolPickAxe.add("stone_button"); intendedToolPickAxe.add("stone_pressure_plate"); intendedToolPickAxe.add("terracotta"); - intendedToolPickAxe.add("amethyst_bud"); - intendedToolPickAxe.add("amethyst_cluster"); - intendedToolPickAxe.add("block_of_amethyst"); - intendedToolPickAxe.add("budding_amethyst"); intendedToolPickAxe.add("ancient_debris"); intendedToolPickAxe.add("crying_obsidian"); intendedToolPickAxe.add("glowing_obsidian"); //be @@ -395,6 +391,16 @@ public class MaterialMapStore { intendedToolPickAxe.add("waxed_cut_copper_stairs"); intendedToolPickAxe.add("waxed_lightly_weathered_cut_copper_stairs"); + //1.17 + 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"); + } private void fillArmors() { @@ -1269,11 +1275,11 @@ public class MaterialMapStore { toolBlackList.add("sweet_berry_bush"); } - public boolean isIntendedToolPickaxe(Material material) { + public boolean isIntendedToolPickaxe(@NotNull Material material) { return intendedToolPickAxe.contains(material.getKey().getKey()); } - public boolean isIntendedToolPickaxe(String string) { + public boolean isIntendedToolPickaxe(@NotNull String string) { return intendedToolPickAxe.contains(string); } diff --git a/src/main/resources/experience.yml b/src/main/resources/experience.yml index 05025619b..eabc960c0 100644 --- a/src/main/resources/experience.yml +++ b/src/main/resources/experience.yml @@ -380,6 +380,14 @@ Experience_Values: Lily_Of_The_Valley: 150 Wither_Rose: 500 Mining: + Calcite: 400 + Smooth_Basalt: 300 + Block_Of_Amethyst: 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 From c28c8d164a8af7ff0f9a935468e2b266a9c1be39 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 3 Jun 2021 14:20:00 -0700 Subject: [PATCH 550/662] Adding more 1.17 support --- Changelog.txt | 16 ++++++++++++++++ .../com/gmail/nossr50/util/MaterialMapStore.java | 2 ++ src/main/resources/config.yml | 13 +++++++++++++ src/main/resources/experience.yml | 3 +++ 4 files changed, 34 insertions(+) diff --git a/Changelog.txt b/Changelog.txt index 136bbf1b3..13ae5e089 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,4 +1,5 @@ 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) @@ -15,8 +16,23 @@ Version 2.1.197 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 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 Cobbled Deepslate to experience.yml for Smelting NOTES: + You shouldn't need to edit your configs for this update, your configs should update automatically. If you run into any issues with ViaVersion or ViaBackwards, use the latest dev builds for each. Version 2.1.196 diff --git a/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java b/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java index 15c962407..ed306198f 100644 --- a/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java +++ b/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java @@ -400,6 +400,8 @@ public class MaterialMapStore { intendedToolPickAxe.add("large_amethyst_bud"); intendedToolPickAxe.add("amethyst_cluster"); intendedToolPickAxe.add("budding_amethyst"); + intendedToolPickAxe.add("deepslate"); + intendedToolPickAxe.add("cobbled_deepslate"); } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 563a4dc0c..2c8f1f111 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -513,6 +513,17 @@ Bonus_Drops: Peony: true Lily_Of_The_Valley: true Mining: + 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 @@ -589,6 +600,8 @@ Bonus_Drops: Nether_Quartz: true Quartz: true Redstone: true + Deepslate: true + Cobbled_Deepslate: true # # Settings for commands diff --git a/src/main/resources/experience.yml b/src/main/resources/experience.yml index eabc960c0..c7fcfd0a0 100644 --- a/src/main/resources/experience.yml +++ b/src/main/resources/experience.yml @@ -380,6 +380,8 @@ Experience_Values: Lily_Of_The_Valley: 150 Wither_Rose: 500 Mining: + Deepslate: 30 + Cobbled_Deepslate: 15 Calcite: 400 Smooth_Basalt: 300 Block_Of_Amethyst: 500 @@ -481,6 +483,7 @@ Experience_Values: Nether_Quartz_Ore: 25 Redstone_Ore: 15 Nether_Gold_Ore: 35 + Cobbled_Deepslate: 5 Taming: Animal_Taming: Llama: 1200 From 97cfb1cfc75e6af320946bac05ceccb50fa689ff Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 3 Jun 2021 14:23:19 -0700 Subject: [PATCH 551/662] More 1.17 support --- .../com/gmail/nossr50/util/compat/CompatibilityManager.java | 5 ++++- src/main/java/com/gmail/nossr50/util/nms/NMSVersion.java | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) 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 1b78a55df..13d05ea1f 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/CompatibilityManager.java +++ b/src/main/java/com/gmail/nossr50/util/compat/CompatibilityManager.java @@ -77,7 +77,8 @@ public class CompatibilityManager { } private void initWorldCompatibilityLayer() { - if((minecraftGameVersion.getMinorVersion().asInt() >= 16 && minecraftGameVersion.getPatchVersion().asInt() >= 4) + if(minecraftGameVersion.getMinorVersion().asInt() > 17 + || (minecraftGameVersion.getMinorVersion().asInt() >= 16 && minecraftGameVersion.getPatchVersion().asInt() >= 4) || minecraftGameVersion.getMajorVersion().asInt() >= 2) { if(hasNewWorldMinHeightAPI()) { worldCompatibilityLayer = new WorldCompatibilityLayer_1_16_4(); @@ -213,6 +214,8 @@ public class CompatibilityManager { } else if(minecraftGameVersion.getPatchVersion().asInt() >= 5) { return NMSVersion.NMS_1_16_5; } + case 17: + return NMSVersion.NMS_1_17; } } 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 4b2ce5c57..8c1e3c8b4 100644 --- a/src/main/java/com/gmail/nossr50/util/nms/NMSVersion.java +++ b/src/main/java/com/gmail/nossr50/util/nms/NMSVersion.java @@ -22,6 +22,7 @@ public enum NMSVersion { 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"); From 619eec7667abc5bf05bfa1b742a0dfc8d8fde431 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 3 Jun 2021 14:34:36 -0700 Subject: [PATCH 552/662] Add new 'raw' ores to experience values and bonus drops --- Changelog.txt | 9 +++++++++ src/main/resources/config.yml | 4 +++- src/main/resources/experience.yml | 3 +++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index 13ae5e089..e7d99b118 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -8,6 +8,7 @@ Version 2.1.197 Added Axolotl to experience.yml Added Glow_Squid to experience.yml Updated Super Breaker to recognize the new mining blocks + Added Calcite to experience.yml for Mining Added Smooth Basalt to experience.yml for Mining Added Block_Of_Amethyst to experience.yml for Mining @@ -18,6 +19,7 @@ Version 2.1.197 Added Amethyst Cluster to experience.yml for Mining Added Deepslate to experience.yml for Mining Added Cobbled Deepslate to experience.yml for Mining + 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 @@ -29,7 +31,14 @@ Version 2.1.197 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 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 NOTES: You shouldn't need to edit your configs for this update, your configs should update automatically. diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 2c8f1f111..1015bea7d 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -568,6 +568,9 @@ Bonus_Drops: Sandstone: true Stone: true Cobblestone: true + Raw_Copper: true + Raw_Iron: true + Raw_Gold: true Woodcutting: Crimson_Hyphae: true Warped_Hyphae: true @@ -601,7 +604,6 @@ Bonus_Drops: Quartz: true Redstone: true Deepslate: true - Cobbled_Deepslate: true # # Settings for commands diff --git a/src/main/resources/experience.yml b/src/main/resources/experience.yml index c7fcfd0a0..298ecb9a6 100644 --- a/src/main/resources/experience.yml +++ b/src/main/resources/experience.yml @@ -473,12 +473,15 @@ Experience_Values: String: 1.8 Other: 1.5 Smelting: + Raw_Copper: 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_Ore: 40 Nether_Quartz_Ore: 25 Redstone_Ore: 15 From 4e6e58d9caf69c7c500c8af5b0938022664a95e0 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sun, 6 Jun 2021 11:18:03 -0700 Subject: [PATCH 553/662] Add more support for 1.17 (mining related) --- Changelog.txt | 39 +++++++++++++++++-- .../gmail/nossr50/util/MaterialMapStore.java | 16 +++++++- src/main/resources/config.yml | 10 +++++ src/main/resources/experience.yml | 20 ++++++++++ 4 files changed, 79 insertions(+), 6 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index e7d99b118..f3fe15e07 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -4,10 +4,10 @@ Version 2.1.197 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 - Added Axolotl to experience.yml - Added Glow_Squid to experience.yml - Updated Super Breaker to recognize the new mining blocks + 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 + Updated Super Breaker to recognize the new pick-axe appropriate blocks Added Calcite to experience.yml for Mining Added Smooth Basalt to experience.yml for Mining @@ -19,6 +19,16 @@ Version 2.1.197 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 Amethyst Shard to Bonus Drops for Mining in config.yml Added Calcite to Bonus Drops for Mining in config.yml @@ -34,14 +44,35 @@ Version 2.1.197 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: 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 diff --git a/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java b/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java index ed306198f..02f863695 100644 --- a/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java +++ b/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java @@ -206,16 +206,29 @@ 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("copper_ore"); } private void fillIntendedTools() { intendedToolPickAxe.addAll(ores); + intendedToolPickAxe.add("lapis_lazuli_ore"); intendedToolPickAxe.add("ice"); intendedToolPickAxe.add("packed_ice"); intendedToolPickAxe.add("blue_ice"); @@ -391,7 +404,7 @@ public class MaterialMapStore { intendedToolPickAxe.add("waxed_cut_copper_stairs"); intendedToolPickAxe.add("waxed_lightly_weathered_cut_copper_stairs"); - //1.17 + //1.17 Mining (non-ores) intendedToolPickAxe.add("calcite"); intendedToolPickAxe.add("smooth_basalt"); intendedToolPickAxe.add("block_of_amethyst"); @@ -402,7 +415,6 @@ public class MaterialMapStore { intendedToolPickAxe.add("budding_amethyst"); intendedToolPickAxe.add("deepslate"); intendedToolPickAxe.add("cobbled_deepslate"); - } private void fillArmors() { diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 1015bea7d..303610982 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -513,6 +513,16 @@ Bonus_Drops: Peony: true Lily_Of_The_Valley: true Mining: + 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_Lazuli_Ore: true + Lapis_Lazuli_Ore: true + Copper_Ore: true Calcite: true Smooth_Basalt: true Block_Of_Amethyst: true diff --git a/src/main/resources/experience.yml b/src/main/resources/experience.yml index 298ecb9a6..8fbbb8d53 100644 --- a/src/main/resources/experience.yml +++ b/src/main/resources/experience.yml @@ -380,6 +380,8 @@ Experience_Values: Lily_Of_The_Valley: 150 Wither_Rose: 500 Mining: + Copper_Ore: 1400 + Deepslate_Copper_Ore: 1900 Deepslate: 30 Cobbled_Deepslate: 15 Calcite: 400 @@ -405,8 +407,11 @@ 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 @@ -415,11 +420,15 @@ Experience_Values: 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_Lazuli_Ore: 1400 Mossy_Cobblestone: 30 Netherrack: 15 Obsidian: 150 @@ -427,6 +436,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 @@ -474,6 +484,15 @@ Experience_Values: 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 @@ -482,6 +501,7 @@ Experience_Values: Raw_Gold: 35 Iron_Ore: 25 Raw_Iron: 25 + Lapis_Lazuli_Ore: 40 Lapis_Ore: 40 Nether_Quartz_Ore: 25 Redstone_Ore: 15 From b569b9456e1334bd1afdd7f6c9c11efdb6328064 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sun, 6 Jun 2021 20:37:51 -0700 Subject: [PATCH 554/662] Add support for Mossy Block and Azalea Leaves --- Changelog.txt | 5 +++++ src/main/java/com/gmail/nossr50/util/MaterialMapStore.java | 1 + src/main/resources/config.yml | 1 + src/main/resources/experience.yml | 2 ++ 4 files changed, 9 insertions(+) diff --git a/Changelog.txt b/Changelog.txt index f3fe15e07..390176397 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -8,7 +8,10 @@ Version 2.1.197 Added Axolotl to experience.yml for combat and taming Added Glow_Squid to experience.yml for combat and taming 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 Moss Block to experience.yml for Herbalism Added Calcite to experience.yml for Mining Added Smooth Basalt to experience.yml for Mining Added Block_Of_Amethyst to experience.yml for Mining @@ -30,6 +33,7 @@ Version 2.1.197 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 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 @@ -71,6 +75,7 @@ Version 2.1.197 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. diff --git a/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java b/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java index 02f863695..0b85566ef 100644 --- a/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java +++ b/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java @@ -1006,6 +1006,7 @@ public class MaterialMapStore { treeFellerDestructibleWhiteList.add("dark_oak_leaves"); treeFellerDestructibleWhiteList.add("jungle_leaves"); treeFellerDestructibleWhiteList.add("spruce_leaves"); + treeFellerDestructibleWhiteList.add("azalea_leaves"); treeFellerDestructibleWhiteList.add("nether_wart_block"); treeFellerDestructibleWhiteList.add("warped_wart_block"); treeFellerDestructibleWhiteList.add("brown_mushroom_block"); diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 303610982..a677f912c 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -463,6 +463,7 @@ Green_Thumb_Replanting_Crops: ### Bonus_Drops: Herbalism: + Moss_Block: true Sweet_Berry_Bush: true Weeping_Vines: true Twisting_Vines: true diff --git a/src/main/resources/experience.yml b/src/main/resources/experience.yml index 8fbbb8d53..596270635 100644 --- a/src/main/resources/experience.yml +++ b/src/main/resources/experience.yml @@ -245,6 +245,7 @@ Experience_Values: Excavation: Clay: 40 Dirt: 40 + Rooted_Dirt: 60 Coarse_Dirt: 40 Podzol: 40 Grass_Block: 40 @@ -294,6 +295,7 @@ Experience_Values: Brown_Mushroom_Block: 70 Mushroom_Stem: 80 Herbalism: + Moss_Block: 150 Crimson_Roots: 6 Warped_Roots: 6 Nether_Wart_Block: 3 From c3d86ba6c595dd83a631ce896ea812c6a61a415d Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sun, 6 Jun 2021 20:41:00 -0700 Subject: [PATCH 555/662] Add support for Tuff --- Changelog.txt | 2 ++ src/main/java/com/gmail/nossr50/util/BlockUtils.java | 8 ++++---- src/main/resources/config.yml | 1 + src/main/resources/experience.yml | 1 + 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 390176397..7a37b4931 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -12,6 +12,7 @@ Version 2.1.197 Added Rooted Dirt to experience.yml for Excavation Added Moss Block 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 @@ -34,6 +35,7 @@ Version 2.1.197 Added Lapis Lazuli Ore to experience.yml for Mining (was missing) Added Moss Block 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 diff --git a/src/main/java/com/gmail/nossr50/util/BlockUtils.java b/src/main/java/com/gmail/nossr50/util/BlockUtils.java index dada7a1bf..c9a00f015 100644 --- a/src/main/java/com/gmail/nossr50/util/BlockUtils.java +++ b/src/main/java/com/gmail/nossr50/util/BlockUtils.java @@ -159,7 +159,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); @@ -171,7 +171,7 @@ 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 hasWoodcuttingXP(BlockState blockState) { + public static boolean hasWoodcuttingXP(@NotNull BlockState blockState) { return ExperienceConfig.getInstance().doesBlockGiveSkillXP(PrimarySkillType.WOODCUTTING, blockState.getBlockData()); } @@ -181,11 +181,11 @@ 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 isNonWoodPartOfTree(BlockState blockState) { + public static boolean isNonWoodPartOfTree(@NotNull BlockState blockState) { return mcMMO.getMaterialMapStore().isTreeFellerDestructible(blockState.getType()); } - public static boolean isNonWoodPartOfTree(Material material) { + public static boolean isNonWoodPartOfTree(@NotNull Material material) { return mcMMO.getMaterialMapStore().isTreeFellerDestructible(material); } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index a677f912c..66c2b5d2b 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -514,6 +514,7 @@ Bonus_Drops: Peony: true Lily_Of_The_Valley: true Mining: + Tuff: true Deepslate_Redstone_Ore: true Deepslate_Copper_Ore: true Deepslate_Coal_Ore: true diff --git a/src/main/resources/experience.yml b/src/main/resources/experience.yml index 596270635..5b4c65cd5 100644 --- a/src/main/resources/experience.yml +++ b/src/main/resources/experience.yml @@ -382,6 +382,7 @@ Experience_Values: Lily_Of_The_Valley: 150 Wither_Rose: 500 Mining: + Tuff: 10 Copper_Ore: 1400 Deepslate_Copper_Ore: 1900 Deepslate: 30 From 33df92ea3a4c46a7471231ebf88993d580152631 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sun, 6 Jun 2021 20:42:07 -0700 Subject: [PATCH 556/662] Add tuff to super breaker --- src/main/java/com/gmail/nossr50/util/MaterialMapStore.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java b/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java index 0b85566ef..4505a5bb1 100644 --- a/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java +++ b/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java @@ -415,6 +415,7 @@ public class MaterialMapStore { intendedToolPickAxe.add("budding_amethyst"); intendedToolPickAxe.add("deepslate"); intendedToolPickAxe.add("cobbled_deepslate"); + intendedToolPickAxe.add("tuff"); } private void fillArmors() { From fa9a3ae76651009e335893aa5077f8123e4cbbd6 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sun, 6 Jun 2021 20:44:33 -0700 Subject: [PATCH 557/662] Add support for Glow Lichen --- Changelog.txt | 1 + src/main/resources/experience.yml | 1 + 2 files changed, 2 insertions(+) diff --git a/Changelog.txt b/Changelog.txt index 7a37b4931..e23c1a415 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -12,6 +12,7 @@ Version 2.1.197 Added Rooted Dirt to experience.yml for Excavation Added Moss Block 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 diff --git a/src/main/resources/experience.yml b/src/main/resources/experience.yml index 5b4c65cd5..f465ce473 100644 --- a/src/main/resources/experience.yml +++ b/src/main/resources/experience.yml @@ -295,6 +295,7 @@ Experience_Values: Brown_Mushroom_Block: 70 Mushroom_Stem: 80 Herbalism: + Glow_Lichen: 95 Moss_Block: 150 Crimson_Roots: 6 Warped_Roots: 6 From 0bc25b263b419f29aea3ef3f7e8ba76bca1bff62 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sun, 6 Jun 2021 20:52:27 -0700 Subject: [PATCH 558/662] Add support for Glow Berries / Cave Vines --- Changelog.txt | 5 +++++ src/main/resources/config.yml | 3 +++ src/main/resources/experience.yml | 4 +++- 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index e23c1a415..f4f20519d 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -12,6 +12,8 @@ Version 2.1.197 Added Rooted Dirt to experience.yml for Excavation 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 @@ -36,6 +38,9 @@ Version 2.1.197 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 diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 66c2b5d2b..ad1e97c0e 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -463,6 +463,9 @@ Green_Thumb_Replanting_Crops: ### Bonus_Drops: Herbalism: + Glow_Berries: true + Cave_Vines: true + Cave_Vines_Plant: true Moss_Block: true Sweet_Berry_Bush: true Weeping_Vines: true diff --git a/src/main/resources/experience.yml b/src/main/resources/experience.yml index f465ce473..f99b24fd1 100644 --- a/src/main/resources/experience.yml +++ b/src/main/resources/experience.yml @@ -295,7 +295,9 @@ Experience_Values: Brown_Mushroom_Block: 70 Mushroom_Stem: 80 Herbalism: - Glow_Lichen: 95 + Cave_Vines: 90 + Cave_Vines_Plant: 90 + Glow_Lichen: 200 Moss_Block: 150 Crimson_Roots: 6 Warped_Roots: 6 From 551fac84a5104351ec1028d2f956a1262a08c641 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sun, 6 Jun 2021 20:56:14 -0700 Subject: [PATCH 559/662] Add Glow Berries to Farmer's Diet --- Changelog.txt | 1 + .../com/gmail/nossr50/listeners/EntityListener.java | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/Changelog.txt b/Changelog.txt index f4f20519d..0986330be 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -7,6 +7,7 @@ Version 2.1.197 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 diff --git a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java index 56843cd35..7fd77d50b 100644 --- a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java @@ -912,6 +912,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 @ From 9bb38e319350a67629f1abcb3823b3b2320749a5 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sun, 6 Jun 2021 20:59:43 -0700 Subject: [PATCH 560/662] Add more 1.17 blocks --- Changelog.txt | 2 ++ src/main/resources/experience.yml | 2 ++ 2 files changed, 4 insertions(+) diff --git a/Changelog.txt b/Changelog.txt index 0986330be..6d32ee1f1 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -12,6 +12,8 @@ Version 2.1.197 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 diff --git a/src/main/resources/experience.yml b/src/main/resources/experience.yml index f99b24fd1..687e90cd9 100644 --- a/src/main/resources/experience.yml +++ b/src/main/resources/experience.yml @@ -295,6 +295,8 @@ 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 From 28c6c90f239b932b0e11ffce57fa620a7b068124 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sun, 6 Jun 2021 21:00:27 -0700 Subject: [PATCH 561/662] 2.1.197 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index cd3fddb4a..9d4f28c40 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.197-SNAPSHOT + 2.1.197 mcMMO https://github.com/mcMMO-Dev/mcMMO From 1ab5b82b22280bd8cf0460cb59585d57607624bd Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 11 Jun 2021 09:08:22 -0700 Subject: [PATCH 562/662] 2.1.198 dev mode --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 9d4f28c40..27b519246 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.197 + 2.1.198-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO From f7dc72359b08a50ae4fa2c4998f41f366b30d084 Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Fri, 11 Jun 2021 18:09:47 +0200 Subject: [PATCH 563/662] Bump adventure to 4.8.0 (#4546) --- pom.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index 27b519246..0f34ecfc8 100755 --- a/pom.xml +++ b/pom.xml @@ -238,27 +238,27 @@ net.kyori adventure-text-serializer-gson - 4.7.0 + 4.8.0 net.kyori adventure-api - 4.7.0 + 4.8.0 net.kyori adventure-nbt - 4.7.0 + 4.8.0 net.kyori adventure-key - 4.7.0 + 4.8.0 net.kyori adventure-text-serializer-gson-legacy-impl - 4.7.0 + 4.8.0 net.kyori From 6ff37c8baae11a17b50ba0c5cab4474236d762b1 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 11 Jun 2021 09:10:43 -0700 Subject: [PATCH 564/662] Update changelog --- Changelog.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Changelog.txt b/Changelog.txt index 6d32ee1f1..5d0fcef78 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,6 @@ +Version 2.1.198 + 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 From 5f0cc2b09a4bc5478753c92a6a9db19ba8c04ec9 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 11 Jun 2021 14:22:33 -0700 Subject: [PATCH 565/662] Fix Smelting not recognizing the new 1.17 smeltables (like raw ores) --- .../java/com/gmail/nossr50/listeners/InventoryListener.java | 3 +-- src/main/java/com/gmail/nossr50/locale/LocaleLoader.java | 4 ++-- .../java/com/gmail/nossr50/skills/smelting/Smelting.java | 6 ++++-- .../com/gmail/nossr50/skills/smelting/SmeltingManager.java | 2 +- src/main/java/com/gmail/nossr50/util/ItemUtils.java | 3 ++- 5 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java b/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java index df4dd6e78..ba80e7ab8 100644 --- a/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java @@ -66,8 +66,7 @@ public class InventoryListener implements Listener { } //Profile doesn't exist - if(UserManager.getOfflinePlayer(offlinePlayer) == null) - { + if(UserManager.getOfflinePlayer(offlinePlayer) == null) { return; } diff --git a/src/main/java/com/gmail/nossr50/locale/LocaleLoader.java b/src/main/java/com/gmail/nossr50/locale/LocaleLoader.java index 0fed62f4f..7f0630165 100644 --- a/src/main/java/com/gmail/nossr50/locale/LocaleLoader.java +++ b/src/main/java/com/gmail/nossr50/locale/LocaleLoader.java @@ -57,7 +57,7 @@ public final class LocaleLoader { * * @return The properly formatted text component */ - public static TextComponent getTextComponent(String key, Object... messageArguments) { + public static @NotNull TextComponent getTextComponent(@NotNull String key, Object... messageArguments) { if (bundle == null) { initialize(); } @@ -113,7 +113,7 @@ public final class LocaleLoader { return string; } - public static TextComponent formatComponent(String string, Object... messageArguments) { + public static @NotNull TextComponent formatComponent(@NotNull String string, Object... messageArguments) { if (messageArguments != null) { MessageFormat formatter = new MessageFormat(""); formatter.applyPattern(string.replace("'", "''")); 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 c6bbccac1..d1367a030 100644 --- a/src/main/java/com/gmail/nossr50/skills/smelting/Smelting.java +++ b/src/main/java/com/gmail/nossr50/skills/smelting/Smelting.java @@ -4,10 +4,12 @@ import com.gmail.nossr50.config.experience.ExperienceConfig; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.mcMMO; import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; public class Smelting { - 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()); + public static int getSmeltXP(@NotNull ItemStack smelting) { + return 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 e30100723..90ece98cf 100644 --- a/src/main/java/com/gmail/nossr50/skills/smelting/SmeltingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/smelting/SmeltingManager.java @@ -113,7 +113,7 @@ public class SmeltingManager extends SkillManager { } public void smeltProcessing(@NotNull FurnaceSmeltEvent furnaceSmeltEvent, @NotNull Furnace furnace) { - applyXpGain(Smelting.getResourceXp(furnaceSmeltEvent.getSource()), XPGainReason.PVE, XPGainSource.PASSIVE); //Add XP + applyXpGain(Smelting.getSmeltXP(furnaceSmeltEvent.getSource()), XPGainReason.PVE, XPGainSource.PASSIVE); //Add XP processDoubleSmelt(furnaceSmeltEvent, furnace); } diff --git a/src/main/java/com/gmail/nossr50/util/ItemUtils.java b/src/main/java/com/gmail/nossr50/util/ItemUtils.java index 2c66ff84f..d2a69fa14 100644 --- a/src/main/java/com/gmail/nossr50/util/ItemUtils.java +++ b/src/main/java/com/gmail/nossr50/util/ItemUtils.java @@ -6,6 +6,7 @@ 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; @@ -340,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) { From 5e0f8a334d66efe743fd02bd1f0051e87870f62e Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 11 Jun 2021 14:23:24 -0700 Subject: [PATCH 566/662] Update changelog --- Changelog.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/Changelog.txt b/Changelog.txt index 5d0fcef78..00dd0a7f1 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,4 +1,5 @@ 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 From 4819a45be9af5dfb871eb2d86620ab6e3d471ffe Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 11 Jun 2021 14:26:28 -0700 Subject: [PATCH 567/662] 2.1.198 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 0f34ecfc8..dd31f3467 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.198-SNAPSHOT + 2.1.198 mcMMO https://github.com/mcMMO-Dev/mcMMO From e3dfdfc6eefa18b556f2fab75f1169cc0f64a4ca Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 11 Jun 2021 14:46:27 -0700 Subject: [PATCH 568/662] Fixed Deesplate Lapis Ore not being recognized --- Changelog.txt | 2 ++ src/main/resources/config.yml | 2 +- src/main/resources/experience.yml | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 00dd0a7f1..2d0bdef8b 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,5 @@ +Version 2.1.199 + Renamed Deepslate Lapis Lazuli Ore to Deepslate Lapis Ore in experience.yml and config.yml 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) diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index ad1e97c0e..7e048170d 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -525,7 +525,7 @@ Bonus_Drops: Deepslate_Emerald_Ore: true Deepslate_Iron_Ore: true Deepslate_Gold_Ore: true - Deepslate_Lapis_Lazuli_Ore: true + Deepslate_Lapis_Ore: true Lapis_Lazuli_Ore: true Copper_Ore: true Calcite: true diff --git a/src/main/resources/experience.yml b/src/main/resources/experience.yml index 687e90cd9..8f2637f08 100644 --- a/src/main/resources/experience.yml +++ b/src/main/resources/experience.yml @@ -436,7 +436,7 @@ Experience_Values: Deepslate_Iron_Ore: 1300 Lapis_Ore: 800 Lapis_Lazuli_Ore: 800 - Deepslate_Lapis_Lazuli_Ore: 1400 + Deepslate_Lapis_Ore: 1400 Mossy_Cobblestone: 30 Netherrack: 15 Obsidian: 150 From 78dc56d2634cce8ba605a6cdba8a093ccffe53f2 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 11 Jun 2021 14:47:11 -0700 Subject: [PATCH 569/662] Update Deepslate Lapis Ore on MaterialMapStore --- src/main/java/com/gmail/nossr50/util/MaterialMapStore.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java b/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java index 4505a5bb1..f170cfc3b 100644 --- a/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java +++ b/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java @@ -221,7 +221,8 @@ public class MaterialMapStore { 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_lazuli_ore"); + ores.add("deepslate_lapis_ore"); ores.add("copper_ore"); } From 7e28799f94ad413d8e73932a10d2fd102c4308c2 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 15 Jun 2021 14:19:30 -0700 Subject: [PATCH 570/662] Fix SQL on 1.17 (hacky) and optimized CompatibilityManager --- Changelog.txt | 8 +++ .../nossr50/database/SQLDatabaseManager.java | 3 +- src/main/java/com/gmail/nossr50/mcMMO.java | 2 +- .../util/compat/CompatibilityManager.java | 72 ++++++------------- .../util/platform/MinecraftGameVersion.java | 33 +++++++++ .../platform/MinecraftGameVersionTest.java | 65 +++++++++++++++++ 6 files changed, 131 insertions(+), 52 deletions(-) create mode 100644 src/test/java/com/gmail/nossr50/util/platform/MinecraftGameVersionTest.java diff --git a/Changelog.txt b/Changelog.txt index 2d0bdef8b..18ed5a815 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,5 +1,13 @@ Version 2.1.199 + 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) diff --git a/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java index dfa33b83f..de4093e47 100644 --- a/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java @@ -51,7 +51,8 @@ public final class SQLDatabaseManager implements DatabaseManager { String connectionString = "jdbc:mysql://" + mcMMO.p.getGeneralConfig().getMySQLServerName() + ":" + mcMMO.p.getGeneralConfig().getMySQLServerPort() + "/" + mcMMO.p.getGeneralConfig().getMySQLDatabaseName(); - if(mcMMO.p.getGeneralConfig().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"+ diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index d182ecc02..407072cf6 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -483,7 +483,7 @@ public class mcMMO extends JavaPlugin { return upgradeManager; } - public static CompatibilityManager getCompatibilityManager() { + public static @Nullable CompatibilityManager getCompatibilityManager() { return platformManager.getCompatibilityManager(); } 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 13d05ea1f..44231f0b0 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/CompatibilityManager.java +++ b/src/main/java/com/gmail/nossr50/util/compat/CompatibilityManager.java @@ -30,10 +30,10 @@ import java.util.HashMap; */ //TODO: I need to rewrite 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; @@ -42,7 +42,7 @@ public class CompatibilityManager { private AbstractMasterAnglerCompatibility masterAnglerCompatibility; private WorldCompatibilityLayer worldCompatibilityLayer; - public CompatibilityManager(MinecraftGameVersion minecraftGameVersion) { + public CompatibilityManager(@NotNull MinecraftGameVersion minecraftGameVersion) { mcMMO.p.getLogger().info("Loading compatibility layers..."); this.minecraftGameVersion = minecraftGameVersion; this.nmsVersion = determineNMSVersion(); @@ -77,24 +77,8 @@ public class CompatibilityManager { } private void initWorldCompatibilityLayer() { - if(minecraftGameVersion.getMinorVersion().asInt() > 17 - || (minecraftGameVersion.getMinorVersion().asInt() >= 16 && minecraftGameVersion.getPatchVersion().asInt() >= 4) - || minecraftGameVersion.getMajorVersion().asInt() >= 2) { - if(hasNewWorldMinHeightAPI()) { - worldCompatibilityLayer = new WorldCompatibilityLayer_1_16_4(); - } else { - worldCompatibilityLayer = new WorldCompatibilityLayer() { - @Override - public int getMinWorldHeight(@NotNull World world) { - return WorldCompatibilityLayer.super.getMinWorldHeight(world); - } - - @Override - public int getMaxWorldHeight(@NotNull World world) { - return WorldCompatibilityLayer.super.getMaxWorldHeight(world); - } - }; - } + if(minecraftGameVersion.isAtLeast(1, 17, 0)) { + worldCompatibilityLayer = new WorldCompatibilityLayer_1_16_4(); } else { worldCompatibilityLayer = new WorldCompatibilityLayer() { @Override @@ -111,37 +95,15 @@ public class CompatibilityManager { } private void initMasterAnglerLayer() { - if(minecraftGameVersion.getMinorVersion().asInt() >= 16 || minecraftGameVersion.getMajorVersion().asInt() >= 2) { - if(hasNewFishingHookAPI()) { - masterAnglerCompatibility = new MasterAnglerCompatibilityLayer(); - } + if(minecraftGameVersion.isAtLeast(1, 16, 3)) { + masterAnglerCompatibility = new MasterAnglerCompatibilityLayer(); } else { masterAnglerCompatibility = null; } } - private boolean hasNewWorldMinHeightAPI() { - try { - Class checkForClass = Class.forName("org.bukkit.World"); - checkForClass.getMethod("getMinHeight"); - return true; - } catch (ClassNotFoundException | NoSuchMethodException e) { - return false; - } - } - - private boolean hasNewFishingHookAPI() { - try { - Class checkForClass = Class.forName("org.bukkit.entity.FishHook"); - checkForClass.getMethod("getMinWaitTime"); - return true; - } catch (ClassNotFoundException | NoSuchMethodException e) { - return false; - } - } - private void initBungeeSerializerLayer() { - if(minecraftGameVersion.getMinorVersion().asInt() >= 16) { + if(minecraftGameVersion.isAtLeast(1, 16, 0)) { bungeeSerializerCompatibilityLayer = new BungeeModernSerializerCompatibilityLayer(); } else { bungeeSerializerCompatibilityLayer = new BungeeLegacySerializerCompatibilityLayer(); @@ -151,7 +113,7 @@ public class CompatibilityManager { } private void initPersistentDataLayer() { - if(minecraftGameVersion.getMinorVersion().asInt() >= 14 || minecraftGameVersion.getMajorVersion().asInt() >= 2) { + if(minecraftGameVersion.isAtLeast(1, 14, 2)) { persistentDataLayer = new SpigotPersistentDataLayer_1_14(); } else { @@ -162,7 +124,7 @@ public class CompatibilityManager { } //TODO: move to text manager - public void reportCompatibilityStatus(CommandSender commandSender) { + 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.")); @@ -179,7 +141,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); } @@ -192,6 +154,12 @@ public class CompatibilityManager { } 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: @@ -237,4 +205,8 @@ public class CompatibilityManager { public @NotNull WorldCompatibilityLayer getWorldCompatibilityLayer() { return worldCompatibilityLayer; } + + public @Nullable MinecraftGameVersion getMinecraftGameVersion() { + return minecraftGameVersion; + } } 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/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..80172ad49 --- /dev/null +++ b/src/test/java/com/gmail/nossr50/util/platform/MinecraftGameVersionTest.java @@ -0,0 +1,65 @@ +package com.gmail.nossr50.util.platform; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class MinecraftGameVersionTest { + + @Test + public 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)); + } +} \ No newline at end of file From f286af3ffffdf6e267655737ed02d9630b637785 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 15 Jun 2021 14:25:02 -0700 Subject: [PATCH 571/662] update changelog --- Changelog.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/Changelog.txt b/Changelog.txt index 18ed5a815..464fbad29 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,4 +1,5 @@ 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 From fffbacd239e9c3bbb095d04dc943da5c53b87e67 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 15 Jun 2021 14:30:16 -0700 Subject: [PATCH 572/662] 2.1.199 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index dd31f3467..bdd226ad2 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.198 + 2.1.199 mcMMO https://github.com/mcMMO-Dev/mcMMO From e35bfe758c9cc82f899401d5cfacf3d26737d6c7 Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Mon, 21 Jun 2021 18:21:55 +0200 Subject: [PATCH 573/662] Update to Junit5 and allow for mcMMO to be compiled on Java 16 (#4552) * Updated all unit tests to Junit5 and removed Powermock * Some formatting * I did not mean to commit this file * Fixed file ending * We don't need these extra dependencies * Replaced delegate with Junit5 assertThrows * Revert this change * Re-add mockito-core * A bit more refactoring * Update surefire and remove failsafe * Updated Mockito * Add failsafe back * Bump Mockito to 3.11.2 They literally just released that. --- pom.xml | 48 ++-- .../database/FlatFileDataProcessorTest.java | 23 +- .../database/FlatFileDatabaseManagerTest.java | 52 ++-- .../flatfile/FlatFileDataUtilTest.java | 31 +- .../datatypes/BlockLocationHistoryTest.java | 22 +- .../util/blockmeta/ChunkStoreTest.java | 268 +++++++++--------- .../nossr50/util/text/TextUtilsTest.java | 7 +- 7 files changed, 234 insertions(+), 217 deletions(-) diff --git a/pom.xml b/pom.xml index bdd226ad2..5ca833020 100755 --- a/pom.xml +++ b/pom.xml @@ -72,11 +72,21 @@ maven-surefire-plugin - 2.22.2 + 3.0.0-M5 + + + org.junit.jupiter:junit-jupiter + false + maven-failsafe-plugin - 2.22.2 + 3.0.0-M5 + + + org.junit.jupiter:junit-jupiter + false + @@ -324,38 +334,20 @@ org.junit.jupiter - junit-jupiter-api + junit-jupiter 5.8.0-M1 test - - org.junit.jupiter - junit-jupiter-engine - 5.8.0-M1 - test - - - org.junit.vintage - junit-vintage-engine - 5.6.2 - test - - - org.powermock - powermock-module-junit4 - 2.0.9 - test - - - org.powermock - powermock-api-mockito2 - 2.0.9 - test - org.mockito mockito-core - 3.9.0 + 3.11.2 + test + + + org.mockito + mockito-inline + 3.11.2 test diff --git a/src/test/java/com/gmail/nossr50/database/FlatFileDataProcessorTest.java b/src/test/java/com/gmail/nossr50/database/FlatFileDataProcessorTest.java index 2acbd41f8..6f1847fae 100644 --- a/src/test/java/com/gmail/nossr50/database/FlatFileDataProcessorTest.java +++ b/src/test/java/com/gmail/nossr50/database/FlatFileDataProcessorTest.java @@ -1,23 +1,26 @@ package com.gmail.nossr50.database; -import org.junit.Test; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; -public class FlatFileDataProcessorTest { +class FlatFileDataProcessorTest { @SuppressWarnings("ResultOfMethodCallIgnored") @Test - public void testGetExpectedValueType() { - for(int i = 0; i < FlatFileDatabaseManager.DATA_ENTRY_COUNT; i++) { + void testGetExpectedValueType() { + for (int i = 0; i < FlatFileDatabaseManager.DATA_ENTRY_COUNT; i++) { FlatFileDataProcessor.getExpectedValueType(i); } } @SuppressWarnings("ResultOfMethodCallIgnored") - @Test(expected = IndexOutOfBoundsException.class) - public void testGetExpectedValueTypeException() { - for(int i = 0; i < FlatFileDatabaseManager.DATA_ENTRY_COUNT+1; i++) { - FlatFileDataProcessor.getExpectedValueType(i); - } + @Test + void testGetExpectedValueTypeException() { + Assertions.assertThrows(IndexOutOfBoundsException.class, () -> { + for (int i = 0; i < FlatFileDatabaseManager.DATA_ENTRY_COUNT + 1; i++) { + FlatFileDataProcessor.getExpectedValueType(i); + } + }); } -} \ No newline at end of file +} diff --git a/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java b/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java index cd1cd6f54..f626002c1 100644 --- a/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java +++ b/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java @@ -32,7 +32,7 @@ import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.mock; //This class uses JUnit5/Jupiter -public class FlatFileDatabaseManagerTest { +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:"; @@ -72,7 +72,7 @@ public class FlatFileDatabaseManagerTest { } @BeforeEach - public void init() { + void init() { assertNull(db); //noinspection UnstableApiUsage tempDir = Files.createTempDir(); @@ -84,7 +84,7 @@ public class FlatFileDatabaseManagerTest { } @AfterEach - public void tearDown() { + void tearDown() { recursiveDelete(tempDir); db = null; } @@ -147,18 +147,18 @@ public class FlatFileDatabaseManagerTest { }; @Test - public void testDefaultInit() { + void testDefaultInit() { db = new FlatFileDatabaseManager(getTemporaryUserFilePath(), logger, PURGE_TIME, 0); } @Test - public void testUpdateLeaderboards() { + void testUpdateLeaderboards() { assertNotNull(db); assertEquals(LeaderboardStatus.UPDATED, db.updateLeaderboards()); } @Test - public void testSaveUser() { + 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"; @@ -194,7 +194,7 @@ public class FlatFileDatabaseManagerTest { } @Test - public void testAddedMissingLastLoginValues() { + void testAddedMissingLastLoginValues() { File dbFile = prepareDatabaseTestResource(DB_MISSING_LAST_LOGIN); //This makes sure our private method is working before the tests run afterwards @@ -214,7 +214,7 @@ public class FlatFileDatabaseManagerTest { } @Test - public void testLoadByName() { + void testLoadByName() { File healthyDB = prepareDatabaseTestResource(DB_HEALTHY); /* @@ -244,7 +244,7 @@ public class FlatFileDatabaseManagerTest { } @Test - public void testNewUser() { + void testNewUser() { //We will test that new user values line up with our expectations UUID uuid = new UUID(0, 1); String playerName = "nossr50"; @@ -277,7 +277,7 @@ public class FlatFileDatabaseManagerTest { } @Test - public void testAddingUsersToEndOfExistingDB() { + 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"; @@ -335,7 +335,7 @@ public class FlatFileDatabaseManagerTest { } @Test - public void testLoadByUUID() { + void testLoadByUUID() { File dbFile = prepareDatabaseTestResource(DB_HEALTHY); /* @@ -367,7 +367,7 @@ public class FlatFileDatabaseManagerTest { } @Test - public void testLoadByUUIDAndName() { + void testLoadByUUIDAndName() { File dbFile = prepareDatabaseTestResource(DB_HEALTHY); /* @@ -568,14 +568,14 @@ public class FlatFileDatabaseManagerTest { } @Test - public void testOverwriteName() { + 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 - public void testDataNotFound() { + void testDataNotFound() { //Save the zero version and see if it looks correct assertNotNull(db); assertTrue(db.getUsersFile().exists()); @@ -587,14 +587,14 @@ public class FlatFileDatabaseManagerTest { } @Test - public void testPurgePowerlessUsers() { + void testPurgePowerlessUsers() { replaceDataInFile(db, normalDatabaseData); int purgeCount = db.purgePowerlessUsers(); assertEquals(purgeCount, 1); //1 User should have been purged } @Test - public void testCheckFileHealthAndStructure() { + void testCheckFileHealthAndStructure() { replaceDataInFile(db, badDatabaseData); List dataFlags = db.checkFileHealthAndStructure(); @@ -603,48 +603,48 @@ public class FlatFileDatabaseManagerTest { } @Test - public void testFindFixableDuplicateNames() { + void testFindFixableDuplicateNames() { overwriteDataAndCheckForFlag(db, duplicateNameDatabaseData, FlatFileDataFlag.DUPLICATE_NAME); } @Test - public void testFindDuplicateUUIDs() { + void testFindDuplicateUUIDs() { overwriteDataAndCheckForFlag(db, duplicateUUIDDatabaseData, FlatFileDataFlag.DUPLICATE_UUID); } @Test() - public void findBadUUIDData() { + void findBadUUIDData() { overwriteDataAndCheckForFlag(db, badUUIDDatabaseData, FlatFileDataFlag.BAD_UUID_DATA); } @Test - public void testFindCorruptData() { + void testFindCorruptData() { overwriteDataAndCheckForFlag(db, corruptDatabaseData, FlatFileDataFlag.CORRUPTED_OR_UNRECOGNIZABLE); } @Test - public void testFindEmptyNames() { + void testFindEmptyNames() { overwriteDataAndCheckForFlag(db, emptyNameDatabaseData, FlatFileDataFlag.MISSING_NAME); } @Test - public void testFindBadValues() { + void testFindBadValues() { overwriteDataAndCheckForFlag(db, badDatabaseData, FlatFileDataFlag.BAD_VALUES); } @Test - public void testFindOutdatedData() { + void testFindOutdatedData() { overwriteDataAndCheckForFlag(db, outdatedDatabaseData, FlatFileDataFlag.INCOMPLETE); } @Test - public void testGetDatabaseType() { + void testGetDatabaseType() { assertNotNull(db); assertEquals(db.getDatabaseType(), DatabaseType.FLATFILE); } @Test - public void testReadRank() { + void testReadRank() { //This is an empty DB assertNotNull(db); String rankBoyName = "rankBoy"; @@ -674,7 +674,7 @@ public class FlatFileDatabaseManagerTest { } @Test - public void testLoadFromFile() { + void testLoadFromFile() { ClassLoader classLoader = getClass().getClassLoader(); URI resourceFileURI = null; diff --git a/src/test/java/com/gmail/nossr50/database/flatfile/FlatFileDataUtilTest.java b/src/test/java/com/gmail/nossr50/database/flatfile/FlatFileDataUtilTest.java index ee6e71ffb..b8e43ccbe 100644 --- a/src/test/java/com/gmail/nossr50/database/flatfile/FlatFileDataUtilTest.java +++ b/src/test/java/com/gmail/nossr50/database/flatfile/FlatFileDataUtilTest.java @@ -1,27 +1,34 @@ package com.gmail.nossr50.database.flatfile; -import com.gmail.nossr50.database.FlatFileDatabaseManager; -import org.junit.Test; - import java.util.HashSet; -public class FlatFileDataUtilTest { +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import com.gmail.nossr50.database.FlatFileDatabaseManager; + +class FlatFileDataUtilTest { @Test - public void getPreparedSaveDataLine() { + void getPreparedSaveDataLine() { + } @Test - public void repairBadData() { + void repairBadData() { + } @Test - public void getZeroInitialisedData() { + void getZeroInitialisedData() { + } - @Test(expected = AssertionError.class) - public void testTooManyDataEntriesSplitString() { - FlatFileDataContainer dataContainer = new CategorizedFlatFileData(0, new HashSet<>(), new String[FlatFileDatabaseManager.DATA_ENTRY_COUNT + 1]); - FlatFileDataUtil.getPreparedSaveDataLine(dataContainer); + @Test + void testTooManyDataEntriesSplitString() { + Assertions.assertThrows(AssertionError.class, () -> { + FlatFileDataContainer dataContainer = new CategorizedFlatFileData(0, new HashSet<>(), new String[FlatFileDatabaseManager.DATA_ENTRY_COUNT + 1]); + FlatFileDataUtil.getPreparedSaveDataLine(dataContainer); + }); } -} \ No newline at end of file +} diff --git a/src/test/java/com/gmail/nossr50/datatypes/BlockLocationHistoryTest.java b/src/test/java/com/gmail/nossr50/datatypes/BlockLocationHistoryTest.java index 5e9499a17..aa1ce3afa 100644 --- a/src/test/java/com/gmail/nossr50/datatypes/BlockLocationHistoryTest.java +++ b/src/test/java/com/gmail/nossr50/datatypes/BlockLocationHistoryTest.java @@ -1,12 +1,12 @@ package com.gmail.nossr50.datatypes; import org.bukkit.Location; -import org.junit.Assert; -import org.junit.Test; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; -public class BlockLocationHistoryTest { +class BlockLocationHistoryTest { @Test - public void testRemovesOldestElement() { + void testRemovesOldestElement() { BlockLocationHistory history = new BlockLocationHistory(2); Location locationA = new Location(null, 0, 1, 2); Location locationB = new Location(null, 1, 2, 3); @@ -15,13 +15,13 @@ public class BlockLocationHistoryTest { history.add(locationA); history.add(locationB); history.add(locationC); - Assert.assertFalse(history.contains(locationA)); - Assert.assertTrue(history.contains(locationB)); - Assert.assertTrue(history.contains(locationC)); + Assertions.assertFalse(history.contains(locationA)); + Assertions.assertTrue(history.contains(locationB)); + Assertions.assertTrue(history.contains(locationC)); } @Test - public void testSupportsDuplicateElement() { + void testSupportsDuplicateElement() { BlockLocationHistory history = new BlockLocationHistory(2); Location locationA = new Location(null, 0, 1, 2); Location locationB = new Location(null, 1, 2, 3); @@ -29,9 +29,9 @@ public class BlockLocationHistoryTest { history.add(locationA); history.add(locationA); history.add(locationB); - Assert.assertTrue(history.contains(locationA)); - Assert.assertTrue(history.contains(locationB)); + Assertions.assertTrue(history.contains(locationA)); + Assertions.assertTrue(history.contains(locationB)); history.add(locationB); - Assert.assertFalse(history.contains(locationA)); + 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 index 774b55f8d..f7f5a5f75 100644 --- a/src/test/java/com/gmail/nossr50/util/blockmeta/ChunkStoreTest.java +++ b/src/test/java/com/gmail/nossr50/util/blockmeta/ChunkStoreTest.java @@ -1,43 +1,54 @@ package com.gmail.nossr50.util.blockmeta; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.File; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.OutputStream; +import java.io.Serializable; +import java.util.UUID; + +import org.bukkit.Bukkit; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.jetbrains.annotations.NotNull; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.MockedStatic; +import org.mockito.Mockito; + import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.BlockUtils; import com.gmail.nossr50.util.compat.CompatibilityManager; import com.gmail.nossr50.util.compat.layers.world.WorldCompatibilityLayer; import com.gmail.nossr50.util.platform.PlatformManager; 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.*; -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 org.powermock.reflect.Whitebox; - -import java.io.*; -import java.util.UUID; - -import static org.mockito.Mockito.mock; /** - * 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. + * 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. */ -@RunWith(PowerMockRunner.class) -@PrepareForTest({ Bukkit.class, mcMMO.class}) -public class ChunkStoreTest { +class ChunkStoreTest { + public static final int LEGACY_WORLD_HEIGHT_MAX = 256; public static final int LEGACY_WORLD_HEIGHT_MIN = 0; private static File tempDir; - @BeforeClass + + @BeforeAll public static void setUpClass() { tempDir = Files.createTempDir(); } - @AfterClass + @AfterAll public static void tearDownClass() { recursiveDelete(tempDir); } @@ -46,99 +57,114 @@ public class ChunkStoreTest { private CompatibilityManager compatibilityManager; private WorldCompatibilityLayer worldCompatibilityLayer; private PlatformManager platformManager; + + private MockedStatic bukkitMock; + private MockedStatic mcMMOMock; - @Before - public void setUpMock(){ + @BeforeEach + void setUpMock() { UUID worldUUID = UUID.randomUUID(); - mockWorld = mock(World.class); + mockWorld = Mockito.mock(World.class); Mockito.when(mockWorld.getUID()).thenReturn(worldUUID); Mockito.when(mockWorld.getMaxHeight()).thenReturn(256); Mockito.when(mockWorld.getWorldFolder()).thenReturn(tempDir); - PowerMockito.mockStatic(Bukkit.class); - Mockito.when(Bukkit.getWorld(worldUUID)).thenReturn(mockWorld); - platformManager = mock(PlatformManager.class); - compatibilityManager = mock(CompatibilityManager.class); - worldCompatibilityLayer = mock(WorldCompatibilityLayer.class); + bukkitMock = Mockito.mockStatic(Bukkit.class); + bukkitMock.when(() -> Bukkit.getWorld(worldUUID)).thenReturn(mockWorld); - Whitebox.setInternalState(mcMMO.class, "platformManager", platformManager); - Mockito.when(mcMMO.getCompatibilityManager()).thenReturn(compatibilityManager); + platformManager = Mockito.mock(PlatformManager.class); + compatibilityManager = Mockito.mock(CompatibilityManager.class); + worldCompatibilityLayer = Mockito.mock(WorldCompatibilityLayer.class); + + mcMMOMock = Mockito.mockStatic(mcMMO.class); + + mcMMOMock.when(() -> mcMMO.getPlatformManager()).thenReturn(platformManager); + Assertions.assertNotNull(mcMMO.getPlatformManager()); + + mcMMOMock.when(() -> mcMMO.getCompatibilityManager()).thenReturn(compatibilityManager); + Assertions.assertNotNull(mcMMO.getCompatibilityManager()); - Assert.assertNotNull(mcMMO.getCompatibilityManager()); Mockito.when(platformManager.getCompatibilityManager()).thenReturn(compatibilityManager); Mockito.when(platformManager.getCompatibilityManager().getWorldCompatibilityLayer()).thenReturn(worldCompatibilityLayer); - Assert.assertNotNull(mcMMO.getCompatibilityManager().getWorldCompatibilityLayer()); + Assertions.assertNotNull(mcMMO.getCompatibilityManager().getWorldCompatibilityLayer()); Mockito.when(worldCompatibilityLayer.getMinWorldHeight(mockWorld)).thenReturn(LEGACY_WORLD_HEIGHT_MIN); Mockito.when(worldCompatibilityLayer.getMaxWorldHeight(mockWorld)).thenReturn(LEGACY_WORLD_HEIGHT_MAX); - } - @Test(expected = IndexOutOfBoundsException.class) - public void testIndexOutOfBounds() { - Mockito.when(mcMMO.getCompatibilityManager().getWorldCompatibilityLayer().getMinWorldHeight(mockWorld)).thenReturn(-64); - HashChunkManager hashChunkManager = new HashChunkManager(); - - //Top Block - Block illegalHeightBlock = initMockBlock(1337, 256, -1337); - Assert.assertFalse(hashChunkManager.isTrue(illegalHeightBlock)); - hashChunkManager.setTrue(illegalHeightBlock); + } + + @AfterEach + void teardownMock() { + bukkitMock.close(); + mcMMOMock.close(); } @Test - public void testSetTrue() { + void testIndexOutOfBounds() { Mockito.when(mcMMO.getCompatibilityManager().getWorldCompatibilityLayer().getMinWorldHeight(mockWorld)).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++) { + // 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(mcMMO.getCompatibilityManager().getWorldCompatibilityLayer().getMinWorldHeight(mockWorld)).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); - Assert.assertTrue(hashChunkManager.isTrue(testBlock)); + Assertions.assertTrue(hashChunkManager.isTrue(testBlock)); hashChunkManager.setFalse(testBlock); - Assert.assertFalse(hashChunkManager.isTrue(testBlock)); + Assertions.assertFalse(hashChunkManager.isTrue(testBlock)); } } } - //Bot Block + // Bot Block Block bottomBlock = initMockBlock(1337, 0, -1337); - Assert.assertFalse(hashChunkManager.isTrue(bottomBlock)); + Assertions.assertFalse(hashChunkManager.isTrue(bottomBlock)); - Assert.assertTrue(BlockUtils.isWithinWorldBounds(worldCompatibilityLayer, bottomBlock)); + Assertions.assertTrue(BlockUtils.isWithinWorldBounds(worldCompatibilityLayer, bottomBlock)); hashChunkManager.setTrue(bottomBlock); - Assert.assertTrue(hashChunkManager.isTrue(bottomBlock)); + Assertions.assertTrue(hashChunkManager.isTrue(bottomBlock)); - //Top Block + // Top Block Block topBlock = initMockBlock(1337, 255, -1337); - Assert.assertFalse(hashChunkManager.isTrue(topBlock)); + Assertions.assertFalse(hashChunkManager.isTrue(topBlock)); - Assert.assertTrue(BlockUtils.isWithinWorldBounds(worldCompatibilityLayer, topBlock)); + Assertions.assertTrue(BlockUtils.isWithinWorldBounds(worldCompatibilityLayer, topBlock)); hashChunkManager.setTrue(topBlock); - Assert.assertTrue(hashChunkManager.isTrue(topBlock)); + Assertions.assertTrue(hashChunkManager.isTrue(topBlock)); } @Test - public void testSetValue() { + void testSetValue() { BitSetChunkStore original = new BitSetChunkStore(mockWorld, 0, 0); original.setTrue(0, 0, 0); - Assert.assertTrue(original.isTrue(0, 0, 0)); + Assertions.assertTrue(original.isTrue(0, 0, 0)); original.setFalse(0, 0, 0); - Assert.assertFalse(original.isTrue(0, 0, 0)); + Assertions.assertFalse(original.isTrue(0, 0, 0)); } @Test - public void testIsEmpty() { + void testIsEmpty() { BitSetChunkStore original = new BitSetChunkStore(mockWorld, 0, 0); - Assert.assertTrue(original.isEmpty()); + Assertions.assertTrue(original.isEmpty()); original.setTrue(0, 0, 0); original.setFalse(0, 0, 0); - Assert.assertTrue(original.isEmpty()); + Assertions.assertTrue(original.isEmpty()); } @Test - public void testRoundTrip() throws IOException { + void testRoundTrip() throws IOException { BitSetChunkStore original = new BitSetChunkStore(mockWorld, 1, 2); original.setTrue(14, 89, 12); original.setTrue(14, 90, 12); @@ -149,7 +175,7 @@ public class ChunkStoreTest { } @Test - public void testNegativeWorldMin() throws IOException { + void testNegativeWorldMin() throws IOException { Mockito.when(mcMMO.getCompatibilityManager().getWorldCompatibilityLayer().getMinWorldHeight(mockWorld)).thenReturn(-64); BitSetChunkStore original = new BitSetChunkStore(mockWorld, 1, 2); @@ -162,7 +188,7 @@ public class ChunkStoreTest { } @Test - public void testNegativeWorldMinUpgrade() throws IOException { + void testNegativeWorldMinUpgrade() throws IOException { BitSetChunkStore original = new BitSetChunkStore(mockWorld, 1, 2); original.setTrue(14, 1, 12); original.setTrue(14, 2, 12); @@ -175,16 +201,16 @@ public class ChunkStoreTest { } @Test - public void testChunkCoords() throws IOException { + 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 + " "); + int cx = x >> 4; + int ix = Math.abs(x) % 16; + System.out.print(cx + ":" + ix + " "); } } @Test - public void testUpgrade() throws IOException { + void testUpgrade() throws IOException { LegacyChunkStore original = new LegacyChunkStore(mockWorld, 12, 32); original.setTrue(14, 89, 12); original.setTrue(14, 90, 12); @@ -195,21 +221,20 @@ public class ChunkStoreTest { } @Test - public void testSimpleRegionRoundtrip() throws IOException { + 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)){ + 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())) - { - Assert.assertNotNull(is); + try (DataInputStream is = region.getInputStream(original.getChunkX(), original.getChunkZ())) { + Assertions.assertNotNull(is); ChunkStore deserialized = BitSetChunkStore.Serialization.readChunkStore(is); assertEqual(original, deserialized); } @@ -218,36 +243,36 @@ public class ChunkStoreTest { } @Test - public void testSimpleRegionRejectsOutOfBounds() { + void testSimpleRegionRejectsOutOfBounds() { File file = new File(tempDir, "SimpleRegionRoundTrip.region"); McMMOSimpleRegionFile region = new McMMOSimpleRegionFile(file, 0, 0); - assertThrows(() -> region.getOutputStream(-1, 0), IndexOutOfBoundsException.class); - assertThrows(() -> region.getOutputStream(0, -1), IndexOutOfBoundsException.class); - assertThrows(() -> region.getOutputStream(32, 0), IndexOutOfBoundsException.class); - assertThrows(() -> region.getOutputStream(0, 32), IndexOutOfBoundsException.class); + 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 - public void testChunkStoreRejectsOutOfBounds() { + void testChunkStoreRejectsOutOfBounds() { ChunkStore chunkStore = new BitSetChunkStore(mockWorld, 0, 0); - assertThrows(() -> chunkStore.setTrue(-1, 0, 0), IndexOutOfBoundsException.class); - assertThrows(() -> chunkStore.setTrue(0, -1, 0), IndexOutOfBoundsException.class); - assertThrows(() -> chunkStore.setTrue(0, 0, -1), IndexOutOfBoundsException.class); - assertThrows(() -> chunkStore.setTrue(16, 0, 0), IndexOutOfBoundsException.class); - assertThrows(() -> chunkStore.setTrue(0, mockWorld.getMaxHeight(), 0), IndexOutOfBoundsException.class); - assertThrows(() -> chunkStore.setTrue(0, 0, 16), IndexOutOfBoundsException.class); + 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 - public void testRegressionChunkMirrorBug() { + void testRegressionChunkMirrorBug() { ChunkManager chunkManager = new HashChunkManager(); - Block mockBlockA = mock(Block.class); + 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 = mock(Block.class); + Block mockBlockB = Mockito.mock(Block.class); Mockito.when(mockBlockB.getX()).thenReturn(-15); Mockito.when(mockBlockB.getZ()).thenReturn(-15); Mockito.when(mockBlockB.getY()).thenReturn(0); @@ -255,42 +280,25 @@ public class ChunkStoreTest { chunkManager.setTrue(mockBlockA); chunkManager.setFalse(mockBlockB); - Assert.assertTrue(chunkManager.isTrue(mockBlockA)); + Assertions.assertTrue(chunkManager.isTrue(mockBlockA)); } - private interface Delegate { - - void run(); - } - private void assertThrows(@NotNull Delegate delegate, @NotNull Class clazz) { - try { - delegate.run(); - Assert.fail(); // We didn't throw - } - catch (Throwable t) { - Assert.assertTrue(t.getClass().equals(clazz)); - } - } - - private void assertEqual(ChunkStore expected, ChunkStore actual) - { - Assert.assertEquals(expected.getChunkMin(), actual.getChunkMin()); - Assert.assertEquals(expected.getChunkMax(), actual.getChunkMax()); + 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) - { - Assert.assertEquals(expected.getChunkX(), actual.getChunkX()); - Assert.assertEquals(expected.getChunkZ(), actual.getChunkZ()); - Assert.assertEquals(expected.getWorldId(), actual.getWorldId()); - for (int y = Math.min(actual.getChunkMin(), expected.getChunkMin()); y < Math.max(actual.getChunkMax(), expected.getChunkMax()); y++) - { + 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++) - Assert.assertTrue(expected.isTrue(x, y, z) == actual.isTrue(x, y, z)); + Assertions.assertEquals(expected.isTrue(x, y, z), actual.isTrue(x, y, z)); } } @@ -299,7 +307,9 @@ public class ChunkStoreTest { 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 + new UnitTestObjectOutputStream(byteArrayOutputStream).writeObject(chunkStore); // Serializes the class as if + // it were the old + // PrimitiveChunkStore return byteArrayOutputStream.toByteArray(); } @@ -313,6 +323,7 @@ public class ChunkStoreTest { 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; @@ -416,11 +427,13 @@ public class ChunkStoreTest { } } + 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 @@ -430,14 +443,15 @@ public class ChunkStoreTest { } } + @NotNull private Block initMockBlock(int x, int y, int z) { - Block testBlock = mock(Block.class); - Mockito.when(testBlock.getX()).thenReturn(x); - Mockito.when(testBlock.getY()).thenReturn(y); - Mockito.when(testBlock.getZ()).thenReturn(z); - Mockito.when(testBlock.getWorld()).thenReturn(mockWorld); - return testBlock; + 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) { diff --git a/src/test/java/com/gmail/nossr50/util/text/TextUtilsTest.java b/src/test/java/com/gmail/nossr50/util/text/TextUtilsTest.java index da1e021db..cefbe7010 100644 --- a/src/test/java/com/gmail/nossr50/util/text/TextUtilsTest.java +++ b/src/test/java/com/gmail/nossr50/util/text/TextUtilsTest.java @@ -14,10 +14,10 @@ import org.junit.jupiter.api.Test; * See https://github.com/mcMMO-Dev/mcMMO/pull/4446 * */ -public class TextUtilsTest { +class TextUtilsTest { @Test - public void testColorizeText() { + void testColorizeText() { String inputText = "&4This text should be red."; /* @@ -26,6 +26,7 @@ public class TextUtilsTest { */ TextComponent component = TextUtils.colorizeText(inputText); - Assertions.assertEquals(NamedTextColor.DARK_RED, component.color(), "Looks like Adventure is not working correctly."); + String message = "Looks like Adventure is not working correctly. We likely need to update our dependency!"; + Assertions.assertEquals(NamedTextColor.DARK_RED, component.color(), message); } } From de6ba4fb6aa7f04061bbcb6959fe1ef32c82aef3 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 22 Jun 2021 14:59:40 -0700 Subject: [PATCH 574/662] Dodge no longer triggers while blocking Fixes #4543 --- Changelog.txt | 3 +++ pom.xml | 2 +- .../com/gmail/nossr50/skills/acrobatics/AcrobaticsManager.java | 3 +++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index 464fbad29..f99d2916d 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,6 @@ +Version 2.1.200 + Dodge will no longer trigger while blocking + 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) diff --git a/pom.xml b/pom.xml index 5ca833020..132c40e94 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.199 + 2.1.200-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO 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 9641e6804..570ee05a6 100644 --- a/src/main/java/com/gmail/nossr50/skills/acrobatics/AcrobaticsManager.java +++ b/src/main/java/com/gmail/nossr50/skills/acrobatics/AcrobaticsManager.java @@ -64,6 +64,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; From e816310da84c005f9fd0a544043db8c455a0e976 Mon Sep 17 00:00:00 2001 From: stepech Date: Fri, 2 Jul 2021 01:07:44 +0200 Subject: [PATCH 575/662] Fix mcmmo picking wrong version on builds withou patch number (#4555) * Fix server versioning * Switch to regex when getting server version * add comment * Poor beginner mistakes Co-authored-by: TheBusyBiscuit Co-authored-by: TheBusyBiscuit --- .../util/platform/PlatformManager.java | 53 +++++-------------- 1 file changed, 13 insertions(+), 40 deletions(-) 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")) From 5255ae846d1a437a856618fefa58dca852043d17 Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Fri, 2 Jul 2021 01:11:22 +0200 Subject: [PATCH 576/662] Fixed #4556 (#4559) --- .../datatypes/interactions/NotificationType.java | 12 +++++++----- src/main/resources/advanced.yml | 3 +++ 2 files changed, 10 insertions(+), 5 deletions(-) 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/resources/advanced.yml b/src/main/resources/advanced.yml index 2ff9795d4..66b79f79a 100644 --- a/src/main/resources/advanced.yml +++ b/src/main/resources/advanced.yml @@ -78,6 +78,9 @@ Feedback: PartyMessage: Enabled: true SendCopyOfMessageToChat: true + AbilityRefreshed: + Enabled: true + SendCopyOfMessageToChat: false Skills: General: LimitBreak: From fb94374e3c930bb8ebb4846653046eebf272b9fb Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 1 Jul 2021 16:14:13 -0700 Subject: [PATCH 577/662] Update changelog --- Changelog.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Changelog.txt b/Changelog.txt index f99d2916d..eb344ad4c 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,5 +1,7 @@ Version 2.1.200 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 From b79d452a6ddb4643c89bd2714c81b09f0e14a767 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 1 Jul 2021 21:02:59 -0700 Subject: [PATCH 578/662] 2.1.200 --- Changelog.txt | 1 + pom.xml | 2 +- src/main/java/com/gmail/nossr50/listeners/EntityListener.java | 4 +++- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index eb344ad4c..194e38861 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,4 +1,5 @@ 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) diff --git a/pom.xml b/pom.xml index 132c40e94..fc681d3d3 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.200-SNAPSHOT + 2.1.200 mcMMO https://github.com/mcMMO-Dev/mcMMO diff --git a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java index 7fd77d50b..bca418f97 100644 --- a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java @@ -250,9 +250,11 @@ public class EntityListener implements Listener { else if (isTracked) { mcMMO.getPlaceStore().setTrue(block); } - } else if ((block.getType() == Material.REDSTONE_ORE)) { + } 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)) { mcMMO.getPlaceStore().setFalse(block); } From 2c849d9cb435712e3f560350b46bfeb7086d174a Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Tue, 6 Jul 2021 01:02:46 +0200 Subject: [PATCH 579/662] Added a Unit Test for mc version detection (#4560) * Added a Unit Test for mc version detection * Merge upstream and update server software string --- .../platform/MinecraftGameVersionTest.java | 86 ++++++++++++++++--- 1 file changed, 76 insertions(+), 10 deletions(-) diff --git a/src/test/java/com/gmail/nossr50/util/platform/MinecraftGameVersionTest.java b/src/test/java/com/gmail/nossr50/util/platform/MinecraftGameVersionTest.java index 80172ad49..564e980a0 100644 --- a/src/test/java/com/gmail/nossr50/util/platform/MinecraftGameVersionTest.java +++ b/src/test/java/com/gmail/nossr50/util/platform/MinecraftGameVersionTest.java @@ -1,30 +1,42 @@ package com.gmail.nossr50.util.platform; +import java.util.logging.Logger; +import java.util.stream.Stream; + +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 com.gmail.nossr50.mcMMO; import static org.junit.jupiter.api.Assertions.*; class MinecraftGameVersionTest { @Test - public void testAtLeast() { - //TODO: Remove redundant tests + 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 + // 1.8.8 assertTrue(oneEightEight.isAtLeast(1, 8, 7)); assertFalse(oneEightEight.isAtLeast(1, 9, 0)); - //1.16.5 + // 1.16.5 assertTrue(oneSixteenFive.isAtLeast(1, 15, 2)); assertFalse(oneSixteenFive.isAtLeast(1, 17, 0)); - //1.2 + // 1.2 assertTrue(oneTwo.isAtLeast(1, 2, 0)); - //Test major version number + // Test major version number MinecraftGameVersion majorVersionTest = new MinecraftGameVersion(2, 0, 0); assertFalse(majorVersionTest.isAtLeast(3, 0, 0)); @@ -34,8 +46,7 @@ class MinecraftGameVersionTest { assertTrue(majorVersionTest.isAtLeast(2, 0, 0)); assertTrue(majorVersionTest.isAtLeast(1, 0, 0)); - - //Test minor version number + // Test minor version number MinecraftGameVersion minorVersionTest = new MinecraftGameVersion(0, 3, 0); assertFalse(minorVersionTest.isAtLeast(0, 4, 0)); @@ -47,7 +58,7 @@ class MinecraftGameVersionTest { assertTrue(minorVersionTest.isAtLeast(0, 2, 1)); assertTrue(minorVersionTest.isAtLeast(0, 3, 0)); - //Test patch version number + // Test patch version number MinecraftGameVersion patchVersionTest = new MinecraftGameVersion(0, 0, 5); @@ -62,4 +73,59 @@ class MinecraftGameVersionTest { assertTrue(patchVersionTest.isAtLeast(0, 0, 4)); assertTrue(patchVersionTest.isAtLeast(0, 0, 5)); } -} \ No newline at end of file + + @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) + ); + } + +} From 93a6a73b4e5d31aa2f472e43ccbeea4085e22d44 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 20 Jul 2021 18:32:34 -0700 Subject: [PATCH 580/662] Revert Woodcutting translation forortuguese Fixes #4568 --- Changelog.txt | 3 +++ pom.xml | 2 +- src/main/resources/locale/locale_pt_BR.properties | 12 ++++++------ 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 194e38861..157382d8e 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,6 @@ +Version 2.1.201 + Portuguese translation of Woodcutting changed back to Lenhador + Version 2.1.200 Fixed a major 1.17 exploit Dodge will no longer trigger while blocking diff --git a/pom.xml b/pom.xml index fc681d3d3..2b560b2c3 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.200 + 2.1.201-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO diff --git a/src/main/resources/locale/locale_pt_BR.properties b/src/main/resources/locale/locale_pt_BR.properties index d8ae1c7f1..ee0481ee2 100644 --- a/src/main/resources/locale/locale_pt_BR.properties +++ b/src/main/resources/locale/locale_pt_BR.properties @@ -27,7 +27,7 @@ JSON.Salvage=Recupera\u00e7\u00e3o JSON.Swords=Espadas JSON.Taming=Adestramento JSON.Unarmed=Desarmado -JSON.Woodcutting=Corte de \u00c1rvore +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! @@ -95,7 +95,7 @@ Overhaul.Name.Smelting=Fundi\u00e7\u00e3o Overhaul.Name.Swords=Espadas Overhaul.Name.Taming=Adestramento Overhaul.Name.Unarmed=Desarmado -Overhaul.Name.Woodcutting=Corte de \u00c1rvore +Overhaul.Name.Woodcutting=Lenhador # /mcMMO Command Style Stuff Commands.mcc.Header=&c---[]&aComandos do McMMO&c[]--- Commands.Other=&c---[]&aCOMANDOS ESPECIAIS&c[]--- @@ -119,7 +119,7 @@ XPBar.Smelting=Fundi\u00e7\u00e3o Nv.&6{0} XPBar.Swords=Espadas Nv.&6{0} XPBar.Taming=Adestramento Nv.&6{0} XPBar.Unarmed=Desarmado Nv.&6{0} -XPBar.Woodcutting=Corte de \u00c1rvore 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 @@ -560,8 +560,8 @@ Woodcutting.SubSkill.BarkSurgeon.Name=Cirurgi\u00e3o de Tronco Woodcutting.SubSkill.BarkSurgeon.Description=Extrai materiais \u00fateis ao remover \u00c1rvores. Woodcutting.SubSkill.NaturesBounty.Name=Generosidade da Natureza Woodcutting.SubSkill.NaturesBounty.Description=Ganhe experi\u00eancia da natureza. -Woodcutting.Listener=Corte de \u00c1rvore: -Woodcutting.SkillName=CORTE DE \u00c1RVORE +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! @@ -979,7 +979,7 @@ Guides.Unarmed.Section.3=&3Como Desviar Flechas funciona?\n&eDesviar Flechas \u0 Guides.Unarmed.Section.4=&3Como Punho de ferro funciona?\n&ePunho de ferro \u00e9 uma habilidade passiva que neutraliza a habilidade desarmamento. Conforme seu \n&en\u00edvel de desarmado aumenta, a chance de prevenir que voc\u00ea seja desarmado tamb\u00e9m 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\u00e3o. ##Corte de Árvore -Guides.Woodcutting.Section.0=&3Sobre Corte de \u00c1rvore:\n&eCorte de \u00c1rvore \u00e9 sobre derrubar \u00c1rvores.\n\n&3COMO GANHAR XP:\n&eXP \u00e9 obtida sempre que voc\u00ea quebra blocos de madeira. +Guides.Woodcutting.Section.0=&3Sobre Lenhador:\n&eLenhador \u00e9 sobre derrubar \u00c1rvores.\n\n&3COMO GANHAR XP:\n&eXP \u00e9 obtida sempre que voc\u00ea quebra blocos de madeira. Guides.Woodcutting.Section.1=&3Como Lenhador funciona?\n&eLenhador \u00e9 uma habilidade ativa, voc\u00ea pode clicar com o bot\u00e3o direito\n&eenquanto segura um machado para ativar a habilidade Lenhador. Ir\u00e1\n&efazer com que a \u00c1rvore inteira seja quebrada instantaneamente, dropando todos\n&eos blocos de madeira de uma vez s\u00f3. Guides.Woodcutting.Section.2=&3Como Soprador de Folhas funciona?\n&eSoprador de Folhas \u00e9 uma habilidade passiva que far\u00e1 com que os blocos de\n&efolha se quebrem instantaneamente uando atingido por um machado. Por padr\u00e3o\n&eessa habilidade \u00e9 desbloqueada no n\u00edvel 100. Guides.Woodcutting.Section.3=&3Como Drops duplos funcionam?\n&eEsta habilidade passiva te d\u00e1 a chance de obter um bloco\n&eextra para cada bloco de madeira que voc\u00ea corta. From dc94fedee18612c589aa0f2abb93fbce647739f7 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 20 Jul 2021 18:47:25 -0700 Subject: [PATCH 581/662] Added member getPlayer to McMMOItemSpawnEvent Fixes #4572 --- .../events/items/McMMOItemSpawnEvent.java | 15 +++++++++- .../nossr50/listeners/BlockListener.java | 2 +- .../gmail/nossr50/skills/archery/Archery.java | 2 +- .../skills/excavation/ExcavationManager.java | 2 +- .../skills/fishing/FishingManager.java | 4 +-- .../skills/herbalism/HerbalismManager.java | 2 +- .../nossr50/skills/mining/MiningManager.java | 6 ++-- .../skills/salvage/SalvageManager.java | 4 +-- .../skills/unarmed/UnarmedManager.java | 2 +- .../woodcutting/WoodcuttingManager.java | 10 +++---- .../java/com/gmail/nossr50/util/Misc.java | 28 +++++++++---------- 11 files changed, 45 insertions(+), 32 deletions(-) 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 a626ebf00..1249476d4 100644 --- a/src/main/java/com/gmail/nossr50/events/items/McMMOItemSpawnEvent.java +++ b/src/main/java/com/gmail/nossr50/events/items/McMMOItemSpawnEvent.java @@ -2,11 +2,13 @@ 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. @@ -16,14 +18,25 @@ public class McMMOItemSpawnEvent extends Event implements Cancellable { private ItemStack itemStack; private boolean cancelled; private final ItemSpawnReason itemSpawnReason; + private final Player player; - public McMMOItemSpawnEvent(@NotNull Location location, @NotNull ItemStack itemStack, @NotNull ItemSpawnReason itemSpawnReason) { + 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 diff --git a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java index 658793842..0953f00c3 100644 --- a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java @@ -96,7 +96,7 @@ public class BlockListener implements Listener { int bonusCount = bonusDropMeta.asInt(); for (int i = 0; i < bonusCount; i++) { - Misc.spawnItemNaturally(event.getBlockState().getLocation(), is, ItemSpawnReason.BONUS_DROPS); + Misc.spawnItemNaturally(event.getPlayer(), event.getBlockState().getLocation(), is, ItemSpawnReason.BONUS_DROPS); } } } 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 b980a6f34..3ad317287 100644 --- a/src/main/java/com/gmail/nossr50/skills/archery/Archery.java +++ b/src/main/java/com/gmail/nossr50/skills/archery/Archery.java @@ -57,7 +57,7 @@ public class Archery { TrackedEntity trackedEntity = entityIterator.next(); if (trackedEntity.getID() == livingEntity.getUniqueId()) { - Misc.spawnItems(livingEntity.getLocation(), new ItemStack(Material.ARROW), trackedEntity.getArrowCount(), ItemSpawnReason.ARROW_RETRIEVAL_ACTIVATED); + Misc.spawnItems(null, livingEntity.getLocation(), new ItemStack(Material.ARROW), trackedEntity.getArrowCount(), ItemSpawnReason.ARROW_RETRIEVAL_ACTIVATED); entityIterator.remove(); return; } 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 5412c9ef8..876634b46 100644 --- a/src/main/java/com/gmail/nossr50/skills/excavation/ExcavationManager.java +++ b/src/main/java/com/gmail/nossr50/skills/excavation/ExcavationManager.java @@ -49,7 +49,7 @@ public class ExcavationManager extends SkillManager { } xp += treasure.getXp(); - Misc.spawnItem(location, treasure.getDrop(), ItemSpawnReason.EXCAVATION_TREASURE); + Misc.spawnItem(getPlayer(), location, treasure.getDrop(), ItemSpawnReason.EXCAVATION_TREASURE); } } } 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 d4a4d266c..9a78dd499 100644 --- a/src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java @@ -446,7 +446,7 @@ public class FishingManager extends SkillManager { if(fishingSucceeds) { if (mcMMO.p.getGeneralConfig().getFishingExtraFish()) { - Misc.spawnItem(player.getEyeLocation(), fishingCatch.getItemStack(), ItemSpawnReason.FISHING_EXTRA_FISH); + Misc.spawnItem(getPlayer(), player.getEyeLocation(), fishingCatch.getItemStack(), ItemSpawnReason.FISHING_EXTRA_FISH); } fishingCatch.setItemStack(treasureDrop); @@ -553,7 +553,7 @@ public class FishingManager extends SkillManager { return; } - Misc.spawnItem(target.getLocation(), drop, ItemSpawnReason.FISHING_SHAKE_TREASURE); + 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); } 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 7cf4ce1c4..6200d9eec 100644 --- a/src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java +++ b/src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java @@ -704,7 +704,7 @@ public class HerbalismManager extends SkillManager { return false; } blockState.setType(Material.AIR); - Misc.spawnItem(location, treasure.getDrop(), ItemSpawnReason.HYLIAN_LUCK_TREASURE); + Misc.spawnItem(getPlayer(), location, treasure.getDrop(), ItemSpawnReason.HYLIAN_LUCK_TREASURE); NotificationManager.sendPlayerInformation(player, NotificationType.SUBSKILL_MESSAGE, "Herbalism.HylianLuck"); return true; } 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 4ab9f6a17..2a9890cd9 100644 --- a/src/main/java/com/gmail/nossr50/skills/mining/MiningManager.java +++ b/src/main/java/com/gmail/nossr50/skills/mining/MiningManager.java @@ -189,7 +189,7 @@ public class MiningManager extends SkillManager { //Drop "debris" based on skill modifiers for(BlockState blockState : notOres) { if(RandomUtils.nextFloat() < debrisYield) { - Misc.spawnItem(Misc.getBlockCenter(blockState), new ItemStack(blockState.getType()), ItemSpawnReason.BLAST_MINING_DEBRIS_NON_ORES); // Initial block that would have been dropped + Misc.spawnItem(getPlayer(), Misc.getBlockCenter(blockState), new ItemStack(blockState.getType()), ItemSpawnReason.BLAST_MINING_DEBRIS_NON_ORES); // Initial block that would have been dropped } } @@ -197,12 +197,12 @@ public class MiningManager extends SkillManager { if (RandomUtils.nextFloat() < (yield + oreBonus)) { xp += Mining.getBlockXp(blockState); - Misc.spawnItem(Misc.getBlockCenter(blockState), new ItemStack(blockState.getType()), ItemSpawnReason.BLAST_MINING_ORES); // 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 if (!mcMMO.getPlaceStore().isTrue(blockState)) { for (int i = 1; i < dropMultiplier; i++) { // Bukkit.broadcastMessage("Bonus Drop on Ore: "+blockState.getType().toString()); - Misc.spawnItem(Misc.getBlockCenter(blockState), new ItemStack(blockState.getType()), ItemSpawnReason.BLAST_MINING_ORES_BONUS_DROP); // Initial block that would have been dropped + Misc.spawnItem(getPlayer(), Misc.getBlockCenter(blockState), new ItemStack(blockState.getType()), ItemSpawnReason.BLAST_MINING_ORES_BONUS_DROP); // Initial block that would have been dropped } } } 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 28afb1192..4ffb1baae 100644 --- a/src/main/java/com/gmail/nossr50/skills/salvage/SalvageManager.java +++ b/src/main/java/com/gmail/nossr50/skills/salvage/SalvageManager.java @@ -160,10 +160,10 @@ public class SalvageManager extends SkillManager { anvilLoc.add(0, .1, 0); if (enchantBook != null) { - Misc.spawnItemTowardsLocation(anvilLoc.clone(), playerLoc.clone(), enchantBook, vectorSpeed, ItemSpawnReason.SALVAGE_ENCHANTMENT_BOOK); + Misc.spawnItemTowardsLocation(getPlayer(), anvilLoc.clone(), playerLoc.clone(), enchantBook, vectorSpeed, ItemSpawnReason.SALVAGE_ENCHANTMENT_BOOK); } - Misc.spawnItemTowardsLocation(anvilLoc.clone(), playerLoc.clone(), salvageResults, vectorSpeed, ItemSpawnReason.SALVAGE_MATERIALS); + Misc.spawnItemTowardsLocation(getPlayer(), anvilLoc.clone(), playerLoc.clone(), salvageResults, vectorSpeed, ItemSpawnReason.SALVAGE_MATERIALS); // BWONG BWONG BWONG - CLUNK! if (mcMMO.p.getGeneralConfig().getSalvageAnvilUseSoundsEnabled()) { 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 668eae038..4ad595a8e 100644 --- a/src/main/java/com/gmail/nossr50/skills/unarmed/UnarmedManager.java +++ b/src/main/java/com/gmail/nossr50/skills/unarmed/UnarmedManager.java @@ -110,7 +110,7 @@ public class UnarmedManager extends SkillManager { if(UserManager.getPlayer(defender) == null) return; - Item item = Misc.spawnItem(defender.getLocation(), defender.getInventory().getItemInMainHand(), ItemSpawnReason.UNARMED_DISARMED_ITEM); + Item item = Misc.spawnItem(getPlayer(), defender.getLocation(), defender.getInventory().getItemInMainHand(), ItemSpawnReason.UNARMED_DISARMED_ITEM); if (item != null && mcMMO.p.getAdvancedConfig().getDisarmProtected()) { item.setMetadata(mcMMO.disarmedItemKey, UserManager.getPlayer(defender).getPlayerMetadata()); 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 3fd8f2ab9..d08cad2da 100644 --- a/src/main/java/com/gmail/nossr50/skills/woodcutting/WoodcuttingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/woodcutting/WoodcuttingManager.java @@ -299,7 +299,7 @@ public class WoodcuttingManager extends SkillManager { xp += processTreeFellerXPGains(blockState, processedLogCount); //Drop displaced block - Misc.spawnItemsFromCollection(Misc.getBlockCenter(blockState), block.getDrops(), ItemSpawnReason.TREE_FELLER_DISPLACED_BLOCK); + Misc.spawnItemsFromCollection(getPlayer(), Misc.getBlockCenter(blockState), block.getDrops(), ItemSpawnReason.TREE_FELLER_DISPLACED_BLOCK); //Bonus Drops / Harvest lumber checks processHarvestLumber(blockState); @@ -307,7 +307,7 @@ public class WoodcuttingManager extends SkillManager { //Drop displaced non-woodcutting XP blocks if(RankUtils.hasUnlockedSubskill(player, SubSkillType.WOODCUTTING_KNOCK_ON_WOOD)) { - Misc.spawnItemsFromCollection(Misc.getBlockCenter(blockState), block.getDrops(), ItemSpawnReason.TREE_FELLER_DISPLACED_BLOCK); + 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()) { @@ -319,7 +319,7 @@ public class WoodcuttingManager extends SkillManager { } } else { - Misc.spawnItemsFromCollection(Misc.getBlockCenter(blockState), block.getDrops(), ItemSpawnReason.TREE_FELLER_DISPLACED_BLOCK, 1); + Misc.spawnItemsFromCollection(getPlayer(), Misc.getBlockCenter(blockState), block.getDrops(), ItemSpawnReason.TREE_FELLER_DISPLACED_BLOCK, 1); } } @@ -384,7 +384,7 @@ public class WoodcuttingManager extends SkillManager { * * @param blockState Block being broken */ - protected static void spawnHarvestLumberBonusDrops(@NotNull BlockState blockState) { - Misc.spawnItemsFromCollection(Misc.getBlockCenter(blockState), blockState.getBlock().getDrops(), ItemSpawnReason.BONUS_DROPS); + 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/Misc.java b/src/main/java/com/gmail/nossr50/util/Misc.java index 9b74f110c..03821dccd 100644 --- a/src/main/java/com/gmail/nossr50/util/Misc.java +++ b/src/main/java/com/gmail/nossr50/util/Misc.java @@ -107,9 +107,9 @@ public final class Misc { return blockState.getLocation().add(0.5, 0.5, 0.5); } - public static void spawnItemsFromCollection(@NotNull Location location, @NotNull Collection drops, @NotNull ItemSpawnReason itemSpawnReason) { + public static void spawnItemsFromCollection(@NotNull Player player, @NotNull Location location, @NotNull Collection drops, @NotNull ItemSpawnReason itemSpawnReason) { for (ItemStack drop : drops) { - spawnItem(location, drop, itemSpawnReason); + spawnItem(player, location, drop, itemSpawnReason); } } @@ -121,11 +121,11 @@ public final class Misc { * @param drops collection to iterate over * @param sizeLimit the number of drops to process */ - public static void spawnItemsFromCollection(@NotNull Location location, @NotNull Collection drops, @NotNull ItemSpawnReason itemSpawnReason, int sizeLimit) { + 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(location, arrayDrops[i], itemSpawnReason); + spawnItem(player, location, arrayDrops[i], itemSpawnReason); } } @@ -136,9 +136,9 @@ public final class Misc { * @param is The items to drop * @param quantity The amount of items to drop */ - public static void spawnItems(@NotNull Location location, @NotNull ItemStack is, int quantity, @NotNull ItemSpawnReason itemSpawnReason) { + 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++) { - spawnItem(location, is, itemSpawnReason); + spawnItem(player, location, is, itemSpawnReason); } } @@ -150,13 +150,13 @@ public final class Misc { * @param itemSpawnReason the reason for the item drop * @return Dropped Item entity or null if invalid or cancelled */ - public static @Nullable Item spawnItem(@NotNull Location location, @NotNull ItemStack itemStack, @NotNull ItemSpawnReason itemSpawnReason) { + 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, itemSpawnReason); + McMMOItemSpawnEvent event = new McMMOItemSpawnEvent(location, itemStack, itemSpawnReason, player); mcMMO.p.getServer().getPluginManager().callEvent(event); if (event.isCancelled()) { @@ -174,13 +174,13 @@ public final class Misc { * @param itemSpawnReason the reason for the item drop * @return Dropped Item entity or null if invalid or cancelled */ - public static @Nullable Item spawnItemNaturally(@NotNull Location location, @NotNull ItemStack itemStack, @NotNull ItemSpawnReason itemSpawnReason) { + 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, itemSpawnReason); + McMMOItemSpawnEvent event = new McMMOItemSpawnEvent(location, itemStack, itemSpawnReason, player); mcMMO.p.getServer().getPluginManager().callEvent(event); if (event.isCancelled()) { @@ -198,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(@NotNull Location fromLocation, @NotNull Location toLocation, @NotNull ItemStack is, int quantity, double speed, @NotNull ItemSpawnReason itemSpawnReason) { + 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, itemSpawnReason); + spawnItemTowardsLocation(player, fromLocation, toLocation, is, speed, itemSpawnReason); } } @@ -214,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 @Nullable Item spawnItemTowardsLocation(@NotNull Location fromLocation, @NotNull Location toLocation, @NotNull ItemStack itemToSpawn, double speed, @NotNull ItemSpawnReason itemSpawnReason) { + 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; } @@ -228,7 +228,7 @@ public final class Misc { 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, itemSpawnReason); + McMMOItemSpawnEvent event = new McMMOItemSpawnEvent(spawnLocation, clonedItem, itemSpawnReason, player); mcMMO.p.getServer().getPluginManager().callEvent(event); //Something cancelled the event so back out From a346fc33386346448b806811600ebd3e3cc9a466 Mon Sep 17 00:00:00 2001 From: Diablolend Date: Fri, 30 Jul 2021 03:16:07 +0500 Subject: [PATCH 582/662] Fixed in every line of "\ \ " characters (#4588) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Where did they come from? 🤔 --- .../resources/locale/locale_ru.properties | 461 +++++++++--------- 1 file changed, 232 insertions(+), 229 deletions(-) diff --git a/src/main/resources/locale/locale_ru.properties b/src/main/resources/locale/locale_ru.properties index 54f768564..4770b0bec 100644 --- a/src/main/resources/locale/locale_ru.properties +++ b/src/main/resources/locale/locale_ru.properties @@ -8,9 +8,9 @@ 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\u0443\u043C\u0435\u043D\u0438\u0435 -JSON.Locked=-\\=[\u0417\u0410\u0411\u041B\u041E\u041A\u0418\u0420\u041E\u0412\u0410\u041D\u041E]\\=- +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 \u0443\u0440\u043E\u0432\u0435\u043D\u044C -JSON.JWrapper.Target.Type=\u0422\u0438\u043F \u0446\u0435\u043B\u0438\\: +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=&6\u0421 \u0443\u0434\u0430\u0447\u0435\u0439 @@ -30,14 +30,14 @@ 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\u0438\u0442\u0435 nossr50 \u0438 \u0435\u0433\u043E \u0440\u0430\u0431\u043E\u0442\u0443 \u043D\u0430\u0434 mcMMO \u043D\u0430 Patreon\\! -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\u0435\u0441\u0442\u0438 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=&6[ mcMMO&e @&3{0} &6\u0420\u0430\u043D\u0433 &3{1}&6 \u0440\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.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\u0438\u0442\u0435 nossr50 \u0438 \u0435\u0433\u043E \u0440\u0430\u0431\u043E\u0442\u0443 \u043D\u0430\u0434 mcMMO \u043D\u0430 Patreon! +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\u0435\u0441\u0442\u0438 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=&6[ mcMMO&e @&3{0} &6\u0420\u0430\u043D\u0433 &3{1}&6 \u0440\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\u0435\u0434\u0443\u044E\u0449\u0435\u0435 \u0443\u043B\u0443\u0447\u0448\u0435\u043D\u0438\u0435 \u043D\u0430 \u0443\u0440\u043E\u0432\u043D\u0435 {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??? @@ -53,7 +53,7 @@ JSON.Notification.SuperAbility={0} #These are the JSON Strings used for SubSkills JSON.Acrobatics.Roll.Interaction.Activated=\u0422\u0435\u0441\u0442 &c\u041A\u0443\u0432\u044B\u0440\u043E\u043A \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\\! +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=&c\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. #DO NOT USE COLOR CODES IN THE JSON KEYS @@ -61,26 +61,26 @@ Anvil.SingleItemStack=&c\u0412\u044B \u043D\u0435 \u043C\u043E\u0436\u0435\u0442 mcMMO.Template.Prefix=&6(&amcMMO&6) &7{0} # BEGIN STYLING -Ability.Generic.Refresh=&a**\u0423\u041C\u0415\u041D\u0418\u042F \u0412\u041E\u0421\u0421\u0422\u0410\u041D\u041E\u0412\u041B\u0415\u041D\u042B\\!** +Ability.Generic.Refresh=&a**\u0423\u041C\u0415\u041D\u0418\u042F \u0412\u041E\u0421\u0421\u0422\u0410\u041D\u041E\u0412\u041B\u0415\u041D\u042B!** Ability.Generic.Template.Lock=&7{0} # Skill Command Styling -Ability.Generic.Template=&6{0}\\: &3{1} +Ability.Generic.Template=&6{0}: &3{1} Ability.Generic.Template.Custom=&3{0} -Skills.Overhaul.Header=&c[]\\=\\=\\=\\=\\=[]&a {0} &c[]\\=\\=\\=\\=\\=[] +Skills.Overhaul.Header=&c[]=====[]&a {0} &c[]=====[] Effects.Effects=\u042D\u0424\u0424\u0415\u041A\u0422\u042B Effects.SubSkills.Overhaul=\u041F\u043E\u0434\u043D\u0430\u0432\u044B\u043A\u0438 -Effects.Child.Overhaul=&3\u0414\u043E\u0447\u0435\u0440\u043D\u0438\u0439 \u0443\u0440.&e {0}&3\\: {1} +Effects.Child.Overhaul=&3\u0414\u043E\u0447\u0435\u0440\u043D\u0438\u0439 \u0443\u0440.&e {0}&3: {1} Effects.Child.ParentList=&a{0}&6(&3\u0423\u0440.&e{1}&6) -Effects.Level.Overhaul=&6\u0423\u0420\u041E\u0412\u0415\u041D\u042C\\: &e{0} &3\u041E\u041F\u042B\u0422\u0410&e(&6{1}&e/&6{2}&e) +Effects.Level.Overhaul=&6\u0423\u0420\u041E\u0412\u0415\u041D\u042C: &e{0} &3\u041E\u041F\u042B\u0422\u0410&e(&6{1}&e/&6{2}&e) Effects.Parent=&6{0} - -Effects.Template=&3{0}\\: &a{1} +Effects.Template=&3{0}: &a{1} Commands.Stats.Self.Overhaul=\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043A\u0430 -Commands.XPGain.Overhaul=&6\u041F\u041E\u041B\u0423\u0427\u0415\u041D\u041E \u041E\u041F\u042B\u0422\u0410\\: &3{0} +Commands.XPGain.Overhaul=&6\u041F\u041E\u041B\u0423\u0427\u0415\u041D\u041E \u041E\u041F\u042B\u0422\u0410: &3{0} MOTD.Version.Overhaul=&6[mcMMO] &3\u042D\u0440\u0430 \u043F\u0435\u0440\u0435\u043C\u0435\u043D&6 - &3{0} -Overhaul.mcMMO.Header=&c[]\\=\\=\\=\\=\\=[]&a mcMMO - \u042D\u0440\u0430 \u043F\u0435\u0440\u0435\u043C\u0435\u043D &c[]\\=\\=\\=\\=\\=[] +Overhaul.mcMMO.Header=&c[]=====[]&a mcMMO - \u042D\u0440\u0430 \u043F\u0435\u0440\u0435\u043C\u0435\u043D &c[]=====[] Overhaul.mcMMO.Url.Wrap.Prefix=&c[| Overhaul.mcMMO.Url.Wrap.Suffix=&c|] -Overhaul.mcMMO.MmoInfo.Wiki=&e[&f\u041F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0435\u0442\u044C \u044D\u0442\u043E\u0442 \u043D\u0430\u0432\u044B\u043A \u0432 \u0432\u0438\u043A\u0438\\!&e] +Overhaul.mcMMO.MmoInfo.Wiki=&e[&f\u041F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0435\u0442\u044C \u044D\u0442\u043E\u0442 \u043D\u0430\u0432\u044B\u043A \u0432 \u0432\u0438\u043A\u0438!&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} \u0443\u0432\u0435\u043B\u0438\u0447\u0435\u043D \u0434\u043E &r&a&l{2}&r&f. Overhaul.Name.Acrobatics=\u0410\u043A\u0440\u043E\u0431\u0430\u0442\u0438\u043A\u0430 @@ -136,15 +136,15 @@ Acrobatics.SubSkill.Roll.Stat=\u0428\u0430\u043D\u0441 \u041A\u0443\u0432\u044B\ Acrobatics.SubSkill.Roll.Stat.Extra=\u0428\u0430\u043D\u0441 \u0413\u0440\u0430\u0446\u0438\u043E\u0437\u043D\u043E\u0433\u043E \u043A\u0443\u0432\u044B\u0440\u043A\u0430 Acrobatics.SubSkill.Roll.Name=\u041A\u0443\u0432\u044B\u0440\u043E\u043A Acrobatics.SubSkill.Roll.Description=\u041F\u0440\u0438\u0437\u0435\u043C\u043B\u044F\u0439\u0442\u0435\u0441\u044C \u043F\u043E-\u0443\u043C\u043D\u043E\u043C\u0443 \u0434\u043B\u044F \u043D\u0438\u0432\u0435\u043B\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F \u0443\u0440\u043E\u043D\u0430. -Acrobatics.SubSkill.Roll.Chance=\u0428\u0430\u043D\u0441 \u041A\u0443\u0432\u044B\u0440\u043A\u0430\\: &e{0} % -Acrobatics.SubSkill.Roll.GraceChance=\u0428\u0430\u043D\u0441 \u0413\u0440\u0430\u0446\u0438\u043E\u0437\u043D\u043E\u0433\u043E \u043A\u0443\u0432\u044B\u0440\u043A\u0430\\: &e{0} -Acrobatics.SubSkill.Roll.Mechanics=&7\u041A\u0443\u0432\u044B\u0440\u043E\u043A - \u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0439 \u043F\u043E\u0434\u043D\u0430\u0432\u044B\u043A \u0441 \u043F\u0430\u0441\u0441\u0438\u0432\u043D\u044B\u043C \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442\u043E\u043C.!nasd\u041A\u043E\u0433\u0434\u0430 \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 \u0448\u0430\u043D\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 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043C\u043E\u0441\u0442\u0438 \u043E\u0442 \u0443\u0440\u043E\u0432\u043D\u044F \u043D\u0430\u0432\u044B\u043A\u0430. \u041D\u0430 \u0443\u0440\u043E\u0432\u043D\u0435 &e{6}&7 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044C &e{0}%&7 \u0448\u0430\u043D\u0441 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044C \u0443\u0440\u043E\u043D, \u0438 &e{1}%&7 \u0435\u0441\u043B\u0438 \u0430\u043A\u0442\u0438\u0432\u0438\u0440\u043E\u0432\u0430\u043D \u0418\u0437\u044F\u0449\u043D\u044B\u0439 \u043A\u0443\u0432\u044B\u0440\u043E\u043A.!nasd\u0428\u0430\u043D\u0441 \u0443\u0432\u0435\u043B\u0438\u0447\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 &e{2}&7, \u043D\u0430 \u043A\u043E\u0442\u043E\u0440\u043E\u043C \u043D\u0430\u0432\u044B\u043A \u0434\u043E\u0441\u0442\u0438\u0433\u0430\u0435\u0442 \u043C\u0430\u043A\u0441\u0438\u043C\u0443\u043C\u0430. \u041A\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 &e{3}%&7 \u0448\u0430\u043D\u0441\u0430 \u0443\u0441\u043F\u0435\u0445\u0430.!nasd\u0417\u0430\u0436\u0430\u0432 \u043A\u043D\u043E\u043F\u043A\u0443 \u043F\u0440\u0438\u0441\u0435\u0434\u0430, \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 \u043F\u0440\u0438\u0441\u0435\u0434\u0430 \u043F\u0435\u0440\u0435\u0432\u0435\u0434\u0435\u0442 \u0432\u0430\u0448\u0443 \u0441\u043F\u043E\u0441\u043E\u0431\u043D\u043E\u0441\u0442\u044C \u041A\u0443\u0432\u044B\u0440\u043E\u043A \u0432 \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0435 \u0413\u0440\u0430\u0446\u0438\u043E\u0437\u043D\u043E\u0433\u043E \u043A\u0443\u0432\u044B\u0440\u043A\u0430.!nasd\u041A\u0443\u0432\u044B\u0440\u043E\u043A \u043C\u043E\u0436\u0435\u0442 \u043D\u0438\u0432\u0435\u043B\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0434\u043E &c{4}&7 \u0443\u0440\u043E\u043D\u0430, \u0418\u0437\u044F\u0449\u043D\u044B\u0439 \u043A\u0443\u0432\u044B\u0440\u043E\u043A \u0434\u043E &a{5}&7 \u0443\u0440\u043E\u043D\u0430. +Acrobatics.SubSkill.Roll.Chance=\u0428\u0430\u043D\u0441 \u041A\u0443\u0432\u044B\u0440\u043A\u0430: &e{0} % +Acrobatics.SubSkill.Roll.GraceChance=\u0428\u0430\u043D\u0441 \u0413\u0440\u0430\u0446\u0438\u043E\u0437\u043D\u043E\u0433\u043E \u043A\u0443\u0432\u044B\u0440\u043A\u0430: &e{0} +Acrobatics.SubSkill.Roll.Mechanics=&7\u041A\u0443\u0432\u044B\u0440\u043E\u043A - \u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0439 \u043F\u043E\u0434\u043D\u0430\u0432\u044B\u043A \u0441 \u043F\u0430\u0441\u0441\u0438\u0432\u043D\u044B\u043C \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442\u043E\u043C.!nasd\u041A\u043E\u0433\u0434\u0430 \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 \u0448\u0430\u043D\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 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043C\u043E\u0441\u0442\u0438 \u043E\u0442 \u0443\u0440\u043E\u0432\u043D\u044F \u043D\u0430\u0432\u044B\u043A\u0430. \u041D\u0430 \u0443\u0440\u043E\u0432\u043D\u0435 &e{6}&7 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044C &e{0}%&7 \u0448\u0430\u043D\u0441 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044C \u0443\u0440\u043E\u043D, \u0438 &e{1}%&7 \u0435\u0441\u043B\u0438 \u0430\u043A\u0442\u0438\u0432\u0438\u0440\u043E\u0432\u0430\u043D \u0418\u0437\u044F\u0449\u043D\u044B\u0439 \u043A\u0443\u0432\u044B\u0440\u043E\u043A.!nasd\u0428\u0430\u043D\u0441 \u0443\u0432\u0435\u043B\u0438\u0447\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 &e{2}&7, \u043D\u0430 \u043A\u043E\u0442\u043E\u0440\u043E\u043C \u043D\u0430\u0432\u044B\u043A \u0434\u043E\u0441\u0442\u0438\u0433\u0430\u0435\u0442 \u043C\u0430\u043A\u0441\u0438\u043C\u0443\u043C\u0430. \u041A\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 &e{3}%&7 \u0448\u0430\u043D\u0441\u0430 \u0443\u0441\u043F\u0435\u0445\u0430.!nasd\u0417\u0430\u0436\u0430\u0432 \u043A\u043D\u043E\u043F\u043A\u0443 \u043F\u0440\u0438\u0441\u0435\u0434\u0430, \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 \u043F\u0440\u0438\u0441\u0435\u0434\u0430 \u043F\u0435\u0440\u0435\u0432\u0435\u0434\u0435\u0442 \u0432\u0430\u0448\u0443 \u0441\u043F\u043E\u0441\u043E\u0431\u043D\u043E\u0441\u0442\u044C \u041A\u0443\u0432\u044B\u0440\u043E\u043A \u0432 \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0435 \u0413\u0440\u0430\u0446\u0438\u043E\u0437\u043D\u043E\u0433\u043E \u043A\u0443\u0432\u044B\u0440\u043A\u0430.!nasd\u041A\u0443\u0432\u044B\u0440\u043E\u043A \u043C\u043E\u0436\u0435\u0442 \u043D\u0438\u0432\u0435\u043B\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0434\u043E &c{4}&7 \u0443\u0440\u043E\u043D\u0430, \u0418\u0437\u044F\u0449\u043D\u044B\u0439 \u043A\u0443\u0432\u044B\u0440\u043E\u043A \u0434\u043E &a{5}&7 \u0443\u0440\u043E\u043D\u0430. Acrobatics.SubSkill.GracefulRoll.Name=\u0413\u0440\u0430\u0446\u0438\u043E\u0437\u043D\u044B\u0439 \u043A\u0443\u0432\u044B\u0440\u043E\u043A Acrobatics.SubSkill.GracefulRoll.Description=\u0412\u0434\u0432\u043E\u0435 \u044D\u0444\u0444\u0435\u043A\u0442\u0438\u0432\u043D\u0435\u0435 \u043E\u0431\u044B\u0447\u043D\u043E\u0433\u043E \u041A\u0443\u0432\u044B\u0440\u043A\u0430 Acrobatics.SubSkill.Dodge.Name=\u0423\u043A\u043B\u043E\u043D\u0435\u043D\u0438\u0435 Acrobatics.SubSkill.Dodge.Description=\u0423\u043C\u0435\u043D\u044C\u0448\u0435\u043D\u0438\u0435 \u0443\u0440\u043E\u043D\u0430 \u043E\u0442 \u0430\u0442\u0430\u043A\u0438 \u043D\u0430 \u043F\u043E\u043B\u043E\u0432\u0438\u043D\u0443 Acrobatics.SubSkill.Dodge.Stat=\u0428\u0430\u043D\u0441 \u0423\u043A\u043B\u043E\u043D\u0435\u043D\u0438\u044F -Acrobatics.Listener=\u0410\u043A\u0440\u043E\u0431\u0430\u0442\u0438\u043A\u0430\\: +Acrobatics.Listener=\u0410\u043A\u0440\u043E\u0431\u0430\u0442\u0438\u043A\u0430: Acrobatics.Roll.Text=[[ITALIC]]**\u041A\u0443\u0432\u044B\u0440\u043E\u043A** Acrobatics.SkillName=\u0410\u041A\u0420\u041E\u0411\u0410\u0422\u0418\u041A\u0410 #ALCHEMY @@ -153,9 +153,9 @@ Alchemy.SubSkill.Catalysis.Description=\u0423\u0432\u0435\u043B\u0438\u0447\u043 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\u0435\u0434\u0438\u0435\u043D\u0442\u043E\u0432 -Alchemy.SubSkill.Concoctions.Stat=\u0420\u0430\u043D\u0433 \u041E\u0442\u0432\u0430\u0440\u043E\u0432\\: &a{0}&3/&a{1} -Alchemy.SubSkill.Concoctions.Stat.Extra=\u0418\u043D\u0433\u0440\u0435\u0434\u0438\u0435\u043D\u0442\u044B [&a{0}&3]\\: &a{1} -Alchemy.Listener=\u0410\u043B\u0445\u0438\u043C\u0438\u044F\\: +Alchemy.SubSkill.Concoctions.Stat=\u0420\u0430\u043D\u0433 \u041E\u0442\u0432\u0430\u0440\u043E\u0432: &a{0}&3/&a{1} +Alchemy.SubSkill.Concoctions.Stat.Extra=\u0418\u043D\u0433\u0440\u0435\u0434\u0438\u0435\u043D\u0442\u044B [&a{0}&3]: &a{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\u041E \u0414\u041E {0}+ \u041D\u0410\u0412\u042B\u041A\u0410 (\u041A\u0410\u0422\u0410\u041B\u0418\u0417\u0410\u0422\u041E\u0420) Alchemy.SkillName=\u0410\u041B\u0425\u0418\u041C\u0418\u042F #ARCHERY @@ -173,7 +173,7 @@ Archery.SubSkill.ArrowRetrieval.Stat=\u0428\u0430\u043D\u0441 \u0412\u043E\u0437 Archery.SubSkill.ArcheryLimitBreak.Name=\u0417\u0430\u043F\u0440\u0435\u0434\u0435\u043B\u044C\u043D\u0430\u044F \u0441\u0442\u0440\u0435\u043B\u044C\u0431\u0430 Archery.SubSkill.ArcheryLimitBreak.Description=\u0412\u044B \u043F\u0440\u0435\u0432\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=\u041C\u0430\u043A\u0441. \u0443\u0440\u043E\u043D \u0417\u0430\u043F\u0440\u0435\u0434\u0435\u043B\u044C\u043D\u043E\u0439 \u0441\u0442\u0440\u0435\u043B\u044C\u0431\u044B -Archery.Listener=\u0421\u0442\u0440\u0435\u043B\u044C\u0431\u0430\\: +Archery.Listener=\u0421\u0442\u0440\u0435\u043B\u044C\u0431\u0430: Archery.SkillName=\u0421\u0422\u0420\u0415\u041B\u042C\u0411\u0410 #AXES Axes.Ability.Bonus.0=\u0412\u043B\u0430\u0434\u0435\u043D\u0438\u0435 \u0442\u043E\u043F\u043E\u0440\u043E\u043C @@ -185,11 +185,11 @@ Axes.Ability.Bonus.5=\u041D\u0430\u043D\u043E\u0441\u0438\u0442 {0} \u0431\u043E Axes.Ability.Lower=&7\u0412\u044B \u043E\u043F\u0443\u0441\u0442\u0438\u043B\u0438 \u0441\u0432\u043E\u0439 \u0442\u043E\u043F\u043E\u0440. Axes.Ability.Ready=&3\u0412\u044B &6\u043F\u043E\u0434\u0433\u043E\u0442\u043E\u0432\u0438\u043B\u0438&3 \u0441\u0432\u043E\u0439 \u0442\u043E\u043F\u043E\u0440. Axes.Ability.Ready.Extra=&3\u0412\u044B &6\u043F\u043E\u0434\u0433\u043E\u0442\u043E\u0432\u0438\u043B\u0438&3 \u0441\u0432\u043E\u0439 \u0442\u043E\u043F\u043E\u0440. &7({0} \u043D\u0430 \u043E\u0442\u043A\u0430\u0442\u0435 {1}\u0441) -Axes.Combat.CritStruck=&4\u0412\u0430\u043C \u043D\u0430\u043D\u0435\u0441\u0435\u043D \u041A\u0420\u0418\u0422\u0418\u0427\u0415\u0421\u041A\u0418\u0419 \u0443\u0434\u0430\u0440\\! -Axes.Combat.CriticalHit=\u041A\u0420\u0418\u0422\u0418\u0427\u0415\u0421\u041A\u0418\u0419 \u0423\u0414\u0410\u0420\\! +Axes.Combat.CritStruck=&4\u0412\u0430\u043C \u043D\u0430\u043D\u0435\u0441\u0435\u043D \u041A\u0420\u0418\u0422\u0418\u0427\u0415\u0421\u041A\u0418\u0419 \u0443\u0434\u0430\u0440! +Axes.Combat.CriticalHit=\u041A\u0420\u0418\u0422\u0418\u0427\u0415\u0421\u041A\u0418\u0419 \u0423\u0414\u0410\u0420! Axes.Combat.GI.Proc=&a**\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 \u041C\u041E\u0429\u041D\u042B\u041C \u0423\u0414\u0410\u0420\u041E\u041C** -Axes.Combat.SS.Struck=&4\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.Struck=&4\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.SubSkill.SkullSplitter.Name=\u0420\u0430\u0441\u043A\u0430\u043B\u044B\u0432\u0430\u0442\u0435\u043B\u044C \u0447\u0435\u0440\u0435\u043F\u043E\u0432 Axes.SubSkill.SkullSplitter.Description=\u041D\u0430\u043D\u043E\u0441\u0438\u0442 \u0443\u0434\u0430\u0440 \u043F\u043E \u043E\u0431\u043B\u0430\u0441\u0442\u0438 Axes.SubSkill.SkullSplitter.Stat=\u041F\u0440\u043E\u0434\u043E\u043B\u0436\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u044C \u0420\u0430\u0441\u043A\u0430\u043B\u044B\u0432\u0430\u0442\u0435\u043B\u044F \u0447\u0435\u0440\u0435\u043F\u043E\u0432 @@ -205,13 +205,13 @@ Axes.SubSkill.ArmorImpact.Name=\u0411\u0440\u043E\u043D\u0435\u0431\u043E\u0439\ 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=\u041C\u043E\u0449\u043D\u044B\u0439 \u0443\u0434\u0430\u0440 Axes.SubSkill.GreaterImpact.Description=\u041D\u0430\u043D\u043E\u0441\u0438\u0442 \u0431\u043E\u043D\u0443\u0441\u043D\u044B\u0439 \u0443\u0440\u043E\u043D\u0430 \u043D\u0435\u0431\u0440\u043E\u043D\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u043C \u0432\u0440\u0430\u0433\u0430\u043C -Axes.Listener=\u0422\u043E\u043F\u043E\u0440\u044B\\: +Axes.Listener=\u0422\u043E\u043F\u043E\u0440\u044B: Axes.SkillName=\u0422\u041E\u041F\u041E\u0420\u042B Axes.Skills.SS.Off=**\u0420\u0430\u0441\u043A\u0430\u043B\u044B\u0432\u0430\u0442\u0435\u043B\u044C \u0447\u0435\u0440\u0435\u043F\u043E\u0432 \u043F\u0440\u0435\u043A\u0440\u0430\u0442\u0438\u043B \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435** Axes.Skills.SS.On=&a**\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** -Axes.Skills.SS.Refresh=&a\u0412\u0430\u0448\u0435 \u0443\u043C\u0435\u043D\u0438\u0435 &e\u0420\u0430\u0441\u043A\u0430\u043B\u044B\u0432\u0430\u0442\u0435\u043B\u044C \u0447\u0435\u0440\u0435\u043F\u043E\u0432 &a\u0432\u043E\u0441\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E\\! +Axes.Skills.SS.Refresh=&a\u0412\u0430\u0448\u0435 \u0443\u043C\u0435\u043D\u0438\u0435 &e\u0420\u0430\u0441\u043A\u0430\u043B\u044B\u0432\u0430\u0442\u0435\u043B\u044C \u0447\u0435\u0440\u0435\u043F\u043E\u0432 &a\u0432\u043E\u0441\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E! Axes.Skills.SS.Other.Off=\u0420\u0430\u0441\u043A\u0430\u043B\u044B\u0432\u0430\u0442\u0435\u043B\u044C \u0447\u0435\u0440\u0435\u043F\u043E\u0432&a \u043F\u0440\u0435\u043A\u0440\u0430\u0442\u0438\u043B \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0443 &e{0} -Axes.Skills.SS.Other.On=&a{0}&2 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043B &c\u0420\u0430\u0441\u043A\u0430\u043B\u044B\u0432\u0430\u0442\u0435\u043B\u044C \u0447\u0435\u0440\u0435\u043F\u043E\u0432\\! +Axes.Skills.SS.Other.On=&a{0}&2 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043B &c\u0420\u0430\u0441\u043A\u0430\u043B\u044B\u0432\u0430\u0442\u0435\u043B\u044C \u0447\u0435\u0440\u0435\u043F\u043E\u0432! #EXCAVATION Excavation.Ability.Lower=&7\u0412\u044B \u043E\u043F\u0443\u0441\u0442\u0438\u043B\u0438 \u0441\u0432\u043E\u044E \u043B\u043E\u043F\u0430\u0442\u0443. Excavation.Ability.Ready=&3\u0412\u044B &6\u043F\u043E\u0434\u0433\u043E\u0442\u043E\u0432\u0438\u043B\u0438&e \u0441\u0432\u043E\u044E \u043B\u043E\u043F\u0430\u0442\u0443. @@ -219,29 +219,29 @@ Excavation.SubSkill.GigaDrillBreaker.Name=\u0413\u0438\u0433\u0430-\u0431\u0443\ Excavation.SubSkill.GigaDrillBreaker.Description=3x \u0434\u043E\u0431\u044B\u0447\u0430, 3x \u043E\u043F\u044B\u0442, +\u0441\u043A\u043E\u0440\u043E\u0441\u0442\u044C Excavation.SubSkill.GigaDrillBreaker.Stat=\u041F\u0440\u043E\u0434\u043E\u043B\u0436\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u044C \u0413\u0438\u0433\u0430-\u0431\u0443\u0440\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\u0435 \u0442\u0430\u0439\u043D\u044B \u0437\u0435\u043C\u043B\u0438\\! \u041F\u043E\u0432\u044B\u0448\u0435\u043D\u0438\u0435 \u0443\u0440\u043E\u0432\u043D\u044F \u0443\u0432\u0435\u043B\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0448\u0430\u043D\u0441\u044B \u043F\u043E\u043B\u0443\u0447\u0435\u043D\u0438\u044F \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\\! +Excavation.SubSkill.Archaeology.Description=\u0420\u0430\u0441\u043A\u0440\u043E\u0439\u0442\u0435 \u0442\u0430\u0439\u043D\u044B \u0437\u0435\u043C\u043B\u0438! \u041F\u043E\u0432\u044B\u0448\u0435\u043D\u0438\u0435 \u0443\u0440\u043E\u0432\u043D\u044F \u0443\u0432\u0435\u043B\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0448\u0430\u043D\u0441\u044B \u043F\u043E\u043B\u0443\u0447\u0435\u043D\u0438\u044F \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! Excavation.SubSkill.Archaeology.Stat=\u0428\u0430\u043D\u0441 \u043F\u043E\u043B\u0443\u0447\u0435\u043D\u0438\u044F \u043E\u043F\u044B\u0442\u0430 \u0410\u0440\u0445\u0435\u043E\u043B\u043E\u0433\u0438\u0438 Excavation.SubSkill.Archaeology.Stat.Extra=\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u043E\u043F\u044B\u0442\u0430 \u0410\u0440\u0445\u0435\u043E\u043B\u043E\u0433\u0438\u0438 -Excavation.Listener=\u0420\u0430\u0441\u043A\u043E\u043F\u043A\u0438\\: +Excavation.Listener=\u0420\u0430\u0441\u043A\u043E\u043F\u043A\u0438: Excavation.SkillName=\u0420\u0410\u0421\u041A\u041E\u041F\u041A\u0418 Excavation.Skills.GigaDrillBreaker.Off=**\u0413\u0438\u0433\u0430-\u0431\u0443\u0440 \u043F\u0440\u0435\u043A\u0440\u0430\u0442\u0438\u043B \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435** Excavation.Skills.GigaDrillBreaker.On=&a**\u0413\u0418\u0413\u0410-\u0411\u0423\u0420 \u0410\u041A\u0422\u0418\u0412\u0418\u0420\u041E\u0412\u0410\u041D** -Excavation.Skills.GigaDrillBreaker.Refresh=&a\u0412\u0430\u0448\u0435 \u0443\u043C\u0435\u043D\u0438\u0435 &e\u0413\u0438\u0433\u0430-\u0431\u0443\u0440 &a\u0432\u043E\u0441\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E\\! +Excavation.Skills.GigaDrillBreaker.Refresh=&a\u0412\u0430\u0448\u0435 \u0443\u043C\u0435\u043D\u0438\u0435 &e\u0413\u0438\u0433\u0430-\u0431\u0443\u0440 &a\u0432\u043E\u0441\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E! Excavation.Skills.GigaDrillBreaker.Other.Off=\u0413\u0438\u0433\u0430-\u0431\u0443\u0440&a \u043F\u0440\u0435\u043A\u0440\u0430\u0442\u0438\u043B \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0443 &e{0} -Excavation.Skills.GigaDrillBreaker.Other.On=&a{0}&2 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043B &c\u0413\u0438\u0433\u0430-\u0431\u0443\u0440\\! +Excavation.Skills.GigaDrillBreaker.Other.On=&a{0}&2 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043B &c\u0413\u0438\u0433\u0430-\u0431\u0443\u0440! #FISHING Fishing.ScarcityTip=&e&o\u0412 \u044D\u0442\u043E\u0439 \u0437\u043E\u043D\u0435 \u043D\u0435 \u043F\u0440\u0430\u043A\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u043D\u0435 \u043E\u0441\u0442\u0430\u043B\u043E\u0441\u044C \u0440\u044B\u0431\u044B - \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, \u0445\u043E\u0442\u044F \u0431\u044B \u043D\u0430 {0} \u0431\u043B\u043E\u043A\u043E\u0432 \u0434\u0430\u043B\u044C\u0448\u0435 \u043E\u0442\u0441\u044E\u0434\u0430. -Fishing.Scared=&7&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=&c&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 \u0432\u044B\u0437\u044B\u0432\u0435\u0442 \u0443\u0441\u0442\u0430\u043B\u043E\u0441\u0442\u044C \u0438 \u0438\u0437\u043D\u043E\u0441 \u0443\u0434\u043E\u0447\u043A\u0438\\! +Fishing.Scared=&7&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=&c&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 \u0432\u044B\u0437\u044B\u0432\u0435\u0442 \u0443\u0441\u0442\u0430\u043B\u043E\u0441\u0442\u044C \u0438 \u0438\u0437\u043D\u043E\u0441 \u0443\u0434\u043E\u0447\u043A\u0438! Fishing.LowResourcesTip=&7\u0412\u044B \u043F\u043E\u043D\u0438\u043C\u0430\u0435\u0442\u0435, \u0447\u0442\u043E \u0432 \u044D\u0442\u043E\u043C \u0440\u0430\u0439\u043E\u043D\u0435 \u043E\u0441\u0442\u0430\u043B\u043E\u0441\u044C \u043C\u0430\u043B\u043E \u0440\u044B\u0431\u044B. \u041F\u043E\u043F\u0440\u043E\u0431\u0443\u0439\u0442\u0435 \u0440\u044B\u0431\u0430\u0447\u0438\u0442\u044C \u043D\u0430 {0} \u0431\u043B\u043E\u043A\u043E\u0432 \u0434\u0430\u043B\u044C\u0448\u0435 \u043E\u0442\u0441\u044E\u0434\u0430. -Fishing.Ability.Info=\u041E\u0445\u043E\u0442\u043D\u0438\u043A \u0437\u0430 \u0447\u0443\u0434\u0435\u0441\u0430\u043C\u0438\\: &7 **\u0421\u043E\u0432\u0435\u0440\u0448\u0435\u043D\u0441\u0442\u0432\u0443\u0435\u0442\u0441\u044F \u0441 \u0440\u0430\u043D\u0433\u043E\u043C \u041E\u0445\u043E\u0442\u043D\u0438\u043A\u0430 \u0437\u0430 \u0441\u043E\u043A\u0440\u043E\u0432\u0438\u0449\u0430\u043C\u0438** +Fishing.Ability.Info=\u041E\u0445\u043E\u0442\u043D\u0438\u043A \u0437\u0430 \u0447\u0443\u0434\u0435\u0441\u0430\u043C\u0438: &7 **\u0421\u043E\u0432\u0435\u0440\u0448\u0435\u043D\u0441\u0442\u0432\u0443\u0435\u0442\u0441\u044F \u0441 \u0440\u0430\u043D\u0433\u043E\u043C \u041E\u0445\u043E\u0442\u043D\u0438\u043A\u0430 \u0437\u0430 \u0441\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 {0}+ \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 {0}+ \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 {0}+ \u041D\u0410\u0412\u042B\u041A\u0410 (\u041C\u0410\u0421\u0422\u0415\u0420-\u0420\u042B\u0411\u041E\u041B\u041E\u0412) Fishing.SubSkill.TreasureHunter.Name=\u041E\u0445\u043E\u0442\u043D\u0438\u043A \u0437\u0430 \u0441\u043E\u043A\u0440\u043E\u0432\u0438\u0449\u0430\u043C\u0438 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 \u0441\u043E\u043A\u0440\u043E\u0432\u0438\u0449\u0430\u043C\u0438\\: &a{0}&3/&a{1} -Fishing.SubSkill.TreasureHunter.Stat.Extra=\u0428\u0430\u043D\u0441 \u0434\u043E\u0431\u044B\u0447\u0438\\: &7\u041E\u0431\u044B\u0447\u043D\u043E\u0435\\: &e{0} &a\u041D\u0435\u043E\u0431\u044B\u0447\u043D\u043E\u0435\\: &e{1}!nasd&9\u0420\u0435\u0434\u043A\u043E\u0435\\: &e{2} &d\u042D\u043F\u0438\u0447\u0435\u0441\u043A\u043E\u0435\\: &e{3} &6\u041B\u0435\u0433\u0435\u043D\u0434\u0430\u0440\u043D\u043E\u0435\\: &e{4} &b\u041C\u0438\u0444\u0438\u0447\u0435\u0441\u043A\u043E\u0435\\: &e{5} +Fishing.SubSkill.TreasureHunter.Stat=\u0420\u0430\u043D\u0433 \u041E\u0445\u043E\u0442\u043D\u0438\u043A\u0430 \u0437\u0430 \u0441\u043E\u043A\u0440\u043E\u0432\u0438\u0449\u0430\u043C\u0438: &a{0}&3/&a{1} +Fishing.SubSkill.TreasureHunter.Stat.Extra=\u0428\u0430\u043D\u0441 \u0434\u043E\u0431\u044B\u0447\u0438: &7\u041E\u0431\u044B\u0447\u043D\u043E\u0435: &e{0} &a\u041D\u0435\u043E\u0431\u044B\u0447\u043D\u043E\u0435: &e{1}!nasd&9\u0420\u0435\u0434\u043A\u043E\u0435: &e{2} &d\u042D\u043F\u0438\u0447\u0435\u0441\u043A\u043E\u0435: &e{3} &6\u041B\u0435\u0433\u0435\u043D\u0434\u0430\u0440\u043D\u043E\u0435: &e{4} &b\u041C\u0438\u0444\u0438\u0447\u0435\u0441\u043A\u043E\u0435: &e{5} Fishing.SubSkill.MagicHunter.Name=\u041E\u0445\u043E\u0442\u043D\u0438\u043A \u0437\u0430 \u0447\u0443\u0434\u0435\u0441\u0430\u043C\u0438 Fishing.SubSkill.MagicHunter.Description=\u041D\u0430\u0445\u043E\u0434\u043A\u0430 \u0437\u0430\u0447\u0430\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0445 \u043F\u0440\u0435\u0434\u043C\u0435\u0442\u043E\u0432 Fishing.SubSkill.MagicHunter.Stat=\u0428\u0430\u043D\u0441 \u041E\u0445\u043E\u0442\u043D\u0438\u043A\u0430 \u0437\u0430 \u0447\u0443\u0434\u0435\u0441\u0430\u043C\u0438 @@ -250,18 +250,18 @@ Fishing.SubSkill.Shake.Description=\u0412\u044B\u0442\u0440\u044F\u0445\u0438\u0 Fishing.SubSkill.Shake.Stat=\u0428\u0430\u043D\u0441 \u0412\u0441\u0442\u0440\u044F\u0441\u043A\u0438 Fishing.SubSkill.FishermansDiet.Name=\u0420\u044B\u0431\u0430\u0446\u043A\u0430\u044F \u0434\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 \u0434\u0438\u0435\u0442\u0430\\:&a \u0420\u0430\u043D\u0433 {0} +Fishing.SubSkill.FishermansDiet.Stat=\u0420\u044B\u0431\u0430\u0446\u043A\u0430\u044F \u0434\u0438\u0435\u0442\u0430:&a \u0420\u0430\u043D\u0433 {0} Fishing.SubSkill.MasterAngler.Name=\u041C\u0430\u0441\u0442\u0435\u0440-\u0440\u044B\u0431\u043E\u043B\u043E\u0432 Fishing.SubSkill.MasterAngler.Description=\u0420\u044B\u0431\u0430 \u043B\u043E\u0432\u0438\u0442\u0441\u044F \u0447\u0430\u0449\u0435, \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u043B\u0443\u0447\u0448\u0435 \u043F\u0440\u0438 \u0440\u044B\u0431\u0430\u043B\u043A\u0435 \u0441 \u043B\u043E\u0434\u043A\u0438. -Fishing.SubSkill.MasterAngler.Stat=\u0423\u043C\u0435\u043D\u044C\u0448\u0435\u043D\u0438\u0435 \u043C\u0438\u043D\u0438\u043C\u0430\u043B\u044C\u043D\u043E\u0433\u043E \u043E\u0436\u0438\u0434\u0430\u043D\u0438\u044F \u043A\u043B\u0451\u0432\u0430\\: &a-{0} \u0441\u0435\u043A\u0443\u043D\u0434 -Fishing.SubSkill.MasterAngler.Stat.Extra=\u0423\u043C\u0435\u043D\u044C\u0448\u0435\u043D\u0438\u0435 \u043C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u043E\u0433\u043E \u043E\u0436\u0438\u0434\u0430\u043D\u0438\u044F \u043A\u043B\u0451\u0432\u0430\\: &a-{0} \u0441\u0435\u043A\u0443\u043D\u0434 +Fishing.SubSkill.MasterAngler.Stat=\u0423\u043C\u0435\u043D\u044C\u0448\u0435\u043D\u0438\u0435 \u043C\u0438\u043D\u0438\u043C\u0430\u043B\u044C\u043D\u043E\u0433\u043E \u043E\u0436\u0438\u0434\u0430\u043D\u0438\u044F \u043A\u043B\u0451\u0432\u0430: &a-{0} \u0441\u0435\u043A\u0443\u043D\u0434 +Fishing.SubSkill.MasterAngler.Stat.Extra=\u0423\u043C\u0435\u043D\u044C\u0448\u0435\u043D\u0438\u0435 \u043C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u043E\u0433\u043E \u043E\u0436\u0438\u0434\u0430\u043D\u0438\u044F \u043A\u043B\u0451\u0432\u0430: &a-{0} \u0441\u0435\u043A\u0443\u043D\u0434 Fishing.SubSkill.IceFishing.Name=\u041F\u043E\u0434\u043B\u0435\u0434\u043D\u0430\u044F \u0440\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 \u0440\u044B\u0431\u0430\u043B\u043A\u0430 Fishing.Chance.Raining=&9 \u0411\u043E\u043D\u0443\u0441 \u0434\u043E\u0436\u0434\u044F -Fishing.Listener=\u0420\u044B\u0431\u043E\u043B\u043E\u0432\u0441\u0442\u0432\u043E\\: +Fishing.Listener=\u0420\u044B\u0431\u043E\u043B\u043E\u0432\u0441\u0442\u0432\u043E: Fishing.Ability.TH.MagicFound=&7\u0422\u044B \u0447\u0443\u0432\u0441\u0442\u0432\u0443\u0435\u0448\u044C \u043D\u0435\u0447\u0442\u043E \u0447\u0443\u0434\u043E\u0442\u0432\u043E\u0440\u043D\u043E\u0435 \u043E\u0442 \u044D\u0442\u043E\u0433\u043E \u0443\u043B\u043E\u0432\u0430... -Fishing.Ability.TH.Boom=&7\u0412\u0420\u0415\u041C\u042F \u0412\u0417\u0420\u042B\u0412\u0410\u0422\u042C\\!\\!\\! +Fishing.Ability.TH.Boom=&7\u0412\u0420\u0415\u041C\u042F \u0412\u0417\u0420\u042B\u0412\u0410\u0422\u042C!!! Fishing.Ability.TH.Poison=&7\u041F\u0430\u0445\u043D\u0435\u0442 \u0447\u0435\u043C-\u0442\u043E \u0441\u043E\u043C\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u043C... Fishing.SkillName=\u0420\u042B\u0411\u041E\u041B\u041E\u0412\u0421\u0422\u0412\u041E #HERBALISM @@ -277,12 +277,12 @@ Herbalism.SubSkill.GreenTerra.Stat=\u0414\u043B\u0438\u0442\u0435\u043B\u044C\u0 Herbalism.SubSkill.GreenThumb.Name=\u0416\u0438\u0432\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0435 \u043F\u0440\u0438\u043A\u043E\u0441\u043D\u043E\u0432\u0435\u043D\u0438\u0435 Herbalism.SubSkill.GreenThumb.Description=\u0410\u0432\u0442\u043E\u043F\u043E\u0441\u0430\u0434\u043A\u0430 \u0440\u0430\u0441\u0442\u0435\u043D\u0438\u0439 \u043F\u0440\u0438 \u0441\u0431\u043E\u0440\u0435 \u0443\u0440\u043E\u0436\u0430\u044F \u043C\u043E\u0442\u044B\u0433\u043E\u0439 Herbalism.SubSkill.GreenThumb.Stat=\u0428\u0430\u043D\u0441 \u0416\u0438\u0432\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0433\u043E \u043F\u0440\u0438\u043A\u043E\u0441\u043D\u043E\u0432\u0435\u043D\u0438\u044F -Herbalism.SubSkill.GreenThumb.Stat.Extra=\u0421\u0442\u0430\u0434\u0438\u044F \u0416\u0438\u0432\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0433\u043E \u043F\u0440\u0438\u043A\u043E\u0441\u043D\u043E\u0432\u0435\u043D\u0438\u044F\\: &a \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.SubSkill.GreenThumb.Stat.Extra=\u0421\u0442\u0430\u0434\u0438\u044F \u0416\u0438\u0432\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0433\u043E \u043F\u0440\u0438\u043A\u043E\u0441\u043D\u043E\u0432\u0435\u043D\u0438\u044F: &a \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 \u043F\u0440\u0438\u043A\u043E\u0441\u043D\u043E\u0432\u0435\u043D\u0438\u0435 (\u0431\u043B\u043E\u043A\u0438) Herbalism.SubSkill.GreenThumb.Description.2=\u041F\u043E\u043A\u0440\u044B\u0432\u0430\u0435\u0442 \u043A\u0438\u0440\u043F\u0438\u0447\u0438 \u043C\u0445\u043E\u043C \u0438\u043B\u0438 \u0440\u0430\u0441\u0442\u0438\u0442 \u0442\u0440\u0430\u0432\u0443 Herbalism.SubSkill.FarmersDiet.Name=\u0424\u0435\u0440\u043C\u0435\u0440\u0441\u043A\u0430\u044F \u0434\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 \u0434\u0438\u0435\u0442\u0430\\: &a\u0420\u0430\u043D\u0433 {0} +Herbalism.SubSkill.FarmersDiet.Stat=\u0424\u0435\u0440\u043C\u0435\u0440\u0441\u043A\u0430\u044F \u0434\u0438\u0435\u0442\u0430: &a\u0420\u0430\u043D\u0433 {0} Herbalism.SubSkill.DoubleDrops.Name=\u0414\u0432\u043E\u0439\u043D\u0430\u044F \u0434\u043E\u0431\u044B\u0447\u0430 Herbalism.SubSkill.DoubleDrops.Description=\u0423\u0434\u0432\u0430\u0438\u0432\u0430\u0435\u0442 \u043E\u0431\u044B\u0447\u043D\u0443\u044E \u0434\u043E\u0431\u044B\u0447\u0443 Herbalism.SubSkill.DoubleDrops.Stat=\u0428\u0430\u043D\u0441 \u0414\u0432\u043E\u0439\u043D\u043E\u0439 \u0434\u043E\u0431\u044B\u0447\u0438 @@ -292,14 +292,14 @@ Herbalism.SubSkill.HylianLuck.Stat=\u0428\u0430\u043D\u0441 \u0425\u0430\u0439\u Herbalism.SubSkill.ShroomThumb.Name=\u0413\u0440\u0438\u0431\u043D\u043E\u0435 \u043F\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 \u0434\u0451\u0440\u043D Herbalism.SubSkill.ShroomThumb.Stat=\u0428\u0430\u043D\u0441 \u0413\u0440\u0438\u0431\u043D\u043E\u0433\u043E \u043F\u0440\u0438\u043A\u043E\u0441\u043D\u043E\u0432\u0435\u043D\u0438\u044F -Herbalism.HylianLuck=&a\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.HylianLuck=&a\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=**\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\u0438\u0435** Herbalism.Skills.GTe.On=&a**\u041E\u0417\u0415\u041B\u0415\u041D\u0415\u041D\u0418\u0415 \u0410\u041A\u0422\u0418\u0412\u0418\u0420\u041E\u0412\u0410\u041D\u041E** -Herbalism.Skills.GTe.Refresh=&a\u0412\u0430\u0448\u0435 \u0443\u043C\u0435\u043D\u0438\u0435 &e\u041E\u0437\u0435\u043B\u0435\u043D\u0435\u043D\u0438\u0435 &a\u0432\u043E\u0441\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E\\! +Herbalism.Skills.GTe.Refresh=&a\u0412\u0430\u0448\u0435 \u0443\u043C\u0435\u043D\u0438\u0435 &e\u041E\u0437\u0435\u043B\u0435\u043D\u0435\u043D\u0438\u0435 &a\u0432\u043E\u0441\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E! Herbalism.Skills.GTe.Other.Off=\u041E\u0437\u0435\u043B\u0435\u043D\u0435\u043D\u0438\u0435&a \u043F\u0440\u0435\u043A\u0440\u0430\u0442\u0438\u043B\u043E \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0443 &e{0} -Herbalism.Skills.GTe.Other.On=&a{0}&2 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043B &c\u041E\u0437\u0435\u043B\u0435\u043D\u0435\u043D\u0438\u0435\\! +Herbalism.Skills.GTe.Other.On=&a{0}&2 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043B &c\u041E\u0437\u0435\u043B\u0435\u043D\u0435\u043D\u0438\u0435! #MINING Mining.Ability.Locked.0=\u0417\u0410\u0411\u041B\u041E\u041A\u0418\u0420\u041E\u0412\u0410\u041D\u041E \u0414\u041E {0}+ \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 {0}+ \u041D\u0410\u0412\u042B\u041A\u0410 (\u0411\u041E\u041B\u042C\u0428\u0418\u0415 \u0411\u041E\u041C\u0411\u042B) @@ -314,27 +314,27 @@ Mining.SubSkill.DoubleDrops.Description=\u0423\u0434\u0432\u0430\u0438\u0432\u04 Mining.SubSkill.DoubleDrops.Stat=\u0428\u0430\u043D\u0441 \u0414\u0432\u043E\u0439\u043D\u043E\u0439 \u0434\u043E\u0431\u044B\u0447\u0438 Mining.SubSkill.BlastMining.Name=\u041F\u043E\u0434\u0440\u044B\u0432\u043D\u0430\u044F \u0434\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 \u0434\u0438\u043D\u0430\u043C\u0438\u0442\u0430 -Mining.SubSkill.BlastMining.Stat=\u041F\u043E\u0434\u0440\u044B\u0432\u043D\u0430\u044F \u0434\u043E\u0431\u044B\u0447\u0430\\:&a \u0420\u0430\u043D\u0433 {0}/{1} &7({2}) -Mining.SubSkill.BlastMining.Stat.Extra=\u0423\u0432\u0435\u043B\u0438\u0447\u0435\u043D\u0438\u0435 \u0440\u0430\u0434\u0438\u0443\u0441\u0430 \u0432\u0437\u0440\u044B\u0432\u0430\\: &a+{0} +Mining.SubSkill.BlastMining.Stat=\u041F\u043E\u0434\u0440\u044B\u0432\u043D\u0430\u044F \u0434\u043E\u0431\u044B\u0447\u0430:&a \u0420\u0430\u043D\u0433 {0}/{1} &7({2}) +Mining.SubSkill.BlastMining.Stat.Extra=\u0423\u0432\u0435\u043B\u0438\u0447\u0435\u043D\u0438\u0435 \u0440\u0430\u0434\u0438\u0443\u0441\u0430 \u0432\u0437\u0440\u044B\u0432\u0430: &a+{0} Mining.SubSkill.BiggerBombs.Name=\u0411\u043E\u043B\u044C\u0448\u0438\u0435 \u0431\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 \u0434\u0438\u043D\u0430\u043C\u0438\u0442\u0430 Mining.SubSkill.DemolitionsExpertise.Name=\u042D\u043A\u0441\u043F\u0435\u0440\u0442\u0438\u0437\u0430 \u043F\u043E\u0434\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 \u0434\u0438\u043D\u0430\u043C\u0438\u0442\u0430 Mining.SubSkill.DemolitionsExpertise.Stat=\u0423\u043C\u0435\u043D\u044C\u0448\u0435\u043D\u0438\u0435 \u0443\u0440\u043E\u043D\u0430 \u042D\u043A\u0441\u043F\u0435\u0440\u0442\u0438\u0437\u044B \u043F\u043E\u0434\u0440\u044B\u0432\u043E\u0432 -Mining.Listener=\u0428\u0430\u0445\u0442\u0435\u0440\u0441\u0442\u0432\u043E\\: +Mining.Listener=\u0428\u0430\u0445\u0442\u0435\u0440\u0441\u0442\u0432\u043E: Mining.SkillName=\u0428\u0410\u0425\u0422\u0415\u0420\u0421\u0422\u0412\u041E Mining.Skills.SuperBreaker.Off=**\u0421\u0443\u043F\u0435\u0440\u043A\u0440\u0443\u0448\u0438\u0442\u0435\u043B\u044C \u043F\u0440\u0435\u043A\u0440\u0430\u0442\u0438\u043B \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435** Mining.Skills.SuperBreaker.On=&a**\u0421\u0423\u041F\u0415\u0420\u041A\u0420\u0423\u0428\u0418\u0422\u0415\u041B\u042C \u0410\u041A\u0422\u0418\u0412\u0418\u0420\u041E\u0412\u0410\u041D** Mining.Skills.SuperBreaker.Other.Off=\u0421\u0443\u043F\u0435\u0440\u043A\u0440\u0443\u0448\u0438\u0442\u0435\u043B\u044C&a \u043F\u0440\u0435\u043A\u0440\u0430\u0442\u0438\u043B \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0443 &e{0} -Mining.Skills.SuperBreaker.Other.On=&a{0}&2 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043B &c\u0421\u0443\u043F\u0435\u0440\u043A\u0440\u0443\u0448\u0438\u0442\u0435\u043B\u044C\\! -Mining.Skills.SuperBreaker.Refresh=&a\u0412\u0430\u0448\u0435 \u0443\u043C\u0435\u043D\u0438\u0435 &e\u0421\u0443\u043F\u0435\u0440\u043A\u0440\u0443\u0448\u0438\u0442\u0435\u043B\u044C &a\u0432\u043E\u0441\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E\\! +Mining.Skills.SuperBreaker.Other.On=&a{0}&2 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043B &c\u0421\u0443\u043F\u0435\u0440\u043A\u0440\u0443\u0448\u0438\u0442\u0435\u043B\u044C! +Mining.Skills.SuperBreaker.Refresh=&a\u0412\u0430\u0448\u0435 \u0443\u043C\u0435\u043D\u0438\u0435 &e\u0421\u0443\u043F\u0435\u0440\u043A\u0440\u0443\u0448\u0438\u0442\u0435\u043B\u044C &a\u0432\u043E\u0441\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E! #Blast Mining Mining.Blast.Boom=&7**\u0411\u0423\u041C** Mining.Blast.Cooldown= Mining.Blast.Effect=+{0} \u0440\u0443\u0434\u044B, {1}x \u0434\u043E\u0431\u044B\u0447\u0430 -Mining.Blast.Other.On=&a{0}&2 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043B &c\u041F\u043E\u0434\u0440\u044B\u0432\u043D\u0443\u044E \u0434\u043E\u0431\u044B\u0447\u0443\\! -Mining.Blast.Refresh=&a\u0412\u0430\u0448\u0435 \u0443\u043C\u0435\u043D\u0438\u0435 &e\u041F\u043E\u0434\u0440\u044B\u0432\u043D\u0430\u044F \u0434\u043E\u0431\u044B\u0447\u0430 &a\u0432\u043E\u0441\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E\\! +Mining.Blast.Other.On=&a{0}&2 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043B &c\u041F\u043E\u0434\u0440\u044B\u0432\u043D\u0443\u044E \u0434\u043E\u0431\u044B\u0447\u0443! +Mining.Blast.Refresh=&a\u0412\u0430\u0448\u0435 \u0443\u043C\u0435\u043D\u0438\u0435 &e\u041F\u043E\u0434\u0440\u044B\u0432\u043D\u0430\u044F \u0434\u043E\u0431\u044B\u0447\u0430 &a\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 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u043E\u0432 \u0438 \u0431\u0440\u043E\u043D\u0438 @@ -346,7 +346,7 @@ Repair.SubSkill.StoneRepair.Name=\u041A\u0430\u043C\u0435\u043D\u043D\u044B\u043 Repair.SubSkill.StoneRepair.Description=\u0420\u0435\u043C\u043E\u043D\u0442 \u043A\u0430\u043C\u0435\u043D\u043D\u044B\u0445 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u043E\u0432 Repair.SubSkill.RepairMastery.Name=\u041C\u0430\u0441\u0442\u0435\u0440\u0441\u0442\u0432\u043E \u0440\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\u0441\u0442\u0432\u043E \u0440\u0435\u043C\u043E\u043D\u0442\u0430\\: &a\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.RepairMastery.Stat=\u041C\u0430\u0441\u0442\u0435\u0440\u0441\u0442\u0432\u043E \u0440\u0435\u043C\u043E\u043D\u0442\u0430: &a\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\u0440\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=\u0428\u0430\u043D\u0441 \u0421\u0443\u043F\u0435\u0440\u0440\u0435\u043C\u043E\u043D\u0442\u0430 @@ -354,11 +354,11 @@ Repair.SubSkill.DiamondRepair.Name=\u0410\u043B\u043C\u0430\u0437\u043D\u044B\u0 Repair.SubSkill.DiamondRepair.Description=\u0420\u0435\u043C\u043E\u043D\u0442 \u0430\u043B\u043C\u0430\u0437\u043D\u044B\u0445 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u043E\u0432 \u0438 \u0431\u0440\u043E\u043D\u0438 Repair.SubSkill.ArcaneForging.Name=\u0412\u043E\u043B\u0448\u0435\u0431\u043D\u0430\u044F \u043A\u043E\u0432\u043A\u0430 Repair.SubSkill.ArcaneForging.Description=\u0420\u0435\u043C\u043E\u043D\u0442 \u0432\u043E\u043B\u0448\u0435\u0431\u043D\u044B\u0445 \u043F\u0440\u0435\u0434\u043C\u0435\u0442\u043E\u0432 -Repair.SubSkill.ArcaneForging.Stat=\u0412\u043E\u043B\u0448\u0435\u0431\u043D\u0430\u044F \u043A\u043E\u0432\u043A\u0430\\: &e\u0420\u0430\u043D\u0433 {0}/{1} -Repair.SubSkill.ArcaneForging.Stat.Extra=&3\u0428\u0430\u043D\u0441\u044B \u0412\u043E\u043B\u0448\u0435\u0431\u043D\u043E\u0439 \u043A\u043E\u0432\u043A\u0438\\:&7 \u0443\u0441\u043F\u0435\u0445 &a{0}&7%, \u043F\u0440\u043E\u0432\u0430\u043B &c{1}&7% -Repair.Error=&4\u0412 mcMMO \u043F\u0440\u043E\u0438\u0437\u043E\u0448\u043B\u0430 \u043E\u0448\u0438\u0431\u043A\u0430 \u043F\u0440\u0438 \u043F\u043E\u043F\u044B\u0442\u043A\u0435 \u043F\u043E\u0447\u0438\u043D\u0438\u0442\u044C \u044D\u0442\u043E\u0442 \u043F\u0440\u0435\u0434\u043C\u0435\u0442\\! +Repair.SubSkill.ArcaneForging.Stat=\u0412\u043E\u043B\u0448\u0435\u0431\u043D\u0430\u044F \u043A\u043E\u0432\u043A\u0430: &e\u0420\u0430\u043D\u0433 {0}/{1} +Repair.SubSkill.ArcaneForging.Stat.Extra=&3\u0428\u0430\u043D\u0441\u044B \u0412\u043E\u043B\u0448\u0435\u0431\u043D\u043E\u0439 \u043A\u043E\u0432\u043A\u0438:&7 \u0443\u0441\u043F\u0435\u0445 &a{0}&7%, \u043F\u0440\u043E\u0432\u0430\u043B &c{1}&7% +Repair.Error=&4\u0412 mcMMO \u043F\u0440\u043E\u0438\u0437\u043E\u0448\u043B\u0430 \u043E\u0448\u0438\u0431\u043A\u0430 \u043F\u0440\u0438 \u043F\u043E\u043F\u044B\u0442\u043A\u0435 \u043F\u043E\u0447\u0438\u043D\u0438\u0442\u044C \u044D\u0442\u043E\u0442 \u043F\u0440\u0435\u0434\u043C\u0435\u0442! Repair.Listener.Anvil=&4\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.Listener=\u0420\u0435\u043C\u043E\u043D\u0442: Repair.SkillName=\u0420\u0415\u041C\u041E\u041D\u0422 Repair.Skills.AdeptDiamond=&4\u0412\u044B \u043D\u0435\u0434\u043E\u0441\u0442\u0430\u0442\u043E\u0447\u043D\u043E \u0443\u043C\u0435\u043B\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=&4\u0412\u044B \u043D\u0435\u0434\u043E\u0441\u0442\u0430\u0442\u043E\u0447\u043D\u043E \u0443\u043C\u0435\u043B\u044B, \u0447\u0442\u043E\u0431\u044B \u0447\u0438\u043D\u0438\u0442\u044C \u0437\u043E\u043B\u043E\u0442\u044B\u0435 \u0432\u0435\u0449\u0438. @@ -380,44 +380,44 @@ Salvage.SubSkill.UnderstandingTheArt.Name=\u041F\u043E\u043D\u0438\u043C\u0430\u Salvage.SubSkill.UnderstandingTheArt.Description=\u0412\u044B \u043D\u0435 \u043F\u0440\u043E\u0441\u0442\u043E \u043A\u043E\u043F\u0430\u0435\u0442\u0435\u0441\u044C \u0432 \u0441\u043E\u0441\u0435\u0434\u0441\u043A\u043E\u043C \u043C\u0443\u0441\u043E\u0440\u0435 - \u0432\u044B \u0437\u0430\u0431\u043E\u0442\u0438\u0442\u0435\u0441\u044C \u043E\u0431 \u043E\u043A\u0440\u0443\u0436\u0430\u044E\u0449\u0435\u0439 \u0441\u0440\u0435\u0434\u0435.!nasd\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 \u0445\u043B\u0430\u043C\u0430 Salvage.SubSkill.ScrapCollector.Description=\u0420\u0430\u0437\u0431\u0438\u0440\u0430\u0439\u0442\u0435 \u043F\u0440\u0435\u0434\u043C\u0435\u0442\u044B \u043D\u0430 \u043C\u0430\u0442\u0435\u0440\u0438\u0430\u043B\u044B, \u043A\u0430\u0447\u0435\u0441\u0442\u0432\u043E \u0440\u0430\u0437\u0431\u043E\u0440\u043A\u0438 \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 \u0445\u043B\u0430\u043C\u0430\\: &a\u0420\u0430\u0437\u0431\u0438\u0440\u0430\u0439\u0442\u0435 \u0434\u043E &e{0}&a \u043F\u0440\u0435\u0434\u043C\u0435\u0442\u043E\u0432. \u0423\u0434\u0430\u0447\u0430 \u043F\u0440\u0438\u0433\u043E\u0434\u0438\u0442\u0441\u044F. +Salvage.SubSkill.ScrapCollector.Stat=\u041A\u043E\u043B\u043B\u0435\u043A\u0446\u0438\u043E\u043D\u0435\u0440 \u0445\u043B\u0430\u043C\u0430: &a\u0420\u0430\u0437\u0431\u0438\u0440\u0430\u0439\u0442\u0435 \u0434\u043E &e{0}&a \u043F\u0440\u0435\u0434\u043C\u0435\u0442\u043E\u0432. \u0423\u0434\u0430\u0447\u0430 \u043F\u0440\u0438\u0433\u043E\u0434\u0438\u0442\u0441\u044F. Salvage.SubSkill.ArcaneSalvage.Name=\u041C\u0430\u0433\u0438\u0447\u0435\u0441\u043A\u0430\u044F \u043F\u0435\u0440\u0435\u0440\u0430\u0431\u043E\u0442\u043A\u0430 Salvage.SubSkill.ArcaneSalvage.Description=\u0418\u0437\u0432\u043B\u0435\u0447\u0435\u043D\u0438\u0435 \u0437\u0430\u0447\u0430\u0440\u043E\u0432\u0430\u043D\u0438\u0439 \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 \u043F\u0435\u0440\u0435\u0440\u0430\u0431\u043E\u0442\u043A\u0430\\: &e\u0420\u0430\u043D\u0433 {0}/{1} +Salvage.SubSkill.ArcaneSalvage.Stat=\u041C\u0430\u0433\u0438\u0447\u0435\u0441\u043A\u0430\u044F \u043F\u0435\u0440\u0435\u0440\u0430\u0431\u043E\u0442\u043A\u0430: &e\u0420\u0430\u043D\u0433 {0}/{1} Salvage.Ability.Bonus.0=\u041A\u043E\u043B\u043B\u0435\u043A\u0446\u0438\u043E\u043D\u0435\u0440 \u0445\u043B\u0430\u043C\u0430 Salvage.Ability.Bonus.1=\u0420\u0430\u0437\u0431\u0438\u0440\u0430\u0439\u0442\u0435 \u0434\u043E &e{0}&a \u043F\u0440\u0435\u0434\u043C\u0435\u0442\u043E\u0432. \u0423\u0434\u0430\u0447\u0430 \u043F\u0440\u0438\u0433\u043E\u0434\u0438\u0442\u0441\u044F. Salvage.Arcane.ExtractFull=&7\u0428\u0430\u043D\u0441 \u041C\u041F \u0432\u0441\u0435\u0445 \u0437\u0430\u0447\u0430\u0440\u043E\u0432\u0430\u043D\u0438\u0439 Salvage.Arcane.ExtractPartial=&7\u0428\u0430\u043D\u0441 \u041C\u041F \u0447\u0430\u0441\u0442\u0438 \u0437\u0430\u0447\u0430\u0440\u043E\u0432\u0430\u043D\u0438\u0439 -Salvage.Skills.Success=&a\u041F\u0440\u0435\u0434\u043C\u0435\u0442 \u0440\u0430\u0437\u043E\u0431\u0440\u0430\u043D\\! +Salvage.Skills.Success=&a\u041F\u0440\u0435\u0434\u043C\u0435\u0442 \u0440\u0430\u0437\u043E\u0431\u0440\u0430\u043D! Salvage.Skills.Adept.Damaged=&4\u0412\u044B \u043D\u0435\u0434\u043E\u0441\u0442\u0430\u0442\u043E\u0447\u043D\u043E \u0443\u043C\u0435\u043B\u044B, \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=\u0423 \u0432\u0430\u0441 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u0443\u0440\u043E\u0432\u0435\u043D\u044C &e{0}&c, \u0447\u0442\u043E\u0431\u044B \u0440\u0430\u0437\u043E\u0431\u0440\u0430\u0442\u044C &e{1} Salvage.Skills.TooDamaged=&4\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 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044C \u0435\u0433\u043E. Salvage.Skills.ArcaneFailed=&c\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=&c\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=&a\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.Skills.ArcaneSuccess=&a\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=&4\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\u0451 \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=\u0420\u0430\u0437\u0431\u043E\u0440\u043A\u0430\\: +Salvage.Listener=\u0420\u0430\u0437\u0431\u043E\u0440\u043A\u0430: Salvage.SkillName=\u0420\u0410\u0417\u0411\u041E\u0420\u041A\u0410 Salvage.Skills.Lottery.Normal=&6\u0423 \u0432\u0430\u0441 \u0432\u044B\u0448\u043B\u043E \u0438\u0437\u0432\u043B\u0435\u0447\u044C &3{0}&6 \u043C\u0430\u0442\u0435\u0440\u0438\u0430\u043B\u043E\u0432 \u0438\u0437 &e{1}&6. -Salvage.Skills.Lottery.Perfect=&a&l\u041F\u0440\u0435\u0432\u043E\u0441\u0445\u043E\u0434\u043D\u043E\\!&r&6 \u0412\u044B \u0440\u0430\u0437\u043E\u0431\u0440\u0430\u043B\u0438 &3{1}&6 \u0431\u0435\u0437 \u043E\u0441\u043E\u0431\u044B \u0443\u0441\u0438\u043B\u0438\u0439 \u0438 \u043F\u043E\u043B\u0443\u0447\u0438\u043B\u0438 &3{0}&6 \u043C\u0430\u0442\u0435\u0440\u0438\u0430\u043B\u043E\u0432. +Salvage.Skills.Lottery.Perfect=&a&l\u041F\u0440\u0435\u0432\u043E\u0441\u0445\u043E\u0434\u043D\u043E!&r&6 \u0412\u044B \u0440\u0430\u0437\u043E\u0431\u0440\u0430\u043B\u0438 &3{1}&6 \u0431\u0435\u0437 \u043E\u0441\u043E\u0431\u044B \u0443\u0441\u0438\u043B\u0438\u0439 \u0438 \u043F\u043E\u043B\u0443\u0447\u0438\u043B\u0438 &3{0}&6 \u043C\u0430\u0442\u0435\u0440\u0438\u0430\u043B\u043E\u0432. Salvage.Skills.Lottery.Untrained=&7\u0412\u044B \u043D\u0435\u0434\u043E\u0441\u0442\u0430\u0442\u043E\u0447\u043D\u044B \u0443\u043C\u0435\u043B\u044B \u0432 \u0420\u0430\u0437\u0431\u043E\u0440\u043A\u0435. \u0423 \u0432\u0430\u0441 \u0432\u044B\u0448\u043B\u043E \u0438\u0437\u0432\u043B\u0435\u0447\u044C \u043B\u0438\u0448\u044C &c{0}&7 \u043C\u0430\u0442\u0435\u0440\u0438\u0430\u043B\u043E\u0432 \u0438\u0437 &a{1}&7. #Anvil (Shared between SALVAGE and REPAIR) -Anvil.Unbreakable=\u042D\u0442\u043E\u0442 \u043F\u0440\u0435\u0434\u043C\u0435\u0442 \u043D\u0435\u0440\u0430\u0437\u0440\u0443\u0448\u0438\u043C\\! +Anvil.Unbreakable=\u042D\u0442\u043E\u0442 \u043F\u0440\u0435\u0434\u043C\u0435\u0442 \u043D\u0435\u0440\u0430\u0437\u0440\u0443\u0448\u0438\u043C! #SWORDS Swords.Ability.Lower=&7\u0412\u044B \u043E\u043F\u0443\u0441\u0442\u0438\u043B\u0438 \u0441\u0432\u043E\u0439 \u043C\u0435\u0447. Swords.Ability.Ready=&4\u0412\u044B &6\u043F\u043E\u0434\u0433\u043E\u0442\u043E\u0432\u0438\u043B\u0438&e \u0441\u0432\u043E\u0439 \u043C\u0435\u0447. -Swords.Combat.Rupture.Note=&7\u041F\u0420\u0418\u041C\u0415\u0427\u0410\u041D\u0418\u0415\\: &e1 \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.Bleeding.Started=&4 \u0412\u044B \u0438\u0441\u0442\u0435\u043A\u0430\u0435\u0442\u0435 \u043A\u0440\u043E\u0432\u044C\u044E\\! -Swords.Combat.Bleeding.Stopped=&7\u041A\u0440\u043E\u0432\u043E\u0442\u0435\u0447\u0435\u043D\u0438\u0435 &a\u043F\u0440\u0435\u043A\u0440\u0430\u0442\u0438\u043B\u043E\u0441\u044C&7\\! +Swords.Combat.Rupture.Note=&7\u041F\u0420\u0418\u041C\u0415\u0427\u0410\u041D\u0418\u0415: &e1 \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.Bleeding.Started=&4 \u0412\u044B \u0438\u0441\u0442\u0435\u043A\u0430\u0435\u0442\u0435 \u043A\u0440\u043E\u0432\u044C\u044E! +Swords.Combat.Bleeding.Stopped=&7\u041A\u0440\u043E\u0432\u043E\u0442\u0435\u0447\u0435\u043D\u0438\u0435 &a\u043F\u0440\u0435\u043A\u0440\u0430\u0442\u0438\u043B\u043E\u0441\u044C&7! Swords.Combat.Bleeding=&a**\u0412\u0420\u0410\u0413 \u0418\u0421\u0422\u0415\u041A\u0410\u0415\u0422 \u041A\u0420\u041E\u0412\u042C\u042E** -Swords.Combat.Counter.Hit=&4\u041F\u043E\u0440\u0430\u0436\u0435\u043D \u043A\u043E\u043D\u0442\u0440\u0430\u0442\u0430\u043A\u043E\u0439\\! +Swords.Combat.Counter.Hit=&4\u041F\u043E\u0440\u0430\u0436\u0435\u043D \u043A\u043E\u043D\u0442\u0440\u0430\u0442\u0430\u043A\u043E\u0439! Swords.Combat.Countered=&a**\u041A\u041E\u041D\u0422\u0420\u0410\u0422\u0410\u041A\u0410** -Swords.Combat.SS.Struck=&4\u041F\u043E\u0440\u0430\u0436\u0435\u043D \u0420\u0423\u0411\u042F\u0429\u0418\u041C \u0423\u0414\u0410\u0420\u041E\u041C\\! +Swords.Combat.SS.Struck=&4\u041F\u043E\u0440\u0430\u0436\u0435\u043D \u0420\u0423\u0411\u042F\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\u0430\u0435\u0442 \u0447\u0430\u0441\u0442\u044C \u0443\u0440\u043E\u043D\u0430 \u043F\u0440\u0438 \u043D\u0430\u043F\u0430\u0434\u0435\u043D\u0438\u0438\\! +Swords.SubSkill.CounterAttack.Description=\u041E\u0442\u0440\u0430\u0436\u0430\u0435\u0442 \u0447\u0430\u0441\u0442\u044C \u0443\u0440\u043E\u043D\u0430 \u043F\u0440\u0438 \u043D\u0430\u043F\u0430\u0434\u0435\u043D\u0438\u0438! Swords.SubSkill.CounterAttack.Stat=\u0428\u0430\u043D\u0441 \u041A\u043E\u043D\u0442\u0440\u0430\u0442\u0430\u043A\u0438 Swords.SubSkill.SerratedStrikes.Name=\u0420\u0443\u0431\u044F\u0449\u0438\u0439 \u0443\u0434\u0430\u0440 -Swords.SubSkill.SerratedStrikes.Description=\u041D\u0430\u043D\u043E\u0441\u0438\u0442 \u0447\u0430\u0441\u0442\u044C \u0443\u0440\u043E\u043D\u0430 \u043F\u043E \u043F\u043B\u043E\u0449\u0430\u0434\u0438 \u0441 \u0448\u0430\u043D\u0441\u043E\u043C \u043F\u0440\u0438\u043C\u0435\u043D\u0438\u0442\u044C \u0420\u0430\u0437\u0440\u044B\u0432\\! +Swords.SubSkill.SerratedStrikes.Description=\u041D\u0430\u043D\u043E\u0441\u0438\u0442 \u0447\u0430\u0441\u0442\u044C \u0443\u0440\u043E\u043D\u0430 \u043F\u043E \u043F\u043B\u043E\u0449\u0430\u0434\u0438 \u0441 \u0448\u0430\u043D\u0441\u043E\u043C \u043F\u0440\u0438\u043C\u0435\u043D\u0438\u0442\u044C \u0420\u0430\u0437\u0440\u044B\u0432! Swords.SubSkill.SerratedStrikes.Stat=\u0414\u043B\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u044C \u0420\u0443\u0431\u044F\u0449\u0435\u0433\u043E \u0443\u0434\u0430\u0440\u0430 Swords.SubSkill.Rupture.Name=\u0420\u0430\u0437\u0440\u044B\u0432 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 @@ -428,16 +428,18 @@ Swords.SubSkill.SwordsLimitBreak.Name=\u0417\u0430\u043F\u0440\u0435\u0434\u0435 Swords.SubSkill.SwordsLimitBreak.Description=\u0412\u044B \u043F\u0440\u0435\u0432\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=\u041C\u0430\u043A\u0441. \u0443\u0440\u043E\u043D \u0417\u0430\u043F\u0440\u0435\u0434\u0435\u043B\u044C\u043D\u044B\u0445 \u043C\u0435\u0447\u0435\u0439 Swords.SubSkill.Rupture.Stat=\u0428\u0430\u043D\u0441 \u0420\u0430\u0437\u0440\u044B\u0432\u0430 -Swords.SubSkill.Rupture.Stat.Extra=\u0420\u0430\u0437\u0440\u044B\u0432\\: &a{0} \u0442\u0438\u043A\u043E\u0432 [{1} \u0443\u0440\u043E\u043D \u0438\u0433\u0440\u043E\u043A\u0430\u043C] [{2} \u0443\u0440\u043E\u043D \u043C\u043E\u0431\u0430\u043C] +Swords.SubSkill.Rupture.Stat.Extra=\u0420\u0430\u0437\u0440\u044B\u0432: &a{0} \u0442\u0438\u043A\u043E\u0432 [{1} \u0443\u0440\u043E\u043D \u0438\u0433\u0440\u043E\u043A\u0430\u043C] [{2} \u0443\u0440\u043E\u043D \u043C\u043E\u0431\u0430\u043C] Swords.Effect.4=\u0420\u0443\u0431\u044F\u0449\u0438\u0439 \u0443\u0434\u0430\u0440 \u0420\u0430\u0437\u0440\u044B\u0432+ + + Swords.Effect.5={0} \u0442\u0438\u043A\u043E\u0432 \u0420\u0430\u0437\u0440\u044B\u0432\u0430 -Swords.Listener=\u041C\u0435\u0447\u0438\\: +Swords.Listener=\u041C\u0435\u0447\u0438: Swords.SkillName=\u041C\u0435\u0447\u0438 Swords.Skills.SS.Off=**\u0420\u0443\u0431\u044F\u0449\u0438\u0439 \u0443\u0434\u0430\u0440 \u043F\u0440\u0435\u043A\u0440\u0430\u0442\u0438\u043B \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435** Swords.Skills.SS.On=&a**\u0420\u0423\u0411\u042F\u0429\u0418\u0419 \u0423\u0414\u0410\u0420 \u0410\u041A\u0422\u0418\u0412\u0418\u0420\u041E\u0412\u0410\u041D** -Swords.Skills.SS.Refresh=&a\u0412\u0430\u0448\u0435 \u0443\u043C\u0435\u043D\u0438\u0435 &e\u0420\u0443\u0431\u044F\u0449\u0438\u0439 \u0443\u0434\u0430\u0440 &a\u0432\u043E\u0441\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E\\! +Swords.Skills.SS.Refresh=&a\u0412\u0430\u0448\u0435 \u0443\u043C\u0435\u043D\u0438\u0435 &e\u0420\u0443\u0431\u044F\u0449\u0438\u0439 \u0443\u0434\u0430\u0440 &a\u0432\u043E\u0441\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E! Swords.Skills.SS.Other.Off=\u0420\u0443\u0431\u044F\u0449\u0438\u0439 \u0443\u0434\u0430\u0440&a \u043F\u0440\u0435\u043A\u0440\u0430\u0442\u0438\u043B \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0443 &e{0} -Swords.Skills.SS.Other.On=&a{0}&2 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043B &c\u0420\u0443\u0431\u044F\u0449\u0438\u0439 \u0443\u0434\u0430\u0440\\! +Swords.Skills.SS.Other.On=&a{0}&2 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043B &c\u0420\u0443\u0431\u044F\u0449\u0438\u0439 \u0443\u0434\u0430\u0440! #TAMING Taming.Ability.Bonus.0=\u0417\u043D\u0430\u043D\u0438\u0435 \u0441\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 @@ -464,7 +466,7 @@ Taming.SubSkill.ShockProof.Name=\u0423\u0434\u0430\u0440\u043E\u043F\u0440\u043E 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 \u043F\u0440\u0438\u0440\u043E\u0434\u044B 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=&7\u0417\u041F\\: \u041F\u0440\u0438\u0441\u044F\u0434\u044C\u0442\u0435 \u0438 \u043D\u0430\u0436\u043C\u0438\u0442\u0435 \u041B\u041A\u041C \u0441!nasd {0} {1} (\u041E\u0446\u0435\u043B\u043E\u0442), {2} {3} (\u0412\u043E\u043B\u043A), {4} {5} (\u041B\u043E\u0448\u0430\u0434\u044C) +Taming.SubSkill.CallOfTheWild.Description.2=&7\u0417\u041F: \u041F\u0440\u0438\u0441\u044F\u0434\u044C\u0442\u0435 \u0438 \u043D\u0430\u0436\u043C\u0438\u0442\u0435 \u041B\u041A\u041C \u0441!nasd {0} {1} (\u041E\u0446\u0435\u043B\u043E\u0442), {2} {3} (\u0412\u043E\u043B\u043A), {4} {5} (\u041B\u043E\u0448\u0430\u0434\u044C) 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\u0430\u044F \u0433\u043E\u043D\u0447\u0430\u044F @@ -479,9 +481,9 @@ Taming.SubSkill.ThickFur.Name=\u0413\u0443\u0441\u0442\u043E\u0439 \u043C\u0435\ Taming.SubSkill.ThickFur.Description=\u0421\u043D\u0438\u0436\u0435\u043D\u0438\u0435 \u0443\u0440\u043E\u043D\u0430, \u043E\u0433\u043D\u0435\u0441\u0442\u043E\u0439\u043A\u043E\u0441\u0442\u044C Taming.SubSkill.Pummel.Name=\u0418\u0437\u0431\u0438\u0435\u043D\u0438\u0435 Taming.SubSkill.Pummel.Description=\u0412\u0430\u0448\u0438 \u0432\u043E\u043B\u043A\u0438 \u0438\u043C\u0435\u044E\u0442 \u0448\u0430\u043D\u0441 \u043E\u0442\u0431\u0440\u043E\u0441\u0438\u0442\u044C \u0432\u0440\u0430\u0433\u043E\u0432 -Taming.SubSkill.Pummel.TargetMessage=\u0412\u044B \u0431\u044B\u043B\u0438 \u043E\u0442\u0431\u0440\u043E\u0448\u0435\u043D\u044B \u0432\u043E\u043B\u043A\u043E\u043C\\! +Taming.SubSkill.Pummel.TargetMessage=\u0412\u044B \u0431\u044B\u043B\u0438 \u043E\u0442\u0431\u0440\u043E\u0448\u0435\u043D\u044B \u0432\u043E\u043B\u043A\u043E\u043C! Taming.Listener.Wolf=&8\u0412\u0430\u0448 \u0432\u043E\u043B\u043A \u0445\u043E\u0447\u0435\u0442 \u0432\u0435\u0440\u043D\u0443\u0442\u0441\u044F \u043A \u0432\u0430\u043C... -Taming.Listener=\u0423\u043A\u0440\u043E\u0449\u0435\u043D\u0438\u0435\\: +Taming.Listener=\u0423\u043A\u0440\u043E\u0449\u0435\u043D\u0438\u0435: Taming.SkillName=\u0423\u041A\u0420\u041E\u0429\u0415\u041D\u0418\u0415 Taming.Summon.COTW.Success.WithoutLifespan=&a(\u0417\u043E\u0432 \u043F\u0440\u0438\u0440\u043E\u0434\u044B) &7\u0412\u044B \u043F\u0440\u0438\u0437\u0432\u0430\u043B\u0438 &6{0}&7 Taming.Summon.COTW.Success.WithLifespan=&a(\u0417\u043E\u0432 \u043F\u0440\u0438\u0440\u043E\u0434\u044B) &7\u0412\u044B \u043F\u0440\u0438\u0437\u0432\u0430\u043B\u0438 &6{0}&7 \u043D\u0430 &6{1}&7 \u0441\u0435\u043A\u0443\u043D\u0434. @@ -494,8 +496,8 @@ Taming.Summon.Name.Format=&6(\u0417\u043E\u0432 \u041F\u0440\u0435\u0434\u043A\u #UNARMED Unarmed.Ability.Bonus.0=\u0421\u0442\u0438\u043B\u044C \u0421\u0442\u0430\u043B\u044C\u043D\u043E\u0433\u043E \u043A\u0443\u043B\u0430\u043A\u0430 Unarmed.Ability.Bonus.1=+{0} \u0443\u043B\u0443\u0447\u0448\u0435\u043D\u0438\u0435 \u0443\u0440\u043E\u043D\u0430 -Unarmed.Ability.IronGrip.Attacker=\u0423 \u0432\u0430\u0448\u0435\u0433\u043E \u043E\u043F\u043F\u043E\u043D\u0435\u043D\u0442\u0430 \u0416\u0435\u043B\u0435\u0437\u043D\u0430\u044F \u0445\u0432\u0430\u0442\u043A\u0430\\! -Unarmed.Ability.IronGrip.Defender=&a\u0412\u0430\u0448\u0430 \u0416\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.IronGrip.Attacker=\u0423 \u0432\u0430\u0448\u0435\u0433\u043E \u043E\u043F\u043F\u043E\u043D\u0435\u043D\u0442\u0430 \u0416\u0435\u043B\u0435\u0437\u043D\u0430\u044F \u0445\u0432\u0430\u0442\u043A\u0430! +Unarmed.Ability.IronGrip.Defender=&a\u0412\u0430\u0448\u0430 \u0416\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=&7\u0412\u044B \u043E\u043F\u0443\u0441\u0442\u0438\u043B\u0438 \u0441\u0432\u043E\u0438 \u043A\u0443\u043B\u0430\u043A\u0438. Unarmed.Ability.Ready=&3\u0412\u044B &6\u043F\u043E\u0434\u0433\u043E\u0442\u043E\u0432\u0438\u043B\u0438&e \u0441\u0432\u043E\u0438 \u043A\u0443\u043B\u0430\u043A\u0438. Unarmed.SubSkill.Berserk.Name=\u0411\u0435\u0440\u0441\u0435\u0440\u043A @@ -517,13 +519,13 @@ Unarmed.SubSkill.IronGrip.Description=\u041F\u0440\u0435\u043F\u044F\u0442\u0441 Unarmed.SubSkill.IronGrip.Stat=\u0428\u0430\u043D\u0441 \u0416\u0435\u043B\u0435\u0437\u043D\u043E\u0439 \u0445\u0432\u0430\u0442\u043A\u0438 Unarmed.SubSkill.BlockCracker.Name=\u041A\u0440\u0443\u0448\u0438\u0442\u0435\u043B\u044C \u0431\u043B\u043E\u043A\u043E\u0432 Unarmed.SubSkill.BlockCracker.Description=\u0420\u0430\u0437\u0440\u0443\u0448\u0430\u0439\u0442\u0435 \u0441\u043A\u0430\u043B\u044B \u0441\u0432\u043E\u0438\u043C\u0438 \u043A\u0443\u043B\u0430\u043A\u0430\u043C\u0438 -Unarmed.Listener=\u0411\u0435\u0437\u043E\u0440\u0443\u0436\u043D\u044B\u0439\\: +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=**\u0411\u0435\u0440\u0441\u0435\u0440\u043A \u043F\u0440\u0435\u043A\u0440\u0430\u0442\u0438\u043B \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435** Unarmed.Skills.Berserk.On=&a**\u0411\u0415\u0420\u0421\u0415\u0420\u041A \u0410\u041A\u0422\u0418\u0412\u0418\u0420\u041E\u0412\u0410\u041D** Unarmed.Skills.Berserk.Other.Off=\u0411\u0435\u0440\u0441\u0435\u0440\u043A&a \u043F\u0440\u0435\u043A\u0440\u0430\u0442\u0438\u043B \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0443 &e{0} -Unarmed.Skills.Berserk.Other.On=&a{0}&2 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043B &c\u0411\u0435\u0440\u0441\u0435\u0440\u043A\u0430\\! -Unarmed.Skills.Berserk.Refresh=&a\u0412\u0430\u0448\u0435 \u0443\u043C\u0435\u043D\u0438\u0435 &e\u0411\u0435\u0440\u0441\u0435\u0440\u043A &a\u0432\u043E\u0441\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E\\! +Unarmed.Skills.Berserk.Other.On=&a{0}&2 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043B &c\u0411\u0435\u0440\u0441\u0435\u0440\u043A\u0430! +Unarmed.Skills.Berserk.Refresh=&a\u0412\u0430\u0448\u0435 \u0443\u043C\u0435\u043D\u0438\u0435 &e\u0411\u0435\u0440\u0441\u0435\u0440\u043A &a\u0432\u043E\u0441\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E! #WOODCUTTING Woodcutting.Ability.0=\u0421\u0434\u0443\u0432\u0430\u0442\u0435\u043B\u044C \u043B\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 @@ -547,15 +549,15 @@ Woodcutting.SubSkill.BarkSurgeon.Name=\u041A\u043E\u0440\u043E\u0432\u0430\u044F 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 \u043F\u0440\u0438\u0440\u043E\u0434\u044B Woodcutting.SubSkill.NaturesBounty.Description=\u041F\u043E\u043B\u0443\u0447\u0430\u0439\u0442\u0435 \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.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=**\u0414\u0440\u043E\u0432\u043E\u0441\u0435\u043A \u043F\u0440\u0435\u043A\u0440\u0430\u0442\u0438\u043B \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435** Woodcutting.Skills.TreeFeller.On=&a**\u0414\u0420\u041E\u0412\u041E\u0421\u0415\u041A \u0410\u041A\u0422\u0418\u0412\u0418\u0420\u041E\u0412\u0410\u041D** -Woodcutting.Skills.TreeFeller.Refresh=&a\u0412\u0430\u0448\u0435 \u0443\u043C\u0435\u043D\u0438\u0435 &e\u0414\u0440\u043E\u0432\u043E\u0441\u0435\u043A &a\u0432\u043E\u0441\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E\\! +Woodcutting.Skills.TreeFeller.Refresh=&a\u0412\u0430\u0448\u0435 \u0443\u043C\u0435\u043D\u0438\u0435 &e\u0414\u0440\u043E\u0432\u043E\u0441\u0435\u043A &a\u0432\u043E\u0441\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E! Woodcutting.Skills.TreeFeller.Other.Off=\u0414\u0440\u043E\u0432\u043E\u0441\u0435\u043A&a \u043F\u0440\u0435\u043A\u0440\u0430\u0442\u0438\u043B\u043E \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0443 &e{0} -Woodcutting.Skills.TreeFeller.Other.On=&a{0}&2 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043B &c\u0414\u0440\u043E\u0432\u043E\u0441\u0435\u043A\u0430\\! -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 \u0431\u043E\u043B\u044C\u0448\u043E\u0435\\! +Woodcutting.Skills.TreeFeller.Other.On=&a{0}&2 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043B &c\u0414\u0440\u043E\u0432\u043E\u0441\u0435\u043A\u0430! +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 \u0431\u043E\u043B\u044C\u0448\u043E\u0435! #ABILITIY #COMBAT @@ -571,14 +573,14 @@ Combat.TargetDazed=\u0412\u0430\u0448\u0430 \u0446\u0435\u043B\u044C &4\u041E\u0 Combat.TouchedFuzzy=&4\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. #COMMANDS ##generic -mcMMO.Description=&3\u041E \u043F\u0440\u043E\u0435\u043A\u0442\u0435 &emcMMO&3\\:,&6mcMMO \u044D\u0442\u043E RPG \u043C\u043E\u0434 &c\u0441 \u043E\u0442\u043A\u0440\u044B\u0442\u044B\u043C \u043A\u043E\u0434\u043E\u043C&6, &6\u0441\u043E\u0437\u0434\u0430\u043D\u043D\u044B\u0439 \u0432 \u0444\u0435\u0432\u0440\u0430\u043B\u0435 2011,&6\u0437\u0430 \u0430\u0432\u0442\u043E\u0440\u0441\u0442\u0432\u043E\u043C &9nossr50&6. \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.,&3\u041F\u043E\u0434\u0441\u043A\u0430\u0437\u043A\u0438\\:,&6 - &a\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 &c/mcmmo help&a \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,&6 - &a\u041D\u0430\u043F\u0435\u0447\u0430\u0442\u0430\u0439\u0442\u0435 &c/\u041D\u0410\u0417\u0412\u0410\u041D\u0418\u0415\u041D\u0410\u0412\u042B\u041A\u0410&a \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,&3\u0420\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A\u0438\\:,&6 - &anossr50 &9(\u0421\u043E\u0437\u0434\u0430\u0442\u0435\u043B\u044C \u0438 \u0420\u0443\u043A\u043E\u0432\u043E\u0434\u0438\u0442\u0435\u043B\u044C),&6 - &aelectronicboy &9(\u0420\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A),&6 - &akashike &9(\u0420\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A),&6 - &at00thpick1 &9(\u041F\u043E\u0434\u0434\u0435\u0440\u0436\u0430\u0442\u0435\u043B\u044C \u041A\u043B\u0430\u0441\u0441\u0438\u043A\u0438) -mcMMO.Description.FormerDevs=&3\u0411\u044B\u0432\u0448\u0438\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A\u0438\\: &aGJ, NuclearW, bm01, TfT_02, Glitchfinder -Commands.addlevels.AwardAll.1=&a\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\\! +mcMMO.Description=&3\u041E \u043F\u0440\u043E\u0435\u043A\u0442\u0435 &emcMMO&3:,&6mcMMO \u044D\u0442\u043E RPG \u043C\u043E\u0434 &c\u0441 \u043E\u0442\u043A\u0440\u044B\u0442\u044B\u043C \u043A\u043E\u0434\u043E\u043C&6, &6\u0441\u043E\u0437\u0434\u0430\u043D\u043D\u044B\u0439 \u0432 \u0444\u0435\u0432\u0440\u0430\u043B\u0435 2011,&6\u0437\u0430 \u0430\u0432\u0442\u043E\u0440\u0441\u0442\u0432\u043E\u043C &9nossr50&6. \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.,&3\u041F\u043E\u0434\u0441\u043A\u0430\u0437\u043A\u0438:,&6 - &a\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 &c/mcmmo help&a \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,&6 - &a\u041D\u0430\u043F\u0435\u0447\u0430\u0442\u0430\u0439\u0442\u0435 &c/\u041D\u0410\u0417\u0412\u0410\u041D\u0418\u0415\u041D\u0410\u0412\u042B\u041A\u0410&a \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,&3\u0420\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A\u0438:,&6 - &anossr50 &9(\u0421\u043E\u0437\u0434\u0430\u0442\u0435\u043B\u044C \u0438 \u0420\u0443\u043A\u043E\u0432\u043E\u0434\u0438\u0442\u0435\u043B\u044C),&6 - &aelectronicboy &9(\u0420\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A),&6 - &akashike &9(\u0420\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A),&6 - &at00thpick1 &9(\u041F\u043E\u0434\u0434\u0435\u0440\u0436\u0430\u0442\u0435\u043B\u044C \u041A\u043B\u0430\u0441\u0441\u0438\u043A\u0438) +mcMMO.Description.FormerDevs=&3\u0411\u044B\u0432\u0448\u0438\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A\u0438: &aGJ, NuclearW, bm01, TfT_02, Glitchfinder +Commands.addlevels.AwardAll.1=&a\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=&a\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.1=&a\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 \u0438\u0437\u043C\u0435\u043D\u0435\u043D \u043D\u0430 {1}. -Commands.addxp.AwardAll=&a\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=&a\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.addxp.AwardAll=&a\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=&a\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 &c\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 &a\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 \u043F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0435\u043D\u0430 \u0434\u043B\u044F &e{0} @@ -586,50 +588,50 @@ Commands.AdminChat.Off=\u0420\u0435\u0436\u0438\u043C \u0430\u0434\u043C\u0438\u Commands.AdminChat.On=\u0420\u0435\u0436\u0438\u043C \u0430\u0434\u043C\u0438\u043D-\u0447\u0430\u0442\u0430 &a\u0432\u043A\u043B\u044E\u0447\u0435\u043D Commands.AdminToggle=&a- \u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435 \u0430\u0434\u043C\u0438\u043D-\u0447\u0430\u0442\u0430 Commands.Chat.Console=*\u041A\u043E\u043D\u0441\u043E\u043B\u044C* -Commands.Cooldowns.Header=&6--\\= &a\u041E\u0442\u043A\u0430\u0442\u044B \u0443\u043C\u0435\u043D\u0438\u0439 mcMMO&6 \\=-- -Commands.Cooldowns.Row.N=\\ &c{0}&f - &6{1} \u0441\u0435\u043A\u0443\u043D\u0434 \u043E\u0441\u0442\u0430\u043B\u043E\u0441\u044C -Commands.Cooldowns.Row.Y=\\ &b{0}&f - &2\u0413\u043E\u0442\u043E\u0432\u043E\\! +Commands.Cooldowns.Header=&6--= &a\u041E\u0442\u043A\u0430\u0442\u044B \u0443\u043C\u0435\u043D\u0438\u0439 mcMMO&6 =-- +Commands.Cooldowns.Row.N= &c{0}&f - &6{1} \u0441\u0435\u043A\u0443\u043D\u0434 \u043E\u0441\u0442\u0430\u043B\u043E\u0441\u044C +Commands.Cooldowns.Row.Y= &b{0}&f - &2\u0413\u043E\u0442\u043E\u0432\u043E! Commands.Database.CooldownMS=\u0412\u044B \u0434\u043E\u043B\u0436\u043D\u044B \u043F\u043E\u0434\u043E\u0436\u0434\u0430\u0442\u044C {0} \u043C\u0438\u043B\u043B\u0438\u0441\u0435\u043A\u0443\u043D\u0434, \u043F\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043C \u0432\u043D\u043E\u0432\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.Cooldown=\u0412\u044B \u0434\u043E\u043B\u0436\u043D\u044B \u043F\u043E\u0434\u043E\u0436\u0434\u0430\u0442\u044C {0} \u0441\u0435\u043A\u0443\u043D\u0434, \u043F\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043C \u0432\u043D\u043E\u0432\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\u0451 \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442\u0441\u044F. \u041F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430, \u043F\u043E\u0434\u043E\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= &c\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.DoesNotExist= &c\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 \u043E\u0442\u043A\u043B\u044E\u0447\u0435\u043D Commands.GodMode.Enabled=\u0420\u0435\u0436\u0438\u043C \u0431\u043E\u0433\u0430 mcMMO \u0432\u043A\u043B\u044E\u0447\u0435\u043D Commands.AdminChatSpy.Enabled=\u0421\u043B\u0435\u0436\u043A\u0430 \u0437\u0430 \u0447\u0430\u0442\u0430\u043C\u0438 \u0433\u0440\u0443\u043F\u043F mcMMO \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u0430 Commands.AdminChatSpy.Disabled=\u0421\u043B\u0435\u0436\u043A\u0430 \u0437\u0430 \u0447\u0430\u0442\u0430\u043C\u0438 \u0433\u0440\u0443\u043F\u043F mcMMO \u043E\u0442\u043A\u043B\u044E\u0447\u0435\u043D\u0430 Commands.AdminChatSpy.Toggle=\u0427\u0430\u0442 \u0433\u0440\u0443\u043F\u043F mcMMO \u043F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0435\u043D \u0434\u043B\u044F &e{0} -Commands.AdminChatSpy.Chat=&6[\u0428\u041F\u0418\u041A\\: &a{0}&6] &f{1} +Commands.AdminChatSpy.Chat=&6[\u0428\u041F\u0418\u041A: &a{0}&6] &f{1} Commands.GodMode.Forbidden=[mcMMO] \u0420\u0435\u0436\u0438\u043C \u0431\u043E\u0433\u0430 \u043D\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043D \u0432 \u044D\u0442\u043E\u043C \u043C\u0438\u0440\u0435 (\u043F\u0440\u043E\u0432\u0435\u0440\u044C\u0442\u0435 \u043F\u0440\u0430\u0432\u0430) Commands.GodMode.Toggle=\u0420\u0435\u0436\u0438\u043C \u0431\u043E\u0433\u0430 \u043F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0435\u043D \u0434\u043B\u044F &e{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 &e\u0421\u0435\u0440\u0434\u0446\u0430&f. 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 &e\u041A\u0432\u0430\u0434\u0440\u0430\u0442\u044B&f. 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 &7\u043E\u0442\u043A\u043B\u044E\u0447\u0435\u043D\u043E&f. -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.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> &a- \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\u0431 \u0438\u0433\u0440\u043E\u043A\u0435 Commands.Invite.Success=&a\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=<\u043D\u0430\u0432\u044B\u043A> <\u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0430> &a- \u0422\u0430\u0431\u043B\u0438\u0446\u0430 \u043B\u0438\u0434\u0435\u0440\u043E\u0432 Commands.mcgod=&a- \u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0440\u0435\u0436\u0438\u043C \u0431\u043E\u0433\u0430 Commands.mchud.Invalid=\u042D\u0442\u043E \u043D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u044B\u0439 \u0442\u0438\u043F HUD'\u0430. -Commands.mcpurge.Success=&a\u0411\u0430\u0437\u0430 \u0434\u0430\u043D\u043D\u044B\u0445 \u0443\u0441\u043F\u0435\u0448\u043D\u043E \u043E\u0447\u0438\u0449\u0435\u043D\u0430\\! -Commands.mcrank.Heading=&6-\\=\u041F\u0415\u0420\u0421\u041E\u041D\u0410\u041B\u042C\u041D\u042B\u0419 \u0420\u0415\u0419\u0422\u0418\u041D\u0413\\=- -Commands.mcrank.Overall=\u041E\u0431\u0449\u0438\u0439&a - &6\u0420\u0430\u043D\u0433 &f\\#&a{0} +Commands.mcpurge.Success=&a\u0411\u0430\u0437\u0430 \u0434\u0430\u043D\u043D\u044B\u0445 \u0443\u0441\u043F\u0435\u0448\u043D\u043E \u043E\u0447\u0438\u0449\u0435\u043D\u0430! +Commands.mcrank.Heading=&6-=\u041F\u0415\u0420\u0421\u041E\u041D\u0410\u041B\u042C\u041D\u042B\u0419 \u0420\u0415\u0419\u0422\u0418\u041D\u0413=- +Commands.mcrank.Overall=\u041E\u0431\u0449\u0438\u0439&a - &6\u0420\u0430\u043D\u0433 &f#&a{0} Commands.mcrank.Player=&e\u0420\u0435\u0439\u0442\u0438\u043D\u0433 \u0434\u043B\u044F &f{0} -Commands.mcrank.Skill=&e{0}&a - &6\u0420\u0430\u043D\u0433 &f\\#&a{1} +Commands.mcrank.Skill=&e{0}&a - &6\u0420\u0430\u043D\u0433 &f#&a{1} Commands.mcrank.Unranked=&f\u0420\u044F\u0434\u043E\u0432\u043E\u0439 Commands.mcrefresh.Success=\u041E\u0442\u043A\u0430\u0442\u044B {0} \u0431\u044B\u043B\u0438 \u0432\u043E\u0441\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u044B. -Commands.mcremove.Success=&a{0} \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=&6\u041F\u043E\u0434\u0441\u043A\u0430\u0437\u043A\u0430\\: \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 &c/mcrank&6, \u0447\u0442\u043E\u0431\u044B \u043F\u043E\u0441\u043C\u043E\u0442\u0440\u0435\u0442\u044C \u0441\u0432\u043E\u0439 \u0440\u0435\u0439\u0442\u0438\u043D\u0433\\! +Commands.mcremove.Success=&a{0} \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=&6\u041F\u043E\u0434\u0441\u043A\u0430\u0437\u043A\u0430: \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 &c/mcrank&6, \u0447\u0442\u043E\u0431\u044B \u043F\u043E\u0441\u043C\u043E\u0442\u0440\u0435\u0442\u044C \u0441\u0432\u043E\u0439 \u0440\u0435\u0439\u0442\u0438\u043D\u0433! Commands.mmoedit=[\u0438\u0433\u0440\u043E\u043A] <\u043D\u0430\u0432\u044B\u043A> <\u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435> &c - \u041C\u043E\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0446\u0435\u043B\u044C -Commands.mmoedit.AllSkills.1=&a\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=&a\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.AllSkills.1=&a\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=&a\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 \u0438\u0437\u043C\u0435\u043D\u0435\u043D \u043D\u0430 {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.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} \u043D\u0435 \u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \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=&7\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=&7\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 &a{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\\: &aLINEAR &c\u0438 &aEXPONENTIAL. +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: &aLINEAR &c\u0438 &aEXPONENTIAL. Commands.mcconvert.Experience.Same=\u0422\u0438\u043F \u0444\u043E\u0440\u043C\u0443\u043B\u044B {0} \u0443\u0436\u0435 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F Commands.mcconvert.Experience.Start=&7\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=&7\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}. @@ -639,32 +641,32 @@ Commands.Notifications.Off=\u0423\u0432\u0435\u0434\u043E\u043C\u043B\u0435\u043 Commands.Notifications.On=\u0423\u0432\u0435\u0434\u043E\u043C\u043B\u0435\u043D\u0438\u044F \u043E\u0431 \u0443\u043C\u0435\u043D\u0438\u044F\u0445 &c\u0432\u043A\u043B\u044E\u0447\u0435\u043D\u044B Commands.Offline=\u042D\u0442\u0430 \u043A\u043E\u043C\u0430\u043D\u0434\u0430 \u043D\u0435 \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0434\u043B\u044F \u0438\u0433\u0440\u043E\u043A\u043E\u0432 \u043D\u0435 \u0432 \u0441\u0435\u0442\u0438. 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.Party.Status=&8\u0418\u041C\u042F\\: &f{0} {1} &8\u0423\u0420\u041E\u0412\u0415\u041D\u042C\\: &e{2} -Commands.Party.Status.Alliance=&8\u0421\u041E\u042E\u0417\\: &f{0} -Commands.Party.UnlockedFeatures=&8\u0420\u0430\u0437\u0431\u043B\u043E\u043A\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0435 \u0444\u0443\u043D\u043A\u0446\u0438\u0438\\: &7[[ITALIC]]{0} -Commands.Party.ShareMode=&8\u0420\u0415\u0416\u0418\u041C \u0420\u0410\u0421\u041F\u0420\u0415\u0414\u0415\u041B\u0415\u041D\u0418\u042F\\: +Commands.Party.Status=&8\u0418\u041C\u042F: &f{0} {1} &8\u0423\u0420\u041E\u0412\u0415\u041D\u042C: &e{2} +Commands.Party.Status.Alliance=&8\u0421\u041E\u042E\u0417: &f{0} +Commands.Party.UnlockedFeatures=&8\u0420\u0430\u0437\u0431\u043B\u043E\u043A\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0435 \u0444\u0443\u043D\u043A\u0446\u0438\u0438: &7[[ITALIC]]{0} +Commands.Party.ShareMode=&8\u0420\u0415\u0416\u0418\u041C \u0420\u0410\u0421\u041F\u0420\u0415\u0414\u0415\u041B\u0415\u041D\u0418\u042F: Commands.Party.ItemShare=&7\u041F\u0420\u0415\u0414\u041C\u0415\u0422 &3({0}) Commands.Party.ExpShare=&7\u041E\u041F\u042B\u0422 &3({0}) -Commands.Party.ItemShareCategories=&8\u0420\u0430\u0441\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u043F\u0440\u0435\u0434\u043C\u0435\u0442\u043E\u0432\\: &7[[ITALIC]]{0} +Commands.Party.ItemShareCategories=&8\u0420\u0430\u0441\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u043F\u0440\u0435\u0434\u043C\u0435\u0442\u043E\u0432: &7[[ITALIC]]{0} Commands.Party.MembersNear=&8\u0412\u041E\u0417\u041B\u0415 \u0412\u0410\u0421 &3{0}&8/&3{1} Commands.Party.Accept=&a- \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=\u0420\u0435\u0436\u0438\u043C \u0447\u0430\u0442\u0430 \u0433\u0440\u0443\u043F\u043F\u044B &c\u043E\u0442\u043A\u043B\u044E\u0447\u0435\u043D Commands.Party.Chat.On=\u0420\u0435\u0436\u0438\u043C \u0447\u0430\u0442\u0430 \u0433\u0440\u0443\u043F\u043F\u044B &c\u0432\u043A\u043B\u044E\u0447\u0435\u043D Commands.Party.Commands=&c---[]&a\u041A\u041E\u041C\u0410\u041D\u0414\u042B \u0413\u0420\u0423\u041F\u041F\u042B&c[]--- -Commands.Party.Invite.0=&c\u0412\u041D\u0418\u041C\u0410\u041D\u0418\u0415\\: &a\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.0=&c\u0412\u041D\u0418\u041C\u0410\u041D\u0418\u0415: &a\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=&e\u0412\u0432\u0435\u0434\u0438\u0442\u0435 &a/party accept&e, \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=&a- \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=&a\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\u0438\u043D\u0438\u043B\u0438\u0441\u044C \u043A \u0433\u0440\u0443\u043F\u043F\u0435 {0} -Commands.Party.Join=&7\u041F\u0440\u0438\u0441\u043E\u0435\u0434\u0438\u043D\u0438\u043B\u0441\u044F \u043A \u0433\u0440\u0443\u043F\u043F\u0435\\: {0} -Commands.Party.PartyFull=&6{0}&c \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 &e{0}&c \u0432 &a{1}&c, \u043F\u043E\u0442\u043E\u043C\u0443 \u0447\u0442\u043E \u0432 \u043D\u0435\u0439 \u0443\u0436\u0435 &3{2}&c \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\u0438\u043D\u0438\u0442\u044C\u0441\u044F \u043A &a{0}&c, \u043F\u043E\u0442\u043E\u043C\u0443 \u0447\u0442\u043E \u0432 \u043D\u0435\u0439 \u0443\u0436\u0435 &3{1}&c \u0438\u0433\u0440\u043E\u043A\u043E\u0432\\! -Commands.Party.Create=&7\u0421\u043E\u0437\u0434\u0430\u043D\u0430 \u0433\u0440\u0443\u043F\u043F\u0430\\: {0} -Commands.Party.Rename=&7\u041D\u0430\u0437\u0432\u0430\u043D\u0438\u0435 \u0433\u0440\u0443\u043F\u043F\u044B \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u043E \u043D\u0430\\: &f{0} -Commands.Party.SetSharing=&7\u0420\u0430\u0441\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u0433\u0440\u0443\u043F\u043F\u044B {0} \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E \u043D\u0430\\: &3{1} +Commands.Party.Join=&7\u041F\u0440\u0438\u0441\u043E\u0435\u0434\u0438\u043D\u0438\u043B\u0441\u044F \u043A \u0433\u0440\u0443\u043F\u043F\u0435: {0} +Commands.Party.PartyFull=&6{0}&c \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 &e{0}&c \u0432 &a{1}&c, \u043F\u043E\u0442\u043E\u043C\u0443 \u0447\u0442\u043E \u0432 \u043D\u0435\u0439 \u0443\u0436\u0435 &3{2}&c \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\u0438\u043D\u0438\u0442\u044C\u0441\u044F \u043A &a{0}&c, \u043F\u043E\u0442\u043E\u043C\u0443 \u0447\u0442\u043E \u0432 \u043D\u0435\u0439 \u0443\u0436\u0435 &3{1}&c \u0438\u0433\u0440\u043E\u043A\u043E\u0432! +Commands.Party.Create=&7\u0421\u043E\u0437\u0434\u0430\u043D\u0430 \u0433\u0440\u0443\u043F\u043F\u0430: {0} +Commands.Party.Rename=&7\u041D\u0430\u0437\u0432\u0430\u043D\u0438\u0435 \u0433\u0440\u0443\u043F\u043F\u044B \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u043E \u043D\u0430: &f{0} +Commands.Party.SetSharing=&7\u0420\u0430\u0441\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u0433\u0440\u0443\u043F\u043F\u044B {0} \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E \u043D\u0430: &3{1} Commands.Party.ToggleShareCategory=&7\u0420\u0430\u0441\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u043F\u0440\u0435\u0434\u043C\u0435\u0442\u043E\u0432 \u0434\u043B\u044F &6{0} &7\u0431\u044B\u043B\u043E &3{1} -Commands.Party.AlreadyExists=&4\u0413\u0440\u0443\u043F\u043F\u0430 {0} \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442\\! -Commands.Party.Kick=&c\u0412\u044B \u0431\u044B\u043B\u0438 \u0432\u044B\u0433\u043D\u0430\u043D\u044B \u0438\u0437 \u0433\u0440\u0443\u043F\u043F\u044B &a{0}&c\\! +Commands.Party.AlreadyExists=&4\u0413\u0440\u0443\u043F\u043F\u0430 {0} \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442! +Commands.Party.Kick=&c\u0412\u044B \u0431\u044B\u043B\u0438 \u0432\u044B\u0433\u043D\u0430\u043D\u044B \u0438\u0437 \u0433\u0440\u0443\u043F\u043F\u044B &a{0}&c! Commands.Party.Leave=&e\u0412\u044B \u043F\u043E\u043A\u0438\u043D\u0443\u043B\u0438 \u044D\u0442\u0443 \u0433\u0440\u0443\u043F\u043F\u0443 Commands.Party.Members.Header=&c-----[]&a\u0423\u0427\u0410\u0421\u0422\u041D\u0418\u041A\u0418&c[]----- Commands.Party.None=&c\u0412\u044B \u043D\u0435 \u0441\u043E\u0441\u0442\u043E\u0438\u0442\u0435 \u0432 \u0433\u0440\u0443\u043F\u043F\u0435. @@ -674,9 +676,9 @@ Commands.Party.Toggle=&a- \u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438 Commands.Party1=&a- \u0421\u043E\u0437\u0434\u0430\u0442\u044C \u043D\u043E\u0432\u0443\u044E \u0433\u0440\u0443\u043F\u043F\u0443 Commands.Party2=&a- \u041F\u0440\u0438\u0441\u043E\u0435\u0434\u0438\u043D\u0438\u0442\u044C\u0441\u044F \u043A \u0433\u0440\u0443\u043F\u043F\u0435 Commands.Party.Alliance.Header=&c-----[]&a\u0421\u041E\u042E\u0417 \u0413\u0420\u0423\u041F\u041F\u042B&c[]----- -Commands.Party.Alliance.Ally=&f{0} &8\u0412 \u0421\u041E\u042E\u0417\u0415 \u0421\\: &f{1} +Commands.Party.Alliance.Ally=&f{0} &8\u0412 \u0421\u041E\u042E\u0417\u0415 \u0421: &f{1} Commands.Party.Alliance.Members.Header=&c-----[]&a\u0423\u0427\u0410\u0421\u0422\u041D\u0418\u041A\u0418 \u0421\u041E\u042E\u0417\u0410&c[]----- -Commands.Party.Alliance.Invite.0=\u0412\u041D\u0418\u041C\u0410\u041D\u0418\u0415\\: &a\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.0=\u0412\u041D\u0418\u041C\u0410\u041D\u0418\u0415: &a\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=\u0412\u0432\u0435\u0434\u0438\u0442\u0435 &a/party alliance accept&e, \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=&a\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=&c\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. @@ -691,10 +693,10 @@ Commands.ptp.Request1=&e{0} &a\u0437\u0430\u043F\u0440\u0430\u0448\u0438\u0432\u Commands.ptp.Request2=&a\u0414\u043B\u044F \u0442\u0435\u043B\u0435\u043F\u043E\u0440\u0442\u0430\u0446\u0438\u0438 \u0432\u0432\u0435\u0434\u0438\u0442\u0435 &e/ptp accept&a. \u0417\u0430\u043F\u0440\u043E\u0441 \u0431\u0443\u0434\u0435\u0442 \u043E\u0442\u043C\u0435\u043D\u0435\u043D \u0447\u0435\u0440\u0435\u0437 &c{0} &a\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 &a\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 &c\u043E\u0442\u043A\u043B\u044E\u0447\u0435\u043D\u043E -Commands.ptp.RequestExpired=&c\u0413\u0440\u0443\u043F\u043F\u043E\u0432\u043E\u0439 \u0437\u0430\u043F\u0440\u043E\u0441 \u043D\u0430 \u0442\u0435\u043B\u0435\u043F\u043E\u0440\u0442\u0430\u0446\u0438\u044E \u0438\u0441\u0442\u0435\u043A\\! +Commands.ptp.RequestExpired=&c\u0413\u0440\u0443\u043F\u043F\u043E\u0432\u043E\u0439 \u0437\u0430\u043F\u0440\u043E\u0441 \u043D\u0430 \u0442\u0435\u043B\u0435\u043F\u043E\u0440\u0442\u0430\u0446\u0438\u044E \u0438\u0441\u0442\u0435\u043A! Commands.PowerLevel.Leaderboard=&e--T\u0430\u0431\u043B\u0438\u0446\u0430 \u043B\u0438\u0434\u0435\u0440\u043E\u0432&9 \u043F\u043E \u0443\u0440\u043E\u0432\u043D\u044E \u0441\u0438\u043B\u044B &emcMMO-- -Commands.PowerLevel.Capped=&4\u0423\u0420\u041E\u0412\u0415\u041D\u042C \u0421\u0418\u041B\u042B\\: &a{0} &4\u041C\u0410\u041A\u0421. \u0423\u0420\u041E\u0412\u0415\u041D\u042C\\: &e{1} -Commands.PowerLevel=&4\u0423\u0420\u041E\u0412\u0415\u041D\u042C \u0421\u0418\u041B\u042B\\: &a{0} +Commands.PowerLevel.Capped=&4\u0423\u0420\u041E\u0412\u0415\u041D\u042C \u0421\u0418\u041B\u042B: &a{0} &4\u041C\u0410\u041A\u0421. \u0423\u0420\u041E\u0412\u0415\u041D\u042C: &e{1} +Commands.PowerLevel=&4\u0423\u0420\u041E\u0412\u0415\u041D\u042C \u0421\u0418\u041B\u042B: &a{0} Commands.Reset.All=&a\u0412\u0441\u0435 \u0432\u0430\u0448\u0438 \u0443\u0440\u043E\u0432\u043D\u0438 \u043D\u0430\u0432\u044B\u043A\u043E\u0432 \u0431\u044B\u043B\u0438 \u0443\u0441\u043F\u0435\u0448\u043D\u043E \u0441\u0431\u0440\u043E\u0448\u0435\u043D\u044B. Commands.Reset.Single=&a\u0412\u0430\u0448 \u0443\u0440\u043E\u0432\u0435\u043D\u044C \u043D\u0430\u0432\u044B\u043A\u0430 {0} \u0431\u044B\u043B \u0443\u0441\u043F\u0435\u0448\u043D\u043E \u0441\u0431\u0440\u043E\u0448\u0435\u043D. Commands.Reset=&a- \u0421\u0431\u0440\u043E\u0441 \u0443\u0440\u043E\u0432\u043D\u044F \u043D\u0430\u0432\u044B\u043A\u0430 \u0434\u043E 0 @@ -702,16 +704,16 @@ Commands.Scoreboard.Clear=&3\u0422\u0430\u0431\u043B\u0438\u0446\u0430 mcMMO \u0 Commands.Scoreboard.NoBoard=&c\u0422\u0430\u0431\u043B\u0438\u0446\u0430 mcMMO \u043D\u0435 \u0430\u043A\u0442\u0438\u0432\u043D\u0430. Commands.Scoreboard.Keep=&3\u0422\u0430\u0431\u043B\u0438\u0446\u0430 mcMMO \u0431\u0443\u0434\u0435\u0442 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C\u0441\u044F \u043F\u043E\u043A\u0430 \u0432\u044B \u043D\u0435 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0435 &a/mcscoreboard clear&3. Commands.Scoreboard.Timer=&3\u0422\u0430\u0431\u043B\u0438\u0446\u0430 mcMMO \u0438\u0441\u0447\u0435\u0437\u043D\u0435\u0442 \u0447\u0435\u0440\u0435\u0437 &6{0}&3 \u0441\u0435\u043A\u0443\u043D\u0434. -Commands.Scoreboard.Help.0=&6 \\=\\= &a\u041F\u043E\u043C\u043E\u0449\u044C \u043F\u043E &c/mcscoreboard&6 \\=\\= +Commands.Scoreboard.Help.0=&6 == &a\u041F\u043E\u043C\u043E\u0449\u044C \u043F\u043E &c/mcscoreboard&6 == Commands.Scoreboard.Help.1=&3/mcscoreboard&b clear &f - \u0443\u0431\u0440\u0430\u0442\u044C \u0442\u0430\u0431\u043B\u0438\u0446\u0443 mcMMO Commands.Scoreboard.Help.2=&3/mcscoreboard&b keep &f - \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 mcMMO Commands.Scoreboard.Help.3=&3/mcscoreboard&b time [n] &f - \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 &dn&f \u0441\u0435\u043A\u0443\u043D\u0434 -Commands.Scoreboard.Tip.Keep=&6\u041F\u043E\u0434\u0441\u043A\u0430\u0437\u043A\u0430\\: \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 &c/mcscoreboard keep&6 \u0432\u043E \u0432\u0440\u0435\u043C\u044F \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0430 \u0442\u0430\u0431\u043B\u0438\u0446\u044B, \u0447\u0442\u043E\u0431\u044B \u043E\u043D\u0430 \u043D\u0435 \u0438\u0441\u0447\u0435\u0437\u0430\u043B\u0430. -Commands.Scoreboard.Tip.Clear=&6\u041F\u043E\u0434\u0441\u043A\u0430\u0437\u043A\u0430\\: \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 &c/mcscoreboard clear&6 \u0447\u0442\u043E\u0431\u044B \u0443\u0431\u0440\u0430\u0442\u044C \u0442\u0430\u0431\u043B\u0438\u0446\u0443. +Commands.Scoreboard.Tip.Keep=&6\u041F\u043E\u0434\u0441\u043A\u0430\u0437\u043A\u0430: \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 &c/mcscoreboard keep&6 \u0432\u043E \u0432\u0440\u0435\u043C\u044F \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0430 \u0442\u0430\u0431\u043B\u0438\u0446\u044B, \u0447\u0442\u043E\u0431\u044B \u043E\u043D\u0430 \u043D\u0435 \u0438\u0441\u0447\u0435\u0437\u0430\u043B\u0430. +Commands.Scoreboard.Tip.Clear=&6\u041F\u043E\u0434\u0441\u043A\u0430\u0437\u043A\u0430: \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 &c/mcscoreboard clear&6 \u0447\u0442\u043E\u0431\u044B \u0443\u0431\u0440\u0430\u0442\u044C \u0442\u0430\u0431\u043B\u0438\u0446\u0443. Commands.XPBar.Reset=&6\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u0448\u043A\u0430\u043B\u044B \u043E\u043F\u044B\u0442\u0430 \u0434\u043B\u044F mcMMO \u0431\u044B\u043B\u0438 \u0441\u0431\u0440\u043E\u0448\u0435\u043D\u044B. Commands.XPBar.SettingChanged=&6\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430 \u0448\u043A\u0430\u043B\u044B \u043E\u043F\u044B\u0442\u0430 \u0434\u043B\u044F &a{0}&6 \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u0430 \u043D\u0430 &a{1} -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.ChildSkill=\u0414\u043E\u0447\u0435\u0440\u043D\u0438\u0435 \u043D\u0430\u0432\u044B\u043A\u0438 \u043D\u0435\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043B\u044C\u043D\u044B \u0434\u043B\u044F \u044D\u0442\u043E\u0439 \u043A\u043E\u043C\u0430\u043D\u0434\u044B\\! +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.ChildSkill=\u0414\u043E\u0447\u0435\u0440\u043D\u0438\u0435 \u043D\u0430\u0432\u044B\u043A\u0438 \u043D\u0435\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043B\u044C\u043D\u044B \u0434\u043B\u044F \u044D\u0442\u043E\u0439 \u043A\u043E\u043C\u0430\u043D\u0434\u044B! Commands.Skill.Leaderboard=--mcMMO &9{0}&e \u0442\u0430\u0431\u043B\u0438\u0446\u0430 \u043B\u0438\u0434\u0435\u0440\u043E\u0432-- Commands.SkillInfo=&a- \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=&a- \u041F\u043E\u0441\u043C\u043E\u0442\u0440\u0435\u0442\u044C \u0441\u0432\u043E\u0438 \u0441\u0442\u0430\u0442\u044B mcMMO @@ -733,14 +735,14 @@ Commands.Usage.Skill=\u043D\u0430\u0432\u044B\u043A Commands.Usage.SubSkill=\u043F\u043E\u0434\u043D\u0430\u0432\u044B\u043A Commands.Usage.XP=\u043E\u043F\u044B\u0442 Commands.Description.mmoinfo=\u041F\u0440\u043E\u0447\u0438\u0442\u0430\u0439\u0442\u0435 \u043F\u043E\u0434\u0440\u043E\u0431\u043D\u0435\u0435 \u043E \u043D\u0430\u0432\u044B\u043A\u0435 \u0438\u043B\u0438 \u043C\u0435\u0445\u0430\u043D\u0438\u043A\u0435. -Commands.MmoInfo.Mystery=&7\u0412\u044B \u0435\u0449\u0435 \u043D\u0435 \u0440\u0430\u0437\u0431\u043B\u043E\u043A\u0438\u0440\u043E\u0432\u0430\u043B\u0438 \u044D\u0442\u043E\u0442 \u043D\u0430\u0432\u044B\u043A, \u043D\u043E \u043A\u043E\u0433\u0434\u0430 \u0440\u0430\u0437\u0431\u043B\u043E\u043A\u0438\u0440\u0443\u0435\u0442\u0435, \u0441\u043C\u043E\u0436\u0435\u0442\u0435 \u043F\u0440\u043E\u0447\u0438\u0442\u0430\u0442\u044C \u043E \u043D\u0435\u043C \u0442\u0443\u0442\\! -Commands.MmoInfo.NoMatch=\u042D\u0442\u043E\u0433\u043E \u043F\u043E\u0434\u043D\u0430\u0432\u044B\u043A\u0430 \u043D\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442\\! -Commands.MmoInfo.Header=&3-\\=[]\\=\\=\\=\\=\\=[]&6 MMO \u0438\u043D\u0444\u043E. &3[]\\=\\=\\=\\=\\=[]\\=- -Commands.MmoInfo.SubSkillHeader=&6\u041D\u0430\u0437\u0432\u0430\u043D\u0438\u0435\\:&e {0} -Commands.MmoInfo.DetailsHeader=&3-\\=[]\\=\\=\\=\\=\\=[]&a \u041F\u043E\u0434\u0440\u043E\u0431\u043D\u0435\u0435 &3[]\\=\\=\\=\\=\\=[]\\=- +Commands.MmoInfo.Mystery=&7\u0412\u044B \u0435\u0449\u0435 \u043D\u0435 \u0440\u0430\u0437\u0431\u043B\u043E\u043A\u0438\u0440\u043E\u0432\u0430\u043B\u0438 \u044D\u0442\u043E\u0442 \u043D\u0430\u0432\u044B\u043A, \u043D\u043E \u043A\u043E\u0433\u0434\u0430 \u0440\u0430\u0437\u0431\u043B\u043E\u043A\u0438\u0440\u0443\u0435\u0442\u0435, \u0441\u043C\u043E\u0436\u0435\u0442\u0435 \u043F\u0440\u043E\u0447\u0438\u0442\u0430\u0442\u044C \u043E \u043D\u0435\u043C \u0442\u0443\u0442! +Commands.MmoInfo.NoMatch=\u042D\u0442\u043E\u0433\u043E \u043F\u043E\u0434\u043D\u0430\u0432\u044B\u043A\u0430 \u043D\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442! +Commands.MmoInfo.Header=&3-=[]=====[]&6 MMO \u0438\u043D\u0444\u043E. &3[]=====[]=- +Commands.MmoInfo.SubSkillHeader=&6\u041D\u0430\u0437\u0432\u0430\u043D\u0438\u0435:&e {0} +Commands.MmoInfo.DetailsHeader=&3-=[]=====[]&a \u041F\u043E\u0434\u0440\u043E\u0431\u043D\u0435\u0435 &3[]=====[]=- Commands.MmoInfo.OldSkill=&7\u041D\u0430\u0432\u044B\u043A\u0438 mcMMO \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, \u0438 \u043A \u0441\u043E\u0436\u0430\u043B\u0435\u043D\u0438\u044E \u0434\u0430\u043D\u043D\u044B\u0439 \u043D\u0430\u0432\u044B\u043A \u043F\u043E\u043A\u0430 \u043D\u0435 \u0431\u044B\u043B \u043F\u0435\u0440\u0435\u0440\u0430\u0431\u043E\u0442\u0430\u043D \u0438 \u043D\u0435\u0434\u043E\u0441\u0442\u0430\u0435\u0442 \u043E\u043F\u0438\u0441\u0430\u043D\u0438\u044F. \u041D\u043E\u0432\u0430\u044F \u0441\u0438\u0441\u0442\u0435\u043C\u0430 \u043F\u043E\u0437\u0432\u043E\u043B\u0438\u0442 \u0441\u043E\u0437\u0434\u0430\u0432\u0430\u0442\u044C \u043D\u0430\u0432\u044B\u043A\u0438 \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. -Commands.MmoInfo.Mechanics=&3-\\=[]\\=\\=\\=\\=\\=[]&6 \u041C\u0435\u0445\u0430\u043D\u0438\u043A\u0438 &3[]\\=\\=\\=\\=\\=[]\\=- -Commands.MmoInfo.Stats=\u0421\u0422\u0410\u0422\u042B\\: {0} +Commands.MmoInfo.Mechanics=&3-=[]=====[]&6 \u041C\u0435\u0445\u0430\u043D\u0438\u043A\u0438 &3[]=====[]=- +Commands.MmoInfo.Stats=\u0421\u0422\u0410\u0422\u042B: {0} Commands.Mmodebug.Toggle=\u0420\u0435\u0436\u0438\u043C \u043E\u0442\u043B\u0430\u0434\u043A\u0438 mcMMO &6{0}&7, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u0443 \u0441\u043D\u043E\u0432\u0430 \u0434\u043B\u044F \u043F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u044F. \u0412 \u0440\u0435\u0436\u0438\u043C\u0435 \u043E\u0442\u043B\u0430\u0434\u043A\u0438 \u0432\u044B \u043C\u043E\u0436\u0435\u0442\u0435 \u0431\u0438\u0442\u044C \u0431\u043B\u043E\u043A\u0438, \u0447\u0442\u043E\u0431\u044B \u043F\u0440\u043E\u0441\u043C\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044C \u043F\u043E\u043B\u0435\u0437\u043D\u0443\u044E \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044E, \u0442\u0440\u0435\u0431\u0443\u0435\u043C\u0443\u044E \u0434\u043B\u044F \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u043A\u0438. mcMMO.NoInvites=&c\u0421\u0435\u0439\u0447\u0430\u0441 \u0443 \u0432\u0430\u0441 \u043D\u0435\u0442 \u043F\u0440\u0438\u0433\u043B\u0430\u0448\u0435\u043D\u0438\u0439 mcMMO.NoPermission=&4\u041D\u0435\u0434\u043E\u0441\u0442\u0430\u0442\u043E\u0447\u043D\u043E \u043F\u0440\u0430\u0432. @@ -762,9 +764,9 @@ Party.InformedOnJoin={0} &a\u043F\u0440\u0438\u0441\u043E\u0435\u0434\u0438\u043 Party.InformedOnQuit={0} &a\u043F\u043E\u043A\u0438\u043D\u0443\u043B \u0432\u0430\u0448\u0443 \u0433\u0440\u0443\u043F\u043F\u0443 Party.InformedOnNameChange=&6{0} &a\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 &f{1} Party.InvalidName=&4\u042D\u0442\u043E \u043D\u0435\u0434\u043E\u043F\u0443\u0441\u0442\u0438\u043C\u043E\u0435 \u043D\u0430\u0437\u0432\u0430\u043D\u0438\u0435 \u0433\u0440\u0443\u043F\u043F\u044B. -Party.Invite.Self=&c\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=&c\u042D\u0442\u0430 \u0433\u0440\u0443\u043F\u043F\u0430 \u0443\u0436\u0435 \u0437\u0430\u043A\u0440\u044B\u0442\u0430\\! -Party.IsntLocked=&c\u042D\u0442\u0430 \u0433\u0440\u0443\u043F\u043F\u0430 \u043D\u0435 \u0437\u0430\u043A\u0440\u044B\u0442\u0430\\! +Party.Invite.Self=&c\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=&c\u042D\u0442\u0430 \u0433\u0440\u0443\u043F\u043F\u0430 \u0443\u0436\u0435 \u0437\u0430\u043A\u0440\u044B\u0442\u0430! +Party.IsntLocked=&c\u042D\u0442\u0430 \u0433\u0440\u0443\u043F\u043F\u0430 \u043D\u0435 \u0437\u0430\u043A\u0440\u044B\u0442\u0430! Party.Locked=&c\u0413\u0440\u0443\u043F\u043F\u0430 \u0437\u0430\u043A\u0440\u044B\u0442\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=&4{0} \u043D\u0435\u0442 \u0432 \u0432\u0430\u0448\u0435\u0439 \u0433\u0440\u0443\u043F\u043F\u0435 Party.NotOwner=&4\u0412\u044B \u043D\u0435 \u043B\u0438\u0434\u0435\u0440 \u0433\u0440\u0443\u043F\u043F\u044B. @@ -777,18 +779,18 @@ Party.Password.Incorrect=&c\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044 Party.Password.Set=&a\u041F\u0430\u0440\u043E\u043B\u044C \u0433\u0440\u0443\u043F\u043F\u044B \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D \u043D\u0430 {0} Party.Password.Removed=&a\u041F\u0430\u0440\u043E\u043B\u044C \u0433\u0440\u0443\u043F\u043F\u044B \u0431\u044B\u043B \u0443\u0434\u0430\u043B\u0435\u043D. Party.Player.Invalid=&c\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=&4{0} \u043D\u0435 \u0432 \u0441\u0435\u0442\u0438\\! -Party.Player.InSameParty=&c{0} \u0443\u0436\u0435 \u043D\u0430\u0445\u043E\u0434\u0438\u0442\u0441\u044F \u0432 \u0432\u0430\u0448\u0435\u0439 \u0433\u0440\u0443\u043F\u043F\u0435\\! +Party.NotOnline=&4{0} \u043D\u0435 \u0432 \u0441\u0435\u0442\u0438! +Party.Player.InSameParty=&c{0} \u0443\u0436\u0435 \u043D\u0430\u0445\u043E\u0434\u0438\u0442\u0441\u044F \u0432 \u0432\u0430\u0448\u0435\u0439 \u0433\u0440\u0443\u043F\u043F\u0435! Party.PlayerNotInParty=&4{0} \u043D\u0435 \u0441\u043E\u0441\u0442\u043E\u0438\u0442 \u0432 \u0433\u0440\u0443\u043F\u043F\u0435 Party.Specify=&c\u0412\u044B \u0434\u043E\u043B\u0436\u043D\u044B \u0443\u043A\u0430\u0437\u0430\u0442\u044C \u0433\u0440\u0443\u043F\u043F\u0443. Party.Teleport.Dead=&c\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=&c\u0417\u0430 \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0438\u0435 {0} \u0441\u0435\u043A\u0443\u043D\u0434 \u0432\u044B \u043F\u043E\u043B\u0443\u0447\u0438\u043B\u0438 \u0443\u0440\u043E\u043D, \u0442\u0435\u043B\u0435\u043F\u043E\u0440\u0442\u0430\u0446\u0438\u044F \u043E\u0442\u043C\u0435\u043D\u0435\u043D\u0430. Party.Teleport.Player=&a\u0412\u044B \u0442\u0435\u043B\u0435\u043F\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u043B\u0438\u0441\u044C \u043A {0}. -Party.Teleport.Self=&c\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\u0435\u0431\u0435\\! +Party.Teleport.Self=&c\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\u0435\u0431\u0435! Party.Teleport.Target=&a{0} \u0442\u0435\u043B\u0435\u043F\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u043B\u0441\u044F \u043A \u0432\u0430\u043C. Party.Teleport.Disabled=&c\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=&c\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=&c\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.Rename.Same=&c\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=&c\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=&7\u0413\u0440\u0443\u043F\u043F\u0430 \u043E\u0442\u043A\u0440\u044B\u0442\u0430 Party.Disband=&7\u0413\u0440\u0443\u043F\u043F\u0430 \u0440\u0430\u0441\u0444\u043E\u0440\u043C\u0438\u0440\u043E\u0432\u0430\u043D\u0430 Party.Alliance.Formed=&7\u0412\u0430\u0448\u0430 \u0433\u0440\u0443\u043F\u043F\u0430 \u0442\u0435\u043F\u0435\u0440\u044C \u0432 \u0441\u043E\u044E\u0437\u0435 \u0441 &a{0} @@ -836,21 +838,21 @@ Commands.XPGain.Swords=\u0423\u0431\u0438\u0439\u0441\u0442\u0432\u043E \u043C\u Commands.XPGain.Taming=\u041F\u0440\u0438\u0440\u0443\u0447\u0435\u043D\u0438\u0435 \u0436\u0438\u0432\u043E\u0442\u043D\u044B\u0445 \u0438\u043B\u0438 \u0441\u0440\u0430\u0436\u0435\u043D\u0438\u0435 \u0432\u043C\u0435\u0441\u0442\u0435 \u0441 \u0432\u043E\u043B\u043A\u0430\u043C\u0438 Commands.XPGain.Unarmed=\u0423\u0431\u0438\u0439\u0441\u0442\u0432\u043E \u043C\u043E\u043D\u0441\u0442\u0440\u043E\u0432 Commands.XPGain.Woodcutting=\u0420\u0443\u0431\u043A\u0430 \u0434\u0435\u0440\u0435\u0432\u044C\u0435\u0432 -Commands.XPGain=&8\u041F\u041E\u041B\u0423\u0427\u0415\u041D\u041E \u041E\u041F\u042B\u0422\u0410\\: &f{0} -Commands.xplock.locked=&6\u0412\u0430\u0448\u0430 \u043F\u0430\u043D\u0435\u043B\u044C \u043E\u043F\u044B\u0442\u0430 \u0442\u0435\u043F\u0435\u0440\u044C \u0437\u0430\u0444\u0438\u043A\u0441\u0438\u0440\u043E\u0432\u0430\u043D\u0430 \u043D\u0430 {0}\\! -Commands.xplock.unlocked=&6\u0412\u0430\u0448\u0430 \u043F\u0430\u043D\u0435\u043B\u044C \u043E\u043F\u044B\u0442\u0430 \u0442\u0435\u043F\u0435\u0440\u044C &a\u0420\u0410\u0417\u0411\u041B\u041E\u041A\u0418\u0420\u041E\u0412\u0410\u041D\u0410&6\\! +Commands.XPGain=&8\u041F\u041E\u041B\u0423\u0427\u0415\u041D\u041E \u041E\u041F\u042B\u0422\u0410: &f{0} +Commands.xplock.locked=&6\u0412\u0430\u0448\u0430 \u043F\u0430\u043D\u0435\u043B\u044C \u043E\u043F\u044B\u0442\u0430 \u0442\u0435\u043F\u0435\u0440\u044C \u0437\u0430\u0444\u0438\u043A\u0441\u0438\u0440\u043E\u0432\u0430\u043D\u0430 \u043D\u0430 {0}! +Commands.xplock.unlocked=&6\u0412\u0430\u0448\u0430 \u043F\u0430\u043D\u0435\u043B\u044C \u043E\u043F\u044B\u0442\u0430 \u0442\u0435\u043F\u0435\u0440\u044C &a\u0420\u0410\u0417\u0411\u041B\u041E\u041A\u0418\u0420\u041E\u0412\u0410\u041D\u0410&6! Commands.xprate.modified=&c\u041C\u041D\u041E\u0416\u0418T\u0415\u041B\u042C \u041E\u041F\u042BT\u0410 \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D \u043D\u0430 {0} -Commands.xprate.over=&c\u0421\u043E\u0431\u044B\u0442\u0438\u0435 \u043C\u043D\u043E\u0436\u0438\u0442\u0435\u043B\u044F \u043E\u043F\u044B\u0442\u0430 mcMMO \u0417\u0410\u0412\u0415\u0420\u0428\u0415\u041D\u041E\\!\\! +Commands.xprate.over=&c\u0421\u043E\u0431\u044B\u0442\u0438\u0435 \u043C\u043D\u043E\u0436\u0438\u0442\u0435\u043B\u044F \u043E\u043F\u044B\u0442\u0430 mcMMO \u0417\u0410\u0412\u0415\u0420\u0428\u0415\u041D\u041E!! Commands.xprate.proper.0=&c\u041F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u043E\u0435 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u044F \u0434\u043B\u044F \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F \u043C\u043D\u043E\u0436\u0438\u0442\u0435\u043B\u044F \u043E\u043F\u044B\u0442\u0430 /xprate <\u0447\u0438\u0441\u043B\u043E> Commands.xprate.proper.1=&c\u041F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u043E\u0435 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0435 \u0434\u043B\u044F \u0441\u0431\u0440\u043E\u0441\u0430 \u043C\u043D\u043E\u0436\u0438\u0442\u0435\u043B\u044F \u043E\u043F\u044B\u0442\u0430 /xprate reset Commands.xprate.proper.2=&c\u041F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430, \u0432\u044B\u0431\u0435\u0440\u0438\u0442\u0435 true(\u0434\u0430) \u0438\u043B\u0438 false(\u043D\u0435\u0442), \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 \u0441\u043E\u0431\u044B\u0442\u0438\u0435\u043C \u043C\u043D\u043E\u0436\u0438\u0442\u0435\u043B\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=&amcMMO&6 \u0441\u043E\u0431\u044B\u0442\u0438\u0435\\! -Commands.Event.Stop=&amcMMO&3 \u0441\u043E\u0431\u044B\u0442\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u043E\\! -Commands.Event.Stop.Subtitle=&a\u041D\u0430\u0434\u0435\u044E\u0441\u044C, \u0432\u044B \u043F\u043E\u0432\u0435\u0441\u0435\u043B\u0438\u043B\u0438\u0441\u044C\\! +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=&amcMMO&6 \u0441\u043E\u0431\u044B\u0442\u0438\u0435! +Commands.Event.Stop=&amcMMO&3 \u0441\u043E\u0431\u044B\u0442\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u043E! +Commands.Event.Stop.Subtitle=&a\u041D\u0430\u0434\u0435\u044E\u0441\u044C, \u0432\u044B \u043F\u043E\u0432\u0435\u0441\u0435\u043B\u0438\u043B\u0438\u0441\u044C! Commands.Event.XP=&3\u041C\u043D\u043E\u0436\u0438\u0442\u0435\u043B\u044C \u043E\u043F\u044B\u0442\u0430 \u0441\u0435\u0439\u0447\u0430\u0441 &6{0}&3x -Commands.xprate.started.0=&6\u0421\u041E\u0411\u042B\u0418T\u0415 \u041C\u041D\u041E\u0416\u0418T\u0415\u041B\u042F \u041E\u041F\u042BT\u0410 mcMMO \u041D\u0410\u0427\u0410\u041B\u041E\u0421\u042C\\! -Commands.xprate.started.1=&6\u041C\u041D\u041E\u0416\u0418T\u0415\u041B\u042C \u041E\u041F\u042BT\u0410 mcMMO \u0421\u0415\u0419\u0427\u0410\u0421 {0}x\\! +Commands.xprate.started.0=&6\u0421\u041E\u0411\u042B\u0418T\u0415 \u041C\u041D\u041E\u0416\u0418T\u0415\u041B\u042F \u041E\u041F\u042BT\u0410 mcMMO \u041D\u0410\u0427\u0410\u041B\u041E\u0421\u042C! +Commands.xprate.started.1=&6\u041C\u041D\u041E\u0416\u0418T\u0415\u041B\u042C \u041E\u041F\u042BT\u0410 mcMMO \u0421\u0415\u0419\u0427\u0410\u0421 {0}x! # Admin Notifications Server.ConsoleName=&e[\u0421\u0435\u0440\u0432\u0435\u0440] @@ -862,56 +864,57 @@ Notifications.Admin.Format.Others=&6(&amcMMO &3\u0430\u0434\u043C\u0438\u043D&6) Notifications.Admin.Format.Self=&6(&amcMMO&6) &7{0} # Event -XPRate.Event=&6\u0412 mcMMO \u0441\u043E\u0431\u044B\u0442\u0438\u0435 \u043C\u043D\u043E\u0436\u0438\u0442\u0435\u043B\u044F \u043E\u043F\u044B\u0442\u0430\\! \u041C\u043D\u043E\u0436\u0438\u0442\u0435\u043B\u044C \u043E\u043F\u044B\u0442\u0430 - {0}x\\! +XPRate.Event=&6\u0412 mcMMO \u0441\u043E\u0431\u044B\u0442\u0438\u0435 \u043C\u043D\u043E\u0436\u0438\u0442\u0435\u043B\u044F \u043E\u043F\u044B\u0442\u0430! \u041C\u043D\u043E\u0436\u0438\u0442\u0435\u043B\u044C \u043E\u043F\u044B\u0442\u0430 - {0}x! #GUIDES Guides.Available=&7\u0414\u043E\u0441\u0442\u0443\u043F\u043D\u043E \u0440\u0443\u043A\u043E\u0432\u043E\u0434\u0441\u0442\u0432\u043E \u0434\u043B\u044F {0} - \u0432\u0432\u0435\u0434\u0438\u0442\u0435 /{1} ? [\u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0430] -Guides.Header=&6-\\=&a\u0420\u0443\u043A\u043E\u0432\u043E\u0434\u0441\u0442\u0432\u043E {0} &6\\=- -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.Header=&6-=&a\u0420\u0443\u043A\u043E\u0432\u043E\u0434\u0441\u0442\u0432\u043E {0} &6=- +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\u043E\u0439 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B \u043D\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 - \u0435\u0441\u0442\u044C \u043B\u0438\u0448\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=&3\u041E \u043D\u0430\u0432\u044B\u043A\u0435 \u0410\u043A\u0440\u043E\u0431\u0430\u0442\u0438\u043A\u0430\\:!nasd&e\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.!nasd&e\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.!nasd!nasd&3\u041F\u043E\u043B\u0443\u0447\u0435\u043D\u0438\u0435 \u043E\u043F\u044B\u0442\u0430\\:!nasd&e\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 !nasd&e\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.0=&3\u041E \u043D\u0430\u0432\u044B\u043A\u0435 \u0410\u043A\u0440\u043E\u0431\u0430\u0442\u0438\u043A\u0430:!nasd&e\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.!nasd&e\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.!nasd!nasd&3\u041F\u043E\u043B\u0443\u0447\u0435\u043D\u0438\u0435 \u043E\u043F\u044B\u0442\u0430:!nasd&e\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 !nasd&e\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=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u041A\u0443\u0432\u044B\u0440\u043E\u043A?!nasd&e\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\u0430\u0435\u043C\u044B\u0439 \u043F\u0440\u0438 \u043F\u0430\u0434\u0435\u043D\u0438\u0438.!nasd&e\u0415\u0441\u043B\u0438 \u0432\u043E \u0432\u0440\u0435\u043C\u044F \u043F\u0430\u0434\u0435\u043D\u0438\u044F \u0434\u0435\u0440\u0436\u0430\u0442\u044C \u043A\u043D\u043E\u043F\u043A\u0443 \u043F\u0440\u0438\u0441\u0435\u0434\u0430,!nasd&e\u0442\u043E \u044D\u0442\u043E\u0442 \u0448\u0430\u043D\u0441 \u043C\u043E\u0436\u043D\u043E \u0443\u0434\u0432\u043E\u0438\u0442\u044C.!nasd&e\u042D\u0442\u043E \u0432\u044B\u0437\u043E\u0432\u0435\u0442 \u0413\u0440\u0430\u0446\u0438\u043E\u0437\u043D\u044B\u0439 \u043A\u0443\u0432\u044B\u0440\u043E\u043A, \u0432\u043C\u0435\u0441\u0442\u043E \u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u043E\u0433\u043E.!nasd&e\u0413\u0440\u0430\u0446\u0438\u043E\u0437\u043D\u044B\u0435 \u043A\u0443\u0432\u044B\u0440\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!nasd&e\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.!nasd&e\u0428\u0430\u043D\u0441 \u043D\u0430 \u0443\u0434\u0430\u0447\u043D\u044B\u0439 \u041A\u0443\u0432\u044B\u0440\u043E\u043A \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043E\u0442 \u0443\u0440\u043E\u0432\u043D\u044F \u043D\u0430\u0432\u044B\u043A\u0430. Guides.Acrobatics.Section.2=&3\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?!nasd&e\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 \u0448\u0430\u043D\u0441 \u0443\u043A\u043B\u043E\u043D\u0438\u0442\u044C\u0441\u044F!nasd&e\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.!nasd&e\u0428\u0430\u043D\u0441 \u043D\u0430 \u0443\u0434\u0430\u0447\u043D\u043E\u0435 \u0423\u043A\u043B\u043E\u043D\u0435\u043D\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043E\u0442 \u0443\u0440\u043E\u0432\u043D\u044F \u043D\u0430\u0432\u044B\u043A\u0430. ##Alchemy -Guides.Alchemy.Section.0=&3\u041E \u043D\u0430\u0432\u044B\u043A\u0435 \u0410\u043B\u0445\u0438\u043C\u0438\u044F\\:!nasd&e\u0410\u043B\u0445\u0438\u043C\u0438\u044F - \u044D\u0442\u043E \u043F\u0440\u043E\u0438\u0437\u0432\u043E\u0434\u0441\u0442\u0432\u043E \u0437\u0435\u043B\u0438\u0439.!nasd&e\u041E\u043D\u0430 \u043E\u0431\u0435\u0441\u043F\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0443\u0441\u043A\u043E\u0440\u0435\u043D\u0438\u0435 \u0432\u0430\u0440\u043A\u0438 \u0437\u0435\u043B\u0438\u0439, \u0430 \u0442\u0430\u043A\u0436\u0435!nasd&e\u0434\u043E\u0431\u0430\u0432\u043B\u044F\u0435\u0442 \u043D\u043E\u0432\u044B\u0435, \u0440\u0430\u043D\u0435\u0435 \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0435 \u0437\u0435\u043B\u0438\u0439.!nasd!nasd!nasd&3\u041F\u041E\u041B\u0423\u0427\u0415\u041D\u0418 \u041E\u041F\u042BT\u0410\\:!nasd&e\u0427\u0442\u043E\u0431\u044B \u043F\u043E\u043B\u0443\u0447\u0438\u0442\u044C \u043E\u043F\u044B\u0442 \u0432 \u044D\u0442\u043E\u043C \u043D\u0430\u0432\u044B\u043A\u0435, \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E \u0432\u0430\u0440\u0438\u0442\u044C \u0437\u0435\u043B\u044C\u044F. +Guides.Alchemy.Section.0=&3\u041E \u043D\u0430\u0432\u044B\u043A\u0435 \u0410\u043B\u0445\u0438\u043C\u0438\u044F:!nasd&e\u0410\u043B\u0445\u0438\u043C\u0438\u044F - \u044D\u0442\u043E \u043F\u0440\u043E\u0438\u0437\u0432\u043E\u0434\u0441\u0442\u0432\u043E \u0437\u0435\u043B\u0438\u0439.!nasd&e\u041E\u043D\u0430 \u043E\u0431\u0435\u0441\u043F\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0443\u0441\u043A\u043E\u0440\u0435\u043D\u0438\u0435 \u0432\u0430\u0440\u043A\u0438 \u0437\u0435\u043B\u0438\u0439, \u0430 \u0442\u0430\u043A\u0436\u0435!nasd&e\u0434\u043E\u0431\u0430\u0432\u043B\u044F\u0435\u0442 \u043D\u043E\u0432\u044B\u0435, \u0440\u0430\u043D\u0435\u0435 \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0435 \u0437\u0435\u043B\u0438\u0439.!nasd!nasd!nasd&3\u041F\u041E\u041B\u0423\u0427\u0415\u041D\u0418 \u041E\u041F\u042BT\u0410:!nasd&e\u0427\u0442\u043E\u0431\u044B \u043F\u043E\u043B\u0443\u0447\u0438\u0442\u044C \u043E\u043F\u044B\u0442 \u0432 \u044D\u0442\u043E\u043C \u043D\u0430\u0432\u044B\u043A\u0435, \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E \u0432\u0430\u0440\u0438\u0442\u044C \u0437\u0435\u043B\u044C\u044F. Guides.Alchemy.Section.1=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u041A\u0430\u0442\u0430\u043B\u0438\u0437\u0430\u0442\u043E\u0440?!nasd&e\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 \u0432\u0430\u0440\u043A\u0438 \u0434\u043E!nasd&e\u0441\u043A\u043E\u0440\u043E\u0441\u0442\u0438 4x \u043D\u0430 \u0443\u0440\u043E\u0432\u043D\u0435 1000.!nasd&e\u042D\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.Alchemy.Section.2=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u041E\u0442\u0432\u0430\u0440\u044B?!nasd&e\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\u0435\u0434\u0438\u0435\u043D\u0442\u0430\u043C\u0438.!nasd&e\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\u0435\u0434\u0438\u0435\u043D\u0442\u044B!nasd&e\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=&3\u0418\u043D\u0433\u0440\u0435\u0434\u0438\u0435\u043D\u0442\u044B 1 \u0440\u0430\u043D\u0433\u0430 \u041E\u0442\u0432\u0430\u0440\u043E\u0432\\:!nasd&e\u041E\u0433\u043D\u0435\u043D\u043D\u044B\u0439 \u043F\u043E\u0440\u043E\u0448\u043E\u043A, \u041C\u0430\u0440\u0438\u043D\u043E\u0432\u0430\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,!nasd&e\u0421\u0432\u0435\u0442\u043E\u043A\u0430\u043C\u0435\u043D\u043D\u0430\u044F \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 \u043C\u043E\u0440\u043A\u043E\u0432\u044C,!nasd&e\u0421\u0433\u0443\u0441\u0442\u043E\u043A \u043C\u0430\u0433\u043C\u044B, \u041D\u0435\u0437\u0435\u0440\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,!nasd&e\u0418\u0433\u043B\u043E\u0431\u0440\u044E\u0445!nasd&e(\u0412\u0430\u043D\u0438\u043B\u044C\u043D\u044B\u0435 \u0437\u0435\u043B\u044C\u044F) -Guides.Alchemy.Section.4=&3\u0418\u043D\u0433\u0440\u0435\u0434\u0438\u0435\u043D\u0442\u044B 2 \u0440\u0430\u043D\u0433\u0430 \u041E\u0442\u0432\u0430\u0440\u043E\u0432\\:!nasd&e\u041C\u043E\u0440\u043A\u043E\u0432\u044C (\u0417\u0435\u043B\u044C\u0435 \u0441\u043A\u043E\u0440\u043E\u0441\u0442\u0438)!nasd&e\u0421\u043B\u0438\u0437\u044C (\u0417\u0435\u043B\u044C\u0435 \u0442\u0443\u043F\u043E\u0441\u0442\u0438)!nasd!nasd&3\u0418\u043D\u0433\u0440\u0435\u0434\u0438\u0435\u043D\u0442\u044B 3 \u0440\u0430\u043D\u0433\u0430 \u041E\u0442\u0432\u0430\u0440\u043E\u0432\\:!nasd&e\u041A\u0432\u0430\u0440\u0446 (\u0417\u0435\u043B\u044C\u0435 \u043F\u043E\u0433\u043B\u043E\u0449\u0435\u043D\u0438\u044F)!nasd&e\u041C\u0443\u0445\u043E\u043C\u043E\u0440 (\u0417\u0435\u043B\u044C\u0435 \u043F\u0440\u044B\u0433\u0443\u0447\u0435\u0441\u0442\u0438) -Guides.Alchemy.Section.5=&3\u0418\u043D\u0433\u0440\u0435\u0434\u0438\u0435\u043D\u0442\u044B 4 \u0440\u0430\u043D\u0433\u0430 \u041E\u0442\u0432\u0430\u0440\u043E\u0432\\:!nasd&e\u042F\u0431\u043B\u043E\u043A\u043E (\u0417\u0435\u043B\u044C\u0435 \u0434\u043E\u043F. \u0437\u0434\u043E\u0440\u043E\u0432\u044C\u044F)!nasd&e\u0413\u043D\u0438\u043B\u0430\u044F \u041F\u043B\u043E\u0442\u044C (\u0417\u0435\u043B\u044C\u0435 \u0433\u043E\u043B\u043E\u0434\u0430)!nasd!nasd&3\u0418\u043D\u0433\u0440\u0435\u0434\u0438\u0435\u043D\u0442\u044B 5 \u0440\u0430\u043D\u0433\u0430 \u041E\u0442\u0432\u0430\u0440\u043E\u0432\\:!nasd&e\u041A\u043E\u0440\u0438\u0447\u043D\u0435\u0432\u044B\u0439 \u0433\u0440\u0438\u0431 (\u0417\u0435\u043B\u044C\u0435 \u0442\u043E\u0448\u043D\u043E\u0442\u044B)!nasd&e\u0427\u0435\u0440\u043D\u0438\u043B\u044C\u043D\u044B\u0439 \u043C\u0435\u0448\u043E\u043A (\u0417\u0435\u043B\u044C\u0435 \u0441\u043B\u0435\u043F\u043E\u0442\u044B) -Guides.Alchemy.Section.6=&3\u0418\u043D\u0433\u0440\u0435\u0434\u0438\u0435\u043D\u0442\u044B 6 \u0440\u0430\u043D\u0433\u0430 \u041E\u0442\u0432\u0430\u0440\u043E\u0432\\:!nasd&e\u041F\u0430\u043F\u043E\u0440\u043E\u0442\u043D\u0438\u043A (\u0417\u0435\u043B\u044C\u0435 \u043D\u0430\u0441\u044B\u0449\u0435\u043D\u0438\u044F)!nasd!nasd&3\u0418\u043D\u0433\u0440\u0435\u0434\u0438\u0435\u043D\u0442\u044B 7 \u0440\u0430\u043D\u0433\u0430 \u041E\u0442\u0432\u0430\u0440\u043E\u0432\\:!nasd&e\u042F\u0434\u043E\u0432\u0438\u0442\u044B\u0439 \u043A\u0430\u0440\u0442\u043E\u0444\u0435\u043B\u044C (\u0417\u0435\u043B\u044C\u0435 \u0437\u0430\u0433\u043D\u0438\u0432\u0430\u043D\u0438\u044F)!nasd!nasd&3\u0418\u043D\u0433\u0440\u0435\u0434\u0438\u0435\u043D\u0442\u044B 8 \u0440\u0430\u043D\u0433\u0430 \u041E\u0442\u0432\u0430\u0440\u043E\u0432\\:!nasd&e\u041E\u0431\u044B\u0447\u043D\u043E\u0435 \u0437\u043E\u043B\u043E\u0442\u043E\u0435 \u044F\u0431\u043B\u043E\u043A\u043E (\u0417\u0435\u043B\u044C\u0435 \u0437\u0430\u0449\u0438\u0442\u044B) +Guides.Alchemy.Section.3=&3\u0418\u043D\u0433\u0440\u0435\u0434\u0438\u0435\u043D\u0442\u044B 1 \u0440\u0430\u043D\u0433\u0430 \u041E\u0442\u0432\u0430\u0440\u043E\u0432:!nasd&e\u041E\u0433\u043D\u0435\u043D\u043D\u044B\u0439 \u043F\u043E\u0440\u043E\u0448\u043E\u043A, \u041C\u0430\u0440\u0438\u043D\u043E\u0432\u0430\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,!nasd&e\u0421\u0432\u0435\u0442\u043E\u043A\u0430\u043C\u0435\u043D\u043D\u0430\u044F \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 \u043C\u043E\u0440\u043A\u043E\u0432\u044C,!nasd&e\u0421\u0433\u0443\u0441\u0442\u043E\u043A \u043C\u0430\u0433\u043C\u044B, \u041D\u0435\u0437\u0435\u0440\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,!nasd&e\u0418\u0433\u043B\u043E\u0431\u0440\u044E\u0445!nasd&e(\u0412\u0430\u043D\u0438\u043B\u044C\u043D\u044B\u0435 \u0437\u0435\u043B\u044C\u044F) +Guides.Alchemy.Section.4=&3\u0418\u043D\u0433\u0440\u0435\u0434\u0438\u0435\u043D\u0442\u044B 2 \u0440\u0430\u043D\u0433\u0430 \u041E\u0442\u0432\u0430\u0440\u043E\u0432:!nasd&e\u041C\u043E\u0440\u043A\u043E\u0432\u044C (\u0417\u0435\u043B\u044C\u0435 \u0441\u043A\u043E\u0440\u043E\u0441\u0442\u0438)!nasd&e\u0421\u043B\u0438\u0437\u044C (\u0417\u0435\u043B\u044C\u0435 \u0442\u0443\u043F\u043E\u0441\u0442\u0438)!nasd!nasd&3\u0418\u043D\u0433\u0440\u0435\u0434\u0438\u0435\u043D\u0442\u044B 3 \u0440\u0430\u043D\u0433\u0430 \u041E\u0442\u0432\u0430\u0440\u043E\u0432:!nasd&e\u041A\u0432\u0430\u0440\u0446 (\u0417\u0435\u043B\u044C\u0435 \u043F\u043E\u0433\u043B\u043E\u0449\u0435\u043D\u0438\u044F)!nasd&e\u041C\u0443\u0445\u043E\u043C\u043E\u0440 (\u0417\u0435\u043B\u044C\u0435 \u043F\u0440\u044B\u0433\u0443\u0447\u0435\u0441\u0442\u0438) +Guides.Alchemy.Section.5=&3\u0418\u043D\u0433\u0440\u0435\u0434\u0438\u0435\u043D\u0442\u044B 4 \u0440\u0430\u043D\u0433\u0430 \u041E\u0442\u0432\u0430\u0440\u043E\u0432:!nasd&e\u042F\u0431\u043B\u043E\u043A\u043E (\u0417\u0435\u043B\u044C\u0435 \u0434\u043E\u043F. \u0437\u0434\u043E\u0440\u043E\u0432\u044C\u044F)!nasd&e\u0413\u043D\u0438\u043B\u0430\u044F \u041F\u043B\u043E\u0442\u044C (\u0417\u0435\u043B\u044C\u0435 \u0433\u043E\u043B\u043E\u0434\u0430)!nasd!nasd&3\u0418\u043D\u0433\u0440\u0435\u0434\u0438\u0435\u043D\u0442\u044B 5 \u0440\u0430\u043D\u0433\u0430 \u041E\u0442\u0432\u0430\u0440\u043E\u0432:!nasd&e\u041A\u043E\u0440\u0438\u0447\u043D\u0435\u0432\u044B\u0439 \u0433\u0440\u0438\u0431 (\u0417\u0435\u043B\u044C\u0435 \u0442\u043E\u0448\u043D\u043E\u0442\u044B)!nasd&e\u0427\u0435\u0440\u043D\u0438\u043B\u044C\u043D\u044B\u0439 \u043C\u0435\u0448\u043E\u043A (\u0417\u0435\u043B\u044C\u0435 \u0441\u043B\u0435\u043F\u043E\u0442\u044B) +Guides.Alchemy.Section.6=&3\u0418\u043D\u0433\u0440\u0435\u0434\u0438\u0435\u043D\u0442\u044B 6 \u0440\u0430\u043D\u0433\u0430 \u041E\u0442\u0432\u0430\u0440\u043E\u0432:!nasd&e\u041F\u0430\u043F\u043E\u0440\u043E\u0442\u043D\u0438\u043A (\u0417\u0435\u043B\u044C\u0435 \u043D\u0430\u0441\u044B\u0449\u0435\u043D\u0438\u044F)!nasd!nasd&3\u0418\u043D\u0433\u0440\u0435\u0434\u0438\u0435\u043D\u0442\u044B 7 \u0440\u0430\u043D\u0433\u0430 \u041E\u0442\u0432\u0430\u0440\u043E\u0432:!nasd&e\u042F\u0434\u043E\u0432\u0438\u0442\u044B\u0439 \u043A\u0430\u0440\u0442\u043E\u0444\u0435\u043B\u044C (\u0417\u0435\u043B\u044C\u0435 \u0437\u0430\u0433\u043D\u0438\u0432\u0430\u043D\u0438\u044F)!nasd!nasd&3\u0418\u043D\u0433\u0440\u0435\u0434\u0438\u0435\u043D\u0442\u044B 8 \u0440\u0430\u043D\u0433\u0430 \u041E\u0442\u0432\u0430\u0440\u043E\u0432:!nasd&e\u041E\u0431\u044B\u0447\u043D\u043E\u0435 \u0437\u043E\u043B\u043E\u0442\u043E\u0435 \u044F\u0431\u043B\u043E\u043A\u043E (\u0417\u0435\u043B\u044C\u0435 \u0437\u0430\u0449\u0438\u0442\u044B) + ##Archery -Guides.Archery.Section.0=&3\u041E \u043D\u0430\u0432\u044B\u043A\u0435 \u0421\u0442\u0440\u0435\u043B\u044C\u0431\u0430\\:!nasd&e\u041D\u0430\u0432\u044B\u043A \u0421\u0442\u0440\u0435\u043B\u044C\u0431\u044B \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u0435\u043D \u043D\u0430 \u0432\u0430\u0448\u0438 \u043B\u0443\u043A \u0438 \u0441\u0442\u0440\u0435\u043B\u044B.!nasd&e\u041E\u043D \u0434\u0430\u0435\u0442 \u0440\u0430\u0437\u043B\u0438\u0447\u043D\u044B\u0435 \u0431\u043E\u043D\u0443\u0441\u044B, \u0432\u0440\u043E\u0434\u0435 \u0443\u0432\u0435\u043B\u0438\u0447\u0435\u043D\u0438\u0435 \u0443\u0440\u043E\u043D\u0430,!nasd&e\u0432\u043E\u0437\u0440\u0430\u0441\u0442\u0430\u044E\u0449\u0435\u0433\u043E \u0441 \u0443\u0440\u043E\u0432\u043D\u0435\u043C, \u0430 \u0442\u0430\u043A\u0436\u0435 \u0443\u043C\u0435\u043D\u0438\u0435 \u043E\u0448\u0435\u043B\u043E\u043C\u0438\u0442\u044C!nasd&e\u043F\u0440\u043E\u0442\u0438\u0432\u043D\u0438\u043A\u0430 \u0432 \u041F\u0432\u041F. \u0422\u0430\u043A\u0436\u0435 \u0432\u044B \u043F\u043E\u043B\u0443\u0447\u0430\u0435\u0442\u0435 \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E\u0441\u0442\u044C!nasd&e\u0432\u0435\u0440\u043D\u0443\u0442\u044C \u0447\u0430\u0441\u0442\u044C \u0441\u0442\u0440\u0435\u043B \u0441 \u043F\u043E\u0432\u0435\u0440\u0436\u0435\u043D\u043D\u044B\u0445 \u0432\u0440\u0430\u0433\u043E\u0432.!nasd!nasd&3\u041F\u041E\u041B\u0423\u0427\u0415\u041D\u0418\u0415 \u041E\u041F\u042B\u0422\u0410\\:!nasd&e\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\u0435, \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E \u0441\u0442\u0440\u0435\u043B\u044F\u0442\u044C!nasd&e\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.0=&3\u041E \u043D\u0430\u0432\u044B\u043A\u0435 \u0421\u0442\u0440\u0435\u043B\u044C\u0431\u0430:!nasd&e\u041D\u0430\u0432\u044B\u043A \u0421\u0442\u0440\u0435\u043B\u044C\u0431\u044B \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u0435\u043D \u043D\u0430 \u0432\u0430\u0448\u0438 \u043B\u0443\u043A \u0438 \u0441\u0442\u0440\u0435\u043B\u044B.!nasd&e\u041E\u043D \u0434\u0430\u0435\u0442 \u0440\u0430\u0437\u043B\u0438\u0447\u043D\u044B\u0435 \u0431\u043E\u043D\u0443\u0441\u044B, \u0432\u0440\u043E\u0434\u0435 \u0443\u0432\u0435\u043B\u0438\u0447\u0435\u043D\u0438\u0435 \u0443\u0440\u043E\u043D\u0430,!nasd&e\u0432\u043E\u0437\u0440\u0430\u0441\u0442\u0430\u044E\u0449\u0435\u0433\u043E \u0441 \u0443\u0440\u043E\u0432\u043D\u0435\u043C, \u0430 \u0442\u0430\u043A\u0436\u0435 \u0443\u043C\u0435\u043D\u0438\u0435 \u043E\u0448\u0435\u043B\u043E\u043C\u0438\u0442\u044C!nasd&e\u043F\u0440\u043E\u0442\u0438\u0432\u043D\u0438\u043A\u0430 \u0432 \u041F\u0432\u041F. \u0422\u0430\u043A\u0436\u0435 \u0432\u044B \u043F\u043E\u043B\u0443\u0447\u0430\u0435\u0442\u0435 \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E\u0441\u0442\u044C!nasd&e\u0432\u0435\u0440\u043D\u0443\u0442\u044C \u0447\u0430\u0441\u0442\u044C \u0441\u0442\u0440\u0435\u043B \u0441 \u043F\u043E\u0432\u0435\u0440\u0436\u0435\u043D\u043D\u044B\u0445 \u0432\u0440\u0430\u0433\u043E\u0432.!nasd!nasd&3\u041F\u041E\u041B\u0423\u0427\u0415\u041D\u0418\u0415 \u041E\u041F\u042B\u0422\u0410:!nasd&e\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\u0435, \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E \u0441\u0442\u0440\u0435\u043B\u044F\u0442\u044C!nasd&e\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=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u0423\u043C\u0435\u043B\u044B\u0439 \u0432\u044B\u0441\u0442\u0440\u0435\u043B?!nasd&e\u0423\u043C\u0435\u043B\u044B\u0439 \u0432\u044B\u0441\u0442\u0440\u0435\u043B \u043D\u0430\u043D\u043E\u0441\u0438\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.!nasd&e\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 \u0432\u044B\u0441\u0442\u0440\u0435\u043B\u0435 \u0440\u0430\u0441\u0442\u0435\u0442 \u0441!nasd&e \u0432\u0430\u0448\u0438\u043C \u0443\u0440\u043E\u0432\u043D\u0435\u043C \u043D\u0430\u0432\u044B\u043A\u0430 \u0421\u0442\u0440\u0435\u043B\u044C\u0431\u044B. !nasd&e\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 \u0443\u0432\u0435\u043B\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044F \u043D\u0430 10% !nasd&e\u043A\u0430\u0436\u0434\u044B\u0435 50 \u0443\u0440\u043E\u0432\u043D\u0435\u0439, \u0432\u043F\u043B\u043E\u0442\u044C \u0434\u043E 200% \u0431\u043E\u043D\u0443\u0441\u043D\u043E\u0433\u043E \u0443\u0440\u043E\u043D\u0430. Guides.Archery.Section.2=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u041E\u0448\u0435\u043B\u043E\u043C\u043B\u0435\u043D\u0438\u0435?!nasd&e\u0412\u044B \u0438\u043C\u0435\u0435\u0442\u0435 \u043F\u0430\u0441\u0441\u0438\u0432\u043D\u044B\u0439 \u0448\u0430\u043D\u0441 \u041E\u0448\u0435\u043B\u043E\u043C\u0438\u0442\u044C \u0434\u0440\u0443\u0433\u0438\u0445 \u0438\u0433\u0440\u043E\u043A\u043E\u0432,!nasd&e\u0441\u0442\u0440\u0435\u043B\u044F\u044F \u0432 \u043D\u0438\u0445. \u041E\u0448\u0435\u043B\u043E\u043C\u043B\u0435\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 !nasd&e\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\u0431\u043E\u043B\u044C\u0448\u043E\u0433\u043E \u0432\u0440\u0435\u043C\u0435\u043D\u0438.!nasd&e\u041E\u0448\u0435\u043B\u043E\u043C\u043B\u0435\u043D\u0438\u0435 \u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u043E \u043D\u0430\u043D\u043E\u0441\u0438\u0442 4 \u0443\u0440\u043E\u043D\u0430 (2 \u0441\u0435\u0440\u0434\u0446\u0430). Guides.Archery.Section.3=&3\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 \u0441\u0442\u0440\u0435\u043B?!nasd&e\u0423 \u0432\u0430\u0441 \u0435\u0441\u0442\u044C \u043F\u0430\u0441\u0441\u0438\u0432\u043D\u044B\u0439 \u0448\u0430\u043D\u0441 \u0432\u0435\u0440\u043D\u0443\u0442\u044C \u0447\u0430\u0441\u0442\u044C \u0441\u0432\u043E\u0438\u0445!nasd&e\u0441\u0442\u0440\u0435\u043B \u043F\u043E\u0441\u043B\u0435 \u0443\u0431\u0438\u0439\u0441\u0442\u0432\u0430 \u043C\u043E\u0431\u0430 \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u043B\u0443\u043A\u0430.!nasd&e\u042D\u0442\u043E\u0442 \u0448\u0430\u043D\u0441 \u0440\u0430\u0441\u0442\u0435\u0442 \u0441 \u0443\u0440\u043E\u0432\u043D\u0435\u043C \u043D\u0430\u0432\u044B\u043A\u0430 \u0421\u0442\u0440\u0435\u043B\u044C\u0431\u044B.!nasd&e\u0423\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, \u0432\u043F\u043B\u043E\u0442\u044C!nasd&e\u0434\u043E 100% \u043D\u0430 1000 \u0443\u0440\u043E\u0432\u043D\u0435. ##Axes -Guides.Axes.Section.0=&3\u041E \u043D\u0430\u0432\u044B\u043A\u0435 \u0422\u043E\u043F\u043E\u0440\u044B\\:!nasd&e\u0421 \u043D\u0430\u0432\u044B\u043A\u043E\u043C \u0422\u043E\u043F\u043E\u0440\u044B \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!nasd&e\u0442\u043E\u043B\u044C\u043A\u043E \u0434\u043B\u044F \u0440\u0443\u0431\u043A\u0438 \u043B\u0435\u0441\u0430\\! \u0412\u044B \u0441\u043C\u043E\u0436\u0435\u0442\u0435 \u043A\u0440\u043E\u043C\u0441\u0430\u0442\u044C \u043C\u043E\u0431\u043E\u0432!nasd&e\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!nasd&e\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.!nasd&e\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!nasd&e\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.!nasd&e\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.!nasd&3\u041F\u041E\u041B\u0423\u0427\u0415\u041D\u0418\u0415 \u041E\u041F\u042B\u0422\u0410\\:!nasd&e\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 !nasd&e\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.0=&3\u041E \u043D\u0430\u0432\u044B\u043A\u0435 \u0422\u043E\u043F\u043E\u0440\u044B:!nasd&e\u0421 \u043D\u0430\u0432\u044B\u043A\u043E\u043C \u0422\u043E\u043F\u043E\u0440\u044B \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!nasd&e\u0442\u043E\u043B\u044C\u043A\u043E \u0434\u043B\u044F \u0440\u0443\u0431\u043A\u0438 \u043B\u0435\u0441\u0430! \u0412\u044B \u0441\u043C\u043E\u0436\u0435\u0442\u0435 \u043A\u0440\u043E\u043C\u0441\u0430\u0442\u044C \u043C\u043E\u0431\u043E\u0432!nasd&e\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!nasd&e\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.!nasd&e\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!nasd&e\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.!nasd&e\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.!nasd&3\u041F\u041E\u041B\u0423\u0427\u0415\u041D\u0418\u0415 \u041E\u041F\u042B\u0422\u0410:!nasd&e\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 !nasd&e\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=&3\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 \u0447\u0435\u0440\u0435\u043F\u043E\u0432?!nasd&e\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!nasd&e\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,!nasd&e\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=&3\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 \u0443\u0434\u0430\u0440?!nasd&e\u041A\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043A\u0438\u0439 \u0443\u0434\u0430\u0440 - \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!nasd&e\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.!nasd&e\u041A\u0430\u0436\u0434\u044B\u0435 2 \u0443\u0440\u043E\u0432\u043D\u044F \u043D\u0430\u0432\u044B\u043A\u0430 \u0422\u043E\u043F\u043E\u0440\u043E\u0432 \u0434\u0430\u044E\u0442 \u0432\u0430\u043C +0,1%!nasd&e\u0448\u0430\u043D\u0441 \u043D\u0430\u043D\u0435\u0441\u0442\u0438 \u041A\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043A\u0438\u0439 \u0443\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!nasd&e\u0443\u0440\u043E\u043D x2, \u0430 \u0434\u0440\u0443\u0433\u0438\u0435 \u0438\u0433\u0440\u043E\u043A\u0438 x1,5. Guides.Axes.Section.3=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u041C\u0430\u0441\u0442\u0435\u0440\u0441\u0442\u0432\u043E \u0442\u043E\u043F\u043E\u0440\u0430?!nasd&e\u041C\u0430\u0441\u0442\u0435\u0440\u0441\u0442\u0432\u043E \u0442\u043E\u043F\u043E\u0440\u0430 - \u043F\u0430\u0441\u0441\u0438\u0432\u043D\u043E\u0435 \u0443\u043C\u0435\u043D\u0438\u0435, \u043A\u043E\u0442\u043E\u0440\u043E\u0435 \u043D\u0430\u043D\u043E\u0441\u0438\u0442!nasd&e\u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0439 \u0443\u0440\u043E\u043D \u043F\u0440\u0438 \u0432\u0430\u0448\u0438\u0445 \u0430\u0442\u0430\u043A\u0430\u0445 \u0442\u043E\u043F\u043E\u0440\u043E\u043C.!nasd&e\u0411\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!nasd&e\u043D\u0430\u0432\u044B\u043A\u0430, \u0432\u043F\u043B\u043E\u0442\u044C \u0434\u043E 4 \u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0433\u043E \u0443\u0440\u043E\u043D\u0430 \u043D\u0430 200 \u0443\u0440\u043E\u0432\u043D\u0435. -Guides.Axes.Section.4=&3\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 \u0443\u0434\u0430\u0440?!nasd&e\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\\!!nasd&e\u0411\u0440\u043E\u043D\u0435\u0431\u043E\u0439\u043D\u044B\u0439 \u0443\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!nasd&e\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 \u0443\u0440\u043E\u0432\u043D\u044F \u043D\u0430\u0432\u044B\u043A\u0430. +Guides.Axes.Section.4=&3\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 \u0443\u0434\u0430\u0440?!nasd&e\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!!nasd&e\u0411\u0440\u043E\u043D\u0435\u0431\u043E\u0439\u043D\u044B\u0439 \u0443\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!nasd&e\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 \u0443\u0440\u043E\u0432\u043D\u044F \u043D\u0430\u0432\u044B\u043A\u0430. Guides.Axes.Section.5=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u041C\u043E\u0449\u043D\u044B\u0439 \u0443\u0434\u0430\u0440?!nasd&e\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 \u041C\u043E\u0449\u043D\u044B\u0439 \u0443\u0434\u0430\u0440, \u0441\u0440\u0430\u0436\u0430\u044F\u0441\u044C \u0441 !nasd&e\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, !nasd&e\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 \u044D\u0444\u0444\u0435\u043A\u0442!nasd&e\u0441\u0438\u043B\u044C\u043D\u043E\u0433\u043E \u043E\u0442\u043A\u0438\u0434\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\u043A\u0438\u0434\u044B\u0432\u0430\u043D\u0438\u0435 II!nasd&e\u041A \u0442\u043E\u043C\u0443 \u0436\u0435 \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=&3\u041E \u043D\u0430\u0432\u044B\u043A\u0435 \u0420\u0430\u0441\u043A\u043E\u043F\u043A\u0438\\:!nasd&e\u0420\u0430\u0441\u043A\u043E\u043F\u043A\u0438 - \u043F\u0440\u043E\u0446\u0435\u0441\u0441 \u043A\u043E\u043F\u0430\u043D\u0438\u044F \u0437\u0435\u043C\u043B\u0438 \u0432 \u043F\u043E\u0438\u0441\u043A\u0430\u0445 \u0441\u043E\u043A\u0440\u043E\u0432\u0438\u0449.!nasd&e\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.!nasd&e\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 \u043C\u043E\u0436\u0435\u0442\u0435 \u043D\u0430\u0439\u0442\u0438.!nasd!nasd&3\u041F\u041E\u041B\u0423\u0427\u0415\u041D\u0418\u0415 \u041E\u041F\u042B\u0422\u0410\\:!nasd&e\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.!nasd&e\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=&3\u041F\u043E\u0434\u0445\u043E\u0434\u044F\u0449\u0438\u0435 \u0431\u043B\u043E\u043A\u0438\\:!nasd&e\u0414\u0435\u0440\u043D, \u0417\u0435\u043C\u043B\u044F, \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, \u0421\u043D\u0435\u0433 -Guides.Excavation.Section.2=&3\u041A\u0430\u043A \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u0443\u043C\u0435\u043D\u0438\u0435 \u0413\u0438\u0433\u0430-\u0431\u0443\u0440\\:!nasd&e\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\u043E\u0434\u0433\u043E\u0442\u043E\u0432\u0438\u0442\u044C \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442.!nasd&e\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 \u043D\u0430\u0447\u0430\u043B\u0430 \u0434\u043E\u0431\u044B\u0447\u0438!nasd&e\u043F\u043E\u0434\u0445\u043E\u0434\u044F\u0449\u0438\u0445 \u0431\u043B\u043E\u043A\u043E\u0432, \u0447\u0442\u043E \u0430\u043A\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u0413\u0438\u0433\u0430-\u0431\u0443\u0440. +Guides.Excavation.Section.0=&3\u041E \u043D\u0430\u0432\u044B\u043A\u0435 \u0420\u0430\u0441\u043A\u043E\u043F\u043A\u0438:!nasd&e\u0420\u0430\u0441\u043A\u043E\u043F\u043A\u0438 - \u043F\u0440\u043E\u0446\u0435\u0441\u0441 \u043A\u043E\u043F\u0430\u043D\u0438\u044F \u0437\u0435\u043C\u043B\u0438 \u0432 \u043F\u043E\u0438\u0441\u043A\u0430\u0445 \u0441\u043E\u043A\u0440\u043E\u0432\u0438\u0449.!nasd&e\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.!nasd&e\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 \u043C\u043E\u0436\u0435\u0442\u0435 \u043D\u0430\u0439\u0442\u0438.!nasd!nasd&3\u041F\u041E\u041B\u0423\u0427\u0415\u041D\u0418\u0415 \u041E\u041F\u042B\u0422\u0410:!nasd&e\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.!nasd&e\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=&3\u041F\u043E\u0434\u0445\u043E\u0434\u044F\u0449\u0438\u0435 \u0431\u043B\u043E\u043A\u0438:!nasd&e\u0414\u0435\u0440\u043D, \u0417\u0435\u043C\u043B\u044F, \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, \u0421\u043D\u0435\u0433 +Guides.Excavation.Section.2=&3\u041A\u0430\u043A \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u0443\u043C\u0435\u043D\u0438\u0435 \u0413\u0438\u0433\u0430-\u0431\u0443\u0440:!nasd&e\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\u043E\u0434\u0433\u043E\u0442\u043E\u0432\u0438\u0442\u044C \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442.!nasd&e\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 \u043D\u0430\u0447\u0430\u043B\u0430 \u0434\u043E\u0431\u044B\u0447\u0438!nasd&e\u043F\u043E\u0434\u0445\u043E\u0434\u044F\u0449\u0438\u0445 \u0431\u043B\u043E\u043A\u043E\u0432, \u0447\u0442\u043E \u0430\u043A\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u0413\u0438\u0433\u0430-\u0431\u0443\u0440. Guides.Excavation.Section.3=&3\u0427\u0442\u043E \u0442\u0430\u043A\u043E\u0435 \u0413\u0438\u0433\u0430-\u0431\u0443\u0440?!nasd&e\u0413\u0438\u0433\u0430-\u0431\u0443\u0440 - \u044D\u0442\u043E \u0443\u043C\u0435\u043D\u0438\u0435 \u0441 \u043E\u0442\u043A\u0430\u0442\u043E\u043C, \u0441\u0432\u044F\u0437\u0430\u043D\u043D\u043E\u0435!nasd&e\u0441 \u043D\u0430\u0432\u044B\u043A\u043E\u043C \u0420\u0430\u0441\u043A\u043E\u043F\u043E\u043A. \u041E\u043D\u043E \u0443\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u0448\u0430\u043D\u0441!nasd&e\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!nasd&e\u0440\u0430\u0437\u0440\u0443\u0448\u0430\u0442\u044C \u043F\u043E\u0434\u0445\u043E\u0434\u044F\u0449\u0438\u0435 \u0431\u043B\u043E\u043A\u0438 \u0441 \u043E\u0434\u043D\u043E\u0433\u043E \u0443\u0434\u0430\u0440\u0430. Guides.Excavation.Section.4=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u0410\u0440\u0445\u0435\u043E\u043B\u043E\u0433\u0438\u044F?!nasd&e\u0412\u0441\u0435 \u0441\u043E\u043A\u0440\u043E\u0432\u0438\u0449\u0430 \u043D\u0430\u0432\u044B\u043A\u0430 \u0420\u0430\u0441\u043A\u043E\u043F\u043E\u043A \u0438\u043C\u0435\u044E\u0442 \u0441\u0432\u043E\u0439!nasd&e\u0442\u0440\u0435\u0431\u0443\u0435\u043C\u044B\u0439 \u0443\u0440\u043E\u0432\u0435\u043D\u044C \u043D\u0430\u0432\u044B\u043A\u0430, \u0442\u0430\u043A \u0447\u0442\u043E \u0441\u043B\u043E\u0436\u043D\u043E \u0441\u043A\u0430\u0437\u0430\u0442\u044C,!nasd&e\u043D\u0430\u0441\u043A\u043E\u043B\u044C\u043A\u043E \u0441\u0438\u043B\u044C\u043D\u043E \u0432\u0430\u043C \u043F\u043E\u043C\u043E\u0436\u0435\u0442 \u044D\u0442\u043E\u0442 \u043D\u0430\u0432\u044B\u043A.!nasd&e\u041F\u0440\u043E\u0441\u0442\u043E \u043F\u043E\u043C\u043D\u0438\u0442\u0435, \u0447\u0442\u043E \u0447\u0435\u043C \u0432\u044B\u0448\u0435 \u0432\u0430\u0448 \u043D\u0430\u0432\u044B\u043A \u0420\u0430\u0441\u043A\u043E\u043F\u043E\u043A,!nasd&e\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.!nasd&e\u0422\u0430\u043A\u0436\u0435 \u043D\u0435 \u0437\u0430\u0431\u044B\u0432\u0430\u0439\u0442\u0435, \u0447\u0442\u043E \u0434\u043B\u044F \u043A\u0430\u0436\u0434\u043E\u0433\u043E \u0441\u043E\u0432\u043C\u0435\u0441\u0442\u0438\u043C\u043E\u0433\u043E!nasd&e\u0441 \u0420\u0430\u0441\u043A\u043E\u043F\u043A\u0430\u043C\u0438 \u0431\u043B\u043E\u043A\u0430 \u0438\u043C\u0435\u044E\u0442\u0441\u044F \u0441\u0432\u043E\u0438 \u0443\u043D\u0438\u043A\u0430\u043B\u044C\u043D\u044B\u0435 \u0441\u043E\u043A\u0440\u043E\u0432\u0438\u0449\u0430.!nasd&e\u0414\u0440\u0443\u0433\u0438\u043C\u0438 \u0441\u043B\u043E\u0432\u0430\u043C\u0438, \u0432 \u0437\u0435\u043C\u043B\u0435 \u0432\u044B \u043D\u0430\u0439\u0434\u0435\u0442\u0435 \u0434\u0440\u0443\u0433\u0438\u0435 \u0441\u043E\u043A\u0440\u043E\u0432\u0438\u0449\u0430,!nasd&e\u043D\u0435\u0436\u0435\u043B\u0438, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, \u0432 \u0433\u0440\u0430\u0432\u0438\u0438. -Guides.Excavation.Section.5=&3\u041F\u0440\u0438\u043C\u0435\u0447\u0430\u043D\u0438\u044F \u043E \u0420\u0430\u0441\u043A\u043E\u043F\u043A\u0430\u0445\\:!nasd&e\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.!nasd&e\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. +Guides.Excavation.Section.5=&3\u041F\u0440\u0438\u043C\u0435\u0447\u0430\u043D\u0438\u044F \u043E \u0420\u0430\u0441\u043A\u043E\u043F\u043A\u0430\u0445:!nasd&e\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.!nasd&e\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=&3\u041E \u043D\u0430\u0432\u044B\u043A\u0435 \u0420\u044B\u0431\u043E\u043B\u043E\u0432\u0441\u0442\u0432\u043E\\:!nasd&e\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\\!!nasd&e\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\\!!nasd!nasd&3\u041F\u041E\u041B\u0423\u0427\u0415\u041D\u0418\u0415 \u041E\u041F\u042B\u0422\u0410\\:!nasd&e\u041B\u043E\u0432\u0438\u0442\u0435 \u0440\u044B\u0431\u0443. +Guides.Fishing.Section.0=&3\u041E \u043D\u0430\u0432\u044B\u043A\u0435 \u0420\u044B\u0431\u043E\u043B\u043E\u0432\u0441\u0442\u0432\u043E:!nasd&e\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!!nasd&e\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!!nasd!nasd&3\u041F\u041E\u041B\u0423\u0427\u0415\u041D\u0418\u0415 \u041E\u041F\u042B\u0422\u0410:!nasd&e\u041B\u043E\u0432\u0438\u0442\u0435 \u0440\u044B\u0431\u0443. Guides.Fishing.Section.1=&3\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 \u0441\u043E\u043A\u0440\u043E\u0432\u0438\u0449\u0430\u043C\u0438?!nasd&e\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!nasd&e\u0432\u0440\u0435\u043C\u044F \u0440\u044B\u0431\u0430\u043B\u043A\u0438, \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.!nasd&e\u0412\u0441\u0435 \u0441\u043E\u043A\u0440\u043E\u0432\u0438\u0449\u0430 \u0420\u044B\u0431\u043E\u043B\u043E\u0432\u0441\u0442\u0432\u0430 \u0438\u043C\u0435\u044E\u0442 \u0448\u0430\u043D\u0441!nasd&e\u043F\u043E\u0439\u043C\u0430\u0442\u044C\u0441\u044F \u043D\u0430 \u043B\u044E\u0431\u043E\u043C \u0443\u0440\u043E\u0432\u043D\u0435. \u0428\u0430\u043D\u0441 \u0432\u044B\u043F\u0430\u0434\u0435\u043D\u0438\u044F!nasd&e\u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043E\u0442 \u0440\u0435\u0434\u043A\u043E\u0441\u0442\u0438 \u0441\u043E\u043A\u0440\u043E\u0432\u0438\u0449\u0430.!nasd&e\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,!nasd&e\u0442\u0435\u043C \u0431\u043E\u043B\u044C\u0448\u0435 \u0448\u0430\u043D\u0441 \u043D\u0430\u0439\u0442\u0438 \u0445\u043E\u0440\u043E\u0448\u0438\u0435 \u0441\u043E\u043A\u0440\u043E\u0432\u0438\u0449\u0430. Guides.Fishing.Section.2=&3\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 \u0440\u044B\u0431\u0430\u043B\u043A\u0430?!nasd&e\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!nasd&e\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!nasd&e\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=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u041C\u0430\u0441\u0442\u0435\u0440-\u0440\u044B\u0431\u043E\u043B\u043E\u0432?!nasd&&e\u042D\u0442\u043E\u0442 \u043F\u0430\u0441\u0441\u0438\u0432\u043D\u044B\u0439 \u043D\u0430\u0432\u044B\u043A \u0443\u0432\u0435\u043B\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0448\u0430\u043D\u0441 \u0443\u043B\u043E\u0432\u0430 \u0432\u043E \u0432\u0440\u0435\u043C\u044F \u0440\u044B\u0431\u0430\u043B\u043A\u0438.!nasd&e\u041A\u043E\u0433\u0434\u0430 \u0432\u044B \u0440\u0430\u0437\u0431\u043B\u043E\u043A\u0438\u0440\u0443\u0435\u0442\u0435 \u044D\u0442\u043E \u0443\u043C\u0435\u043D\u0438\u0435, \u0440\u044B\u0431\u0430\u043B\u043A\u0430 \u0432 \u043B\u043E\u0434\u043A\u0435!nasd&e\u0443\u0432\u0435\u043B\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0448\u0430\u043D\u0441\u044B \u043F\u043E\u0439\u043C\u0430\u0442\u044C \u0440\u044B\u0431\u0443. Guides.Fishing.Section.4=&3\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?!nasd&e\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\u044B\u0442\u0440\u044F\u0445\u0438\u0432\u0430\u0442\u044C \u043F\u0440\u0435\u0434\u043C\u0435\u0442\u044B!nasd&e\u0438\u0437 \u043C\u043E\u0431\u043E\u0432, \u0446\u0435\u043F\u043B\u044F\u044F \u0438\u0445 \u0443\u0434\u043E\u0447\u043A\u043E\u0439.!nasd&e\u042D\u0442\u043E \u0431\u0443\u0434\u0443\u0442 \u043F\u0440\u0435\u0434\u043C\u0435\u0442\u044B, \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u0432\u044B\u043F\u0430\u0434\u0430\u044E\u0442 \u0438\u0437 \u043D\u0438\u0445 \u043F\u0440\u0438 \u0441\u043C\u0435\u0440\u0442\u0438.!nasd&e\u0422\u0430\u043A\u0436\u0435 \u0435\u0441\u0442\u044C \u0448\u0430\u043D\u0441 \u043F\u043E\u043B\u0443\u0447\u0438\u0442\u044C \u0447\u0435\u0440\u0435\u043F\u0430 \u043C\u043E\u0431\u043E\u0432, \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u043E\u0431\u044B\u0447\u043D\u043E!nasd&e\u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B \u0432 \u0440\u0435\u0436\u0438\u043C\u0435 \u0432\u044B\u0436\u0438\u0432\u0430\u043D\u0438\u044F. Guides.Fishing.Section.5=&3\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 \u0434\u0438\u0435\u0442\u0430?!nasd&e\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!nasd&e\u043F\u0440\u0438 \u043F\u043E\u0435\u0434\u0430\u043D\u0438\u0438 \u0440\u044B\u0431\u044B. -Guides.Fishing.Section.6=&3\u041F\u0440\u0438\u043C\u0435\u0447\u0430\u043D\u0438\u044F \u043E \u0420\u044B\u0431\u043E\u043B\u043E\u0432\u0441\u0442\u0432\u0435\\:!nasd&e\u041F\u0440\u0435\u0434\u043C\u0435\u0442\u044B \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\u0438\u0432\u0430\u0435\u043C\u044B,!nasd&e\u0442\u0430\u043A \u0447\u0442\u043E \u043D\u0430 \u0440\u0430\u0437\u043D\u044B\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u0445 \u0438 \u0434\u043E\u0431\u044B\u0447\u0430 \u043C\u043E\u0436\u0435\u0442 \u0431\u044B\u0442\u044C \u0440\u0430\u0437\u043D\u0430\u044F. +Guides.Fishing.Section.6=&3\u041F\u0440\u0438\u043C\u0435\u0447\u0430\u043D\u0438\u044F \u043E \u0420\u044B\u0431\u043E\u043B\u043E\u0432\u0441\u0442\u0432\u0435:!nasd&e\u041F\u0440\u0435\u0434\u043C\u0435\u0442\u044B \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\u0438\u0432\u0430\u0435\u043C\u044B,!nasd&e\u0442\u0430\u043A \u0447\u0442\u043E \u043D\u0430 \u0440\u0430\u0437\u043D\u044B\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u0445 \u0438 \u0434\u043E\u0431\u044B\u0447\u0430 \u043C\u043E\u0436\u0435\u0442 \u0431\u044B\u0442\u044C \u0440\u0430\u0437\u043D\u0430\u044F. ##Herbalism -Guides.Herbalism.Section.0=&3\u041E \u043D\u0430\u0432\u044B\u043A\u0435 \u0422\u0440\u0430\u0432\u043D\u0438\u0447\u0435\u0441\u0442\u0432\u043E\\:!nasd&e\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.!nasd!nasd&3\u041F\u041E\u041B\u0423\u0427\u0415\u041D\u0418\u0415 \u041E\u041F\u042B\u0422\u0410\\:!nasd&e\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=&3\u041F\u043E\u0434\u0445\u043E\u0434\u044F\u0449\u0438\u0435 \u0440\u0430\u0441\u0442\u0435\u043D\u0438\u044F\\:!nasd&e\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, !nasd&e\u0422\u044B\u043A\u0432\u044B, \u0421\u0430\u0445\u0430\u0440\u043D\u044B\u0439 \u0442\u0440\u043E\u0441\u0442\u043D\u0438\u043A, \u041A\u0430\u043A\u0430\u043E-\u0431\u043E\u0431\u044B, \u0426\u0432\u0435\u0442\u044B, \u041A\u0430\u043A\u0442\u0443\u0441\u044B,!nasd&e\u0413\u0440\u0438\u0431\u044B, \u041D\u0435\u0437\u0435\u0440\u0441\u043A\u0438\u0439 \u043D\u0430\u0440\u043E\u0441\u0442, \u041A\u0443\u0432\u0448\u0438\u043D\u043A\u0438, \u041B\u0438\u0430\u043D\u044B. +Guides.Herbalism.Section.0=&3\u041E \u043D\u0430\u0432\u044B\u043A\u0435 \u0422\u0440\u0430\u0432\u043D\u0438\u0447\u0435\u0441\u0442\u0432\u043E:!nasd&e\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.!nasd!nasd&3\u041F\u041E\u041B\u0423\u0427\u0415\u041D\u0418\u0415 \u041E\u041F\u042B\u0422\u0410:!nasd&e\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=&3\u041F\u043E\u0434\u0445\u043E\u0434\u044F\u0449\u0438\u0435 \u0440\u0430\u0441\u0442\u0435\u043D\u0438\u044F:!nasd&e\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, !nasd&e\u0422\u044B\u043A\u0432\u044B, \u0421\u0430\u0445\u0430\u0440\u043D\u044B\u0439 \u0442\u0440\u043E\u0441\u0442\u043D\u0438\u043A, \u041A\u0430\u043A\u0430\u043E-\u0431\u043E\u0431\u044B, \u0426\u0432\u0435\u0442\u044B, \u041A\u0430\u043A\u0442\u0443\u0441\u044B,!nasd&e\u0413\u0440\u0438\u0431\u044B, \u041D\u0435\u0437\u0435\u0440\u0441\u043A\u0438\u0439 \u043D\u0430\u0440\u043E\u0441\u0442, \u041A\u0443\u0432\u0448\u0438\u043D\u043A\u0438, \u041B\u0438\u0430\u043D\u044B. Guides.Herbalism.Section.2=&3\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?!nasd&e\u041E\u0437\u0435\u043B\u0435\u043D\u0435\u043D\u0438\u0435 - \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u0435 \u0443\u043C\u0435\u043D\u0438\u0435, \u043A\u043E\u0442\u043E\u0440\u043E\u0435!nasd&e\u0430\u043A\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u0442\u0441\u044F \u043D\u0430\u0436\u0430\u0442\u0438\u0435\u043C \u041F\u041A\u041C \u0441 \u043C\u043E\u0442\u044B\u0433\u043E\u0439 \u0432 \u0440\u0443\u043A\u0435.!nasd&e\u041E\u0437\u0435\u043B\u0435\u043D\u0435\u043D\u0438\u0435 \u0434\u0430\u0435\u0442 \u0448\u0430\u043D\u0441 3x \u0434\u043E\u0431\u044B\u0447\u0438 \u043F\u0440\u0438 \u0441\u0431\u043E\u0440\u0435!nasd&e\u0440\u0430\u0441\u0442\u0435\u043D\u0438\u0439. \u0422\u0430\u043A\u0436\u0435 \u043E\u043D\u043E \u0434\u0430\u0435\u0442 \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E\u0441\u0442\u044C !nasd&e\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 !nasd&e\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. Guides.Herbalism.Section.3=&3\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 \u043F\u0440\u0438\u043A\u043E\u0441\u043D\u043E\u0432\u0435\u043D\u0438\u0435 (\u043D\u0430 \u0443\u0440\u043E\u0436\u0430\u0439)?!nasd&e\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!nasd&e\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. !nasd&e\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=&3\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 \u043F\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)?!nasd&e\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!nasd&e"\u0436\u0438\u0432\u044B\u0435" \u0432\u0430\u0440\u0438\u0430\u043D\u0442\u044B. \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!nasd&e\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\u0435\u0447\u043A\u043E. @@ -919,33 +922,33 @@ Guides.Herbalism.Section.5=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u Guides.Herbalism.Section.6=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u0425\u0430\u0439\u043B\u0438\u0439\u0441\u043A\u0430\u044F \u0443\u0434\u0430\u0447\u0430?!nasd&e\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!nasd&e\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=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u0414\u0432\u043E\u0439\u043D\u0430\u044F \u0434\u043E\u0431\u044B\u0447\u0430?!nasd&e\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\u0435 \u0443\u0440\u043E\u0436\u0430\u044F \u043F\u0440\u0438!nasd&e\u0432\u043E \u0432\u0440\u0435\u043C\u044F \u0435\u0433\u043E \u0441\u0431\u043E\u0440\u0430. ##Mining -Guides.Mining.Section.0=&3\u041E \u043D\u0430\u0432\u044B\u043A\u0435 \u0428\u0430\u0445\u0442\u0435\u0440\u0441\u0442\u0432\u043E\\:!nasd&e\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,!nasd&e\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.!nasd!nasd&3\u041F\u041E\u041B\u0423\u0427\u0415\u041D\u0418\u0415 \u041E\u041F\u042B\u0422\u0410\\:!nasd&e\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.!nasd&e\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=&3\u041F\u043E\u0434\u0445\u043E\u0434\u044F\u0449\u0438\u0435 \u0431\u043B\u043E\u043A\u0438\\:!nasd&e\u041A\u0430\u043C\u0435\u043D\u044C, \u041A\u0430\u043C\u0435\u043D\u043D\u044B\u0439 \u0443\u0433\u043E\u043B\u044C, \u0416\u0435\u043B\u0435\u0437\u043D\u0430\u044F \u0440\u0443\u0434\u0430, \u0417\u043E\u043B\u043E\u0442\u0430\u044F \u0440\u0443\u0434\u0430, \u0410\u043B\u043C\u0430\u0437\u043D\u0430\u044F \u0440\u0443\u0434\u0430,!nasd&e\u0420\u0435\u0434\u0441\u0442\u043E\u0443\u043D\u043E\u0432\u0430\u044F \u0440\u0443\u0434\u0430, \u041B\u0430\u0437\u0443\u0440\u0438\u0442\u043E\u0432\u0430\u044F \u0440\u0443\u0434\u0430, \u041E\u0431\u0441\u0438\u0434\u0438\u0430\u043D, \u0417\u0430\u043C\u0448\u0435\u043B\u044B\u0439 \u0431\u0443\u043B\u044B\u0436\u043D\u0438\u043A,!nasd&e\u042D\u043D\u0434\u0435\u0440\u043D\u044F\u043A, \u0421\u0432\u0435\u0442\u044F\u0449\u0438\u0439\u0441\u044F \u043A\u0430\u043C\u0435\u043D\u044C, \u041D\u0435\u0437\u0435\u0440\u0430\u043A. -Guides.Mining.Section.2=&3\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\u043A\u0440\u0443\u0448\u0438\u0442\u0435\u043B\u044C\\:!nasd&e\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\u043E\u0434\u0433\u043E\u0442\u043E\u0432\u0438\u0442\u044C \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442.!nasd&e\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 \u043D\u0430\u0447\u0430\u043B\u0430 \u0434\u043E\u0431\u044B\u0447\u0438!nasd&e\u043F\u043E\u0434\u0445\u043E\u0434\u044F\u0449\u0438\u0445 \u0431\u043B\u043E\u043A\u043E\u0432, \u0447\u0442\u043E \u0430\u043A\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u0421\u0443\u043F\u0435\u0440\u043A\u0440\u0443\u0448\u0438\u0442\u0435\u043B\u044C. +Guides.Mining.Section.0=&3\u041E \u043D\u0430\u0432\u044B\u043A\u0435 \u0428\u0430\u0445\u0442\u0435\u0440\u0441\u0442\u0432\u043E:!nasd&e\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,!nasd&e\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.!nasd!nasd&3\u041F\u041E\u041B\u0423\u0427\u0415\u041D\u0418\u0415 \u041E\u041F\u042B\u0422\u0410:!nasd&e\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.!nasd&e\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=&3\u041F\u043E\u0434\u0445\u043E\u0434\u044F\u0449\u0438\u0435 \u0431\u043B\u043E\u043A\u0438:!nasd&e\u041A\u0430\u043C\u0435\u043D\u044C, \u041A\u0430\u043C\u0435\u043D\u043D\u044B\u0439 \u0443\u0433\u043E\u043B\u044C, \u0416\u0435\u043B\u0435\u0437\u043D\u0430\u044F \u0440\u0443\u0434\u0430, \u0417\u043E\u043B\u043E\u0442\u0430\u044F \u0440\u0443\u0434\u0430, \u0410\u043B\u043C\u0430\u0437\u043D\u0430\u044F \u0440\u0443\u0434\u0430,!nasd&e\u0420\u0435\u0434\u0441\u0442\u043E\u0443\u043D\u043E\u0432\u0430\u044F \u0440\u0443\u0434\u0430, \u041B\u0430\u0437\u0443\u0440\u0438\u0442\u043E\u0432\u0430\u044F \u0440\u0443\u0434\u0430, \u041E\u0431\u0441\u0438\u0434\u0438\u0430\u043D, \u0417\u0430\u043C\u0448\u0435\u043B\u044B\u0439 \u0431\u0443\u043B\u044B\u0436\u043D\u0438\u043A,!nasd&e\u042D\u043D\u0434\u0435\u0440\u043D\u044F\u043A, \u0421\u0432\u0435\u0442\u044F\u0449\u0438\u0439\u0441\u044F \u043A\u0430\u043C\u0435\u043D\u044C, \u041D\u0435\u0437\u0435\u0440\u0430\u043A. +Guides.Mining.Section.2=&3\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\u043A\u0440\u0443\u0448\u0438\u0442\u0435\u043B\u044C:!nasd&e\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\u043E\u0434\u0433\u043E\u0442\u043E\u0432\u0438\u0442\u044C \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442.!nasd&e\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 \u043D\u0430\u0447\u0430\u043B\u0430 \u0434\u043E\u0431\u044B\u0447\u0438!nasd&e\u043F\u043E\u0434\u0445\u043E\u0434\u044F\u0449\u0438\u0445 \u0431\u043B\u043E\u043A\u043E\u0432, \u0447\u0442\u043E \u0430\u043A\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u0421\u0443\u043F\u0435\u0440\u043A\u0440\u0443\u0448\u0438\u0442\u0435\u043B\u044C. Guides.Mining.Section.3=&3\u0427\u0442\u043E \u0442\u0430\u043A\u043E\u0435 \u0421\u0443\u043F\u0435\u0440\u043A\u0440\u0443\u0448\u0438\u0442\u0435\u043B\u044C?!nasd&e\u0421\u0443\u043F\u0435\u0440\u043A\u0440\u0443\u0448\u0438\u0442\u0435\u043B\u044C - \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.!nasd&e\u041E\u043D\u043E \u0443\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u0448\u0430\u043D\u0441 \u043F\u043E\u043B\u0443\u0447\u0438\u0442\u044C \u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0435 \u043F\u0440\u0435\u0434\u043C\u0435\u0442\u044B \u0438!nasd&e\u0440\u0430\u0437\u0440\u0443\u0448\u0430\u0435\u0442 \u043F\u043E\u0434\u0445\u043E\u0434\u044F\u0449\u0438\u0435 \u0431\u043B\u043E\u043A\u0438 \u0441 \u043E\u0434\u043D\u043E\u0433\u043E \u0443\u0434\u0430\u0440\u0430. -Guides.Mining.Section.4=&3\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 \u0434\u043E\u0431\u044B\u0447\u0430\\:!nasd&e\u0421 \u043A\u0438\u0440\u043A\u043E\u0439 \u0432 \u0440\u0443\u043A\u0435,!nasd&e\u043F\u0440\u0438\u0441\u044F\u0434\u044C\u0442\u0435 \u0438 \u043D\u0430\u0436\u043C\u0438\u0442\u0435 \u041F\u041A\u041C \u043F\u043E \u0434\u0438\u043D\u0430\u043C\u0438\u0442\u0443 \u0441 \u0440\u0430\u0441\u0441\u0442\u043E\u044F\u043D\u0438\u044F. \u042D\u0442\u043E !nasd&e\u043C\u0433\u043D\u043E\u0432\u0435\u043D\u043D\u043E \u043F\u0440\u0438\u0432\u0435\u0434\u0435\u0442 \u043A \u043F\u043E\u0434\u0440\u044B\u0432\u0443 \u0434\u0438\u043D\u0430\u043C\u0438\u0442\u0430. +Guides.Mining.Section.4=&3\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 \u0434\u043E\u0431\u044B\u0447\u0430:!nasd&e\u0421 \u043A\u0438\u0440\u043A\u043E\u0439 \u0432 \u0440\u0443\u043A\u0435,!nasd&e\u043F\u0440\u0438\u0441\u044F\u0434\u044C\u0442\u0435 \u0438 \u043D\u0430\u0436\u043C\u0438\u0442\u0435 \u041F\u041A\u041C \u043F\u043E \u0434\u0438\u043D\u0430\u043C\u0438\u0442\u0443 \u0441 \u0440\u0430\u0441\u0441\u0442\u043E\u044F\u043D\u0438\u044F. \u042D\u0442\u043E !nasd&e\u043C\u0433\u043D\u043E\u0432\u0435\u043D\u043D\u043E \u043F\u0440\u0438\u0432\u0435\u0434\u0435\u0442 \u043A \u043F\u043E\u0434\u0440\u044B\u0432\u0443 \u0434\u0438\u043D\u0430\u043C\u0438\u0442\u0430. Guides.Mining.Section.5=&3\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 \u0434\u043E\u0431\u044B\u0447\u0430?!nasd&e\u041F\u043E\u0434\u0440\u044B\u0432\u043D\u0430\u044F \u0434\u043E\u0431\u044B\u0447\u0430 - \u0443\u043C\u0435\u043D\u0438\u0435 \u0441 \u043E\u0442\u043A\u0430\u0442\u043E\u043C, \u0441\u0432\u044F\u0437\u0430\u043D\u043D\u043E\u0435 \u0441 \u043D\u0430\u0432\u044B\u043A\u043E\u043C!nasd&e\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 \u0434\u043E\u0431\u044B\u0447\u0435 \u0441 \u0434\u0438\u043D\u0430\u043C\u0438\u0442\u043E\u043C \u0438 \u043F\u043E\u0437\u0432\u043E\u043B\u044F\u0435\u0442!nasd&e\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\u043E\u0431\u0435\u043D\u043D\u043E\u0441\u0442\u0438 \u041F\u043E\u0434\u0440\u044B\u0432\u043D\u043E\u0439 \u0434\u043E\u0431\u044B\u0447\u0438. !nasd&e\u041F\u0435\u0440\u0432\u0430\u044F - \u0443\u043C\u0435\u043D\u0438\u0435 \u0411\u043E\u043B\u044C\u0448\u0438\u0435 \u0431\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!nasd&e\u0432\u0437\u0440\u044B\u0432\u0430 \u0434\u0438\u043D\u0430\u043C\u0438\u0442\u0430. \u0412\u0442\u043E\u0440\u0430\u044F - \u0443\u043C\u0435\u043D\u0438\u0435 \u042D\u043A\u0441\u043F\u0435\u0440\u0442\u0438\u0437\u0430 \u043F\u043E\u0434\u0440\u044B\u0432\u043E\u0432, \u043A\u043E\u0442\u043E\u0440\u043E\u0435 \u0443\u043C\u0435\u043D\u044C\u0448\u0430\u0435\u0442 !nasd&e\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!nasd&e\u0434\u043E\u0431\u044B\u0447\u0438 \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\u043E\u0431\u044B\u0447\u0438 \u043F\u043E\u043B\u0435\u0437\u043D\u044B\u0445 \u0440\u0443\u0434. ##Repair -Guides.Repair.Section.0=&3\u041E \u043D\u0430\u0432\u044B\u043A\u0435 \u0420\u0435\u043C\u043E\u043D\u0442\\:!nasd&e\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!nasd&e\u0431\u0440\u043E\u043D\u0438 \u0438 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u043E\u0432.!nasd!nasd&3\u041F\u043E\u043B\u0443\u0447\u0435\u043D\u0438\u0435 \u043E\u043F\u044B\u0442\u0430\\:!nasd&e\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 \u043D\u0430\u043A\u043E\u0432\u0430\u043B\u044C\u043D\u044E mcMMO. !nasd&e\u041D\u0430\u043A\u043E\u0432\u0430\u043B\u044C\u043D\u0435\u0439 \u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u043F\u043E\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u043D\u044B\u0439 \u0436\u0435\u043B\u0435\u0437\u043D\u044B\u0439 \u0431\u043B\u043E\u043A, \u0438 \u0435\u0451!nasd&e\u043D\u0435 \u0441\u043B\u0435\u0434\u0443\u0435\u0442 \u043F\u0443\u0442\u0430\u0442\u044C \u0441 \u043E\u0431\u044B\u0447\u043D\u043E\u0439 \u043D\u0430\u043A\u043E\u0432\u0430\u043B\u044C\u043D\u0435\u0439. +Guides.Repair.Section.0=&3\u041E \u043D\u0430\u0432\u044B\u043A\u0435 \u0420\u0435\u043C\u043E\u043D\u0442:!nasd&e\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!nasd&e\u0431\u0440\u043E\u043D\u0438 \u0438 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u043E\u0432.!nasd!nasd&3\u041F\u043E\u043B\u0443\u0447\u0435\u043D\u0438\u0435 \u043E\u043F\u044B\u0442\u0430:!nasd&e\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 \u043D\u0430\u043A\u043E\u0432\u0430\u043B\u044C\u043D\u044E mcMMO. !nasd&e\u041D\u0430\u043A\u043E\u0432\u0430\u043B\u044C\u043D\u0435\u0439 \u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u043F\u043E\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u043D\u044B\u0439 \u0436\u0435\u043B\u0435\u0437\u043D\u044B\u0439 \u0431\u043B\u043E\u043A, \u0438 \u0435\u0451!nasd&e\u043D\u0435 \u0441\u043B\u0435\u0434\u0443\u0435\u0442 \u043F\u0443\u0442\u0430\u0442\u044C \u0441 \u043E\u0431\u044B\u0447\u043D\u043E\u0439 \u043D\u0430\u043A\u043E\u0432\u0430\u043B\u044C\u043D\u0435\u0439. Guides.Repair.Section.1=&3\u041A\u0430\u043A \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u043D\u0430\u0432\u044B\u043A \u0420\u0435\u043C\u043E\u043D\u0442?!nasd&e\u0420\u0430\u0437\u043C\u0435\u0441\u0442\u0438\u0442\u0435 \u043D\u0430\u043A\u043E\u0432\u0430\u043B\u044C\u043D\u044E mcMMO \u0438 \u043A\u043B\u0438\u043A\u043D\u0438\u0442\u0435 \u043F\u043E \u043D\u0435\u0439 \u041F\u041A\u041C \u0434\u043B\u044F!nasd&e\u043F\u043E\u0447\u0438\u043D\u043A\u0438 \u043F\u0440\u0435\u0434\u043C\u0435\u0442\u0430 \u0432 \u0440\u0443\u043A\u0435. \u0420\u0430\u0441\u0445\u043E\u0434\u0443\u0435\u0442 1 \u0441\u044B\u0440\u044C\u0435 \u0437\u0430 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0435. Guides.Repair.Section.2=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u041C\u0430\u0441\u0442\u0435\u0440\u0441\u0442\u0432\u043E \u0440\u0435\u043C\u043E\u043D\u0442\u0430?!nasd&e\u0423\u043C\u0435\u043D\u0438\u0435 \u041C\u0430\u0441\u0442\u0435\u0440\u0441\u0442\u0432\u043E \u0440\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.!nasd&e\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=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u0421\u0443\u043F\u0435\u0440\u0440\u0435\u043C\u043E\u043D\u0442?!nasd&e\u0421\u0443\u043F\u0435\u0440\u0440\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!nasd&e\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!nasd&e\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=&3\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 \u043A\u043E\u0432\u043A\u0430?!nasd&e\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!nasd&e\u0441 \u043E\u043F\u0440\u0435\u0434\u0435\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. !nasd&e\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,!nasd&e\u0441\u043D\u0438\u0437\u0438\u0442\u044C\u0441\u044F, \u0438\u043B\u0438 \u0432\u043E\u0432\u0441\u0435 \u0438\u0441\u0447\u0435\u0437\u043D\u0443\u0442\u044C. ##Salvage -Guides.Salvage.Section.0=&3\u041E \u0420\u0430\u0437\u0431\u043E\u0440\u043A\u0435\\:!nasd&e\u0420\u0430\u0437\u0431\u043E\u0440\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!nasd&e\u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u043E\u0432.!nasd!nasd&3\u041F\u041E\u041B\u0423\u0427\u0415\u041D\u0418\u0415 \u041E\u041F\u042B\u0422\u0410\\:!nasd&e\u0420\u0430\u0437\u0431\u043E\u0440\u043A\u0430 \u044D\u0442\u043E \u0434\u043E\u0447\u0435\u0440\u043D\u0438\u0439 \u043D\u0430\u0432\u044B\u043A \u041F\u043E\u0447\u0438\u043D\u043A\u0438 \u0438 \u0420\u044B\u0431\u0430\u043B\u043A\u0438. \u0412\u0430\u0448 \u0443\u0440\u043E\u0432\u0435\u043D\u044C!nasd&e\u0440\u0430\u0437\u0431\u043E\u0440\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.0=&3\u041E \u0420\u0430\u0437\u0431\u043E\u0440\u043A\u0435:!nasd&e\u0420\u0430\u0437\u0431\u043E\u0440\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!nasd&e\u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u043E\u0432.!nasd!nasd&3\u041F\u041E\u041B\u0423\u0427\u0415\u041D\u0418\u0415 \u041E\u041F\u042B\u0422\u0410:!nasd&e\u0420\u0430\u0437\u0431\u043E\u0440\u043A\u0430 \u044D\u0442\u043E \u0434\u043E\u0447\u0435\u0440\u043D\u0438\u0439 \u043D\u0430\u0432\u044B\u043A \u041F\u043E\u0447\u0438\u043D\u043A\u0438 \u0438 \u0420\u044B\u0431\u0430\u043B\u043A\u0438. \u0412\u0430\u0448 \u0443\u0440\u043E\u0432\u0435\u043D\u044C!nasd&e\u0440\u0430\u0437\u0431\u043E\u0440\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=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0420\u0430\u0437\u0431\u043E\u0440\u043A\u0430?!nasd&e\u0420\u0430\u0437\u043C\u0435\u0441\u0442\u0438\u0442\u0435 \u0420\u0430\u0437\u0431\u043E\u0440\u043E\u0447\u043D\u0443\u044E \u043D\u0430\u043A\u043E\u0432\u0430\u043B\u044C\u043D\u044E mcMMO \u0438 \u043A\u043B\u0438\u043A\u043D\u0438\u0442\u0435 \u043F\u043E !nasd&e\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. \u042D\u0442\u043E \u0443\u043D\u0438\u0447\u0442\u043E\u0436\u0438\u0442!nasd&e\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\u044B\u0435 \u043D\u0430 \u043D\u0435\u0433\u043E \u043C\u0430\u0442\u0435\u0440\u0438\u0430\u043B\u044B.!nasd!nasd&e\u041D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, \u0440\u0430\u0437\u0431\u043E\u0440\u043A\u0430 \u0436\u0435\u043B\u0435\u0437\u043D\u043E\u0439 \u043A\u0438\u0440\u043A\u0438 \u0432\u0435\u0440\u043D\u0435\u0442 \u0432\u0430\u043C \u0436\u0435\u043B\u0435\u0437\u043D\u044B\u0435 \u0441\u043B\u0438\u0442\u043A\u0438. Guides.Salvage.Section.2=&3\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 \u0440\u0430\u0437\u0431\u043E\u0440\u043A\u0430?!nasd&e\u042D\u0442\u043E \u0443\u043C\u0435\u043D\u0438\u0435 \u043F\u043E\u0437\u0432\u043E\u043B\u044F\u0435\u0442 \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.!nasd&e\u041A\u0430\u0447\u0435\u0441\u0442\u0432\u043E \u0440\u0430\u0437\u0431\u043E\u0440\u043A\u0438 \u043F\u043E\u0432\u044B\u0448\u0430\u0435\u0442\u0441\u044F \u0432\u043C\u0435\u0441\u0442\u0435 \u0441 \u0443\u0440\u043E\u0432\u043D\u0435\u043C. \u0427\u0435\u043C \u043E\u043D\u043E \u0431\u043E\u043B\u044C\u0448\u0435,!nasd&e\u0442\u0435\u043C \u0431\u043E\u043B\u044C\u0448\u0435 \u043C\u0430\u0442\u0435\u0440\u0438\u0430\u043B\u043E\u0432 \u0432\u044B \u0441\u043C\u043E\u0436\u0435\u0442\u0435 \u043F\u043E\u043B\u0443\u0447\u0438\u0442\u044C \u043E\u0431\u0440\u0430\u0442\u043D\u043E.!nasd&e\u0421 \u0423\u043B\u0443\u0447\u0448\u0435\u043D\u043D\u043E\u0439 \u0440\u0430\u0437\u0431\u043E\u0440\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,!nasd&e\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 \u043F\u043E\u0432\u0440\u0435\u0436\u0434\u0435\u043D. \u0412\u0430\u043C \u043D\u0435 \u043D\u0443\u0436\u043D\u043E \u0432\u043E\u043B\u043D\u043E\u0432\u0430\u0442\u044C\u0441\u044F!nasd&e\u043E\u0431 \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=&3\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\\:!nasd&e\u041F\u0440\u0435\u0434\u043F\u043E\u043B\u043E\u0436\u0438\u043C \u043C\u044B \u0440\u0430\u0437\u0431\u0438\u0440\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%.!nasd&e\u042D\u0442\u043E \u0437\u043D\u0430\u0447\u0438\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!nasd&e\u043F\u043E\u043B\u0443\u0447\u0438\u0442\u044C - \u0432\u0441\u0435\u0433\u043E 2 (\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!nasd&e33,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\u0435 \u043A\u0430\u0447\u0435\u0441\u0442\u0432\u043E!nasd&e\u0440\u0430\u0437\u0431\u043E\u0440\u043A\u0438 \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.!nasd&e\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 "\u043F\u043E\u043B\u043D\u0443\u044E \u0441\u0442\u043E\u0438\u043C\u043E\u0441\u0442\u044C",!nasd&e\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.3=&3\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:!nasd&e\u041F\u0440\u0435\u0434\u043F\u043E\u043B\u043E\u0436\u0438\u043C \u043C\u044B \u0440\u0430\u0437\u0431\u0438\u0440\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%.!nasd&e\u042D\u0442\u043E \u0437\u043D\u0430\u0447\u0438\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!nasd&e\u043F\u043E\u043B\u0443\u0447\u0438\u0442\u044C - \u0432\u0441\u0435\u0433\u043E 2 (\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!nasd&e33,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\u0435 \u043A\u0430\u0447\u0435\u0441\u0442\u0432\u043E!nasd&e\u0440\u0430\u0437\u0431\u043E\u0440\u043A\u0438 \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.!nasd&e\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 "\u043F\u043E\u043B\u043D\u0443\u044E \u0441\u0442\u043E\u0438\u043C\u043E\u0441\u0442\u044C",!nasd&e\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=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u041C\u0430\u0433\u0438\u0447\u0435\u0441\u043A\u0430\u044F \u0440\u0430\u0437\u0431\u043E\u0440\u043A\u0430?!nasd&e\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!nasd&e\u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u0442\u0435 \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!nasd&e\u0432\u044B \u043C\u043E\u0436\u0435\u0442\u0435 \u043F\u043E\u043B\u0443\u0447\u0438\u0442\u044C \u043F\u043E\u043B\u043D\u0443\u044E \u0432\u0441\u0435 \u0438\u043B\u0438 \u043B\u0438\u0448\u044C \u0447\u0430\u0441\u0442\u044C \u0437\u0430\u0447\u0430\u0440\u043E\u0432\u0430\u043D\u0438\u0439.!nasd!nasd&e\u041A\u043E\u0433\u0434\u0430 \u0432\u044B \u0438\u0437\u0432\u043B\u0435\u043A\u0430\u0435\u0442\u0435 \u0447\u0430\u0441\u0442\u044C \u0437\u0430\u0447\u0430\u0440\u043E\u0432\u0430\u043D\u0438\u0439, \u0442\u043E \u0437\u0430\u0447\u0430\u0440\u043E\u0432\u0430\u043D\u0438\u044F!nasd&e\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\u044F,!nasd&e\u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u0431\u044B\u043B\u0438 \u043D\u0430 \u043F\u0440\u0435\u0434\u043C\u0435\u0442\u0435. ##Smelting Guides.Smelting.Section.0=\u0421\u043A\u043E\u0440\u043E... ##Swords -Guides.Swords.Section.0=&3\u041E \u043D\u0430\u0432\u044B\u043A\u0435 \u041C\u0435\u0447\u0438\\:!nasd&e\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.!nasd!nasd&3\u041F\u041E\u041B\u0423\u0427\u0415\u041D\u0418\u0415 \u041E\u041F\u042B\u0422\u0410\\:!nasd&e\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!nasd&e\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.0=&3\u041E \u043D\u0430\u0432\u044B\u043A\u0435 \u041C\u0435\u0447\u0438:!nasd&e\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.!nasd!nasd&3\u041F\u041E\u041B\u0423\u0427\u0415\u041D\u0418\u0415 \u041E\u041F\u042B\u0422\u0410:!nasd&e\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!nasd&e\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=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u0420\u0443\u0431\u044F\u0449\u0438\u0439 \u0443\u0434\u0430\u0440?!nasd&e\u0420\u0443\u0431\u044F\u0449\u0438\u0439 \u0443\u0434\u0430\u0440 - \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!nasd&e\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!nasd&e\u0443\u0434\u0430\u0440 \u043F\u043E \u043E\u0431\u043B\u0430\u0441\u0442\u0438, \u0447\u0442\u043E \u043D\u0430\u043D\u043E\u0441\u044F\u0449\u0438\u0439 \u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u043E 25% \u0443\u0440\u043E\u043D\u0430!nasd&e\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=&3\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?!nasd&e\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!nasd&e\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=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u0420\u0430\u0437\u0440\u044B\u0432?!nasd&e\u0420\u044B\u0437\u0440\u044B\u0432 \u043D\u0430\u043D\u043E\u0441\u0438\u0442 \u043F\u0440\u043E\u0442\u0438\u0432\u043D\u0438\u043A\u0430\u043C \u0443\u0440\u043E\u043D \u043A\u0430\u0436\u0434\u044B\u0435 2 \u0441\u0435\u043A\u0443\u043D\u0434\u044B.!nasd&e\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!nasd&e\u0438\u043B\u0438 \u043D\u0435 \u043D\u0430\u0441\u0442\u0443\u043F\u0438\u0442 \u0441\u043C\u0435\u0440\u0442\u044C.!nasd&e\u041F\u0440\u043E\u0434\u043E\u043B\u0436\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u044C \u044D\u0444\u0444\u0435\u043A\u0442\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043E\u0442 \u0443\u0440\u043E\u0432\u043D\u044F \u043D\u0430\u0432\u044B\u043A\u0430 \u041C\u0435\u0447\u0435\u0439. ##Taming -Guides.Taming.Section.0=&3\u041E \u043D\u0430\u0432\u044B\u043A\u0435 \u0423\u043A\u0440\u043E\u0449\u0435\u043D\u0438\u0435\\:!nasd&e\u0423\u043A\u0440\u043E\u0449\u0435\u043D\u0438\u0435 \u0434\u0430\u0435\u0442 \u0440\u0430\u0437\u043B\u0438\u0447\u043D\u044B\u0435 \u0431\u043E\u043D\u0443\u0441\u044B \u0432 \u0431\u0438\u0442\u0432\u0430\u0445 \u0432\u043C\u0435\u0441\u0442\u0435!nasd&e\u0441 \u043F\u0440\u0438\u0440\u0443\u0447\u0435\u043D\u043D\u044B\u043C\u0438 \u0432\u043E\u043B\u043A\u0430\u043C\u0438.!nasd!nasd&3\u041F\u041E\u041B\u0423\u0427\u0415\u041D\u0418\u0415 \u041E\u041F\u042B\u0422\u0410\\:!nasd&e\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!nasd&e\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.0=&3\u041E \u043D\u0430\u0432\u044B\u043A\u0435 \u0423\u043A\u0440\u043E\u0449\u0435\u043D\u0438\u0435:!nasd&e\u0423\u043A\u0440\u043E\u0449\u0435\u043D\u0438\u0435 \u0434\u0430\u0435\u0442 \u0440\u0430\u0437\u043B\u0438\u0447\u043D\u044B\u0435 \u0431\u043E\u043D\u0443\u0441\u044B \u0432 \u0431\u0438\u0442\u0432\u0430\u0445 \u0432\u043C\u0435\u0441\u0442\u0435!nasd&e\u0441 \u043F\u0440\u0438\u0440\u0443\u0447\u0435\u043D\u043D\u044B\u043C\u0438 \u0432\u043E\u043B\u043A\u0430\u043C\u0438.!nasd!nasd&3\u041F\u041E\u041B\u0423\u0427\u0415\u041D\u0418\u0415 \u041E\u041F\u042B\u0422\u0410:!nasd&e\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!nasd&e\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=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u0417\u043E\u0432 \u043F\u0440\u0438\u0440\u043E\u0434\u044B?!nasd&e\u0417\u043E\u0432 \u043F\u0440\u0438\u0440\u043E\u0434\u044B - \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!nasd&e\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!nasd&e\u0441\u0434\u0435\u043B\u0430\u0442\u044C \u043F\u0440\u0438\u0441\u0435\u0432 \u0438 \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=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u041F\u043E\u0437\u043D\u0430\u043D\u0438\u0435 \u0437\u0432\u0435\u0440\u0435\u0439?!nasd&e\u041F\u043E\u0437\u043D\u0430\u043D\u0438\u0435 \u0437\u0432\u0435\u0440\u0435\u0439 \u043F\u043E\u0437\u0432\u043E\u043B\u044F\u0435\u0442 \u043F\u0440\u043E\u0432\u0435\u0440\u044F\u0442\u044C \u043F\u0438\u0442\u043E\u043C\u0446\u0435\u0432!nasd&e\u0438 \u043F\u043E\u043B\u0443\u0447\u0430\u0442\u044C \u0441\u0442\u0430\u0442\u044B \u043E \u043D\u0438\u0445. \u041A\u043B\u0438\u043A\u043D\u0438\u0442\u0435 \u041B\u041A\u041C \u043A\u043E\u0441\u0442\u044C\u044E \u043F\u043E \u0432\u043E\u043B\u043A\u0443 \u0438\u043B\u0438 !nasd&e\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 \u041F\u043E\u0437\u043D\u0430\u043D\u0438\u0435 \u0437\u0432\u0435\u0440\u0435\u0439. Guides.Taming.Section.3=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u0423\u043A\u0443\u0441?!nasd&e\u0423\u043A\u0443\u0441 - \u043F\u0430\u0441\u0441\u0438\u0432\u043D\u043E\u0435 \u0443\u043C\u0435\u043D\u0438\u0435, \u0434\u0430\u044E\u0449\u0435\u0435 \u0448\u0430\u043D\u0441 \u0442\u043E\u0433\u043E, \u0447\u0442\u043E!nasd&e\u0430\u0442\u0430\u043A\u0430 \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. @@ -955,40 +958,40 @@ Guides.Taming.Section.6=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u043 Guides.Taming.Section.7=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u0423\u0434\u0430\u0440\u043E\u043F\u0440\u043E\u0447\u043D\u043E\u0441\u0442\u044C?!nasd&e\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\u044E\u0449\u0435\u0435 \u043F\u043E\u043B\u0443\u0447\u0430\u0435\u043C\u044B\u0439!nasd&e\u0432\u0430\u0448\u0438\u043C\u0438 \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=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u0411\u044B\u0441\u0442\u0440\u043E\u0435 \u043F\u0438\u0442\u0430\u043D\u0438\u0435?!nasd&e\u042D\u0442\u043E \u043F\u0430\u0441\u0441\u0438\u0432\u043D\u043E\u0435 \u0443\u043C\u0435\u043D\u0438\u0435, \u0434\u0430\u044E\u0449\u0435\u0435 \u0432\u0430\u0448\u0438\u043C \u0432\u043E\u043B\u043A\u0430\u043C \u0448\u0430\u043D\u0441!nasd&e\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=&3\u041E \u043D\u0430\u0432\u044B\u043A\u0435 \u0411\u0435\u0437\u043E\u0440\u0443\u0436\u043D\u044B\u0439\\:!nasd&e\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!nasd&e\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.!nasd!nasd&3\u041F\u041E\u041B\u0423\u0427\u0415\u041D\u0418\u0415 \u041E\u041F\u042B\u0422\u0410\\:!nasd&e\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!nasd&e\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.0=&3\u041E \u043D\u0430\u0432\u044B\u043A\u0435 \u0411\u0435\u0437\u043E\u0440\u0443\u0436\u043D\u044B\u0439:!nasd&e\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!nasd&e\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.!nasd!nasd&3\u041F\u041E\u041B\u0423\u0427\u0415\u041D\u0418\u0415 \u041E\u041F\u042B\u0422\u0410:!nasd&e\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!nasd&e\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=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u0411\u0435\u0440\u0441\u0435\u0440\u043A?!nasd&e\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.!nasd&e\u0412 \u0440\u0435\u0436\u0438\u043C\u0435 \u0431\u0435\u0440\u0441\u0435\u0440\u043A\u0430 \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!nasd&e\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 \u043D\u0435\u0442\u0432\u0435\u0440\u0434\u044B \u0431\u043B\u043E\u043A\u0438, \u0432\u0440\u043E\u0434\u0435 \u0437\u0435\u043C\u043B\u0438 \u0438 \u0434\u0435\u0440\u043D\u0430. Guides.Unarmed.Section.2=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u0421\u0442\u0438\u043B\u044C \u0421\u0442\u0430\u043B\u044C\u043D\u043E\u0433\u043E \u043A\u0443\u043B\u0430\u043A\u0430?!nasd&e\u0421\u0442\u0438\u043B\u044C \u0421\u0442\u0430\u043B\u044C\u043D\u043E\u0433\u043E \u043A\u0443\u043B\u0430\u043A\u0430 \u0443\u0432\u0435\u043B\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0443\u0440\u043E\u043D, \u043D\u0430\u043D\u043E\u0441\u0438\u043C\u044B\u0439!nasd&e\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=&3\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 \u0441\u0442\u0440\u0435\u043B?!nasd&e\u041E\u0442\u0440\u0430\u0436\u0435\u043D\u0438\u0435 \u0441\u0442\u0440\u0435\u043B - \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!nasd&e\u043E\u0442\u0440\u0430\u0436\u0430\u0442\u044C \u0441\u0442\u0440\u0435\u043B\u044B, \u0432\u044B\u043F\u0443\u0449\u0435\u043D\u043D\u044B\u0435 \u0441\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.!nasd&e\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\u0438\u043D\u0435\u043D\u0438\u044F \u0432\u0430\u043C \u0432\u0440\u0435\u0434\u0430. Guides.Unarmed.Section.4=&3\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 \u0445\u0432\u0430\u0442\u043A\u0430?!nasd&e\u0416\u0435\u043B\u0435\u0437\u043D\u0430\u044F \u0445\u0432\u0430\u0442\u043A\u0430 - \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!nasd&e\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=&3\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?!nasd&e\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\u044E\u0449\u0435\u0435 \u0440\u0430\u0437\u043E\u0440\u0443\u0436\u0430\u0442\u044C \u0434\u0440\u0443\u0433\u0438\u0445 \u0438\u0433\u0440\u043E\u043A\u043E\u0432,!nasd&e\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=&3\u041E \u043D\u0430\u0432\u044B\u043A\u0435 \u041B\u0435\u0441\u043E\u0440\u0443\u0431\u0441\u0442\u0432\u043E\\:!nasd&e\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.!nasd!nasd&3\u041F\u041E\u041B\u0423\u0427\u0415\u041D\u0418\u0415 \u041E\u041F\u042B\u0422\u0410\\:!nasd&e\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.0=&3\u041E \u043D\u0430\u0432\u044B\u043A\u0435 \u041B\u0435\u0441\u043E\u0440\u0443\u0431\u0441\u0442\u0432\u043E:!nasd&e\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.!nasd!nasd&3\u041F\u041E\u041B\u0423\u0427\u0415\u041D\u0418\u0415 \u041E\u041F\u042B\u0422\u0410:!nasd&e\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=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u0414\u0440\u043E\u0432\u043E\u0441\u0435\u043A?!nasd&e\u0414\u0440\u043E\u0432\u043E\u0441\u0435\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!nasd&e\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, !nasd&e\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, \u0430 \u0432\u0441\u0435 \u0431\u043B\u043E\u043A\u0438 \u0434\u0440\u0435\u0432\u0435\u0441\u0438\u043D\u044B!nasd&e\u0432\u044B\u043F\u0430\u0434\u0443\u0442 \u0437\u0430 \u0440\u0430\u0437. Guides.Woodcutting.Section.2=&3\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 \u043B\u0438\u0441\u0442\u044C\u0435\u0432?!nasd&e\u0421\u0434\u0443\u0432\u0430\u0442\u0435\u043B\u044C \u043B\u0438\u0441\u0442\u044C\u0435\u0432 - \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!nasd&e\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. !nasd&e\u042D\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=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u0414\u0432\u043E\u0439\u043D\u0430\u044F \u0434\u043E\u0431\u044B\u0447\u0430?!nasd&e\u042D\u0442\u043E \u043F\u0430\u0441\u0441\u0438\u0432\u043D\u043E\u0435 \u0443\u043C\u0435\u043D\u0438\u0435, \u0434\u0430\u044E\u0449\u0435\u0435 \u0448\u0430\u043D\u0441 \u0432\u044B\u043F\u0430\u0434\u0435\u043D\u0438\u044F!nasd&e\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. #INSPECT -Inspect.Offline= &c\u0423 \u0432\u0430\u0441 \u043D\u0435\u0442 \u043F\u0440\u0430\u0432 \u043F\u0440\u043E\u0432\u0435\u0440\u044F\u0442\u044C \u0438\u0433\u0440\u043E\u043A\u043E\u0432 \u043D\u0435 \u0432 \u0441\u0435\u0442\u0438\\! +Inspect.Offline= &c\u0423 \u0432\u0430\u0441 \u043D\u0435\u0442 \u043F\u0440\u0430\u0432 \u043F\u0440\u043E\u0432\u0435\u0440\u044F\u0442\u044C \u0438\u0433\u0440\u043E\u043A\u043E\u0432 \u043D\u0435 \u0432 \u0441\u0435\u0442\u0438! Inspect.OfflineStats=\u0421\u0442\u0430\u0442\u044B mcMMO \u0438\u0433\u0440\u043E\u043A\u0430 \u043D\u0435 \u0441\u0435\u0442\u0438 &e{0} Inspect.Stats=&a\u0421\u0442\u0430\u0442\u044B mcMMO &e{0} -Inspect.TooFar=\u0412\u044B \u0441\u043B\u0438\u0448\u043A\u043E\u043C \u0434\u0430\u043B\u0435\u043A\u043E, \u0447\u0442\u043E\u0431\u044B \u043F\u0440\u043E\u0432\u0435\u0440\u044F\u0442\u044C \u044D\u0442\u043E\u0433\u043E \u0438\u0433\u0440\u043E\u043A\u0430\\! +Inspect.TooFar=\u0412\u044B \u0441\u043B\u0438\u0448\u043A\u043E\u043C \u0434\u0430\u043B\u0435\u043A\u043E, \u0447\u0442\u043E\u0431\u044B \u043F\u0440\u043E\u0432\u0435\u0440\u044F\u0442\u044C \u044D\u0442\u043E\u0433\u043E \u0438\u0433\u0440\u043E\u043A\u0430! #ITEMS -Item.ChimaeraWing.Fail=&c**\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.Fail=&c**\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** Item.ChimaeraWing.Name=\u041A\u0440\u044B\u043B\u044C\u044F \u0425\u0438\u043C\u0435\u0440\u044B Item.ChimaeraWing.Lore=&7\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 \u0435\u0449\u0451 &e{0}&c \u0448\u0442\u0443\u043A &6{1}&c\\! -Item.NotEnough=\u0412\u0430\u043C \u043D\u0443\u0436\u043D\u043E \u0435\u0449\u0451 &e{0}&c \u0448\u0442\u0443\u043A &6{1}&c\\! -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\\! &e({0}\u0441) +Item.ChimaeraWing.NotEnough=\u0412\u0430\u043C \u043D\u0443\u0436\u043D\u043E \u0435\u0449\u0451 &e{0}&c \u0448\u0442\u0443\u043A &6{1}&c! +Item.NotEnough=\u0412\u0430\u043C \u043D\u0443\u0436\u043D\u043E \u0435\u0449\u0451 &e{0}&c \u0448\u0442\u0443\u043A &6{1}&c! +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! &e({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. &e({0}s) Item.FluxPickaxe.Name=\u0424\u043B\u044E\u0441\u043E\u0432\u0430\u044F \u043A\u0438\u0440\u043A\u0430 Item.FluxPickaxe.Lore.1=&7\u0418\u043C\u0435\u0435\u0442 \u0448\u0430\u043D\u0441 \u043C\u0433\u043D\u043E\u0432\u0435\u043D\u043D\u043E \u043F\u0435\u0440\u0435\u043F\u043B\u0430\u0432\u0438\u0442\u044C \u0440\u0443\u0434\u0443. Item.FluxPickaxe.Lore.2=&7\u041D\u0443\u0436\u0435\u043D \u0443\u0440\u043E\u0432\u0435\u043D\u044C \u041F\u0435\u0440\u0435\u043F\u043B\u0430\u0432\u043A\u0438 {0}+ #TELEPORTATION Teleport.Commencing=&7\u0422\u0435\u043B\u0435\u043F\u043E\u0440\u0442\u0430\u0446\u0438\u044F \u0447\u0435\u0440\u0435\u0437 &6({0}) &7\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=&4\u0422\u0435\u043B\u0435\u043F\u043E\u0440\u0442\u0430\u0446\u0438\u044F \u043E\u0442\u043C\u0435\u043D\u0435\u043D\u0430\\! +Teleport.Cancelled=&4\u0422\u0435\u043B\u0435\u043F\u043E\u0440\u0442\u0430\u0446\u0438\u044F \u043E\u0442\u043C\u0435\u043D\u0435\u043D\u0430! #SKILLS Skills.Child=&6(\u0414\u041E\u0427\u0415\u0420\u041D\u0418\u0419 \u041D\u0410\u0412\u042B\u041A) -Skills.Disarmed=&4\u0412\u044B \u043E\u0431\u0435\u0437\u043E\u0440\u0443\u0436\u0435\u043D\u044B\\! +Skills.Disarmed=&4\u0412\u044B \u043E\u0431\u0435\u0437\u043E\u0440\u0443\u0436\u0435\u043D\u044B! Skills.Header=-----[] &a{0}&c []----- Skills.NeedMore=&4\u0412\u0430\u043C \u043D\u0443\u0436\u043D\u043E \u0431\u043E\u043B\u044C\u0448\u0435 &7{0} Skills.NeedMore.Extra=&4\u0412\u0430\u043C \u043D\u0443\u0436\u043D\u043E \u0431\u043E\u043B\u044C\u0448\u0435 &7{0}{1} @@ -999,13 +1002,13 @@ Skills.MaxXP=\u041C\u0430\u043A\u0441. 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. &e({0}\u0441) Skills.TooTired.Named=&7(&6{0}&e {1}\u0441&7) Skills.TooTired.Extra=&6{0} &e\u041E\u0442\u043A\u0430\u0442\u044B \u0441\u0443\u043F\u0435\u0440\u0443\u043C\u0435\u043D\u0438\u0439 - {1} -Skills.Cancelled=&7{0} &c\u043E\u0442\u043C\u0435\u043D\u0435\u043D\\! +Skills.Cancelled=&7{0} &c\u043E\u0442\u043C\u0435\u043D\u0435\u043D! Skills.ConfirmOrCancel=&a\u041D\u0430\u0436\u043C\u0438\u0442\u0435 \u041F\u041A\u041C \u0435\u0449\u0451 \u0440\u0430\u0437 \u0434\u043B\u044F \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043D\u0438\u044F &6{0}&a. \u041B\u041A\u041C \u0434\u043B\u044F \u043E\u0442\u043C\u0435\u043D\u044B. Skills.AbilityGateRequirementFail=&7\u0412\u0430\u043C \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E \u0435\u0449\u0451 &e{0}&7 \u0443\u0440\u043E\u0432\u043D\u0435\u0439 &3{1}&7, \u0447\u0442\u043E\u0431\u044B \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u0434\u0430\u043D\u043D\u043E\u0435 \u0443\u043C\u0435\u043D\u0438\u0439. #STATISTICS -Stats.Header.Combat=&6-\\=\u0411\u041E\u0415\u0412\u042B\u0415 \u041D\u0410\u0412\u042B\u041A\u0418\\=- -Stats.Header.Gathering=&6-\\=\u041D\u0410\u0412\u042B\u041A\u0418 \u0421\u0411\u041E\u0420\u0410\\=- -Stats.Header.Misc=&6-\\=\u0420\u0410\u0417\u041D\u042B\u0415 \u041D\u0410\u0412\u042B\u041A\u0418\\=- +Stats.Header.Combat=&6-=\u0411\u041E\u0415\u0412\u042B\u0415 \u041D\u0410\u0412\u042B\u041A\u0418=- +Stats.Header.Gathering=&6-=\u041D\u0410\u0412\u042B\u041A\u0418 \u0421\u0411\u041E\u0420\u0410=- +Stats.Header.Misc=&6-=\u0420\u0410\u0417\u041D\u042B\u0415 \u041D\u0410\u0412\u042B\u041A\u0418=- Stats.Own.Stats=&a[mcMMO] \u0421\u0442\u0430\u0442\u044B #PERKS Perks.XP.Name=\u041E\u043F\u044B\u0442 @@ -1028,26 +1031,26 @@ Hardcore.DeathStatLoss.PercentageChanged=&6[mcMMO] \u041F\u0440\u043E\u0446\u043 Hardcore.Vampirism.Name=\u0412\u0430\u043C\u043F\u0438\u0440\u0438\u0437\u043C Hardcore.Vampirism.Killer.Failure=&6[mcMMO] &e{0}&7 \u0431\u044B\u043B \u0441\u043B\u0438\u0448\u043A\u043E\u043C \u043D\u0435\u0443\u043C\u0435\u043B, \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=&6[mcMMO] &3\u0412\u044B \u0443\u043A\u0440\u0430\u043B\u0438 &9{0}&3 \u0443\u0440\u043E\u0432\u043D\u0435\u0439 \u0443 &e{1}. -Hardcore.Vampirism.Victim.Failure=&6[mcMMO] &e{0}&7 \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=&6[mcMMO] &e{0}&4 \u0443\u043A\u0440\u0430\u043B \u0443 \u0432\u0430\u0441 &9{1}&4 \u0443\u0440\u043E\u0432\u043D\u0435\u0439\\! +Hardcore.Vampirism.Victim.Failure=&6[mcMMO] &e{0}&7 \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=&6[mcMMO] &e{0}&4 \u0443\u043A\u0440\u0430\u043B \u0443 \u0432\u0430\u0441 &9{1}&4 \u0443\u0440\u043E\u0432\u043D\u0435\u0439! Hardcore.Vampirism.PercentageChanged=&6[mcMMO] \u041F\u0440\u043E\u0446\u0435\u043D\u0442 \u043F\u043E\u0433\u043B\u043E\u0449\u0435\u043D\u0438\u044F \u0441\u0442\u0430\u0442\u043E\u0432 \u0431\u044B\u043B \u0438\u0437\u043C\u0435\u043D\u0435\u043D \u043D\u0430 {0}. #MOTD -MOTD.Donate=&3\u041F\u043E\u0436\u0435\u0440\u0442\u0432\u043E\u0432\u0430\u043D\u0438\u044F\\: -MOTD.Hardcore.Enabled=&6[mcMMO] &3\u0420\u0435\u0436\u0438\u043C \u0445\u0430\u0440\u0434\u043A\u043E\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D\\: &4{0} -MOTD.Hardcore.DeathStatLoss.Stats=&6[mcMMO] &3\u0428\u0442\u0440\u0430\u0444 \u043D\u0430\u0432\u044B\u043A\u043E\u0432 \u0437\u0430 \u0441\u043C\u0435\u0440\u0442\u044C\\: &4{0}% -MOTD.Hardcore.Vampirism.Stats=&6[mcMMO] &3\u041F\u043E\u0433\u043B\u043E\u0449\u0435\u043D\u0438\u0435 \u0441\u0442\u0430\u0442\u043E\u0432 \u043E\u0442 \u0412\u0430\u043C\u043F\u0438\u0440\u0438\u0437\u043C\u0430\\: &4{0}% +MOTD.Donate=&3\u041F\u043E\u0436\u0435\u0440\u0442\u0432\u043E\u0432\u0430\u043D\u0438\u044F: +MOTD.Hardcore.Enabled=&6[mcMMO] &3\u0420\u0435\u0436\u0438\u043C \u0445\u0430\u0440\u0434\u043A\u043E\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D: &4{0} +MOTD.Hardcore.DeathStatLoss.Stats=&6[mcMMO] &3\u0428\u0442\u0440\u0430\u0444 \u043D\u0430\u0432\u044B\u043A\u043E\u0432 \u0437\u0430 \u0441\u043C\u0435\u0440\u0442\u044C: &4{0}% +MOTD.Hardcore.Vampirism.Stats=&6[mcMMO] &3\u041F\u043E\u0433\u043B\u043E\u0449\u0435\u043D\u0438\u0435 \u0441\u0442\u0430\u0442\u043E\u0432 \u043E\u0442 \u0412\u0430\u043C\u043F\u0438\u0440\u0438\u0437\u043C\u0430: &4{0}% MOTD.PerksPrefix=&6[mcMMO \u043E\u0441\u043E\u0431\u0435\u043D\u043D\u043E\u0441\u0442\u0438] MOTD.Version=&6[mcMMO] \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F \u0432\u0435\u0440\u0441\u0438\u044F &3{0} MOTD.Website=&6[mcMMO] &a{0}&e - \u0441\u0430\u0439\u0442 mcMMO #SMELTING Smelting.SubSkill.UnderstandingTheArt.Name=\u041F\u043E\u043D\u0438\u043C\u0430\u043D\u0438\u0435 \u0438\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 \u0441\u043B\u0438\u0448\u043A\u043E\u043C \u043C\u043D\u043E\u0433\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.!nasd\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=\u041C\u043D\u043E\u0436\u0438\u0442\u0435\u043B\u044C \u043E\u0431\u044B\u0447\u043D\u043E\u0433\u043E \u043E\u043F\u044B\u0442\u0430\\: &e{0}x +Smelting.SubSkill.UnderstandingTheArt.Stat=\u041C\u043D\u043E\u0436\u0438\u0442\u0435\u043B\u044C \u043E\u0431\u044B\u0447\u043D\u043E\u0433\u043E \u043E\u043F\u044B\u0442\u0430: &e{0}x Smelting.Ability.Locked.0=\u0417\u0410\u0411\u041B\u041E\u041A\u0418\u0420\u041E\u0412\u0410\u041D\u041E \u0414\u041E {0}+ \u041D\u0410\u0412\u042B\u041A\u0410 (\u0423\u0412\u0415\u041B\u0418\u0427\u0415\u041D\u0418\u0415 \u041E\u0411\u042B\u0427\u041D\u041E\u0413\u041E \u041E\u041F\u042B\u0422\u0410) Smelting.Ability.Locked.1=\u0417\u0410\u0411\u041B\u041E\u041A\u0418\u0420\u041E\u0412\u0410\u041D\u041E \u0414\u041E {0}+ \u041D\u0410\u0412\u042B\u041A\u0410 (\u0424\u041B\u042E\u0421\u041E\u0412\u0410\u042F \u0414\u041E\u0411\u042B\u0427\u0410) Smelting.SubSkill.FuelEfficiency.Name=\u042D\u0444\u0444\u0435\u043A\u0442\u0438\u0432\u043D\u043E\u0441\u0442\u044C \u0442\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 \u043F\u0440\u0438 \u043F\u0435\u0440\u0435\u043F\u043B\u0430\u043A\u0438 \u0432 \u043F\u0435\u0447\u0438 -Smelting.SubSkill.FuelEfficiency.Stat=\u041C\u043D\u043E\u0436\u0438\u0442\u0435\u043B\u044C \u044D\u0444\u0444\u0435\u043A\u0442\u0438\u0432\u043D\u043E\u0441\u0442\u0438 \u0442\u043E\u043F\u043B\u0438\u0432\u0430\\: &e{0}x +Smelting.SubSkill.FuelEfficiency.Stat=\u041C\u043D\u043E\u0436\u0438\u0442\u0435\u043B\u044C \u044D\u0444\u0444\u0435\u043A\u0442\u0438\u0432\u043D\u043E\u0441\u0442\u0438 \u0442\u043E\u043F\u043B\u0438\u0432\u0430: &e{0}x Smelting.SubSkill.SecondSmelt.Name=\u0412\u0442\u043E\u0440\u0430\u044F \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 \u043F\u0435\u0440\u0435\u043F\u043B\u0430\u0432\u043A\u0435 Smelting.SubSkill.SecondSmelt.Stat=\u0428\u0430\u043D\u0441 \u0412\u0442\u043E\u0440\u043E\u0439 \u043F\u043B\u0430\u0432\u043A\u0438 @@ -1056,7 +1059,7 @@ Smelting.Effect.5=\u0423\u0432\u0435\u043B\u0438\u0447\u0435\u043D\u0438\u0435 \ Smelting.SubSkill.FluxMining.Name=\u0424\u043B\u044E\u0441\u043E\u0432\u0430\u044F \u0434\u043E\u0431\u044B\u0447\u0430 Smelting.SubSkill.FluxMining.Description=\u0428\u0430\u043D\u0441 \u043C\u0433\u043D\u043E\u0432\u0435\u043D\u043D\u043E\u0439 \u043F\u0435\u0440\u0435\u043F\u043B\u0430\u0432\u043A\u0438 \u0440\u0443\u0434 \u0432\u043E \u0432\u0440\u0435\u043C\u044F \u0434\u043E\u0431\u044B\u0447\u0438 Smelting.SubSkill.FluxMining.Stat=\u0428\u0430\u043D\u0441 \u0424\u043B\u044E\u0441\u043E\u0432\u043E\u0439 \u0434\u043E\u0431\u044B\u0447\u0438 -Smelting.Listener=\u041F\u0435\u0440\u0435\u043F\u043B\u0430\u0432\u043A\u0430\\: +Smelting.Listener=\u041F\u0435\u0440\u0435\u043F\u043B\u0430\u0432\u043A\u0430: Smelting.SkillName=\u041F\u0415\u0420\u0415\u041F\u041B\u0410\u0412\u041A\u0410 #COMMAND DESCRIPTIONS Commands.Description.addlevels=\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044E \u0443\u0440\u043E\u0432\u043D\u0435\u0439 mcMMO @@ -1092,13 +1095,13 @@ Commands.Description.vampirism=\u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C Commands.Description.xplock=\u0417\u0430\u0444\u0438\u043A\u0441\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0448\u043A\u0430\u043B\u0443 \u043E\u043F\u044B\u0442\u0430 mcMMO \u043D\u0430 \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u043D\u043E\u043C \u043D\u0430\u0432\u044B\u043A\u0435 Commands.Description.xprate=\u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C \u043C\u043D\u043E\u0436\u0438\u0442\u0435\u043B\u044C \u043E\u043F\u044B\u0442\u0430 mcMMO \u0438\u043B\u0438 \u043D\u0430\u0447\u0430\u0442\u044C \u0441\u043E\u0431\u044B\u0442\u0438\u0435 \u043C\u043D\u043E\u0436\u0438\u0442\u0435\u043B\u044F \u043E\u043F\u044B\u0442\u0430 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.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. #SCOREBOARD HEADERS Scoreboard.Header.PlayerStats=&e\u0421\u0442\u0430\u0442\u044B mcMMO Scoreboard.Header.PlayerCooldowns=&e\u041E\u0442\u043A\u0430\u0442\u044B mcMMO Scoreboard.Header.PlayerRank=&e\u0420\u0435\u0439\u0442\u0438\u043D\u0433 mcMMO -Scoreboard.Header.PlayerInspect=&e\u0421\u0442\u0430\u0442\u044B mcMMO\\: {0} +Scoreboard.Header.PlayerInspect=&e\u0421\u0442\u0430\u0442\u044B mcMMO: {0} Scoreboard.Header.PowerLevel=&c\u0423\u0440\u043E\u0432\u0435\u043D\u044C \u0441\u0438\u043B\u044B Scoreboard.Misc.PowerLevel=&6\u0423\u0440\u043E\u0432\u0435\u043D\u044C \u0441\u0438\u043B\u044B Scoreboard.Misc.Level=&3\u0423\u0440\u043E\u0432\u0435\u043D\u044C @@ -1113,12 +1116,12 @@ Profile.Loading.Success=&a\u0412\u0430\u0448 \u043F\u0440\u043E\u0444\u0438\u043 Profile.Loading.FailurePlayer=&cmcMMO \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 \u0443\u0436\u0435 &a{0}&c \u0440\u0430\u0437. \u0412\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\u0446\u0438\u0438 \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 \u043F\u043E\u043A\u0430 \u0432\u044B \u043D\u0435 \u043F\u043E\u043A\u0438\u043D\u0435\u0442\u0435 \u0438\u0433\u0440\u0443. \u041F\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, \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 \u043D\u0430\u0432\u044B\u043A\u0438. Profile.Loading.FailureNotice=&4[\u0410]&c mcMMO \u043D\u0435 \u0441\u043C\u043E\u0433\u043B \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044C \u0434\u0430\u043D\u043D\u044B\u0435 \u0438\u0433\u0440\u043E\u043A\u0430 &e{0}&c. &d\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. \u041F\u043E\u043F\u044B\u0442\u043E\u043A \u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0438 \u0434\u0430\u043D\u043D\u044B\u0445 {1}. #Holiday -Holiday.AprilFools.Levelup=&6{0} \u0442\u0435\u043F\u0435\u0440\u044C \u0443\u0440\u043E\u0432\u043D\u044F &a{1}&6\\! -Holiday.Anniversary=&9\u0421 {0} \u0413\u043E\u0434\u043E\u0432\u0449\u0438\u043D\u043E\u0439\\!!nasd&9\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, \u0434\u0430 \u0431\u0443\u0434\u0443\u0442 \u0444\u0435\u0439\u0435\u0440\u0432\u0435\u0440\u043A\u0438\\! +Holiday.AprilFools.Levelup=&6{0} \u0442\u0435\u043F\u0435\u0440\u044C \u0443\u0440\u043E\u0432\u043D\u044F &a{1}&6! +Holiday.Anniversary=&9\u0421 {0} \u0413\u043E\u0434\u043E\u0432\u0449\u0438\u043D\u043E\u0439!!nasd&9\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, \u0434\u0430 \u0431\u0443\u0434\u0443\u0442 \u0444\u0435\u0439\u0435\u0440\u0432\u0435\u0440\u043A\u0438! #Reminder Messages -Reminder.Squelched=&7\u041D\u0430\u043F\u043E\u043C\u0438\u043D\u0430\u043D\u0438\u0435\\: \u0412 \u043D\u0430\u0441\u0442\u043E\u044F\u0449\u0435\u0435 \u0432\u0440\u0435\u043C\u044F \u0432\u044B \u043D\u0435 \u043F\u043E\u043B\u0443\u0447\u0430\u0435\u0442\u0435 \u0443\u0432\u0435\u0434\u043E\u043C\u043B\u0435\u043D\u0438\u044F \u043E\u0442 mcMMO; \u0447\u0442\u043E\u0431\u044B \u0432\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0443\u0432\u0435\u0434\u043E\u043C\u043B\u0435\u043D\u0438\u044F, \u043F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430, \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u0443 /mc!nasdotify \u0441\u043D\u043E\u0432\u0430. \u042D\u0442\u043E \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0435 \u043F\u043E\u0447\u0430\u0441\u043E\u0432\u043E\u0435 \u043D\u0430\u043F\u043E\u043C\u0438\u043D\u0430\u043D\u0438\u0435. +Reminder.Squelched=&7\u041D\u0430\u043F\u043E\u043C\u0438\u043D\u0430\u043D\u0438\u0435: \u0412 \u043D\u0430\u0441\u0442\u043E\u044F\u0449\u0435\u0435 \u0432\u0440\u0435\u043C\u044F \u0432\u044B \u043D\u0435 \u043F\u043E\u043B\u0443\u0447\u0430\u0435\u0442\u0435 \u0443\u0432\u0435\u0434\u043E\u043C\u043B\u0435\u043D\u0438\u044F \u043E\u0442 mcMMO; \u0447\u0442\u043E\u0431\u044B \u0432\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0443\u0432\u0435\u0434\u043E\u043C\u043B\u0435\u043D\u0438\u044F, \u043F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430, \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u0443 /mc!nasdotify \u0441\u043D\u043E\u0432\u0430. \u042D\u0442\u043E \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0435 \u043F\u043E\u0447\u0430\u0441\u043E\u0432\u043E\u0435 \u043D\u0430\u043F\u043E\u043C\u0438\u043D\u0430\u043D\u0438\u0435. #Locale -Locale.Reloaded=&a\u041B\u043E\u043A\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u044F \u043F\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043D\u0430\\! +Locale.Reloaded=&a\u041B\u043E\u043A\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u044F \u043F\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043D\u0430! #Player Leveling Stuff LevelCap.PowerLevel=&6(&amcMMO&6) &e\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 &c{0}&e. \u0412\u0430\u0448\u0438 \u043D\u0430\u0432\u044B\u043A\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=&6(&amcMMO&6) &e\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 &c{0}&e \u0434\u043B\u044F &6{1}&e. \u0412\u0430\u0448\u0438 \u043D\u0430\u0432\u044B\u043A\u0438 \u0431\u043E\u043B\u044C\u0448\u0435 \u043D\u0435 \u0431\u0443\u0434\u0443\u0442 \u0443\u043B\u0443\u0447\u0448\u0430\u0442\u044C\u0441\u044F. @@ -1136,6 +1139,6 @@ Chat.Identity.Console=&6* \u041A\u043E\u043D\u0441\u043E\u043B\u044C * Chat.Channel.On=&6(&amcMMO-\u0447\u0430\u0442&6) &e\u0412\u0430\u0448\u0438 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F \u0431\u0443\u0434\u0443\u0442 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u0434\u043E\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u044B \u0432 \u043A\u0430\u043D\u0430\u043B \u0447\u0430\u0442\u0430 &a{0}. Chat.Channel.Off=&6(&amcMMO-\u0447\u0430\u0442&6) &e\u0412\u0430\u0448\u0438 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F \u0431\u043E\u043B\u044C\u0448\u0435 \u043D\u0435 \u0431\u0443\u0434\u0443\u0442 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u0434\u043E\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u044B \u0432 \u043A\u0430\u043D\u0430\u043B \u0447\u0430\u0442\u0430. Chat.Spy.Party=&6[&e\u0428\u041F\u0418\u041A&6-&a{2}&6] &r{0} &b\u2192 &r{1} -Broadcasts.LevelUpMilestone=&6(&amcMMO&6) {0}&7 \u0434\u043E\u0441\u0442\u0438\u0433 \u0443\u0440\u043E\u0432\u043D\u044F &a{1}&7 \u0432 &e{2}&7\\! -Broadcasts.PowerLevelUpMilestone=&6(&amcMMO&6) {0}&7 \u0434\u043E\u0441\u0442\u0438\u0433 \u0443\u0440\u043E\u0432\u043D\u044F \u0441\u0438\u043B\u044B &a{1}&7\\! +Broadcasts.LevelUpMilestone=&6(&amcMMO&6) {0}&7 \u0434\u043E\u0441\u0442\u0438\u0433 \u0443\u0440\u043E\u0432\u043D\u044F &a{1}&7 \u0432 &e{2}&7! +Broadcasts.PowerLevelUpMilestone=&6(&amcMMO&6) {0}&7 \u0434\u043E\u0441\u0442\u0438\u0433 \u0443\u0440\u043E\u0432\u043D\u044F \u0441\u0438\u043B\u044B &a{1}&7! Scoreboard.Recovery=\u041F\u043E\u043F\u044B\u0442\u043A\u0430 \u0432\u043E\u0441\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C \u0440\u0430\u0431\u043E\u0442\u0443 \u0442\u0430\u0431\u043B\u0438\u0446\u044B mcMMO... From 5edc0d065da30b47498f412fb8bebd99e82d6c38 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 6 Aug 2021 21:54:28 -0700 Subject: [PATCH 583/662] Add aliases to inspect command (mcinspect, mmoinspect) --- Changelog.txt | 1 + src/main/resources/plugin.yml | 1 + 2 files changed, 2 insertions(+) diff --git a/Changelog.txt b/Changelog.txt index 157382d8e..1d17c8d70 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,4 +1,5 @@ Version 2.1.201 + Added mcinspect and mmoinspect aliases to inspect command Portuguese translation of Woodcutting changed back to Lenhador Version 2.1.200 diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 0a7c82b62..2173e7de9 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -89,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: From 6d9a9d165db8a4dd65bad7ec14f99275017faf33 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 10 Aug 2021 13:46:33 -0700 Subject: [PATCH 584/662] Blast Mining shouldn't drop Budding Amethyst Fixes #4589 --- Changelog.txt | 1 + .../nossr50/skills/mining/MiningManager.java | 45 +++++++++---------- 2 files changed, 22 insertions(+), 24 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 157382d8e..af89da6ef 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,4 +1,5 @@ Version 2.1.201 + Blast Mining no longer drops Budding Amethyst since its not legal to obtain this item through normal gameplay Portuguese translation of Woodcutting changed back to Lenhador Version 2.1.200 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 2a9890cd9..209b8ebbf 100644 --- a/src/main/java/com/gmail/nossr50/skills/mining/MiningManager.java +++ b/src/main/java/com/gmail/nossr50/skills/mining/MiningManager.java @@ -26,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); } @@ -133,29 +137,6 @@ 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; @@ -181,19 +162,24 @@ public class MiningManager extends SkillManager { int xp = 0; float oreBonus = (float) (getOreBonus() / 100); - //TODO: Pretty sure something is fucked with debrisReduction stuff float debrisReduction = (float) (getDebrisReduction() / 100); int dropMultiplier = getDropMultiplier(); 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(isDropIllegal(blockState.getType())) + continue; + if (RandomUtils.nextFloat() < (yield + oreBonus)) { xp += Mining.getBlockXp(blockState); @@ -216,6 +202,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. * From f91a2217c869ac44aa3484f860d7f074c5e0714f Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 10 Aug 2021 14:04:59 -0700 Subject: [PATCH 585/662] Fixed plugin incompatibility and exploits regarding buffed tools remaining buffed Fixes #4616 --- Changelog.txt | 1 + .../nossr50/listeners/InventoryListener.java | 1 + .../nossr50/listeners/PlayerListener.java | 24 +++++++++---------- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index c85d0f910..a41b9c7c8 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,4 +1,5 @@ Version 2.1.201 + 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 diff --git a/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java b/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java index ba80e7ab8..7dcc671b2 100644 --- a/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java @@ -402,6 +402,7 @@ public class InventoryListener implements Listener { } SkillUtils.removeAbilityBuff(event.getCurrentItem()); + if (event.getAction() == InventoryAction.HOTBAR_SWAP) { if(isOutsideWindowClick(event)) return; diff --git a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java index 294911528..a87a47cd1 100644 --- a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java @@ -6,6 +6,7 @@ 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.interfaces.Skill; import com.gmail.nossr50.datatypes.skills.subskills.taming.CallOfTheWildType; import com.gmail.nossr50.events.McMMOReplaceVanillaTreasureEvent; import com.gmail.nossr50.events.fake.FakePlayerAnimationEvent; @@ -212,6 +213,11 @@ public class PlayerListener implements Listener { } } + @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = false) + public void onPlayerDeathNormal(PlayerDeathEvent playerDeathEvent) { + SkillUtils.removeAbilityBoostsFromInventory(playerDeathEvent.getEntity()); + } + /** * Monitor PlayerChangedWorldEvents. *

@@ -1031,17 +1037,9 @@ 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; -// -// if (!mcMMO.getHolidayManager().isAprilFirst()) { -// return; -// } -// -// mcMMO.getHolidayManager().handleStatisticEvent(event); -// } + @EventHandler(ignoreCancelled = true, priority = EventPriority.NORMAL) + public void onPlayerSwapHandItems(PlayerSwapHandItemsEvent event) { + SkillUtils.removeAbilityBuff(event.getMainHandItem()); + SkillUtils.removeAbilityBuff(event.getOffHandItem()); + } } From 8805a25d85368b40c16f1d113fd0c85131c3c1df Mon Sep 17 00:00:00 2001 From: GhostDC Date: Wed, 11 Aug 2021 05:09:32 +0800 Subject: [PATCH 586/662] update locale_zh_CN.properties (#4585) Thank you --- .../resources/locale/locale_zh_CN.properties | 213 ++++++++++-------- 1 file changed, 123 insertions(+), 90 deletions(-) diff --git a/src/main/resources/locale/locale_zh_CN.properties b/src/main/resources/locale/locale_zh_CN.properties index a98e2672a..2d3c04c23 100644 --- a/src/main/resources/locale/locale_zh_CN.properties +++ b/src/main/resources/locale/locale_zh_CN.properties @@ -1,12 +1,12 @@ -#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关键字中使用颜色代码 +#如果你想修改颜色请在advanced.yml中修改 JSON.Rank=\u7b49\u7ea7 JSON.DescriptionHeader=\u63cf\u8ff0 JSON.JWrapper.Header=\u7ec6\u8282 JSON.Type.Passive=\u88ab\u52a8 -JSON.Type.Active=Active +JSON.Type.Active=\u4e3b\u52a8 JSON.Type.SuperAbility=\u8d85\u80fd\u529b JSON.Locked=-=[\u9501\u5b9a]=- JSON.LevelRequirement=\u7b49\u7ea7\u9700\u6c42 @@ -39,7 +39,7 @@ JSON.URL.Wiki=\u5b98\u65b9 mcMMO wiki\u767e\u79d1! JSON.SkillUnlockMessage=&6[ mcMMO&e @&3{0} &6\u7b49\u7ea7 &3{1}&6 \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 你可以添加 {0} 以在名称中插入所需要的级别,我不喜欢他的外观所以现在不想搞它 JSON.Hover.Mystery=&7\u672a\u77e5\u80fd\u529b JSON.Hover.Mystery2=&e[&8{0}&e]&8???&r JSON.Hover.SkillName=&3{0}&r @@ -48,22 +48,22 @@ 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字符串 JSON.Acrobatics.Roll.Interaction.Activated=\u6d4b\u8bd5 &c\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=&c\u4f60\u4e0d\u80fd\u5206\u89e3\u8d27\u4fee\u590d\u6709\u591a\u4e2a\u7269\u54c1\u7684\u7269\u54c1\u5806, \u8bf7\u62c6\u5206\u540e\u518d\u4f7f\u7528. -#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=&6(&amcMMO&6) -# BEGIN STYLING +# 开始风格化 Ability.Generic.Refresh=&a**\u6280\u80fd\u51b7\u5374\u5b8c\u6bd5!** 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[]=====[] @@ -81,7 +81,7 @@ Overhaul.mcMMO.Header=&c[]=====[]&a mcMMO - \u5927\u6539\u7248\u672c &c[]=====[] Overhaul.mcMMO.Url.Wrap.Prefix=&c[| Overhaul.mcMMO.Url.Wrap.Suffix=&c|] Overhaul.mcMMO.MmoInfo.Wiki=&e[&f\u5728WIKI\u4e0a\u67e5\u770b\u6b64\u6280\u80fd!&e] -# Overhaul.Levelup can take {0} - Skill Name defined in Overhaul.Name {1} - Amount of levels gained {2} - Level in skill +# Overhaul.Levelup 可以使用下面的变量 {0} - 在Overhaul.Name中定义的技能名称 {1} - 获得的等级数 {2} - 现在的技能等级 Overhaul.Levelup=&l{0} \u589e\u52a0\u5230 &r&a&l{2}&r&f. Overhaul.Name.Acrobatics=\u6742\u6280 Overhaul.Name.Alchemy=\u70bc\u91d1 @@ -98,13 +98,13 @@ Overhaul.Name.Swords=\u5251\u672f Overhaul.Name.Taming=\u9a6f\u517d Overhaul.Name.Unarmed=\u683c\u6597 Overhaul.Name.Woodcutting=\u4f10\u6728 -# /mcMMO Command Style Stuff +# /mcMMO 命令风格 Commands.mcc.Header=&c---[]&amcMMO \u547d\u4ee4&c[]--- Commands.Other=&c---[]&a\u5176\u4ed6\u547d\u4ee4&c[]--- Commands.Party.Header=&c-----[]&a\u961f\u4f0d&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! +# 经验条可以使用下面的变量 -- {0} = 技能等级, {1} 目前的经验, {2} 到下一等级所需的经验, {3} 技能等级, {4} 当前等级的百分比 +# 如果你想让玩家每次获得经验的时候显示经验条则确保选项 Experience_Bars.ThisMayCauseLag.AlwaysUpdateTitlesWhenXPIsGained 处于打开状态 XPBar.Template={0} XPBar.Template.EarlyGameBoost=&6\u6b63\u5728\u5b66\u4e60\u65b0\u6280\u80fd... XPBar.Acrobatics=\u6742\u6280 Lv.&6{0} @@ -124,11 +124,11 @@ XPBar.Unarmed=\u683c\u6597 Lv.&6{0} XPBar.Woodcutting=\u4f10\u6728 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 +# 经验条可以使用以下变量 -- {0} = 技能等级, {1} 当前经验, {2} 到下一级所需经验, {3} Power Level, {4} Percentage of Level +# 如果你想让玩家每次获得经验的时候显示经验条则确保选项 Experience_Bars.ThisMayCauseLag.AlwaysUpdateTitlesWhenXPIsGained 处于打开状态 +# 风格化结束 -#\u6742\u6280 +#杂技 Acrobatics.Ability.Proc=&a**\u534e\u5c14\u5179\u822c\u7684\u964d\u843d** Acrobatics.Combat.Proc=&a**\u95ea\u907f** Acrobatics.SubSkill.Roll.Stats=&6\u7ffb\u6eda\u51e0\u7387 &e{0}%&6 \u4f18\u96c5\u7ffb\u6eda\u51e0\u7387&e {1}% @@ -147,7 +147,7 @@ Acrobatics.SubSkill.Dodge.Stat=\u95ea\u907f\u6982\u7387 Acrobatics.Listener=\u6742\u6280(Acrobatics): Acrobatics.Roll.Text=&o**\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 @@ -158,7 +158,7 @@ Alchemy.SubSkill.Concoctions.Stat.Extra=\u914d\u65b9 [&a{0}&3]: &a{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 +#箭术 Archery.SubSkill.SkillShot.Name=\u6280\u5de7\u5c04\u51fb @@ -175,7 +175,7 @@ Archery.SubSkill.ArcheryLimitBreak.Description=\u7a81\u7834\u4f60\u7684\u6781\u9 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 @@ -184,6 +184,7 @@ 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=&7\u4f60\u653e\u4e0b\u4e86\u4f60\u7684\u65a7\u5b50. Axes.Ability.Ready=&3\u4f60 &6\u63e1\u7d27&3 \u4e86\u4f60\u7684\u65a7\u5b50. +Axes.Ability.Ready.Extra=&3\u4f60 &6\u63e1\u7d27&3 \u4e86\u4f60\u7684\u65a7\u5b50. &7({0} \u6b63\u5728\u51b7\u5374\u4e2d {1}s) Axes.Combat.CritStruck=&4\u4f60\u6253\u51fa\u4e86\u66b4\u51fb! Axes.Combat.CriticalHit=\u66b4\u51fb! Axes.Combat.GI.Proc=&a**\u5de8\u529b\u6253\u51fb** @@ -211,7 +212,7 @@ Axes.Skills.SS.On=&a**\u65a9\u9996\u8005\u6280\u80fd\u542f\u52a8** Axes.Skills.SS.Refresh=&a\u4f60\u7684 &e\u65a9\u9996\u8005 &a\u6280\u80fd\u53ef\u4ee5\u4f7f\u7528\u4e86! Axes.Skills.SS.Other.Off=\u65a9\u9996\u8005&a \u7ed3\u675f\u4e86,\u8fdb\u5165\u51b7\u5374 &e{0} Axes.Skills.SS.Other.On=&a{0}&2\u4f7f\u7528\u4e86 &c\u65a9\u9996\u8005! -#\u6316\u6398 +#挖掘 Excavation.Ability.Lower=&7\u4f60\u653e\u4e0b\u4e86\u4f60\u7684\u94f2\u5b50. Excavation.Ability.Ready=&3\u4f60 &6\u63e1\u7d27&3 \u4e86\u4f60\u7684\u94f2\u5b50. Excavation.SubSkill.GigaDrillBreaker.Name=\u66b4\u8d70\u94bb\u5934 @@ -228,7 +229,7 @@ Excavation.Skills.GigaDrillBreaker.On=&a**\u66b4\u8d70\u94bb\u5934\u6fc0\u6d3b** Excavation.Skills.GigaDrillBreaker.Refresh=&a\u4f60\u7684 &e\u66b4\u8d70\u94bb\u5934 &a\u6280\u80fd\u53ef\u4ee5\u4f7f\u7528\u4e86! Excavation.Skills.GigaDrillBreaker.Other.Off=\u66b4\u8d70\u94bb\u5934&a \u7ed3\u675f\u4e86,\u8fdb\u5165\u51b7\u5374 &e{0} Excavation.Skills.GigaDrillBreaker.Other.On=&a{0}&2 \u4f7f\u7528\u4e86 &c\u66b4\u8d70\u94bb\u5934! -#\u9493\u9c7c +#钓鱼 Fishing.ScarcityTip=&e&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=&7&o\u4e71\u52a8\u4f1a\u5413\u8dd1\u9c7c! Fishing.Exhausting=&c&o\u4e0d\u6b63\u5f53\u4f7f\u7528\u9c7c\u7aff\u4f1a\u52a0\u5267\u8010\u4e45\u7684\u635f\u8017! @@ -251,6 +252,9 @@ 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:&a \u7b49\u7ea7 {0} Fishing.SubSkill.MasterAngler.Name=\u9493\u9c7c\u5927\u5e08 +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=\u51b0\u9493 Fishing.SubSkill.IceFishing.Description=\u5141\u8bb8\u4f60\u5728\u51b0\u51b7\u7684\u73af\u5883\u4e0b\u9493\u9c7c Fishing.SubSkill.IceFishing.Stat=\u51b0\u9493 @@ -260,7 +264,7 @@ Fishing.Ability.TH.MagicFound=&7\u4f60\u611f\u5230\u4e00\u80a1\u9b54\u529b\u7684 Fishing.Ability.TH.Boom=&7\u7e41\u8363\u65f6\u671f!!! Fishing.Ability.TH.Poison=&7\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=&a**\u7eff\u5316** @@ -296,7 +300,7 @@ Herbalism.Skills.GTe.On=&a**\u571f\u795e\u5e87\u4f51\u6fc0\u6d3b** Herbalism.Skills.GTe.Refresh=&a\u4f60\u7684 &e\u571f\u795e\u5e87\u4f51 &a\u6280\u80fd\u53ef\u4ee5\u4f7f\u7528\u4e86\uff01 Herbalism.Skills.GTe.Other.Off=\u571f\u795e\u5e87\u4f51&a \u7ed3\u675f\u4e86,\u8fdb\u5165\u51b7\u5374 &e{0} Herbalism.Skills.GTe.Other.On=&a{0}&2 \u4f7f\u7528\u4e86 &c\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) @@ -325,13 +329,13 @@ Mining.Skills.SuperBreaker.On=&a**\u8d85\u7ea7\u788e\u77f3\u673a\u6fc0\u6d3b** Mining.Skills.SuperBreaker.Other.Off=\u8d85\u7ea7\u788e\u77f3\u673a &a \u7ed3\u675f\u4e86,\u8fdb\u5165\u51b7\u5374 &e{0} Mining.Skills.SuperBreaker.Other.On=&a{0}&2 \u4f7f\u7528\u4e86 &c\u8d85\u7ea7\u788e\u77f3\u673a! Mining.Skills.SuperBreaker.Refresh=&a\u4f60\u7684 &e\u8d85\u7ea7\u788e\u77f3\u673a &a\u6280\u80fd\u53ef\u4ee5\u4f7f\u7528\u4e86\uff01 -#Blast Mining +#爆破挖矿 Mining.Blast.Boom=&7**\u5623** Mining.Blast.Cooldown= Mining.Blast.Effect=+{0} \u77ff\u7269\u91cf, {1}x \u6389\u843d Mining.Blast.Other.On=&a{0}&2 \u4f7f\u7528\u4e86 &c\u7206\u7834\u5f00\u91c7! Mining.Blast.Refresh=&a\u4f60\u7684 &e\u7206\u7834\u5f00\u91c7 &a\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) @@ -365,12 +369,12 @@ Repair.Skills.FeltEasy=&7\u90a3\u770b\u8d77\u6765\u5f88\u7b80\u5355. Repair.Skills.FullDurability=&7\u4f60\u7684\u88c5\u5907\u5df2\u7ecf\u6ee1\u8010\u4e45\u5ea6\u4e86 Repair.Skills.StackedItems=&4\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=&a\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. @@ -397,9 +401,9 @@ Salvage.Skills.ArcaneSuccess=&a\u60a8\u80fd\u591f\u5b8c\u5168\u62c6\u89e3\u51fa\ Salvage.Listener.Anvil=&4\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=&7\u4f60\u653e\u4e0b\u4e86\u4f60\u7684\u5251. Swords.Ability.Ready=&3\u4f60 &6\u63e1\u7d27&3 \u4e86\u4f60\u7684\u5251. Swords.Combat.Rupture.Note=&7\u6ce8\u91ca: &e1 Tick \u7b49\u4ef7\u4e8e 0.5 \u79d2! @@ -424,7 +428,9 @@ 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: &a{0} tick \u65f6\u95f4 [\u5bf9\u73a9\u5bb6\u9020\u6210 {1} \u4f24\u5bb3] [\u5bf9\u602a\u7269\u9020\u6210 {2} \u4f24\u5bb3] +Swords.SubSkill.Rupture.Stat.Extra=[[DARK_AQUA]]\u6495\u88c2: &a{0} tick \u65f6\u95f4 [\u5bf9\u73a9\u5bb6\u9020\u6210 {1} \u4f24\u5bb3] [\u5bf9\u602a\u7269\u9020\u6210 {2} \u4f24\u5bb3] +Swords.SubSkill.Rupture.Stat.TickDamage=[[DARK_AQUA]]\u6495\u88c2\u6bcf\u9020\u6210\u7684\u7eaf\u4f24\u5bb3: &e{0}&a \u5bf9\u73a9\u5bb6, &e{1}&a \u5bf9\u602a\u7269. +Swords.SubSkill.Rupture.Stat.ExplosionDamage=[[DARK_AQUA]]\u7206\u70b8\u4f24\u5bb3: &e{0}&a \u5bf9\u73a9\u5bb6, &e{1}&a \u5bf9\u602a\u7269. Swords.Effect.4=\u5229\u5203\u7a81\u523a \u6495\u88c2+ Swords.Effect.5={0} Tick \u6495\u88c2 Swords.Listener=\u5251\u672f(Swords): @@ -434,7 +440,7 @@ Swords.Skills.SS.On=&a**\u5229\u5203\u7a81\u523a\u6fc0\u6d3b** Swords.Skills.SS.Refresh=&a\u4f60\u7684 &e\u5229\u5203\u7a81\u523a &a\u6280\u80fd\u53ef\u4ee5\u4f7f\u7528\u4e86! Swords.Skills.SS.Other.Off=\u5229\u5203\u7a81\u523a&a \u7ed3\u675f\u4e86,\u8fdb\u5165\u51b7\u5374 &e{0} Swords.Skills.SS.Other.On=&a{0}&2 \u4f7f\u7528\u4e86 &c\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 @@ -451,7 +457,7 @@ 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.4={0}+ \u7ea7\u540e\u89e3\u9501 (\u5feb\u9910\u670d\u52a1) 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 @@ -479,14 +485,15 @@ Taming.SubSkill.Pummel.TargetMessage=\u4f60\u88ab\u72fc\u51fb\u9000\u4e86! Taming.Listener.Wolf=&8\u4f60\u7684\u72fc\u8dd1\u5230\u4f60\u8eab\u8fb9... Taming.Listener=\u9a6f\u517d(Taming): Taming.SkillName=\u9a6f\u517d -Taming.Summon.Complete=&a\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=&c\u4f60\u5df2\u7ecf\u8fbe\u5230\u4e86\u53ec\u5524\u5ba0\u7269\u7684\u4e0a\u9650. &e({0}) +Taming.Summon.COTW.Success.WithoutLifespan=&a(\u91ce\u6027\u7684\u53ec\u5524) &7\u4f60\u5df2\u7ecf\u53ec\u5524\u4e86\u4e00\u4e2a &6{0}&7 +Taming.Summon.COTW.Success.WithLifespan=&a(\u91ce\u6027\u7684\u53ec\u5524) &7\u4f60\u5df2\u7ecf\u53ec\u5524\u4e86\u4e00\u4e2a &6{0}&7 \u5b83\u7684\u6301\u7eed\u65f6\u95f4\u4e3a &6{1}&7 \u79d2. +Taming.Summon.COTW.Limit=&a(\u91ce\u6027\u7684\u53ec\u5524) &7\u4f60\u53ea\u80fd\u540c\u65f6 &c{0} &7\u53ec\u5524 &7{1} \u53ea\u5ba0\u7269 +Taming.Summon.COTW.TimeExpired=&a(\u91ce\u6027\u7684\u53ec\u5524) &7\u65f6\u95f4\u5230,\u4f60\u7684 &6{0}&7 \u79bb\u5f00. +Taming.Summon.COTW.Removed=&a(\u91ce\u6027\u7684\u53ec\u5524) &7\u4f60\u53ec\u5524\u7684 &6{0}&7 \u5df2\u7ecf\u4ece\u8fd9\u4e2a\u4e16\u754c\u4e0a\u6d88\u5931\u4e86. +Taming.Summon.COTW.BreedingDisallowed=&a(\u91ce\u6027\u7684\u53ec\u5524) &c\u4f60\u4e0d\u80fd\u7e41\u6b96\u88ab\u53ec\u5524\u7684\u52a8\u7269. +Taming.Summon.COTW.NeedMoreItems=&a(\u91ce\u6027\u7684\u53ec\u5524) &7\u4f60\u9700\u8981 &e{0}&7 \u66f4\u591a\u7684 &3{1}&7(s) 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! @@ -519,7 +526,7 @@ Unarmed.Skills.Berserk.On=&a**\u72c2\u66b4\u6fc0\u6d3b** Unarmed.Skills.Berserk.Other.Off=\u72c2\u66b4&a \u7ed3\u675f\u4e86,\u8fdb\u5165\u51b7\u5374 &e{0} Unarmed.Skills.Berserk.Other.On=&a{0}&2 \u4f7f\u7528\u4e86 &c\u72c2\u66b4! Unarmed.Skills.Berserk.Refresh=&a\u4f60\u7684 &e\u72c2\u66b4 &a\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) @@ -528,6 +535,11 @@ 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.KnockOnWood.Name=\u8d70\u8fd0 +Woodcutting.SubSkill.KnockOnWood.Description=\u4f7f\u7528\u4f10\u6728\u673a\u65f6\u53d1\u73b0\u66f4\u591a\u597d\u4e1c\u897f +Woodcutting.SubSkill.KnockOnWood.Stat=\u8d70\u8fd0 +Woodcutting.SubSkill.KnockOnWood.Loot.Normal=\u4ece\u6811\u4e0a\u83b7\u53d6\u4e86\u6b63\u5e38\u7684\u7269\u54c1 +Woodcutting.SubSkill.KnockOnWood.Loot.Rank2=\u4ece\u6811\u4e0a\u83b7\u53d6\u4e86\u6b63\u5e38\u7684\u7269\u54c1\u548c\u7ecf\u9a8c\u7403 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 @@ -546,9 +558,9 @@ Woodcutting.Skills.TreeFeller.Other.Off=\u4f10\u6728\u6280\u80fd &a \u7ed3\u675f Woodcutting.Skills.TreeFeller.Other.On=&a{0}&2 \u4f7f\u7528\u4e86 &c\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 +#能力 -#COMBAT +#战斗 Combat.ArrowDeflect=&f**\u7bad\u77e2\u504f\u5411** Combat.BeastLore=&a**\u9a6f\u517d\u77e5\u8bc6** Combat.BeastLoreHealth=&3\u751f\u547d\u503c (&a{0}&3/{1}) @@ -559,8 +571,8 @@ Combat.Gore=&a**\u76ee\u6807\u88ab\u653e\u8840** Combat.StruckByGore=**\u4f60\u88ab\u653e\u8840\u4e86** Combat.TargetDazed=\u76ee\u6807\u88ab &4\u88ab\u51fb\u6655 Combat.TouchedFuzzy=&4\u5934\u6655\u76ee\u7729 -#\u547d\u4ee4 -##\u901a\u7528 +#命令 +##通用 mcMMO.Description=&3\u5173\u4e8e &emcMMO&3:,&6mcMMO \u662f\u4e00\u4e2a &c\u5f00\u6e90&6 RPG mod \u521b\u5efa\u4e8e2011\u5e742\u6708,&6by &9nossr50&6. \u76ee\u6807\u4e3a\u73a9\u5bb6\u63d0\u4f9b\u4e00\u4e2a\u9ad8\u8d28\u91cf\u7684RPG\u4f53\u9a8c.,&3\u63d0\u793a:,&6 - &a\u4f7f\u7528 &c/mcmmo help&a \u67e5\u770b\u6307\u4ee4,&6 - &a\u8f93\u5165 &c/\u6280\u80fd\u540d&a \u67e5\u770b\u8be6\u7ec6\u7684\u6280\u80fd\u4fe1\u606f,&3\u5f00\u53d1\u8005:,&6 - &anossr50 &9(\u521b\u59cb\u4eba & \u9879\u76ee\u8d1f\u8d23\u4eba),&6 - &aGJ &9(\u9879\u76ee\u7ec4\u957f),&6 - &aNuclearW &9(\u5f00\u53d1\u8005),&6 - &abm01 &9(\u5f00\u53d1\u8005),&6 - &aTfT_02 &9(\u5f00\u53d1\u8005),&6 - &aGlitchfinder &9(\u5f00\u53d1\u8005),&6 - &at00thpick1 &9(\u5f00\u53d1\u8005)&6,&3\u7ffb\u8bd1\u4f5c\u8005:,&6 - &aFu_Meng,&3\u6709\u7528\u94fe\u63a5:,&6 - &ahttps://github.com/mcMMO-Dev/mcMMO/issues&6 Bug \u62a5\u544a,&6 - &ahttps://discord.gg/EJGVanb &6 \u5b98\u65b9 Discord mcMMO.Description.FormerDevs=&3\u524d\u5f00\u53d1\u8005: &aGJ, NuclearW, bm01, TfT_02, Glitchfinder Commands.addlevels.AwardAll.1=\u4f60\u6240\u6709\u7684\u6280\u80fd\u7b49\u7ea7\u88ab\u63d0\u5347\u4e86 {0} \u7ea7! @@ -579,6 +591,7 @@ Commands.Chat.Console=*\u63a7\u5236\u53f0* Commands.Cooldowns.Header=&6--= &amcMMO \u80fd\u529b\u51b7\u5374&6 =-- Commands.Cooldowns.Row.N=\ &c{0}&f - \u5269\u4f59 &6{1} &f\u79d2 Commands.Cooldowns.Row.Y=\ &b{0}&f - &2\u51c6\u5907\u5c31\u7eea! +Commands.Database.CooldownMS=\u4f60\u5fc5\u987b\u7b49\u5f85 {0} \u6beb\u79d2\u540e\u624d\u80fd\u518d\u6b21\u4f7f\u7528\u8fd9\u4e2a\u547d\u4ee4. 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. @@ -697,16 +710,19 @@ Commands.Scoreboard.Help.2=&3/mcscoreboard&b keep &f - \u4fdd\u6301 mcMMO \u8bb0 Commands.Scoreboard.Help.3=&3/mcscoreboard&b time [n] &f - &dn&f \u79d2\u540e\u6e05\u7a7a mcMMO \u8bb0\u5206\u677f Commands.Scoreboard.Tip.Keep=&6\u63d0\u793a: \u5f53\u8bb0\u5206\u677f\u663e\u793a\u65f6\u4f7f\u7528 &c/mcscoreboard keep&6 \u6765\u4fdd\u6301\u5b83\u4e0d\u6d88\u5931\u3002 Commands.Scoreboard.Tip.Clear=&6\u63d0\u793a: \u4f7f\u7528 &c/mcscoreboard clear&6 \u6765\u5173\u95ed\u8ba1\u5206\u677f\u3002 +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=\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 &9{0}&e \u6392\u884c\u699c-- Commands.SkillInfo=&a- \u67e5\u770b\u6280\u80fd\u7684\u8be6\u7ec6\u4fe1\u606f Commands.Stats=&a- \u4f60\u7684\u4fe1\u606f Commands.ToggleAbility=&a- \u7528\u9f20\u6807\u53f3\u952e\u5207\u6362\u6280\u80fd\u6fc0\u6d3b\u6a21\u5f0f -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.0=&c\u6b63\u786e\u7684\u7528\u6cd5\u662f /{0} +Commands.Usage.1=&c\u6b63\u786e\u7684\u7528\u6cd5\u662f /{0} {1} +Commands.Usage.2=&c\u6b63\u786e\u7684\u7528\u6cd5\u662f /{0} {1} {2} +Commands.Usage.3=&c\u6b63\u786e\u7684\u7528\u6cd5\u662f /{0} {1} {2} {3} +Commands.Usage.3.XP=&c\u6b63\u786e\u7684\u7528\u6cd5\u662f /{0} {1} {2} {3}&7 (\u60a8\u53ef\u4ee5\u5728\u672b\u5c3e\u6dfb\u52a0 -s \u4ee5\u5728\u4e0d\u901a\u77e5\u73a9\u5bb6\u7684\u60c5\u51b5\u4e0b\u6267\u884c\u547d\u4ee4\uff0c\u4ece\u800c\u6709\u6548\u5730\u4f7f\u5176\u9759\u97f3) Commands.Usage.FullClassName=\u6570\u636e\u7c7b\u578b Commands.Usage.Level=\u7b49\u7ea7 Commands.Usage.Message=\u6d88\u606f @@ -731,7 +747,7 @@ Commands.Mmodebug.Toggle=mcMMO \u8c03\u8bd5\u6a21\u5f0f &6{0}&7, \u4f7f\u7528\u8 mcMMO.NoInvites=&c\u4f60\u73b0\u5728\u6ca1\u6709\u53d7\u5230\u4efb\u4f55\u9080\u8bf7 mcMMO.NoPermission=&4\u6743\u9650\u4e0d\u8db3. mcMMO.NoSkillNote=&8\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=&c\u6b63\u786e\u7684\u7528\u6cd5 &3{0} [password]. Party.Help.1=&c\u521b\u5efa\u4e00\u4e2a\u961f\u4f0d, \u4f7f\u7528 &3{0} [password]. @@ -807,7 +823,7 @@ 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 @@ -838,7 +854,7 @@ Commands.Event.Stop=&amcMMO&3 \u4e8b\u4ef6\u7ed3\u675f! Commands.Event.Stop.Subtitle=&a\u6211\u5e0c\u671b\u4f60\u73a9\u7684\u5f00\u5fc3! Commands.Event.XP=&3\u591a\u500d\u7ecf\u9a8c\u901f\u7387\u4e3a &6{0}&3 \u500d -# Admin Notifications +# 管理员提醒 Server.ConsoleName=&e[Server] Notifications.Admin.XPRate.Start.Self=&7\u4f60\u5df2\u5c06\u5168\u5c40\u591a\u500d\u7ecf\u9a8c\u8bbe\u7f6e\u4e3a &6{0} \u500d Notifications.Admin.XPRate.End.Self=&7\u4f60\u7ed3\u675f\u4e86\u591a\u500d\u7ecf\u9a8c\u4e8b\u4ef6. @@ -847,20 +863,20 @@ Notifications.Admin.XPRate.Start.Others={0} &7\u5df2\u542f\u52a8\u6216\u4fee\u65 Notifications.Admin.Format.Others=&6(&amcMMO &3Admin&6) &7{0} Notifications.Admin.Format.Self=&6(&amcMMO&6) &7{0} -# Event +# 事件 XPRate.Event= &6mcMMO \u73b0\u5728\u6b63\u5904\u4e8e\u591a\u500d\u7ecf\u9a8c\u4e8b\u4ef6\u9636\u6bb5! \u7ecf\u9a8c\u83b7\u53d6\u7387\u4e3a {0}\u500d! -#GUIDES +#指南 Guides.Available=&7{0} \u7684\u5411\u5bfc - \u8f93\u5165 /{1} ? [\u9875\u6570] Guides.Header=&6-=&a{0} \u5411\u5bfc&6=- 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=&3\u5173\u4e8e\u6742\u6280:\n&e\u6742\u6280\u662f mcMMO \u4e2d\u4f18\u96c5\u79fb\u52a8\u7684\u827a\u672f\u3002\n&e\u5b83\u63d0\u4f9b\u4e86\u6218\u6597\u52a0\u6210\u548c\u73af\u5883\u4f24\u5bb3\u52a0\u6210\u3002\n\n&3\u7ecf\u9a8c\u83b7\u53d6:\n&e\u901a\u8fc7\u5728\u6218\u6597\u4e2d\u95ea\u907f\u6216\u8005\u4ece\u9ad8\u5904\n&e\u8dcc\u843d\u65f6\u53d7\u4f24\u5e76\u5e78\u5b58\u6765\u83b7\u5f97\u7ecf\u9a8c\u3002 Guides.Acrobatics.Section.1=&3\u7ffb\u6eda\u662f\u5982\u4f55\u5de5\u4f5c\u7684\uff1f\n&e\u5f53\u60a8\u53d7\u5230\u8dcc\u843d\u4f24\u5bb3\u65f6\u60a8\u6709\u88ab\u52a8\u673a\u4f1a\u6765\u514d\u53d7\u4f24\u5bb3\u3002\n&e\u60a8\u53ef\u4ee5\u5728\u8dcc\u843d\u4e2d\u6309\u4f4f\u6f5c\u884c\u952e\u6765\u63d0\u5347\u89e6\u53d1\u51e0\u7387\u3002\n&e\u8fd9\u5c06\u89e6\u53d1\u4e00\u4e2a\u4f18\u96c5\u5730\u7ffb\u6eda\u800c\u4e0d\u662f\u666e\u901a\u7684\u7ffb\u6eda\u3002\n&e\u4f18\u96c5\u5730\u7ffb\u6eda\u7c7b\u4f3c\u666e\u901a\u7684\u7ffb\u6eda\u4f46\u662f\u5b83\u6709\u53cc\u500d\u51e0\u7387\n&e\u53d1\u751f\uff0c\u5e76\u4e14\u80fd\u591f\u63d0\u4f9b\u6bd4\u666e\u901a\u5730\u7ffb\u6eda\u66f4\u9ad8\u7684\u4f24\u5bb3\u51cf\u514d\u3002\n&e\u7ffb\u6eda\u51e0\u7387\u53d6\u51b3\u4e8e\u60a8\u7684\u6280\u80fd\u7b49\u7ea7 Guides.Acrobatics.Section.2=&3\u95ea\u907f\u662f\u5982\u4f55\u5de5\u4f5c\u7684?\n&e\u95ea\u907f\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd\n&e\u4ed6\u5728\u4f60\u88ab\u653b\u51fb\u65f6\u6709\u4e00\u5b9a\u51e0\u7387\u88ab\u6fc0\u53d1\n&e\u8fd9\u4e2a\u51e0\u7387\u548c\u4f60\u7684\u6280\u80fd\u7b49\u7ea7\u6709\u5173 -##\u70bc\u91d1 +##炼金 Guides.Alchemy.Section.0=&3\u5173\u4e8e\u70bc\u91d1:\n&e\u70bc\u91d1\u662f\u836f\u6c34\u917f\u9020\u7684\u6280\u80fd\u3002\n&e\u5b83\u63d0\u5347\u4e86\u836f\u6c34\u917f\u9020\u65f6\u7684\u901f\u5ea6\uff0c\u5e76\u4e14\u52a0\u5165\u4e86\n&e\u65b0\u7684\uff08\u76f8\u5bf9\u4e4b\u524d\uff09\u65e0\u6cd5\u83b7\u53d6\u7684\u836f\u6c34\u3002\n\n\n&3\u7ecf\u9a8c\u83b7\u53d6\uff1a\n&e\u901a\u8fc7\u917f\u9020\u836f\u6c34\u6765\u83b7\u53d6\u7ecf\u9a8c\u3002 Guides.Alchemy.Section.1=&3\u50ac\u5316\u662f\u5982\u4f55\u5de5\u4f5c\u7684\uff1f\n&e\u50ac\u5316\u63d0\u5347\u917f\u9020\u7684\u901f\u5ea6\uff0c\u5728 1000 \u7ea7\n&e\u65f6\u80fd\u8fbe\u5230\u6700\u9ad8 4 \u500d\u3002\n&e\u6b64\u80fd\u529b\u9ed8\u8ba4\u5728 100 \u7ea7\u89e3\u9501\u3002 Guides.Alchemy.Section.2=&3\u6df7\u5408\u662f\u5982\u4f55\u5de5\u4f5c\u7684\uff1f\n&e\u6df7\u5408\u5141\u8bb8\u4f7f\u7528\u81ea\u8ba2\u539f\u6599\u917f\u9020\u66f4\u591a\u836f\u6c34\u3002\n&e\u7279\u6b8a\u539f\u6599\u6839\u636e\u60a8\u7684\u7b49\u7ea7\u6765\u89e3\u9501\u3002\n&e\u603b\u5171\u6709 8 \u4e2a\u7b49\u7ea7\u9700\u8981\u89e3\u9501\u3002 @@ -868,26 +884,27 @@ Guides.Alchemy.Section.3=&3\u6df7\u5408\u7b2c 1 \u9636\u539f\u6599:\n&e\u70c8\u7 Guides.Alchemy.Section.4=&3\u6df7\u5408\u7b2c 2 \u9636\u539f\u6599:\n&e\u80e1\u841d\u535c (\u6025\u8feb\u836f\u6c34)\n&e\u7c98\u6db2\u7403 (\u8fdf\u949d\u836f\u6c34)\n\n&3\u6df7\u5408\u7b2c 3 \u9636\u539f\u6599:\n&e\u4e0b\u754c\u77f3\u82f1 (\u4f24\u5bb3\u5438\u6536\u836f\u6c34)\n&e\u7ea2\u8272\u8611\u83c7 (\u8df3\u8dc3\u836f\u6c34) Guides.Alchemy.Section.5=&3\u6df7\u5408\u7b2c 4 \u9636\u539f\u6599:\n&e\u82f9\u679c (\u751f\u547d\u52a0\u6210\u836f\u6c34)\n&e\u8150\u8089 (\u9965\u997f\u836f\u6c34)\n\n&3\u6df7\u5408\u7b2c 5 \u9636\u539f\u6599:\n&e\u8910\u8272\u8611\u83c7 (\u53cd\u80c3\u836f\u6c34)\n&e\u58a8\u56ca (\u5931\u660e\u836f\u6c34) Guides.Alchemy.Section.6=&3\u6df7\u5408\u7b2c 6 \u9636\u539f\u6599:\n&e\u8568\u7c7b (\u9971\u548c\u836f\u6c34)\n\n&3\u6df7\u5408\u7b2c 7 \u9636\u539f\u6599:\n&e\u6bd2\u9a6c\u94c3\u85af (Potion of Decay)\n\n[[\u8150\u70c2\u836f\u6c34]]\u6df7\u5408\u7b2c 8 \u9636\u539f\u6599:\n&e\u666e\u901a\u91d1\u82f9\u679c (\u6297\u6027\u63d0\u5347\u836f\u6c34) -##\u683c\u6597 + +##格斗 Guides.Archery.Section.0=&3\u5173\u4e8e\u7bad\u672f:\n&e\u7bad\u672f\u662f\u7528\u5f13\u5c04\u7bad.\n&e\u4e3a\u4f60\u63d0\u4f9b\u5404\u79cd\u7ad9\u4e1c\u52a0\u6210, \n&e\u4f8b\u5982\u968f\u7740\u4f60\u7684\u7b49\u7ea7\u63d0\u5347\u4f24\u5bb3\uff0c\u4ee5\u53ca\u5c06\u5bf9\u624b\u51fb\u6655\u7684\u80fd\u529b\n&e\u9664\u6b64\u4e4b\u5916\u4f60\u8fd8\u80fd\u4ece\u5bf9\u624b\u7684\u8eab\u4e0a\u56de\u6536\u7bad\u77e2.\n\n\n&3\u7ecf\u9a8c\u6765\u6e90:\n&e\u8981\u83b7\u53d6\u6b64\u4ec5\u80fd\u7684\u7ecf\u9a8c\n&e\u4f60\u9700\u8981\u5c04\u51fb\u602a\u7269\u6216\u5176\u4ed6\u73a9\u5bb6. Guides.Archery.Section.1=&3\u6280\u5de7\u5c04\u51fb\u5982\u4f55\u5de5\u4f5c?\n&e\u6280\u5de7\u5c04\u51fb\u4f1a\u4f7f\u4f60\u7684\u5c04\u7bad\u653b\u51fb\u83b7\u5f97\u4f24\u5bb3\u52a0\u6210.\n&e\u6280\u5de7\u5c04\u51fb\u63d0\u4f9b\u7684\u4f24\u5bb3\u52a0\u6210\u4f1a\u968f\u7740\n&e\u7bad\u672f\u7b49\u7ea7\u7684\u63d0\u5347\u800c\u589e\u52a0.\n&e\u4f7f\u7528\u9ed8\u8ba4\u8bbe\u7f6e\u4f60\u7684\u7bad\u672f\u6bcf\u4e94\u5341\u7ea7\u63d0\u9ad810%\u7684\u4f24\u5bb3\u52a0\u6210\n&e\u6700\u9ad8\u63d0\u4f9b200%\u7684\u4f24\u5bb3\u52a0\u6210. Guides.Archery.Section.2=&3\u51fb\u6655\u5982\u4f55\u5de5\u4f5c?\n&e\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&e\u5f53\u51fb\u6655\u89e6\u53d1\u65f6\u4ed6\u4f1a\u65f6\n&e\u5bf9\u624b\u76f4\u89c6\u524d\u65b9\u4e00\u5b9a\u65f6\u95f4.\n&e\u5e76\u63d0\u4f9b4\u70b9\u7684\u989d\u5916\u4f24\u5bb3\uff082 \u5fc3\uff09. Guides.Archery.Section.3=&3\u7bad\u77e2\u56de\u6536\u5982\u4f55\u5de5\u4f5c?\n&e\u5f53\u4f60\u7528\u5f13\u7bad\u51fb\u6740\u602a\u7269\u65f6\n&e\u6709\u51e0\u7387\u56de\u6536\u7bad\u77e2.\n&e\u8fd9\u4e2a\u51e0\u7387\u968f\u7740\u4f60\u7bad\u672f\u7b49\u7ea7\u7684\u63d0\u5347\u800c\u589e\u52a0.\n&e\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u8fd9\u4e2a\u80fd\u529b\u6bcf\u7ea7\u589e\u52a00.1%,\n&e1000\u7ea7\u589e\u52a0100%. -##\u65a7\u6280 +##斧技 Guides.Axes.Section.0=&3\u5173\u4e8e \u65a7\u6280:\n&e\u6709\u4e86\u65a7\u5934\u6280\u80fd,\u65a7\u5b50\u4e0d\u518d\u53ea\u662f\u780d\u6811\u800c\u5df2.\n&e\u4f60\u8fd8\u53ef\u4ee5\u780d\u5176\u4ed6\u751f\u7269\u548c\u73a9\u5bb6\u6765\u8d5a\u53d6\u7ecf\u9a8c.\n&e\u6253\u51fb\u751f\u7269\u65f6\u9644\u52a0\u51fb\u9000\u6548\u679c.\n&e\u8fd8\u4f1a\u5bf9\u751f\u7269\u548c\u73a9\u5bb6\u9020\u6210\u81f4\u547d\u4f24\u5bb3.\n&e\u4f60\u7684\u65a7\u5b50\u4f1a\u50cf\u4f10\u6728\u673a\u4e00\u6837.\n&e\u8f7b\u677e\u524a\u6389\u654c\u4eba\u7684\u62a4\u7532.\n&e\u6548\u679c\u968f\u7740\u6280\u80fd\u7b49\u7ea7\u63d0\u9ad8.\n&3\u7ecf\u9a8c\u7684\u83b7\u53d6:\n&e\u624b\u6301\u65a7\u5b50\u653b\u51fb\u5176\u4ed6\u751f\u7269\u6216\u73a9\u5bb6. Guides.Axes.Section.1=&3\u4ec0\u4e48\u662f\u65a9\u9996\u8005?\n&e\u8fd9\u4e2a\u6280\u80fd\u4f1a\u9020\u6210\u8303\u56f4\u6253\u51fb\u4f24\u5bb3\n&e\u4f24\u5bb3\u7b49\u4e8e\u5bf9\u4e3b\u8981\u653b\u51fb\u76ee\u6807\u9020\u6210\u4f24\u5bb3\u768450%\n&e\u6240\u4ee5\u5f88\u5bb9\u6613\u6e05\u7406\u6389\u4e00\u5927\u7247\u602a\u7269 Guides.Axes.Section.2=&3\u4ec0\u4e48\u662f\u81f4\u547d\u4e00\u51fb?\n&e\u8fd9\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd\n&e\u4e00\u5b9a\u51e0\u7387\u5bf9\u76ee\u6807\u9020\u6210\u989d\u5916\u4f24\u5bb3\n&e\u9ed8\u8ba4\u6bcf2\u7ea7\u589e\u52a0 0.1%\n&e\u5bf9\u751f\u7269\u9020\u62102\u500d\u4f24\u5bb3\n&e\u5bf9\u73a9\u5bb6\u9020\u62101.5\u500d\u4f24\u5bb3 Guides.Axes.Section.3=&3\u4ec0\u4e48\u662f\u65a7\u7cbe\u901a?\n&e\u8fd9\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd\n&e\u4f7f\u7528\u65a7\u5b50\u653b\u51fb\u65f6\u9644\u52a0\u989d\u5916\u4f24\u5bb3\n&e\u9ed8\u8ba4\u6bcf50\u7ea7\u989d\u5916\u63d0\u9ad81\u70b9\u4f24\u5bb3\n&e4\u70b9\u989d\u5916\u4f24\u5bb3\u5c01\u9876 Guides.Axes.Section.4=&3\u4ec0\u4e48\u662f\u7834\u7532?\n&e\u7528\u8db3\u591f\u7684\u529b\u91cf\u51fb\u788e\u62a4\u7532!\n&e\u7834\u7532\u662f\u4e00\u4e2a\u88ab\u52a8\u7684\u80fd\u529b,\u5b83\u6709\u51e0\u7387\u4f1a\u635f\u8017\n&e\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=&3\u4ec0\u4e48\u662f\u5f3a\u529b\u51b2\u51fb?\n&e\u8fd9\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd\n&e\u4f7f\u7528\u65a7\u5b50\u653b\u51fb\u65f6\u4e00\u5b9a\u51e0\u7387\u7ed9\u654c\u4eba\u5e26\u6765\u5de8\u5927\u7684\u51b2\u51fb\u529b\n&e\u9ed8\u8ba4\u51e0\u7387\u4e3a 25%\n&e\u6548\u679c\u76f8\u5f53\u4e8e \u51fb\u9000 II \u7684\u9644\u9b54\u6548\u679c\n&e\u6b64\u5916\u8fd8\u4f1a\u5bf9\u76ee\u6807\u9020\u6210\u989d\u5916\u4f24\u5bb3 -##\u6316\u6398 +##挖掘 Guides.Excavation.Section.0=&3\u5173\u4e8e\u6316\u6398:\n&e\u6316\u6398\u662f\u4ee5\u6316\u6398\u6ce5\u571f\u4ee5\u5bfb\u627e\u5b9d\u85cf\u7684\u884c\u4e3a.\n&e\u901a\u8fc7\u6316\u6398,\u4f60\u5c06\u4f1a\u627e\u5230\u9690\u85cf\u7684\u5b9d\u85cf.\n&e\u4f60\u6316\u7684\u8d8a\u591a\u4f60\u627e\u5230\u7684\u5b9d\u85cf\u4e5f\u5c31\u8d8a\u591a.\n\n&3\u7ecf\u9a8c\u6765\u6e90:\n&e\u8981\u83b7\u5f97\u8be5\u6280\u80fd\u7684\u7ecf\u9a8c\u4f60\u5fc5\u987b\u624b\u6301\u94f2\u5b50\u6316\u6398.\n&e\u53ea\u6709\u7279\u5b9a\u7684\u65b9\u5757\u624d\u80fd\u83b7\u5f97\u7ecf\u9a8c,\u6316\u6398\u5230\u5b9d\u85cf. Guides.Excavation.Section.1=&3\u53ef\u4ee5\u6316\u6398\u7684\u65b9\u5757:\n&e\u8349\u65b9\u5757, \u6ce5\u571f, \u6c99\u5b50, \u7c98\u571f, \u7802\u783e, \u83cc\u4e1d, \u7075\u9b42\u6c99, \u96ea Guides.Excavation.Section.2=&3\u5982\u4f55\u4f7f\u7528\u66b4\u8d70\u94bb\u5934:\n&e\u624b\u62ff\u94f2\u5b50\u53f3\u952e\u5355\u51fb\u4ee5\u8fdb\u5165\u51c6\u5907\u72b6\u6001.\n&e\u4e00\u65e6\u8fdb\u5165\u8fd9\u79cd\u72b6\u6001,\u4f60\u7ea6\u67094\u79d2\u7684\u65f6\u95f4\u8ba9\u5de5\u5177\n&e\u70b9\u51fb\u4e0e\u6316\u6398\u673a\u80fd\u517c\u5bb9\u7684\u65b9\u5757\n&e\u8fd9\u6837\u5c31\u4f1a\u6fc0\u6d3b\u66b4\u8d70\u94bb\u5934\u6280\u80fd. Guides.Excavation.Section.3=&3\u4ec0\u4e48\u662f\u66b4\u8d70\u94bb\u5934?\n&e\u66b4\u8d70\u94bb\u5934\u662f\u4e00\u79cd\u4e0e\u6316\u6398\u6280\u80fd\u76f8\u5173\u4e14\u6709\u65f6\u95f4\u9650\u5236\u7684\u80fd\u529b\n&e\u5b83\u4f7f\u4f60\u627e\u5230\u5b9d\u85cf\u7684\u51e0\u7387\u589e\u52a0\u4e09\u500d\n&e\u5e76\u4e14\u80fd\u77ac\u95f4\u6253\u7834\u517c\u5bb9\u7684\u65b9\u5757. Guides.Excavation.Section.4=&3\u8003\u53e4\u5b66\u662f\u600e\u6837\u5de5\u4f5c\u7684?\n&e\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&e\u56e0\u6b64\u5f88\u96be\u8bf4\u5b83\u5bf9\u4f60\u7684\u5e2e\u52a9\u6709\u591a\u5927\n&e\u8bf7\u8bb0\u4f4f\uff0c\u6316\u6398\u673a\u80fd\u7b49\u7ea7\u8d8a\u9ad8\u6316\u5230\u7684\u5b9d\u85cf\u5c31\u8d8a\u591a.\n&e\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&e\u6362\u53e5\u8bdd\u8bf4,\u4f60\u5728\u6ce5\u571f\u4e2d\u627e\u5230\u7684\u5b9d\u85cf.\n&e\u5728\u7802\u783e\u4e2d\u4e0d\u4e00\u5b9a\u80fd\u627e\u5230. Guides.Excavation.Section.5=&3\u5173\u4e8e\u6316\u6398\u6ce8\u610f\u4e8b\u9879:\n&e\u6316\u6398\u6389\u843d\u7269\u662f\u5b8c\u5168\u53ef\u5b9a\u5236\u7684\n&e\u56e0\u6b64\u6316\u51fa\u7684\u7ed3\u679c\u56e0\u670d\u52a1\u5668\u800c\u5f02. -##\u9493\u9c7c +##钓鱼 Guides.Fishing.Section.0=&3\u5173\u4e8e\u9493\u9c7c:\n&e\u5173\u4e8e\u9493\u9c7c\u6280\u80fd, \u9493\u9c7c\u518d\u6b21\u4f7f\u4eba\u632f\u594b!\n&e\u627e\u5230\u9690\u85cf\u7684\u5b9d\u85cf\u4ece\u602a\u7269\u8eab\u4e0a\u6296\u843d\u7269\u54c1.\n\n&3\u7ecf\u9a8c\u6765\u6e90:\n&e\u9493\u9c7c. Guides.Fishing.Section.1=&3\u6dd8\u91d1\u8005\u5982\u4f55\u5de5\u4f5c?\n&e\u8fd9\u4e2a\u80fd\u529b\u4f7f\u4f60\u5728\u9493\u9c7c\u65f6\u627e\u5230\u5b9d\u85cf \n&e\u5e76\u4e14\u7269\u54c1\u6709\u5c0f\u51e0\u7387\u5e26\u6709\u9644\u9b54.\n&e\u9493\u9c7c\u6280\u80fd\u7684\u6bcf\u4e00\u4e2a\u7ea7\u522b\u7684\u5b9d\u85cf\u90fd\u6709\u6982\u7387\u6389\u843d\n&e.\u5b9d\u85cf\u7684\u6982\u7387\u53d6\u51b3\u4e8e\u7a00\u6709\u5ea6\u7684\u6389\u843d\u51e0\u7387\n&e\u4f60\u7684\u9493\u9c7c\u7b49\u7ea7\u8d8a\u9ad8,\u4f60\u8d8a\u6709\u53ef\u80fd\u627e\u5230\u66f4\u597d\u7684\u5b9d\u85cf.\n&e\u83b7\u5f97\u5b9d\u85cf\u7684\u51e0\u7387\u4e5f\u8d8a\u9ad8. Guides.Fishing.Section.2=&3\u51b0\u9493\u5982\u4f55\u5de5\u4f5c?\n&e\u8fd9\u4e2a\u88ab\u52a8\u6280\u80fd\u53ef\u4ee5\u8ba9\u4f60\u5728\u51b0\u6e56\u4e2d\u9493\u9c7c!\n&e\u5c06\u4f60\u7684\u9c7c\u7aff\u6254\u5728\u51b0\u6e56\u91cc\u8fd9\u4e2a\u80fd\u529b\u4f1a\u5728\u51b0\u4e0a\n&e\u5f62\u6210\u4e00\u4e2a\u5c0f\u5b54\u4f9b\u4f60\u9493\u9c7c. @@ -895,7 +912,7 @@ Guides.Fishing.Section.3=&3\u9493\u9c7c\u5927\u5e08\u5982\u4f55\u5de5\u4f5c?\n&e Guides.Fishing.Section.4=&3\u6296\u52a8\u5982\u4f55\u5de5\u4f5c?\n&e\u8fd9\u79cd\u4e3b\u52a8\u6280\u80fd\u53ef\u4ee5\u8ba9\u4f60\u7528\u9c7c\u7aff\u52fe\u4f4f\u751f\u7269\n&e\u5e76\u4ece\u4ed6\u4eec\u8eab\u4e0a\u83b7\u53d6\u7269\u54c1. \n&e\u751f\u7269\u4f1a\u6389\u843d\u4ed6\u4eec\u6b7b\u4ea1\u65f6\u6389\u843d\u7684\u7269\u54c1.\n&e\u4e5f\u53ef\u80fd\u83b7\u5f97\u602a\u7269\u7684\u5934 \n&e\u4e00\u822c\u60c5\u51b5\u4e0b\u8fd9\u4e9b\u5934\u65e0\u6cd5\u5728\u751f\u5b58\u6a21\u5f0f\u4e2d\u83b7\u5f97. Guides.Fishing.Section.5=&3\u6e14\u592b\u7684\u98df\u8c31\u5982\u4f55\u5de5\u4f5c?\n&e\u8fd9\u4e2a\u88ab\u52a8\u589e\u52a0\u4e86\u5403\u9c7c\u65f6\u6062\u590d\u7684\u9971\u98df\u5ea6. Guides.Fishing.Section.6=&3\u5173\u4e8e\u9493\u9c7c\u7684\u8bf4\u660e:\n&e\u9493\u9c7c\u7684\u6389\u843d\u7269\u662f\u53ef\u4ee5\u81ea\u5b9a\u4e49\u7684,\n&e\u6240\u4ee5\u6389\u843d\u7269\u56e0\u670d\u52a1\u5668\u800c\u5f02. -##Herbalism +##草药学 Guides.Herbalism.Section.0=&3\u5173\u4e8e\u8349\u836f\u5b66:\n&e\u8349\u836f\u5b66\u662f\u5173\u4e8e\u91c7\u96c6\u8349\u836f\u4e0e\u690d\u7269\u7684\u6280\u80fd.\n\n&3\u7ecf\u9a8c\u62c9\u8fdc:\n&e\u91c7\u96c6\u8349\u836f\u6216\u690d\u7269. Guides.Herbalism.Section.1=&3\u53ef\u4f5c\u7528\u7684\u8349\u836f/\u690d\u7269\n&e\u5c0f\u9ea6, \u9a6c\u94c3\u85af, \u80e1\u841d\u535c, \u897f\u74dc, \n&e\u5357\u74dc, \u7518\u8517, \u53ef\u53ef\u8c46, \u82b1, \u4ed9\u4eba\u638c, \u8611\u83c7,\n&e\u5730\u72f1\u75a3, \u83b2\u53f6, \u4e0e\u85e4\u8513. Guides.Herbalism.Section.2=&3\u5927\u5730\u795d\u798f\u5982\u4f55\u5de5\u4f5c?\n&e\u5927\u5730\u795d\u798f\u662f\u4e00\u4e2a\u4e3b\u52a8\u6280\u80fd, \u5f53\u4f60\u624b\u6301\u9504\u5934\u65f6\n&e\u70b9\u51fb\u53f3\u952e\u53ef\u53d1\u52a8\u6280\u80fd. \u5927\u5730\u795d\u798f\u63d0\u9ad8\u4e09\u500d\u6536\u83b7\u7684\u673a\u7387. \n&e\u540c\u65f6\u4e5f\u8ba9\u73a9\u5bb6\u6709\u80fd\u529b\u4f7f\u7528\u8eab\u4e0a\u7684\u79cd\u5b50\u6765\u8f6c\u5316\n&e\u65b9\u5757\u5e76\u8d4b\u4e88\u751f\u547d. @@ -904,33 +921,33 @@ Guides.Herbalism.Section.4=&3\u7eff\u624b\u6307(\u5706\u77f3/\u77f3\u7816/\u6ce5 Guides.Herbalism.Section.5=&3\u519c\u592b\u98df\u8c31\u5982\u4f55\u5de5\u4f5c?\n&e\u8fd9\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd, \u53ef\u589e\u52a0\u4e0b\u5217\u98df\u7269\u7684\u9971\u98df\u5ea6\u6062\u590d -\n&e\u9762\u5305, \u66f2\u5947, \u897f\u74dc, \u8611\u83c7\u6c64, \u80e1\u841d\u535c, \u9a6c\u94c3\u85af. Guides.Herbalism.Section.6=&3\u6d77\u62c9\u5c14\u7684\u795d\u798f\u5982\u4f55\u5de5\u4f5c?\n&e\u8fd9\u662f\u4e00\u4e2a\u4e3b\u52a8\u6280\u80fd,\u6709\u673a\u7387\u5728\u7528\u5251\u7834\u574f\u7279\u5b9a\n&e\u65b9\u5757\u65f6\u83b7\u5f97\u7a00\u6709\u9053\u5177. Guides.Herbalism.Section.7=&3\u53cc\u500d\u6389\u843d\u5982\u4f55\u5de5\u4f5c?\n&e\u8fd9\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd\u4f7f\u73a9\u5bb6\u80fd\u52a0\u500d\u6536\u83b7. -##\u6316\u77ff +##挖矿 Guides.Mining.Section.0=&3\u5173\u4e8e\u6316\u77ff:\n&e\u6316\u77ff\u5305\u62ec\u6316\u6398\u77f3\u5934\u548c\u77ff\u7269. \n&e\u6316\u77ff\u6280\u80fd\u53ef\u4ee5\u63d0\u4f9b\u591a\u91cd\u77ff\u7269\u6389\u843d\u7684\u5956\u52b1.\n\n&3\u7ecf\u9a8c\u6765\u6e90:\n&e\u83b7\u53d6\u6b64\u6280\u80fd\u7684\u7ecf\u9a8c\u503c, \u4f60\u5fc5\u987b\u62ff\u7740\u77ff\u9550\u8fdb\u884c\u6316\u6398.\n&e\u53ea\u6709\u7279\u5b9a\u65b9\u5757\u624d\u80fd\u83b7\u53d6\u7ecf\u9a8c. Guides.Mining.Section.1=&3\u517c\u5bb9\u6750\u6599:\n&e\u77f3\u5934,\u7164\u77ff\u77f3,\u94c1\u77ff\u77f3,\u91d1\u77ff\u77f3,\u94bb\u77f3\u77ff\u77f3,\u7ea2\u77f3\u77ff\u77f3,\n&e\u9752\u91d1\u77f3\u77ff\u77f3,\u9ed1\u66dc\u77f3,\u82d4\u77f3,\u672b\u5730\u77f3,\n&e\u8424\u77f3,\u5730\u72f1\u5ca9. Guides.Mining.Section.2=&3\u5982\u4f55\u4f7f\u7528\u8d85\u7ea7\u788e\u77f3\u673a:\n&e\u628a\u9550\u5b50\u62ff\u5728\u4f60\u7684\u624b\u4e0a,\u6309\u4e0b\u53f3\u952e\u6765\u51c6\u5907\u4f60\u7684\u9550\u5b50.\n&e\u4f60\u5c06\u67094\u79d2\u949f\u7684\u65f6\u95f4\u6765\u6fc0\u53d1\u4f60\u7684\u6280\u80fd.\n&e\u5f53\u4f60\u6572\u4e0b\u5bf9\u5e94\u7684\u77f3\u5934\u4ee5\u540e,\u8d85\u7ea7\u788e\u77f3\u673a\u5c06\u88ab\u6fc0\u6d3b. Guides.Mining.Section.3=&3\u4ec0\u4e48\u662f\u8d85\u7ea7\u788e\u77f3\u673a?\n&e\u8d85\u7ea7\u788e\u77f3\u673a\u662f\u4e00\u4e2a\u4e3b\u52a8\u6280\u80fd\n&e\u5b83\u80fd\u4f7f\u4f60\u5728\u6316\u6389\u5bf9\u5e94\u77ff\u77f3\u7684\u65f6\u5019\u589e\u52a03\u500d\u6389\u843d\u51e0\u7387\n&e\u5e76\u4e14\u5728\u6280\u80fd\u65f6\u95f4\u5185\u77ac\u95f4\u7834\u574f\u77f3\u5934\u548c\u77ff\u77f3 Guides.Mining.Section.4=&3\u5982\u4f55\u4f7f\u7528\u7206\u7834\u5f00\u91c7:\n&e\u628a\u96f7\u7ba1\u62ff\u5728\u624b\u4e0a,\u9ed8\u8ba4\u7684\u60c5\u51b5\u4e0b\u662f\u6253\u706b\u5668.\n&e\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=&3\u4ec0\u4e48\u662f\u7206\u7834\u5f00\u91c7?\n&e\u7206\u7834\u5f00\u91c7\u662f\u4e00\u4e2a\u9700\u8981\u51b7\u5374\u65f6\u95f4\u7684\u6316\u77ff\u6280\u80fd\n&e\u5b83\u80fd\u4f7f\u4f60\u5728\u4f7f\u7528TNT\u70b8\u77ff\u65f6\u83b7\u5f97\u989d\u5916\u5956\u52b1\n&e\u7206\u7834\u5f00\u91c7\u603b\u5171\u67093\u4e2a\u529f\u80fd\n&e\u5927\u53f7\u70b8\u5f39:\u4f7f\u4f60\u7684TNT\u7206\u70b8\u8303\u56f4\u6269\u5927\n&e\u7206\u7834\u4e13\u5bb6:\u964d\u4f4e\u4f60\u53d7\u5230TNT\u7684\u7206\u70b8\u4f24\u5bb3\n&e\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=&3\u5173\u4e8e\u4fee\u7406:\n&e\u4fee\u7406\u53ef\u4ee5\u8ba9\u4f60\u4f7f\u7528\u94c1\u5757\u6765\u4fee\u7406\u76d4\u7532\u548c\u5de5\u5177.\n\n&3\u7ecf\u9a8c\u6765\u6e90:\n&e\u4f7f\u7528mcmmo\u7684\u94c1\u7827\u4fee\u7406\u5de5\u5177\u6216\u88c5\u5907. \n&emcmmo\u9ed8\u8ba4\u7684\u4fee\u7406\u53f0\u662f\u94c1\u5757\n&e\u4e0d\u8981\u4e0e\u7528\u7ecf\u9a8c\u4fee\u590d\u7684\u94c1\u7827\u6df7\u6dc6. Guides.Repair.Section.1=&3\u5982\u4f55\u4f7f\u7528\u4fee\u7406?\n&e\u653e\u5047\u4e00\u4e2amcmmo\u94c1\u7827(\u94c1\u5757),\u624b\u6301\u9700\u8981\u4fee\u7406\u7684\u9053\u5177 \n&e\uff0c\u53f3\u952e\u70b9\u51fb\u94c1\u5757\uff0c\u6bcf\u6b21\u4f7f\u7528\u6d88\u8017\u4e00\u4e2a\u7269\u54c1 Guides.Repair.Section.2=&3\u4fee\u7406\u7cbe\u901a\u5982\u4f55\u5de5\u4f5c?\n&e\u4fee\u7406\u7cbe\u901a\u63d0\u5347\u4fee\u7406\u65f6\u8010\u4e45\u6062\u590d\u91cf. \n&e\u989d\u5916\u4fee\u7406\u7684\u8010\u4e45\u503c\u91cf\u53d6\u51b3\u4e8e\u4f60\u7684\u4fee\u7406\u6280\u80fd\u7b49\u7ea7. Guides.Repair.Section.3=&3\u8d85\u7ea7\u4fee\u7406\u5982\u4f55\u5de5\u4f5c?\n&e\u8d85\u7ea7\u4fee\u7406\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd. \u5f53\u4fee\u7406\u4e00\u4e2a\u7269\u54c1\u65f6,\n&e\u4f1a\u4f7f\u7269\u54c1\u7684\u4fee\u7406\u6548\u679c\u7ffb\u500d. Guides.Repair.Section.4=&3\u79d8\u6cd5\u953b\u9020\u5982\u4f55\u5de5\u4f5c?\n&e\u8fd9\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd\uff0c\u5141\u8bb8\u4f60\u4fee\u590d\u9644\u9b54\u7269\u54c1\n&e\u4fee\u7406\u7269\u54c1\u65f6\u6709\u4e00\u5b9a\u51e0\u7387\u4fdd\u7559\u9644\u9b54\u5c5e\u6027\n&e\u9644\u9b54\u5c5e\u6027\u53ef\u4ee5\u4fdd\u6301\u73b0\u6709\u7684\u7b49\u7ea7\uff0c\n&e\u964d\u7ea7\u5230\u4e00\u4e2a\u8f83\u4f4e\u7b49\u7ea7\u6216\u8005\u5b8c\u5168\u6d88\u5931. -##Salvage +##打捞 Guides.Salvage.Section.0=&3\u5173\u4e8e\u5206\u89e3:\n&e\u5206\u89e3\u4f7f\u4f60\u53ef\u4ee5\u4f7f\u7528\u91d1\u5757\u6765\u5206\u89e3\u88c5\u5907\u548c\u5de5\u5177.\n\n&3\u7ecf\u9a8c\u6765\u6e90:\n&e\u5206\u89e3\u65f6\u4fee\u7406\u548c\u9493\u9c7c\u7684\u5b50\u6280\u80fd\uff0c\n&e\u6280\u80fd\u7b49\u7ea7\u53d6\u51b3\u4e8e\u4f60\u7684\u9493\u9c7c\u548c\u4fee\u7406\u7684\u7b49\u7ea7. Guides.Salvage.Section.1=&3\u5982\u4f55\u4f7f\u7528\u5206\u89e3?\n&e\u653e\u4e00\u4e2amcmmo\u5206\u89e3\u7827(\u91d1\u5757)\u62ff\u7740\u7269\u54c1\u53f3\u952e\u91d1\u5757.\n&e\u8fd9\u5c06\u62c6\u89e3\u7269\u54c1,\u5e76\u8fd4\u8fd8\u7269\u54c1\u7684\u5236\u4f5c\u539f\u6599\n&e\u4f8b\u5982:\u62c6\u89e3\u94c1\u9550\u4f60\u5c06\u83b7\u5f97\u94c1\u952d. Guides.Salvage.Section.2=&3\u5982\u4f55\u4f7f\u7528\u8fdb\u9636\u5206\u89e3?\n&e\u89e3\u9501\u540e,\u6b64\u529f\u80fd\u4f7f\u4f60\u53ef\u4ee5\u5206\u89e3\u635f\u574f\u7684\u7269\u54c1.\n&e\u968f\u7740\u7b49\u7ea7\u7684\u63d0\u5347\u5206\u89e3\u6240\u5f97\u7684\u7269\u54c1\u4f1a\u83b7\u5f97\u66f4\u591a\u7684\u6750\u6599\n&e\u901a\u8fc7\u8fdb\u9636\u5206\u89e3\u4f60\u59cb\u7ec8\u80fd\u83b7\u5f97\u4e00\u4e2a\u6750\u6599.\n&e\u4e0d\u7528\u62c5\u5fc3\u4e0d\u4f1a\u83b7\u5f97\u6750\u6599\uff0c\u9664\u975e\u4f60\u7684\u8010\u4e45\u503c\u592a\u4f4e. Guides.Salvage.Section.3=&3\u4e3a\u4e86\u8bf4\u660e\u8fd9\u662f\u5982\u4f55\u5de5\u4f5c\u7684, \u8fd9\u6709\u4e00\u4e2a\u4f8b\u5b50:\n&e\u5047\u8bbe\u6211\u4eec\u5206\u89e3\u4e86\u4e00\u4e2a\u635f\u574f\u4e8620%\u7684\u91d1\u9550,\n&e\u4ea6\u4e3a\u4e4b\u4f60\u6700\u591a\u83b7\u5f97\u4e24\u4e2a\u91d1\u952d\n&e(\u56e0\u4e3a\u91d1\u9550\u4f7f\u7528\u4e09\u4e2a\u91d1\u952d\u5236\u4f5c\u7684\uff0c\n&e33,33% \u7684\u635f\u8017) \u7b49\u4e8e 66% \u7684\u8010\u4e45\u503c. \n&e\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=&3\u5982\u4f55\u4f7f\u7528\u5965\u672f\u5206\u89e3?\n&e\u8fd9\u4e2a\u6280\u80fd\u53ef\u4ee5\u4f7f\u4f60\u5728\u5206\u89e3\u9644\u9b54\u7269\u54c1\u65f6\u83b7\u5f97\u9644\u9b54\u4e66\n&e\u6839\u636e\u4f60\u7684\u5206\u89e3\u7b49\u7ea7\uff0c\u5206\u4e3a\u5168\u90e8\u63d0\u53d6\u548c\u90e8\u5206\u63d0\u53d6\n&e\u5f53\u5206\u89e3\u4f4d\u90e8\u5206\u63d0\u53d6\u65f6.\n\n&e\u9644\u9b54\u4e66\u7684\u9644\u9b54\u4e0e\u7269\u54c1\u76f8\u6bd4\n&e\u9644\u9b54\u7b49\u7ea7\u504f\u4f4e. -##Smelting +##冶炼 Guides.Smelting.Section.0=\u9a6c\u4e0a\u5230\u6765... -##\u5251\u672f +##剑术 Guides.Swords.Section.0=&3\u5173\u4e8e\u5251\u672f:\n&e\u8fd9\u4e2a\u6280\u80fd\u5728\u4f7f\u7528\u5251\u8fdb\u884c\u6218\u6597\u65f6\n&e\u63d0\u4f9b\u5404\u79cd\u52a0\u6210.\n\n&3\u7ecf\u9a8c\u6765\u6e90:\n&e\u7ecf\u9a8c\u503c\u662f\u901a\u8fc7\u7528\u5251\u5bf9\u602a\u7269\u6216\u5176\u4ed6\u73a9\u5bb6 \n&e\u9020\u6210\u4f24\u5bb3\u83b7\u5f97. Guides.Swords.Section.1=&3\u5982\u4f55\u4f7f\u7528\u5229\u5203\u7a81\u523a?\n&e\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&e\u8fd9\u4e2a\u6280\u80fd\u8ba9\u4f60\u53d1\u52a8\u8303\u56f4\u653b\u51fb\uff0c\u63d0\u4f9b25%\u7684\u4f24\u5bb3\u52a0\u6210 \n&e\u5e76\u4f34\u6709\u6495\u88c2\u6548\u679c. Guides.Swords.Section.2=&3\u53cd\u51fb\u5982\u4f55\u5de5\u4f5c?\n&e\u53cd\u51fb\u662f\u4e00\u4e2a\u4e3b\u52a8\u6280\u80fd\uff0c\u683c\u6321\u5bf9\u624b\u5bf9\u4f60\u7684\u4f24\u5bb3\n&e\u5e76\u6709\u51e0\u7387\u53cd\u5c0450%\u7684\u4f24\u5bb3\u7ed9\u5bf9\u624b. Guides.Swords.Section.3=&3\u6495\u88c2\u5982\u4f55\u5de5\u4f5c?\n&e\u6495\u88c2\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd\uff0c\u653b\u51fb\u65f6\u6709\u51e0\u7387\u51fa\u53d1\u6495\u88c2. \n&e\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&e\u6301\u7eed\u65f6\u95f4\u53d6\u51b3\u4e8e\u4f60\u7684\u5251\u672f\u7b49\u7ea7. -##Taming +##驯兽 Guides.Taming.Section.0=&3\u9a6f\u517d\n&e\u9a6f\u517d\u6280\u80fd\u8ba9\u73a9\u5bb6\u80fd\u5728\u7528\u72fc\u6218\u6597\u65f6\n&e\u65f6\u6709\u52a0\u6210\u6548\u679c.\n\n&3\u7ecf\u9a8c\u6765\u6e90:\n&e\u8981\u83b7\u53d6\u7ecf\u9a8c,\u987b\u8bad\u670d\u72fc\u6216\u8c79\u732b,\n&e\u6216\u4e0e\u4f60\u7684\u72fc\u4e00\u540c\u6218\u6597. Guides.Taming.Section.1=&3\u4ec0\u4e48\u662f\u91ce\u6027\u547c\u558a?\n&e\u91ce\u6027\u547c\u558a\u662f\u4e00\u4e2a\u4e3b\u52a8\u6280\u80fd\u8ba9\u4f60\n&e\u53ef\u4ee5\u53ec\u5524\u4e00\u53ea\u72fc\u6216\u8c79\u732b,\n&e\u53ea\u8981\u624b\u6301\u9aa8\u5934\u6216\u751f\u9c7c,\u70b9\u5de6\u952e. Guides.Taming.Section.2=&3\u4ec0\u4e48\u662f\u91ce\u517d\u4fe1\u606f?\n&e\u91ce\u517d\u4fe1\u606f\u80fd\u8ba9\u4f60\u67e5\u770b\u5ba0\u7269\u7684\u72b6\u6001,\n&e\u5bf9\u5ba0\u7269\u70b9\u51fb\u5de6\u952e\u5c31\u80fd\u4f7f\u7528\u8fd9\u9879\u80fd\u529b. @@ -940,24 +957,24 @@ Guides.Taming.Section.5=&3\u4ec0\u4e48\u662f\u73af\u5883\u611f\u77e5?\n&e\u8fd9\ Guides.Taming.Section.6=&3\u4ec0\u4e48\u662f\u6bdb\u76ae\u5f3a\u5316?\n&e\u8fd9\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd\u80fd\u8ba9\u72fc\n&e\u53d7\u5230\u653b\u51fb\u6216\u71c3\u70e7\u65f6\u51cf\u514d\u4f24\u5bb3. Guides.Taming.Section.7=&3\u4ec0\u4e48\u662f\u51b2\u51fb\u6297\u6027?\n&e\u8fd9\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd,\u8ba9\u72fc\u7fa4\n&e\u51cf\u514d\u7206\u70b8\u4f24\u5bb3. Guides.Taming.Section.8=&3\u4ec0\u4e48\u662f\u5feb\u9910\u670d\u52a1?\n&e\u8fd9\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd,\u8ba9\u72fc\u7fa4\u5728\u653b\u51fb\u65f6\n&e\u6709\u51e0\u7387\u6062\u590d\u8840\u91cf. -##Unarmed +##格斗 Guides.Unarmed.Section.0=&3\u683c\u6597:\n&e\u683c\u6597\u4f7f\u73a9\u5bb6\u5728\u4f7f\u7528\u62f3\u5934\u4f5c\u6218\u65f6\u6709\n&e\u5404\u79cd\u52a0\u6210\u6548\u679c.\n\n&3\u7ecf\u9a8c\u83b7\u53d6:\n&e\u5728\u7528\u624b\u653b\u51fb\u602a\u7269\u6216\u73a9\u5bb6\u65f6\u53ef\u4ee5\u83b7\u53d6\u7ecf\u9a8c. Guides.Unarmed.Section.1=&3\u4ec0\u4e48\u662f\u72c2\u66b4?\n&e\u72c2\u66b4\u662f\u4e3b\u52a8\u6280\u80fd,\u7a7a\u624b\u65f6\u70b9\u51fb\u53f3\u952e\u53d1\u52a8.\n&e\u72c2\u66b4\u53ef\u4ee5\u52a0\u621050%\u5bf9\u65b9\u5757\u7684\u4f24\u5bb3,\n&e\u4f7f\u4f60\u53ef\u4ee5\u8f7b\u677e\u7834\u574f\u8106\u5f31\u7269\u4f53,\n&e\u5982\u6ce5\u571f\u4e0e\u6c99\u5b50. Guides.Unarmed.Section.2=&3\u4ec0\u4e48\u662f\u94c1\u81c2\u5f0f?\n&e\u94c1\u81c2\u80fd\u589e\u52a0\u5f92\u624b\u653b\u51fb\u602a\u7269\u6216\n&e\u73a9\u5bb6\u7684\u4f24\u5bb3. Guides.Unarmed.Section.3=&3\u4ec0\u4e48\u662f\u7bad\u77e2\u504f\u5411?\n&e\u7bad\u77e2\u504f\u5411\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd,\u8ba9\u4f60\u6709\u673a\u7387\n&e\u80fd\u6539\u53d8\u9ab7\u9ac5\u83b7\u73a9\u5bb6\u5c04\u5411\u4f60\u7684\u7bad\u7684\u65b9\u5411.\n&e\u7bad\u4f1a\u843d\u81f3\u5730\u9762. Guides.Unarmed.Section.4=&3\u4ec0\u4e48\u662f\u94c1\u8155?\n&e\u94c1\u8155\u6709\u51e0\u7387\u9632\u6b62\u5bf9\u624b\u7684\u7f34\u68b0.\n&e\u51fa\u53d1\u7684\u51e0\u7387\u5374\u51b3\u4e8e\u4f60\u683c\u6597\u7684\u7b49\u7ea7. Guides.Unarmed.Section.5=&3\u4ec0\u4e48\u662f\u7f34\u68b0?\n&e\u8fd9\u4e2a\u88ab\u52a8\u6280\u80fd\u8ba9\u73a9\u5bb6\u89e3\u9664\u5176\u4ed6\u73a9\u5bb6\u7684\u6b66\u88c5,\n&e\u4f7f\u76ee\u6807\u6240\u88c5\u5907\u7684\u7269\u54c1\u6389\u843d\u5230\u5730\u4e0a. -##Woodcutting +##伐木 Guides.Woodcutting.Section.0=&3\u5173\u4e8e\u4f10\u6728:\n&e\u4f10\u6728\u662f\u5173\u4e8e\u780d\u6811\u7684.\n\n&3\u7ecf\u9a8c\u6765\u6e90:\n&e\u7834\u574f\u6728\u5934\u7c7b\u7684\u65b9\u5757\u5c31\u4f1a\u83b7\u5f97\u4f10\u6728\u7ecf\u9a8c. Guides.Woodcutting.Section.1=&3\u4f10\u6728\u5de5\u5982\u4f55\u5de5\u4f5c?\n&e\u4f10\u6728\u5de5\u662f\u4e00\u4e2a\u4e3b\u52a8\u6280\u80fd\n&e\u5728\u624b\u6301\u65a7\u5934\u7684\u540c\u65f6\u53f3\u952e\u5e76\u7834\u574f\u6728\u5934\u4ee5\u6fc0\u6d3b\u4f10\u6728\u5de5\n&e\u8fd9\u5c06\u77ac\u95f4\u7834\u574f\u6574\u68f5\u6811. Guides.Woodcutting.Section.2=&3\u79cb\u98ce\u626b\u843d\u53f6\u5982\u4f55\u5de5\u4f5c?\n&e\u79cb\u98ce\u626b\u843d\u53f6\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd\n&e\u5f53\u65a7\u5934\u51fb\u4e2d\u6811\u53f6\u65b9\u5757\u65f6\u4f1a\u5bfc\u81f4\u77ac\u95f4\u6d88\u5931\n&e\u9ed8\u8ba4\u60c5\u51b5\u4e0b\uff0c100\u7ea7\u89e3\u9501. Guides.Woodcutting.Section.3=&3\u6811\u6728\u4e30\u6536\u5982\u4f55\u5de5\u4f5c?\n&e\u8fd9\u4e2a\u88ab\u52a8\u6280\u80fd\u4f7f\u4f60\u5728\u780d\u6811\u65f6\n&e\u6709\u51e0\u7387\u6389\u843d\u53cc\u500d\u6728\u5934. -#INSPECT +#检查 Inspect.Offline= &c\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 &e{0} Inspect.Stats=&e{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 @@ -969,10 +986,10 @@ Item.Injured.Wait=\u4f60\u6700\u8fd1\u53d7\u4f24\u4e86\u6240\u4ee5\u4f60\u5fc5\u Item.FluxPickaxe.Name=\u707c\u70ed\u4e4b\u9550 Item.FluxPickaxe.Lore.1=&7\u6709\u51e0\u7387\u77ac\u95f4\u7194\u70bc\u77ff\u7269\u3002 Item.FluxPickaxe.Lore.2=&7\u9700\u8981\u7194\u70bc\u7b49\u7ea7 {0}+ -#TELEPORTATION +#传送 Teleport.Commencing=&7\u4f20\u9001\u5c06\u5728 &6({0}) &7 \u79d2\u540e\u8fdb\u884c, \u8bf7\u4fdd\u6301\u7ad9\u7acb\u4e0d\u52a8... Teleport.Cancelled=&4\u4f20\u9001\u5df2\u53d6\u6d88! -#SKILLS +#技能 Skills.Child=&6(\u5206\u652f\u6280\u80fd) Skills.Disarmed=&4\u4f60\u88ab\u7f34\u68b0\u4e86! Skills.Header=-----[] &a{0}&c []----- @@ -983,15 +1000,17 @@ Skills.Stats={0}&a{1}&3 XP(&7{2}&3/&7{3}&3) Skills.ChildStats={0}&a{1} Skills.MaxXP=\u6700\u5927 Skills.TooTired=\u4f60\u592a\u7d2f\u4e86\u6682\u65f6\u65e0\u6cd5\u4f7f\u7528\u8be5\u6280\u80fd.&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} &c\u5df2\u53d6\u6d88! Skills.ConfirmOrCancel=&a\u518d\u6b21\u53f3\u952e\u4ee5\u786e\u5b9a &6{0}&a. \u5de6\u952e\u53d6\u6d88. Skills.AbilityGateRequirementFail=&7\u4f60\u9700\u8981 &e{0}&7 \u7ea7\u4ee5\u4e0a\u7684 &3{1}&7 \u6765\u4f7f\u7528\u8fd9\u4e2a\u80fd\u529b. -#STATISTICS +#数据 Stats.Header.Combat=&6-=\u683c\u6597\u6280\u80fd=- Stats.Header.Gathering=&6-=\u91c7\u96c6\u6280\u80fd=- Stats.Header.Misc=&6-=\u6742\u9879\u6280\u80fd=- Stats.Own.Stats=&a[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 @@ -1003,7 +1022,7 @@ 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=&6 ({0} \u79d2\u989d\u5916\u6301\u7eed\u65f6\u95f4) -#HARDCORE +#硬核 Hardcore.Mode.Disabled=&6[mcMMO] \u786c\u6838\u6a21\u5f0f {0} \u5173\u95ed. {1} Hardcore.Mode.Enabled=&6[mcMMO] \u786c\u6838\u6a21\u5f0f {0} \u542f\u7528. {1} Hardcore.DeathStatLoss.Name=\u6280\u80fd\u6b7b\u4ea1\u60e9\u7f5a @@ -1023,7 +1042,7 @@ MOTD.Hardcore.Vampirism.Stats=&6[mcMMO] &3Vampirism\u7edf\u8ba1: &4{0}% MOTD.PerksPrefix=&6[mcMMO \u80fd\u529b] MOTD.Version=&6[mcMMO] \u6b63\u5728\u8fd0\u884c\u7248\u672c &3{0} MOTD.Website=&6[mcMMO] &a{0}&e - 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: &e{0} \u500d @@ -1042,7 +1061,7 @@ Smelting.SubSkill.FluxMining.Description=\u6316\u77ff\u65f6\u4e00\u5b9a\u51e0\u7 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 @@ -1075,10 +1094,10 @@ 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=&emcMMO \u7edf\u8ba1 Scoreboard.Header.PlayerCooldowns=&emcMMO \u51b7\u5374 Scoreboard.Header.PlayerRank=&emcMMO \u6392\u540d @@ -1091,21 +1110,35 @@ Scoreboard.Misc.RemainingXP=&e\u5347\u7ea7\u6240\u9700\u7ecf\u9a8c Scoreboard.Misc.Cooldown=&d\u51b7\u5374 Scoreboard.Misc.Overall=&6\u603b\u4f53 Scoreboard.Misc.Ability=\u80fd\u529b -#DATABASE RECOVERY +#数据库恢复 Profile.PendingLoad=&c\u4f60\u7684mcmmo\u73a9\u5bb6\u6570\u636e\u672a\u52a0\u8f7d. Profile.Loading.Success=&a\u4f60\u7684mcMMO\u6570\u636e\u5df2\u52a0\u8f7d Profile.Loading.Failure=&cmcMMO \u65e0\u6cd5\u52a0\u8f7d\u4f60\u7684\u6570\u636e. \u8bf7\u8054\u7cfb &b\u670d\u52a1\u5668\u7ba1\u7406\u5458\u53cd\u9988\u4f60\u7684\u95ee\u9898.\n&e\u4f60\u53ef\u4ee5\u7ee7\u7eed\u5728\u670d\u52a1\u5668\u6e38\u73a9, \u4f46\u662f\u4f60 &l\u6ca1\u6709mcMMO\u7b49\u7ea7&e \u5e76\u4e14\u4f60\u83b7\u5f97\u7684\u4efb\u4f55\u7ecf\u9a8c\u90fd &l\u4e0d\u4f1a\u88ab\u4fdd\u5b58&e. Profile.Loading.AdminFailureNotice=&4[A]&c mcMMO \u65e0\u6cd5\u52a0\u8f7d\u73a9\u5bb6 &e{0}&c \u7684\u6570\u636e. &d\u8bf7\u68c0\u67e5\u4f60\u7684\u6570\u636e\u5e93. -#Holiday +#节日 Holiday.AprilFools.Levelup=&6{0} \u73b0\u5728 &a{1}&6 \u7ea7! Holiday.Anniversary=&9mcMMO {0} \u5468\u5e74\u5feb\u4e50!\n&9\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=&7\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=&a\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=&6(&amcMMO&6) &e\u4f60\u5df2\u7ecf\u5230\u8fbe\u4e86\u6218\u6597\u529b\u7684\u7b49\u7ea7\u5c01\u9876 &c{0}&e \u7ea7. \u4f60\u5c06\u505c\u6b62\u83b7\u53d6\u6280\u80fd\u7ecf\u9a8c. LevelCap.Skill=&6(&amcMMO&6) &e\u4f60\u5df2\u7ecf\u5230\u8fbe\u4e86 &6{1}&e \u6280\u80fd\u7684\u7b49\u7ea7\u5c01\u9876 &c{0}&e . \u4f60\u7684\u8be5\u6280\u80fd\u5c06\u65e0\u6cd5\u518d\u5347\u7ea7. -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. +Commands.XPBar.Usage=\u6b63\u786e\u7684\u7528\u6cd5\u662f /mmoxpbar +Commands.Description.mmoxpbar=mcMMO \u7ecf\u9a8c\u6761\u7684\u8bbe\u7f6e +Commands.Description.mmocompat=\u6709\u5173 mcMMO \u006d\u0063\u004d\u004d\u004f\u0020\u4ee5\u53ca\u5b83\u662f\u5426\u5904\u4e8e\u517c\u5bb9\u6a21\u5f0f\u6216\u529f\u80fd\u9f50\u5168\u7684\u4fe1\u606f\u3002. +Compatibility.Layer.Unsupported=&6\u6b64\u7248\u672c\u7684 Minecraft \u4e0e &a{0}&6 \u4e0d\u517c\u5bb9. +Compatibility.Layer.PartialSupport=&6\u6b64\u7248\u672c\u7684 Minecraft \u4e0e &a{0}&6 \u4e0d\u5b8c\u5168\u517c\u5bb9, \u4f46\u662f mcMMO \u6b63\u5728\u8fd0\u884c\u4e00\u4e2a\u8f85\u52a9\u7cfb\u7edf\u6765\u6a21\u62df\u4e00\u4e9b\u7f3a\u5931\u7684\u529f\u80fd\u3002. +Commands.XPBar.DisableAll=&6 \u6240\u6709\u7684 mcMMO \u7ecf\u9a8c\u6761\u73b0\u5728\u90fd\u5df2\u7ecf\u88ab\u7981\u7528, \u4f7f\u7528 /mmoxpbar reset \u6765\u91cd\u7f6e\u9ed8\u8ba4\u8bbe\u7f6e. +#现代聊天设置 +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* \u63a7\u5236\u53f0 * +Chat.Channel.On=&6(&amcMMO-\u804a\u5929&6) &e\u4f60\u7684\u804a\u5929\u6d88\u606f\u73b0\u5728\u5c06\u81ea\u52a8\u53d1\u9001\u5230 &a{0}&e \u804a\u5929\u9891\u9053. +Chat.Channel.Off=&6(&amcMMO-\u804a\u5929&6) &7\u4f60\u7684\u804a\u5929\u6d88\u606f\u5c06\u4e0d\u518d\u81ea\u52a8\u53d1\u9001\u5230\u7279\u5b9a\u7684\u804a\u5929\u9891\u9053. +Chat.Spy.Party=&6[&eSPY&6-&a{2}&6] &r{0} &b\u2192 &r{1} +Broadcasts.LevelUpMilestone=&6(&amcMMO&6) {0}&7 \u4e8e &3{2}&7 \u4e2d\u8fbe\u5230\u4e86 &a{1}&7 \u7ea7! +Broadcasts.PowerLevelUpMilestone=&6(&amcMMO&6) {0}&7 \u5df2\u7ecf\u8fbe\u5230 &a{1}&7 \u6700\u9ad8\u7b49\u7ea7! +Scoreboard.Recovery=\u6b63\u5728\u5c1d\u8bd5\u6062\u590d mcMMO \u8bb0\u5206\u724c... \ No newline at end of file From dfa16c70a71e0a4aa1d591b3a12b989526529764 Mon Sep 17 00:00:00 2001 From: Griffin Kubesa Date: Tue, 10 Aug 2021 16:13:25 -0500 Subject: [PATCH 587/662] Set TNT source in blast mining (#4580) * Set TNT source in blast mining * Compatibility with older versions Co-authored-by: TheBusyBiscuit Co-authored-by: TheBusyBiscuit --- .../java/com/gmail/nossr50/skills/mining/MiningManager.java | 3 +++ 1 file changed, 3 insertions(+) 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 209b8ebbf..61a42e29b 100644 --- a/src/main/java/com/gmail/nossr50/skills/mining/MiningManager.java +++ b/src/main/java/com/gmail/nossr50/skills/mining/MiningManager.java @@ -123,6 +123,9 @@ public class MiningManager extends SkillManager { tnt.setMetadata(mcMMO.tntMetadataKey, mmoPlayer.getPlayerMetadata()); tnt.setFuseTicks(0); + if (mcMMO.getCompatibilityManager().getMinecraftGameVersion().isAtLeast(1, 16, 4)) { + tnt.setSource(player); + } targetBlock.setType(Material.AIR); mmoPlayer.setAbilityDATS(SuperAbilityType.BLAST_MINING, System.currentTimeMillis()); From d3f012de277e3a9331a7bded654ab7c66b27600f Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 10 Aug 2021 14:14:07 -0700 Subject: [PATCH 588/662] Update changelog --- Changelog.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Changelog.txt b/Changelog.txt index a41b9c7c8..f54367eb3 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,8 +1,10 @@ Version 2.1.201 + (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! Version 2.1.200 Fixed a major 1.17 exploit From 7fc7125ed37b98bc9e9a0aafa773ff9d804b4635 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=98=AD=E8=98=AD=E9=9C=B2=20Flandre=5Ftw?= <51469621+gregman98@users.noreply.github.com> Date: Wed, 11 Aug 2021 05:14:45 +0800 Subject: [PATCH 589/662] Reupload new Chinese Traditional translation (#4584) Hello, I have completed the Chinese Traditional translation. :) --- .../resources/locale/locale_zh_TW.properties | 1767 ++++++++++------- 1 file changed, 1066 insertions(+), 701 deletions(-) diff --git a/src/main/resources/locale/locale_zh_TW.properties b/src/main/resources/locale/locale_zh_TW.properties index d699f5d3b..04af680c2 100644 --- a/src/main/resources/locale/locale_zh_TW.properties +++ b/src/main/resources/locale/locale_zh_TW.properties @@ -1,779 +1,1144 @@ -Acrobatics.Ability.Proc=&a**\u5b8c\u7f8e\u8457\u9678** +#I'm going to try to normalize our locale file\uff0cforgive 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=\u7b49\u7d1a +JSON.DescriptionHeader=\u63cf\u8ff0 +JSON.JWrapper.Header=\u7d30\u7bc0 +JSON.Type.Passive=\u88ab\u52d5 +JSON.Type.Active=Active +JSON.Type.SuperAbility=\u8d85\u80fd\u529b +JSON.Locked=-=[\u9396\u5b9a]=- +JSON.LevelRequirement=\u7b49\u7d1a\u9700\u6c42 +JSON.JWrapper.Target.Type=\u76ee\u6a19\u985e\u578b \uff1a +JSON.JWrapper.Target.Block=\u65b9\u584a +JSON.JWrapper.Target.Player=\u73a9\u5bb6 +JSON.JWrapper.Perks.Header=&6\u5e78\u904b\u6d25\u8cbc +JSON.JWrapper.Perks.Lucky={0}% \u66f4\u597d\u7684\u8ce0\u7387 +JSON.Hover.Tips=\u5c0f\u63d0\u9192 +JSON.Acrobatics=\u96dc\u6280 +JSON.Alchemy=\u7149\u91d1\u8853 +JSON.Archery=\u7bad\u8853 +JSON.Axes=\u65a7\u6280 +JSON.Excavation=\u6316\u6398 +JSON.Fishing=\u91e3\u9b5a +JSON.Herbalism=\u8349\u85e5\u5b78 +JSON.Mining=\u6316\u7926 +JSON.Repair=\u4fee\u7406 +JSON.Salvage=\u5206\u89e3 +JSON.Swords=\u528d\u8853 +JSON.Taming=\u99b4\u7378 +JSON.Unarmed=\u683c\u9b25 +JSON.Woodcutting=\u4f10\u6728 +JSON.URL.Website=mcMMO \u5b98\u65b9\u7db2\u7ad9 \uff01 +JSON.URL.Discord=mcMMO \u5b98\u65b9 Discord \u4f3a\u670d\u5668 \uff01 +JSON.URL.Patreon=\u652f\u63f4 nossr50 \u548c\u4ed6\u5728 Patreon \u4e0a\u70ba mcMMO \u6240\u505a\u7684\u5de5\u4f5c \uff01 +JSON.URL.Spigot=\u5b98\u65b9 mcMMO \u5728 Spigot \u4e0a\u7684\u8cc7\u6e90\u9801\u9762 \uff01 +JSON.URL.Translation=\u5c07 mcMMO \u7ffb\u8b6f\u6210\u5176\u4ed6\u8a9e\u8a00 \uff01 +JSON.URL.Wiki=\u5b98\u65b9 mcMMO \u7dad\u57fa\u767e\u79d1 \uff01 +JSON.SkillUnlockMessage=&6[mcMMO &e@&3{0} &6\u89e3\u9396\u7b49\u7d1a &3{1}&6 \u7d1a\uff01] +JSON.Hover.Rank=&e&l\u7b49\u7d1a \uff1a &r&f{0} +JSON.Hover.NextRank=&7&o\u4e0b\u6b21\u5347\u7d1a\u7b49\u7d1a {0} +# for JSON.Hover.Mystery you can add {0} to insert the level required into the name\uff0cI don't like how that looks so I'm not doing that atm +JSON.Hover.Mystery=&7\uff1f\uff1f\uff1f +JSON.Hover.Mystery2=&e[&8{0}&e]&8\uff1f\uff1f\uff1f&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=\u6e2c\u8a66 &c\u7ffb\u6efe\u6e2c\u8a66 +JSON.Acrobatics.SubSkill.Roll.Details.Tips=\u5982\u679c\u4f60\u5728\u6454\u843d\u6642\u6309\u4e0b\u8e72\u4e0b\u9375\uff0c\u4f60\u5c07\u89f8\u767c\u96d9\u500d\u7ffb\u6efe\u6548\u679c +Anvil.SingleItemStack=&c\u4f60\u4e0d\u80fd\u5206\u89e3\u6216\u4fee\u7406\u6709\u591a\u500b\u7269\u54c1\u7684\u7269\u54c1\u5806\uff0c\u8acb\u62c6\u5206\u5f8c\u518d\u4f7f\u7528\u3002 + +#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\uff08&amcMMO&6\uff09 +# BEGIN STYLING +Ability.Generic.Refresh=&a**\u6280\u80fd\u51b7\u537b\u5b8c\u7562 \uff01** +Ability.Generic.Template.Lock=&7{0} +# Skill Command Styling +Ability.Generic.Template=&3{0} \uff1a &a{1} +Ability.Generic.Template.Custom=&3{0} +Skills.Overhaul.Header=&c[]=====[]&a {0} &c[]=====[] +Effects.Effects=\u6548\u679c +Effects.SubSkills.Overhaul=\u5b50\u6280\u80fd +Effects.Child.Overhaul=&3\u5b50\u7b49\u7d1a Lv.& {0}&3 \uff1a {1} +Effects.Child.ParentList=&a{0}&6\uff08&3Lv.&{1}&6\uff09 +Effects.Level.Overhaul=&6\u7b49\u7d1a \uff1a &e{0} &3XP&e\uff08&6{1}&e/&6{2}&e\uff09 +Effects.Parent=&6{0} - +Effects.Template=&3{0} \uff1a &a{1} +Commands.Stats.Self.Overhaul=\u7d71\u8a08 +Commands.XPGain.Overhaul=&6\u7d93\u9a57\u4f86\u6e90 \uff1a &3{0} +MOTD.Version.Overhaul=&6[mcMMO] &3\u5927\u6539\u7248\u672c&6 - &3{0} +Overhaul.mcMMO.Header=&c[]=====[]&a mcMMO - \u5927\u6539\u7248\u672c &c[]=====[] +Overhaul.mcMMO.Url.Wrap.Prefix=&c[| +Overhaul.mcMMO.Url.Wrap.Suffix=&c|] +Overhaul.mcMMO.MmoInfo.Wiki=&e[&f\u5728\u7dad\u57fa\u767e\u79d1\u4e0a\u67e5\u770b\u6b64\u6280\u80fd \uff01&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}\u63d0\u5347\u5230&r&a&l{2}&r&f \u7d1a\u3002 +Overhaul.Name.Acrobatics=\u96dc\u6280 +Overhaul.Name.Alchemy=\u7149\u91d1\u8853 +Overhaul.Name.Archery=\u7bad\u8853 +Overhaul.Name.Axes=\u65a7\u6280 +Overhaul.Name.Excavation=\u6316\u6398 +Overhaul.Name.Fishing=\u91e3\u9b5a +Overhaul.Name.Herbalism=\u8349\u85e5\u5b78 +Overhaul.Name.Mining=\u6316\u7926 +Overhaul.Name.Repair=\u4fee\u7406 +Overhaul.Name.Salvage=\u5206\u89e3 +Overhaul.Name.Smelting=\u51b6\u7149 +Overhaul.Name.Swords=\u528d\u8853 +Overhaul.Name.Taming=\u99b4\u7378 +Overhaul.Name.Unarmed=\u683c\u9b25 +Overhaul.Name.Woodcutting=\u4f10\u6728 +# /mcMMO Command Style Stuff +Commands.mcc.Header=&c---[]&amcMMO \u6307\u4ee4&c[]--- +Commands.Other=&c---[]&a\u5176\u4ed6\u6307\u4ee4&c[]--- +Commands.Party.Header=&c-----[]&a\u968a\u4f0d&c[]----- +Commands.Party.Features.Header=&c-----[]&a\u7279\u8272&c[]----- +# XP BAR Allows for the following variables -- {0} = Skill Level\uff0c{1} Current XP\uff0c{2} XP Needed for next level\uff0c{3} Power Level\uff0c{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 \uff01 +XPBar.Template={0} +XPBar.Template.EarlyGameBoost=&6\u6b63\u5728\u5b78\u7fd2\u65b0\u6280\u80fd\u2026\u2026 +XPBar.Acrobatics=\u96dc\u6280 Lv.&6{0} +XPBar.Alchemy=\u7149\u91d1\u8853 Lv.&6{0} +XPBar.Archery=\u7bad\u8853 Lv.&6{0} +XPBar.Axes=\u65a7\u6280 Lv.&6{0} +XPBar.Excavation=\u6316\u6398 Lv.&6{0} +XPBar.Fishing=\u91e3\u9b5a Lv.&6{0} +XPBar.Herbalism=\u8349\u85e5\u5b78 Lv.&6{0} +XPBar.Mining=\u6316\u7926 Lv.&6{0} +XPBar.Repair=\u4fee\u7406 Lv.&6{0} +XPBar.Salvage=\u5206\u89e3 Lv.&6{0} +XPBar.Smelting=\u51b6\u7149 Lv.&6{0} +XPBar.Swords=\u528d\u8853 Lv.&6{0} +XPBar.Taming=\u99b4\u7378 Lv.&6{0} +XPBar.Unarmed=\u683c\u9b25 Lv.&6{0} +XPBar.Woodcutting=\u4f10\u6728 Lv.&6{0} +#This is just a preset template that gets used if the 'ExtraDetails' setting is turned on in experience.yml \uff08off by default\uff09\uff0cyou can ignore this template and just edit the strings above +XPBar.Complex.Template={0} &3{4}&f% &3\uff08&f{1}&3/&f{2}&3\uff09 +# XP BAR Allows for the following variables -- {0} = Skill Level\uff0c{1} Current XP\uff0c{2} XP Needed for next level\uff0c{3} Power Level\uff0c{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 \uff01 +# END STYLING + +#ACROBATICS +Acrobatics.Ability.Proc=&a**\u83ef\u723e\u8332\u822c\u7684\u964d\u843d** Acrobatics.Combat.Proc=&a**\u8ff4\u907f** -Acrobatics.DodgeChance=\u8ff4\u907f\u6a5f\u7387: &e{0} +Acrobatics.SubSkill.Roll.Stats=&6\u7ffb\u6efe\u6a5f\u7387 &e{0}%&6 \u512a\u96c5\u7ffb\u6efe\u6a5f\u7387&e {1}% +Acrobatics.SubSkill.Roll.Stat=\u7ffb\u6efe\u6a5f\u7387 +Acrobatics.SubSkill.Roll.Stat.Extra=\u512a\u96c5\u7ffb\u6efe\u6a5f\u7387 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.Roll.Description=\u6e1b\u5c11\u6216\u8005\u53d6\u6d88\u6389\u843d\u50b7\u5bb3\u3002 +Acrobatics.SubSkill.Roll.Chance=\u7ffb\u6efe\u6a5f\u7387 \uff1a &e{0} +Acrobatics.SubSkill.Roll.GraceChance=\u512a\u96c5\u7684\u7ffb\u6efe\u6a5f\u7387 \uff1a &e{0} +Acrobatics.SubSkill.Roll.Mechanics=&7\u7ffb\u6efe\u662f\u96dc\u6280\u7684\u88ab\u52d5\u5b50\u6280\u80fd\u3002\n\u7576\u4f60\u53d7\u5230\u6454\u843d\u50b7\u5bb3\u6642\uff0c\u6709\u6a5f\u7387\u6703\u6839\u64da\u4f60\u7684\u96dc\u6280\u6280\u80fd\u7b49\u7d1a\u7372\u5f97\u6e1b\u5c11\u50b7\u5bb3\u6216\u514d\u9664\u50b7\u5bb3\uff0c\u5728\u4f60 50 \u7d1a\u6642\u4f60\u6709 &e{0}%&7 \u7684\u6a5f\u7387\u7372\u5f97\u6e1b\u5c11\u50b7\u5bb3\u6216\u514d\u9664\u50b7\u5bb3\uff0c\u5982\u679c\u4f60\u958b\u555f\u512a\u96c5\u7684\u7ffb\u6efe\u5247\u6709 &e{1}%&7 \u7684\u6a5f\u7387\u89f8\u767c\u96d9\u500d\u7ffb\u6efe\u6548\u679c\u3002\n\u89f8\u767c\u7684\u6a5f\u7387\u6703\u96a8\u8457\u4f60\u6280\u80fd\u7b49\u7d1a\u7dda\u6027\u589e\u9577\uff0c\u76f4\u5230 &e{2}&7 \u7d1a\uff0c\u6bcf\u4e00\u7d1a\u7684\u96dc\u6280\u7b49\u7d1a\u63d0\u4f9b &e{3}%&7 \u7684\u89f8\u767c\u6a5f\u7387\u3002\n\u900f\u904e\u6309\u4f4f\u8e72\u4e0b\u9375 \uff08shift\uff09 \u53ef\u4ee5\u7ffb\u500d\u7ffb\u6efe\u6a5f\u7387\u4ee5\u53ca\u96d9\u500d\u6e1b\u5c11\u50b7\u5bb3\u6548\u679c \uff01 \u7ffb\u6efe\u6700\u591a\u6e1b\u5c11\u50b7\u5bb3 &c{4}&7 \u9ede\u50b7\u5bb3\u3002 \u512a\u96c5\u7ffb\u6efe\u6700\u591a\u6e1b\u5c11\u50b7\u5bb3 &a{5}&7 \u9ede\u50b7\u5bb3\u3002 +Acrobatics.SubSkill.GracefulRoll.Name=\u512a\u96c5\u7ffb\u6efe +Acrobatics.SubSkill.GracefulRoll.Description=\u666e\u901a\u7ffb\u6efe\u7684\u96d9\u500d\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: &e{0} -Acrobatics.SubSkill.Roll.GraceChance=\u6f02\u4eae\u7ffb\u6efe\u6a5f\u7387: &e{0} -Acrobatics.Roll.Text=**\u7ffb\u6efe** +Acrobatics.SubSkill.Dodge.Description=\u6e1b\u5c11\u4e00\u534a\u6240\u53d7\u653b\u64ca\u50b7\u5bb3 +Acrobatics.SubSkill.Dodge.Stat=\u8ff4\u907f\u6a5f\u7387 +Acrobatics.Listener=\u96dc\u6280 \uff08Acrobatics\uff09 \uff1a +Acrobatics.Roll.Text=&o**\u8ff4\u907f** 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: &e{0} -Archery.Combat.RetrieveChance=\u56de\u6536\u7bad\u77e2\u7684\u6a5f\u7387: &e{0} -Archery.Combat.SkillshotBonus=\u6280\u8853\u5c04\u64ca\u734e\u52f5\u50b7\u5bb3: &e{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: +#ALCHEMY +Alchemy.SubSkill.Catalysis.Name=\u50ac\u5316 +Alchemy.SubSkill.Catalysis.Description=\u63d0\u5347\u85e5\u6c34\u91c0\u9020\u901f\u5ea6 +Alchemy.SubSkill.Catalysis.Stat=\u91c0\u9020\u901f\u5ea6 +Alchemy.SubSkill.Concoctions.Name=\u6df7\u5408 +Alchemy.SubSkill.Concoctions.Description=\u91c0\u9020\u5e36\u6709\u591a\u91cd\u6750\u6599\u7684\u85e5\u6c34 +Alchemy.SubSkill.Concoctions.Stat=\u6df7\u5408\u7b49\u7d1a \uff1a &a{0}&3/&a{1} +Alchemy.SubSkill.Concoctions.Stat.Extra=\u914d\u65b9 [&a{0}&3] \uff1a &a{1} +Alchemy.Listener=\u7149\u91d1\u8853 \uff08Alchemy\uff09 \uff1a +Alchemy.Ability.Locked.0=\u9396\u5b9a\u72c0\u614b\uff0c\u76f4\u5230 {0}+ \u6280\u80fd\uff08\u50ac\u5316\uff09 +Alchemy.SkillName=\u7149\u91d1\u8853 +#ARCHERY + + +Archery.SubSkill.SkillShot.Name=\u6280\u5de7\u5c04\u64ca +Archery.SubSkill.SkillShot.Description=\u589e\u52a0\u5f13\u7bad\u9020\u6210\u7684\u50b7\u5bb3 +Archery.SubSkill.SkillShot.Stat=\u589e\u52a0\u5c04\u64ca\u9020\u6210\u7684\u50b7\u5bb3 +Archery.SubSkill.Daze.Name=\u64ca\u6688 +Archery.SubSkill.Daze.Description=\u8ff7\u60d1\u6575\u4eba\u4e26\u9020\u6210\u984d\u5916\u7684\u50b7\u5bb3 +Archery.SubSkill.Daze.Stat=\u64ca\u6688\u6a5f\u7387 +Archery.SubSkill.ArrowRetrieval.Name=\u7bad\u77e2\u56de\u6536 +Archery.SubSkill.ArrowRetrieval.Description=\u6709\u6a5f\u7387\u5f9e\u5c4d\u9ad4\u4e0a\u56de\u6536\u7bad\u77e2 +Archery.SubSkill.ArrowRetrieval.Stat=\u7bad\u77e2\u56de\u6536\u6a5f\u7387 +Archery.SubSkill.ArcheryLimitBreak.Name=\u7bad\u8853\u6975\u9650\u7a81\u7834 +Archery.SubSkill.ArcheryLimitBreak.Description=\u7a81\u7834\u4f60\u7684\u6975\u9650\u3002 +Archery.SubSkill.ArcheryLimitBreak.Stat=\u7a81\u7834\u6975\u9650\u7684\u50b7\u5bb3\u52a0\u6210 +Archery.Listener=\u7bad\u8853 \uff08Archery\uff09 \uff1a Archery.SkillName=\u7bad\u8853 -Archery.Skillup=\u7bad\u8853\u6280\u80fd\u4e0a\u5347\u4e86 {0}! \u7e3d\u7b49\u7ea7 ({1})! +#AXES 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=&7**\u4f60\u653e\u4e0b\u4e86\u4f60\u7684\u65a7\u982d** -Axes.Ability.Ready=&a**\u4f60\u63e1\u7dca\u4e86\u4f60\u7684\u65a7\u982d** -Axes.Combat.CritStruck=&4\u4f60\u6253\u51fa\u4e86\u6703\u5fc3\u4e00\u64ca! -Axes.Combat.CritChance=\u66b4\u64ca\u6a5f\u7387: &e{0}% -Axes.Combat.CriticalHit=\u6703\u5fc3\u4e00\u64ca! -Axes.Combat.GI.Proc=&a**\u66b4\u529b\u6253\u64ca** -Axes.Combat.GI.Struck=**\u88ab\u5f37\u529b\u653b\u64ca\u64ca\u4e2d** -Axes.Combat.SS.Struck=&4\u88ab\u5288\u9871\u65ac\u64ca\u4e2d! -Axes.Combat.SS.Length=\u5288\u9871\u65ac\u6301\u7e8c\u6642\u9593: &e{0}s -Axes.SubSkill.SkullSplitter.Name=\u5288\u9871\u65ac (\u4e3b\u52d5\u6280\u80fd) +Axes.Ability.Bonus.1=\u9644\u52a0 {0} \u50b7\u5bb3 +Axes.Ability.Bonus.2=\u7834\u7532 +Axes.Ability.Bonus.3=\u5c0d\u76d4\u7532\u9020\u6210 {0} \u9ede\u984d\u5916\u50b7\u5bb3 +Axes.Ability.Bonus.4=\u5f37\u529b\u885d\u64ca +Axes.Ability.Bonus.5=\u5c0d\u7121\u76d4\u7532\u7684\u6575\u4eba\u9020\u6210 {0} \u9ede\u984d\u5916\u50b7\u5bb3 +Axes.Ability.Lower=&7\u4f60\u653e\u4e0b\u4e86\u4f60\u7684\u65a7\u982d\u3002 +Axes.Ability.Ready=&3\u4f60 &6\u63e1\u7dca&3 \u4e86\u4f60\u7684\u65a7\u982d\u3002 +Axes.Ability.Ready.Extra=&3\u4f60 &6\u62ff\u8d77\u4e86&3 \u4f60\u7684\u65a7\u982d\u3002&7\uff08{0} \u6b63\u5728\u51b7\u537b {1} \u79d2\uff09 +Axes.Combat.CritStruck=&4\u4f60\u6253\u51fa\u4e86\u66b4\u64ca \uff01 +Axes.Combat.CriticalHit=\u66b4\u64ca \uff01 +Axes.Combat.GI.Proc=&a**\u5de8\u529b\u653b\u64ca** +Axes.Combat.GI.Struck=**\u88ab\u5f37\u70c8\u885d\u64ca\u64ca\u4e2d** +Axes.Combat.SS.Struck=&4\u88ab\u65ac\u9996\u8005\u6280\u80fd\u653b\u64ca \uff01 +Axes.SubSkill.SkullSplitter.Name=\u65ac\u9996\u8005 \uff08\u4e3b\u52d5\u6280\u80fd\uff09 Axes.SubSkill.SkullSplitter.Description=\u9020\u6210\u7bc4\u570d\u50b7\u5bb3 -Axes.SubSkill.CriticalStrikes.Name=\u6703\u5fc3\u4e00\u64ca +Axes.SubSkill.SkullSplitter.Stat=\u65ac\u9996\u8005\u6301\u7e8c\u6642\u9593 +Axes.SubSkill.CriticalStrikes.Name=\u66b4\u64ca Axes.SubSkill.CriticalStrikes.Description=\u96d9\u500d\u50b7\u5bb3 +Axes.SubSkill.CriticalStrikes.Stat=\u66b4\u64ca\u6a5f\u7387 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.SubSkill.AxesLimitBreak.Name=\u65a7\u6280\u6975\u9650\u7a81\u7834 +Axes.SubSkill.AxesLimitBreak.Description=\u7a81\u7834\u4f60\u7684\u6975\u9650\u3002 +Axes.SubSkill.AxesLimitBreak.Stat=\u7a81\u7834\u6975\u9650\u7684\u50b7\u5bb3\u52a0\u6210 +Axes.SubSkill.ArmorImpact.Name=\u7834\u7532 +Axes.SubSkill.ArmorImpact.Description=\u7528\u8db3\u5920\u7684\u529b\u91cf\u64ca\u788e\u76d4\u7532 +Axes.SubSkill.GreaterImpact.Name=\u5f37\u70c8\u885d\u64ca +Axes.SubSkill.GreaterImpact.Description=\u5c0d\u7121\u76d4\u7532\u6575\u4eba\u9020\u6210\u984d\u5916\u50b7\u5bb3 +Axes.Listener=\u65a7\u6280 \uff08Axes\uff09 \uff1a Axes.SkillName=\u65a7\u6280 -Axes.Skills.SS.Off=**\u5288\u9871\u65ac\u5df2\u7d50\u675f** -Axes.Skills.SS.On=&a**\u5288\u9871\u65ac\u5df2\u4f7f\u7528** -Axes.Skills.SS.Refresh=&a\u4f60\u7684 &e\u5288\u9871\u65ac &a\u80fd\u529b\u5df2\u53ef\u4f7f\u7528\uff01 -Axes.Skills.SS.Other.Off=\u5288\u9871\u65ac&a \u5df2\u7d93\u7ed3\u675f\u4e86 &e{0} -Axes.Skills.SS.Other.On=&a{0}&2\u4f7f\u7528\u4e86 &c\u5288\u9871\u65ac! -Axes.Skillup=\u65a7\u6280\u4e0a\u5347\u4e86 {0}! \u7e3d\u7b49\u7d1a ({1})! -Excavation.Ability.Lower=&7**\u4f60\u653e\u4e0b\u4e86\u4f60\u7684\u93df\u5b50** -Excavation.Ability.Ready=&a**\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: &e{0}s -Excavation.Listener=\u6316\u6398: +Axes.Skills.SS.Off=**\u65ac\u9996\u8005\u6280\u80fd\u7d50\u675f** +Axes.Skills.SS.On=&a**\u65ac\u9996\u8005\u6280\u80fd\u555f\u52d5** +Axes.Skills.SS.Refresh=&a\u4f60\u7684 &e\u65ac\u9996\u8005 &a\u6280\u80fd\u53ef\u4ee5\u4f7f\u7528\u4e86 \uff01 +Axes.Skills.SS.Other.Off=\u65ac\u9996\u8005&a \u7d50\u675f\u4e86\uff0c\u9032\u5165\u51b7\u537b &e{0} +Axes.Skills.SS.Other.On=&a{0}&2\u4f7f\u7528\u4e86 &c\u65ac\u9996\u8005 \uff01 +#EXCAVATION +Excavation.Ability.Lower=&7\u4f60\u653e\u4e0b\u4e86\u4f60\u7684\u93df\u5b50\u3002 +Excavation.Ability.Ready=&3\u4f60 &6\u63e1\u7dca&3 \u4e86\u4f60\u7684\u93df\u5b50\u3002 +Excavation.SubSkill.GigaDrillBreaker.Name=\u66b4\u8d70\u947d\u982d +Excavation.SubSkill.GigaDrillBreaker.Description=3 \u500d\u6389\u843d\u548c 3 \u500d\u7d93\u9a57\u4ee5\u53ca+\u901f\u5ea6 +Excavation.SubSkill.GigaDrillBreaker.Stat=\u66b4\u8d70\u947d\u982d\u6301\u7e8c\u6642\u9593 +Excavation.SubSkill.Archaeology.Name=\u8003\u53e4\u5b78 +Excavation.SubSkill.Archaeology.Description=\u6316\u6398\u5927\u5730\u7684\u79d8\u5bc6 \uff01 \u8f03\u9ad8\u7684\u6316\u6398\u7b49\u7d1a\u4f7f\u4f60\u5728\u6316\u6398\u571f\u5730\u5bf6\u85cf\u6642\u6709\u8f03\u9ad8\u6a5f\u7387\u7372\u5f97\u7d93\u9a57\u503c \uff01 +Excavation.SubSkill.Archaeology.Stat=\u8003\u53e4\u5b78\u7372\u5f97\u7d93\u9a57\u503c\u7684\u6a5f\u7387 +Excavation.SubSkill.Archaeology.Stat.Extra=\u8003\u53e4\u5b78\u7372\u5f97\u7d93\u9a57\u503c\u7684\u6578\u91cf +Excavation.Listener=\u6316\u6398 \uff08Excavation\uff09 \uff1a Excavation.SkillName=\u6316\u6398 -Excavation.Skills.GigaDrillBreaker.Off=**\u66b4\u8d70\u947d\u982d\u5df2\u7ed3\u675f** -Excavation.Skills.GigaDrillBreaker.On=&a**\u66b4\u8d70\u947d\u982d\u6280\u80fd\u4f7f\u7528** -Excavation.Skills.GigaDrillBreaker.Refresh=&a\u4f60\u7684 &e\u66b4\u8d70\u947d\u982d &a\u6280\u80fd\u5df2\u7d93\u53ef\u4ee5\u4f7f\u7528\u4e86! -Excavation.Skills.GigaDrillBreaker.Other.Off=\u66b4\u8d70\u947d\u982d&a \u5df2\u7d93\u7ed3\u675f\u4e86 &e{0} -Excavation.Skills.GigaDrillBreaker.Other.On=&a{0}&2 \u4f7f\u7528\u4e86 &c\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: &e{0} -Fishing.Ability.Info=\u9b54\u6cd5\u7375\u4eba: &7 ** \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: &e{0}/5 -Fishing.Ability.TH.DropRate=\u6389\u5bf6\u7387: &4\u9677\u9631: &e{0} &7\u5e38\u898b: &e{1} &a\u7f55\u898b: &e{2}\n&9\u7a00\u6709: &e{3} &d\u53f2\u8a69: &e{4} &6\u50b3\u8aaa: &e{5} &b\u5275\u7d00\u9304: &e{6} -Fishing.Ability.TH.MagicRate=\u9b54\u6cd5\u7375\u4eba\u6a5f\u7387: &e{0} -Fishing.Ability.Shake=\u6416\u6643\u6a5f\u7387: &e{0} -Fishing.Ability.IceFishing=\u51b0\u91e3: \u5728\u51b0\u4e0a\u91e3\u9b5a -Fishing.Ability.FD=\u6f01\u4eba\u4fbf\u7576: &e\u7b49\u7d1a {0} -Fishing.SubSkill.TreasureHunter.Name=\u5bf6\u7269\u7375\u4eba (\u88ab\u52d5\u6280\u80fd) -Fishing.SubSkill.TreasureHunter.Description=\u6389\u5230\u96dc\u7269 +Excavation.Skills.GigaDrillBreaker.Off=**\u66b4\u8d70\u947d\u982d\u5df2\u7d50\u675f** +Excavation.Skills.GigaDrillBreaker.On=&a**\u66b4\u8d70\u947d\u982d\u958b\u555f** +Excavation.Skills.GigaDrillBreaker.Refresh=&a\u4f60\u7684 &e\u66b4\u8d70\u947d\u982d &a\u6280\u80fd\u53ef\u4ee5\u4f7f\u7528\u4e86 \uff01 +Excavation.Skills.GigaDrillBreaker.Other.Off=\u66b4\u8d70\u947d\u982d&a \u7d50\u675f\u4e86\uff0c\u9032\u5165\u51b7\u537b &e{0} +Excavation.Skills.GigaDrillBreaker.Other.On=&a{0}&2 \u4f7f\u7528\u4e86 &c\u66b4\u8d70\u947d\u982d \uff01 +#FISHING +Fishing.ScarcityTip=&e&o\u8a72\u5340\u57df\u5df2\u7d93\u904e\u5ea6\u6355\u6488\uff0c\u8acb\u5230\u81f3\u5c11 {0} \u7684\u65b9\u584a\u4ee5\u5916\u518d\u5617\u8a66\u3002 +Fishing.Scared=&7&o\u4e82\u52d5\u6703\u5687\u8dd1\u9b5a \uff01 +Fishing.Exhausting=&c&o\u4e0d\u6b63\u78ba\u4f7f\u7528\u91e3\u7aff\u6703\u52a0\u5287\u8010\u4e45\u7684\u640d\u8017 \uff01 +Fishing.LowResourcesTip=&7\u4f60\u89ba\u5f97\u9019\u584a\u5340\u57df\u4f3c\u4e4e\u6c92\u6709\u591a\u5c11\u9b5a\u4e86\u3002 +Fishing.Ability.Info=\u9b54\u6cd5\u7375\u4eba \uff1a &7**\u96a8\u8457\u6dd8\u91d1\u8005\u7b49\u7d1a\u63d0\u9ad8** +Fishing.Ability.Locked.0=\u9396\u5b9a\u72c0\u614b\uff0c\u76f4\u5230 {0}+ \u6280\u80fd\uff08\u6296\u52d5\uff09 +Fishing.Ability.Locked.1={0}+ \u7d1a\u5f8c\u89e3\u9396 \uff08\u51b0\u91e3\uff09 +Fishing.Ability.Locked.2=\u9396\u5b9a\u72c0\u614b\uff0c\u76f4\u5230 {0}+ \u6280\u80fd \uff08\u91e3\u9b5a\u5927\u5e2b\uff09 +Fishing.SubSkill.TreasureHunter.Name=\u6dd8\u91d1\u8005 +Fishing.SubSkill.TreasureHunter.Description=\u91e3\u51fa\u5404\u7a2e\u5404\u6a23\u7684\u7269\u54c1 +Fishing.SubSkill.TreasureHunter.Stat=\u6dd8\u91d1\u8005\u7b49\u7d1a \uff1a &a{0}&3/&a{1} +Fishing.SubSkill.TreasureHunter.Stat.Extra=\u6389\u843d\u7387 \uff1a &7\u4e00\u822c \uff1a &e{0} &a\u666e\u901a \uff1a &e{1}\n&9\u7a00\u6709 \uff1a &e{2} &d\u7f55\u898b \uff1a &e{3} &6\u53f2\u8a69 \uff1a &e{4} &b\u795e\u8a71 \uff1a &e{5} 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.MagicHunter.Stat=\u9b54\u6cd5\u7375\u4eba\u6a5f\u7387 +Fishing.SubSkill.Shake.Name=\u6296\u52d5 +Fishing.SubSkill.Shake.Description=\u7528\u91e3\u7aff\u628a\u73a9\u5bb6\u6216\u751f\u7269\u8eab\u4e0a\u7684\u7269\u54c1\u6296\u4e0b\u4f86 +Fishing.SubSkill.Shake.Stat=\u6296\u52d5\u6a5f\u7387 +Fishing.SubSkill.FishermansDiet.Name=\u6f01\u592b\u7684\u98df\u8b5c +Fishing.SubSkill.FishermansDiet.Description=\u63d0\u9ad8\u9b5a\u985e\u98df\u7269\u56de\u5fa9\u7684\u98fd\u98df\u5ea6 +Fishing.SubSkill.FishermansDiet.Stat=\u6f01\u592b\u7684\u98df\u8b5c \uff1a &a\u7b49\u7d1a {0} +Fishing.SubSkill.MasterAngler.Name=\u91e3\u9b5a\u5927\u5e2b +Fishing.SubSkill.MasterAngler.Description=\u9b5a\u983b\u7e41\u5730\u88ab\u6355\u7372\uff0c\u5f9e\u8239\u4e0a\u91e3\u9b5a\u6548\u679c\u66f4\u597d\u3002 +Fishing.SubSkill.MasterAngler.Stat=\u91e3\u9b5a\u6700\u5c11\u7b49\u5f85\u6642\u9593\u6e1b\u5c11 \uff1a &a-{0} \u79d2 +Fishing.SubSkill.MasterAngler.Stat.Extra=\u91e3\u9b5a\u6700\u591a\u7b49\u5f85\u6642\u9593\u6e1b\u5c11 \uff1a &a-{0} \u79d2 Fishing.SubSkill.IceFishing.Name=\u51b0\u91e3 -Fishing.SubSkill.IceFishing.Description=\u5141\u8a31\u4f60\u5728\u51b0\u5929\u96ea\u5730\u88e1\u91e3\u9b5a -Fishing.Chance.Raining=&9 \u5927\u91cf\u734e\u52f5 -Fishing.Listener=\u91e3\u9b5a: -Fishing.Ability.TH.MagicFound=&7\u4f60\u611f\u53d7\u5230\u9b54\u529b\u7684\u6ce2\u52d5... -Fishing.Ability.TH.Boom=&7\u6536\u7a6b\u6642\u9593!!! -Fishing.Ability.TH.Poison=&7\u4ec0\u9ebc\u6771\u897f,\u805e\u8d77\u4f86\u597d\u81ed\u554a... +Fishing.SubSkill.IceFishing.Description=\u5141\u8a31\u4f60\u5728\u51b0\u51b7\u7684\u74b0\u5883\u4e0b\u91e3\u9b5a +Fishing.SubSkill.IceFishing.Stat=\u51b0\u91e3 +Fishing.Chance.Raining=&9\u5927\u91cf\u734e\u52f5 +Fishing.Listener=\u91e3\u9b5a \uff08Fishing\uff09 \uff1a +Fishing.Ability.TH.MagicFound=&7\u4f60\u611f\u5230\u4e00\u80a1\u9b54\u529b\u7684\u6ce2\u52d5\u2026\u2026 +Fishing.Ability.TH.Boom=&7\u7e41\u69ae\u6642\u671f \uff01\uff01\uff01 +Fishing.Ability.TH.Poison=&7\u6709\u4ec0\u9ebc\u6771\u897f\u805e\u8d77\u4f86\u4e0d\u592a\u5c0d\u52c1\u2026\u2026 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: &e{0} -Herbalism.Ability.FD=\u8fb2\u592b\u79c1\u623f\u83dc: &e\u7b49\u7d1a {0} -Herbalism.Ability.GTe.Length=\u7da0\u5316\u6301\u7e8c\u6642\u9593: &e{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: &e{0} -Herbalism.Ability.GTh.Fail=**\u7da0\u624b\u6307\u5931\u6557** -Herbalism.Ability.GTh.Stage=\u7da0\u624b\u6307\u968e\u6bb5: &e\u4f5c\u7269\u6210\u9577\u81f3\u968e\u6bb5 {0} -Herbalism.Ability.GTh=&a**\u7da0\u624b\u6307** -Herbalism.Ability.HylianLuck=\u6d77\u502b\u7684\u795d\u798f\u6a5f\u7387: &e{0} -Herbalism.Ability.Lower=&7**\u4f60\u653e\u4e0b\u4e86\u4f60\u7684\u92e4\u982d** -Herbalism.Ability.Ready=&a**\u4f60\u8209\u9ad8\u4e86\u4f60\u7684\u92e4\u982d** -Herbalism.Ability.ShroomThumb.Chance=\u8611\u83c7\u624b\u89f8\u767c\u6a5f\u7387: &e{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=&a\u8c50\u6536\u5973\u795e\u4eca\u65e5\u8207\u4f60\u540c\u5728! -Herbalism.Listener=\u8349\u85e5\u5b78: +#HERBALISM +Herbalism.Ability.GTe.NeedMore=\u4f60\u9700\u8981\u66f4\u591a\u7a2e\u5b50\u4f7f\u7528\u7da0\u624b\u6307\u3002 +Herbalism.Ability.GTh.Fail=**\u7da0\u5316\u5931\u6557** +Herbalism.Ability.GTh=&a**\u7da0\u5316** +Herbalism.Ability.Lower=&7\u4f60\u653e\u4e0b\u4e86\u4f60\u7684\u92e4\u982d\u3002 +Herbalism.Ability.Ready=&3\u4f60 &6\u6311\u8d77&3 \u4e86\u4f60\u7684\u92e4\u982d\u3002 +Herbalism.Ability.ShroomThumb.Fail=**\u83cc\u7d72\u5316\u5931\u6557** +Herbalism.SubSkill.GreenTerra.Name=\u5927\u5730\u795d\u798f +Herbalism.SubSkill.GreenTerra.Description=\u64ad\u6492\u5927\u5730\u4e4b\u795e\u7684\u6069\u60e0\uff0c\u7372\u5f97 3 \u500d\u6389\u7387 +Herbalism.SubSkill.GreenTerra.Stat=\u5927\u5730\u795d\u798f\u6301\u7e8c\u6642\u9593 +Herbalism.SubSkill.GreenThumb.Name=\u7da0\u624b\u6307 +Herbalism.SubSkill.GreenThumb.Description=\u6536\u7a6b\u6642\u81ea\u52d5\u64ad\u7a2e\u7a2e\u5b50 +Herbalism.SubSkill.GreenThumb.Stat=\u7da0\u624b\u6307\u89f8\u767c\u6a5f\u7387 +Herbalism.SubSkill.GreenThumb.Stat.Extra=\u7da0\u624b\u6307\u968e\u6bb5 \uff1a &a\u4f5c\u7269\u751f\u9577\u5728\u7b2c {0} \u968e\u6bb5 +Herbalism.Effect.4=\u7da0\u5316 \uff08\u65b9\u584a\uff09 +Herbalism.SubSkill.GreenThumb.Description.2=\u4f7f\u78da\u584a\u7b49\u9577\u82d4\u861a\uff0c\u6216\u8b93\u8349\u751f\u9577 +Herbalism.SubSkill.FarmersDiet.Name=\u8fb2\u592b\u98df\u8b5c +Herbalism.SubSkill.FarmersDiet.Description=\u98df\u7528\u8fb2\u7522\u54c1\u6642\u984d\u5916\u56de\u590d\u98e2\u9913\u5ea6 +Herbalism.SubSkill.FarmersDiet.Stat=\u8fb2\u592b\u98df\u8b5c \uff1a &a\u7b49\u7d1a {0} +Herbalism.SubSkill.DoubleDrops.Name=\u96d9\u500d\u6389\u843d +Herbalism.SubSkill.DoubleDrops.Description=\u96d9\u500d\u7269\u54c1 +Herbalism.SubSkill.DoubleDrops.Stat=\u96d9\u500d\u6389\u843d\u6a5f\u7387 +Herbalism.SubSkill.HylianLuck.Name=\u6d77\u62c9\u723e\u7684\u795d\u798f +Herbalism.SubSkill.HylianLuck.Description=\u7d66\u4e88\u5c0f\u6a5f\u7387\u627e\u5230\u7a00\u6709\u7269\u54c1\u7684\u80fd\u529b +Herbalism.SubSkill.HylianLuck.Stat=\u6d77\u62c9\u723e\u7684\u795d\u798f\u7684\u6a5f\u7387 +Herbalism.SubSkill.ShroomThumb.Name=\u83cc\u7d72\u5316 +Herbalism.SubSkill.ShroomThumb.Description=\u5411\u6ce5\u571f\u548c\u8349\u5730\u6563\u64ad\u83cc\u7d72 +Herbalism.SubSkill.ShroomThumb.Stat=\u83cc\u7d72\u5316\u6a5f\u7387 +Herbalism.HylianLuck=&a\u9858\u6d77\u62c9\u723e\u7684\u795d\u798f\u8207\u4f60\u540c\u5728 \uff01 +Herbalism.Listener=\u8349\u85e5\u5b78 \uff08Herbalism\uff09 \uff1a Herbalism.SkillName=\u8349\u85e5\u5b78 -Herbalism.Skills.GTe.On=&a**\u767c\u52d5\u7da0\u5316** -Herbalism.Skills.GTe.Refresh=&a\u4f60\u7684 &e\u7da0\u5316 &a\u80fd\u529b\u5df2\u53ef\u4f7f\u7528! -Herbalism.Skills.GTe.Other.Off=\u7da0\u5316&a \u5373\u5c07\u7ed3\u675f &e{0} -Herbalism.Skills.GTe.Other.On=&a{0}&2 \u4f7f\u7528\u4e86 &c\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: &e{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=&7**\u4f60\u653e\u4e0b\u4e86\u4f60\u7684\u93ac\u5b50** -Mining.Ability.Ready=&a**\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 +Herbalism.Skills.GTe.Off=**\u571f\u795e\u5e87\u4f51\u5df2\u7d50\u675f** +Herbalism.Skills.GTe.On=&a**\u571f\u795e\u5e87\u4f51\u958b\u555f** +Herbalism.Skills.GTe.Refresh=&a\u4f60\u7684 &e\u571f\u795e\u5e87\u4f51 &a\u6280\u80fd\u53ef\u4ee5\u4f7f\u7528\u4e86 \uff01 +Herbalism.Skills.GTe.Other.Off=\u571f\u795e\u5e87\u4f51&a \u7d50\u675f\u4e86\uff0c\u9032\u5165\u51b7\u537b &e{0} +Herbalism.Skills.GTe.Other.On=&a{0}&2 \u4f7f\u7528\u4e86 &c\u571f\u795e\u5e87\u4f51 \uff01 +#MINING +Mining.Ability.Locked.0=\u9396\u5b9a\u76f4\u5230 {0}+ \u6280\u80fd \uff08\u7206\u7834\u958b\u6316\uff09 +Mining.Ability.Locked.1=\u9396\u5b9a\u76f4\u5230 {0}+ \u6280\u80fd \uff08\u5927\u578b\u70b8\u5f48\uff09 +Mining.Ability.Locked.2=\u9396\u5b9a\u76f4\u5230 {0}+ \u6280\u80fd \uff08\u7206\u7834\u5c08\u5bb6\uff09 +Mining.Ability.Lower=&7\u4f60\u653e\u4e0b\u4e86\u4f60\u7684\u93ac\u5b50\u3002 +Mining.Ability.Ready=&3\u4f60 &6\u62ff\u8d77&3 \u4e86\u4f60\u7684\u93ac\u5b50\u3002 +Mining.SubSkill.SuperBreaker.Name=\u8d85\u7d1a\u788e\u77f3\u6a5f +Mining.SubSkill.SuperBreaker.Description=+\u901f\u5ea6\u548c 3 \u500d\u6389\u843d\u7387 +Mining.SubSkill.SuperBreaker.Stat=\u8d85\u7d1a\u788e\u77f3\u6a5f\u6301\u7e8c\u6642\u9593 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.DoubleDrops.Description=\u96d9\u500d\u666e\u901a\u7269\u54c1 +Mining.SubSkill.DoubleDrops.Stat=\u96d9\u500d\u6389\u843d\u6a5f\u7387 \uff1a &e{0} +Mining.SubSkill.BlastMining.Name=\u7206\u7834\u958b\u6316 +Mining.SubSkill.BlastMining.Description=\u4f7f\u7528 TNT \u70b8\u7926\u7269\u6642\u6703\u7372\u5f97\u984d\u5916\u7269\u54c1 +Mining.SubSkill.BlastMining.Stat=\u7206\u7834\u958b\u6316 \uff1a &a\u7b49\u7d1a {0}/{1} &7\uff08{2}\uff09 +Mining.SubSkill.BlastMining.Stat.Extra=\u7206\u7834\u534a\u5f91\u52a0\u6210 \uff1a &a+{0} +Mining.SubSkill.BiggerBombs.Name=\u5927\u578b\u70b8\u5f48 +Mining.SubSkill.BiggerBombs.Description=\u589e\u52a0 TNT \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: &e{0} -Mining.Effect.DropChance=\u96d9\u500d\u6389\u843d\u6a5f\u7387: &e{0} -Mining.Listener=\u6316\u7926: +Mining.SubSkill.DemolitionsExpertise.Description=\u6e1b\u5c11 TNT \u7684\u50b7\u5bb3 +Mining.SubSkill.DemolitionsExpertise.Stat=\u7206\u70b8\u50b7\u5bb3\u6e1b\u5c11 + +Mining.Listener=\u6316\u7926 \uff08Mining\uff09 \uff1a Mining.SkillName=\u6316\u7926 -Mining.Skills.SuperBreaker.Off=**\u8d85\u7d1a\u788e\u77f3\u6a5f\u5df2\u7ed3\u675f** -Mining.Skills.SuperBreaker.On=&a**\u8d85\u7d1a\u788e\u77f3\u6a5f\u5df2\u4f7f\u7528** -Mining.Skills.SuperBreaker.Other.Off=\u8d85\u7d1a\u788e\u77f3\u6a5f&a \u5df2\u7d93\u7ed3\u675f\u4e86 &e{0} -Mining.Skills.SuperBreaker.Other.On=&a{0}&2 \u4f7f\u7528\u4e86 &c\u8d85\u7d1a\u788e\u77f3\u6a5f! -Mining.Skills.SuperBreaker.Refresh=&a\u4f60\u7684&e \u8d85\u7d1a\u788e\u77f3\u6a5f &a\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=&7**\u78b0!** -Mining.Blast.Effect=+{0} \u7926\u7269\u7522\u91cf, {1}x \u6389\u843d\u91cf -Mining.Blast.Radius.Increase=\u7206\u70b8\u534a\u5f91\u63d0\u5347: &e+{0} -Mining.Blast.Rank=\u6316\u7926\u7206\u767c: &e \u6392\u540d {0}/8 &7({1}) -Mining.Blast.Other.On=&a{0}&2 \u4f7f\u7528\u4e86 &c\u6316\u7926\u7206\u767c! -Mining.Blast.Refresh=&a\u4f60\u7684 &e\u6316\u7926\u7206\u767c &a\u51b7\u537b\u6642\u9593\u5df2\u7d50\u675f! +Mining.Skills.SuperBreaker.Off=**\u8d85\u7d1a\u788e\u77f3\u6a5f\u7d50\u675f** +Mining.Skills.SuperBreaker.On=&a**\u8d85\u7d1a\u788e\u77f3\u6a5f\u958b\u555f** +Mining.Skills.SuperBreaker.Other.Off=\u8d85\u7d1a\u788e\u77f3\u6a5f &a\u7d50\u675f\u4e86\uff0c\u9032\u5165\u51b7\u537b &e{0} +Mining.Skills.SuperBreaker.Other.On=&a{0}&2 \u4f7f\u7528\u4e86 &c\u8d85\u7d1a\u788e\u77f3\u6a5f \uff01 +Mining.Skills.SuperBreaker.Refresh=&a\u4f60\u7684 &e\u8d85\u7d1a\u788e\u77f3\u6a5f &a\u6280\u80fd\u53ef\u4ee5\u4f7f\u7528\u4e86 \uff01 +#Blast Mining +Mining.Blast.Boom=&7**\u5623** +Mining.Blast.Cooldown= +Mining.Blast.Effect=+{0} \u7926\u7269\u91cf\u548c {1} \u500d\u6389\u843d +Mining.Blast.Other.On=&a{0}&2 \u4f7f\u7528\u4e86 &c\u7206\u7834\u958b\u6316 \uff01 +Mining.Blast.Refresh=&a\u4f60\u7684 &e\u7206\u7834\u958b\u6316 &a\u6280\u80fd\u53ef\u4ee5\u4f7f\u7528\u4e86 \uff01 +#REPAIR 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.GoldRepair.Name=\u4fee\u7406\u9ec3\u91d1\u7269\u54c1 \uff08{0}+ \u6280\u80fd\uff09 +Repair.SubSkill.GoldRepair.Description=\u4fee\u7406\u9ec3\u91d1\u5de5\u5177\u548c\u88dd\u5099 +Repair.SubSkill.IronRepair.Name=\u4fee\u7406\u9435\u88fd\u7269\u54c1 \uff08{0}+ \u6280\u80fd\uff09 +Repair.SubSkill.IronRepair.Description=\u4fee\u7406\u9435\u88fd\u5de5\u5177\u548c\u76d4\u7532 +Repair.SubSkill.StoneRepair.Name=\u4fee\u7406\u77f3\u982d\u7269\u54c1 \uff08{0}+ \u6280\u80fd\uff09 +Repair.SubSkill.StoneRepair.Description=\u4fee\u7406\u77f3\u982d\u5de5\u5177 Repair.SubSkill.RepairMastery.Name=\u4fee\u7406\u7cbe\u901a -Repair.SubSkill.RepairMastery.Description=\u5df2\u589e\u52a0\u4fee\u7406\u6578\u91cf +Repair.SubSkill.RepairMastery.Description=\u4fee\u7406\u6642\u63d0\u5347\u56de\u5fa9\u7684\u8010\u4e45\u5ea6 +Repair.SubSkill.RepairMastery.Stat=\u4fee\u7406\u7cbe\u901a \uff1a &a\u984d\u5916\u56de\u5fa9 {0} \u8010\u4e45 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.SuperRepair.Description=\u96d9\u500d\u4fee\u7406\u6548\u679c +Repair.SubSkill.SuperRepair.Stat=\u8d85\u7d1a\u4fee\u7406\u6a5f\u7387 +Repair.SubSkill.DiamondRepair.Name=\u947d\u77f3\u4fee\u7406 \uff08{0}+ \u6280\u80fd\uff09 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=&4mcMMO \u5728\u4fee\u6b63\u6642\u767c\u751f\u4e86\u932f\u8aa4! -Repair.Listener.Anvil=&4\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=&4\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.SubSkill.ArcaneForging.Stat=\u79d8\u6cd5\u935b\u9020 \uff1a &e\u7b49\u7d1a {0}/{1} +Repair.SubSkill.ArcaneForging.Stat.Extra=&3\u79d8\u6cd5\u935b\u9020\u8ce0\u7387 \uff1a &7\u6210\u529f &a{0}&7%\uff0c\u5931\u6557 &c{1}&7% +Repair.Error=&4mcMMO \u5728\u5617\u8a66\u4fee\u7406\u6b64\u7269\u54c1\u6642\u767c\u751f\u4e86\u932f\u8aa4 \uff01 +Repair.Listener.Anvil=&4\u4f60\u653e\u7f6e\u7684\u9435\u65b9\u584a\u53ef\u4ee5\u7528\u4f86\u4fee\u7406\u5de5\u5177\u548c\u88dd\u5099\u3002 +Repair.Listener=\u4fee\u7406 \uff08Repair\uff09 \uff1a Repair.SkillName=\u4fee\u7406 -Repair.Skills.AdeptSalvage=&4\u56e0\u70ba\u719f\u7df4\u5ea6\u4e0d\u5920\u6240\u4ee5\u4f60\u4e0d\u80fd\u56de\u6536\u5b83\u5011 -Repair.Skills.AdeptDiamond=&4\u4f60\u7684\u6280\u80fd\u7b49\u7d1a\u4e0d\u8db3\u4ee5\u4fee\u7406\u947d\u77f3\u88dd\u5099! -Repair.Skills.AdeptGold=&4\u4f60\u7684\u6280\u80fd\u7b49\u7d1a\u4e0d\u8db3\u4ee5\u4fee\u7406\u9ec4\u91d1\u88dd\u5099! -Repair.Skills.AdeptIron=&4\u4f60\u7684\u6280\u80fd\u7b49\u7d1a\u4e0d\u8db3\u4ee5\u4fee\u7406\u9435\u88fd\u88dd\u5099! -Repair.Skills.AdeptStone=&4\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 &e{0}&c \u624d\u53ef\u4fee\u7406&e{1} -Repair.Skills.FeltEasy=&7\u90a3\u770b\u8d77\u4f86\u5f88\u7c21\u55ae. -Repair.Skills.FullDurability=&7\u4f60\u7684\u88dd\u5099\u8010\u4e45\u5ea6\u5df2\u6eff! -Repair.Skills.SalvageSuccess=&7\u7269\u54c1\u5df2\u56de\u6536! -Repair.Skills.NotFullDurability=&4\u4f60\u7121\u6cd5\u56de\u6536\u5df2\u53d7\u640d\u7684\u7269\u54c1 -Repair.Skills.Mastery=\u4fee\u7406\u7cbe\u901a: &e\u984d\u5916\u56de\u5fa9 {0}% \u8010\u4e45\u5ea6 -Repair.Skills.StackedItems=&4\u4f60\u7121\u6cd5\u4fee\u7406\u758a\u52a0\u7684\u7269\u54c1 -Repair.Skills.Super.Chance=\u8d85\u7d1a\u4fee\u7406\u6a5f\u7387: &e{0} -Repair.Skillup=\u4fee\u7406\u6280\u80fd\u4e0a\u5347\u4e86 {0}! \u7e3d\u7b49\u7d1a ({1})! +Repair.Skills.AdeptDiamond=&4\u4f60\u7684\u6280\u80fd\u7b49\u7d1a\u4e0d\u8db3\u4ee5\u4fee\u7406\u947d\u77f3\u88dd\u5099\u3002 +Repair.Skills.AdeptGold=&4\u4f60\u7684\u6280\u80fd\u7b49\u7d1a\u4e0d\u8db3\u4ee5\u4fee\u7406\u9ec3\u91d1\u88dd\u5099\u3002 +Repair.Skills.AdeptIron=&4\u4f60\u7684\u6280\u80fd\u4e0d\u8db3\u4ee5\u4fee\u7406\u9435\u88fd\u88dd\u5099\u3002 +Repair.Skills.AdeptStone=&4\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 &e{0}&c \u624d\u80fd\u4fee\u7406 &e{1} +Repair.Skills.FeltEasy=&7\u90a3\u770b\u8d77\u4f86\u5f88\u7c21\u55ae\u3002 +Repair.Skills.FullDurability=&7\u4f60\u7684\u88dd\u5099\u5df2\u7d93\u6eff\u8010\u4e45\u5ea6\u4e86 +Repair.Skills.StackedItems=&4\u4f60\u7121\u6cd5\u4fee\u7406\u5df2\u758a\u52a0\u7684\u7269\u54c1\u3002 Repair.Pretty.Name=\u4fee\u7406 -Salvage.Pretty.Name=\u56de\u6536 -Repair.Arcane.Chance.Downgrade=&7\u9644\u9b54\u964d\u7d1a\u6a5f\u7387: &e{0}% -Repair.Arcane.Chance.Success=&7\u81ea\u52d5\u7784\u6e96\u7684\u6210\u529f\u7387: &e{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=&a\u4f60\u6210\u529f\u5730\u4fdd\u7559\u4e86\u9019\u4ef6\u7269\u54c1\u7684\u9644\u9b54. -Repair.Arcane.Rank=\u79d8\u6cd5\u935b\u9020: &e\u7b49\u7ea7 {0}/4 -Swords.Ability.Lower=&7**\u4f60\u653e\u4e0b\u4e86\u4f60\u7684\u528d** -Swords.Ability.Ready=&a**\u4f60\u63e1\u7dca\u8457\u4f60\u7684\u528d** -Swords.Combat.Bleed.Chance=\u653e\u8840\u6a5f\u7387: &e{0} -Swords.Combat.Bleed.Length=\u653e\u8840\u6301\u7e8c\u6642\u9593: &e{0} \u9031\u671f -Swords.Combat.Bleed.Note=&7\u6ce8\u610f: &e\u6bcf\u5169\u79d2\u6e1b\u4e00\u6ef4\u8840 -Swords.Combat.Bleeding.Started=&4 \u4f60\u6b63\u5728\u6d41\u8840! -Swords.Combat.Bleeding.Stopped=&7\u653e\u8840\u5df2&a\u505c\u6b62&7! +#Arcane Forging +Repair.Arcane.Downgrade=\u9019\u4ef6\u7269\u54c1\u7684\u9644\u9b54\u7b49\u7d1a\u5df2\u4e0b\u964d\u3002 +Repair.Arcane.Fail=\u9019\u4ef6\u7269\u54c1\u7684\u9644\u9b54\u5df2\u6d88\u5931\u3002 +Repair.Arcane.Lost=\u4f60\u7684\u6280\u80fd\u7b49\u7d1a\u4e0d\u8db3\u4ee5\u4fdd\u7559\u9644\u9b54\u5c6c\u6027\u3002 +Repair.Arcane.Perfect=&a\u4f60\u6210\u529f\u5730\u4fdd\u7559\u4e86\u9019\u4ef6\u7269\u54c1\u7684\u9644\u9b54\u3002 +#SALVAGE +Salvage.Pretty.Name=\u5206\u89e3 +Salvage.SubSkill.UnderstandingTheArt.Name=\u5206\u89e3\u7cbe\u901a +Salvage.SubSkill.UnderstandingTheArt.Description=\u4f60\u4e0d\u53ea\u662f\u518d\u7ffb\u9130\u5c45\u7684\u5783\u573e\uff0c\u4f60\u662f\u5728\u4fdd\u8b77\u74b0\u5883\u3002\n\u589e\u5f37\u5206\u89e3\u7684\u5404\u7a2e\u5c6c\u6027\u3002 +Salvage.SubSkill.ScrapCollector.Name=\u5ee2\u7269\u5229\u7528 +Salvage.SubSkill.ScrapCollector.Description=\u5f9e\u7269\u54c1\u4e2d\u5206\u89e3\u51fa\u6750\u6599\uff0c\u5b8c\u7f8e\u5206\u89e3\u53d6\u6c7a\u65bc\u6280\u80fd\u548c\u904b\u6c23\u3002 +Salvage.SubSkill.ScrapCollector.Stat=\u5ee2\u7269\u5229\u7528 \uff1a &a\u6700\u591a\u5206\u89e3\u51fa &e{0}&a \u500b\u7269\u54c1\u3002\u4f54\u4e00\u4e9b\u904b\u6c23\u6210\u5206\u3002 +Salvage.SubSkill.ArcaneSalvage.Name=\u5967\u6578\u5206\u89e3 +Salvage.SubSkill.ArcaneSalvage.Description=\u5f9e\u7269\u54c1\u4e2d\u62c6\u89e3\u9644\u9b54 +Salvage.SubSkill.ArcaneSalvage.Stat=\u5967\u6578\u5206\u89e3 \uff1a &e\u7b49\u7d1a {0}/{1} +Salvage.Ability.Bonus.0=\u9032\u968e\u5206\u89e3 +Salvage.Ability.Bonus.1=\u6700\u5927\u9650\u5ea6\u56de\u6536 {0} \u640d\u58de\u7684\u7269\u54c1 +Salvage.Arcane.ExtractFull=&7\u5b8c\u5168\u62c6\u89e3\u51fa\u9644\u9b54\u6a5f\u7387 +Salvage.Arcane.ExtractPartial=&7\u90e8\u5206\u62c6\u89e3\u51fa\u9644\u9b54\u6a5f\u7387 +Salvage.Skills.Success=&a\u7269\u54c1\u5df2\u5206\u89e3 \uff01 +Salvage.Skills.Adept.Damaged=&4\u4f60\u7684\u6280\u80fd\u7b49\u7d1a\u4e0d\u8db3\u4ee5\u5206\u89e3\u640d\u58de\u7684\u7269\u54c1\u3002 +Salvage.Skills.Adept.Level=\u4f60\u5fc5\u9808\u9054\u5230 &e{0}&c \u7d1a\u624d\u80fd\u5206\u89e3 &e{1} +Salvage.Skills.TooDamaged=&4\u8a72\u7269\u54c1\u640d\u58de\u904e\u65bc\u56b4\u91cd\uff0c\u7121\u6cd5\u5206\u89e3\u3002 +Salvage.Skills.ArcaneFailed=&c\u4f60\u7121\u6cd5\u62c6\u89e3\u51fa\u672c\u7269\u54c1\u6240\u860a\u542b\u7684\u77e5\u8b58\u3002 +Salvage.Skills.ArcanePartial=&c\u4f60\u53ea\u80fd\u62c6\u89e3\u51fa\u672c\u7269\u54c1\u6240\u860a\u542b\u7684\u90e8\u5206\u77e5\u8b58\u3002 +Salvage.Skills.ArcaneSuccess=&a\u4f60\u80fd\u5920\u5b8c\u5168\u62c6\u89e3\u51fa\u672c\u7269\u54c1\u6240\u542b\u7684\u77e5\u8b58 \uff01 +Salvage.Listener.Anvil=&4\u4f60\u5df2\u7d93\u653e\u7f6e\u4e86\u5206\u89e3\u9435\u7827\uff0c\u4f7f\u7528\u5b83\u4f86\u5206\u89e3\u5de5\u5177\u548c\u76d4\u7532\u3002 +Salvage.Listener=\u5206\u89e3 \uff08Salvage\uff09 \uff1a +Salvage.SkillName=\u5206\u89e3 +Salvage.Skills.Lottery.Normal=&6\u4f60\u80fd\u5920\u5f9e &e{1}&6 \u4e2d\u56de\u6536 &3{0}&6 \u6750\u6599\u3002 +Salvage.Skills.Lottery.Perfect=&a&l\u5b8c\u7f8e \uff01&r&6 \u4f60\u6beb\u4e0d\u8cbb\u529b\u5730\u6436\u6551\u4e86 &3{1}&6\uff0c\u6aa2\u8996\u4e86 &3{0}&6 \u6750\u6599\u3002 +Salvage.Skills.Lottery.Untrained=&7\u4f60\u5728\u56de\u6536\u65b9\u9762\u6c92\u6709\u5f97\u5230\u9069\u7576\u7684\u8a13\u7df4\uff0c\u4f60\u53ea\u80fd\u5f9e &a{1}&7 \u4e2d\u56de\u5fa9 &c{0}&7 \u6750\u6599\u3002 +#Anvil (Shared between SALVAGE and REPAIR) +Anvil.Unbreakable=\u9019\u500b\u7269\u54c1\u4e0d\u6703\u640d\u58de \uff01 +#SWORDS +Swords.Ability.Lower=&7\u4f60\u653e\u4e0b\u4e86\u4f60\u7684\u528d\u3002 +Swords.Ability.Ready=&3\u4f60 &6\u63e1\u7dca&3 \u4e86\u4f60\u7684\u528d\u3002 +Swords.Combat.Rupture.Note=&7\u6ce8\u610f \uff1a &e\u9031\u671f\u50b7\u5bb3\u4e26\u975e\u81f4\u547d\u7684 \uff01 +Swords.Combat.Bleeding.Started=&4\u4f60\u5728\u6d41\u8840 \uff01 +Swords.Combat.Bleeding.Stopped=&7\u6d41\u8840 &a\u5df2\u505c\u6b62&7 \uff01 Swords.Combat.Bleeding=&a**\u6575\u4eba\u6b63\u5728\u4e0d\u65b7\u6d41\u8840** -Swords.Combat.Counter.Chance=\u53cd\u64ca\u6a5f\u7387: &e{0} -Swords.Combat.Counter.Hit=&4\u4f60\u53cd\u64ca\u4e86\u5c0d\u624b! -Swords.Combat.Countered=&a**\u53cd\u5c04\u4e86\u6575\u4eba\u7684\u653b\u64ca** -Swords.Combat.SS.Struck=&4\u88ab\u5272\u88c2\u65ac\u653b\u64ca\uff01 +Swords.Combat.Counter.Hit=&4\u4f60\u53cd\u64ca\u4e86\u5c0d\u624b \uff01 +Swords.Combat.Countered=&a**\u53cd\u64ca\u4e86\u6575\u4eba** +Swords.Combat.SS.Struck=&4\u767c\u52d5\u5229\u5203\u7a81\u523a \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.SubSkill.CounterAttack.Description=\u53d7\u5230\u653b\u64ca\u6642\u53cd\u5c04\u4e00\u5b9a\u50b7\u5bb3 \uff01 +Swords.SubSkill.CounterAttack.Stat=\u53cd\u64ca\u6a5f\u7387 +Swords.SubSkill.SerratedStrikes.Name=\u5229\u5203\u7a81\u523a +Swords.SubSkill.SerratedStrikes.Description=\u5728\u7bc4\u570d\u653b\u64ca \uff08\u6a6b\u6383\uff09 \u6642\uff0c\u9020\u6210\u653b\u64ca\u7684\u90e8\u5206\u50b7\u5bb3\uff0c\u6709\u6a5f\u7387\u4f34\u96a8\u6495\u88c2 \uff01 +Swords.SubSkill.SerratedStrikes.Stat=\u5229\u5203\u7a81\u523a\u6301\u7e8c\u6642\u9593 +Swords.SubSkill.Rupture.Name=\u6495\u88c2 +Swords.SubSkill.Rupture.Description=\u9020\u6210\u6d41\u8840\u7684\u6301\u7e8c\u6027\u50b7\u5bb3 +Swords.SubSkill.Stab.Name=\u7a7f\u523a +Swords.SubSkill.Stab.Description=\u70ba\u4f60\u7684\u653b\u64ca\u589e\u52a0\u984d\u5916\u50b7\u5bb3\u3002 +Swords.SubSkill.Stab.Stat=\u7a7f\u523a\u50b7\u5bb3 +Swords.SubSkill.SwordsLimitBreak.Name=\u528d\u8853\u6975\u9650\u7a81\u7834 +Swords.SubSkill.SwordsLimitBreak.Description=\u7a81\u7834\u4f60\u7684\u6975\u9650\u3002 +Swords.SubSkill.SwordsLimitBreak.Stat=\u7a81\u7834\u6975\u9650\u7684\u50b7\u5bb3\u52a0\u6210 +Swords.SubSkill.Rupture.Stat=\u6495\u88c2\u6a5f\u7387 +Swords.SubSkill.Rupture.Stat.Extra=&3\u6495\u88c2\u6301\u7e8c\u6642\u9593 \uff1a&e{0}s&a \u5c0d\u6297\u73a9\u5bb6\uff0c&e{1}s&a \u5c0d\u6297\u751f\u7269\u3002 +Swords.SubSkill.Rupture.Stat.TickDamage=&3\u6495\u88c2\u6bcf\u523b\u50b7\u5bb3 \uff1a&e{0}&a \u5c0d\u6297\u73a9\u5bb6\uff0c&e{1}&a \u5c0d\u6297\u751f\u7269\u3002 +Swords.SubSkill.Rupture.Stat.ExplosionDamage=&3\u6495\u88c2\u7206\u88c2\u50b7\u5bb3 \uff1a&e{0}&a \u5c0d\u6297\u73a9\u5bb6\uff0c&e{1}&a \u5c0d\u6297\u751f\u7269\u3002 +Swords.Effect.4=\u5229\u5203\u7a81\u523a \u6495\u88c2+ +Swords.Effect.5={0} \u523b\u6495\u88c2 +Swords.Listener=\u528d\u8853 \uff08Swords\uff09 \uff1a Swords.SkillName=\u528d\u8853 -Swords.Skills.SS.Off=&4\u5272\u88c2\u65ac\u7d50\u675f\u4e86\uff01 -Swords.Skills.SS.On=&a**\u767c\u52d5\u5272\u88c2\u65ac** -Swords.Skills.SS.Refresh=&a\u4f60\u7684 &e\u5272\u88c2\u65ac &a\u6280\u80fd\u5df2\u53ef\u4f7f\u7528! -Swords.Skills.SS.Other.Off=\u5272\u88c2\u65ac&a \u5373\u5c07\u7d50\u675f &e{0} -Swords.Skills.SS.Other.On=&a{0}&2 \u4f7f\u7528\u4e86 &c\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: &e{0}s -Taming.Ability.Bonus.0=\u5371\u6a5f\u610f\u8b58 -Taming.Ability.Bonus.1=\u72fc\u6703\u907f\u958b\u5371\u96aa +Swords.Skills.SS.Off=**\u5229\u5203\u7a81\u523a\u7d50\u675f** +Swords.Skills.SS.On=&a**\u5229\u5203\u7a81\u523a\u958b\u555f** +Swords.Skills.SS.Refresh=&a\u4f60\u7684 &e\u5229\u5203\u7a81\u523a &a\u6280\u80fd\u53ef\u4ee5\u4f7f\u7528\u4e86 \uff01 +Swords.Skills.SS.Other.Off=\u5229\u5203\u7a81\u523a&a \u7d50\u675f\u4e86\uff0c\u9032\u5165\u51b7\u537b &e{0} +Swords.Skills.SS.Other.On=&a{0}&2 \u4f7f\u7528\u4e86 &c\u5229\u5203\u7a81\u523a \uff01 +#TAMING +Taming.Ability.Bonus.0=\u74b0\u5883\u611f\u77e5 +Taming.Ability.Bonus.1=\u72fc\u6703\u907f\u514d\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.3=1/{0} \u50b7\u5bb3\uff0c\u6297\u706b +Taming.Ability.Bonus.4=\u885d\u64ca\u6297\u6027 +Taming.Ability.Bonus.5=\u7206\u70b8\u9020\u6210 1/{0} \u666e\u901a\u50b7\u5bb3 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: &e{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=&7\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=&7\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=&7\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.Ability.Bonus.8=\u901f\u98df\u670d\u52d9 +Taming.Ability.Bonus.9={0} \u7684\u6a5f\u7387\u653b\u64ca\u6642\u56de\u8840 +Taming.Ability.Bonus.10=\u72ac\u795e\u7684\u5e87\u8b77 +Taming.Ability.Bonus.11=\u53d7\u5230\u9b54\u6cd5\u6216\u4e2d\u6bd2\u50b7\u5bb3\u6642\u56de\u5fa9\u751f\u547d\u503c +Taming.Ability.Locked.0= {0}+ \u7d1a\u5f8c\u89e3\u9396 \uff08\u74b0\u5883\u611f\u77e5\uff09 +Taming.Ability.Locked.1=\u9396\u5b9a\u76f4\u5230 {0}+ \u6280\u80fd \uff08\u6bdb\u76ae\u5f37\u5316\uff09 +Taming.Ability.Locked.2=\u9396\u5b9a\u76f4\u5230 {0}+ \u6280\u80fd \uff08\u885d\u64ca\u6297\u6027\uff09 +Taming.Ability.Locked.3=\u9396\u5b9a\u76f4\u5230 {0}+ \u6280\u80fd \uff08\u5229\u722a\uff09 +Taming.Ability.Locked.4={0}+ \u7d1a\u5f8c\u89e3\u9396 \uff08\u901f\u98df\u670d\u52d9\uff09 +Taming.Ability.Locked.5={0}+ \u7d1a\u5f8c\u89e3\u9396 \uff08\u72ac\u795e\u7684\u5e87\u8b77\uff09 +Taming.Combat.Chance.Gore=\u55dc\u8840 +Taming.SubSkill.BeastLore.Name=\u91ce\u7378\u8cc7\u8a0a +Taming.SubSkill.BeastLore.Description=\u9aa8\u982d\u9ede\u64ca\u72fc\u6216\u5c71\u8c93 +Taming.SubSkill.ShockProof.Name=\u885d\u64ca\u6297\u6027 +Taming.SubSkill.ShockProof.Description=\u6e1b\u5c11\u7206\u70b8\u50b7\u5bb3 +Taming.SubSkill.CallOfTheWild.Name=\u91ce\u6027\u547c\u559a +Taming.SubSkill.CallOfTheWild.Description=\u70ba\u4f60\u53ec\u559a\u4e00\u96bb\u5bf5\u7269 +Taming.SubSkill.CallOfTheWild.Description.2=&7\u53ec\u559a \uff1a \u8e72\u4e0b\u548c\u9ede\u64ca\u5de6\u9375\uff0c\u624b\u6301\u6307\u5b9a\u7269\u54c1\n {0} {1} \uff08\u5c71\u8c93\uff09\u3001{2} {3} \uff08\u72fc\uff09\u3001{4} {5} \uff08\u99ac\uff09 +Taming.SubSkill.FastFoodService.Name=\u901f\u98df\u670d\u52d9 +Taming.SubSkill.FastFoodService.Description=\u4e00\u5b9a\u6a5f\u7387\u4f7f\u72fc\u5728\u653b\u64ca\u6642\u56de\u5fa9\u81ea\u8eab\u8840\u91cf +Taming.SubSkill.HolyHound.Name=\u72ac\u795e\u7684\u5e87\u8b77 +Taming.SubSkill.HolyHound.Description=\u5df2\u88ab\u9b54\u6cd5\u548c\u4e2d\u6bd2\u6548\u679c\u6cbb\u6108 +Taming.SubSkill.Gore.Name=\u55dc\u8840 +Taming.SubSkill.Gore.Description=\u81f4\u547d\u653b\u64ca\u6703\u7d66\u76ee\u6a19\u653e\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.SharpenedClaws.Description=\u984d\u5916\u50b7\u5bb3 +Taming.SubSkill.EnvironmentallyAware.Name=\u74b0\u5883\u611f\u77e5 +Taming.SubSkill.EnvironmentallyAware.Description=\u4ed9\u4eba\u638c/\u5ca9\u6f3f\u6050\u61fc\u75c7\uff0c\u6e1b\u5c11\u6454\u843d\u50b7\u5bb3 Taming.SubSkill.ThickFur.Name=\u6bdb\u76ae\u5f37\u5316 -Taming.SubSkill.ThickFur.Description=\u524a\u6e1b\u706b\u7130\u50b7\u5bb3 -Taming.Listener.Wolf=&8\u4f60\u7684\u72fc\u8fc5\u901f\u5730\u56de\u5230\u4e86\u4f60\u7684\u8eab\u908a... -Taming.Listener=\u99b4\u7378: +Taming.SubSkill.ThickFur.Description=\u524a\u6e1b\u53d7\u5230\u7684\u50b7\u5bb3\uff0c\u6297\u706b +Taming.SubSkill.Pummel.Name=\u731b\u64ca +Taming.SubSkill.Pummel.Description=\u4f60\u7684\u72fc\u6709\u6a5f\u7387\u64ca\u9000\u6575\u4eba +Taming.SubSkill.Pummel.TargetMessage=\u4f60\u88ab\u72fc\u64ca\u9000\u4e86 \uff01 +Taming.Listener.Wolf=&8\u4f60\u7684\u72fc\u56de\u5230\u4f60\u8eab\u908a\u2026\u2026 +Taming.Listener=\u99b4\u7378 \uff08Taming\uff09 \uff1a Taming.SkillName=\u99b4\u7378 -Taming.Skillup=\u99b4\u7378\u6280\u80fd\u4e0a\u5347\u4e86 {0}! \u7e3d\u7b49\u7d1a ({1})! -Taming.Summon.Complete=&a\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: &e{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: &e{0} -Unarmed.Ability.Chance.Disarm=\u64ca\u843d\u6b66\u5668\u6a5f\u7387: &e{0} -Unarmed.Ability.Chance.IronGrip=\u9435\u722a\u6a5f\u7387: &e{0} -Unarmed.Ability.IronGrip.Attacker=\u4f60\u7684\u5c0d\u624b\u6709\u9435\u722a! -Unarmed.Ability.IronGrip.Defender=&a\u4f60\u7684\u9435\u722a\u4f7f\u4f60\u7684\u6b66\u5668\u514d\u65bc\u88ab\u64ca\u843d! -Unarmed.Ability.Lower=&7**\u4f60\u653e\u9b06\u4e86\u4f60\u7684\u62f3\u982d** -Unarmed.Ability.Ready=&a**\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=&a**\u767c\u52d5\u72c2\u66b4** -Unarmed.Skills.Berserk.Other.Off=\u72c2\u66b4&a \u5373\u5c07\u7ed3\u675f &e{0} -Unarmed.Skills.Berserk.Other.On=&a{0}&2 \u4f7f\u7528\u4e86 &c\u72c2\u66b4! -Unarmed.Skills.Berserk.Refresh=&a\u4f60\u7684 &e\u72c2\u66b4 &a\u6280\u80fd\u5df2\u53ef\u4f7f\u7528! -Unarmed.Skillup=\u640f\u64ca\u6280\u80fd\u4e0a\u5347\u4e86 {0}! \u7e3d\u7b49\u7d1a ({1})! +Taming.Summon.COTW.Success.WithoutLifespan=&a\uff08\u91ce\u6027\u7684\u547c\u559a\uff09 &7\u4f60\u5df2\u7d93\u53ec\u559a\u4e86\u4e00\u500b &6{0}&7\u3002 +Taming.Summon.COTW.Success.WithLifespan=&a\uff08\u91ce\u6027\u7684\u547c\u559a\uff09 &7\u4f60\u5df2\u7d93\u53ec\u559a\u4e86\u4e00\u500b &6{0}&7\uff0c\u5b83\u7684\u6301\u7e8c\u6642\u9593\u70ba &6{1}&7 \u79d2\u3002 +Taming.Summon.COTW.Limit=&a\uff08Call Of The Wild\uff09 &7\u4f60\u53ea\u80fd\u540c\u6642\u64c1\u6709 &c{0} &7\u53ec\u559a &7{1} \u5bf5\u7269\u3002 +Taming.Summon.COTW.TimeExpired=&a\uff08\u91ce\u6027\u7684\u547c\u559a\uff09&7\u6642\u9593\u5230\u4e86\uff0c\u4f60\u7684 &6{0}&7 \u51fa\u767c\u4e86\u3002 +Taming.Summon.COTW.Removed=&a\uff08\u91ce\u6027\u7684\u547c\u559a\uff09 &7\u4f60\u53ec\u559a\u7684 &6{0}&7 \u5df2\u7d93\u5f9e\u9019\u500b\u4e16\u754c\u6d88\u5931\u4e86\u3002 +Taming.Summon.COTW.BreedingDisallowed=&a\uff08\u91ce\u6027\u7684\u547c\u559a\uff09 &c\u4f60\u4e0d\u80fd\u7e41\u6b96\u88ab\u53ec\u559a\u7684\u52d5\u7269\u3002 +Taming.Summon.COTW.NeedMoreItems=&a\uff08\u91ce\u6027\u7684\u547c\u559a\uff09&7\u4f60\u9084\u9700\u8981 &e{0}&7 \u500b &3{1}&7\u3002 +Taming.Summon.Name.Format={0} \u7684 {1} +#UNARMED +Unarmed.Ability.Bonus.0=\u9435\u81c2\u5f0f +Unarmed.Ability.Bonus.1=+{0} \u50b7\u5bb3\u52a0\u6210 +Unarmed.Ability.IronGrip.Attacker=\u4f60\u7684\u5c0d\u624b\u6709\u8d85\u5f37\u63e1\u529b \uff01 +Unarmed.Ability.IronGrip.Defender=&a\u4f60\u7684\u8d85\u5f37\u63e1\u529b\u62b5\u64cb\u4f4f\u4e86\u5c0d\u65b9\u7684\u7e73\u68b0\u653b\u64ca \uff01 +Unarmed.Ability.Lower=&7\u4f60\u9b06\u958b\u4e86\u4f60\u7684\u62f3\u982d\u3002 +Unarmed.Ability.Ready=&3\u4f60 &6\u63e1\u7dca&3 \u4e86\u4f60\u7684\u62f3\u982d\u3002 +Unarmed.SubSkill.Berserk.Name=\u72c2\u66b4 +Unarmed.SubSkill.Berserk.Description=+50% \u50b7\u5bb3\uff0c\u80fd\u7834\u58de\u786c\u5ea6\u4f4e\u7684\u65b9\u584a +Unarmed.SubSkill.Berserk.Stat=\u72c2\u66b4\u6301\u7e8c\u6642\u9593 +Unarmed.SubSkill.Disarm.Name=\u7e73\u68b0 +Unarmed.SubSkill.Disarm.Description=\u64ca\u843d\u6575\u4eba\u624b\u4e2d\u7684\u6b66\u5668 +Unarmed.SubSkill.Disarm.Stat=\u7e73\u68b0\u6a5f\u7387 +Unarmed.SubSkill.UnarmedLimitBreak.Name=\u683c\u9b25\u6975\u9650\u7a81\u7834 +Unarmed.SubSkill.UnarmedLimitBreak.Description=\u7a81\u7834\u4f60\u7684\u6975\u9650\u3002 +Unarmed.SubSkill.UnarmedLimitBreak.Stat=\u7a81\u7834\u6975\u9650\u7684\u50b7\u5bb3\u52a0\u6210 +Unarmed.SubSkill.SteelArmStyle.Name=\u9435\u81c2\u5f0f +Unarmed.SubSkill.SteelArmStyle.Description=\u96a8\u8457\u6642\u9593\u63a8\u79fb\uff0c\u624b\u81c2\u5c07\u8d8a\u4f86\u8d8a\u786c +Unarmed.SubSkill.ArrowDeflect.Name=\u7bad\u77e2\u504f\u5411 +Unarmed.SubSkill.ArrowDeflect.Description=\u8b93\u7bad\u77e2\u504f\u5411 +Unarmed.SubSkill.ArrowDeflect.Stat=\u7bad\u77e2\u504f\u5411\u6a5f\u7387 +Unarmed.SubSkill.IronGrip.Name=\u9435\u8155 +Unarmed.SubSkill.IronGrip.Description=\u9632\u6b62\u4f60\u88ab\u7e73\u68b0 +Unarmed.SubSkill.IronGrip.Stat=\u9435\u8155\u89f8\u767c\u6a5f\u7387 +Unarmed.SubSkill.BlockCracker.Name=\u65b9\u584a\u7c89\u788e\u6a5f +Unarmed.SubSkill.BlockCracker.Description=\u7528\u62f3\u982d\u6253\u788e\u77f3\u982d +Unarmed.Listener=\u683c\u9b25 \uff08Unarmed\uff09 \uff1a +Unarmed.SkillName=\u683c\u9b25 +Unarmed.Skills.Berserk.Off=**\u72c2\u66b4\u7d50\u675f** +Unarmed.Skills.Berserk.On=&a**\u72c2\u66b4\u958b\u555f** +Unarmed.Skills.Berserk.Other.Off=\u72c2\u66b4&a \u7d50\u675f\u4e86\uff0c\u9032\u5165\u51b7\u537b &e{0} +Unarmed.Skills.Berserk.Other.On=&a{0}&2 \u4f7f\u7528\u4e86 &c\u72c2\u66b4 \uff01 +Unarmed.Skills.Berserk.Refresh=&a\u4f60\u7684 &e\u72c2\u66b4 &a\u6280\u80fd\u53ef\u4ee5\u4f7f\u7528\u4e86 \uff01 +#WOODCUTTING 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: &e{0} -Woodcutting.Ability.Length=\u4f10\u6728\u5de5\u6301\u7e8c\u6642\u9593: &e{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.Ability.1=\u6383\u9664\u6a39\u8449 +Woodcutting.Ability.Locked.0=\u9396\u5b9a\u72c0\u614b\uff0c\u76f4\u5230 {0}+ \u6280\u80fd \uff08\u79cb\u98a8\u6383\u843d\u8449\uff09 +Woodcutting.SubSkill.TreeFeller.Name=\u4f10\u6728\u5de5 +Woodcutting.SubSkill.TreeFeller.Description=\u7206\u767c\u5f0f\u780d\u6a39 +Woodcutting.SubSkill.TreeFeller.Stat=\u7206\u767c\u5f0f\u780d\u6a39\u6301\u7e8c\u6642\u9593 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.SubSkill.LeafBlower.Description=\u6383\u9664\u6a39\u8449 +Woodcutting.SubSkill.KnockOnWood.Name=\u6572\u6728\u982d +Woodcutting.SubSkill.KnockOnWood.Description=\u4f7f\u7528\u4f10\u6728\u6a5f\u6642\u5c0b\u627e\u984d\u5916\u7684\u597d\u6771\u897f +Woodcutting.SubSkill.KnockOnWood.Stat=\u6572\u6728\u982d +Woodcutting.SubSkill.KnockOnWood.Loot.Normal=\u4f86\u81ea\u6a39\u6728\u7684\u6a19\u6e96\u6230\u5229\u54c1 +Woodcutting.SubSkill.KnockOnWood.Loot.Rank2=\u4f86\u81ea\u6a39\u6728\u548c\u7d93\u9a57\u503c\u7684\u6a19\u6e96\u6230\u5229\u54c1 +Woodcutting.SubSkill.HarvestLumber.Name=\u6a39\u6728\u8c50\u6536 +Woodcutting.SubSkill.HarvestLumber.Description=\u5de7\u5999\u5730\u7372\u5f97\u66f4\u591a\u6728\u982d\n\u6709\u6a5f\u7387\u96d9\u500d\u6389\u843d +Woodcutting.SubSkill.HarvestLumber.Stat=\u6a39\u6728\u8c50\u6536\u96d9\u500d\u6a5f\u7387 +Woodcutting.SubSkill.Splinter.Name=\u7c89\u788e +Woodcutting.SubSkill.Splinter.Description=\u66f4\u6709\u6548\u7684\u780d\u6a39\u3002 +Woodcutting.SubSkill.BarkSurgeon.Name=\u6a39\u6728\u5916\u79d1\u91ab\u751f +Woodcutting.SubSkill.BarkSurgeon.Description=\u525d\u6a39\u6642\u63d0\u53d6\u5be6\u7528\u7684\u6750\u6599\u3002 +Woodcutting.SubSkill.NaturesBounty.Name=\u5927\u81ea\u7136\u7684\u6069\u60e0 +Woodcutting.SubSkill.NaturesBounty.Description=\u5f9e\u5927\u81ea\u7136\u4e2d\u7372\u5f97\u7d93\u9a57\u3002 +Woodcutting.Listener=\u4f10\u6728 \uff08Woodcutting\uff09 \uff1a Woodcutting.SkillName=\u4f10\u6728 -Woodcutting.Skills.TreeFeller.Off=**\u4f10\u6728\u5de5\u5df2\u7ed3\u675f** -Woodcutting.Skills.TreeFeller.On=&a**\u555f\u52d5\u4f10\u6728\u5de5** -Woodcutting.Skills.TreeFeller.Refresh=&a\u4f60\u7684 &e\u4f10\u6728\u5de5 &a\u5df2\u53ef\u4f7f\u7528\uff01 -Woodcutting.Skills.TreeFeller.Other.Off=\u4f10\u6728\u5de5&a \u5373\u5c07\u7ed3\u675f &e{0} -Woodcutting.Skills.TreeFeller.Other.On=&a{0}&2 \u4f7f\u7528\u4e86 &c\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=&a**\u6280\u80fd\u51b7\u537b\u5b8c\u7562!** -Ability.Generic.Template.Lock=&7{0} -Ability.Generic.Template=&6{0}: &3{1} -Combat.ArrowDeflect=&f**\u64ca\u843d\u5f13\u7bad** -Combat.BeastLore=&a**\u99b4\u7378\u4e4b\u80fd** -Combat.BeastLoreHealth=&3\u751f\u547d\u503c (&a{0}&3/{1}) -Combat.BeastLoreOwner=&3\u64c1\u6709\u8005 (&c{0}&3) -Combat.Gore=&a**\u6d41\u8840** -Combat.StruckByGore=**\u4f60\u958b\u59cb\u6d41\u8840\u4e86** -Combat.TargetDazed=\u76ee\u6a19\u5df2\u88ab &4 \u64ca\u6688 -Combat.TouchedFuzzy=&4\u982d\u6688\u76ee\u7729... -mcMMO.Description=&3\u95dc\u65bc &emcMMO&3 \u5c08\u6848:,&6mcMMO\u662f\u4e00\u500b&c\u958b\u653e\u539f\u59cb\u78bc\u7684&6 RPG \u6a21\u7d44\u59cb\u65bc2011\u5e74\u4e8c\u6708,&6\u5efa\u7acb\u8005 &9nossr50&6. \u65e8\u5728\u63d0\u4f9b\u4e00\u500b\u9ad8\u54c1\u8ceaRPG\u9ad4\u9a57.,&3\u5c0f\u6280\u5de7:,&6 - &a\u8f38\u5165 &c/mcmmo help&a \u4ee5\u4e86\u89e3\u6240\u6709\u6307\u4ee4,&6 - &a\u8f38\u5165 &c/\u6280\u80fd\u540d\u7a31 &a\u4ee5\u4e86\u89e3\u6280\u80fd\u7d30\u7bc0,&3\u958b\u767c\u8005:,&6 - &anossr50 &9(\u8d0a\u52a9\u8005),&6 - &aGJ &9(\u5c08\u6848\u9818\u5c0e\u4eba),&6 - &aNuclearW &9(\u958b\u767c\u8005),&6 - &abm01 &9(\u958b\u767c\u8005),&6 - &aTfT_02 &9(\u958b\u767c\u8005),&6 - &aGlitchfinder &9(\u958b\u767c\u8005),&6 - &at00thpick1 &9(\u958b\u767c\u8005),&3\u5be6\u7528\u9023\u7d50:,&6 - &ahttps://github.com/mcMMO-Dev/mcMMO/issues&6 \u932f\u8aa4\u56de\u5831,&6 - &a#mcmmo @ irc.esper.net&6 IRC \u983b\u9053, -Commands.addlevels.AwardAll.1=&a\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=&a{1}\u6280\u80fd\u5df2\u589e\u52a0{0}\u7b49! -Commands.addlevels.AwardSkill.2={0} \u56e0\u70ba {1} \u800c\u4fee\u6539. -Commands.addxp.AwardAll=&a\u5728\u5168\u90e8\u7684\u6280\u80fd\u88e1\u4f60\u9084\u5dee {0} \u7d93\u9a57\u503c! -Commands.addxp.AwardSkill=&a\u4f60\u5728 {1} \u4e2d\u88ab\u734e\u52f5\u4e86 {0} \u7d93\u9a57\u503c! -Commands.Ability.Off=\u6280\u80fd\u4f7f\u7528 &c\u95dc\u9589 -Commands.Ability.On=\u6280\u80fd\u4f7f\u7528 &a\u555f\u52d5 -Commands.Ability.Toggle=\u6280\u80fd\u4f7f\u7528\u5df2\u88ab\u5207\u63db\u70ba &e{0} -Commands.AdminChat.Off=\u7ba1\u7406\u54e1\u804a\u5929\u6a21\u5f0f &c\u95dc\u9589 -Commands.AdminChat.On=\u7ba1\u7406\u54e1\u804a\u5929\u6a21\u5f0f &a\u958b\u555f -Commands.AdminToggle=- \u5207\u63db\u7ba1\u7406\u54e1\u804a\u5929\u6a21\u5f0f +Woodcutting.Skills.TreeFeller.Off=**\u4f10\u6728\u5de5\u7d50\u675f** +Woodcutting.Skills.TreeFeller.On=&a**\u4f10\u6728\u5de5\u958b\u555f** +Woodcutting.Skills.TreeFeller.Refresh=&a\u4f60\u7684 &e\u4f10\u6728\u5de5 &a\u6280\u80fd\u53ef\u4ee5\u4f7f\u7528\u4e86 \uff01 +Woodcutting.Skills.TreeFeller.Other.Off=\u4f10\u6728\u6280\u80fd &a\u7d50\u675f\u4e86\uff0c\u9032\u5165\u51b7\u537b &e{0} +Woodcutting.Skills.TreeFeller.Other.On=&a{0}&2 \u4f7f\u7528\u4e86 &c\u4f10\u6728\u5de5\u6280\u80fd \uff01 +Woodcutting.Skills.TreeFeller.Splinter=\u4f60\u7684\u65a7\u982d\u8b8a\u6210\u4e86\u4e00\u5806\u788e\u7247 \uff01 +Woodcutting.Skills.TreeFeller.Threshold=\u90a3\u68f5\u6a39\u592a\u5927\u4e86 \uff01 +#ABILITIY + +#COMBAT +Combat.ArrowDeflect=&f**\u7bad\u77e2\u504f\u5411** +Combat.BeastLore=&a**\u99b4\u7378\u77e5\u8b58** +Combat.BeastLoreHealth=&3\u751f\u547d\u503c \uff08&a{0}&3/{1}\uff09 +Combat.BeastLoreOwner=&3\u64c1\u6709\u8005 \uff08&c{0}&3\uff09 +Combat.BeastLoreHorseSpeed=&3\u99ac\u5339\u79fb\u52d5\u901f\u5ea6 \uff08&a{0} \u683c/\u79d2&3\uff09 +Combat.BeastLoreHorseJumpStrength=&3\u99ac\u5339\u8df3\u8e8d\u9ad8\u5ea6 \uff08&a\u6700\u9ad8 {0} \u683c&3\uff09 +Combat.Gore=&a**\u76ee\u6a19\u88ab\u653e\u8840** +Combat.StruckByGore=**\u4f60\u88ab\u653e\u8840\u4e86** +Combat.TargetDazed=\u76ee\u6a19\u88ab &4\u88ab\u64ca\u6688 +Combat.TouchedFuzzy=&4\u982d\u6688\u76ee\u7729\u3002 +#COMMANDS +##generic +mcMMO.Description=&3\u95dc\u65bc&e mcMMO &3\uff1a &6mcMMO \u662f&c\u958b\u6e90&6 RPG \u6a21\u7d44\uff0c&6\u7531 &9nossr50&6 \u4e3b\u5c0e\u5efa\u7acb\u65bc 2011 \u5e74 2 \u6708\u3002\u4e3b\u65e8\u70ba\u73a9\u5bb6\u63d0\u4f9b\u9ad8\u54c1\u8cea\u7684 RPG \u9ad4\u9a57\u3002&3\u5c0f\u63d0\u9192 \uff1a &6- &a\u4f7f\u7528&c/mcMMO help&a \u67e5\u770b\u6307\u4ee4\uff0c&6 - &a\u8f38\u5165 &c/mcmmo help&a \u67e5\u770b\u8a73\u7d30\u7684\u6280\u80fd\u8cc7\u8a0a\uff0c&3\u958b\u767c\u8005 \uff1a &6- &anossr50 &9\uff08\u5275\u59cb\u4eba& \u9805\u76ee\u8ca0\u8cac\u4eba\uff09&6 - &aGJ &9\uff08\u9805\u76ee\u7d44\u9577\uff09&6 - &aNuclearW &9\uff08\u958b\u767c\u8005\uff09&6 - &abm01 &9\uff08\u958b\u767c\u8005\uff09&6 - &aTfT_02 &9\uff08\u958b\u767c\u8005\uff09&6 - &aGlitchfinder &9\uff08\u958b\u767c\u8005\uff09&6 - &at00thpick1 &9\uff08\u958b\u767c\u8005\uff09&6 - &aFlandre_tw &3\u7ffb\u8b6f\u54e1\u3002&3\u5be6\u7528\u9023\u7d50 \uff1a&6 - &ahttps://github.com/mcMMO-Dev/mcMMO/issues&6 \u6f0f\u6d1e\u5831\u544a&6 - &ahttps://discord.gg/EJGVanb &6\u5b98\u65b9 Discord \u4f3a\u670d\u5668 +mcMMO.Description.FormerDevs=&3\u524d\u958b\u767c\u8005 \uff1a &aGJ\u3001NuclearW\u3001bm01\u3001TfT_02\u3001Glitchfinder +Commands.addlevels.AwardAll.1=\u4f60\u6240\u6709\u7684\u6280\u80fd\u7b49\u7d1a\u88ab\u63d0\u5347\u4e86 {0} \u7d1a \uff01 +Commands.addlevels.AwardAll.2=\u4f60\u6240\u6709\u7684\u6280\u80fd\u7b49\u7d1a\u5df2\u88ab {0} \u4fee\u6539\u3002 +Commands.addlevels.AwardSkill.1=&a\u4f60\u7684 {0} \u6280\u80fd\u7b49\u7d1a\u88ab\u63d0\u5347\u4e86 {1} \u7d1a \uff01 +Commands.addlevels.AwardSkill.2={0} \u6280\u80fd\u7b49\u7d1a\u5df2\u88ab {1} \u4fee\u6539\u3002 +Commands.addxp.AwardAll=&a\u4f60\u6240\u6709\u7684\u6280\u80fd\u7372\u5f97 {0} \u7d93\u9a57 \uff01 +Commands.addxp.AwardSkill=&a\u4f60\u7684 {0} \u6280\u80fd\u7372\u5f97\u4e86 {1} \u7d93\u9a57 \uff01 +Commands.Ability.Off=&c\u95dc\u9589\u80fd\u529b\u4f7f\u7528 +Commands.Ability.On=&a\u958b\u555f\u80fd\u529b\u4f7f\u7528 +Commands.Ability.Toggle=\u80fd\u529b\u4f7f\u7528\u5df2\u5207\u63db\u70ba &e{0} +Commands.AdminChat.Off=&c\u95dc\u9589\u7ba1\u7406\u804a\u5929\u6a21\u5f0f +Commands.AdminChat.On=&a\u958b\u555f\u7ba1\u7406\u804a\u5929\u6a21\u5f0f +Commands.AdminToggle=&a- \u5207\u63db\u7ba1\u7406\u54e1\u804a\u5929 Commands.Chat.Console=*\u63a7\u5236\u53f0* -Commands.Cooldowns.Header=&6--= &amcMMO \u80fd\u529b\u51b7\u537b\u6642\u9593&6 =-- -Commands.Cooldowns.Row.N=\\ &c{0}&f - &6\u5c1a\u9918 {1} \u79d2 -Commands.Cooldowns.Row.Y=\\ &b{0}&f - &2 \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 &e{0} -Commands.Healthbars.Changed.HEARTS=[mcMMO] \u4f60\u7684\u8840\u689d\u986f\u793a\u6a21\u5f0f\u5df2\u66f4\u6539\u70ba &c\u611b\u5fc3&f. -Commands.Healthbars.Changed.BAR=[mcMMO] \u4f60\u7684\u8840\u689d\u986f\u793a\u6a21\u5f0f\u5df2\u66f4\u6539\u70ba &e\u65b9\u584a&f. -Commands.Healthbars.Changed.DISABLED=[mcMMO] \u4f60\u7684\u602a\u7269\u8840\u689d\u5df2 &7\u505c\u7528&f. -Commands.Healthbars.Invalid=\u4e0d\u6b63\u78ba\u7684\u8840\u689d\u985e\u578b! -Commands.Inspect= &c-\u67e5\u770b\u73a9\u5bb6\u8a73\u7d30\u8a0a\u606f -Commands.Party.Invite.Accepted=&a\u63a5\u53d7\u9080\u8acb\uff0c\u4f60\u52a0\u5165\u4e86\u968a\u4f0d {0} -Commands.Invite.Success=&a\u9080\u8acb\u8a0a\u606f\u767c\u9001\u6210\u529f -Commands.Leaderboards= &c- \u6392\u884c\u699c -Commands.mcc.Header=---[]&emcMMO \u6307\u4ee4&c[]--- -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=&a\u6578\u64da\u5df2\u91cd\u7f6e! -Commands.mcrank.Heading=&6-=\u500b\u4eba\u6392\u884c=- -Commands.mcrank.Overall=\u6574\u9ad4&a - &6\u6392\u884c &f#&a{0} -Commands.mcrank.Player=\u76ee\u6a19: &f{0} -Commands.mcrank.Skill={0}&a - &6\u6392\u540d &f#&a{1} -Commands.mcrank.Unranked=&f\u6392\u884c\u699c\u5916 -Commands.mcrefresh.Success={0} \u79d2\u5f8c\u51b7\u537b\u6642\u9593\u5b8c\u7562. -Commands.mcremove.Success=&a{0} \u5df2\u6210\u529f\u5f9e\u6578\u64da\u88e1\u79fb\u9664! -Commands.mctop.Tip=&6\u5c0f\u6487\u6b65: \u6253 &c/mcrank&6 \u53ef\u4ee5\u89c0\u770b\u4f60\u7684\u6392\u540d! -Commands.mmoedit=[player] &c - \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=&a\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=&7\u958b\u59cb\u5f9e{0}\u8f49\u63db\u81f3{1}... -Commands.mcconvert.Database.Finish=&7\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 &a{0} -Commands.mcconvert.Experience.Invalid=\u4e0d\u660e\u7684\u516c\u5f0f\u7a2e\u985e! \u6b63\u78ba\u7684\u7a2e\u985e\u70ba: &aLINEAR &c\u548c &aEXPONENTIAL. -Commands.mcconvert.Experience.Same=\u6b63\u5728\u4f7f\u7528{0}\u516c\u5f0f +Commands.Cooldowns.Header=&6--= &amcMMO \u80fd\u529b\u51b7\u537b&6 =-- +Commands.Cooldowns.Row.N=\ &c{0}&f - \u5269\u9918 &6{1} &f\u79d2 +Commands.Cooldowns.Row.Y=\ &b{0}&f - &2\u6e96\u5099\u5c31\u7dd2 \uff01 +Commands.Database.CooldownMS=\u4f60\u5fc5\u9808\u7b49\u5f85 {0} \u6beb\u79d2\u624d\u80fd\u518d\u6b21\u4f7f\u7528\u8a72\u6307\u4ee4\u3002 +Commands.Database.Cooldown=\u4f60\u5fc5\u9808\u7b49\u5f85 {0} \u79d2\u624d\u80fd\u518d\u6b21\u4f7f\u7528\u8a72\u6307\u4ee4\u3002 +Commands.Database.Processing=\u4f60\u7684\u6307\u4ee4\u6b63\u5728\u8655\u7406\u4e2d\uff0c\u8acb\u8010\u5fc3\u7b49\u5f85\u3002 +Commands.Disabled=\u9019\u500b\u6307\u4ee4\u88ab\u95dc\u9589\u4e86\u3002 +Commands.DoesNotExist= &c\u8a72\u540d\u73a9\u5bb6\u4e0d\u5b58\u5728\u65bc\u8cc7\u6599\u5eab\u4e2d \uff01 +Commands.GodMode.Disabled=mcMMO \u4e0a\u5e1d\u6a21\u5f0f\u95dc\u9589 +Commands.GodMode.Enabled=mcMMO \u4e0a\u5e1d\u6a21\u5f0f\u958b\u555f +Commands.AdminChatSpy.Enabled=mcMMO \u968a\u4f0d\u804a\u5929\u76e3\u8996\u5df2\u958b\u555f +Commands.AdminChatSpy.Disabled=mcMMO \u968a\u4f0d\u804a\u5929\u76e3\u8996\u5df2\u95dc\u9589 +Commands.AdminChatSpy.Toggle=mcMMO \u968a\u4f0d\u804a\u5929\u5df2\u5207\u63db\u70ba&e {0} +Commands.AdminChatSpy.Chat=&6[\u76e3\u8996 \uff1a &a{0}&6] &f{1} +Commands.GodMode.Forbidden=[mcMMO] \u4e0a\u5e1d\u6a21\u5f0f\u4e0d\u5141\u8a31\u5728\u9019\u500b\u4e16\u754c\u958b\u555f \uff08\u8a73\u898b\u6b0a\u9650\u914d\u7f6e\uff09 +Commands.GodMode.Toggle=\u4e0a\u5e1d\u6a21\u5f0f\u5df2\u5207\u63db\u70ba &e{0} +Commands.Healthbars.Changed.HEARTS=[mcMMO] \u4f60\u7684\u8840\u91cf\u986f\u793a\u985e\u578b\u5df2\u66f4\u6539\u70ba &c\u5fc3\u5f62&f\u3002 +Commands.Healthbars.Changed.BAR=[mcMMO] \u4f60\u7684\u8840\u91cf\u986f\u793a\u985e\u578b\u5df2\u66f4\u6539\u70ba &c\u65b9\u5f62&f\u3002 +Commands.Healthbars.Changed.DISABLED=[mcMMO] \u4f60\u7684\u602a\u7269\u8840\u91cf\u986f\u793a\u5df2\u88ab &7\u95dc\u9589&f\u3002 +Commands.Healthbars.Invalid=\u7121\u6548\u7684\u8840\u91cf\u985e\u578b \uff01 +Commands.Inspect= &a- \u67e5\u770b\u73a9\u5bb6\u8a73\u7d30\u8cc7\u8a0a +Commands.Invite.Success=&a\u9080\u8acb\u5df2\u6210\u529f\u50b3\u9001\u3002 +Commands.Leaderboards= &a- \u6392\u540d\u677f +Commands.mcgod=&a- \u5207\u63db\u4e0a\u5e1d\u6a21\u5f0f +Commands.mchud.Invalid=\u9019\u4e0d\u662f\u6709\u6548\u7684 HUD \u985e\u578b\u3002 +Commands.mcpurge.Success=&a\u8cc7\u6599\u5eab\u5df2\u6210\u529f\u6e05\u9664 \uff01 +Commands.mcrank.Heading=&6-=\u500b\u4eba\u6392\u540d=- +Commands.mcrank.Overall=\u7d9c\u5408&a - &6\u6392\u540d &f#&a{0} +Commands.mcrank.Player=&f{0} &e\u7684\u6392\u540d +Commands.mcrank.Skill=&e{0}&a - &6\u6392\u540d &f#&a{1} +Commands.mcrank.Unranked=&f\u7121\u6392\u540d +Commands.mcrefresh.Success={0} \u7684\u51b7\u537b\u6642\u9593\u5df2\u91cd\u65b0\u6574\u7406 +Commands.mcremove.Success=&a{0} \u5f9e\u8cc7\u6599\u5eab\u4e2d\u522a\u9664 \uff01 +Commands.mctop.Tip=&6\u5c0f\u63d0\u9192 \uff1a \u4f7f\u7528 &c/mcrank&6 \u4f86\u67e5\u770b\u4f60\u6240\u6709\u7684\u500b\u4eba\u6392\u540d \uff01 +Commands.mmoedit=[player] &a- \u7de8\u8f2f\u76ee\u6a19 +Commands.mmoedit.AllSkills.1=&a\u4f60\u6240\u6709\u7684\u6280\u80fd\u7b49\u7d1a\u88ab\u8a2d\u5b9a\u70ba {0} \u7d1a \uff01 +Commands.mmoedit.Modified.1=&a\u4f60\u7684 {0} \u6280\u80fd\u7b49\u7d1a\u88ab\u8a2d\u5b9a\u70ba {1} \u7d1a \uff01 +Commands.mmoedit.Modified.2={0} \u5df2\u88ab {1} \u4fee\u6539\u3002 +Commands.mcconvert.Database.Same=\u4f60\u5df2\u7d93\u5728\u4f7f\u7528 {0} \u8cc7\u6599\u5eab \uff01 +Commands.mcconvert.Database.InvalidType={0} \u4e0d\u662f\u6709\u6548\u7684\u8cc7\u6599\u5eab\u985e\u578b\u3002 +Commands.mcconvert.Database.Start=&7\u958b\u59cb\u5f9e {0} \u8f49\u63db\u81f3 {1}\u2026\u2026 +Commands.mcconvert.Database.Finish=&7\u8cc7\u6599\u5eab\u9077\u79fb\u5b8c\u6210 \uff1b {1} \u8cc7\u6599\u5eab\u73fe\u5728\u64c1\u6709 {0} \u8cc7\u6599\u5eab\u7684\u6240\u6709\u8cc7\u6599\u3002 +Commands.mmoshowdb=\u76ee\u524d\u4f7f\u7528\u7684\u8cc7\u6599\u5eab\u70ba &a{0} +Commands.mcconvert.Experience.Invalid=\u932f\u8aa4\u7684\u516c\u5f0f\u985e\u578b \uff01 \u6709\u6548\u985e\u578b\u70ba \uff1a &a\u7dda\u6027 &c\u548c &a\u6307\u6578\u3002 +Commands.mcconvert.Experience.Same=\u6b63\u5728\u4f7f\u7528\u516c\u5f0f{0} Commands.mcconvert.Experience.Start=&7\u958b\u59cb\u5f9e{0}\u8f49\u63db\u5230{1}\u66f2\u7dda -Commands.mcconvert.Experience.Finish=&7\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 &c\u95dc\u9589 -Commands.Notifications.On=\u5207\u63db\u80fd\u529b\u901a\u77e5\u70ba &a\u958b\u555f -Commands.Offline=&c\u9019\u500b\u6307\u4ee4\u4e26\u4e0d\u9069\u7528\u65bc\u96e2\u7dda\u73a9\u5bb6. -Commands.Other=&a--\u5176\u4ed6\u6307\u4ee4-- -Commands.Party.Header=-----[]&a\u968a\u4f0d&c[]----- -Commands.Party.Status=&8\u540d\u5b57: &f{0} {1} -Commands.Party.ShareMode=&8\u5206\u4eab\u6a21\u5f0f: -Commands.Party.ItemShare=&7\u7269\u54c1 &3({0}) -Commands.Party.ExpShare=&7\u7d93\u9a57\u503c &3({0}) -Commands.Party.ItemShareCategories=&8\u5171\u4eab\u7269\u54c1: &7&o{0} -Commands.Party.MembersNear=&8\u63a5\u8fd1\u4f60 &3{0}&8/&3{1} -Commands.Party.Accept=- \u63a5\u53d7\u968a\u4f0d\u9080\u8acb -Commands.Party.Chat.Off=\u968a\u4f0d\u804a\u5929\u6a21\u5f0f&c\u53d6\u6d88 -Commands.Party.Chat.On=\u968a\u4f0d\u804a\u5929\u6a21\u5f0f &a\u958b\u555f -Commands.Party.Commands=&a--\u7d44\u968a\u6307\u4ee4-- -Commands.Party.Invite.0=\u6ce8\u610f: &a\u4f60\u6536\u5230\u4e86\u4f86\u81ea {1} \u7684\u968a\u4f0d\u9080\u8acb {0} -Commands.Party.Invite.1=\u8f38\u5165 &a/party accept&e \u4f86\u63a5\u53d7\u9080\u8acb -Commands.Party.Invite=- \u5df2\u767c\u9001\u968a\u4f0d\u9080\u8acb -Commands.Party.Join=&7\u52a0\u5165\u7684\u968a\u4f0d: {0} -Commands.Party.Create=&7\u5275\u5efa\u7684\u968a\u4f0d\u540d\u7a31: {0} -Commands.Party.Rename=&7\u968a\u4f0d\u540d\u7a31\u5df2\u66f4\u6539\u70ba: &f{0} -Commands.Party.SetSharing=&7\u968a\u4f0d {0} \u5206\u4eab\u8a2d\u5b9a\u70ba: &3{1} -Commands.Party.ToggleShareCategory=&7\u968a\u4f0d\u5171\u4eab\u7684\u7269\u54c1&6{0} &7 \u5df2\u7d93 &3{1} -Commands.Party.AlreadyExists=&4\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=&c ----- [] &a\u6210\u54e1&c [] ----- -Commands.Party.None=\u4f60\u4e0d\u5728\u968a\u4f0d\u4e2d. -Commands.Party.Quit=- \u96e2\u958b\u4f60\u73fe\u5728\u7684\u968a\u4f0d -Commands.Party.Teleport= &c- \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 &a\u5141\u8a31 -Commands.ptp.Disabled=\u968a\u4f0d\u50b3\u9001 &c\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} &a\u5df2\u50b3\u9001\u81f3\u4f60\u65c1\u908a. -Commands.ptp.Request2=&a\u4f60\u50b3\u9001\u7684\u8a71\u8acb\u8f38\u5165&e/ptp accept. &a\u5728&c{0} &a\u79d2\u5167\u5fc5\u9808\u5b8c\u6210 -Commands.ptp.AcceptAny.Enabled=\u968a\u4f0d\u50b3\u9001\u8acb\u6c42\u78ba\u8a8d &a\u555f\u7528 -Commands.ptp.AcceptAny.Disabled=\u968a\u4f0d\u50b3\u9001\u8acb\u6c42\u78ba\u8a8d&c\u7981\u7528 -Commands.ptp.RequestExpired=\u968a\u4f0d\u50b3\u9001\u5df2\u6210\u529f! -Commands.PowerLevel.Leaderboard=--mcMMO&9 \u6230\u9b25\u529b &e\u6392\u884c\u699c-- -Commands.PowerLevel.Capped=&4\u6230\u9b25\u529b: &a{0} &4\u6700\u9ad8\u7b49\u7d1a: &e{1} -Commands.PowerLevel=&4\u6230\u9b25\u529b: &a{0} -Commands.Reset.All=&a\u4f60\u5168\u90e8\u7684\u6280\u80fd\u7b49\u7d1a\u4ee5\u91cd\u7f6e\u6210\u529f. -Commands.Reset.Single=&a\u4f60\u7684 {0} \u6280\u80fd\u7b49\u7d1a\u4ee5\u91cd\u7f6e\u6210\u529f. -Commands.Reset=\u8a2d\u5b9a\u6280\u80fd\u7b49\u7d1a\u70ba0 -Commands.Scoreboard.Clear=&3\u5df2\u6e05\u9664 mcMMO \u5f97\u5206\u699c. -Commands.Scoreboard.NoBoard=mcMMO \u5f97\u5206\u699c\u4e26\u672a\u555f\u7528. -Commands.Scoreboard.Keep=&3mcMMO \u5f97\u5206\u699c\u6703\u6301\u7e8c\u986f\u793a\u76f4\u5230\u4f60\u8f38\u5165 &a/mcscoreboard clear&3. -Commands.Scoreboard.Timer=&3mcMMO \u5f97\u5206\u699c\u5c07\u5728 &6{0}&3 \u79d2\u540e\u6e05\u9664. -Commands.Scoreboard.Help.0=&6 == &c/mcscoreboard &a\u8aaa\u660e &6== -Commands.Scoreboard.Help.1=&3/mcscoreboard&b clear &f - \u6e05\u9664 McMMO \u5f97\u5206\u699c -Commands.Scoreboard.Help.2=&3/mcscoreboard&b keep &f - \u6301\u7e8c\u986f\u793a mcMMO \u5f97\u5206\u699c -Commands.Scoreboard.Help.3=&3/mcscoreboard&b \u6642\u9593 [n] &f - \u5728 &dn&f \u79d2\u4e4b\u5f8c\u6e05\u9664 McMMO \u5f97\u5206\u699c -Commands.Scoreboard.Tip.Keep=&6\u5c0f\u6280\u5de7: \u7576\u5f97\u5206\u699c\u51fa\u73fe\u6642\u8f38\u5165 &c/mcscoreboard keep&6 \u4f86\u907f\u514d\u5b83\u6d88\u5931. -Commands.Scoreboard.Tip.Clear=&6\u5c0f\u6280\u5de7: \u8f38\u5165 &c/mcscoreboard clear&6 \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 &9{0}&e \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.mcconvert.Experience.Finish=&7\u516c\u5f0f\u8f49\u63db\u5b8c\u6210 \uff1b \u73fe\u5728\u4f7f\u7528 {0} \u7d93\u9a57\u66f2\u7dda\u3002 +Commands.ModDescription=&a- \u8acb\u95b1\u8b80\u7c21\u8981\u63d2\u4ef6\u63cf\u8ff0 +Commands.NoConsole=\u9019\u500b\u6307\u4ee4\u4e0d\u652f\u63f4\u5728\u63a7\u5236\u53f0\u4f7f\u7528\u3002 +Commands.Notifications.Off=\u6280\u80fd\u5c0f\u63d0\u9192 &c\u95dc\u9589 +Commands.Notifications.On=\u6280\u80fd\u5c0f\u63d0\u9192 &a\u958b\u555f +Commands.Offline=\u9019\u500b\u6307\u4ee4\u5c0d\u96e2\u7dda\u73a9\u5bb6\u7121\u6548 +Commands.NotLoaded=\u73a9\u5bb6\u8cc7\u6599\u5c1a\u672a\u8f09\u5165\u3002 +Commands.Party.Status=&8\u540d\u7a31 \uff1a &f{0} {1} &8\u7b49\u7d1a \uff1a &3{2} +Commands.Party.Status.Alliance=&8\u7d44\u968a \uff1a &f{0} +Commands.Party.UnlockedFeatures=&8\u5df2\u89e3\u9396\u529f\u80fd \uff1a &7&o{0} +Commands.Party.ShareMode=&8\u5171\u4eab\u6a21\u5f0f \uff1a +Commands.Party.ItemShare=&7\u7269\u54c1 &3\uff08{0}\uff09 +Commands.Party.ExpShare=&7\u7d93\u9a57 &3\uff08{0}\uff09 +Commands.Party.ItemShareCategories=&8\u7269\u54c1\u5206\u914d \uff1a &7&o{0} +Commands.Party.MembersNear=&8\u4f60\u9644\u8fd1 &3{0}&8/&3{1} +Commands.Party.Accept=&a- \u63a5\u53d7\u968a\u4f0d\u9080\u8acb +Commands.Party.Chat.Off=\u53ea\u5141\u8a31\u968a\u4f0d\u804a\u5929 &c\u95dc\u9589 +Commands.Party.Chat.On=\u53ea\u5141\u8a31\u968a\u4f0d\u804a\u5929 &a\u958b\u555f +Commands.Party.Commands=&c---[]&a\u968a\u4f0d\u6307\u4ee4&c[]--- +Commands.Party.Invite.0=&c\u6ce8\u610f \uff1a &a\u4f60\u6536\u5230\u4e86\u7d44\u968a\u9080\u8acb {0} \u4f86\u81ea {1} +Commands.Party.Invite.1=&e\u8f38\u5165 &a/party accept&e \u4f86\u63a5\u53d7\u9080\u8acb +Commands.Party.Invite=&a- \u50b3\u9001\u7d44\u968a\u9080\u8acb +Commands.Party.Invite.Accepted=&a\u5df2\u63a5\u53d7\u7d44\u968a\u9080\u8acb\u3002\u4f60\u5df2\u7d93\u52a0\u5165\u968a\u4f0d {0} +Commands.Party.Join=&7\u52a0\u5165\u7684\u968a\u4f0d \uff1a {0} +Commands.Party.PartyFull=&6{0}&c \u5df2\u6eff \uff01 +Commands.Party.PartyFull.Invite=\u4f60\u4e0d\u80fd\u9080\u8acb &e{0}&c \u5230 &a{1}&c \u56e0\u70ba\u968a\u4f0d\u5df2\u7d93\u6709 &3{2}&c \u500b\u73a9\u5bb6\u4e86 \uff01 +Commands.Party.PartyFull.InviteAccept=\u4f60\u4e0d\u80fd\u52a0\u5165\u968a\u4f0d &a{0}&c \u56e0\u70ba\u968a\u4f0d\u5df2\u7d93\u6709 &3{1}&c \u500b\u73a9\u5bb6\u4e86 \uff01 +Commands.Party.Create=&7\u5df2\u5efa\u7acb\u968a\u4f0d \uff1a {0} +Commands.Party.Rename=&7\u968a\u4f0d\u540d\u8b8a\u66f4\u70ba \uff1a &f{0} +Commands.Party.SetSharing=&7\u968a\u4f0d {0} \u5171\u4eab\u8a2d\u5b9a\u70ba \uff1a &3{1} +Commands.Party.ToggleShareCategory=&7\u968a\u4f0d\u7269\u54c1\u5206\u914d\u7531 &6{0} &7\u8b8a\u70ba &3{1} +Commands.Party.AlreadyExists=&4\u968a\u4f0d {0} \u5df2\u5b58\u5728 \uff01 +Commands.Party.Kick=&c\u4f60\u5df2\u88ab &a{0}&c &c\u8e22\u51fa \uff01\uff01 +Commands.Party.Leave=&e\u4f60\u96e2\u958b\u4e86\u9019\u652f\u968a\u4f0d +Commands.Party.Members.Header=&c-----[]&a\u6210\u54e1&c[]----- +Commands.Party.None=&c\u4f60\u4e0d\u5728\u968a\u4f0d\u4e2d\u3002 +Commands.Party.Quit=&a- \u96e2\u958b\u4f60\u73fe\u6709\u7684\u968a\u4f0d +Commands.Party.Teleport=&a- \u50b3\u9001\u5230\u968a\u4f0d\u6210\u54e1 +Commands.Party.Toggle=&a- \u5207\u63db\u968a\u4f0d\u804a\u5929 +Commands.Party1=&a- \u5efa\u7acb\u65b0\u968a\u4f0d +Commands.Party2=&a- \u52a0\u5165\u73a9\u5bb6\u7684\u968a\u4f0d +Commands.Party.Alliance.Header=&c-----[]&a\u968a\u4f0d\u7d44\u968a&c[]----- +Commands.Party.Alliance.Ally=&f{0} &8\u7684\u7d44\u968a\u968a\u4f0d \uff1a &f{1} +Commands.Party.Alliance.Members.Header=&c-----[]&a\u7d44\u968a\u6210\u54e1&c[]----- +Commands.Party.Alliance.Invite.0=\u6ce8\u610f \uff1a &a\u4f60\u5f9e {1} \u6536\u5230\u968a\u4f0d\u7d44\u968a\u9080\u8acb\u4f86 {0} +Commands.Party.Alliance.Invite.1=\u8f38\u5165 &a/party alliance accept&e \u4f86\u63a5\u53d7\u9080\u8acb +Commands.Party.Alliance.Invite.Accepted=&a\u5df2\u63a5\u53d7\u7d44\u968a\u9080\u8acb\u3002 +Commands.Party.Alliance.None=&c\u4f60\u6c92\u6709\u7d44\u968a.&c&a +Commands.Party.Alliance.AlreadyAllies=&c\u4f60\u7684\u968a\u4f0d\u5df2\u7d93\u6709\u76df\u53cb\u3002\u4f7f\u7528 &3/party alliance disband &c\u4f86\u89e3\u6563\u76ee\u524d\u7d44\u968a\u3002 +Commands.Party.Alliance.Help.0=&c\u9019\u500b\u968a\u4f0d\u9084\u6c92\u6709\u7d44\u968a\uff0c\u9080\u8acb\u4ed6\u7684\u968a\u9577\u7d50\u6210\u7d44\u968a\u3002 +Commands.Party.Alliance.Help.1=&c\u4f7f\u7528 &3/party alliance invite <\u73a9\u5bb6>&c\u3002 +Commands.ptp.Enabled=\u968a\u4f0d\u50b3\u9001 &a\u958b\u555f +Commands.ptp.Disabled=\u968a\u4f0d\u50b3\u9001 &c\u95dc\u9589 +Commands.ptp.NoRequests=&c\u76ee\u524d\u6c92\u6709\u50b3\u9001\u8acb\u6c42 +Commands.ptp.NoWorldPermissions=&c[mcMMO] \u4f60\u6c92\u6709\u6b0a\u9650\u50b3\u9001\u5230\u4e16\u754c {0}\u3002 +Commands.ptp.Request1=&e{0} &a\u5df2\u7d93\u5411\u4f60\u767c\u51fa\u8acb\u6c42\u50b3\u9001 +Commands.ptp.Request2=&a\u540c\u610f\u50b3\u9001\u8f38\u5165 &e/ptp accept\u3002&a\u8acb\u6c42\u5c07\u5728 &c{0} &a\u79d2\u5f8c\u5931\u6548 +Commands.ptp.AcceptAny.Enabled=\u968a\u4f0d\u50b3\u9001\u8acb\u6c42\u78ba\u8a8d &a\u958b\u555f +Commands.ptp.AcceptAny.Disabled=\u968a\u4f0d\u50b3\u9001\u8acb\u6c42\u78ba\u8a8d &c\u95dc\u9589 +Commands.ptp.RequestExpired=&c\u968a\u4f0d\u50b3\u9001\u8acb\u6c42\u5df2\u5931\u6548 \uff01 +Commands.PowerLevel.Leaderboard=&e--mcMMO &9\u6230\u9b25\u529b &e\u6392\u540d\u699c-- +Commands.PowerLevel.Capped=&4\u6230\u9b25\u529b \uff1a &a{0} &4\u6700\u9ad8\u7b49\u7d1a \uff1a &e{1} +Commands.PowerLevel=&4\u6230\u9b25\u529b \uff1a &a{0} +Commands.Reset.All=&a\u4f60\u7684\u6280\u80fd\u7b49\u7d1a\u5df2\u5fa9\u4f4d\u6210\u529f\u3002 +Commands.Reset.Single=&a\u4f60\u7684 {0} \u6280\u80fd\u7b49\u7d1a\u5df2\u6210\u529f\u91cd\u8a2d\u3002 +Commands.Reset=&a- \u91cd\u8a2d\u6280\u80fd\u7b49\u7d1a\u70ba 0 +Commands.Scoreboard.Clear=&3mcMMO \u8a08\u5206\u677f\u5df2\u6e05\u7a7a\u3002 +Commands.Scoreboard.NoBoard=&cmcMMO \u8a08\u5206\u677f\u76ee\u524d\u672a\u958b\u555f\u3002 +Commands.Scoreboard.Keep=&3mcMMO \u8a08\u5206\u677f\u5c07\u61f8\u505c\u76f4\u5230\u4f60\u4f7f\u7528 &a/mcscoreboard clear&3\u3002 +Commands.Scoreboard.Timer=&3mcMMO \u8a08\u5206\u677f\u5c07\u5728 &6{0}&3 \u79d2\u5f8c\u6e05\u7a7a\u3002 +Commands.Scoreboard.Help.0=&6== &c/mcscoreboard &a\u5e6b\u52a9&6 == +Commands.Scoreboard.Help.1=&3/mcscoreboard&b clear &f- \u6e05\u7a7a mcMMO \u8a08\u5206\u677f +Commands.Scoreboard.Help.2=&3/mcscoreboard&b keep &f- \u4fdd\u6301 mcMMO \u8a08\u5206\u677f\u61f8\u505c +Commands.Scoreboard.Help.3=&3/mcscoreboard&b time [n] &f- &dn&f \u79d2\u5f8c\u6e05\u7a7a mcMMO \u8a08\u5206\u677f +Commands.Scoreboard.Tip.Keep=&6\u5c0f\u63d0\u9192 \uff1a \u7576\u8a08\u5206\u677f\u986f\u793a\u6642\u4f7f\u7528 &c/mcscoreboard keep&6 \u4f86\u4fdd\u6301\u5b83\u4e0d\u6d88\u5931\u3002 +Commands.Scoreboard.Tip.Clear=&6\u5c0f\u63d0\u9192 \uff1a \u4f7f\u7528 &c/mcscoreboard clear&6 \u4f86\u95dc\u9589\u8a08\u5206\u677f\u3002 +Commands.XPBar.Reset=&6XP \u5df2\u91cd\u8a2d mcMMO \u7684\u6b04\u4f4d\u8a2d\u5b9a\u3002 +Commands.XPBar.SettingChanged=&6\u7d93\u9a57\u503c &a{0}&6 \u7684\u6b04\u4f4d\u8a2d\u5b9a\u73fe\u5728\u8a2d\u5b9a\u70ba &a{1} +Commands.Skill.Invalid=\u9019\u4e0d\u662f\u6709\u6548\u7684\u6280\u80fd\u540d\u7a31 \uff01 +Commands.Skill.ChildSkill=\u5b50\u6280\u80fd\u5c0d\u8a72\u6307\u4ee4\u7121\u6548 \uff01 +Commands.Skill.Leaderboard=--mcMMO &9{0}&e \u6392\u540d\u699c-- +Commands.SkillInfo=&a- \u67e5\u770b\u6280\u80fd\u7684\u8a73\u7d30\u8cc7\u8a0a +Commands.Stats=&a- \u4f60\u7684\u8cc7\u8a0a +Commands.ToggleAbility=&a- \u9ede\u64ca\u53f3\u9375\u5207\u63db\u6280\u80fd\u958b\u555f\u6a21\u5f0f +Commands.Usage.0=&c\u6b63\u78ba\u7684\u7528\u6cd5\u662f /{0} +Commands.Usage.1=&c\u6b63\u78ba\u7684\u7528\u6cd5\u662f /{0} {1} +Commands.Usage.2=&c\u6b63\u78ba\u7684\u7528\u6cd5\u662f /{0} {1} {2} +Commands.Usage.3=&c\u6b63\u78ba\u7684\u7528\u6cd5\u662f /{0} {1} {2} {3} +Commands.Usage.3.XP=&c\u6b63\u78ba\u7684\u7528\u6cd5\u662f/{0} {1} {2} {3}&7 \uff08\u4f60\u53ef\u4ee5\u5728\u6700\u5f8c\u52a0\u4e0a -s \u4f86\u57f7\u884c\u6307\u4ee4\u800c\u4e0d\u901a\u77e5\u73a9\u5bb6\uff0c\u6709\u6548\u5730\u4f7f\u5176\u975c\u97f3\uff09 +Commands.Usage.FullClassName=\u8cc7\u6599\u985e\u578b Commands.Usage.Level=\u7b49\u7d1a Commands.Usage.Message=\u8a0a\u606f -Commands.Usage.Page=\u9801\u6578 +Commands.Usage.Page=\u9801 Commands.Usage.PartyName=\u540d\u7a31 Commands.Usage.Password=\u5bc6\u78bc Commands.Usage.Player=\u73a9\u5bb6 -Commands.Usage.Rate=\u6a5f\u7387 +Commands.Usage.Rate=\u6bd4\u7387 Commands.Usage.Skill=\u6280\u80fd +Commands.Usage.SubSkill=\u5b50\u6280\u80fd Commands.Usage.XP=\u7d93\u9a57\u503c -mcMMO.NoInvites=\u4f60\u6c92\u6709\u6536\u5230\u4efb\u4f55\u968a\u4f0d\u9080\u8acb -mcMMO.NoPermission=&4\u6b0a\u9650\u4e0d\u8db3 -mcMMO.NoSkillNote=&8\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&3{0} [password]. -Party.Help.1=\u8981\u5275\u5efa\u4e00\u500b\u968a\u4f0d\uff0c\u8acb\u4f7f\u7528&3 {0} [password]. -Party.Help.2=\u66f4\u591a\u8cc7\u8a0a\u8acb\u8aee\u8a62&3{0} -Party.Help.3=\u4f7f\u7528 &3{0} [password] &c\u4f86\u52a0\u5165\u6216\u4f7f\u7528 &3{1} &c\u4f86\u96e2\u958b -Party.Help.4=\u6b32\u9396\u5b9a\u6216\u89e3\u9396\u4f60\u7684\u968a\u4f0d\uff0c\u4f7f\u7528&3 {0} -Party.Help.5=\u6b32\u4f7f\u7528\u5bc6\u78bc\u4fdd\u8b77\u4f60\u7684\u968a\u4f0d\uff0c\u8acb\u4f7f\u7528&3 {0} -Party.Help.6=\u8981\u5f9e\u968a\u4f0d\u4e2d\u8e22\u6389\u6210\u54e1\uff0c\u4f7f\u7528&3 {0} -Party.Help.7=\u8981\u8f49\u79fb\u4f60\u7684\u968a\u4f0d\u6240\u6709\u6b0a\uff0c\u4f7f\u7528&3 {0} -Party.Help.8=\u8981\u89e3\u6563\u968a\u4f0d\uff0c\u4f7f\u7528&3 {0} -Party.Help.9=\u4f7f\u7528 &3{0} &c\u4f86\u548c\u968a\u54e1\u5206\u4eab\u7269\u54c1 -Party.Help.10=\u4f7f\u7528 &3{0} &c\u4f86\u555f\u7528\u548c\u968a\u54e1\u5206\u4eab\u7d93\u9a57 -Party.InformedOnJoin={0} &a\u52a0\u5165\u4e86\u4f60\u7684\u968a\u4f0d -Party.InformedOnQuit={0} &a\u96e2\u958b\u4e86\u4f60\u7684\u968a\u4f0d -Party.InformedOnNameChange=&6{0} &a\u5c07\u968a\u4f0d\u540d\u7a31\u8a2d\u5b9a\u70ba &f{1} -Party.InvalidName=&4\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! +Commands.Description.mmoinfo=\u95b1\u8b80\u6709\u95dc\u6280\u80fd\u6216\u6a5f\u5236\u7684\u8a73\u7d30\u8cc7\u8a0a\u3002 +Commands.MmoInfo.Mystery=&7\u4f60\u6c92\u6709\u89e3\u9396\u9019\u9805\u80fd\u529b\uff0c\u4f46\u7576\u4f60\u89e3\u9396\u4e86\u9019\u9805\u80fd\u529b\u5f8c\u518d\u9ede\u64ca\u53ef\u4ee5\u67e5\u770b\u80fd\u529b\u7684\u8a73\u7d30\u8cc7\u8a0a \uff01 +Commands.MmoInfo.NoMatch=\u90a3\u500b\u5b50\u6280\u80fd\u4e0d\u5b58\u5728 \uff01 +Commands.MmoInfo.Header=&3-=[]=====[]&6 MMO \u8cc7\u8a0a &3[]=====[]=- +Commands.MmoInfo.SubSkillHeader=&6\u540d\u7a31 \uff1a &e{0} +Commands.MmoInfo.DetailsHeader=&3-=[]=====[]&a \u7d30\u7bc0 &3[]=====[]=- +Commands.MmoInfo.OldSkill=&7mcMMO \u6280\u80fd\u6b63\u5728\u88ab\u8f49\u63db\u70ba\u66f4\u5148\u9032\u7684\u6a21\u7d44\u5316\u6280\u80fd\u7cfb\u7d71\uff0c\u907a\u61be\u7684\u662f\u9019\u9805\u6280\u80fd\u5c1a\u672a\u8f49\u63db\uff0c\u7f3a\u5c11\u8a73\u7d30\u7684\u7d71\u8a08\u8cc7\u6599\u3002\u65b0\u7cfb\u7d71\u5c07\u5141\u8a31\u66f4\u5feb\u7684\u65b0 mcMMO \u6280\u80fd\u66f4\u5feb\u5730\u91cb\u653e\u548c\u73fe\u6709\u6280\u80fd\u66f4\u5927\u7684\u9748\u6d3b\u6027\u3002 +Commands.MmoInfo.Mechanics=&3-=[]=====[]&6 \u6a5f\u68b0\u5b78 &3[]=====[]=- +Commands.MmoInfo.Stats=\u7d71\u8a08 \uff1a {0} +Commands.Mmodebug.Toggle=mcMMO \u9664\u932f\u6a21\u5f0f &6{0}&7\uff0c\u4f7f\u7528\u9019\u500b\u6307\u4ee4\u5207\u63db\u72c0\u614b\u3002\u5982\u679c\u958b\u555f\u9664\u932f\u6a21\u5f0f\uff0c\u4f60\u53ef\u4ee5\u9ede\u64ca\u65b9\u584a\u8f38\u51fa\u7528\u65bc\u652f\u63f4\u7684\u5be6\u7528\u8cc7\u8a0a\u3002 +mcMMO.NoInvites=&c\u4f60\u73fe\u5728\u6c92\u6709\u6536\u5230\u4efb\u4f55\u9080\u8acb +mcMMO.NoPermission=&4\u4f60\u6c92\u6709\u4f7f\u7528\u8a72\u6307\u4ee4\u7684\u6b0a\u9650\u3002 +mcMMO.NoSkillNote=&8\u5982\u679c\u4f60\u6c92\u6709\u67d0\u500b\u6280\u80fd\u7684\u4f7f\u7528\u6b0a\u9650\uff0c\u90a3\u9ebc\u4ed6\u5c07\u4e0d\u6703\u5728\u9019\u88e1\u986f\u793a\u2026\u2026 +##party +Party.Forbidden=[mcMMO] \u968a\u4f0d\u529f\u80fd\u4e0d\u5141\u8a31\u5728\u9019\u500b\u4e16\u754c\u958b\u555f \uff08\u8a73\u898b\u6b0a\u9650\u914d\u7f6e\uff09 +Party.Help.0=&c\u6b63\u78ba\u7684\u7528\u6cd5 &3{0} [password]\u3002 +Party.Help.1=&c\u5efa\u7acb\u968a\u4f0d\uff0c\u4f7f\u7528 &3{0} [password]\u3002 +Party.Help.2=&c\u67e5\u95b1 &3{0} &c\u7372\u5f97\u66f4\u591a\u8cc7\u8a0a +Party.Help.3=&c\u4f7f\u7528 &3{0} [password] &c\u52a0\u5165\u6216 &3{1} &c\u9000\u51fa +Party.Help.4=&c\u9396\u5b9a\u6216\u89e3\u9396\u4f60\u7684\u968a\u4f0d\uff0c\u4f7f\u7528 &3{0} +Party.Help.5=&c\u8a2d\u5b9a\u968a\u4f0d\u5bc6\u78bc\uff0c\u4f7f\u7528 &3{0} +Party.Help.6=&c\u5f9e\u4f60\u7684\u968a\u4f0d\u4e2d\u8e22\u51fa\u73a9\u5bb6\uff0c\u4f7f\u7528 &3{0} +Party.Help.7=&c\u79fb\u4ea4\u968a\u9577\uff0c\u4f7f\u7528 &3{0} +Party.Help.8=&c\u89e3\u6563\u968a\u4f0d\uff0c\u4f7f\u7528 &3{0} +Party.Help.9=&c\u4f7f\u7528 &3{0} &c\u4f86\u8207\u4f60\u7684\u968a\u4f0d\u6210\u54e1\u5206\u4eab\u7269\u54c1 +Party.Help.10=&c\u4f7f\u7528 &3{0} &c\u958b\u555f\u8207\u4f60\u7684\u968a\u4f0d\u6210\u54e1\u5206\u4eab\u7d93\u9a57 +Party.InformedOnJoin={0} &a\u5df2\u7d93\u52a0\u5165\u4f60\u7684\u968a\u4f0d +Party.InformedOnQuit={0} &a\u96e2\u958b\u4e86\u968a\u4f0d +Party.InformedOnNameChange=&6{0} &a\u5df2\u8a2d\u5b9a\u968a\u4f0d\u540d\u70ba &f{1} +Party.InvalidName=&4\u90a3\u4e0d\u662f\u6709\u6548\u7684\u968a\u4f0d\u540d\u7a31\u3002 +Party.Invite.Self=&c\u4f60\u4e0d\u80fd\u9080\u8acb\u81ea\u5df1 \uff01 +Party.IsLocked=&c\u9019\u500b\u968a\u4f0d\u5df2\u7d93\u9396\u5b9a \uff01 +Party.IsntLocked=&c\u9019\u500b\u968a\u4f0d\u4e26\u6c92\u6709\u9396\u5b9a \uff01 +Party.Locked=&c\u968a\u4f0d\u88ab\u9396\u5b9a\uff0c\u53ea\u6709\u968a\u9577\u53ef\u4ee5\u9080\u8acb\u3002 Party.NotInYourParty=&4{0} \u4f60\u4e0d\u5728\u4f60\u7684\u5718\u968a -Party.NotOwner=&4\u4f60\u4e26\u975e\u968a\u9577. -Party.Owner.New=&a{0} \u6210\u70ba\u65b0\u968a\u9577. -Party.Owner.NotLeader=&4\u56e0\u9592\u7f6e\u904e\u4e45,\u968a\u9577\u81ea\u52d5\u8f49\u8b93. -Party.Owner.Player=&a\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.NotOwner=&4\u4f60\u4e0d\u662f\u968a\u9577 +Party.Target.NotOwner=&4{0} \u4e0d\u662f\u968a\u9577\u3002 +Party.Owner.New=&a{0} \u73fe\u5728\u662f\u65b0\u7684\u968a\u4f0d\u968a\u9577\u3002 +Party.Owner.NotLeader=&4\u4f60\u5df2\u7d93\u4e0d\u518d\u662f\u968a\u4f0d\u5167\u7684\u968a\u9577\u3002 +Party.Owner.Player=&a\u4f60\u73fe\u5728\u4e0d\u662f\u968a\u9577\u4e86 +Party.Password.None=&c\u52a0\u5165\u9019\u500b\u968a\u4f0d\u9700\u8981\u5bc6\u78bc\u3002\u8acb\u63d0\u4f9b\u5bc6\u78bc\u518d\u52a0\u5165 +Party.Password.Incorrect=&c\u968a\u4f0d\u5bc6\u78bc\u932f\u8aa4 Party.Password.Set=&a\u968a\u4f0d\u5bc6\u78bc\u8a2d\u5b9a\u70ba {0} -Party.Password.Removed=&a\u968a\u4f0d\u5bc6\u78bc\u5df2\u522a\u9664. -Party.Player.Invalid=\u6b64\u73a9\u5bb6\u4e0d\u5b58\u5728 -Party.NotOnline=&4{0} \u4e26\u4e0d\u5728\u7dda\u4e0a! -Party.Player.InSameParty={0} \u5df2\u7d93\u5728\u4f60\u968a\u4f0d\u88e1\u4e86! -Party.PlayerNotInParty=&4{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=&a\u4f60\u5df2\u7d93\u50b3\u9001\u5230 {0}. -Party.Teleport.Self=\u4f60\u7121\u6cd5\u50b3\u9001\u5230\u4f60\u81ea\u5df1\u8eab\u65c1! -Party.Teleport.Target=&a{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=&7\u968a\u4f0d\u5df2\u89e3\u9396! +Party.Password.Removed=&a\u968a\u4f0d\u5bc6\u78bc\u5df2\u88ab\u6e05\u9664 +Party.Player.Invalid=&c\u9019\u4e0d\u662f\u4e00\u540d\u6709\u6548\u7684\u73a9\u5bb6 +Party.NotOnline=&4{0} \u96e2\u7dda \uff01 +Party.Player.InSameParty=&c{0} \u5df2\u7d93\u5728\u968a\u4f0d\u4e2d \uff01 +Party.PlayerNotInParty=&4{0} \u4e0d\u5728\u968a\u4f0d\u88e1 +Party.Specify=&c\u4f60\u5fc5\u9808\u6307\u5b9a\u968a\u4f0d +Party.Teleport.Dead=&c\u4f60\u4e0d\u80fd\u50b3\u9001\u5230\u6b7b\u4ea1\u7684\u73a9\u5bb6\u8eab\u908a +Party.Teleport.Hurt=&c\u4f60\u53d7\u5230\u50b7\u5bb3\uff0c\u81f3\u5c11 {0} \u79d2\u5167\u4e0d\u80fd\u50b3\u9001 +Party.Teleport.Player=&a\u4f60\u5df2\u7d93\u50b3\u9001\u5230 {0}\u3002 +Party.Teleport.Self=&c\u4f60\u4e0d\u80fd\u50b3\u9001\u5230\u4f60\u81ea\u5df1\u90a3\u88e1 \uff01 +Party.Teleport.Target=&a{0} \u5df2\u7d93\u50b3\u9001\u5230\u4f60\u8eab\u908a\u3002 +Party.Teleport.Disabled=&c{0} \u4e0d\u5141\u8a31\u968a\u4f0d\u50b3\u9001 +Party.Rename.Same=&c\u9019\u5df2\u7d93\u662f\u4f60\u7684\u968a\u4f0d\u540d\u7a31\u4e86 \uff01 +Party.Join.Self=&c\u4f60\u4e0d\u80fd\u52a0\u5165\u4f60\u81ea\u5df1 \uff01 +Party.Unlocked=&7\u968a\u4f0d\u5df2\u89e3\u9396 Party.Disband=&7\u968a\u4f0d\u5df2\u89e3\u6563 -Party.Status.Locked=&4(\u53ea\u53ef\u9080\u8acb) -Party.Status.Unlocked=&2(\u958b\u555f) -Party.ShareType.Xp=\u7d93\u9a57\u503c +Party.Alliance.Formed=&7\u4f60\u7684\u968a\u4f0d\u76ee\u524d\u8207 &a{0} &7\u7d50\u76df +Party.Alliance.Disband=&7\u4f60\u7684\u968a\u4f0d\u4e0d\u518d\u8207 &c{0} &7\u7d50\u76df +Party.Status.Locked=&4\uff08\u50c5\u9080\u8acb\uff09 +Party.Status.Unlocked=&2\uff08\u958b\u555f\uff09 +Party.LevelUp=&e\u968a\u4f0d\u7b49\u7d1a\u63d0\u5347 {0} \u7d1a\u3002\u7e3d\u8a08 \uff08{1}\uff09 +Party.Feature.Chat=\u968a\u4f0d\u804a\u5929 +Party.Feature.Teleport=\u968a\u4f0d\u50b3\u9001 +Party.Feature.Alliance=\u7d44\u968a +Party.Feature.ItemShare=\u7269\u54c1\u5171\u4eab +Party.Feature.XpShare=\u7d93\u9a57\u5171\u4eab +Party.Feature.Locked.Chat=\u529f\u80fd\u9396\u5b9a\u76f4\u81f3 {0}+ \u7d1a\uff08\u968a\u4f0d\u804a\u5929\uff09 +Party.Feature.Locked.Teleport=\u529f\u80fd\u9396\u5b9a\u76f4\u81f3 {0}+ \uff08\u968a\u4f0d\u50b3\u9001\uff09 +Party.Feature.Locked.Alliance=\u529f\u80fd\u9396\u5b9a\u76f4\u81f3 {0}+ \uff08\u7d44\u968a\uff09 +Party.Feature.Locked.ItemShare=\u529f\u80fd\u9396\u5b9a\u76f4\u81f3 {0}+ \uff08\u7269\u54c1\u5171\u4eab\uff09 +Party.Feature.Locked.XpShare=\u529f\u80fd\u9396\u5b9a\u76f4\u81f3 {0}+ \uff08\u7d93\u9a57\u5171\u4eab\uff09 +Party.Feature.Disabled.1=&c\u968a\u4f0d\u804a\u5929\u5c1a\u672a\u89e3\u9396\u3002 +Party.Feature.Disabled.2=&c\u968a\u4f0d\u50b3\u9001\u5c1a\u672a\u89e3\u9396\u3002 +Party.Feature.Disabled.3=&c\u968a\u4f0d\u7d44\u968a\u5c1a\u672a\u89e3\u9396\u3002 +Party.Feature.Disabled.4=&c\u968a\u4f0d\u7269\u54c1\u5171\u4eab\u5c1a\u672a\u89e3\u9396\u3002 +Party.Feature.Disabled.5=&c\u968a\u4f0d\u7d93\u9a57\u5171\u4eab\u5c1a\u672a\u89e3\u9396\u3002 +Party.ShareType.Xp=\u7d93\u9a57 Party.ShareType.Item=\u7269\u54c1 Party.ShareMode.None=\u7121 -Party.ShareMode.Equal=\u5e73\u5206 +Party.ShareMode.Equal=\u5747\u52fb\u5206\u914d 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.Loot=\u63a0\u596a 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 +##xp Commands.XPGain.Acrobatics=\u6389\u843d -Commands.XPGain.Archery=\u653b\u64ca\u602a\u7269 +Commands.XPGain.Alchemy=\u91c0\u9020\u85e5\u6c34 +Commands.XPGain.Archery=\u7a7a\u624b\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.Child=\u5f9e\u4e3b\u6280\u80fd\u7372\u5f97\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.Fishing=\u91e3\u9b5a \uff08\u53bb\u60f3\u60f3\u5427\uff01\uff09 +Commands.XPGain.Herbalism=\u6536\u7a6b\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.Taming=\u99b4\u7378\uff0c\u548c\u4f60\u7684\u72fc\u4e00\u8d77\u6230\u9b25 Commands.XPGain.Unarmed=\u653b\u64ca\u602a\u7269 -Commands.XPGain.Woodcutting=\u780d\u6a39 -Commands.XPGain=&8\u7372\u5f97\u7d93\u9a57\u503c:&f{0} -Commands.xplock.locked=&6\u4f60\u7684\u7d93\u9a57\u503c\u9396\u5b9a\u5728 {0}! -Commands.xplock.unlocked=&6\u4f60\u7684\u7d93\u9a57\u503c\u73fe\u5728 &a\u89e3\u9664\u9396\u5b9a\u4e86&6! -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=&6 mcMMO \u7d93\u9a57\u52a0\u500d\u6642\u6bb5\u958b\u59cb! -Commands.xprate.started.1=&6mcMMO \u7d93\u9a57\u503c\u73fe\u5728\u52a0\u500d {0}x! -XPRate.Event=&6mcMMO\u73fe\u6b63\u8655\u65bc\u7d93\u9a57\u503c\u52a0\u500d\u968e\u6bb5!\u7d93\u9a57\u503c\u6bd4\u4f8b\u70ba{0}! -Effects.Effects=\u6548\u679c -Effects.Child=&8\u7b49\u7d1a: &a{0} -Effects.Level=&8\u7b49\u7d1a: &a{0} &3\u7d93\u9a57\u503c&e(&6{1}&e/&6{2}&e) -Effects.Parent=&6{0} - -Effects.Template=&3{0}: &a{1} -Guides.Available=&7 \u95dc\u65bc{0}\u7684\u8aaa\u660e - \u8f38\u5165 /{1} ? [\u9801\u6578] -Guides.Header=&6-=&a{0} \u6307\u5357&6=- -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=&3\u95dc\u65bc\u96dc\u6280:\n&e\u96dc\u6280\u53ef\u4ee5\u8b93\u4f60\u5728MMO\u88e1\u73a9\u5f97\u5f88\u512a\u96c5.\n&e\u5b83\u53ef\u4ee5\u8b93\u4f60\u5728\u6230\u9b25\u4e2d\u53ca\u74b0\u5883\u4e2d\u53d6\u5f97\u512a\u52e2.\n\n&3\u7d93\u9a57\u5982\u4f55\u7372\u53d6:\n&e\u5728\u6230\u9b25\u4e2d\u9583\u8eb2\u653b\u64ca\u6216\u5f9e\u9ad8\u8655\u589c\u843d\u5c07\n&e\u53ef\u7372\u5f97\u7d93\u9a57. -Guides.Acrobatics.Section.1=&3\u4ec0\u9ebc\u662f\u7ffb\u6efe?\n&e\u4f60\u6709\u4e00\u5b9a\u7684\u6a5f\u7387\u53ef\u4ee5\u6e1b\u514d\u5f9e\u9ad8\u8655\u589c\u843d\n&e\u7684\u50b7\u5bb3. \u4f60\u53ef\u4ee5\u6309\u4f4f\u6f5b\u884c\u9375(\u9810\u8a2dshift)\n&e\u4f86\u5f97\u5230\u96d9\u500d\u7684\u7ffb\u6efe\u6a5f\u7387.\n&e\u9019\u5c07\u89f8\u767c\u5b8c\u7f8e\u8457\u9678\u800c\u4e0d\u53ea\u662f\u55ae\u7d14\u7684\u7ffb\u6efe.\n&e\u5b8c\u7f8e\u8457\u9678\u6548\u679c\u8207\u7ffb\u6efe\u985e\u4f3c,\u4f46\u6709\u5169\u500d\n&e\u7684\u89f8\u767c\u6a5f\u7387\u4e14\u53ef\u6e1b\u514d\u66f4\u591a\u50b7\u5bb3.\n&e\u7ffb\u6efe\u6a5f\u7387\u95dc\u4fc2\u5230\u4f60\u7684\u96dc\u6280\u7b49\u7d1a. -Guides.Acrobatics.Section.2=&3\u4ec0\u9ebc\u662f\u8ff4\u907f?\n&e\u8ff4\u907f\u662f\u6709\u6a5f\u7387\u6e1b \u514d\u5728\u6230\u9b25\u4e2d\n&e\u6575\u4eba\u5c0d\u4f60\u7684\u50b7\u5bb3.\n&e\u9019\u6a5f\u7387\u95dc\u4fc2\u5230\u4f60\u7684\u96dc\u6280\u7b49\u7d1a. -Guides.Archery.Section.0=&3\u7bad\u8853:\n&e\u7bad\u8853\u662f\u7528\u5f13\u5c04\u7bad\u7684\u6280\u80fd.\n&e\u7bad\u8853\u6709\u5404\u7a2e\u52a0\u4e58\u6548\u679c,\u5982\u52a0\u4e58\u653b\u64ca\n&e\u6688\u7729\u5c0d\u624b\u7b49\u6548\u679c.\n&e\u6b64\u5916\u4f60\u4e5f\u6709\u6a5f\u7387\u56de\u6536\u5df2\u7d93\u5c04\u4e2d\u6575\u4eba\u7684\u7bad\n&e \u4ee5\u4e0a\u6a5f\u7387\u95dc\u4fc2\u5230\u7b49\u7d1a.\n\n&3\u7372\u53d6\u7d93\u9a57:\n&e\u8981\u7372\u5f97\u7d93\u9a57\u5fc5\u9808\u7528\u5f13\u5c04\u4e2d\u602a\u7269\u6216\u73a9\u5bb6. -Guides.Archery.Section.1=&3\u4ec0\u9ebc\u662f\u6280\u8853\u5c04\u64ca?\n&e\u6280\u8853\u5c04\u64ca\u5c07\u52a0\u4e58\u4f60\u7684\u5c04\u7bad\u57fa\u672c\u653b\u64ca\u529b.\n&e\u52a0\u4e58\u7684\u7a0b\u5ea6\u95dc\u4fc2\u5230\u4f60\u7684\u7bad\u8853\u7b49\u7d1a.\n&e\u9810\u8a2d\u72c0\u614b\u4e0b, \u6bcf\u534750\u7d1a\u52a0\u4e5810%\u653b\u64ca\u529b, \n&e\u6700\u9ad8\u5230200%\u52a0\u4e58. -Guides.Archery.Section.2=&3\u4ec0\u9ebc\u662f\u6688\u7729\u6548\u679c?\n&e\u7576\u4f60\u64ca\u4e2d\u76ee\u6a19\u6642\u6709\u88ab\u52d5\u6a5f\u7387\u4f7f\u76ee\u6a19\u6688\u7729.\n&e\u6688\u7dda\u89f8\u767c\u6642\u5c07\u5f37\u5236\u4f60\u7684\u76ee\u6a19\u5446\u6eef\u4e00\u5c0f\u6bb5\u6642\u9593.\n&e\u6688\u7729\u6548\u679c\u6709\u52a0\u4e584\u9ede\u50b7\u5bb3(2\u5fc3). -Guides.Archery.Section.3=&3\u4ec0\u9ebc\u662f\u56de\u6536\u5f13\u7bad?\n&e\u4f60\u6709\u6a5f\u7387\u5728\u6bba\u6b7b\u602a\u7269\u5f8c\u56de\u6536\u5c04\u51fa\u53bb\u7684\u7bad.\n&e\u6a5f\u7387\u95dc\u4fc2\u5230\u4f60\u7684\u7bad\u8853\u7b49\u7d1a.\n&e\u9810\u8a2d\u72c0\u614b\u4e0b,\u6bcf\u5347\u4e00\u7b49\u589e\u52a00.1%\u6a5f\u7387,\n&e\u7b49\u7d1a\u5230\u90541000\u6642\u5c07\u6709100%\u56de\u6536\u7387. -Guides.Axes.Section.0=&3\u95dc\u65bc\u65a7\u6280:\n&e\u6709\u4e86\u65a7\u6280, \u4f60\u5c31\u53ef\u4ee5\u4e0d\u5fc5\u53ea\u662f\u4e82\u63ee\u4e82\u780d\n&e\u4f60\u53ef\u4ee5\u66f4\u6709\u6548\u5730\u64ca\u6bba\u53ef\u60e1\u7684\u602a\u7269\u5011!\n&e\u800c\u4e14\u53ef\u4ee5\u5728\u63ee\u64ca\u6642\u70b8\u98db\u6216\u767c\u51fa\u81f4\u547d\u7684\u66b4\u64ca\n&e\u4ee5\u91cd\u5275 \u5c0d\u624b.\n&e\u4f60\u7684\u65a7\u982d\u4e5f\u53ef\u4ee5\u6210\u70ba\u4e00\u53f0\u524a\u6728\u6a5f,\n&e\u91cd\u5275\u5c0d\u624b\u7684\u88dd\u7532,\u96a8\u8457\u64cd\u65a7\u6280\u80fd\u5347\u9ad8\u800c\n&e\u63d0\u5347\u6548\u679c.\n&3\u5982\u4f55\u7372\u53d6\u7d93\u9a57:\n&e\u8981\u7372\u53d6\u7d93\u9a57\u4f60\u5fc5\u9808\u7528\u65a7\u982d\u653b\u64ca\u73a9\u5bb6\u6216\u602a\u7269 -Guides.Axes.Section.1=&3\u4ec0\u9ebc\u662f\u5288\u9871\u65ac?\n&e\u9019\u662f\u4e00\u500b\u4e3b\u52d5\u6280\u80fd(\u7bc4\u570d\u6280).\n&e\u9031\u906d\u88ab\u6ce2\u53ca\u7684\u50b7\u5bb3\u70ba\u4e3b\u8981\u76ee\u6a19\u7684\u4e00\u534a\n&e\u662f\u7528\u4f86\u6e05\u9664\u4e00\u5768\u602a\u7269\u7684\u5fc5\u5099\u7d55\u62db. -Guides.Axes.Section.2=&3\u4ec0\u9ebc\u662f\u6703\u5fc3\u4e00\u64ca?\n&e\u6703\u5fc3\u4e00\u64ca\u662f\u4e00\u500b\u53ef\u4ee5\u9020\u6210\u52a0\u4e58\u50b7\u5bb3\u7684\u88ab\u52d5\u6280\u80fd.\n&e\u9810\u8a2d\u65a7\u6280\u6bcf\u5347\u5169\u7b49,\u53ef\u589e\u52a00.1%\u66b4\u64ca\u7387\n&e\u5c0d\u602a\u7269\u67092\u500d\u653b\u64ca\u529b\u5c0d\u73a9\u5bb6\u67091.5\u500d. -Guides.Axes.Section.3=&3\u4ec0\u9ebc\u662f\u65a7\u982d\u7cbe\u901a?\n&e\u65a7\u982d\u7cbe\u901a\u53ef\u4ee5\u52a0\u4e58\u65a7\u982d\u7684\u57fa\u672c\u653b\u64ca \u529b\n&e\u9810\u8a2d\u4e2d\u6bcf50\u7b49\u589e\u52a01\u9ede\u50b7\u5bb3(\u534a\u5fc3)\n&e200\u7b49\u9054\u5230\u6975\u96504\u9ede\u50b7\u5bb3. -Guides.Axes.Section.4=&3\u4ec0\u9ebc\u662f\u9632\u5177\u7834\u58de\u8005?\n&e\u66b4\u529b\u7684\u6253\u64ca\u4f7f\u9632\u5177\u7c89\u788e!\n&e\u9632\u5177\u7834\u58de\u8005\u6709\u88ab\u52d5\u6a5f\u7387\u9020\u6210\u5c0d\u624b\u9632\u5177\u88ab\u7834\u58de!\n&e\u7834\u58de\u7a0b\u5ea6\u95dc\u4fc2\u5230\u4f60\u7684\u65a7\u982d\u6280\u80fd\u7b49\u7d1a. -Guides.Axes.Section.5=&3\u4ec0\u9ebc\u662f\u5f37\u529b\u653b\u64ca?\n&e\u5728\u653b\u64ca\u73a9\u5bb6\u6216\u602a\u7269\u6642\u6709\u88ab\u52d5\u6a5f\u7387\u70b8\u98db\u5c0d\u624b\n&e\u9810\u8a2d\u6a5f\u7387\u70ba25%. \u70b8\u98db\u6548\u679c\u76f8\u7576\u65bc\u64ca\u9000II\u7684\u9644\u9b54\n&e\u5916\u52a0\u5c0d\u76ee\u6a19\u7684\u52a0\u4e58\u653b\u64ca. -Guides.Excavation.Section.0=&3\u95dc\u65bc\u6316\u6398:\n&e\u6316\u6398\u662f\u4e00\u500b\u95dc\u65bc\u6316\u571f\u8207\u6316\u5bf6\u7684\u6280\u80fd.\n&e\u6316\u6398\u5730\u9762\u53ef\u4ee5\u627e\u5230\u5bf6\u7269.\n&e\u6316\u6108\u591a\u5bf6\u7269\u6108\u591a.\n\n&3\u7372\u53d6\u7d93\u9a57:\n&e\u8981\u7372\u53d6\u7d93\u9a57\u5fc5\u9808\u6301 \u6709\u93df\u5b50.\n&e\u53ea\u6709\u7279\u5b9a\u7269\u8cea\u624d\u80fd\u6316\u5230\u5bf6\u7269\u6216\u7d93\u9a57. -Guides.Excavation.Section.1=&3\u76f8\u5bb9\u7684\u7269\u8cea:\n&e\u8349\u76ae, \u571f, \u6c99, \u9ecf\u571f, \u792b\u77f3, \u83cc\u7d72\u9ad4, \u9748\u9b42\u6c99 -Guides.Excavation.Section.2=&3\u5982\u4f55\u7528\u66b4\u8d70\u947d\u982d:\n&e\u624b\u6301\u93df\u5b50\u4e26\u9ede\u53f3\u9375.\n&e\u9032\u5165\u6b64\u72c0\u614b\u7d04\u80fd\u7dad\u63014\u79d2\n&e\u4e00\u65e6\u63a5\u89f8\u5230\u76f8\u5bb9\u7684\u7269\u8cea\u4fbf\u80fd\n&e\u89f8\u767c\u66b4\u8d70\u947d\u982d. -Guides.Excavation.Section.3=&3\u4ec0\u9ebc\u662f\u66b4\u8d70\u947d\u982d?\n&e\u66b4\u8d70\u947d\u982d\u662f\u4e3b\u52d5\u6280\u80fd,\u6301\u7e8c\u6642\u9593\u95dc\u4fc2\u5230\n&e\u6316\u6398\u6280\u80fd\u7b49\u7d1a,\u5b83\u53ef \u4ee5\u8b93\u4f60\u6709\u6a5f\u7387\u7372\u5f97\u5bf6\u7269\n&e\u9084\u6709\u76f4\u63a5\u6467\u6bc0\u6307\u5b9a\u65b9\u584a. -Guides.Excavation.Section.4=&3\u4ec0\u9ebc\u662f\u5bf6\u7269\u7375\u4eba?\n&e\u6240\u6709\u5bf6\u7269\u90fd\u6709\u81ea\u5df1\u7684\u6700\u4f4e\u6389\u843d\u7b49\u7d1a\n&e\u6240\u4ee5\u5bf6\u7269\u5c0d\u4f60\u4e0d\u898b\u5f97\u6709\u7528.\n&e\u53ea\u9700\u8981 \u8a18\u5f97\u6108\u6316\u6398\u7b49\u7d1a\u6108\u9ad8,\n&e\u5c31\u80fd\u6316\u9053\u6108\u591a\u5bf6.\n&e\u9084\u6709\u6bcf\u4e00\u7a2e\u4e0d\u540c\u7684\u6750\u8cea,\n&e\u53ef\u80fd\u6389\u51fa\u4f86\u7684\u5bf6\u7269\u90fd\u4e0d\u540c.\n&e\u63db\u53e5\u8a71\u8aaa\u4f60\u80fd\u5f9e\u571f\u88e1\u6316\u51fa\u6bd4\u792b\u77f3\n&e\u66f4\u591a\u7a2e\u985e\u7684\u5bf6\u7269. -Guides.Excavation.Section.5=&3\u6316\u6398\u7684\u6ce8\u610f\u4e8b\u9805:\n&e\u6316\u6398\u7684\u6389\u843d\u7269\u662f\u53ef\u96a8\u610f\u8abf\u6574\u7684,\n&e\u4e0d\u540c\u4f3a\u670d\u5668\u5c07\u6709\u6240\u5dee\u7570. -Guides.Fishing.Section.0=&3\u95dc\u65bc\u91e3\u9b5a:\n&e\u6709\u4e86\u91e3\u9b5a\u6280\u80fd,\u91e3\u9b5a\u66f4\u6709\u8da3\u4e86!\n&e\u53ef\u4ee5\u6389\u5bf6\u7269,\u5f9e\u602a\u7269\u8eab\u4e0a\u76dc\u5bf6.\n\n&3\u7372\u53d6\u7d93\u9a57:\n&e\u6293\u5230\u9b5a. -Guides.Fishing.Section.1=&3\u4ec0\u9ebc\u662f\u5bf6\u7269\u7375\u4eba?\n&e\u9019\u500b\u6280\u80fd\u8b93\u4f60\u5728\u91e3\u9b5a\u6642\u91e3\u5230\u5bf6\u7269\n&e\u6709\u5c0f\u6a5f\u7387\u91e3\u5230\u9644\u9b54\u9053\u5177.\n&e\u6bcf\u7a2e\u5bf6\u7269\u7684\u51fa\u73fe\u95dc\u4fc2\u5230\n&e\u4f60\u7684\u91e3\u9b5a\u7b49\u7d1a. \u91e3\u9b5a\u7b49\u7d1a\u6108\u9ad8,\n&e\u5c31\u80fd\u91e3\u5230\u6108\u591a\u6108\u597d\u7684\u5bf6\u7269. -Guides.Fishing.Section.2=&3\u4ec0\u9ebc\u662f\u51b0\u91e3?\n&e\u9019\u500b\u88ab\u52d5\u6280\u80fd\u8b93\u4f60\u5728\u51b0\u6e56\u4e0a\u6355\u9b5a!\n&e\u5728\u51b0\u6e56\u4e0a\u7529\u52d5\u4f60\u7684\u91e3\u7aff\n&e\u5c07\u6703\u5728\u51b0\u4e0a\u88fd\u9020\u51fa\u53ef\u4f9b\u91e3\u9b5a\u7684\u5c0f\u6d1e. -Guides.Fishing.Section.3=&3\u4ec0\u9ebc\u662f\u5782\u91e3\u5927\u5e2b?\n&e\u9019\u500b\u88ab\u52d5\u6280\u80fd\u5c07\u589e\u52a0\u4e0a\u9264\u7684\u6a5f\u7387.\n&e\u7576\u4f60\u7372\u5f97\u9019\u500b\u80fd\u529b, \u5728\u8239\u4e0a\u6216\u6d77\u6d0b\u751f\u614b\n&e\u91e3\u9b5a\u5c07\u6703\u7372\u5f97\u96d9\u500d\u4e0a\u9264\u6a5f\u7387. -Guides.Fishing.Section.4=&3\u4ec0\u9ebc\u662f\u6416\u6643?\n&e\u9019\u500b\u6280\u80fd\u8b93\u4f60\u53ef\u4ee5\u5f9e\u602a\u7269\u8eab\u4e0a\u626f\u4e0b\u5bf6\u7269.\n&e\u53ea\u8981\u4f7f\u7528\u91e3\u7aff\u91e3\u602a\u7269,\n&e\u80fd\u91e3\u51fa\u602a\u7269\u6b7b\u4ea1\u6642\u6703\u6389\u7684\u5bf6\u7269.\n&e\u9019\u6280\u80fd\u751a\u81f3\u80fd\u91e3\u51fa\u8eab\u5b58\u6a21\u5f0f\u7121\u6cd5\u7372\u5f97\u7684\n&e\u602a\u7269\u982d\u9871. -Guides.Fishing.Section.5=&3\u4ec0\u9ebc\u662f\u6f01\u4eba\u4fbf\u7576?\n&e\u9019\u662f\u4e00\u500b\u88ab\u52d5\u6280\u80fd\u8b93\u4f60\u80fd\u5728\u5403\u9b5a\u6642\u6709\n&e\u66f4\u591a\u7684\u98fd\u98df\u5ea6. -Guides.Fishing.Section.6=&3\u91e3\u9b5a\u7684\u6ce8\u610f\u4e8b\u9805:\n&e\u6389\u843d\u8a2d\u5b9a\u662f\u53ef\u8abf\u6574\u7684,\n&e\u5404\u4f3a\u670d\u5668\u53ef\u80fd\u6709\u6240\u4e0d\u540c. -Guides.Herbalism.Section.0=&3\u95dc\u65bc\u8349\u85e5\u5b78:\n&e\u8349\u85e5\u5b78\u662f\u95dc\u65bc\u63a1\u6536\u8349\u85e5\u8207\u690d\u7269\u7684\u6280\u80fd.\n\n&3\u7372\u53d6\u7d93\u9a57:\n&e\u63a1\u6536\u8349\u85e5\u6216\u690d\u7269. -Guides.Herbalism.Section.1=&3\u53ef\u4f5c\u7528\u7684\u8349\u85e5/\u690d\u7269\n&e\u5c0f\u9ea5, \u99ac\u9234\u85af, \u80e1\u863f\u8514, \u897f\u74dc, \n&e\u5357\u74dc, \u7518\u8517, \u53ef\u53ef\u8c46, \u82b1, \u4ed9\u4eba\u638c, \u9999\u83c7,\n&e\u5730\u7344\u7599\u7629, \u84ee\u8449, \u8207\u85e4. -Guides.Herbalism.Section.2=&3\u4ec0\u9ebc\u662f\u7da0\u5316?\n&e\u7da0\u5316\u662f\u4e00\u500b\u4e3b\u52d5\u6280\u80fd, \u7576\u4f60\u624b\u6301\u92e4\u982d\u6642\n&e\u9ede\u64ca\u53f3\u9375\u53ef\u767c\u52d5\u6280\u80fd. \u7da0\u5316\u63d0\u9ad8\u4e09\u88ab\u6536\u7a6b\u7684\u6a5f\u7387. \n&e\u540c\u6642\u4e5f\u8b93\u73a9\u5bb6\u6709\u80fd\u529b\u4f7f\u7528\u8eab\u4e0a\u7684\u7a2e\u5b50\u4f86\u8f49\u5316\n&e\u65b9\u584a\u4e26\u8ce6\u4e88\u751f\u547d. -Guides.Herbalism.Section.3=&3\u4ec0\u9ebc\u662f\u7da0\u624b\u6307(\u4f5c\u7269)?\n&e\u9019\u662f\u4e00\u500b\u88ab\u52d5\u6280\u80fd,\u8b93\u4f5c\u7269\u5728\u63a1\u6536\u6642\n&e\u81ea\u52d5\u7a2e\u56de\u53bb.\n&e\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&e\u9019\u662f\u4e00\u500b\u4e3b\u52d5\u6280\u80fd,\u8b93\u4f60\u5728\u624b\u62ff\u8457\u7a2e\u5b50\u6642,\n&e\u5c0d\u5375\u77f3/\u77f3\u78da/\u571f,\u9ede\u64ca\u53f3\u9375,\u53ef\u4f7f\u5b83\u5011\u8b8a\u6210\n&e\u690d\u7269\u5f62\u614b,\u6703\u6d88\u8017\u4e00\u9846\u7a2e\u5b50. -Guides.Herbalism.Section.5=&3\u4ec0\u9ebc\u662f\u8fb2\u592b\u79c1\u623f\u83dc?\n&e\u9019\u662f\u4e00\u500b\u88ab\u52d5\u6280\u80fd, \u53ef\u589e\u52a0\u4e0b\u5217\u98df\u7269\u7684\u98fd\u98df\u5ea6\u56de\u5fa9 -\n&e\u9eb5\u5305, \u9905\u4e7e, \u897f\u74dc, \u8611\u83c7\u6e6f, \u80e1\u863f\u8514, \u99ac\u9234\u85af. -Guides.Herbalism.Section.6=&3\u4ec0\u9ebc\u662f\u6d77\u502b\u7684\u795d\u798f?\n&e\u9019\u662f\u4e00\u500b\u4e3b\u52d5\u6280\u80fd,\u6709\u6a5f\u7387\u5728\u7528\u528d\u7834\u58de\u7279\u5b9a\n&e\u65b9\u584a\u6642\u7372\u5f97\u7a00\u6709\u9053\u5177. -Guides.Herbalism.Section.7=&3\u4ec0\u9ebc\u662f\u96d9\u500d\u6389\u843d?\n&e\u9019\u662f\u4e00\u500b\u88ab\u52d5\u6280\u80fd\u4f7f\u73a9\u5bb6\u80fd\u52a0\u500d\u6536\u7372. -Guides.Mining.Section.0=&3\u95dc\u65bc\u6316\u7926:\n&e\u6316\u7926\u7531\u63a1\u77f3\u8207\u63a1\u7926\u6240\u7d44\u6210. \u5b83\u63d0\u4f9b\u6316\u7926\u6642\n&e\u7684\u984d\u5916\u7926\u7269\u6389\u843d\u91cf.\n\n&3\u5982\u4f55\u7372\u53d6\u7d93\u9a57:\n&e\u8981\u589e\u9032\u6316\u7926\u6280\u80fd,\u4f60\u5fc5\u9808\u7528\u93ac\u5b50\u6316\u7926.\n&e\u53ea\u6709\u6316\u6398\u6307\u5b9a\u7926\u7269\u80fd\u589e\u52a0\u7d93\u9a57. -Guides.Mining.Section.1=&3\u76f8\u5bb9\u7684\u7926\u7269:\n&e\u77f3\u982d, \u70ad\u7926\u8108, \u9435\u7926\u8108, \u91d1\u7926\u8108, \u947d\u77f3\u7926\u8108, \u7d05\u77f3\u7926\u8108,\n&e\u9752\u91d1\u77f3\u7926\u8108, \u9ed1\u66dc\u77f3, \u9752\u82d4\u77f3, \u7d42\u754c\u77f3,\n&e\u87a2\u5149\u77f3, \u9084\u6709\u5730\u7344\u77f3. -Guides.Mining.Section.2=&3\u5982\u4f55\u4f7f\u7528\u8d85\u7d1a\u788e\u77f3\u6a5f:\n&e\u624b\u62ff\u8457\u93ac\u5b50\u9ede\u6ed1\u9f20\u53f3\u9375\u4ee5\u6e96\u5099\u597d\u958b\u555f\u6280\u80fd.\n&e\u4e00\u65e6\u958b\u555f\u6280\u80fd\u5c07\u6709\u6578\u79d2\u7684\u6642\u9593\u53ef\u4ee5\u8b93\u4f60\n&e\u5feb\u901f\u7834\u58de\u6307\u5b9a\u7926\u7269,\u53ea\u6709\u76f8\u5bb9\u7684\u7926\u7269\u53ef\u4ee5\n&e\u89f8\u767c\u6280\u80fd. -Guides.Mining.Section.3=&3\u4ec0\u9ebc\u662f\u8d85\u7d1a\u788e\u77f3\u6a5f?\n&e\u8d85\u7d1a\u788e\u77f3\u6a5f\u662f\u4e00\u500b\u9700\u8981\u51b7\u537b\u6642\u9593\u7684\u6316\u7926\u6280\u80fd.\n&e\u5b83\u80fd\u4f7f\u4f60\u5728\u6316\u6389\u5c0d\u61c9\u7926\u77f3\u7684\u6642\u5019\u589e\u52a03\u500d\u6389\u843d\u6a5f\u7387.\n&e\u4e26\u4e14\u5728\u6280\u80fd\u6642\u9593\u5167\u77ac\u9593\u7834\u58de\u77f3\u982d\u548c\u7926\u77f3. -Guides.Mining.Section.4=&3\u5982\u4f55\u4f7f\u7528\u7206\u7834\u6316\u6398:\n&e\u624b\u6301\u6253\u706b\u77f3, \u9810\u8a2d\u7531\u71e7\u77f3\u53ca\u9435\u9320\u7d44\u6210,\n&e\u8e72\u4e0b\u4e26\u7528\u53f3\u9375\u9ede\u53caTNT. \u9019\u6703\u4f7fTNT\n&e\u76f4\u63a5\u7206\u70b8, \u6700\u597d\u7ad9\u9060\u4e00\u9ede. -Guides.Mining.Section.5=&3\u4ec0\u9ebc\u662f\u7206\u7834\u6316\u6398?\n&e\u7206\u7834\u6316\u6398\u662f\u4e00\u500b\u4e3b\u52d5\u6280\u80fd, \u51b7\u537b\u6642\u9593\u95dc\u4fc2\u5230\u4f60\u7684\u6316\u7926\n&e\u6280\u80fd\u7b49\u7d1a. \u5b83\u53ef\u4ee5\u8b93\u4f60\u5728\u4f7f\u7528TNT\u6316\u7926\u77f3\u6709\u66f4\u591a\u798f\u5229\n&e\u4e14\u53ef\u4ee5\u9059\u63a7\u5f15\u7206TNT. \u7206\u7834\u6316\u6398\u5206\u6210\u4e09\u90e8\u5206.\n&e\u7b2c\u4e00\u90e8\u5206\u7a31\u70ba\u5de8\u5927\u7206\u7834, \u53ef \u4ee5\u64f4\u5927\u4f60\u7684\u7206\u7834\u7bc4\u570d.\n&e\u7b2c\u4e8c\u90e8\u5206\u7a31\u70ba\u7206\u7834\u5c08\u5bb6, \u53ef\u4ee5\u6e1b\u514dTNT\u5c0d\u4f60\u7684\u50b7\u5bb3\n&e\u7b2c\u4e09\u90e8\u5206\u7a31\u70ba\u7cbe\u6e96\u7206\u7834, \u589e\u52a0\u6389\u843d\u7269\u6578\u91cf, \u6e1b\u5c11\u5783\u573e\u6389\n&e\u843d\u7269\u6578\u91cf, \u5f88\u68d2\u5427. -Guides.Repair.Section.0=&3\u4fee\u5fa9:\n&e\u4fee\u5fa9\u6280\u80fd\u8b93\u4f60\u53ef\u4ee5\u4f7f\u7528\u9435\u78da(MMO\u9435\u7827)\n&e\u4fee\u5fa9\u5de5\u5177,\u6216\u4f7f\u7528\u91d1\u78da\u56de\u6536\u5de5\u5177.\n\n&3\u7d93\u9a57\u7372\u53d6:\n&e\u7528MMO\u9435\u7827\u4fee\u5fa9\u5de5\u5177.\n&e\u9810\u8a2d\u662f\u9435\u78da,\u4e0d\u8981\u548c\u4e00\u822c\u7684\u9435\u7827\u641e\u6df7. -Guides.Repair.Section.1=&3\u5982\u4f55\u4fee\u5fa9?\n&e\u624b\u6301\u8981\u4fee\u5fa9\u7684\u5de5\u5177\u5c0d\u9435\u78da\u9ede\u64ca\u53f3\u9375\n&e\u6703\u6d88\u80171\u500b\u4e3b\u539f\u6599. -Guides.Repair.Section.2=&3\u4ec0\u9ebc\u662f\u4fee\u7406\u7cbe\u901a?\n&e\u55ae\u6b21\u4fee\u5fa9\u7684\u8010\u4e45\u5ea6\u52a0\u4e58.\n&e\u9019\u95dc\u4fc2\u5230\u4f60\u7684\u4fee\u5fa9\u7b49\u7d1a. -Guides.Repair.Section.3=&3\u4ec0\u9ebc\u662f\u8d85\u7d1a\u4fee\u7406?\n&e\u8d85\u7d1a\u4fee\u7406\u662f\u88ab\u52d5\u6280\u80fd. \u7576\u4fee\u7406\u4e00\u500b\u7269\u54c1\u6642,\n&e\u73a9\u5bb6\u6709\u6a5f\u7387\u4fee\u5fa9\u5169\u500d\u8010\u4e45\u5ea6. -Guides.Repair.Section.4=&3\u4ec0\u9ebc\u662f\u79d8\u6cd5\u935b\u9020?\n&e\u79d8\u6cd5\u935b\u9020\u8b93\u4f60\u6709\u6a5f\u7387\u7559\u4f4f\u5de5\u5177\u7684\u9644\u9b54.\n&e\u9644\u9b54\u53ef\u80fd\u5728\u4fee\u5fa9\u6642\u964d\u7d1a\u6216\u6d88\u5931. -Guides.Repair.Section.5=&3\u4ec0\u9ebc\u662f\u56de\u6536?\n&e\u5c07\u624b\u4e2d\u7684\u7269\u54c1\u5c0dmcMMO\u56de\u6536\u7827(\u9810\u8a2d\u91d1\u78da)\n&e\u9ede\u64ca\u53f3\u9375. \u6703\u5c07\u7269\u54c1\u62c6\u89e3\u56de\u6240\u4f7f\u7528\u7684\u539f\u6599.\n&e\u6ce8\u610f: \u4f60\u53ea\u80fd\u56de\u6536\u7121\u8017\u640d\u7684\u5de5\u5177\u6216\u88dd\u5099 -Guides.Swords.Section.0=&3\u528d\u8853:\n&e\u528d\u8853\u8b93\u73a9\u5bb6\u5728\u4f7f\u7528\u528d\u6230\u9b25\u6642\u7372\u5f97\u5404\u7a2e\u52a0\u4e58\u6548\u679c.\n\n&3\u5982\u4f55\u7372\u53d6\u7d93\u9a57:\n&e\u8981\u7372\u53d6\u7d93\u9a57\u4f60\u5fc5\u9808\u7528\u528d\u653b\u64ca\u73a9\u5bb6\u6216\u602a\u7269. -Guides.Swords.Section.1=&3\u4ec0\u9ebc\u662f\u5272\u88c2\u65ac?\n&e\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&e\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&e\u4e26\u4e14\u9644\u5e36\u81f3\u5c115\u500bticks\u7684\u653e\u8840\u6548\u679c. -Guides.Swords.Section.2=&3\u4ec0\u9ebc\u662f\u53cd\u64ca?\n&e\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&e50%\u6240\u53d7\u5230\u7684\u50b7\u5bb3. -Guides.Swords.Section.3=&3\u4ec0\u9ebc\u662f\u653e\u8840?\n&e\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&e\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=&3\u99b4\u7378\n&e\u99b4\u7378\u6280\u80fd\u8b93\u73a9\u5bb6\u80fd\u5728\u7528\u72fc\u6230\u9b25\u6642\n&e\u6642\u6709\u52a0\u4e58\u6548\u679c.\n\n&3\u7d93\u9a57\u7372\u53d6:\n&e\u8981\u7372\u53d6\u7d93\u9a57,\u9808\u8a13\u670d\u72fc\u6216\u8c79\u8c93,\n&e\u6216\u8207\u4f60\u7684\u72fc\u4e00\u540c\u6230\u9b25. -Guides.Taming.Section.1=&3\u4ec0\u9ebc\u662f\u91ce\u6027\u547c\u558a?\n&e\u91ce\u6027\u547c\u558a\u662f\u4e00\u500b\u4e3b\u52d5\u6280\u80fd\u8b93\u4f60\n&e\u53ef\u4ee5\u53ec\u559a\u4e00\u96bb\u72fc\u6216\u8c79\u8c93,\n&e\u53ea\u8981\u624b\u630110\u8ddf\u9aa8\u982d\u6216\u751f\u9b5a,\u9ede\u5de6\u9375. -Guides.Taming.Section.2=&3\u4ec0\u9ebc\u662f\u99b4\u7378\u4e4b\u80fd?\n&e\u99b4\u7378\u4e4b\u80fd\u8b93\u4f60\u5bdf\u89ba\u5bf5\u7269\u7684\u72c0\u614b,\n&e\u5c0d\u5bf5\u7269\u9ede\u64ca\u5de6\u9375\u5c31\u80fd\u4f7f\u7528\u9019\u9805\u80fd\u529b. -Guides.Taming.Section.3=&3\u4ec0\u9ebc\u662f\u8840\u8165\u653b\u64ca?\n&e\u8840\u8165\u653b\u64ca\u662f\u4e00\u500b\u4e3b\u52d5\u6280\u80fd,\u80fd\u9020\u6210\n&e\u72fc\u7684\u653b\u64ca\u76ee\u6a19\u6709\u6a5f\u7387\u9677\u5165\u6d41\u8840\u72c0\u614b. -Guides.Taming.Section.4=&3\u4ec0\u9ebc\u662f\u5229\u722a?\n&e\u5229\u722a\u4f7f\u72fc\u7684\u653b\u64ca\u529b\u96a8\u8457\u99b4\u7378\u7b49\u7d1a\n&e\u589e\u52a0\u800c\u589e\u52a0. -Guides.Taming.Section.5=&3\u4ec0\u9ebc\u662f\u5371\u6a5f\u610f\u8b58?\n&e\u9019\u500b\u88ab\u52d5\u6280\u80fd\u80fd\u8b93\u72fc\u5728\u9047\u5230\u5371\u96aa\u6642\n&e\u8fc5\u901f\u56de\u5230\u4f60\u8eab\u908a(\u5982\u4ed9\u4eba\u638c\u6216\u5ca9\u6f3f),\n&e\u4e5f\u53ef\u4ee5\u6e1b\u514d\u6454\u843d\u50b7\u5bb3. -Guides.Taming.Section.6=&3\u4ec0\u9ebc\u662f\u6bdb\u76ae\u5f37\u5316?\n&e\u9019\u662f\u4e00\u500b\u88ab\u52d5\u6280\u80fd\u80fd\u8b93\u72fc\n&e\u53d7\u5230\u653b\u64ca\u6216\u71c3\u71d2\u6642\u6e1b\u514d\u50b7\u5bb3. -Guides.Taming.Section.7=&3\u4ec0\u9ebc\u662f\u885d\u64ca\u683c\u64cb?\n&e\u9019\u662f\u4e00\u500b\u88ab\u52d5\u6280\u80fd,\u8b93\u72fc\u7fa4\n&e\u6e1b\u514d\u7206\u70b8\u50b7\u5bb3. -Guides.Taming.Section.8=&3\u4ec0\u9ebc\u662f\u5feb\u9910\u670d\u52d9?\n&e\u9019\u662f\u4e00\u500b\u88ab\u52d5\u6280\u80fd,\u8b93\u72fc\u7fa4\u5728\u653b\u64ca\u6642\n&e\u6709\u6a5f\u7387\u56de\u5fa9\u8840\u91cf. -Guides.Unarmed.Section.0=&3\u640f\u64ca:\n&e\u640f\u64ca\u8b93\u73a9\u5bb6\u5728\u4f7f\u7528\u62f3\u982d\u4f5c\u6230\u6642\u6709\n&e\u5404\u7a2e\u52a0\u4e58\u6548\u679c.\n\n&3\u7d93\u9a57\u7372\u53d6:\n&e\u5728\u7528\u624b\u653b\u64ca\u602a\u7269\u6216\u73a9\u5bb6\u6642\u53ef\u4ee5\u7372\u53d6\u7d93\u9a57. -Guides.Unarmed.Section.1=&3\u4ec0\u9ebc\u662f\u72c2\u66b4?\n&e\u72c2\u66b4\u662f\u4e3b\u52d5\u6280\u80fd,\u7a7a\u624b\u6642\u9ede\u64ca\u53f3\u9375\u767c\u52d5.\n&e\u72c2\u66b4\u53ef\u4ee5\u52a0\u4e5850%\u5c0d\u65b9\u584a\u7684\u50b7\u5bb3,\n&e\u4f7f\u4f60\u53ef\u4ee5\u8f15\u9b06\u7834\u58de\u8106\u5f31\u7269\u9ad4,\n&e\u5982\u571f\u8207\u7802. -Guides.Unarmed.Section.2=&3\u4ec0\u9ebc\u662f\u9435\u81c2?\n&e\u9435\u81c2\u80fd\u589e\u52a0\u5f92\u624b\u653b\u64ca\u602a\u7269\u6216\n&e\u73a9\u5bb6\u7684\u5a01\u529b. -Guides.Unarmed.Section.3=&3\u4ec0\u9ebc\u662f\u64ca\u843d\u5f13\u7bad?\n&e\u64ca\u843d\u5f13\u7bad\u662f\u4e00\u500b\u88ab\u52d5\u6280\u80fd,\u8b93\u4f60\u6709\u6a5f\u7387\n&e\u80fd\u64ca\u843d\u9ab7\u9acf\u7372\u73a9\u5bb6\u5c04\u5411\u4f60\u7684\u7bad.\n&e\u7bad\u6703\u88ab\u64ca\u843d\u81f3\u5730\u9762. -Guides.Unarmed.Section.4=&3\u4ec0\u9ebc\u662f\u9435\u722a?\n&e\u9435\u722a\u53ef\u4ee5\u6709\u6a5f\u7387\u4f7f\u64ca\u843d\u6b66\u5668\u7121\u6548\u5316.\n&e\u6a5f\u7387\u95dc\u4fc2\u5230\u640f\u64ca\u6280\u80fd\u7b49\u7d1a. -Guides.Unarmed.Section.5=&3\u4ec0\u9ebc\u662f\u64ca\u843d\u6b66\u5668?\n&e\u9019\u500b\u88ab\u52d5\u6280\u80fd\u8b93\u73a9\u5bb6\u89e3\u9664\u5176\u4ed6\u73a9\u5bb6\u7684\u6b66\u88dd,\n&e\u4f7f\u76ee\u6a19\u6240\u88dd\u5099\u7684\u7269\u54c1\u6389\u843d\u5230\u5730\u4e0a. -Guides.Woodcutting.Section.0=&3\u95dc\u65bc\u4f10\u6728:\n&e \u4f10\u6728\u5c31\u662f\u628a\u6a39\u780d\u5012.\n\n&3\u7372\u53d6\u7d93\u9a57:\n&e\u7834\u58de\u6a39\u5e79\u53ef\u7372\u53d6\u7d93\u9a57. -Guides.Woodcutting.Section.1=&3\u4ec0\u9ebc\u662f\u4f10\u6728\u5de5?\n&e\u4f10\u6728\u5de5\u662f\u4e3b\u52d5\u6280\u80fd,\u6301\u6709\u65a7\u982d\u6642\u9ede\u53f3\u9375\n&e\u53ef\u4ee5\u767c\u52d5.\u5c07\u5c0e\u81f4\u6574\u68f5\u6a39\u6728\u76f4\u63a5\u7834\u58de,\n&e\u6240\u6709\u679d\u8449\u90fd\u5c07\u6389\u843d. -Guides.Woodcutting.Section.2=&3\u4ec0\u9ebc\u662f\u79cb\u98a8\u6383\u843d\u8449?\n&e\u79cb\u98a8\u6383\u843d\u8449\u662f\u4e00\u500b\u88ab\u52d5\u6280\u80fd,\n&e\u7576\u4f60\u7528\u65a7\u982d\u7834\u58de\u6a39\u8449\u6642,\u6a39\u8449\u5c07\u76f4\u63a5\u6467\u6bc0.\n&e\u9019\u500b\u6280\u80fd\u9810\u8a2d\u5728100\u7b49\u958b\u653e. -Guides.Woodcutting.Section.3=&3\u4ec0\u9ebc\u662f\u96d9\u500d\u6389\u843d?\n&e\u9019\u500b\u88ab\u52d5\u6280\u80fd\u53ef\u4ee5\u8b93\u4f60\u6709\u6a5f\u7387\u5728\u4f10\u6728\n&e\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 &e{0} -Inspect.Stats=&a[mcMMO] \u7684\u7d71\u8a08\u8a0a\u606f &e{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!** +Commands.XPGain.Woodcutting=\u6b63\u5728\u780d\u5012\u6a39\u6728 +Commands.XPGain=&8\u7d93\u9a57\u4f86\u6e90 \uff1a &f{0} +Commands.xplock.locked=&6\u4f60\u7684\u7d93\u9a57\u689d\u9396\u5b9a\u5728 {0} \uff01 +Commands.xplock.unlocked=&6\u4f60\u7684\u7d93\u9a57\u689d\u73fe\u5728 &a\u89e3\u9664\u9396\u5b9a\u4e86&6 \uff01 +Commands.xprate.modified=&c\u7d93\u9a57\u500d\u7387\u5df2\u8a2d\u5b9a\u70ba {0} +Commands.xprate.over=&cmcMMO \u9ad8\u7d93\u9a57\u4e8b\u4ef6\u7d50\u675f \uff01\uff01 +Commands.xprate.proper.0=&c\u60f3\u4fee\u6539\u7d93\u9a57\u4f86\u6e90\u7387\u8acb\u8f38\u5165 /xprate +Commands.xprate.proper.1=&c\u60f3\u628a\u7d93\u9a57\u7372\u5f97\u7387\u8abf\u6574\u70ba\u9810\u8a2d\u8acb\u8f38\u5165 /xprate reset +Commands.xprate.proper.2=&c\u8acb\u6307\u5b9a true \u6216 false \u4f86\u8868\u660e\u9019\u662f\u5426\u662f\u7d93\u9a57\u4e8b\u4ef6 +Commands.NegativeNumberWarn=\u4e0d\u8981\u4f7f\u7528\u8ca0\u6578 \uff01 +Commands.Event.Start=&amcMMO &6\u4e8b\u4ef6 \uff01 +Commands.Event.Stop=&amcMMO &3\u4e8b\u4ef6\u7d50\u675f \uff01 +Commands.Event.Stop.Subtitle=&a\u5e0c\u671b\u4f60\u73a9\u7684\u958b\u5fc3 \uff01 +Commands.Event.XP=&3\u591a\u500d\u7d93\u9a57\u901f\u7387\u70ba &6{0}&3 \u500d +Commands.xprate.started.0=&6mcMMO \u7d93\u9a57\u4e8b\u4ef6\u5df2\u958b\u59cb \uff01 +Commands.xprate.started.1=&6mcMMO \u7d93\u9a57\u7372\u5f97\u7387\u73fe\u5728\u70ba {0} \u500d \uff01 + +# Admin Notifications +Server.ConsoleName=&e[Server] +Notifications.Admin.XPRate.Start.Self=&7\u4f60\u5df2\u5c07\u5168\u5c40\u591a\u500d\u7d93\u9a57\u8a2d\u5b9a\u70ba &6{0} \u500d +Notifications.Admin.XPRate.End.Self=&7\u4f60\u7d50\u675f\u4e86\u591a\u500d\u7d93\u9a57\u4e8b\u4ef6\u3002 +Notifications.Admin.XPRate.End.Others={0} &7\u7d50\u675f\u4e86\u591a\u500d\u7d93\u9a57\u4e8b\u4ef6 +Notifications.Admin.XPRate.Start.Others={0} &7\u5df2\u555f\u52d5\u6216\u4fee\u6539\u5177\u6709\u5168\u5c40 {1} \u500d\u7684\u591a\u500d\u7d93\u9a57\u4e8b\u4ef6 +Notifications.Admin.Format.Others=&6\uff08&amcMMO &3\u7ba1\u7406\u54e1&6\uff09 &7{0} +Notifications.Admin.Format.Self=&6\uff08&amcMMO&6\uff09 &7{0} + +# Event +XPRate.Event=&6mcMMO \u73fe\u5728\u6b63\u8655\u65bc\u591a\u500d\u7d93\u9a57\u4e8b\u4ef6\u968e\u6bb5 \uff01 \u7d93\u9a57\u7372\u5f97\u7387\u70ba {0}\u500d \uff01 + +#GUIDES +Guides.Available=&7{0} \u7684\u56ae\u5c0e - \u8f38\u5165 /{1} ? [\u9801\u6578] +Guides.Header=&6-=&a{0} \u56ae\u5c0e&6=- +Guides.Page.Invalid=\u4e0d\u662f\u6709\u6548\u7684\u9801\u6578 \uff01 +Guides.Page.OutOfRange=\u90a3\u9801\u4e0d\u5b58\u5728\uff0c\u7e3d\u5171\u53ea\u6709 {0} \u9801 +Guides.Usage= \u7528\u6cd5 /{0} ? [\u9801\u6578] +##Acrobatics +Guides.Acrobatics.Section.0=&3\u95dc\u65bc\u96dc\u6280 \uff1a \n&e\u96dc\u6280\u662f mcMMO \u4e2d\u512a\u96c5\u79fb\u52d5\u7684\u85dd\u8853\u3002\n&e\u5b83\u63d0\u4f9b\u4e86\u6230\u9b25\u52a0\u6210\u548c\u74b0\u5883\u50b7\u5bb3\u52a0\u6210\u3002\n\n&3\u7d93\u9a57\u4f86\u6e90 \uff1a \n&e\u900f\u904e\u5728\u6230\u9b25\u4e2d\u8ff4\u907f\u6216\u8005\u5f9e\u9ad8\u8655\n&e\u6454\u843d\u6642\u53d7\u50b7\u4e26\u5016\u5b58\u4f86\u7372\u5f97\u7d93\u9a57\u3002 +Guides.Acrobatics.Section.1=&3\u7ffb\u6efe\u662f\u5982\u4f55\u904b\u4f5c\u7684 \uff1f \n&e\u7576\u4f60\u53d7\u5230\u6454\u843d\u50b7\u5bb3\u6642\u4f60\u6709\u88ab\u52d5\u6a5f\u6703\u4f86\u514d\u53d7\u50b7\u5bb3\u3002\n&e\u4f60\u53ef\u4ee5\u5728\u6454\u843d\u4e2d\u6309\u4f4f\u8e72\u4e0b\u9375\u4f86\u63d0\u5347\u89f8\u767c\u6a5f\u7387\u3002\n&e\u9019\u5c07\u89f8\u767c\u512a\u96c5\u5730\u7ffb\u6efe\u800c\u4e0d\u662f\u666e\u901a\u7684\u7ffb\u6efe\u3002\n&e\u512a\u96c5\u5730\u7ffb\u6efe\u985e\u4f3c\u666e\u901a\u7684\u7ffb\u6efe\u4f46\u662f\u5b83\u6709\u96d9\u500d\u6a5f\u7387\n&e\u767c\u751f\uff0c\u4e26\u4e14\u80fd\u5920\u63d0\u4f9b\u6bd4\u666e\u901a\u5730\u7ffb\u6efe\u66f4\u9ad8\u7684\u50b7\u5bb3\u6e1b\u5c11\uff0c\n&e\u7ffb\u6efe\u6a5f\u7387\u53d6\u6c7a\u65bc\u4f60\u7684\u6280\u80fd\u7b49\u7d1a\u3002 +Guides.Acrobatics.Section.2=&3\u8ff4\u907f\u662f\u5982\u4f55\u904b\u4f5c\u7684 \uff1f \n&e\u8ff4\u907f\u662f\u88ab\u52d5\u6280\u80fd\n&e\u4ed6\u5728\u4f60\u88ab\u653b\u64ca\u6642\u6709\u4e00\u5b9a\u6a5f\u7387\u88ab\u6fc0\u767c\n&e\u9019\u500b\u6a5f\u7387\u548c\u4f60\u7684\u6280\u80fd\u7b49\u7d1a\u6709\u95dc\u3002 +##Alchemy +Guides.Alchemy.Section.0=&3\u95dc\u65bc\u7149\u91d1\u8853 \uff1a \n&e\u7149\u91d1\u8853\u662f\u85e5\u6c34\u91c0\u9020\u7684\u6280\u80fd\u3002\n&e\u5b83\u63d0\u5347\u4e86\u85e5\u6c34\u91c0\u9020\u6642\u7684\u901f\u5ea6\uff0c\u4e26\u4e14\u52a0\u5165\u4e86\n&e\u65b0\u7684 \uff08\u76f8\u5c0d\u4e4b\u524d\uff09 \u7121\u6cd5\u7372\u5f97\u7684\u85e5\u6c34\u3002\n\n\n&3\u7d93\u9a57\u4f86\u6e90 \uff1a \n&e\u900f\u904e\u91c0\u9020\u85e5\u6c34\u4f86\u7372\u5f97\u7d93\u9a57\u3002 +Guides.Alchemy.Section.1=&3\u50ac\u5316\u662f\u5982\u4f55\u904b\u4f5c\u7684 \uff1f \n&e\u50ac\u5316\u63d0\u5347\u91c0\u9020\u7684\u901f\u5ea6\uff0c\u5728 1000 \u7d1a\n&e\u6642\u80fd\u9054\u5230\u6700\u9ad8 4 \u500d\u3002\n&e\u6b64\u80fd\u529b\u9810\u8a2d\u5728 100 \u7d1a\u89e3\u9396\u3002 +Guides.Alchemy.Section.2=&3\u6df7\u5408\u662f\u5982\u4f55\u904b\u4f5c\u7684 \uff1f \n&e\u6df7\u5408\u5141\u8a31\u4f7f\u7528\u81ea\u8a02\u6750\u6599\u91c0\u9020\u66f4\u591a\u85e5\u6c34\u3002\n&e\u7279\u6b8a\u6750\u6599\u6839\u64da\u4f60\u7684\u7b49\u7d1a\u4f86\u89e3\u9396\u3002\n&e\u7e3d\u5171\u6709 8 \u500b\u7b49\u7d1a\u9700\u8981\u89e3\u9396\u3002 +Guides.Alchemy.Section.3=&3\u6df7\u5408\u7b2c 1 \u968e\u6750\u6599 \uff1a \n&e\u70c8\u7130\u7c89\u3001\u767c\u9175\u8718\u86db\u773c\u3001\u5e7d\u9748\u4e4b\u6dda\u3001\u7d05\u77f3\u3001\n&e\u87a2\u77f3\u7c89\u3001\u7cd6\u3001\u9472\u91d1\u897f\u74dc\u7247\u3001\u91d1\u80e1\u863f\u8514\u3001\n&e\u5ca9\u6f3f\u7403\u3001\u5730\u7344\u7599\u7629\u3001\u8718\u86db\u773c\u3001\u706b\u85e5\u3001\u8377\u8449\u3001\n&e\u6cb3\u8c5a\n&e\uff08\u7d14\u6de8\u85e5\u6c34\uff09\u3002 +Guides.Alchemy.Section.4=&3\u6df7\u5408\u7b2c 2 \u968e\u6750\u6599 \uff1a \n&e\u80e1\u863f\u8514 \uff08\u6316\u6398\u52a0\u901f\u85e5\u6c34\uff09\n&e\u53f2\u840a\u59c6\u7403 \uff08\u7de9\u901f\u85e5\u6c34\uff09\n\n&3\u6df7\u5408\u7b2c 3 \u968e\u6750\u6599 \uff1a \n&e\u5730\u7344\u77f3\u82f1 \uff08\u5438\u6536\u85e5\u6c34\uff09\n&e\u7d05\u8272\u8611\u83c7 \uff08\u8df3\u8e8d\u85e5\u6c34\uff09\u3002 +Guides.Alchemy.Section.5=&3\u6df7\u5408\u7b2c 4 \u968e\u6750\u6599 \uff1a \n&e\u860b\u679c \uff08\u751f\u547d\u52a0\u6210\u85e5\u6c34\uff09\n&e\u8150\u8089\uff08\u98e2\u9913\u85e5\u6c34\uff09\n\n&3\u6df7\u5408\u7b2c 5 \u968e\u6750\u6599 \uff1a \n&e\u68d5\u8272\u8611\u83c7 \uff08\u53cd\u80c3\u85e5\u6c34\uff09\n&e\u58a8\u56ca \uff08\u5931\u660e\u85e5\u6c34\uff09\u3002 +Guides.Alchemy.Section.6=&3\u6df7\u5408\u7b2c 6 \u968e\u6750\u6599 \uff1a \n&e\u8568\u985e \uff08\u98fd\u548c\u85e5\u6c34\uff09\n\n&3\u6df7\u5408\u7b2c 7 \u968e\u6750\u6599 \uff1a \n&e\u6bd2\u99ac\u9234\u85af \uff08\u8150\u721b\u85e5\u6c34\uff09\n\n\u6df7\u5408\u7b2c 8 \u968e\u6750\u6599 \uff1a \n&e\u91d1\u860b\u679c \uff08\u6297\u6027\u63d0\u5347\u85e5\u6c34\uff09\u3002 + +##Archery +Guides.Archery.Section.0=&3\u95dc\u65bc\u7bad\u8853 \uff1a \n&e\u7bad\u8853\u662f\u7528\u5f13\u5c04\u7bad\u3002\n&e\u70ba\u4f60\u63d0\u4f9b\u5404\u7a2e\u6230\u9b25\u52a0\u6210\uff0c\n&e\u4f8b\u5982\u96a8\u8457\u4f60\u7684\u7b49\u7d1a\u63d0\u5347\u50b7\u5bb3\uff0c\u4ee5\u53ca\u5c07\u5c0d\u624b\u64ca\u6688\u7684\u80fd\u529b\n&e\u9664\u6b64\u4e4b\u5916\u4f60\u9084\u80fd\u5f9e\u5c0d\u624b\u7684\u8eab\u4e0a\u56de\u6536\u7bad\u77e2\u3002\n\n\n&3\u7d93\u9a57\u4f86\u6e90 \uff1a \n&e\u8981\u7372\u5f97\u6b64\u50c5\u80fd\u7684\u7d93\u9a57\n&e\u4f60\u9700\u8981\u5c04\u64ca\u602a\u7269\u6216\u5176\u4ed6\u73a9\u5bb6\u3002 +Guides.Archery.Section.1=&3\u6280\u5de7\u5c04\u64ca\u5982\u4f55\u904b\u4f5c \uff1f \n&e\u6280\u5de7\u5c04\u64ca\u6703\u4f7f\u4f60\u7684\u5c04\u7bad\u653b\u64ca\u7372\u5f97\u50b7\u5bb3\u52a0\u6210\u3002\n&e\u6280\u5de7\u5c04\u64ca\u63d0\u4f9b\u7684\u50b7\u5bb3\u52a0\u6210\u6703\u96a8\u8457\n&e\u7bad\u8853\u7b49\u7d1a\u7684\u63d0\u5347\u800c\u589e\u52a0\u3002\n&e\u4f7f\u7528\u9810\u8a2d\u8a2d\u5b9a\u4f60\u7684\u7bad\u8853\u6bcf\u4e94\u5341\u7d1a\u63d0\u9ad8 10% \u7684\u50b7\u5bb3\u52a0\u6210\n&e\u6700\u9ad8\u63d0\u4f9b 200% \u7684\u50b7\u5bb3\u52a0\u6210\u3002 +Guides.Archery.Section.2=&3\u64ca\u6688\u5982\u4f55\u904b\u4f5c \uff1f \n&e\u7576\u4f60\u5c04\u64ca\u73a9\u5bb6\u6642\uff0c\u9019\u500b\u88ab\u52d5\u6709\u6a5f\u7387\u4f7f\u5176\u4ed6\u73a9\u5bb6\u7372\u5f97\u7729\u6688\u3002\n&e\u7576\u64ca\u6688\u89f8\u767c\u6642\u4ed6\u6703\u6642\n&e\u5c0d\u624b\u76f4\u8996\u524d\u65b9\u4e00\u5b9a\u6642\u9593\u3002\n&e\u4e26\u63d0\u4f9b 4 \u9ede \uff082 \u9846\u5fc3\uff09 \u7684\u984d\u5916\u50b7\u5bb3\u3002 +Guides.Archery.Section.3=&3\u7bad\u77e2\u56de\u6536\u5982\u4f55\u904b\u4f5c \uff1f \n&e\u7576\u4f60\u7528\u5f13\u7bad\u64ca\u6bba\u602a\u7269\u6642\n&e\u6709\u6a5f\u7387\u56de\u6536\u7bad\u77e2\u3002\n&e\u9019\u500b\u6a5f\u7387\u96a8\u8457\u4f60\u7bad\u8853\u7b49\u7d1a\u7684\u63d0\u5347\u800c\u589e\u52a0\u3002\n&e\u9810\u8a2d\u60c5\u6cc1\u4e0b\u9019\u500b\u80fd\u529b\u6bcf\u7d1a\u589e\u52a0 0.1%\uff0c\n&e1000 \u7d1a\u589e\u52a0 100%\u3002 +##Axes +Guides.Axes.Section.0=&3\u95dc\u65bc\u65a7\u6280 \uff1a \n&e\u6709\u4e86\u65a7\u6280\uff0c\u65a7\u982d\u4e0d\u518d\u53ea\u662f\u780d\u6a39\u800c\u5df2\u3002\n&e\u4f60\u9084\u53ef\u4ee5\u780d\u5176\u4ed6\u751f\u7269\u548c\u73a9\u5bb6\u4f86\u8cfa\u53d6\u7d93\u9a57\u3002\n&e\u653b\u64ca\u751f\u7269\u6642\u9644\u52a0\u64ca\u9000\u6548\u679c\u3002\n&e\u9084\u6703\u5c0d\u751f\u7269\u548c\u73a9\u5bb6\u9020\u6210\u81f4\u547d\u50b7\u5bb3\u3002\n&e\u4f60\u7684\u65a7\u982d\u6703\u50cf\u624b\u6301\u4f10\u6728\u6a5f\u4e00\u6a23\u3002\n&e\u8f15\u9b06\u524a\u6389\u6575\u4eba\u7684\u76d4\u7532\u3002\n&e\u6548\u679c\u96a8\u8457\u6280\u80fd\u7b49\u7d1a\u63d0\u9ad8\u3002\n&3\u7d93\u9a57\u7684\u7372\u5f97 \uff1a \n&e\u624b\u6301\u65a7\u982d\u653b\u64ca\u5176\u4ed6\u751f\u7269\u6216\u73a9\u5bb6\u3002 +Guides.Axes.Section.1=&3\u4ec0\u9ebc\u662f\u65ac\u9996\u8005 \uff1f \n&e\u9019\u500b\u6280\u80fd\u6703\u9020\u6210\u7bc4\u570d\u653b\u64ca\u50b7\u5bb3\n&e\u50b7\u5bb3\u7b49\u65bc\u5c0d\u4e3b\u8981\u653b\u64ca\u76ee\u6a19\u9020\u6210\u50b7\u5bb3\u7684 50%\n&e\u6240\u4ee5\u5f88\u5bb9\u6613\u6e05\u7406\u6389\u4e00\u5927\u7247\u602a\u7269\u3002 +Guides.Axes.Section.2=&3\u4ec0\u9ebc\u662f\u81f4\u547d\u4e00\u64ca \uff1f \n&e\u9019\u662f\u88ab\u52d5\u6280\u80fd\n&e\u4e00\u5b9a\u6a5f\u7387\u5c0d\u76ee\u6a19\u9020\u6210\u984d\u5916\u50b7\u5bb3\n&e\u9810\u8a2d\u6bcf 2 \u7d1a\u589e\u52a0 0.1%\n&e\u5c0d\u751f\u7269\u9020\u6210 2 \u500d\u50b7\u5bb3\n&e\u5c0d\u73a9\u5bb6\u9020\u6210 1.5 \u500d\u50b7\u5bb3\u3002 +Guides.Axes.Section.3=&3\u4ec0\u9ebc\u662f\u65a7\u7cbe\u901a \uff1f \n&e\u9019\u662f\u88ab\u52d5\u6280\u80fd\n&e\u4f7f\u7528\u65a7\u982d\u653b\u64ca\u6642\u9644\u52a0\u984d\u5916\u50b7\u5bb3\n&e\u9810\u8a2d\u6bcf 50 \u7d1a\u984d\u5916\u63d0\u9ad81\u9ede\u50b7\u5bb3\n&e4\u9ede\u984d\u5916\u50b7\u5bb3\u5c01\u9802\u3002 +Guides.Axes.Section.4=&3\u4ec0\u9ebc\u662f\u7834\u7532 \uff1f \n&e\u7528\u8db3\u5920\u7684\u529b\u91cf\u64ca\u788e\u76d4\u7532 \uff01 \n&e\u7834\u7532\u662f\u88ab\u52d5\u7684\u80fd\u529b\uff0c\u5b83\u6709\u6a5f\u7387\u6703\u640d\u8017\n&e\u5c0d\u624b\u76d4\u7532\u7684\u8010\u4e45\u5ea6\u3002\u9019\u500b\u50b7\u5bb3\u6703\u96a8\u8457\u4f60\u65a7\u6280\u6280\u80fd\u7b49\u7d1a\u63d0\u5347\u3002 +Guides.Axes.Section.5=&3\u4ec0\u9ebc\u662f\u5f37\u529b\u885d\u64ca \uff1f \n&e\u9019\u662f\u88ab\u52d5\u6280\u80fd\n&e\u4f7f\u7528\u65a7\u982d\u653b\u64ca\u6642\u4e00\u5b9a\u6a5f\u7387\u7d66\u6575\u4eba\u5e36\u4f86\u5de8\u5927\u7684\u885d\u64ca\u529b\n&e\u9810\u8a2d\u6a5f\u7387\u70ba 25%\n&e\u6548\u679c\u76f8\u7576\u65bc\u64ca\u9000 II \u7684\u9644\u9b54\u6548\u679c\n&e\u6b64\u5916\u9084\u6703\u5c0d\u76ee\u6a19\u9020\u6210\u984d\u5916\u50b7\u5bb3\u3002 +##Excavation +Guides.Excavation.Section.0=&3\u95dc\u65bc\u6316\u6398 \uff1a \n&e\u6316\u6398\u662f\u4ee5\u6316\u6398\u6ce5\u571f\u4ee5\u5c0b\u627e\u5bf6\u85cf\u7684\u884c\u70ba\u3002\n&e\u900f\u904e\u6316\u6398\uff0c\u4f60\u5c07\u6703\u627e\u5230\u96b1\u85cf\u7684\u5bf6\u85cf\u3002\n&e\u4f60\u6316\u7684\u8d8a\u591a\u4f60\u627e\u5230\u7684\u5bf6\u85cf\u4e5f\u5c31\u8d8a\u591a\u3002\n\n&3\u7d93\u9a57\u4f86\u6e90 \uff1a \n&e\u8981\u7372\u5f97\u8a72\u6280\u80fd\u7684\u7d93\u9a57\u4f60\u5fc5\u9808\u624b\u6301\u93df\u5b50\u6316\u6398\u3002\n&e\u53ea\u6709\u7279\u5b9a\u7684\u65b9\u584a\u624d\u80fd\u7372\u5f97\u7d93\u9a57\u3001\u6316\u6398\u5230\u5bf6\u85cf\u3002 +Guides.Excavation.Section.1=&3\u53ef\u4ee5\u6316\u6398\u7684\u65b9\u584a \uff1a \n&e\u8349\u5730\u3001\u6ce5\u571f\u3001\u6c99\u5b50\u3001\u9ecf\u571f\u3001\u7802\u792b\u3001\u83cc\u7d72\u571f\u3001\u9748\u9b42\u6c99\u3001\u96ea\u3002 +Guides.Excavation.Section.2=&3\u5982\u4f55\u4f7f\u7528\u66b4\u8d70\u947d\u982d \uff1a \n&e\u624b\u62ff\u93df\u5b50\u9ede\u64ca\u53f3\u9375\u4ee5\u9032\u5165\u6e96\u5099\u72c0\u614b\u3002\n&e\u4e00\u65e6\u9032\u5165\u9019\u7a2e\u72c0\u614b\uff0c\u4f60\u7d04\u67094\u79d2\u7684\u6642\u9593\u8b93\u5de5\u5177\n&e\u9ede\u64ca\u8207\u6316\u6398\u6a5f\u80fd\u5c0d\u61c9\u7684\u65b9\u584a\n&e\u9019\u6a23\u5c31\u6703\u958b\u555f\u66b4\u8d70\u947d\u982d\u6280\u80fd\u3002 +Guides.Excavation.Section.3=&3\u4ec0\u9ebc\u662f\u66b4\u8d70\u947d\u982d \uff1f \n&e\u66b4\u8d70\u947d\u982d\u662f\u4e00\u7a2e\u8207\u6316\u6398\u6280\u80fd\u76f8\u95dc\uff0c\u4e14\u6709\u6642\u9593\u9650\u5236\u7684\u80fd\u529b\n&e\u5b83\u4f7f\u4f60\u627e\u5230\u5bf6\u85cf\u7684\u6a5f\u7387\u589e\u52a0 3 \u500d\n&e\u4e26\u4e14\u80fd\u77ac\u9593\u6253\u7834\u5c0d\u61c9\u7684\u65b9\u584a\u3002 +Guides.Excavation.Section.4=&3\u8003\u53e4\u5b78\u662f\u600e\u6a23\u904b\u4f5c\u7684 \uff1f \n&e\u6316\u6398\u51fa\u4f86\u7684\u6bcf\u500b\u5bf6\u85cf\u7684\u6389\u843d\u7269\u90fd\u6709\u81ea\u5df1\u7684\u6280\u80fd\u7b49\u7d1a\u8981\u6c42\n&e\u56e0\u6b64\u5f88\u96e3\u8aaa\u5b83\u5c0d\u4f60\u7684\u5e6b\u52a9\u6709\u591a\u5927\n&e\u8acb\u8a18\u4f4f\uff0c\u6316\u6398\u6a5f\u80fd\u7b49\u7d1a\u8d8a\u9ad8\u6316\u5230\u7684\u5bf6\u85cf\u5c31\u8d8a\u591a\u3002\n&e\u9084\u8981\u8a18\u5f97\u6bcf\u7a2e\u5c0d\u61c9\u6316\u6398\u7684\u65b9\u584a\u90fd\u6709\u81ea\u5df1\u7368\u7279\u7684\u5bf6\u85cf\u6e05\u55ae\n&e\u63db\u53e5\u8a71\u8aaa\uff0c\u4f60\u5728\u6ce5\u571f\u4e2d\u627e\u5230\u7684\u5bf6\u85cf\uff0c\n&e\u5728\u7802\u792b\u4e2d\u4e0d\u4e00\u5b9a\u80fd\u627e\u5230\u3002 +Guides.Excavation.Section.5=&3\u95dc\u65bc\u6316\u6398\u6ce8\u610f\u4e8b\u9805 \uff1a \n&e\u6316\u6398\u6389\u843d\u7269\u662f\u5b8c\u5168\u53ef\u5b9a\u5236\u7684\n&e\u56e0\u6b64\u6316\u51fa\u7684\u7d50\u679c\u56e0\u4f3a\u670d\u5668\u8a2d\u5b9a\u800c\u7570\u3002 +##Fishing +Guides.Fishing.Section.0=&3\u95dc\u65bc\u91e3\u9b5a \uff1a \n&e\u95dc\u65bc\u91e3\u9b5a\u6280\u80fd\uff0c\u91e3\u9b5a\u518d\u6b21\u4f7f\u4eba\u632f\u596e \uff01 \n&e\u627e\u5230\u96b1\u85cf\u7684\u5bf6\u85cf\u5f9e\u602a\u7269\u8eab\u4e0a\u6296\u843d\u7269\u54c1\u3002\n\n&3\u7d93\u9a57\u4f86\u6e90 \uff1a \n&e\u91e3\u9b5a\u3002 +Guides.Fishing.Section.1=&3\u6dd8\u91d1\u8005\u5982\u4f55\u904b\u4f5c \uff1f \n&e\u9019\u500b\u80fd\u529b\u4f7f\u4f60\u5728\u91e3\u9b5a\u6642\u627e\u5230\u5bf6\u85cf\n&e\u4e26\u4e14\u7269\u54c1\u6709\u5c0f\u6a5f\u7387\u5e36\u6709\u9644\u9b54\u3002\n&e\u91e3\u9b5a\u6280\u80fd\u7684\u6bcf\u7d1a\u5225\u7684\u5bf6\u85cf\u90fd\u6709\u6a5f\u7387\u6389\u843d\n&e\u3002\u5bf6\u85cf\u7684\u6a5f\u7387\u53d6\u6c7a\u65bc\u7a00\u6709\u5ea6\u7684\u6389\u843d\u6a5f\u7387\n&e\u4f60\u7684\u91e3\u9b5a\u7b49\u7d1a\u8d8a\u9ad8\uff0c\u4f60\u8d8a\u6709\u53ef\u80fd\u627e\u5230\u66f4\u597d\u7684\u5bf6\u85cf\uff0c\n&e\u7372\u5f97\u5bf6\u85cf\u7684\u6a5f\u7387\u4e5f\u8d8a\u9ad8\u3002 +Guides.Fishing.Section.2=&3\u51b0\u91e3\u5982\u4f55\u904b\u4f5c \uff1f \n&e\u9019\u500b\u88ab\u52d5\u6280\u80fd\u53ef\u4ee5\u8b93\u4f60\u5728\u51b0\u6e56\u4e2d\u91e3\u9b5a \uff01 \n&e\u5c07\u4f60\u7684\u91e3\u7aff\u6254\u5728\u51b0\u6e56\u91cc\u9019\u500b\u80fd\u529b\u6703\u5728\u51b0\u4e0a\n&e\u5f62\u6210\u5c0f\u5b54\u4f9b\u4f60\u91e3\u9b5a\u3002 +Guides.Fishing.Section.3=&3\u91e3\u9b5a\u5927\u5e2b\u5982\u4f55\u904b\u4f5c \uff1f \n&e\u9019\u500b\u88ab\u52d5\u589e\u52a0\u4e86\u91e3\u9b5a\u6642\u54ac\u9264\u7684\u6a5f\u7387\u3002\n&e\u7576\u4f60\u89e3\u9396\u9019\u7a2e\u80fd\u529b\u6642\n&e\u5728\u8239\u4e0a\u6216\u8005\u5728\u6d77\u6d0b\u751f\u7269\u7fa4\u7cfb\u91e3\u9b5a\u6642\u91e3\u5230\u9b5a\u7684\u6a5f\u7387\u589e\u52a0\u4e00\u500d\u3002 +Guides.Fishing.Section.4=&3\u6296\u52d5\u5982\u4f55\u904b\u4f5c \uff1f \n&e\u9019\u7a2e\u4e3b\u52d5\u6280\u80fd\u53ef\u4ee5\u8b93\u4f60\u7528\u91e3\u7aff\u52fe\u4f4f\u751f\u7269\n&e\u4e26\u5f9e\u4ed6\u5011\u8eab\u4e0a\u7372\u5f97\u7269\u54c1\u3002\n&e\u751f\u7269\u6703\u6389\u843d\u4ed6\u5011\u6b7b\u4ea1\u6642\u6389\u843d\u7684\u7269\u54c1\u3002\n&e\u4e5f\u53ef\u80fd\u7372\u5f97\u602a\u7269\u7684\u982d\n&e\u4e00\u822c\u60c5\u6cc1\u4e0b\u9019\u4e9b\u982d\u7121\u6cd5\u5728\u751f\u5b58\u6a21\u5f0f\u4e2d\u7372\u5f97\u3002 +Guides.Fishing.Section.5=&3\u6f01\u592b\u7684\u98df\u8b5c\u5982\u4f55\u904b\u4f5c \uff1f \n&e\u9019\u500b\u88ab\u52d5\u589e\u52a0\u4e86\u5403\u9b5a\u6642\u56de\u5fa9\u7684\u98fd\u98df\u5ea6\u3002 +Guides.Fishing.Section.6=&3\u95dc\u65bc\u91e3\u9b5a\u7684\u8aaa\u660e \uff1a \n&e\u91e3\u9b5a\u7684\u6389\u843d\u7269\u662f\u53ef\u4ee5\u81ea\u5b9a\u7fa9\u7684\uff0c\n&e\u6240\u4ee5\u6389\u843d\u7269\u56e0\u4f3a\u670d\u5668\u8a2d\u5b9a\u800c\u7570\u3002 +##Herbalism +Guides.Herbalism.Section.0=&3\u95dc\u65bc\u8349\u85e5\u5b78 \uff1a \n&e\u8349\u85e5\u5b78\u662f\u95dc\u65bc\u63a1\u96c6\u8349\u85e5\u8207\u690d\u7269\u7684\u6280\u80fd\u3002\n\n&3\u7d93\u9a57\u62c9\u9060 \uff1a \n&e\u63a1\u96c6\u8349\u85e5\u6216\u690d\u7269\u3002 +Guides.Herbalism.Section.1=&3\u53ef\u4f5c\u7528\u7684\u8349\u85e5/\u690d\u7269\n&e\u5c0f\u9ea5\u3001\u99ac\u9234\u85af\u3001\u80e1\u863f\u8514\u3001\u897f\u74dc\u3001\n&e\u5357\u74dc\u3001\u7518\u8517\u3001\u53ef\u53ef\u8c46\u3001\u4ed9\u4eba\u638c\u3001\u8611\u83c7\u3001\n&e\u5730\u7344\u7599\u7629\u3001\u8377\u8449\u8207\u85e4\u8513\u3002 +Guides.Herbalism.Section.2=&3\u5927\u5730\u795d\u798f\u5982\u4f55\u904b\u4f5c \uff1f \n&e\u5927\u5730\u795d\u798f\u662f\u4e3b\u52d5\u6280\u80fd\uff0c\u7576\u4f60\u624b\u6301\u92e4\u982d\u6642\n&e\u9ede\u64ca\u53f3\u9375\u53ef\u767c\u52d5\u6280\u80fd\uff0c\u5927\u5730\u795d\u798f\u63d0\u9ad8\u4e09\u500d\u6536\u7a6b\u7684\u6a5f\u7387\u3002\n&e\u540c\u6642\u4e5f\u8b93\u73a9\u5bb6\u6709\u80fd\u529b\u4f7f\u7528\u8eab\u4e0a\u7684\u7a2e\u5b50\u4f86\u8f49\u5316\n&e\u65b9\u584a\u4e26\u8ce6\u4e88\u751f\u547d\u3002 +Guides.Herbalism.Section.3=&3\u7da0\u624b\u6307 \uff08\u4f5c\u7269\uff09 \u5982\u4f55\u904b\u4f5c \uff1f \n&e\u9019\u662f\u88ab\u52d5\u6280\u80fd\uff0c\u8b93\u4f5c\u7269\u5728\u63a1\u96c6\u6642\n&e\u81ea\u52d5\u64ad\u7a2e\u56de\u53bb\u3002\n&e\u6a5f\u7387\u53d6\u6c7a\u65bc\u4f60\u7684\u8349\u85e5\u5b78\u6280\u80fd\u7b49\u7d1a\u3002 +Guides.Herbalism.Section.4=&3\u7da0\u624b\u6307 \uff08\u9d5d\u5375\u77f3/\u77f3\u78da/\u6ce5\u571f\uff09 \u5982\u4f55\u904b\u4f5c \uff1f \n&e\u9019\u662f\u4e3b\u52d5\u6280\u80fd\uff0c\u8b93\u4f60\u5728\u624b\u62ff\u8457\u7a2e\u5b50\u6642\uff0c\n&e\u5c0d\u9d5d\u5375\u77f3/\u77f3\u78da/\u6ce5\u571f\u9ede\u64ca\u53f3\u9375\uff0c\u53ef\u4f7f\u5b83\u5011\u8b8a\u6210\n&e\u9752\u82d4\u77f3\u3001\u8349\u5730\u7b49\uff0c\u9019\u6703\u6d88\u8017\u4e00\u9846\u7a2e\u5b50\u3002 +Guides.Herbalism.Section.5=&3\u8fb2\u592b\u98df\u8b5c\u5982\u4f55\u904b\u4f5c \uff1f \n&e\u9019\u662f\u88ab\u52d5\u6280\u80fd\uff0c\u53ef\u589e\u52a0\u4e0b\u5217\u98df\u7269\u7684\u98fd\u98df\u5ea6\u56de\u5fa9 -\n&e\u9eb5\u5305\uff0c\u9905\u4e7e\u3001\u897f\u74dc\u3001\u8611\u83c7\u6e6f\u3001\u80e1\u863f\u8514\u3001\u99ac\u9234\u85af\u3002 +Guides.Herbalism.Section.6=&3\u6d77\u62c9\u723e\u7684\u795d\u798f\u5982\u4f55\u904b\u4f5c \uff1f \n&e\u9019\u662f\u4e3b\u52d5\u6280\u80fd\uff0c\u6709\u6a5f\u7387\u5728\u7528\u528d\u7834\u58de\u7279\u5b9a\n&e\u65b9\u584a\u6642\u7372\u5f97\u7a00\u6709\u9053\u5177\u3002 +Guides.Herbalism.Section.7=&3\u96d9\u500d\u6389\u843d\u5982\u4f55\u904b\u4f5c \uff1f \n&e\u9019\u662f\u88ab\u52d5\u6280\u80fd\u4f7f\u73a9\u5bb6\u80fd\u52a0\u500d\u6536\u7a6b\u3002 +##Mining +Guides.Mining.Section.0=&3\u95dc\u65bc\u6316\u7926 \uff1a \n&e\u6316\u7926\u5305\u62ec\u6316\u6398\u77f3\u982d\u548c\u7926\u7269\u3002\n&e\u6316\u7926\u6280\u80fd\u53ef\u4ee5\u63d0\u4f9b\u591a\u91cd\u7926\u7269\u6389\u843d\u7684\u734e\u52f5\u3002\n\n&3\u7d93\u9a57\u4f86\u6e90 \uff1a \n&e\u7372\u5f97\u6b64\u6280\u80fd\u7684\u7d93\u9a57\u503c\uff0c\u4f60\u5fc5\u9808\u62ff\u8457\u7926\u93ac\u9032\u884c\u6316\u6398\uff0c\n&e\u53ea\u6709\u7279\u5b9a\u65b9\u584a\u624d\u80fd\u7372\u5f97\u7d93\u9a57\u3002 +Guides.Mining.Section.1=&3\u5c0d\u61c9\u6750\u6599 \uff1a \n&e\u77f3\u982d\u3001\u7164\u7926\u3001\u9435\u7926\u3001\u91d1\u7926\u3001\u947d\u77f3\u7926\u3001\u7d05\u77f3\u7926\u3001\n&e\u9752\u91d1\u77f3\u7926\u3001\u9ed1\u66dc\u77f3\u3001\u9752\u82d4\u77f3\u3001\u7d42\u754c\u77f3\u3001\n&e\u87a2\u5149\u77f3\u3001\u5730\u7344\u77f3\u3002 +Guides.Mining.Section.2=&3\u5982\u4f55\u4f7f\u7528\u8d85\u7d1a\u788e\u77f3\u6a5f \uff1a \n&e\u628a\u93ac\u5b50\u62ff\u5728\u4f60\u7684\u624b\u4e0a\uff0c\u9ede\u64ca\u53f3\u9375\u4f86\u6e96\u5099\u4f60\u7684\u93ac\u5b50\u3002\n&e\u4f60\u5c07\u6709 4 \u79d2\u7684\u6642\u9593\u4f86\u6fc0\u767c\u4f60\u7684\u6280\u80fd\u3002\n&e\u7576\u4f60\u6572\u4e0b\u5c0d\u61c9\u7684\u77f3\u982d\u4ee5\u5f8c\uff0c\u8d85\u7d1a\u788e\u77f3\u6a5f\u5c07\u88ab\u958b\u555f\u3002 +Guides.Mining.Section.3=&3\u4ec0\u9ebc\u662f\u8d85\u7d1a\u788e\u77f3\u6a5f \uff1f \n&e\u8d85\u7d1a\u788e\u77f3\u6a5f\u662f\u4e3b\u52d5\u6280\u80fd\n&e\u5b83\u80fd\u4f7f\u4f60\u5728\u6316\u6389\u5c0d\u61c9\u7926\u7269\u7684\u6642\u5019\u589e\u52a0 3 \u500d\u6389\u843d\u6a5f\u7387\n&e\u4e26\u4e14\u5728\u6280\u80fd\u6642\u9593\u5167\u77ac\u9593\u7834\u58de\u77f3\u982d\u548c\u7926\u7269 +Guides.Mining.Section.4=&3\u5982\u4f55\u4f7f\u7528\u7206\u7834\u958b\u6316 \uff1a \n&e\u628a\u93ac\u5b50\u62ff\u5728\u624b\u4e0a\uff0c\n&e\u5728\u4e00\u5b9a\u8ddd\u96e2\u5167\u5c0d TNT \u9ede\u64ca\u53f3\u9375\uff0c\u9019\u5c07\u6703\u4f7f\u5f97 TNT \u5728\u77ac\u9593\u5167\u7206\u70b8\u3002 +Guides.Mining.Section.5=&3\u4ec0\u9ebc\u662f\u7206\u7834\u958b\u6316 \uff1f \n&e\u7206\u7834\u958b\u6316\u662f\u9700\u8981\u51b7\u537b\u6642\u9593\u7684\u6316\u7926\u6280\u80fd\n&e\u5b83\u80fd\u4f7f\u4f60\u5728\u4f7f\u7528 TNT \u70b8\u7926\u6642\u7372\u5f97\u984d\u5916\u734e\u52f5\n&e\u7206\u7834\u958b\u6316\u7e3d\u5171\u6709 3 \u500b\u529f\u80fd\n&e\u5927\u578b\u70b8\u5f48 \uff1a \u4f7f\u4f60\u7684 TNT \u7206\u70b8\u7bc4\u570d\u64f4\u5927\n&e\u7206\u7834\u5c08\u5bb6 \uff1a \u964d\u4f4e\u4f60\u53d7\u5230 TNT \u7684\u7206\u70b8\u50b7\u5bb3\n&e\u7206\u7834\u958b\u6316 \uff1a \u4f7f\u4f60\u9ede\u71c3\u7684 TNT \u70b8\u6389\u7bc4\u570d\u5167\u4e00\u5b9a\u6578\u91cf\u7684\u7926\u7269 +##Repair +Guides.Repair.Section.0=&3\u95dc\u65bc\u4fee\u7406 \uff1a \n&e\u4fee\u7406\u53ef\u4ee5\u8b93\u4f60\u4f7f\u7528\u9435\u65b9\u584a\u4f86\u4fee\u7406\u76d4\u7532\u548c\u5de5\u5177\u3002\n\n&3\u7d93\u9a57\u4f86\u6e90 \uff1a \n&e\u4f7f\u7528 mcMMO \u7684\u9435\u7827\u4fee\u7406\u5de5\u5177\u6216\u88dd\u5099\u3002\n&emcMMO \u9810\u8a2d\u7684\u4fee\u7406\u53f0\u662f\u9435\u65b9\u584a\n&e\u4e0d\u8981\u8207\u7528\u7d93\u9a57\u4fee\u7406\u7684\u9435\u7827\u6df7\u6dc6\u3002 +Guides.Repair.Section.1=&3\u5982\u4f55\u4f7f\u7528\u4fee\u7406 \uff1f \n&e\u653e\u4e0b mcMMO \u9435\u7827 \uff08\u9435\u65b9\u584a\uff09\uff0c\u624b\u6301\u9700\u8981\u4fee\u7406\u7684\u9053\u5177 \n&e\uff0c\u5c0d\u9435\u65b9\u584a\u9ede\u64ca\u53f3\u9375\uff0c\u6bcf\u6b21\u4f7f\u7528\u6d88\u8017\u7269\u54c1\u3002 +Guides.Repair.Section.2=&3\u4fee\u7406\u7cbe\u901a\u5982\u4f55\u904b\u4f5c \uff1f \n&e\u4fee\u7406\u7cbe\u901a\u63d0\u5347\u4fee\u7406\u6642\u8010\u4e45\u56de\u5fa9\u91cf\u3002\n&e\u984d\u5916\u4fee\u7406\u7684\u8010\u4e45\u5ea6\u91cf\u53d6\u6c7a\u65bc\u4f60\u7684\u4fee\u7406\u6280\u80fd\u7b49\u7d1a\u3002 +Guides.Repair.Section.3=&3\u8d85\u7d1a\u4fee\u7406\u5982\u4f55\u904b\u4f5c \uff1f \n&e\u8d85\u7d1a\u4fee\u7406\u662f\u88ab\u52d5\u6280\u80fd\u3002\u7576\u4fee\u7406\u7269\u54c1\u6642\uff0c\n&e\u6703\u4f7f\u7269\u54c1\u7684\u4fee\u7406\u6548\u679c\u7ffb\u500d\u3002 +Guides.Repair.Section.4=&3\u79d8\u6cd5\u935b\u9020\u5982\u4f55\u904b\u4f5c \uff1f \n&e\u9019\u662f\u88ab\u52d5\u6280\u80fd\uff0c\u5141\u8a31\u4f60\u4fee\u7406\u9644\u9b54\u7269\u54c1\n&e\u4fee\u7406\u7269\u54c1\u6642\u6709\u4e00\u5b9a\u6a5f\u7387\u4fdd\u7559\u9644\u9b54\u5c6c\u6027\n&e\u9644\u9b54\u5c6c\u6027\u53ef\u4ee5\u4fdd\u6301\u73fe\u6709\u7684\u7b49\u7d1a\uff0c\n&e\u964d\u7d1a\u5230\u8f03\u4f4e\u7b49\u7d1a\u6216\u8005\u5b8c\u5168\u6d88\u5931\u3002 +##Salvage +Guides.Salvage.Section.0=&3\u95dc\u65bc\u5206\u89e3 \uff1a \n&e\u5206\u89e3\u4f7f\u4f60\u53ef\u4ee5\u4f7f\u7528\u9ec3\u91d1\u65b9\u584a\u4f86\u5206\u89e3\u88dd\u5099\u548c\u5de5\u5177\u3002\n\n&3\u7d93\u9a57\u4f86\u6e90 \uff1a \n&e\u5206\u89e3\u6642\u4fee\u7406\u548c\u91e3\u9b5a\u7684\u5b50\u6280\u80fd\uff0c\n&e\u6280\u80fd\u7b49\u7d1a\u53d6\u6c7a\u65bc\u4f60\u7684\u91e3\u9b5a\u548c\u4fee\u7406\u7684\u7b49\u7d1a\u3002 +Guides.Salvage.Section.1=&3\u5982\u4f55\u4f7f\u7528\u5206\u89e3 \uff1f \n&e\u653e mcMMO \u5206\u89e3\u9435\u7827 \uff08\u9ec3\u91d1\u65b9\u584a\uff09 \u62ff\u8457\u7269\u54c1\u5c0d\u9ec3\u91d1\u65b9\u584a\u9ede\u64ca\u53f3\u9375\u3002\n&e\u9019\u5c07\u62c6\u89e3\u7269\u54c1\uff0c\u4e26\u8fd4\u9084\u7269\u54c1\u7684\u88fd\u4f5c\u6750\u6599\n&e\u4f8b\u5982 \uff1a \u62c6\u89e3\u9435\u93ac\u4f60\u5c07\u7372\u5f97\u9435\u9320\u3002 +Guides.Salvage.Section.2=&3\u5982\u4f55\u4f7f\u7528\u9032\u968e\u5206\u89e3 \uff1f \n&e\u89e3\u9396\u5f8c\uff0c\u6b64\u529f\u80fd\u4f7f\u4f60\u53ef\u4ee5\u5206\u89e3\u640d\u58de\u7684\u7269\u54c1\u3002\n&e\u96a8\u8457\u7b49\u7d1a\u7684\u63d0\u5347\u5206\u89e3\u6240\u5f97\u7684\u7269\u54c1\u6703\u7372\u5f97\u66f4\u591a\u7684\u6750\u6599\n&e\u900f\u904e\u9032\u968e\u5206\u89e3\u4f60\u59cb\u7d42\u80fd\u7372\u5f97\u6750\u6599\u3002\n&e\u4e0d\u7528\u64d4\u5fc3\u4e0d\u6703\u7372\u5f97\u6750\u6599\uff0c\u9664\u975e\u4f60\u7684\u8010\u4e45\u5ea6\u592a\u4f4e\u3002 +Guides.Salvage.Section.3=&3\u70ba\u4e86\u8aaa\u660e\u9019\u662f\u5982\u4f55\u904b\u4f5c\u7684\uff0c\u9019\u6709\u4f8b\u5b50 \uff1a \n&e\u5047\u8a2d\u6211\u5011\u5206\u89e3\u4e86\u640d\u58de\u4e86 20% \u7684\u91d1\u93ac\uff0c\n&e\u4ea6\u70ba\u4e4b\u4f60\u6700\u591a\u7372\u5f97\u5169\u500b\u91d1\u9320\n&e\uff08\u56e0\u70ba\u91d1\u93ac\u4f7f\u7528\u4e09\u500b\u91d1\u9320\u88fd\u4f5c\u7684\uff0c\n&e33\uff0c33% \u7684\u640d\u8017\uff09 \u7b49\u65bc 66% \u7684\u8010\u4e45\u5ea6\u3002\n&e\u5982\u679c\u4f60\u7684\u8010\u4e45\u5ea6\u4f4e\u65bc 66% \u5247\u7121\u6cd5\u7372\u5f97\u5169\u500b\u6750\u6599\uff0c\u9ad8\u65bc\u6b64\u503c\u7372\u5f97\u5169\u500b\u3002 +Guides.Salvage.Section.4=&3\u5982\u4f55\u4f7f\u7528\u5967\u8853\u5206\u89e3 \uff1f \n&e\u9019\u500b\u6280\u80fd\u53ef\u4ee5\u4f7f\u4f60\u5728\u5206\u89e3\u9644\u9b54\u7269\u54c1\u6642\u7372\u5f97\u9644\u9b54\u66f8\n&e\u6839\u64da\u4f60\u7684\u5206\u89e3\u7b49\u7d1a\uff0c\u5206\u70ba\u5168\u90e8\u63d0\u53d6\u548c\u90e8\u5206\u63d0\u53d6\n&e\u7576\u5206\u89e3\u4f4d\u90e8\u5206\u63d0\u53d6\u6642\u3002\n\n&e\u9644\u9b54\u66f8\u7684\u9644\u9b54\u8207\u7269\u54c1\u76f8\u6bd4\n&e\u9644\u9b54\u7b49\u7d1a\u504f\u4f4e\u3002 +##Smelting +Guides.Smelting.Section.0=\u99ac\u4e0a\u5230\u4f86\u2026\u2026 +##Swords +Guides.Swords.Section.0=&3\u95dc\u65bc\u528d\u8853 \uff1a \n&e\u9019\u500b\u6280\u80fd\u5728\u4f7f\u7528\u528d\u9032\u884c\u6230\u9b25\u6642\n&e\u63d0\u4f9b\u5404\u7a2e\u52a0\u6210\u3002\n\n&3\u7d93\u9a57\u4f86\u6e90 \uff1a \n&e\u7d93\u9a57\u503c\u662f\u900f\u904e\u7528\u528d\u5c0d\u602a\u7269\u6216\u5176\u4ed6\u73a9\u5bb6\n&e\u9020\u6210\u50b7\u5bb3\u7372\u5f97\u3002 +Guides.Swords.Section.1=&3\u5982\u4f55\u4f7f\u7528\u5229\u5203\u7a81\u523a \uff1f \n&e\u5229\u5203\u7a81\u523a\u662f\u4e3b\u52d5\u6280\u80fd\uff0c\u5c07\u528d\u62ff\u5728\u624b\u4e2d\u4e26\u9ede\u64ca\u53f3\u9375\u958b\u555f\n&e\u9019\u500b\u6280\u80fd\u8b93\u4f60\u767c\u52d5\u7bc4\u570d\u653b\u64ca\uff0c\u63d0\u4f9b 25% \u7684\u50b7\u5bb3\u52a0\u6210\n&e\u4e26\u4f34\u6709\u6495\u88c2\u6548\u679c\u3002 +Guides.Swords.Section.2=&3\u53cd\u64ca\u5982\u4f55\u904b\u4f5c \uff1f \n&e\u53cd\u64ca\u662f\u4e3b\u52d5\u6280\u80fd\uff0c\u683c\u64cb\u5c0d\u624b\u5c0d\u4f60\u7684\u50b7\u5bb3\n&e\u4e26\u6709\u6a5f\u7387\u53cd\u5c0450%\u7684\u50b7\u5bb3\u7d66\u5c0d\u624b\u3002 +Guides.Swords.Section.3=&3\u6495\u88c2\u5982\u4f55\u904b\u4f5c \uff1f \n&e\u6495\u88c2\u662f\u88ab\u52d5\u6280\u80fd\uff0c\u653b\u64ca\u6642\u6709\u6a5f\u7387\u89f8\u767c\u6495\u88c2\u3002\n&e\u6495\u88c2\u6703\u5c0d\u5c0d\u5c11\u9020\u6210\u6301\u7e8c\u7684\u6d41\u8840\u50b7\u5bb3\uff0c\u76f4\u5230\u7d50\u675f\u6216\u5c0d\u624b\u6b7b\u4ea1\uff0c\n&e\u6301\u7e8c\u6642\u9593\u53d6\u6c7a\u65bc\u4f60\u7684\u528d\u8853\u7b49\u7d1a\u3002 +##Taming +Guides.Taming.Section.0=&3\u99b4\u7378\n&e\u99b4\u7378\u6280\u80fd\u8b93\u73a9\u5bb6\u80fd\u5728\u7528\u72fc\u6230\u9b25\u6642\n&e\u6642\u6709\u52a0\u6210\u6548\u679c\u3002\n\n&3\u7d93\u9a57\u4f86\u6e90 \uff1a \n&e\u8981\u7372\u5f97\u7d93\u9a57\uff0c\u9808\u99b4\u670d\u72fc\u6216\u5c71\u8c93\uff0c\n&e\u6216\u8207\u4f60\u7684\u72fc\u4e00\u540c\u6230\u9b25\u3002 +Guides.Taming.Section.1=&3\u4ec0\u9ebc\u662f\u91ce\u6027\u547c\u558a \uff1f \n&e\u91ce\u6027\u547c\u558a\u662f\u4e3b\u52d5\u6280\u80fd\u8b93\u4f60\n&e\u53ef\u4ee5\u53ec\u559a\u4e00\u96bb\u72fc\u6216\u5c71\u8c93\uff0c\n&e\u53ea\u8981\u624b\u6301\u9aa8\u982d\u6216\u751f\u9b5a\u5c0d\u5176\u9ede\u64ca\u5de6\u9375\u3002 +Guides.Taming.Section.2=&3\u4ec0\u9ebc\u662f\u91ce\u7378\u8cc7\u8a0a \uff1f \n&e\u91ce\u7378\u8cc7\u8a0a\u80fd\u8b93\u4f60\u67e5\u770b\u5bf5\u7269\u7684\u72c0\u614b\uff0c\n&e\u5c0d\u5bf5\u7269\u9ede\u64ca\u5de6\u9375\u5c31\u80fd\u4f7f\u7528\u9019\u9805\u80fd\u529b\u3002 +Guides.Taming.Section.3=&3\u4ec0\u9ebc\u662f\u55dc\u8840 \uff1f \n&e\u8840\u8165\u653b\u64ca\u662f\u4e3b\u52d5\u6280\u80fd\uff0c\u80fd\u9020\u6210\n&e\u72fc\u7684\u653b\u64ca\u76ee\u6a19\u6709\u6a5f\u7387\u9677\u5165\u6d41\u8840\u72c0\u614b\u3002 +Guides.Taming.Section.4=&3\u4ec0\u9ebc\u662f\u5229\u722a \uff1f \n&e\u5229\u722a\u4f7f\u72fc\u7684\u653b\u64ca\u529b\u96a8\u8457\u99b4\u7378\u7b49\u7d1a\n&e\u589e\u52a0\u800c\u589e\u52a0\u3002 +Guides.Taming.Section.5=&3\u4ec0\u9ebc\u662f\u74b0\u5883\u611f\u77e5 \uff1f \n&e\u9019\u500b\u88ab\u52d5\u6280\u80fd\u80fd\u8b93\u72fc\u5728\u9047\u5230\u5371\u96aa\u6642\n&e\u8fc5\u901f\u56de\u5230\u4f60\u8eab\u908a \uff08\u5982\u4ed9\u4eba\u638c\u6216\u5ca9\u6f3f\uff09\uff0c\n&e\u4e5f\u53ef\u4ee5\u6e1b\u5c11\u6454\u843d\u50b7\u5bb3\u3002 +Guides.Taming.Section.6=&3\u4ec0\u9ebc\u662f\u6bdb\u76ae\u5f37\u5316 \uff1f \n&e\u9019\u662f\u88ab\u52d5\u6280\u80fd\u80fd\u8b93\u72fc\n&e\u53d7\u5230\u653b\u64ca\u6216\u71c3\u71d2\u6642\u6e1b\u5c11\u9664\u50b7\u5bb3\u3002 +Guides.Taming.Section.7=&3\u4ec0\u9ebc\u662f\u885d\u64ca\u6297\u6027 \uff1f \n&e\u9019\u662f\u88ab\u52d5\u6280\u80fd\uff0c\u8b93\u72fc\u7fa4\n&e\u6e1b\u5c11\u7206\u70b8\u50b7\u5bb3\u3002 +Guides.Taming.Section.8=&3\u4ec0\u9ebc\u662f\u901f\u98df\u670d\u52d9 \uff1f \n&e\u9019\u662f\u88ab\u52d5\u6280\u80fd\uff0c\u8b93\u72fc\u7fa4\u5728\u653b\u64ca\u6642\n&e\u6709\u6a5f\u7387\u56de\u5fa9\u8840\u91cf\u3002 +##Unarmed +Guides.Unarmed.Section.0=&3\u683c\u9b25 \uff1a \n&e\u683c\u9b25\u4f7f\u73a9\u5bb6\u5728\u4f7f\u7528\u62f3\u982d\u4f5c\u6230\u6642\u6709\n&e\u5404\u7a2e\u52a0\u6210\u6548\u679c\u3002\n\n&3\u7d93\u9a57\u4f86\u6e90 \uff1a \n&e\u5728\u7528\u624b\u653b\u64ca\u602a\u7269\u6216\u73a9\u5bb6\u6642\u53ef\u4ee5\u7372\u5f97\u7d93\u9a57\u3002 +Guides.Unarmed.Section.1=&3\u4ec0\u9ebc\u662f\u72c2\u66b4 \uff1f \n&e\u72c2\u66b4\u662f\u4e3b\u52d5\u6280\u80fd\uff0c\u7a7a\u624b\u6642\u9ede\u64ca\u53f3\u9375\u767c\u52d5\u3002\n&e\u72c2\u66b4\u53ef\u4ee5\u52a0\u6210 50% \u5c0d\u65b9\u584a\u7684\u50b7\u5bb3\uff0c\n&e\u4f7f\u4f60\u53ef\u4ee5\u8f15\u9b06\u7834\u58de\u8106\u5f31\u7269\u9ad4\uff0c\n&e\u5982\u6ce5\u571f\u8207\u6c99\u5b50\u3002 +Guides.Unarmed.Section.2=&3\u4ec0\u9ebc\u662f\u9435\u81c2\u5f0f \uff1f \n&e\u9435\u81c2\u80fd\u589e\u52a0\u5f92\u624b\u653b\u64ca\u602a\u7269\u6216\n&e\u73a9\u5bb6\u7684\u50b7\u5bb3\u3002 +Guides.Unarmed.Section.3=&3\u4ec0\u9ebc\u662f\u7bad\u77e2\u504f\u5411 \uff1f \n&e\u7bad\u77e2\u504f\u5411\u662f\u88ab\u52d5\u6280\u80fd\uff0c\u8b93\u4f60\u6709\u6a5f\u7387\n&e\u80fd\u6539\u8b8a\u9ab7\u9acf\u7372\u73a9\u5bb6\u5c04\u5411\u4f60\u7684\u7bad\u7684\u65b9\u5411\u3002\n&e\u7bad\u6703\u843d\u81f3\u5730\u9762\u3002 +Guides.Unarmed.Section.4=&3\u4ec0\u9ebc\u662f\u9435\u8155 \uff1f \n&e\u9435\u8155\u6709\u6a5f\u7387\u9632\u6b62\u5c0d\u624b\u7684\u7e73\u68b0\u3002\n&e\u89f8\u767c\u7684\u6a5f\u7387\u537b\u6c7a\u65bc\u4f60\u683c\u9b25\u7684\u7b49\u7d1a\u3002 +Guides.Unarmed.Section.5=&3\u4ec0\u9ebc\u662f\u7e73\u68b0 \uff1f \n&e\u9019\u500b\u88ab\u52d5\u6280\u80fd\u8b93\u73a9\u5bb6\u89e3\u9664\u5176\u4ed6\u73a9\u5bb6\u7684\u6b66\u88dd\uff0c\n&e\u4f7f\u76ee\u6a19\u6240\u88dd\u5099\u7684\u7269\u54c1\u6389\u843d\u5230\u5730\u4e0a\u3002 +##Woodcutting +Guides.Woodcutting.Section.0=&3\u95dc\u65bc\u4f10\u6728 \uff1a \n&e\u4f10\u6728\u662f\u95dc\u65bc\u780d\u6a39\u7684\u3002\n\n&3\u7d93\u9a57\u4f86\u6e90 \uff1a \n&e\u7834\u58de\u6728\u982d\u985e\u7684\u65b9\u584a\u5c31\u6703\u7372\u5f97\u4f10\u6728\u7d93\u9a57\u3002 +Guides.Woodcutting.Section.1=&3\u4f10\u6728\u5de5\u5982\u4f55\u904b\u4f5c \uff1f \n&e\u4f10\u6728\u5de5\u662f\u4e3b\u52d5\u6280\u80fd\n&e\u5728\u624b\u6301\u65a7\u982d\u7684\u540c\u6642\u53f3\u9375\u4e26\u7834\u58de\u6728\u982d\u4ee5\u958b\u555f\u4f10\u6728\u5de5\n&e\u9019\u5c07\u77ac\u9593\u7834\u58de\u6574\u68f5\u6a39\u3002 +Guides.Woodcutting.Section.2=&3\u79cb\u98a8\u6383\u843d\u8449\u5982\u4f55\u904b\u4f5c \uff1f \n&e\u79cb\u98a8\u6383\u843d\u8449\u662f\u88ab\u52d5\u6280\u80fd\n&e\u7576\u65a7\u982d\u64ca\u4e2d\u6a39\u8449\u65b9\u584a\u6642\u6703\u5c0e\u81f4\u77ac\u9593\u6d88\u5931\n&e\u9810\u8a2d\u60c5\u6cc1\u4e0b\uff0c100 \u7d1a\u89e3\u9396\u3002 +Guides.Woodcutting.Section.3=&3\u6a39\u6728\u8c50\u6536\u5982\u4f55\u904b\u4f5c \uff1f \n&e\u9019\u500b\u88ab\u52d5\u6280\u80fd\u4f7f\u4f60\u5728\u780d\u6a39\u6642\n&e\u6709\u6a5f\u7387\u6389\u843d\u96d9\u500d\u6728\u982d\u3002 +#INSPECT +Inspect.Offline= &c\u4f60\u6c92\u6709\u67e5\u8a62\u96e2\u7dda\u73a9\u5bb6\u8cc7\u8a0a\u7684\u6b0a\u9650 \uff01 +Inspect.OfflineStats=\u96e2\u7dda\u73a9\u5bb6\u7684 mcMMO \u7d71\u8a08\u8cc7\u8a0a &e{0} +Inspect.Stats=&e{0} \u7684 mcMMO \u7d71\u8a08\u8cc7\u8a0a +Inspect.TooFar=\u4f60\u7121\u6cd5\u67e5\u8a62\u90a3\u500b\u73a9\u5bb6\u56e0\u70ba\u4f60\u5011\u8ddd\u96e2\u592a\u9060\u4e86 \uff01 +#ITEMS +Item.ChimaeraWing.Fail=**\u5947\u7f8e\u62c9\u4e4b\u7ffc\u5931\u6557\u4e86 \uff01** Item.ChimaeraWing.Pass=**\u5947\u7f8e\u62c9\u4e4b\u7ffc** Item.ChimaeraWing.Name=\u5947\u7f8e\u62c9\u4e4b\u7ffc -Item.ChimaeraWing.Lore=&7\u50b3\u9001\u4f60\u5230\u4f60\u7684\u5e8a\u908a. -Item.Generic.Wait=\u4f60\u5fc5\u9808\u7b49\u5f85\u76f4\u5230\u53ef\u4ee5\u518d\u6b21\u4f7f\u7528! &e({0}s) -Item.Injured.Wait=\u4f60\u904e\u5ea6\u75b2\u52de\u5fc5\u9808\u7b49\u5f85\u4e00\u6bb5\u6642\u9593\u5f8c\u624d\u53ef\u4f7f\u7528. &e({0}s) -Teleport.Commencing=&7\u5373\u5c07\u5728 &6({0}) &7\u79d2\u5f8c\u50b3\u9001, \u8acb\u4e0d\u8981\u4e82\u52d5... -Teleport.Cancelled=&4\u53d6\u6d88\u50b3\u9001! -Skills.Child=&6(\u5b50\u6280\u80fd) -Skills.Disarmed=&4\u4f60\u7684\u6b66\u5668\u88ab\u64ca\u843d! -Skills.Header=-----[]&a{0}&c[]----- -Skills.NeedMore=&4\u4f60\u9700\u8981\u66f4\u591a&7{0} -Skills.Parents=\u524d\u7f6e -Skills.Stats={0}&a{1}&3 XP(&7{2}&3/&7{3}&3) +Item.ChimaeraWing.Lore=&7\u50b3\u9001\u81f3\u4f60\u7684\u5e8a\u3002 +Item.ChimaeraWing.NotEnough=\u4f60\u9700\u8981 &e{0}&c \u66f4\u591a &6{1}&c \uff01 +Item.NotEnough=\u4f60\u9700\u8981 &e{0}&c \u66f4\u591a &6{1}&c \uff01 +Item.Generic.Wait=\u4f60\u9700\u8981\u7b49\u5f85\u4e00\u6bb5\u6642\u9593\u624d\u80fd\u518d\u6b21\u4f7f\u7528 \uff01&e\uff08{0}s\uff09 +Item.Injured.Wait=\u4f60\u6700\u8fd1\u53d7\u50b7\u4e86\u6240\u4ee5\u4f60\u5fc5\u9808\u7b49\u4e00\u6bb5\u6642\u9593\u624d\u80fd\u4f7f\u7528\u9019\u500b\u3002&e\uff08{0}s\uff09 +Item.FluxPickaxe.Name=\u707c\u71b1\u4e4b\u93ac +Item.FluxPickaxe.Lore.1=&7\u6709\u6a5f\u7387\u77ac\u9593\u51b6\u7149\u7926\u7269\u3002 +Item.FluxPickaxe.Lore.2=&7\u9700\u8981\u51b6\u7149\u7b49\u7d1a {0}+ +#TELEPORTATION +Teleport.Commencing=&7\u50b3\u9001\u5c07\u5728 &6\uff08{0}\uff09 &7\u79d2\u5f8c\u9032\u884c\uff0c\u8acb\u4fdd\u6301\u7ad9\u7acb\u4e0d\u52d5\u2026\u2026 +Teleport.Cancelled=&4\u50b3\u9001\u5df2\u53d6\u6d88 \uff01 +#SKILLS +Skills.Child=&6\uff08\u5206\u652f\u6280\u80fd\uff09 +Skills.Disarmed=&4\u4f60\u88ab\u7e73\u68b0\u4e86 \uff01 +Skills.Header=-----[] &a{0}&c []----- +Skills.NeedMore=&4\u4f60\u9700\u8981\u66f4\u591a &7{0} +Skills.NeedMore.Extra=&4\u4f60\u9700\u8981\u66f4\u591a &7{0}{1} +Skills.Parents=\u4e3b\u6280\u80fd +Skills.Stats={0}&a{1}&3 \u9ede\u7d93\u9a57\u503c \uff08&7{2}&3/&7{3}&3\uff09 Skills.ChildStats={0}&a{1} -Skills.TooTired=\u6b64\u6280\u80fd\u6b63\u8655\u65bc\u51b7\u537b\u6642\u9593. &e({0}s) -Skills.Cancelled={0} \u53d6\u6d88! -Skills.ConfirmOrCancel=&a\u518d\u6b21\u6309\u4e0b\u6ed1\u9f20\u53f3\u9375\u4f86\u78ba\u8a8d &6{0}&a. \u6ed1\u9f20\u5de6\u9375\u53d6\u6d88. +Skills.MaxXP=\u6700\u5927 +Skills.TooTired=\u4f60\u592a\u7d2f\u4e86\u66ab\u6642\u7121\u6cd5\u4f7f\u7528\u8a72\u6280\u80fd\u3002&\uff08{0}s\uff09 +Skills.TooTired.Named=&7\uff08&6{0}&e {1}s&7\uff09 +Skills.TooTired.Extra=&6{0} &e\u8d85\u80fd\u529b\u51b7\u537b - {1} +Skills.Cancelled=&6{0} &c\u5df2\u53d6\u6d88 \uff01 +Skills.ConfirmOrCancel=&a\u518d\u6b21\u9ede\u64ca\u53f3\u9375\u4ee5\u78ba\u5b9a &6{0}&a\uff0c\u9ede\u64ca\u5de6\u9375\u53d6\u6d88\u3002 +Skills.AbilityGateRequirementFail=&7\u4f60\u9700\u8981 &e{0}&7 \u7d1a\u4ee5\u4e0a\u7684 &3{1}&7 \u4f86\u4f7f\u7528\u9019\u500b\u80fd\u529b\u3002 +#STATISTICS Stats.Header.Combat=&6-=\u683c\u9b25\u6280\u80fd=- Stats.Header.Gathering=&6-=\u63a1\u96c6\u6280\u80fd=- -Stats.Header.Misc=&6-=\u96dc\u985e\u6280\u80fd=- -Stats.Own.Stats=&a[mcMMO] \u72c0\u614b -Perks.XP.Name=\u7d93\u9a57\u503c -Perks.XP.Desc=\u67d0\u6a23\u6280\u80fd\u7372\u5f97\u5927\u91cf\u7d93\u9a57\u503c. +Stats.Header.Misc=&6-=\u96dc\u9805\u6280\u80fd=- +Stats.Own.Stats=&a[mcMMO] \u7d71\u8a08\u8cc7\u8a0a +#PERKS +Perks.XP.Name=\u7d93\u9a57 +Perks.XP.Desc=\u5f9e\u6280\u80fd\u5b78\u7fd2\u4e2d\u7372\u5f97\u7d93\u9a57\u63d0\u5347 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=&6 ({0}\u5f88\u8d70\u904b) +Perks.Lucky.Desc=\u7d66\u4e88 {0} \u6280\u80fd\u548c\u80fd\u529b 33.3% \u7684\u66f4\u9ad8\u6a5f\u7387\u89f8\u767c +Perks.Lucky.Desc.Login=\u7d66\u4e88\u6280\u80fd\u548c\u80fd\u529b 33.3% \u5f97\u66f4\u9ad8\u6a5f\u7387\u89f8\u767c +Perks.Lucky.Bonus=&6\uff08{0} \u7684\u597d\u904b\u52a0\u6210\uff09 Perks.Cooldowns.Name=\u5feb\u901f\u56de\u5fa9 -Perks.Cooldowns.Desc=\u6e1b\u5c11\u51b7\u537b\u6642\u9593 {0} +Perks.Cooldowns.Desc=\u6e1b\u5c11\u51b7\u537b\u6642\u9593 {0}\u3002 Perks.ActivationTime.Name=\u8010\u529b -Perks.ActivationTime.Desc=\u63d0\u9ad8\u80fd\u529b \u6301\u7e8c\u6642\u9593: {0} \u79d2 -Perks.ActivationTime.Bonus=&6 ({0}\u8010\u4e45\u52a0\u4e58) -Hardcore.Mode.Disabled=&6[mcMMO] \u786c\u6d3e\u6a21\u5f0f {0} \u95dc\u9589. {1} -Hardcore.Mode.Enabled=&6[mcMMO] \u786c\u6d3e\u6a21\u5f0f {0} \u958b\u555f. {1} -Hardcore.DeathStatLoss.Name=\u6b7b\u4ea1\u6280\u80fd\u61f2\u7f70 -Hardcore.DeathStatLoss.PlayerDeath=&6[mcMMO] &4\u56e0\u70ba\u6b7b\u4ea1\u4f60\u5931\u53bb\u4e86&9{0}&4. -Hardcore.DeathStatLoss.PercentageChanged=&6[mcMMO] \u72c0\u614b\u907a\u5931\u7387\u8b8a\u66f4\u70ba {0}. +Perks.ActivationTime.Desc=\u63d0\u9ad8\u80fd\u529b\u958b\u555f\u6642\u9593 {0} \u79d2\u3002 +Perks.ActivationTime.Bonus=&6\uff08{0} \u79d2\u984d\u5916\u6301\u7e8c\u6642\u9593\uff09 +#HARDCORE +Hardcore.Mode.Disabled=&6[mcMMO] \u786c\u6838\u6a21\u5f0f {0} \u95dc\u9589\u3002{1} +Hardcore.Mode.Enabled=&6[mcMMO] \u786c\u6838\u6a21\u5f0f {0} \u958b\u555f\u3002{1} +Hardcore.DeathStatLoss.Name=\u6280\u80fd\u6b7b\u4ea1\u61f2\u7f70 +Hardcore.DeathStatLoss.PlayerDeath=&6[mcMMO] &4\u6b7b\u4ea1\uff0c\u4f60\u5931\u53bb\u4e86 &9{0}&4\u3002 +Hardcore.DeathStatLoss.PercentageChanged=&6[mcMMO] \u72c0\u614b\u907a\u5931\u7387\u8b8a\u66f4\u70ba {0}\u3002 Hardcore.Vampirism.Name=\u5438\u8840\u6a21\u5f0f -Hardcore.Vampirism.Killer.Failure=&6[mcMMO] &e{0}&7\u592a\u4e0d\u7d14\u719f\u4ee5\u81f3\u65bc\u7121\u6cd5\u8b93\u4f60\u7372\u5f97\u4efb\u4f55\u7684\u77e5\u8b58. -Hardcore.Vampirism.Killer.Success=&6[mcMMO] &3\u4f60\u5f9e&e{1}&3\u90a3\u5077\u53d6\u4e86&9{0}&3\u500b\u7b49\u7d1a . -Hardcore.Vampirism.Victim.Failure=&6[mcMMO] &e{0}&7\u7121\u6cd5\u5f9e\u4f60\u9019\u5077\u53d6\u4efb\u4f55\u7684\u77e5\u8b58! -Hardcore.Vampirism.Victim.Success=&6[mcMMO] &e{0}&4\u5f9e\u4f60\u9019\u5077\u53d6\u4e86&9{1}&4\u500b\u7b49\u7d1a! -Hardcore.Vampirism.PercentageChanged=&6[mcMMO] \u72c0\u614b\u5438\u6536\u7387\u8b8a\u66f4\u70ba {0}. -MOTD.Donate=&3\u8d0a\u52a9\u8cc7\u8a0a: -MOTD.Hardcore.Enabled=&6[mcMMO] &3\u786c\u6d3e\u6a21\u5f0f\u5df2\u555f\u7528: &4{0} -MOTD.Hardcore.DeathStatLoss.Stats=&6[mcMMO] &3\u6b7b\u4ea1\u6280\u80fd\u61f2\u7f70: &4{0}% -MOTD.Hardcore.Vampirism.Stats=&6[mcMMO] &3\u5438\u8840\u7372\u5f97\u72c0\u614b: &4{0}% -MOTD.PerksPrefix=[mcMMO \u984d\u5916\u734e\u52f5] -MOTD.Version=&6[mcMMO] \u6b63\u904b\u4f5c\u7684\u7248\u672c &3{0} -MOTD.Website=&6[mcMMO] &a{0}&e - mcMMO \u9996\u9801 -Smelting.Ability.FluxMining=\u6d41\u80fd\u6316\u7926\u6a5f\u7387: &e{0} -Smelting.Ability.FuelEfficiency=\u71c3\u71d2\u6548\u7387\u52a0\u4e58: &e{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: &e{0} -Smelting.Ability.VanillaXPBoost=\u4e00\u822c\u7d93\u9a57\u52a0\u4e58: &e{0}x +Hardcore.Vampirism.Killer.Failure=&6[mcMMO] &e{0}&7\u592a\u4e0d\u719f\u7df4\u6388\u4e88\u4f60\u7372\u5f97\u4efb\u4f55\u7684\u77e5\u8b58\u3002 +Hardcore.Vampirism.Killer.Success=&6[mcMMO] &3\u4f60\u5f9e&e{1}&3\u90a3\u5077\u53d6\u4e86 &9{0}&3 \u500b\u7b49\u7d1a\u3002 +Hardcore.Vampirism.Victim.Failure=&6[mcMMO] &e{0}&7\u7121\u6cd5\u5f9e\u4f60\u9019\u5077\u53d6\u4efb\u4f55\u7684\u77e5\u8b58 \uff01 +Hardcore.Vampirism.Victim.Success=&6[mcMMO] &e{0}&4\u5f9e\u4f60\u9019\u5077\u53d6\u4e86 &9{1}&4 \u500b\u7b49\u7d1a \uff01 +Hardcore.Vampirism.PercentageChanged=&6[mcMMO] \u72c0\u614b\u5438\u8840\u7387\u8b8a\u66f4\u70ba {0}\u3002 +#MOTD +MOTD.Donate=&3\u6350\u8d08\u8cc7\u8a0a \uff1a +MOTD.Hardcore.Enabled=&6[mcMMO] &3\u786c\u6838\u6a21\u5f0f\u5df2\u958b\u555f \uff1a &4{0} +MOTD.Hardcore.DeathStatLoss.Stats=&6[mcMMO] &3\u6280\u80fd\u6b7b\u4ea1\u61f2\u7f70 \uff1a &4{0}% +MOTD.Hardcore.Vampirism.Stats=&6[mcMMO] &3\u5438\u8840\u7d71\u8a08 \uff1a &4{0}% +MOTD.PerksPrefix=&6[mcMMO \u80fd\u529b] +MOTD.Version=&6[mcMMO] \u6b63\u5728\u904b\u884c\u7248\u672c &3{0} +MOTD.Website=&6[mcMMO] &a{0}&e -mcMMO \u7db2\u7ad9 +#SMELTING +Smelting.SubSkill.UnderstandingTheArt.Name=\u51b6\u7149\u7cbe\u901a +Smelting.SubSkill.UnderstandingTheArt.Description=\u4e5f\u8a31\u4f60\u82b1\u8cbb\u4e86\u592a\u591a\u6642\u9593\u5728\u6d1e\u7a74\u4e2d\u51b6\u7149\uff0c\n\u63d0\u5347\u51b6\u7149\u7684\u5404\u7a2e\u5c6c\u6027\u3002 +Smelting.SubSkill.UnderstandingTheArt.Stat=\u7d93\u9a57\u503c\u500d\u6578 \uff1a &e{0} \u500d +Smelting.Ability.Locked.0={0}+ \u7d1a\u5f8c\u89e3\u9396 \uff08\u66f4\u591a\u51b6\u7149\u7d93\u9a57\u503c\uff09 +Smelting.Ability.Locked.1={0}+ \u7d1a\u5f8c\u89e3\u9396 \uff08\u795d\u878d\u4e4b\u93ac\uff09 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=&a\u7926\u7269\u81ea\u52d5\u51b6\u7149! -Smelting.Listener=\u51b6\u7149: +Smelting.SubSkill.FuelEfficiency.Description=\u51b6\u7149\u6642\u63d0\u9ad8\u7194\u7210\u5167\u71c3\u6599\u7684\u71c3\u71d2\u6642\u9593 +Smelting.SubSkill.FuelEfficiency.Stat=\u71c3\u6599\u6548\u7387\u500d\u6578 \uff1a &e{0} \u500d +Smelting.SubSkill.SecondSmelt.Name=\u4e8c\u6b21\u51b6\u7149 +Smelting.SubSkill.SecondSmelt.Description=\u900f\u904e\u51b6\u7149\u7372\u5f97\u96d9\u500d\u8cc7\u6e90 +Smelting.SubSkill.SecondSmelt.Stat=\u4e8c\u6b21\u51b6\u7149\u89f8\u767c\u7684\u6a5f\u7387 +Smelting.Effect.4=\u66f4\u591a\u51b6\u7149\u7d93\u9a57\u503c +Smelting.Effect.5=\u63d0\u9ad8\u51b6\u7149\u7372\u5f97\u7684\u7d93\u9a57\u503c +Smelting.SubSkill.FluxMining.Name=\u795d\u878d\u4e4b\u93ac +Smelting.SubSkill.FluxMining.Description=\u6316\u7926\u6642\u4e00\u5b9a\u6a5f\u7387\u4f7f\u7926\u7269\u7acb\u5373\u88ab\u51b6\u7149 +Smelting.SubSkill.FluxMining.Stat=\u795d\u878d\u4e4b\u93ac\u767c\u52d5\u6a5f\u7387 +Smelting.Listener=\u51b6\u7149 \uff08Smelting\uff09 \uff1a 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=&d\u51b7\u537b\u6642\u9593 -Scoreboard.Misc.Overall=\u6574\u9ad4 -Recovery.Notice=\u6ce8\u610f: mcMMO&4\u7121\u6cd5\u8f09\u5165\u4f60\u7684\u8cc7\u6599.&c \u91cd\u8a665\u6b21... -Recovery.Success=&a\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&b\u904a\u6232\u7ba1\u7406\u54e1\n&e\u4f60\u53ef\u4ee5\u7e7c\u7e8c\u904a\u6232,\u4f46\u4f60&l\u7121\u6cd5\u5f97\u5230mcMMO\u7b49\u7d1a&e\u548c\u4efb\u4f55\u7d93\u9a57&l\u6240\u6709\u8cc7\u6599\u4e0d\u6703\u88ab\u5132\u5b58&e. -Recovery.AdminFailureNotice=&4[A]&cmcMMO\u7121\u6cd5\u8f09\u5165\u73a9\u5bb6&e{0}&c\u7684\u8cc7\u6599. &d\u8acb\u6aa2\u67e5\u4f60\u7684\u8cc7\u6599\u5eab\u6216\u8a2d\u5b9a. -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. +#COMMAND DESCRIPTIONS +Commands.Description.addlevels=\u7d66\u73a9\u5bb6\u589e\u52a0 mcMMO \u7b49\u7d1a +Commands.Description.adminchat=\u5207\u63db mcMMO \u7ba1\u7406\u54e1\u804a\u5929\u6216\u50b3\u9001\u7ba1\u7406\u54e1\u804a\u5929\u8cc7\u8a0a +Commands.Description.addxp=\u7d66\u73a9\u5bb6\u589e\u52a0 mcMMO \u7d93\u9a57 +Commands.Description.hardcore=\u4fee\u6539 mcMMO \u786c\u6838\u6a21\u5f0f\u767e\u5206\u6bd4\u6216\u5207\u63db\u786c\u6838\u6a21\u5f0f\u958b/\u95dc +Commands.Description.inspect=\u67e5\u770b\u73a9\u5bb6\u8a73\u7d30\u7684 mcMMO \u8cc7\u8a0a +Commands.Description.mcability=\u5207\u63db mcMMO \u6280\u80fd\u9ede\u64ca\u53f3\u9375\u958b\u555f \u958b/\u95dc +Commands.Description.mccooldown=\u67e5\u770b\u6240\u6709 mcMMO \u6280\u80fd\u51b7\u537b\u6642\u9593 +Commands.Description.mcchatspy=\u5207\u63db\u968a\u4f0d\u804a\u5929\u76e3\u8996\u958b/\u95dc +Commands.Description.mcgod=\u5207\u63db mcMMO \u4e0a\u5e1d\u6a21\u5f0f\u958b/\u95dc +Commands.Description.mchud=\u8b8a\u66f4\u4f60\u7684 mcMMO HUD \u6a23\u5f0f +Commands.Description.mcmmo=\u986f\u793a mcMMO \u7684\u7c21\u55ae\u63cf\u8ff0 +Commands.Description.mcnotify=\u5207\u63db mcMMO \u6280\u80fd\u63d0\u9192\u958b\u95dc +Commands.Description.mcpurge=\u6e05\u9664\u6c92\u6709 mcMMO \u7b49\u7d1a\u7684\u73a9\u5bb6\u548c\u8d85\u904e {0} \u500b\u6708\u6c92\u6709\u767b\u5165\u7684\u73a9\u5bb6\u7684 mcMMO \u8cc7\u6599 +Commands.Description.mcrank=\u986f\u793a\u73a9\u5bb6\u7684 mcMMO \u6392\u540d +Commands.Description.mcrefresh=\u91cd\u65b0\u6574\u7406\u6240\u6709\u7684 mcMMO \u51b7\u537b\u6642\u9593 +Commands.Description.mcremove=\u5f9e mcMMO \u8cc7\u6599\u5eab\u4e2d\u79fb\u9664\u73a9\u5bb6 +Commands.Description.mcscoreboard=\u7ba1\u7406\u4f60\u7684 mcMMO \u8a08\u5206\u677f +Commands.Description.mcstats=\u986f\u793a\u4f60\u7684 mcMMO \u7b49\u7d1a\u548c\u7d93\u9a57 +Commands.Description.mctop=\u986f\u793a mcMMO \u6392\u540d\u699c +Commands.Description.mmoedit=\u7de8\u8f2f\u7528\u6236\u7684 mcMMO \u7684\u7b49\u7d1a +Commands.Description.mmodebug=\u5207\u63db\u9664\u932f\u6a21\u5f0f\uff0c\u9ede\u64ca\u65b9\u584a\u8f38\u51fa\u5be6\u7528\u7684\u8cc7\u8a0a +Commands.Description.mmoupdate=\u5f9e\u820a\u7684 mcMMO \u8cc7\u6599\u5eab\u9077\u79fb\u5230\u76ee\u524d\u8cc7\u6599\u5eab\u5167 +Commands.Description.mcconvert=\u8f49\u63db\u8cc7\u6599\u5eab\u7684\u985e\u578b\u6216\u7d93\u9a57\u503c\u516c\u5f0f\u7684\u985e\u578b +Commands.Description.mmoshowdb=\u986f\u793a\u76ee\u524d\u8cc7\u6599\u5eab\u985e\u578b\u540d\u7a31 \uff08\u820a\u7248\u672c\u4f7f\u7528 /mmoupdate\uff09 +Commands.Description.party=\u63a7\u5236\u5404\u7a2e mcMMO \u968a\u4f0d\u8a2d\u5b9a +Commands.Description.partychat=\u5207\u63db mcMMO \u968a\u4f0d\u804a\u5929\u6216\u50b3\u9001\u968a\u4f0d\u804a\u5929\u8a0a\u606f +Commands.Description.ptp=\u50b3\u9001\u81f3 mcMMO \u968a\u4f0d\u6210\u54e1 +Commands.Description.Skill=\u986f\u793a {0} \u8a73\u7d30\u7684 mcMMO \u6280\u80fd\u8cc7\u8a0a +Commands.Description.skillreset=\u91cd\u8a2d mcMMO \u7b49\u7d1a +Commands.Description.vampirism=\u66f4\u6539 mcMMO \u69a8\u53d6\u767e\u5206\u6bd4 \u6216\u5207\u63db\u5438\u8840\u6a21\u5f0f\u958b/\u95dc +Commands.Description.xplock=\u9396\u5b9a\u6307\u5b9a mcMMO \u6280\u80fd\u7684\u7d93\u9a57\u689d +Commands.Description.xprate=\u66f4\u6539 mcMMO \u7d93\u9a57\u500d\u7387\u6216\u958b\u555f mcMMO \u7d93\u9a57\u7ffb\u500d\u4e8b\u4ef6 +#UPDATE CHECKER +UpdateChecker.Outdated=\u4f60\u6b63\u5728\u4f7f\u7528\u9019\u820a\u7248\u672c\u7684 mcMMO \uff01 +UpdateChecker.NewAvailable=Spigot \u4e0a\u6709\u65b0\u7248\u672c\u3002 +#SCOREBOARD HEADERS +Scoreboard.Header.PlayerStats=&emcMMO \u7d71\u8a08 +Scoreboard.Header.PlayerCooldowns=&emcMMO \u51b7\u537b +Scoreboard.Header.PlayerRank=&emcMMO \u6392\u540d +Scoreboard.Header.PlayerInspect=&emcMMO \u7d71\u8a08 \uff1a {0} +Scoreboard.Header.PowerLevel=&c\u6230\u9b25\u529b +Scoreboard.Misc.PowerLevel=&6\u6230\u9b25\u529b +Scoreboard.Misc.Level=&3\u7b49\u7d1a +Scoreboard.Misc.CurrentXP=&a\u76ee\u524d\u7d93\u9a57 +Scoreboard.Misc.RemainingXP=&e\u5347\u7d1a\u6240\u9700\u7d93\u9a57 +Scoreboard.Misc.Cooldown=&d\u51b7\u537b +Scoreboard.Misc.Overall=&6\u7e3d\u9ad4 +Scoreboard.Misc.Ability=\u80fd\u529b +#DATABASE RECOVERY +Profile.PendingLoad=&c\u4f60\u7684 mcMMO \u73a9\u5bb6\u8cc7\u6599\u672a\u8f09\u5165\u3002 +Profile.Loading.Success=&a\u4f60\u7684 mcMMO \u8cc7\u6599\u5df2\u8f09\u5165\u3002 +Profile.Loading.FailurePlayer=&cmcMMO \u7121\u6cd5\u8f09\u5165\u4f60\u7684\u8cc7\u6599\uff0c\u8acb\u806f\u7e6b&b\u4f3a\u670d\u5668\u7ba1\u7406\u54e1\u56de\u994b\u4f60\u7684\u554f\u984c\u3002\n&e\u4f60\u53ef\u4ee5\u7e7c\u7e8c\u5728\u4f3a\u670d\u5668\u904a\u73a9\uff0c\u4f46\u662f\u4f60&l\u6c92\u6709 mcMMO \u7b49\u7d1a&e\u4e26\u4e14\u4f60\u7372\u5f97\u7684\u4efb\u4f55\u7d93\u9a57\u90fd&l\u4e0d\u6703\u88ab\u5132\u5b58&e\u3002 +Profile.Loading.FailureNotice=&4[A]&c mcMMO \u7121\u6cd5\u8f09\u5165\u73a9\u5bb6 &e{0}&c \u7684\u8cc7\u6599\u3002&d\u8acb\u6aa2\u67e5\u4f60\u7684\u8cc7\u6599\u5eab\uff0c\u5230\u76ee\u524d\u70ba\u6b62\u7684\u5617\u8a66 {1}\u3002 +#Holiday +Holiday.AprilFools.Levelup=&6{0} \u73fe\u5728 &a{1}&6 \u7d1a \uff01 +Holiday.Anniversary=&9mcMMO {0} \u9031\u5e74\u5feb\u6a02 \uff01 \n&9\u70ba\u4e86\u7d00\u5ff5 nossr50 \u548c\u6240\u6709\u958b\u767c\u8005\u7684\u5de5\u4f5c\uff0c\u9019\u88e1\u6709\u4e00\u5834\u7159\u706b\u8868\u6f14 \uff01 +#Reminder Messages +Reminder.Squelched=&7\u63d0\u9192 \uff1a \u4f60\u73fe\u5728\u4e0d\u518d\u63a5\u6536\u4f86\u81ea mcMMO \u7684\u901a\u77e5\u8a0a\u606f\uff0c\u5982\u60f3\u958b\u555f\u8acb\u518d\u6b21\u4f7f\u7528 /mcnotify \u6307\u4ee4\uff0c\u6bcf\u5c0f\u6642\u63d0\u9192\u4e00\u6b21\u3002 +#Locale +Locale.Reloaded=&a\u8a9e\u8a00\u914d\u7f6e\u5df2\u7d93\u91cd\u65b0\u8f09\u5165\uff0c\u4e2d\u6587\u5316\u91cd\u7de8 \uff1a Flandre_tw\uff0c\u539f\u4f5c\u70ba\u7c21\u9ad4\u4e2d\u6587 \uff08\u6709\u554f\u984c\u8acb\u806f\u7d61 Discord \u862d\u862d\u9732#4885\uff09 +#Player Leveling Stuff +LevelCap.PowerLevel=&6\uff08&amcMMO&6\uff09 &e\u4f60\u5df2\u7d93\u5230\u9054\u4e86\u6230\u9b25\u529b\u7684\u7b49\u7d1a\u5c01\u9802 &c{0}&e \u7d1a\uff0c\u4f60\u7684\u8a72\u6280\u80fd\u5c07\u7121\u6cd5\u518d\u5347\u7d1a\u3002 +LevelCap.Skill=&6\uff08&amcMMO&6\uff09 &e\u4f60\u5df2\u7d93\u5230\u9054\u4e86&6{1}&e\u6280\u80fd\u7684\u7b49\u7d1a\u5c01\u9802 &c{0}&e \u7d1a\uff0c\u4f60\u7684\u8a72\u6280\u80fd\u5c07\u7121\u6cd5\u518d\u5347\u7d1a\u3002 +Commands.XPBar.Usage=\u6b63\u78ba\u7684\u7528\u6cd5\u662f /mmoxpbar +Commands.Description.mmoxpbar=mcMMO \u7d93\u9a57\u689d\u7684\u73a9\u5bb6\u8a2d\u5b9a +Commands.Description.mmocompat=\u6709\u95dc mcMMO \u4ee5\u53ca\u5b83\u662f\u5426\u8655\u65bc\u76f8\u5bb9\u6a21\u5f0f\u6216\u529f\u80fd\u9f4a\u5168\u7684\u8cc7\u8a0a\u3002 +Compatibility.Layer.Unsupported=&6\u6b64\u7248\u672c\u7684 Minecraft \u4e0d\u652f\u6301 &a{0}&6 \u7684\u76f8\u5bb9\u6027\u3002 +Compatibility.Layer.PartialSupport=&6\u76f8\u5bb9\u6027 &a{0}&6 \u9019\u500b\u7248\u672c\u7684 Minecraft \u4e26\u4e0d\u5b8c\u5168\u652f\u63f4\uff0c\u4f46\u662f mcMMO \u6b63\u5728\u904b\u884c\u4e00\u500b\u8f14\u52a9\u7cfb\u7d71\u4f86\u6a21\u64ec\u4e00\u4e9b\u7f3a\u5931\u7684\u529f\u80fd\u3002 +Commands.XPBar.DisableAll=&6\u6240\u6709 mcMMO \u7d93\u9a57\u6b04\u73fe\u5728\u90fd\u88ab\u95dc\u9589\uff0c\u4f7f\u7528 /mmoxpbar reset \u56de\u5fa9\u9810\u8a2d\u8a2d\u5b9a\u3002 +#Modern Chat Settings +Chat.Style.Admin=&b\uff08A\uff09 &r{0} &b\u2192 &r{1} +Chat.Style.Party=&a\uff08P\uff09 &r{0} &a\u2192 &r{1} +Chat.Style.Party.Leader=&a\uff08P\uff09 &r{0} &6\u2192 &r{1} +Chat.Identity.Console=&6* \u63a7\u5236\u53f0 * +Chat.Channel.On=&6\uff08&amcMMO -\u804a\u5929&6\uff09 &e\u4f60\u7684\u804a\u5929\u8a0a\u606f\u73fe\u5728\u5c07\u81ea\u52d5\u50b3\u9001\u5230 &a{0}&e \u804a\u5929\u983b\u9053\u3002 +Chat.Channel.Off=&6\uff08&amcMMO -\u804a\u5929&6\uff09 &7\u4f60\u7684\u804a\u5929\u8a0a\u606f\u5c07\u4e0d\u518d\u81ea\u52d5\u50b3\u9001\u5230\u7279\u5b9a\u7684\u804a\u5929\u983b\u9053\u3002 +Chat.Spy.Party=&6[&eSPY&6-&a{2}&6] &r{0} &b\u2192 &r{1} +Broadcasts.LevelUpMilestone=&6\uff08&amcMMO&6\uff09 {0}&7 \u5728&3{2}&7 \u5df2\u7d93\u9054\u5230\u4e86 &a{1}&7 \u7d1a \uff01 +Broadcasts.PowerLevelUpMilestone=&6\uff08&amcMMO&6\uff09 {0}&7 \u5df2\u7d93\u9054\u5230 &a{1}&7 \u7684\u6700\u9ad8\u7b49\u7d1a \uff01 +Scoreboard.Recovery=\u6b63\u5728\u5617\u8a66\u56de\u5fa9 mcMMO \u8a08\u5206\u677f\u2026\u2026 From b42278932e4fe4347c71edd967188dd1d6620a05 Mon Sep 17 00:00:00 2001 From: David Date: Tue, 10 Aug 2021 18:15:56 -0300 Subject: [PATCH 590/662] Update locale_pt_BR.properties (#4566) --- src/main/resources/locale/locale_pt_BR.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/locale/locale_pt_BR.properties b/src/main/resources/locale/locale_pt_BR.properties index ee0481ee2..429955868 100644 --- a/src/main/resources/locale/locale_pt_BR.properties +++ b/src/main/resources/locale/locale_pt_BR.properties @@ -1168,4 +1168,4 @@ Chat.Channel.Off=&6(&amcMMO-Chat&6) &7Suas mensagens digitadas n\u00e3o ser\u00e Chat.Spy.Party=&6[&eESPI\u00c3O&6-&a{2}&6] &r{0} &b\u2192 &r{1} Broadcasts.LevelUpMilestone=&6(&amcMMO&6) {0}&7 chegou no n\u00edvel &a{1}&7 em &3{2}&7! Broadcasts.PowerLevelUpMilestone=&6(&amcMMO&6) {0}&7 chegou no N\u00edvel de Poder &a{1}&7! -Scoreboard.Recovery=Tentando recuperar o scoreboard do mcMMO... \ No newline at end of file +Scoreboard.Recovery=Tentando recuperar o scoreboard do mcMMO... From 264c0e2c78170a306781996552f9b7eb4c6bb560 Mon Sep 17 00:00:00 2001 From: Griffin Kubesa Date: Tue, 10 Aug 2021 16:17:37 -0500 Subject: [PATCH 591/662] Add / keep (#4512) * Add / keep * Add keep to tab completion * Case insensitive --- .../nossr50/commands/skills/SkillCommand.java | 26 ++++++++++++++----- 1 file changed, 19 insertions(+), 7 deletions(-) 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 6e2926062..df3f8a8a4 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/SkillCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/SkillCommand.java @@ -59,18 +59,17 @@ 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; } if (args.length == 0) { - Player player = (Player) sender; - McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); - boolean isLucky = Permissions.lucky(player, skill); - boolean hasEndurance = (PerksUtils.handleActivationPerks(player, 0, 0) != 0); + 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 @@ -116,8 +115,21 @@ public abstract class SkillCommand implements TabExecutor { 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; + } + + ScoreboardManager.enablePlayerSkillScoreboard(player, skill); + ScoreboardManager.keepBoard(sender.getName()); + sender.sendMessage(LocaleLoader.getString("Commands.Scoreboard.Keep")); return true; } + return skillGuideCommand.onCommand(sender, command, label, args); } @@ -211,7 +223,7 @@ public abstract class SkillCommand implements TabExecutor { @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("?", "keep"); } return ImmutableList.of(); } From cd937a812d38158903ab57055bf27769e462e193 Mon Sep 17 00:00:00 2001 From: emanondev <38587650+emanondev@users.noreply.github.com> Date: Tue, 10 Aug 2021 23:19:18 +0200 Subject: [PATCH 592/662] Fix for impact armor damage formula (#4425) * Update SkillUtils.java Add handleArmorDurabilityChange() to handle armor damage reduction correctly * Update AxesManager.java Changed method to handle impact damage calculation * Update SkillUtils.java --- .../nossr50/skills/axes/AxesManager.java | 2 +- .../gmail/nossr50/util/skills/SkillUtils.java | 24 +++++++++++++++++-- 2 files changed, 23 insertions(+), 3 deletions(-) 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 6f2bbe08c..8f28f6ac8 100644 --- a/src/main/java/com/gmail/nossr50/skills/axes/AxesManager.java +++ b/src/main/java/com/gmail/nossr50/skills/axes/AxesManager.java @@ -120,7 +120,7 @@ public class AxesManager extends SkillManager { for (ItemStack armor : target.getEquipment().getArmorContents()) { if (armor != null && ItemUtils.isArmor(armor)) { if (RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_STATIC_CHANCE, SubSkillType.AXES_ARMOR_IMPACT, getPlayer())) { - SkillUtils.handleDurabilityChange(armor, durabilityDamage, 1); + SkillUtils.handleArmorDurabilityChange(armor, durabilityDamage, 1); } } } 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 cdff05e8f..9c9e962c5 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/SkillUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/SkillUtils.java @@ -236,14 +236,14 @@ public final 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,6 +263,26 @@ public final 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; + } + + 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) { From af6e6b9545b5730b35c31621abc189d6ab98c65b Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 10 Aug 2021 14:21:16 -0700 Subject: [PATCH 593/662] Update changelog --- Changelog.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Changelog.txt b/Changelog.txt index f54367eb3..ebcbe8ded 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -5,6 +5,12 @@ Version 2.1.201 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 From 6cad4993ed27d2d7940e37e11953534d825423de Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 10 Aug 2021 14:42:08 -0700 Subject: [PATCH 594/662] Tweaked Rupture's visual/audio effect --- Changelog.txt | 1 + .../runnables/skills/AbilityDisableTask.java | 2 +- .../util/skills/ParticleEffectUtils.java | 51 +++++++++++-------- 3 files changed, 31 insertions(+), 23 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index ebcbe8ded..6db871266 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,4 +1,5 @@ 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 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 e8cd9f70b..2c4f5d1cc 100644 --- a/src/main/java/com/gmail/nossr50/runnables/skills/AbilityDisableTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/skills/AbilityDisableTask.java @@ -53,7 +53,7 @@ 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()); 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 a70f09471..48265d03f 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/ParticleEffectUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/ParticleEffectUtils.java @@ -12,6 +12,7 @@ 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 { @@ -23,11 +24,15 @@ public final class ParticleEffectUtils { SoundManager.worldSendSoundMaxPitch(world, location, SoundType.POP); } - public static void playBleedEffect(LivingEntity livingEntity) { + public static void playBleedEffect(@NotNull LivingEntity livingEntity) { if (!mcMMO.p.getGeneralConfig().getBleedEffectEnabled()) { return; } + 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(); @@ -37,31 +42,33 @@ public final class ParticleEffectUtils { double offSetVal = 0.3D; - Location locA = new Location(world, x - offSetVal, y, z); - Location locB = new Location(world, x + offSetVal, y, z); - Location locC = new Location(world, x, y + offSetVal, z); - Location locD = new Location(world, x, y - offSetVal, z); - Location locE = new Location(world, x, y, z + offSetVal); - Location locF = new Location(world, x, y, z - offSetVal); + switch(RandomUtils.nextInt(10)) { - Location locG = new Location(world, x + offSetVal, y, z + offSetVal); - Location locH = new Location(world, x - offSetVal, y, z - offSetVal); - Location locI = new Location(world, x - offSetVal, y - offSetVal, z - offSetVal); - Location locJ = new Location(world, x + offSetVal, y - offSetVal, z + offSetVal); - Location locK = new Location(world, x - offSetVal, y + offSetVal, z - offSetVal); - Location locL = new Location(world, x - offSetVal, y + offSetVal, z - offSetVal); - - Location[] particleLocations = new Location[]{ locA, locB, locC, locD, locE, locF, locG, locH, locI, locJ, locK, locL}; - - for(Location location : particleLocations) { - if(RandomUtils.nextInt(100) > 30) { - //TODO: Change - livingEntity.getWorld().playEffect(location, Effect.STEP_SOUND, Material.REDSTONE_WIRE); - } + 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 (!mcMMO.p.getGeneralConfig().getDodgeEffectEnabled()) { return; From da3909c08fbd0fc90d2c412320daef879aa75aed Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 10 Aug 2021 14:44:13 -0700 Subject: [PATCH 595/662] 2.1.201 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 2b560b2c3..ed52b3e7c 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.201-SNAPSHOT + 2.1.201 mcMMO https://github.com/mcMMO-Dev/mcMMO From 88dae5d5dd6c8f5543d0d7c7afa897dc6b642135 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 10 Aug 2021 14:59:13 -0700 Subject: [PATCH 596/662] dev mode ( 2.1.202 ) --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index ed52b3e7c..8f167b8d6 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.201 + 2.1.202-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO From 5575309b7914137b95223a920d347179bb258dd8 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sun, 15 Aug 2021 21:59:38 -0700 Subject: [PATCH 597/662] Add amethyst block to experience.yml for Mining --- Changelog.txt | 3 +++ src/main/resources/experience.yml | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index 6db871266..f3f3c9a77 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,6 @@ +Version 2.1.202 + Added Amethyst_Block to experience.yml for Mining + 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) diff --git a/src/main/resources/experience.yml b/src/main/resources/experience.yml index 8f2637f08..152e4f404 100644 --- a/src/main/resources/experience.yml +++ b/src/main/resources/experience.yml @@ -394,7 +394,7 @@ Experience_Values: Cobbled_Deepslate: 15 Calcite: 400 Smooth_Basalt: 300 - Block_Of_Amethyst: 500 + Amethyst_Block: 500 Budding_Amethyst: 400 Small_Amethyst_Bud: 10 Medium_Amethyst_Bud: 20 From 1e43e34547876c7a361a76cfb4ba5f218dbd3cfb Mon Sep 17 00:00:00 2001 From: Warrior <50800980+Warriorrrr@users.noreply.github.com> Date: Wed, 22 Sep 2021 23:59:39 +0200 Subject: [PATCH 598/662] Make /party kick case insensitive (#4630) --- src/main/java/com/gmail/nossr50/datatypes/party/Party.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 fe7b9cb91..40c684234 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/party/Party.java +++ b/src/main/java/com/gmail/nossr50/datatypes/party/Party.java @@ -327,7 +327,7 @@ public class Party { } public boolean hasMember(String memberName) { - return this.getMembers().containsValue(memberName); + return this.getMembers().values().stream().anyMatch(memberName::equalsIgnoreCase); } public boolean hasMember(UUID uuid) { From 8e5251ba666be1aa6eb0d527f417dbe142bde4c6 Mon Sep 17 00:00:00 2001 From: GhostDC Date: Thu, 23 Sep 2021 06:00:03 +0800 Subject: [PATCH 599/662] update locale_zh_CN.properties (#4628) --- .../resources/locale/locale_zh_CN.properties | 108 +++++++++--------- 1 file changed, 54 insertions(+), 54 deletions(-) diff --git a/src/main/resources/locale/locale_zh_CN.properties b/src/main/resources/locale/locale_zh_CN.properties index 2d3c04c23..13ef26c48 100644 --- a/src/main/resources/locale/locale_zh_CN.properties +++ b/src/main/resources/locale/locale_zh_CN.properties @@ -1,4 +1,4 @@ -#作者:我正计划统一mcmmo的本地化文件,请暂时原谅本地文件现在如此混乱 +#作者:我正计划统一mcMMO的本地化文件,请暂时原谅本地文件现在如此混乱 #不要在JSON关键字中使用颜色代码 #如果你想修改颜色请在advanced.yml中修改 @@ -102,8 +102,8 @@ Overhaul.Name.Woodcutting=\u4f10\u6728 Commands.mcc.Header=&c---[]&amcMMO \u547d\u4ee4&c[]--- Commands.Other=&c---[]&a\u5176\u4ed6\u547d\u4ee4&c[]--- Commands.Party.Header=&c-----[]&a\u961f\u4f0d&c[]----- -Commands.Party.Features.Header=&c-----[]&aFEATURES&c[]----- -# 经验条可以使用下面的变量 -- {0} = 技能等级, {1} 目前的经验, {2} 到下一等级所需的经验, {3} 技能等级, {4} 当前等级的百分比 +Commands.Party.Features.Header=&c-----[]&a\u7279\u6027&c[]----- +# 经验条可以使用下面的变量 -- {0} = 技能等级, {1} 当前经验, {2} 到下一等级所需的经验, {3} 技能等级, {4} 当前等级的百分比 # 如果你想让玩家每次获得经验的时候显示经验条则确保选项 Experience_Bars.ThisMayCauseLag.AlwaysUpdateTitlesWhenXPIsGained 处于打开状态 XPBar.Template={0} XPBar.Template.EarlyGameBoost=&6\u6b63\u5728\u5b66\u4e60\u65b0\u6280\u80fd... @@ -122,9 +122,9 @@ XPBar.Swords=\u5251\u672f Lv.&6{0} XPBar.Taming=\u9a6f\u517d Lv.&6{0} XPBar.Unarmed=\u683c\u6597 Lv.&6{0} XPBar.Woodcutting=\u4f10\u6728 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 +#这只是一个预设模板,如果在 Experience.yml 中打开了“ExtraDetails”设置(默认情况下关闭),则可以使用该模板,您可以忽略此模板,只需编辑上面的字符串 XPBar.Complex.Template={0} &3 {4}&f% &3(&f{1}&3/&f{2}&3) -# 经验条可以使用以下变量 -- {0} = 技能等级, {1} 当前经验, {2} 到下一级所需经验, {3} Power Level, {4} Percentage of Level +# 经验条可以使用以下变量 -- {0} = 技能等级, {1} 当前经验, {2} 到下一等级所需的经验, {3} 技能等级, {4} 当前等级的百分比 # 如果你想让玩家每次获得经验的时候显示经验条则确保选项 Experience_Bars.ThisMayCauseLag.AlwaysUpdateTitlesWhenXPIsGained 处于打开状态 # 风格化结束 @@ -138,7 +138,7 @@ 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: &e{0} Acrobatics.SubSkill.Roll.GraceChance=\u4f18\u96c5\u7684\u7ffb\u6eda\u51e0\u7387: &e{0} -Acrobatics.SubSkill.Roll.Mechanics=&7\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 &e{0}%&7 \u7684\u51e0\u7387\u83b7\u5f97\u51cf\u4f24\u6216\u514d\u4f24, \u5982\u679c\u4f60\u6fc0\u6d3b\u4f18\u96c5\u7684\u7ffb\u6eda\u5219\u6709 &e{1}%&7 \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 &e{2}&7 \u7ea7, \u6bcf\u4e00\u7ea7\u7684\u6742\u6280\u7b49\u7ea7\u63d0\u4f9b &e{3}%&7 \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 &c{4}&7 \u4f24\u5bb3. \u4f18\u96c5\u7ffb\u6eda\u6700\u591a\u51cf\u4f24 &a{5}&7 \u4f24\u5bb3. +Acrobatics.SubSkill.Roll.Mechanics=&7\u7ffb\u6eda\u662f\u6742\u6280\u7684\u88ab\u52a8\u5b50\u6280\u80fd.\n\u5f53\u4f60\u53d7\u5230\u6454\u843d\u4f24\u5bb3\u65f6,\u4f1a\u6839\u636e\u4f60\u7684\u6742\u6280\u6280\u80fd\u7b49\u7ea7\u83b7\u5f97\u4e00\u5b9a\u51e0\u7387\u7684\u51cf\u4f24\u6216\u514d\u4f24, \u5728\u4f6050\u7ea7\u65f6\u4f60\u6709 &e{0}%&7 \u7684\u51e0\u7387\u83b7\u5f97\u51cf\u4f24\u6216\u514d\u4f24, \u5982\u679c\u4f60\u6fc0\u6d3b\u4f18\u96c5\u7684\u7ffb\u6eda\u5219\u6709 &e{1}%&7 \u7684\u51e0\u7387\u89e6\u53d1\u53cc\u500d\u7ffb\u6eda\u6548\u679c\uff0c.\n\u89e6\u53d1\u7684\u51e0\u7387\u4f1a\u6309\u7167\u4f60\u6280\u80fd\u7b49\u7ea7\u7ebf\u6027\u589e\u957f,\u76f4\u5230 &e{2}&7 \u7ea7, \u6bcf\u4e00\u7ea7\u7684\u6742\u6280\u7b49\u7ea7\u63d0\u4f9b &e{3}%&7 \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\u5c11 &c{4}&7 \u4f24\u5bb3. \u4f18\u96c5\u7ffb\u6eda\u6700\u591a\u51cf\u5c11 &a{5}&7 \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 @@ -216,7 +216,7 @@ Axes.Skills.SS.Other.On=&a{0}&2\u4f7f\u7528\u4e86 &c\u65a9\u9996\u8005! Excavation.Ability.Lower=&7\u4f60\u653e\u4e0b\u4e86\u4f60\u7684\u94f2\u5b50. Excavation.Ability.Ready=&3\u4f60 &6\u63e1\u7d27&3 \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.Description=\u4e09\u500d\u6389\u843d, \u4e09\u500d\u7ecf\u9a8c, \u6316\u6398\u901f\u5ea6\u63d0\u5347 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! @@ -241,7 +241,7 @@ Fishing.Ability.Locked.2=\u9501\u5b9a\u72b6\u6001,\u76f4\u5230 {0}+ \u6280\u80fd 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: &a{0}&3/&a{1} -Fishing.SubSkill.TreasureHunter.Stat.Extra=\u6389\u843d\u7387: &7\u4e00\u822c: &e{0} &a\u666e\u901a: &e{1}\n&9\u7a00\u6709: &e{2} &d\u7f55\u89c1: &e{3} &6\u53f2\u8bd7: &e{4} &bMythic: &e{5} +Fishing.SubSkill.TreasureHunter.Stat.Extra=\u6389\u843d\u7387: &7\u4e00\u822c: &e{0} &a\u666e\u901a: &e{1}\n&9\u7a00\u6709: &e{2} &d\u7f55\u89c1: &e{3} &6\u53f2\u8bd7: &e{4} &b\u795e\u8bdd: &e{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 @@ -252,9 +252,9 @@ 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:&a \u7b49\u7ea7 {0} Fishing.SubSkill.MasterAngler.Name=\u9493\u9c7c\u5927\u5e08 -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.MasterAngler.Description=\u9493\u9c7c\u7684\u6548\u7387\u63d0\u5347\u002c\u5982\u679c\u5728\u8239\u4e0a\u9493\u9c7c\u6548\u679c\u4f1a\u66f4\u597d +Fishing.SubSkill.MasterAngler.Stat=\u9493\u9c7c\u7684\u6700\u77ed\u7b49\u5f85\u65f6\u95f4\u51cf\u5c11: &a{0} \u79d2 +Fishing.SubSkill.MasterAngler.Stat.Extra=\u9493\u9c7c\u6700\u957f\u7b49\u5f85\u65f6\u95f4\u51cf\u5c11: &a{0} \u79d2 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 @@ -265,7 +265,7 @@ Fishing.Ability.TH.Boom=&7\u7e41\u8363\u65f6\u671f!!! Fishing.Ability.TH.Poison=&7\u6709\u4ec0\u4e48\u4e1c\u897f\u95fb\u7740\u4e0d\u592a\u5bf9\u52b2... Fishing.SkillName=\u9493\u9c7c #草药学 -Herbalism.Ability.GTe.NeedMore=\u4f60\u9700\u8981\u66f4\u591a\u79cd\u5b50\u4f7f\u7528\u7eff\u62c7\u6307. +Herbalism.Ability.GTe.NeedMore=\u4f60\u9700\u8981\u66f4\u591a\u79cd\u5b50\u4f7f\u7528\u56ed\u827a\u5927\u5e08. Herbalism.Ability.GTh.Fail=**\u7eff\u5316\u5931\u8d25** Herbalism.Ability.GTh=&a**\u7eff\u5316** Herbalism.Ability.Lower=&7\u4f60\u653e\u4e0b\u4e86\u4f60\u7684\u9504\u5934. @@ -274,10 +274,10 @@ 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.Name=\u56ed\u827a\u5927\u5e08 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: &a \u4f5c\u7269\u751f\u957f\u5728\u7b2c {0} \u9636\u6bb5 +Herbalism.SubSkill.GreenThumb.Stat=\u56ed\u827a\u5927\u5e08\u89e6\u53d1\u51e0\u7387 +Herbalism.SubSkill.GreenThumb.Stat.Extra=\u56ed\u827a\u5927\u5e08\u9636\u6bb5: &a \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 @@ -307,7 +307,7 @@ Mining.Ability.Locked.2=\u9501\u5b9a\u76f4\u5230 {0}+ \u6280\u80fd (\u7206\u7834 Mining.Ability.Lower=&7\u4f60\u653e\u4e0b\u4e86\u4f60\u7684\u9550\u5b50. Mining.Ability.Ready=&3\u4f60 &6\u62ff\u8d77&3 \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.Description=\u4e09\u500d\u6389\u843d, \u6316\u77ff\u901f\u5ea6\u63d0\u5347 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 @@ -332,7 +332,7 @@ Mining.Skills.SuperBreaker.Refresh=&a\u4f60\u7684 &e\u8d85\u7ea7\u788e\u77f3\u67 #爆破挖矿 Mining.Blast.Boom=&7**\u5623** Mining.Blast.Cooldown= -Mining.Blast.Effect=+{0} \u77ff\u7269\u91cf, {1}x \u6389\u843d +Mining.Blast.Effect=\u589e\u52a0 {0} \u77ff\u7269\u91cf, {1} \u500d\u6389\u843d Mining.Blast.Other.On=&a{0}&2 \u4f7f\u7528\u4e86 &c\u7206\u7834\u5f00\u91c7! Mining.Blast.Refresh=&a\u4f60\u7684 &e\u7206\u7834\u5f00\u91c7 &a\u6280\u80fd\u53ef\u4ee5\u4f7f\u7528\u4e86! #修理 @@ -377,9 +377,9 @@ Repair.Arcane.Perfect=&a\u4f60\u6210\u529f\u5730\u4fdd\u7559\u4e86\u8fd9\u4ef6\u #分解 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.UnderstandingTheArt.Description=\u4f60\u4e0d\u4ec5\u4ec5\u662f\u5728\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.Description=\u4ece\u7269\u54c1\u4e2d\u5206\u89e3\u51fa\u6750\u6599, \u80fd\u5426\u5b8c\u7f8e\u5206\u89e3\u53d6\u51b3\u4e8e\u6280\u80fd\u7b49\u7ea7\u548c\u8fd0\u6c14. Salvage.SubSkill.ScrapCollector.Stat=\u5e9f\u6599\u56de\u6536: &a\u6700\u591a\u5206\u89e3\u51fa &e{0}&a \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 @@ -492,7 +492,7 @@ Taming.Summon.COTW.TimeExpired=&a(\u91ce\u6027\u7684\u53ec\u5524) &7\u65f6\u95f4 Taming.Summon.COTW.Removed=&a(\u91ce\u6027\u7684\u53ec\u5524) &7\u4f60\u53ec\u5524\u7684 &6{0}&7 \u5df2\u7ecf\u4ece\u8fd9\u4e2a\u4e16\u754c\u4e0a\u6d88\u5931\u4e86. Taming.Summon.COTW.BreedingDisallowed=&a(\u91ce\u6027\u7684\u53ec\u5524) &c\u4f60\u4e0d\u80fd\u7e41\u6b96\u88ab\u53ec\u5524\u7684\u52a8\u7269. Taming.Summon.COTW.NeedMoreItems=&a(\u91ce\u6027\u7684\u53ec\u5524) &7\u4f60\u9700\u8981 &e{0}&7 \u66f4\u591a\u7684 &3{1}&7(s) -Taming.Summon.Name.Format={0}\u7684 {1} +Taming.Summon.Name.Format={0} \u7684 {1} #格斗 Unarmed.Ability.Bonus.0=\u94c1\u81c2\u5f0f Unarmed.Ability.Bonus.1=+{0} \u4f24\u5bb3\u52a0\u6210 @@ -573,7 +573,7 @@ Combat.TargetDazed=\u76ee\u6807\u88ab &4\u88ab\u51fb\u6655 Combat.TouchedFuzzy=&4\u5934\u6655\u76ee\u7729 #命令 ##通用 -mcMMO.Description=&3\u5173\u4e8e &emcMMO&3:,&6mcMMO \u662f\u4e00\u4e2a &c\u5f00\u6e90&6 RPG mod \u521b\u5efa\u4e8e2011\u5e742\u6708,&6by &9nossr50&6. \u76ee\u6807\u4e3a\u73a9\u5bb6\u63d0\u4f9b\u4e00\u4e2a\u9ad8\u8d28\u91cf\u7684RPG\u4f53\u9a8c.,&3\u63d0\u793a:,&6 - &a\u4f7f\u7528 &c/mcmmo help&a \u67e5\u770b\u6307\u4ee4,&6 - &a\u8f93\u5165 &c/\u6280\u80fd\u540d&a \u67e5\u770b\u8be6\u7ec6\u7684\u6280\u80fd\u4fe1\u606f,&3\u5f00\u53d1\u8005:,&6 - &anossr50 &9(\u521b\u59cb\u4eba & \u9879\u76ee\u8d1f\u8d23\u4eba),&6 - &aGJ &9(\u9879\u76ee\u7ec4\u957f),&6 - &aNuclearW &9(\u5f00\u53d1\u8005),&6 - &abm01 &9(\u5f00\u53d1\u8005),&6 - &aTfT_02 &9(\u5f00\u53d1\u8005),&6 - &aGlitchfinder &9(\u5f00\u53d1\u8005),&6 - &at00thpick1 &9(\u5f00\u53d1\u8005)&6,&3\u7ffb\u8bd1\u4f5c\u8005:,&6 - &aFu_Meng,&3\u6709\u7528\u94fe\u63a5:,&6 - &ahttps://github.com/mcMMO-Dev/mcMMO/issues&6 Bug \u62a5\u544a,&6 - &ahttps://discord.gg/EJGVanb &6 \u5b98\u65b9 Discord +mcMMO.Description=&3\u5173\u4e8e &emcMMO&3:,&6mcMMO \u662f\u4e00\u4e2a &c\u5f00\u6e90&6 RPG mod \u521b\u5efa\u4e8e2011\u5e742\u6708,&6by &9nossr50&6. \u76ee\u6807\u4e3a\u73a9\u5bb6\u63d0\u4f9b\u4e00\u4e2a\u9ad8\u8d28\u91cf\u7684RPG\u4f53\u9a8c.,&3\u63d0\u793a:,&6 - &a\u4f7f\u7528 &c/mcmmo help&a \u67e5\u770b\u6307\u4ee4,&6 - &a\u8f93\u5165 &c/\u6280\u80fd\u540d&a \u67e5\u770b\u8be6\u7ec6\u7684\u6280\u80fd\u4fe1\u606f,&3\u5f00\u53d1\u8005:,&6 - &anossr50 &9(\u521b\u59cb\u4eba & \u9879\u76ee\u8d1f\u8d23\u4eba),&6 - &aGJ &9(\u9879\u76ee\u7ec4\u957f),&6 - &aNuclearW &9(\u5f00\u53d1\u8005),&6 - &abm01 &9(\u5f00\u53d1\u8005),&6 - &aTfT_02 &9(\u5f00\u53d1\u8005),&6 - &aGlitchfinder &9(\u5f00\u53d1\u8005),&6 - &at00thpick1 &9(\u5f00\u53d1\u8005)&6,&3\u7ffb\u8bd1\u4f5c\u8005:,&6 - &aFu_Meng/GhostDC,&3\u6709\u7528\u94fe\u63a5:,&6 - &ahttps://github.com/mcMMO-Dev/mcMMO/issues&6 Bug \u62a5\u544a,&6 - &ahttps://discord.gg/EJGVanb &6 \u5b98\u65b9 Discord mcMMO.Description.FormerDevs=&3\u524d\u5f00\u53d1\u8005: &aGJ, 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. @@ -610,7 +610,7 @@ Commands.Healthbars.Changed.DISABLED=[mcMMO] \u4f60\u7684\u602a\u7269\u8840\u676 Commands.Healthbars.Invalid=\u65e0\u6548\u7684\u8840\u6761\u7c7b\u578b! Commands.Inspect= &a- \u67e5\u770b\u73a9\u5bb6\u8be6\u7ec6\u4fe1\u606f Commands.Invite.Success=&a\u9080\u8bf7\u5df2\u6210\u529f\u53d1\u9001. -Commands.Leaderboards= &a- \u6392\u884c\u5427 +Commands.Leaderboards= &a- \u6392\u884c\u699c Commands.mcgod=&a- \u5207\u6362\u4e0a\u5e1d\u6a21\u5f0f Commands.mchud.Invalid=\u8fd9\u4e0d\u662f\u6709\u6548\u7684 HUD \u7c7b\u578b. Commands.mcpurge.Success=&a\u6570\u636e\u5e93\u5df2\u6210\u529f\u6e05\u9664! @@ -700,18 +700,18 @@ Commands.PowerLevel=&4\u6218\u6597\u529b: &a{0} Commands.Reset.All=&a\u4f60\u7684\u6280\u80fd\u7b49\u7ea7\u5df2\u590d\u4f4d\u6210\u529f. Commands.Reset.Single=&a\u4f60\u7684 {0} \u6280\u80fd\u7b49\u7ea7\u5df2\u6210\u529f\u91cd\u7f6e. Commands.Reset=&a- \u91cd\u7f6e\u6280\u80fd\u7b49\u7ea7\u4e3a0 -Commands.Scoreboard.Clear=&3mcMMO \u8bb0\u5206\u677f\u5df2\u6e05\u7a7a. +Commands.Scoreboard.Clear=&3mcMMO \u8bb0\u5206\u677f\u5df2\u5173\u95ed. Commands.Scoreboard.NoBoard=&cmcMMO \u8bb0\u5206\u677f\u5f53\u524d\u672a\u6fc0\u6d3b. -Commands.Scoreboard.Keep=&3mcMMO \u8bb0\u5206\u677f\u5c06\u60ac\u505c\u76f4\u5230\u60a8\u4f7f\u7528 &a/mcscoreboard clear&3. -Commands.Scoreboard.Timer=&3mcMMO \u8bb0\u5206\u677f\u5c06\u5728 &6{0}&3 \u79d2\u540e\u6e05\u7a7a\u3002 +Commands.Scoreboard.Keep=&3mcMMO \u8bb0\u5206\u677f\u5c06\u60ac\u505c\u76f4\u5230\u60a8\u4f7f\u7528 &a/mcscoreboard clear&3 \u6765\u5173\u95ed. +Commands.Scoreboard.Timer=&3mcMMO \u8bb0\u5206\u677f\u5c06\u5728 &6{0}&3 \u79d2\u540e\u5173\u95ed Commands.Scoreboard.Help.0=&6 == &c/mcscoreboard &a\u5e2e\u52a9&6 == Commands.Scoreboard.Help.1=&3/mcscoreboard&b clear &f - \u6e05\u7a7a mcMMO \u8bb0\u5206\u677f Commands.Scoreboard.Help.2=&3/mcscoreboard&b keep &f - \u4fdd\u6301 mcMMO \u8bb0\u5206\u677f\u60ac\u505c Commands.Scoreboard.Help.3=&3/mcscoreboard&b time [n] &f - &dn&f \u79d2\u540e\u6e05\u7a7a mcMMO \u8bb0\u5206\u677f Commands.Scoreboard.Tip.Keep=&6\u63d0\u793a: \u5f53\u8bb0\u5206\u677f\u663e\u793a\u65f6\u4f7f\u7528 &c/mcscoreboard keep&6 \u6765\u4fdd\u6301\u5b83\u4e0d\u6d88\u5931\u3002 Commands.Scoreboard.Tip.Clear=&6\u63d0\u793a: \u4f7f\u7528 &c/mcscoreboard clear&6 \u6765\u5173\u95ed\u8ba1\u5206\u677f\u3002 -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.XPBar.Reset=&6mcMMO \u7684\u7ecf\u9a8c\u6761\u8bbe\u7f6e\u88ab\u91cd\u7f6e. +Commands.XPBar.SettingChanged=&a{0}&6 \u7684\u7ecf\u9a8c\u503c\u8bbe\u7f6e\u88ab\u8bbe\u7f6e\u4e3a &a{1} 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 &9{0}&e \u6392\u884c\u699c-- @@ -830,29 +830,29 @@ 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.Fishing=\u9493\u9c7c (\u53bb\u7814\u7a76\u5427!) 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.Woodcutting=\u780d\u4f10\u6811\u6728 Commands.XPGain=&8\u7ecf\u9a8c\u6765\u6e90: &f{0} Commands.xplock.locked=&6\u4f60\u7684\u7ecf\u9a8c\u6761\u9501\u5b9a\u5728 {0}! Commands.xplock.unlocked=&6\u4f60\u7684\u7ecf\u9a8c\u6761\u73b0\u5728 &a\u89e3\u9664\u9501\u5b9a\u4e86&6! Commands.xprate.modified=&c\u7ecf\u9a8c\u500d\u7387\u5df2\u8bbe\u7f6e\u4e3a {0} -Commands.xprate.over=&cmcMMO \u9ad8\u7ecf\u9a8c\u4e8b\u4ef6\u7ed3\u675f!! +Commands.xprate.over=&cmcMMO \u9ad8\u500d\u7ecf\u9a8c\u4e8b\u4ef6\u7ed3\u675f!! Commands.xprate.proper.0=&c\u60f3\u4fee\u6539\u7ecf\u9a8c\u83b7\u53d6\u7387\u8bf7\u8f93\u5165 /xprate Commands.xprate.proper.1=&c\u60f3\u628a\u7ecf\u9a8c\u83b7\u53d6\u7387\u8c03\u6574\u4e3a\u9ed8\u8ba4\u8bf7\u8f93\u5165 /xprate reset -Commands.xprate.proper.2=&c\u8bf7\u6307\u5b9a true \u6216 false \u6765\u8868\u660e\u8fd9\u662f\u5426\u662f\u4e00\u4e2a\u7ecf\u9a8c\u4e8b\u4ef6 -Commands.xprate.started.0=&6 mcMMO \u9ad8\u7ecf\u9a8c\u4e8b\u4ef6\u5df2\u5f00\u59cb! -Commands.xprate.started.1=&6mcMMO \u7ecf\u9a8c\u83b7\u53d6\u7387\u73b0\u5728\u4e3a {0}x! +Commands.xprate.proper.2=&c\u8bf7\u6307\u5b9a true \u6216 false \u6765\u8868\u660e\u8fd9\u662f\u5426\u662f\u4e00\u4e2a\u7ecf\u9a8c\u6d3b\u52a8 +Commands.xprate.started.0=&6mcMMO \u9ad8\u500d\u7ecf\u9a8c\u6d3b\u52a8\u5df2\u5f00\u59cb! +Commands.xprate.started.1=&6mcMMO \u7ecf\u9a8c\u83b7\u53d6\u7387\u73b0\u5728\u4e3a {0} \u500d! Commands.NegativeNumberWarn=\u4e0d\u8981\u4f7f\u7528\u8d1f\u6570! -Commands.Event.Start=&amcMMO&6 \u4e8b\u4ef6! -Commands.Event.Stop=&amcMMO&3 \u4e8b\u4ef6\u7ed3\u675f! +Commands.Event.Start=&amcMMO&6 \u6d3b\u52a8! +Commands.Event.Stop=&amcMMO&3 \u6d3b\u52a8\u7ed3\u675f! Commands.Event.Stop.Subtitle=&a\u6211\u5e0c\u671b\u4f60\u73a9\u7684\u5f00\u5fc3! -Commands.Event.XP=&3\u591a\u500d\u7ecf\u9a8c\u901f\u7387\u4e3a &6{0}&3 \u500d +Commands.Event.XP=&3\u591a\u500d\u7ecf\u9a8c\u500d\u7387\u4e3a &6{0}&3 \u500d # 管理员提醒 Server.ConsoleName=&e[Server] @@ -864,7 +864,7 @@ Notifications.Admin.Format.Others=&6(&amcMMO &3Admin&6) &7{0} Notifications.Admin.Format.Self=&6(&amcMMO&6) &7{0} # 事件 -XPRate.Event= &6mcMMO \u73b0\u5728\u6b63\u5904\u4e8e\u591a\u500d\u7ecf\u9a8c\u4e8b\u4ef6\u9636\u6bb5! \u7ecf\u9a8c\u83b7\u53d6\u7387\u4e3a {0}\u500d! +XPRate.Event= &6mcMMO \u73b0\u5728\u6b63\u5904\u4e8e\u591a\u500d\u7ecf\u9a8c\u6d3b\u52a8\u9636\u6bb5! \u7ecf\u9a8c\u83b7\u53d6\u7387\u4e3a {0} \u500d! #指南 Guides.Available=&7{0} \u7684\u5411\u5bfc - \u8f93\u5165 /{1} ? [\u9875\u6570] @@ -879,14 +879,14 @@ Guides.Acrobatics.Section.2=&3\u95ea\u907f\u662f\u5982\u4f55\u5de5\u4f5c\u7684?\ ##炼金 Guides.Alchemy.Section.0=&3\u5173\u4e8e\u70bc\u91d1:\n&e\u70bc\u91d1\u662f\u836f\u6c34\u917f\u9020\u7684\u6280\u80fd\u3002\n&e\u5b83\u63d0\u5347\u4e86\u836f\u6c34\u917f\u9020\u65f6\u7684\u901f\u5ea6\uff0c\u5e76\u4e14\u52a0\u5165\u4e86\n&e\u65b0\u7684\uff08\u76f8\u5bf9\u4e4b\u524d\uff09\u65e0\u6cd5\u83b7\u53d6\u7684\u836f\u6c34\u3002\n\n\n&3\u7ecf\u9a8c\u83b7\u53d6\uff1a\n&e\u901a\u8fc7\u917f\u9020\u836f\u6c34\u6765\u83b7\u53d6\u7ecf\u9a8c\u3002 Guides.Alchemy.Section.1=&3\u50ac\u5316\u662f\u5982\u4f55\u5de5\u4f5c\u7684\uff1f\n&e\u50ac\u5316\u63d0\u5347\u917f\u9020\u7684\u901f\u5ea6\uff0c\u5728 1000 \u7ea7\n&e\u65f6\u80fd\u8fbe\u5230\u6700\u9ad8 4 \u500d\u3002\n&e\u6b64\u80fd\u529b\u9ed8\u8ba4\u5728 100 \u7ea7\u89e3\u9501\u3002 -Guides.Alchemy.Section.2=&3\u6df7\u5408\u662f\u5982\u4f55\u5de5\u4f5c\u7684\uff1f\n&e\u6df7\u5408\u5141\u8bb8\u4f7f\u7528\u81ea\u8ba2\u539f\u6599\u917f\u9020\u66f4\u591a\u836f\u6c34\u3002\n&e\u7279\u6b8a\u539f\u6599\u6839\u636e\u60a8\u7684\u7b49\u7ea7\u6765\u89e3\u9501\u3002\n&e\u603b\u5171\u6709 8 \u4e2a\u7b49\u7ea7\u9700\u8981\u89e3\u9501\u3002 +Guides.Alchemy.Section.2=&3\u6df7\u5408\u662f\u5982\u4f55\u5de5\u4f5c\u7684\uff1f\n&e\u6df7\u5408\u5141\u8bb8\u4f7f\u7528\u81ea\u5b9a\u4e49\u539f\u6599\u917f\u9020\u66f4\u591a\u836f\u6c34\u3002\n&e\u7279\u6b8a\u539f\u6599\u6839\u636e\u60a8\u7684\u7b49\u7ea7\u6765\u89e3\u9501\u3002\n&e\u603b\u5171\u6709 8 \u4e2a\u7b49\u7ea7\u9700\u8981\u89e3\u9501\u3002 Guides.Alchemy.Section.3=&3\u6df7\u5408\u7b2c 1 \u9636\u539f\u6599:\n&e\u70c8\u7130\u7c89, \u53d1\u9175\u86db\u773c, \u6076\u9b42\u4e4b\u6cea, \u7ea2\u77f3,\n&e\u8424\u77f3\u7c89, \u7cd6, \u95ea\u70c1\u7684\u897f\u74dc, \u91d1\u80e1\u841d\u535c,\n&e\u5ca9\u6d46\u818f, \u5730\u72f1\u75a3, \u8718\u86db\u773c, \u706b\u836f, \u7761\u83b2,\n&e\u6cb3\u8c5a\n&e(\u7eaf\u51c0\u836f\u6c34) Guides.Alchemy.Section.4=&3\u6df7\u5408\u7b2c 2 \u9636\u539f\u6599:\n&e\u80e1\u841d\u535c (\u6025\u8feb\u836f\u6c34)\n&e\u7c98\u6db2\u7403 (\u8fdf\u949d\u836f\u6c34)\n\n&3\u6df7\u5408\u7b2c 3 \u9636\u539f\u6599:\n&e\u4e0b\u754c\u77f3\u82f1 (\u4f24\u5bb3\u5438\u6536\u836f\u6c34)\n&e\u7ea2\u8272\u8611\u83c7 (\u8df3\u8dc3\u836f\u6c34) Guides.Alchemy.Section.5=&3\u6df7\u5408\u7b2c 4 \u9636\u539f\u6599:\n&e\u82f9\u679c (\u751f\u547d\u52a0\u6210\u836f\u6c34)\n&e\u8150\u8089 (\u9965\u997f\u836f\u6c34)\n\n&3\u6df7\u5408\u7b2c 5 \u9636\u539f\u6599:\n&e\u8910\u8272\u8611\u83c7 (\u53cd\u80c3\u836f\u6c34)\n&e\u58a8\u56ca (\u5931\u660e\u836f\u6c34) Guides.Alchemy.Section.6=&3\u6df7\u5408\u7b2c 6 \u9636\u539f\u6599:\n&e\u8568\u7c7b (\u9971\u548c\u836f\u6c34)\n\n&3\u6df7\u5408\u7b2c 7 \u9636\u539f\u6599:\n&e\u6bd2\u9a6c\u94c3\u85af (Potion of Decay)\n\n[[\u8150\u70c2\u836f\u6c34]]\u6df7\u5408\u7b2c 8 \u9636\u539f\u6599:\n&e\u666e\u901a\u91d1\u82f9\u679c (\u6297\u6027\u63d0\u5347\u836f\u6c34) ##格斗 -Guides.Archery.Section.0=&3\u5173\u4e8e\u7bad\u672f:\n&e\u7bad\u672f\u662f\u7528\u5f13\u5c04\u7bad.\n&e\u4e3a\u4f60\u63d0\u4f9b\u5404\u79cd\u7ad9\u4e1c\u52a0\u6210, \n&e\u4f8b\u5982\u968f\u7740\u4f60\u7684\u7b49\u7ea7\u63d0\u5347\u4f24\u5bb3\uff0c\u4ee5\u53ca\u5c06\u5bf9\u624b\u51fb\u6655\u7684\u80fd\u529b\n&e\u9664\u6b64\u4e4b\u5916\u4f60\u8fd8\u80fd\u4ece\u5bf9\u624b\u7684\u8eab\u4e0a\u56de\u6536\u7bad\u77e2.\n\n\n&3\u7ecf\u9a8c\u6765\u6e90:\n&e\u8981\u83b7\u53d6\u6b64\u4ec5\u80fd\u7684\u7ecf\u9a8c\n&e\u4f60\u9700\u8981\u5c04\u51fb\u602a\u7269\u6216\u5176\u4ed6\u73a9\u5bb6. +Guides.Archery.Section.0=&3\u5173\u4e8e\u7bad\u672f:\n&e\u7bad\u672f\u662f\u7528\u5f13\u5c04\u7bad.\n&e\u4e3a\u4f60\u63d0\u4f9b\u5404\u79cd\u6218\u6597\u52a0\u6210, \n&e\u4f8b\u5982\u968f\u7740\u4f60\u7684\u7b49\u7ea7\u63d0\u5347\u4f24\u5bb3\uff0c\u63d0\u5347\u5c06\u5bf9\u624b\u51fb\u6655\u7684\u80fd\u529b\n&e\u9664\u6b64\u4e4b\u5916\u4f60\u8fd8\u80fd\u4ece\u5bf9\u624b\u7684\u8eab\u4e0a\u56de\u6536\u7bad\u77e2.\n\n\n&3\u7ecf\u9a8c\u6765\u6e90:\n&e\u8981\u83b7\u53d6\u6b64\u4ec5\u80fd\u7684\u7ecf\u9a8c\n&e\u4f60\u9700\u8981\u5c04\u51fb\u602a\u7269\u6216\u5176\u4ed6\u73a9\u5bb6. Guides.Archery.Section.1=&3\u6280\u5de7\u5c04\u51fb\u5982\u4f55\u5de5\u4f5c?\n&e\u6280\u5de7\u5c04\u51fb\u4f1a\u4f7f\u4f60\u7684\u5c04\u7bad\u653b\u51fb\u83b7\u5f97\u4f24\u5bb3\u52a0\u6210.\n&e\u6280\u5de7\u5c04\u51fb\u63d0\u4f9b\u7684\u4f24\u5bb3\u52a0\u6210\u4f1a\u968f\u7740\n&e\u7bad\u672f\u7b49\u7ea7\u7684\u63d0\u5347\u800c\u589e\u52a0.\n&e\u4f7f\u7528\u9ed8\u8ba4\u8bbe\u7f6e\u4f60\u7684\u7bad\u672f\u6bcf\u4e94\u5341\u7ea7\u63d0\u9ad810%\u7684\u4f24\u5bb3\u52a0\u6210\n&e\u6700\u9ad8\u63d0\u4f9b200%\u7684\u4f24\u5bb3\u52a0\u6210. Guides.Archery.Section.2=&3\u51fb\u6655\u5982\u4f55\u5de5\u4f5c?\n&e\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&e\u5f53\u51fb\u6655\u89e6\u53d1\u65f6\u4ed6\u4f1a\u65f6\n&e\u5bf9\u624b\u76f4\u89c6\u524d\u65b9\u4e00\u5b9a\u65f6\u95f4.\n&e\u5e76\u63d0\u4f9b4\u70b9\u7684\u989d\u5916\u4f24\u5bb3\uff082 \u5fc3\uff09. Guides.Archery.Section.3=&3\u7bad\u77e2\u56de\u6536\u5982\u4f55\u5de5\u4f5c?\n&e\u5f53\u4f60\u7528\u5f13\u7bad\u51fb\u6740\u602a\u7269\u65f6\n&e\u6709\u51e0\u7387\u56de\u6536\u7bad\u77e2.\n&e\u8fd9\u4e2a\u51e0\u7387\u968f\u7740\u4f60\u7bad\u672f\u7b49\u7ea7\u7684\u63d0\u5347\u800c\u589e\u52a0.\n&e\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u8fd9\u4e2a\u80fd\u529b\u6bcf\u7ea7\u589e\u52a00.1%,\n&e1000\u7ea7\u589e\u52a0100%. @@ -916,8 +916,8 @@ Guides.Fishing.Section.6=&3\u5173\u4e8e\u9493\u9c7c\u7684\u8bf4\u660e:\n&e\u9493 Guides.Herbalism.Section.0=&3\u5173\u4e8e\u8349\u836f\u5b66:\n&e\u8349\u836f\u5b66\u662f\u5173\u4e8e\u91c7\u96c6\u8349\u836f\u4e0e\u690d\u7269\u7684\u6280\u80fd.\n\n&3\u7ecf\u9a8c\u62c9\u8fdc:\n&e\u91c7\u96c6\u8349\u836f\u6216\u690d\u7269. Guides.Herbalism.Section.1=&3\u53ef\u4f5c\u7528\u7684\u8349\u836f/\u690d\u7269\n&e\u5c0f\u9ea6, \u9a6c\u94c3\u85af, \u80e1\u841d\u535c, \u897f\u74dc, \n&e\u5357\u74dc, \u7518\u8517, \u53ef\u53ef\u8c46, \u82b1, \u4ed9\u4eba\u638c, \u8611\u83c7,\n&e\u5730\u72f1\u75a3, \u83b2\u53f6, \u4e0e\u85e4\u8513. Guides.Herbalism.Section.2=&3\u5927\u5730\u795d\u798f\u5982\u4f55\u5de5\u4f5c?\n&e\u5927\u5730\u795d\u798f\u662f\u4e00\u4e2a\u4e3b\u52a8\u6280\u80fd, \u5f53\u4f60\u624b\u6301\u9504\u5934\u65f6\n&e\u70b9\u51fb\u53f3\u952e\u53ef\u53d1\u52a8\u6280\u80fd. \u5927\u5730\u795d\u798f\u63d0\u9ad8\u4e09\u500d\u6536\u83b7\u7684\u673a\u7387. \n&e\u540c\u65f6\u4e5f\u8ba9\u73a9\u5bb6\u6709\u80fd\u529b\u4f7f\u7528\u8eab\u4e0a\u7684\u79cd\u5b50\u6765\u8f6c\u5316\n&e\u65b9\u5757\u5e76\u8d4b\u4e88\u751f\u547d. -Guides.Herbalism.Section.3=&3\u7eff\u62c7\u6307(\u4f5c\u7269)\u5982\u4f55\u5de5\u4f5c?\n&e\u8fd9\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd,\u8ba9\u4f5c\u7269\u5728\u91c7\u96c6\u65f6\n&e\u81ea\u52a8\u79cd\u56de\u53bb.\n&e\u6982\u7387\u53d6\u51b3\u4e8e\u4f60\u7684\u8349\u836f\u5b66\u6280\u80fd\u7b49\u7ea7. -Guides.Herbalism.Section.4=&3\u7eff\u624b\u6307(\u5706\u77f3/\u77f3\u7816/\u6ce5\u571f)\u5982\u4f55\u5de5\u4f5c?\n&e\u8fd9\u662f\u4e00\u4e2a\u4e3b\u52a8\u6280\u80fd,\u8ba9\u4f60\u5728\u624b\u62ff\u7740\u79cd\u5b50\u65f6,\n&e\u5bf9\u5706\u77f3\u77f3/\u77f3\u7816/\u6ce5\u571f,\u70b9\u51fb\u53f3\u952e,\u53ef\u4f7f\u5b83\u4eec\u53d8\u6210\n&e\u82d4\u77f3\u8349\u65b9\u5757\u7b49,\u4f1a\u6d88\u8017\u4e00\u9897\u79cd\u5b50. +Guides.Herbalism.Section.3=&3\u56ed\u827a\u5927\u5e08(\u4f5c\u7269)\u5982\u4f55\u5de5\u4f5c?\n&e\u8fd9\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd,\u8ba9\u4f5c\u7269\u5728\u91c7\u96c6\u65f6\n&e\u81ea\u52a8\u79cd\u56de\u53bb.\n&e\u6982\u7387\u53d6\u51b3\u4e8e\u4f60\u7684\u8349\u836f\u5b66\u6280\u80fd\u7b49\u7ea7. +Guides.Herbalism.Section.4=&3\u56ed\u827a\u5927\u5e08(\u5706\u77f3/\u77f3\u7816/\u6ce5\u571f)\u5982\u4f55\u5de5\u4f5c?\n&e\u8fd9\u662f\u4e00\u4e2a\u4e3b\u52a8\u6280\u80fd,\u8ba9\u4f60\u5728\u624b\u62ff\u7740\u79cd\u5b50\u65f6,\n&e\u5bf9\u5706\u77f3\u77f3/\u77f3\u7816/\u6ce5\u571f,\u70b9\u51fb\u53f3\u952e,\u53ef\u4f7f\u5b83\u4eec\u53d8\u6210\n&e\u82d4\u77f3\u8349\u65b9\u5757\u7b49,\u4f1a\u6d88\u8017\u4e00\u9897\u79cd\u5b50. Guides.Herbalism.Section.5=&3\u519c\u592b\u98df\u8c31\u5982\u4f55\u5de5\u4f5c?\n&e\u8fd9\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd, \u53ef\u589e\u52a0\u4e0b\u5217\u98df\u7269\u7684\u9971\u98df\u5ea6\u6062\u590d -\n&e\u9762\u5305, \u66f2\u5947, \u897f\u74dc, \u8611\u83c7\u6c64, \u80e1\u841d\u535c, \u9a6c\u94c3\u85af. Guides.Herbalism.Section.6=&3\u6d77\u62c9\u5c14\u7684\u795d\u798f\u5982\u4f55\u5de5\u4f5c?\n&e\u8fd9\u662f\u4e00\u4e2a\u4e3b\u52a8\u6280\u80fd,\u6709\u673a\u7387\u5728\u7528\u5251\u7834\u574f\u7279\u5b9a\n&e\u65b9\u5757\u65f6\u83b7\u5f97\u7a00\u6709\u9053\u5177. Guides.Herbalism.Section.7=&3\u53cc\u500d\u6389\u843d\u5982\u4f55\u5de5\u4f5c?\n&e\u8fd9\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd\u4f7f\u73a9\u5bb6\u80fd\u52a0\u500d\u6536\u83b7. @@ -929,27 +929,27 @@ Guides.Mining.Section.3=&3\u4ec0\u4e48\u662f\u8d85\u7ea7\u788e\u77f3\u673a?\n&e\ Guides.Mining.Section.4=&3\u5982\u4f55\u4f7f\u7528\u7206\u7834\u5f00\u91c7:\n&e\u628a\u96f7\u7ba1\u62ff\u5728\u624b\u4e0a,\u9ed8\u8ba4\u7684\u60c5\u51b5\u4e0b\u662f\u6253\u706b\u5668.\n&e\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=&3\u4ec0\u4e48\u662f\u7206\u7834\u5f00\u91c7?\n&e\u7206\u7834\u5f00\u91c7\u662f\u4e00\u4e2a\u9700\u8981\u51b7\u5374\u65f6\u95f4\u7684\u6316\u77ff\u6280\u80fd\n&e\u5b83\u80fd\u4f7f\u4f60\u5728\u4f7f\u7528TNT\u70b8\u77ff\u65f6\u83b7\u5f97\u989d\u5916\u5956\u52b1\n&e\u7206\u7834\u5f00\u91c7\u603b\u5171\u67093\u4e2a\u529f\u80fd\n&e\u5927\u53f7\u70b8\u5f39:\u4f7f\u4f60\u7684TNT\u7206\u70b8\u8303\u56f4\u6269\u5927\n&e\u7206\u7834\u4e13\u5bb6:\u964d\u4f4e\u4f60\u53d7\u5230TNT\u7684\u7206\u70b8\u4f24\u5bb3\n&e\u7206\u7834\u5f00\u91c7:\u4f7f\u4f60\u70b9\u71c3\u7684TNT\u70b8\u4e0b\u8303\u56f4\u5185\u4e00\u5b9a\u6570\u91cf\u7684\u77ff\u77f3 ##修理 -Guides.Repair.Section.0=&3\u5173\u4e8e\u4fee\u7406:\n&e\u4fee\u7406\u53ef\u4ee5\u8ba9\u4f60\u4f7f\u7528\u94c1\u5757\u6765\u4fee\u7406\u76d4\u7532\u548c\u5de5\u5177.\n\n&3\u7ecf\u9a8c\u6765\u6e90:\n&e\u4f7f\u7528mcmmo\u7684\u94c1\u7827\u4fee\u7406\u5de5\u5177\u6216\u88c5\u5907. \n&emcmmo\u9ed8\u8ba4\u7684\u4fee\u7406\u53f0\u662f\u94c1\u5757\n&e\u4e0d\u8981\u4e0e\u7528\u7ecf\u9a8c\u4fee\u590d\u7684\u94c1\u7827\u6df7\u6dc6. -Guides.Repair.Section.1=&3\u5982\u4f55\u4f7f\u7528\u4fee\u7406?\n&e\u653e\u5047\u4e00\u4e2amcmmo\u94c1\u7827(\u94c1\u5757),\u624b\u6301\u9700\u8981\u4fee\u7406\u7684\u9053\u5177 \n&e\uff0c\u53f3\u952e\u70b9\u51fb\u94c1\u5757\uff0c\u6bcf\u6b21\u4f7f\u7528\u6d88\u8017\u4e00\u4e2a\u7269\u54c1 +Guides.Repair.Section.0=&3\u5173\u4e8e\u4fee\u7406:\n&e\u4fee\u7406\u53ef\u4ee5\u8ba9\u4f60\u4f7f\u7528\u94c1\u5757\u6765\u4fee\u7406\u76d4\u7532\u548c\u5de5\u5177.\n\n&3\u7ecf\u9a8c\u6765\u6e90:\n&e\u4f7f\u7528mcMMO\u7684\u94c1\u7827\u4fee\u7406\u5de5\u5177\u6216\u88c5\u5907. \n&emcMMO\u9ed8\u8ba4\u7684\u4fee\u7406\u53f0\u662f\u94c1\u5757\n&e\u4e0d\u8981\u4e0e\u7528\u7ecf\u9a8c\u4fee\u590d\u7684\u94c1\u7827\u6df7\u6dc6. +Guides.Repair.Section.1=&3\u5982\u4f55\u4f7f\u7528\u4fee\u7406?\n&e\u653e\u7f6e\u4e00\u4e2amcMMO\u94c1\u7827(\u94c1\u5757),\u624b\u6301\u9700\u8981\u4fee\u7406\u7684\u9053\u5177 \n&e\uff0c\u53f3\u952e\u70b9\u51fb\u94c1\u5757\uff0c\u6bcf\u6b21\u4f7f\u7528\u6d88\u8017\u4e00\u4e2a\u7269\u54c1 Guides.Repair.Section.2=&3\u4fee\u7406\u7cbe\u901a\u5982\u4f55\u5de5\u4f5c?\n&e\u4fee\u7406\u7cbe\u901a\u63d0\u5347\u4fee\u7406\u65f6\u8010\u4e45\u6062\u590d\u91cf. \n&e\u989d\u5916\u4fee\u7406\u7684\u8010\u4e45\u503c\u91cf\u53d6\u51b3\u4e8e\u4f60\u7684\u4fee\u7406\u6280\u80fd\u7b49\u7ea7. Guides.Repair.Section.3=&3\u8d85\u7ea7\u4fee\u7406\u5982\u4f55\u5de5\u4f5c?\n&e\u8d85\u7ea7\u4fee\u7406\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd. \u5f53\u4fee\u7406\u4e00\u4e2a\u7269\u54c1\u65f6,\n&e\u4f1a\u4f7f\u7269\u54c1\u7684\u4fee\u7406\u6548\u679c\u7ffb\u500d. Guides.Repair.Section.4=&3\u79d8\u6cd5\u953b\u9020\u5982\u4f55\u5de5\u4f5c?\n&e\u8fd9\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd\uff0c\u5141\u8bb8\u4f60\u4fee\u590d\u9644\u9b54\u7269\u54c1\n&e\u4fee\u7406\u7269\u54c1\u65f6\u6709\u4e00\u5b9a\u51e0\u7387\u4fdd\u7559\u9644\u9b54\u5c5e\u6027\n&e\u9644\u9b54\u5c5e\u6027\u53ef\u4ee5\u4fdd\u6301\u73b0\u6709\u7684\u7b49\u7ea7\uff0c\n&e\u964d\u7ea7\u5230\u4e00\u4e2a\u8f83\u4f4e\u7b49\u7ea7\u6216\u8005\u5b8c\u5168\u6d88\u5931. ##打捞 Guides.Salvage.Section.0=&3\u5173\u4e8e\u5206\u89e3:\n&e\u5206\u89e3\u4f7f\u4f60\u53ef\u4ee5\u4f7f\u7528\u91d1\u5757\u6765\u5206\u89e3\u88c5\u5907\u548c\u5de5\u5177.\n\n&3\u7ecf\u9a8c\u6765\u6e90:\n&e\u5206\u89e3\u65f6\u4fee\u7406\u548c\u9493\u9c7c\u7684\u5b50\u6280\u80fd\uff0c\n&e\u6280\u80fd\u7b49\u7ea7\u53d6\u51b3\u4e8e\u4f60\u7684\u9493\u9c7c\u548c\u4fee\u7406\u7684\u7b49\u7ea7. -Guides.Salvage.Section.1=&3\u5982\u4f55\u4f7f\u7528\u5206\u89e3?\n&e\u653e\u4e00\u4e2amcmmo\u5206\u89e3\u7827(\u91d1\u5757)\u62ff\u7740\u7269\u54c1\u53f3\u952e\u91d1\u5757.\n&e\u8fd9\u5c06\u62c6\u89e3\u7269\u54c1,\u5e76\u8fd4\u8fd8\u7269\u54c1\u7684\u5236\u4f5c\u539f\u6599\n&e\u4f8b\u5982:\u62c6\u89e3\u94c1\u9550\u4f60\u5c06\u83b7\u5f97\u94c1\u952d. +Guides.Salvage.Section.1=&3\u5982\u4f55\u4f7f\u7528\u5206\u89e3?\n&e\u653e\u4e00\u4e2amcMMO\u5206\u89e3\u7827(\u91d1\u5757)\u62ff\u7740\u7269\u54c1\u53f3\u952e\u91d1\u5757.\n&e\u8fd9\u5c06\u62c6\u89e3\u7269\u54c1,\u5e76\u8fd4\u8fd8\u7269\u54c1\u7684\u5236\u4f5c\u539f\u6599\n&e\u4f8b\u5982:\u62c6\u89e3\u94c1\u9550\u4f60\u5c06\u83b7\u5f97\u94c1\u952d. Guides.Salvage.Section.2=&3\u5982\u4f55\u4f7f\u7528\u8fdb\u9636\u5206\u89e3?\n&e\u89e3\u9501\u540e,\u6b64\u529f\u80fd\u4f7f\u4f60\u53ef\u4ee5\u5206\u89e3\u635f\u574f\u7684\u7269\u54c1.\n&e\u968f\u7740\u7b49\u7ea7\u7684\u63d0\u5347\u5206\u89e3\u6240\u5f97\u7684\u7269\u54c1\u4f1a\u83b7\u5f97\u66f4\u591a\u7684\u6750\u6599\n&e\u901a\u8fc7\u8fdb\u9636\u5206\u89e3\u4f60\u59cb\u7ec8\u80fd\u83b7\u5f97\u4e00\u4e2a\u6750\u6599.\n&e\u4e0d\u7528\u62c5\u5fc3\u4e0d\u4f1a\u83b7\u5f97\u6750\u6599\uff0c\u9664\u975e\u4f60\u7684\u8010\u4e45\u503c\u592a\u4f4e. -Guides.Salvage.Section.3=&3\u4e3a\u4e86\u8bf4\u660e\u8fd9\u662f\u5982\u4f55\u5de5\u4f5c\u7684, \u8fd9\u6709\u4e00\u4e2a\u4f8b\u5b50:\n&e\u5047\u8bbe\u6211\u4eec\u5206\u89e3\u4e86\u4e00\u4e2a\u635f\u574f\u4e8620%\u7684\u91d1\u9550,\n&e\u4ea6\u4e3a\u4e4b\u4f60\u6700\u591a\u83b7\u5f97\u4e24\u4e2a\u91d1\u952d\n&e(\u56e0\u4e3a\u91d1\u9550\u4f7f\u7528\u4e09\u4e2a\u91d1\u952d\u5236\u4f5c\u7684\uff0c\n&e33,33% \u7684\u635f\u8017) \u7b49\u4e8e 66% \u7684\u8010\u4e45\u503c. \n&e\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=&3\u5982\u4f55\u4f7f\u7528\u5965\u672f\u5206\u89e3?\n&e\u8fd9\u4e2a\u6280\u80fd\u53ef\u4ee5\u4f7f\u4f60\u5728\u5206\u89e3\u9644\u9b54\u7269\u54c1\u65f6\u83b7\u5f97\u9644\u9b54\u4e66\n&e\u6839\u636e\u4f60\u7684\u5206\u89e3\u7b49\u7ea7\uff0c\u5206\u4e3a\u5168\u90e8\u63d0\u53d6\u548c\u90e8\u5206\u63d0\u53d6\n&e\u5f53\u5206\u89e3\u4f4d\u90e8\u5206\u63d0\u53d6\u65f6.\n\n&e\u9644\u9b54\u4e66\u7684\u9644\u9b54\u4e0e\u7269\u54c1\u76f8\u6bd4\n&e\u9644\u9b54\u7b49\u7ea7\u504f\u4f4e. +Guides.Salvage.Section.3=&3\u4e3a\u4e86\u8bf4\u660e\u8fd9\u662f\u5982\u4f55\u5de5\u4f5c\u7684, \u8fd9\u6709\u4e00\u4e2a\u4f8b\u5b50:\n&e\u5047\u8bbe\u6211\u4eec\u5206\u89e3\u4e86\u4e00\u4e2a\u635f\u574f\u4e8620%\u7684\u91d1\u9550,\n&e\u4ea6\u4e3a\u4e4b\u4f60\u6700\u591a\u83b7\u5f97\u4e24\u4e2a\u91d1\u952d\n&e(\u56e0\u4e3a\u91d1\u9550\u4f7f\u7528\u4e09\u4e2a\u91d1\u952d\u5236\u4f5c\u7684\uff0c\n&e33,33% \u7684\u635f\u8017) \u7b49\u4e8e 66% \u7684\u8010\u4e45\u503c. \n&e\u5982\u679c\u4f60\u5206\u89e3\u7684\u7269\u54c1\u8010\u4e45\u503c\u4f4e\u4e8e66%\u5219\u65e0\u6cd5\u83b7\u5f97\u4e24\u4e2a\u539f\u6599.\u9ad8\u4e8e\u6b64\u503c\u83b7\u5f97\u4e24\u4e2a. +Guides.Salvage.Section.4=&3\u5982\u4f55\u4f7f\u7528\u5965\u672f\u5206\u89e3?\n&e\u8fd9\u4e2a\u6280\u80fd\u53ef\u4ee5\u4f7f\u4f60\u5728\u5206\u89e3\u9644\u9b54\u7269\u54c1\u65f6\u83b7\u5f97\u9644\u9b54\u4e66\n&e\u6839\u636e\u4f60\u7684\u5206\u89e3\u7b49\u7ea7\uff0c\u5206\u4e3a\u5168\u90e8\u63d0\u53d6\u548c\u90e8\u5206\u63d0\u53d6\n&e\u5f53\u5206\u89e3\u4e3a\u90e8\u5206\u63d0\u53d6\u65f6.\n\n&e\u9644\u9b54\u4e66\u7684\u9644\u9b54\u4e0e\u7269\u54c1\u76f8\u6bd4\n&e\u9644\u9b54\u7b49\u7ea7\u504f\u4f4e. ##冶炼 Guides.Smelting.Section.0=\u9a6c\u4e0a\u5230\u6765... ##剑术 Guides.Swords.Section.0=&3\u5173\u4e8e\u5251\u672f:\n&e\u8fd9\u4e2a\u6280\u80fd\u5728\u4f7f\u7528\u5251\u8fdb\u884c\u6218\u6597\u65f6\n&e\u63d0\u4f9b\u5404\u79cd\u52a0\u6210.\n\n&3\u7ecf\u9a8c\u6765\u6e90:\n&e\u7ecf\u9a8c\u503c\u662f\u901a\u8fc7\u7528\u5251\u5bf9\u602a\u7269\u6216\u5176\u4ed6\u73a9\u5bb6 \n&e\u9020\u6210\u4f24\u5bb3\u83b7\u5f97. Guides.Swords.Section.1=&3\u5982\u4f55\u4f7f\u7528\u5229\u5203\u7a81\u523a?\n&e\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&e\u8fd9\u4e2a\u6280\u80fd\u8ba9\u4f60\u53d1\u52a8\u8303\u56f4\u653b\u51fb\uff0c\u63d0\u4f9b25%\u7684\u4f24\u5bb3\u52a0\u6210 \n&e\u5e76\u4f34\u6709\u6495\u88c2\u6548\u679c. Guides.Swords.Section.2=&3\u53cd\u51fb\u5982\u4f55\u5de5\u4f5c?\n&e\u53cd\u51fb\u662f\u4e00\u4e2a\u4e3b\u52a8\u6280\u80fd\uff0c\u683c\u6321\u5bf9\u624b\u5bf9\u4f60\u7684\u4f24\u5bb3\n&e\u5e76\u6709\u51e0\u7387\u53cd\u5c0450%\u7684\u4f24\u5bb3\u7ed9\u5bf9\u624b. -Guides.Swords.Section.3=&3\u6495\u88c2\u5982\u4f55\u5de5\u4f5c?\n&e\u6495\u88c2\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd\uff0c\u653b\u51fb\u65f6\u6709\u51e0\u7387\u51fa\u53d1\u6495\u88c2. \n&e\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&e\u6301\u7eed\u65f6\u95f4\u53d6\u51b3\u4e8e\u4f60\u7684\u5251\u672f\u7b49\u7ea7. +Guides.Swords.Section.3=&3\u6495\u88c2\u5982\u4f55\u5de5\u4f5c?\n&e\u6495\u88c2\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd\uff0c\u653b\u51fb\u65f6\u6709\u51e0\u7387\u51fa\u53d1\u6495\u88c2. \n&e\u6495\u88c2\u4f1a\u5bf9\u5bf9\u5c11\u9020\u6210\u6301\u7eed\u7684\u6d41\u8840\u4f24\u5bb3,\u76f4\u5230\u6301\u7eed\u65f6\u95f4\u7ed3\u675f\u6216\u5bf9\u624b\u6b7b\u4ea1, \n&e\u6301\u7eed\u65f6\u95f4\u53d6\u51b3\u4e8e\u4f60\u7684\u5251\u672f\u7b49\u7ea7. ##驯兽 Guides.Taming.Section.0=&3\u9a6f\u517d\n&e\u9a6f\u517d\u6280\u80fd\u8ba9\u73a9\u5bb6\u80fd\u5728\u7528\u72fc\u6218\u6597\u65f6\n&e\u65f6\u6709\u52a0\u6210\u6548\u679c.\n\n&3\u7ecf\u9a8c\u6765\u6e90:\n&e\u8981\u83b7\u53d6\u7ecf\u9a8c,\u987b\u8bad\u670d\u72fc\u6216\u8c79\u732b,\n&e\u6216\u4e0e\u4f60\u7684\u72fc\u4e00\u540c\u6218\u6597. -Guides.Taming.Section.1=&3\u4ec0\u4e48\u662f\u91ce\u6027\u547c\u558a?\n&e\u91ce\u6027\u547c\u558a\u662f\u4e00\u4e2a\u4e3b\u52a8\u6280\u80fd\u8ba9\u4f60\n&e\u53ef\u4ee5\u53ec\u5524\u4e00\u53ea\u72fc\u6216\u8c79\u732b,\n&e\u53ea\u8981\u624b\u6301\u9aa8\u5934\u6216\u751f\u9c7c,\u70b9\u5de6\u952e. +Guides.Taming.Section.1=&3\u4ec0\u4e48\u662f\u91ce\u6027\u7684\u53ec\u5524?\n&e\u91ce\u6027\u7684\u53ec\u5524\u662f\u4e00\u4e2a\u4e3b\u52a8\u6280\u80fd\u8ba9\u4f60\n&e\u53ef\u4ee5\u53ec\u5524\u4e00\u53ea\u72fc\u6216\u8c79\u732b,\n&e\u53ea\u8981\u624b\u6301\u9aa8\u5934\u6216\u751f\u9c7c,\u70b9\u5de6\u952e. Guides.Taming.Section.2=&3\u4ec0\u4e48\u662f\u91ce\u517d\u4fe1\u606f?\n&e\u91ce\u517d\u4fe1\u606f\u80fd\u8ba9\u4f60\u67e5\u770b\u5ba0\u7269\u7684\u72b6\u6001,\n&e\u5bf9\u5ba0\u7269\u70b9\u51fb\u5de6\u952e\u5c31\u80fd\u4f7f\u7528\u8fd9\u9879\u80fd\u529b. Guides.Taming.Section.3=&3\u4ec0\u4e48\u662f\u55dc\u8840?\n&e\u8840\u8165\u653b\u51fb\u662f\u4e00\u4e2a\u4e3b\u52a8\u6280\u80fd,\u80fd\u9020\u6210\n&e\u72fc\u7684\u653b\u51fb\u76ee\u6807\u6709\u673a\u7387\u9677\u5165\u6d41\u8840\u72b6\u6001. Guides.Taming.Section.4=&3\u4ec0\u4e48\u662f\u5229\u722a?\n&e\u5229\u722a\u4f7f\u72fc\u7684\u653b\u51fb\u529b\u968f\u7740\u9a6f\u517d\u7b49\u7ea7\n&e\u589e\u52a0\u800c\u589e\u52a0. @@ -971,7 +971,7 @@ Guides.Woodcutting.Section.2=&3\u79cb\u98ce\u626b\u843d\u53f6\u5982\u4f55\u5de5\ Guides.Woodcutting.Section.3=&3\u6811\u6728\u4e30\u6536\u5982\u4f55\u5de5\u4f5c?\n&e\u8fd9\u4e2a\u88ab\u52a8\u6280\u80fd\u4f7f\u4f60\u5728\u780d\u6811\u65f6\n&e\u6709\u51e0\u7387\u6389\u843d\u53cc\u500d\u6728\u5934. #检查 Inspect.Offline= &c\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 &e{0} +Inspect.OfflineStats=\u4e0d\u5728\u7ebf\u73a9\u5bb6\u7684mcMMO\u7edf\u8ba1\u4fe1\u606f &e{0} Inspect.Stats=&e{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! #物品 @@ -1001,7 +1001,7 @@ Skills.ChildStats={0}&a{1} Skills.MaxXP=\u6700\u5927 Skills.TooTired=\u4f60\u592a\u7d2f\u4e86\u6682\u65f6\u65e0\u6cd5\u4f7f\u7528\u8be5\u6280\u80fd.&e({0}s) Skills.TooTired.Named=&7(&6{0}&e {1}s&7) -Skills.TooTired.Extra=&6{0} &eSuper Ability CDs - {1} +Skills.TooTired.Extra=&6{0} &e\u6280\u80fd\u51b7\u5374\u65f6\u95f4 - {1} Skills.Cancelled=&6{0} &c\u5df2\u53d6\u6d88! Skills.ConfirmOrCancel=&a\u518d\u6b21\u53f3\u952e\u4ee5\u786e\u5b9a &6{0}&a. \u5de6\u952e\u53d6\u6d88. Skills.AbilityGateRequirementFail=&7\u4f60\u9700\u8981 &e{0}&7 \u7ea7\u4ee5\u4e0a\u7684 &3{1}&7 \u6765\u4f7f\u7528\u8fd9\u4e2a\u80fd\u529b. @@ -1111,7 +1111,7 @@ Scoreboard.Misc.Cooldown=&d\u51b7\u5374 Scoreboard.Misc.Overall=&6\u603b\u4f53 Scoreboard.Misc.Ability=\u80fd\u529b #数据库恢复 -Profile.PendingLoad=&c\u4f60\u7684mcmmo\u73a9\u5bb6\u6570\u636e\u672a\u52a0\u8f7d. +Profile.PendingLoad=&c\u4f60\u7684mcMMO\u73a9\u5bb6\u6570\u636e\u672a\u52a0\u8f7d. Profile.Loading.Success=&a\u4f60\u7684mcMMO\u6570\u636e\u5df2\u52a0\u8f7d Profile.Loading.Failure=&cmcMMO \u65e0\u6cd5\u52a0\u8f7d\u4f60\u7684\u6570\u636e. \u8bf7\u8054\u7cfb &b\u670d\u52a1\u5668\u7ba1\u7406\u5458\u53cd\u9988\u4f60\u7684\u95ee\u9898.\n&e\u4f60\u53ef\u4ee5\u7ee7\u7eed\u5728\u670d\u52a1\u5668\u6e38\u73a9, \u4f46\u662f\u4f60 &l\u6ca1\u6709mcMMO\u7b49\u7ea7&e \u5e76\u4e14\u4f60\u83b7\u5f97\u7684\u4efb\u4f55\u7ecf\u9a8c\u90fd &l\u4e0d\u4f1a\u88ab\u4fdd\u5b58&e. Profile.Loading.AdminFailureNotice=&4[A]&c mcMMO \u65e0\u6cd5\u52a0\u8f7d\u73a9\u5bb6 &e{0}&c \u7684\u6570\u636e. &d\u8bf7\u68c0\u67e5\u4f60\u7684\u6570\u636e\u5e93. @@ -1121,7 +1121,7 @@ Holiday.Anniversary=&9mcMMO {0} \u5468\u5e74\u5feb\u4e50!\n&9\u4e3a\u4e86\u7eaa\ #提醒消息 Reminder.Squelched=&7\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.Reloaded=&a\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) +Locale.Reloaded=&a\u8bed\u8a00\u914d\u7f6e\u5df2\u91cd\u65b0\u52a0\u8f7d\uff0c\u4e2d\u6587\u6c49\u5316By: GhostDC \u4fee\u6539\u81ea\u539f\u6c49\u5316\u4f5c\u8005:aFu_Meng\u53d1\u73b0\u9519\u522b\u5b57\u8bf7\u8054\u7cfb\u6211QQ:1007199608) #玩家离开相关 LevelCap.PowerLevel=&6(&amcMMO&6) &e\u4f60\u5df2\u7ecf\u5230\u8fbe\u4e86\u6218\u6597\u529b\u7684\u7b49\u7ea7\u5c01\u9876 &c{0}&e \u7ea7. \u4f60\u5c06\u505c\u6b62\u83b7\u53d6\u6280\u80fd\u7ecf\u9a8c. LevelCap.Skill=&6(&amcMMO&6) &e\u4f60\u5df2\u7ecf\u5230\u8fbe\u4e86 &6{1}&e \u6280\u80fd\u7684\u7b49\u7ea7\u5c01\u9876 &c{0}&e . \u4f60\u7684\u8be5\u6280\u80fd\u5c06\u65e0\u6cd5\u518d\u5347\u7ea7. @@ -1139,6 +1139,6 @@ Chat.Identity.Console=&6* \u63a7\u5236\u53f0 * Chat.Channel.On=&6(&amcMMO-\u804a\u5929&6) &e\u4f60\u7684\u804a\u5929\u6d88\u606f\u73b0\u5728\u5c06\u81ea\u52a8\u53d1\u9001\u5230 &a{0}&e \u804a\u5929\u9891\u9053. Chat.Channel.Off=&6(&amcMMO-\u804a\u5929&6) &7\u4f60\u7684\u804a\u5929\u6d88\u606f\u5c06\u4e0d\u518d\u81ea\u52a8\u53d1\u9001\u5230\u7279\u5b9a\u7684\u804a\u5929\u9891\u9053. Chat.Spy.Party=&6[&eSPY&6-&a{2}&6] &r{0} &b\u2192 &r{1} -Broadcasts.LevelUpMilestone=&6(&amcMMO&6) {0}&7 \u4e8e &3{2}&7 \u4e2d\u8fbe\u5230\u4e86 &a{1}&7 \u7ea7! -Broadcasts.PowerLevelUpMilestone=&6(&amcMMO&6) {0}&7 \u5df2\u7ecf\u8fbe\u5230 &a{1}&7 \u6700\u9ad8\u7b49\u7ea7! +Broadcasts.LevelUpMilestone=&6(&amcMMO&6) {0}&7 \u7684 &3{2}&7 \u6280\u80fd\u7b49\u7ea7\u63d0\u5347\u5230\u4e86 &a{1}&7! +Broadcasts.PowerLevelUpMilestone=&6(&amcMMO&6) {0}&7 \u603b\u7b49\u7ea7\u5df2\u8fbe\u5230 &a{1}&7! Scoreboard.Recovery=\u6b63\u5728\u5c1d\u8bd5\u6062\u590d mcMMO \u8bb0\u5206\u724c... \ No newline at end of file From 280eb0ba51addbb1b6cddbfc967f60941327b0de Mon Sep 17 00:00:00 2001 From: rosaage Date: Thu, 23 Sep 2021 00:03:03 +0200 Subject: [PATCH 600/662] Added support for allowPublicKeyRetrieval=true in the JDBC launch (#4635) options for MySQL Co-authored-by: BuildTools --- src/main/java/com/gmail/nossr50/config/GeneralConfig.java | 1 + .../java/com/gmail/nossr50/database/SQLDatabaseManager.java | 5 +++++ src/main/resources/config.yml | 1 + 3 files changed, 7 insertions(+) diff --git a/src/main/java/com/gmail/nossr50/config/GeneralConfig.java b/src/main/java/com/gmail/nossr50/config/GeneralConfig.java index f40956695..f4def0fd4 100644 --- a/src/main/java/com/gmail/nossr50/config/GeneralConfig.java +++ b/src/main/java/com/gmail/nossr50/config/GeneralConfig.java @@ -251,6 +251,7 @@ public class GeneralConfig extends AutoUpdateConfigLoader { 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); diff --git a/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java index de4093e47..413d9d49c 100644 --- a/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java @@ -61,6 +61,11 @@ 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(driverPath); diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 7e048170d..4eb9602f0 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -202,6 +202,7 @@ MySQL: SSL: true Port: 3306 Address: localhost + allowPublicKeyRetrieval: true # # Settings for Hardcore mode From 162c605dacb52ddd2fae6797ffd7cbd9cb4bb84e Mon Sep 17 00:00:00 2001 From: PikaMug <2267126+PikaMug@users.noreply.github.com> Date: Wed, 22 Sep 2021 18:05:41 -0400 Subject: [PATCH 601/662] Trigger change event for party create/disband (#4620) --- .../commands/party/PartyDisbandCommand.java | 10 ++++++---- .../events/party/McMMOPartyChangeEvent.java | 10 ++++++++++ .../com/gmail/nossr50/party/PartyManager.java | 16 +++++++++++++++- 3 files changed, 31 insertions(+), 5 deletions(-) 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 f4f8f3d2a..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; @@ -15,13 +16,14 @@ public class PartyDisbandCommand implements CommandExecutor { @Override public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { if (args.length == 1) { - if (UserManager.getPlayer((Player) sender) == null) { + final McMMOPlayer mcMMOPlayer = UserManager.getPlayer((Player) sender); + if (mcMMOPlayer == null) { sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad")); return true; } - Party playerParty = UserManager.getPlayer((Player) sender).getParty(); - String partyName = playerParty.getName(); + 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)) { @@ -31,7 +33,7 @@ public class PartyDisbandCommand implements CommandExecutor { member.sendMessage(LocaleLoader.getString("Party.Disband")); } - PartyManager.disbandParty(playerParty); + PartyManager.disbandParty(mcMMOPlayer, playerParty); return true; } sender.sendMessage(LocaleLoader.getString("Commands.Usage.1", "party", "disband")); 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 365236d91..1f9b30696 100644 --- a/src/main/java/com/gmail/nossr50/events/party/McMMOPartyChangeEvent.java +++ b/src/main/java/com/gmail/nossr50/events/party/McMMOPartyChangeEvent.java @@ -53,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. */ diff --git a/src/main/java/com/gmail/nossr50/party/PartyManager.java b/src/main/java/com/gmail/nossr50/party/PartyManager.java index 4cd483329..16965629f 100644 --- a/src/main/java/com/gmail/nossr50/party/PartyManager.java +++ b/src/main/java/com/gmail/nossr50/party/PartyManager.java @@ -347,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) { @@ -366,6 +376,9 @@ public final class PartyManager { } parties.remove(party); + if (mcMMOPlayer != null) { + handlePartyChangeEvent(mcMMOPlayer.getPlayer(), party.getName(), null, EventReason.DISBANDED_PARTY); + } } /** @@ -388,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); } /** From 7fc65771967db46df61b5246992cf771eb9c7809 Mon Sep 17 00:00:00 2001 From: tunagohan Date: Thu, 23 Sep 2021 07:11:54 +0900 Subject: [PATCH 602/662] Propose: Add an option for Exploiting Fishing. (#4619) * feat: Add exploiting option for fishing * Update experience.yml Let's change how this was named * Update ExperienceConfig.java Let's change how this was named Co-authored-by: Robert Alan Chapton --- .../nossr50/config/experience/ExperienceConfig.java | 3 +++ .../com/gmail/nossr50/listeners/PlayerListener.java | 6 +++--- .../gmail/nossr50/skills/fishing/FishingManager.java | 10 +++++----- src/main/resources/experience.yml | 3 +++ 4 files changed, 14 insertions(+), 8 deletions(-) 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 2d84ea0c7..ac47887c4 100644 --- a/src/main/java/com/gmail/nossr50/config/experience/ExperienceConfig.java +++ b/src/main/java/com/gmail/nossr50/config/experience/ExperienceConfig.java @@ -155,6 +155,9 @@ public class ExperienceConfig extends AutoUpdateConfigLoader { 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); } diff --git a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java index a87a47cd1..da8661749 100644 --- a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java @@ -449,7 +449,7 @@ public class PlayerListener implements Listener { if(caught instanceof Item) { if(ExperienceConfig.getInstance().isFishingExploitingPrevented()) { if (fishingManager.isExploitingFishing(event.getHook().getLocation().toVector())) { - player.sendMessage(LocaleLoader.getString("Fishing.ScarcityTip", 3)); + player.sendMessage(LocaleLoader.getString("Fishing.ScarcityTip", ExperienceConfig.getInstance().getFishingExploitingOptionMoveRange())); event.setExpToDrop(0); Item caughtItem = (Item) caught; caughtItem.remove(); @@ -886,7 +886,7 @@ public class PlayerListener implements Listener { if(player.getInventory().getItemInOffHand().getType() != Material.AIR && !player.isInsideVehicle() && !player.isSneaking()) { break; } - + /* ACTIVATION CHECKS */ if (mcMMO.p.getGeneralConfig().getAbilitiesEnabled()) { mcMMOPlayer.processAbilityActivation(PrimarySkillType.AXES); @@ -1005,7 +1005,7 @@ public class PlayerListener implements Listener { * 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) 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 9a78dd499..1787a106e 100644 --- a/src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java @@ -43,7 +43,6 @@ 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; @@ -143,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() { diff --git a/src/main/resources/experience.yml b/src/main/resources/experience.yml index 152e4f404..18b4d446e 100644 --- a/src/main/resources/experience.yml +++ b/src/main/resources/experience.yml @@ -39,6 +39,9 @@ ExploitFix: # 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 From 58e7323c3e9c143fbd0af8c43b68e47573307d2c Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 23 Sep 2021 12:59:58 -0700 Subject: [PATCH 603/662] Bring adventure-api and adventure-platform (and dependencies) up to date --- pom.xml | 26 +++++++------------------- 1 file changed, 7 insertions(+), 19 deletions(-) diff --git a/pom.xml b/pom.xml index 8f167b8d6..c04d7b8fd 100755 --- a/pom.xml +++ b/pom.xml @@ -141,7 +141,6 @@ net.kyori:adventure-text-serializer-gson net.kyori:adventure-platform-bukkit net.kyori:adventure-platform-api - net.kyori:adventure-platform-common net.kyori:adventure-platform-viaversion net.kyori:adventure-platform-facet net.kyori:adventure-nbt @@ -248,48 +247,37 @@ net.kyori adventure-text-serializer-gson - 4.8.0 + 4.9.1 net.kyori adventure-api - 4.8.0 + 4.9.1 net.kyori adventure-nbt - 4.8.0 + 4.9.1 net.kyori adventure-key - 4.8.0 + 4.9.1 net.kyori adventure-text-serializer-gson-legacy-impl - 4.8.0 + 4.9.1 net.kyori adventure-platform-bukkit - 4.0.0-SNAPSHOT + 4.0.0 net.kyori adventure-platform-api - 4.0.0-SNAPSHOT - - - net.kyori - adventure-platform-common - 4.0.0-SNAPSHOT - - - net.kyori - adventure-nbt - - + 4.0.0 org.apache.maven.scm From c30892a0a56edaa1fc541b439ee1031bb8e10789 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 28 Sep 2021 00:09:04 -0700 Subject: [PATCH 604/662] Add flowering azalea leaves to Tree Feller --- Changelog.txt | 4 ++++ src/main/java/com/gmail/nossr50/util/MaterialMapStore.java | 1 + 2 files changed, 5 insertions(+) diff --git a/Changelog.txt b/Changelog.txt index f3f3c9a77..88f19588c 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,5 +1,9 @@ Version 2.1.202 Added Amethyst_Block to experience.yml for Mining + Added Flowering Azalea Leaves to Tree Feller's white list + + NOTES: + This means tree feller will destroy flowering azalea leaves during its ability Version 2.1.201 Tweaked the visual/audio effect for Rupture diff --git a/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java b/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java index f170cfc3b..90104acce 100644 --- a/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java +++ b/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java @@ -1009,6 +1009,7 @@ public class MaterialMapStore { 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"); From 73c465ee64662023706d35fb4def942b20bd1bde Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 28 Sep 2021 16:58:40 -0700 Subject: [PATCH 605/662] Fixed a bug where mcMMO didn't flag all blocks as natural appropriately in some StructureGrowEvent(s) --- src/main/java/com/gmail/nossr50/listeners/WorldListener.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/listeners/WorldListener.java b/src/main/java/com/gmail/nossr50/listeners/WorldListener.java index a08071a04..5abea42b3 100644 --- a/src/main/java/com/gmail/nossr50/listeners/WorldListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/WorldListener.java @@ -29,10 +29,6 @@ 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); } From e55ce00d62dfdfd8719edeef11fa93b78122343a Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 5 Oct 2021 10:13:07 -0700 Subject: [PATCH 606/662] Update changelog --- Changelog.txt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Changelog.txt b/Changelog.txt index 88f19588c..53e4b03bc 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,6 +1,13 @@ Version 2.1.202 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 destroy flowering azalea leaves during its ability From a2e10dbd0c80f9f426ed6947db551fb7e63a20cc Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 5 Oct 2021 11:58:31 -0700 Subject: [PATCH 607/662] Azalea trees bone mealed into existence no longer get marked unnatural Fixes #4640 --- Changelog.txt | 4 ++-- .../gmail/nossr50/listeners/BlockListener.java | 16 ++++++++++++++-- .../java/com/gmail/nossr50/util/BlockUtils.java | 4 ++-- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 53e4b03bc..26f88d6a7 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,4 +1,5 @@ Version 2.1.202 + 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 @@ -8,9 +9,8 @@ Version 2.1.202 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 destroy flowering azalea leaves during its ability + This means tree feller will correctly traverse flowering azalea leaves during its ability Version 2.1.201 Tweaked the visual/audio effect for Rupture diff --git a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java index 0953f00c3..5354d644a 100644 --- a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java @@ -238,7 +238,10 @@ public class BlockListener implements Listener { WorldCompatibilityLayer worldCompatibilityLayer = mcMMO.getCompatibilityManager().getWorldCompatibilityLayer(); if(BlockUtils.isWithinWorldBounds(worldCompatibilityLayer, block)) { - mcMMO.getPlaceStore().setTrue(blockState); + //NOTE: BlockMultiPlace has its own logic so don't handle anything that would overlap + if (!(event instanceof BlockMultiPlaceEvent)) { + mcMMO.getPlaceStore().setTrue(blockState); + } } @@ -276,7 +279,16 @@ public class BlockListener implements Listener { /* Check if the blocks placed should be monitored so they do not give out XP in the future */ if(BlockUtils.isWithinWorldBounds(worldCompatibilityLayer, block)) { - mcMMO.getPlaceStore().setTrue(blockState); + //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); + } } } } diff --git a/src/main/java/com/gmail/nossr50/util/BlockUtils.java b/src/main/java/com/gmail/nossr50/util/BlockUtils.java index c9a00f015..566c95c3a 100644 --- a/src/main/java/com/gmail/nossr50/util/BlockUtils.java +++ b/src/main/java/com/gmail/nossr50/util/BlockUtils.java @@ -285,8 +285,8 @@ public final class BlockUtils { return true; } - public static boolean isPartOfTree(Block rayCast) { - return hasWoodcuttingXP(rayCast.getState()) || isNonWoodPartOfTree(rayCast.getType()); + public static boolean isPartOfTree(Block block) { + return hasWoodcuttingXP(block.getState()) || isNonWoodPartOfTree(block.getType()); } public static boolean isWithinWorldBounds(@NotNull WorldCompatibilityLayer worldCompatibilityLayer, @NotNull Block block) { From f8433cdbcc2c735dd3b38d3fb4caff98f35874bd Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 5 Oct 2021 12:39:56 -0700 Subject: [PATCH 608/662] Fixed Kelp not awarding XP Fixed #4639 Fixed #4110 --- Changelog.txt | 1 + .../skills/herbalism/HerbalismManager.java | 53 ++++++++----------- 2 files changed, 23 insertions(+), 31 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 26f88d6a7..87338abb9 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,4 +1,5 @@ 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 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 6200d9eec..c8c78bd02 100644 --- a/src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java +++ b/src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java @@ -251,6 +251,9 @@ 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; @@ -263,16 +266,6 @@ public class HerbalismManager extends SkillManager { } } - //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; - } - } - } - /* * Mark blocks for double drops * Be aware of the hacky interactions we are doing with Chorus Plants @@ -394,6 +387,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: @@ -530,21 +524,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 @@ -580,17 +571,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; @@ -610,21 +600,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); From def676d8d7a28b7f966014dda28dd3e9933616b3 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 5 Oct 2021 12:41:25 -0700 Subject: [PATCH 609/662] 2.1.202 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index c04d7b8fd..c861f48f1 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.202-SNAPSHOT + 2.1.202 mcMMO https://github.com/mcMMO-Dev/mcMMO From 4bf2ad46ea2f011fc8e82c586ffc01391ae07a96 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 8 Nov 2021 17:36:06 -0800 Subject: [PATCH 610/662] Require Java 16 --- pom.xml | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index c861f48f1..340f4ca5d 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.202 + 2.1.203-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO @@ -14,6 +14,9 @@ UTF-8 + 16 + 16 + 16 @@ -99,11 +102,10 @@ maven-compiler-plugin 3.8.1 + 16 -parameters - 1.8 - 1.8 @@ -128,7 +130,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.2.3 + 3.3.0-SNAPSHOT @@ -207,6 +209,13 @@ + + + maven-snapshots + https://repository.apache.org/content/repositories/snapshots/ + + + spigot-repo From 8eee39b88b95a0bb8fddc0d0ae90ae9deeededfd Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 8 Nov 2021 18:38:50 -0800 Subject: [PATCH 611/662] mcMMO now requires the latest MC version (currently 1.17.1) Fixed a few bugs from API breaks --- Changelog.txt | 16 ++++++++++++ pom.xml | 26 +++++++++---------- .../nossr50/events/fake/FakeBrewEvent.java | 7 +++-- .../skills/alchemy/AlchemyPotionBrewer.java | 10 +++---- .../nossr50/skills/herbalism/Herbalism.java | 22 ++++++++-------- 5 files changed, 50 insertions(+), 31 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 87338abb9..f74b8e20d 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,19 @@ +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) + + 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) diff --git a/pom.xml b/pom.xml index 340f4ca5d..b1736004d 100755 --- a/pom.xml +++ b/pom.xml @@ -256,27 +256,27 @@ net.kyori adventure-text-serializer-gson - 4.9.1 + 4.9.3 net.kyori adventure-api - 4.9.1 + 4.9.3 net.kyori adventure-nbt - 4.9.1 + 4.9.3 net.kyori adventure-key - 4.9.1 + 4.9.3 net.kyori adventure-text-serializer-gson-legacy-impl - 4.9.1 + 4.9.3 net.kyori @@ -291,7 +291,7 @@ org.apache.maven.scm maven-scm-provider-gitexe - 1.9.4 + 1.12.0 org.bstats @@ -302,7 +302,7 @@ org.spigotmc spigot-api - 1.16.5-R0.1-SNAPSHOT + 1.17.1-R0.1-SNAPSHOT provided @@ -332,36 +332,36 @@ org.junit.jupiter junit-jupiter - 5.8.0-M1 + 5.8.1 test org.mockito mockito-core - 3.11.2 + 4.0.0 test org.mockito mockito-inline - 3.11.2 + 4.0.0 test org.apache.tomcat tomcat-jdbc - 10.0.5 + 10.0.12 compile org.jetbrains annotations - 20.1.0 + 22.0.0 com.google.guava guava - 29.0-jre + 31.0.1-jre compile 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 d564ed0d0..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; + +import java.util.List; public class FakeBrewEvent extends BrewEvent implements FakeEvent { - public FakeBrewEvent(Block brewer, BrewerInventory contents, int fuelLevel) { - super(brewer, contents, fuelLevel); + public FakeBrewEvent(Block brewer, BrewerInventory contents, List results, int fuelLevel) { + super(brewer, contents, results, fuelLevel); } } 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 8b9f9ae36..0fa16aa7b 100644 --- a/src/main/java/com/gmail/nossr50/skills/alchemy/AlchemyPotionBrewer.java +++ b/src/main/java/com/gmail/nossr50/skills/alchemy/AlchemyPotionBrewer.java @@ -114,7 +114,7 @@ public final class AlchemyPotionBrewer { } List inputList = new ArrayList<>(); - ItemStack[] outputList = new ItemStack[3]; + var outputList = new ArrayList(); for (int i = 0; i < 3; i++) { ItemStack item = inventory.getItem(i); @@ -129,11 +129,11 @@ public final class AlchemyPotionBrewer { inputList.add(input); if (output != null) { - outputList[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()) { @@ -141,8 +141,8 @@ public final class AlchemyPotionBrewer { } for (int i = 0; i < 3; i++) { - if(outputList[i] != null) { - inventory.setItem(i, outputList[i]); + if(outputList.get(i) != null) { + inventory.setItem(i, outputList.get(i)); } } 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; } } From e287ad47d1075cef49f209a555fe93b1d2081d14 Mon Sep 17 00:00:00 2001 From: Robert Alan Chapton Date: Mon, 8 Nov 2021 18:54:46 -0800 Subject: [PATCH 612/662] updating github actions hope this works --- .github/workflows/maven.yml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 447aa61ba..bea64e883 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -31,12 +31,13 @@ jobs: - name: Checkout repository uses: actions/checkout@v2 - # 2. Setup Java 1.8 JDK - - name: Java 1.8 setup - uses: actions/setup-java@v1.4.3 + # 2. Setup Java 16 JDK (Adopt) + - name: Java 16 setup + uses: actions/setup-java@v2 with: + distribution: 'adopt' java-package: jdk - java-version: 1.8 + java-version: '16' # 3. Setup local Maven package cache to speed up building - name: Cache Maven packages From 182717eacfc93361a57f2dcd2f84a1ec307acd29 Mon Sep 17 00:00:00 2001 From: Enderaoe Date: Tue, 9 Nov 2021 10:57:32 +0800 Subject: [PATCH 613/662] Fix issue #4105 Fishing shake percentage seems off. (#4649) --- .../com/gmail/nossr50/util/random/RandomChanceStatic.java | 4 ++-- .../java/com/gmail/nossr50/util/random/RandomChanceUtil.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) 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 3204a348d..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,9 +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 67982ce59..0191172c1 100644 --- a/src/main/java/com/gmail/nossr50/util/random/RandomChanceUtil.java +++ b/src/main/java/com/gmail/nossr50/util/random/RandomChanceUtil.java @@ -282,10 +282,10 @@ public class RandomChanceUtil { } public static String @NotNull [] calculateAbilityDisplayValuesStatic(@NotNull Player player, @NotNull PrimarySkillType primarySkillType, double chance) { - RandomChanceStatic rcs = new RandomChanceStatic(chance, false); + 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]; From ec0815043e4471b48d2ba80176c63024709ca8c3 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 8 Nov 2021 18:58:11 -0800 Subject: [PATCH 614/662] Update changelog --- Changelog.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/Changelog.txt b/Changelog.txt index f74b8e20d..b7763f646 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -2,6 +2,7 @@ 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) NOTES: If you want to play mcMMO on older versions, simply use 2.1.202 instead From 19c0f6757e802a3ccbb8617640b15b64ef41cc0e Mon Sep 17 00:00:00 2001 From: PikaMug <2267126+PikaMug@users.noreply.github.com> Date: Mon, 8 Nov 2021 22:00:00 -0500 Subject: [PATCH 615/662] Add deprecated constructor w/o startinglevel per d9e195f (#4647) --- .../nossr50/datatypes/player/PlayerProfile.java | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) 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 ff9ebbb70..7f383ed61 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/player/PlayerProfile.java +++ b/src/main/java/com/gmail/nossr50/datatypes/player/PlayerProfile.java @@ -43,12 +43,20 @@ public class PlayerProfile { private final Map rollingSkillsXp = new EnumMap(PrimarySkillType.class); @Deprecated - //TODO: Add deprecated constructor w/o startinglevel + public PlayerProfile(String playerName) { + 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); } - //TODO: Add deprecated constructor w/o startinglevel public PlayerProfile(String playerName, @Nullable UUID uuid, int startingLevel) { this.uuid = uuid; this.playerName = playerName; @@ -80,7 +88,7 @@ public class PlayerProfile { this.loaded = isLoaded; } - public PlayerProfile(@NotNull String playerName, UUID uuid, Map levelData, Map xpData, Map cooldownData, int scoreboardTipsShown, Map uniqueProfileData, @Nullable Long lastLogin) { + 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.scoreboardTipsShown = scoreboardTipsShown; From 81faf93f31545282cc3ef65c145c79687e7e966a Mon Sep 17 00:00:00 2001 From: gecko10000 <60494179+gecko10000@users.noreply.github.com> Date: Tue, 9 Nov 2021 03:01:14 +0000 Subject: [PATCH 616/662] Fix hex colors in broadcasts (#4651) --- .../com/gmail/nossr50/util/player/NotificationManager.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) 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 fb46db146..5ae709683 100644 --- a/src/main/java/com/gmail/nossr50/util/player/NotificationManager.java +++ b/src/main/java/com/gmail/nossr50/util/player/NotificationManager.java @@ -21,6 +21,7 @@ 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; @@ -293,7 +294,7 @@ public class NotificationManager { .asHoverEvent(); String localeMessage = LocaleLoader.getString("Broadcasts.LevelUpMilestone", mmoPlayer.getPlayer().getDisplayName(), level, mcMMO.p.getSkillTools().getLocalizedSkillName(primarySkillType)); - Component message = Component.text(localeMessage).hoverEvent(levelMilestoneHover); + Component message = LegacyComponentSerializer.legacySection().deserialize(localeMessage).hoverEvent(levelMilestoneHover); Bukkit.getScheduler().runTaskLater(mcMMO.p, () -> audience.sendMessage(Identity.nil(), message), 0); } @@ -328,7 +329,7 @@ public class NotificationManager { .asHoverEvent(); String localeMessage = LocaleLoader.getString("Broadcasts.PowerLevelUpMilestone", mmoPlayer.getPlayer().getDisplayName(), powerLevel); - Component message = Component.text(localeMessage).hoverEvent(levelMilestoneHover); + Component message = LegacyComponentSerializer.legacySection().deserialize(localeMessage).hoverEvent(levelMilestoneHover); Bukkit.getScheduler().runTaskLater(mcMMO.p, () -> audience.sendMessage(Identity.nil(), message), 0); } From 20a713e04d0b7de8b8acf55dd1fecb8855978740 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 8 Nov 2021 19:02:37 -0800 Subject: [PATCH 617/662] Update changelog --- Changelog.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Changelog.txt b/Changelog.txt index b7763f646..98a99050f 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -3,6 +3,8 @@ Version 2.1.203 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) NOTES: If you want to play mcMMO on older versions, simply use 2.1.202 instead From 7aaec5b70736433be57c9cd3e2ba30ddbdc59e9e Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 8 Nov 2021 19:07:02 -0800 Subject: [PATCH 618/662] 2.1.203 --- Changelog.txt | 1 + pom.xml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index 98a99050f..9a7a3eb0f 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -5,6 +5,7 @@ Version 2.1.203 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 diff --git a/pom.xml b/pom.xml index b1736004d..6a66c1136 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.203-SNAPSHOT + 2.1.203 mcMMO https://github.com/mcMMO-Dev/mcMMO From 2347fc294f0d29847125b0d0d2ddd7243c34a7df Mon Sep 17 00:00:00 2001 From: gecko10000 <60494179+gecko10000@users.noreply.github.com> Date: Wed, 10 Nov 2021 12:54:31 +0000 Subject: [PATCH 619/662] Fix IndexOutOfBoundsException for fake brew event by adding to list instead of setting the index (which doesn't work) (#4655) --- .../com/gmail/nossr50/skills/alchemy/AlchemyPotionBrewer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 0fa16aa7b..c6e8cff4d 100644 --- a/src/main/java/com/gmail/nossr50/skills/alchemy/AlchemyPotionBrewer.java +++ b/src/main/java/com/gmail/nossr50/skills/alchemy/AlchemyPotionBrewer.java @@ -129,7 +129,7 @@ public final class AlchemyPotionBrewer { inputList.add(input); if (output != null) { - outputList.set(i, output.toItemStack(item.getAmount()).clone()); + outputList.add(output.toItemStack(item.getAmount()).clone()); } } From d185c7538c3851557aa1fba244d8938a55ef093f Mon Sep 17 00:00:00 2001 From: Enderaoe Date: Wed, 10 Nov 2021 20:55:04 +0800 Subject: [PATCH 620/662] Fix issue #4626 double smelting on raw copper (#4652) --- src/main/resources/config.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 4eb9602f0..cc9d2b4db 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -620,7 +620,8 @@ Bonus_Drops: Quartz: true Redstone: true Deepslate: true - + Copper_Ingot: true + Netherite_Scrap: true # # Settings for commands ### From 5b1a69b3f7fd8be9d2b83e61565069bb1a7120d8 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Wed, 10 Nov 2021 14:55:54 -0800 Subject: [PATCH 621/662] 2.1.204 --- Changelog.txt | 4 ++++ pom.xml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index 9a7a3eb0f..48f14c92f 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,7 @@ +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) diff --git a/pom.xml b/pom.xml index 6a66c1136..15eab5229 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.203 + 2.1.204 mcMMO https://github.com/mcMMO-Dev/mcMMO From ba1f15b65556552220bde10f8ef5841e86802ef0 Mon Sep 17 00:00:00 2001 From: NemuruYama Date: Sun, 14 Nov 2021 17:05:42 +0100 Subject: [PATCH 622/662] Fixed the alchemy properly (#4658) --- .../nossr50/skills/alchemy/AlchemyPotionBrewer.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) 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 c6e8cff4d..2a7559af7 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 { @@ -113,8 +114,8 @@ public final class AlchemyPotionBrewer { return; } - List inputList = new ArrayList<>(); - var outputList = 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); @@ -126,10 +127,10 @@ 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) { - outputList.add(output.toItemStack(item.getAmount()).clone()); + outputList.set(i, output.toItemStack(item.getAmount()).clone()); } } @@ -149,6 +150,8 @@ public final class AlchemyPotionBrewer { removeIngredient(inventory, player); for (AlchemyPotion input : inputList) { + if (input == null) continue;; + AlchemyPotion output = input.getChild(ingredient); if (output != null && player != null) { From 8d27e8fccf3342a11574d736817f4cec98956f3b Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sun, 14 Nov 2021 09:33:27 -0800 Subject: [PATCH 623/662] 2.1.205 --- Changelog.txt | 7 ++ pom.xml | 2 +- .../com/gmail/nossr50/api/AbilityAPI.java | 4 +- .../commands/player/McrankCommand.java | 5 +- .../nossr50/commands/player/MctopCommand.java | 5 +- .../nossr50/datatypes/player/McMMOPlayer.java | 9 +-- .../nossr50/listeners/BlockListener.java | 8 +-- .../nossr50/listeners/EntityListener.java | 42 ++++++----- .../nossr50/listeners/InventoryListener.java | 3 +- .../nossr50/listeners/PlayerListener.java | 19 +++-- src/main/java/com/gmail/nossr50/mcMMO.java | 27 +------- .../MobHealthDisplayUpdaterTask.java | 13 ++-- .../nossr50/runnables/PistonTrackerTask.java | 5 +- .../commands/McrankCommandDisplayTask.java | 3 +- .../commands/MctopCommandDisplayTask.java | 3 +- .../runnables/skills/AbilityDisableTask.java | 1 - .../runnables/skills/DelayedCropReplant.java | 5 +- .../nossr50/runnables/skills/RuptureTask.java | 3 +- .../skills/acrobatics/AcrobaticsManager.java | 11 +-- .../skills/alchemy/AlchemyPotionBrewer.java | 2 +- .../skills/archery/ArcheryManager.java | 9 +-- .../skills/fishing/FishingManager.java | 4 +- .../skills/herbalism/HerbalismManager.java | 12 ++-- .../nossr50/skills/mining/BlastMining.java | 5 +- .../nossr50/skills/mining/MiningManager.java | 2 +- .../nossr50/skills/smelting/Smelting.java | 1 - .../nossr50/skills/swords/SwordsManager.java | 7 +- .../skills/unarmed/UnarmedManager.java | 7 +- .../com/gmail/nossr50/util/BlockUtils.java | 6 +- .../gmail/nossr50/util/MetadataConstants.java | 69 +++++++++++++++++++ .../gmail/nossr50/util/MobHealthbarUtils.java | 14 ++-- .../nossr50/util/TransientMetadataTools.java | 48 ++++++------- .../nossr50/util/commands/CommandUtils.java | 3 +- .../AbstractPersistentDataLayer.java | 42 ++++------- .../SpigotPersistentDataLayer_1_13.java | 49 +++++-------- .../SpigotPersistentDataLayer_1_14.java | 3 +- .../nossr50/util/player/UserManager.java | 11 +-- .../nossr50/util/skills/CombatUtils.java | 30 ++++---- .../flatfile/FlatFileDataUtilTest.java | 5 +- .../util/blockmeta/ChunkStoreTest.java | 35 +++------- .../platform/MinecraftGameVersionTest.java | 7 +- 41 files changed, 279 insertions(+), 267 deletions(-) create mode 100644 src/main/java/com/gmail/nossr50/util/MetadataConstants.java diff --git a/Changelog.txt b/Changelog.txt index 48f14c92f..f7d170248 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,10 @@ +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) diff --git a/pom.xml b/pom.xml index 15eab5229..226737f9f 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.204 + 2.1.205 mcMMO https://github.com/mcMMO-Dev/mcMMO diff --git a/src/main/java/com/gmail/nossr50/api/AbilityAPI.java b/src/main/java/com/gmail/nossr50/api/AbilityAPI.java index ad68b9d7e..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.mcMMO; +import com.gmail.nossr50.util.MetadataConstants; import com.gmail.nossr50.util.player.UserManager; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; @@ -84,7 +84,7 @@ public final class AbilityAPI { public static boolean isBleeding(LivingEntity entity) { if(entity.isValid()) { - if(entity.hasMetadata(mcMMO.RUPTURE_META_KEY)) { + if(entity.hasMetadata(MetadataConstants.METADATA_KEY_RUPTURE)) { return true; } } 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 4958cbc54..080be4e08 100644 --- a/src/main/java/com/gmail/nossr50/commands/player/McrankCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/player/McrankCommand.java @@ -4,6 +4,7 @@ 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; @@ -97,11 +98,11 @@ public class McrankCommand 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(); 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 04f0f82e1..aaf660bc1 100644 --- a/src/main/java/com/gmail/nossr50/commands/player/MctopCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/player/MctopCommand.java @@ -5,6 +5,7 @@ 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.commands.CommandUtils; import com.gmail.nossr50.util.player.UserManager; @@ -97,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(); 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 609b4012d..f60583457 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java +++ b/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java @@ -41,10 +41,7 @@ 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.BlockUtils; -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; @@ -1137,8 +1134,8 @@ public class McMMOPlayer implements Identified { */ public void logout(boolean syncSave) { Player thisPlayer = getPlayer(); - if(getPlayer().hasMetadata(mcMMO.RUPTURE_META_KEY)) { - RuptureTaskMeta ruptureTaskMeta = (RuptureTaskMeta) getPlayer().getMetadata(mcMMO.RUPTURE_META_KEY).get(0); + if(getPlayer().hasMetadata(MetadataConstants.METADATA_KEY_RUPTURE)) { + RuptureTaskMeta ruptureTaskMeta = (RuptureTaskMeta) getPlayer().getMetadata(MetadataConstants.METADATA_KEY_RUPTURE).get(0); //Punish a logout ruptureTaskMeta.getRuptureTimerTask().endRupture(); diff --git a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java index 5354d644a..ecd774e40 100644 --- a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java @@ -91,8 +91,8 @@ 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++) { @@ -102,8 +102,8 @@ public class BlockListener implements Listener { } } - 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); } /** diff --git a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java index bca418f97..4c337154f 100644 --- a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java @@ -17,10 +17,7 @@ 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.ItemUtils; -import com.gmail.nossr50.util.Misc; -import com.gmail.nossr50.util.Permissions; +import com.gmail.nossr50.util.*; import com.gmail.nossr50.util.compat.layers.persistentdata.AbstractPersistentDataLayer; import com.gmail.nossr50.util.compat.layers.persistentdata.MobMetaFlagType; import com.gmail.nossr50.util.player.NotificationManager; @@ -159,11 +156,11 @@ public class EntityListener implements Listener { if (bow != null && bow.containsEnchantment(Enchantment.ARROW_INFINITE)) { - projectile.setMetadata(mcMMO.infiniteArrowKey, mcMMO.metadataValue); + projectile.setMetadata(MetadataConstants.METADATA_KEY_INF_ARROW, MetadataConstants.MCMMO_METADATA_VALUE); } - projectile.setMetadata(mcMMO.bowForceKey, new FixedMetadataValue(pluginRef, Math.min(event.getForce() * mcMMO.p.getAdvancedConfig().getForceMultiplier(), 1.0))); - projectile.setMetadata(mcMMO.arrowDistanceKey, new FixedMetadataValue(pluginRef, projectile.getLocation())); + 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); } @@ -191,11 +188,11 @@ public class EntityListener implements Listener { 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 - if(!projectile.hasMetadata(mcMMO.bowForceKey)) - projectile.setMetadata(mcMMO.bowForceKey, new FixedMetadataValue(pluginRef, 1.0)); + if(!projectile.hasMetadata(MetadataConstants.METADATA_KEY_BOW_FORCE)) + projectile.setMetadata(MetadataConstants.METADATA_KEY_BOW_FORCE, new FixedMetadataValue(pluginRef, 1.0)); - if(!projectile.hasMetadata(mcMMO.arrowDistanceKey)) - projectile.setMetadata(mcMMO.arrowDistanceKey, new FixedMetadataValue(pluginRef, projectile.getLocation())); + 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")) { @@ -203,7 +200,7 @@ public class EntityListener implements Listener { } if (RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.ARCHERY_ARROW_RETRIEVAL, player)) { - projectile.setMetadata(mcMMO.trackedArrow, mcMMO.metadataValue); + projectile.setMetadata(MetadataConstants.METADATA_KEY_TRACKED_ARROW, MetadataConstants.MCMMO_METADATA_VALUE); } } } @@ -240,12 +237,12 @@ public class EntityListener implements Listener { * 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.travelingBlock); + boolean isTracked = entity.hasMetadata(MetadataConstants.METADATA_KEY_TRAVELING_BLOCK); if (mcMMO.getPlaceStore().isTrue(block) && !isTracked) { mcMMO.getPlaceStore().setFalse(block); - entity.setMetadata(mcMMO.travelingBlock, mcMMO.metadataValue); + entity.setMetadata(MetadataConstants.METADATA_KEY_TRAVELING_BLOCK, MetadataConstants.MCMMO_METADATA_VALUE); } else if (isTracked) { mcMMO.getPlaceStore().setTrue(block); @@ -254,7 +251,6 @@ public class EntityListener implements Listener { //Redstone ore fire this event and should be ignored } else { - if (mcMMO.getPlaceStore().isTrue(block)) { mcMMO.getPlaceStore().setFalse(block); } @@ -490,8 +486,8 @@ public class EntityListener implements Listener { if(WorldBlacklist.isWorldBlacklisted(event.getEntity().getWorld())) return; - if(event.getEntity().hasMetadata(mcMMO.EXPLOSION_FROM_RUPTURE)) { - event.getEntity().removeMetadata(mcMMO.EXPLOSION_FROM_RUPTURE, mcMMO.p); + 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) @@ -666,7 +662,7 @@ public class EntityListener implements Listener { */ @EventHandler(priority = EventPriority.LOWEST) public void onEntityDeathLowest(EntityDeathEvent event) { - mcMMO.getTransientMetadataTools().cleanAllLivingEntityMetadata(event.getEntity()); + mcMMO.getTransientMetadataTools().cleanLivingEntityMetadata(event.getEntity()); } /** @@ -773,13 +769,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 = pluginRef.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; @@ -819,13 +815,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 = pluginRef.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; @@ -1095,4 +1091,6 @@ public class EntityListener implements Listener { } } } + + } diff --git a/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java b/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java index 7dcc671b2..f675ec4f7 100644 --- a/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java @@ -10,6 +10,7 @@ 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; @@ -427,7 +428,7 @@ public class InventoryListener implements Listener { final HumanEntity whoClicked = event.getWhoClicked(); - if (!whoClicked.hasMetadata(mcMMO.playerDataKey)) { + if (!whoClicked.hasMetadata(MetadataConstants.METADATA_KEY_PLAYER_DATA)) { return; } diff --git a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java index da8661749..f1d53c47f 100644 --- a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java @@ -6,7 +6,6 @@ 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.interfaces.Skill; import com.gmail.nossr50.datatypes.skills.subskills.taming.CallOfTheWildType; import com.gmail.nossr50.events.McMMOReplaceVanillaTreasureEvent; import com.gmail.nossr50.events.fake.FakePlayerAnimationEvent; @@ -185,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; } @@ -273,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); @@ -404,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()); } @@ -515,19 +514,19 @@ public class PlayerListener implements Listener { 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()) { @@ -574,7 +573,7 @@ public class PlayerListener implements Listener { //Use a sync save if the server is shutting down to avoid race conditions mcMMOPlayer.logout(mcMMO.isServerShutdownExecuted()); - mcMMO.getTransientMetadataTools().cleanAllLivingEntityMetadata(event.getPlayer()); + mcMMO.getTransientMetadataTools().cleanLivingEntityMetadata(event.getPlayer()); } /** diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index 407072cf6..6656f4512 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -75,6 +75,8 @@ import java.util.ArrayList; import java.util.List; public class mcMMO extends JavaPlugin { + + /* Managers */ private static PlatformManager platformManager; private static ChunkManager placeStore; @@ -129,29 +131,6 @@ public class mcMMO extends JavaPlugin { private static boolean isRetroModeEnabled; - /* Metadata Values */ - public static final String REPLANT_META_KEY = "mcMMO: Recently Replanted"; - public static final String EXPLOSION_FROM_RUPTURE = "mcMMO: Rupture Explosion"; - public static final String RUPTURE_META_KEY = "mcMMO: RuptureTask"; - 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 travelingBlock = "mcMMO: Traveling Block"; - public static final String blockMetadataKey = "mcMMO: Piston Tracking"; - public static final String tntMetadataKey = "mcMMO: Tracked TNT"; - public static final String customNameKey = "mcMMO: Custom Name"; - public static final String customVisibleKey = "mcMMO: Name Visibility"; - public static final String droppedItemKey = "mcMMO: Tracked Item"; - public static final String infiniteArrowKey = "mcMMO: Infinite Arrow"; - public static final String trackedArrow = "mcMMO: Tracked Arrow"; - public static final String bowForceKey = "mcMMO: Bow Force"; - public static final String arrowDistanceKey = "mcMMO: Arrow Distance"; - public static final String BONUS_DROPS_METAKEY = "mcMMO: Double Drops"; - public static final String disarmedItemKey = "mcMMO: Disarmed Item"; - public static final String playerDataKey = "mcMMO: Player Data"; - public static final String databaseCommandKey = "mcMMO: Processing Database Command"; - - public static FixedMetadataValue metadataValue; private long purgeTime = 2630000000L; private GeneralConfig generalConfig; @@ -199,7 +178,7 @@ public class mcMMO extends JavaPlugin { //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; diff --git a/src/main/java/com/gmail/nossr50/runnables/MobHealthDisplayUpdaterTask.java b/src/main/java/com/gmail/nossr50/runnables/MobHealthDisplayUpdaterTask.java index 3e5cc78cc..e43e63865 100644 --- a/src/main/java/com/gmail/nossr50/runnables/MobHealthDisplayUpdaterTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/MobHealthDisplayUpdaterTask.java @@ -1,6 +1,7 @@ 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; @@ -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_KEY)) { + target.setCustomName(target.getMetadata(MetadataConstants.METADATA_KEY_CUSTOM_NAME_KEY).get(0).asString()); + target.removeMetadata(MetadataConstants.METADATA_KEY_CUSTOM_NAME_KEY, 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 61daa764d..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; @@ -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/commands/McrankCommandDisplayTask.java b/src/main/java/com/gmail/nossr50/runnables/commands/McrankCommandDisplayTask.java index 8b3c96dfe..76a68345d 100644 --- a/src/main/java/com/gmail/nossr50/runnables/commands/McrankCommandDisplayTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/commands/McrankCommandDisplayTask.java @@ -3,6 +3,7 @@ package com.gmail.nossr50.runnables.commands; 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; @@ -37,7 +38,7 @@ public class McrankCommandDisplayTask extends BukkitRunnable { if (useChat) { displayChat(); } - ((Player) sender).removeMetadata(mcMMO.databaseCommandKey, mcMMO.p); + ((Player) sender).removeMetadata(MetadataConstants.METADATA_KEY_DATABASE_COMMAND, mcMMO.p); } private void displayChat() { 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 babae32fd..f105faa42 100644 --- a/src/main/java/com/gmail/nossr50/runnables/commands/MctopCommandDisplayTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/commands/MctopCommandDisplayTask.java @@ -4,6 +4,7 @@ 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; @@ -42,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")); 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 2c4f5d1cc..876aba4ca 100644 --- a/src/main/java/com/gmail/nossr50/runnables/skills/AbilityDisableTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/skills/AbilityDisableTask.java @@ -7,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; 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 64fee44f6..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; @@ -171,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/RuptureTask.java b/src/main/java/com/gmail/nossr50/runnables/skills/RuptureTask.java index 29c6d6e5b..beb7cae3f 100644 --- a/src/main/java/com/gmail/nossr50/runnables/skills/RuptureTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/skills/RuptureTask.java @@ -3,6 +3,7 @@ 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; @@ -63,7 +64,7 @@ public class RuptureTask extends BukkitRunnable { endRupture(); } } else { - targetEntity.removeMetadata(mcMMO.RUPTURE_META_KEY, mcMMO.p); + targetEntity.removeMetadata(MetadataConstants.METADATA_KEY_RUPTURE, mcMMO.p); this.cancel(); //Task no longer needed } } 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 570ee05a6..4ce109e6c 100644 --- a/src/main/java/com/gmail/nossr50/skills/acrobatics/AcrobaticsManager.java +++ b/src/main/java/com/gmail/nossr50/skills/acrobatics/AcrobaticsManager.java @@ -9,6 +9,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; @@ -101,18 +102,18 @@ public class AcrobaticsManager extends SkillManager { if (SkillUtils.cooldownExpired(mmoPlayer.getRespawnATS(), Misc.PLAYER_RESPAWN_COOLDOWN_SECONDS)) { if(!(attacker instanceof Player)) { //Check to see how many dodge XP rewards this mob has handed out - if(attacker.hasMetadata(mcMMO.DODGE_TRACKER) && ExperienceConfig.getInstance().isAcrobaticsExploitingPrevented()) { + if(attacker.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 = attacker.getMetadata(MetadataConstants.METADATA_KEY_DODGE_TRACKER).get(0); + int count = attacker.getMetadata(MetadataConstants.METADATA_KEY_DODGE_TRACKER).get(0).asInt(); if(count <= 5) { applyXpGain((float) (damage * Acrobatics.dodgeXpModifier), XPGainReason.PVE); - attacker.setMetadata(mcMMO.DODGE_TRACKER, new FixedMetadataValue(mcMMO.p, count + 1)); + attacker.setMetadata(MetadataConstants.METADATA_KEY_DODGE_TRACKER, new FixedMetadataValue(mcMMO.p, count + 1)); } } else { applyXpGain((float) (damage * Acrobatics.dodgeXpModifier), XPGainReason.PVE); - attacker.setMetadata(mcMMO.DODGE_TRACKER, new FixedMetadataValue(mcMMO.p, 1)); + attacker.setMetadata(MetadataConstants.METADATA_KEY_DODGE_TRACKER, new FixedMetadataValue(mcMMO.p, 1)); } } } 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 2a7559af7..116fe64e6 100644 --- a/src/main/java/com/gmail/nossr50/skills/alchemy/AlchemyPotionBrewer.java +++ b/src/main/java/com/gmail/nossr50/skills/alchemy/AlchemyPotionBrewer.java @@ -150,7 +150,7 @@ public final class AlchemyPotionBrewer { removeIngredient(inventory, player); for (AlchemyPotion input : inputList) { - if (input == null) continue;; + if (input == null) continue; AlchemyPotion output = input.getChild(ingredient); 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 8ef8a0e1a..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; @@ -54,10 +55,10 @@ public class ArcheryManager extends SkillManager { */ public double distanceXpBonusMultiplier(LivingEntity target, Entity arrow) { //Hacky Fix - some plugins spawn arrows and assign them to players after the ProjectileLaunchEvent fires - if(!arrow.hasMetadata(mcMMO.arrowDistanceKey)) + if(!arrow.hasMetadata(MetadataConstants.METADATA_KEY_ARROW_DISTANCE)) return 1; - Location firedLocation = (Location) arrow.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) @@ -76,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 } } 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 1787a106e..a0f4f014a 100644 --- a/src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java @@ -100,10 +100,10 @@ public class FishingManager extends SkillManager { 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(); 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 c8c78bd02..deacafabf 100644 --- a/src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java +++ b/src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java @@ -217,10 +217,10 @@ public class HerbalismManager extends SkillManager { 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(blockBreakEvent.getBlock().getMetadata(MetadataConstants.METADATA_KEY_REPLANT).size() >= 1) { + if(blockBreakEvent.getBlock().getMetadata(MetadataConstants.METADATA_KEY_REPLANT).get(0).asBoolean()) { if(isAgeableMature(ageableCrop)) { - blockBreakEvent.getBlock().removeMetadata(mcMMO.REPLANT_META_KEY, mcMMO.p); + blockBreakEvent.getBlock().removeMetadata(MetadataConstants.METADATA_KEY_REPLANT, mcMMO.p); } else { //Crop is recently replanted to back out of destroying it blockBreakEvent.setCancelled(true); @@ -488,8 +488,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 @@ -744,7 +744,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)); } /** 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 f2df8399d..23fde19d3 100644 --- a/src/main/java/com/gmail/nossr50/skills/mining/BlastMining.java +++ b/src/main/java/com/gmail/nossr50/skills/mining/BlastMining.java @@ -2,6 +2,7 @@ package com.gmail.nossr50.skills.mining; 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; @@ -91,12 +92,12 @@ 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 != null && player.equals(defender))) { return false; 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 61a42e29b..2d91949a8 100644 --- a/src/main/java/com/gmail/nossr50/skills/mining/MiningManager.java +++ b/src/main/java/com/gmail/nossr50/skills/mining/MiningManager.java @@ -121,7 +121,7 @@ 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, mmoPlayer.getPlayerMetadata()); + tnt.setMetadata(MetadataConstants.METADATA_KEY_TRACKED_TNT, mmoPlayer.getPlayerMetadata()); tnt.setFuseTicks(0); if (mcMMO.getCompatibilityManager().getMinecraftGameVersion().isAtLeast(1, 16, 4)) { tnt.setSource(player); 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 d1367a030..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,7 +2,6 @@ package com.gmail.nossr50.skills.smelting; import com.gmail.nossr50.config.experience.ExperienceConfig; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; -import com.gmail.nossr50.mcMMO; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; 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 871f72ef1..7d864e36e 100644 --- a/src/main/java/com/gmail/nossr50/skills/swords/SwordsManager.java +++ b/src/main/java/com/gmail/nossr50/skills/swords/SwordsManager.java @@ -11,6 +11,7 @@ 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; @@ -66,8 +67,8 @@ public class SwordsManager extends SkillManager { if(!canUseRupture()) return; - if(target.hasMetadata(mcMMO.RUPTURE_META_KEY)) { - RuptureTaskMeta ruptureTaskMeta = (RuptureTaskMeta) target.getMetadata(mcMMO.RUPTURE_META_KEY).get(0); + 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()); @@ -99,7 +100,7 @@ public class SwordsManager extends SkillManager { RuptureTaskMeta ruptureTaskMeta = new RuptureTaskMeta(mcMMO.p, ruptureTask); ruptureTask.runTaskTimer(mcMMO.p, 0, 1); - target.setMetadata(mcMMO.RUPTURE_META_KEY, ruptureTaskMeta); + target.setMetadata(MetadataConstants.METADATA_KEY_RUPTURE, ruptureTaskMeta); // if (mmoPlayer.useChatNotifications()) { // NotificationManager.sendPlayerInformation(getPlayer(), NotificationType.SUBSKILL_MESSAGE, "Swords.Combat.Bleeding"); 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 4ad595a8e..93dc5eef5 100644 --- a/src/main/java/com/gmail/nossr50/skills/unarmed/UnarmedManager.java +++ b/src/main/java/com/gmail/nossr50/skills/unarmed/UnarmedManager.java @@ -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; @@ -113,7 +110,7 @@ public class UnarmedManager extends SkillManager { Item item = Misc.spawnItem(getPlayer(), defender.getLocation(), defender.getInventory().getItemInMainHand(), ItemSpawnReason.UNARMED_DISARMED_ITEM); if (item != null && mcMMO.p.getAdvancedConfig().getDisarmProtected()) { - item.setMetadata(mcMMO.disarmedItemKey, UserManager.getPlayer(defender).getPlayerMetadata()); + item.setMetadata(MetadataConstants.METADATA_KEY_DISARMED_ITEM, UserManager.getPlayer(defender).getPlayerMetadata()); } defender.getInventory().setItemInMainHand(new ItemStack(Material.AIR)); diff --git a/src/main/java/com/gmail/nossr50/util/BlockUtils.java b/src/main/java/com/gmail/nossr50/util/BlockUtils.java index 566c95c3a..24afa68e7 100644 --- a/src/main/java/com/gmail/nossr50/util/BlockUtils.java +++ b/src/main/java/com/gmail/nossr50/util/BlockUtils.java @@ -34,9 +34,9 @@ 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)); } /** @@ -45,7 +45,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)); } /** 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..64c9058ff --- /dev/null +++ b/src/main/java/com/gmail/nossr50/util/MetadataConstants.java @@ -0,0 +1,69 @@ +package com.gmail.nossr50.util; + +import org.bukkit.metadata.FixedMetadataValue; +import org.jetbrains.annotations.NotNull; + +import java.util.HashSet; +import java.util.Set; + +/** + * 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_KEY = "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 Set MOB_METADATA_KEYS; + + public static FixedMetadataValue MCMMO_METADATA_VALUE; + + static { + MOB_METADATA_KEYS = new HashSet<>(); + MOB_METADATA_KEYS.add(MetadataConstants.METADATA_KEY_MOB_SPAWNER_MOB); + MOB_METADATA_KEYS.add(MetadataConstants.METADATA_KEY_EGG_MOB); + MOB_METADATA_KEYS.add(MetadataConstants.METADATA_KEY_NETHER_PORTAL_MOB); + MOB_METADATA_KEYS.add(MetadataConstants.METADATA_KEY_COTW_SUMMONED_MOB); + MOB_METADATA_KEYS.add(MetadataConstants.METADATA_KEY_PLAYER_BRED_MOB); + MOB_METADATA_KEYS.add(MetadataConstants.METADATA_KEY_PLAYER_TAMED_MOB); + MOB_METADATA_KEYS.add(MetadataConstants.METADATA_KEY_EXPLOITED_ENDERMEN); + MOB_METADATA_KEYS.add(MetadataConstants.METADATA_KEY_CUSTOM_NAME_KEY); + MOB_METADATA_KEYS.add(MetadataConstants.METADATA_KEY_RUPTURE); + MOB_METADATA_KEYS.add(MetadataConstants.METADATA_KEY_EXPLOSION_FROM_RUPTURE); + MOB_METADATA_KEYS.add(MetadataConstants.METADATA_KEY_OLD_NAME_KEY); + } +} diff --git a/src/main/java/com/gmail/nossr50/util/MobHealthbarUtils.java b/src/main/java/com/gmail/nossr50/util/MobHealthbarUtils.java index ff77f38e8..d2cbd38e0 100644 --- a/src/main/java/com/gmail/nossr50/util/MobHealthbarUtils.java +++ b/src/main/java/com/gmail/nossr50/util/MobHealthbarUtils.java @@ -54,8 +54,8 @@ public final class MobHealthbarUtils { /* * Store the name in metadata */ - if(target.getMetadata(TransientMetadataTools.OLD_NAME_METAKEY).size() <= 0 && originalName != null) - target.setMetadata(TransientMetadataTools.OLD_NAME_METAKEY, 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 = ""; @@ -73,12 +73,12 @@ public final class MobHealthbarUtils { 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_KEY, 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_KEY)) { + target.setMetadata(MetadataConstants.METADATA_KEY_CUSTOM_NAME_KEY, 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 diff --git a/src/main/java/com/gmail/nossr50/util/TransientMetadataTools.java b/src/main/java/com/gmail/nossr50/util/TransientMetadataTools.java index b32945525..56666a969 100644 --- a/src/main/java/com/gmail/nossr50/util/TransientMetadataTools.java +++ b/src/main/java/com/gmail/nossr50/util/TransientMetadataTools.java @@ -1,48 +1,50 @@ package com.gmail.nossr50.util; import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.util.skills.CombatUtils; +import org.bukkit.entity.Entity; import org.bukkit.entity.LivingEntity; +import org.checkerframework.common.returnsreceiver.qual.This; import org.jetbrains.annotations.NotNull; public class TransientMetadataTools { - public static final String OLD_NAME_METAKEY = TransientMetadataTools.OLD_NAME_METAKEY; private final mcMMO pluginRef; public TransientMetadataTools(@NotNull mcMMO pluginRef) { this.pluginRef = pluginRef; } - public void cleanAllLivingEntityMetadata(@NotNull LivingEntity livingEntity) { - //Since its not written anywhere, apparently the GC won't touch objects with metadata still present on them - if (livingEntity.hasMetadata(mcMMO.customNameKey)) { - livingEntity.setCustomName(livingEntity.getMetadata(mcMMO.customNameKey).get(0).asString()); - livingEntity.removeMetadata(mcMMO.customNameKey, 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_KEY)) { + entity.setCustomName(entity.getMetadata(MetadataConstants.METADATA_KEY_CUSTOM_NAME_KEY).get(0).asString()); + entity.removeMetadata(MetadataConstants.METADATA_KEY_CUSTOM_NAME_KEY, pluginRef); } - if(livingEntity.hasMetadata(OLD_NAME_METAKEY)) { - livingEntity.removeMetadata(OLD_NAME_METAKEY, pluginRef); - } +// if(entity.hasMetadata(MetadataConstants.METADATA_KEY_OLD_NAME_KEY)) { +// CombatUtils.fixNames(entity); +// entity.removeMetadata(MetadataConstants.METADATA_KEY_OLD_NAME_KEY, pluginRef); +// } //Involved in changing mob names to hearts - if (livingEntity.hasMetadata(mcMMO.customVisibleKey)) { - livingEntity.setCustomNameVisible(livingEntity.getMetadata(mcMMO.customVisibleKey).get(0).asBoolean()); - livingEntity.removeMetadata(mcMMO.customVisibleKey, pluginRef); + 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(livingEntity.hasMetadata(mcMMO.travelingBlock)) { - livingEntity.removeMetadata(mcMMO.travelingBlock, pluginRef); - } - - if(livingEntity.hasMetadata(mcMMO.RUPTURE_META_KEY)) { - livingEntity.removeMetadata(mcMMO.RUPTURE_META_KEY, pluginRef); - } - - if(livingEntity.hasMetadata(mcMMO.EXPLOSION_FROM_RUPTURE)) { - livingEntity.removeMetadata(mcMMO.EXPLOSION_FROM_RUPTURE, pluginRef); + if(entity.hasMetadata(MetadataConstants.METADATA_KEY_TRAVELING_BLOCK)) { + entity.removeMetadata(MetadataConstants.METADATA_KEY_TRAVELING_BLOCK, pluginRef); } //Cleanup mob metadata - mcMMO.getCompatibilityManager().getPersistentDataLayer().removeMobFlags(livingEntity); + mcMMO.getCompatibilityManager().getPersistentDataLayer().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/commands/CommandUtils.java b/src/main/java/com/gmail/nossr50/util/commands/CommandUtils.java index cda34dd8b..fcbd2fdbe 100644 --- a/src/main/java/com/gmail/nossr50/util/commands/CommandUtils.java +++ b/src/main/java/com/gmail/nossr50/util/commands/CommandUtils.java @@ -5,6 +5,7 @@ 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.player.UserManager; import com.gmail.nossr50.util.skills.SkillTools; @@ -110,7 +111,7 @@ public final class CommandUtils { 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")); diff --git a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/AbstractPersistentDataLayer.java b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/AbstractPersistentDataLayer.java index 9a3af55bf..7ecf6dfb3 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/AbstractPersistentDataLayer.java +++ b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/AbstractPersistentDataLayer.java @@ -1,6 +1,7 @@ package com.gmail.nossr50.util.compat.layers.persistentdata; import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.util.MetadataConstants; import com.gmail.nossr50.util.compat.layers.AbstractCompatibilityLayer; import org.bukkit.NamespacedKey; import org.bukkit.block.Furnace; @@ -25,42 +26,23 @@ public abstract class AbstractPersistentDataLayer extends AbstractCompatibilityL protected final @NotNull NamespacedKey NSK_VILLAGER_TRADE_ORIGIN_ITEM; protected final @NotNull NamespacedKey NSK_EXPLOITED_ENDERMEN; - //Never change these constants - public final @NotNull String STR_SUPER_ABILITY_BOOSTED_ITEM = "super_ability_boosted"; - public final @NotNull String STR_MOB_SPAWNER_MOB = "mcmmo_mob_spawner_mob"; - public final @NotNull String STR_EGG_MOB = "mcmmo_egg_mob"; - public final @NotNull String STR_NETHER_PORTAL_MOB = "mcmmo_nethergate_mob"; - public final @NotNull String STR_COTW_SUMMONED_MOB = "mcmmo_cotw_summoned_mob"; - public final @NotNull String STR_PLAYER_BRED_MOB = "mcmmo_player_bred_mob"; - public final @NotNull String STR_PLAYER_TAMED_MOB = "mcmmo_player_tamed_mob"; - public final @NotNull String STR_VILLAGER_TRADE_ORIGIN_ITEM = "mcmmo_villager_trade_origin_item"; - public final @NotNull String STR_EXPLOITED_ENDERMEN = "mcmmo_exploited_endermen"; - - /* - * Don't modify these keys - */ - public final @NotNull String STR_FURNACE_UUID_MOST_SIG = "furnace_uuid_most_sig"; - public final @NotNull String STR_FURNACE_UUID_LEAST_SIG = "furnace_uuid_least_sig"; - protected final @NotNull NamespacedKey NSK_FURNACE_UUID_MOST_SIG; protected final @NotNull NamespacedKey NSK_FURNACE_UUID_LEAST_SIG; public final @NotNull String LEGACY_ABILITY_TOOL_LORE = "mcMMO Ability Tool"; - protected static final byte SIMPLE_FLAG_VALUE = (byte) 0x1; - public AbstractPersistentDataLayer() { - NSK_SUPER_ABILITY_BOOSTED_ITEM = getNamespacedKey(STR_SUPER_ABILITY_BOOSTED_ITEM); - NSK_MOB_SPAWNER_MOB = getNamespacedKey(STR_MOB_SPAWNER_MOB); - NSK_EGG_MOB = getNamespacedKey(STR_EGG_MOB); - NSK_NETHER_GATE_MOB = getNamespacedKey(STR_NETHER_PORTAL_MOB); - NSK_COTW_SUMMONED_MOB = getNamespacedKey(STR_COTW_SUMMONED_MOB); - NSK_PLAYER_BRED_MOB = getNamespacedKey(STR_PLAYER_BRED_MOB); - NSK_PLAYER_TAMED_MOB = getNamespacedKey(STR_PLAYER_TAMED_MOB); - NSK_VILLAGER_TRADE_ORIGIN_ITEM = getNamespacedKey(STR_VILLAGER_TRADE_ORIGIN_ITEM); - NSK_EXPLOITED_ENDERMEN = getNamespacedKey(STR_EXPLOITED_ENDERMEN); - NSK_FURNACE_UUID_MOST_SIG = getNamespacedKey(STR_FURNACE_UUID_MOST_SIG); - NSK_FURNACE_UUID_LEAST_SIG = getNamespacedKey(STR_FURNACE_UUID_LEAST_SIG); + 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); initializeLayer(); } diff --git a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer_1_13.java b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer_1_13.java index 219a2cf4b..8f7877a1e 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer_1_13.java +++ b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer_1_13.java @@ -3,6 +3,7 @@ package com.gmail.nossr50.util.compat.layers.persistentdata; import com.gmail.nossr50.api.exceptions.IncompleteNamespacedKeyRegister; import com.gmail.nossr50.datatypes.meta.UUIDMeta; import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.util.MetadataConstants; import org.bukkit.block.Furnace; import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.LivingEntity; @@ -36,30 +37,15 @@ public class SpigotPersistentDataLayer_1_13 extends AbstractPersistentDataLayer private void initMobFlagKeyMap() throws IncompleteNamespacedKeyRegister { for(MobMetaFlagType flagType : MobMetaFlagType.values()) { - switch(flagType) { - case MOB_SPAWNER_MOB: - mobFlagKeyMap.put(flagType, STR_MOB_SPAWNER_MOB); - break; - case EGG_MOB: - mobFlagKeyMap.put(flagType, STR_EGG_MOB); - break; - case NETHER_PORTAL_MOB: - mobFlagKeyMap.put(flagType, STR_NETHER_PORTAL_MOB); - break; - case COTW_SUMMONED_MOB: - mobFlagKeyMap.put(flagType, STR_COTW_SUMMONED_MOB); - break; - case PLAYER_BRED_MOB: - mobFlagKeyMap.put(flagType, STR_PLAYER_BRED_MOB); - break; - case PLAYER_TAMED_MOB: - mobFlagKeyMap.put(flagType, STR_PLAYER_TAMED_MOB); - break; - case EXPLOITED_ENDERMEN: - mobFlagKeyMap.put(flagType, STR_EXPLOITED_ENDERMEN); - break; - default: - throw new IncompleteNamespacedKeyRegister("Missing flag register for: "+flagType.toString()); + switch (flagType) { + case MOB_SPAWNER_MOB -> mobFlagKeyMap.put(flagType, MetadataConstants.METADATA_KEY_MOB_SPAWNER_MOB); + case EGG_MOB -> mobFlagKeyMap.put(flagType, MetadataConstants.METADATA_KEY_EGG_MOB); + case NETHER_PORTAL_MOB -> mobFlagKeyMap.put(flagType, MetadataConstants.METADATA_KEY_NETHER_PORTAL_MOB); + case COTW_SUMMONED_MOB -> mobFlagKeyMap.put(flagType, MetadataConstants.METADATA_KEY_COTW_SUMMONED_MOB); + case PLAYER_BRED_MOB -> mobFlagKeyMap.put(flagType, MetadataConstants.METADATA_KEY_PLAYER_BRED_MOB); + case PLAYER_TAMED_MOB -> mobFlagKeyMap.put(flagType, MetadataConstants.METADATA_KEY_PLAYER_TAMED_MOB); + case EXPLOITED_ENDERMEN -> mobFlagKeyMap.put(flagType, MetadataConstants.METADATA_KEY_EXPLOITED_ENDERMEN); + default -> throw new IncompleteNamespacedKeyRegister("Missing flag register for: " + flagType); } } } @@ -92,7 +78,7 @@ public class SpigotPersistentDataLayer_1_13 extends AbstractPersistentDataLayer @Override public void flagMetadata(@NotNull MobMetaFlagType flag, @NotNull LivingEntity livingEntity) { if(!hasMobFlag(flag, livingEntity)) { - livingEntity.setMetadata(mobFlagKeyMap.get(flag), mcMMO.metadataValue); + livingEntity.setMetadata(mobFlagKeyMap.get(flag), MetadataConstants.MCMMO_METADATA_VALUE); } } @@ -105,10 +91,8 @@ public class SpigotPersistentDataLayer_1_13 extends AbstractPersistentDataLayer @Override public UUID getFurnaceOwner(@NotNull Furnace furnace) { - Metadatable metadatable = (Metadatable) furnace; - - if(metadatable.getMetadata(KEY_FURNACE_OWNER).size() > 0) { - UUIDMeta uuidMeta = (UUIDMeta) metadatable.getMetadata(KEY_FURNACE_OWNER).get(0); + if(furnace.getMetadata(KEY_FURNACE_OWNER).size() > 0) { + UUIDMeta uuidMeta = (UUIDMeta) ((Metadatable) furnace).getMetadata(KEY_FURNACE_OWNER).get(0); return (UUID) uuidMeta.value(); } else { return null; @@ -117,13 +101,12 @@ public class SpigotPersistentDataLayer_1_13 extends AbstractPersistentDataLayer @Override public void setFurnaceOwner(@NotNull Furnace furnace, @NotNull UUID uuid) { - Metadatable metadatable = (Metadatable) furnace; - if(metadatable.getMetadata(KEY_FURNACE_OWNER).size() > 0) { - metadatable.removeMetadata(KEY_FURNACE_OWNER, mcMMO.p); + if(furnace.getMetadata(KEY_FURNACE_OWNER).size() > 0) { + furnace.removeMetadata(KEY_FURNACE_OWNER, mcMMO.p); } - metadatable.setMetadata(KEY_FURNACE_OWNER, new UUIDMeta(mcMMO.p, uuid)); + furnace.setMetadata(KEY_FURNACE_OWNER, new UUIDMeta(mcMMO.p, uuid)); } @Override diff --git a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer_1_14.java b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer_1_14.java index 3f8feb349..f4b340fec 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer_1_14.java +++ b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer_1_14.java @@ -3,6 +3,7 @@ package com.gmail.nossr50.util.compat.layers.persistentdata; 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.block.Furnace; import org.bukkit.enchantments.Enchantment; @@ -101,7 +102,7 @@ public class SpigotPersistentDataLayer_1_14 extends AbstractPersistentDataLayer if(PersistentDataConfig.getInstance().isMobPersistent(flag)) { if(!hasMobFlag(flag, livingEntity)) { PersistentDataContainer persistentDataContainer = livingEntity.getPersistentDataContainer(); - persistentDataContainer.set(mobFlagKeyMap.get(flag), PersistentDataType.BYTE, SIMPLE_FLAG_VALUE); + persistentDataContainer.set(mobFlagKeyMap.get(flag), PersistentDataType.BYTE, MetadataConstants.SIMPLE_FLAG_VALUE); } } else { transientLayer.flagMetadata(flag, livingEntity); 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 4ef9606b6..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<>(); @@ -45,7 +46,7 @@ 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.remove(mcMMOPlayer); //Clear sync save tracking @@ -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/skills/CombatUtils.java b/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java index f51c876df..00e6f01d0 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java @@ -283,7 +283,7 @@ public final class CombatUtils { 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); } @@ -295,8 +295,8 @@ 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); @@ -453,7 +453,7 @@ public final class CombatUtils { */ public static void fixNames(@NotNull LivingEntity entity) { - List metadataValue = entity.getMetadata(TransientMetadataTools.OLD_NAME_METAKEY); + List metadataValue = entity.getMetadata(MetadataConstants.METADATA_KEY_OLD_NAME_KEY); if(metadataValue.size() <= 0) return; @@ -461,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); } /** @@ -632,15 +634,15 @@ public final class CombatUtils { } public static void removeIgnoreDamageMetadata(@NotNull LivingEntity target) { - target.removeMetadata(mcMMO.CUSTOM_DAMAGE_METAKEY, mcMMO.p); + target.removeMetadata(MetadataConstants.METADATA_KEY_CUSTOM_DAMAGE, mcMMO.p); } public static void applyIgnoreDamageMetadata(@NotNull LivingEntity target) { - target.setMetadata(mcMMO.CUSTOM_DAMAGE_METAKEY, mcMMO.metadataValue); + target.setMetadata(MetadataConstants.METADATA_KEY_CUSTOM_DAMAGE, MetadataConstants.MCMMO_METADATA_VALUE); } public static boolean hasIgnoreDamageMetadata(@NotNull LivingEntity target) { - return target.getMetadata(mcMMO.CUSTOM_DAMAGE_METAKEY).size() != 0; + return target.getMetadata(MetadataConstants.METADATA_KEY_CUSTOM_DAMAGE).size() != 0; } public static void dealNoInvulnerabilityTickDamageRupture(@NotNull LivingEntity target, double damage, Entity attacker, int toolTier) { @@ -1047,7 +1049,7 @@ public final class CombatUtils { return; } - if (!player.hasMetadata(mcMMO.playerDataKey)) { + if (!player.hasMetadata(MetadataConstants.METADATA_KEY_PLAYER_DATA)) { return; } @@ -1069,16 +1071,16 @@ public final class CombatUtils { * @param entity projectile */ public static void cleanupArrowMetadata(@NotNull Projectile entity) { - if(entity.hasMetadata(mcMMO.infiniteArrowKey)) { - entity.removeMetadata(mcMMO.infiniteArrowKey, mcMMO.p); + if(entity.hasMetadata(MetadataConstants.METADATA_KEY_INF_ARROW)) { + entity.removeMetadata(MetadataConstants.METADATA_KEY_INF_ARROW, mcMMO.p); } - if(entity.hasMetadata(mcMMO.bowForceKey)) { - entity.removeMetadata(mcMMO.bowForceKey, mcMMO.p); + if(entity.hasMetadata(MetadataConstants.METADATA_KEY_BOW_FORCE)) { + entity.removeMetadata(MetadataConstants.METADATA_KEY_BOW_FORCE, mcMMO.p); } - if(entity.hasMetadata(mcMMO.arrowDistanceKey)) { - entity.removeMetadata(mcMMO.arrowDistanceKey, mcMMO.p); + if(entity.hasMetadata(MetadataConstants.METADATA_KEY_ARROW_DISTANCE)) { + entity.removeMetadata(MetadataConstants.METADATA_KEY_ARROW_DISTANCE, mcMMO.p); } } diff --git a/src/test/java/com/gmail/nossr50/database/flatfile/FlatFileDataUtilTest.java b/src/test/java/com/gmail/nossr50/database/flatfile/FlatFileDataUtilTest.java index b8e43ccbe..db7fad9f5 100644 --- a/src/test/java/com/gmail/nossr50/database/flatfile/FlatFileDataUtilTest.java +++ b/src/test/java/com/gmail/nossr50/database/flatfile/FlatFileDataUtilTest.java @@ -1,11 +1,10 @@ package com.gmail.nossr50.database.flatfile; -import java.util.HashSet; - +import com.gmail.nossr50.database.FlatFileDatabaseManager; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -import com.gmail.nossr50.database.FlatFileDatabaseManager; +import java.util.HashSet; class FlatFileDataUtilTest { diff --git a/src/test/java/com/gmail/nossr50/util/blockmeta/ChunkStoreTest.java b/src/test/java/com/gmail/nossr50/util/blockmeta/ChunkStoreTest.java index f7f5a5f75..516808286 100644 --- a/src/test/java/com/gmail/nossr50/util/blockmeta/ChunkStoreTest.java +++ b/src/test/java/com/gmail/nossr50/util/blockmeta/ChunkStoreTest.java @@ -1,37 +1,22 @@ package com.gmail.nossr50.util.blockmeta; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.File; -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.io.OutputStream; -import java.io.Serializable; -import java.util.UUID; - -import org.bukkit.Bukkit; -import org.bukkit.World; -import org.bukkit.block.Block; -import org.jetbrains.annotations.NotNull; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.mockito.MockedStatic; -import org.mockito.Mockito; - import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.BlockUtils; import com.gmail.nossr50.util.compat.CompatibilityManager; import com.gmail.nossr50.util.compat.layers.world.WorldCompatibilityLayer; import com.gmail.nossr50.util.platform.PlatformManager; 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 diff --git a/src/test/java/com/gmail/nossr50/util/platform/MinecraftGameVersionTest.java b/src/test/java/com/gmail/nossr50/util/platform/MinecraftGameVersionTest.java index 564e980a0..3af0553a3 100644 --- a/src/test/java/com/gmail/nossr50/util/platform/MinecraftGameVersionTest.java +++ b/src/test/java/com/gmail/nossr50/util/platform/MinecraftGameVersionTest.java @@ -1,8 +1,6 @@ package com.gmail.nossr50.util.platform; -import java.util.logging.Logger; -import java.util.stream.Stream; - +import com.gmail.nossr50.mcMMO; import org.bukkit.Bukkit; import org.jetbrains.annotations.NotNull; import org.junit.jupiter.api.Test; @@ -12,7 +10,8 @@ import org.junit.jupiter.params.provider.MethodSource; import org.mockito.MockedStatic; import org.mockito.Mockito; -import com.gmail.nossr50.mcMMO; +import java.util.logging.Logger; +import java.util.stream.Stream; import static org.junit.jupiter.api.Assertions.*; From 9ab4584dfe9f0f5cfafcc82bd85d9ba707f9f38f Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sun, 14 Nov 2021 09:36:00 -0800 Subject: [PATCH 624/662] MOB_METADATA_KEYS should be immutable --- .../gmail/nossr50/util/MetadataConstants.java | 30 ++++++++++--------- .../nossr50/util/TransientMetadataTools.java | 3 -- 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/util/MetadataConstants.java b/src/main/java/com/gmail/nossr50/util/MetadataConstants.java index 64c9058ff..ecf48b28e 100644 --- a/src/main/java/com/gmail/nossr50/util/MetadataConstants.java +++ b/src/main/java/com/gmail/nossr50/util/MetadataConstants.java @@ -1,10 +1,10 @@ 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; -import java.util.Set; /** * Stores our constants related to metadata @@ -48,22 +48,24 @@ public class MetadataConstants { public static final byte SIMPLE_FLAG_VALUE = (byte) 0x1; - public static final @NotNull Set MOB_METADATA_KEYS; + public static final @NotNull ImmutableSet MOB_METADATA_KEYS; public static FixedMetadataValue MCMMO_METADATA_VALUE; static { - MOB_METADATA_KEYS = new HashSet<>(); - MOB_METADATA_KEYS.add(MetadataConstants.METADATA_KEY_MOB_SPAWNER_MOB); - MOB_METADATA_KEYS.add(MetadataConstants.METADATA_KEY_EGG_MOB); - MOB_METADATA_KEYS.add(MetadataConstants.METADATA_KEY_NETHER_PORTAL_MOB); - MOB_METADATA_KEYS.add(MetadataConstants.METADATA_KEY_COTW_SUMMONED_MOB); - MOB_METADATA_KEYS.add(MetadataConstants.METADATA_KEY_PLAYER_BRED_MOB); - MOB_METADATA_KEYS.add(MetadataConstants.METADATA_KEY_PLAYER_TAMED_MOB); - MOB_METADATA_KEYS.add(MetadataConstants.METADATA_KEY_EXPLOITED_ENDERMEN); - MOB_METADATA_KEYS.add(MetadataConstants.METADATA_KEY_CUSTOM_NAME_KEY); - MOB_METADATA_KEYS.add(MetadataConstants.METADATA_KEY_RUPTURE); - MOB_METADATA_KEYS.add(MetadataConstants.METADATA_KEY_EXPLOSION_FROM_RUPTURE); - MOB_METADATA_KEYS.add(MetadataConstants.METADATA_KEY_OLD_NAME_KEY); + 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_KEY); + temp.add(MetadataConstants.METADATA_KEY_RUPTURE); + temp.add(MetadataConstants.METADATA_KEY_EXPLOSION_FROM_RUPTURE); + temp.add(MetadataConstants.METADATA_KEY_OLD_NAME_KEY); + + MOB_METADATA_KEYS = ImmutableSet.copyOf(temp); } } diff --git a/src/main/java/com/gmail/nossr50/util/TransientMetadataTools.java b/src/main/java/com/gmail/nossr50/util/TransientMetadataTools.java index 56666a969..ca5cdacf1 100644 --- a/src/main/java/com/gmail/nossr50/util/TransientMetadataTools.java +++ b/src/main/java/com/gmail/nossr50/util/TransientMetadataTools.java @@ -1,10 +1,7 @@ package com.gmail.nossr50.util; import com.gmail.nossr50.mcMMO; -import com.gmail.nossr50.util.skills.CombatUtils; -import org.bukkit.entity.Entity; import org.bukkit.entity.LivingEntity; -import org.checkerframework.common.returnsreceiver.qual.This; import org.jetbrains.annotations.NotNull; public class TransientMetadataTools { From cf67e3502aef98c28352d890616c15ef7e65d0bf Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 7 Dec 2021 19:29:36 -0800 Subject: [PATCH 625/662] dev mode --- Changelog.txt | 6 ++++++ pom.xml | 4 ++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index f7d170248..bb1565d3d 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,9 @@ +Version 2.1.206 + + + 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 diff --git a/pom.xml b/pom.xml index 226737f9f..3067b9ee7 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.205 + 2.1.206-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO @@ -302,7 +302,7 @@ org.spigotmc spigot-api - 1.17.1-R0.1-SNAPSHOT + 1.18-R0.1-SNAPSHOT provided From 519d469cb28ca07c4f60a34abde761ad25f85523 Mon Sep 17 00:00:00 2001 From: PikaMug <2267126+PikaMug@users.noreply.github.com> Date: Tue, 7 Dec 2021 22:54:48 -0500 Subject: [PATCH 626/662] Add null check to XP gain handler, fixes #4663 (#4677) * Add null check to XP gain handler, fixes #4663 Co-authored-by: Robert Alan Chapton --- src/main/java/com/gmail/nossr50/util/EventUtils.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/util/EventUtils.java b/src/main/java/com/gmail/nossr50/util/EventUtils.java index 828f43906..4dd661aba 100644 --- a/src/main/java/com/gmail/nossr50/util/EventUtils.java +++ b/src/main/java/com/gmail/nossr50/util/EventUtils.java @@ -379,14 +379,18 @@ public final 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; From 09ce259288c70f767edc9ef99a09fc8a7727c23e Mon Sep 17 00:00:00 2001 From: Enderaoe Date: Wed, 8 Dec 2021 11:55:42 +0800 Subject: [PATCH 627/662] fix issue #4667 (#4669) --- .../com/gmail/nossr50/commands/skills/HerbalismCommand.java | 2 +- src/main/java/com/gmail/nossr50/util/ItemUtils.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) 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 871d0066f..eba4520a7 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/HerbalismCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/HerbalismCommand.java @@ -91,7 +91,7 @@ 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) && !mcMMO.p.getGeneralConfig().getDoubleDropsDisabled(skill); diff --git a/src/main/java/com/gmail/nossr50/util/ItemUtils.java b/src/main/java/com/gmail/nossr50/util/ItemUtils.java index d2a69fa14..2e46341c2 100644 --- a/src/main/java/com/gmail/nossr50/util/ItemUtils.java +++ b/src/main/java/com/gmail/nossr50/util/ItemUtils.java @@ -421,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: From b88d752f615166c69074c0df893eb74616c9c11c Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sat, 11 Dec 2021 20:56:10 -0800 Subject: [PATCH 628/662] update dependencies --- Changelog.txt | 3 ++- pom.xml | 20 +++++++------------- 2 files changed, 9 insertions(+), 14 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index bb1565d3d..e04425688 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,5 +1,6 @@ Version 2.1.206 - + 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. diff --git a/pom.xml b/pom.xml index 3067b9ee7..be5306641 100755 --- a/pom.xml +++ b/pom.xml @@ -14,9 +14,9 @@ UTF-8 - 16 - 16 - 16 + 17 + 17 + 17 @@ -102,7 +102,7 @@ maven-compiler-plugin 3.8.1 - 16 + 17 -parameters @@ -241,12 +241,6 @@ - - - - - - co.aikar acf-bukkit @@ -281,12 +275,12 @@ net.kyori adventure-platform-bukkit - 4.0.0 + 4.0.1 net.kyori adventure-platform-api - 4.0.0 + 4.0.1 org.apache.maven.scm @@ -302,7 +296,7 @@ org.spigotmc spigot-api - 1.18-R0.1-SNAPSHOT + 1.18.1-R0.1-SNAPSHOT provided From 11245e87ef11c5afe292164148ea5ec3f40736bf Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sat, 11 Dec 2021 20:57:25 -0800 Subject: [PATCH 629/662] squelch ChunkStoreTest log output --- .../java/com/gmail/nossr50/util/blockmeta/ChunkStoreTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/gmail/nossr50/util/blockmeta/ChunkStoreTest.java b/src/test/java/com/gmail/nossr50/util/blockmeta/ChunkStoreTest.java index 516808286..f10b77898 100644 --- a/src/test/java/com/gmail/nossr50/util/blockmeta/ChunkStoreTest.java +++ b/src/test/java/com/gmail/nossr50/util/blockmeta/ChunkStoreTest.java @@ -190,7 +190,7 @@ class ChunkStoreTest { for (int x = -96; x < 0; x++) { int cx = x >> 4; int ix = Math.abs(x) % 16; - System.out.print(cx + ":" + ix + " "); + //System.out.print(cx + ":" + ix + " "); } } From 10470dde1340bad2f490f2b3298f2569508fe935 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sat, 11 Dec 2021 21:19:30 -0800 Subject: [PATCH 630/662] Reduce default volume of level up sound --- Changelog.txt | 3 ++ .../nossr50/util/sounds/SoundManager.java | 53 ++++++------------- src/main/resources/sounds.yml | 2 +- 3 files changed, 20 insertions(+), 38 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index e04425688..637999114 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,4 +1,7 @@ Version 2.1.206 + 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 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/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 From 728ba512c359ecbd3aedf535cf023073a51ac374 Mon Sep 17 00:00:00 2001 From: Robert Alan Chapton Date: Sat, 11 Dec 2021 21:21:22 -0800 Subject: [PATCH 631/662] Java 17 for GH actions --- .github/workflows/maven.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index bea64e883..77c087bb6 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -31,13 +31,13 @@ jobs: - name: Checkout repository uses: actions/checkout@v2 - # 2. Setup Java 16 JDK (Adopt) - - name: Java 16 setup + # 2. Setup Java 17 JDK (Adopt) + - name: Java 17 setup uses: actions/setup-java@v2 with: distribution: 'adopt' java-package: jdk - java-version: '16' + java-version: '17' # 3. Setup local Maven package cache to speed up building - name: Cache Maven packages From fbe0cd1471b18b6c371687d3f0bd2fb877aab7e6 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sat, 11 Dec 2021 22:22:02 -0800 Subject: [PATCH 632/662] Fixing like 10 memory leaks Fixes #4670 --- Changelog.txt | 6 +++ .../gmail/nossr50/config/GeneralConfig.java | 2 +- .../nossr50/listeners/BlockListener.java | 49 ++++++++++++------- .../nossr50/listeners/EntityListener.java | 4 ++ .../runnables/MobDodgeMetaCleanup.java | 27 ++++++++++ .../MobHealthDisplayUpdaterTask.java | 6 +-- .../runnables/TravelingBlockMetaCleanup.java | 27 ++++++++++ .../nossr50/runnables/skills/RuptureTask.java | 1 + .../skills/acrobatics/AcrobaticsManager.java | 16 +++--- .../skills/herbalism/HerbalismManager.java | 17 ++++--- .../com/gmail/nossr50/util/BlockUtils.java | 13 +++++ .../gmail/nossr50/util/MetadataConstants.java | 5 +- .../gmail/nossr50/util/MobHealthbarUtils.java | 6 +-- .../nossr50/util/TransientMetadataTools.java | 6 +-- src/main/resources/config.yml | 1 - 15 files changed, 143 insertions(+), 43 deletions(-) create mode 100644 src/main/java/com/gmail/nossr50/runnables/MobDodgeMetaCleanup.java create mode 100644 src/main/java/com/gmail/nossr50/runnables/TravelingBlockMetaCleanup.java diff --git a/Changelog.txt b/Changelog.txt index 637999114..28094b77d 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,4 +1,10 @@ Version 2.1.206 + Fixed a memory leak involving Rupture + 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) diff --git a/src/main/java/com/gmail/nossr50/config/GeneralConfig.java b/src/main/java/com/gmail/nossr50/config/GeneralConfig.java index f4def0fd4..6e2dbd572 100644 --- a/src/main/java/com/gmail/nossr50/config/GeneralConfig.java +++ b/src/main/java/com/gmail/nossr50/config/GeneralConfig.java @@ -193,7 +193,7 @@ public class GeneralConfig extends AutoUpdateConfigLoader { } } - public int getMobHealthbarTime() { return config.getInt("Mob_Healthbar.Display_Time", 3); } + public int getMobHealthbarTime() { return Math.max(1, config.getInt("Mob_Healthbar.Display_Time", 3)); } /* Scoreboards */ public boolean getScoreboardsEnabled() { return config.getBoolean("Scoreboard.UseScoreboards", true); } diff --git a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java index ecd774e40..479228b19 100644 --- a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java @@ -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; @@ -46,9 +47,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 @@ -318,21 +326,27 @@ 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(); + 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)) { @@ -347,6 +361,7 @@ public class BlockListener implements Listener { Player player = event.getPlayer(); if (!UserManager.hasPlayerDataKey(player) || player.getGameMode() == GameMode.CREATIVE) { + BlockUtils.cleanupBlockMetadata(block); return; } @@ -355,7 +370,8 @@ public class BlockListener implements Listener { //Check if profile is loaded if(mcMMOPlayer == null) { /* Remove metadata from placed watched blocks */ - mcMMO.getPlaceStore().setFalse(blockState); + + BlockUtils.cleanupBlockMetadata(block); return; } @@ -417,7 +433,7 @@ public class BlockListener implements Listener { } /* Remove metadata from placed watched blocks */ - mcMMO.getPlaceStore().setFalse(blockState); + BlockUtils.cleanupBlockMetadata(block); } /** @@ -427,6 +443,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; @@ -438,10 +457,6 @@ public class BlockListener implements Listener { return; } - if (event instanceof FakeBlockBreakEvent) { - return; - } - Player player = event.getPlayer(); if (!UserManager.hasPlayerDataKey(player) || player.getGameMode() == GameMode.CREATIVE) { diff --git a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java index 4c337154f..6690efab3 100644 --- a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java @@ -11,6 +11,7 @@ import com.gmail.nossr50.events.fake.FakeEntityTameEvent; import com.gmail.nossr50.events.skills.rupture.McMMOEntityDamageByRuptureEvent; import com.gmail.nossr50.mcMMO; 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; @@ -243,9 +244,12 @@ public class EntityListener implements Listener { mcMMO.getPlaceStore().setFalse(block); 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 || block.getType().getKey().getKey().equalsIgnoreCase("deepslate_redstone_ore"))) { //Redstone ore fire this event and should be ignored 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 e43e63865..a48375727 100644 --- a/src/main/java/com/gmail/nossr50/runnables/MobHealthDisplayUpdaterTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/MobHealthDisplayUpdaterTask.java @@ -14,9 +14,9 @@ public class MobHealthDisplayUpdaterTask extends BukkitRunnable { @Override public void run() { - if (target.hasMetadata(MetadataConstants.METADATA_KEY_CUSTOM_NAME_KEY)) { - target.setCustomName(target.getMetadata(MetadataConstants.METADATA_KEY_CUSTOM_NAME_KEY).get(0).asString()); - target.removeMetadata(MetadataConstants.METADATA_KEY_CUSTOM_NAME_KEY, 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(MetadataConstants.METADATA_KEY_NAME_VISIBILITY)) { 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/skills/RuptureTask.java b/src/main/java/com/gmail/nossr50/runnables/skills/RuptureTask.java index beb7cae3f..1b4c56197 100644 --- a/src/main/java/com/gmail/nossr50/runnables/skills/RuptureTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/skills/RuptureTask.java @@ -119,6 +119,7 @@ public class RuptureTask extends BukkitRunnable { // // targetEntity.removeMetadata(mcMMO.RUPTURE_META_KEY, mcMMO.p); + targetEntity.removeMetadata(MetadataConstants.METADATA_KEY_RUPTURE, mcMMO.p); this.cancel(); //Task no longer needed } 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 4ce109e6c..5d959b096 100644 --- a/src/main/java/com/gmail/nossr50/skills/acrobatics/AcrobaticsManager.java +++ b/src/main/java/com/gmail/nossr50/skills/acrobatics/AcrobaticsManager.java @@ -8,6 +8,7 @@ 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; @@ -21,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; @@ -100,20 +102,22 @@ public class AcrobaticsManager extends SkillManager { } if (SkillUtils.cooldownExpired(mmoPlayer.getRespawnATS(), Misc.PLAYER_RESPAWN_COOLDOWN_SECONDS)) { - if(!(attacker instanceof Player)) { + if(attacker instanceof Mob) { + Mob mob = (Mob) attacker; //Check to see how many dodge XP rewards this mob has handed out - if(attacker.hasMetadata(MetadataConstants.METADATA_KEY_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(MetadataConstants.METADATA_KEY_DODGE_TRACKER).get(0); - int count = attacker.getMetadata(MetadataConstants.METADATA_KEY_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(MetadataConstants.METADATA_KEY_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(MetadataConstants.METADATA_KEY_DODGE_TRACKER, new FixedMetadataValue(mcMMO.p, 1)); } } } 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 deacafabf..541a8ac18 100644 --- a/src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java +++ b/src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java @@ -209,18 +209,21 @@ public class HerbalismManager extends SkillManager { public void processHerbalismBlockBreakEvent(BlockBreakEvent blockBreakEvent) { Player player = getPlayer(); + 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(MetadataConstants.METADATA_KEY_REPLANT).size() >= 1) { - if(blockBreakEvent.getBlock().getMetadata(MetadataConstants.METADATA_KEY_REPLANT).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(MetadataConstants.METADATA_KEY_REPLANT, mcMMO.p); + block.removeMetadata(MetadataConstants.METADATA_KEY_REPLANT, mcMMO.p); } else { //Crop is recently replanted to back out of destroying it blockBreakEvent.setCancelled(true); @@ -314,7 +317,7 @@ public class HerbalismManager extends SkillManager { 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 } } diff --git a/src/main/java/com/gmail/nossr50/util/BlockUtils.java b/src/main/java/com/gmail/nossr50/util/BlockUtils.java index 24afa68e7..f3c1dbd25 100644 --- a/src/main/java/com/gmail/nossr50/util/BlockUtils.java +++ b/src/main/java/com/gmail/nossr50/util/BlockUtils.java @@ -39,6 +39,19 @@ public final class BlockUtils { 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); + } + /** * Marks a block to drop extra copies of items * @param blockState target blockstate diff --git a/src/main/java/com/gmail/nossr50/util/MetadataConstants.java b/src/main/java/com/gmail/nossr50/util/MetadataConstants.java index ecf48b28e..090e04d17 100644 --- a/src/main/java/com/gmail/nossr50/util/MetadataConstants.java +++ b/src/main/java/com/gmail/nossr50/util/MetadataConstants.java @@ -42,7 +42,7 @@ public class MetadataConstants { 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_KEY = "mcmmo_custom_name"; + 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"; @@ -61,10 +61,11 @@ public class MetadataConstants { 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_KEY); + 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/MobHealthbarUtils.java b/src/main/java/com/gmail/nossr50/util/MobHealthbarUtils.java index d2cbd38e0..638a9f488 100644 --- a/src/main/java/com/gmail/nossr50/util/MobHealthbarUtils.java +++ b/src/main/java/com/gmail/nossr50/util/MobHealthbarUtils.java @@ -73,11 +73,11 @@ public final class MobHealthbarUtils { boolean updateName = !ChatColor.stripColor(oldName).equalsIgnoreCase(ChatColor.stripColor(newName)); if (updateName) { - target.setMetadata(MetadataConstants.METADATA_KEY_CUSTOM_NAME_KEY, new FixedMetadataValue(mcMMO.p, oldName)); + 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(MetadataConstants.METADATA_KEY_CUSTOM_NAME_KEY)) { - target.setMetadata(MetadataConstants.METADATA_KEY_CUSTOM_NAME_KEY, new FixedMetadataValue(mcMMO.p, "")); + 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)); } diff --git a/src/main/java/com/gmail/nossr50/util/TransientMetadataTools.java b/src/main/java/com/gmail/nossr50/util/TransientMetadataTools.java index ca5cdacf1..15f14c03e 100644 --- a/src/main/java/com/gmail/nossr50/util/TransientMetadataTools.java +++ b/src/main/java/com/gmail/nossr50/util/TransientMetadataTools.java @@ -13,9 +13,9 @@ public class TransientMetadataTools { 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_KEY)) { - entity.setCustomName(entity.getMetadata(MetadataConstants.METADATA_KEY_CUSTOM_NAME_KEY).get(0).asString()); - entity.removeMetadata(MetadataConstants.METADATA_KEY_CUSTOM_NAME_KEY, pluginRef); + 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); } // if(entity.hasMetadata(MetadataConstants.METADATA_KEY_OLD_NAME_KEY)) { diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index cc9d2b4db..29dae4df0 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -149,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 From c36ff85cbff04020cc39cc025508b8995e6b0268 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sat, 11 Dec 2021 22:27:54 -0800 Subject: [PATCH 633/662] 2.1.206 - Memory leaks fixed and other changes Fixes #4681 --- Changelog.txt | 3 ++- pom.xml | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 28094b77d..0bb613513 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,5 +1,6 @@ Version 2.1.206 - Fixed a memory leak involving Rupture + 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 diff --git a/pom.xml b/pom.xml index be5306641..2d9e20d62 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.206-SNAPSHOT + 2.1.206 mcMMO https://github.com/mcMMO-Dev/mcMMO From 1b11fd236988b86d8723a30673252066a41fd995 Mon Sep 17 00:00:00 2001 From: lilac & gooseberries <37642364+dexasz@users.noreply.github.com> Date: Wed, 15 Dec 2021 08:22:58 +0200 Subject: [PATCH 634/662] lithuanian translation for mcmmo (#4676) --- .../resources/locale/locale_lt_LT.properties | 1646 ++++++++--------- 1 file changed, 823 insertions(+), 823 deletions(-) diff --git a/src/main/resources/locale/locale_lt_LT.properties b/src/main/resources/locale/locale_lt_LT.properties index 16646315b..964f1c2e8 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=&6Lucky 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 @@ -53,8 +53,8 @@ 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=If you hold sneak while falling you can prevent up to twice the damage that you would normally take! -Anvil.SingleItemStack=&cYou cannot salvage or repair item stacks that have more than one item, split the stack first. +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 @@ -75,12 +75,12 @@ 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=&6Įgavote patirties eXP: &3{0} +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[&fView this skill on the wiki!&e] +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=&l{0} &6LvL. &3pakilo iki: &r&a&l{2}&r&f. Overhaul.Name.Acrobatics=Akrobatinių įgūdžių @@ -99,10 +99,10 @@ 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=&c---[]&amcMMO Commands&c[]--- -Commands.Other=&c---[]&aSPECIAL COMMANDS&c[]--- -Commands.Party.Header=&c-----[]&aPARTY&c[]----- -Commands.Party.Features.Header=&c-----[]&aFEATURES&c[]----- +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} @@ -129,580 +129,580 @@ XPBar.Complex.Template={0} &3 {4}&f% &3(&f{1}&3/&f{2}&3) # END STYLING #ACROBATICS -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: &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 50 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=&o**Rolled** -Acrobatics.SkillName=ACROBATICS +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=ACROBATICSS #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: &a{0}&3/&a{1} -Alchemy.SubSkill.Concoctions.Stat.Extra=Ingredients [&a{0}&3]: &a{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=&7You lower your Axe. -Axes.Ability.Ready=&3You &6ready&3 your Axe. -Axes.Combat.CritStruck=&4You were CRITICALLY hit! -Axes.Combat.CriticalHit=CRITICAL HIT! -Axes.Combat.GI.Proc=&a**STRUCK WITH GREAT FORCE** -Axes.Combat.GI.Struck=**HIT BY GREATER IMPACT** -Axes.Combat.SS.Struck=&4Struck 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=&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! +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=&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 +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=&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.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=&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=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.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.Description=Sužvejoji atsitiktinius daiktus Fishing.SubSkill.TreasureHunter.Stat=Lobių ieškotojo rankas: &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.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:&a Rank {0} -Fishing.SubSkill.MasterAngler.Name=Master Angler -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=&9 Rain Bonus -Fishing.Listener=Fishing: -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.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=&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 -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: &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: &aRank {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=&aThe 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=&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! +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=&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 -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:&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 -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=&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! +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=&7**BOOM** +Mining.Blast.Boom=&7**BŪM** 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! +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: &aExtra {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: &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.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=&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 +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=&aYou 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.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=Arcane Salvaging -Salvage.SubSkill.ArcaneSalvage.Description=Extract enchantments from items -Salvage.SubSkill.ArcaneSalvage.Stat=Arcane Salvaging: &eRank {0}/{1} -Salvage.Ability.Bonus.0=Scrap Collector -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.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=&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. +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=&7You lower your sword. -Swords.Ability.Ready=&3You &6ready&3 your Sword. -Swords.Combat.Rupture.Note=&7NOTE: &e1 Tick happens every 0.5 seconds! -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 -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: &a{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=&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! +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=&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 -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=&8Your 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=&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.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} +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=&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 -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=&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! +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=&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! +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=&f**ARROW DEFLECT** -Combat.BeastLore=&a**BEAST LORE** +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=&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 &4Dazed -Combat.TouchedFuzzy=&4Touched Fuzzy. Felt Dizzy. +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=&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=&aYou were awarded {0} levels in all skills! -Commands.addlevels.AwardAll.2=All skills have been modified for {0}. -Commands.addlevels.AwardSkill.1=&aYou were awarded {0} levels in {1}! -Commands.addlevels.AwardSkill.2={0} has been modified for {1}. -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.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=&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.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= &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 &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.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] 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.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=That is not a valid HUD type. -Commands.mcpurge.Success=&aThe database was successfully purged! +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=Overall&a - &6Rank &f#&a{0} +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 cooldowns have been refreshed. -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.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=&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.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=Already using formula type {0} -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.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 &coff -Commands.Notifications.On=Ability notifications toggled &aon -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=&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.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=&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.Skill.Invalid=That is not a valid skillname! -Commands.Skill.ChildSkill=Child skills are not valid for this command! +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- Toggle ability activation with right click +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} @@ -718,369 +718,369 @@ 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=&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=&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.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 &6{0}&7, use this command again to toggle. With debug mode true, you can punch blocks to print useful information used for support. +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=&8If you don't have access to a skill it will not be shown here. +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.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=&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 -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=&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.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=&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=&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! +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=&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.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=&6mcMMO 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=&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] +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=&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. +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=&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) +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=&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. +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=&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. +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=&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. +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=&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. +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=&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. +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=&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. +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=&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. +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=&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. +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=&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 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. +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=&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. +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=&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. +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=&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. +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= &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=&c**CHIMAERA WING FAILED!** -Item.ChimaeraWing.Pass=**CHIMAERA WING** -Item.ChimaeraWing.Name=Chimaera Wing -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=&7Has a chance of instantly smelting ores. -Item.FluxPickaxe.Lore.2=&7Requires 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=&7Perkėlimas už: &6({0}) &7s., prašome nejudėti... Teleport.Cancelled=&4Perkėlimas atmestas! #SKILLS -Skills.Child=&6(CHILD SKILL) -Skills.Disarmed=&4You have been disarmed! +Skills.Child=&6(DUKTERINIS ĮGŪDIS) +Skills.Disarmed=&4Jūs buvote nuginkluotas! 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.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=Max -Skills.TooTired=You are too tired to use that ability again. &e({0}s) -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. +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=&6-=KOVOS ĮGŪDŽIAI=- -Stats.Header.Gathering=&6-=GATHERING SKILLS=- +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=&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=&6 ({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=&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=&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=&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}. +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=&3Donation Info: +MOTD.Donate=&3Donorystės Informacija: MOTD.Hardcore.Enabled=&6[mcMMO] &3Sunkusis rėžimas aktyvuotas: &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.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: &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: &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 -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=&emcMMO Informacija -Scoreboard.Header.PlayerCooldowns=&emcMMO Cooldowns +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 @@ -1088,24 +1088,24 @@ 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=&dCooldown -Scoreboard.Misc.Overall=&6Overall -Scoreboard.Misc.Ability=Ability +Scoreboard.Misc.Cooldown=&dAtsigavimas +Scoreboard.Misc.Overall=&6Bendrai +Scoreboard.Misc.Ability=Galia #DATABASE RECOVERY -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}. +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=&6{0} dabartinis įgūdžių lygis &a{1}&aLvL&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! +Holiday.Anniversary=&9Laimingos {0} Sukakties!\n&9dėl nossr50 darbo ir visų kūrėjų, štai šiek tiek fejerverkų šou! #Reminder Messages -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. +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=&aKalbos nustatymai atnaujinti! #Player Leveling Stuff -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. +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. From 3671d0b56515ea60e22d0a776e4c76aaf7947c80 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 14 Dec 2021 22:23:31 -0800 Subject: [PATCH 635/662] dev mode --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 2d9e20d62..9312237e1 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.206 + 2.1.207-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO From a78dcffde7523554d63c70ca077a4e51816d246f Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 14 Dec 2021 22:26:40 -0800 Subject: [PATCH 636/662] Temporarily roll back to Java 16 --- Changelog.txt | 3 +++ pom.xml | 6 +++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 0bb613513..1b9526248 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,6 @@ +Version 2.1.207 + Temporarily rolling required Java version back to 16 until 1.18 is stable and everyone can migrate to it safely + Version 2.1.206 Fixed a memory leak involving Herbalism under specific circumstances Fixed a memory leak involving Rupture under specific circumstances diff --git a/pom.xml b/pom.xml index 9312237e1..92fd1226b 100755 --- a/pom.xml +++ b/pom.xml @@ -14,9 +14,9 @@ UTF-8 - 17 - 17 - 17 + 16 + 16 + 16 From 13f7482b3938f9b59157e6716dccaeffddf764d5 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 14 Dec 2021 23:08:08 -0800 Subject: [PATCH 637/662] Unicode support for locale files --- Changelog.txt | 1 + .../resources/locale/locale_cs_CZ.properties | 746 +++--- .../resources/locale/locale_cy.properties | 10 +- .../resources/locale/locale_da.properties | 408 ++-- .../resources/locale/locale_de.properties | 882 +++---- .../resources/locale/locale_en_US.properties | 1 + .../resources/locale/locale_es.properties | 394 ++-- .../resources/locale/locale_fi.properties | 132 +- .../resources/locale/locale_fr.properties | 1282 +++++----- .../resources/locale/locale_hu_HU.properties | 1844 +++++++-------- .../resources/locale/locale_it.properties | 686 +++--- .../resources/locale/locale_ja_JP.properties | 2036 ++++++++-------- .../resources/locale/locale_ko.properties | 1584 ++++++------- .../resources/locale/locale_nl.properties | 2 +- .../resources/locale/locale_pl.properties | 1504 ++++++------ .../resources/locale/locale_pt_BR.properties | 1114 ++++----- .../resources/locale/locale_ru.properties | 2060 ++++++++-------- .../resources/locale/locale_sv.properties | 222 +- .../resources/locale/locale_th_TH.properties | 1042 ++++----- .../resources/locale/locale_zh_CN.properties | 2052 ++++++++-------- .../resources/locale/locale_zh_TW.properties | 2084 ++++++++--------- 21 files changed, 10044 insertions(+), 10042 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 1b9526248..6146ec210 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,4 +1,5 @@ Version 2.1.207 + Added unicode support to locale files (no more UTF-16 codes) Temporarily rolling required Java version back to 16 until 1.18 is stable and everyone can migrate to it safely Version 2.1.206 diff --git a/src/main/resources/locale/locale_cs_CZ.properties b/src/main/resources/locale/locale_cs_CZ.properties index 749584897..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=&a**Elegantni pristani** Acrobatics.Combat.Proc=&a**Uskocil jsi** -Acrobatics.DodgeChance=\u0160ance na \u00faskok: &e{0} +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: &e{0} -Acrobatics.SubSkill.Roll.GraceChance=\u0160ance na \u0160\u0165astn\u00fd kotoul: &e{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: &e{0} -Archery.Combat.RetrieveChance=\u0160ance z\u00edsk\u00e1n\u00ed \u0161\u00edp\u016f zp\u011bt: &e{0} -Archery.Combat.SkillshotBonus=Bonusov\u00e9 zran\u011bn\u00ed p\u0159esn\u00e9 trefy: &e{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}) @@ -32,21 +32,21 @@ 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=&7**ODLOZIL JSI SVOU SEKERU** -Axes.Ability.Ready=&a**P\u0158IPRAVUJE\u0160 SI SVOJ\u00cd 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\u00dd Z\u00c1SAH! -Axes.Combat.GI.Proc=&a**\u00daDER VELKOU SILOU** +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: &e{0}s Axes.SubSkill.SkullSplitter.Name=&a**Drtic lebek byl AKTIVOVAN** -Axes.SubSkill.SkullSplitter.Description=Ud\u011bl AoE zran\u011bn\u00ed +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: @@ -54,123 +54,123 @@ Axes.SkillName=SEKERY Axes.Skills.SS.Off=**Drtic lebek byl deaktivovan** Axes.Skills.SS.On=&a**Drtic lebek byl AKTIVOVAN** Axes.Skills.SS.Refresh=&aSchopnost &eDrtic lebek &abyla obnovena! -Axes.Skills.SS.Other.Off=Drti\u010d lebek&a byl deaktivovan na &e{0} +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=&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: &e{0}s Excavation.Listener=Kopani: Excavation.SkillName=KOPANI -Excavation.Skills.GigaDrillBreaker.Off=**Giga vrta\u010dka selhala** +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\u010dka &abyla obnovena! -Excavation.Skills.GigaDrillBreaker.Other.Off=Ni\u010ditel hl\u00edny&a je vy\u010derp\u00e1n do &e{0} -Excavation.Skills.GigaDrillBreaker.Other.On=&a{0}&2 pou\u017eil &cGiga Vrta\u010dku! +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: &e{0} -Fishing.Ability.Info=Magick\u00fd lovec: &7 **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: &e{0}/5 -Fishing.Ability.TH.MagicRate=\u0160ance na magick\u00e9ho lovce: &e{0} -Fishing.Ability.Shake=\u0160ance na ot\u0159es: &e{0} -Fishing.Ability.IceFishing=Ledov\u00e9 ryba\u0159en\u00ed: B\u011b\u017ete ryba\u0159it do ledu -Fishing.Ability.FD=Ryb\u00e1\u0159\u016fv apetit: &eRank {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.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=&9 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=&7C\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: &e{0} -Herbalism.Ability.FD=Farm\u00e1\u0159ova dieta: &eRank {0} -Herbalism.Ability.GTe.Length=D\u00e9lka trv\u00e1n\u00ed Zelen\u00e9 planety: &e{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: &e{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.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\u011bn\u011bn: &e{0} +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=\u0160ance na dovednost Houba\u0159: &e{0} -Herbalism.Ability.ShroomThumb.Fail=**HOUBA\u0158 SELHAL** +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=&aThe 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=&a**ZELEN\u00c1 TERRA AKTIVOV\u00c1NA** +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\u017eil &cGreen Terra! +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\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.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: &e{0} -Mining.Effect.DropChance=\u0161ance na dvojn\u00e1sobn\u00fd zisk: &e{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.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\u010den\u00ed +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=&7**VYBUCH** -Mining.Blast.Effect=+{0} v\u00fdnos rudy, {1}x ko\u0159ist +Mining.Blast.Effect=+{0} výnos rudy, {1}x kořist Mining.Blast.Radius.Increase=Navyseni radiusu vybuchu: &e+{0} -Mining.Blast.Rank=V\u00fdbu\u0161n\u00e9 t\u011b\u017een\u00ed &e Rank {0}/8 &7({1}) -Mining.Blast.Other.On=&a{0}&2 pou\u017eil &cV\u00fdbu\u0161n\u00e9 T\u011b\u017een\u00ed! +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 @@ -179,160 +179,160 @@ 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=&4V mcMMO do\u0161lo k chyb\u011b p\u0159i oprav\u011b tohoto itemu! -Repair.Listener.Anvil=&4Polo\u017eil si kovadlinu, na kovadlin\u011b m\u016f\u017ee\u0161 opravovat n\u00e1stroje a zbroj. +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.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\u00ed\u0161 m\u00edt level &e{0}&c k oprav\u011b &e{1} -Repair.Skills.FeltEasy=&7To bylo snadn\u00e9. -Repair.Skills.FullDurability=&7Tento p\u0159edm\u011bt nen\u00ed po\u0161kozen\u00fd. -Repair.Skills.SalvageSuccess=&7 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: &eExtra {0} \u017eivotnosti obnovena -Repair.Skills.StackedItems=&4Nem\u016f\u017ee\u0161 opravovat nestackovan\u00e9 p\u0159edm\u011bty. -Repair.Skills.Super.Chance=\u0160ance na superopravov\u00e1n\u00ed: &e{0} +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 +Salvage.Pretty.Name=Zachránit Repair.Arcane.Chance.Downgrade=&7Sance na degradovani magicke sily predmetu: &e{0}% -Repair.Arcane.Chance.Success=&7Pravd\u011bpodobnost \u00fasp\u011bchu AF: &e{0}% -Repair.Arcane.Downgrade=Magick\u00e1 s\u00edla tohoto p\u0159edm\u011btu zesl\u00e1bla. +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=&aUdr\u017eel jsi nezn\u00e1mou enegii v tomto p\u0159edm\u011btu. -Repair.Arcane.Rank=Tajemne kov\u00e1n\u00ed: &eLevel {0}/4 +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=\u0160ance na krv\u00e1cen\u00ed: &e{0} -Swords.Combat.Bleed.Length=D\u00e9lka krv\u00e1cen\u00ed: &e{0} tik\u016f +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\u00e1c\u00ed\u0161! +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=\u0160ance na proti\u00fatok: &e{0} -Swords.Combat.Counter.Hit=&4Zasa\u017een proti\u00fatokem! +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.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: &e{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: &e{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=&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\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.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.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=&aVyvol\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: &e{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: &e{0} -Unarmed.Ability.Chance.Disarm=\u0160ance na odzbrojen\u00ed: &e{0} -Unarmed.Ability.Chance.IronGrip=\u0160ance na \u017delezn\u00fd stisk: &e{0} -Unarmed.Ability.IronGrip.Attacker= Tv\u016fj soupe\u0159 m\u00e1 \u017eelezn\u00e9 sev\u0159en\u00ed! -Unarmed.Ability.IronGrip.Defender=&aTv\u016fj \u017eelezny stisk zabr\u00e1nil tomu abys byl odzbrojen! -Unarmed.Ability.Lower=&7**SKL\u00c1N\u00cd\u0160 SV\u00c9 P\u011aSTI** +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\u011bsn\u011bn\u00ed (SCHOPNOST) +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=&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\u011bsn\u011bn\u00ed &abyla obnovena! -Unarmed.Skillup=Dovednost v boji rukou byla navy\u0161ena o {0}. Celkem ({1}) +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: &e{0} -Woodcutting.Ability.Length=D\u00e9lka Tree felleru: &e{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&a byl deaktivovan &e{0} t -Woodcutting.Skills.TreeFeller.On=&a**V\u00c1LE\u010c STROM\u016e AKTIVOV\u00c1NO** +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=&a**SCHOPNOSTI OBNOVENY!** Ability.Generic.Template.Lock=&7{0} @@ -340,184 +340,184 @@ 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\u00edk (&c{0}&3) +Combat.BeastLoreOwner=&3Vlastník (&c{0}&3) Combat.Gore=&a**PRUNIK** Combat.StruckByGore=**BYL JSI PROBODNUT** -Combat.TargetDazed=C\u00edl byl &4Omr\u00e1\u010den +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\u00f3d vytvo\u0159en\u00fd v \u00fanoru 2011,&6autorem &9nossr50&6. C\u00edl projektu je poskytnout kvalitu RPG.,&3Tipy:,&6 - &aPou\u017eij &c/mcmmo help&a pro zobrazen\u00ed dostupn\u00fdch p\u0159\u00edkaz\u016f,&6 - &aType &c/SKILLNAME&a pro zobrazen\u00ed detailn\u00edch informac\u00ed o skillu,&3V\u00fdvoj\u00e1\u0159i:,&6 - &anossr50 &9(Majitel),&6 - &aGJ &9(Vedouc\u00ed projektu),&6 - &aNuclearW &9(V\u00fdvoj\u00e1\u0159),&6 - &abm01 &9(V\u00fdvoj\u00e1\u0159),&6 - &aTfT_02 &9(V\u00fdvoj\u00e1\u0159),&6 - &aGlitchfinder &9(V\u00fdvoj\u00e1\u0159),&6 - &at00thpick1 &9(V\u00fdvoj\u00e1\u0159),&3U\u017eite\u010dn\u00e9 odkazy:,&6 - &ahttps://github.com/mcMMO-Dev/mcMMO/issues&6 Nahla\u0161ov\u00e1n\u00ed Chyb,&6 - &a#mcmmo @ irc.esper.net&6 IRC Chat, -Commands.addlevels.AwardAll.1=&aBylo 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=&aTvoje dovednost {1} je nyn\u00ed {0}! +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=&aBylo v\u00e1m ud\u011bleno {0} zku\u0161enost\u00ed ve v\u0161ech skillech! -Commands.addxp.AwardSkill=&aZ\u00edskal si {0} zku\u0161enost\u00ed v {1}! -Commands.Ability.Off=Pou\u017eit\u00ed schopnosti bylo &c vypnuto -Commands.Ability.On=Pou\u017eit\u00ed schopnosti bylo &azapnuto +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\u00fd +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= &c- Shl\u00e9dni detailn\u00ed informace o hr\u00e1\u010di +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\u00e1nka \u00faspesne odesl\u00e1na. -Commands.Leaderboards= &c- Tabulka nejlep\u0161\u00edch -Commands.mcc.Header=---[]&emcMMO P\u0159\u00edkazy&c[]--- +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=&aDatab\u00e1ze byla \u00fasp\u011b\u0161n\u011b vy\u010dist\u011bna! -Commands.mcrank.Heading=&6-=OSOBN\u00cd HODNOCEN\u00cd=- -Commands.mcrank.Overall=Celkov\u00e1&a - &6Hodnost &f#&a{0} -Commands.mcrank.Player=C\u00cdL: &f{0} +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=&a{0} byl \u00fasp\u011b\u0161n\u011b vymaz\u00e1n z datab\u00e1ze! -Commands.mctop.Tip=&6Tip: Pro osobn\u00ed statistiky pou\u017eij &c/mcrank&6! +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\u00e1 \u00farove\u0148 ve v\u0161ech skillech byla nastavena na {0}! -Commands.mmoedit.Modified.1=&aTv\u016fj skill v {0} byl pozm\u011bn\u011bn na {1}! +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 &a{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 &cvypnuto -Commands.Notifications.On=Oznamov\u00e1n\u00ed schopnost\u00ed &azapnuto -Commands.Offline=Tento p\u0159\u00edkaz nefunguje pro offline hr\u00e1\u010de. +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\u00c9NO: &f{0} {1} -Commands.Party.ShareMode=&8M\u00d3D SD\u00cdLEN\u00cd: -Commands.Party.ItemShare=&7P\u0158EDM\u011aT &3({0}) +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\u00edl\u00edm p\u0159edm\u011bty: &7&o{0} -Commands.Party.MembersNear=&8BL\u00cdZKO TEBE&3{0}&8/&3{1} +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 &cVypnuty Commands.Party.Chat.On=Party chat &cOff -Commands.Party.Commands=&a--P\u0158\u00cdKAZY PARTY-- +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\u0161te &a/party accept&e abyste p\u0159ijali pozv\u00e1nku -Commands.Party.Invite=- Poslat pozv\u00e1nku do party -Commands.Party.Join=&7P\u0159idal/a jste se do party: {0} -Commands.Party.Create=&7Vytvo\u0159ena parta: {0} -Commands.Party.Rename=&7Jm\u00e9no party zm\u011bn\u011bno na: &f{0} -Commands.Party.SetSharing=&7Parta {0} sd\u00edl\u00ed nastaven\u00ed na: &3{1} -Commands.Party.ToggleShareCategory=&7Sd\u00edlen\u00ed v\u011bc\u00ed v part\u011b pro &6{0} &7bylo &3{1} -Commands.Party.AlreadyExists=&4Parta {0} u\u017e existuje! +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=-----[]&a\u010cLENOV\u00c9&c[]----- +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= &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 &azapnut\u00e1 -Commands.ptp.Disabled=Teleportace paret &cvypnut\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} &apo\u017e\u00e1dal ,aby se k v\u00e1m mohl teleportovat. -Commands.ptp.Request2=&aK teleportu napi\u0161te &e/ptp accept. &aPo\u017eadavek vypr\u0161\u00ed za &c{0} &asekund. -Commands.ptp.AcceptAny.Enabled=Potvrzen\u00ed teleportu party &azapnut -Commands.ptp.AcceptAny.Disabled=Potvrzen\u00ed teleportu party &cvypnuto -Commands.ptp.RequestExpired=Po\u017eadavek o teleport party vypr\u0161el! +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\u00c1 \u00daROVE\u0147: &a{0} &4MAXIM\u00c1LN\u00cd \u00daROVE\u0147: &e{1} +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\u00e1ny. +Commands.Reset.All=&a Vsechny vase dovednosti byly uspesne resetovány. Commands.Reset.Single=&aTvoje dovednost {0} byla uspesne restartovana. -Commands.Reset=Resetov\u00e1n\u00ed zku\u0161enost\u00ed na level 0 +Commands.Reset=Resetování zkušeností na level 0 Commands.Skill.Invalid=Neplatny nazev dovednosti! Commands.Skill.Leaderboard=--mcMMO &9{0}&e Tabulka nejlepsich-- -Commands.SkillInfo=- Shl\u00e9dnout detailn\u00ed informace o dovednosti +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=&4Nedostatecna prava mcMMO.NoSkillNote=&8Pokud 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 &3{0} [password]. -Party.Help.1=Pro vytvo\u0159en\u00ed party, pou\u017eij &3{0} [password]. -Party.Help.2=Pora\u010f se s &3{0} &cpro v\u00edce informac\u00ed -Party.Help.3=Pou\u017eij &3{0} [password] &cpro vstup nebo &3{1} &cpro opu\u0161t\u011bn\u00ed -Party.Help.4=Pro uzam\u010den\u00ed nebo odem\u010den\u00ed tv\u00e9 party, pou\u017eij &3{0} -Party.Help.5=Pro ochr\u00e1n\u011bn\u00ed va\u0161\u00ed party heslem, pou\u017eij &3{0} -Party.Help.6=Pro vykopnut\u00ed hr\u00e1\u010de z tv\u00e9 party, pou\u017eij &3{0} -Party.Help.7=Pro p\u0159esunut\u00ed v\u016fdcovstv\u00ed tv\u00e9 party, pou\u017eij &3{0} -Party.Help.8=Pro zru\u0161en\u00ed va\u0161\u00ed party pou\u017eij &3{0} -Party.Help.9=Pou\u017eijte&3{0} &cabyste sd\u00edlel v\u011bci se \u010dleny party. -Party.Help.10=Pou\u017eij &3{0} &ck zapnut\u00ed sd\u00edlen\u00ed zku\u0161enostn\u00edch bod\u016f se \u010dleny party -Party.InformedOnJoin={0} &ase p\u0159idal do va\u0161\u00ed party -Party.InformedOnQuit={0} &aopustil va\u0161\u00ed partu -Party.InformedOnNameChange=&6{0} &anastavil jm\u00e9no party na &f{1} -Party.InvalidName=&4Toto 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! +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=&4{0} nen\u00ed ve tv\u00e9 part\u011b. -Party.NotOwner=&4Nejste v\u016fdcem party. -Party.Owner.New=&a{0} se stal v\u016fdce party. -Party.Owner.NotLeader=&4U\u017e nejsi v\u016fdce party. -Party.Owner.Player=&aNyn\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.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\u010di\u0161t\u011bno. +Party.Password.Removed=&aHeslo party bylo vyčištěno. Party.Player.Invalid=Tohle neni platny hrac. -Party.NotOnline=&4{0} nen\u00ed online! -Party.Player.InSameParty={0} u\u017e je na va\u0161\u00ed party! -Party.PlayerNotInParty=&4{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.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\u016f\u017ee\u0161 se teleportovat s\u00e1m na sebe! +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\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.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\u00c1NKY) -Party.Status.Unlocked=&2(OTEV\u0158\u00cdT) +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 @@ -526,124 +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.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\u0161enostn\u00edch bod\u016f byla zm\u011bn\u011bna na {0} -Commands.xprate.over=mcMMO Event na XP N\u00e1sobek ZKON\u010cIL! +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=&6XP EVENT PRO mcMMO ZA\u010cAL! -Commands.xprate.started.1=&6mcMMO XP N\u00c1SOBEK JE NYN\u00cd {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=&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\u00e1vod k {0} - napi\u0161te /{1} ? [page] -Guides.Header=&6-=&a{0} N\u00e1vod&6=- -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! +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\u00e1n\u00ed tohoto hr\u00e1\u010de. -Item.ChimaeraWing.Fail=**K\u0158\u00cdDLO CHIM\u00c9RY SELHALO!** +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=&7Teleportuje 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! &e({0}s) +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\u00e1jen\u00ed teleportu za&6({0}) &7sekund, pros\u00edm st\u016fj klidn\u011b... -Teleport.Cancelled=&4Teleportace zru\u0161ena -Skills.Child=&6(D\u011btsk\u00e1 dovednost) +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\u010cE +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=&aStiskn\u011bte znovu prav\u00e9 tla\u010d\u00edtko pro potvrzen\u00ed &6{0}&a. Lev\u00e9 tla\u010d\u00edtko ke zru\u0161en\u00ed. +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=&a[mcMMO] Statistiky -Perks.XP.Name=Zku\u0161enost +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=&6 ({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=&6 ({0} s perkem V\u00fddr\u017enost) -MOTD.Donate=&3Informace o p\u0159\u00edsp\u011bvc\u00edch: -MOTD.Hardcore.DeathStatLoss.Stats=&6[mcMMO] &3Dovednost\u00ed penalizace kv\u016fli smrti : &4{0}% -MOTD.Hardcore.Vampirism.Stats=&6[mcMMO] &3Up\u00edrsk\u00e9 Cizen\u00ed Stat\u016f: &4{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=&6[mcMMO] - verze &3{0} MOTD.Website=&6[mcMMO] &a{0}&e - Web mcMMO -Smelting.Ability.FluxMining=\u0160ANCE NA T\u011a\u017dBU VRT\u00c1KEM: &e{0} -Smelting.Ability.FuelEfficiency=N\u00e1sobi\u010d v\u00fdkonnosti paliva: &e{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: &e{0} -Smelting.Ability.VanillaXPBoost=N\u00c1SOBI\u010c ZKU\u0160ENOST\u00cd: &e{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.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\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 +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 bb3949078..254a078d3 100644 --- a/src/main/resources/locale/locale_cy.properties +++ b/src/main/resources/locale/locale_cy.properties @@ -186,7 +186,7 @@ Repair.Skillup= sgiliau Atgyweirio cynyddu {0}. Cyfanswm ({1}) 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=&aYou have sustained the arcane energies in this item. Repair.Arcane.Rank=Arcane Forging: &eRank {0}/4 @@ -247,10 +247,10 @@ 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=&8 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.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. @@ -304,7 +304,7 @@ 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\u00ean ** +Combat.BeastLore=&a ** bwystfil llên ** Combat.BeastLoreHealth=&3 Iechyd (&a {0} &3 / {1}) Combat.BeastLoreOwner=&3Owner (&c{0}&3) Combat.Gore=&a**GORED** @@ -409,7 +409,7 @@ 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=&8 Cael Profiad: &f {0} diff --git a/src/main/resources/locale/locale_da.properties b/src/main/resources/locale/locale_da.properties index 610f17952..6207fe433 100644 --- a/src/main/resources/locale/locale_da.properties +++ b/src/main/resources/locale/locale_da.properties @@ -1,184 +1,184 @@ Acrobatics.Ability.Proc=&a**Yndefuld Landing** Acrobatics.Combat.Proc=&a**Undviget** -Acrobatics.DodgeChance=Afv\u00e6rgnings Chance: &e{0} +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: &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}) +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=&7**DU S\u00c6NKER DIN \u00d8KSE** -Axes.Ability.Ready=&a**DU G\u00d8R DIN \u00d8KSE KLAR** +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=&a**RAMT AF STOR KRAFT** -Axes.Combat.GI.Struck=**RAMT AF ST\u00d8RRE SLAG** -Axes.Combat.SS.Length=Kranie Splitter L\u00e6ngde: &e{0}s +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=&a**Kranie Knuser AKTIVERET** -Axes.Skills.SS.Refresh=&aDin &eKranie Splitter &aevne er genindl\u00e6st! +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=\u00d8kse evner forbedret med {0}. Ialt ({1}) -Excavation.Ability.Lower=&7**DU S\u00c6NKER DIN SKOVL** -Excavation.Ability.Ready=&a**DU G\u00d8R DIN SKOVL KLAR** +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: &e{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=&a**Super Bor AKTIVERET** -Excavation.Skills.GigaDrillBreaker.Refresh=&aDin &eGiga Borer &aevne er genindl\u00e6st! +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\u00f8get med {0}. Total ({1}) -Fishing.Ability.Info=Magisk J\u00e6ger: &7 **Forbedres med skattejagts ranken** -Fishing.Ability.Locked.0=L\u00c5ST INDTIL {0}+ EVNE (RYST) -Fishing.Ability.Rank=Skatte J\u00e6ger Rank: &e{0}/5 -Fishing.Ability.TH.MagicRate=Magi J\u00e6ger Chance: &e{0} +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\u00e6ger (Passiv) +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=&9 Regn Bonus Fishing.Listener=Fiskeri: -Fishing.Ability.TH.MagicFound=&7Du 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}) +Fishing.Skillup=Fisker evne forøget med {0}. Total ({1}) Herbalism.Ability.DoubleDropChance=2x Tabs Chance: &e{0} -Herbalism.Ability.GTe.Length=Gr\u00f8n Terra L\u00e6ngde: &e{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: &e{0} -Herbalism.Ability.GTh.Fail=**GR\u00d8NNE FINGRE MISLYKKEDES** -Herbalism.Ability.GTh.Stage=Gr\u00f8nne Fingre Stadie: &e Planter gror i stadie {0} -Herbalism.Ability.GTh=&a**GR\u00d8NNE FINGRE** -Herbalism.Ability.Lower=&7**DU S\u00c6NKER DIt LUGEJERN** -Herbalism.Ability.Ready=&a**DU G\u00d8R DIT LUGEJERN KLAR** -Herbalism.SubSkill.GreenTerra.Name=Gr\u00f8n Terra (EVNE) +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=&a**GR\u00d8N TERRA AKTIVERET** -Herbalism.Skills.GTe.Refresh=&aDin &eGr\u00f8nne Terra &aevne er genindl\u00e6st! -Herbalism.Skills.GTe.Other.Off=Gr\u00f8n Terra&a er aftaget i &e{0} -Herbalism.Skills.GTe.Other.On=&a{0}&2 har brugt &cGr\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: &e{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=&7**DU S\u00c6NKER DIN HAKKE** -Mining.Ability.Ready=&a**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: &e{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=&a**SUPER \u00d8DEL\u00c6GGER AKTIVERET** -Mining.Skills.SuperBreaker.Other.Off=Super \u00d8del\u00e6gger&a er aftaget i &e{0} -Mining.Skills.SuperBreaker.Other.On=&a{0}&2 har brugt &cSuper \u00d8del\u00e6gger! -Mining.Skills.SuperBreaker.Refresh=&aDin &eSuper Smadrer &aevne er genindl\u00e6st! -Mining.Skillup=Minedriftsevne for\u00f8get med {0}. Total ({1}) +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\u00f8gelse: &e+{0} +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\u00e6st! +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=&4mcMMO m\u00f8dte en fejl mens den fors\u00f8gte at reparere dette objekt! -Repair.Listener.Anvil=&4Du har placeret en armbolt, armbolte kan reparere v\u00e6rkt\u00f8j og rustning. -Repair.Listener.Anvil2=&4Du 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=&4 Du har ikke Evner nok til at bruge Genbrug p\u00e5 Objekter. +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\u00e6re level &e{0}&c for at reparere &e{1} +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\u00e5 fuld holdbarhed +Repair.Skills.FullDurability=&7Det er på fuld holdbarhed Repair.Skills.SalvageSuccess=&7Genstand genbrugt! -Repair.Skills.NotFullDurability=&4Du kan ikke genbruge \u00f8delagte v\u00e6rkt\u00f8jer og rustninger. +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} @@ -190,116 +190,116 @@ 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=&aDu har vedligeholdt de magiske energier i dette objekt. Repair.Arcane.Rank=Magisk Smedning: &eRank {0}/4 -Swords.Ability.Lower=&7**DU S\u00c6NKER DIT SV\u00c6RD** -Swords.Ability.Ready=&a**DU HAR FORBEREDT DIT SV\u00c6RD** -Swords.Combat.Bleed.Chance=Bl\u00f8de Chance: &e{0} -Swords.Combat.Bleed.Length=Bl\u00f8dnings L\u00e6ngde: &e{0} ticks +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\u00f8der! -Swords.Combat.Bleeding.Stopped=&7Bl\u00f8dningen er &astoppet&7! -Swords.Combat.Bleeding=&a**MODSTANDEREN BL\u00d8DER** +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\u00e6gtekunstens S\u00e5r! +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=&a**F\u00c6GTEKUNST AKTIVERET** -Swords.Skills.SS.Refresh=&aDin &eF\u00e6gtekunst &aevne er genindl\u00e6st! -Swords.Skills.SS.Other.Off=F\u00e6gtekunst&a er aftaget i &e{0} -Swords.Skills.SS.Other.On=&a{0}&2 har brugt &cF\u00c6GTEKUNST! -Swords.Skillup=Sv\u00e6rd evne for\u00f8get med {0}. Total ({1}) -Swords.SS.Length=F\u00e6gtekunstens L\u00e6ngde: &e{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.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\u00e5 p\u00e5 Ulve & Ocelotter med en Knogle for at incpicere dem. +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=&7COTW (Ocelot): Crouch og venstre-click med {0} en Fisk i h\u00e5nden -Taming.Effect.15=&7COTW (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=&8Din ulv smutter tilbage til dig... -Taming.Listener=T\u00e6mning: -Taming.SkillName=T\u00c6MMER -Taming.Skillup=T\u00e6mningsevne for\u00f8get med {0}. Total ({1}) +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\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: &e{0}s +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: &e{0} -Unarmed.Ability.Chance.Disarm=Afv\u00e6bnings 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=&aDit Jerngreb lod dig modst\u00e5 afv\u00e6bning! -Unarmed.Ability.Lower=&7**DU S\u00c6NKER DINE N\u00c6VER** -Unarmed.Ability.Ready=&a**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=&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\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 +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\u00e6 Hugger L\u00e6ngde: &e{0}s -Woodcutting.Ability.Locked.0=L\u00c5ST INDTIL {0}+ EVNE (BLAD BL\u00c6SER) -Woodcutting.SubSkill.TreeFeller.Name=Tr\u00e6 Hugger (EVNE) -Woodcutting.SubSkill.TreeFeller.Description=F\u00e5r tr\u00e6er til at explodere -Woodcutting.SubSkill.LeafBlower.Name=Blad Bl\u00e6ser -Woodcutting.SubSkill.LeafBlower.Description=Spr\u00e6ng blade v\u00e6k +Woodcutting.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=&a**TR\u00c6 HUGGER AKTIVERET** -Woodcutting.Skills.TreeFeller.Refresh=&aDin &eTr\u00e6 Hugger &aevne er genindl\u00e6st! -Woodcutting.Skills.TreeFeller.Other.Off=Tr\u00e6 hugger&a er aftaget i &e{0} -Woodcutting.Skills.TreeFeller.Other.On=&a{0}&2 har brugt &cTr\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=&a**EVNER GENINDL\u00c6ST!** +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** @@ -308,21 +308,21 @@ 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 &4Bed\u00f8vet -Combat.TouchedFuzzy=&4R\u00f8rte Plysse. F\u00f8lte mig svimmel. -Commands.addlevels.AwardAll.1=&aDu har f\u00e5et {0} Exp i alle evner! -Commands.addlevels.AwardAll.2=Alle evner er blevet \u00e6ndret til {0}. -Commands.addlevels.AwardSkill.1=&aDu har f\u00e5et{0} levels i {1}! -Commands.addlevels.AwardSkill.2={0} er blevet \u00e6ndret for {1}. -Commands.addxp.AwardAll=&aDu har f\u00e5et {0} Exp i alle evner! -Commands.addxp.AwardSkill=&aDu har f\u00e5et {0} Exp i {1}! +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 @@ -337,16 +337,16 @@ Commands.mchud.Invalid=Det er ikke en tilladt HUD type. 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\u00c5L: &f{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\u00f8ling er blevet genindl\u00e6st. +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 - \u00c6ndrer m\u00e5let +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 \u00e6ndret for {1}. -Commands.ModDescription=- L\u00e6s den korte mod beskrivelse +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=&a--ANDRE KOMMANDOER-- Commands.Party.Accept=- Accepter gruppe invitation @@ -357,7 +357,7 @@ Commands.Party.Invite.0=INFORMATION: &aDu har modtaget en gruppe invitation for 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.Quit=- Forlad din nuværende Gruppe Commands.Party.Teleport= &c- Teleporter til gruppe medlem Commands.Party.Toggle=- Skift Gruppe Chat Commands.PowerLevel.Leaderboard=--mcMMO&9 Kraft Level &eRangliste-- @@ -365,12 +365,12 @@ 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\u00e6s en evnes level til 0 +Commands.Reset=Genindlæs en evnes level til 0 Commands.Skill.Invalid=Det er ikke et brugbart evnenavn! 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.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=&4Dette 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.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\u00e6ngere gruppens 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=&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.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=&a{0} har teleporteret til dig. -Party.Unlocked=&7Gruppe er \u00e5ben +Party.Unlocked=&7Gruppe er åben Commands.XPGain.Acrobatics=Falder Commands.XPGain.Archery=Angriber Monstre Commands.XPGain.Axes=Angriver Monstre @@ -410,35 +410,35 @@ 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.Woodcutting=Hugger træer ned Commands.XPGain=&8XP FORTJENST: &f{0} -Commands.xplock.locked=&6Din XP BAR er nu l\u00e5st til {0}! -Commands.xplock.unlocked=&6Din XP BAR er nu &a\u00c5BEN&6! -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.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\u00d8MMELSE ER NU {0}x! -XPRate.Event=&6mcMMO er lige nu i gang med et XP bed\u00f8mnings begivenhed! XP bed\u00f8mning er {0}x! +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=&8LVL: &a{0} &3XP&e(&6{1}&e/&6{2}&e) Effects.Template=&3{0}: &a{1} -Guides.Available=&7Guide for {0} tilg\u00e6ngelige - skriv /{1} ? [page] +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 &e{0} -Inspect.Stats=&amcMMO F\u00e6rdigheder for &e{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. &e({0}s) -Skills.Disarmed=&4Du er blevet afv\u00e6bnet! +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) @@ -446,7 +446,7 @@ Skills.TooTired=Du er for udmattet til at bruge denne evne igen. Stats.Header.Combat=&6-=KAMP EVNER=- Stats.Header.Gathering=&6-=INDSAMLINGS EVNER=- Stats.Header.Misc=&6-=MISC SKILLS=- -Stats.Own.Stats=&a[mcMMO] F\u00e6rdigheder +Stats.Own.Stats=&a[mcMMO] Færdigheder Perks.XP.Name=Erfaring Perks.XP.Desc=Modtag {0}x XP. Perks.Lucky.Name=Held @@ -454,15 +454,15 @@ 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=&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.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\u00f8ds straf: &4{0}% +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=&6[mcMMO] K\u00f8rer version &3{0} +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 diff --git a/src/main/resources/locale/locale_de.properties b/src/main/resources/locale/locale_de.properties index 74333581c..a820ad309 100644 --- a/src/main/resources/locale/locale_de.properties +++ b/src/main/resources/locale/locale_de.properties @@ -1,5 +1,5 @@ -Ability.Generic.Refresh = &a**Deine F\u00E4higkeiten sind wieder bereit** +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} @@ -9,7 +9,7 @@ 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.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. @@ -17,7 +17,7 @@ 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\u00E4ltst du im Fall die Duck-Taste (standardm\u00E4\u00DFig 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.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 @@ -26,187 +26,187 @@ Acrobatics.SubSkill.Roll.Stats = &6Chance abzurollen &e{0}% &6Chance anmutig abz 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.Description = Erhöht die Braugeschwindigkeit von Tränken. 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.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.SingleItemStack = &cDu kannst nicht mehrere Items gleichzeitig zerlegen oder reparieren, versuche es erstmal mit einem einzelnen Item. -Anvil.Unbreakable = Dieses Item ist unzerst\u00F6rbar! +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.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\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.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.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\u00FCstung. +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\u00FCr {1}s pausiert) +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\u00E4delspalter 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\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.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 = \u00DCberschreite deine Grenzen. -Axes.SubSkill.AxesLimitBreak.Name = \u00DCberwindung -Axes.SubSkill.AxesLimitBreak.Stat = Bonus-Schaden durch \u00DCberwindung +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.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\u00E4chenschaden. -Axes.SubSkill.SkullSplitter.Name = Sch\u00E4delspalter -Axes.SubSkill.SkullSplitter.Stat = Sch\u00E4delspalter L\u00E4nge +Axes.SubSkill.SkullSplitter.Description = Verursacht einen Flächenschaden. +Axes.SubSkill.SkullSplitter.Name = Schädelspalter +Axes.SubSkill.SkullSplitter.Stat = Schädelspalter Länge -Broadcasts.LevelUpMilestone = &6(&amcMMO&6) {0}&7 hat nun Level &a{1}&7 mit der F\u00E4higkeit &3{2}&7 erreicht! +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\u00E4nger automatisch an die spezifischen Kan\u00E4le versendet. +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\u2192 &r{1} -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.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.BeastLoreHorseJumpStrength = &3Pferde-Sprungst\u00E4rke (&aMaximal {0} Bl\u00F6cke&3) -Combat.BeastLoreHorseSpeed =&3Pferde-Laufgeschwindigkeit (&a{0} Bl\u00F6cke/s&3) +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\u00E4ubt! -Combat.TouchedFuzzy = &a&o**Du wurdest ungl\u00FCcklich ber\u00FChrt, ein Schwindelgef\u00FChl kommt dir auf...** +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.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\u00FCrde ver\u00E4ndert f\u00FCr &e{0} +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\u00E4higkeiten Cooldowns&6 =-- +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\u00FChren kannst! -Commands.Database.CooldownMS = Du musst {0}ms warten bis du diesen Befehl wieder ausf\u00FChren kannst! +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 = \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.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\u00E4higkeiten-Cooldowns. +Commands.Description.mccooldown = Sieh alle Fähigkeiten-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.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\u00FCr einen Spieler. +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-\u00DCbersicht. +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\u00FCber, ob mcMMO im Kompatibilit\u00E4tsmodus oder voll funktionsf\u00E4hig ist. -Commands.Description.mmodebug = (De)aktiviere den Debugging-Modus, welcher n\u00FCtzliche Informationen ausgibt, wenn du einen Block schl\u00E4gst. +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 \u00FCber einen Skill oder andere Funktionen. +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\u00FCr die mcMMO Erfahrungsleisten. -Commands.Description.party = \u00C4ndere verschiedene Party-Einstellungen. +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\u00FCck. -Commands.Description.vampirism = Schalte Vampirismus an oder aus bzw. \u00E4ndere den Vampirismus Prozentsatz. +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 = \u00C4ndere die Erfahrungsrate oder starte ein Erfahrungs-Event. +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\u00DF! +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\u00FCr &e{0} aktiviert. -Commands.Healthbars.Changed.BAR = [mcMMO] Deine Lebensanzeige wurde zu &eK\u00E4stchen&f ge\u00E4ndert. +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\u00E4ndert. -Commands.Healthbars.Invalid = Ung\u00FCltiger Lebensanzeige-Typ! +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\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 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\u00F6glicht eine schnellere Ver\u00F6ffentlichung neuer mcMMO-Skills und eine gr\u00F6ßere Flexibilit\u00E4t mit bereits existenten Skills. +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\u00FCckg\u00E4ngig zu machen. Wenn der Debugging-Modus aktiviert wurde kannst du Bl\u00F6cke schlagen, um n\u00FCtzliche Informationen zu erhalten. Dies ist f\u00FCr den Support sehr n\u00FCtzlich. +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\u00E4higkeiten Hinweise wurden &cdeaktiviert. -Commands.Notifications.On = F\u00E4higkeiten Hinweise wurden &aaktiviert. +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\u00FCndet mit: &f{1} -Commands.Party.Alliance.AlreadyAllies = Deine Party ist bereits in einem B\u00FCndnis. Trenne es mit&3/party alliance disband&e. -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 Zum Verb\u00FCnden: &3/party alliance invite &c. -Commands.Party.Alliance.Invite.0 = ACHTUNG: &aDu hast eine B\u00FCndnis-Anfrage f\u00FCr {0} von {1} erhalten. +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\u00FCndnis-Anfrage angenommen -Commands.Party.Alliance.Members.Header = -----[]&aB\u00FCndnis-Mitglieder&c[]----- -Commands.Party.Alliance.None = Deine Party hat keine Verb\u00FCndeten. +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 @@ -216,7 +216,7 @@ 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\u00FCr {0} von {1} erhalten. +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}) @@ -225,51 +225,51 @@ 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.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\u00E4ndert. +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\u00FCndeter: &f{0} +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\u00FCr&6{0} &7wurde &3{1} +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\u00F6chstlevel: &e{1} +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\u00FCckgesetzt. -Commands.Reset.Single = &aDein {0} Skill-Level wurde erfolgreich zur\u00FCckgesetzt. +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\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.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 \u00DCbersicht auszublenden. +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\u00FCr diesen Befehl nicht benutzbar! -Commands.Skill.Invalid = Das ist kein g\u00FCltiger Skillname! +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\u00E4higkeiten-Aktivierung mit Rechtsklick an oder aus. +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\u00FCgen, damit der Spieler nicht benachrichtigt wird.) +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 @@ -279,79 +279,79 @@ Commands.Usage.Password = Passwort Commands.Usage.Player = Spieler Commands.Usage.Rate = Rate Commands.Usage.Skill = Skill -Commands.Usage.SubSkill = F\u00E4higkeit +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\u00FCr mcMMO wurden zur\u00FCckgesetzt. -Commands.XPBar.SettingChanged = &6Die Erfahrungsleisten-Einstellungen f\u00FCr &a{0}&6 wurden gesetzt auf: &a{1} +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\u00E4nke brauen +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\u00E4tze finden +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\u00E4hmen, mit dem Wolf k\u00E4mpfen +Commands.XPGain.Taming = Monster zähmen, mit dem Wolf kämpfen Commands.XPGain.Unarmed = Monster angreifen -Commands.XPGain.Woodcutting = B\u00E4ume f\u00E4llen +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\u00E4ndert. +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\u00E4ndert. +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\u00FCltiger Datenbanktyp. +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\u00FCltige Typen sind: &aLINEAR &cund &aEXPONENTIAL. +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\u00FCltiger HUD Typ. -Commands.mcpurge.Success = &aDie Datenbank wurde erfolgreich ges\u00E4ubert! -Commands.mcrank.Heading = &6-=Pers\u00F6nliche Rangliste=- +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\u00FCr &f{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\u00F6nlichen Statistiken zu sehen! +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\u00E4higkeiten wurde auf {0} gesetzt! +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\u00E4tigung &cdeaktiviert -Commands.ptp.AcceptAny.Enabled = Party-Teleportierung - Anfragenbest\u00E4tigung &aaktiviert +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\u00F6tigen Rechte um dich in die Welt {0} zu teleportieren. -Commands.ptp.Request1 = {0} &am\u00F6chte sich zu dir teleportieren. -Commands.ptp.Request2 = &aZum Teleportieren tippe &e/ptp accept&a. Die Anfrage l\u00E4uft in &c{0} &aSekunden aus. +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\u00FCr Skills ist vor\u00FCber! -Commands.xprate.proper.0 = &cKorrekte Eingabe f\u00FCr Erfahrungsratenwechsel: /xprate -Commands.xprate.proper.1 = &cKorrekte Eingabe f\u00FCr R\u00FCcksetzung auf Standard-Erfahrungsrate: /xprate reset +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\u00FCr Skills hat begonnen! -Commands.xprate.started.1 = &6Die Erfahrungsrate f\u00FCr Skills liegt jetzt bei {0}x! +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! -Compatibility.Layer.PartialSupport = &6Diese Version besitzt keine vollst\u00E4ndige Unterst\u00FCtzung f\u00FCr &a{0}&6, jedoch verwendet mcMMO ein System, welches versucht die fehlenden Features zu emulieren. +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. Effects.Child.Overhaul = &3Unterskill Level&e {0}&3: {1} @@ -359,7 +359,7 @@ 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.SubSkills.Overhaul = Fähigkeiten Effects.Template = &3{0}: &a{1} Excavation.Ability.Lower = &7&o**Du senkst deine Schaufel.** @@ -371,232 +371,232 @@ 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.Archaeology.Stat = Arch\u00E4ologie Erfahrungspunkte-Chance -Excavation.SubSkill.Archaeology.Stat.Extra = Arch\u00E4ologie Erfahrungspunkte-Anzahl +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 -Fishing.Ability.Info = Zauberj\u00E4ger: &7**Verbessert sich mit Schatzj\u00E4ger-Rang** +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\u00FChlst etwas Magisches an diesem Fang... +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\u00E4\u00DFe Nutzung der Angelrute f\u00FChrt zu Erm\u00FCdung und Abnutzen der Rute. +Fishing.Exhausting = &c&oUnsachgemäße Nutzung der Angelrute führt zu Ermüdung und Abnutzen der Rute. Fishing.Listener = Angeln: -Fishing.LowResourcesTip = &7Dein Gesp\u00FCr 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.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\u00E4hrwert von geangelter Nahrung. -Fishing.SubSkill.FishermansDiet.Name = Fischers-Di\u00E4t -Fishing.SubSkill.FishermansDiet.Stat = Fischers-Di\u00E4t:&a Rang {0} -Fishing.SubSkill.IceFishing.Description = Erm\u00F6glicht es dir in Eisbiomen zu 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\u00E4nde. -Fishing.SubSkill.MagicHunter.Name = Zauber-J\u00E4ger -Fishing.SubSkill.MagicHunter.Stat = Zauber-J\u00E4ger Chance -Fishing.SubSkill.MasterAngler.Description = Fische k\u00F6nnen h\u00E4ufiger gefangen werden, mit einem Boot funktioniert es umso besser. +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\u00DFe Lebewesen und Spielern mit deiner Angel Gegenst\u00E4nde. -Fishing.SubSkill.Shake.Name = Rei\u00DFen -Fishing.SubSkill.Shake.Stat = Rei\u00DFen Chance +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\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}\n&9Selten: &e{2} &dEpisch: &e{3} &6Legend\u00E4r: &e{4} &bMythic: &e{5} +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} -Guides.Acrobatics.Section.0 = &3\u00DCber 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\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 die Schleichen-Taste 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. -Guides.Alchemy.Section.2 = &3Wie funktioniert Gebr\u00E4u?\n&eGebr\u00E4u 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 freizuschalten. -Guides.Alchemy.Section.3 = &3Gebr\u00E4u 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\u00E4u Tier 2 Zutaten:\n&eKarotte (Eile)\n&eSchleimball (Langsamkeit)\n\n&3Gebr\u00E4u Tier 3 Zutaten:\n&eQuarz (Absorption)\n&eRoter Pilz (Sprungkraft) -Guides.Alchemy.Section.5 = &3Gebr\u00E4u Tier 4 Zutaten:\n&eApfel (Gesundheitsboost)\n&eVerrottetes Fleisch (Hunger)\n\n&3Gebr\u00E4u Tier 5 Zutaten:\n&eBrauner Pilz(\u00DCbelkeit)\n&eTintensack (Blindheit) -Guides.Alchemy.Section.6 = &3Gebr\u00E4u Tier 6 Zutaten:\n&eGras (S\u00E4ttigung)\n\n&3Gebr\u00E4u Tier 7 Zutaten:\n&eGiftige Kartoffel (Verwesung)\n\n&3Gebr\u00E4u 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.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\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.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\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&eFange 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.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\u00DCber Kr\u00E4uterkunde\n&eIn Kr\u00E4uterkunde geht es um das Ernten.\n\n&3XP-Zuwachs:\n&eErnte Pflanzen. -Guides.Herbalism.Section.1 = &3Kompatible Pflanzen:\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 einzuhauchen 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\u00E4uterkunde Level ab. -Guides.Herbalism.Section.4 = &3Wie funktioniert der Gr\u00FCne Daumen (Bl\u00F6cke)?\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\u00E4uterkunde-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 Bl\u00F6cke geben XP. +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\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 der Super-Brecher\n&eaktiviert. -Guides.Mining.Section.3 = &3Was ist der 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\n&eund reduziert den Schutt. -Guides.Page.Invalid = Keine g\u00FCltige Seitenzahl! +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\u00DCber 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\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.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\u00E4higkeit erm\u00F6glicht dir mit einer gewissen\n&eChance Verzauberungen auf Items zu erhalten.\n&eVerzauberungen k\u00F6nnen erhalten werden, 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&eVerwerten wir eine Goldspitzhacke 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.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\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.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\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 Materialien 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.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\u00DCber Holzf\u00E4ller:\n&eIm Holzf\u00E4llen geht es um das F\u00E4llen von B\u00E4umen.\n\n&3XP-Zuwachs:\n&eDu bekommst 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. +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. Hardcore.DeathStatLoss.Name = Skillverlust bei Tod: -Hardcore.DeathStatLoss.PercentageChanged = &6[mcMMO] Der Verlustprozentsatz wurde auf {0} ge\u00E4ndert. +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\u00FCr {1}. -Hardcore.Mode.Enabled = &6[mcMMO] Hardcore Modus {0} aktiviert f\u00FCr {1}. +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\u00E4ndert. +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! -Herbalism.Ability.GTe.NeedMore = Du brauchst mehr Samen um Gr\u00FCnes Land zu verbreiten. -Herbalism.Ability.GTh = &a**Gr\u00FCner Daumen** -Herbalism.Ability.GTh.Fail = **Gr\u00FCner Daumen gescheitert** +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\u00FCner Daumen 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 = &a&o**Gr\u00FCnes Land ist ausgelaufen** -Herbalism.Skills.GTe.On = &a&o**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.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\u00F6ht Effektivit\u00E4t von geernteter Nahrung. -Herbalism.SubSkill.FarmersDiet.Name = Bauernfr\u00FChst\u00FCck -Herbalism.SubSkill.FarmersDiet.Stat = Bauernfr\u00FChst\u00FCck &aRang {0} +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\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.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\u00E4hrigen Geburtstag!\n&9In Ehren von nossr50 und all den anderen flei\u00DFigen Entwicklern ist hier eine kleine Feuerwerk-Show! +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.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\u00FCgel gescheitert!** +Item.ChimaeraWing.Fail = &c**Chimaera Flügel 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 = **Chimarea Fl\u00FCgel** +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\u00F6tigt Schmelzen-Level {0} oder mehr. +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\u00F6tigst &e{0}&c weitere &6{1}&c! +Item.NotEnough = Du benötigst &e{0}&c weitere &6{1}&c! 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.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\u00DFen +JSON.Archery = Bogenschießen JSON.Axes = Axtkampf JSON.DescriptionHeader = Beschreibung JSON.Excavation = Graben JSON.Fishing = Angeln -JSON.Herbalism = Kr\u00E4uterkunde +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\u00E4chstes Upgrade bei Level {0} +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\u00FCcksstr\u00E4ne +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\u00DCGBAR]=- +JSON.Locked = -=[NICHT VERFÜGBAR]=- JSON.Mining = Bergbau JSON.Notification.SuperAbility = {0} JSON.Rank = Rang @@ -604,21 +604,21 @@ 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.Taming = Zähmen JSON.Type.Active = Aktiv JSON.Type.Passive = Passiv -JSON.Type.SuperAbility = Superf\u00E4higkeit +JSON.Type.SuperAbility = Superfähigkeit JSON.URL.Discord = Der offizielle (englische) mcMMO Discord Server! -JSON.URL.Patreon = Unterst\u00FCtze die Entwicklung von mcMMO \u00FCber nossr50's Patreon! +JSON.URL.Patreon = Unterstütze die Entwicklung von mcMMO über nossr50's Patreon! JSON.URL.Spigot = Die offizielle mcMMO Spigot-Seite. -JSON.URL.Translation = \u00DCbersetze mcMMO in andere Sprachen! +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\u00E4llen +JSON.Woodcutting = Holzfällen -LevelCap.PowerLevel = &6(&amcMMO&6) &eDu hast das Level-Limit von &c{0}&e erreicht. Du kannst deine F\u00E4higkeiten nun nicht mehr weiter verbessern. -LevelCap.Skill = &6(&amcMMO&6) &eDu hast das Level-Limit von &c{0}&e f\u00FCr &6{1}&e erreicht. Du kannst diese F\u00E4higkeit von nun an nicht mehr weiter verbessern. +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! @@ -628,10 +628,10 @@ 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.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.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.** @@ -639,8 +639,8 @@ 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\u00FCndstoff! -Mining.Blast.Refresh = &aDein &eZ\u00FCndstoff &aist wieder bereit! +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** @@ -648,21 +648,21 @@ 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\u00F6ht den Explosionsradius. +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\u00FCndstoff -Mining.SubSkill.BlastMining.Stat = Z\u00FCndstoff:&a Rang {0}/{1} &7({2}) +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\u00F6hung +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\u00E4nge +Mining.SubSkill.SuperBreaker.Stat = Superbrecher Länge Notifications.Admin.Format.Others = &6(&amcMMO &3Admin&6) &7{0} Notifications.Admin.Format.Self = &6(&amcMMO&6) &7{0} @@ -671,39 +671,39 @@ Notifications.Admin.XPRate.End.Self = &7Du hast das Bonuserfahrungs-Event beende 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. -Overhaul.Levelup = &l{0} erh\u00F6ht auf &r&a&l{2}&r&f. +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\u00DFen +Overhaul.Name.Archery = Bogenschießen Overhaul.Name.Axes = Axtkampf Overhaul.Name.Excavation = Graben Overhaul.Name.Fishing = Angeln -Overhaul.Name.Herbalism = Kr\u00E4uterkunde +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\u00E4hmen +Overhaul.Name.Taming = Zähmen 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.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\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.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\u00FCndnisse sind 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\u00FCndnisse) +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) @@ -714,26 +714,26 @@ 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.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\u00FCtzen, 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 \u00FCbertragen, nutze &3{0} . -Party.Help.8 = &cUm deine Gruppe aufzul\u00F6sen, 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\u00E4ndert zu: &f{1} +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\u00F6glicher Gruppenname. +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\u00E4uterkunde +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\u00E4llen +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. @@ -744,16 +744,16 @@ 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.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\u00F6glicher Spieler. +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\u00E4llige Teilung +Party.ShareMode.Random = Zufällige Teilung Party.ShareType.Item = Item Party.ShareType.Xp = Erfahrung Party.Specify = &cDu musst eine Gruppe angeben. @@ -769,87 +769,87 @@ 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.Desc = Erhöht die Fähigkeitszeit um {0} Sekunden. Perks.ActivationTime.Name = Ausdauer -Perks.Cooldowns.Desc = Verk\u00FCrzt die Abklingzeit um {0}. +Perks.Cooldowns.Desc = Verkürzt 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.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.FailureNotice = &4[A] &cmcMMO konnte die Spielerdaten von &e{0}&c leider nicht laden. Bitte \u00DCberpr\u00FCfe deine Datenbankeinstellungen. &dVersuche: {1}. -Profile.Loading.FailurePlayer = &cmcMMO hat Probleme beim Laden deiner Daten nach &a{0}&c Versuchen. &8Kontaktiere den Serveradmin bez\u00FCglich dieses Problems. mcMMO wird weiterhin versuchen, deine Daten zu laden, bis du den Server verl\u00E4sst. So lange kannst du keine Skillerfahrung sammeln und diese auch nicht nutzen. +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. -Reminder.Squelched = &7Erinnerung: Du erh\u00E4ltst aktuell keinerlei Benachrichtigungen von mcMMO, um dies zu \u00E4ndern, nutze den /mcnotify Befehl. Dies ist eine st\u00FCndliche, automatische Erinnerung. +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. 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.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\u00DFen! +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\u00F6nnen Waffen und R\u00FCstung reparieren. +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\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.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\u00E4nde reparieren. -Repair.SubSkill.ArcaneForging.Description = Repariere magische Gegenst\u00E4nde. +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\u00FCstung. +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\u00FCstung. +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\u00FCstung. +Repair.SubSkill.IronRepair.Description = Repariere Eisen-Werkzeuge & -Rüstung. Repair.SubSkill.IronRepair.Name = Eisen-Reparatur ({0}+ SKILL) -Repair.SubSkill.Repair.Description = Repariere Werkzeuge & R\u00FCstung. +Repair.SubSkill.Repair.Description = Repariere Werkzeuge & Rüstung. Repair.SubSkill.Repair.Name = Reparatur -Repair.SubSkill.RepairMastery.Description = Erh\u00F6ht den Reparatur-Wert. +Repair.SubSkill.RepairMastery.Description = Erhöht den Reparatur-Wert. Repair.SubSkill.RepairMastery.Name = Reparaturmeister -Repair.SubSkill.RepairMastery.Stat = Reparaturmeister: &aF\u00FCgt {0} extra Haltbarkeit beim Reparieren hinzu. +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\u00E4t. +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\u00F6rt +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\u00FCstung zu verwerten. +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\u00E4higkeit ist nicht hoch genug um besch\u00E4digte Items zu verwerten. +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\u00FCckgewinnen. +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\u00E4digt um verwertet zu werden. +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\u00FCckzugewinnen; eine perfekte Verschrottung erfordert Gl\u00FCck und Geschick. +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\u00E4nde. Hierbei spielt Gl\u00FCck eine gewisse Rolle. -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.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 @@ -857,7 +857,7 @@ 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.Ability = Fähigkeit Scoreboard.Misc.Cooldown = &dAbklingzeit Scoreboard.Misc.CurrentXP = &aAktuelle XP Scoreboard.Misc.Level = &3Level @@ -867,39 +867,39 @@ Scoreboard.Misc.RemainingXP = Verbleibende XP Server.ConsoleName = &e[Server] -Skills.AbilityGateRequirementFail = &7Du ben\u00F6tigst &e{0}&7 weitere Level in &3{1}&7 um diese Superf\u00E4higkeit zu benutzen! +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\u00E4tigung &6{0}&a. Linksklick zum Abbrechen. +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\u00F6tigst mehr &7{0}{1}! +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\u00FCde um diese F\u00E4higkeit zu verwenden. &e({0}s) -Skills.TooTired.Extra = &6{0} &eSuperf\u00E4higkeit CDs - {1} +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) 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.Effect.5 = Erhöht die erhaltene Erfahrung beim Schmelzen. Smelting.Listener = Schmelzen: Smelting.SkillName = Schmelzen -Smelting.SubSkill.FluxMining.Description = M\u00F6glichkeit, um Erze direkt beim Abbauen zu 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\u00F6he die Brenndauer des Brennstoffes in \u00D6fen. +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\u00F6glicherweise verbringst du etwas zu viel Zeit damit, Erze in H\u00F6hlen zu schmelzen. Gibt Boni zu verschiedenen Aspekten des Bergbaus. +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 @@ -912,63 +912,63 @@ 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\u00F6rt&7! +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\u00E4gezahnschlag! -Swords.Effect.4 = S\u00E4gezahnschlag, Blutung+ +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\u00E4gezahnschlag abgenutzt** -Swords.Skills.SS.On = &a&o**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.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\u00E4ftigen zeitbasierten Schaden. +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\u00E4chenschaden, Fl\u00E4chenblutung+ -Swords.SubSkill.SerratedStrikes.Name = S\u00E4gezahnschlag -Swords.SubSkill.SerratedStrikes.Stat = S\u00E4gezahnschlag L\u00E4nge -Swords.SubSkill.Stab.Description = F\u00FCgt deinem Angriff extra Schaden hinzu. +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 = \u00DCberschreite deine Grenzen. -Swords.SubSkill.SwordsLimitBreak.Name = \u00DCberwindung -Swords.SubSkill.SwordsLimitBreak.Stat = Bonus-Schaden durch \u00DCberwindung +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.1 = Wölfe weichen Gefahren aus. Taming.Ability.Bonus.10 = Heiliger Hund -Taming.Ability.Bonus.11 = Regenerierung ist auch mit Tr\u00E4nken und Zaubern m\u00F6glich. +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\u00FCgen 1/{0} des normalen Schadens zu. -Taming.Ability.Bonus.6 = Gesch\u00E4rfte Krallen +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\u00E4rfte Krallen) +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\u00E4hmen: -Taming.Listener.Wolf = &8Dein Wolf l\u00E4uft zu dir zur\u00FCck... -Taming.SkillName = Z\u00C4HMEN -Taming.SubSkill.BeastLore.Description = Knochenschlag inspiziert W\u00F6lfe und Ozelots. +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\u00F6re ein Tier an deine Seite. -Taming.SubSkill.CallOfTheWild.Description.2 = &7Ruf der Wildnis: B\u00FCcken und Linksklick mit {0} {1} (Ozelot), {2} {3} (Wolf), {4} {5} (Pferd) +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 @@ -976,20 +976,20 @@ Taming.SubSkill.FastFoodService.Description = Chance auf Heilung bei Attacke (Wo 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.Description = Heilung durch Magie und Tränke. Taming.SubSkill.HolyHound.Name = Heiliger Hund -Taming.SubSkill.Pummel.Description = Deine W\u00F6lfe haben eine Chance, Gegner zur\u00FCck zu schlagen. +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\u00FCckgeschlagen! +Taming.SubSkill.Pummel.TargetMessage = Du wurdest von einem Wolf zurückgeschlagen! Taming.SubSkill.SharpenedClaws.Description = Schadens-Bonus -Taming.SubSkill.SharpenedClaws.Name = Gesch\u00E4rfte Krallen +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\u00F6nnen nicht gez\u00FCchtet werden. +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\u00F6tigst &e{0}&7 mehr von &3{1}. +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. @@ -1002,9 +1002,9 @@ Teleport.Commencing = &7Beginne Teleport in &6({0}) &7Sekunden, bitte stillhalte 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&o**Du senkst deine F\u00E4uste.** -Unarmed.Ability.Ready = &a&o**Du hebst deine F\u00E4uste...** +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** @@ -1017,78 +1017,78 @@ 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.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\u00E4sst den Gegenstand aus der Hand des Feindes fallen. +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\u00FCtzt dich davor, entwaffnet zu werden. +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\u00E4rkt deinen Arm mit der Zeit. -Unarmed.SubSkill.SteelArmStyle.Name = St\u00E4hlerner Arm +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.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 = &a&o**Baumf\u00E4ller abgelaufen** -Woodcutting.Skills.TreeFeller.On = &a&o**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.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\u00DF! -Woodcutting.SubSkill.BarkSurgeon.Description = Erhalte n\u00FCtzliche Ressourcen beim Entrinden von B\u00E4umen. +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\u00E4tliche Drops durch Baumf\u00E4ller. -Woodcutting.SubSkill.KnockOnWood.Loot.Normal = Standard-Loot von B\u00E4umen -Woodcutting.SubSkill.KnockOnWood.Loot.Rank2 = Standard-Loot von B\u00E4umen und Erfahrungspunkte +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\u00E4st Bl\u00E4tter davon. -Woodcutting.SubSkill.LeafBlower.Name = Bl\u00E4ttersturm +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\u00E4lle B\u00E4ume effizienter. +Woodcutting.SubSkill.Splinter.Description = Fälle Bäume 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.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.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.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\u00E4hmen Level: &6{0} +XPBar.Taming = Zähmen Level: &6{0} XPBar.Template = {0} -XPBar.Template.EarlyGameBoost = &6Du erlernst eine neue F\u00E4higkeit... +XPBar.Template.EarlyGameBoost = &6Du erlernst eine neue Fähigkeit... XPBar.Unarmed = Faustkampf Level: &6{0} -XPBar.Woodcutting = Holzf\u00E4llen 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 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\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),&6 - &aAnseba &9(\u00DCberarbeitung Deutsche \u00DCbersetzung), &3N\u00FCtzliche Links:&6 - &ahttps://github.com/mcMMO-Dev/mcMMO/issues&6 Bug Reporting,&6 - &ahttps://discord.gg/EJGVanb &6 Offizieller Discord (Englisch) +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. diff --git a/src/main/resources/locale/locale_en_US.properties b/src/main/resources/locale/locale_en_US.properties index 5b32d2649..a144f7803 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 diff --git a/src/main/resources/locale/locale_es.properties b/src/main/resources/locale/locale_es.properties index ea9430b74..331f4c271 100644 --- a/src/main/resources/locale/locale_es.properties +++ b/src/main/resources/locale/locale_es.properties @@ -2,11 +2,11 @@ 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: &e{0}% Acrobatics.SubSkill.Roll.GraceChance=Probabilidad de Rodada Majestuosa: &e{0}% @@ -15,79 +15,79 @@ Acrobatics.SkillName=ACROBACIAS Acrobatics.Skillup=Habilidad de Acrobacias incrementada en {0}. Total ({1}) Archery.Combat.DazeChance=Probabilidad de Aturdimiento: &e{0}% Archery.Combat.RetrieveChance=Probabilidad de Recuperar Flechas: &e{0} -Archery.Combat.SkillshotBonus=Da\u00f1o bonus por Habilidad de Tiro: &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.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\u00a1Fuiste golpeado CR\u00cdTICAMENTE! -Axes.Combat.CritChance=Probabilidad de golpe cr\u00edtico: &e{0}% -Axes.Combat.CriticalHit=\u00a1GOLPE CR\u00cdTICO! +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=&4Golpeado mediante DIVISOR DE CRANEOS! -Axes.Combat.SS.Length=Duraci\u00f3n de Parte Cr\u00e1neos: &e{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.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=&a**PARTE CR\u00c1NEOS ACTIVADO** -Axes.Skills.SS.Refresh=&a\u00a1Tu habilidad &eParte Cr\u00e1neos &aest\u00e1 refrescada! -Axes.Skills.SS.Other.Off=Parte Cr\u00e1neos&a le ha expirado a &e{0} -Axes.Skills.SS.Other.On=&a\u00a1{0}&2 us\u00f3 &cParte 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=&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: &e{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=&a**GIGA DRILL BREAKER ACTIVADO** -Excavation.Skills.GigaDrillBreaker.Refresh=&a\u00a1Tu habilidad de &eUltra Taladro Destructor &afue refrescada! +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\u00a1{0}&2 us\u00f3 &cUltra Taladro Destructor! -Excavation.Skillup=Habilidad de Excavaci\u00f3n incrementada en {0}. Total ({1}) +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\u00e1gico: &7 **Mejora con Rango de Buscador de Tesoros** +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: &eRango {0}/5 -Fishing.Ability.TH.MagicRate=Probabilidad de Cazador M\u00e1gico: &e{0} +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: &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 @@ -100,10 +100,10 @@ Fishing.SkillName=PESCADOR Fishing.Skillup=Habilidad de Pescador incrementada en {0}. Total ({1}) Herbalism.Ability.DoubleDropChance=Probabilidad de Doble Drop: &e{0} Herbalism.Ability.FD=Dieta del granjero: &eRank {0} -Herbalism.Ability.GTe.Length=Duraci\u00f3n de Tierra Verde: &e{0}seg +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: &e{0} -Herbalism.Ability.GTh.Fail=**PULGAR VERDE FALL\u00d3** +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} @@ -120,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=&aLa suerte de Hyrule esta contigo hoy! Herbalism.Listener=Herbalismo: Herbalism.SkillName=HERBALISMO Herbalism.Skills.GTe.On=&a**TIERRA VERDE ACTIVADO** -Herbalism.Skills.GTe.Refresh=&a\u00a1Tu habilidad &eTierra Verde &aest\u00e1 refrescada! +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\u00a1{0}&2 us\u00f3 &cTierra Verde! +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: &e{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=&7**BAJASTE TU PICO** Mining.Ability.Ready=&a**PREPARAS TU PICO** -Mining.SubSkill.SuperBreaker.Name=S\u00faper Destructor (HABILIDAD) +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: &e{0} +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\u00eda: -Mining.SkillName=MINER\u00cdA -Mining.Skills.SuperBreaker.Off=**S\u00faper Destructor ha expirado** -Mining.Skills.SuperBreaker.On=&a**S\u00daPER DESTRUCTOR ACTIVADO** -Mining.Skills.SuperBreaker.Other.Off=S\u00faper Destructor&a le ha expirado a &e{0} -Mining.Skills.SuperBreaker.Other.On=&a\u00a1{0}&2 us\u00f3 &cSuper Destructor! -Mining.Skills.SuperBreaker.Refresh=&a\u00a1Tu habilidad de &eS\u00faper Destructor &aest\u00e1 refrescada! -Mining.Skillup=Habilidad de Miner\u00eda incrementada en {0}. Total ({1}) +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: &e+{0} -Mining.Blast.Rank=Miner\u00eda Explosiva: &e Rango {0}/8 &7({1}) -Mining.Blast.Other.On=&a\u00a1{0}&2 us\u00f3 &cMiner\u00eda Explosiva! -Mining.Blast.Refresh=&a\u00a1Tu habilidad de &eMiner\u00eda Explosiva &aest\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 @@ -173,85 +173,85 @@ 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=&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\u00f3n, utiliza esto para arreglar herramientas y armaduras. -Repair.Listener=Reparaci\u00f3n: -Repair.SkillName=REPARACI\u00d3N +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\u00e1cil. -Repair.Skills.FullDurability=&7Esto est\u00e1 nuevo. +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\u00f1ados. -Repair.Skills.Mastery=Maestr\u00eda de la Reparaci\u00f3n: &e{0} de durabilidad adicional restaurada +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\u00f3n: &e{0} -Repair.Skillup=Habilidad de Reparaci\u00f3n incrementada en {0}. Total ({1}) +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=&7Probabilidad de Degradaci\u00f3n en FA: &e{0}% -Repair.Arcane.Chance.Success=&7Tasa de \u00c9xito de FA: &e{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=&aHas logrado mantener las energ\u00edas Arcanas de este objeto. +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\u00f3n del Sangrado: &e{0} ticks +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\u00a1El sangrado ha &aparado&7! +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\u00a1Alcanzado por un contra ataque! +Swords.Combat.Counter.Hit=&4¡Alcanzado por un contra ataque! Swords.Combat.Countered=&a**CONTRA-ATACADO** -Swords.Combat.SS.Struck=&4\u00a1Golpeado por ATAQUE DENTADO! +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=&a**ATAQUE DENTADO ACTIVADO** -Swords.Skills.SS.Refresh=&a\u00a1Tu habilidad de &eGolpe Dentado &afue refrescada! +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\u00a1{0}&2 us\u00f3 &cAtaque Dentado! +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: &e{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) @@ -262,48 +262,48 @@ 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=&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\u00e1pida +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=&8T\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=&aInvocaci\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: &e{0}seg -Unarmed.Ability.Bonus.0=Estilo del Pu\u00f1o de Hierro -Unarmed.Ability.Bonus.1=+{0} Mejora de DA\u00d1O +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=&aTu agarre de hierro te salvo de ser desarmado! -Unarmed.Ability.Lower=&7**BAJAS TUS PU\u00d1OS** +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 @@ -314,41 +314,41 @@ Unarmed.SkillName=DESARMADO Unarmed.Skills.Berserk.Off=**Enloquecido ha expirado** 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\u00a1{0}&2 us\u00f3 &cEnloquecido! -Unarmed.Skills.Berserk.Refresh=&a\u00a1T\u00fa habilidad &eEnloquecido &aest\u00e1 refrescada! +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: &e{0} -Woodcutting.Ability.Length=Duraci\u00f3n de Ca\u00edda de \u00c1rbol: &e{0}seg +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=&a**CA\u00cdDA DE \u00c1RBOL ACTIVADA** -Woodcutting.Skills.TreeFeller.Refresh=&a\u00a1Tu habilidad &eCa\u00edda de \u00c1rbol &aest\u00e1 refrescada! -Woodcutting.Skills.TreeFeller.Other.Off=Ca\u00edda de \u00c1rbol&a le ha expirado a &e{0} -Woodcutting.Skills.TreeFeller.Other.On=&a\u00a1{0}&2 us\u00f3 &cCa\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=&a**\u00a1HABILIDADES REFRESCADAS!** +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\u00f1o (&c{0}&3) +Combat.BeastLoreOwner=&3Dueño (&c{0}&3) Combat.Gore=&a**MORDISCO** Combat.StruckByGore=**FUISTE MORDISQUEADO** Combat.TargetDazed=El objetivo fue &4aturdido -Combat.TouchedFuzzy=&4Est\u00e1s confuso. Te sientes mareado. +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}. @@ -358,19 +358,19 @@ Commands.addxp.AwardAll=&aFuistes recompensado con {0} experiencia en todas las 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\u00f3lo para Admins &cdesactivado -Commands.AdminChat.On=Chat s\u00f3lo para Admins &aactivado +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= &c-Ver informaci\u00f3n detallada del jugador -Commands.Party.Invite.Accepted=&aInvitaci\u00f3n Aceptada. Te uniste al grupo {0} -Commands.Invite.Success=&aInvitaci\u00f3n enviada satisfactoriamente -Commands.Leaderboards= &c- Tabla de posiciones +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. @@ -396,7 +396,7 @@ Commands.mcconvert.Experience.Invalid=Tipo de formula desconocidaa Los tipos val Commands.mcconvert.Experience.Same=Ya esta usando el tipo de formula {0} 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\u00f3n breve del mod +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 &cdesactivadas Commands.Notifications.On=Notificaciones de habilidad &aactivadas @@ -409,11 +409,11 @@ 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\u00f3n al grupo -Commands.Party.Chat.Off=S\u00f3lo chat de grupo &cdesactivado -Commands.Party.Chat.On=S\u00f3lo chat de grupo &cactivado +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\u00d3N: &aFuiste invitado al grupo {0} por {1} +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} @@ -422,10 +422,10 @@ 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=\u00a1Fuiste expulsado del grupo {0}! +Commands.Party.Kick=¡Fuiste expulsado del grupo {0}! Commands.Party.Leave=Abandonaste el grupo Commands.Party.Members.Header=-----[]&aMIEMBROS&c[]----- -Commands.Party.None=No est\u00e1s en un grupo. +Commands.Party.None=No estás en un grupo. Commands.Party.Quit=- Abandona tu grupo actual Commands.Party.Teleport= &c- Teletransportarse al miembro del grupo Commands.Party.Toggle=- Alternar chat de grupo @@ -440,18 +440,18 @@ Commands.ptp.Request2=&aPara teletransportarse, teclea &e/ptp accept. &aLa petic 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: &9Nivel de Poder +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: &9{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} @@ -461,21 +461,21 @@ 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=&4Permisos insuficientes. -mcMMO.NoSkillNote=&8Si no tienes acceso a una habilidad no ser\u00e1 mostrada aqu\u00ed. +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&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\u00f1a, 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} @@ -484,21 +484,21 @@ Party.Help.10=Usa &3{0} &cpara activar la XP compartida con los miembros del gru 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\u00e1lido. +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.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\u00f1a. Escribala para poder entrar. -Party.Password.Incorrect=La contrase\u00f1a del grupo es incorrecta -Party.Password.Set=&aContrase\u00f1a del grupo establecida: &c{0} -Party.Password.Removed=&aLa contrase\u00f1a del grupo ha sido eliminada. -Party.Player.Invalid=Ese no es un jugador v\u00e1lido. +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=&4{0} no esta en un grupo @@ -507,11 +507,11 @@ 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=&aTe teletransportaste a {0}. Party.Teleport.Self=No puedes teletransportarte a ti mismo! -Party.Teleport.Target=&a{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=&7El grupo est\u00e1 desbloqueado +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) @@ -532,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 @@ -540,17 +540,17 @@ 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=&8OBTENCI\u00d3N DE EXPERIENCIA: &f{0} +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=&3El 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=&6\u00a1EL EVENTO DE EXP DE mcMMO HA COMENZADO! -Commands.xprate.started.1=&6\u00a1mcMMO est\u00e1 ahora en un evento de EXP! \u00a1El ratio de EXP es x{0}! -XPRate.Event=&6\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=&8NIVEL: &a{0} Effects.Level=&8Nivel: &a{0} &3EXP&e(&6{1}&e/&6{2}&e) @@ -562,41 +562,41 @@ 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 &e{0} -Inspect.Stats=&aEstad\u00edsticas de mcMMO para &e{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=&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\u00e9s que esperar para usar esto. &e({0}seg) +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\u00a1Has sido desarmado! +Skills.Disarmed=&4¡Has sido desarmado! Skills.Header=-----[]&a{0}&c[]----- -Skills.NeedMore=&4Necesitas m\u00e1s +Skills.NeedMore=&4Necesitas más Skills.Parents=PADRES Skills.Stats={0}&a{1}&3 EXP(&7{2}&3/&7{3}&3) -Skills.TooTired=Est\u00e1s demasiado cansado como para utilizar esa habilidad de nuevo. +Skills.TooTired=Estás demasiado cansado como para utilizar esa habilidad de nuevo. Skills.Cancelled={0} cancelado! 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\u00d3N=- +Stats.Header.Gathering=&6-=HABILIDADES DE RECOLECCIÓN=- Stats.Header.Misc=&6-=HABILIDADES VARIAS=- -Stats.Own.Stats=&a[mcMMO] Estad\u00edsticas +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.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\u00f3n rapida -Perks.Cooldowns.Desc=Acorta la duraci\u00f3n de tiempo de reutilizaci\u00f3n {0} +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.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} @@ -633,22 +633,22 @@ Smelting.SubSkill.FluxMining.Description=Probabilidad de que los minerales sean 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. diff --git a/src/main/resources/locale/locale_fi.properties b/src/main/resources/locale/locale_fi.properties index 61694f81e..fc5039a01 100644 --- a/src/main/resources/locale/locale_fi.properties +++ b/src/main/resources/locale/locale_fi.properties @@ -1,8 +1,8 @@ Acrobatics.Ability.Proc=&a**Sulava Laskeutuminen** -Acrobatics.Combat.Proc=&a**V\u00e4ist\u00f6liike** +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 @@ -17,29 +17,29 @@ 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=&a**Kallonhalkaisija AKTIVOITU** Axes.Skills.SS.Refresh=&aSinun&eKallonhalkaisu &ataito on latautunut! -Axes.Skills.SS.Other.On=&a{0}&2 on k\u00e4ytt\u00e4nyt &c Kallonhalkaisijaa! -Axes.Skillup=Akrobatian taito nousi {0} tasolla. Kokonaism\u00e4\u00e4r\u00e4 ({1}) +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\u00e4st\u00e4j\u00e4 +Excavation.SubSkill.TreasureHunter.Name=Aarteenmetsästäjä Excavation.Listener=Kaivuu: Excavation.SkillName=KAIVANTO Excavation.Skills.GigaDrillBreaker.On=&a**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.Skillup=Kaivuu taito nousi {0} tasolla. Kokonaismäärä ({1}) +Fishing.SubSkill.TreasureHunter.Name=Aarteenmetsästäjä (Passiivinen) Fishing.Listener=Kalastus: 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** +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** @@ -48,40 +48,40 @@ 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\u00c4\u00c4N HAKULLASI** +Mining.Ability.Ready=&a**VALMISTAUDUT ISKEMÄÄN HAKULLASI** Mining.Listener=Louhinta: Mining.SkillName=LOUHINTA 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\u00e4\u00e4r\u00e4 ({1}) +Mining.Skillup=Louhimistaito kasvoi {0} tasolla. Kokonaismäärä ({1}) Mining.Blast.Boom=&7**BOOM** -Mining.Blast.Radius.Increase=R\u00e4j\u00e4ytys Et\u00e4isyys Nousi: &e+{0} -Mining.Blast.Refresh=&aSinun &e R\u00e4j\u00e4ht\u00e4v\u00e4 Kaivuu &a-kyky on uudelleenlatautunut! +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=&4Olet 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=&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\u00e4. -Repair.Skills.FeltEasy=&7Seh\u00e4n tuntui helpolta. -Repair.Skills.StackedItems=&4Et voi korjata p\u00e4\u00e4llekk\u00e4isi\u00e4 tavaroita. -Repair.Skillup=Korjaustaito kasvoi {0} tasolla. Kokonaism\u00e4\u00e4r\u00e4 ({1}) +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\u00e4ipynyt esineest\u00e4 pysyv\u00e4sti. -Repair.Arcane.Lost=Et ollut tarpeeksi taitava pit\u00e4\u00e4ksesi lumouksia. +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\u00c4\u00c4N MIEKALLASI** +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** @@ -91,79 +91,79 @@ Swords.Effect.4=Sahalaitaiset Iskut Verenvuoto+ Swords.Listener=Miekkailu: 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\u00e4ytt\u00e4nyt &cSahalaita iskua! +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\u00e4ltt\u00e4v\u00e4t vaaraa +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=&8Sutesi 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.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\u00e4\u00e4n Pituus: &e{0}s -Unarmed.Ability.Bonus.0=Rautak\u00e4sityyli +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=&7**LASKET NYRKKISI ALAS** Unarmed.Listener=Aseeton: Unarmed.SkillName=ASEETON Unarmed.Skills.Berserk.Off=**Berserkki on deaktivoitunut** Unarmed.Skills.Berserk.On=&a**BERSERK AKTIVOITU** -Unarmed.Skills.Berserk.Other.Off=Sekop\u00e4\u00e4&a kului loppuun ajaksi &e{0} -Unarmed.Skills.Berserk.Other.On=&a{0}&2 on k\u00e4ytt\u00e4nyt &cberserkki\u00e4! +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.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=&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\u00e4ytt\u00e4nyt &cPuunkaatajaa! +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}) +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 &4tyrm\u00e4tty -Combat.TouchedFuzzy=&4T\u00f6kk\u00e4sit P\u00f6rr\u00f6\u00e4. Tunsit huimauksen. -Commands.AdminChat.Off=Ainoastaan Yll\u00e4pit\u00e4jien keskustelu &cpois 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=&aKutsu hyv\u00e4ksytty. Liityit ryhm\u00e4\u00e4n {0} -Commands.Invite.Success=&aKutsu l\u00e4hetettiin onnistuneesti. +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=&a--MUUT KOMENNOT-- -Commands.Party.Accept=- Hyv\u00e4ksy kutsu ryhm\u00e4\u00e4n -Commands.Party.Commands=&a--RYHM\u00c4KOMENNOT-- -Commands.Party.Invite.0=HUOMIO: &aSait 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.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=&8Jos 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=&4{0} is not in your party Party.Password.Set=&aParty password set to {0} @@ -172,13 +172,13 @@ Party.Teleport.Dead=Et voi teleportata kuolleeseen pelaajaan. 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.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! @@ -190,7 +190,7 @@ 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. &e({0}s) +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=&6-=TAISTELUTAIDOT=- diff --git a/src/main/resources/locale/locale_fr.properties b/src/main/resources/locale/locale_fr.properties index e05fe4200..c7df2078c 100644 --- a/src/main/resources/locale/locale_fr.properties +++ b/src/main/resources/locale/locale_fr.properties @@ -4,29 +4,29 @@ #LES COULEURS SONT DEFINI DANS advanced.yml SI VOUS VOULEZ LES CHANGER JSON.Rank=Grade JSON.DescriptionHeader=Description -JSON.JWrapper.Header=D\u00e9tails +JSON.JWrapper.Header=Détails JSON.Type.Passive=Passive JSON.Type.Active=Active -JSON.Type.SuperAbility=Super Abilit\u00e9 -JSON.Locked=-=[FERM\u00c9]=- +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\u00e9mentaire +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\u00eache +JSON.Fishing=Pêche JSON.Herbalism=Herbalisme JSON.Mining=Minage -JSON.Repair=R\u00e9paration -JSON.Salvage=R\u00e9cup\u00e9ration -JSON.Swords=\u00c9p\u00e9e +JSON.Repair=Réparation +JSON.Salvage=Récupération +JSON.Swords=Épée JSON.Taming=Apprivoisement JSON.Unarmed=Unarmed JSON.Woodcutting=Coupe de bois @@ -36,9 +36,9 @@ 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\u00e9bloqu\u00e9! ] +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\u00e9lioration au niveau {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 @@ -53,22 +53,22 @@ 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 \u00eates accroupi lorsque vous tombez, vous \u00e9viterez de prendre des d\u00e9g\u00e2ts ! -Anvil.SingleItemStack=&cVous ne pouvas pas r\u00e9cup\u00e9rer ou r\u00e9parer un item plus d\'un item \u00e0 la fois, d\u00e9stackez le d\'abord. +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\u00c9S RECHARG\u00c9!** +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\u00e9 +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) @@ -77,7 +77,7 @@ 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\u00e9visions &c[]=====[] +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] @@ -88,61 +88,61 @@ Overhaul.Name.Alchemy=Alchemie Overhaul.Name.Archery=Archerie Overhaul.Name.Axes=Haches Overhaul.Name.Excavation=Fouille -Overhaul.Name.Fishing=P\u00eache +Overhaul.Name.Fishing=Pêche Overhaul.Name.Herbalism=Herboristerie Overhaul.Name.Mining=Minage -Overhaul.Name.Repair=R\u00e9paration -Overhaul.Name.Salvage=R\u00e9cup\u00e9ration +Overhaul.Name.Repair=Réparation +Overhaul.Name.Salvage=Récupération Overhaul.Name.Smelting=Fonte -Overhaul.Name.Swords=\u00c9p\u00e9e +Overhaul.Name.Swords=Épée Overhaul.Name.Taming=Apprivoisement Overhaul.Name.Unarmed=Poings -Overhaul.Name.Woodcutting=B\u00fbcheronnage +Overhaul.Name.Woodcutting=Bûcheronnage # style pour les commandes /mcMMO Commands.mcc.Header=&c---[]&amcMMO Commandes&c[]--- -Commands.Other=&c---[]&aCOMMANDES SP\u00c9CIALES&c[]--- +Commands.Other=&c---[]&aCOMMANDES SPÉCIALES&c[]--- Commands.Party.Header=&c-----[]&aPARTIE&c[]----- -Commands.Party.Features.Header=&c-----[]&aFONCTIONNALIT\u00c9S&c[]----- -# XP BAR accepte les variables -- {0} Niveau de comp\u00e9tence, {1} XP actuelle, {2} XP n\u00e9cessaire pour le niveau suivant, {3} Niveau de puissance, {4} Pourcentage du niveau -# Soyez s\u00fbr d\'avoir activ\u00e9 Experience_Bars.ThisMayCauseLag.AlwaysUpdateTitlesWhenXPIsGained si vous voulez la barre d\'XP \u00e0 chaque fois que le joueur en gagne ! +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\u00e9tence ... +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\u00eache 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\u00e9paration Lv.&6{0} -XPBar.Salvage=R\u00e9cup\u00e9ration 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=\u00c9p\u00e9e 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\u00fbcheronnage Lv.&6{0} -# Ceci n\'est qu\'un exemple qui peut \u00eatre utilis\u00e9 quand l\'option 'ExtraDetails' dans experience.yml est activ\u00e9 (d\u00e9sactiv\u00e9 par d\u00e9faut), vous pouvez l\'ignor\u00e9 et juste modifier le message au dessus +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\u00e9tence, {1} XP actuelle, {2} XP n\u00e9cessaire pour le niveau suivant, {3} Niveau de puissance, {4} Pourcentage du niveau -# Soyez s\u00fbr d\'avoir activ\u00e9 Experience_Bars.ThisMayCauseLag.AlwaysUpdateTitlesWhenXPIsGained si vous voulez la barre d\'XP \u00e0 chaque fois que le joueur en gagne ! +# 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\u00e9** +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\u00e9 avec une partie passive.\nLorsque vous prenez des d\u00e9g\u00e2ts de ch\u00fbtes, vous avez une chance de ne rien prendre, en fonction de votre niveau de comp\u00e9tence. Au niveau 50, vous avez &e{0}%&7 de chance de ne pas prendre de d\u00e9g\u00e2ts, et &e{1}%&7 si vous activ\u00e9 la roulade gracieuse.\nLa chance pour la r\u00e9ussite est calcul\u00e9 gr\u00e2ce \u00e0 votre niveau de comp\u00e9tence, avec une courbe lin\u00e9aire jusqu\'au niveau &e{2}&7 son maximum. Tous les niveaux d\'acrobaties vous donnent &e{3}%&7 de chance de succ\u00e8s.\nEn s'accroupissant, vous pouvez doubler votre chance de ne pas prendre les d\u00e9g\u00e2ts de ch\u00fbte ! En sneakant, vous transformerez une roulade normal en une roulade gracieuse.\nUne roulade emp\u00eache jusqu\'\u00e0 &c{4}&7 d\u00e9g\u00e2ts. Une roulade gracieuse en emp\u00eache jusqu\'\u00e0 &a{5}&7. +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.Roll.Text=&o**Roulade** @@ -152,575 +152,575 @@ 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.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\u00e9dients [&e{0}&c]: &e{1} +Alchemy.SubSkill.Concoctions.Stat.Extra=Ingrédients [&e{0}&c]: &e{1} Alchemy.Listener=Alchemie: -Alchemy.Ability.Locked.0=Bloqu\u00e9 jusqu\'\u00e0 {0}+ niveaux de talent (CATALYSE) +Alchemy.Ability.Locked.0=Bloqué jusqu\'à {0}+ niveaux de talent (CATALYSE) Alchemy.SkillName=ALCHIMIE #ARCHERIE -Archery.SubSkill.SkillShot.Name=Tir pr\u00e9cis -Archery.SubSkill.SkillShot.Description=Augmente les d\u00e9g\u00e2ts inflig\u00e9s -Archery.SubSkill.SkillShot.Stat=Bonus de d\u00e9g\u00e2ts lors des tirs -Archery.SubSkill.Daze.Name=D\u00e9sorienter -Archery.SubSkill.Daze.Description=D\u00e9soriente les adversaires en leur faisant {0} dommages -Archery.SubSkill.Daze.Stat=Chance de d\u00e9soriente -Archery.SubSkill.ArrowRetrieval.Name=R\u00e9cup\u00e9ration de fl\u00e8che -Archery.SubSkill.ArrowRetrieval.Description=Probabilit\u00e9 de r\u00e9cup\u00e9rer des fl\u00e8ches sur les corps -Archery.SubSkill.ArrowRetrieval.Stat=Chance de r\u00e9cup\u00e9ration de fl\u00e8che -Archery.SubSkill.ArcheryLimitBreak.Name=Limitation de d\u00e9g\u00e2ts d\'archerie -Archery.SubSkill.ArcheryLimitBreak.Description=Casse les limites. Augmente les d\u00e9g\u00e2ts face aux ennemis. Pr\u00e9vu pour le PvP, il peut \u00eatre configur\u00e9 pour le PvE. -Archery.SubSkill.ArcheryLimitBreak.Stat=D\u00e9g\u00e2ts maximum +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 #HACHES -Axes.Ability.Bonus.0=Ma\u00eetrise des haches -Axes.Ability.Bonus.1={0} de d\u00e9g\u00e2ts en plus +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\u00e9g\u00e2ts \u00e0 l\'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.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\u00e7u un coup critique ! +Axes.Combat.CritStruck=&4Vous avez reçu un coup critique ! Axes.Combat.CriticalHit=COUP CRITIQUE ! -Axes.Combat.GI.Proc=&a**FRAPP\u00c9 D\'UNE VIOLENTE INOU\u00cfE** -Axes.Combat.GI.Struck=**TOUCH\u00c9 PAR UN IMPACT PUISSANT** -Axes.Combat.SS.Struck=&4Bloqu\u00e9 par TRANCHE-CR\u00c2NE ! -Axes.SubSkill.SkullSplitter.Name=Tranche-cr\u00e2ne (Comp\u00e9tence) -Axes.SubSkill.SkullSplitter.Description=Inflige des d\u00e9g\u00e2ts de zone -Axes.SubSkill.SkullSplitter.Stat=Dur\u00e9e du tranche-cr\u00e2ne +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.CriticalStrikes.Description=Dégâts doublés Axes.SubSkill.CriticalStrikes.Stat=Chance de coup critique -Axes.SubSkill.AxeMastery.Name=Ma\u00eetrise des haches -Axes.SubSkill.AxeMastery.Description=Ajoute des d\u00e9g\u00e2ts -Axes.SubSkill.AxesLimitBreak.Name=Limitation de d\u00e9g\u00e2ts de la hache -Axes.SubSkill.AxesLimitBreak.Description=Casse les limites. Augmente les d\u00e9g\u00e2ts face aux ennemis. Pr\u00e9vu pour le PvP, il peut \u00eatre configur\u00e9 pour le PvE. -Axes.SubSkill.AxesLimitBreak.Stat=D\u00e9g\u00e2ts maximum +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=&a**TRANCHE-CR\u00c2NE ACTIV\u00c9** -Axes.Skills.SS.Refresh=&aVotre comp\u00e9tence &eTranche-cr\u00e2ne &aest pr\u00eate ! -Axes.Skills.SS.Other.Off=Tranche-cr\u00e2ne&a s\'est termin\u00e9 pour &e{0} -Axes.Skills.SS.Other.On=&a{0}&2 a utilis\u00e9 &cTranche-cr\u00e2ne ! +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\u00e9tence) +Excavation.SubSkill.GigaDrillBreaker.Name=Foreur (Compétence) Excavation.SubSkill.GigaDrillBreaker.Description=Drops x3, XP x3, plus rapide -Excavation.SubSkill.GigaDrillBreaker.Stat=Dur\u00e9e du foreur -Excavation.SubSkill.Archaeology.Name=Arch\u00e9ologie -Excavation.SubSkill.Archaeology.Description=D\u00e9terrez les secrets du monde ! De haut niveaux de comp\u00e9tences augmente vos chances de trouvez de l\'exp\u00e9rience dans un tr\u00e9sor ! -Excavation.SubSkill.Archaeology.Stat=Chance d\'exp arch\u00e9ologique -Excavation.SubSkill.Archaeology.Stat.Extra=Quantit\u00e9 d\'exp\u00e9rience arch\u00e9ologique +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\u00e9tence Foreur est termin\u00e9e** -Excavation.Skills.GigaDrillBreaker.On=&a**FOREUR ACTIV\u00c9** -Excavation.Skills.GigaDrillBreaker.Refresh=&aVotre comp\u00e9tence &eForeur &aest pr\u00eate ! -Excavation.Skills.GigaDrillBreaker.Other.Off=Foreur&a est termin\u00e9 pour &e{0} -Excavation.Skills.GigaDrillBreaker.Other.On=&a{0}&2 a utilis\u00e9 &cForeur ! +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 \u00e0 p\u00e2che autre part, \u00e0 au moins {0} blocs de distance. +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 \u00e0 p\u00eache vous fatigue et use la canne ! +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\u00eache magique : &7 **S\'am\u00e9liore via Chasseur de tr\u00e9sors** +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.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.TreasureHunter.Stat=Grade de chasseur de tr\u00e9sor: &a{0}&3/&a{1} +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\u00eache magique +Fishing.SubSkill.MagicHunter.Name=Pêche magique Fishing.SubSkill.MagicHunter.Description=Remonte des objets magiques -Fishing.SubSkill.MagicHunter.Stat=Chance du chasseur de tr\u00e9sor +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.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\u00e9gime de fermier -Fishing.SubSkill.FishermansDiet.Description=Am\u00e9liore la nutrition des produits de la ferme -Fishing.SubSkill.FishermansDiet.Stat=R\u00e9gime de fermier:&a Grade {0} -Fishing.SubSkill.MasterAngler.Name=Ma\u00eetre P\u00eacheur -Fishing.SubSkill.MasterAngler.Description=Les poissons sont p\u00each\u00e9s plus fr\u00e9quemment, fonctionne mieux lorsque l\'on p\u00eache depuis un bateau. -Fishing.SubSkill.MasterAngler.Stat=R\u00e9duction minimum du temps de p\u00eache: &a-{0} secondes -Fishing.SubSkill.MasterAngler.Stat.Extra=R\u00e9duction maximum du temps de p\u00eache: &a-{0} secondes -Fishing.SubSkill.IceFishing.Name=P\u00eache sur Glace -Fishing.SubSkill.IceFishing.Description=Vous permet de p\u00eacher dans les biomes glac\u00e9s -Fishing.SubSkill.IceFishing.Stat=P\u00eache sur Glace +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\u00eache : +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\u00caCHE +Fishing.SkillName=PÊCHE #HERBORISTERIE -Herbalism.Ability.GTe.NeedMore=Vous avez besoin de plus de graines pour r\u00e9pandre la terre verte -Herbalism.Ability.GTh.Fail=**MAINS VERTES \u00c9CHOU\u00c9ES** +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 \u00c9CHOU\u00c9** -Herbalism.SubSkill.GreenTerra.Name=Main verte (Comp\u00e9tence) +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.GreenTerra.Stat=Dur\u00e9e de la main verte -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\u00e8s r\u00e9colte +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.Stat=R\u00e9gime de fermier: &aGrade {0} +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 Herbalism.SubSkill.HylianLuck.Stat=Chance d\'Hylian -Herbalism.SubSkill.ShroomThumb.Name=Doigts \u00e0 Champignons +Herbalism.SubSkill.ShroomThumb.Name=Doigts à Champignons Herbalism.SubSkill.ShroomThumb.Description=Etend le mycelium sur la terre et l\'herbe 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=&a**MAIN VERTE ACTIV\u00c9** -Herbalism.Skills.GTe.Refresh=&aVotre comp\u00e9tence &eMain verte &aest pr\u00eate ! -Herbalism.Skills.GTe.Other.Off=Main verte&a est termin\u00e9 pour &e{0} -Herbalism.Skills.GTe.Other.On=&a{0}&2 a utilis\u00e9 &cMain verte ! +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\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.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\u00e9tence) +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.SubSkill.DemolitionsExpertise.Stat=Baisse des d\u00e9g\u00e2ts de destruction +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=&a**BROYEUR ACTIV\u00c9** -Mining.Skills.SuperBreaker.Other.Off=Broyeur&a est termin\u00e9 pour &e{0} -Mining.Skills.SuperBreaker.Other.On=&a{0}&2 a utilis\u00e9 &cBroyeur ! -Mining.Skills.SuperBreaker.Refresh=&aVotre comp\u00e9tence &eBroyeur &aest pr\u00eate ! +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\u00e9colte des minerais, {1}x les r\u00e9compenses -Mining.Blast.Other.On=&a{0}&2 a utilis\u00e9 &cMinage explosif ! -Mining.Blast.Refresh=&aVotre capacit\u00e9 &eMinage Explosif&a est pr\u00eate ! -# R\u00c9PARATION -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 +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\u00e9paration -Repair.SubSkill.SuperRepair.Description=Double l\'efficacit\u00e9 +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\u00e9paration du diamant (talent {0}+) -Repair.SubSkill.DiamondRepair.Description=R\u00e9pare les outils et armures en diamant +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.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\u00e9 une erreur en essayant de r\u00e9parer cet objet ! -Repair.Listener.Anvil=&4Vous venez de poser une enclume, elle peut \u00eatre utilis\u00e9e pour r\u00e9parer votre \u00e9quipement. -Repair.Listener=R\u00e9paration : -Repair.SkillName=R\u00c9PARATION -Repair.Skills.AdeptDiamond=&4Vous n\'\u00eates pas suffisamment comp\u00e9tent pour r\u00e9parer le diamant. -Repair.Skills.AdeptGold=&4Vous n\'\u00eates pas suffisamment comp\u00e9tent pour r\u00e9parer l\'or. -Repair.Skills.AdeptIron=&4Vous n\'\u00eates pas suffisamment comp\u00e9tent pour r\u00e9parer le fer. -Repair.Skills.AdeptStone=&4Vous n\'\u00eates pas suffisamment comp\u00e9tent pour r\u00e9parer la pierre. -Repair.Skills.Adept=Vous devez avoir le niveau &e{0}&c pour pouvoir r\u00e9parer &e{1} -Repair.Skills.FeltEasy=&7Plut\u00f4t facile. -Repair.Skills.FullDurability=&7C\'est d\u00e9j\u00e0 r\u00e9par\u00e9. -Repair.Skills.StackedItems=&4Vous ne pouvez pas r\u00e9parer les objets empil\u00e9s. -Repair.Pretty.Name=R\u00e9paration +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 \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=&aVous avez pr\u00e9serv\u00e9 les \u00e9nergies arcaniques de cet objet. +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.UnderstandingTheArt.Name=Compr\u00e9hension de l\'art -Salvage.SubSkill.UnderstandingTheArt.Description=Vous n\'\u00eates pas juste en train de miner \u00e0 travers la poubelle de votre voisin, vous prenez soin de l\'environment.\nRenforce la r\u00e9cup\u00e9ration. +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\u00e9cup\u00e9ration de materiel depuis un item, une r\u00e9cup\u00e9ration parfaite en accord avec vos comp\u00e9tences et votre chance. -Salvage.SubSkill.ScrapCollector.Stat=Collection de fragment: &aR\u00e9cup\u00e9ration de &e{0}&a items. Un peu de chance y est impliqu\u00e9. +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\u00e9 -Salvage.Ability.Bonus.1=Rendement maximal {0} objet(s) d\u00e9truit(s) +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\u00e9 ! -Salvage.Skills.Adept.Damaged=&4Vous n\'\u00eates pas assez talentueux pour recycler des objets endommag\u00e9s. -Salvage.Skills.Adept.Level=Vous devez \u00eatre niveau &e{0}&c pour recycler &e{1} -Salvage.Skills.TooDamaged=&4C\'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=&aVous avez \u00e9t\u00e9 capable d\'extraire toute la connaissance contenue dans cet objet. -Salvage.Listener.Anvil=&4Vous avez plac\u00e9 une enclume de r\u00e9paration, utilisez-la pour recycler vos outils et vos armures. +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 -Salvage.Skills.Lottery.Normal=&6Vous \u00eates capable de r\u00e9cup\u00e9rer &3{0}&6 mat\u00e9riel de &e{1}&6. -Salvage.Skills.Lottery.Perfect=&a&lParfait !&r&6 Vous avez r\u00e9cup\u00e9r\u00e9 &3{1}&6 sans effort et retrouv\u00e9 &3{0}&6 mat\u00e9riel. -Salvage.Skills.Lottery.Untrained=&7Vous n\'\u00eates pas assez qualifi\u00e9 dans la r\u00e9cup\u00e9ration. Vous ne pouvez retrouver que &c{0}&7 mat\u00e9riel depuis &a{1}&7. -#Enclume (Partag\u00e9 entre RECYCLAGE et R\u00c9PARATION) +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 ! -#\u00c9P\u00c9E -Swords.Ability.Lower=&7**VOUS ABAISSEZ VOTRE \u00c9P\u00c9E** -Swords.Ability.Ready=&a**VOUS LEVEZ VOTRE \u00c9P\u00c9E** -Swords.Combat.Rupture.Note=&7NOTE: &e1 Tick correspond \u00e0 0.5 seconds! +#É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\u00eat\u00e9&7 ! +Swords.Combat.Bleeding.Stopped=&7Le saignement s\'est &aarrêté&7 ! Swords.Combat.Bleeding=&a**L\'ENNEMI SAIGNE** -Swords.Combat.Counter.Hit=&4Touch\u00e9 par une contre-attaque ! +Swords.Combat.Counter.Hit=&4Touché par une contre-attaque ! Swords.Combat.Countered=&a**CONTRE-ATTAQUE** -Swords.Combat.SS.Struck=&4Frapp\u00e9 par ATTAQUE D\u00c9CHIRANTE ! +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.CounterAttack.Stat=Chance de contre-attaque -Swords.SubSkill.SerratedStrikes.Name=Attaque D\u00e9chirante (Capacit\u00e9) +Swords.SubSkill.SerratedStrikes.Name=Attaque Déchirante (Capacité) Swords.SubSkill.SerratedStrikes.Description={0} DMG AoE, Saignement+ AoE -Swords.SubSkill.SerratedStrikes.Stat=Puissance de l\'attaque d\u00e9chirante -Swords.SubSkill.Rupture.Name=H\u00e9morragie -Swords.SubSkill.Rupture.Description=Un h\u00e9morragie puissant ! +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\u00e9g\u00e2ts \u00e0 vos attaques. -Swords.SubSkill.Stab.Stat=D\u00e9g\u00e2ts du poing supppl\u00e9mentaire -Swords.SubSkill.SwordsLimitBreak.Name=Limitation des d\u00e9g\u00e2ts de l\'\u00e9p\u00e9e -Swords.SubSkill.SwordsLimitBreak.Description=Casse les limites. Augmente les d\u00e9g\u00e2ts face aux ennemis. Pr\u00e9vu pour le PvP, il peut \u00eatre configur\u00e9 pour le PvE. -Swords.SubSkill.SwordsLimitBreak.Stat=D\u00e9g\u00e2ts maximum -Swords.SubSkill.Rupture.Stat=Chance d\'h\u00e9morragie -Swords.SubSkill.Rupture.Stat.Extra=H\u00e9morragie: &a{0} ticks [{1} DMG vs Joueur] [{2} DMG vs Monstre] -Swords.Effect.4=H\u00e9morragie d\'Attaque d\u00e9chirante +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.Listener=\u00c9p\u00e9es : -Swords.SkillName=\u00c9P\u00c9ES -Swords.Skills.SS.Off=**Votre comp\u00e9tence Attaque d\u00e9chirante est termin\u00e9e** -Swords.Skills.SS.On=&a**ATTAQUE D\u00c9CHIRANTE ACTIV\u00c9E** -Swords.Skills.SS.Refresh=&aVotre comp\u00e9tence &eAttaque d\u00e9chirante &aest pr\u00eate ! -Swords.Skills.SS.Other.Off=Attaque d\u00e9chirante&a s\'est termin\u00e9 pour &e{0} -Swords.Skills.SS.Other.On=&a{0}&2 a utilis\u00e9 &cAttaque d\u00e9chirante ! +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 \u00e0 l\'environnement -Taming.Ability.Bonus.1=Les loups \u00e9vitent les dangers -Taming.Ability.Bonus.2=Fourrure \u00e9paisse -Taming.Ability.Bonus.3=R\u00e9duction de d\u00e9g\u00e2t, r\u00e9sistance au feu -Taming.Ability.Bonus.4=R\u00e9sistance aux chocs -Taming.Ability.Bonus.5=Les explosifs font 1/{0} compar\u00e9 au dommage normal -Taming.Ability.Bonus.6=Griffes ac\u00e9r\u00e9es +Taming.Ability.Bonus.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.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\u00eates +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=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.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 \u00e9t\u00e9 repouss\u00e9 par les loups ! -Taming.Listener.Wolf=&8Votre loup se pr\u00e9cipite \u00e0 vos c\u00f4t\u00e9s... +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.Summon.COTW.Success.WithoutLifespan=&a(Appel de la nature) &7Vous avez invoqu\u00e9 un &6{0}&7 -Taming.Summon.COTW.Success.WithLifespan=&a(Appel de la nature) &7Vous avez invoqu\u00e9 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\u00e9s en m\u00eame temps. +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\u00e9 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\u00e9. +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.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.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\u00e9tence) -Unarmed.SubSkill.Berserk.Description=+50% de d\u00e9g\u00e2ts, casse les mat\u00e9riaux souples -Unarmed.SubSkill.Berserk.Stat=Dur\u00e9e du berserk -Unarmed.SubSkill.Disarm.Name=D\u00e9sarmement (sur joueurs) +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\u00e9sarmement -Unarmed.SubSkill.UnarmedLimitBreak.Name=Limitation des d\u00e9g\u00e2ts aux poings -Unarmed.SubSkill.UnarmedLimitBreak.Description=Casse les limites. Augmente les d\u00e9g\u00e2ts face aux ennemis. Pr\u00e9vu pour le PvP, il peut \u00eatre configur\u00e9 pour le PvE. -Unarmed.SubSkill.UnarmedLimitBreak.Stat=D\u00e9g\u00e2ts maximum +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.Stat=Chance de d\u00e9viation de fl\u00e8che +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=&a**BERSERK ACTIV\u0081\u00c9** -Unarmed.Skills.Berserk.Other.Off=Berserk&a s\'est termin\u00e9 pour &e{0} -Unarmed.Skills.Berserk.Other.On=&a{0}&2 a utilis\u00e9 &cFurie ! -Unarmed.Skills.Berserk.Refresh=&aVotre comp\u00e9tence &eBerserk &aest pr\u00eate ! -#B\u00dbCHERONNAGE +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.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\u00e9e de l\'abatteur +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\u00e9rience +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.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\u00e9riaux utiles lors de l\'abattage d\'arbre. +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\u00e9rience de la nature -Woodcutting.Listener=B\u00fbcheronnage : -Woodcutting.SkillName=B\u00dbCHERONNAGE -Woodcutting.Skills.TreeFeller.Off=**Votre comp\u00e9tence Abatteur est termin\u00e9e** -Woodcutting.Skills.TreeFeller.On=&a**ABATTEUR ACTIV\u00c9** -Woodcutting.Skills.TreeFeller.Refresh=&aVotre comp\u00e9tence &eAbatteur &aest pr\u00eate ! -Woodcutting.Skills.TreeFeller.Other.Off=Abatteur&a est termin\u00e9 pour &e{0} -Woodcutting.Skills.TreeFeller.Other.On=&a{0}&2 a utilis\u00e9 &cAbatteur ! +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! #ABILITIY #COMBAT -Combat.ArrowDeflect=&f**FL\u00c8CHE DEVI\u00c9E** -Combat.BeastLore=&a**CONNAISSANCE DES B\u00caTES** +Combat.ArrowDeflect=&f**FLÈCHE DEVIÉE** +Combat.BeastLore=&a**CONNAISSANCE DES BÊTES** Combat.BeastLoreHealth=&3Vie (&a{0}&3/{1}) -Combat.BeastLoreOwner=&3Propri\u00e9taire (&c{0}&3) +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\u00c9 JUSQU\'AU SANG** -Combat.TargetDazed=La cible a \u00e9t\u00e9 &4\u00c9tourdi -Combat.TouchedFuzzy=&4Vous voyez flou. Vous vous sentez \u00e9tourdi. +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\u00e0 propos du projet &emcMMO&3:,&6C'est un mod RPG &copen source&6 cr\u00e9\u00e9 en f\u00e9vrier 2011, &6par &9nossr50&6. Le but est de permettre l'exp\u00e9rience d\'un RPG de qualit\u00e9.,&3Conseils:,&6 - &aUtilisez &c/mcmmo help&a pour voir les commandes,&6 - &aFaites &c/skillname&a pour voir les d\u00e9tails d\'une comp\u00e9tence,&3D\u00e9veloppeurs:,&6 - &anossr50 &9(Cr\u00e9ateur & Leader du projet),&6 - &aelectronicboy &9(Dev),&6 - &akashike &9(Dev),&6 - &at00thpick1 &9(Mainteneur classique) +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 \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=&aVous avez re\u00e7u {0} niveau dans {1}! -Commands.addlevels.AwardSkill.2={0} a \u00e9t\u00e9 modifi\u00e9 pour {1}. -Commands.addxp.AwardAll=&aVous avez \u00e9t\u00e9 r\u00e9compens\u00e9 de {0} experiences dans chaque comp\u00e9tences! -Commands.addxp.AwardSkill=&aVous avez \u00e9t\u00e9 r\u00e9compens\u00e9 de {0} experiences dans {1} ! -Commands.Ability.Off=Utilisation des comp\u00e9tences &cOff -Commands.Ability.On=Utilisation des comp\u00e9tences &aOn -Commands.Ability.Toggle=L\'utilisation des capacit\u00e9s a \u00e9t\u00e9 modifi\u00e9e pour &e{0} +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\u00e9sactive le tchat admin +Commands.AdminToggle=&a- Active/désactive le tchat admin Commands.Chat.Console=*Console* -Commands.Cooldowns.Header=&6--= &aTemps d\'attente des capacit\u00e9s McMMO&6 =-- +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\u00eat ! +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.AdminChatSpy.Enabled=[mcMMO] Discussion priv\u00e9e SPY activ\u00e9 -Commands.AdminChatSpy.Disabled=[mcMMO] Discussion priv\u00e9e SPY d\u00e9sactiv\u00e9 -Commands.AdminChatSpy.Toggle=[mcMMO] Discussion bascul\u00e9 pour &e{0} +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 &e{0} -Commands.Healthbars.Changed.HEARTS=[mcMMO] Le type d\'affichage de la barre de vie a \u00e9t\u00e9 chang\u00e9 en &cC\u0153urs&f. -Commands.Healthbars.Changed.BAR=[mcMMO] Le type d\'affichage de la barre de vie a \u00e9t\u00e9 chang\u00e9 en &eBo\u00eetes&f. -Commands.Healthbars.Changed.DISABLED=[mcMMO] La barre de vie des entit\u00e9s a \u00e9t\u00e9 &7d\u00e9sactiv\u00e9e&f. +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= &a- Voir les infos d\u00e9taill\u00e9es sur le joueur -Commands.Invite.Success=&aInvitation envoy\u00e9e. +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\u00e9sactive le \"Mode Dieu\" +Commands.mcgod=&a- Active/Désactive le \"Mode Dieu\" Commands.mchud.Invalid=Ce n\'est pas un type valide d\'HUD. -Commands.mcpurge.Success=&aLa base de donn\u00e9es a \u00e9t\u00e9 purg\u00e9e avec succ\u00e8s ! +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\u00e9 -Commands.mcrefresh.Success=Le temps d\'attente de {0} a \u00e9t\u00e9 refra\u00eechi. -Commands.mcremove.Success=&a{0} a \u00e9t\u00e9 enlev\u00e9(e) de la base de donn\u00e9es avec succ\u00e8s ! -Commands.mctop.Tip=&6Astuce : Utilisez &c/mcrank&6 pour voir vos positions dans les diff\u00e9rents classements ! -Commands.mmoedit=[joueur] &a - Modifie la cible -Commands.mmoedit.AllSkills.1=&aLe niveau de tous vos talents a \u00e9t\u00e9 mis \u00e0 {0} ! -Commands.mmoedit.Modified.1=&aVotre 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=&7Commencement de la conversion de {0} \u00e0 {1}... -Commands.mcconvert.Database.Finish=&7La 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 &a{0} +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\u00e9j\u00e0 une formule type {0} -Commands.mcconvert.Experience.Start=&7Commencement de la conversion de {0} \u00e0 {1}... -Commands.mcconvert.Experience.Finish=&7Changement de formule appliqu\u00e9; utilisation d\u00e9sormais de {0} pour la courbe d\'EXP. -Commands.ModDescription=&a- 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 &cd\u00e9sactiv\u00e9es -Commands.Notifications.On=Les notifications des capacit\u00e9s ont \u00e9t\u00e9 &aactiv\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.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\u00e9s D\u00e9bloqu\u00e9es: &7&o{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\u00d4T\u00c9 DE VOUS &3{0}&8/&3{1} +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\u00e9sactiv\u00e9 -Commands.Party.Chat.On=Canal guilde &cactiv\u00e9 +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\u00e7u une invitation de {1} pour rejoindre la guilde {0} +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\u00e9e. Vous avez rejoint la guilde {0} +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 \u00e0 rejoindre &a{1}&c parce qu\'il y a d\u00e9j\u00e0 &3{2}&c joueurs dedans ! -Commands.Party.PartyFull.InviteAccept=Vous ne pouvez pas rejoindre &a{0}&c parce qu\'il y a d\u00e9j\u00e0 &3{1}&c joueurs dedans ! -Commands.Party.Create=&7Groupe Cr\u00e9\u00e9: {0} -Commands.Party.Rename=&7Le nom de la guilde a \u00e9t\u00e9 chang\u00e9 en : &f{0} -Commands.Party.SetSharing=&7Le partage des {0} de la guilde a \u00e9t\u00e9 mis \u00e0: &3{1} -Commands.Party.ToggleShareCategory=&7Le partage d\'objets de guilde &6{0} &7a \u00e9t\u00e9 &3{1} -Commands.Party.AlreadyExists=&4La 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.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\'\u00eates pas dans une guilde. -Commands.Party.Quit=&a- Quitter votre pr\u00e9sente guilde -Commands.Party.Teleport=&a- Vous t\u00e9l\u00e9porte \u00e0 un membre de la guilde -Commands.Party.Toggle=&a- Active/d\u00e9sactive le tchat de guilde -Commands.Party1=&a- Cr\u00e9er une nouvelle guilde +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\u00c9 AVEC : &f{1} +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\u00e7u une invitation d\'alliance de guilde de {1} pour {0} +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\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 &3/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 &3/party alliance invite &c. -Commands.ptp.Enabled=T\u00e9l\u00e9portation de guilde &aactiv\u00e9e -Commands.ptp.Disabled=T\u00e9l\u00e9portation de guilde &cd\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} &a vous a envoy\u00e9 une requ\u00eate de t\u00e9l\u00e9portation vers vous. -Commands.ptp.Request2=&apour vous t\u00e9l\u00e9porter, tapez &e/ptp accept&a. La requ\u00eate expire dans &c{0} &asecondes. -Commands.ptp.AcceptAny.Enabled=Confirmation de la demande de t\u00e9l\u00e9portation de guilde &aactiv\u00e9e -Commands.ptp.AcceptAny.Disabled=Confirmation de la demande de t\u00e9l\u00e9portation du guilde &cd\u00e9sactiv\u00e9e -Commands.ptp.RequestExpired=La requ\u00eate de t\u00e9l\u00e9portation de guilde a expir\u00e9! +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\u00e9tences ont \u00e9t\u00e9 remises \u00e0 zero. -Commands.Reset.Single=&aTa comp\u00e9tence {0} a \u00e9t\u00e9 remise \u00e0 zero. -Commands.Reset=&a- Remise \u00e0 0 d\'un talent -Commands.Scoreboard.Clear=&3Le tableau des scores McMMO a \u00e9t\u00e9 enlev\u00e9. +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=&3Le tableau des scores McMMO restera affich\u00e9 tant que vous n\'utiliserez pas &a/mcscoreboard clear&3. -Commands.Scoreboard.Timer=&3Le tableau des scores mcMMO sera enlev\u00e9 dans &6{0}&3 secondes \u00e0 compter de maintenant. +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\u00e8ve le tableau des scores McMMO -Commands.Scoreboard.Help.2=&3/mcscoreboard&b keep &f - Garde le tableau des scores affich\u00e9 -Commands.Scoreboard.Help.3=&3/mcscoreboard&b time [n] &f - enl\u00e8ve le tableau des scores McMMO apr\u00e8s &dn&f secondes -Commands.Scoreboard.Tip.Keep=&6Astuce : Utilisez &c/mcscoreboard keep&6 quand le tableau des scores est affich\u00e9 pour l\'emp\u00eacher de s\'en aller. -Commands.Scoreboard.Tip.Clear=&6Astuce : Utilisez &c/mcscoreboard clear&6 pour de d\u00e9barrasser du tableau des scores. -Commands.XPBar.Reset=&6Configuration de XP Bar mcMMO r\u00e9initialis\u00e9. -Commands.XPBar.SettingChanged=&6Configuration de XP Bar pour &a{0}&6 est d\u00e9sormais \u00e0 &a{1} +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 (&9{0}&e)-- -Commands.SkillInfo=&a- Voir des informations d\u00e9taill\u00e9es \u00e0 propos d\'un talent +Commands.SkillInfo=&a- Voir des informations détaillées à propos d\'un talent Commands.Stats.Self=VOS STATISTIQUES Commands.Stats=&a- Voir vos statistiques McMMO -Commands.ToggleAbility=&a- Active/D\u00e9sactive la possibilit\u00e9 d\'activation d\'une capacit\u00e9 avec un clic droit +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 \u00e0 la fin pour effectuer une commande sans en informer le joueur) +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 @@ -729,97 +729,97 @@ 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.SubSkill=Sous-Comp\u00e9tence +Commands.Usage.Skill=Compétence +Commands.Usage.SubSkill=Sous-Compétence Commands.Usage.XP=exp -Commands.Description.mmoinfo=Lisez les d\u00e9tails \u00e0 propos des comp\u00e9tences ou des m\u00e9caniques. -Commands.MmoInfo.Mystery=&7Vous n'avez pas encore d\u00e9bloqu\u00e9 cette comp\u00e9tence, mais lorsque se sera le cas, vous pourrez lire ses d\u00e9tails ! -Commands.MmoInfo.NoMatch=Cette sous-comp\u00e9tence n'existe pas ! +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\u00e9tails &3[]=====[]=- -Commands.MmoInfo.OldSkill=&7Comp\u00e9tence mcMMO ont \u00e9t\u00e9 converti en un système modul\u00e9 de comp\u00e9tence, malheureusement celle-ci n'a pas encore \u00e9t\u00e9 converti et manque de d\u00e9tails. Le nouveau système permettra de plus facilement mettre \u00e0 jour les comp\u00e9tences mcMMO avec plus de flexibilit\u00e9 pour les comp\u00e9tences existantes. +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\u00e9sormais &6{0}&7, utilisez cette commande pour le modifier. Avec le mode de d\u00e9bug activ\u00e9, vous pouvez taper les blocs pour obtenir des informations utilis\u00e9 pour le support. -mcMMO.NoInvites=Vous n\'avez pas \u00e9t\u00e9 invit\u00e9 +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\u00e9tence, il n\'appara\u00eetra pas ici. +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 &3{0} [mot de passe]. -Party.Help.1=pour cr\u00e9er une guilde, utilisez &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\u00e9bloquer votre groupe, utilisez &3{0} -Party.Help.5=Pour prot\u00e9ger votre guilde avec un mot de passe, utilisez &3{0} +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\u00e9faire le 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\u00e9 votre groupe -Party.InformedOnNameChange=&6{0} &aa modifi\u00e9 le nom du groupe en &f{1} +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\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.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\'\u00eates pas le chef de cette 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\'\u00eates d\u00e9sormais plus le chef de la guilde. -Party.Owner.Player=&aVous \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.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=&aMot de passe de la guilde r\u00e9gl\u00e9 \u00e0 {0} -Party.Password.Removed=&aLe 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=&4{0} n\'est pas connect\u00e9 ! -Party.Player.InSameParty={0} est d\u00e9j\u00e0 dans votre guilde ! +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\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=&aVous 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=&a{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=&7Le groupe est d\u00e9verrouill\u00e9. -Party.Disband=&7La guilde a \u00e9t\u00e9 dissoute -Party.Alliance.Formed=&7Votre groupe est d\u00e9sormais alli\u00e9 avec &a{0} -Party.Alliance.Disband=&7Votre groupe n\'est d\u00e9sormais plus alli\u00e9 avec &c{0} +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 \u00e9t\u00e9 augment\u00e9 de {0}. Total ({1}) +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 @@ -827,168 +827,168 @@ 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=&8Gain d\'exp\u00e9rience: &f{0} -Commands.xplock.locked=&6Votre barre d\'XP est maintenant verrouill\u00e9e sur {0} ! -Commands.xplock.unlocked=&6Votre barre d\'XP est maintenant &aD\u00c9VERROUILL\u00c9E&6 !! -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.NegativeNumberWarn=N'utilisez pas des nombres n\u00e9gatifs ! -Commands.Event.Start=&amcMMO&6 \u00e9vènement ! -Commands.Event.Stop=&amcMMO&3 \u00e9vènement termin\u00e9 ! +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\u00e9sormais &6{0}&3x -Commands.xprate.started.0=&6L\u2019\u00c9V\u00c9NEMENT BONUS D\'XP mcMMO VIENT DE COMMENCER ! +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\u00e9 le ratio d\'XP global \u00e0 &6{0}x -Notifications.Admin.XPRate.End.Self=&7Vous avez arr\u00eat\u00e9 l'\u00e9vènement de ratio d\'XP. -Notifications.Admin.XPRate.End.Others={0} &7a arr\u00eat\u00e9 l'\u00e9vènement de ratio d\'XP. -Notifications.Admin.XPRate.Start.Others={0} &7a commenc\u00e9 ou modifi\u00e9 un \u00e9vènement de ratio d\'XP global, qui est d\u00e9sormais de {1}x +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 \u00e9v\u00e9nement bonus d\'Exp\u00e9rience est actuellement lanc\u00e9 ! Le bonus est de {0}x ! +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 - \u00e9crivez /{1} ? [page] +Guides.Available=&7Guide pour le/la {0} est disponible - écrivez /{1} ? [page] Guides.Header=&6-=&a{0} Guide&6=- -Guides.Page.Invalid=Le num\u00e9ro de page est invalide +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] ##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\u00e9sistance aux d\u00e9g\u00e2ts physiques.\n&3GAIN D\'XP:\n&ePour gagner de l\'exp\u00e9rience, vous devez esquiver des d\u00e9g\u00e2ts\n&een combat ou encaisser des d\u00e9g\u00e2ts de chute. -Guides.Acrobatics.Section.1=&3Comment fonctionne la Roulade?\n&eVous avez une chance, lorsque vous prenez des d\u00e9g\u00e2ts dus \u00e0 une chute,\n&ed\'esquiver ces d\u00e9g\u00e2ts. Maintenez la touche pour s\'accroupir\n&epour doubler les chances d\'esquiver ces d\u00e9g\u00e2ts.\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\'\u00e9chapper aux d\u00e9g\u00e2ts.\n&eVotre pourcentage de chance de Roulade d\u00e9pend du niveau de votre Comp\u00e9tence. -Guides.Acrobatics.Section.2=&3Comment fonctionne l\'esquive?\n&eL\'esquive est une capacit\u00e9 passive qui peut vous permettre de\n&ediminuer les d\u00e9g\u00e2ts de moiti\u00e9 lorsque vous \u00eates bless\u00e9 au combat.\n&eLes chances d\'esquiver sont fonction de votre niveau de comp\u00e9tence. +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\u00e9parer des potions.\n&eDonne des bonus de vitesse \u00e0 la pr\u00e9paration des potions mais aussi\n&el\'ajout de nouvelles potions (pr\u00e9c\u00e8demment) incraftables.\n&3GAIN D\'XP:\n&ePour gagner de l\'exp\u00e9rience vous devez pr\u00e9parer des potions. -Guides.Alchemy.Section.1=&3Comment fonctionne Catalyse?\n&eCatalyse acc\u00e8lere le processus de pr\u00e9paration des potions,\n&ejusqu\'\u00e0 4x plus vite au niveau 1000.\n&ePar d\u00e9faut, cette capacit\u00e9 est d\u00e9bloqu\u00e9e au niveau 100. -Guides.Alchemy.Section.2=&3Comment fonctionne Concoction?\n&eConcoction vous permet de pr\u00e9parer plus de potions \u00e0 l\'aide &ed\'ingr\u00e9dients sp\u00e9ciaux..\n&eLes ingr\u00e9dients que vous pouvez utiliser sont d\u00e9termin\u00e9s\n&epar votre rang. Il y a 8 rangs \u00e0 d\u00e9bloquer. -Guides.Alchemy.Section.3=&3Ingr\u00e9dients pour la confections de niveau 4 :\n&ePoudre d\'Incendiaire, \u0152il Ferment\u00e9 d\u2019Araign\u00e9e, Larme de Ghast, Redstone,\n&ePoudre de Pierre Lumineuse, Sucre, Melon Scintillant, Carotte Dor\u00e9e,\n&eCr\u00e8me de Magma, Verrue du Nether, \u0152il d\'Araign\u00e9e, Poudre \u00e0 Canon, N\u00e9nuphar,\n&ePoisson-Globe\n&e(Potions de Minecraft Vanilla) -Guides.Alchemy.Section.4=&3Ingr\u00e9dients pour la confections de niveau 2 :\n&eCarotte (Potion de H\u00e2te)\n&eBoule de Slime (Potion de Lassitude)\n&3Ingr\u00e9dients pour la confections de niveau 3 :\n&eQuartz (Potion d\'Absorption)\n&eChampignon Rouge (Potion de Saut Boost\u00e9) -Guides.Alchemy.Section.5=&3Ingr\u00e9dients pour la confections de niveau 4 :\n&ePomme (Potion de Boost de Vie)\n&eViande Putr\u00e9fi\u00e9e (Potion de Faim)\n&3Ingr\u00e9dients pour la confections de niveau 5 :\n&eChampignon Brun (Potion de Naus\u00e9e)\n&ePoche d\'Encre (Potion d\'Aveuglement) -Guides.Alchemy.Section.6=&3Ingr\u00e9dients pour la confections de niveau 6 :\n&eHerbes Hautes (Potion de Saturation)\n&3Ingr\u00e9dients pour la confections de niveau 7 :\n&ePatate Empoisonn\u00e9e (Potion de Wither)\n&3Ingr\u00e9dients pour la confections de niveau 8 :\n&ePomme d\'or normale (Potion de R\u00e9sistance) +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 \u00e0 l\'arc.\n&eCette comp\u00e9tence fournit divers bonus de combat, par exemple une\n&eaugmentation des d\u00e9g\u00e2ts proportionelle \u00e0 votre niveau, la capacit\u00e9\n&ede rendre confus d\'autres joueurs en PvP,etc. En plus de cela, vous\n&epouvez aussi r\u00e9cup\u00e9rer quelques fl\u00e8ches des corps de vos ennemis.\n&3GAIN D\'XP:\n&ePour gagner de l\'exp\u00e9rience dans cette discipline vous devez infliger\n&edes d\u00e9g\u00e2ts \u00e0 l\'aide de vos fl\u00e8ches. -Guides.Archery.Section.1=&3Comment fonctionne tir pr\u00e9cis?\n&eTir pr\u00e9cis augmente les d\u00e9g\u00e2ts de vos tirs.\n&eL\'augmentation des d\u00e9g\u00e2ts est fonction de\n&evotre niveau en tir \u00e0 l\'arc..\n&ePar d\u00e9faut, vos d\u00e9g\u00e2ts augmentent de 10% tous les\n&e50 niveaux, jusqu\'\u00e0 un maximum de 200% de bonus. -Guides.Archery.Section.2=&3Comment fonctionne d\u00e9sorienter?\n&eVous avez une chance de d\u00e9sorienter votre cible lorsque vous lui\n&etirez dessus. Sous l\'effet de d\u00e9sorienter, votre cible regarde droit\n&evers le ciel pendant une courte dur\u00e9e.\n&eUn tir qui d\u00e9soriente inflige 4 d\u00e9g\u00e2ts suppl\u00e9mentaires (2 coeurs). -Guides.Archery.Section.3=&3Comment fonctionne la r\u00e9cup\u00e9ration de fl\u00e8ches?\n&eVous avez une chance de r\u00e9cup\u00e9rer certaines de vos fl\u00e8ches\n&elorsque vous tuez un mob \u00e0 l\'arc.\n&eCette chance augmente avec votre niveau en Tir \u00e0 l\'arc.\n&eCette capacit\u00e9 augmente de 0.1% par niveau, jusqu\'\u00e0 100%\n&eau niveau 1000. +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\u00e9tence Hache vous pouvez utiliser votre Hache pour bien plus\n&eque de la d\u00e9forestation! Vous pourrez d\u00e9couper des mobs et des joueurs\n&epour gagner de l\'exp\u00e9rience, 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 \u00e0 mesure que votre niveau\n&eaugmente.\n&3Gain d\'exp\u00e9rience:\n&ePour gagner de l\'exp\u00e9rience, il vous faut attaquer un joueur ou un mob\n&eavec une Hache. -Guides.Axes.Section.1=&3Comment fonctionne le Pourfendeur de Cr\u00e2nes?\n&eCette capacit\u00e9 vous permet d\'infliger des d\u00e9g\u00e2ts de zone.\n&eCe d\u00e9g\u00e2t de zone infligera la moiti\u00e9 de ce que vous avez inflig\u00e9 \u00e0 votre\n&ecible principale et s\'av\u00e8re donc utile pour s\'attaquer \u00e0 des hordes de mobs. -Guides.Axes.Section.2=&3Comment fonctionne le Coup Critique?\n&eLe Coup Critique est une capacit\u00e9 automatique qui donne une chance\n&ed\'infliger des d\u00e9g\u00e2ts suppl\u00e9mentaires.\n&ePar d\u00e9faut, par pallier de 2 niveaux dans la Comp\u00e9tence Hache, vous gagnez\n&e0.1% de chance de porter le Coup Critique, causant 2 fois plus de d\u00e9g\u00e2ts aux mobs\n&eou 1.5 fois de d\u00e9g\u00e2ts aux joueurs. -Guides.Axes.Section.3=&3Comment fonctionne la Ma\u00eetrise de la Hache?\n&e la Ma\u00eetrise de la Hache est une capacit\u00e9 automatique qui permet d\'infliger plus de d\u00e9g\u00e2ts\n&e\u00e0 vos cibles en utilisant une Hache.\n&ePar d\u00e9faut, ce bonus augmente vos d\u00e9g\u00e2t inflig\u00e9s 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\u00e9 a une chance passive de d\u00e9t\u00e9riorer l\'armure de votre ennemi.\n&e de votre ennemi. Ces d\u00e9g\u00e2ts augmentent avec votre niveau de la Comp\u00e9tence Haches. -Guides.Axes.Section.5=&3Comment fonctionne l\'Impact Am\u00e9lior\u00e9?\n&eVous avez une chance, automatique, pour obtenir un impact plus important\n&elorsque vous attaquez avec votre hache.\n&ePar d\u00e9faut cette chance est de 25%. Cette capacit\u00e9 a\n&eun effet de recul consid\u00e9rable, similaire \u00e0 l\u2019enchantement Frappe II.\n&eEn plus, les d\u00e9g\u00e2ts sont augment\u00e9s avec cette capacit\u00e9. +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\u00e9sors.\n&eEn excavant le monde, vous trouverez des tr\u00e9sors.\n&ePlus vous effectuerez ceci, plus vous pourrez trouver de tr\u00e9sors.\n&3Gain d\'exp\u00e9rience:\n&ePour gagner de l\'exp\u00e9rience dans cette comp\u00e9tence vous devez creuser avec une pelle en main.\n&eSeulement certains mat\u00e9riaux peuvent \u00eatre creus\u00e9s pour des tr\u00e9sors et de l\'exp\u00e9rience. -Guides.Excavation.Section.1=&3Mat\u00e9riaux compatibles:\n&eHerbe, Terre, Sable, Argile, Gravier, Mycelium, Sable des \u00e2mes -Guides.Excavation.Section.2=&3Comment utiliser le Giga Broyeur:\n&eAvec une pioche dans votre main, faites clic droit pour pr\u00e9parer votre outil.\n&eUne fois cela fait, vous avez jusqu\'\u00e0 4 secondes pour commencer \u00e0 miner\n&edes mat\u00e9riaux compatibles, ce qui activera le Broyeur. -Guides.Excavation.Section.3=&3Comment fonctionne Foreur?\n&eForeur est une capacit\u00e9 avec temps de recharge, li\u00e9e\n&e\u00e0 votre comp\u00e9tence d\'excavation. Cela triple les chances\n&ede trouver des tr\u00e9sors et d\u00e9truis instantan\u00e9ment les\n&eblocs excavables. -Guides.Excavation.Section.4=&3Comment fonctionne Chasseur de Tr\u00e9sors?\n&eLes tr\u00e9sors r\u00e9cup\u00e9rables requi\u00e8rent d\'avoir un certain niveau\n&een excavation pour avoir une chance de les faire tomber, en &econs\u00e9quence de quoi il est difficile d\'estimer son utilit\u00e9.\n&eMais gardez \u00e0 l\'esprit que plus votre niveau est \u00e9lev\u00e9,\n&eplus vous pourrez trouver de tr\u00e9sors diff\u00e9rents.\n&eRappelez vous aussi que chaque type de bloc excavable\n&econtient sa propre liste de tr\u00e9sors uniques.\n&eEn d\'autres termes, vous trouverez des tr\u00e9sors diff\u00e9rents en creusant\n&edu sable plut\u00f4t que du gravier (par exemple). -Guides.Excavation.Section.5=&3Notes sur l\'Excavation:\n&eLes loots de l\'excavation sont enti\u00e8rement modifiables\n&edonc les r\u00e9sultats varient selon les serveurs. +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\u00eache:\n&eLa Comp\u00e9tence P\u00eache rend la P\u00eache int\u00e9ressante!\n&eTrouvez des tr\u00e9sors cach\u00e9s, et d\u00e9robez des objets aux mobs!\n&3Gain d\'Exp\u00e9rience:\n&eP\u00eachez des poissons! -Guides.Fishing.Section.1=&3Comment fonctionne le Chasseur de Tr\u00e9sors?\n&eCette capacit\u00e9 vous permet de trouver des tr\u00e9sors en p\u00eachant\n&eavec une petite chance de trouver des objets enchant\u00e9s.\n&eTous les tr\u00e9sors possibles sont trouvables \u00e0 n\'importe\n&equel niveau de la Comp\u00e9tence P\u00eache. Trouver un objet\n&ed\u00e9pend n\u00e9anmoins de la raret\u00e9 de ce dernier.\n&ePlus votre Comp\u00e9tence P\u00eache est \u00e9lev\u00e9e, plus\n&evous aurez de chances de trouver de meilleurs tr\u00e9sors! -Guides.Fishing.Section.2=&3Comment fonctionne la P\u00eache sur Glace?\n&eCette capacit\u00e9 passive vous permet de p\u00eacher sur des lacs gel\u00e9s!\n&eLancez votre cane \u00e0 p\u00eache dans un lac gel\u00e9 et cette capacit\u00e9\n&ecr\u00e9era un trou dans la glace pour p\u00eacher. -Guides.Fishing.Section.3=&3Comment fonctionne Ma\u00eetre P\u00eacheur?\n&eCette capacit\u00e9 passive augmente la chance d\'une touche sur votre ligne de p\u00eache.\n&eLorsque vous avez d\u00e9bloqu\u00e9 cette capacit\u00e9, en p\u00eachant dans un bateau\n&eou lorsque vous \u00eates dans un biome oc\u00e9an, la chance d\'une touche est doubl\u00e9e. -Guides.Fishing.Section.4=&3Comment fonctionne la Secousse?\n&eCette capacit\u00e9 active vous permet de r\u00e9cup\u00e9rer des objets sur les mobs\n&een les crochetant avec une cane \u00e0 p\u00eache.\n&eLes mobs feront alors tomber au sol ce qu\'ils laisseraient normalement \u00e0 leur mort.\n&eIl est aussi possible de r\u00e9cup\u00e9rer des cr\u00e2nes de mobs, qui sont normalement\n&enon r\u00e9cup\u00e9rables. -Guides.Fishing.Section.5=&3Comment fonctionne le Repas du P\u00eacheur?\n&eCette capacit\u00e9 passive vous permet d\'augmenter la vie r\u00e9cup\u00e9r\u00e9e\n&een mangeant du poisson. -Guides.Fishing.Section.6=&3Notes sur la P\u00eache:\n&eLes loots de la P\u00eache sont enti\u00e8rement modifiables\n&edonc les r\u00e9sultats varient selon les serveurs. +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\u00e9colte de plantes et d\'herbes.\n&3GAIN D\'XP:\n&eR\u00e9colte de plantes et d\'herbes. -Guides.Herbalism.Section.1=&3Blocs compatibles\n&eBl\u00e9, Potatoes, Carrotes, Melons, \n&eCitrouilles, Canne \u00e0 sucre, F\u00e8ves de Cacao, Fleurs, Cactus, Champignons,\n&eVerrues du Nether, N\u00e9nuphars, et Lianes. -Guides.Herbalism.Section.2=&3Comment fonctionne Main Verte?\n&eMain Verte est une capacit\u00e9 activ\u00e9e, gr\u00e2ce \u00e0 un clic-droit\n&elorsque vous tenez une houe.\n&eMain Verte donne au joueur une chance de r\u00e9cup\u00e9rer 3x ce que\n&edonnerai la plante r\u00e9colt\u00e9e. Vous pouvez \u00e9galement utiliser des\n&egraines pour insufler la vie \u00e0 certains blocs \n&eafin de les transformer. -Guides.Herbalism.Section.3=&3Comment Mains Vertes (Plantations) fonctionne ?\n&eCette capacit\u00e9 passive va automatiquement replanter les \n&eplantations lorsque celles-ci ont \u00e9t\u00e9 r\u00e9colt\u00e9es.\n&eLes chances de succ\u00e8es d\u00e9pendent de votre talent Herborisme. -Guides.Herbalism.Section.4=&3Comment Mains Vertes (Pierre/Briques de Pierre/Terre) fonctionent-elles ?\n&eCette cpacit\u00e9 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\u00e9e. -Guides.Herbalism.Section.5=&3Comment fonctionne r\u00e9gime fermier?\n&eCette capacit\u00e9 passive augmente le montant d\'\u00e9nergie rendue \n&elorsque vous mangez du pain, cookies, past\u00e8que, soupe \n&ede champignons, carottes et patates. -Guides.Herbalism.Section.6=&3Comment fonctione Chance d\'Hyrule?\n&eCette capacit\u00e9 passive vous donne une chance de trouver des\n&eobjets rares lorsque vous cassez certains blocs avec une \u00e9p\u00e9e. -Guides.Herbalism.Section.7=&3Comment fonctionne Double Drops?\n&eCette capacit\u00e9 passive donne au joueur\n&eplus d\'objets lors de ses r\u00e9coltes. +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 \u00e0 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\u00e9rience:\n&ePour gagner de l\'exp\u00e9rience dans cette comp\u00e9tence, vous devez simplement miner avec une pioche.\n&eSeulement certains blocs rapportent de l\'exp\u00e9rience. -Guides.Mining.Section.1=&3Mat\u00e9riaux 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\u00e9parer votre outil.\n&eUne fois cela fait, vous avez jusqu\'\u00e0 4 secondes pour commencer \u00e0 miner\n&edes mat\u00e9riaux compatibles, ce qui activera le Broyeur. -Guides.Mining.Section.3=&3Qu\'est-ce que le Super Briseur?\n&eLe Super Briseur est une capacit\u00e9 avec un temps de r\u00e9cup\u00e9ration li\u00e9 \u00e0 la Comp\u00e9tence\n&eminage. Il triple vos chances de r\u00e9cup\u00e9rer des objets et\n&epermet la casse instantan\u00e9e sur des minerais. -Guides.Mining.Section.4=&3Comment utiliser le Minage Explosif:\n&eAvec un d\u00e9tonateur en main, \u00e0 savoir un briquet par d\u00e9faut,\n&es\'accroupir et faire un clic droit sur de la TNT \u00e0 distance. Ceci fera\n&eexploser instantan\u00e9ment la TNT. -Guides.Mining.Section.5=&3Comment fonctionne le Minage par Explosions?\n&eLe Minage par Explosions est une capacit\u00e9 avec un temps de recharge li\u00e9 au talent\n&ede Minage. Il donne des bonus lors de l\'utilisation nde TNT pour le minage et vous permet\n&ede contr\u00f4ler l\'explosion de TNT. Il y a 3 parties du Minage par Explosions.\n&eLa premi\u00e8re est les Grosses Bombes. Elle vous permet d\'augmenter le rayon d\'explosion.\n&eLa seconde est la Demolition Experte, qui diminue les d\u00e9g\u00e2ts provenants des explosions de TNT\n&eLa troisi\u00e8me augmente le nombre de minerais obtenus par la TNT et diminue les pertes. +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\u00e9paration :\n&eLa r\u00e9paration vous permet d\'utiliser un bloc de fer pour r\u00e9parer\n&edes armures et des outils.\n&3Gain d\'exp\u00e9rience:\n&eR\u00e9parer des outils ou des armures en utilisant l\'enclume de mcMMO.\n&eC\'est un bloc de fer par d\u00e9faut et il ne doit pas \u00eatre confondu avec\n&el\'enclume de Minecraft Vanilla. -Guides.Repair.Section.1=&3Comment utiliser R\u00e9paration?\n&ePlacez une enclume mcMMO et faites un clic droit pour r\u00e9parer l\'objet\n&eque vous avez en main. Ceci consomme 1 objet \u00e0 chaque utilisation. -Guides.Repair.Section.2=&3Comment fonctionne Ma\u00eetrise de la Forge?\n&eMa\u00eetrise de la Forge augmente la quantit\u00e9 de r\u00e9parations effectu\u00e9es.\n&eLa quantit\u00e9 de durabilit\u00e9 suppl\u00e9mentaire attribu\u00e9e est fonction de \n&evotre niveau en R\u00e9paration. -Guides.Repair.Section.3=&3Comment fonctionne la Super R\u00e9paration?\n&eLa Super R\u00e9paration est une capacit\u00e9 passive . Lors de la r\u00e9paration d\'un \u00e9l\u00e9ment ,\n&eelle accorde aux joueurs une chance de r\u00e9parer un \u00e9l\u00e9ment avec\n&eune double efficacit\u00e9. -Guides.Repair.Section.4=&3Comment fonctionne Forge arcanique?\n&eCette capacit\u00e9 passive vous permet de r\u00e9parer des objets avec une\n&ecertaine chance de conserver les enchantements. Ces derniers\n&epourrons \u00eatre conserv\u00e9 \u00e0 leur niveau, rendus \u00e0 un niveau inf\u00e9rieur\n&eou compl\u00e8tement perdus. +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\u00e9cup\u00e9rer des mati\u00e8res premi\u00e8res\n&esur de l\'armure ou des outils.\n&3Gain d\'Exp\u00e9rience:\n&eLe Recyclage est une Comp\u00e9tence enfant des comp\u00e9tences R\u00e9paration et P\u00eache, votre niveau\n&ede Recyclage est donc bas\u00e9 sur les niveaux des comp\u00e9tences R\u00e9paration et P\u00eache. -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\u00e9riaux 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\u00e9?\n&eLorsque d\u00e9bloqu\u00e9e, cette capacit\u00e9 vous permet de recycler des objets d\u00e9t\u00e9rior\u00e9s.\n&eVotre pourcentage de r\u00e9cup\u00e9ration de mat\u00e9riaux augmente avec votre niveau. Un pourcentage\n&eplus \u00e9lev\u00e9 signifie que vous pouvez r\u00e9cup\u00e9rer davantage de mat\u00e9riaux.\n&eAvec le Recyclage Avanc\u00e9 vous r\u00e9cup\u00e9rerez toujours un mat\u00e9riaux \n&esauf si l\'objet est trop endommag\u00e9. Vous n\'aurez donc pas \u00e0 vous\n&esoucier de casser des objets sans avoir rien r\u00e9cup\u00e9r\u00e9. -Guides.Salvage.Section.3=&3Voici une illustration pour expliquer comment cela fonctionne:\n&eDisons que nous recyclons une pioche en or endommag\u00e9e \u00e0 20%,\n&ece qui veux dire que le montant maximum que vous pouvez r\u00e9cup\u00e9rer est 2 (66%).\n&e(parce que la pioche est constitu\u00e9e de 3 lingots, valant chacun\n&e33,33% de durabilit\u00e9). Si votre pourcentage de r\u00e9cup\u00e9ration de mat\u00e9riaux\n&eest en dessous de 66% vous ne pourrez pas r\u00e9cup\u00e9rer 2 lingots.\n&eSi ce pourcentage est au dessus de 66% vous pourrez r\u00e9cup\u00e9rer le\n&e\"montant maximum\", donc 2 lingots. -Guides.Salvage.Section.4=&3Comment fonctionne le Recyclage Arcanique?\n&eCette capacit\u00e9 vous permet de r\u00e9cup\u00e9rer des livres enchant\u00e9s lors que vous recyclez\n&edes objets enchant\u00e9s. En fonction de votre niveau, la chance de r\u00e9cup\u00e9rer avec succ\u00e8s\n&edes enchantements entiers ou partiels varie.\n&eLorsqu\'un enchantement est partiellement r\u00e9cup\u00e9r\u00e9, le livre enchant\u00e9\n&eaura un niveau d\'enchantement plus bas compar\u00e9 \u00e0 l\'enchantement\n&ede l\'objet que recyclez. +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 \u00e0 l\'\u00e9p\u00e9e::\n&eCette comp\u00e9tence octroie un bonus si vous combattez avec\n&eune \u00e9p\u00e9e.\n&3XP GAIN:\n&eLe gain d\'XP est bas\u00e9 sur le montant des d\u00e9gats inflig\u00e9s aux mobs \n&eet autres joueurs avec une \u00e9p\u00e9e. -Guides.Swords.Section.1=&3Comment fonctionne coups d\u00e9chirants?\n&eCoups d\u00e9chirants est une capacit\u00e9 acitv\u00e9e, vous pouvez l\'activer\n&eavec un clic droit, une \u00e9p\u00e9e \u00e0 la main. Cette capacit\u00e9 vous permet \n&ed\'infliger des d\u00e9g\u00e2ts 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\u00e9 active. En bloquant les attaques\n&edes mobs, vous avez une chance de repousser 50% des\n&ed\u00e9g\u00e2ts qui vous sont inflig\u00e9s. -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\'\u00e0 ce que l\'effet s\'estompe, ou qu\'il meure,\n&een fonction de ce qui arrive en premier!\n&eLa durabilit\u00e9 du Saignement est augment\u00e9 avec votre Comp\u00e9tence \u00c9p\u00e9e. +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\u00e8re au joueur divers bonus de combat\n&elorsqu\'il utilise un animal (loup/ocelot).\n&3GAIN D\'XP:\n&ePour gagner de l\'exp\u00e9rience, 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\u00e9 active qui vous permet de faire appel\n&e\u00e0 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\u00eates?\n&eConnaissance des b\u00eates permet au joueur d\'inspecter les stats\n&ede ses animaux. Cliquez gauche un loup ou un ocelot pour\n&eutiliser Connaissance des b\u00eates. -Guides.Taming.Section.3=&3Comment fonctione Gore?\n&eGore est une capacit\u00e9 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\u00e9es?\n&eGriffes aiguis\u00e9es ajoute un bonus de d\u00e9g\u00e2ts inflig\u00e9s par votre loup.\n&eLe bonus de d\u00e9g\u00e2ts d\u00e9pend de votre niveau en Apprivoisement. -Guides.Taming.Section.5=&3Comment fonctionne Attentif \u00e0 l\'environnement?\n&eCette capacit\u00e9 passive permet \u00e0 votre loup de se t\u00e9l\u00e9porter sur vous\n&elorsqu\'il se rapproche de dangers (cactus, lave, etc). Cela lui donne\n&e\u00e9galemment l\'immunit\u00e9 contre les d\u00e9g\u00e2ts de chute. -Guides.Taming.Section.6=&3Comment fonctionne Poil \u00c9pais?\n&eCette capacit\u00e9 passive rend vos loups moins vuln\u00e9rables\n&eet r\u00e9sistants au feu. -Guides.Taming.Section.7=&3Comment fonctionne r\u00e9sistance aux chocs?\n&eCette capacit\u00e9 passive r\u00e9duit les d\u00e9g\u00e2ts inflig\u00e9s \u00e0 vos loups\n&epar les explosions. -Guides.Taming.Section.8=&3Comment fonctionne Service Fast Food?\n&eCette capacit\u00e9 passive donne \u00e0 vos loups une chance de\n&ese soigner lorsqu\'ils effectuent une attaque. +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\u00e9rience:\n&eVous gagnez de l\'exp\u00e9rience en fonction des d\u00e9g\u00e2ts inflig\u00e9s 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\u00e9 active qui est activ\u00e9e en faisant un clic-droit,\n&een n\'ayant rien \u00e0 la main. En mode Furie, vous infligerez 50% plus\n&ede d\u00e9g\u00e2ts et vous pourrez casser des mat\u00e9riaux faibles instantan\u00e9ment,\n&ecomme l\'Herbe et la Terre. -Guides.Unarmed.Section.2=&3Comment fonctionne le Bras de Fer?\n&eBras de Fer augmente les d\u00e9g\u00e2ts inflig\u00e9s lorsque vous attaquez des mobs ou\n&edes joueurs avec les Poings. -Guides.Unarmed.Section.3=&3Comment fonctionne la D\u00e9viation de Fl\u00e8che?\n&eLa D\u00e9viation de Fl\u00e8che est une capacit\u00e9 \n&equi permet de d\u00e9vier une fl\u00e8che tir\u00e9e par un Squelette ou un joueur.\n&eCette fl\u00e8che tombera alors au sol, inoffensive. -Guides.Unarmed.Section.4=&3Comment fonctionne la Poigne de Fer?\n&ePoigne de Fer est une capacit\u00e9 passive qui contre le d\u00e9sarmement. En am\u00e9liorant\n&evotre comp\u00e9tence Poings, la chance de parer un d\u00e9sarmement augmente. -Guides.Unarmed.Section.5=&3Comment fonctionne d\u00e9sarmement?\n&eCette capacit\u00e9 passive permet le joueur de d\u00e9sarmer d\'autres joueurs,\n&eprovoquant la chute au sol de ses objets \u00e9quip\u00e9s. +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\u00fbcheronnage:\n&eLe b\u00fbcheronnage concerne l\'abattement d\'arbres.\n&3Gain d\'Exp\u00e9rience:\n&eVous gagniez de l\'exp\u00e9rience pour chaque bloc de bois cass\u00e9. -Guides.Woodcutting.Section.1=&3Comment fonctionne le Fendeur d\'Arbres?\n&eLe Fendage d\'Arbres est une capacit\u00e9 active, en faisant un clic-droit\n&eavec une hache \u00e0 la main, vous activerez cette capacit\u00e9. Ceci vous\n&epermettra d\'abattre un arbre int\u00e9gralement, en r\u00e9cup\u00e9rant\n&etoutes les b\u00fbches d\'un coup. -Guides.Woodcutting.Section.2=&3Comment fonctionne le Souffleur de Feuilles?\n&eSouffleur de Feuilles est une capacit\u00e9 passive qui permet de casser un\n&ebloc de feuilles instantan\u00e9ment quand vous les cassez avec un hache. Par d\u00e9faut,\n&ecette capacit\u00e9 est disponible au niveau 100 de la Comp\u00e9tence B\u00fbcheronnage. -Guides.Woodcutting.Section.3=&3Comment fonctionne Double Bois?\n&eCette capacit\u00e9 passive vous donne une chance\n&ede r\u00e9cup\u00e9rer une b\u00fbche suppl\u00e9mentaire par bloc de bois cass\u00e9. +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 &e{0} Inspect.Stats=&amcMMO Stats for &e{0} -Inspect.TooFar=Vous \u00eates trop \u00e9loign\u00e9 de ce joueur pour l\'inspecter ! +Inspect.TooFar=Vous êtes trop éloigné de ce joueur pour l\'inspecter ! #ITEMS -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=&7Vous t\u00e9l\u00e9porte \u00e0 votre lit. +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 \u00e9t\u00e9 bless\u00e9 r\u00e9cemment et devez attendre pour utiliser cela. &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=&7A une chance de fondre des minerais instantan\u00e9ment. -Item.FluxPickaxe.Lore.2=&7Requi\u00e8re niveau de Forge {0}+ +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\u00e9l\u00e9portation commence dans &6({0}) &7secondes, pri\u00e8re de ne pas bouger... -Teleport.Cancelled=&4T\u00e9l\u00e9portation annul\u00e9e ! +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 \u00e9t\u00e9 d\u00e9sarm\u00e9 ! +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} @@ -996,101 +996,101 @@ Skills.Parents=PARENTS Skills.Stats={0}&a{1}&3 XP (&7{2}&3/&7{3}&3) Skills.ChildStats={0}&a{1} Skills.MaxXP=Max -Skills.TooTired=Vous \u00eates trop fatigu\u00e9 pour r\u00e9utiliser cette comp\u00e9tence maintenant. +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\u00e9 - {1} -Skills.Cancelled={0} annul\u00e9(e) ! -Skills.ConfirmOrCancel=&aFa\u00eetes de nouveau un clic droit pour confirmer &6{0}&a. Clic gauche pour annuler. -Skills.AbilityGateRequirementFail=&7Vous devez avoir &e{0}&7 niveaux suppl\u00e9mentaires en &3{1}&7 pour utilisez cette super abilit\u00e9. +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\u00c9TENCES DE COMBAT=- -Stats.Header.Gathering=&6-=COMP\u00c9TENCES DE R\u00c9COLTE=- +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\u00e9rience -Perks.XP.Desc=Gain d\'EXP boost\u00e9 dans certains talents. +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.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\u00e9n\u00e9ration rapide -Perks.Cooldowns.Desc=Temps d\'attente r\u00e9duits de {0}. +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.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 \u00e9t\u00e9 d\u00e9sactiv\u00e9 pour {1}. -Hardcore.Mode.Enabled=&6[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.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 \u00e9t\u00e9 chang\u00e9 \u00e0 {0}. +Hardcore.DeathStatLoss.PercentageChanged=&6[mcMMO] Le pourcentage de perte de statistiques a été changé à {0}. Hardcore.Vampirism.Name=Vampirisme -Hardcore.Vampirism.Killer.Failure=&6[mcMMO] &e{0}&7 \u00e9tait trop maladroit pour am\u00e9liorer votre connaissance. -Hardcore.Vampirism.Killer.Success=&6[mcMMO] &3Vous avez vol\u00e9 &9{0}&3 niveau(x) de &e{1}. -Hardcore.Vampirism.Victim.Failure=&6[mcMMO] &e{0}&7 Il n\'a pas \u00e9t\u00e9 capable de vous voler votre connaissance ! -Hardcore.Vampirism.Victim.Success=&6[mcMMO] &e{0}&4 a vol\u00e9 &9{1}&4 de vos niveaux ! -Hardcore.Vampirism.PercentageChanged=&6[mcMMO] Le pourcentage de perte de statistiques a \u00e9t\u00e9 chang\u00e9 \u00e0 {0}. +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\u00e9 : &4{0} -MOTD.Hardcore.DeathStatLoss.Stats=&6[mcMMO] &3P\u00e9nalit\u00e9s sur les talents lors de la mort : &4{0}% +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\u00e9tences] +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\u00e9 des Combustibles: &e{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.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\u00e9 du combustible -Smelting.SubSkill.FuelEfficiency.Description=Augmente la dur\u00e9e de vie du combustible utilis\u00e9 dans les fours lors des cuissons -Smelting.SubSkill.FuelEfficiency.Stat=Multiplicateur d\'efficacit\u00e9 du combustible: &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.mcchatspy=Mettre le chat mcMMO priv\u00e9e sur on/off -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.mmodebug=Activer/D\u00e9sactiver le mode de debug pour voir des informations utiles lorsque vous tapez un blocs -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. @@ -1106,35 +1106,35 @@ Scoreboard.Misc.CurrentXP=&aEXP actuelle Scoreboard.Misc.RemainingXP=EXP restante Scoreboard.Misc.Cooldown=&dTemps d\'attente Scoreboard.Misc.Overall=&6Global -Scoreboard.Misc.Ability=Capacit\u00e9 +Scoreboard.Misc.Ability=Capacité #DATABASE RECOVERY -Profile.PendingLoad=&cG\u00e9nial! Vos donn\u00e9es McMMO ont \u00e9t\u00e9 charg\u00e9es. -Profile.Loading.Success=&aVotre profil mcMMO a \u00e9t\u00e9 charg\u00e9. -Profile.Loading.FailurePlayer=&cmcMMO a des problèmes pour le chargement des donn\u00e9es, nous avons essay\u00e9 de les charger &a{0}&c fois.&c Vous devez contacter l'administrateur du serveur \u00e0 ce propos. mcMMO essayera de charger les donn\u00e9es jusqu\'\u00e0 votre d\u00e9connection, vous ne gagnerez pas d\'XP ou ne pourrez pas utiliser vos comp\u00e9tences tant que les donn\u00e9es ne sont pas charg\u00e9s. -Profile.Loading.FailureNotice=&4[A]&c mcMMO ne peut pas charger les donn\u00e9es pour &e{0}&c. &dMerci de v\u00e9rifier la configuration de la base de donn\u00e9es. Essaie fait {1}x. +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\u00e9sormais au niveau &a{1}&6! -Holiday.Anniversary=&9Joyeux {0} anniversaire !\n&9En honneur \u00e0 tout le travail de nossr50 et \u00e0 tout les d\u00e9veloppeurs, voici un spectacle de feu d\'artifice ! +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\u00e9s ! +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\u00e9tence. -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\u00e9tence. +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 \u00e0 propos de mcMMO, des compatibilit\u00e9s or des de ses fonctionnalit\u00e9s -Compatibility.Layer.Unsupported=&6Compatibilit\u00e9s pour &a{0}&6 n'est pas une version de Minecraft support\u00e9. -Compatibility.Layer.PartialSupport=&6Compatibilit\u00e9s pour &a{0}&6 n'est pas une version de Minecraft support\u00e9, mais mcMMO utilise une version qui \u00e9mule certaines fonctionnalit\u00e9s manquantes. -Commands.XPBar.DisableAll=&6 Toutes les barres d\'XP mcMMO sont d\u00e9sormais d\u00e9sactiv\u00e9s, utilisez /mmoxpbar reset pour remettre la configuration par d\u00e9faut. +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\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.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\u2192 &r{1} +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 d15562d7a..c0d286a7f 100644 --- a/src/main/resources/locale/locale_hu_HU.properties +++ b/src/main/resources/locale/locale_hu_HU.properties @@ -3,42 +3,42 @@ #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.Target.Player=Játékos JSON.JWrapper.Perks.Header=&6Szerencse Perk-kek -JSON.JWrapper.Perks.Lucky={0}% Jobb Es\u00E9ly +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=&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=&7??? JSON.Hover.Mystery2=&e[&8{0}&e]&8???&r @@ -52,76 +52,76 @@ JSON.Hover.AtSymbolURL=&e@ JSON.Notification.SuperAbility={0} #These are the JSON Strings used for SubSkills -JSON.Acrobatics.Roll.Interaction.Activated=Teszt &cGurul\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=&cNem 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=&6(&amcMMO&6) &7{0} # BEGIN STYLING -Ability.Generic.Refresh=&a**K\u00C9PESS\u00C9GEK FRISS\u00CDTVE!** +Ability.Generic.Refresh=&a**KÉPESSÉGEK FRISSÍTVE!** 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=EFFEKTEK -Effects.SubSkills.Overhaul=Al-K\u00E9pess\u00E9gek +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\u00E1k -Commands.XPGain.Overhaul=&6XP NYERES\u00C9G: &3{0} -MOTD.Version.Overhaul=&6[mcMMO] &3Fel\u00FAj\u00EDt\u00E1s Kora&6 - &3{0} -Overhaul.mcMMO.Header=&c[]=====[]&a mcMMO - Fel\u00FAj\u00EDt\u00E1s Kora &c[]=====[] +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\u00E9zd meg a k\u00E9pess\u00E9get a wiki oldalon!&e] +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=&l{0} szint n\u00F6vekedett &r&a&l{2}&r&f. +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=&c---[]&amcMMO Parancsok&c[]--- -Commands.Other=&c---[]&aSPECI\u00C1LIS PARANCSOK&c[]--- +Commands.Other=&c---[]&aSPECIÁLIS PARANCSOK&c[]--- Commands.Party.Header=&c-----[]&aPARTY&c[]----- -Commands.Party.Features.Header=&c-----[]&aFUNKCI\u00D3K&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=&6Egy \u00FAj k\u00E9pess\u00E9g tanul\u00E1sa... +XPBar.Template.EarlyGameBoost=&6Egy új képesség tanulása... XPBar.Acrobatics=Akrobatika &6{0}. &fSzint -XPBar.Alchemy=Alk\u00EDmia &6{0}. &fSzint -XPBar.Archery=\u00CDj\u00E1szat &6{0}. &fSzint -XPBar.Axes=Balt\u00E1szat &6{0}. &fSzint -XPBar.Excavation=\u00C1s\u00E1s &6{0}. &fSzint -XPBar.Fishing=Horg\u00E1szat &6{0}. &fSzint -XPBar.Herbalism=N\u00F6v\u00E9nytan &6{0}. &fSzint -XPBar.Mining=B\u00E1ny\u00E1szat &6{0}. &fSzint -XPBar.Repair=Jav\u00EDt\u00E1s &6{0}. &fSzint -XPBar.Salvage=\u00DAjrahasznos\u00EDt\u00E1s &6{0}. &fSzint -XPBar.Smelting=Olvaszt\u00E1s &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\u00EDd\u00EDt\u00E9s &6{0}. &fSzint +XPBar.Taming=Szelídítés &6{0}. &fSzint XPBar.Unarmed=Pusztakezek &6{0}. &fSzint -XPBar.Woodcutting=Fav\u00E1g\u00E1s &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} &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 @@ -129,598 +129,598 @@ XPBar.Complex.Template={0} &3 {4}&f% &3(&f{1}&3/&f{2}&3) # END STYLING #ACROBATICS -Acrobatics.Ability.Proc=&a**Kecses Landol\u00E1s** -Acrobatics.Combat.Proc=&a**Kit\u00E9r\u00EDtve** -Acrobatics.SubSkill.Roll.Stats=&6Es\u00E9ly Gurul\u00E1sra &e{0}%&6 Es\u00E9ly Kecses Gurul\u00E1sra&e {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: &e{0} -Acrobatics.SubSkill.Roll.GraceChance=Es\u00E9ly Kecses Gurul\u00E1sra: &e{0} -Acrobatics.SubSkill.Roll.Mechanics=&7A 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 &e{6}%&7. szintt\u0151l &e{0}%&7 es\u00E9lyed van a s\u00E9r\u00FCl\u00E9sek megel\u0151z\u00E9s\u00E9re, \u00E9s &e{1}%&7 ha aktiv\u00E1lod a Kecses Gurul\u00E1st.\nA siker es\u00E9lye egy line\u00E1ris g\u00F6rbe, ami a szintedhez igazodik eddig a szintig &e{2}&7, ahol az Akrobatika minden szintje add neked &e{3}%&7 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 &c{4}&7 s\u00E9r\u00FCl\u00E9st. A Kecses Gurul\u00E1s megakad\u00E1lyoz &a{5}&7 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=&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: &a{0}&3/&a{1} -Alchemy.SubSkill.Concoctions.Stat.Extra=Hozz\u00E1val\u00F3k [&a{0}&3]: &a{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.Description=\u00D6sszezavarja az ellenfeleket \u00E9s extra sebz\u00E9st okoz -Archery.SubSkill.Daze.Stat=Es\u00E9ly K\u00E1b\u00EDt\u00E1sra -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=&7Leengeded a balt\u00E1d. -Axes.Ability.Ready=&6Felemeled&3 a balt\u00E1d. -Axes.Ability.Ready.Extra=&6Felemeled&3 a balt\u00E1d. [[GRAY]]({0} a v\u00E1rakoz\u00E1si id\u0151 ehhez {1}s) -Axes.Combat.CritStruck=&4KRITIKUS sebz\u00E9st kapt\u00E1l! -Axes.Combat.CriticalHit=KRITIKUS SEBZ\u00C9S! -Axes.Combat.GI.Proc=&a**ER\u0150S \u00DCT\u00C9SSEL CSAPT\u00C1L** -Axes.Combat.GI.Struck=**ER\u0150S \u00DCT\u00C9SSEL CSAPTAK MEG** -Axes.Combat.SS.Struck=&4KOPONYA 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=&a**Koponya T\u00F6r\u00E9s AKTIV\u00C1LVA** -Axes.Skills.SS.Refresh=&aA &eKoponya T\u00F6r\u00E9s &ak\u00E9pess\u00E9ged ism\u00E9t el\u00E9rhet\u0151! -Axes.Skills.SS.Other.Off=Koponya T\u00F6r\u00E9s&a kikapcsolva: &e{0} -Axes.Skills.SS.Other.On=&a{0}&2 haszn\u00E1lta a &cKoponya T\u00F6r\u00E9s &2k\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=&7Leengeded az \u00E1s\u00F3d. -Excavation.Ability.Ready=&6El\u0151k\u00E9sz\u00EDted&3 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=&a**GIGA F\u00DAR\u00D3-T\u00D6R\u0150 AKTIV\u00C1LVA** -Excavation.Skills.GigaDrillBreaker.Refresh=&aA &eGiga F\u00FAr\u00F3-T\u00F6r\u0151 &ak\u00E9pess\u00E9ged ism\u00E9t el\u00E9rhet\u0151! -Excavation.Skills.GigaDrillBreaker.Other.Off=Giga F\u00FAr\u00F3-T\u00F6r\u0151&a kikapcsolva: &e{0} -Excavation.Skills.GigaDrillBreaker.Other.On=&a{0}&2 haszn\u00E1lta a &cGiga F\u00FAr\u00F3-T\u00F6r\u0151 &2k\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=&e&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=&7&oA Zavaros mozg\u00E1sok megijesztik a halakat! -Fishing.Exhausting=&c&oA horg\u00E1szbot helytelen haszn\u00E1lata f\u00E1radts\u00E1got okoz, \u00E9s elhaszn\u00E1l\u00F3dik a r\u00FAd! -Fishing.LowResourcesTip=&7\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: &7 **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: &a{0}&3/&a{1} -Fishing.SubSkill.TreasureHunter.Stat.Extra=T\u00E1rgy Es\u00E9si Es\u00E9ly: &7\u00C1tlagos: &e{0} &aRendk\u00EDv\u00FCli: &e{1}\n&9Ritka: &e{2} &dEpikus: &e{3} &6Legend\u00E1s: &e{4} &bM\u00EDtikus: &e{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:&a Szint {0} -Fishing.SubSkill.MasterAngler.Name=Mester Horg\u00E1sz -Fishing.SubSkill.MasterAngler.Description=A halak gyakrabban foghat\u00F3ak, jobban m\u0171k\u00F6dik ha egy cs\u00F3nakb\u00F3l horg\u00E1szol. -Fishing.SubSkill.MasterAngler.Stat=A horg\u00E1szat minimum v\u00E1rakoz\u00E1si idej\u00E9nek cs\u00F6kkent\u00E9se: &a-{0} m\u00E1sodperc -Fishing.SubSkill.MasterAngler.Stat.Extra=A horg\u00E1szat maximum v\u00E1rakoz\u00E1si idej\u00E9nek cs\u00F6kkent\u00E9se: &a-{0} m\u00E1sodperc -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=&9 Es\u0151 B\u00F3nusz -Fishing.Listener=Horg\u00E1szat: -Fishing.Ability.TH.MagicFound=&7Valami m\u00E1gikusat \u00E9rzel ezzel a kap\u00E1ssal kapcsolatban... +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\u00C1SZAT +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=&a**Z\u00D6LD H\u00DCVELYK** -Herbalism.Ability.Lower=&7Leengeded a kap\u00E1dat. -Herbalism.Ability.Ready=&6El\u0151k\u00E9sz\u00EDted&3 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 kap\u00E1val t\u00F6rt\u00E9n\u0151 betakar\u00EDt\u00E1sn\u00E1l -Herbalism.SubSkill.GreenThumb.Stat=Es\u00E9ly Z\u00F6ld H\u00FCvelykre -Herbalism.SubSkill.GreenThumb.Stat.Extra=Z\u00F6ld H\u00FCvelyk \u00C1llapota: &a 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: &aSzint {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=&aHyrule 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=&a**Z\u00D6LD F\u00D6LD AKTIV\u00C1LVA** -Herbalism.Skills.GTe.Refresh=&aA &eZ\u00F6ld F\u00F6ld &ak\u00E9pess\u00E9ged ism\u00E9t el\u00E9rhet\u0151! -Herbalism.Skills.GTe.Other.Off=Z\u00F6ld F\u00F6ld&a kikapcsolva: &e{0} -Herbalism.Skills.GTe.Other.On=&a{0}&2 haszn\u00E1lta a &cZ\u00F6ld F\u00F6ld &2k\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=&7Leengeded a cs\u00E1k\u00E1nyod. -Mining.Ability.Ready=&6El\u0151k\u00E9sz\u00EDted&3 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:&a Szint {0}/{1} &7({2}) -Mining.SubSkill.BlastMining.Stat.Extra=Robban\u00E1si Hat\u00F3sug\u00E1r N\u00F6veked\u00E9s: &a+{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=&a**SZUPER T\u00D6R\u00C9S AKTIV\u00C1LVA** -Mining.Skills.SuperBreaker.Other.Off=Szuper T\u00F6r\u00E9s&a kikapcsolva: &e{0} -Mining.Skills.SuperBreaker.Other.On=&a{0}&2 haszn\u00E1lta a &cSzuper T\u00F6r\u00E9s &2k\u00E9pess\u00E9get! -Mining.Skills.SuperBreaker.Refresh=&aA &eSzuper T\u00F6r\u00E9s &ak\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=&7**BUMM** Mining.Blast.Cooldown= -Mining.Blast.Effect=+{0} \u00E9rc hozam, {1}x t\u00E1rgy es\u00E9s -Mining.Blast.Other.On=&a{0}&2 haszn\u00E1lta a &cRobbant\u00E1sb\u00E1ny\u00E1szat &2k\u00E9pess\u00E9get! -Mining.Blast.Refresh=&aA &eRobbant\u00E1sb\u00E1ny\u00E1szat &ak\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: &aExtra {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: &eSzint {0}/{1} -Repair.SubSkill.ArcaneForging.Stat.Extra=&3M\u00E1gikus Kov\u00E1csol\u00E1s Es\u00E9ly:&7 Siker &a{0}&7%, Sikertelen &c{1}&7% -Repair.Error=&4Az mcMMO hib\u00E1t \u00E9szlelt a t\u00E1rgy megjav\u00EDt\u00E1sa k\u00F6zben! -Repair.Listener.Anvil=&4Lehelyezt\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=&4Nem vagy el\u00E9g tapasztalt ahhoz, hogy Gy\u00E9m\u00E1nttal jav\u00EDts. -Repair.Skills.AdeptGold=&4Nem vagy el\u00E9g tapasztalt ahhoz, hogy Arannyal jav\u00EDts. -Repair.Skills.AdeptIron=&4Nem vagy el\u00E9g tapasztalt ahhoz, hogy Vassal jav\u00EDts. -Repair.Skills.AdeptStone=&4Nem vagy el\u00E9g tapasztalt ahhoz, hogy K\u0151vel jav\u00EDts. -Repair.Skills.Adept=&cSz\u00FCks\u00E9ged van &e{0}&c szintre, hogy ezt megjav\u00EDthasd: &e{1} -Repair.Skills.FeltEasy=&7H\u00E1t ez k\u00F6nny\u0171 volt. -Repair.Skills.FullDurability=&7Ezt nem kell m\u00E9g jav\u00EDtani. -Repair.Skills.StackedItems=&4Nem 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=&aSikeresen 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: &aHullad\u00E9kgy\u0171jt\u0151: &aHasznos\u00EDts \u00FAjra ak\u00E1r &e{0}&a 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: &e {0}/{1} -Salvage.Ability.Bonus.0=Hullad\u00E9kgy\u0171jt\u0151 -Salvage.Ability.Bonus.1=Hasznos\u00EDts \u00FAjra ak\u00E1r &e{0}&a t\u00E1rgyat. Egy kis szerencs\u00E9vel. -Salvage.Arcane.ExtractFull=&7M\u00C9 Teljes-Var\u00E1zslat Es\u00E9ly -Salvage.Arcane.ExtractPartial=&7M\u00C9 R\u00E9szleges-Var\u00E1zslat Es\u00E9ly -Salvage.Skills.Success=&aT\u00E1rgy \u00DAjrahasznos\u00EDtva! -Salvage.Skills.Adept.Damaged=&4Nem vagy el\u00E9g tapasztalt, hogy s\u00E9r\u00FClt t\u00E1rgyakat hasznos\u00EDthass \u00FAjra. -Salvage.Skills.Adept.Level=Sz\u00FCks\u00E9ges szint &e{1}&c \u00FAjrahasznos\u00EDt\u00E1shoz: &e{0} -Salvage.Skills.TooDamaged=&4Ez a t\u00E1rgy t\u00FAls\u00E1gosan s\u00E9r\u00FClt az \u00FAjrahasznos\u00EDt\u00E1shoz. -Salvage.Skills.ArcaneFailed=&cNem tudtad kinyerni a tud\u00E1st, ami ebben a t\u00E1rgyban lakozik. -Salvage.Skills.ArcanePartial=&cCsak r\u00E9szleges tud\u00E1st tudt\u00E1l kinyerni ebb\u0151l a t\u00E1rgyb\u00F3l. -Salvage.Skills.ArcaneSuccess=&aSikeresen kinyert\u00E9l minden tud\u00E1st ebb\u0151l a t\u00E1rgyb\u00F3l! -Salvage.Listener.Anvil=&4Lehelyezt\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=&6\u00DAjrahasznos\u00EDthatsz &3{0}&6 anyagot ebb\u0151l &e{1}&6. -Salvage.Skills.Lottery.Perfect=&a&lT\u00F6k\u00E9letes!&r&6 K\u00F6nnyed\u00E9n \u00FAjrahasznos\u00EDtott\u00E1l egy &3{1}&6-t visszanyerve &3{0}&6 anyagot. -Salvage.Skills.Lottery.Untrained=&7M\u00E9g nem vagy el\u00E9g k\u00E9pezett az \u00FAjrahasznos\u00EDt\u00E1sban. Csak &c{0}&7 anyagot tudt\u00E1l helyre\u00E1ll\u00EDtani ebb\u0151l &a{1}&7. +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=&7Leengeded a kardod. -Swords.Ability.Ready=&6El\u0151k\u00E9sz\u00EDted&3 a kardod. -Swords.Combat.Rupture.Note=&7MEGJ.: &e1 Tick t\u00F6rt\u00E9nik minden 0,5 m\u00E1sodpercenk\u00E9nt -Swords.Combat.Bleeding.Started=&4 V\u00E9rzel! -Swords.Combat.Bleeding.Stopped=&7A v\u00E9rz\u00E9s &ael\u00E1llt&7! -Swords.Combat.Bleeding=&a**AZ ELLENS\u00C9G V\u00C9RZIK** -Swords.Combat.Counter.Hit=&4Ellent\u00E1mad\u00E1s! -Swords.Combat.Countered=&a**ELLENT\u00C1MADVA!** -Swords.Combat.SS.Struck=&4R\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.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: &a{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=&a**FOGAZOTT PENGE AKTIV\u00C1LVA** -Swords.Skills.SS.Refresh=&aA &eFogazott Penge &ak\u00E9pess\u00E9ged ism\u00E9t el\u00E9rhet\u0151! +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\u00E1lta a &cFogazott Penge &2k\u00E9pess\u00E9get! +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: &e{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=&7GBKE: 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=&8A Farkasod hozz\u00E1d oson... -Taming.Listener=Szel\u00EDd\u00EDt\u00E9s: -Taming.SkillName=SZELID\u00CDT\u00C9S -Taming.Summon.COTW.Success.WithoutLifespan=&a(A Vadon Szava) &7Megid\u00E9zt\u00E9l egy &6{0}&7 -Taming.Summon.COTW.Success.WithLifespan=&a(A Vadon Szava) &7Megid\u00E9zt\u00E9l egy &6{0}&7 \u00E9s az id\u0151tartama &6{1}&7 m\u00E1sodperc. -Taming.Summon.COTW.Limit=&a(A Vadon Szava) &7Egyszerre csak &c{0} &7megid\u00E9zett &7{1} h\u00E1zi\u00E1llat lehet egyid\u0151ben. -Taming.Summon.COTW.TimeExpired=&a(A Vadon Szava) &7Az id\u0151 v\u00E9get \u00E9r, &6{0}&7 elt\u00E1vozik. -Taming.Summon.COTW.Removed=&a(A Vadon Szava) &7A megid\u00E9zett &6{0}&7 elt\u0171nt ebb\u0151l a vil\u00E1gb\u00F3l. -Taming.Summon.COTW.BreedingDisallowed=&a(A Vadon Szava) &cNem szapor\u00EDthatsz megid\u00E9zett \u00E1llatot. -Taming.Summon.COTW.NeedMoreItems=&a(A Vadon Szava) &7Sz\u00FCks\u00E9g van &e{0}&7 t\u00F6bb &3{1}&7(s) -Taming.Summon.Name.Format=&6(COTW) &f{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=Ac\u00E9l-\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=&aA Vas-Markol\u00E1sodnak h\u00E1la nem lett\u00E9l Lefegyverezve! -Unarmed.Ability.Lower=&7Leengeded az \u00F6kleidet. -Unarmed.Ability.Ready=&6El\u0151k\u00E9sz\u00EDted&3 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.SteelArmStyle.Name=Ac\u00E9l-\u00D6k\u00F6l St\u00EDlus -Unarmed.SubSkill.SteelArmStyle.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=&a**VADUL\u00C1S AKTIV\u00C1LVA** -Unarmed.Skills.Berserk.Other.Off=Vadul\u00E1s&a kikapcsolva: &e{0} -Unarmed.Skills.Berserk.Other.On=&a{0}&2 haszn\u00E1lta a &cVadul\u00E1s &2k\u00E9pess\u00E9get! -Unarmed.Skills.Berserk.Refresh=&aA &eVadul\u00E1s &ak\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.KnockOnWood.Name=Fa Kopogtat\u00E1s -Woodcutting.SubSkill.KnockOnWood.Description=Keress tov\u00E1bbi finoms\u00E1gokat a Fad\u00F6nt\u00E9s haszn\u00E1latakor -Woodcutting.SubSkill.KnockOnWood.Stat=Fa Kopogtat\u00E1s -Woodcutting.SubSkill.KnockOnWood.Loot.Normal=Standard zs\u00E1km\u00E1ny a f\u00E1kt\u00F3l -Woodcutting.SubSkill.KnockOnWood.Loot.Rank2=Standard zs\u00E1km\u00E1ny \u00E9s tapasztalat pontok a f\u00E1kt\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=&a**FAD\u00D6NT\u00C9S AKTIV\u00C1LVA** -Woodcutting.Skills.TreeFeller.Refresh=&aA &eFad\u00F6nt\u00E9s &ak\u00E9pess\u00E9ged ism\u00E9t el\u00E9rhet\u0151! -Woodcutting.Skills.TreeFeller.Other.Off=Fad\u00F6nt\u00E9s&a kikapcsolva: &e{0} -Woodcutting.Skills.TreeFeller.Other.On=&a{0}&2 haszn\u00E1lta a &cFad\u00F6nt\u00E9s &2k\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=&f**NY\u00CDL ELH\u00C1R\u00CDTVA** -Combat.BeastLore=&a**VAD\u00C1LLAT TAN** -Combat.BeastLoreHealth=&3\u00C9let (&a{0}&3/{1}) +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\u00F3 Mozg\u00E1si Sebess\u00E9g (&a{0} blokk/m\u00E1sodperc&3) -Combat.BeastLoreHorseJumpStrength=&3L\u00F3ugr\u00E1s ereje (&aMax {0} blokk&3) -Combat.Gore=&a**LED\u00D6FVE** -Combat.StruckByGore=**LED\u00D6FTEK** -Combat.TargetDazed=A c\u00E9lpont &4Elk\u00E1bult -Combat.TouchedFuzzy=&4Bolyhost \u00E9rintett, K\u00E1bults\u00E1got \u00E9rzett. +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=&3Az &emcMMO&3 Projektr\u0151l:,&6Az mcMMO egy &cny\u00EDlt forr\u00E1sk\u00F3d\u00FA&6 RPG m\u00F3d, amit 2011 febru\u00E1rj\u00E1ban alap\u00EDtott &9nossr50&6. A c\u00E9l a min\u0151s\u00E9gi RPG \u00E9lm\u00E9ny biztos\u00EDt\u00E1sa.,&3Tippek:,&6 - &aHaszn\u00E1ld a &c/mcmmo help&a parancsot a parancsok megtekint\u00E9s\u00E9hez,&6 - &a\u00CDrd be a &c/K\u00C9PESS\u00C9GN\u00C9V&a parancsot a r\u00E9szletes k\u00E9pess\u00E9ginform\u00E1ci\u00F3khoz,&3Fejleszt\u0151k:,&6 - &anossr50 &9(Alap\u00EDt\u00F3 & Projektvezet\u0151),&6 - &aelectronicboy &9(Fejleszt\u0151),&6 - &akashike &9(Fejleszt\u0151),&6 - &at00thpick1 &9(Classic Karbantart\u00F3) -mcMMO.Description.FormerDevs=&3Kor\u00E1bbi Fejleszt\u0151k: &aGJ, NuclearW, bm01, TfT_02, Glitchfinder -Commands.addlevels.AwardAll.1=&aEl\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=&aEl\u00E9rt\u00E9l {0} szintet a k\u00F6vetkez\u0151ben {1}! -Commands.addlevels.AwardSkill.2={0} \u00E1t\u00E1ll\u00EDtva {1}. -Commands.addxp.AwardAll=&aEl\u00E9rt\u00E9l {0} tapasztalatot az \u00F6sszes k\u00E9pess\u00E9gben! -Commands.addxp.AwardSkill=&aEl\u00E9rt\u00E9l {0} tapasztalatot a k\u00F6vetkez\u0151ben {1}! -Commands.Ability.Off=K\u00E9pess\u00E9g haszn\u00E1lat &ckikapcsolva. -Commands.Ability.On=K\u00E9pess\u00E9g haszn\u00E1lat &abekapcsolva. -Commands.Ability.Toggle=K\u00E9pess\u00E9g haszn\u00E1lat kikapcsolva &e{0} +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 \u00E1ll\u00EDt\u00E1sa. +Commands.AdminToggle=&a- Admin chat állítása. Commands.Chat.Console=*Konzol* -Commands.Cooldowns.Header=&6--= &amcMMO K\u00E9pess\u00E9g V\u00E1rakoz\u00E1sok&6 =-- -Commands.Cooldowns.Row.N=\ &c{0}&f - &6{1} m\u00E1sodperc maradt -Commands.Cooldowns.Row.Y=\ &b{0}&f - &2K\u00E9szen \u00E1ll! -Commands.Database.CooldownMS=V\u00E1rnod kell {0} ezredm\u00E1sodpercet, miel\u0151tt ism\u00E9t haszn\u00E1lod a parancsot. -Commands.Database.Cooldown=V\u00E1rnod kell {0} m\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= &cA 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 &e{0} +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\u00F3d nincs enged\u00E9lyezve ebben a vil\u00E1gban (L\u00E1sd jogosults\u00E1gok) -Commands.GodMode.Toggle=Isten m\u00F3d \u00E1t\u00E1ll\u00EDtva &e{0} -Commands.Healthbars.Changed.HEARTS=[mcMMO] Az \u00E9l\u0151l\u00E9nyek \u00E9leter\u0151cs\u00EDkj\u00E1nak megjelen\u00EDt\u00E9se \u00E1t\u00E1ll\u00EDtva a k\u00F6vetkez\u0151re:&cSz\u00EDvek&f. -Commands.Healthbars.Changed.BAR=[mcMMO] Az \u00E9l\u0151l\u00E9nyek \u00E9leter\u0151cs\u00EDkj\u00E1nak megjelen\u00EDt\u00E9se \u00E1t\u00E1ll\u00EDtva a k\u00F6vetkez\u0151re: &eDobozok&f. -Commands.Healthbars.Changed.DISABLED=[mcMMO] Az \u00E9l\u0151l\u00E9nyek \u00E9leter\u0151cs\u00EDkja sz\u00E1modra &7kikapcsolva&f. -Commands.Healthbars.Invalid=Nem megfelel\u0151 \u00E9leter\u0151cs\u00EDk t\u00EDpus! -Commands.Inspect= &a- R\u00E9szletesebb inform\u00E1ci\u00F3k a j\u00E1t\u00E9kosr\u00F3l -Commands.Invite.Success=&aA megh\u00EDv\u00E1s sikeresen elk\u00FCldve. +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\u00F3d \u00E1ll\u00EDt\u00E1sa -Commands.mchud.Invalid=Ez nem megfelel\u0151 HUD t\u00EDpus. -Commands.mcpurge.Success=&aAz adatb\u00E1zis sikeresen megtiszt\u00EDtva! -Commands.mcrank.Heading=&6-=SZEM\u00C9LYES RANGSOR=- -Commands.mcrank.Overall=\u00D6sszes\u00EDtett&a - &6Szint &f#&a{0} -Commands.mcrank.Player=&eHelyez\u00E9s &f{0} +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\u00E9pess\u00E9ge ism\u00E9t haszn\u00E1lhat\u00F3. -Commands.mcremove.Success=&a{0} sikeresen t\u00F6r\u00F6lve az adatb\u00E1zisb\u00F3l! -Commands.mctop.Tip=&6Tip: Haszn\u00E1ld a &c/mcrank&6 parancsot, hogy megn\u00E9zd a szem\u00E9lyes szintjeid! -Commands.mmoedit=[player] &a - C\u00E9lpont m\u00F3dos\u00EDt\u00E1sa -Commands.mmoedit.AllSkills.1=&aMinden k\u00E9pess\u00E9g szintje {0}-ra/re lett \u00E1ll\u00EDtva! -Commands.mmoedit.Modified.1=&aA 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=&7Konvert\u00E1l\u00E1s megkezd\u00E9se a {0}-b\u00F3l az {1}-be... -Commands.mcconvert.Database.Finish=&7Adatb\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:&a{0} -Commands.mcconvert.Experience.Invalid=Ismeretlen k\u00E9plet! L\u00E9tez\u0151 k\u00E9pletek t\u00EDpusai: &aLINE\u00C1RIS &c\u00E9s &aEXPONENCI\u00C1LIS. -Commands.mcconvert.Experience.Same=M\u00E1r a {0} k\u00E9plett\u00EDpust haszn\u00E1lod. -Commands.mcconvert.Experience.Start=&7Konvert\u00E1l\u00E1s megkezd\u00E9se a/az {0} g\u00F6rb\u00E9b\u0151l a/az {1} g\u00F6rb\u00E9be. -Commands.mcconvert.Experience.Finish=&7K\u00E9plet konvert\u00E1l\u00E1s elk\u00E9sz\u00FClt; mostant\u00F3l a/az {0} XP g\u00F6rbe van haszn\u00E1latban. -Commands.ModDescription=&a- 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 &ckikapcsolva. -Commands.Notifications.On=K\u00E9pess\u00E9g \u00E9rtes\u00EDt\u00E9s &abekapcsolva. -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=&8N\u00C9V: &f{0} {1} &8SZINT: &3{2} -Commands.Party.Status.Alliance=&8SZ\u00D6VETS\u00C9GES: &f{0} -Commands.Party.UnlockedFeatures=&8Feloldott Funkci\u00F3k: &7&o{0} -Commands.Party.ShareMode=&8Osztoz\u00E1s m\u00F3d: -Commands.Party.ItemShare=&7T\u00C1RGY &3({0}) +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\u00E1rgyak Megoszt\u00E1sa: &7&o{0} -Commands.Party.MembersNear=&8A K\u00D6ZELEDBEN &3{0}&8/&3{1} -Commands.Party.Accept=&a- Party felk\u00E9r\u00E9s elfogad\u00E1sa +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\u00E9r\u00E9st kapt\u00E1l a(z) {0}-ba/be {1}-t\u00F3l/t\u0151l. -Commands.Party.Invite.1=&e\u00CDrd be, hogy &a/party accept&e a megh\u00EDv\u00E1s elfogad\u00E1s\u00E1hoz. -Commands.Party.Invite=&a- Party megh\u00EDv\u00E1s k\u00FCld\u00E9se. -Commands.Party.Invite.Accepted=&aMegh\u00EDv\u00E1s elfogadva. Bel\u00E9pt\u00E9l a(z) {0} partyba. -Commands.Party.Join=&7Bel\u00E9pt\u00E9l a partyba: {0} +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\u00EDvni &e{0}&c-t ide &a{1}&c mert m\u00E1r van &3{2}&c j\u00E1t\u00E9kos bent! -Commands.Party.PartyFull.InviteAccept=Nem lehet bel\u00E9pni ide &a{0}&c mert m\u00E1r van &3{1}&c j\u00E1t\u00E9kos bent! -Commands.Party.Create=&7Elk\u00E9sz\u00EDtetted: {0} -Commands.Party.Rename=&7Party n\u00E9v megv\u00E1ltoztatva: &f{0}-ra/re. -Commands.Party.SetSharing=&7Party {0} osztoz\u00E1s be\u00E1ll\u00EDtva: &3{1}-ra/re. -Commands.Party.ToggleShareCategory=&7Party t\u00E1rgy megoszt\u00E1s a &6{0}-ra/re &7be\u00E1ll\u00EDtva &3{1}-ra/re. -Commands.Party.AlreadyExists=&4A {0} party m\u00E1r l\u00E9tezik! -Commands.Party.Kick=&cKi lett\u00E9l r\u00FAgva a {0} partyb\u00F3l! +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\u00E1sa. -Commands.Party.Teleport=&a- party taghoz val\u00F3 teleport\u00E1l\u00E1s. -Commands.Party.Toggle=&a- party Chat ki/be kapcsol\u00E1sa -Commands.Party1=&a- \u00DAj party l\u00E9trehoz\u00E1sa. -Commands.Party2=&a- Egy j\u00E1t\u00E9kos partyj\u00E1hoz val\u00F3 csatlakoz\u00E1s. -Commands.Party.Alliance.Header=&c-----[]&aPARTY SZ\u00D6VETS\u00C9G&c[]----- -Commands.Party.Alliance.Ally=&f{0} &8SZ\u00D6VETS\u00C9GES VELE: &f{1} -Commands.Party.Alliance.Members.Header=&c-----[]&aSZ\u00D6VETS\u00C9G TAGJAI:&c[]----- -Commands.Party.Alliance.Invite.0=FIGYELEM: &aA {0} partyhoz sz\u00F6vets\u00E9g megh\u00EDv\u00E1st kapt\u00E1l {1}-t\u00F3l/t\u0151l. -Commands.Party.Alliance.Invite.1=\u00CDrd be, hogy &a/party alliance accept&e a megh\u00EDv\u00E1s elfogad\u00E1s\u00E1hoz. -Commands.Party.Alliance.Invite.Accepted=&aSz\u00F6vets\u00E9g megh\u00EDv\u00E1s elfogadva. -Commands.Party.Alliance.None=&cA partydnak nincsenek sz\u00F6vets\u00E9gesei. -Commands.Party.Alliance.AlreadyAllies=&cA partydnak m\u00E1r van egy sz\u00F6vets\u00E9gese. Sz\u00F6vets\u00E9g felbont\u00E1sa: &3/party alliance disband -Commands.Party.Alliance.Help.0=&cEz a party m\u00E9g nem szerzett sz\u00F6vets\u00E9gest. H\u00EDvj meg egy party vezet\u0151t. -Commands.Party.Alliance.Help.1=&c sz\u00F6vets\u00E9g l\u00E9trehoz\u00E1sa: &3/party alliance invite &c. -Commands.ptp.Enabled=Party teleport\u00E1l\u00E1s &aenged\u00E9lyezve. -Commands.ptp.Disabled=Party teleport\u00E1l\u00E1s &cletiltva. -Commands.ptp.NoRequests=&cJelenleg nincs teleport felk\u00E9r\u00E9sed. -Commands.ptp.NoWorldPermissions=&c[mcMMO] Nincs jogod a {0} vil\u00E1gba teleport\u00E1lni. -Commands.ptp.Request1=&e{0} &ateleport felk\u00E9r\u00E9st k\u00FCld\u00F6tt. -Commands.ptp.Request2=&aTeleport\u00E1l\u00E1shoz \u00EDrd be, hogy &e/ptp accept&a. A felk\u00E9r\u00E9s lej\u00E1r &c{0} &a m\u00E1sodperc m\u00FAlva. -Commands.ptp.AcceptAny.Enabled=Party teleport felk\u00E9r\u00E9s meger\u0151s\u00EDt\u00E9se &aenged\u00E9lyezve. -Commands.ptp.AcceptAny.Disabled=Party teleport felk\u00E9r\u00E9s meger\u0151s\u00EDt\u00E9se &cletiltva. -Commands.ptp.RequestExpired=&cA party teleport felk\u00E9r\u00E9s lej\u00E1rt. -Commands.PowerLevel.Leaderboard=&e--mcMMO&9 Er\u0151 Szint &eToplista-- -Commands.PowerLevel.Capped=&4ER\u0150 SZINT: &a{0} &4MAX SZINT: &e{1} -Commands.PowerLevel=&4ER\u0150 SZINT: &a{0} -Commands.Reset.All=&aMinden k\u00E9pess\u00E9ged sikeresen null\u00E1zva. -Commands.Reset.Single=&aA {0} k\u00E9pess\u00E9ged szintje sikeresen null\u00E1zva. -Commands.Reset=&a- K\u00E9pess\u00E9g szintj\u00E9nek null\u00E1z\u00E1sa. -Commands.Scoreboard.Clear=&3mcMMO scoreboard elt\u00FCntetve. -Commands.Scoreboard.NoBoard=&cAz mcMMO scoreboard nem akt\u00EDv. -Commands.Scoreboard.Keep=&3Az mcMMO scoreboard l\u00E1that\u00F3 marad, az elt\u00FCntet\u00E9shez haszn\u00E1ld a &a/mcscoreboard clear&3 parancsot. -Commands.Scoreboard.Timer=&3Az mcMMO scoreboard &6{0}&3 m\u00E1sodperc m\u00FAlva t\u00F6rl\u0151dik. -Commands.Scoreboard.Help.0=&6 == &aSeg\u00EDts\u00E9g: &c/mcscoreboard&6 == -Commands.Scoreboard.Help.1=&3/mcscoreboard&b clear &f - az mcMMO scoreboard elt\u00FCntet\u00E9se. -Commands.Scoreboard.Help.2=&3/mcscoreboard&b keep &f - az mcMMO scoreboard fenntart\u00E1sa. -Commands.Scoreboard.Help.3=&3/mcscoreboard&b time [n] &f - az mcMMO scoreboard elt\u00FCntet\u00E9se &dn&f m\u00E1sodperc m\u00FAlva. -Commands.Scoreboard.Tip.Keep=&6Tipp: Haszn\u00E1ld a &c/mcscoreboard keep&6 parancsot, m\u00EDg l\u00E1that\u00F3 a scoreboard, hogy ne t\u0171nj\u00F6n el. -Commands.Scoreboard.Tip.Clear=&6Tipp: Haszn\u00E1ld a &c/mcscoreboard clear&6 parancsot, hogy elt\u00FCntesd a scoreboard-ot. -Commands.XPBar.Reset=&6Az XP s\u00E1v be\u00E1ll\u00EDt\u00E1sok az mcMMO-hoz vissza\u00E1ll\u00EDtva. -Commands.XPBar.SettingChanged=&6XP s\u00E1v be\u00E1ll\u00EDt\u00E1sok &a{0}&6-nak/nek be\u00E1ll\u00EDtve erre &a{1} -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.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\u00E9pess\u00E9g r\u00E9szletes le\u00EDr\u00E1s\u00E1nak megtekint\u00E9se. -Commands.Stats=&a- Az mcMMO statisztik\u00E1k megtekint\u00E9se. -Commands.ToggleAbility=&a- K\u00E9pess\u00E9g kapcsol\u00E1sa jobb kattint\u00E1ssal. -Commands.Usage.0=&cA helyes haszn\u00E1lat: /{0} -Commands.Usage.1=&cA helyes haszn\u00E1lat: /{0} {1} -Commands.Usage.2=&cA helyes haszn\u00E1lat: /{0} {1} {2} -Commands.Usage.3=&cA helyes haszn\u00E1lat: /{0} {1} {2} {3} -Commands.Usage.3.XP=&cA helyes haszn\u00E1lat: /{0} {1} {2} {3}&7 (Ha be\u00EDrod a -s param\u00E9tert a parancs v\u00E9g\u00E9re, akkor a parancs \u00FAgy fut le, hogy j\u00E1t\u00E9kos nem kap r\u00F3la inform\u00E1ci\u00F3t, hat\u00E9k\u00E1nyan elrejtve ezt) +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 @@ -732,409 +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.Mystery=&7M\u00E9g nem oldottad fel ezt a k\u00E9pess\u00E9get, de ha igen, akkor el tudod olvasni a r\u00E9szleteket itt! -Commands.MmoInfo.NoMatch=Ez az alk\u00E9pess\u00E9g nem l\u00E9tezik! -Commands.MmoInfo.Header=&3-=[]=====[]&6 MMO Inf\u00F3 &3[]=====[]=- -Commands.MmoInfo.SubSkillHeader=&6N\u00E9v:&e {0} -Commands.MmoInfo.DetailsHeader=&3-=[]=====[]&a R\u00E9szletek &3[]=====[]=- -Commands.MmoInfo.OldSkill=&7Az 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=&3-=[]=====[]&6 Mechanik\u00E1k &3[]=====[]=- -Commands.MmoInfo.Stats=STATISZTIK\u00C1K: {0} -Commands.Mmodebug.Toggle=Az mcMMO hibakeres\u0151 m\u00F3d most m\u00E1r &6{0}&7, 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=&cJelenleg nincsenek megh\u00EDv\u00E1said. -mcMMO.NoPermission=&4Nincs enged\u00E9lyed. -mcMMO.NoSkillNote=&8Ha 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=&cA megfelel\u0151 haszn\u00E1lat &3{0} [jelsz\u00F3]. -Party.Help.1=&cParty l\u00E9trehoz\u00E1s\u00E1\u00E9rt haszn\u00E1ld &3{0} [jelsz\u00F3]. -Party.Help.2=&cHaszn\u00E1ld &3{0} &c t\u00F6bb inform\u00E1ci\u00F3\u00E9rt. -Party.Help.3=&cHaszn\u00E1ld &3{0} [jelsz\u00F3] &c a csatlakoz\u00E1shoz, vagy &3{1} &c a kil\u00E9p\u00E9shez. -Party.Help.4=&cHaszn\u00E1ld hogy z\u00E1rolhasd/feloldhasd a partyt: &3{0} -Party.Help.5=&cParty jelsz\u00F3 megad\u00E1s\u00E1hoz haszn\u00E1ld: &3{0} -Party.Help.6=&cEgy j\u00E1t\u00E9kos kir\u00FAg\u00E1s\u00E1hoz haszn\u00E1ld: &3{0} -Party.Help.7=&cA party tulajdonjog\u00E1nak \u00E1truh\u00E1z\u00E1s\u00E1hoz haszn\u00E1ld: &3{0} -Party.Help.8=&cHogy feloszlasd a partyt, haszn\u00E1ld: &3{0} -Party.Help.9=&cHaszn\u00E1ld &3{0} &chogy enged\u00E9lyezd a t\u00E1rgy megoszt\u00E1s\u00E1t a party tagokkal. -Party.Help.10=&cHaszn\u00E1ld &3{0} &chogy enged\u00E9lyezd az XP megoszt\u00E1s\u00E1t a party tagokkal. +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\u00E9pett a partyb\u00F3l! -Party.InformedOnNameChange=&6{0} &aA party neve sikeresen megv\u00E1ltoztatva erre:&f{1} +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\u00EDvhatod meg magad! -Party.IsLocked=&cA party m\u00E1r le van z\u00E1rva! -Party.IsntLocked=&cEz a party nincs z\u00E1rva! -Party.Locked=&cA party z\u00E1rva, csak a vezet\u0151 tud megh\u00EDvni! +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\u0151je! -Party.Target.NotOwner=&4{0} nem party vezet\u0151. -Party.Owner.New=&a{0} az \u00FAj party vezet\u0151. -Party.Owner.NotLeader=&4Mostant\u00F3l nem te vagy a party vezet\u0151je. -Party.Owner.Player =&aTe vagy a party vezet\u0151je. -Party.Password.None=&cEz a party jelsz\u00F3val v\u00E9dett. Adj meg jelsz\u00F3t a csatlakoz\u00E1shoz. -Party.Password.Incorrect=&cNem egyezik a party jelsz\u00F3! -Party.Password.Set=&aA party jelsz\u00F3 be\u00E1ll\u00EDtva: {0} -Party.Password.Removed=&aparty jelsz\u00F3 t\u00F6r\u00F6lve. -Party.Player.Invalid=&cNincs ilyen j\u00E1t\u00E9kos! -Party.NotOnline=&4{0} nem el\u00E9rhet\u0151! -Party.Player.InSameParty={0} m\u00E1r a partydban van! +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\u00E1lhatsz halott j\u00E1t\u00E9koshoz! -Party.Teleport.Hurt=&cAz elm\u00FAlt {0} m\u00E1sodpercben s\u00E9r\u00FClt meg, \u00E9s nem tud teleport\u00E1lni. -Party.Teleport.Player=&aHozz\u00E1 teleport\u00E1lt\u00E1l: {0}. -Party.Teleport.Self=&cNem teleport\u00E1lhatsz magadhoz! -Party.Teleport.Target=&a{0} hozz\u00E1d teleport\u00E1lt. -Party.Teleport.Disabled=&c{0} nincs enged\u00E9lyezve a party teleport\u00E1l\u00E1s! -Party.Rename.Same=&cEz m\u00E1r a partyd neve! +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\u00F3l sz\u00F6vets\u00E9gben van vel\u00FCk: &a{0} -Party.Alliance.Disband=&7A p\u00E1rtod nem sz\u00F6vets\u00E9ges t\u00F6bb\u00E9 vel\u00FCk: &c{0} -Party.Status.Locked=&4(MEGH\u00CDV\u00C1S) +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\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=&cA party t\u00E1rsalg\u00F3 m\u00E9g nem nyitott. -Party.Feature.Disabled.2=&cA party teleport\u00E1l\u00E1s m\u00E9g nem nyitott. -Party.Feature.Disabled.3=&cA party sz\u00F6vets\u00E9g m\u00E9g nem nyitott. -Party.Feature.Disabled.4=&cA party t\u00E1rgy megoszt\u00E1s m\u00E9g nem nyitott. -Party.Feature.Disabled.5=&cA party XP megoszt\u00E1s m\u00E9g nem nyitott. +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=&8XP NYERES\u00C9G: &f{0} -Commands.xplock.locked=&6Az XP s\u00E1v most le van z\u00E1rva {0}! -Commands.xplock.unlocked=&6Az XP s\u00E1v most &aFELOLDVA&6! -Commands.xprate.modified=&cAz XP AR\u00C1NYA m\u00F3dosult {0} -Commands.xprate.over=&cmcMMO XP szorz\u00F3 esem\u00E9ny V\u00C9GE! -Commands.xprate.proper.0=&cAz XP sebess\u00E9g v\u00E1ltoztat\u00E1s\u00E1nak megfelel\u0151 haszn\u00E1lata: /xprate -Commands.xprate.proper.1=&cAz XP-alap\u00E9rtelmezett \u00E9rt\u00E9k helyes vissza\u00E1ll\u00EDt\u00E1sa: /xprate reset -Commands.xprate.proper.2=&cAdjon 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.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\u00E9ge! -Commands.Event.Stop.Subtitle=&aRem\u00E9lem j\u00F3l \u00E9rezted magad! -Commands.Event.XP=&3Az XP szorz\u00F3 &6{0}&3x! -Commands.xprate.started.0=&6mcMMO XP szorz\u00F3 esem\u00E9ny kezd\u0151d\u00F6tt! -Commands.xprate.started.1=&6mcMMO XP Ar\u00E1nya most: {0}x! +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=&e[Szerver] -Notifications.Admin.XPRate.Start.Self=&7Be\u00E1ll\u00EDtottad a glob\u00E1lis XP szorz\u00F3t erre &6{0}x -Notifications.Admin.XPRate.End.Self=&7Megszak\u00EDtottad az XP szorz\u00F3 eventet. -Notifications.Admin.XPRate.End.Others={0} &7megszak\u00EDtotta az XP szorz\u00F3 eventet. -Notifications.Admin.XPRate.Start.Others={0} &7elind\u00EDtotta vagy m\u00F3dos\u00EDtotta az XP szorz\u00F3 eventet glob\u00E1lis {1}x szorz\u00F3val +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=&6mcMMO 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=&7A {0} seg\u00EDts\u00E9g el\u00E9rhet\u0151 - haszn\u00E1lat: /{1} ? [oldal] -Guides.Header=&6-=&a{0} Seg\u00EDts\u00E9g&6=- -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=&3Az akrobatik\u00E1r\u00F3l:\n&eAz akrobatika a kecses mozg\u00E1s m\u0171v\u00E9szete az mcMMO-ban.\n&eHarci \u00E9s k\u00F6rnyezeti b\u00F3nuszokkal l\u00E1t el.\n\n&3TAPASZTALAT SZERZ\u00C9S:\n&eHogy tapasztalathoz juss ebben a k\u00E9pess\u00E9gben, kit\u00E9r\u00E9st kell v\u00E9grehajtanod \n&eharcban, vagy olyan es\u00E9seket t\u00FAl\u00E9lned, amelyek sebz\u00E9st okoznak. -Guides.Acrobatics.Section.1=&3Hogyan m\u0171k\u00F6dik a Gurul\u00E1s?\n&ePassz\u00EDv es\u00E9lyed van arra, hogy a sz\u00E1modra sebz\u00E9st okoz\u00F3 landol\u00E1sokn\u00E1l, \n&eneg\u00E1ld a s\u00E9r\u00FCl\u00E9st. A guggol\u00E1s lenyomva tart\u00E1sa es\u00E9s k\u00F6zben \n&e megdupl\u00E1zza az es\u00E9lyeidet.\n&eIlyenkor a sima gurul\u00E1s helyett Kecses Gurul\u00E1st hajthatsz v\u00E9gre.\n&eA Kecses Gurul\u00E1s nagyban hasonl\u00EDt a sima gurul\u00E1shoz, azzal a k\u00FCl\u00F6nbs\u00E9ggel, \n&ehogy k\u00E9tszer olyan val\u00F3sz\u00EDn\u0171, \u00E9s nagyobb v\u00E9delmet ny\u00FAjt.\n&eA gurul\u00E1s es\u00E9lye a k\u00E9pess\u00E9ged szintj\u00E9t\u0151l f\u00FCgg. -Guides.Acrobatics.Section.2=&3Hogyan m\u0171k\u00F6dik a Kit\u00E9r\u00E9s?\n&eA kit\u00E9r\u00E9s passz\u00EDv es\u00E9lyt ad arra, \n&eharcban val\u00F3 s\u00E9r\u00FCl\u00E9s eset\u00E9n csak a sebz\u00E9s fel\u00E9t szenvedd el.\n&eA 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=&3Az alk\u00EDmi\u00E1r\u00F3l:\n&eAz alk\u00EDmia alapja a b\u00E1jitalf\u0151z\u00E9s.\n&eGyors\u00EDtja a b\u00E1jitalf\u0151z\u00E9s folyamat\u00E1t, tov\u00E1bb\u00E1\n&elehet\u0151v\u00E9 teszi \u00FAj (eddig) megszerezhetetlen b\u00E1jitalok f\u0151z\u00E9s\u00E9t is.\n\n\n&3TAPASZTALAT SZERZ\u00C9S:\n&eTapasztalat szerz\u00E9shez nem kell m\u00E1s tenned, csak b\u00E1jitalokat f\u0151zn\u00F6d. -Guides.Alchemy.Section.1=&3Hogyan m\u0171k\u00F6dik a Katal\u00EDzis?\n&eA Katal\u00EDzis gyors\u00EDtja a b\u00E1jitalok elk\u00E9sz\u00FCl\u00E9s\u00E9t, maxim\u00E1lis \n&e 4x-es sebess\u00E9get biztos\u00EDt az 1000-es szint el\u00E9r\u00E9sekor.\n&eEz a k\u00E9pess\u00E9g a 100-as szinten old\u00F3dik fel. -Guides.Alchemy.Section.2=&3Hogyan m\u0171k\u00F6dnek a F\u0151zetek?\n&eA F\u0151zet lehet\u0151v\u00E9 teszi a b\u00E1jitalf\u0151z\u00E9st egyedi hozz\u00E1val\u00F3kkal.\n&eA hozz\u00E1val\u00F3k a \n&erangod n\u00F6veked\u00E9ssel old\u00F3dnak fel. 8 k\u00FCl\u00F6nb\u00F6z\u0151 rang van. -Guides.Alchemy.Section.3=&31-es szint\u0171 F\u0151zet hozz\u00E1val\u00F3k:\n&e\u0150rl\u00E1ngpor, Erjesztett p\u00F3kszem, Szellemk\u00F6nny, V\u00F6r\u00F6sk\u0151,\n&eIzz\u00F3k\u0151r por, Cukor, Arany dinnye, Arany r\u00E9pa,\n&eMagmakr\u00E9m, Alvil\u00E1gi bibircs\u00F3k, P\u00F3kszem, Puskapor, Tavir\u00F3zsa,\n&eG\u00F6mbhal\n&e(Alap b\u00E1jitalok) -Guides.Alchemy.Section.4=&32-es szint\u0171 F\u0151zet hozz\u00E1val\u00F3k:\n&eR\u00E9pa (Siets\u00E9g b\u00E1jital)\n&eNy\u00E1lkagoly\u00F3 (F\u00E1radts\u00E1g b\u00E1jital)\n\n&33-as szint\u0171 F\u0151zet hozz\u00E1val\u00F3k:\n&eKvarc (Abszorpci\u00F3 b\u00E1jital)\n&ePiros gomba (Magasugr\u00E1s b\u00E1jital) -Guides.Alchemy.Section.5=&34-es szint\u0171 F\u0151zet hozz\u00E1val\u00F3k:\n&eAlma (\u00C9leter\u0151 n\u00F6vel\u0151 b\u00E1jital)\n&eRohadt h\u00FAs (\u00C9hs\u00E9g b\u00E1jital)\n\n&35-\u00F6s szint\u0171 F\u0151zet hozz\u00E1val\u00F3k:\n&eBarna gomba (Sz\u00E9d\u00FCl\u00E9s b\u00E1jital)\n&eTintazs\u00E1k (Vaks\u00E1g b\u00E1jitala) -Guides.Alchemy.Section.6=&36-os szint\u0171 F\u0151zet hozz\u00E1val\u00F3k:\n&eP\u00E1fr\u00E1ny (J\u00F3llakotts\u00E1g b\u00E1jital)\n\n&37-es szint\u0171 F\u0151zet hozz\u00E1val\u00F3k:\n&eM\u00E9rgez\u0151 krumpli (Elsorvad\u00E1s b\u00E1jital)\n\n&38-as szint\u0171 F\u0151zet hozz\u00E1val\u00F3k:\n&eAranyalma (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=&3Az \u00CDj\u00E1szatr\u00F3l:\n&eAz \u00CDj\u00E1szat az \u00EDjjal val\u00F3 l\u00F6v\u00E9sr\u0151l sz\u00F3l.\n&eK\u00FCl\u00F6nb\u00F6z\u0151 harci b\u00F3nuszokkal ruh\u00E1z fel, olyanokkal, mint a sebz\u00E9sn\u00F6vel\u00E9s\n&e, ami a szinteddel n\u00F6vekszik, \u00E9s m\u00E1sik elk\u00E1b\u00EDt\u00E1s\u00E1nak k\u00E9pess\u00E9g\u00E9vel.\n&e. Tov\u00E1bb\u00E1 visszaszerezheted az elhaszn\u00E1lt \n&enyilaid egy r\u00E9sz\u00E9t az ellens\u00E9geid holttest\u00E9b\u0151l.\n\n\n&3TAPASZTALAT SZERZ\u00C9S:\n&eA tapasztalat szerz\u00E9shez \u00E9l\u0151l\u00E9nyeket vagy \n&ej\u00E1t\u00E9kosokat kell l\u0151n\u00F6d \u00EDjjal. -Guides.Archery.Section.1=&3Hogyan m\u0171k\u00F6dik a Pontos L\u00F6v\u00E9s?\n&eA Pontos L\u00F6v\u00E9s n\u00F6veli a l\u00F6ved\u00E9keid sebz\u00E9s\u00E9t.\n&eA b\u00F3nusz sebz\u00E9s az \n&e\u00CDj\u00E1szat szintedt\u0151l f\u00FCgg.\n&eAlapvet\u0151en a b\u00F3nusz sebz\u00E9sed 10%-kal n\u00F6vekszik\n&eminden 50. szinten, ami a maxim\u00E1lis 200%-os b\u00F3nusz sebz\u00E9shez vezet. -Guides.Archery.Section.2=&3Hogyan m\u0171k\u00F6dik a K\u00E1b\u00EDt\u00E1s?\n&ePassz\u00EDv es\u00E9lyed van elk\u00E1b\u00EDtani m\u00E1s j\u00E1t\u00E9kosokat, \n&emikor eltal\u00E1lod \u0151ket. Amikor a k\u00E1b\u00EDt\u00E1s betal\u00E1l, k\u00E9nyszer\u00EDti az ellenfeledet, hogy\n&er\u00F6vid id\u0151re egyenesen felfel\u00E9 n\u00E9zzen.\n&eEgy K\u00E1b\u00EDt\u00F3l\u00F6ved\u00E9k tov\u00E1bbi 4 sebz\u00E9st okoz. (2 sz\u00EDv). -Guides.Archery.Section.3=&3Hogyan m\u0171k\u00F6dik a ny\u00EDlvessz\u0151 visszaszerz\u00E9se?\n&ePassz\u00EDv es\u00E9lyed van visszaszerezni az elhaszn\u00E1lt ny\u00EDlvessz\u0151idet\n&e, amikor meg\u00F6lsz egy \u00E9l\u0151l\u00E9nyt az \u00EDjaddal.\n&eEnnek az es\u00E9lye az \u00CDj\u00E1szat szinteddel egy\u00FCtt n\u00F6vekszik.\n&eAlapvet\u0151en 0.1%-kal n\u00F6vekszik szintenk\u00E9nt, ami a maxim\u00E1lis 100%-hoz vezet\n&e 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=&3A Balt\u00E1szatr\u00F3l:\n&eA Balt\u00E1szattal sokkal t\u00F6bb dologra is\n&ehaszn\u00E1lhatod a balt\u00E1dat, mint a fav\u00E1g\u00E1s! Meg\u00FCthetsz j\u00E1t\u00E9kosokat \u00E9s \u00E9l\u0151l\u00E9nyeket, \n&ehogy tapasztalatot szerezz, az \u00E9l\u0151l\u00E9nyekre a\n&eh\u00E1tral\u00F6k\u00E9s, m\u00EDg a j\u00E1t\u00E9kosokra egyar\u00E1nt a Hal\u00E1los Kritikus Csap\u00E1s k\u00E9pess\u00E9g\u00E9t haszn\u00E1lhatod.\n&eA Balt\u00E1d egy k\u00E9zi fa apr\u00EDt\u00F3v\u00E1 v\u00E1lik,\n&eami megsemmis\u00EDti ellens\u00E9ged p\u00E1nc\u00E9lzat\u00E1t a szinted n\u00F6veked\u00E9s\u00E9vel. \n&3TAPASZTALAT SZERZ\u00C9S:\n&eTapasztalat szerz\u00E9shez nem kell m\u00E1st tenned, mint j\u00E1t\u00E9kosokat \u00E9s \u00E9l\u0151l\u00E9nyeket \n&ecsapkodnod a Balt\u00E1ddal. -Guides.Axes.Section.1=&3Hogyan m\u0171k\u00F6dik a Koponya T\u00F6r\u00E9s?\n&eTer\u00FCleti hat\u00E1s\u00FA sebz\u00E9st tudsz kiosztani.\n&eA ter\u00FCleti sebz\u00E9s a f\u0151 c\u00E9lpontodnak okozott sebz\u00E9s\n&efel\u00E9vel egyenl\u0151, teh\u00E1t t\u00F6k\u00E9letes nagy sz\u00F6rnyhord\u00E1k kipuszt\u00EDt\u00E1s\u00E1ra. -Guides.Axes.Section.2=&3Hogyan m\u0171k\u00F6dik a Kritikus Csap\u00E1s?\n&eA Kritikus Csap\u00E1sok passz\u00EDv es\u00E9lyt biztos\u00EDtanak a \n&ej\u00E1t\u00E9kosnak b\u00F3nusz sebz\u00E9s kioszt\u00E1s\u00E1ra.\n&eAlapvet\u0151en minden m\u00E1sodik Balt\u00E1szat szinttel \n&e0.1%-kal n\u00F6vekszik a Kritikus Csap\u00E1sok es\u00E9lye, Ezzel maxim\u00E1lisan 2x-es sebz\u00E9st okozhatsz \u00E9l\u0151l\u00E9nyeknek,\n&evagy 1.5x-es sebz\u00E9st j\u00E1t\u00E9kosoknak. -Guides.Axes.Section.3=&3Hogyan m\u0171k\u00F6dik a Balta Mesters\u00E9ge?\n&eA Balt\u00E1szat Mesters\u00E9ge passz\u00EDvan b\u00F3nusz sebz\u00E9st biztos\u00EDt\n&e a csap\u00E1saidnak Balta haszn\u00E1lata eset\u00E9n.\n&eAlapvet\u0151en a b\u00F3nusz 1-el n\u00F6vekszik minden 50. szint ut\u00E1n,\n&eamely a 200-as szinten \u00E9ri el a maximum\u00E1t, a 4 b\u00F3nusz sebz\u00E9st. -Guides.Axes.Section.4=&3Hogyan m\u0171k\u00F6dik a P\u00E1nc\u00E9lt\u00F6r\u00E9s?\n&eOlyan er\u0151s \u00FCt\u00E9ssel s\u00FAjtasz le, amely \u00F6sszet\u00F6ri ellenfeleid p\u00E1nc\u00E9lzat\u00E1t!\n&eA P\u00E1nc\u00E9lt\u00F6r\u00E9s passz\u00EDv es\u00E9lyt ad az ellenfeled p\u00E1nc\u00E9lj\u00E1nak \n&emegsebz\u00E9s\u00E9hez. Ez a sebz\u00E9s a Balt\u00E1szat szinteddel n\u00F6vekszik. -Guides.Axes.Section.5=&3Hogyan m\u0171k\u00F6dik az Er\u0151s \u00DCt\u00E9s?\n&ePassz\u00EDv es\u00E9lyed van Er\u0151s \u00DCt\u00E9ssel lecsapni \n&e\u00E9l\u0151l\u00E9nyekre \u00E9s j\u00E1t\u00E9kosokra Balta haszn\u00E1lata eset\u00E9n.\n&eAlapvet\u0151en ez az es\u00E9ly 25%. Ez a k\u00E9pess\u00E9g egy hatalmas\n&eh\u00E1tral\u00F6k\u00E9s effektussal b\u00EDr, hasonl\u00F3an a H\u00E1tral\u00F6k\u00E9s II \n&evar\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=&3Az \u00C1s\u00E1sr\u00F3l:\n&eAz \u00C1s\u00E1ssal kincseket tal\u00E1lhatsz a f\u00F6ldben.\n&eMin\u00E9l tov\u00E1bb csin\u00E1lod, ann\u00E1l t\u00F6bb kincsre tehetsz szert.\n\n&3TAPASZTALAT SZERZ\u00C9S:\n&eTapasztalat szerz\u00E9shez \u00C1s\u00F3val kell felt\u00E1rnod a f\u00F6ldet.\n&eCsak bizonyos anyagok ki\u00E1s\u00E1s\u00E9rt kaphatsz kincseket \u00E9s tapasztalatot. -Guides.Excavation.Section.1=&3Kompatibilis Anyagok:\n&eF\u00FCves blokk, F\u00F6ld, Homok, Agyag, S\u00F3der, Gombafonal, L\u00E9lekhomok, H\u00F3 -Guides.Excavation.Section.2=&3Hogyan m\u0171k\u00F6dik a Giga F\u00FAr\u00F3-T\u00F6r\u0151:\n&eJobb klikkelj \u00E1s\u00F3val a kezedben, hogy el\u0151k\u00E9sz\u00EDtsd az \u00E1s\u00F3dat.\n&eEbben a m\u00F3dban tov\u00E1bb\u00E1 4 m\u00E1sodperc \u00E1ll a rendelkez\u00E9sedre, hogy\n&ekapcsolatba l\u00E9pj valamely \u00C1s\u00E1ssal kompatibilis anyaggal a\n&eGiga F\u00FAr\u00F3-T\u00F6r\u0151 aktiv\u00E1l\u00E1s\u00E1hoz. -Guides.Excavation.Section.3=&3Mi is az a Giga F\u00FAr\u00F3-T\u00F6r\u0151?\n&eA Giga F\u00FAr\u00F3-T\u00F6r\u0151 egy v\u00E1rakoz\u00E1si id\u0151vel rendelkez\u0151 k\u00E9pess\u00E9g, \n&eamely az \u00C1s\u00E1shoz kapcsol\u00F3dik. Megtripl\u00E1zza a \n&ekincs tal\u00E1l\u00E1s es\u00E9ly\u00E9t, \u00E9s instant ki\u00FCti az\n&e\u00C1s\u00E1ssal kompatibilis anyagokat. -Guides.Excavation.Section.4=&3Hogyan m\u0171k\u00F6dik a R\u00E9g\u00E9szet?\n&eMinden lehets\u00E9ges kincsnek van egy \n&ebizonyos k\u00E9pess\u00E9g szint k\u00F6vetelm\u00E9nye.\n&eMin\u00E9l nagyobb az \u00C1s\u00E1s szinted, ann\u00E1l\n&et\u00F6bb kincset tal\u00E1lhatsz.\n&eMinden \u00C1s\u00E1ssal kompatibilis anyagnak van egy egyedi\n&ekincses list\u00E1ja.\n&eM\u00E1s sz\u00F3val m\u00E1s kincsekre tehetsz szert p\u00E9ld\u00E1ul F\u00F6ld ki\u00E1s\u00E1sn\u00E1l,\n&emint a S\u00F3dern\u00E9l. -Guides.Excavation.Section.5=&3Megjegyz\u00E9sek az \u00C1s\u00E1sr\u00F3l:\n&eA kincsek teljesen testreszabhat\u00F3ak,\n&eez\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=&3A Horg\u00E1szatr\u00F3l:\n&eEzzel a k\u00E9pess\u00E9ggel a horg\u00E1sz\u00E1s ism\u00E9t izgalmas!\n&eTal\u00E1lj rejtett kincseket, vagy r\u00E1zz le t\u00E1rgyakat a \u00E9l\u0151l\u00E9nyekr\u0151l.\n\n&3Tapasztalatszerz\u00E9s:\n&eHorg\u00E1ssz. -Guides.Fishing.Section.1=&3Hogyan m\u0171k\u00F6dik a kincsvad\u00E1szat?\n&eEz a k\u00E9pess\u00E9g lehet\u0151v\u00E9 teszi, hogy kincset tal\u00E1lj horg\u00E1sz\u00E1s k\u00F6zben, \n&ealacsony es\u00E9llyel fejlesztett t\u00E1rgyakra.\n&eMinden lehets\u00E9ges kincs a horg\u00E1sz\u00E1sban szintt\u0151l f\u00FCggetlen\u00FCl kifoghat\u00F3\n&e Azonban a kifog\u00E1s es\u00E9lye f\u00FCgg att\u00F3l, hogy a t\u00E1rgy milyen ritkas\u00E1g\u00FA.\n&eMin\u00E9l nagyobb a horg\u00E1sz\u00E1s szinted, ann\u00E1l nagyobb es\u00E9lyed van jobb kincseket tal\u00E1lni. -Guides.Fishing.Section.2=&3Hogyan m\u0171k\u00F6dik a j\u00E9ghorg\u00E1szat?\n&eEz a passz\u00EDv k\u00E9pess\u00E9g lehet\u0151v\u00E9 teszi, hogy befagyott tavakban horg\u00E1ssz!\n&eHaszn\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=&3Hogyan m\u0171k\u00F6dik a Mester Horg\u00E1szat?\n&eEz a passz\u00EDv k\u00E9pess\u00E9g n\u00F6veli a fog\u00E1s es\u00E9ly\u00E9t horg\u00E1szat k\u00F6zben.\n&eMiut\u00E1n feloldottad ezt a k\u00E9pess\u00E9get, jav\u00EDtja a halak fog\u00E1s\u00E1nak es\u00E9ly\u00E9t, ha cs\u00F3nakban horg\u00E1szol. -Guides.Fishing.Section.4=&3Hogyan m\u0171k\u00F6dik a ler\u00E1z\u00E1s?\n&eEz 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&eAz \u00E9l\u0151l\u00E9nyek ugyan olyan t\u00E1rgyakat dobnak, mint amit hal\u00E1lukkor.\n&eValamint lehet\u0151s\u00E9g van ezzel olyan \u00E9l\u0151l\u00E9ny fejeket is szerezni, amelyeket \u00E1ltal\u00E1ban nem lehets\u00E9ges t\u00FAl\u00E9l\u0151 m\u00F3dban. -Guides.Fishing.Section.5=&3Hogyan m\u0171k\u00F6dik a horg\u00E1sz di\u00E9ta?\n&eEz a passz\u00EDv k\u00E9pess\u00E9g n\u00F6veli az \u00E9telcs\u00EDk visszat\u00F6lt\u00E9s\u00E9t, ha halat eszel. -Guides.Fishing.Section.6=&3Tudnival\u00F3 a horg\u00E1szatr\u00F3l:\n&eA 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=&3A N\u00F6v\u00E9nytanr\u00F3l:\n&eA N\u00F6v\u00E9nytan a k\u00FCl\u00F6nf\u00E9le n\u00F6v\u00E9nyek begy\u0171jt\u00E9s\u00E9r\u0151l sz\u00F3l.\n\n\n&3TAPASZTALAT SZERZ\u00C9S:\n&eGy\u0171jts n\u00F6v\u00E9nyeket. -Guides.Herbalism.Section.1=&3Kompatibilis Anyagok:\n&eB\u00FAza, Burgonya, R\u00E9pa, Dinnye, \n&eT\u00F6k, Cukorn\u00E1d, Kaka\u00F3bab, Vir\u00E1gok, Kaktusz, Gomb\u00E1k,\n&eAlvil\u00E1gi Bibircs\u00F3k, Tavir\u00F3zsa, \u00E9s Inda. -Guides.Herbalism.Section.2=&3Hogyan m\u0171k\u00F6dik a Z\u00F6ld F\u00F6ld?\n&eA Z\u00F6ld F\u00F6ld egy aktiv\u00E1lhat\u00F3 k\u00E9pess\u00E9g, az aktiv\u00E1l\u00E1s\u00E1hoz \n&ejobb klikkelj egy kap\u00E1val a kezedben.\n&eA Z\u00F6ld F\u00F6ld megtripl\u00E1zza az arat\u00E1s\u00E9rt \n&ekapott t\u00E1rgyakat. Tov\u00E1bb\u00E1 felruh\u00E1zza a j\u00E1t\u00E9kost azzal a \n&ek\u00E9pess\u00E9ggel, hogy \u00E9letet leheljenek a blokkokba az eszk\u00F6zt\u00E1rukban l\u00E9v\u0151 magok seg\u00EDts\u00E9g\u00E9vel. -Guides.Herbalism.Section.3=&3Hogyan m\u0171k\u00F6dik a Z\u00F6ld H\u00FCvelyk (n\u00F6v\u00E9nyek)?\n&eEz a passz\u00EDv k\u00E9pess\u00E9g automatikusan vissza\u00FClteti a n\u00F6v\u00E9nyt\n&elearat\u00E1skor.\n&eEnnek az es\u00E9lye a N\u00F6v\u00E9nytan szintedt\u0151l f\u00FCgg. -Guides.Herbalism.Section.4=&3Hogyan m\u0171k\u00F6dik a Z\u00F6ld H\u00FCvelyk (Z\u00FAzottk\u0151/K\u0151t\u00E9gla/F\u00F6ld)?\n&eEz az akt\u00EDv k\u00E9pess\u00E9g \u00E1tv\u00E1ltoztatja a blokkokat a \n&e"z\u00F6ldebb" v\u00E1ltozatukk\u00E1. Ezt jobb klikkel teheted meg, mik\u00F6zben\n&emagot tartasz a kezedben. 1db magot haszn\u00E1l el blokkonk\u00E9nt. -Guides.Herbalism.Section.5=&3Hogyan m\u0171k\u00F6dik a Farmer Di\u00E9ta?\n&eEz a passz\u00EDv k\u00E9pess\u00E9g n\u00F6veli az \u00E9telcs\u00EDk visszat\u00F6lt\u00E9s\u00E9t \n&eKeny\u00E9r, S\u00FCtik, Dinnye, Gombaleves, R\u00E9pa,\n&e\u00E9s Burgonya elfogyaszt\u00E1s\u00E1n\u00E1l. -Guides.Herbalism.Section.6=&3Hogyan m\u0171k\u00F6dik a Hili\u00E1n Szerencse?\n&eEz a passz\u00EDv k\u00E9pess\u00E9g es\u00E9lyt ad ritka t\u00E1rgyak tal\u00E1l\u00E1s\u00E1ra\n&ebizonyos blokkok karddal val\u00F3 ki\u00FCt\u00E9s\u00E9n\u00E9l. -Guides.Herbalism.Section.7=&3Hogyan m\u0171k\u00F6dik a Dupla Zs\u00E1km\u00E1ny?\n&eT\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=&3A B\u00E1ny\u00E1sz\u00E1sr\u00F3l:\n&eA b\u00E1ny\u00E1sz\u00E1s k\u00F6vek \u00E9s \u00E9rcek kib\u00E1ny\u00E1sz\u00E1s\u00E1r\u00F3l sz\u00F3l. T\u00F6bb t\u00E1rgyat is kaphatsz\n&ek\u00FCl\u00F6nb\u00F6z\u0151 anyagok kib\u00E1ny\u00E1sz\u00E1s\u00E1\u00E9rt.\n\n&3TAPASZTALAT SZERZ\u00C9S:\n&eB\u00E1ny\u00E1ssz cs\u00E1k\u00E1nnyal a kezedben.\n&eCsak bizonyos blokkok adnak tapasztalatot. -Guides.Mining.Section.1=&3Kompatibilis Anyagok:\n&eK\u0151, Sz\u00E9n\u00E9rc, Vas\u00E9rc, Arany\u00E9rc, Gy\u00E9m\u00E1nt\u00E9rc, V\u00F6r\u00F6sk\u0151\u00E9rc,\n&eLazurit\u00E9rc, Obszidi\u00E1n, Moh\u00E1s Z\u00FAzottk\u0151, V\u00E9gk\u0151,\n&eIzz\u00F3k\u0151, \u00E9s Alvil\u00E1gi K\u0151. -Guides.Mining.Section.2=&3Hogyan haszn\u00E1ld a Szuper T\u00F6r\u00E9st? \n&eJobb klikkelj cs\u00E1k\u00E1nnyal a kezedben, hogy el\u0151k\u00E9sz\u00EDtsd az eszk\u00F6zt.\n&eEbben a m\u00F3dban tov\u00E1bb\u00E1 4 m\u00E1sodperc \u00E1ll a rendelkez\u00E9sedre, hogy\n&ekapcsolatba l\u00E9pj valamely B\u00E1ny\u00E1sz\u00E1ssal kompatibilis anyaggal a\n&eSzuper T\u00F6r\u0151 aktiv\u00E1l\u00E1s\u00E1hoz. -Guides.Mining.Section.3=&3Mi az a Szuper T\u00F6r\u0151?\n&eA Szuper T\u00F6r\u0151 egy v\u00E1rakoz\u00E1si id\u0151vel rendelkez\u0151 k\u00E9pess\u00E9g, \n&eamely a B\u00E1ny\u00E1sz\u00E1shoz kapcsol\u00F3dik. Megtripl\u00E1zza az \n&eextra t\u00E1rgyak tal\u00E1l\u00E1s\u00E1nak es\u00E9ly\u00E9t, \u00E9s instant ki\u00FCti a\n&eB\u00E1ny\u00E1sz\u00E1ssal kompatibilis anyagokat. -Guides.Mining.Section.4=&3Hogyan haszn\u00E1ld Robbant\u00E1sb\u00E1ny\u00E1szatot:\n&eEgy cs\u00E1k\u00E1nnyal a kezedben,\n&eguggolj, \u00E9s jobb klikkelj a TNT-re t\u00E1volr\u00F3l. Ezzel a TNT\n&eazonnal felrobban. -Guides.Mining.Section.5=&3Hogyan m\u0171k\u00F6dik a Robbant\u00E1sb\u00E1ny\u00E1szat?\n&eA Robbant\u00E1sb\u00E1ny\u00E1szat egy olyan k\u00E9pess\u00E9g, ami a b\u00E1ny\u00E1szati\n&ek\u00E9pess\u00E9ghez k\u00F6t\u0151dik. B\u00F3nuszokat ad, amikor TNT-vel b\u00E1ny\u00E1szol, \u00E9s lehet\u0151s\u00E9ged van\n&ea t\u00E1voli robbant\u00E1sra is. H\u00E1rom r\u00E9sze van a Robbant\u00E1sb\u00E1ny\u00E1szatnak.\n&eAz els\u0151 a \u201ENagyobb Robban\u00E1s\u201D, ami a robban\u00E1s hat\u00F3sugar\u00E1t n\u00F6veli.\n&eA m\u00E1sodik a \u201ERobbant\u00E1si szak\u00E9rt\u0151", ami cs\u00F6kkenti\n&ea TNT robban\u00E1s okozta k\u00E1rokat. A harmadik egyszer\u0171en csak n\u00F6veli\n&e a TNT robban\u00E1sb\u00F3l kies\u0151 \u00E9rcek mennyis\u00E9g\u00E9t \n&e\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=&3A Jav\u00EDt\u00E1sr\u00F3l:\n&eA Jav\u00EDt\u00E1s lehet\u0151v\u00E9 teszi a p\u00E1nc\u00E9l \u00E9s eszk\u00F6z\u00F6k\n&eVast\u00F6mb\u00F6n val\u00F3 jav\u00EDt\u00E1s\u00E1t.\n\n&3TAPASZTALAT SZERZ\u00C9S:\n&eJav\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=&3Hogyan haszn\u00E1lhatom a Jav\u00EDt\u00E1st?\n&eHelyezz el egy mcMMO \u00FCll\u0151t, \u00E9s jobb klikkelj r\u00E1 egy t\u00E1rggyal a jav\u00EDt\u00E1shoz.\n&eHaszn\u00E1latonk\u00E9nt 1 t\u00E1rgyat haszn\u00E1l fel. -Guides.Repair.Section.2=&3Hogyan m\u0171k\u00F6dik a Jav\u00EDt\u00E1s Mesters\u00E9ge?\n&eA Jav\u00EDt\u00E1s Mesters\u00E9ge a jav\u00EDt\u00E1s m\u00E9rt\u00E9k\u00E9t n\u00F6veli. Ez az \u00E9rt\u00E9k a \n&eJav\u00EDt\u00E1s szintedt\u0151l f\u00FCgg. -Guides.Repair.Section.3=&3Hogyan m\u0171k\u00F6dik a Szuper Jav\u00EDt\u00E1s?\n&eA Szuper Jav\u00EDt\u00E1s egy passz\u00EDv k\u00E9pess\u00E9g. T\u00E1rgyak jav\u00EDt\u00E1s\u00E1n\u00E1l,\n&ees\u00E9lyt ad a j\u00E1t\u00E9kosnak, hogy k\u00E9tszeres \n&ehat\u00E9konys\u00E1ggal jav\u00EDtson. -Guides.Repair.Section.4=&3Hogyan m\u0171k\u00F6dik a M\u00E1gikus Kov\u00E1csol\u00E1s?\n&eEz a k\u00E9pess\u00E9g lehet\u0151v\u00E9 teszi, hogy \n&ebizonyos es\u00E9llyel a jav\u00EDtott t\u00E1rgy megtarthassa az fejleszt\u00E9seit. A fejleszt\u00E9sek\n&emegtarthatj\u00E1k a szintj\u00FCket, visszafejl\u0151dhetnek,\n&evagy 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=&3Az \u00DAjrahasznos\u00EDt\u00E1sr\u00F3l:\n&eAz \u00FAjrahasznos\u00EDt\u00E1s lehet\u0151v\u00E9 teszi, hogy egy aranyt\u00F6mb\n&eseg\u00EDts\u00E9g\u00E9vel visszanyerd a t\u00E1rgyaid alapanyagait.\n\n&3TAPASZTALAT SZERZ\u00C9S:\n&eA horg\u00E1sz\u00E1si \u00E9s jav\u00EDt\u00E1si szintjeidt\u0151l f\u00FCgg. -Guides.Salvage.Section.1=&3Hogyan haszn\u00E1lhatom az \u00DAjrahasznos\u00EDt\u00E1st?\n&eHelyezz le egy \u00DAjrahasznos\u00EDt\u00F3 \u00DCll\u0151t, \u00E9s jobb klikkelj r\u00E1 egy adott t\u00E1rggyal. Ez lebontja a t\u00E1rgyat,\n&e\u00E9s visszaadja a bark\u00E1csol\u00E1si alapanyagait.\n\n&eP\u00E9ld\u00E1ul egy Vascs\u00E1k\u00E1ny eset\u00E9ben vasrudakat kapsz vissza. -Guides.Salvage.Section.2=&3Hogyan m\u0171k\u00F6dik a Fejlesztett \u00DAjrahasznos\u00EDt\u00E1s?\n&eMiut\u00E1n feloldottad, lehet\u0151v\u00E9 teszi a s\u00E9r\u00FClt t\u00E1rgyak \u00FAjrahasznos\u00EDt\u00E1s\u00E1t is.\n&eA visszanyert t\u00E1rgyak mennyis\u00E9ge a t\u00E1rgy \u00E1llapot\u00E1t\u00F3l f\u00FCgg. Min\u00E9l jobb \u00E1llapotban van,\n&eann\u00E1l t\u00F6bb anyagot nyerhetsz vissza.\n&eFejlesztett \u00DAjrahasznos\u00EDt\u00E1ssal legal\u00E1bb 1 t\u00E1rgyat mindig visszakapsz,\n&ekiv\u00E9ve ha a t\u00E1rgy t\u00FAl s\u00E9r\u00FClt. -Guides.Salvage.Section.3=&3P\u00E9lda a m\u0171k\u00F6d\u00E9s\u00E9re:\n&e\u00DAjra akarunk hasznos\u00EDtani egy aranycs\u00E1k\u00E1nyt, amely 20%-ban s\u00E9r\u00FClt,\n&eez azt jelenti, hogy maximum 2 t\u00E1rgyat kaphatunk vissza\n&e(mivel a cs\u00E1k\u00E1ny elk\u00E9sz\u00EDt\u00E9s\u00E9hez 3 r\u00FAd kell, ez\u00E9rt egyenk\u00E9nt \n&e33,33% haszn\u00E1lhat\u00F3s\u00E1got \u00E9rnek) ami egyenl\u0151 66%-kal. Ha a t\u00E1rgy s\u00E9r\u00FClts\u00E9ge\n&e66% alatt van, akkor nem kaphatsz vissza 2 rudat.\n&eHa ef\u00F6l\u00F6tt az \u00E9rt\u00E9k f\u00F6l\u00F6tt van, akkor\n&e2 rudat kapsz vissza. -Guides.Salvage.Section.4=&3Hogyan m\u0171k\u00F6dik a M\u00E1gikus \u00DAjrahasznos\u00EDt\u00E1s?\n&eBizonyos es\u00E9llyel var\u00E1zsk\u00F6nyveket is kaphatsz \n&efejlesztett t\u00E1rgyak \u00FAjhasznos\u00EDt\u00E1s\u00E1\u00E9rt. A szintedt\u0151l f\u00FCgg a \n&evar\u00E1zslat kinyer\u00E9s\u00E9nek m\u00E9rt\u00E9ke.\n\n&eR\u00E9szleges kinyer\u00E9sn\u00E9l \n&ea k\u00F6nyv alacsonyabb szint\u0171 var\u00E1zslattal fog rendelkezni, mint\n&eami 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=&3A Kardokr\u00F3l:\n&eEz a k\u00E9pess\u00E9g harci b\u00F3nuszokkal ruh\u00E1z fel \n&ekardok haszn\u00E1lata eset\u00E9n.\n\n&3TAPASZTALAT SZERZ\u00C9S:\n&eTapasztalatot az \u00E9l\u0151l\u00E9nyeknek vagy m\u00E1s j\u00E1t\u00E9kosoknak karddal\n&eokozott sebz\u00E9s\u00E9rt kaphatsz. -Guides.Swords.Section.1=&3Hogyan m\u0171k\u00F6dik a Fogazott Penge?\n&eA Fogazott Penge egy karddal jobb klikkel\u00E9ssel aktiv\u00E1lhat\u00F3 k\u00E9pess\u00E9g. \n&eEz a k\u00E9pess\u00E9g lehet\u0151v\u00E9 teszi a \n&eter\u00FCletre hat\u00F3 csap\u00E1sokat. A ter\u00FCletre hat\u00F3 csap\u00E1s 25%-os b\u00F3nusz sebz\u00E9st okoz, \n&etov\u00E1bb\u00E1 5 tick-ig v\u00E9rz\u00E9st ad az ellens\u00E9gnek. -Guides.Swords.Section.2=&3Hogyan m\u0171k\u00F6dik az Ellent\u00E1mad\u00E1s?\n&eAz Ellent\u00E1mad\u00E1s egy aktiv\u00E1lhat\u00F3 k\u00E9pess\u00E9g. V\u00E9dekez\u00E9sn\u00E9l, \u00E9s mikor \u00E9l\u0151l\u00E9ny\n&e\u00FCtnek, es\u00E9lyed van visszaford\u00EDtani az elszenvedett sebz\u00E9s \n&e50%-\u00E1t. -Guides.Swords.Section.3=&3Hogyan m\u0171k\u00F6dik a T\u00F6r\u00E9s?\n&eA T\u00F6r\u00E9s k\u00E9t m\u00E1sodpercenk\u00E9nt sebzi az ellens\u00E9geidet. A c\u00E9lpont \n&emindaddig v\u00E9rezni fog, m\u00EDg a V\u00E9rz\u00E9s id\u0151tartam le nem j\u00E1r, vagy az \u00E1ldozat meg nem hal. \n&eA 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=&3A szelid\u00EDt\u00E9sr\u0151l:\n&eA Szel\u00EDd\u00EDt\u00E9s k\u00FCl\u00F6nb\u00F6z\u0151 harci b\u00F3nuszokkal l\u00E1tja el a j\u00E1t\u00E9kost, ha \n&eszel\u00EDd\u00EDtett farkasokkal van.\n\n&3TAPASZTALAT SZERZ\u00C9S:\n&eSzel\u00EDd\u00EDts farkasokat/ocelotokat, vagy harcolj \n&ea farkasaid oldal\u00E1n. -Guides.Taming.Section.1=&3Hogyan m\u0171k\u00F6dik a Vadon H\u00EDv\u00E1sa?\n&eA Vadon H\u00EDv\u00E1sa egy aktiv\u00E1lhat\u00F3 k\u00E9pess\u00E9g, amellyel magad mell\u00E9 id\u00E9zhetsz \n&eegy farkast vagy egy ocelotot. Ezt \n&ecsonttal vagy hallal val\u00F3 guggol\u00E1s k\u00F6zben balkattint\u00E1ssal teheted meg. -Guides.Taming.Section.2=&3Hogyan m\u0171k\u00F6dik a Vad\u00E1llat-tan?\n&eA Vad\u00E1llat-tan lehet\u0151v\u00E9 teszi a \n&efarkasok \u00E9s ocelotok statisztik\u00E1inak megvizsg\u00E1l\u00E1s\u00E1t. Haszn\u00E1lat\u00E1hoz bal klikkelj egy farkasra\n&evagy ocelotra. -Guides.Taming.Section.3=&3Hogyan m\u0171k\u00F6dik a Led\u00F6f\u00E9s?\n&eA led\u00F6f\u00E9s egy passz\u00EDv k\u00E9pess\u00E9g, amely lehet\u0151v\u00E9 teszi, \n&ehogy a farkasok c\u00E9lpontja V\u00E9rz\u00E9st kapjon. -Guides.Taming.Section.4=&3Hogyan m\u0171k\u00F6dnek az \u00C9les Karmok?\n&eAz \u00C9les Karmok b\u00F3nusz sebz\u00E9st ad a farkasok t\u00E1mad\u00E1sainak. \n&eEz a b\u00F3nusz a Szel\u00EDd\u00EDt\u00E9s szintedt\u0151l f\u00FCgg. -Guides.Taming.Section.5=&3Hogyan m\u0171k\u00F6dik az \u00C9bers\u00E9g?\n&eEz a passz\u00EDv k\u00E9pess\u00E9g lehet\u0151v\u00E9 teszi a farkasaid\n&esz\u00E1m\u00E1ra, hogy r\u00E1d teleport\u00E1ljanak, ha vesz\u00E9lybe ker\u00FClnek, p\u00E9ld\u00E1ul l\u00E1va, kaktusz. Tov\u00E1bb\u00E1\n&eimmuniss\u00E1 teszi a farkasaidat a zuhan\u00E1si sebz\u0151d\u00E9sre. -Guides.Taming.Section.6=&3Hogyan m\u0171k\u00F6dik a Vastag Bunda?\n&eEz a k\u00E9pess\u00E9g cs\u00F6kkenti a farkasaid \u00E1ltal elszenvedett sebz\u00E9st, \u00E9s \n&et\u0171z\u00E1ll\u00F3v\u00E1 teszi \u0151ket. -Guides.Taming.Section.7=&3Hogyan m\u0171k\u00F6dik a Robban\u00E1s\u00E1ll\u00F3s\u00E1g?\n&eEz a k\u00E9pess\u00E9g cs\u00F6kkenti a farkasaid\n&erobban\u00E1s \u00E1ltal elszenvedett sebz\u0151d\u00E9s\u00E9t. -Guides.Taming.Section.8=&3Hogyan m\u0171k\u00F6dik a Gyors\u00E9ttermi Kiszolg\u00E1l\u00E1s?\n&eEz a k\u00E9pess\u00E9g lehet\u0151v\u00E9 teszi, hogy a farkasaid \u00E9letet t\u00F6ltsenek vissza, \n&emikor 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=&3A Felfegyverzetlenr\u0151l:\n&eA Felfegyverzetlen k\u00FCl\u00F6nb\u00F6z\u0151 harci b\u00F3nuszokkal l\u00E1t el, ha\n&eaz \u00F6kleidet haszn\u00E1lod fegyverk\u00E9nt. \n\n&3TAPASZTALAT SZERZ\u00C9S:\n&eHarcolj \u00E9l\u0151l\u00E9nyekkel vagy j\u00E1t\u00E9kosokkal pusztak\u00E9zzel. -Guides.Unarmed.Section.1=&3Hogyan m\u0171k\u00F6dik a Vadul\u00E1s?\n&eA Vadul\u00E1s egy jobb klikkel\u00E9ssel aktiv\u00E1lhat\u00F3 k\u00E9pess\u00E9g. \n&eEbben a m\u00F3dban 50%-kal t\u00F6bb sebz\u00E9st okozol, \u00E9s \n&ea gyenge anyagokat, mint a f\u00F6ld \u00E9s f\u00FCves blokk, instant ki\u00FCtheted. -Guides.Unarmed.Section.2=&3Hogyan m\u0171k\u00F6dik az Ac\u00E9l-\u00D6k\u00F6l St\u00EDlus?\n&eAz Ac\u00E9l-\u00D6k\u00F6l St\u00EDlus b\u00F3nusz sebz\u00E9st biztos\u00EDt \u00E9l\u0151l\u00E9nyek \u00E9s j\u00E1t\u00E9kosok ellen\n&eha csak az \u00F6kleidet haszn\u00E1lod. -Guides.Unarmed.Section.3=&3Hogyan m\u0171k\u00F6dik a Nyilak Kit\u00E9r\u00EDt\u00E9se?\n&eA Nyilak Kit\u00E9r\u00EDt\u00E9se egy passz\u00EDv k\u00E9pess\u00E9g, amely lehet\u0151v\u00E9 teszi, \n&ehogy elh\u00E1r\u00EDtsd a fel\u00E9d \u00E9rkez\u0151 nyilakat.\n&eA nyilak leesnek a f\u00F6ldre. -Guides.Unarmed.Section.4=&3Hogyan m\u0171k\u00F6dik a Vas-Markol\u00E1s?\n&eA Vas-Markol\u00E1s a Lefegyverz\u00E9st akad\u00E1lyozza meg. Min\u00E9l nagyobb a \n&eFelfegyverzetlen szinted, ann\u00E1l nagyobb es\u00E9llyel \u00E1llsz ellen a Lefegyverz\u00E9snek. -Guides.Unarmed.Section.5=&3Hogyan m\u0171k\u00F6dik a Lefegyverz\u00E9s?\n&eA Lefegyverz\u00E9s lehet\u0151v\u00E9 teszi, hogy lefegyverezd az ellens\u00E9ged,\n&eez\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=&3Hogyan m\u0171k\u00F6dik a Fav\u00E1g\u00E1s?\n&eA Fav\u00E1g\u00E1s a fav\u00E1g\u00E1sr\u00F3l sz\u00F3l.\n\n&3TAPASZTALAT SZERZ\u00C9S:\n&eV\u00E1gj ki f\u00E1kat. -Guides.Woodcutting.Section.1=&3Hogyan m\u0171k\u00F6dik a Fad\u00F6nt\u00E9s?\n&eA Fad\u00F6nt\u00E9s egy aktiv\u00E1lhat\u00F3 k\u00E9pess\u00E9g, az aktiv\u00E1l\u00E1s\u00E1hoz \n&ejobb klikkelj balt\u00E1val a kezedben. Ez\u00E1ltal a fa azonnal kid\u0151l\n&e\u00E9s kidobja az \u00F6sszes r\u00F6nk\u00F6t. -Guides.Woodcutting.Section.2=&3Hogyan m\u0171k\u00F6dik a Lev\u00E9lf\u00FAj\u00F3?\n&eA Lev\u00E9lf\u00FAj\u00F3 egy passz\u00EDv k\u00E9pess\u00E9g, amely miatt a levelek azonnal elt\u0171nnek, ha\n&er\u00E1kattintasz balt\u00E1val. Alapb\u00F3l a 100-as szinten old\u00F3dik fel ez a k\u00E9pess\u00E9g. -Guides.Woodcutting.Section.3=&3Hogyan m\u0171k\u00F6dnek a Dupla Drop-ok?\n&eEz a passz\u00EDv k\u00E9pess\u00E9g lehet\u0151v\u00E9 teszi, hogy minden kiv\u00E1gott\n&efar\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= &cNincs jogod offline j\u00E1t\u00E9kosok megvizsg\u00E1l\u00E1s\u00E1ra! -Inspect.OfflineStats=A(z) &e{0} nev\u0171 offline j\u00E1t\u00E9kos mcMMO Statisztik\u00E1ja -Inspect.Stats=&aA(z) &e{0} &anev\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=&c**KIM\u00C9RA SZ\u00C1RNYAK HASZN\u00C1LATA SIKERTELEN** -Item.ChimaeraWing.Pass=**KIM\u00C9RA SZ\u00C1RNYAK** -Item.ChimaeraWing.Name=Kim\u00E9ra Sz\u00E1rnyak -Item.ChimaeraWing.Lore=&7Az \u00E1gyadhoz teleport\u00E1l. -Item.ChimaeraWing.NotEnough=Sz\u00FCks\u00E9ged van &e{0}&c m\u00E9g ennyire &6{1}&c! -Item.NotEnough=Sz\u00FCks\u00E9ged van &e{0}&c m\u00E9g ennyire &6{1}&c! -Item.Generic.Wait=V\u00E1rnod kell miel\u0151tt \u00FAjra haszn\u00E1lhatn\u00E1d ezt a k\u00E9pess\u00E9get! &e({0}s) -Item.Injured.Wait=Sebz\u00E9st szenvedt\u00E9l el, \u00FAgyhogy v\u00E1rnod kell, miel\u0151tt haszn\u00E1lhatn\u00E1d. &e({0}s) -Item.FluxPickaxe.Name=Olvaszt\u00F3 Cs\u00E1k\u00E1ny -Item.FluxPickaxe.Lore.1=&7Bizonyos es\u00E9llyel ki\u00E9geti a kib\u00E1ny\u00E1szott t\u00E1rgyakat. -Item.FluxPickaxe.Lore.2=&7Sz\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=&7Teleport\u00E1l\u00E1s &6({0}) &7m\u00E1sodperc m\u00FAlva, k\u00E9rlek ne mozogj... -Teleport.Cancelled=&4Teleport\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=&6(ALK\u00C9PESS\u00C9G) +Skills.Child=&6(ALKÉPESSÉG) Skills.Disarmed=&4Lefegyvereztek! Skills.Header=-----[] &a{0}&c []----- -Skills.NeedMore=&4T\u00F6bb&7{0}-ra/re van sz\u00FCks\u00E9ged -Skills.NeedMore.Extra=&4T\u00F6bbre van sz\u00FCks\u00E9ged &7{0}{1} -Skills.Parents= ANYAK\u00C9PESS\u00C9G +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. &e({0}s) +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\u00E9pess\u00E9g v\u00E1rakoz\u00E1sok - {1} -Skills.Cancelled=&6{0} &cMegszak\u00EDtva! -Skills.ConfirmOrCancel=&aJobb klikkelj a meger\u0151s\u00EDt\u00E9shez. &6{0}&a. Bal klikkelj a megszak\u00EDt\u00E1shoz. -Skills.AbilityGateRequirementFail=&7M\u00E9g &e{0}&7 szint sz\u00FCks\u00E9ges a(z) &3{1}&7b\u00F3l/b\u0151l, hogy haszn\u00E1lhasd ezt a szuper k\u00E9pess\u00E9get. +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=&6-=HARCI K\u00C9PESS\u00C9GEK=- -Stats.Header.Gathering=&6-=GY\u0170JT\u00D6GET\u0150 K\u00C9PESS\u00C9GEK=- -Stats.Header.Misc=&6-=EGY\u00C9B K\u00C9PESS\u00C9GEK=- -Stats.Own.Stats=&a[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.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 \u00DAjrat\u00F6lt\u00E9s -Perks.Cooldowns.Desc=Cs\u00F6kkenti a v\u00E1rakoz\u00E1st {0}-al. +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=&6 ({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=&6[mcMMO] Hardcore M\u00F3d {0} kikapcsolva {1} sz\u00E1m\u00E1ra. -Hardcore.Mode.Enabled=&6[mcMMO] Hardcore M\u00F3d {0} bekapcsolva {1} sz\u00E1m\u00E1ra. -Hardcore.DeathStatLoss.Name=K\u00E9pess\u00E9g Hal\u00E1l B\u00FCntet\u00E9s -Hardcore.DeathStatLoss.PlayerDeath=&6[mcMMO] &4Elvesztett\u00E9l &9{0}&4 szintet a hal\u00E1lod miatt. -Hardcore.DeathStatLoss.PercentageChanged=&6[mcMMO] A statisztika veszt\u00E9si sz\u00E1zal\u00E9k be\u00E1ll\u00EDtva {0}-ra/re. -Hardcore.Vampirism.Name=Vamp\u00EDrizmus -Hardcore.Vampirism.Killer.Failure=&6[mcMMO] &e{0}&7-nak/nek nem volt el\u00E9g tud\u00E1sa, hogy b\u00E1rmit is kisz\u00EDvhass bel\u0151le. -Hardcore.Vampirism.Killer.Success=&6[mcMMO] &3Ellopt\u00E1l &9{0}&3 szintet &e{1}-t\u00F3l/t\u0151l. -Hardcore.Vampirism.Victim.Failure=&6[mcMMO] &e{0}&7 nem tudott tud\u00E1st lopni t\u0151led! -Hardcore.Vampirism.Victim.Success=&6[mcMMO] &e{0}&4 ellopott &9{1}&4 szintet t\u0151led! -Hardcore.Vampirism.PercentageChanged=&6[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=&3Adakoz\u00E1s inform\u00E1ci\u00F3: -MOTD.Hardcore.Enabled=&6[mcMMO] &3Hardcore M\u00F3d enged\u00E9lyezve: &4{0} -MOTD.Hardcore.DeathStatLoss.Stats=&6[mcMMO] &3K\u00E9pess\u00E9g Hal\u00E1l B\u00FCntet\u00E9s: &4{0}% -MOTD.Hardcore.Vampirism.Stats=&6[mcMMO] &3V\u00E1mpirizmus szipolyoz\u00E1si sz\u00E1zal\u00E9k: &4{0}% +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\u00F3 &3{0} +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: &e{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: &e{0}x -Smelting.SubSkill.SecondSmelt.Name=M\u00E1sodik olvaszt\u00E1s -Smelting.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=&emcMMO Statisztik\u00E1k -Scoreboard.Header.PlayerCooldowns=&emcMMO V\u00E1rakoz\u00E1s +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\u0151 Szint -Scoreboard.Misc.PowerLevel=&6Er\u0151 Szint +Scoreboard.Header.PowerLevel=&eErő Szint +Scoreboard.Misc.PowerLevel=&6Erő Szint Scoreboard.Misc.Level=&3Szint Scoreboard.Misc.CurrentXP=&aJelenlegi XP -Scoreboard.Misc.RemainingXP=&eSz\u00FCks\u00E9ges XP -Scoreboard.Misc.Cooldown=&dV\u00E1rakoz\u00E1s +Scoreboard.Misc.RemainingXP=&eSzükséges XP +Scoreboard.Misc.Cooldown=&dVárakozás Scoreboard.Misc.Overall=&6Overall -Scoreboard.Misc.Ability=K\u00E9pess\u00E9g +Scoreboard.Misc.Ability=Képesség #DATABASE RECOVERY -Profile.PendingLoad=&cAz mcMMO j\u00E1t\u00E9kos adatod m\u00E9g nincs bet\u00F6ltve. -Profile.Loading.Success=&amcMMO profil sikeresen bet\u00F6ltve. -Profile.Loading.FailurePlayer=&cAz mcMMO-nak probl\u00E9m\u00E1i vannak az adataid bet\u00F6lt\u00E9sekor, megpr\u00F3b\u00E1ltuk bet\u00F6lteni &a{0}&cx.&c 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=&4[A]&c az mcMMO nem tudta bet\u00F6lteni ennek a j\u00E1t\u00E9kosnak az adatait &e{0}&c. &dK\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=&6{0} jelenlegi szint &a{1}&6! -Holiday.Anniversary=&9Boldog {0}. \u00C9vfordul\u00F3t!\n&9nossr50, \u00E9s az \u00F6sszes fejleszt\u0151 tisztelet\u00E9re itt egy t\u0171zij\u00E1t\u00E9k show! +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=&7Eml\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=&aA ford\u00EDt\u00E1s \u00FAjrat\u00F6ltve! +Locale.Reloaded=&aA fordítás újratöltve! #Player Leveling Stuff -LevelCap.PowerLevel=&6(&amcMMO&6) &eEl\u00E9rted ezt a teljes\u00EDtm\u00E9nyszintet &c{0}&e. Ezen a ponton megsz\u0171nik a k\u00E9pess\u00E9gek szintje. -LevelCap.Skill=&6(&amcMMO&6) &eEl\u00E9rted ezt a szintet &c{0}&e ebben &6{1}&e. 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\u00E1ci\u00F3 az mcMMO-r\u00F3l \u00E9s arr\u00F3l, hogy kompatibilit\u00E1si m\u00F3dban van-e, vagy teljesen m\u0171k\u00F6d\u0151k\u00E9pes-e. -Compatibility.Layer.Unsupported=&6A kompatibilit\u00E1s ezen a Minecraft verzi\u00F3n &a{0}&6 nem t\u00E1mogatott. -Compatibility.Layer.PartialSupport=&6A kompatibilit\u00E1s ezen a Minecraft verzi\u00F3n &a{0}&6 nem teljesen t\u00E1mogatott, de az mcMMO egy m\u00E1sodlagos rendszert futtat n\u00E9h\u00E1ny hi\u00E1nyz\u00F3 funkci\u00F3 emul\u00E1l\u00E1s\u00E1ra. -Commands.XPBar.DisableAll=&6 Most az \u00F6sszes mcMMO XP s\u00E1v le van tiltva, haszn\u00E1ld a /mmoxpbar reset parancsot az alap\u00E9rtelmezett be\u00E1ll\u00EDt\u00E1sok vissza\u00E1ll\u00EDt\u00E1s\u00E1hoz. +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\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.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 \u00FCzeneteid mostant\u00F3l automatikusan a(z) &a{0}&e chat csatorn\u00E1ra ker\u00FClnek. -Chat.Channel.Off=&6(&amcMMO-Chat&6) &7A chat \u00FCzeneteid a tov\u00E1bbiakban nem ker\u00FClnek automatikusan a meghat\u00E1rozott chat csatorn\u00E1kra. -Chat.Spy.Party=&6[&eSPY&6-&a{2}&6] &r{0} &b\u2192 &r{1} -Broadcasts.LevelUpMilestone=&6(&amcMMO&6) {0}&7 el\u00E9rte a(z) &a{1}&7. [[DARK_AQUA]]{2}&7 szintet! -Broadcasts.PowerLevelUpMilestone=&6(&amcMMO&6) {0}&7 el\u00E9rte a(z) &a{1}&7. Er\u0151szintet! +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 8a502a849..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=&6Vantaggi Fortunati -JSON.JWrapper.Perks.Lucky={0}% Migliori Probabilit\u00E0 +JSON.JWrapper.Perks.Lucky={0}% Migliori Probabilità JSON.Hover.Tips=Consigli JSON.Acrobatics=Acrobatica JSON.Alchemy=Alchimia @@ -55,21 +55,21 @@ 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=Se ti accovacci durante la caduta puoi prevenire fino al doppio del danno che che normalmente subiresti! -Anvil.SingleItemStack=&cNon 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=&6(&amcMMO&6) &7{0} # BEGIN STYLING -Ability.Generic.Refresh=&a**CAPACIT\u00E0 RIGENERATE!** +Ability.Generic.Refresh=&a**CAPACITà RIGENERATE!** 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=EFFETTI -Effects.SubSkills.Overhaul=Sotto-Abilit\u00E0 +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) @@ -81,10 +81,10 @@ 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\u00E0 sulla wiki!&e] +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=&l{0} \u00E8 aumentata a &r&a&l{2}&r&f. +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 @@ -105,12 +105,12 @@ Overhaul.Name.Woodcutting=Taglialegna 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\u00E0&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=&6Imparando una nuova abilit\u00E0... +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} @@ -135,33 +135,33 @@ XPBar.Complex.Template={0} &3 {4}&f% &3(&f{1}&3/&f{2}&3) #ACROBATICS Acrobatics.Ability.Proc=&a**Atterraggio Aggraziato** Acrobatics.Combat.Proc=&a**Schivato** -Acrobatics.SubSkill.Roll.Stats=&6Possibilit\u00E0 di Capriola &e{0}%&6 Possibilit\u00E0 di Capriola Aggraziata&e {1}% -Acrobatics.SubSkill.Roll.Stat=Possibilit\u00E0 di Capriola -Acrobatics.SubSkill.Roll.Stat.Extra=Possibilit\u00E0 di Capriola Aggraziata +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: &e{0} -Acrobatics.SubSkill.Roll.GraceChance=Possibilit\u00E0 di Capriola Aggraziata: &e{0} -Acrobatics.SubSkill.Roll.Mechanics=&7La 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 &e{6}%&7 hai il &e{0}%&7 di possibilit\u00E0 di prevenire il danno, e il &e{1}%&7 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 &e{2}&7 dove diventa massima, ogni livello in Acrobatica ti d\u00E0 il &e{3}%&7 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 &c{4}&7 danni. Le Capriole Aggraziate impediscono fino a &a{5}&7 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=&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.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 @@ -199,11 +199,11 @@ 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,49 +211,49 @@ 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.Off=**Spacca Crani si è esaurito** Axes.Skills.SS.On=&a**Spacca Crani ATTIVATO** -Axes.Skills.SS.Refresh=&aLa tua capacit\u00E0 &eSpacca Crani &asi \u00E8 rigenerata! -Axes.Skills.SS.Other.Off=Spacca Crani&a si \u00E8 esaurito per &e{0} +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=&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.Off=**Giga-Trivella Demolitrice si è esaurita** Excavation.Skills.GigaDrillBreaker.On=&a**GIGA-TRIVELLA DEMOLITRICE ATTIVATA** -Excavation.Skills.GigaDrillBreaker.Refresh=&aLa tua capacit\u00E0 &eGiga-Trivella Demolitrice &asi \u00E8 rigenerata! -Excavation.Skills.GigaDrillBreaker.Other.Off=Giga-Trivella Demolitrice&a si \u00E8 esaurita per &e{0} +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=&e&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.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\u00E0 affaticamento e usurer\u00E0 la canna! +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\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.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: &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:&a Grado {0} @@ -265,11 +265,11 @@ Fishing.Chance.Raining=&9 Bonus Pioggia Fishing.Listener=Pesca: Fishing.Ability.TH.MagicFound=&7Senti un tocco di magia in questa cattura... Fishing.Ability.TH.Boom=&7BOOM TIME!!! -Fishing.Ability.TH.Poison=&7C'\u00E8 qualcosa che puzza... +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=&a**POLLICE VERDE** Herbalism.Ability.Lower=&7Abbassi la Zappa. @@ -280,7 +280,7 @@ 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=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 @@ -289,78 +289,78 @@ Herbalism.SubSkill.FarmersDiet.Description=Aumenta la fame recuperata tramite ci 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=&aOggi 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.Off=**Terra Verde si è esaurita** Herbalism.Skills.GTe.On=&a**TERRA VERDE ATTIVATA** -Herbalism.Skills.GTe.Refresh=&aLa tua capacit\u00E0 &eTerra Verde &asi \u00E8 rigenerata! -Herbalism.Skills.GTe.Other.Off=Terra Verde&a si \u00E8 esaurita per &e{0} +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.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:&a Grado {0}/{1} &7({2}) Mining.SubSkill.BlastMining.Stat.Extra=Aumento Raggio di Esplosione: &a+{0} -Mining.SubSkill.BiggerBombs.Name=Bombe Pi\u00F9 Grandi +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.Off=**Super Demolitore si è esaurito** Mining.Skills.SuperBreaker.On=&a**SUPER DEMOLITORE ATTIVATO** -Mining.Skills.SuperBreaker.Other.Off=Super Demolitore&a si \u00E8 esaurito per &e{0} +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\u00E0 &eSuper Demolitore &asi \u00E8 rigenerata! +Mining.Skills.SuperBreaker.Refresh=&aLa tua capacità &eSuper Demolitore &asi è rigenerata! #Blast Mining Mining.Blast.Boom=&7**BOOM** Mining.Blast.Cooldown= Mining.Blast.Effect=+{0} minerale raccolto, drop {1}x Mining.Blast.Other.On=&a{0}&2 ha usato &cEstrazione Esplosiva! -Mining.Blast.Refresh=&aLa tua capacit\u00E0 &eEstrazione Esplosiva &asi \u00E8 rigenerata! +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: &a{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: &eGrado {0}/{1} -Repair.SubSkill.ArcaneForging.Stat.Extra=&3Probabilit\u00E0 Forgiatura Arcana:&7 Successo &a{0}&7%, Fallimento &c{1}&7% +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: @@ -371,32 +371,32 @@ 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\u00E8 gi\u00E0 a piena durevolezza. +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=&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: &aRecupera fino a &e{0}&a 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: &eGrado {0}/{1} Salvage.Ability.Bonus.0=Collezionista di Rottami -Salvage.Ability.Bonus.1=Recupera fino a &e{0}&a oggetti. \u00E8 coinvolta un po' di fortuna. -Salvage.Arcane.ExtractFull=&7Possibilit\u00E0 di Incantesimo-Completo RA -Salvage.Arcane.ExtractPartial=&7Possibilit\u00E0 di Incantesimo-Parziale RA +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 \u00E8 troppo danneggiato per essere rottamato. +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! @@ -407,23 +407,23 @@ Salvage.Skills.Lottery.Normal=&6Sei riuscito a rottamare &3{0}&6 materiali da &e 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=&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 \u00E8 &afermata&7! +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 @@ -431,18 +431,18 @@ 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=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.Off=**Colpi Seghettati si è esaurito** Swords.Skills.SS.On=&a**COLPI SEGHETTATI ATTIVATO** -Swords.Skills.SS.Refresh=&aLa tua capacit\u00E0 &eColpi Seghettati &asi \u00E8 rigenerata! -Swords.Skills.SS.Other.Off=Colpi Seghettati&a si \u00E8 esaurito per &e{0} +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 @@ -455,16 +455,16 @@ 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 @@ -473,7 +473,7 @@ Taming.SubSkill.CallOfTheWild.Name=Richiamo della Natura Taming.SubSkill.CallOfTheWild.Description=Evoca un animale al tuo fianco 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 @@ -485,7 +485,7 @@ 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=&8Il tuo lupo torna da te... Taming.Listener=Domesticazione: @@ -493,7 +493,7 @@ Taming.SkillName=DOMESTICAZIONE 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 \u00E8 scaduto, il tuo &6{0}&7 se ne va. +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} @@ -510,55 +510,55 @@ 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.Off=**Furore si è esaurito** Unarmed.Skills.Berserk.On=&a**FURORE ATTIVATO** -Unarmed.Skills.Berserk.Other.Off=Furore&a si \u00E8 esaurito per &e{0} +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\u00E0 &eFurore &asi \u00E8 rigenerata! +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.Off=**Abbattitore d'Alberi si è esaurito** Woodcutting.Skills.TreeFeller.On=&a**ABBATTITORE D'ALBERI ATTIVATO** -Woodcutting.Skills.TreeFeller.Refresh=&aLa tua capacit\u00E0 &eAbbattitore d'Alberi &asi \u00E8 rigenerata! -Woodcutting.Skills.TreeFeller.Other.Off=Abbattitore d'Alberi&a si \u00E8 esaurito per &e{0} +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 @@ -566,85 +566,85 @@ 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\u00E0 di Movimento del Cavallo (&a{0} blocchi/s&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 &4Stordito +Combat.TargetDazed=Il bersaglio è stato &4Stordito Combat.TouchedFuzzy=&4Urto Stordino. Vado nel Pallone. #COMMANDS ##generic -mcMMO.Description=&3Introduzione al Progetto &emcMMO&3:,&6mcMMO \u00E8 una mod RPG &copen source&6 creata nel febbraio 2011,&6da &9nossr50&6. L'obbiettivo \u00E8 di fornire una esperienza di RPG di qualit\u00E0.,&3Consigli:,&6 - &aUsa &c/mcmmo help&a per vedere i comandi,&6 - &aDigita &c/NOMEABILIT\u00E0&a per visualizzare informazioni dettagliate sull'abilit\u00E0,&3Sviluppatori:,&6 - &anossr50 &9(Creatore & Responsabile del Progetto),&6 - &aelectronicboy &9(Sviluppatore),&6 - &akashike &9(Sviluppatore),&6 - &at00thpick1 &9(Manutentore versione Classica) +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\u00E0! -Commands.addlevels.AwardAll.2=Tutte le abilit\u00E0 sono state modificate per {0}. +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} \u00E8 stato modificato per {1}. -Commands.addxp.AwardAll=&aTi \u00E8 stata assegnata {0} esperienza in tutte le abilit\u00E0! -Commands.addxp.AwardSkill=&aTi \u00E8 stata assegnata {0} esperienza in {1}! -Commands.Ability.Off=Uso delle capacit\u00E0 &cdisattivato -Commands.Ability.On=Uso delle capacit\u00E0 &aattivato -Commands.Ability.Toggle=L'uso delle capacit\u00E0 \u00E8 stato attivato/disattivato per &e{0} +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=&6--= &aRicariche Capacit\u00E0 mcMMO&6 =-- +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.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\u00E0 Dio mcMMO Disabilitata -Commands.GodMode.Enabled=Modalit\u00E0 Dio mcMMO Abilitata +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 &e{0} +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\u00E0 Dio non \u00E8 permessa in questo mondo (Vedi i Permessi) -Commands.GodMode.Toggle=La modalit\u00E0 Dio \u00E8 stata attivata/disattivata per &e{0} -Commands.Healthbars.Changed.HEARTS=[mcMMO] Il tipo di barra della salute \u00E8 stato modificato a &cCuori&f. -Commands.Healthbars.Changed.BAR=[mcMMO] Il tipo di barra della salute \u00E8 stato modificato a &eCaselle&f. +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= &a- Visualizza informazioni dettagliate sul giocatore Commands.Invite.Success=&aInvito inviato con successo. -Commands.Leaderboards= &a- Classifiche -Commands.mcgod=&a- Attiva/disattiva la Modalit\u00E0 Dio -Commands.mchud.Invalid=Quello non \u00E8 un tipo di HUD valido. -Commands.mcpurge.Success=&aIl database \u00E8 stato ripulito 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=&a{0} \u00E8 stato rimosso con successo dal database! +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\u00E0 \u00E8 stato impostato a {0}! -Commands.mmoedit.Modified.1=&aIl 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.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 \u00E8 &a{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} \u00E8 gi\u00E0 in uso +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 \u00E8 in uso la curva XP {0}. +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 &cdisattivate -Commands.Notifications.On=Le notifiche sulle abilit\u00E0 sono state &aattivate +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.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\u00E0 Sbloccate: &7&o{0} -Commands.Party.ShareMode=&8MODALIT\u00E0 SPARTIZIONE: +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} @@ -658,14 +658,14 @@ 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 \u00E8 pieno! -Commands.Party.PartyFull.Invite=Non puoi invitare &e{0}&c in &a{1}&c perch\u00E9 ha gi\u00E0 &3{2}&c giocatori! -Commands.Party.PartyFull.InviteAccept=Non puoi unirti a &a{0}&c perch\u00E9 ha gi\u00E0 &3{1}&c giocatori! +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\u00E0 spartizione del party {0} impostata a: &3{1} -Commands.Party.ToggleShareCategory=&7La condivisione oggetti del party per &6{0} &7\u00E8 stata &3{1} -Commands.Party.AlreadyExists=&4Il party {0} gi\u00E0 esiste! +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[]----- @@ -676,13 +676,13 @@ 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\u00E8 ALLEATO CON: &f{1} +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\u00E0 un'alleato. Sciogli l'alleanza con &3/party alliance disband +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 @@ -690,36 +690,36 @@ 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\u00E0 tra &c{0} &asecondi. +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 \u00E8 scaduta! +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\u00E0 sono stati azzerati con successo. -Commands.Reset.Single=&aIl tuo livello di abilit\u00E0 di {0} \u00E8 stato azzerato con successo. -Commands.Reset=&a- Reimposta un livello di abilit\u00E0 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 \u00E8 attiva. -Commands.Scoreboard.Keep=&3La scoreboard mcMMO rimmarr\u00E0 finch\u00E9 non userai &a/mcscoreboard clear&3. -Commands.Scoreboard.Timer=&3La scoreboard mcMMO sar\u00E0 rimossa tra &6{0}&3 secondi da ora. +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 \u00E8 attiva per evitare che vada via. +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 \u00E8 un nome di abilit\u00E0 valido! -Commands.Skill.ChildSkill=Le abilit\u00E0 figlie non sono valide per questo comando! +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\u00E0 +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\u00E0 con il click destro -Commands.Usage.0=&cL'uso appropriato \u00E8 /{0} -Commands.Usage.1=&cL'uso appropriato \u00E8 /{0} {1} -Commands.Usage.2=&cL'uso appropriato \u00E8 /{0} {1} {2} -Commands.Usage.3=&cL'uso appropriato \u00E8 /{0} {1} {2} {3} +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 @@ -728,71 +728,71 @@ 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=&7Non 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.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\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.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 &6{0}&7, 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. +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\u00E0, non verr\u00E0 mostrata qui. +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=&cL'uso appropriato \u00E8 &3{0} [password]. +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\u00E0 del tuo party, utilizza &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\u00E8 entrato nel tuo 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 \u00E8 un nome di party valido. +Party.InvalidName=&4Questo non è un nome di party valido. Party.Invite.Self=&cNon puoi invitare te stesso! -Party.IsLocked=&cQuesto party \u00E8 gi\u00E0 bloccato! -Party.IsntLocked=&cQuesto party non \u00E8 bloccato! -Party.Locked=&cIl party \u00E8 chiuso, solo il capo pu\u00F2 invitare. -Party.NotInYourParty=&4{0} non \u00E8 il tuo party +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 \u00E8 il capo del party. -Party.Owner.New=&a{0} \u00E8 il nuovo capo del party. -Party.Owner.NotLeader=&4Non sei pi\u00F9 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 \u00E8 protetto da password. Fornisci una password per entrare. -Party.Password.Incorrect=&cLa password del party non \u00E8 corretta. +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 \u00E8 stata rimossa. -Party.Player.Invalid=&cQuello non \u00E8 un giocatore valido. -Party.NotOnline=&4{0} non \u00E8 online! -Party.Player.InSameParty=&c{0} \u00E8 gi\u00E0 nel tuo party! -Party.PlayerNotInParty=&4{0} non \u00E8 in un party +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 \u00E8 teletrasportato da te. +Party.Teleport.Target=&a{0} si è teletrasportato da te. Party.Teleport.Disabled=&c{0} non consente il teletrasporto del party. -Party.Rename.Same=&cQuello \u00E8 gi\u00E0 il nome del tuo 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 \u00E8 sbloccato -Party.Disband=&7Il party \u00E8 stato sciolto -Party.Alliance.Formed=&7Il tuo party \u00E8 ora alleato con &a{0} -Party.Alliance.Disband=&7Il tuo party non \u00E8 pi\u00F9 alleato con &c{0} +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}) @@ -806,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=&cLa chat del party non \u00E8 ancora stata sbloccata. -Party.Feature.Disabled.2=&cIl teletrasporto del party non \u00E8 ancora stato sbloccato. +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 \u00E8 ancora stata sbloccata. -Party.Feature.Disabled.5=&cLa condivisione XP del party non \u00E8 ancora stata sbloccata. +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 @@ -827,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 @@ -838,20 +838,20 @@ Commands.XPGain.Taming=Addomesticando Animali, o combattendo con i tuoi lupi Commands.XPGain.Unarmed=Attaccando Mostri Commands.XPGain.Woodcutting=Abbattendo alberi Commands.XPGain=&8GUADAGNO XP: &f{0} -Commands.xplock.locked=&6La tua BARRA XP \u00E8 ora bloccata a {0}! -Commands.xplock.unlocked=&6La tua BARRA XP \u00E8 ora &aSBLOCCATA&6! -Commands.xprate.modified=&cIl TASSO XP \u00E8 stato portato a {0} -Commands.xprate.over=&cL'Evento di mcMMO Tasso XP \u00E8 FINITO!! -Commands.xprate.proper.0=&cL'uso corretto per cambiare il tasso di XP \u00E8 /xprate -Commands.xprate.proper.1=&cL'uso corretto per ripristinare il tasso di XP al valore predefinito \u00E8 /xprate reset -Commands.xprate.proper.2=&cSpecifica "true" o "false" per indicare se questo \u00E8 un evento XP o meno +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=&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 \u00E8 ora &6{0}&3x -Commands.xprate.started.0=&6\u00E8 INIZIATO UN EVENTO XP PER mcMMO! -Commands.xprate.started.1=&6IL TASSO DI XP DI mcMMO \u00E8 ORA {0}x! +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=&e[Server] @@ -863,110 +863,110 @@ Notifications.Admin.Format.Others=&6(&amcMMO &3Admin&6) &7{0} Notifications.Admin.Format.Self=&6(&amcMMO&6) &7{0} # Event -XPRate.Event=&6mcMMO \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=&7Guida per {0} disponibile - digita /{1} ? [pagina] Guides.Header=&6-=&aGuida {0}&6=- -Guides.Page.Invalid=Non \u00E8 un numero di pagina valido! +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=&3Introduzione all'Acrobatica:\n&eL'Acrobatica \u00E8 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\u00E0 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\u00E0 passiva quando subisci danni da caduta\n&edi annullare il danno subito. Puoi accovacciarti per\n&eraddoppiare la possibilit\u00E0 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\u00E0\n&edi verificarsi e forniscono pi\u00F9 protezione di quelle normali.\n&eLa probabilit\u00E0 di Capriola \u00E8 legata al tuo livello di abilit\u00E0 -Guides.Acrobatics.Section.2=&3Come funziona la Schivata?\n&eHai una possibilit\u00E0 passiva quando sei\n&eferito in combattimento di dimezzare il danno subito.\n&e\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=&3Introduzione all'Alchimia:\n&eL'Alchimia riguarda la preparazione di pozioni.\n&eFornisce un aumento della velocit\u00E0 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\u00E0 devi preparare pozioni. -Guides.Alchemy.Section.1=&3Come funziona Catalisi?\n&eCatalizza la velocit\u00E0 di preparazione, con una\n&evelocit\u00E0 massima di 4x al livello 1000.\n&eQuesta abilit\u00E0 \u00E8 sbloccata al livello 100 di default. -Guides.Alchemy.Section.2=&3Come funziona Intrugli?\n&eLa capacit\u00E0 Intrugli consente di preparare pi\u00F9 pozioni con ingredienti personalizzati.\n&eQuali ingredienti speciali sono sbloccati \u00E8 determinato\n&edal tuo Grado. Ci sono 8 gradi da sbloccare. +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\u00E0)\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\u00E0) -Guides.Alchemy.Section.6=&3Ingredienti Intrugli di grado 6:\n&eFelce (Pozione di Saziet\u00E0)\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) +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=&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\u00E0 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\u00E0 devi colpire mob o\n&ealtri giocatori. +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\u00E0 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\u00E0 passiva di recupera alcune delle tue frecce\n&equando uccidi un mob con il tuo arco.\n&eQuesta possibilit\u00E0 aumenta all'aumentare del tuo livello in Tiro con l'Arco.\n&eDi default, Questa capacit\u00E0 aumenta del 0.1% per livello, fino al 100%\n&eal livello 1000. +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=&3Introduzione ad Asce:\n&eCon l'abilit\u00E0 Asce puoi usare la tua ascia per molto pi\u00F9 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\u00E0 all'aumentare\n&edel tuo livello.\n&3GUADAGNO XP:\n&ePer ottenere XP in questa abilit\u00E0 devi colpire altri mob o giocatori\n&econ la tua Ascia. -Guides.Axes.Section.1=&3Come funziona Spacca Crani?\n&eQuesta capacit\u00E0 consente di infliggere un colpo EaA (Effetto ad Area).\n&eQuesto colpo EaA infligger\u00E0 la met\u00E0 del danno fatto\n&eall'obbiettivo principale, quindi \u00E8 ottimo per eliminare grandi mucchi di mob. -Guides.Axes.Section.2=&3Come funziona Colpi Critici?\n&eColpi Critici \u00E8 una capacit\u00E0 passiva che d\u00E0 ai giocatori\n&euna possibilit\u00E0 di infliggere danno extra.\n&eCon le impostazioni predefinite, ogni 2 livelli abilit\u00E0 in Asce ottieni un\n&e0.1% di possibilit\u00E0 in pi\u00F9 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 \u00E8 una capacit\u00E0 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\u00E0 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\u00E0 passiva di ottenere un impatto maggiore\n&ecolpendo i mob o i giocatori con la tua ascia.\n&eDi default questa possibilit\u00E0 \u00E8 del 25%. Questa capacit\u00E0 passiva ha un\n&eestremo contraccolpo, simile all'incantesimo\n&eContraccolpo 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=&3Introduzione allo Scavo:\n&eLo Scavo \u00E8 l'atto di scavare la terra per trovare tesori.\n&eScavando la terra troverai tesori.\n&ePi\u00F9 lo fai, pi\u00F9 tesori puoi trovare.\n\n&3GUADAGNO XP:\n&ePer ottenere XP in questa abilit\u00E0 devi scavare con una pala in mano.\n&eSolo alcuni materiali possono essere scavati per trovare tesori e XP. +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\u00E0 la Giga-Trivella Demolitrice. -Guides.Excavation.Section.3=&3Cos'\u00E8 la Giga-Trivella Demolitrice?\n&eLa Giga-Trivella Demolitrice \u00E8 una capacit\u00E0 con una ricarica\n&elegata all'abilit\u00E0 di Scavo. Triplica la tua possibilit\u00E0\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\u00E0 per il suo drop, di conseguenza \u00E8\n&edifficile dire quanto ti stia aiutando.\n&eTieni presente che maggiore \u00E8 la tua abilit\u00E0 di Scavo,\n&epi\u00F9 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.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=&3Introduzione alla Pesca:\n&eCon l'abilit\u00E0 di Pesca, La pesca \u00E8 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\u00E0 ti consente di trovare tesori pescando\n&econ una piccola possibilit\u00E0 che gli oggetti vengano incantati.\n&eOgni possibile tesoro di Pesca ha una possibilit\u00E0\n&edi essere trovato a ogni livello. Dipende comunque\n&edalla rarit\u00E0 dell'oggetto quanto spesso si trover\u00E0.\n&eQuanto pi\u00F9 alta \u00E8 la tua abilit\u00E0 di Pesca, maggiori\n&esaranno le tue possibilit\u00E0 di trovare tesori migliori. -Guides.Fishing.Section.2=&3Come funziona Pesca sul Ghiaccio?\n&eQuesta capacit\u00E0 passiva ti consente di pescare sui laghi ghiacciati!\n&eLancia la tua canna da pesca in un lago di ghiaccio e l'abilit\u00E0\n&ecreer\u00E0 un piccolo buco nel ghiaccio in cui pescare. -Guides.Fishing.Section.3=&3Come funziona Pescatore Provetto?\n&eQuesta capacit\u00E0 passiva aumenta la possibilit\u00E0 che i pesci abbocchino durante la pesca.\n&eQuando sblocchi questa abilit\u00E0, pescare in\n&euna barca o in un bioma oceanico raddoppia la possibilit\u00E0 che i pesci abbocchino. -Guides.Fishing.Section.4=&3Come funziona Scuotere?\n&eQuesta capacit\u00E0 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\u00E8 anche possibile acquisire teschi di mob, che non sono ottenibili \n&enormalmente in modalit\u00E0 sopravvivenza. -Guides.Fishing.Section.5=&3Come funziona Dieta del Pescatore?\n&eQuesta capacit\u00E0 passiva aumenta la quantit\u00E0 di fame ripristinata\n&emangiando pesce. +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=&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 \u00E8 una capacit\u00E0 attiva, puoi fare clic-destro\n&econ una zappa in mano per attivare Terra Verde.\n&eTerra Verde d\u00E0 ai giocatori la possibilit\u00E0 di ottenere drop 3x\n&eraccogliendo piante. Inoltre d\u00E0 ai giocatori l'abilit\u00E0 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\u00E0 passiva ripianter\u00E0 automaticamente le colture durante\n&ela raccolta.\n&eLe tue possibilit\u00E0 di successo dipendono dalla tua abilit\u00E0 di Erboristeria. -Guides.Herbalism.Section.4=&3Come funziona Pollice Verde (Pietrisco/Mattoni di pietra/Terra)?\n&eQuesta capacit\u00E0 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\u00F2 consumer\u00E0 1 seme. -Guides.Herbalism.Section.5=&3Come funziona Dieta del Contadino?\n&eQuesta capacit\u00E0 passiva aumenta la quantit\u00E0 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\u00E0 passiva ti d\u00E0 una possibilit\u00E0 di trovare oggetti rari\n&equando determinati blocchi vengono rotti con una spada. -Guides.Herbalism.Section.7=&3Come funziona Doppi Drop?\n&eQuesta capacit\u00E0 passiva d\u00E0 ai giocatori una resa migliore ai loro\n&eraccolti. +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=&3Introduzione all'Estrazione:\n&eL'Estrazione consiste nell'estrarre pietre e minerali. Fornisce bonus\n&ealla quantit\u00E0 di materiali estratti.\n\n&3GUADAGNO XP:\n&ePer ottenere XP in questa abilit\u00E0, devi minare con un piccone in mano.\n&eSolo alcuni blocchi assegnano XP. +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'\u00E8 il Super Demolitore?\n&eIl Super Demolitore \u00E8 una capacit\u00E0 con una ricarica legata all'abilit\u00E0\n&edi Estrazione. Triplica le tue possibilit\u00E0 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\u00F2 far\u00E0\n&eesplodere istantaneamente il TNT. -Guides.Mining.Section.5=&3Come funziona Estrazione Esplosiva?\n&eEstrazione Esplosiva \u00E8 una capacit\u00E0 con una ricarica legata all'abilit\u00E0\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 \u00E8 Bombe pi\u00F9 Grandi, che aumenta il raggio di esplosione.\n&eLa seconda \u00E8 Perizia nelle Demolizioni, che diminuisce il danno\n&edalle esplosioni di TNT. La terza parte semplicemente aumenta\n&ela quantit\u00E0 di minerali grezzi ottenuti dal TNT e diminuisce i\n&edetriti. +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=&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 \u00E8\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\u00F2 consuma 1 oggetto per ogni uso. -Guides.Repair.Section.2=&3Come funziona Maestria nella Riparazione?\n&eMaestria nella Riparazione aumenta la quantit\u00E0 di riparazione. La quantit\u00E0 extra\n&eriparata \u00E8 influenzata dal tuo livello di abilit\u00E0 in Riparazione. -Guides.Repair.Section.3=&3Come funziona Super Riparazione?\n&eSuper Riparazione \u00E8 una capacit\u00E0 passiva. Durante la riparazione di un oggetto,\n&ed\u00E0 ai giocatori una possibilit\u00E0 di riparare un oggetto con\n&edoppia efficacia. -Guides.Repair.Section.4=&3Come funziona Forgiatura Arcana?\n&eQuesta capacit\u00E0 passiva ti consente di riparare gli oggetti con una certa\n&epossibilit\u00E0 di mantenere i suoi incantesimi. Gli incantesimi possono essere\n&emantenuti ai loro livelli, declassati a un livello inferiore,\n&eo 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=&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 \u00E8 un'abilit\u00E0 figlia di Riparazione e Pesca, il tuo livello\n&edi abilit\u00E0 di Rottamazione \u00E8 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\u00F2 romper\u00E0 l'oggetto,\n&ee ti dar\u00E0 indietro i materiali usati per crearlo.\n\n&ePer esempio, rottamando un piccone di ferro ti dar\u00E0 dei lingotti di ferro. -Guides.Salvage.Section.2=&3Come funziona la Rottamazione Avanzata?\n&eUna volta sbloccata, questa capacit\u00E0 ti consente di rottamare gli oggetti danneggiati.\n&eLa percentuale di rendimento aumenta all'aumentare del tuo livello. Un rendimento pi\u00F9 elevato\n&esignifica che puoi recuperare pi\u00F9 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 \u00E8 danneggiato per il 20%,\n&eci\u00F2 significa che la quantit\u00E0 massima che potrai ottenere \u00E8 solo 2\n&e(perch\u00E9 il piccone \u00E8 fatto con 3 lingotti - ognuno vale\n&eil 33,33% di durabilit\u00E0) che equivale al 66%. Se la tua percentuale\n&edi rendimento \u00E8 sotto il 66% non potrai ottenere 2 lingotti.\n&eSe \u00E8 sopra questo valore potrai ottenere la "quantit\u00E0 intera",\n&eil che significa che otterrai 2 lingotti. -Guides.Salvage.Section.4=&3Come funziona Rottamazione Arcana?\n&eQuesta capacit\u00E0 ti consente di ottenere libri incantati rottamando\n&eoggetti incantati. La probabilit\u00E0 di estrarre con successo un incantesimo\n&ecompleto o parziale varia a seconda del tuo livello di abilit\u00E0.\n\n&eQuando un incantesimo \u00E8 estratto parzialmente, il libro\n&eincantato avr\u00E0 un livello minore rispetto a quello\n&eche 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=&3Introduzione a Spade:\n&eQuesta abilit\u00E0 assegna bonus di combattimento a chiunque combatta con una\n&espada.\n\n&3GUADAGNO XP:\n&eGli XP si ottengono in base alla quantit\u00E0 di danoo inflitto ai mob o\n&eagli altri giocatori brandendo una spada. -Guides.Swords.Section.1=&3Come funziona Colpi Seghettati?\n&eColpi Seghettati \u00E8 una capacit\u00E0 attiva, puoi attivarla facendo\n&eclic-destro con una spada. Questa capacit\u00E0 ti consente di infliggere\n&eun colpo EaA (Effetto ad Area). Questo EaA far\u00E0 un danno 25%\n&ebonus e infligger\u00E0 un effetto di sanguinamento per 5 tick. -Guides.Swords.Section.2=&3Come funziona Contrattacco?\n&eContrattacco \u00E8 una capacit\u00E0 passiva. Quando blocchi e prendi\n&ecolpi dai mob, hai una possibilit\u00E0 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\u00E0 fino alla fine dell'effetto, o alla morte, \n&equello che viene prima.\n&eLa 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=&3Introduzione alla Domesticazione:\n&eLa Domesticazione d\u00E0 ai giocatori vari bonus di combattimento durante l'utilizzo\n&edi lupi addomesticati.\n\n&3GUADAGNO XP:\n&ePer ottenere XP in questa abilit\u00E0, devi addomesticare lupi/ocelot o\n&ecombattere con i tuoi lupi. -Guides.Taming.Section.1=&3Come funziona Richiamo della Natura?\n&eRichiamo della Natura \u00E8 una capacit\u00E0 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.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 \u00E8 una capacit\u00E0 passiva che ha una possibilit\u00E0 di infliggere un\n&eeffetto di sanguinamento ai bersagli dei tuoi lupi. +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\u00E0 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\u00E0 al danno da caduta. -Guides.Taming.Section.6=&3Come funziona Pelliccia Folta?\n&eQuesta capacit\u00E0 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\u00E0 passiva riduce il danno fatti ai lupi\n&edalle esplosioni. -Guides.Taming.Section.8=&3Come funziona Servizio Fast Food?\n&eQuesta capacit\u00E0 passiva d\u00E0 ai lupi una possibilit\u00E0 di guarire ogni volta\n&eche effettuano un attacco. +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=&3Introduzione alla Lotta:\n&eL'abilit\u00E0 di Lotta d\u00E0 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\u00E0 di danno inflitto a mani nude\n&eai mob o agli altri giocatori. -Guides.Unarmed.Section.1=&3Come funziona Furore?\n&eFurore \u00E8 una capacit\u00E0 attiva che \u00E8 attivata dal\n&eclic-destro. In modalit\u00E0 Furore, infliggi il 50% di danni\n&ein pi\u00F9 e puoi rompere i materiali fragili istantaneamente, come\n&eTerra ed Erba. +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 \u00E8 una capacit\u00E0 passiva che ti d\u00E0 una possibilit\u00E0\n&edi deviare frecce tirate da scheletri o altri giocatori.\n&eLa freccia cadr\u00E0 innocuamente a terra. -Guides.Unarmed.Section.4=&3Come funziona Presa di Ferro?\n&ePresa di Ferro \u00E8 una capacit\u00E0 passiva che contrasta il disarmo. All'aumentare\n&edel tuo livello in Lotta, la possibilit\u00E0 di prevenire un disarmo aumenta. -Guides.Unarmed.Section.5=&3Come funziona Disarmo?\n&eQuesta capacit\u00E0 passiva consente ai giocatori di disarmare altri giocatori,\n&efacendo cadere a terra l'oggetto equipaggiato dal bersaglio. +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=&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 \u00E8 una capacit\u00E0 attiva, puoi fare clic-destro\n&econ un'ascia in mano per attivare Abbattitore d'Alberi. Questo\n&efar\u00E0 rompere l'intero albero istantaneamente, droppando tutti\n&ei suoi tronchi insieme. -Guides.Woodcutting.Section.2=&3Come funziona Soffia Foglie?\n&eSoffia Foglie \u00E8 una capacit\u00E0 passiva che fa\n&ecadere le foglie istantaneamente quando colpite da un'ascia. Di default,\n&equesta capacit\u00E0 si sblocca al livello 100. -Guides.Woodcutting.Section.3=&3Come funziona Doppi Drop?\n&eQuesta capacit\u00E0 passiva ti d\u00E0 una possibilit\u00E0 di ottenere un blocco\n&eextra per ogni tronco che tagli. +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= &cNon hai il permesso per ispezionare i giocatori offline! @@ -984,63 +984,63 @@ 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=&7C'\u00E8 la possibilit\u00E0 che fonda istantaneamente i minerali estratti. +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=&7Il teletrasporto inizier\u00E0 tra &6({0}) &7secondi, non muoverti... +Teleport.Commencing=&7Il teletrasporto inizierà tra &6({0}) &7secondi, non muoverti... Teleport.Cancelled=&4Teletrasporto annullato! #SKILLS -Skills.Child=&6(ABILIT\u00E0 FIGLIA) +Skills.Child=&6(ABILITà FIGLIA) Skills.Disarmed=&4Sei stato disarmato! Skills.Header=-----[] &a{0}&c []----- -Skills.NeedMore=&4Hai bisogno di pi\u00F9 &7{0} +Skills.NeedMore=&4Hai bisogno di più &7{0} Skills.NeedMore.Extra=&4Hai bisogno di altri &7{0}{1} Skills.Parents= GENITORI 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\u00E0. &e({0}s) +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\u00E0. +Skills.AbilityGateRequirementFail=&7Ti servono altri &e{0}&7 livelli di &3{1}&7 per usare questa super capacità. #STATISTICS -Stats.Header.Combat=&6-=ABILIT\u00E0 DI COMBATTIMENTO=- -Stats.Header.Gathering=&6-=ABILIT\u00E0 DI RACCOLTA=- -Stats.Header.Misc=&6-=ABILIT\u00E0 VARIE=- +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.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.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=&6[mcMMO] Modalit\u00E0 hardcore {0} disabilitata per {1}. -Hardcore.Mode.Enabled=&6[mcMMO] Modalit\u00E0 hardcore {0} abilitata per {1}. -Hardcore.DeathStatLoss.Name=Perdita di Abilit\u00E0 alla Morte +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 \u00E8 stata modificata a {0}. +Hardcore.DeathStatLoss.PercentageChanged=&6[mcMMO] La percentuale di Vampirismo è stata modificata a {0}. Hardcore.Vampirism.Name=Vampirismo 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 \u00E8 riuscito a rubarti la conoscenza! +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 \u00E8 stata modificata a {0}. +Hardcore.Vampirism.PercentageChanged=&6[mcMMO] La percentuale di Vampirismo è stata modificata a {0}. #MOTD MOTD.Donate=&3Info Donazioni: -MOTD.Hardcore.Enabled=&6[mcMMO] &3Modalit\u00E0 hardcore abilitata: &4{0} -MOTD.Hardcore.DeathStatLoss.Stats=&6[mcMMO] &3Perdita di Abilit\u00E0 alla Morte: &4{0}% +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} @@ -1048,21 +1048,21 @@ 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.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\u00E0 {0}+ (POTENZIAMENTO XP VANILLA) -Smelting.Ability.Locked.1=BLOCCATO FINO AD ABILIT\u00E0 {0}+ (FUSIONE ISTANTANEA) +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: &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 @@ -1070,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 @@ -1087,22 +1087,22 @@ 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=&eStatistiche mcMMO @@ -1116,27 +1116,27 @@ Scoreboard.Misc.CurrentXP=&aXP Attuali Scoreboard.Misc.RemainingXP=&eXP Rimanenti Scoreboard.Misc.Cooldown=&dRicarica Scoreboard.Misc.Overall=&6Complessivo -Scoreboard.Misc.Ability=Capacit\u00E0 +Scoreboard.Misc.Ability=Capacità #DATABASE RECOVERY Profile.PendingLoad=&cI tuoi dati di mcMMO non sono stati ancora caricati. -Profile.Loading.Success=&aIl tuo profilo mcMMO \u00E8 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\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=&4[A]&c mcMMO non \u00E8 stato in grado di caricare i dati per &e{0}&c. &dControlla la configurazione del database. Tentativi fatti finora {1}. +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=&6{0} \u00E8 ora al livello &a{1}&6! +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=&7Promemoria: 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=&aTraduzioni ricaricate! #Player Leveling Stuff -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\u00E0. -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\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 5b4aa1f9c..9f123a5a1 100644 --- a/src/main/resources/locale/locale_ja_JP.properties +++ b/src/main/resources/locale/locale_ja_JP.properties @@ -2,43 +2,43 @@ #DO NOT USE COLOR CODES IN THE JSON KEYS #COLORS ARE DEFINED IN advanced.yml IF YOU WISH TO CHANGE THEM -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=&6\u30e9\u30c3\u30ad\u30fc\u30d1\u30fc\u30af -JSON.JWrapper.Perks.Lucky={0}% \u826f\u3044\u30aa\u30c3\u30ba +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=\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=&6[ mcMMO&e @&3{0} &6\u30e9\u30f3\u30af &3{1}&6 \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.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 @@ -52,1126 +52,1126 @@ JSON.Hover.AtSymbolURL=&e@ JSON.Notification.SuperAbility={0} #These are the JSON Strings used for SubSkills -JSON.Acrobatics.Roll.Interaction.Activated=\u30c6\u30b9\u30c8 &c\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=&c\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 +JSON.Acrobatics.Roll.Interaction.Activated=テスト &c受け身テスト +JSON.Acrobatics.SubSkill.Roll.Details.Tips=落下中にスニークすると、最大2倍のダメージを防ぐことができます! +Anvil.SingleItemStack=&cスタックされたアイテムはサルベージまたは修復することができません。最初にスタックを分割してください。 -#DO NOT USE COLOR CODES IN THE JSON KEYS +#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**\u30a2\u30d3\u30ea\u30c6\u30a3 \u30ea\u30d5\u30ec\u30c3\u30b7\u30e5\uff01** +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=\u30a8\u30d5\u30a7\u30af\u30c8 -Effects.SubSkills.Overhaul=\u30b5\u30d6\u30b9\u30ad\u30eb +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=\u7d71\u8a08 -Commands.XPGain.Overhaul=&6XP\u7372\u5f97: &3{0} +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\u3067\u3053\u306e\u30b9\u30ad\u30eb\u3092\u898b\u308b&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}\u304c&r&a&l{2}&r&f&l\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 +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=&c---[]&amcMMO \u30b3\u30de\u30f3\u30c9&c[]--- -Commands.Other=&c---[]&a\u30b9\u30da\u30b7\u30e3\u30eb\u30b3\u30de\u30f3\u30c9&c[]--- -Commands.Party.Header=&c-----[]&a\u30d1\u30fc\u30c6\u30a3\u30fc&c[]----- -Commands.Party.Features.Header=&c-----[]&a\u7279\u5fb4&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! +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\u65b0\u3057\u3044\u30b9\u30ad\u30eb\u3092\u5b66\u3093\u3067\u3044\u307e\u3059... -XPBar.Acrobatics=\u30a2\u30af\u30ed\u30d0\u30c6\u30a3\u30c3\u30af Lv.&6{0} -XPBar.Alchemy=\u932c\u91d1\u8853 Lv.&6{0} -XPBar.Archery=\u5f13 Lv.&6{0} -XPBar.Axes=\u65a7 Lv.&6{0} -XPBar.Excavation=\u6398\u524a Lv.&6{0} -XPBar.Fishing=\u91e3\u308a Lv.&6{0} -XPBar.Herbalism=\u8fb2\u696d Lv.&6{0} -XPBar.Mining=\u63a1\u6398 Lv.&6{0} -XPBar.Repair=\u4fee\u7406 Lv.&6{0} -XPBar.Salvage=\u30b5\u30eb\u30d9\u30fc\u30b8 Lv.&6{0} -XPBar.Smelting=\u7cbe\u932c Lv.&6{0} -XPBar.Swords=\u5263 Lv.&6{0} -XPBar.Taming=\u8abf\u6559 Lv.&6{0} -XPBar.Unarmed=\u7d20\u624b Lv.&6{0} -XPBar.Woodcutting=\u6728\u3053\u308a 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.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! +# 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**\u512a\u96c5\u306b\u7740\u5730\u3057\u305f** -Acrobatics.Combat.Proc=&a**\u8eb1\u3057\u305f** -Acrobatics.SubSkill.Roll.Stats=&6\u53d7\u3051\u8eab\u306e\u78ba\u7387 &e{0}%&6 \u512a\u96c5\u306a\u53d7\u3051\u8eab\u306e\u78ba\u7387&e {1}% -Acrobatics.SubSkill.Roll.Stat=\u53d7\u3051\u8eab\u306e\u78ba\u7387 -Acrobatics.SubSkill.Roll.Stat.Extra=\u512a\u96c5\u306a\u53d7\u3051\u8eab\u306e\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\u306e\u78ba\u7387: &e{0} -Acrobatics.SubSkill.Roll.GraceChance=\u512a\u96c5\u306a\u53d7\u3051\u8eab\u306e\u78ba\u7387: &e{0} -Acrobatics.SubSkill.Roll.Mechanics=&7\u843d\u4e0b\u30c0\u30e1\u30fc\u30b8\u3092\u53d7\u3051\u308b\u305f\u3073\u306b\u3001\u30b9\u30ad\u30eb\u30ec\u30d9\u30eb\u306b\u5fdc\u3058\u3066\u30c0\u30e1\u30fc\u30b8\u3092\u5b8c\u5168\u306b\u9632\u3050\u53ef\u80fd\u6027\u304c\u3042\u308a\u3001\u30ec\u30d9\u30eb&e{6}%&7\u3067\u306f\u30c0\u30e1\u30fc\u30b8\u3092\u9632\u3050\u78ba\u7387\u304c&e{0}%&7\u3067\u3059\u3002\n\u30b9\u30cb\u30fc\u30af\u30dc\u30bf\u30f3\u3092\u62bc\u3059\u3053\u3068\u3067\u3001\u843d\u4e0b\u30c0\u30e1\u30fc\u30b8\u3092\u56de\u907f\u3059\u308b\u78ba\u7387\u304c2\u500d\u306b\u306a\u308a\u3001\u6700\u59272\u500d\u306e\u843d\u4e0b\u30c0\u30e1\u30fc\u30b8\u3092\u56de\u907f\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u30b9\u30cb\u30fc\u30af\u30dc\u30bf\u30f3\u3092\u62bc\u3059\u3068\u3001\u901a\u5e38\u306e\u53d7\u3051\u8eab\u304c\u300c\u512a\u96c5\u306a\u53d7\u3051\u8eab\u300d\u306b\u5909\u5316\u3057\u307e\u3059\u3002\u512a\u96c5\u306a\u53d7\u3051\u8eab\u306f\u6700\u5927\u3067&a{5}&7\u30c0\u30e1\u30fc\u30b8\u3092\u9632\u3050\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002 -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=&o**\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: &a{0}&3/&a{1} -Alchemy.SubSkill.Concoctions.Stat.Extra=\u6750\u6599 [&a{0}&3]: &a{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\u306e\u78ba\u7387 -Archery.SubSkill.ArrowRetrieval.Name=\u77e2\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\u56de\u53ce\u306e\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=\u30a2\u30c3\u30af\u30b9\u30de\u30b9\u30bf\u30ea\u30fc -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=&7\u65a7\u3092\u4e0b\u3052\u305f\u3002 -Axes.Ability.Ready=&3\u65a7\u3092&6\u6e96\u5099&3\u3057\u305f\u3002 -Axes.Ability.Ready.Extra=&3\u65a7\u3092&6\u6e96\u5099&3\u3057\u305f\u3002 &7({0} \u304c {1} \u79d2\u306e\u30af\u30fc\u30eb\u30c0\u30a6\u30f3\u4e2d) -Axes.Combat.CritStruck=&4\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=&a**\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=&4\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\u306e\u78ba\u7387 -Axes.SubSkill.AxeMastery.Name=\u30a2\u30c3\u30af\u30b9\u30de\u30b9\u30bf\u30ea\u30fc -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=&a**\u30b9\u30ab\u30eb\u30b9\u30d7\u30ea\u30c3\u30bf\u30fc \u30a2\u30af\u30c6\u30a3\u30d9\u30fc\u30c8** -Axes.Skills.SS.Refresh=&e\u30b9\u30ab\u30eb\u30b9\u30d7\u30ea\u30c3\u30bf\u30fc &a\u30a2\u30d3\u30ea\u30c6\u30a3\u304c\u56de\u5fa9\u3057\u307e\u3057\u305f\uff01 -Axes.Skills.SS.Other.Off=&e{0}\u304c &f\u30b9\u30ab\u30eb\u30b9\u30d7\u30ea\u30c3\u30bf\u30fc &a\u3092\u6d88\u8017\u3057\u305f -Axes.Skills.SS.Other.On=&a{0}&2\u304c &c\u30b9\u30ab\u30eb\u30b9\u30d7\u30ea\u30c3\u30bf\u30fc &2\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=&7\u30b7\u30e3\u30d9\u30eb\u3092\u4e0b\u3052\u305f\u3002 -Excavation.Ability.Ready=&3\u30b7\u30e3\u30d9\u30eb\u3092&6\u6e96\u5099&3\u3057\u305f\u3002 -Excavation.SubSkill.GigaDrillBreaker.Name=\u30ae\u30ac\u30c9\u30ea\u30eb\u30d6\u30ec\u30a4\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\u30a4\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\u30a4\u30ab\u30fc \u3092\u6d88\u8017\u3057\u305f** -Excavation.Skills.GigaDrillBreaker.On=&a**\u30ae\u30ac\u30c9\u30ea\u30eb\u30d6\u30ec\u30a4\u30ab\u30fc \u30a2\u30af\u30c6\u30a3\u30d9\u30fc\u30c8** -Excavation.Skills.GigaDrillBreaker.Refresh=&e\u30ae\u30ac\u30c9\u30ea\u30eb\u30d6\u30ec\u30a4\u30ab\u30fc &a\u30a2\u30d3\u30ea\u30c6\u30a3\u304c\u56de\u5fa9\u3057\u307e\u3057\u305f\uff01 -Excavation.Skills.GigaDrillBreaker.Other.Off=&e{0}\u304c &f\u30ae\u30ac\u30c9\u30ea\u30eb\u30d6\u30ec\u30a4\u30ab\u30fc &a\u3092\u6d88\u8017\u3057\u305f -Excavation.Skills.GigaDrillBreaker.Other.On=&a{0}&2\u304c &c\u30ae\u30ac\u30c9\u30ea\u30eb\u30d6\u30ec\u30a4\u30ab\u30fc &2\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=&e&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=&7&o\u6df7\u6c8c\u3068\u3057\u305f\u52d5\u304d\u306f\u9b5a\u3092\u6016\u304c\u3089\u305b\u307e\u3059\uff01 -Fishing.Exhausting=&c&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=&7\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: &7 **\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 (\u30a2\u30a4\u30b9\u30d5\u30a3\u30c3\u30b7\u30f3\u30b0) -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: &a{0}&3/&a{1} -Fishing.SubSkill.TreasureHunter.Stat.Extra=\u30c9\u30ed\u30c3\u30d7\u7387: &7\u30b3\u30e2\u30f3: &e{0} &a\u30a2\u30f3\u30b3\u30e2\u30f3: &e{1}\n&9\u30ec\u30a2: &e{2} &d\u30a8\u30d4\u30c3\u30af: &e{3} &6\u30ec\u30b8\u30a7\u30f3\u30c0\u30ea\u30fc: &e{4} &bMythic: &e{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\u306e\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\u306e\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:&a \u30e9\u30f3\u30af {0} -Fishing.SubSkill.MasterAngler.Name=\u30de\u30b9\u30bf\u30fc\u30a2\u30f3\u30b0\u30e9\u30fc -Fishing.SubSkill.MasterAngler.Description=\u9b5a\u304c\u3088\u304f\u91e3\u308c\u307e\u3059\u3001\u8239\u304b\u3089\u306e\u91e3\u308a\u3067\u306f\u3088\u308a\u52b9\u679c\u7684\u3067\u3059\u3002 -Fishing.SubSkill.MasterAngler.Stat=\u91e3\u308a\u306e\u6700\u4f4e\u5f85\u3061\u6642\u9593\u77ed\u7e2e: &a-{0} \u79d2 -Fishing.SubSkill.MasterAngler.Stat.Extra=\u91e3\u308a\u306e\u6700\u5927\u5f85\u3061\u6642\u9593\u77ed\u7e2e: &a-{0} \u79d2 -Fishing.SubSkill.IceFishing.Name=\u30a2\u30a4\u30b9\u30d5\u30a3\u30c3\u30b7\u30f3\u30b0 -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=\u30a2\u30a4\u30b9\u30d5\u30a3\u30c3\u30b7\u30f3\u30b0 -Fishing.Chance.Raining=&9 \u96e8\u30dc\u30fc\u30ca\u30b9 -Fishing.Listener=\u91e3\u308a: -Fishing.Ability.TH.MagicFound=&7\u9b54\u6cd5\u3092\u611f\u3058\u307e\u3059\u3002 +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\u306a\u304b\u306a\u304b\u3044\u3044\u5302\u3044\u304c\u3057\u306a\u3044... -Fishing.SkillName=\u91e3\u308a +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=**\u30b0\u30ea\u30fc\u30f3\u30b5\u30e0 \u5931\u6557** -Herbalism.Ability.GTh=&a**\u30b0\u30ea\u30fc\u30f3\u30b5\u30e0** -Herbalism.Ability.Lower=&7\u30af\u30ef\u3092\u4e0b\u3052\u305f\u3002 -Herbalism.Ability.Ready=&3\u30af\u30ef\u3092&6\u6e96\u5099&3\u3057\u305f\u3002 -Herbalism.Ability.ShroomThumb.Fail=**\u30b7\u30e5\u30eb\u30fc\u30e0\u30b5\u30e0 \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=\u30b0\u30ea\u30fc\u30f3\u30b5\u30e0 -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=\u30b0\u30ea\u30fc\u30f3\u30b5\u30e0\u306e\u78ba\u7387 -Herbalism.SubSkill.GreenThumb.Stat.Extra=\u30b0\u30ea\u30fc\u30f3\u30b5\u30e0 \u30b9\u30c6\u30fc\u30b8: &a \u4f5c\u7269\u306f\u30b9\u30c6\u30fc\u30b8 {0} \u306b\u6210\u9577 -Herbalism.Effect.4=\u30b0\u30ea\u30fc\u30f3\u30b5\u30e0 (\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: &a\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\u306e\u78ba\u7387 -Herbalism.SubSkill.HylianLuck.Name=\u30cf\u30a4\u30ea\u30a2\u30f3\u30e9\u30c3\u30af -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\u30f3\u30e9\u30c3\u30af\u306e\u78ba\u7387 -Herbalism.SubSkill.ShroomThumb.Name=\u30b7\u30e5\u30eb\u30fc\u30e0\u30b5\u30e0 -Herbalism.SubSkill.ShroomThumb.Description=\u571f\u3084\u8349\u306b\u83cc\u7cf8\u3092\u5e83\u3052\u308b\u3002 -Herbalism.SubSkill.ShroomThumb.Stat=\u30b7\u30e5\u30eb\u30fc\u30e0\u30b5\u30e0\u306e\u78ba\u7387 -Herbalism.HylianLuck=&a\u30cf\u30a4\u30ea\u30a2\u30f3\u30e9\u30c3\u30af\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=&a**\u30b0\u30ea\u30fc\u30f3\u30c6\u30e9 \u30a2\u30af\u30c6\u30a3\u30d9\u30fc\u30c8** -Herbalism.Skills.GTe.Refresh=&e\u30b0\u30ea\u30fc\u30f3\u30c6\u30e9 &a\u30a2\u30d3\u30ea\u30c6\u30a3\u304c\u56de\u5fa9\u3057\u307e\u3057\u305f\uff01 -Herbalism.Skills.GTe.Other.Off=&e{0}\u304c &f\u30b0\u30ea\u30fc\u30f3\u30c6\u30e9 &a\u3092\u6d88\u8017\u3057\u305f -Herbalism.Skills.GTe.Other.On=&a{0}&2\u304c &c\u30b0\u30ea\u30fc\u30f3\u30c6\u30e9 &2\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=&7\u30d4\u30c3\u30b1\u30eb\u3092\u4e0b\u3052\u305f\u3002 -Mining.Ability.Ready=&3\u30d4\u30c3\u30b1\u30eb\u3092&6\u6e96\u5099&3\u3057\u305f\u3002 -Mining.SubSkill.SuperBreaker.Name=\u30b9\u30fc\u30d1\u30fc\u30d6\u30ec\u30a4\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\u30a4\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\u306e\u78ba\u7387: &e{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:&a \u30e9\u30f3\u30af {0}/{1} &7({2}) -Mining.SubSkill.BlastMining.Stat.Extra=\u7206\u767a\u7bc4\u56f2\u5897\u52a0: &a+{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\u30a4\u30ab\u30fc \u3092\u6d88\u8017\u3057\u305f** -Mining.Skills.SuperBreaker.On=&a**\u30b9\u30fc\u30d1\u30fc\u30d6\u30ec\u30a4\u30ab\u30fc \u30a2\u30af\u30c6\u30a3\u30d9\u30fc\u30c8** -Mining.Skills.SuperBreaker.Other.Off=&e{0}\u304c &f\u30b9\u30fc\u30d1\u30fc\u30d6\u30ec\u30a4\u30ab\u30fc &a\u3092\u6d88\u8017\u3057\u305f -Mining.Skills.SuperBreaker.Other.On=&a{0}&2\u304c &c\u30b9\u30fc\u30d1\u30fc\u30d6\u30ec\u30a4\u30ab\u30fc &2\u3092\u4f7f\u3063\u305f\uff01 -Mining.Skills.SuperBreaker.Refresh=&e\u30b9\u30fc\u30d1\u30fc\u30d6\u30ec\u30a4\u30ab\u30fc &a\u30a2\u30d3\u30ea\u30c6\u30a3\u304c\u56de\u5fa9\u3057\u307e\u3057\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=&7**BOOM** Mining.Blast.Cooldown= -Mining.Blast.Effect=\u9271\u77f3 +{0} \u306e\u53ce\u91cf, {1}x \u30c9\u30ed\u30c3\u30d7 -Mining.Blast.Other.On=&a{0}&2 \u304c &c\u30d6\u30e9\u30b9\u30c8\u30de\u30a4\u30cb\u30f3\u30b0 &2\u3092\u4f7f\u3063\u305f\uff01 -Mining.Blast.Refresh=&e\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=\u30ea\u30da\u30a2\u30de\u30b9\u30bf\u30ea\u30fc -Repair.SubSkill.RepairMastery.Description=\u4fee\u7406\u91cf\u306e\u5897\u52a0 -Repair.SubSkill.RepairMastery.Stat=\u30ea\u30da\u30a2\u30de\u30b9\u30bf\u30ea\u30fc: &a\u8ffd\u52a0 {0} \u8010\u4e45\u529b\u56de\u5fa9 -Repair.SubSkill.SuperRepair.Name=\u30b9\u30fc\u30d1\u30fc\u30ea\u30da\u30a2 -Repair.SubSkill.SuperRepair.Description=\u4e8c\u91cd\u306e\u52b9\u679c -Repair.SubSkill.SuperRepair.Stat=\u30b9\u30fc\u30d1\u30fc\u30ea\u30da\u30a2\u306e\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=\u30a2\u30eb\u30ab\u30f3\u30d5\u30a9\u30fc\u30b8\u30f3\u30b0 -Repair.SubSkill.ArcaneForging.Description=\u9b54\u6cd5\u306e\u30a2\u30a4\u30c6\u30e0\u3092\u4fee\u7406\u3059\u308b\u3002 -Repair.SubSkill.ArcaneForging.Stat=\u30a2\u30eb\u30ab\u30f3\u30d5\u30a9\u30fc\u30b8\u30f3\u30b0: &e\u30e9\u30f3\u30af {0}/{1} -Repair.SubSkill.ArcaneForging.Stat.Extra=&3\u30a2\u30eb\u30ab\u30f3\u30d5\u30a9\u30fc\u30b8\u30f3\u30b0 \u30aa\u30c3\u30ba:&7 \u6210\u529f &a{0}&7%, \u5931\u6557 &c{1}&7% -Repair.Error=&4\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=&4\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=&4\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=&4\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=&4\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=&4\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=&e{1} &c\u3092\u4fee\u7406\u3059\u308b\u305f\u3081\u306b\u306f &e{0} &c\u30ec\u30d9\u30eb\u304c\u5fc5\u8981\u3067\u3059\u3002 -Repair.Skills.FeltEasy=&7\u305d\u308c\u306f\u7c21\u5358\u306b\u611f\u3058\u305f\u3002 -Repair.Skills.FullDurability=&7\u305d\u308c\u306f\u5b8c\u5168\u306a\u8010\u4e45\u6027\u3067\u3059\u3002 -Repair.Skills.StackedItems=&4\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=&a\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: &a\u6700\u5927&e{0}\u500b&a\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=\u30a2\u30eb\u30ab\u30f3\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=\u30a2\u30eb\u30ab\u30f3\u30b5\u30eb\u30d9\u30fc\u30b8: &e\u30e9\u30f3\u30af {0}/{1} -Salvage.Ability.Bonus.0=\u30b9\u30af\u30e9\u30c3\u30d7\u30b3\u30ec\u30af\u30bf\u30fc -Salvage.Ability.Bonus.1=&a\u6700\u5927&e{0}\u500b&a\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=&7\u30d5\u30eb\u30a8\u30f3\u30c1\u30e3\u30f3\u30c8\u306e\u78ba\u7387 -Salvage.Arcane.ExtractPartial=&7\u90e8\u5206\u7684\u306a\u30a8\u30f3\u30c1\u30e3\u30f3\u30c8\u306e\u78ba\u7387 -Salvage.Skills.Success=&a\u30a2\u30a4\u30c6\u30e0\u3092\u30b5\u30eb\u30d9\u30fc\u30b8\uff01 -Salvage.Skills.Adept.Damaged=&4\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=&e{1} &c\u3092\u30b5\u30eb\u30d9\u30fc\u30b8\u3059\u308b\u305f\u3081\u306b\u306f &e{0} &c\u30ec\u30d9\u30eb\u304c\u5fc5\u8981\u3067\u3059\u3002 -Salvage.Skills.TooDamaged=&4\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=&c\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=&c\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=&a\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=&4\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=&e{1}&6\u304b\u3089&3{0}&6\u306e\u7d20\u6750\u3092\u56de\u53ce\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3057\u305f\u3002 -Salvage.Skills.Lottery.Perfect=&a&l\u30d1\u30fc\u30d5\u30a7\u30af\u30c8\uff01&r&6 \u3042\u306a\u305f\u306f &3{1}&6\u3092\u30b5\u30eb\u30d9\u30fc\u30b8\u3057\u3001&3{0}&6\u500b\u306e\u7d20\u6750\u3092\u56de\u53ce\u3057\u307e\u3057\u305f\u3002 -Salvage.Skills.Lottery.Untrained=&7\u3042\u306a\u305f\u306f\u30b5\u30eb\u30d9\u30fc\u30b8\u3092\u6b63\u3057\u304f\u8a13\u7df4\u3067\u304d\u3066\u3044\u307e\u305b\u3093\u3002 &a{1}&7\u304b\u3089&c{0}&7\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=&7\u5263\u3092\u4e0b\u3052\u305f\u3002 -Swords.Ability.Ready=&3\u5263\u3092&6\u6e96\u5099&3\u3057\u305f\u3002 -Swords.Combat.Rupture.Note=&7\u6ce8\u610f\uff1a&e 0.5\u79d2\u3054\u3068\u306b1tick\u304c\u767a\u751f\u3057\u307e\u3059\u3002 -Swords.Combat.Bleeding.Started=&4 \u3042\u306a\u305f\u306f\u51fa\u8840\u3057\u3066\u3044\u307e\u3059\uff01 -Swords.Combat.Bleeding.Stopped=&7\u51fa\u8840\u304c &a\u6b62\u307e\u308a\u307e\u3057\u305f&7\uff01 -Swords.Combat.Bleeding=&a**\u30a8\u30cd\u30df\u30fc \u51fa\u8840** -Swords.Combat.Counter.Hit=&4\u30ab\u30a6\u30f3\u30bf\u30fc\u653b\u6483\u304c\u30d2\u30c3\u30c8\uff01 -Swords.Combat.Countered=&a**\u30ab\u30a6\u30f3\u30bf\u30fc\u653b\u6483** +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=\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\u306e\u78ba\u7387 -Swords.SubSkill.SerratedStrikes.Name=\u30bb\u30ec\u30fc\u30b7\u30e7\u30f3\u30b9\u30c8\u30e9\u30a4\u30af -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=\u30bb\u30ec\u30fc\u30b7\u30e7\u30f3\u30b9\u30c8\u30e9\u30a4\u30af\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\u306e\u78ba\u7387 -Swords.SubSkill.Rupture.Stat.Extra=&3\u7834\u88c2: &e{0}s&a vs \u30d7\u30ec\u30a4\u30e4\u30fc, &e{1}s&a vs Mobs. -Swords.SubSkill.Rupture.Stat.TickDamage=&3\u7834\u88c2\u306e\u30c6\u30a3\u30c3\u30af\u3042\u305f\u308a\u306e\u30c0\u30e1\u30fc\u30b8: &e{0}&a vs \u30d7\u30ec\u30a4\u30e4\u30fc, &e{1}&a vs Mobs. -Swords.SubSkill.Rupture.Stat.ExplosionDamage=&3\u7834\u88c2\u306e\u7206\u767a\u30c0\u30e1\u30fc\u30b8: &e{0}&a vs \u30d7\u30ec\u30a4\u30e4\u30fc, &e{1}&a vs Mobs -Swords.Effect.4=\u30bb\u30ec\u30fc\u30b7\u30e7\u30f3\u30b9\u30c8\u30e9\u30a4\u30af\u306e\u7834\u88c2+ -Swords.Effect.5={0} Tick \u7834\u88c2 -Swords.Listener=\u5263: -Swords.SkillName=\u5263 -Swords.Skills.SS.Off=**\u30bb\u30ec\u30fc\u30b7\u30e7\u30f3\u30b9\u30c8\u30e9\u30a4\u30af \u3092\u6d88\u8017\u3057\u305f** -Swords.Skills.SS.On=&a**\u30bb\u30ec\u30fc\u30b7\u30e7\u30f3\u30b9\u30c8\u30e9\u30a4\u30af \u30a2\u30af\u30c6\u30a3\u30d9\u30fc\u30c8** -Swords.Skills.SS.Refresh=&e\u30bb\u30ec\u30fc\u30b7\u30e7\u30f3\u30b9\u30c8\u30e9\u30a4\u30af &a\u30a2\u30d3\u30ea\u30c6\u30a3\u304c\u56de\u5fa9\u3057\u307e\u3057\u305f\uff01 -Swords.Skills.SS.Other.Off=&e{0}\u304c &f\u30bb\u30ec\u30fc\u30b7\u30e7\u30f3\u30b9\u30c8\u30e9\u30a4\u30af &a\u3092\u6d88\u8017\u3057\u305f -Swords.Skills.SS.Other.On=&a{0}&2 \u304c &c\u30bb\u30ec\u30fc\u30b7\u30e7\u30f3\u30b9\u30c8\u30e9\u30a4\u30af &2\u3092\u4f7f\u3063\u305f\uff01 +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=\u6d41\u8840\u306e\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=\u30b3\u30fc\u30eb\u30aa\u30d6\u30b6\u30ef\u30a4\u30eb\u30c9 -Taming.SubSkill.CallOfTheWild.Description=\u52d5\u7269\u3092\u53ec\u559a\u3059\u308b\u3002 -Taming.SubSkill.CallOfTheWild.Description.2=&7COTW: \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=\u6d41\u8840 -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=&8\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=&a(\u30b3\u30fc\u30eb\u30aa\u30d6\u30b6\u30ef\u30a4\u30eb\u30c9) &7\u3042\u306a\u305f\u306f&6{0}&7\u3092\u53ec\u559a\u3057\u307e\u3057\u305f&7 -Taming.Summon.COTW.Success.WithLifespan=&a(\u30b3\u30fc\u30eb\u30aa\u30d6\u30b6\u30ef\u30a4\u30eb\u30c9) &6{0}&7\u3092\u53ec\u559a\u3057\u307e\u3057\u305f\u304c\u3001\u6301\u7d9a\u6642\u9593\u306f&6{1}&7\u79d2\u3067\u3059\u3002 -Taming.Summon.COTW.Limit=&a(\u30b3\u30fc\u30eb\u30aa\u30d6\u30b6\u30ef\u30a4\u30eb\u30c9) &6{0}&7\u306f\u540c\u6642\u306b&6{1}&7\u5339\u3057\u304b\u53ec\u559a\u3067\u304d\u307e\u305b\u3093\u3002 -Taming.Summon.COTW.TimeExpired=&a(\u30b3\u30fc\u30eb\u30aa\u30d6\u30b6\u30ef\u30a4\u30eb\u30c9) &7\u6642\u9593\u5207\u308c\u3067&6{0}&7\u304c\u7acb\u3061\u53bb\u308a\u307e\u3057\u305f\u3002 -Taming.Summon.COTW.Removed=&a(\u30b3\u30fc\u30eb\u30aa\u30d6\u30b6\u30ef\u30a4\u30eb\u30c9) &7\u3042\u306a\u305f\u306e\u53ec\u559a\u3057\u305f&6{0}&7\u306f\u30ef\u30fc\u30eb\u30c9\u304b\u3089\u6d88\u3048\u307e\u3057\u305f\u3002 -Taming.Summon.COTW.BreedingDisallowed=&a(\u30b3\u30fc\u30eb\u30aa\u30d6\u30b6\u30ef\u30a4\u30eb\u30c9) &4\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=&a(\u30b3\u30fc\u30eb\u30aa\u30d6\u30b6\u30ef\u30a4\u30eb\u30c9) &e{1}&7\u304c&3{0}&7\u500b\u5fc5\u8981\u3067\u3059\u3002 +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=\u30b9\u30c1\u30fc\u30eb\u30a2\u30fc\u30e0\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=&a\u30a2\u30a4\u30a2\u30f3\u30b0\u30ea\u30c3\u30d7\u304c\u6b66\u88c5\u89e3\u9664\u3092\u9632\u304e\u307e\u3057\u305f\uff01 -Unarmed.Ability.Lower=&7\u7d20\u624b\u3092\u4e0b\u3052\u305f\u3002 -Unarmed.Ability.Ready=&3\u7d20\u624b\u3092&6\u6e96\u5099&3\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\u306e\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.SteelArmStyle.Name=\u30b9\u30c1\u30fc\u30eb\u30a2\u30fc\u30e0\u30b9\u30bf\u30a4\u30eb -Unarmed.SubSkill.SteelArmStyle.Description=\u6642\u9593\u304c\u7d4c\u3064\u3068\u8155\u304c\u786c\u304f\u306a\u308b -Unarmed.SubSkill.ArrowDeflect.Name=\u30a2\u30ed\u30fc\u30c7\u30a3\u30d5\u30ec\u30af\u30b7\u30e7\u30f3 -Unarmed.SubSkill.ArrowDeflect.Description=\u77e2\u3092\u305d\u3089\u3059\u3002 -Unarmed.SubSkill.ArrowDeflect.Stat=\u77e2\u3092\u305d\u3089\u3059\u306e\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\u306e\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=&a**\u30d0\u30fc\u30b5\u30fc\u30ab\u30fc \u30a2\u30af\u30c6\u30a3\u30d9\u30fc\u30c8** -Unarmed.Skills.Berserk.Other.Off=&e{0}\u304c &f\u30d0\u30fc\u30b5\u30fc\u30ab\u30fc &a\u3092\u6d88\u8017\u3057\u305f -Unarmed.Skills.Berserk.Other.On=&a{0}&2\u304c &c\u30d0\u30fc\u30b5\u30fc\u30ab\u30fc &2\u3092\u4f7f\u3063\u305f\uff01 -Unarmed.Skills.Berserk.Refresh=&e\u30d0\u30fc\u30b5\u30fc\u30ab\u30fc &a\u30a2\u30d3\u30ea\u30c6\u30a3\u304c\u56de\u5fa9\u3057\u307e\u3057\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.KnockOnWood.Name=\u30ce\u30c3\u30af\u30aa\u30f3\u30a6\u30c3\u30c9 -Woodcutting.SubSkill.KnockOnWood.Description=\u30c4\u30ea\u30fc\u30fb\u30d5\u30a7\u30e9\u30fc\u3092\u4f7f\u7528\u3057\u3066\u3044\u308b\u5834\u5408\u3001\u3055\u3089\u306b\u304a\u5f97\u306a\u30b0\u30c3\u30ba\u3092\u63a2\u3059\u3053\u3068\u304c\u3067\u304d\u308b\u3002 -Woodcutting.SubSkill.KnockOnWood.Stat=\u30ce\u30c3\u30af\u30aa\u30f3\u30a6\u30c3\u30c9 -Woodcutting.SubSkill.KnockOnWood.Loot.Normal=\u6728\u304b\u3089\u306e\u6a19\u6e96\u7684\u306a\u30a2\u30a4\u30c6\u30e0 -Woodcutting.SubSkill.KnockOnWood.Loot.Rank2=\u6728\u304b\u3089\u306e\u6a19\u6e96\u7684\u306a\u30a2\u30a4\u30c6\u30e0\u3068\u7d4c\u9a13\u5024\u30aa\u30fc\u30d6 -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\u306e\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=&a**\u30c4\u30ea\u30fc\u30d5\u30a7\u30e9\u30fc \u30a2\u30af\u30c6\u30a3\u30d9\u30fc\u30c8** -Woodcutting.Skills.TreeFeller.Refresh=&e\u30c4\u30ea\u30fc\u30d5\u30a7\u30e9\u30fc &a\u30a2\u30d3\u30ea\u30c6\u30a3\u304c\u56de\u5fa9\u3057\u307e\u3057\u305f\uff01 -Woodcutting.Skills.TreeFeller.Other.Off=&e{0}\u304c &f\u30c4\u30ea\u30fc\u30d5\u30a7\u30e9\u30fc &a\u3092\u6d88\u8017\u3057\u305f -Woodcutting.Skills.TreeFeller.Other.On=&a{0}&2\u304c &c\u30c4\u30ea\u30fc\u30d5\u30a7\u30e9\u30fc &2\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=&f**\u77e2\u3092\u305d\u3089\u3057\u305f** -Combat.BeastLore=&a**\u30d3\u30fc\u30b9\u30c8\u30ed\u30a2** -Combat.BeastLoreHealth=&3\u4f53\u529b (&a{0}&3/{1}) -Combat.BeastLoreOwner=&3\u6240\u6709\u8005 (&c{0}&3) -Combat.BeastLoreHorseSpeed=&3\u99ac\u306e\u79fb\u52d5\u901f (&a{0} \u30d6\u30ed\u30c3\u30af/\u79d2&3) -Combat.BeastLoreHorseJumpStrength=&3\u99ac\u306e\u30b8\u30e3\u30f3\u30d7\u529b (&a\u6700\u5927 {0} \u30d6\u30ed\u30c3\u30af&3) -Combat.Gore=&a**\u6d41\u8840** -Combat.StruckByGore=**\u6d41\u8840\u3057\u3066\u3044\u307e\u3059** -Combat.TargetDazed=\u30bf\u30fc\u30b2\u30c3\u30c8\u306f&4\u5e7b\u60d1[&r\u3060\u3063\u305f +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=&emcMMO&3\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306b\u3064\u3044\u3066:,&6mcMMO\u306f2011\u5e742\u6708\u306b&9nossr50&6\u306b\u3088\u3063\u3066\u958b\u59cb\u3055\u308c\u305f&c\u30aa\u30fc\u30d7\u30f3\u30bd\u30fc\u30b9\u306e&6RPG mod\u3067\u3059\u3002,\u76ee\u6a19\u306f\u9ad8\u54c1\u8cea\u306eRPG\u4f53\u9a13\u3092\u63d0\u4f9b\u3059\u308b\u3053\u3068\u3067\u3059\u3002,&3\u30d2\u30f3\u30c8:,&6 - &c/mcmmo help&a\u3092\u4f7f\u7528\u3057\u3066\u30b3\u30de\u30f3\u30c9\u3092\u8868\u793a\u3057\u307e\u3059,&6 - &c/\u30b9\u30ad\u30eb\u540d&a\u3092\u4f7f\u7528\u3057\u3066\u30b9\u30ad\u30eb\u306e\u8a73\u7d30\u60c5\u5831\u3092\u8868\u793a\u3057\u307e\u3059,&3\u958b\u767a\u8005:,&6 - &anossr50 &9(\u4f5c\u8005 & \u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u30ea\u30fc\u30c0\u30fc),&6 - &aelectronicboy &9(\u958b\u767a),&6 - &akashike &9(\u958b\u767a),&6 - &at00thpick1 &9(Classic \u30e1\u30f3\u30c6\u30ca\u30fc) -mcMMO.Description.FormerDevs=&3\u5143\u958b\u767a\u8005: &aGJ, NuclearW, bm01, TfT_02, Glitchfinder -Commands.addlevels.AwardAll.1=&a\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=&a{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=&a\u3059\u3079\u3066\u306e\u30b9\u30ad\u30eb\u3067{0}\u7d4c\u9a13\u5024\u3092\u7372\u5f97\u3057\u307e\u3057\u305f\uff01 -Commands.addxp.AwardSkill=&a{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&c\u30aa\u30d5&f\u306b\u5207\u308a\u66ff\u3048\u307e\u3057\u305f\u3002 -Commands.Ability.On=\u30a2\u30d3\u30ea\u30c6\u30a3\u306e\u4f7f\u7528\u3092&a\u30aa\u30f3&f\u306b\u5207\u308a\u66ff\u3048\u307e\u3057\u305f\u3002 -Commands.Ability.Toggle=&e{0}&f\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&c\u30aa\u30d5&f\u306b\u5207\u308a\u66ff\u3048\u307e\u3057\u305f\u3002 -Commands.AdminChat.On=\u7ba1\u7406\u7528\u30c1\u30e3\u30c3\u30c8\u306e\u4f7f\u7528\u3092&a\u30aa\u30f3&f\u306b\u5207\u308a\u66ff\u3048\u307e\u3057\u305f\u3002 -Commands.AdminToggle=&a- \u7ba1\u7406\u7528\u30c1\u30e3\u30c3\u30c8\u306e\u5207\u308a\u66ff\u3048 -Commands.Chat.Console=*\u30b3\u30f3\u30bd\u30fc\u30eb* -Commands.Cooldowns.Header=&6--= &amcMMO \u30a2\u30d3\u30ea\u30c6\u30a3 \u30af\u30fc\u30eb\u30c0\u30a6\u30f3&6 =-- -Commands.Cooldowns.Row.N=\ &c{0}&f - &6\u6b8b\u308a {1} \u79d2 -Commands.Cooldowns.Row.Y=\ &b{0}&f - &2\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.Cooldown=\u3053\u306e\u30b3\u30de\u30f3\u30c9\u3092\u518d\u5ea6\u4f7f\u7528\u3059\u308b\u524d\u306b {0} \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= &c\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&e{0}&f\u306b\u5207\u308a\u66ff\u3048\u3089\u308c\u307e\u3057\u305f\u3002 +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] \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&e{0}&f\u306b\u5207\u308a\u66ff\u3048\u3089\u308c\u307e\u3057\u305f\u3002 -Commands.Healthbars.Changed.HEARTS=[mcMMO] \u4f53\u529b\u30d0\u30fc\u306e\u8868\u793a\u304c&cHeart&f\u306b\u5207\u308a\u66ff\u3048\u3089\u308c\u307e\u3057\u305f\u3002 -Commands.Healthbars.Changed.BAR=[mcMMO] \u4f53\u529b\u30d0\u30fc\u306e\u8868\u793a\u304c&eBoxed&f\u306b\u5207\u308a\u66ff\u3048\u3089\u308c\u307e\u3057\u305f\u3002 -Commands.Healthbars.Changed.DISABLED=[mcMMO] MOB\u306e\u4f53\u529b\u30d0\u30fc\u304c&7\u7121\u52b9&f\u3002 -Commands.Healthbars.Invalid=\u4f53\u529b\u30d0\u30fc\u306e\u30bf\u30a4\u30d7\u304c\u7121\u52b9\uff01 -Commands.Inspect=<\u30d7\u30ec\u30a4\u30e4\u30fc> &a- \u8a73\u7d30\u306a\u30d7\u30ec\u30a4\u30e4\u30fc\u60c5\u5831\u3092\u898b\u308b\u3002 -Commands.Invite.Success=&a\u62db\u5f85\u304c\u6b63\u5e38\u306b\u9001\u4fe1\u3055\u308c\u307e\u3057\u305f\u3002 -Commands.Leaderboards=<\u30b9\u30ad\u30eb> <\u30da\u30fc\u30b8> &a- \u30ea\u30fc\u30c0\u30fc\u30dc\u30fc\u30c9 -Commands.mcgod=&a- \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=&a\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306f\u6b63\u5e38\u306b\u30d1\u30fc\u30b8\u3055\u308c\u307e\u3057\u305f\uff01 -Commands.mcrank.Heading=&6-=\u500b\u4eba\u30e9\u30f3\u30ad\u30f3\u30b0=- -Commands.mcrank.Overall=\u5168\u4f53&a - &6\u30e9\u30f3\u30af &f#&a{0} -Commands.mcrank.Player=&e\u30e9\u30f3\u30ad\u30f3\u30b0 &f{0} -Commands.mcrank.Skill=&e{0}&a - &6\u30e9\u30f3\u30af &f#&a{1} -Commands.mcrank.Unranked=&f\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=&a{0}\u304c\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u304b\u3089\u6b63\u5e38\u306b\u524a\u9664\u3055\u308c\u307e\u3057\u305f\uff01 -Commands.mctop.Tip=&6\u30d2\u30f3\u30c8: &c/mcrank&6\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> &a - \u30bf\u30fc\u30b2\u30c3\u30c8\u3092\u5909\u66f4 -Commands.mmoedit.AllSkills.1=&a\u5168\u3066\u306e\u30b9\u30ad\u30eb\u30ec\u30d9\u30eb\u304c{0}\u306b\u8a2d\u5b9a\u3055\u308c\u307e\u3057\u305f\uff01 -Commands.mmoedit.Modified.1=&a{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=&7{0}\u304b\u3089{1}\u3078\u306e\u5909\u63db\u3092\u958b\u59cb\u3057\u3066\u3044\u307e\u3059... -Commands.mcconvert.Database.Finish=&7\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&a{0}&f\u3067\u3059\u3002 -Commands.mcconvert.Experience.Invalid=\u4e0d\u660e\u306a\u6570\u5f0f\u30bf\u30a4\u30d7\uff01 \u6709\u52b9\u306a\u30bf\u30a4\u30d7: &aLINEAR &c\u53ca\u3073 &aEXPONENTIAL&c. -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=&7{0} \u304b\u3089 {1} \u66f2\u7dda\u3078\u306e\u5909\u63db\u3092\u958b\u59cb\u3057\u3066\u3044\u307e\u3059 -Commands.mcconvert.Experience.Finish=&7\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=&a- 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&c\u30aa\u30d5&f\u306b\u5207\u308a\u66ff\u308f\u308a\u307e\u3057\u305f\u3002 -Commands.Notifications.On=\u30a2\u30d3\u30ea\u30c6\u30a3\u901a\u77e5\u304c&a\u30aa\u30f3&f\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=&8\u540d\u524d: &f{0} {1} &8\u30ec\u30d9\u30eb: &3{2} -Commands.Party.Status.Alliance=&8\u5473\u65b9: &f{0} -Commands.Party.UnlockedFeatures=&8\u30ed\u30c3\u30af\u89e3\u9664\u3055\u308c\u305f\u6a5f\u80fd: &7&o{0} -Commands.Party.ShareMode=&8\u5171\u6709\u30e2\u30fc\u30c9: -Commands.Party.ItemShare=&7\u30a2\u30a4\u30c6\u30e0 &3({0}) +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\u30a2\u30a4\u30c6\u30e0\u5171\u6709: &7&o{0} -Commands.Party.MembersNear=&8\u3042\u306a\u305f\u306e\u8fd1\u304f\u306b &3{0}&8/&3{1} -Commands.Party.Accept=&a- \u30d1\u30fc\u30c6\u30a3\u30fc\u62db\u5f85\u3092\u8a31\u8afe -Commands.Party.Chat.Off=\u30d1\u30fc\u30c6\u30a3\u30fc\u30c1\u30e3\u30c3\u30c8\u304c&c\u30aa\u30d5&f\u306b\u5207\u308a\u66ff\u308f\u308a\u307e\u3057\u305f\u3002 -Commands.Party.Chat.On=\u30d1\u30fc\u30c6\u30a3\u30fc\u30c1\u30e3\u30c3\u30c8\u304c&a\u30aa\u30f3&f\u306b\u5207\u308a\u66ff\u308f\u308a\u307e\u3057\u305f\u3002 -Commands.Party.Commands=&c---[]&a\u30d1\u30fc\u30c6\u30a3\u30fc\u30b3\u30de\u30f3\u30c9&c[]--- -Commands.Party.Invite.0=&c\u901a\u77e5: &a{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=&a/party accept&e\u3092\u5165\u529b\u3057\u3066\u3001\u62db\u5f85\u3092\u53d7\u3051\u5165\u308c\u307e\u3059\u3002 -Commands.Party.Invite=&a- \u30d1\u30fc\u30c6\u30a3\u30fc\u62db\u5f85\u3092\u9001\u4fe1 -Commands.Party.Invite.Accepted=&a\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=&7\u53c2\u52a0\u30d1\u30fc\u30c6\u30a3\u30fc: {0} -Commands.Party.PartyFull=&6{0}&c \u306f\u6e80\u54e1\u3067\u3059\uff01 -Commands.Party.PartyFull.Invite=&a{1}&c\u306b\u306f\u3059\u3067\u306b&3{2}&c\u4eba\u304c\u3044\u308b\u305f\u3081\u3001&a{1}&c\u306b&e{0}&c\u3092\u62db\u5f85\u3059\u308b\u3053\u3068\u306f\u3067\u304d\u307e\u305b\u3093\uff01 -Commands.Party.PartyFull.InviteAccept=&c\u3059\u3067\u306b&3{1}&c\u4eba\u306e\u30d7\u30ec\u30a4\u30e4\u30fc\u304c\u5c45\u308b\u305f\u3081\u3001&a{0}&c\u306b\u306f\u53c2\u52a0\u3067\u304d\u307e\u305b\u3093\u3002 -Commands.Party.Create=&7\u4f5c\u6210\u3055\u308c\u305f\u30d1\u30fc\u30c6\u30a3\u30fc: {0} -Commands.Party.Rename=&7\u30d1\u30fc\u30c6\u30a3\u30fc\u540d\u5909\u66f4: &f{0} -Commands.Party.SetSharing=&7\u30d1\u30fc\u30c6\u30a3\u30fc {0} \u306e\u5171\u6709\u8a2d\u5b9a: &3{1} -Commands.Party.ToggleShareCategory=&6{0}&7\u306e\u30d1\u30fc\u30c6\u30a3\u30fc\u30a2\u30a4\u30c6\u30e0\u5171\u6709\u306f&3{1}&7\u306b\u306a\u308a\u307e\u3057\u305f\u3002 -Commands.Party.AlreadyExists=&4\u30d1\u30fc\u30c6\u30a3\u30fc {0} \u306f\u3059\u3067\u306b\u5b58\u5728\u3057\u307e\u3059\uff01 -Commands.Party.Kick=&c\u30d1\u30fc\u30c6\u30a3\u30fc&a{0}&c\u304b\u3089\u8ffd\u3044\u51fa\u3055\u308c\u307e\u3057\u305f\uff01 -Commands.Party.Leave=&e\u30d1\u30fc\u30c6\u30a3\u30fc\u304b\u3089\u629c\u3051\u307e\u3057\u305f -Commands.Party.Members.Header=&c-----[]&a\u30e1\u30f3\u30d0\u30fc&c[]----- -Commands.Party.None=&c\u30d1\u30fc\u30c6\u30a3\u30fc\u306b\u53c2\u52a0\u3057\u3066\u3044\u307e\u305b\u3093\u3002 -Commands.Party.Quit=&a- \u73fe\u5728\u306e\u30d1\u30fc\u30c6\u30a3\u30fc\u3092\u629c\u3051\u308b -Commands.Party.Teleport=&a- \u30d1\u30fc\u30c6\u30a3\u30fc\u30e1\u30f3\u30d0\u30fc\u3078\u30c6\u30ec\u30dd\u30fc\u30c8 -Commands.Party.Toggle=&a- \u30d1\u30fc\u30c6\u30a3\u30fc\u30c1\u30e3\u30c3\u30c8\u3092\u5207\u308a\u66ff\u3048 -Commands.Party1=&a- \u65b0\u3057\u3044\u30d1\u30fc\u30c6\u30a3\u30fc\u3092\u4f5c\u6210 -Commands.Party2=&a- \u30d7\u30ec\u30a4\u30e4\u30fc\u30d1\u30fc\u30c6\u30a3\u30fc\u306b\u53c2\u52a0\u3059\u308b -Commands.Party.Alliance.Header=&c-----[]&a\u30d1\u30fc\u30c6\u30a3\u30fc\u540c\u76df&c[]----- -Commands.Party.Alliance.Ally=&f{0} &8\u540c\u76df: &f{1} -Commands.Party.Alliance.Members.Header=&c-----[]&a\u540c\u76df\u30e1\u30f3\u30d0\u30fc&c[]----- -Commands.Party.Alliance.Invite.0=\u901a\u77e5: &a{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=&a/party alliance accept&e\u3092\u5165\u529b\u3057\u3066\u62db\u5f85\u3092\u53d7\u3051\u5165\u308c\u307e\u3059 -Commands.Party.Alliance.Invite.Accepted=&a\u540c\u76df\u306e\u62db\u5f85\u3092\u53d7\u3051\u5165\u308c\u3089\u308c\u307e\u3057\u305f\u3002 -Commands.Party.Alliance.None=&c\u3042\u306a\u305f\u306e\u30d1\u30fc\u30c6\u30a3\u30fc\u306b\u306f\u540c\u76df\u304c\u3044\u307e\u305b\u3093\u3002 -Commands.Party.Alliance.AlreadyAllies=&c\u3042\u306a\u305f\u306e\u30d1\u30fc\u30c6\u30a3\u30fc\u306b\u306f\u3059\u3067\u306b\u540c\u76df\u304c\u3044\u307e\u3059\u3002&3/party alliance disband&c\u3067\u89e3\u6563 -Commands.Party.Alliance.Help.0=&c\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=&3/party alliance invite <\u30d7\u30ec\u30a4\u30e4\u30fc> -Commands.ptp.Enabled=\u30d1\u30fc\u30c6\u30a3\u30fc\u30c6\u30ec\u30dd\u30fc\u30c8\u304c&a\u6709\u52b9&f\u306b\u5207\u308a\u66ff\u308f\u308a\u307e\u3057\u305f\u3002 -Commands.ptp.Disabled=\u30d1\u30fc\u30c6\u30a3\u30fc\u30c6\u30ec\u30dd\u30fc\u30c8\u304c&c\u7121\u52b9&f\u306b\u5207\u308a\u66ff\u308f\u308a\u307e\u3057\u305f\u3002 -Commands.ptp.NoRequests=&c\u73fe\u5728\u30c6\u30ec\u30dd\u30fc\u30c8\u30ea\u30af\u30a8\u30b9\u30c8\u306f\u3042\u308a\u307e\u305b\u3093\u3002 -Commands.ptp.NoWorldPermissions=&c[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=&e{0} &a\u304c\u30c6\u30ec\u30dd\u30fc\u30c8\u3092\u30ea\u30af\u30a8\u30b9\u30c8\u3057\u307e\u3057\u305f\u3002 -Commands.ptp.Request2=&a\u30c6\u30ec\u30dd\u30fc\u30c8\u3059\u308b\u306b\u306f\u3001&e/ptp accept&a\u3068\u5165\u529b\u3057\u307e\u3059\u3002\u30ea\u30af\u30a8\u30b9\u30c8\u306f&c{0} &a\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&a\u6709\u52b9&f\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&c\u7121\u52b9&f\u306b\u5207\u308a\u66ff\u308f\u308a\u307e\u3057\u305f\u3002 -Commands.ptp.RequestExpired=&c\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=&e--mcMMO&9 \u30d1\u30ef\u30fc\u30ec\u30d9\u30eb &e\u30ea\u30fc\u30c0\u30fc\u30dc\u30fc\u30c9-- -Commands.PowerLevel.Capped=&4\u30d1\u30ef\u30fc\u30ec\u30d9\u30eb: &a{0} &4\u6700\u5927\u30ec\u30d9\u30eb: &e{1} -Commands.PowerLevel=&4\u30d1\u30ef\u30fc\u30ec\u30d9\u30eb: &a{0} -Commands.Reset.All=&a\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=&a{0}\u306e\u30b9\u30ad\u30eb\u30ec\u30d9\u30eb\u304c\u6b63\u5e38\u306b\u30ea\u30bb\u30c3\u30c8\u3055\u308c\u307e\u3057\u305f\u3002 -Commands.Reset=&a- \u30b9\u30ad\u30eb\u306e\u30ec\u30d9\u30eb\u30920\u306b\u30ea\u30bb\u30c3\u30c8\u3057\u307e\u3059\u3002 -Commands.Scoreboard.Clear=&3mcMMO \u30b9\u30b3\u30a2\u30dc\u30fc\u30c9\u304c\u30af\u30ea\u30a2\u3055\u308c\u307e\u3057\u305f\u3002 -Commands.Scoreboard.NoBoard=&cThe mcMMO \u30b9\u30b3\u30a2\u30dc\u30fc\u30c9\u304c\u6709\u52b9\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u3002 -Commands.Scoreboard.Keep=&3mcMMO \u30b9\u30b3\u30a2\u30dc\u30fc\u30c9\u306f&a/mcscoreboard clear&3\u3092\u4f7f\u7528\u3059\u308b\u307e\u3067\u66f4\u65b0\u3055\u308c\u307e\u305b\u3093\u3002 -Commands.Scoreboard.Timer=&3mcMMO\u30b9\u30b3\u30a2\u30dc\u30fc\u30c9\u306f&6{0}&3\u79d2\u5f8c\u306b\u6d88\u53bb\u3055\u308c\u307e\u3059\u3002 -Commands.Scoreboard.Help.0=&6 == &c/mcscoreboard&a\u306e\u30d8\u30eb\u30d7 &6 == -Commands.Scoreboard.Help.1=&3/mcscoreboard&b clear &f - mcMMO\u30b9\u30b3\u30a2\u30dc\u30fc\u30c9\u3092\u30af\u30ea\u30a8\u3059\u308b -Commands.Scoreboard.Help.2=&3/mcscoreboard&b keep &f - mcMMO\u30b9\u30b3\u30a2\u30dc\u30fc\u30c9\u3092\u7dad\u6301\u3059\u308b -Commands.Scoreboard.Help.3=&3/mcscoreboard&b time [n] &f - mcMMO\u30b9\u30b3\u30a2\u30dc\u30fc\u30c9\u3092&dn&f\u79d2\u5f8c\u306b\u30af\u30ea\u30a2\u3059\u308b -Commands.Scoreboard.Tip.Keep=&6\u30d2\u30f3\u30c8: \u30b9\u30b3\u30a2\u30dc\u30fc\u30c9\u304c\u8868\u793a\u3055\u308c\u3066\u3044\u308b\u9593\u306b&c/mcscoreboard keep&6\u3092\u4f7f\u7528\u3057\u3066\u6d88\u3048\u306a\u3044\u3088\u3046\u306b\u3059\u308b\u3002 -Commands.Scoreboard.Tip.Clear=&6\u30d2\u30f3\u30c8: &c/mcscoreboard clear&6\u3092\u4f7f\u7528\u3057\u3066\u30b9\u30b3\u30a2\u30dc\u30fc\u30c9\u3092\u6d88\u53bb\u3059\u308b\u3002 -Commands.XPBar.Reset=&6mcMMO\u306eXP Bar\u306e\u8a2d\u5b9a\u304c\u30ea\u30bb\u30c3\u30c8\u3055\u308c\u307e\u3057\u305f\u3002 -Commands.XPBar.SettingChanged=&6a{0} &6\u306eXP\u30d0\u30fc\u8a2d\u5b9a\u3092 &a{1} \u306b\u5909\u66f4\u3057\u307e\u3057\u305f\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 &9{0}&e \u30ea\u30fc\u30c0\u30fc\u30dc\u30fc\u30c9-- -Commands.SkillInfo=&a- \u30b9\u30ad\u30eb\u306b\u95a2\u3059\u308b\u8a73\u7d30\u60c5\u5831\u3092\u8868\u793a\u3059\u308b -Commands.Stats=&a- mcMMO\u306e\u7d71\u8a08\u3092\u8868\u793a\u3059\u308b -Commands.ToggleAbility=&a- \u53f3\u30af\u30ea\u30c3\u30af\u3067\u30a2\u30d3\u30ea\u30c6\u30a3\u3092\u5207\u308a\u66ff\u3048\u308b -Commands.Usage.0=&c\u9069\u5207\u306a\u4f7f\u7528\u6cd5\u306f /{0} -Commands.Usage.1=&c\u9069\u5207\u306a\u4f7f\u7528\u6cd5\u306f /{0} {1} -Commands.Usage.2=&c\u9069\u5207\u306a\u4f7f\u7528\u6cd5\u306f /{0} {1} {2} -Commands.Usage.3=&c\u9069\u5207\u306a\u4f7f\u7528\u6cd5\u306f /{0} {1} {2} {3} -Commands.Usage.3.XP=&c\u9069\u5207\u306a\u4f7f\u7528\u6cd5\u306f /{0} {1} {2} {3} &7(\u6700\u5f8c\u306b-s\u3092\u5165\u308c\u308b\u3053\u3068\u3067\u3001\u30d7\u30ec\u30a4\u30e4\u30fc\u306b\u77e5\u3089\u305b\u305a\u306b\u30b3\u30de\u30f3\u30c9\u3092\u5b9f\u884c\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059) -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 +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=&7\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=&3-=[]=====[]&6 MMO \u60c5\u5831 &3[]=====[]=- -Commands.MmoInfo.SubSkillHeader=&6\u540d\u524d:&e {0} -Commands.MmoInfo.DetailsHeader=&3-=[]=====[]&a \u8a73\u7d30 &3[]=====[]=- -Commands.MmoInfo.OldSkill=&7mcMMO\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=&3-=[]=====[]&6 \u529b\u5b66 &3[]=====[]=- -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=&c\u73fe\u5728\u3001\u62db\u5f85\u306f\u3042\u308a\u307e\u305b\u3093\u3002 -mcMMO.NoPermission=&4\u6a29\u9650\u304c\u4e0d\u5341\u5206\u3067\u3059\u3002 -mcMMO.NoSkillNote=&8\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=&c\u9069\u5207\u306a\u4f7f\u7528\u6cd5\u306f &3{0} <\u30d7\u30ec\u30a4\u30e4\u30fc> [\u30d1\u30b9\u30ef\u30fc\u30c9] \u3067\u3059\u3002 -Party.Help.1=&c\u30d1\u30fc\u30c6\u30a3\u30fc\u3092\u4f5c\u6210\u3059\u308b\u306b\u306f &3{0} <\u540d\u79f0> [\u30d1\u30b9\u30ef\u30fc\u30c9] \u3092\u4f7f\u7528\u3057\u307e\u3059\u3002 -Party.Help.2=&c\u8a73\u7d30\u306f &3{0} &c \u306b\u76f8\u8ac7\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -Party.Help.3=&3{0} <\u30d7\u30ec\u30a4\u30e4\u30fc> [\u30d1\u30b9\u30ef\u30fc\u30c9] &c\u3092\u4f7f\u7528\u3057\u3066\u53c2\u52a0\u3059\u308b\u304b\u3001&3{1} &c\u3092\u4f7f\u7528\u3057\u3066\u629c\u3051\u307e\u3059\u3002 -Party.Help.4=&c\u30d1\u30fc\u30c6\u30a3\u30fc\u306e\u30ed\u30c3\u30af\u307e\u305f\u306f\u30ed\u30c3\u30af\u89e3\u9664\u306b\u306f\u3001&3{0} &c\u3092\u4f7f\u7528\u3057\u307e\u3059\u3002 -Party.Help.5=&c\u30d1\u30fc\u30c6\u30a3\u30fc\u3092\u30d1\u30b9\u30ef\u30fc\u30c9\u3067\u4fdd\u8b77\u3059\u308b\u306b\u306f\u3001&3{0} <\u30d1\u30b9\u30ef\u30fc\u30c9> &c\u3092\u4f7f\u7528\u3057\u307e\u3059\u3002 -Party.Help.6=&c\u30d1\u30fc\u30c6\u30a3\u30fc\u304b\u3089\u30d7\u30ec\u30a4\u30e4\u30fc\u3092\u30ad\u30c3\u30af\u3059\u308b\u306b\u306f\u3001&3{0} <\u30d7\u30ec\u30a4\u30e4\u30fc> &c\u3092\u4f7f\u7528\u3057\u307e\u3059\u3002 -Party.Help.7=&c\u30d1\u30fc\u30c6\u30a3\u30fc\u306e\u6240\u6709\u6a29\u3092\u8b72\u6e21\u3059\u308b\u306b\u306f\u3001&3{0} <\u30d7\u30ec\u30a4\u30e4\u30fc> &c\u3092\u4f7f\u7528\u3057\u307e\u3059\u3002 -Party.Help.8=&c\u30d1\u30fc\u30c6\u30a3\u30fc\u3092\u89e3\u6563\u3059\u308b\u306b\u306f\u3001&3{0} &c\u3092\u4f7f\u7528\u3057\u307e\u3059\u3002 -Party.Help.9=&3{0} &c\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=&3{0} &c\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} &a\u304c\u30d1\u30fc\u30c6\u30a3\u30fc\u306b\u53c2\u52a0\u3057\u307e\u3057\u305f\u3002 -Party.InformedOnQuit={0} &a\u304c\u30d1\u30fc\u30c6\u30a3\u30fc\u304b\u3089\u96e2\u8131\u3057\u307e\u3057\u305f\u3002 -Party.InformedOnNameChange=&6{0}\u304c\u30d1\u30fc\u30c6\u30a3\u30fc\u540d\u3092&f{1}&a\u306b\u8a2d\u5b9a\u3057\u307e\u3057\u305f\u3002 -Party.InvalidName=&4\u6709\u52b9\u306a\u30d1\u30fc\u30c6\u30a3\u30fc\u540d\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u3002 -Party.Invite.Self=&c\u81ea\u5206\u81ea\u8eab\u3092\u62db\u5f85\u3059\u308b\u3053\u3068\u306f\u3067\u304d\u307e\u305b\u3093\u3002 -Party.IsLocked=&c\u3053\u306e\u30d1\u30fc\u30c6\u30a3\u30fc\u306f\u3059\u3067\u306b\u30ed\u30c3\u30af\u3055\u308c\u3066\u3044\u307e\u3059\uff01 -Party.IsntLocked=&c\u3053\u306e\u30d1\u30fc\u30c6\u30a3\u30fc\u306f\u30ed\u30c3\u30af\u3055\u308c\u3066\u3044\u307e\u305b\u3093\uff01 -Party.Locked=&c\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=&4{0}\u306f\u3042\u306a\u305f\u306e\u30d1\u30fc\u30c6\u30a3\u306b\u3044\u307e\u305b\u3093\u3002 -Party.NotOwner=&4\u3042\u306a\u305f\u306f\u30d1\u30fc\u30c6\u30a3\u30fc\u30ea\u30fc\u30c0\u30fc\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u3002 -Party.Target.NotOwner=&4{0}\u306f\u30d1\u30fc\u30c6\u30a3\u30fc\u30ea\u30fc\u30c0\u30fc\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u3002 -Party.Owner.New=&a{0}\u304c\u65b0\u3057\u3044\u30d1\u30fc\u30c6\u30a3\u30fc\u30ea\u30fc\u30c0\u30fc\u306b\u306a\u308a\u307e\u3057\u305f\u3002 -Party.Owner.NotLeader=&4\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 =&a\u3042\u306a\u305f\u306f\u73fe\u5728\u30d1\u30fc\u30c6\u30a3\u30fc\u30ea\u30fc\u30c0\u30fc\u3067\u3059\u3002 -Party.Password.None=&c\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=&c\u30d1\u30fc\u30c6\u30a3\u30fc\u306e\u30d1\u30b9\u30ef\u30fc\u30c9\u304c\u6b63\u3057\u304f\u3042\u308a\u307e\u305b\u3093\u3002 -Party.Password.Set=&a\u30d1\u30fc\u30c6\u30a3\u30fc\u30d1\u30b9\u30ef\u30fc\u30c9\u304c{0}\u306b\u8a2d\u5b9a\u3055\u308c\u307e\u3057\u305f -Party.Password.Removed=&a\u30d1\u30fc\u30c6\u30a3\u306e\u30d1\u30b9\u30ef\u30fc\u30c9\u304c\u6d88\u53bb\u3055\u308c\u307e\u3057\u305f\u3002 -Party.Player.Invalid=&c\u6709\u52b9\u306a\u30d7\u30ec\u30a4\u30e4\u30fc\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u3002 -Party.NotOnline=&4{0}\u306f\u30aa\u30f3\u30e9\u30a4\u30f3\u3067\u306f\u3042\u308a\u307e\u305b\u3093\uff01 -Party.Player.InSameParty=&c{0}\u306f\u65e2\u306b\u30d1\u30fc\u30c6\u30a3\u30fc\u306b\u53c2\u52a0\u3057\u3066\u3044\u307e\u3059\uff01 -Party.PlayerNotInParty=&4{0}\u306f\u30d1\u30fc\u30c6\u30a3\u30fc\u306b\u53c2\u52a0\u3057\u3066\u3044\u307e\u305b\u3093\u3002 -Party.Specify=&c\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=&c\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=&c{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=&a{0}\u306b\u30c6\u30ec\u30dd\u30fc\u30c8\u3057\u307e\u3057\u305f\u3002 -Party.Teleport.Self=&c\u81ea\u5206\u81ea\u8eab\u306b\u30c6\u30ec\u30dd\u30fc\u30c8\u3067\u304d\u307e\u305b\u3093\uff01 -Party.Teleport.Target=&a{0}\u304c\u3042\u306a\u305f\u306b\u30c6\u30ec\u30dd\u30fc\u30c8\u3057\u307e\u3057\u305f\u3002 -Party.Teleport.Disabled=&c{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=&c\u305d\u308c\u306f\u65e2\u306b\u3042\u306a\u305f\u306e\u30d1\u30fc\u30c6\u30a3\u540d\u3067\u3059\u3002 -Party.Join.Self=&c\u3042\u306a\u305f\u306f\u81ea\u5206\u81ea\u8eab\u306b\u53c2\u52a0\u3059\u308b\u3053\u3068\u306f\u3067\u304d\u307e\u305b\u3093\uff01 -Party.Unlocked=&7\u30d1\u30fc\u30c6\u30a3\u30fc\u306f\u30a2\u30f3\u30ed\u30c3\u30af\u3055\u308c\u3066\u3044\u307e\u3059 -Party.Disband=&7\u30d1\u30fc\u30c6\u30a3\u30fc\u306f\u89e3\u6563\u3055\u308c\u307e\u3057\u305f -Party.Alliance.Formed=&7\u3042\u306a\u305f\u306e\u30d1\u30fc\u30c6\u30a3\u30fc\u306f\u73fe\u5728&a{0}&7\u3068\u540c\u76df\u4e2d\u3067\u3059\u3002 -Party.Alliance.Disband=\u3042\u306a\u305f\u306e\u30d1\u30fc\u30c6\u30a3\u30fc\u306f&c{0}&7\u3068\u540c\u76df\u95a2\u4fc2\u3067\u306f\u306a\u304f\u306a\u308a\u307e\u3057\u305f\u3002 -Party.Status.Locked=&4(\u62db\u5f85\u306e\u307f) -Party.Status.Unlocked=&2(\u30aa\u30fc\u30d7\u30f3) -Party.LevelUp=&e\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=&c\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=&c\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=&c\u540c\u76df\u306f\u307e\u3060\u958b\u653e\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002 -Party.Feature.Disabled.4=&c\u30a2\u30a4\u30c6\u30e0\u5171\u6709\u306f\u307e\u3060\u958b\u653e\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002 -Party.Feature.Disabled.5=&cXP\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=&8XP\u7372\u5f97: &f{0} -Commands.xplock.locked=&6\u3042\u306a\u305f\u306eXP\u30d0\u30fc\u306f\u73fe\u5728{0}\u3067\u30ed\u30c3\u30af\u3055\u308c\u3066\u3044\u307e\u3059\uff01 -Commands.xplock.unlocked=&6\u3042\u306a\u305f\u306eXP\u30d0\u30fc\u306f\u73fe\u5728&a\u30ed\u30c3\u30af\u89e3\u9664&6\u3055\u308c\u3066\u3044\u307e\u3059\uff01 -Commands.xprate.modified=&cXP\u30ec\u30fc\u30c8\u306f{0}\u306b\u5909\u66f4\u3055\u308c\u307e\u3057\u305f -Commands.xprate.over=&cmcMMO XP\u30ec\u30fc\u30c8\u30a4\u30d9\u30f3\u30c8\u304c\u7d42\u308f\u308a\u307e\u3057\u305f\uff01 -Commands.xprate.proper.0=&cXP\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=&cXP\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=&cxp\u30a4\u30d9\u30f3\u30c8\u304b\u3092\u793a\u3059\u305f\u3081\u306btrue\u307e\u305f\u306ffalse\u3092\u6307\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -Commands.NegativeNumberWarn=\u8ca0\u306e\u5024\u3092\u4f7f\u308f\u306a\u3044\u3067\u304f\u3060\u3055\u3044\u3002 -Commands.Event.Start=&amcMMO&6 \u30a4\u30d9\u30f3\u30c8\uff01 -Commands.Event.Stop=&amcMMO&3 \u30a4\u30d9\u30f3\u30c8\u7d42\u4e86\uff01 -Commands.Event.Stop.Subtitle=&a\u697d\u3057\u3093\u3067\u304f\u308c\u305f\u3053\u3068\u3092\u9858\u3063\u3066\u307e\u3059\uff01 -Commands.Event.XP=&3XP\u30ec\u30fc\u30c8\u306f\u73fe\u5728&6{0}&3x -Commands.xprate.started.0=&6mcMMO\u306eXP\u30a4\u30d9\u30f3\u30c8\u304c\u958b\u59cb\u3055\u308c\u307e\u3057\u305f\uff01 -Commands.xprate.started.1=&6mcMMO\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=&e[Server] -Notifications.Admin.XPRate.Start.Self=&7\u3042\u306a\u305f\u306f&6{0}x&7\u306b\u30b0\u30ed\u30fc\u30d0\u30ebXP\u30ec\u30fc\u30c8\u3092\u8a2d\u5b9a\u3057\u307e\u3057\u305f\u3002 -Notifications.Admin.XPRate.End.Self=&7XP\u30ec\u30fc\u30c8\u30a4\u30d9\u30f3\u30c8\u3092\u7d42\u4e86\u3057\u307e\u3057\u305f\u3002 -Notifications.Admin.XPRate.End.Others={0}&7\u306fXP\u30ec\u30fc\u30c8\u30a4\u30d9\u30f3\u30c8\u3092\u7d42\u4e86\u3057\u307e\u3057\u305f -Notifications.Admin.XPRate.Start.Others={0}&7\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=&6(&amcMMO &3\u7ba1\u7406\u8005&6) &7{0} +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=&6mcMMO\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=&7\u5229\u7528\u53ef\u80fd\u306a{0}\u306e\u30ac\u30a4\u30c9 - /{1} ? [\u30da\u30fc\u30b8] -Guides.Header=&6-=&a{0} \u30ac\u30a4\u30c9&6=- -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=&3\u30a2\u30af\u30ed\u30d0\u30c6\u30a3\u30c3\u30af\u306b\u3064\u3044\u3066\uff1a\n&e\u30a2\u30af\u30ed\u30d0\u30c6\u30a3\u30c3\u30af\u306f\u3001mcMMO\u3067\u512a\u96c5\u306b\u52d5\u304f\u82b8\u8853\u3067\u3059\u3002\n&e\u30a2\u30af\u30ed\u30d0\u30c6\u30a3\u30c3\u30af\u306f\u3001mcMMO\u3067\u512a\u96c5\u306b\u52d5\u304f\u82b8\u8853\u3067\u3059\u3002\n\n&3XP\u7372\u5f97\uff1a\n&e\u3053\u306e\u30b9\u30ad\u30eb\u3067XP\u3092\u7372\u5f97\u3059\u308b\u306b\u306f\u3001\u6226\u95d8\u3067\u8eb1\u3059\u304b\\&en\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=&3\u53d7\u3051\u8eab\u306f\u3069\u306e\u3088\u3046\u306b\u6a5f\u80fd\u3057\u307e\u3059\u304b\uff1f\n&e\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&e\u843d\u4e0b\u4e2d\u306b\u30b9\u30cb\u30fc\u30af\u3059\u308b\u3053\u3068\u3067\u78ba\u7387\u3092\u500d\u5897\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002 -Guides.Acrobatics.Section.2=&3\u8eb1\u3059\u306f\u3069\u306e\u3088\u3046\u306b\u6a5f\u80fd\u3057\u307e\u3059\u304b\uff1f\n&e\u8eb1\u3059\u306f\u78ba\u7387\u3067\u6226\u95d8\u3067\u8ca0\u50b7\u3057\u305f\u3068\u304d\u306b\\n&e\u53d7\u3051\u305f\u30c0\u30e1\u30fc\u30b8\u3092\u534a\u5206\u306b\u3057\u307e\u3059\u3002\\n&e\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=&3\u932c\u91d1\u8853\u306b\u3064\u3044\u3066\uff1a\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\u89e6\u5a92\u306e\u52b9\u679c\u306f\uff1f\n&e\u89e6\u5a92\u306f\u91b8\u9020\u306e\u901f\u5ea6\u3092\u901f\u3081\u3001\n&e\u30ec\u30d9\u30eb1000\u3067\u6700\u59274\u500d\u306e\u901f\u5ea6\u306b\u306a\u308a\u307e\u3059\u3002\n&e\u3053\u306e\u30a2\u30d3\u30ea\u30c6\u30a3\u306f\u30c7\u30d5\u30a9\u30eb\u30c8\u3067\u306f\u30ec\u30d9\u30eb100\u3067\u30a2\u30f3\u30ed\u30c3\u30af\u3055\u308c\u308b\u3002 -Guides.Alchemy.Section.2=&3\u8abf\u5408\u306e\u52b9\u679c\u306f\uff1f\n&e\u8abf\u5408\u3067\u306f\u6750\u6599\u3092\u4f7f\u3063\u3066\u3001\u3088\u308a\u591a\u304f\u306e\u30dd\u30fc\u30b7\u30e7\u30f3\u3092\u4f5c\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\n&e\u3069\u306e\u6750\u6599\u304c\u30a2\u30f3\u30ed\u30c3\u30af\u3055\u308c\u308b\u304b\u306f\u3001\u30e9\u30f3\u30af\u306b\u3088\u3063\u3066\u6c7a\u5b9a\u3055\u308c\u307e\u3059\u3002\n&e\u89e3\u9664\u3067\u304d\u308b\u30e9\u30f3\u30af\u306f\uff18\u3064\u3067\u3059\u3002 -Guides.Alchemy.Section.3=&3\u8abf\u5408 \u30c6\u30a3\u30a21\u306e\u6750\u6599\uff1a\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\u8abf\u5408 \u30c6\u30a3\u30a22\u306e\u6750\u6599\uff1a\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\u8abf\u5408 \u30c6\u30a3\u30a24\u306e\u6750\u6599\uff1a\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\u8abf\u5408 \u30c6\u30a3\u30a26\u306e\u6750\u6599\uff1a\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) +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=&3\u5f13\u306b\u3064\u3044\u3066\uff1a\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\u30b9\u30ad\u30eb\u30b7\u30e7\u30c3\u30c8\u306e\u52b9\u679c\u306f\uff1f\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\u5e7b\u60d1\u306e\u52b9\u679c\u306f\uff1f\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\u30a2\u30ed\u30fc\u30ea\u30c8\u30ea\u30fc\u30d6\u306e\u52b9\u679c\u306f\uff1f\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. +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=&3\u65a7\u306b\u3064\u3044\u3066\uff1a\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\u30b9\u30ab\u30eb\u30b9\u30d7\u30ea\u30c3\u30bf\u30fc\u306e\u52b9\u679c\u306f\uff1f\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\u30af\u30ea\u30c6\u30a3\u30ab\u30eb\u30b9\u30c8\u30e9\u30a4\u30af\u306e\u52b9\u679c\u306f\uff1f\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\u30a2\u30c3\u30af\u30b9\u30de\u30b9\u30bf\u30ea\u30fc\u306e\u52b9\u679c\u306f\uff1f\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\u30a2\u30fc\u30de\u30fc\u30a4\u30f3\u30d1\u30af\u30c8\u306e\u52b9\u679c\u306f\uff1f\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\u30b0\u30ec\u30fc\u30bf\u30fc\u30a4\u30f3\u30d1\u30af\u30c8\u306e\u52b9\u679c\u306f\uff1f\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. +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=&3\u6398\u524a\u306b\u3064\u3044\u3066\uff1a\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\u4e92\u63db\u6027\u306e\u3042\u308b\u30d6\u30ed\u30c3\u30af\uff1a\n&eGrass, Dirt, Sand, Clay, Gravel, Mycelium, Soul Sand, Snow -Guides.Excavation.Section.2=&3\u30ae\u30ac\u30c9\u30ea\u30eb\u30d6\u30ec\u30fc\u30ab\u30fc\u3092\u4f7f\u3046\u306b\u306f\u3069\u3046\u3059\u308c\u3070\u3044\u3044\u3067\u3059\u304b\uff1f\uff1a\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\u30ae\u30ac\u30c9\u30ea\u30eb\u30d6\u30ec\u30fc\u30ab\u30fc\u3068\u306f\uff1f\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\u8003\u53e4\u5b66\u306e\u52b9\u679c\u306f\uff1f\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\u6398\u524a\u306b\u3064\u3044\u3066\u306e\u6ce8\u610f\u4e8b\u9805:\n&eExcavation drops are completely customizeable\n&eSo 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=&3\u91e3\u308a\u306b\u3064\u3044\u3066\uff1a\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\u30c8\u30ec\u30b8\u30e3\u30fc\u30cf\u30f3\u30bf\u30fc\u306e\u52b9\u679c\u306f\uff1f\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\u30a2\u30a4\u30b9\u30d5\u30a3\u30c3\u30b7\u30f3\u30b0\u306e\u52b9\u679c\u306f\uff1f\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\u30de\u30b9\u30bf\u30fc\u30a2\u30f3\u30b0\u30e9\u30fc\u306e\u52b9\u679c\u306f\uff1f\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\u30b7\u30a7\u30a4\u30af\u306f\u3069\u306e\u3088\u3046\u306b\u52d5\u4f5c\u3057\u307e\u3059\u304b\uff1f\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\u6f01\u5e2b\u306e\u98df\u4e8b\u306e\u52b9\u679c\u306f\uff1f\n&eThis passive skill increases the amount of hunger restored \n&efrom eating fish. -Guides.Fishing.Section.6=&3\u91e3\u308a\u306b\u95a2\u3059\u308b\u6ce8\u610f\u4e8b\u9805:\n&eFishing drops are completely customizable,\n&eso 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=&3\u8fb2\u696d\u306b\u3064\u3044\u3066\uff1a\n&eHerbalism is about collecting herbs and plants.\n\n\n&3XP GAIN:\n&eCollect plants and herbs. -Guides.Herbalism.Section.1=&3\u4e92\u63db\u6027\u306e\u3042\u308b\u30d6\u30ed\u30c3\u30af\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\u30b0\u30ea\u30fc\u30f3\u30c6\u30e9\u306e\u52b9\u679c\u306f\uff1f\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\u30b0\u30ea\u30fc\u30f3\u30b5\u30e0\uff08\u4f5c\u7269\uff09\u306e\u52b9\u679c\u306f\uff1f\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\u30b0\u30ea\u30fc\u30f3\u30b5\u30e0\uff08\u4e38\u77f3/\u77f3\u30ec\u30f3\u30ac/\u571f\uff09\u306e\u52b9\u679c\u306f\uff1f\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\u8fb2\u5bb6\u306e\u98df\u4e8b\u306e\u52b9\u679c\u306f\uff1f\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\u30cf\u30a4\u30ea\u30a2\u30f3\u30e9\u30c3\u30af\u306e\u52b9\u679c\u306f\uff1f\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\u30c9\u30ed\u30c3\u30d7\u4e8c\u500d\u306e\u52b9\u679c\u306f\uff1f\n&eThis passive ability gives players more yield from their\n&eharvests. +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=&3\u63a1\u6398\u306b\u3064\u3044\u3066\uff1a\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\u4e92\u63db\u6027\u306e\u3042\u308b\u30d6\u30ed\u30c3\u30af:\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\u30b9\u30fc\u30d1\u30fc\u30d6\u30ec\u30a4\u30ab\u30fc\u3092\u4f7f\u3046\u306b\u306f\u3069\u3046\u3059\u308c\u3070\u3044\u3044\u3067\u3059\u304b\uff1f\uff1a\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\u30b9\u30fc\u30d1\u30fc\u30d6\u30ec\u30a4\u30ab\u30fc\u3068\u306f\uff1f\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\u30d6\u30e9\u30b9\u30c8\u30de\u30a4\u30cb\u30f3\u30b0\u3092\u4f7f\u3046\u306b\u306f\u3069\u3046\u3059\u308c\u3070\u3044\u3044\u3067\u3059\u304b\uff1f\uff1a\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\u30d6\u30e9\u30b9\u30c8\u30de\u30a4\u30cb\u30f3\u30b0\u306e\u52b9\u679c\u306f\uff1f\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. +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=&3\u4fee\u7406\u306b\u3064\u3044\u3066\uff1a\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\u4fee\u7406\u3092\u4f7f\u3046\u306b\u306f\u3069\u3046\u3059\u308c\u3070\u3044\u3044\u3067\u3059\u304b\uff1f\uff1a\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\u30ea\u30da\u30a2\u30de\u30b9\u30bf\u30ea\u30fc\u306e\u52b9\u679c\u306f\uff1f\n&eRepair Mastery increases the repair amount. The extra amount\n&erepaired is influenced by your Repair skill level. -Guides.Repair.Section.3=&3\u30b9\u30fc\u30d1\u30fc\u30ea\u30da\u30a2\u306e\u52b9\u679c\u306f\uff1f\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\u30a2\u30eb\u30ab\u30f3\u30d5\u30a9\u30fc\u30b8\u30f3\u30b0\u306e\u52b9\u679c\u306f\uff1f\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. +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=&3\u30b5\u30eb\u30d9\u30fc\u30b8\u306b\u3064\u3044\u3066\uff1a\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\u30b5\u30eb\u30d9\u30fc\u30b8\u3092\u4f7f\u3046\u306b\u306f\u3069\u3046\u3059\u308c\u3070\u3044\u3044\u3067\u3059\u304b\uff1f\uff1a\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\u30a2\u30c9\u30d0\u30f3\u30b9\u30c9\u30b5\u30eb\u30d9\u30fc\u30b8\u306e\u52b9\u679c\u306f\uff1f\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\u3053\u308c\u304c\u3069\u306e\u3088\u3046\u306b\u52d5\u4f5c\u3059\u308b\u304b\u3092\u8aac\u660e\u3059\u308b\u305f\u3081\u306b\u3001\u4ee5\u4e0b\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059:\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\u30a2\u30eb\u30ab\u30f3\u30b5\u30eb\u30d9\u30fc\u30b8\u306e\u52b9\u679c\u306f\uff1f\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. +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=&3\u5263\u306b\u3064\u3044\u3066\uff1a\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\u30bb\u30ec\u30fc\u30b7\u30e7\u30f3\u30b9\u30c8\u30e9\u30a4\u30af\u306e\u52b9\u679c\u306f\uff1f\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\u30ab\u30a6\u30f3\u30bf\u30fc\u653b\u6483\u306e\u52b9\u679c\u306f\uff1f\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\u7834\u88c2\u306e\u52b9\u679c\u306f\uff1f\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. +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=&3\u8abf\u6559\u306b\u3064\u3044\u3066\uff1a\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\u30b3\u30fc\u30eb\u30aa\u30d6\u30b6\u30ef\u30a4\u30eb\u30c9\u306e\u52b9\u679c\u306f\uff1f\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\u30d3\u30fc\u30b9\u30c8\u30ed\u30a2\u306e\u52b9\u679c\u306f\uff1f\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\u6d41\u8840\u306e\u52b9\u679c\u306f\uff1f\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\u92ed\u3044\u722a\u306e\u52b9\u679c\u306f\uff1f\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\u74b0\u5883\u914d\u616e\u306e\u52b9\u679c\u306f\uff1f\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\u539a\u3044\u6bdb\u76ae\u306e\u52b9\u679c\u306f\uff1f\n&eThis passive ability will reduce damage and make wolves\n&efire resistant. -Guides.Taming.Section.7=&3\u885d\u6483\u8010\u6027\u306e\u52b9\u679c\u306f\uff1f\n&eThis passive ability reduces damage done to wolves\n&efrom explosions. -Guides.Taming.Section.8=&3\u30d5\u30a1\u30fc\u30b9\u30c8\u30d5\u30fc\u30c9\u30b5\u30fc\u30d3\u30b9\u306e\u52b9\u679c\u306f\uff1f\n&eThis passive ability gives wolves a chance to heal whenever\nðey 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=&3\u7d20\u624b\u306b\u3064\u3044\u3066\uff1a\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\u30d0\u30fc\u30b5\u30fc\u30ab\u30fc\u306e\u52b9\u679c\u306f\uff1f\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\u30b9\u30c1\u30fc\u30eb\u30a2\u30fc\u30e0\u30b9\u30bf\u30a4\u30eb\u306e\u52b9\u679c\u306f\uff1f\n&eSteel Arm Style increases the damage dealt when hitting mobs or\n&eplayers with your fists. -Guides.Unarmed.Section.3=&3\u30a2\u30ed\u30fc\u30c7\u30a3\u30d5\u30ec\u30af\u30b7\u30e7\u30f3\u306e\u52b9\u679c\u306f\uff1f\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\u30a2\u30a4\u30a2\u30f3\u30b0\u30ea\u30c3\u30d7\u306e\u52b9\u679c\u306f\uff1f\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\u6b66\u88c5\u89e3\u9664\u306e\u52b9\u679c\u306f\uff1f\n&eThis passive ability allows players to disarm other players,\n&ecausing 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=&3\u6728\u3053\u308a\u306b\u3064\u3044\u3066\uff1a\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\u30c4\u30ea\u30fc\u30d5\u30a7\u30e9\u30fc\u306e\u52b9\u679c\u306f\uff1f\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\u30ea\u30fc\u30d5\u30d6\u30ed\u30ef\u30fc\u306e\u52b9\u679c\u306f\uff1f\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\u30c9\u30ed\u30c3\u30d7\u4e8c\u500d\u306e\u52b9\u679c\u306f\uff1f\n&eThis passive ability gives you a chance to obtain an extra\n&eblock 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= &c\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&e{0} -Inspect.Stats=&e{0}&a\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=&c**\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=&7\u3042\u306a\u305f\u3092\u30d9\u30c3\u30c9\u306b\u30c6\u30ec\u30dd\u30fc\u30c8\u3057\u307e\u3059\u3002 -Item.ChimaeraWing.NotEnough=\u3055\u3089\u306b&6{1}&c\u306e&e{0}&c\u304c\u5fc5\u8981\u3067\u3059\uff01 -Item.NotEnough=\u3055\u3089\u306b&6{1}&c\u306e&e{0}&c\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&e({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&e({0}\u79d2) -Item.FluxPickaxe.Name=\u30d5\u30e9\u30c3\u30af\u30b9\u30c4\u30eb\u30cf\u30b7 -Item.FluxPickaxe.Lore.1=&7\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=&7\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=&6({0})&7\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=&4\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=&6(\u5b50\u30b9\u30ad\u30eb) -Skills.Disarmed=&4\u3042\u306a\u305f\u306f\u6b66\u88c5\u89e3\u9664\u3055\u308c\u307e\u3057\u305f\uff01 +Skills.Child=&6(子スキル) +Skills.Disarmed=&4あなたは武装解除されました! Skills.Header=-----[] &a{0}&c []----- -Skills.NeedMore=&4\u3082\u3063\u3068&7{0}&4\u304c\u5fc5\u8981\u3067\u3059 -Skills.NeedMore.Extra=&4\u3082\u3063\u3068&7{0}{1}&4\u304c\u5fc5\u8981\u3067\u3059 +Skills.NeedMore=&4もっと&7{0}&4が必要です +Skills.NeedMore.Extra=&4もっと&7{0}{1}&4が必要です Skills.Parents= PARENTS Skills.Stats={0}&a{1}&3 XP(&7{2}&3/&7{3}&3) Skills.ChildStats={0}&a{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 &e({0}\u79d2) -Skills.TooTired.Named=&7(&6{0}&e {1}\u79d2&7) -Skills.TooTired.Extra=&6{0} &e\u30b9\u30fc\u30d1\u30fc\u30a2\u30d3\u30ea\u30c6\u30a3CD - {1} -Skills.Cancelled=&6{0} &c\u30ad\u30e3\u30f3\u30bb\u30eb\uff01 -Skills.ConfirmOrCancel=&a\u3082\u3046\u4e00\u5ea6\u53f3\u30af\u30ea\u30c3\u30af\u3057\u3066&6{0}&a\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=&7\u3053\u306e\u30a2\u30d3\u30ea\u30c6\u30a3\u3092\u4f7f\u3046\u305f\u3081\u306b\u306f&e{0}&7\u30ec\u30d9\u30eb\u306e&3{1}&7\u304c\u5fc5\u8981\u3067\u3059\u3002 +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=&6-=\u6226\u95d8\u30b9\u30ad\u30eb=- -Stats.Header.Gathering=&6-=\u53ce\u96c6\u30b9\u30ad\u30eb=- -Stats.Header.Misc=&6-=\u305d\u306e\u4ed6\u306e\u30b9\u30ad\u30eb=- -Stats.Own.Stats=&a[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=&6 ({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=&6 ({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=&6[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=&6[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=&6[mcMMO] &4\u6b7b\u4ea1\u306b\u3088\u308a&9{0}&4\u30ec\u30d9\u30eb\u3092\u5931\u3044\u307e\u3057\u305f\u3002 -Hardcore.DeathStatLoss.PercentageChanged=&6[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=&6[mcMMO] &e{0}&7 \u306f\u77e5\u8b58\u304c\u672a\u719f\u3067\u3057\u305f\u3002 -Hardcore.Vampirism.Killer.Success=&6[mcMMO] &e{1}\u304b\u3089&9{0}&3\u30ec\u30d9\u30eb\u3092\u76d7\u307f\u307e\u3057\u305f\u3002 -Hardcore.Vampirism.Victim.Failure=&6[mcMMO] &e{0}&7\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=&6[mcMMO] &e{0}&4\u306f\u3042\u306a\u305f\u304b\u3089&9{1}&4\u30ec\u30d9\u30eb\u3092\u76d7\u307f\u307e\u3057\u305f\uff01 -Hardcore.Vampirism.PercentageChanged=&6[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=&3\u5bc4\u4ed8\u60c5\u5831: -MOTD.Hardcore.Enabled=&6[mcMMO] &3\u30cf\u30fc\u30c9\u30b3\u30a2\u30e2\u30fc\u30c9\u6709\u52b9: &4{0} -MOTD.Hardcore.DeathStatLoss.Stats=&6[mcMMO] &3\u30b9\u30ad\u30eb\u30c7\u30b9\u30da\u30ca\u30eb\u30c6\u30a3: &4{0}% -MOTD.Hardcore.Vampirism.Stats=&6[mcMMO] &3\u30f4\u30a1\u30f3\u30d1\u30a4\u30a2\u5438\u8840\u7d71\u8a08: &4{0}% -MOTD.PerksPrefix=&6[mcMMO \u30d1\u30fc\u30af] -MOTD.Version=&6[mcMMO] \u5b9f\u884c\u4e2d\u306e\u30d0\u30fc\u30b8\u30e7\u30f3 &3{0} -MOTD.Website=&6[mcMMO] &a{0}&e - 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: &e{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: &e{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\u306e\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\u306e\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=&emcMMO \u7d71\u8a08 -Scoreboard.Header.PlayerCooldowns=&emcMMO \u30af\u30fc\u30eb\u30c0\u30a6\u30f3 -Scoreboard.Header.PlayerRank=&emcMMO \u30e9\u30f3\u30ad\u30f3\u30b0 -Scoreboard.Header.PlayerInspect=&emcMMO \u7d71\u8a08: {0} -Scoreboard.Header.PowerLevel=&c\u30d1\u30ef\u30fc\u30ec\u30d9\u30eb -Scoreboard.Misc.PowerLevel=&6\u30d1\u30ef\u30fc\u30ec\u30d9\u30eb -Scoreboard.Misc.Level=&3\u30ec\u30d9\u30eb -Scoreboard.Misc.CurrentXP=&a\u73fe\u5728\u306eXP -Scoreboard.Misc.RemainingXP=&e\u6b8b\u308aXP -Scoreboard.Misc.Cooldown=&d\u30af\u30fc\u30eb\u30c0\u30a6\u30f3 -Scoreboard.Misc.Overall=&6\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=&cmcMMO\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=&a\u3042\u306a\u305f\u306emcMMO\u30d7\u30ed\u30d5\u30a3\u30fc\u30eb\u304c\u8aad\u307f\u8fbc\u307e\u308c\u307e\u3057\u305f\u3002 -Profile.Loading.FailurePlayer=&cmcMMO\u306e\u30c7\u30fc\u30bf\u306e\u8aad\u307f\u8fbc\u307f\u306b\u554f\u984c\u304c\u3042\u308a\u307e\u3059\u3002&a{0}&c\u56de\u8aad\u307f\u8fbc\u307f\u3092\u8a66\u3057\u307e\u3057\u305f\u3002&7 \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=&4[A]&c mcMMO\u306f&e{0}&c\u306e\u30d7\u30ec\u30fc\u30e4\u30fc\u30c7\u30fc\u30bf\u3092\u8aad\u307f\u8fbc\u3081\u307e\u305b\u3093\u3067\u3057\u305f\u3002 &d\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=&6{0}\u306f\u30ec\u30d9\u30eb&a{1}&6\u306b\u306a\u308a\u307e\u3057\u305f\u3002 -Holiday.Anniversary=&9{0}\u5468\u5e74\u8a18\u5ff5\uff01\n&9nossr50\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=&7\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=&a\u30ed\u30b1\u30fc\u30eb \u30ea\u30ed\u30fc\u30c9\uff01 +Locale.Reloaded=&aロケール リロード! # Player Leveling Stuff -LevelCap.PowerLevel=&6(&amcMMO&6) &c{0}&e\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=&6(&amcMMO&6) &6{1}&e\u306e\u30ec\u30d9\u30eb\u30ad\u30e3\u30c3\u30d7&c{0}&e\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 -Commands.XPBar.Usage=\u4f7f\u3044\u65b9\u306f /mmoxpbar -Commands.Description.mmoxpbar=mcMMO XP\u30d0\u30fc\u306e\u30d7\u30ec\u30a4\u30e4\u30fc\u8a2d\u5b9a -Commands.Description.mmocompat=mcMMO\u306b\u3064\u3044\u3066\u306e\u60c5\u5831\u3068\u3001\u4e92\u63db\u6027\u30e2\u30fc\u30c9\u304b\u5b8c\u5168\u306b\u6a5f\u80fd\u3057\u3066\u3044\u308b\u304b\u3069\u3046\u304b\u306e\u60c5\u5831\u3002 -Compatibility.Layer.Unsupported=&a{0}&6\u306e\u4e92\u63db\u6027\u306f\u3001\u3053\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u306eMinecraft\u3067\u306f\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002 -Compatibility.Layer.PartialSupport=&a{0}&6\u306e\u4e92\u63db\u6027\u306f\u3053\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u306eMinecraft\u3067\u306f\u5b8c\u5168\u306b\u306f\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u304c\u3001mcMMO\u306f\u4e0d\u8db3\u3057\u3066\u3044\u308b\u6a5f\u80fd\u306e\u4e00\u90e8\u3092\u30a8\u30df\u30e5\u30ec\u30fc\u30c8\u3059\u308b\u305f\u3081\u306b\u30bb\u30ab\u30f3\u30c0\u30ea\u30b7\u30b9\u30c6\u30e0\u3092\u5b9f\u884c\u3057\u3066\u3044\u307e\u3059\u3002 -Commands.XPBar.DisableAll=&6 \u3059\u3079\u3066\u306emcMMO XP\u30d0\u30fc\u304c\u7121\u52b9\u306b\u306a\u3063\u305f\u306e\u3067\u3001/mmoxpbar reset\u3092\u4f7f\u7528\u3057\u3066\u30c7\u30d5\u30a9\u30eb\u30c8\u8a2d\u5b9a\u3092\u5fa9\u5143\u3002 +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\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* \u30b3\u30f3\u30bd\u30fc\u30eb * -Chat.Channel.On=&6(&amcMMO-\u30c1\u30e3\u30c3\u30c8&6) &e\u30c1\u30e3\u30c3\u30c8\u30e1\u30c3\u30bb\u30fc\u30b8\u304c\u81ea\u52d5\u7684\u306b &a{0} &e\u30c1\u30e3\u30c3\u30c8\u30c1\u30e3\u30f3\u30cd\u30eb\u306b\u9001\u4fe1\u3055\u308c\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3057\u305f\u3002 -Chat.Channel.Off=&6(&amcMMO-\u30c1\u30e3\u30c3\u30c8&6) &7\u3042\u306a\u305f\u306e\u30c1\u30e3\u30c3\u30c8\u30e1\u30c3\u30bb\u30fc\u30b8\u306f\u3001\u7279\u5b9a\u306e\u30c1\u30e3\u30c3\u30c8\u30c1\u30e3\u30f3\u30cd\u30eb\u306b\u81ea\u52d5\u7684\u306b\u9001\u4fe1\u3055\u308c\u306a\u304f\u306a\u308a\u307e\u3059\u3002 -Chat.Spy.Party=&6[&eSPY&6-&a{2}&6] &r{0} &b\u2192 &r{1} -Broadcasts.LevelUpMilestone=&6(&amcMMO&6) {0} &7\u304c &3{2} \u3067\u30ec\u30d9\u30eb &a{1} &7\u306b\u5230\u9054\u3057\u307e\u3057\u305f\uff01 -Broadcasts.PowerLevelUpMilestone=&6(&amcMMO&6) {0}&7 \u306e\u30d1\u30ef\u30fc\u30ec\u30d9\u30eb\u304c &a{1} &7\u306b\u5230\u9054\u3057\u307e\u3057\u305f\uff01 -Scoreboard.Recovery=mcMMO\u306e\u30b9\u30b3\u30a2\u30dc\u30fc\u30c9\u3092\u5fa9\u5143\u3057\u3088\u3046\u3068\u3057\u3066\u3044\u307e\u3059... \ No newline at end of file +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 91f9ec262..aa37dac39 100644 --- a/src/main/resources/locale/locale_ko.properties +++ b/src/main/resources/locale/locale_ko.properties @@ -16,704 +16,704 @@ # --wolfwork #ACROBATICS -Acrobatics.Ability.Proc=&a**\uC6B0\uC544\uD55C \uAD6C\uB974\uAE30** -Acrobatics.Combat.Proc=&a**\uD68C\uD53C** -Acrobatics.DodgeChance=\uD68C\uD53C \uD655\uB960: &e{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: &e{0} -Acrobatics.SubSkill.Roll.GraceChance=\uC6B0\uC544\uD55C \uAD6C\uB974\uAE30 \uD655\uB960: &e{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: &e{0} -Alchemy.Concoctions.Rank=\uD63C\uD569 \uB7AD\uD06C: &e{0}/{1} -Alchemy.Concoctions.Ingredients=\uC131\uBD84 [&e{0}&c]: &e{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: &e{0} -Archery.Combat.RetrieveChance=\uD654\uC0B4 \uD68C\uC218 \uD655\uB960: &e{0} -Archery.Combat.SkillshotBonus=\uC3D8\uAE30 \uC19C\uC528 \uCD94\uAC00 \uD53C\uD574 \uD655\uB960: &e{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=&7**\uB3C4\uB07C \uC900\uBE44 \uD574\uC81C** -Axes.Ability.Ready=&a**\uB3C4\uB07C \uC900\uBE44 \uC644\uB8CC** -Axes.Combat.CritStruck=&4\uD06C\uB9AC\uD2F0\uCEEC \uD788\uD2B8\uC5D0 \uB9DE\uC558\uC2B5\uB2C8\uB2E4! -Axes.Combat.CritChance=\uD06C\uB9AC\uD2F0\uCEEC \uD788\uD2B8 \uD655\uB960: &e{0} -Axes.Combat.CriticalHit=\uD06C\uB9AC\uD2F0\uCEEC \uD788\uD2B8! -Axes.Combat.GI.Proc=&a**\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=&4\uBF08 \uCABC\uAC1C\uAE30\uC5D0 \uB9DE\uC558\uC2B5\uB2C8\uB2E4! -Axes.Combat.SS.Length=\uBF08 \uCABC\uAC1C\uAE30 \uC9C0\uC18D\uC2DC\uAC04: &e{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=&a**\uBF08 \uCABC\uAC1C\uAE30 \uBC1C\uB3D9** -Axes.Skills.SS.Refresh=&a\uB2F9\uC2E0\uC758 &e\uBF08 \uCABC\uAC1C\uAE30 &a\uAE30\uC220\uC740 \uC774\uC81C \uC0AC\uC6A9 \uAC00\uB2A5\uD569\uB2C8\uB2E4! -Axes.Skills.SS.Other.Off={0}\uB2D8\uC774 &c\uBF08 \uCABC\uAC1C\uAE30\uB97C&a \uC900\uBE44 \uD574\uC81C\uD588\uC2B5\uB2C8\uB2E4 -Axes.Skills.SS.Other.On=&a{0}&2\uB2D8\uC774 &c\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=&7**\uC0BD \uC900\uBE44 \uD574\uC81C** -Excavation.Ability.Ready=&a**\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: &e{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=&a**\uAE30\uAC00 \uB4DC\uB9B4 \uBC84\uC11C\uCEE4 \uBC1C\uB3D9** -Excavation.Skills.GigaDrillBreaker.Refresh=&a\uB2F9\uC2E0\uC758 &e\uAE30\uAC00 \uB4DC\uB9B4 \uBC84\uC11C\uCEE4 &a\uAE30\uC220\uC740 \uC774\uC81C \uC0AC\uC6A9 \uAC00\uB2A5\uD569\uB2C8\uB2E4! -Excavation.Skills.GigaDrillBreaker.Other.Off={0}&2\uB2D8\uC740 &c\uAE30\uAC00 \uB4DC\uB9B4 \uBC84\uC11C\uCEE4\uB97C \uC0AC\uC6A9\uD588\uC2B5\uB2C8\uB2E4! -Excavation.Skills.GigaDrillBreaker.Other.On=&a{0}&2\uB2D8\uC740 &c\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: &e{0} -Fishing.Ability.Info=\uB9E4\uC9C1 \uD5CC\uD130: &7 **\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: &e{0}/5\uB7AD\uD06C -Fishing.Ability.TH.DropRate= \uB4DC\uB86D \uBE44\uC728: &4\uD568\uC815: &e{0} &7\uACF5\uD1B5: &e{1} &a\uBE44\uACF5\uD1B5: &e{2}\n&9\uB808\uC5B4: &e{3} &d\uC5D0\uD53D: &e{4} &6\uB808\uC804\uB4DC\uB9AC: &e{5} &b\uB808\uCF54\uB4DC: &e{6} -Fishing.Ability.TH.MagicRate=\uB9E4\uC9C1 \uD5CC\uD130 \uD655\uB960: &e{0} -Fishing.Ability.Shake=\uD754\uB4E4\uAE30 \uD655\uB960: &e{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: &e{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.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=&9 \uBE44 \uD2B9\uD61C -Fishing.Listener=\uB09A\uC2DC(FISHING): -Fishing.Ability.TH.MagicFound=&7\uC774 \uC785\uC9C8\uC5D0\uC11C \uB9C8\uBC95\uC774 \uB290\uAEF4\uC9D1\uB2C8\uB2E4... -Fishing.Ability.TH.Boom=&7\uD3ED\uBC1C \uC2DC\uAC04!!! -Fishing.Ability.TH.Poison=&7\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: &e{0} -Herbalism.Ability.FD=\uB18D\uBD80\uC758 \uB2E4\uC774\uC5B4\uD2B8: &e{0}\uB7AD\uD06C -Herbalism.Ability.GTe.Length=\uC7AC\uBC30\uC758 \uB300\uC9C0 \uC9C0\uC18D\uC2DC\uAC04: &e{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: &e{0} -Herbalism.Ability.GTh.Fail=**\uC7AC\uBC30\uC758 \uC7AC\uB2A5 \uC2E4\uD328** -Herbalism.Ability.GTh.Stage=\uC7AC\uBC30\uC758 \uC7AC\uB2A5 \uB2E8\uACC4: &e \uC791\uBB3C \uC7AC\uBC30 {0}\uB2E8\uACC4 -Herbalism.Ability.GTh=&a**\uC7AC\uBC30\uC758 \uC7AC\uB2A5** -Herbalism.Ability.HylianLuck=\uD558\uC77C\uB9AC\uC548\uC758 \uD589\uC6B4 \uD655\uB960: &e{0} -Herbalism.Ability.Lower=&7**\uD638\uBBF8 \uC900\uBE44 \uD574\uC81C** -Herbalism.Ability.Ready=&a**\uD638\uBBF8 \uC900\uBE44 \uC644\uB8CC** -Herbalism.Ability.ShroomThumb.Chance=\uBC84\uC12F\uC7AC\uBC30\uC790\uC758 \uC228\uACB0 \uD655\uB960: &e{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=&a\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=&a**\uC7AC\uBC30\uC758 \uB300\uC9C0 \uD65C\uC131\uD654\uB428** -Herbalism.Skills.GTe.Refresh=&a\uB2F9\uC2E0\uC758 &e\uC7AC\uBC30\uC758 \uB300\uC9C0 &a\uAE30\uC220\uC740 \uC774\uC81C \uC0AC\uC6A9 \uAC00\uB2A5\uD569\uB2C8\uB2E4! -Herbalism.Skills.GTe.Other.Off={0}&2\uB2D8\uC740 &c\uC7AC\uBC30\uC758 \uB300\uC9C0\uB97C \uC0AC\uC6A9\uD588\uC2B5\uB2C8\uB2E4! -Herbalism.Skills.GTe.Other.On=&a{0}&2\uB2D8\uC740 &c\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: &e{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=&7**\uACE1\uAD2D\uC774 \uC900\uBE44 \uD574\uC81C** -Mining.Ability.Ready=&a**\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: &e{0} -Mining.Effect.DropChance=\uB4DC\uB86D 2\uBC30 \uD655\uB960: &e{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=&a**\uD30C\uAD34\uC790 \uBC1C\uB3D9** -Mining.Skills.SuperBreaker.Other.Off={0}&2\uB2D8\uC740 &c\uD30C\uAD34\uC790\uB97C \uC0AC\uC6A9\uD588\uC2B5\uB2C8\uB2E4! -Mining.Skills.SuperBreaker.Other.On=&a{0}&2\uB2D8\uC740 &c\uD30C\uAD34\uC790\uB97C \uC0AC\uC6A9\uD588\uC2B5\uB2C8\uB2E4! -Mining.Skills.SuperBreaker.Refresh=&a\uB2F9\uC2E0\uC758 &e\uD30C\uAD34\uC790\uB294 &a\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=&7**\uD3ED\uBC1C** -Mining.Blast.Effect=+{0} \uAD11\uBB3C \uC774\uC775, {1}x \uB4DC\uB86D -Mining.Blast.Radius.Increase=\uD3ED\uBC1C \uBC18\uACBD \uC99D\uAC00: &e+{0} -Mining.Blast.Rank=\uD3ED\uBC1C \uCC44\uAD74: &e{0}/8\uB7AD\uD06C &7({1}) -Mining.Blast.Other.On=&a{0}&2\uB2D8\uC740 &c\uD3ED\uBC1C \uCC44\uAD74\uC744 \uC0AC\uC6A9\uD558\uC168\uC2B5\uB2C8\uB2E4! -Mining.Blast.Refresh=&a\uB2F9\uC2E0\uC758 &e\uD3ED\uBC1C \uCC44\uAD74 &a\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=&4mcMMO\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=&4\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=&4\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=&4\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=&4\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=&4\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 &e{1}\uC744/\uB97C \uC218\uB9AC\uD560\uB824\uBA74 &e{0}&c\uB808\uBCA8\uC774 \uD544\uC694\uD569\uB2C8\uB2E4 -Repair.Skills.FeltEasy=&7\uC26C\uC6B4 \uB290\uB08C~ -Repair.Skills.FullDurability=&7\uB0B4\uAD6C\uB3C4\uAC00 \uAF49 \uCC3C\uC2B5\uB2C8\uB2E4. -Repair.Skills.Mastery=\uC218\uB9AC \uB9C8\uC2A4\uD130\uB9AC: &e\uCD94\uAC00 \uB0B4\uAD6C\uC131 \uBCF5\uAD6C: {0} -Repair.Skills.StackedItems=&4\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: &e{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=&7\uC778\uCC48\uD2B8 \uC218\uB9AC \uACA9\uD558 \uD655\uB960: &e{0}% -Repair.Arcane.Chance.Success=&7\uC778\uCC48\uD2B8 \uC218\uB9AC \uC131\uACF5 \uD655\uB960: &e{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=&a\uC774 \uC544\uC774\uD15C\uC758 \uC778\uCC48\uD2B8\uB97C \uC9C0\uC18D\uC2DC\uCF30\uC2B5\uB2C8\uB2E4. -Repair.Arcane.Rank=\uC778\uCC48\uD2B8 \uC218\uB9AC: &e{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: &eRank {0}/{1} -Salvage.Arcane.ExtractFull=&7\uCD5C\uB300-\uC778\uCC48\uD2B8 \uAE30\uD68C \uBD80\uACFC -Salvage.Arcane.ExtractPartial=&7\uC77C\uBD80-\uC778\uCC48\uD2B8 \uAE30\uD68C \uBD80\uACFC -Salvage.Skills.Success=&a\uC544\uC774\uD15C \uD68C\uC218\uB428! -Salvage.Skills.Adept.Damaged=&4\uC190\uC0C1\uB41C \uC544\uC774\uD15C\uC744 \uD68C\uC218\uD560 \uB2A5\uB825\uC774 \uC5C6\uC2B5\uB2C8\uB2E4. -Salvage.Skills.Adept.Level={1}\uB97C &c\uD68C\uC218\uD558\uB824\uBA74 &e{0}&c \uB808\uBCA8\uC774 \uB418\uC57C\uD569\uB2C8\uB2E4 -Salvage.Skills.TooDamaged=&4\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=&a\uB2F9\uC2E0\uC740 \uC774 \uC544\uC774\uD15C\uC758 \uBAA8\uB4E0 \uC9C0\uC2DD\uC744 \uCD94\uCD9C\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4! -Salvage.Listener.Anvil=&4\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=&7**\uAC80 \uC900\uBE44 \uD574\uC81C** -Swords.Ability.Ready=&a**\uAC80 \uC900\uBE44 \uC644\uB8CC** -Swords.Combat.Bleed.Chance=\uCD9C\uD608 \uD655\uB960: &e{0} -Swords.Combat.Bleed.Length=\uCD9C\uD608 \uC9C0\uC18D\uC2DC\uAC04: &e{0} \uD2F1 -Swords.Combat.Bleed.Note=&7\uC54C\uB9BC: &e1 \uD2F1\uC740 2\uCD08\uC785\uB2C8\uB2E4 -Swords.Combat.Bleeding.Started=&4 \uB2F9\uC2E0\uC740 \uD53C\uB97C \uD758\uB9AC\uACE0 \uC788\uC2B5\uB2C8\uB2E4! -Swords.Combat.Bleeding.Stopped=&7\uCD9C\uD608\uC774 &a\uBA48\uCDC4\uC2B5\uB2C8\uB2E4&7! -Swords.Combat.Bleeding=&a**\uCD9C\uD608** -Swords.Combat.Counter.Chance=\uCE74\uC6B4\uD130 \uC5B4\uD0DD \uD655\uB960: &e{0} -Swords.Combat.Counter.Hit=&4\uCE74\uC6B4\uD130 \uC5B4\uD0DD\uC5D0 \uB9DE\uC558\uC2B5\uB2C8\uB2E4! -Swords.Combat.Countered=&a**\uCE74\uC6B4\uD130-\uC5B4\uD0DD** -Swords.Combat.SS.Struck=&4\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=&a**\uD1B1\uB0A0 \uACF5\uACA9 \uBC1C\uB3D9** -Swords.Skills.SS.Refresh=&a\uB2F9\uC2E0\uC758 &e\uD1B1\uB0A0 \uACF5\uACA9 &a\uC2A4\uD0AC\uC740 \uC774\uC81C \uC0AC\uC6A9 \uAC00\uB2A5\uD569\uB2C8\uB2E4! -Swords.Skills.SS.Other.Off={0}&2\uB2D8\uC740 &c\uD1B1\uB0A0 \uACF5\uACA9 \uC2A4\uD0AC\uC744 \uC0AC\uC6A9 \uD574\uC81C\uD588\uC2B5\uB2C8\uB2E4! -Swords.Skills.SS.Other.On=&a{0}&2\uB2D8\uC740 &c\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: &e{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: &e{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=&7COTW (\uC624\uC140\uB86F): \uCB48\uADF8\uB9AC\uBA74\uC11C \uBB3C\uACE0\uAE30\uB97C \uB4E4\uACE0 {0}\uBC88 \uC88C \uD074\uB9AD -Taming.Effect.15=&7COTW (\uB291\uB300): \uCB48\uADF8\uB9AC\uBA74\uC11C \uBF08\uB97C \uB4E4\uACE0 {0}\uBC88 \uC88C \uD074\uB9AD -Taming.SubSkill.Gore.Name0=&7COTW (\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=&8\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=&a\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: &e{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: &e{0} -Unarmed.Ability.Chance.Disarm=\uBE44\uBB34\uC7A5 \uD655\uB960: &e{0} -Unarmed.Ability.Chance.IronGrip=\uAC15\uCCA0 \uC8FC\uBA39 \uD655\uB960: &e{0} -Unarmed.Ability.IronGrip.Attacker=\uC0C1\uB300\uB294 \uAC15\uCCA0 \uC8FC\uBA39\uC744 \uAC00\uC9C0\uACE0 \uC788\uC2B5\uB2C8\uB2E4! -Unarmed.Ability.IronGrip.Defender=&a\uAC15\uCCA0 \uC8FC\uBA39\uC758 \uBE44\uBB34\uC7A5\uC744 \uC77C\uC2DC\uC801\uC73C\uB85C \uBC29\uC5B4\uD588\uC2B5\uB2C8\uB2E4! -Unarmed.Ability.Lower=&7**\uC190 \uC900\uBE44 \uD574\uC81C** -Unarmed.Ability.Ready=&a**\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=&a**\uBC84\uC11C\uCEE4 \uBC1C\uB3D9** -Unarmed.Skills.Berserk.Other.Off={0}&2\uB2D8\uC740 &c\uBC84\uC11C\uCEE4\uB97C \uC0AC\uC6A9\uD588\uC2B5\uB2C8\uB2E4! -Unarmed.Skills.Berserk.Other.On=&a{0}&2\uB2D8\uC740 &c\uBC84\uC11C\uCEE4\uB97C \uC0AC\uC6A9\uD569\uB2C8\uB2E4! -Unarmed.Skills.Berserk.Refresh=&a\uB2F9\uC2E0\uC758 &e\uBC84\uC11C\uCEE4 &a\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: &e{0} -Woodcutting.Ability.Length=\uB098\uBB34\uAFBC \uC9C0\uC18D\uC2DC\uAC04: &e{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=&a**\uB098\uBB34\uAFBC \uBC1C\uB3D9** -Woodcutting.Skills.TreeFeller.Refresh=&a\uB2F9\uC2E0\uC758 &e\uB098\uBB34\uAFBC &a\uC2A4\uD0AC\uC740 \uC774\uC81C \uC0AC\uC6A9 \uAC00\uB2A5\uD569\uB2C8\uB2E4! -Woodcutting.Skills.TreeFeller.Other.Off={0}&2\uB2D8\uC740 &c\uB098\uBB34\uAFBC \uC2A4\uD0AC\uC744 \uC0AC\uC6A9 \uD574\uC81C\uD588\uC2B5\uB2C8\uB2E4! -Woodcutting.Skills.TreeFeller.Other.On=&a{0}&2\uB2D8\uC740 &c\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=&a**\uB2A5\uB825\uC774 \uC7AC \uACF5\uAE09 \uB418\uC5C8\uC2B5\uB2C8\uB2E4!** +Ability.Generic.Refresh=&a**능력이 재 공급 되었습니다!** Ability.Generic.Template.Lock=&7{0} Ability.Generic.Template=&6{0}: &3{1} #COMBAT -Combat.ArrowDeflect=&f**\uD654\uC0B4 \uD68C\uD53C** -Combat.BeastLore=&a**\uC9D0\uC2B9\uC758 \uD3EC\uD6A8** -Combat.BeastLoreHealth=&3\uCCB4\uB825: (&a{0}&3/{1}) -Combat.BeastLoreOwner=&3\uC8FC\uC778: (&c{0}&3) -Combat.Gore=&a**\uB3CC\uC9C4** -Combat.StruckByGore=**\uB3CC\uC9C4\uC5D0 \uB9DE\uC558\uC2B5\uB2C8\uB2E4** -Combat.TargetDazed=\uBAA9\uD45C\uAC00 &4\uD63C\uB780\uC2A4\uB7EC\uC6CC\uD569\uB2C8\uB2E4 -Combat.TouchedFuzzy=&4\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&3 \uD504\uB85C\uC81D\uD2B8\uC5D0 \uB300\uD574\uC11C:,&6mcMMO\uB294 \uD55C &c\uC624\uD508 \uC18C\uC2A4&6 RPG \uBAA8\uB4DC\uB85C 2011\uB144 2\uC6D4\uC5D0 &9nossr50&6\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.,&3\uD301:,&6 - &c/mcmmo help&a \uBA85\uB839\uC5B4\uB4E4\uC744 \uBD05\uB2C8\uB2E4,&6 - &a\uD0C0\uC785 &c/\uC2A4\uD0AC\uC774\uB984&a \uC790\uC138\uD55C \uC2A4\uD0AC \uC815\uBCF4\uB97C \uBD05\uB2C8\uB2E4,&3\uAC1C\uBC1C\uC790\uB4E4:,&6 - &anossr50 &9(\uC81C\uC791\uC790),&6 - &aGJ &9(\uD504\uB85C\uC81D\uD2B8 \uC8FC\uC7A5),&6 - &aNuclearW &9(\uAC1C\uBC1C\uC790),&6 - &abm01 &9(\uAC1C\uBC1C\uC790),&6 - &aTfT_02 &9(\uAC1C\uBC1C\uC790),&6 - &aGlitchfinder &9(\uAC1C\uBC1C\uC790),&6 - &at00thpick1 &9(\uAC1C\uBC1C\uC790),&3\uC720\uC6A9\uD55C \uB9C1\uD06C:,&6 - &ahttps://github.com/mcMMO-Dev/mcMMO/issues&6 \uBC84\uADF8 \uBCF4\uACE0,&6 - &a#mcmmo @ irc.esper.net&6 IRC \uCC44\uD305, -Commands.addlevels.AwardAll.1=&a\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=&a\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=&a\uB2F9\uC2E0\uC740 \uBAA8\uB4E0 \uC2A4\uD0AC\uC5D0 {0} \uACBD\uD5D8\uCE58\uB97C \uC9C0\uAE09\uD588\uC2B5\uB2C8\uB2E4! -Commands.addxp.AwardSkill=&a\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 &c\uAEBC\uC84C\uC2B5\uB2C8\uB2E4 -Commands.Ability.On=\uB2A5\uB825 \uC0AC\uC6A9\uC774 &a\uCF1C\uC84C\uC2B5\uB2C8\uB2E4 -Commands.Ability.Toggle=\uB2A5\uB825 \uC0AC\uC6A9\uC740 &e{0}(\uC73C)\uB85C \uC804\uD658\uB418\uC5C8\uC2B5\uB2C8\uB2E4 -Commands.AdminChat.Off=\uAD00\uB9AC\uC790 \uCC44\uD305\uC774 &c\uAEBC\uC84C\uC2B5\uB2C8\uB2E4 -Commands.AdminChat.On=\uAD00\uB9AC\uC790 \uCC44\uD305\uC774 &a\uCF1C\uC84C\uC2B5\uB2C8\uB2E4 -Commands.AdminToggle=&a- \uAD00\uB9AC\uC790 \uCC44\uD305\uC744 \uCF1C\uAE30/\uB044\uAE30\uD569\uB2C8\uB2E4 -Commands.Chat.Console=*\uC2DC\uC2A4\uD15C* -Commands.Cooldowns.Header=&6--= &amcMMO \uB2A5\uB825 \uC7AC \uC0AC\uC6A9 \uB300\uAE30\uC2DC\uAC04&6 =-- -Commands.Cooldowns.Row.N=\ &c{0}&f - &6{1}\uCD08 \uB0A8\uC74C -Commands.Cooldowns.Row.Y=\ &b{0}&f - &2\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= &c\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 &e{0}&f(\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 &c\uD558\uD2B8&f\uB85C \uBCC0\uACBD\uB418\uC5C8\uC2B5\uB2C8\uB2E4. -Commands.Healthbars.Changed.BAR=[mcMMO] \uB2F9\uC2E0\uC758 \uCCB4\uB825\uBC14 \uBCF4\uAE30 \uBC29\uC2DD\uC740 &e\uBC15\uC2A4&f\uB85C \uBCC0\uACBD\uB418\uC5C8\uC2B5\uB2C8\uB2E4. -Commands.Healthbars.Changed.DISABLED=[mcMMO] \uB2F9\uC2E0\uC758 \uBAB9 \uCCB4\uB825\uBC14\uB294 &7\uBE44\uD65C\uC131\uD654&f \uB418\uC5C8\uC2B5\uB2C8\uB2E4. -Commands.Healthbars.Invalid=\uC798\uBABB\uB41C \uCCB4\uB825\uBC14 \uD0C0\uC785! -Commands.Inspect=<\uD50C\uB808\uC774\uC5B4> &a- \uC0C1\uC138\uD55C \uD50C\uB808\uC774\uC5B4 \uC815\uBCF4\uB97C \uBD05\uB2C8\uB2E4 -Commands.Invite.Success=&a\uCD08\uB300\uB97C \uC131\uACF5\uC801\uC73C\uB85C \uBCF4\uB0C8\uC2B5\uB2C8\uB2E4. -Commands.Leaderboards=<\uC2A4\uD0AC> <\uD398\uC774\uC9C0> &a- mcMMO \uC2A4\uD0AC \uC815\uBCF4 -Commands.mcc.Header=---[]&amcMMO \uBA85\uB839\uC5B4&c[]--- -Commands.mcgod=&a- \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=&a\uB370\uC774\uD130\uBCA0\uC774\uC2A4\uAC00 \uC131\uACF5\uC801\uC73C\uB85C \uCD08\uAE30\uD654\uB42C\uC2B5\uB2C8\uB2E4! -Commands.mcrank.Heading=&6-=\uAC1C\uC778 \uC21C\uC704=- -Commands.mcrank.Overall=\uC885\uD569&a - &6\uB7AD\uD06C &f#&a{0} -Commands.mcrank.Player=\uD0C0\uAC9F: &f{0} -Commands.mcrank.Skill={0}&a - &6\uB7AD\uD06C &f#&a{1} -Commands.mcrank.Unranked=&f\uB7AD\uD06C\uC5C6\uC74C -Commands.mcrefresh.Success={0}\uC758 \uCFE8\uB2E4\uC6B4\uC774 \uCD08\uAE30\uD654\uB418\uC5C8\uC2B5\uB2C8\uB2E4. -Commands.mcremove.Success=&a{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=&6\uD301: &c/mcrank&6 \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> &a - \uB300\uC0C1\uC744 \uC218\uC815\uD569\uB2C8\uB2E4 -Commands.mmoedit.AllSkills.1=&a\uB2F9\uC2E0\uC758 \uBAA8\uB4E0 \uC2A4\uD0AC \uB808\uBCA8\uC774 {0}\uB85C \uC124\uC815\uB418\uC5C8\uC2B5\uB2C8\uB2E4! -Commands.mmoedit.Modified.1=&a\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=&7{0}\uC5D0\uC11C {1}(\uC73C)\uB85C \uC804\uD658 \uC2DC\uC791\uC911... -Commands.mcconvert.Database.Finish=&7\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: &a{0} -Commands.mcconvert.Experience.Invalid=\uC798\uBABB\uB41C \uACF5\uC2DD \uD0C0\uC785! \uC62C\uBC14\uB978 \uD0C0\uC785: &aLINEAR &c\uADF8\uB9AC\uACE0 &aEXPONENTIAL. -Commands.mcconvert.Experience.Same=\uC774\uBBF8 {0} \uACF5\uC2DD\uC744 \uC0AC\uC6A9\uC911\uC785\uB2C8\uB2E4 -Commands.mcconvert.Experience.Start=&7{0} \uC5D0\uC11C {1} \uACE1\uC120\uC73C\uB85C \uBCC0\uD658 \uC2DC\uC791 -Commands.mcconvert.Experience.Finish=&7\uACF5\uC2DD \uBCC0\uD658 \uC644\uB8CC; \uC774\uC81C {0} XP \uACE1\uC120\uC785\uB2C8\uB2E4. -Commands.ModDescription=&a- \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 &c\uCF1C\uC84C\uC2B5\uB2C8\uB2E4 -Commands.Notifications.On=\uB2A5\uB825 \uC54C\uB9BC\uC774 &a\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=---[]&a\uAE30\uD0C0 \uBA85\uB839\uC5B4&c[]--- -Commands.Party.Header=-----[]&a\uD30C\uD2F0&c[]----- -Commands.Party.Features.Header=-----[]&a\uD2B9\uC9D5&c[]----- -Commands.Party.Status=&8\uC774\uB984: &f{0} {1} &8\uB808\uBCA8: &3{2} -Commands.Party.Status.Alliance=&8\uB3D9\uB9F9: &f{0} -Commands.Party.UnlockedFeatures=&8\uD574\uC81C\uB41C \uD2B9\uC9D5: &7&o{0} -Commands.Party.ShareMode=&8\uACF5\uC720 \uBAA8\uB4DC: -Commands.Party.ItemShare=&7\uC544\uC774\uD15C &3({0}) +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\uACF5\uC720\uC911\uC778 \uC544\uC774\uD15C: &7&o{0} -Commands.Party.MembersNear=&8\uB2F9\uC2E0\uC758 \uADFC\uCC98 &3{0}&8/&3{1} -Commands.Party.Accept=&a- \uD30C\uD2F0 \uCD08\uB300 \uD5C8\uC6A9 -Commands.Party.Chat.Off=\uD30C\uD2F0 \uCC44\uD305\uC744 &c\uB055\uB2C8\uB2E4 -Commands.Party.Chat.On=\uD30C\uD2F0 \uCC44\uD305\uC744 &a\uCF2D\uB2C8\uB2E4 -Commands.Party.Commands=---[]&a\uD30C\uD2F0 \uBA85\uB839\uC5B4&c[]--- -Commands.Party.Invite.0=\uC54C\uB9BC: &a\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 &a/party accept&e \uBA85\uB839\uC5B4\uB97C \uCE58\uBA74 \uD30C\uD2F0 \uCD08\uB300\uC5D0 \uC2B9\uB099\uB429\uB2C8\uB2E4 -Commands.Party.Invite=<\uD50C\uB808\uC774\uC5B4> &a- \uD30C\uD2F0 \uCD08\uB300\uB97C \uBCF4\uB0C5\uB2C8\uB2E4 -Commands.Party.Invite.Accepted=&a\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=&7\uB9CC\uB4E4\uC5B4\uC9C4 \uD30C\uD2F0: {0} -Commands.Party.Rename=&7\uBCC0\uACBD\uB41C \uD30C\uD2F0 \uC774\uB984: &f{0} -Commands.Party.SetSharing=&7\uD30C\uD2F0 {0} \uACF5\uC720 \uC124\uC815: &3{1} -Commands.Party.ToggleShareCategory=&7\uD30C\uD2F0 \uC544\uC774\uD15C \uACF5\uC720 &6{0} &7\uAC00 &3{1}\uB418\uC5C8\uC2B5\uB2C8\uB2E4 -Commands.Party.AlreadyExists=&4{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=-----[]&a\uB9F4\uBC84\uB4E4&c[]----- -Commands.Party.None=\uB2F9\uC2E0\uC740 \uD30C\uD2F0\uC5D0 \uCC38\uC5EC\uB418\uC5B4 \uC788\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. -Commands.Party.Quit=&a- \uD604\uC7AC \uCC38\uC5EC \uB418\uC5B4\uC788\uB294 \uD30C\uD2F0\uB97C \uB098\uAC11\uB2C8\uB2E4 -Commands.Party.Teleport=&a- \uD30C\uD2F0 \uB9F4\uBC84\uD55C\uD14C \uD154\uB808\uD3EC\uD2B8\uD569\uB2C8\uB2E4 -Commands.Party.Toggle=&a- \uD30C\uD2F0 \uCC44\uD305\uC744 \uCF1C\uAE30/\uB044\uAE30 \uD569\uB2C8\uB2E4 -Commands.Party1=&a- \uC0C8 \uD30C\uD2F0\uB97C \uB9CC\uB4ED\uB2C8\uB2E4 -Commands.Party2=&a- \uD50C\uB808\uC774\uC5B4\uAC00 \uD30C\uD2F0\uC5D0 \uAC00\uC785\uD569\uB2C8\uB2E4 -Commands.Party.Alliance.Header=-----[]&a\uD30C\uD2F0 \uB3D9\uB9F9&c[]----- -Commands.Party.Alliance.Ally=&f{0} &8\uD30C\uD2F0\uC758 \uB3D9\uB9F9: &f{1} -Commands.Party.Alliance.Members.Header=-----[]&a\uB3D9\uB9F9 \uAD6C\uC131\uC6D0&c[]----- -Commands.Party.Alliance.Invite.0=\uC54C\uB9BC: &a{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 &a/party alliance accept&e \uCD08\uB300\uC5D0 \uC218\uB77D\uD569\uB2C8\uB2E4 -Commands.Party.Alliance.Invite.Accepted=&a\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 &3/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 &3/party alliance invite &c. -Commands.ptp.Enabled=\uD30C\uD2F0 \uD154\uB808\uD3EC\uD2B8 &a\uD65C\uC131\uD654\uB428 -Commands.ptp.Disabled=\uD30C\uD2F0 \uD154\uB808\uD3EC\uD2B8 &c\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} &a\uB2D8\uC774 \uB2F9\uC2E0\uC5D0\uAC8C \uD154\uB808\uD3EC\uD2B8\uB97C \uC2E0\uCCAD\uD588\uC2B5\uB2C8\uB2E4. -Commands.ptp.Request2=&a\uD154\uB808\uD3EC\uD2B8\uD558\uB824\uBA74, \uD0C0\uC785 &e/ptp accept&a. &c{0}&a\uCD08\uC5D0 \uC694\uCCAD\uC774 \uB9CC\uAE30\uB429\uB2C8\uB2E4. -Commands.ptp.AcceptAny.Enabled=\uD30C\uD2F0 \uD154\uB808\uD3EC\uD2B8 \uC694\uCCAD \uD655\uC778 &a\uD65C\uC131\uD654\uB428 -Commands.ptp.AcceptAny.Disabled=\uD30C\uD2F0 \uD154\uB808\uD3EC\uD2B8 \uC694\uCCAD \uD655\uC778 &c\uBE44\uD65C\uC131\uD654\uB428 -Commands.ptp.RequestExpired=\uD30C\uD2F0 \uD154\uB808\uD3EC\uD2B8 \uC694\uCCAD\uC774 \uB9CC\uAE30\uB428! -Commands.PowerLevel.Leaderboard=--mcMMO&9 \uCD1D \uB808\uBCA8 &e\uC810\uC218\uD45C-- -Commands.PowerLevel.Capped=&4\uCD1D \uB808\uBCA8: &a{0} &4\uCD5C\uB300 \uB808\uBCA8: &e{1} -Commands.PowerLevel=&4\uCD1D \uB808\uBCA8: &a{0} -Commands.Reset.All=&a\uB2F9\uC2E0\uC758 \uBAA8\uB4E0 \uC2A4\uD0AC\uC774 \uC131\uACF5\uC801\uC73C\uB85C \uCD08\uAE30\uD654\uB418\uC5C8\uC2B5\uB2C8\uB2E4. -Commands.Reset.Single=&a\uB2F9\uC2E0\uC758 {0} \uC2A4\uD0AC\uC774 \uC131\uACF5\uC801\uC73C\uB85C \uCD08\uAE30\uD654\uB418\uC5C8\uC2B5\uB2C8\uB2E4. -Commands.Reset=&a\uC2A4\uD0AC \uB808\uBCA8\uC744 0\uC73C\uB85C \uCD08\uAE30\uD654 \uC2DC\uD0B5\uB2C8\uB2E4 -Commands.Scoreboard.Clear=&3mcMMO \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=&3mcMMO \uC810\uC218\uD310\uC740 \uB2F9\uC2E0\uC774 &a/mcscoreboard clear&3\uB97C \uC0AC\uC6A9\uD560 \uB54C\uAE4C\uC9C0 \uC720\uC9C0\uB420 \uAC83\uC784. -Commands.Scoreboard.Timer=&3mcMMO \uC810\uC218\uD310\uC740 \uC9C0\uAE08\uC73C\uB85C\uBD80\uD130 &6{0}&3\uCD08 \uB0B4\uC5D0 \uCCAD\uC18C\uB420 \uC608\uC815\uC784. -Commands.Scoreboard.Help.0=&6 == &c/mcscoreboard &a\uB3C4\uC6C0\uB9D0&6 == -Commands.Scoreboard.Help.1=&3/mcscoreboard&b clear &f - McMMO \uC810\uC218\uD310\uC744 \uCCAD\uC18C\uD568 -Commands.Scoreboard.Help.2=&3/mcscoreboard&b keep &f - McMMO \uC810\uC218\uD310\uC744 \uC720\uC9C0\uD568 -Commands.Scoreboard.Help.3=&3/mcscoreboard&b time [n] &f - McMMO \uC810\uC218\uD310\uC744 &dn&f\uCD08 \uD6C4\uC5D0 \uCCAD\uC18C\uD568 -Commands.Scoreboard.Tip.Keep=&6\uD301: &c/mcscoreboard keep&6 \uC810\uC218\uD310\uC744 \uBCF4\uC774\uAC8C \uD56D\uC0C1 \uC720\uC9C0. -Commands.Scoreboard.Tip.Clear=&6\uD301: &c/mcscoreboard clear&6 \uC810\uC218\uD310 \uAC10\uCDA4. -Commands.Skill.Invalid=\uC798\uBABB\uB41C \uC2A4\uD0AC \uC774\uB984 \uC785\uB2C8\uB2E4! -Commands.Skill.Leaderboard=--mcMMO &9{0}&e \uC810\uC218\uD45C-- -Commands.SkillInfo=&a- \uC2A4\uD0AC\uC5D0 \uB300\uD55C \uC790\uC138\uD55C \uC815\uBCF4\uB97C \uBD05\uB2C8\uB2E4 -Commands.Stats.Self=\uB2F9\uC2E0\uC758 \uD1B5\uACC4 -Commands.Stats=&a- \uB2F9\uC2E0\uC758 mcMMO \uD1B5\uACC4 \uBCF4\uAE30 -Commands.ToggleAbility=&a- \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 +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=&4\uAD8C\uD55C\uC774 \uBD80\uC871\uD569\uB2C8\uB2E4. -mcMMO.NoSkillNote=&8\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 &3{0} <\uD50C\uB808\uC774\uC5B4> [\uBE44\uBC00\uBC88\uD638]. -Party.Help.1=\uD30C\uD2F0\uB97C \uB9CC\uB4E4\uB824\uBA74, &3{0} <\uC774\uB984> [\uBE44\uBC00\uBC88\uD638]. -Party.Help.2=\uD30C\uD2F0 \uC815\uBCF4\uB97C \uBCFC\uB824\uBA74 &3{0} -Party.Help.3=\uD30C\uD2F0\uC5D0 \uAC00\uC785\uD560\uB824\uBA74 &3{0} <\uD50C\uB808\uC774\uC5B4> [\uBE44\uBC00\uBC88\uD638] &c\uB098\uAC08\uB824\uBA74 &3{1} -Party.Help.4=\uD30C\uD2F0\uB97C \uC7A0\uAE08/\uC7A0\uAE08\uD574\uC81C \uD560\uB824\uBA74, &3{0} -Party.Help.5=\uBE44\uBC00\uBC88\uD638\uB85C \uD30C\uD2F0\uB97C \uBCF4\uD638\uD560\uB824\uBA74, &3{0} <\uBE44\uBC00\uBC88\uD638> -Party.Help.6=\uD30C\uD2F0\uC5D0\uC11C \uD50C\uB808\uC774\uC5B4\uB97C \uCD94\uBC29\uC2DC\uD0AC\uB824\uBA74, &3{0} <\uD50C\uB808\uC774\uC5B4> -Party.Help.7=\uD30C\uD2F0\uC7A5\uC744 \uAD50\uCCB4\uD560\uB824\uBA74, &3{0} <\uD50C\uB808\uC774\uC5B4> -Party.Help.8=\uD30C\uD2F0\uB97C \uD574\uCCB4\uD560\uB824\uBA74, &3{0} -Party.Help.9=\uD30C\uD2F0 \uB9F4\uBC84\uB4E4\uACFC \uC544\uC774\uD15C\uC744 \uACF5\uC720\uD558\uB824\uBA74 &3{0} -Party.Help.10=\uD30C\uD2F0 \uB9F4\uBC84\uB4E4\uACFC \uACBD\uD5D8\uCE58 \uACF5\uC720\uB97C \uD65C\uC131\uD654\uD654\uB824\uBA74 &3{0} -Party.InformedOnJoin={0} &a\uB2D8\uC774 \uB2F9\uC2E0\uC758 \uD30C\uD2F0\uC5D0 \uCC38\uC5EC\uD588\uC2B5\uB2C8\uB2E4 -Party.InformedOnQuit={0} &a\uB2D8\uC774 \uB2F9\uC2E0\uC758 \uD30C\uD2F0\uC5D0\uC11C \uB5A0\uB0AC\uC2B5\uB2C8\uB2E4 -Party.InformedOnNameChange=&6{0} &a\uB2D8\uC774 \uD30C\uD2F0 \uC774\uB984\uC744 &f{1}\uB85C \uC124\uC815\uD588\uC2B5\uB2C8\uB2E4 -Party.InvalidName=&4\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=&4{0}\uB2D8\uC740 \uB2F9\uC2E0\uC758 \uD30C\uD2F0\uC5D0 \uC5C6\uC2B5\uB2C8\uB2E4 -Party.NotOwner=&4\uB2F9\uC2E0\uC740 \uD30C\uD2F0\uC7A5\uC774 \uC544\uB2D9\uB2C8\uB2E4. -Party.Target.NotOwner=&4{0}\uB2D8\uC740 \uD30C\uD2F0\uC7A5\uC774 \uC544\uB2D9\uB2C8\uB2E4. -Party.Owner.New=&a{0}\uB2D8\uC774 \uC0C8 \uD30C\uD2F0\uC7A5\uC774 \uB418\uC5C8\uC2B5\uB2C8\uB2E4. -Party.Owner.NotLeader=&4\uB2F9\uC2E0\uC740 \uC774\uC81C \uD30C\uD2F0\uC7A5\uC774 \uC544\uB2D9\uB2C8\uB2E4. -Party.Owner.Player =&a\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=&a\uC124\uC815\uD55C \uD30C\uD2F0 \uBE44\uBC00\uBC88\uD638\uB294 {0} \uC785\uB2C8\uB2E4 -Party.Password.Removed=&a\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=&4{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=&4{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=&a\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=&a{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=&7\uD30C\uD2F0\uAC00 \uC7A0\uAE08\uD574\uC81C \uB418\uC5C8\uC2B5\uB2C8\uB2E4 -Party.Disband=&7\uADF8 \uD30C\uD2F0\uAC00 \uD574\uCCB4\uB418\uC5C8\uC2B5\uB2C8\uB2E4 -Party.Alliance.Formed=&7\uB2F9\uC2E0\uC758 \uD30C\uD2F0\uB294 \uC774\uC81C &a{0} \uD30C\uD2F0\uC640 \uB3D9\uB9F9\uC785\uB2C8\uB2E4 -Party.Alliance.Disband=&7\uB2F9\uC2E0\uC758 \uD30C\uD2F0\uB294 \uB354 \uC774\uC0C1 &c{0} \uD30C\uD2F0\uC640 \uB3D9\uB9F9\uC774 \uC544\uB2D9\uB2C8\uB2E4 -Party.Status.Locked=&4(\uCD08\uB300\uB9CC-\uD5C8\uC6A9) -Party.Status.Unlocked=&2(\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=&8\uACBD\uD5D8\uCE58 \uC5BB\uB294 \uBC29\uBC95: &f{0} -Commands.xplock.locked=&6\uB2F9\uC2E0\uC758 \uACBD\uD5D8\uCE58 \uBC14\uB294 {0}\uB85C \uC7A0\uACBC\uC2B5\uB2C8\uB2E4! -Commands.xplock.unlocked=&6\uB2F9\uC2E0\uC758 \uACBD\uD5D8\uCE58 \uBC14\uB294 &a\uC7A0\uAE08 \uD574\uC81C\uB418\uC5C8\uC2B5\uB2C8\uB2E4&6! -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: &f/xprate <\uBC30\uC728> -Commands.xprate.proper.1=\uACBD\uD5D8\uCE58 \uBC30\uC728\uC744 \uCD08\uAE30\uD654 \uBC29\uBC95: &f/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=&6mcMMO \uACBD\uD5D8\uCE58 \uC774\uBCA4\uD2B8\uAC00 \uC2DC\uC791\uB418\uC5C8\uC2B5\uB2C8\uB2E4! -Commands.xprate.started.1=&6mcMMO \uACBD\uD5D8\uCE58 \uBC30\uC728\uC740 {0}\uBC30 \uC785\uB2C8\uB2E4! -XPRate.Event= &6mcMMO \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.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=&7{0} \uAC00\uC774\uB4DC\uAC00 \uC788\uC2B5\uB2C8\uB2E4 - \uD0C0\uC785 /{1} ? [\uD398\uC774\uC9C0] -Guides.Header=&6-=&a{0} \uAC00\uC774\uB4DC&6=- -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=&3\uACE1\uC608\uC5D0 \uB300\uD558\uC5EC:\n&e\uACE1\uC608\uB294 mcMMO\uC758 \uC6B0\uC640\uD558\uAC8C \uC6C0\uC9C1\uC774\uB294 \uC608\uC220\uC785\uB2C8\uB2E4.\n&e\uC804\uD22C \uD2B9\uD61C\uC640 \uD658\uACBD \uC190\uC0C1 \uD2B9\uD61C\uB97C \uC99D\uAC00\uC2DC\uD0B5\uB2C8\uB2E4.\n\n&3XP \uC5BB\uAE30:\n&e\uC774 \uC2A4\uD0AC\uC758 XP\uB97C \uC5BB\uC744\uB824\uBA74 \uC804\uD22C\uB098 \uC0DD\uC874\uC5D0\uC11C \uD53C\uD574\uB97C \n&e\uC785\uB294 \uB099\uD558\uC5D0\uC11C \uCC29\uC9C0 \uD589\uB3D9\uC774 \uC694\uAD6C\uB429\uB2C8\uB2E4. -Guides.Acrobatics.Section.1=&3\uC5B4\uB5BB\uAC8C \uAD6C\uB974\uAE30\uB97C \uD558\uB098\uC694?\n&e\uB2F9\uC2E0\uC774 \uB099\uD558 \uD53C\uD574\uB97C \uBC1B\uC744 \uB54C \uD53C\uD574\uB97C \uBB34\uD6A8\uD654\uD560\n&e\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&e\uB5A8\uC5B4\uC9C0\uB294 \uB3D9\uC548 \uB450\uBC30\uC758 \uAE30\uD68C\uB97C \uAC00\uC9C0\uAC8C \uB429\uB2C8\uB2E4.\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\uC5B4\uB5BB\uAC8C \uD68C\uD53C\uB97C \uD558\uB098\uC694?\n&e\uD68C\uD53C\uB294 \uB2F9\uC2E0\uC774 \uC804\uD22C\uC5D0\uC11C \uC0C1\uCC98\uB97C \uC785\uC744 \uB54C \uC785\uB294\n&e\uD53C\uD574\uB97C \uBC18\uAC10\uC2DC\uD0A4\uB294 \uC9C0\uC18D\uC801\uC778 \uAE30\uD68C\uC785\uB2C8\uB2E4.\n&e\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=&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. @@ -725,7 +725,7 @@ Guides.Alchemy.Section.5=&3Concoctions tier 4 ingredients:\n&eApple (Potion of H 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=&3\uAD81\uC220\uC5D0 \uB300\uD558\uC5EC:\n&e\uAD81\uC220\uC740 \uD65C\uACFC \uD654\uC0B4\uB85C \uC3D8\uB294 \uAC83\uC744 \uB73B\uD569\uB2C8\uB2E4.\n&e\uAD81\uC220\uC740 PVP\uC5D0\uC11C \uB2F9\uC2E0\uC774 \uC801\uC744 \uD604\uD639\uC2DC\uD0A4\uB294 \uB2A5\uB825\uACFC\n&e\uB808\uBCA8 \uD06C\uAE30\uC758 \uB370\uBBF8\uC9C0 \uBD80\uC2A4\uD130\uB97C \uAC19\uC740 \uAC83\uC73C\uB85C\n&e\uC804\uD22C \uBCF4\uB108\uC2A4\uB97C \uC81C\uACF5\uD569\uB2C8\uB2E4. 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.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. @@ -822,190 +822,190 @@ Guides.Woodcutting.Section.2=&3How does Leaf Blower work?\n&eLeaf Blower is a pa 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= &c\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 &e{0} \uC785\uB2C8\uB2E4 -Inspect.Stats=&amcMMO \uC2A4\uD15F\uC740 &e{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=&7\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 &e({0}\uCD08) &c\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 &e({0}\uCD08) &f\uAE30\uB2EC\uB824\uC57C \uD569\uB2C8\uB2E4 -Item.FluxPickaxe.Name=\uC6A9\uD574 \uACE1\uAD2D\uC774 -Item.FluxPickaxe.Lore.1=&7\uAD11\uBB3C\uC744 \uC989\uC2DC \uC81C\uB828\uD560 \uAE30\uD68C\uB97C \uAC00\uC9D1\uB2C8\uB2E4. -Item.FluxPickaxe.Lore.2=&7\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=&7\uD154\uB808\uD3EC\uD2B8\uAC00 &6({0}) &7\uCD08\uC548\uC5D0 \uC2DC\uC791\uB429\uB2C8\uB2E4, \uAC00\uB9CC\uD788 \uAE30\uB2EC\uB824\uC8FC\uC138\uC694... -Teleport.Cancelled=&4\uD154\uB808\uD3EC\uD2B8 \uCDE8\uC18C\uB428! +Teleport.Commencing=&7텔레포트가 &6({0}) &7초안에 시작됩니다, 가만히 기달려주세요... +Teleport.Cancelled=&4텔레포트 취소됨! #SKILLS -Skills.Child=&6(\uD558\uC704 \uC2A4\uD0AC) -Skills.Disarmed=&4\uB2F9\uC2E0\uC740 \uBB34\uC7A5 \uD574\uC81C\uB418\uC5C8\uC2B5\uB2C8\uB2E4! +Skills.Child=&6(하위 스킬) +Skills.Disarmed=&4당신은 무장 해제되었습니다! Skills.Header=-----[]&a{0}&c[]----- -Skills.NeedMore=&4\uB2F9\uC2E0\uC740 &7{0}\uAC00 \uB354 \uD544\uC694\uD569\uB2C8\uB2E4 -Skills.Parents = \uC0C1\uC704\uB4E4 +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=\uC2A4\uD0AC \uC7AC \uC0AC\uC6A9 \uB300\uAE30\uC2DC\uAC04: ({0}\uCD08) -Skills.Cancelled={0} \uCDE8\uC18C\uB428! -Skills.ConfirmOrCancel=&a\uB2E4\uC2DC \uC6B0-\uD074\uB9AD\uC744 \uD558\uBA74 \uD655\uC778 &6{0}&a. \uC88C-\uD074\uB9AD\uC744 \uD558\uBA74 \uCDE8\uC18C\uAC00 \uB429\uB2C8\uB2E4. +Skills.TooTired=스킬 재 사용 대기시간: ({0}초) +Skills.Cancelled={0} 취소됨! +Skills.ConfirmOrCancel=&a다시 우-클릭을 하면 확인 &6{0}&a. 좌-클릭을 하면 취소가 됩니다. #STATISTICS -Stats.Header.Combat=&6-=\uC804\uD22C \uC2A4\uD0AC=- -Stats.Header.Gathering=&6-=\uC218\uC9D1 \uC2A4\uD0AC=- -Stats.Header.Misc=&6-=\uAE30\uD0C0 \uC2A4\uD0AC=- -Stats.Own.Stats=&a[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=&6 ({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=&6 ({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=&6[mcMMO] \uD558\uB4DC\uCF54\uC5B4 \uBAA8\uB4DC {0}\uAC00 {1}\uC5D0 \uBE44\uD65C\uC131\uD654\uB428. -Hardcore.Mode.Enabled=&6[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=&6[mcMMO] &4\uB2F9\uC2E0\uC740 \uC8FD\uC5B4\uC11C &9{0}&4 \uB808\uBCA8\uC744 \uC783\uC5C8\uC2B5\uB2C8\uB2E4. -Hardcore.DeathStatLoss.PercentageChanged=&6[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=&6[mcMMO] &e{0}&7\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=&6[mcMMO] &3\uB2F9\uC2E0\uC740 &e{1}&3\uB2D8\uC73C\uB85C\uBD80\uD130 &9{0}&3 \uB808\uBCA8\uC744 \uD6D4\uCCE4\uC2B5\uB2C8\uB2E4. -Hardcore.Vampirism.Victim.Failure=&6[mcMMO] &e{0}&7\uB2D8\uC740 \uB2F9\uC2E0\uC758 \uC9C0\uC2DD\uC744 \uAC00\uC838\uAC08\uC218 \uC5C6\uC5C8\uC2B5\uB2C8\uB2E4! -Hardcore.Vampirism.Victim.Success=&6[mcMMO] &e{0}&4\uB2D8\uC740 \uB2F9\uC2E0\uC5D0\uAC8C\uC11C &9{1}&4 \uB808\uBCA8\uC744 \uD6D4\uCCD0\uAC14\uC2B5\uB2C8\uB2E4! -Hardcore.Vampirism.PercentageChanged=&6[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=&3\uAE30\uBD80 \uC815\uBCF4: -MOTD.Hardcore.Enabled=&6[mcMMO] &3\uD558\uB4DC\uCF54\uC5B4 \uBAA8\uB4DC \uD65C\uC131\uD654\uB428: &4{0} -MOTD.Hardcore.DeathStatLoss.Stats=&6[mcMMO] &3\uB370\uC2A4 \uD328\uB110\uD2F0 \uB2A5\uB825: &4{0}% -MOTD.Hardcore.Vampirism.Stats=&6[mcMMO] &3\uBC40\uD30C\uC774\uC5B4\uB9AC\uC810 \uC2A4\uD15F \uD761\uC218: &4{0}% -MOTD.PerksPrefix=[mcMMO \uD2B9\uC804] -MOTD.Version=&6[mcMMO] \uAD6C\uB3D9\uC911\uC778 \uBC84\uC804 &3{0} -MOTD.Website=&6[mcMMO] &a{0}&e - 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\uC0C8\uB85C\uC6B4\u0020\uC2A4\uD0AC\uC744\u0020\uBC30\uC6B0\uB294\u0020\uC911... -XPBar.Acrobatics=\uACE1\uC608 Lv.&6{0} -XPBar.Alchemy=\uC5F0\uAE08\uC220 Lv.&6{0} -XPBar.Archery=\uAD81\uC220 Lv.&6{0} -XPBar.Axes=\uBD80\uC220 Lv.&6{0} -XPBar.Excavation=\uBC1C\uAD74 Lv.&6{0} -XPBar.Fishing=\uB09A\uC2DC Lv.&6{0} -XPBar.Herbalism=\uC57D\uCD08\uD559 Lv.&6{0} -XPBar.Mining=\uCC44\uAD11 Lv.&6{0} -XPBar.Repair=\uC218\uB9AC Lv.&6{0} -XPBar.Salvage=\uD68C\uC218 Lv.&6{0} -XPBar.Smelting=\uC81C\uB828 Lv.&6{0} -XPBar.Swords=\uAC80\uC220 Lv.&6{0} -XPBar.Taming=\uC870\uB828 Lv.&6{0} -XPBar.Unarmed=\uBE44\uBB34\uC7A5 Lv.&6{0} -XPBar.Woodcutting=\uBC8C\uBAA9 Lv.&6{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: &e{0} -Smelting.Ability.FuelEfficiency=\uC720\uB3D9 \uD6A8\uC728\uC131 \uBC30\uC728: &e{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: &e{0} -Smelting.Ability.VanillaXPBoost=\uBC14\uB2D0\uB77C XP \uBC30\uC728: &e{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=&a\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=&6\uCD1D \uB808\uBCA8 -Scoreboard.Misc.Level=&3\uB808\uBCA8 -Scoreboard.Misc.CurrentXP=&a\uD604\uC7AC XP -Scoreboard.Misc.RemainingXP=\uB0A8\uC740 XP -Scoreboard.Misc.Cooldown=&d\uC7AC \uC0AC\uC6A9 \uB300\uAE30\uC2DC\uAC04 -Scoreboard.Misc.Overall=&6\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=&a\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 &b\uC11C\uBC84\uAD00\uB9AC\uC790\uC640 \uC5F0\uB77D&c\uD558\uAE30\uB97C \uC6D0\uD560 \uAC83\uC785\uB2C8\uB2E4.\n&e\uB2F9\uC2E0\uC740 \uC5EC\uC804\uD788 \uC11C\uBC84\uC5D0\uC11C \uAC8C\uC784\uC911\uC774\uC9C0\uB9CC, \uB2F9\uC2E0\uC740 &lmcMMO \uB808\uBCA8\uC774 \uC5C6\uACE0&e \uB2F9\uC2E0\uC774 \uC5BB\uC740 \uC5B4\uB290 XP\uB3C4 &l\uC800\uC7A5\uB418\uC9C0 \uC54A\uC744 \uAC81\uB2C8\uB2E4&e. -Profile.Loading.AdminFailureNotice=&4[A]&c mcMMO\uB294 &e{0}&c \uD50C\uB808\uC774\uC5B4 \uB370\uC774\uD130 \uC77D\uAE30\uAC00 \uBD88\uAC00\uB2A5\uD569\uB2C8\uB2E4. &d\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\u0028\uC774\u0029\uAC00\u0020\uB808\uBCA8\u0020 &r&a&l{2}&r&f\u0020\uB85C\u0020\uC131\uC7A5\u0020\uD588\uC2B5\uB2C8\uB2E4. -Overhaul.Name.Acrobatics=\uACE1\uC608 -Overhaul.Name.Alchemy=\uC5F0\uAE08\uC220 -Overhaul.Name.Archery=\uAD81\uC220 -Overhaul.Name.Axes=\uBD80\uC220 -Overhaul.Name.Excavation=\uBC1C\uAD74 -Overhaul.Name.Fishing=\uB09A\uC2DC -Overhaul.Name.Herbalism=\uC57D\uCD08\uD559 -Overhaul.Name.Mining=\uCC44\uAD11 -Overhaul.Name.Repair=\uC218\uB9AC -Overhaul.Name.Salvage=\uD68C\uC218 -Overhaul.Name.Smelting=\uC81C\uB828 -Overhaul.Name.Swords=\uAC80\uC220 -Overhaul.Name.Taming=\uC870\uB828 -Overhaul.Name.Unarmed=\uBE44\uBB34\uC7A5 -Overhaul.Name.Woodcutting=\uBC8C\uBAA9 +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_nl.properties b/src/main/resources/locale/locale_nl.properties index 23150baba..165fdc7f6 100644 --- a/src/main/resources/locale/locale_nl.properties +++ b/src/main/resources/locale/locale_nl.properties @@ -411,7 +411,7 @@ Perks.ActivationTime.Name=Uithoudingsvermogen Perks.ActivationTime.Desc=Verhoogt het vermogen activering tijd met {0} seconden. Hardcore.Vampirism.Name=Vampirisme MOTD.Donate=&3Donatie Info: -Smelting.SubSkill.FuelEfficiency.Name=Brandstof Effici\u00ebntie +Smelting.SubSkill.FuelEfficiency.Name=Brandstof Efficiëntie Smelting.Listener=Smelten: Smelting.SkillName=SMELTEN Commands.Description.mcstats=Toon je mcMMO niveaus en XP diff --git a/src/main/resources/locale/locale_pl.properties b/src/main/resources/locale/locale_pl.properties index 96bc89e2e..d62facf80 100644 --- a/src/main/resources/locale/locale_pl.properties +++ b/src/main/resources/locale/locale_pl.properties @@ -7,38 +7,38 @@ JSON.DescriptionHeader=Opis JSON.JWrapper.Header=Detale JSON.Type.Passive=Pasywnie JSON.Type.Active=Aktywne -JSON.Type.SuperAbility=Super umiej\u0119tno\u015b\u0107 +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\u0119\u015bliwe Perki +JSON.JWrapper.Perks.Header=&6Szczęśliwe Perki JSON.JWrapper.Perks.Lucky={0}% Lepszej Szansy -JSON.Hover.Tips=Wskaz\u00f3wka +JSON.Hover.Tips=Wskazówka JSON.Acrobatics=Akrobatyka JSON.Alchemy=Alchemia -JSON.Archery=\u0141ucznictwo +JSON.Archery=Łucznictwo JSON.Axes=Siekiery JSON.Excavation=Wykopalisko JSON.Fishing=Rybak JSON.Herbalism=Zielarstwo -JSON.Mining=G\u00f3rnictwo +JSON.Mining=Górnictwo JSON.Repair=Naprawiacz JSON.Salvage=Odzyskiwacz JSON.Swords=Miecze JSON.Taming=Tresowanie -JSON.Unarmed=Niezr\u0119czno\u015b\u0107 +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\u0142umaczenie mcMMO na inne j\u0119zyki! +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\u0119pne ulepszenie na poziomie {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 @@ -52,23 +52,23 @@ JSON.Hover.AtSymbolURL=&e@ JSON.Notification.SuperAbility={0} #These are the JSON Strings used for SubSkills -JSON.Acrobatics.Roll.Interaction.Activated=Pr\u00f3ba &c\u0141agodnego przewrotu -JSON.Acrobatics.SubSkill.Roll.Details.Tips=Je\u015bli b\u0119dziesz kuca\u0142 w czasie spadania, otrzymasz tylko po\u0142ow\u0119 obra\u017ce\u0144! -Anvil.SingleItemStack=&cNie mo\u017cesz odzyska\u0107 ani naprawi\u0107 stos\u00f3w przedmiot\u00f3w, kt\u00f3re zawieraj\u0105 wi\u0119cej ni\u017c jeden przedmiot, najpierw podziel stos. +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\u015aWIE\u017bONO UMIEJ\u0118TNO\u015aCI!** +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.SubSkills.Overhaul=Sub-umiej\u0119tno\u015bci +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) @@ -80,47 +80,47 @@ 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\u0119 umiej\u0119tno\u015b\u0107 na wiki!&e] +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\u0142o/a do &r&a&l{2}&r&f. +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=\u0141ucznictwo +Overhaul.Name.Archery=Łucznictwo Overhaul.Name.Axes=Siekiery Overhaul.Name.Excavation=Wykopalisko Overhaul.Name.Fishing=Rybak Overhaul.Name.Herbalism=Zielarstwo -Overhaul.Name.Mining=G\u00f3rnictwo +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\u0119czno\u015b\u0107 +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\u017bYNA&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\u0119tno\u015bci... +XPBar.Template.EarlyGameBoost=&6Nauka nowej umiejętności... XPBar.Acrobatics=Akrobatyka Lv.&6{0} XPBar.Alchemy=Alchemia Lv.&6{0} -XPBar.Archery=\u0141ucznictwo 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\u00f3rnictwo 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\u0119czno\u015b\u0107 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) @@ -129,204 +129,204 @@ XPBar.Complex.Template={0} &3 {4}&f% &3(&f{1}&3/&f{2}&3) # END STYLING #ACROBATICS -Acrobatics.Ability.Proc=&a**\u0141askawe L\u0105dowanie** +Acrobatics.Ability.Proc=&a**Łaskawe Lądowanie** Acrobatics.Combat.Proc=&a**Unik** -Acrobatics.SubSkill.Roll.Stats=&6Szansa na &e{0}%&6 Szansa na \u0142\u0105ske&e {1}% -Acrobatics.SubSkill.Roll.Stat=Szansa na Przewr\u00f3t -Acrobatics.SubSkill.Roll.Stat.Extra=Szansa na \u0141agodny Przewr\u00f3t -Acrobatics.SubSkill.Roll.Name=Przewr\u00f3t -Acrobatics.SubSkill.Roll.Description=Wyl\u0105duj strategicznie, aby unikn\u0105\u0107 uszkodze\u0144. -Acrobatics.SubSkill.Roll.Chance=Szansa na Przewr\u00f3t: &e{0} -Acrobatics.SubSkill.Roll.GraceChance=Szansa na \u0142agodny przewr\u00f3t: &e{0} -Acrobatics.SubSkill.Roll.Mechanics=&7Przewr\u00f3t to biernie aktywna Sub-Umiej\u0119tno\u015b\u0107.\nZawsze kiedy otrzymujesz obra\u017cenia od wysoko\u015bci, jest szansa, \u017ce zostan\u0105 one zredukowane bazuj\u0105c na poziomie umiej\u0119tno\u015bci, na poziomie &e{6}%&7 masz &e{0}%&7 szansy na zablokowanie obra\u017ce\u0144, i &e{1}%&7 je\u015bli aktywujesz \u0142agony przewr\u00f3t.\nSzansa na sukces jest skalowana w zale\u017cno\u015bci od twojego poziomu umiej\u0119tno\u015bci na liniowej krzywej, a\u017c do poziomu &e{2}&7 gdzie osi\u0105ga maximum, ka\u017cdy poziom akrobatyki daje Ci &e{3}%&7 szansy na sukces.\nPrzytrzymuj\u0105c przycisk skradania si\u0119, mo\u017cesz podwoi\u0107 swoje szanse, aby unikn\u0105\u0107 obra\u017ce\u0144 od upadku! Przytrzymywanie shiftu zamienia Przewr\u00f3t na \u0141agodny Przewr\u00f3t. -Acrobatics.SubSkill.GracefulRoll.Name=\u0141agodny przewr\u00f3t +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\u017cenia od ataku o po\u0142ow\u0119 +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\u00f3t** +Acrobatics.Roll.Text=&o**Przewrót** Acrobatics.SkillName=AKROBATYKA #ALCHEMY Alchemy.SubSkill.Catalysis.Name=Kataliza -Alchemy.SubSkill.Catalysis.Description=Zwi\u0119ksza szybko\u015b\u0107 warzenia mikstur. -Alchemy.SubSkill.Catalysis.Stat=Szybko\u015b\u0107 warzenia mikstur. +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\u0119ksz\u0105 ilo\u015bci\u0105 sk\u0142adnik\u00f3w. +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\u0142adniki [&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\u0118TNO\u015aCI (KATALIZA) +Alchemy.Ability.Locked.0=ZABLOKOWANE DO {0}+ UMIEJĘTNOŚCI (KATALIZA) Alchemy.SkillName=ALCHEMIA #ARCHERY -Archery.SubSkill.SkillShot.Name=Umiej\u0119tne strzelanie -Archery.SubSkill.SkillShot.Description=Zwi\u0119ksza obra\u017cenia zadawane \u0142ukiem -Archery.SubSkill.SkillShot.Stat=Premia do obra\u017ce\u0144 od \u0142uku -Archery.SubSkill.Daze.Name=Oszo\u0142omienie -Archery.SubSkill.Daze.Description=Osza\u0142amia wroga i zadaje dodatkowe obra\u017cenia -Archery.SubSkill.Daze.Stat=Szansa na oszo\u0142omienie -Archery.SubSkill.ArrowRetrieval.Name=Odzyskiwanie strza\u0142 -Archery.SubSkill.ArrowRetrieval.Description=Szansa na odzyskanie strza\u0142 ze zw\u0142ok -Archery.SubSkill.ArrowRetrieval.Stat=Szansa na odzyskanie strza\u0142y -Archery.SubSkill.ArcheryLimitBreak.Name=Prze\u0142amywanie granic \u0142ucznictwa -Archery.SubSkill.ArcheryLimitBreak.Description=Prze\u0142am swoje limity. Znacznie zwi\u0119ksza obra\u017cenia zadawane przeciwnikom! -Archery.SubSkill.ArcheryLimitBreak.Stat=Maksymalne obra\u017cenia Prze\u0142amywanie Limit\u00f3w. -Archery.Listener=\u0141ucznictwo: -Archery.SkillName=\u0141UCZNICTWO +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\u017ce\u0144 +Axes.Ability.Bonus.1=Bonusowe {0} obrażeń Axes.Ability.Bonus.2=Uderzenie zbroi -Axes.Ability.Bonus.3=Zadaje {0} dodatkowych obra\u017ce\u0144 zbroi -Axes.Ability.Bonus.4=Wi\u0119kszy Wp\u0142yw -Axes.Ability.Bonus.5=Zadaje {0} dodatkowych obra\u017ce\u0144 przeciwnikom bez zbroi. -Axes.Ability.Lower=&7Opuszczasz sw\u00f3j top\u00f3r. -Axes.Ability.Ready=&6Przygotuj&3 sw\u00f3j top\u00f3r. -Axes.Ability.Ready.Extra=&6Przygotuj&3 sw\u00f3j top\u00f3r. &7({0} pozosta\u0142o {1}s czasu odnowienia) -Axes.Combat.CritStruck=&4Zosta\u0142e\u015b KRYTYCZNIE trafiony! +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\u0104 SI\u0141\u0104** -Axes.Combat.GI.Struck=**UDERZENIE Z WI\u0118KSZYM WP\u0141YWEM** +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\u017cenia AoE +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\u00f3jne obra\u017cenia +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\u017cenia -Axes.SubSkill.AxesLimitBreak.Name=Prze\u0142amanie limit\u00f3w siekier -Axes.SubSkill.AxesLimitBreak.Description=Prze\u0142amujesz swoje granice. Zwi\u0119ksza obra\u017cenia zadawane przeciwnikom. -Axes.SubSkill.AxesLimitBreak.Stat=Maksymalne obra\u017cenia Prze\u0142amanie Limit\u00f3w +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\u0142\u0105 wystarczaj\u0105c\u0105 do zniszczenia zbroi -Axes.SubSkill.GreaterImpact.Name=Wi\u0119kszy wp\u0142yw -Axes.SubSkill.GreaterImpact.Description=Zadaje dodatkowe obra\u017cenia dla byt\u00f3w bez zbroi. +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\u0142 zu\u017cyty** +Axes.Skills.SS.Off=**Przecinacz Czaszek został zużyty** Axes.Skills.SS.On=&a**Przecinacz Czaszek AKTYWOWANY** -Axes.Skills.SS.Refresh=&aTw\u00f3j &ePrzecinacz Czaszek &azosta\u0142 od\u015bwie\u017cony! -Axes.Skills.SS.Other.Off=Przecinacz czaszek zosta\u0142 zu\u017cyty na &e{0} -Axes.Skills.SS.Other.On=&a{0}&2 u\u017cy\u0142 &cPrzecinacz Czaszek! +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\u0105 \u0142opat\u0119. -Excavation.Ability.Ready=&6Przygotowujesz&3 swoj\u0105 \u0141opat\u0119. -Excavation.SubSkill.GigaDrillBreaker.Name=Giga Wiert\u0142ol -Excavation.SubSkill.GigaDrillBreaker.Description=3x Cz\u0119stotliwo\u015b\u0107 dropu, 3x EXP, +Pr\u0119dko\u015b\u0107 -Excavation.SubSkill.GigaDrillBreaker.Stat=Czas odnowienia Giga Wiert\u0142a +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 \u015bwiata! Wysokie poziomy umiej\u0119tno\u015bci zwi\u0119kszaj\u0105 Twoje szanse na znalezienie kul do\u015bwiadczenia, gdy znajdziesz skarb! -Excavation.SubSkill.Archaeology.Stat=Szansa Archeologii na kul\u0119 do\u015bwiadczenia -Excavation.SubSkill.Archaeology.Stat.Extra=Liczba z Archeologii na kul\u0119 do\u015bwiadczenia +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\u0142o przesta\u0142o dzia\u0142a\u0107** -Excavation.Skills.GigaDrillBreaker.On=&a**GIGA WIERT\u0141O AKTYWOWANO** -Excavation.Skills.GigaDrillBreaker.Refresh=&aTwoja umiej\u0119tno\u015b\u0107 &eGiga Wiert\u0142o &azosta\u0142a od\u015bwie\u017cona! -Excavation.Skills.GigaDrillBreaker.Other.Off=Giga Wiert\u0142o&a przesta\u0142o dzia\u0142a\u0107 na &e{0} -Excavation.Skills.GigaDrillBreaker.Other.On=&a{0}&2 u\u017cy\u0142/a &cGiga Wiert\u0142o! +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\u0142owienia. Zarzu\u0107 w\u0119dk\u0119 w inne miejsce, aby z\u0142owi\u0107 wi\u0119cej ryb. Co najmniej {0} bloki dalej. -Fishing.Scared=&7&oChaotyczne ruchy odstraszaj\u0105 ryby! -Fishing.Exhausting=&c&oNiew\u0142a\u015bciwe u\u017cycie w\u0119dki spowoduje zm\u0119czenie i zu\u017cycie w\u0119dki! -Fishing.LowResourcesTip=&7Wyczuwasz, \u017ce na tym obszarze nie zosta\u0142o wiele ryb. Spr\u00f3buj \u0142owi\u0107 co najmniej {0} bloki dalej. -Fishing.Ability.Info=Magic Hunter: &7 **Ulepsz z rang\u0105 \u0141owca Nagr\u00f3d** -Fishing.Ability.Locked.0=ZABLOKOWANE DO {0}+ UMIEJ\u0118TNO\u015a\u0106 (POTRZ\u0104SANIE) -Fishing.Ability.Locked.1=ZABLOKOWANE DO {0}+ UMIEJ\u0118TNO\u015a\u0106 (MRO\u0179NE PO\u0141OWY) -Fishing.Ability.Locked.2=ZABLOKOWANE DO {0}+ UMIEJ\u0118TNO\u015a\u0106 (MISTRZ \u0141OWIENIA) -Fishing.SubSkill.TreasureHunter.Name=\u0141owca Nagr\u00f3d +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 \u0141owcy Nagr\u00f3d: &a{0}&3/&a{1} -Fishing.SubSkill.TreasureHunter.Stat.Extra=Cz\u0119stotliwo\u015b\u0107 dropu: &7Zwyk\u0142e: &e{0} &aNiezwyk\u0142e: &e{1}\n&9Rzadkie: &e{2} &dEpickie: &e{3} &6Legendarne: &e{4} &bMityczne: &e{5} -Fishing.SubSkill.MagicHunter.Name=\u0141owca Magii -Fishing.SubSkill.MagicHunter.Description=Znajd\u017a zakl\u0119te przedmioty -Fishing.SubSkill.MagicHunter.Stat=Szansa \u0142owcy magii -Fishing.SubSkill.Shake.Name=Potrz\u0105sanie -Fishing.SubSkill.Shake.Description=Strz\u0105\u015bnij przedmioty z mob\u00f3w lub w\u0119dki gracza. -Fishing.SubSkill.Shake.Stat=Szansa na Potrz\u0105\u015bni\u0119cie +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\u0142\u00f3d przywracany z ryb +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\u0119dkarstwa -Fishing.SubSkill.MasterAngler.Description=Ryby \u0142owione s\u0105 cz\u0119\u015bciej, lepiej sprawdza si\u0119 podczas \u0142owienia z \u0142odzi. -Fishing.SubSkill.MasterAngler.Stat=Skr\u00f3cenie czasu oczekiwania na w\u0119dkowanie: &a-{0} seconds -Fishing.SubSkill.MasterAngler.Stat.Extra=Skr\u00f3cenie maksymalnego czasu oczekiwania na w\u0119dkowanie: &a-{0} seconds +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 \u0142owi\u0107 w lodowatych biomach -Fishing.SubSkill.IceFishing.Stat=Mro\u017ane Po\u0142owy +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\u0119dkarstwo: -Fishing.Ability.TH.MagicFound=&7Z tym haczykiem czujesz odrobin\u0119 magii... +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\u0118DKARSTWO +Fishing.SkillName=WĘDKARSTWO #HERBALISM -Herbalism.Ability.GTe.NeedMore=Potrzebujesz wi\u0119cej nasion, aby rozprzestrzeni\u0107 Zielona Tera. +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\u0104D** -Herbalism.Ability.Lower=&7Opuszczasz swoj\u0105 motyk\u0119. -Herbalism.Ability.Ready=&6Przygotowujesz&3 swoj\u0105 motyk\u0119. -Herbalism.Ability.ShroomThumb.Fail=**HALUCYNKI ZAWODZ\u0104** -Herbalism.SubSkill.GreenTerra.Name=Zielony L\u0105d -Herbalism.SubSkill.GreenTerra.Description=Rozprzestrze\u0144 Terr\u0119, 3x Drops, Boosts Green Thumb +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\u0105czka -Herbalism.SubSkill.GreenThumb.Description=Automatycznie sadzi nasiona, kiedy uprawisz ziemi\u0119. -Herbalism.SubSkill.GreenThumb.Stat=Szansa na Zielona R\u0105czka -Herbalism.SubSkill.GreenThumb.Stat.Extra=Etap Zielonej R\u0105czki: &a Uprawy rosn\u0105 w fazie {0} -Herbalism.Effect.4=Zielona R\u0105czka (Bloki) -Herbalism.SubSkill.GreenThumb.Description.2=Spraw, aby ceg\u0142y by\u0142y omsza\u0142e lub spraw, aby trawa uros\u0142a +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\u0119ksza g\u0142\u00f3d przywracany z \u017cywno\u015bci uprawianej +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\u00f3jny \u0142up -Herbalism.SubSkill.DoubleDrops.Description=Podwaja normalny \u0142up -Herbalism.SubSkill.DoubleDrops.Stat=Szansa na podw\u00f3jny drop -Herbalism.SubSkill.HylianLuck.Name=Wielkie Szcz\u0119\u015bcie -Herbalism.SubSkill.HylianLuck.Description=Daje niewielk\u0105 szans\u0119 na znale\u017aenie rzadkich przedmiot\u00f3w -Herbalism.SubSkill.HylianLuck.Stat=Szansa na Wielkie Szcz\u0119\u015bcie +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\u0142\u00f3\u017c grzybni\u0119 na ziemi i trawie +Herbalism.SubSkill.ShroomThumb.Description=Rozłóż grzybnię na ziemi i trawie Herbalism.SubSkill.ShroomThumb.Stat=Szansa na Halucynki -Herbalism.HylianLuck=&aSzcz\u0119\u015bcie Hyrule jest dzi\u015b z tob\u0105! +Herbalism.HylianLuck=&aSzczęście Hyrule jest dziś z tobą! Herbalism.SkillName=ZIELARSTWO -Herbalism.Skills.GTe.Off=**Zielona Terra wy\u0142\u0105czy\u0142a si\u0119** +Herbalism.Skills.GTe.Off=**Zielona Terra wyłączyła się** Herbalism.Skills.GTe.On=&a**ZIELONA TERRA AKTYWOWANA** -Herbalism.Skills.GTe.Refresh=&aTwoja umiej\u0119tno\u015b\u0107 &eZielona Terra &azosta\u0142a od\u015bwie\u017cona! -Herbalism.Skills.GTe.Other.Off=Zielona Terra&a zosta\u0142a wy\u0142\u0105czona na &e{0} -Herbalism.Skills.GTe.Other.On=&a{0}&2 u\u017cy\u0142/a &cZielona Terra! +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\u0118TNO\u015a\u0106 (PODMUCH G\u00d3RNICTWA) -Mining.Ability.Locked.1=ZABLOKOWANE DO {0}+ UMIEJ\u0118TNO\u015a\u0106 (WI\u0118KSZE BOMBY) -Mining.Ability.Locked.2=ZABLOKOWANE DO {0}+ UMIEJ\u0118TNO\u015a\u0106 (EKSPERTYZY ROZBI\u00d3RKI) -Mining.Ability.Lower=&7Opuszczasz sw\u00f3j kilof. -Mining.Ability.Ready=&6Przygotowujesz&3 sw\u00f3j kilof. +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\u0119dko\u015b\u0107+, Szansa na potr\u00f3jny \u0142up +Mining.SubSkill.SuperBreaker.Description=Prędkość+, Szansa na potrójny łup Mining.SubSkill.SuperBreaker.Stat=Trwanie: Super Niszczyciel -Mining.SubSkill.DoubleDrops.Name=Podw\u00f3jny drop -Mining.SubSkill.DoubleDrops.Description=Podwaja normalny \u0142up -Mining.SubSkill.DoubleDrops.Stat=Podw\u00f3jna szansa na upuszczenie \u0142upu -Mining.SubSkill.BlastMining.Name=Podmuch G\u00f3rnictwa +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\u00f3rnictwa:&a {0}/{1} &7({2}) -Mining.SubSkill.BlastMining.Stat.Extra=Dodatkowy Zasi\u0119g Podmuchu G\u00f3rnictwa: &a+{0} -Mining.SubSkill.BiggerBombs.Name=Wi\u0119ksze bomby -Mining.SubSkill.BiggerBombs.Description=Zwi\u0119ksza promie\u0144 wybuchu -Mining.SubSkill.DemolitionsExpertise.Name=Ekspertyza Rozbi\u00f3rki -Mining.SubSkill.DemolitionsExpertise.Description=Zmniejsza obra\u017cenia zadawane TNT -Mining.SubSkill.DemolitionsExpertise.Stat=Zmniejszenie obra\u017ce\u0144 od Eksperyza Rozbi\u00f3rki -Mining.Listener=G\u00f3rnictwo: -Mining.SkillName=G\u00d3RNICTWO -Mining.Skills.SuperBreaker.Off=**Super Niszczyciel wy\u0142\u0105czy\u0142 si\u0119** +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\u0142\u0105czy\u0142 si\u0119 na for &e{0} -Mining.Skills.SuperBreaker.Other.On=&a{0}&2 u\u017cy\u0142 &cSuper Niszczyciel! -Mining.Skills.SuperBreaker.Refresh=&aTwoja umiej\u0119tno\u015b\u0107 &eSuper Niszczyciel &azosta\u0142a od\u015bwie\u017cona! +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= @@ -335,627 +335,627 @@ 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\u0119dzi i Zbroi -Repair.SubSkill.GoldRepair.Name=Naprawa Z\u0142ota ({0}+ UMIEJ\u0118TNO\u015a\u0106) -Repair.SubSkill.GoldRepair.Description=Naprawa z\u0142otych narz\u0119dzi & zbroi -Repair.SubSkill.IronRepair.Name=Naprawa \u017belaza ({0}+ UMIEJ\u0118TNO\u015a\u0106) -Repair.SubSkill.IronRepair.Description=Naprawa \u017celaznych narz\u0119dzi & zbroi -Repair.SubSkill.StoneRepair.Name=Naprawa Kamienia ({0}+ UMIEJ\u0118TNO\u015a\u0106) -Repair.SubSkill.StoneRepair.Description=Naprawa kamiennych narz\u0119dzi +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\u0119kszona kwota naprawy -Repair.SubSkill.RepairMastery.Stat=Mistrz napraw: &aDodatkowo przywr\u00f3cono {0} wytrzyma\u0142o\u015bci. +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\u015b\u0107 -Repair.SubSkill.SuperRepair.Stat=Szansa na Super Napraw\u0119 -Repair.SubSkill.DiamondRepair.Name=Naprawa Diament\u00f3w ({0}+ SKILL) -Repair.SubSkill.DiamondRepair.Description=Napraw diamentowe narz\u0119dzia i zbroj\u0119 -Repair.SubSkill.ArcaneForging.Name=Tajemne Fa\u0142szowanie -Repair.SubSkill.ArcaneForging.Description=Naprawa magicznych przedmiot\u00f3w -Repair.SubSkill.ArcaneForging.Stat=Ranga Tajemnego Fa\u0142szowania: &e {0}/{1} -Repair.SubSkill.ArcaneForging.Stat.Extra=&3Szansa na Tajemne Fa\u0142szowanie:&7 Powodzenie: &a{0}&7%, Niepowodzenie: &c{1}&7% -Repair.Error=&4mcMMO napotka\u0142 b\u0142\u0105d podczas pr\u00f3by naprawy tego przedmiotu! -Repair.Listener.Anvil=&4r Umie\u015bci\u0142e\u015b kowad\u0142o, kowad\u0142a mog\u0105 naprawia\u0107 narz\u0119dzia i zbroj\u0119. +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\u0105cych umiej\u0119tno\u015bci, aby naprawi\u0107 Diament. -Repair.Skills.AdeptGold=&4Nie masz wystarczaj\u0105cych umiej\u0119tno\u015bci, aby naprawi\u0107 z\u0142oto. -Repair.Skills.AdeptIron=&4Nie masz wystarczaj\u0105cych umiej\u0119tno\u015bci, aby naprawi\u0107 \u017celazo. -Repair.Skills.AdeptStone=&4Nie masz wystarczaj\u0105cych umiej\u0119tno\u015bci, aby naprawi\u0107 Stone. -Repair.Skills.Adept=&cMusisz mie\u0107 &e{0}&c poziom, aby naprawi\u0107 &e{1} -Repair.Skills.FeltEasy=&7To by\u0142o \u0142atwe. -Repair.Skills.FullDurability=&7To znaczy przy pe\u0142nej trwa\u0142o\u015bci. -Repair.Skills.StackedItems=&4Nie mo\u017cesz naprawia\u0107 u\u0142o\u017conych w stos przedmiot\u00f3w. +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\u0105 moc. -Repair.Arcane.Fail=Tajemna moc na sta\u0142e opu\u015bci\u0142a przedmiot. -Repair.Arcane.Lost=Nie mia\u0142e\u015b wystarczaj\u0105cych umiej\u0119tno\u015bci, aby zachowa\u0107 jakiekolwiek zakl\u0119cia. -Repair.Arcane.Perfect=&aUtrzyma\u0142e\u015b/a\u015b tajemn\u0105 moc w tym przedmiocie. +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\u0107 sztuk\u0119 -Salvage.SubSkill.UnderstandingTheArt.Description=Nie tylko przekopujesz \u015bmieci s\u0105siad\u00f3w, ale tak\u017ce dbasz o \u015brodowisko. -\nWzmacnia r\u00f3\u017cne w\u0142a\u015bciwo\u015bci Odzyskiwacza. -Salvage.SubSkill.ScrapCollector.Name=Zbieracz z\u0142omu -Salvage.SubSkill.ScrapCollector.Description=Odzyskaj materia\u0142y z przedmiotu, idealne odzyskanie zale\u017cy od umiej\u0119tno\u015bci i szcz\u0119\u015bcia. -Salvage.SubSkill.ScrapCollector.Stat=Zbieracz z\u0142omu: &aOdzyskaj do & e {0} & jednej rzeczy. W gr\u0119 wchodzi troch\u0119 szcz\u0119\u015bcia. +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\u0119cia z przedmiot\u00f3w +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\u0142omu +Salvage.Ability.Bonus.0=Zbieracz złomu Salvage.Ability.Bonus.1= -Salvage.Arcane.ExtractFull=&7 Szansa na pe\u0142ne zakl\u0119cia -Salvage.Arcane.ExtractPartial=&7 Szansa na cz\u0119\u015bciowe zakl\u0119cia +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\u0105cych umiej\u0119tno\u015bci, aby odzyska\u0107 uszkodzone przedmioty. -Salvage.Skills.Adept.Level=Musisz by\u0107 na poziomie & e {0} & c, aby odzyska\u0107 & e {1} -Salvage.Skills.TooDamaged=&4Ten przedmiot jest zbyt uszkodzony, aby go uratowa\u0107. -Salvage.Skills.ArcaneFailed=&cNie uda\u0142o Ci si\u0119 wydoby\u0107 wiedzy zawartej w tym elemencie. -Salvage.Skills.ArcanePartial=&cUda\u0142o Ci si\u0119 tylko wydoby\u0107 cz\u0119\u015b\u0107 wiedzy zawartej w tym elemencie. -Salvage.Skills.ArcaneSuccess=&aJeste\u015b w stanie wydoby\u0107 ca\u0142\u0105 wiedz\u0119 zawart\u0105 w tym elemencie! -Salvage.Listener.Anvil=&4Umie\u015bci\u0142e\u015b/a\u015b kowad\u0142o, u\u017cyj go do zbroi i narz\u0119dzi. +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\u0142o Ci si\u0119 odzyska\u0107 & 3 {0} & 6 materia\u0142\u00f3w z & e {1} & 6. -Salvage.Skills.Lottery.Perfect=&a&lPerfekcyjnie! & r & 6 Odzyska\u0142e\u015b/a\u015b & 3 {1} & 6 bez wysi\u0142ku, odzyskuj\u0105c & 3 {0} & 6 materia\u0142\u00f3w. -Salvage.Skills.Lottery.Untrained=&7Nie jeste\u015b odpowiednio przeszkolony w odzyskiwaniu. Uda\u0142o Ci si\u0119 odzyska\u0107 tylko & c {0} & 7 materia\u0142\u00f3w z & a {1} & 7. +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\u00f3j miecz. -Swords.Ability.Ready=&6Przygotowujesz&3 sw\u00f3j miecz. -Swords.Combat.Rupture.Note=&7NOTATKA: &eP\u0119kni\u0119cie to okresowe obra\u017cenia, kt\u00f3re s\u0105 zadawane 2 razy na sekunde oraz omijaj\u0105 one zbroj\u0119! +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\u017c si\u0119 zatrzyma\u0142o&7! +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\u0118Z\u0141YMI STRIKAMI! +Swords.Combat.SS.Struck=&4Uderzone ZWĘZŁYMI STRIKAMI! Swords.SubSkill.CounterAttack.Name=Kontratak -Swords.SubSkill.CounterAttack.Description=Odbij cz\u0119\u015b\u0107 obra\u017ce\u0144, gdy zostaniesz zaatakowany! +Swords.SubSkill.CounterAttack.Description=Odbij część obrażeń, gdy zostaniesz zaatakowany! Swords.SubSkill.CounterAttack.Stat=Szansa na kontratak -Swords.SubSkill.SerratedStrikes.Name=Z\u0105bkowane uderzenia -Swords.SubSkill.SerratedStrikes.Description=Zadaje dodatkowe obra\u017cenia AoE z szans\u0105 na Pot\u0119\u017cne krwawienie! -Swords.SubSkill.SerratedStrikes.Stat=Z\u0105bkowana d\u0142ugo\u015b\u0107 uderze\u0144 -Swords.SubSkill.Rupture.Name=Pot\u0119\u017cne krwawienie -Swords.SubSkill.Rupture.Description=Zastosuj pot\u0119\u017cne krwawienie DoT +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\u017cenia do twoich atak\u00f3w. -Swords.SubSkill.Stab.Stat=Obra\u017cenia d\u017agni\u0119cia -Swords.SubSkill.SwordsLimitBreak.Name=Prze\u0142amywanie limit\u00f3w miecza -Swords.SubSkill.SwordsLimitBreak.Description=Prze\u0142amywanie limit\u00f3w. Zwi\u0119kszone obra\u017cenia zadawane trudnym przeciwnikom. Przeznaczony dla PVP, zale\u017cnie od ustawie\u0144 serwera, czy zwi\u0119kszy obra\u017cenia w PVE, czy nie. -Swords.SubSkill.SwordsLimitBreak.Stat=Prze\u0142amywanie limit\u00f3w max obra\u017ce\u0144 +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\u017cenia Rozerwania na tik: &e{0}&a przeciwko Graczom, &e{1}&a przeciwko Mobom. -Swords.SubSkill.Rupture.Stat.ExplosionDamage=[[DARK_AQUA]]Obra\u017cenia eksplozji Rozerwania: &e{0}&a przeciwko Graczom, &e{1}&a przeciwko Mobom. -Swords.Effect.4=Krwawienie+ z\u0105bkowane uderzenia +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\u0105bkowane Uderzenia przesta\u0142y dzia\u0142a\u0107** -Swords.Skills.SS.On=&a**AKTYWOWANE Z\u0104BKOWANE UDERZENIA** -Swords.Skills.SS.Refresh=&aTwoje &eZ\u0105bkowane uderzenia zosta\u0142y od\u015bwie\u017cone! -Swords.Skills.SS.Other.Off=Z\u0105bkowane uderzenia & a przesta\u0142y dzia\u0142a\u0107 na & e {0} -Swords.Skills.SS.Other.On=&a{0}&2u\u017cy\u0142 & cZ\u0105bkowane uderzenia! +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 \u015brodowisku -Taming.Ability.Bonus.1=Wilki unikaj\u0105 niebezpiecze\u0144stwa +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\u017ce\u0144, odporno\u015b\u0107 na ogie\u0144 -Taming.Ability.Bonus.4=Odporno\u015b\u0107 na wstrz\u0105sy -Taming.Ability.Bonus.5=Materia\u0142y wybuchowe zadaj\u0105 1/{0} normalnych obra\u017ce\u0144 +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\u017ce\u0144 -Taming.Ability.Bonus.8=Us\u0142ugi Fast Food +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\u0119 lub trucizn\u0119 -Taming.Ability.Locked.0=ZABLOKOWANE DO {0}+ UMIEJ\u0118TNO\u015a\u0106 (PRZYJAZNY \u015aRODOWISKU) -Taming.Ability.Locked.1=ZABLOKOWANE DO {0}+ UMIEJ\u0118TNO\u015a\u0106 (GRUBE FUTRO) -Taming.Ability.Locked.2=ZABLOKOWANE DO {0}+ UMIEJ\u0118TNO\u015a\u0106 (ODPORNO\u015a\u0106 NA WSTRZ\u0104SY) -Taming.Ability.Locked.3=ZABLOKOWANE DO {0}+ UMIEJ\u0118TNO\u015a\u0106 (ZAOSTRZONE PAZURY) -Taming.Ability.Locked.4=ZABLOKOWANE DO {0}+UMIEJ\u0118TNO\u015a\u0106 (SERWIS FAST FOOD) -Taming.Ability.Locked.5=ZABLOKOWANE DO {0}+ UMIEJ\u0118TNO\u015a\u0106 (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\u015bci\u0105 kontroluje koty i psy. -Taming.SubSkill.ShockProof.Name=Odporno\u015b\u0107 na wstrz\u0105sy -Taming.SubSkill.ShockProof.Description=Redukcja obra\u017ce\u0144 od wybuchu +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\u0105 stron\u0119 -Taming.SubSkill.CallOfTheWild.Description.2=&7Zew natury: Kucnij i kliknij lewym przyciskiem myszy \n {0} {1} (Kot), {2} {3} (Pies), {4} {5} (Ko\u0144) +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\u00f3w na uleczenie przy ataku +Taming.SubSkill.FastFoodService.Description=Szansa wilków na uleczenie przy ataku Taming.SubSkill.HolyHound.Name=Nieskalany Pies -Taming.SubSkill.HolyHound.Description=Uleczono przez Magi\u0119 & Trucizn\u0119 +Taming.SubSkill.HolyHound.Description=Uleczono przez Magię & Truciznę Taming.SubSkill.Gore.Name=Przelew Krwi -Taming.SubSkill.Gore.Description=Krytyczne Uderzenie, kt\u00f3re nak\u0142ada Rozerwanie. +Taming.SubSkill.Gore.Description=Krytyczne Uderzenie, które nakłada Rozerwanie. Taming.SubSkill.SharpenedClaws.Name=Zaostrzone pazury -Taming.SubSkill.SharpenedClaws.Description=Dodatkowe obra\u017cenia -Taming.SubSkill.EnvironmentallyAware.Name=Przyjazny \u015brodowisku -Taming.SubSkill.EnvironmentallyAware.Description=Kaktus/Lawa Fobia, Odporny na obra\u017cenia od upadku. +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\u017ce\u0144, Odporno\u015b\u0107 na ogie\u0144 -Taming.SubSkill.Pummel.Name=Odepchni\u0119cie -Taming.SubSkill.Pummel.Description=Twoje wilki maj\u0105 szans\u0119 odepchn\u0105\u0107 wrog\u00f3w -Taming.SubSkill.Pummel.TargetMessage=Zosta\u0142e\u015b/a\u015b odepchni\u0119ty przez wilka! -Taming.Listener.Wolf=&8Tw\u00f3j wilk wraca do Ciebie... +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\u0142e\u015b/a\u015b &6{0}&7 -Taming.Summon.COTW.Success.WithLifespan=&a(Zew natury) &7Wezwa\u0142e\u015b/a\u015b &6{0}&7 na czas &6{1}&7 sekund. -Taming.Summon.COTW.Limit=&a(Zew natury) &7Mo\u017cesz mie\u0107 tylko &c{0} &7wezwanych &7{1} w tym samym czasie. -Taming.Summon.COTW.TimeExpired=&a(Zew natury) &7Czas si\u0119 sko\u0144czy\u0142, Tw\u00f3j &6{0}&7 odlatuje. -Taming.Summon.COTW.Removed=&a(Zew natury) &7Tw\u00f3j przywo\u0142any &6{0}&7 znikn\u0105\u0142 z tego \u015bwiata :c -Taming.Summon.COTW.BreedingDisallowed=&a(Zew natury) &cNie mo\u017cesz rozmna\u017ca\u0107 przywo\u0142anego zwierz\u0119cia. -Taming.Summon.COTW.NeedMoreItems=&a(Zew natury) &7Potrzebujesz wi\u0119cej &e{0}&7 o &3{1}&7(s) +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\u00f3j przeciwnik ma \u017celazny u\u015bcisk! -Unarmed.Ability.IronGrip.Defender=&aTw\u00f3j \u017celazny u\u015bcisk uchroni\u0142 ci\u0119 przed rozbrojeniem! -Unarmed.Ability.Lower=&7Opuszczasz pi\u0119\u015bci. -Unarmed.Ability.Ready=&3You &6ready&3twoje pi\u0119\u015bci. -Unarmed.SubSkill.Berserk.Name=Sza\u0142 -Unarmed.SubSkill.Berserk.Description=+50% DMG, \u0141amie s\u0142abe materia\u0142y -Unarmed.SubSkill.Berserk.Stat=D\u0142ugo\u015b\u0107 Sza\u0142u -Unarmed.SubSkill.Disarm.Name=Rozbraja\u0107 -Unarmed.SubSkill.Disarm.Description=Upuszcza trzymany w d\u0142oni przedmiot przeciwnika +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\u0142amanie limitu -Unarmed.SubSkill.UnarmedLimitBreak.Description=Prze\u0142amywanie granic. Zwi\u0119kszone obra\u017cenia zadawane trudnym przeciwnikom. Przeznaczony dla PVP, zale\u017cnie od ustawie\u0144 serwera, czy zwi\u0119kszy obra\u017cenia w PVE, czy nie. +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\u0119 -Unarmed.SubSkill.ArrowDeflect.Name=Odbicie strza\u0142 -Unarmed.SubSkill.ArrowDeflect.Description=Odbij strza\u0142y -Unarmed.SubSkill.ArrowDeflect.Stat=Szansa na odbicie strza\u0142y +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 \u017celazny chwyt -Unarmed.SubSkill.BlockCracker.Name= -Unarmed.SubSkill.BlockCracker.Description=Rozbijaj ska\u0142y pi\u0119\u015bciami -Unarmed.Listener=Niezr\u0119czno\u015b\u0107: -Unarmed.SkillName=NIEZR\u0118CZNO\u015a\u0106 -Unarmed.Skills.Berserk.Off=**Sza\u0142 si\u0119 sko\u0144czy\u0142** +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\u0142y od\u015bwie\u017cone! +Unarmed.Skills.Berserk.Refresh=&aYour &eBerserk & Aability zostały odświeżone! #WOODCUTTING -Woodcutting.Ability.0=Dmuchawa do li\u015bci -Woodcutting.Ability.1=Zdmuchuje li\u015bcie -Woodcutting.Ability.Locked.0=ZABLOKOWANE DO {0}+ UMIEJ\u0118TNO\u015a\u0106 (DMUCHAWA DO LI\u015aCI) -Woodcutting.SubSkill.TreeFeller.Name=\u015acinacz Drzew -Woodcutting.SubSkill.TreeFeller.Description=Spraw, by drzewa eksplodowa\u0142y +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\u015bci -Woodcutting.SubSkill.LeafBlower.Description=Zdmuchuje li\u015bcie -Woodcutting.SubSkill.KnockOnWood.Name=Stukni\u0119cie w Drewno -Woodcutting.SubSkill.KnockOnWood.Description=Znajd\u017a dodatkowe przedmioty podczas korzystania z \u015acinacz Drzew -Woodcutting.SubSkill.KnockOnWood.Stat=Stukni\u0119cie w Drewno -Woodcutting.SubSkill.KnockOnWood.Loot.Normal=Standardowy \u0142up z drzewa -Woodcutting.SubSkill.KnockOnWood.Loot.Rank2=Standardowy \u0142up z drzew i kul do\u015bwiadczenia -Woodcutting.SubSkill.HarvestLumber.Name=\u017bniwa Budulca -Woodcutting.SubSkill.HarvestLumber.Description=Umiej\u0119tnie wydobywanie wi\u0119cej drewna -Woodcutting.SubSkill.HarvestLumber.Stat=Podw\u00f3jna szansa \u0142upu -Woodcutting.SubSkill.Splinter.Name=Kawa\u0142ki -Woodcutting.SubSkill.Splinter.Description=Ci\u0119cie drzew bardziej efektywnie. +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\u0142y podczas \u015bcinania drzew. +Woodcutting.SubSkill.BarkSurgeon.Description=Wydobywaj przydatne materiały podczas ścinania drzew. Woodcutting.SubSkill.NaturesBounty.Name=Nagroda natury -Woodcutting.SubSkill.NaturesBounty.Description=Zbieraj do\u015bwiadczenie z natury. +Woodcutting.SubSkill.NaturesBounty.Description=Zbieraj doświadczenie z natury. Woodcutting.Listener=Drwal: Woodcutting.SkillName=DRWAL -Woodcutting.Skills.TreeFeller.Off=**\u015acinacz Drzew przesta\u0142 dzia\u0142a\u0107** -Woodcutting.Skills.TreeFeller.On=&a**\u015aCINACZ DRZEW AKTYWOWANY** -Woodcutting.Skills.TreeFeller.Refresh=&aTwoja umiej\u0119tno\u015b\u015b &e\u015acinacz Drzew &azosta\u0142a od\u015bwie\u017cona! -Woodcutting.Skills.TreeFeller.Other.Off=\u015acinacz Drzew&a przesta\u0142 dzia\u0142a\u0107 na &e{0} -Woodcutting.Skills.TreeFeller.Other.On=&a{0}&2 u\u017cy\u0142 &c\u015acinacz Drzew! -Woodcutting.Skills.TreeFeller.Splinter=TW\u00d3J TOP\u00d3R ROZKLEJA SI\u0118 NA DZIESI\u0104TKI KAWA\u0141K\u00d3W! -Woodcutting.Skills.TreeFeller.Threshold=To drzewo jest zbyt du\u017ce! +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\u0141** +Combat.ArrowDeflect=&f**UGINANIE STRZAŁ** Combat.BeastLore=&a**WIEDZA BESTII** Combat.BeastLoreHealth=&3Zdrowie (&a{0}&3/{1}) -Combat.BeastLoreOwner=&3W\u0142a\u015bciciel (&c{0}&3) -Combat.BeastLoreHorseSpeed=&3Pr\u0119dko\u015b\u0107 konia (&a{0} bloki/s&3) -Combat.BeastLoreHorseJumpStrength=&3Si\u0142a skoku konia (&aMax {0} blok\u00f3w&3) +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\u0141E\u015a ZRANIONY** -Combat.TargetDazed=Cel by\u0142 &4Oszo\u0142omiony -Combat.TouchedFuzzy=&4Czy\u0107 sko\u0142owanie. +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\u015bci wra\u017ce\u0144 z gry RPG.,&3Wskaz\u00f3wki:,&6 - &aU\u017cyj &c/mcmmo help&a by zobaczy\u0107 komendy,&6 - &aWpisz &c/NAZWA_UMI\u0118J\u0118TNO\u015aCI&a by zobaczy\u0107 detale konkertnej umiej\u0119tno\u015bci,&3Deweloperzy:,&6 - &anossr50 &9(Tw\u00f3rca & Kierownik Projektu),&6 - &aelectronicboy &9(Dev),&6 - &akashike &9(Dev),&6 - &at00thpick1 &9(Opiekun wersji Classic) -mcMMO.Description.FormerDevs=&3Byli tw\u00f3rcy: &aGJ, NuclearW, bm01, TfT_02, Glitchfinder +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\u0119tno\u015bci zosta\u0142y zmodyfikowane o {0}. -Commands.addlevels.AwardSkill.1=&aZostano nagrodzonym o {0} poziomy/\u00f3w w {1}! -Commands.addlevels.AwardSkill.2={0} zosta\u0142o/a zmodyfikowana o {1}. +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\u017cywanie umiej\u0119tno\u015bci: &cWy\u0142\u0105czone -Commands.Ability.On=U\u017cywanie umiej\u0119tno\u015bci &aW\u0142\u0105czone -Commands.Ability.Toggle=Zmieniono u\u017cywanie umiej\u0119tno\u015bci dla &e{0} -Commands.AdminChat.Off=Admin Chat &cW\u0142\u0105czone -Commands.AdminChat.On=Admin Chat &cWy\u0142\u0105czone -Commands.AdminToggle=&a- Prze\u0142\u0105cz czat Admin\u00f3w +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\u0119tno\u015bci&6 =-- -Commands.Cooldowns.Row.N=\ &c{0}&f - &6Pozosta\u0142o sekund: {1} +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\u0107 {0} milisekund zanim u\u017cyjesz tej komendy. -Commands.Database.Cooldown=Musisz odczeka\u0107 {0} sekund zanim u\u017cyjesz tej komendy ponownie. -Commands.Database.Processing=Twoje poprzednie polecenie jest nadal przetwarzane. Prosz\u0119 czeka\u0107. -Commands.Disabled=Ta komenda jest wy\u0142\u0105czona. +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\u0142\u0105czony -Commands.GodMode.Enabled=mcMMO Godmode W\u0142\u0105czony -Commands.AdminChatSpy.Enabled=mcMMO Podgl\u0105danie czat\u00f3w dru\u017cyn w\u0142\u0105czone -Commands.AdminChatSpy.Disabled=mcMMO Podgl\u0105danie czat\u00f3w dru\u017cyn wy\u0142\u0105czone -Commands.AdminChatSpy.Toggle=mcMMO Czat w grupie zosta\u0142 prze\u0142\u0105czony dla &e{0} +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 \u015bwiecie (Zobacz Permisje) -Commands.GodMode.Toggle=Tryb Godmode zosta\u0142 prze\u0142\u0105czony dla &e{0} -Commands.Healthbars.Changed.HEARTS=[mcMMO] Tw\u00f3j typ wy\u015bwietlania paska zdrowia zosta\u0142 zmieniony na &cZdrowie&f. -Commands.Healthbars.Changed.BAR=[mcMMO] Tw\u00f3j typ wy\u015bwietlania paska zdrowia zosta\u0142 zmieniony na &eBar&f. -Commands.Healthbars.Changed.DISABLED=[mcMMO] Twoje paski zdrowia mob\u00f3w zosta\u0142y &7wy\u0142\u0105czone&f. -Commands.Healthbars.Invalid=B\u0142\u0119dny pasek zdrowia! -Commands.Inspect= &a- Zobacz szczeg\u00f3\u0142owe informacje o graczu -Commands.Invite.Success=&aPomy\u015blnie wys\u0142ano zaproszenie. -Commands.Leaderboards= &a- Rankingi -Commands.mcgod=&a- Prze\u0142\u0105cz GodMode -Commands.mchud.Invalid=To nie jest prawid\u0142owy typ HUD. -Commands.mcpurge.Success=&aBaza danych zosta\u0142a pomy\u015blnie wyczyszczona! +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\u00f3lne&a - &6Ranga &f#&a{0} +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\u015bwie\u017cony. -Commands.mcremove.Success=&a{0} - Pomy\u015blnie usuni\u0119to z bany danych! -Commands.mctop.Tip=&6Tip: U\u017cyj &c/mcrank&6 aby wy\u015bwietli\u0107 wszystkie swoje osobiste 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\u0119tno\u015bci zmieniono na {0}! -Commands.mmoedit.Modified.1=&aTw\u00f3j poziom {0} zmieniono na {1}! -Commands.mmoedit.Modified.2={0} zosta\u0142/a zmodyfikowana dla {1}. -Commands.mcconvert.Database.Same=Ju\u017c u\u017cywasz bazy danych {0}! +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\u0144czona; {1} ma teraz wszystkie dane z bazy danych {0}. -Commands.mmoshowdb=Aktualna baza danych w u\u017cyciu to &a{0} -Commands.mcconvert.Experience.Invalid=Nieznany typ formu\u0142y! Prawod\u0142owe typy to: &aLINIOWY &ci &aEXPONENTIAL. -Commands.mcconvert.Experience.Same=Aktualny typ formu\u0142y to {0} +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\u0144czono konwersj\u0119 formu\u0142y; teraz korzystam z {0} \u015bredniejj XP. -Commands.ModDescription=&a- Przeczytaj kr\u00f3tki opis moda -Commands.NoConsole=Tej komendy nie mo\u017cesz u\u017cy\u0107 przez konsol\u0119. -Commands.Notifications.Off=Prze\u0142\u0105czono powiadomienia o umiej\u0119tno\u015bciach: &cWy\u0142\u0105czono -Commands.Notifications.On=Prze\u0142\u0105czono powiadomienia o umiej\u0119tno\u015bciach: &aW\u0142\u0105czono -Commands.Offline=Ta komenda nie dzia\u0142a na graczy off-line. -Commands.NotLoaded=Profil gracza nie jest jeszcze za\u0142adowany. +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\u0118PNIANIA: +Commands.Party.ShareMode=&8TRYB UDOSTĘPNIANIA: Commands.Party.ItemShare=&7PRZEDMIOT &3({0}) Commands.Party.ExpShare=&7EXP &3({0}) -Commands.Party.ItemShareCategories=&8Udost\u0119pnianie przedmiot\u00f3w: &7&o{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\u017cyny -Commands.Party.Chat.Off=Czat dru\u017cyny &cWy\u0142\u0105czono -Commands.Party.Chat.On=Czat dru\u017cyny &aW\u0142\u0105czono -Commands.Party.Commands=&c---[]&aKOMENDY DRU\u017bYNY&c[]--- -Commands.Party.Invite.0=&cALERT: &aOtrzyma\u0142e\u015b zaproszenie do dru\u017cyny {0} od {1} -Commands.Party.Invite.1=&eWpisz &a/party accept&e aby zaakceptowa\u0107 zaproszenie -Commands.Party.Invite=&a- Wy\u015blij zaproszenie do dru\u017cyny -Commands.Party.Invite.Accepted=&aZaproszenie Zaakceptowane. Do\u0142\u0105czy\u0142e\u015b do dru\u017cyny {0} -Commands.Party.Join=&7Do\u0142\u0105czy\u0142 do dru\u017cyny: {0} -Commands.Party.PartyFull=&6{0}&c jest pe\u0142na! -Commands.Party.PartyFull.Invite=Nie mo\u017cesz zaprosi\u0107 &e{0}&c do &a{1}&c, poniewa\u017c dru\u017cyna ma ju\u017c &3{2}&c cz\u0142onk\u00f3w! -Commands.Party.PartyFull.InviteAccept=Nie mo\u017cesz do\u0142\u0105czy\u0107 do &a{0}&c, poniewa\u017c dru\u017cyna ma ju\u017c &3{1}&c cz\u0142onk\u00f3w! -Commands.Party.Create=&7Stworzone dru\u017cyny: {0} -Commands.Party.Rename=&7Nazwa dru\u017cyny zmieniona na: &f{0} -Commands.Party.SetSharing=&7Udost\u0119pnianie dru\u017cyny {0} ustawione na: &3{1} -Commands.Party.ToggleShareCategory=&7Udost\u0119pnianie przedmiot\u00f3w dru\u017cyny &6{0} &7zosta\u0142o &3{1} -Commands.Party.AlreadyExists=&4PDru\u017cyna {0} ju\u017c istnieje! -Commands.Party.Kick=&cZosta\u0142e\u015b/a\u015b wyrzucony/a z dru\u017cyny &a{0}&c! -Commands.Party.Leave=&eOpuszczono dru\u017cyn\u0119 -Commands.Party.Members.Header=&c-----[]&aCZ\u0141ONKOWIE&c[]----- -Commands.Party.None=&cNie jeste\u015b w dru\u017cynie. -Commands.Party.Quit=&a- Opu\u015b\u0107 swoj\u0105 dru\u017cyn\u0119 -Commands.Party.Teleport=&a- Teleportuj do cz\u0142onka dru\u017cyny -Commands.Party.Toggle=&a- Prze\u0142\u0105cz czat dru\u017cyny -Commands.Party1=&a- Stw\u00f3rz now\u0105 dru\u017cyn\u0119 -Commands.Party2=&a- Do\u0142\u0105cz do dru\u017cyny -Commands.Party.Alliance.Header=&c-----[]&aSOJUSZ DRU\u017bYN&c[]----- -Commands.Party.Alliance.Ally=&f{0} &8JEST ZWI\u0104ZANY/A Z: &f{1} -Commands.Party.Alliance.Members.Header=&c-----[]&aCZ\u0141ONKOWIE SOJUSZU&c[]----- -Commands.Party.Alliance.Invite.0=ALERT: &aOtrzyma\u0142e\u015b zaproszenie do sojuszu w dru\u017cynie {0} do {1} -Commands.Party.Alliance.Invite.1=Wpisz &a/party alliance accept&e aby zaakceptowa\u0107 zaproszenie +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\u017cyna nie ma sojuszu. -Commands.Party.Alliance.AlreadyAllies=&cTwoja dru\u017cyna ma ju\u017c sojusz. Rozwi\u0105\u017c sojusz &3/party alliance disband -Commands.Party.Alliance.Help.0=&cTa dru\u017cyna nie zawar\u0142a jeszcze sojuszu. Mo\u017cesz -Commands.Party.Alliance.Help.1=&czaprosi\u0107 lidera u\u017cywaj\u0105c &3/party alliance invite &c. -Commands.ptp.Enabled=Teleportowanie w dru\u017cynie &aew\u0142\u0105czone -Commands.ptp.Disabled=Teleportowanie w dru\u017cynie &cwy\u0142\u0105czone -Commands.ptp.NoRequests=&cNie masz aktualnie pr\u00f3\u015bb o teleportacj\u0119 -Commands.ptp.NoWorldPermissions=&c[mcMMO] Nie masz permisji, aby zteleportowa\u0107 si\u0119 do \u015bwiata {0}. -Commands.ptp.Request1=&e{0} &awys\u0142a\u0142/a pro\u015bb\u0119 o teleportacj\u0119. -Commands.ptp.Request2=&aAby zaakceptowa\u0107, wpisz &e/ptp accept&a. Pro\u015bba wyga\u015bnie za &c{0} &asekund. -Commands.ptp.AcceptAny.Enabled=Potwierdzanie teleportowania w dru\u017cynie &aw\u0142\u0105czone -Commands.ptp.AcceptAny.Disabled=Potwierdzanie teleportowania w dru\u017cynie &cwy\u0142\u0105czone -Commands.ptp.RequestExpired=&cPro\u015bba o teleport dru\u017cyny wygas\u0142a! -Commands.PowerLevel.Leaderboard=&e--mcMMO&9 Poziom Mocy &elider\u00f3w-- +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\u0119tno\u015bci pomy\u015blnie zresetowano. -Commands.Reset.Single=&aPoziom Twojej umiej\u0119tno\u015bci {0} pomy\u015blnie zresetowano. -Commands.Reset=&a- Zresetuj poziom umiej\u0119tno\u015bci do 0 -Commands.Scoreboard.Clear=&3mcMMO Tablica wynik\u00f3w oczyszczona. -Commands.Scoreboard.NoBoard=&cTablica wynik\u00f3w mcMMO jest nieaktywna. -Commands.Scoreboard.Keep=&3Tablica wynik\u00f3w mcMMO pozostanie, p\u00f3ki nie u\u017cyjesz &a/mcscoreboard clear&3. -Commands.Scoreboard.Timer=&3Tablica wynik\u00f3w mcMMO zostanie wyczyszona za &6{0}&3 sekund od teraz. +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\u015bci tablic\u0119 wynik\u00f3w mcMMO -Commands.Scoreboard.Help.2=&3/mcscoreboard&b keep &f - utrzymuj tablic\u0119 wynik\u00f3w mcMMO -Commands.Scoreboard.Help.3=&3/mcscoreboard&b time [n] &f - wyczy\u015b\u0107 tablic\u0119 wynik\u00f3w McMMO za &dn&f sekund -Commands.Scoreboard.Tip.Keep=&6Wskaz\u00f3wka: U\u017cyj &c/mcscoreboard keep&6 while the scoreboard is shown to keep it from going away. -Commands.Scoreboard.Tip.Clear=&6Wskaz\u00f3wka: U\u017cyj &c/mcscoreboard clear&6 pozby\u0107 si\u0119 tablicy wynik\u00f3w. -Commands.XPBar.Reset=&6Ustawienia paska XP Bar dla mcMMO zosta\u0142y zresetowane. -Commands.XPBar.SettingChanged=&6Ustawienia paska XP Bar dla &a{0}&6 zosta\u0142/a ustawiony/a na &a{1} -Commands.Skill.Invalid=To nie jest poprawna nazwa umiej\u0119tno\u015bci! -Commands.Skill.ChildSkill=Umiej\u0119tno\u015bci dziecka nie s\u0105 wa\u017cne dla tego polecenia! -Commands.Skill.Leaderboard=--mcMMO &9{0}&e Tablica Wynik\u00f3w-- -Commands.SkillInfo=&a- Poka\u017c informacje dot. konkretnej umiej\u0119tno\u015bci -Commands.Stats=&a- Poka\u017c swoje statystyki mcMMO -Commands.ToggleAbility=&a- Prze\u0142\u0105cz aktywacj\u0119 umiej\u0119tno\u015bci prawym przyciskiem myszy -Commands.Usage.0=&cW\u0142a\u015bciwe u\u017cycie to /{0} -Commands.Usage.1=&cW\u0142a\u015bciwe u\u017cycie to /{0} {1} -Commands.Usage.2=&cW\u0142a\u015bciwe u\u017cycie to /{0} {1} {2} -Commands.Usage.3=&cW\u0142a\u015bciwe u\u017cycie to /{0} {1} {2} {3} -Commands.Usage.3.XP=&cW\u0142a\u015bciwe u\u017cycie to /{0} {1} {2} {3}&7 (Mo\u017cesz doda\u0107 -s, aby wykona\u0107 polecenie bez informowania o tym gracza) +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\u015b\u0107 +Commands.Usage.Message=wiadomość Commands.Usage.Page=strona Commands.Usage.PartyName=nazwa -Commands.Usage.Password=has\u0142o +Commands.Usage.Password=hasło Commands.Usage.Player=gracz Commands.Usage.Rate=ocena -Commands.Usage.Skill=umiej\u0119tno\u015b\u0107 -Commands.Usage.SubSkill=sub-umiej\u0119tno\u015b\u0107 +Commands.Usage.Skill=umiejętność +Commands.Usage.SubSkill=sub-umiejętność Commands.Usage.XP=xp -Commands.Description.mmoinfo=Przeczytaj szczeg\u00f3\u0142owe informacje o umiej\u0119tno\u015bci lub mechanice. -Commands.MmoInfo.Mystery=&7Nie odblokowa\u0142e\u015b/a\u015b jeszcze tej umiej\u0119tno\u015bci, ale kiedy to zrobisz, b\u0119dziesz m\u00f3g\u0142 przeczyta\u0107 o niej szczeg\u00f3\u0142y tutaj! -Commands.MmoInfo.NoMatch=Ta sub-umiej\u0119tno\u015b\u0107 nie istnieje! +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\u0119tno\u015bci MMO s\u0105 przekszta\u0142cane w ulepszony modu\u0142owy system umiej\u0119tno\u015bci, niestety ta umiej\u0119tno\u015b\u0107 nie zosta\u0142a jeszcze przekonwertowana i brakuje jej szczeg\u00f3\u0142owych statystyk. Nowy system pozwoli na szybsze udost\u0119pnianie nowych umiej\u0119tno\u015bci mcMMO i wi\u0119ksz\u0105 elastyczno\u015b\u0107 w przypadku istniej\u0105cych umiej\u0119tno\u015bci. +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\u017cyj tej komendy ponownie, aby prze\u0142\u0105czy\u0107. W trybie debugowania mo\u017cesz klika\u0107 bloki, aby wy\u015bwietli\u0107 przydatne informacje u\u017cywane do obs\u0142ugi. +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\u0105ce uprawnienia. -mcMMO.NoSkillNote=&8Je\u015bli nie masz dost\u0119pu do danej umiej\u0119tno\u015bci, nie zostanie ona tutaj pokazana. +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\u017cyny nie s\u0105 dozwolone na tym \u015bwiecie (Zobacz permisje) -Party.Help.0=&cPrawid\u0142owe u\u017cycie to &3{0} [has\u0142o]. -Party.Help.1=&cAby stworzy\u0107 dru\u017cyn\u0119, u\u017cyj &3{0} [has\u0142o]. -Party.Help.2=&cSkonsultuj si\u0119 z &3{0} &cpo wi\u0119cej informacji -Party.Help.3=&cu\u017cyj &3{0} [has\u0142o] &caby do\u0142\u0105czy\u0107 lub &3{1} &copu\u015bci\u0107 -Party.Help.4=&cAby zablokowa\u0107 lub odblokowa\u0107 dru\u017cyn\u0119, u\u017cyj &3{0} -Party.Help.5=&cAby zabezpieczy\u0107 swoj\u0105 dru\u017cyn\u0119 has\u0142em, u\u017cyj &3{0} -Party.Help.6=&cAby wyrzuci\u0107 gracza z dru\u017cyny, u\u017cyj &3{0} -Party.Help.7=&cAby przenie\u015b\u0107 w\u0142asno\u015b\u0107 swojej dro\u017cyny, u\u017cyj &3{0} -Party.Help.8=&cAby rozwi\u0105za\u0107 swoj\u0105 dru\u017cyn\u0119, u\u017cyj &3{0} -Party.Help.9=&cU\u017cyj &3{0} &caby udost\u0119pnia\u0107 przedmioty cz\u0142onkom dru\u017cyny -Party.Help.10=&cU\u017cyj &3{0} &cudost\u0119pnia\u0107 XP cz\u0142onkom dru\u017cyny -Party.InformedOnJoin={0} &ado\u0142\u0105czy\u0142/a do dru\u017cyny -Party.InformedOnQuit={0} &aopu\u015bci\u0142/a dru\u017cyn\u0119 -Party.InformedOnNameChange=&6{0} &austawi\u0142/a nazw\u0119 dru\u017cyny na &f{1} -Party.InvalidName=&4To nie jest prawid\u0142owa nazwa dru\u017cyny. -Party.Invite.Self=&cNie mo\u017cesz zaprosi\u0107 samego siebie! -Party.IsLocked=&cTa dru\u017cyna jest zablokowana! -Party.IsntLocked=&cTa dru\u017cyna nie jest zablokowana! -Party.Locked=&cDru\u017cyna jest zablokowana, tylko w\u0142a\u015bciciel/ka mo\u017ce zaprosi\u0107 nowych cz\u0142onk\u00f3w. -Party.NotInYourParty=&4{0} nie jest Twoj\u0105 dru\u017cyn\u0105 -Party.NotOwner=&4Nie jeste\u015b w\u0142a\u015bcicielem/k\u0105 dru\u017cyny. -Party.Target.NotOwner=&4{0} nie jest w\u0142a\u015bcicielem/k\u0105 dru\u017cyny. -Party.Owner.New=&a{0} jest nowym/\u0105 w\u0142a\u015bcicielem/k\u0105 dru\u017cyny. -Party.Owner.NotLeader=&4Nie jeste\u015b ju\u017c w\u0142a\u015bcicielem/k\u0105 dru\u017cyny. -Party.Owner.Player =&aJeste\u015b teraz w\u0142a\u015bcicielem/k\u0105 dru\u017cyny. -Party.Password.None=&cTa dru\u017cyna jest chroniona has\u0142em. Wpisz has\u0142o, aby do\u0142\u0105czy\u0107. -Party.Password.Incorrect=&cNiepoprawne has\u0142o. -Party.Password.Set=&aUstawiono has\u0142o dru\u017cyny na {0} -Party.Password.Removed=&aUsuni\u0119to has\u0142o dru\u017cyny. +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\u017c jest w Twojej dru\u017cynie! -Party.PlayerNotInParty=&4{0} nie jest w dru\u017cynie -Party.Specify=&cMusisz poda\u0107 dru\u017cyn\u0119. -Party.Teleport.Dead=&cNie mo\u017cesz si\u0119 zteleportowa\u0107 do martwego przyjaciela. -Party.Teleport.Hurt=&cZosta\u0142e\u015b/a\u015b zraniony przez ostatnie {0} sekund i nie mo\u017cna si\u0119 teleportowa\u0107. +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\u017cesz si\u0119 teleportowa\u0107 do siebie! -Party.Teleport.Target=&a{0} teleportowa\u0142 si\u0119 do Ciebie. -Party.Teleport.Disabled=&c{0} nie pozwala na dru\u017cynowe teleportowanie. -Party.Rename.Same=&cWpisz inn\u0105 nazw\u0119 jaskini, nie aktualn\u0105! -Party.Join.Self=&cNie mo\u017cesz do\u0142\u0105czy\u0107 do siebie! -Party.Unlocked=&7Dru\u017cyna jest odblokowana -Party.Disband=&7Dru\u017cyna zosta\u0142a rozwi\u0105zana -Party.Alliance.Formed=&7Twoja dru\u017cyna jest w sojuszu z &a{0} -Party.Alliance.Disband=&7Twoja dru\u017cyna nie jest ju\u017c w sojuszu z &c{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\u0119kszono poziom dru\u017cyny: {0}. Aktualnie: ({1}) -Party.Feature.Chat=Czat Dru\u017cyny -Party.Feature.Teleport=Teleport dru\u017cyny +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\u0119pnianie przedmiot\u00f3w -Party.Feature.XpShare=Udost\u0119pnianie XP -Party.Feature.Locked.Chat=ZABLOKOWANE DO {0}+ (CZAT DRU\u017bYNY) -Party.Feature.Locked.Teleport=ZABLOKOWANE DO {0}+ (TELEPORT DRU\u017bYNY) +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\u0118PNIANIE PRZEDMIOT\u00d3W) -Party.Feature.Locked.XpShare=ZABLOKOWANE DO {0}+ UDOST\u0118PNIANIE XP) -Party.Feature.Disabled.1=&cNie odblokowano jeszcze czatu dry\u017cyny. -Party.Feature.Disabled.2=&cNie odblokowano jeszcze teleportu dru\u017cyny. -Party.Feature.Disabled.3=&cNie odblokowano jeszcze sojuszy dry\u017cyny. -Party.Feature.Disabled.4=&cNie odblokowano jeszcze udost\u0119pniani przedmiot\u00f3w. -Party.Feature.Disabled.5=&cNie odblokowano jeszcze udost\u0119pniania XP. +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=\u017bADEN -Party.ShareMode.Equal=R\u00d3WNY +Party.ShareMode.None=ŻADEN +Party.ShareMode.Equal=RÓWNY Party.ShareMode.Random=LOSOWY -Party.ItemShare.Category.Loot=\u0142up -Party.ItemShare.Category.Mining=G\u00f3rnictwo +Party.ItemShare.Category.Loot=łup +Party.ItemShare.Category.Mining=Górnictwo Party.ItemShare.Category.Herbalism=Tresowanie -Party.ItemShare.Category.Woodcutting=\u015acinanie Drzew -Party.ItemShare.Category.Misc=R\u00f3\u017cne +Party.ItemShare.Category.Woodcutting=Ścinanie Drzew +Party.ItemShare.Category.Misc=Różne ##xp -Commands.XPGain.Acrobatics=Spadanie z wysoko\u015bci +Commands.XPGain.Acrobatics=Spadanie z wysokości Commands.XPGain.Alchemy=Warzenie Mikstur -Commands.XPGain.Archery=Atakowanie potwor\u00f3w -Commands.XPGain.Axes=Atakowanie potwor\u00f3w -Commands.XPGain.Child=Zyskuje poziomy dzi\u0119ki g\u0142\u00f3wnym umiej\u0119tno\u015bci\u0105 -Commands.XPGain.Excavation=Kopanie i znajdowanie skarb\u00f3w -Commands.XPGain.Fishing=\u0141owienie -Commands.XPGain.Herbalism=Zbieranie zi\u00f3\u0142 +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\u017cywaj\u0105c specjalnego kowad\u0142a -Commands.XPGain.Swords=Atakowanie potwor\u00f3w -Commands.XPGain.Taming=Rozmna\u017canie zwierz\u0105t, albo walka w/ z twoimi psami -Commands.XPGain.Unarmed=Atakowanie potwor\u00f3w -Commands.XPGain.Woodcutting=\u015acianie drzew +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\u00f3j pasek XP jest teraz zablokowany na {0}! -Commands.xplock.unlocked=&6Tw\u00f3j pasek XP jest teraz &aODBLOKOWANY&6! -Commands.xprate.modified=&cMNO\u017bNIK XP zosta\u0142 zmieniony na {0} -Commands.xprate.over=&cEvent mcMMO XP w\u0142a\u015bnie si\u0119 sko\u0144czy\u0142!! -Commands.xprate.proper.0=&cW\u0142a\u015bciwe u\u017cycie do zmieny cz\u0119sto\u015bci XP to /xprate -Commands.xprate.proper.1=&cW\u0142a\u015bciwe u\u017cycie do zresetowania g\u0119sto\u015bci XP to /xprate reset -Commands.xprate.proper.2=&cPodaj warto\u015b\u0107 true lub false, aby wskaza\u0107, czy jest to event XP, czy nie. -Commands.NegativeNumberWarn=Nie u\u017cywaj liczb na minusie! +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\u0144czony! -Commands.Event.Stop.Subtitle=&aMam nadziej\u0119, \u017ce mi\u0142o si\u0119 bawili\u015bcie! -Commands.Event.XP=&3Mno\u017cnik XP to teraz &6{0}&3x -Commands.xprate.started.0=&6XP EVENT mcMMO W\u0141A\u015aNIE SI\u0118 ROZPOCZ\u0104\u0141! -Commands.xprate.started.1=&6MNO\u017bNIK mcMMO XP WYNOSI TERAZ {0}x! +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\u0142e\u015b/a\u015b globalny mno\u017cnik XP na &6{0}x -Notifications.Admin.XPRate.End.Self=&7Zako\u0144czy\u0142e\u015b/a\u015b event mno\u017cnika XP. -Notifications.Admin.XPRate.End.Others={0} &7zako\u0144czy\u0142/a event mcMMO XP. -Notifications.Admin.XPRate.Start.Others={0} &7rozpocz\u0105\u0142/\u0119\u0142a lub zmodyfikowa\u0142/a wydarzenie zwi\u0105zane z XP z globalnym mno\u017cnikiem {1}x +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\u017cnik XP to {0}x! +XPRate.Event=&6aAktualnie jest wydarzenie mcMMO event! Mnożnik XP to {0}x! #GUIDES -Guides.Available=&7Poradnik dla {0} jest dost\u0119pny - Wpisz /{1} ? [strona] +Guides.Available=&7Poradnik dla {0} jest dostępny - Wpisz /{1} ? [strona] Guides.Header=&6-=&a{0} PORADNIK&6=- -Guides.Page.Invalid=Nieprawid\u0142owy numer strony! -Guides.Page.OutOfRange=Ta strona nie istnieje, jest/s\u0105 tylko {0} stron/a/y. -Guides.Usage= Prawod\u0142owe u\u017cycie to /{0} ? [strona] +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\u0119 z wdzi\u0119kiem w mcMMO.\n&eZapewnia premie bojowe i premie do obra\u017ce\u0144 otoczenia.\n\n&3ZDOBYWANIE XP:\n&eAby zdoby\u0107 PD w tej umiej\u0119tno\u015bci, musisz wykona\u0107 unik\n&ew walce lub przetrwa\u0107 upadki z wysoko\u015bci, kt\u00f3re ci\u0119 rani\u0105. -Guides.Acrobatics.Section.1=&3Jak dzia\u0142a Przewr\u00f3t??\n&eMasz pasywn\u0105 szans\u0119, gdy odniesiesz obra\u017cenia od upadku, aby zneutralizowa\u0107 zadane obra\u017cenia. Mo\u017cesz przytrzyma\u0107 przycisk skradania si\u0119, aby podwoi\u0107 swoje szanse podczas upadku. To wyzwala \u014agodny Przwr\u00f3t zamiast standardowego. \u0141agodne Przewroty s\u0105 jak zwyk\u0142e, ale prawdopodobie\u0144stwo wyst\u0105pienia Przewrotu jest dwukrotnie wi\u0119ksze i zapewnia wi\u0119ksze bezpiecze\u0144stwo obra\u017ce\u0144 ni\u017c zwyk\u0142e Przewroty.\n&eSzansa na przewr\u00f3t zale\u017cy od poziomu Twojej umiej\u0119tno\u015bci. -Guides.Acrobatics.Section.2=&3Jak dzia\u0142a unik?\n&eUnik to pasywna szansa na zmniejszenie o po\u0142ow\u0119 otrzymywanych obra\u017ce\u0144, gdy odniesiesz obra\u017cenia w walce. Jest to powi\u0105zane z Twoim poziomem umiej\u0119tno\u015bci. +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\u017ce dodanie nowych (wcze\u015bniej) nieosi\u0105galnych mikstur. \n\n\n&3ZDOBYWANIE XP:\n&eAby zdoby\u0107 XP tej umiej\u0119tno\u015bci, musisz warzy\u0107 mikstury. -Guides.Alchemy.Section.1=&3Jak dzia\u0142a Kataliza?\n&eSzybko\u015b\u0107 katalizy procesu warzenia, z maksymaln\u0105 pr\u0119dko\u015bci\u0105 4x na poziomie 1000. Ta umiej\u0119tno\u015b\u0107 jest domy\u015blnie odblokowywana na poziomie 100. -Guides.Alchemy.Section.2=&3Jak dzia\u0142aj\u0105 Mikstury?\n&eMikstury pozwalaj\u0105 na warzenie wi\u0119kszej liczby mikstur z niestandardowych sk\u0142adnik\u00f3w. To, kt\u00f3re specjalne sk\u0142adniki zostan\u0105 odblokowane, zale\u017cy od Twojej rangi. Do odblokowania jest 8 stopni. -Guides.Alchemy.Section.3=&3Sk\u0142adniki mikstur tieru 1:\n&eP\u0142omienny Proszek, Fermentowane Oko Paj\u0105ka, \u0141za Ghasta, Redstone,\n&eJasnopy\u0142, Cukier, Poz\u0142acany Arbuz, Z\u0142ota Marchewka,\n&eMagmowy Krem, Brodawka, Oko Paj\u0105ka, Proch, Lilia Wodna,\n&eRozdymka\n&e(Mikstury Wanilla) -Guides.Alchemy.Section.4=&3Sk\u0142adniki mikstur tieru 2:\n&eMarchwka (Miktura Szybko\u015bci)\n&eKulka Szlamu (Miktura Ot\u0119pienia)\n\n&3Sk\u0142adniki mikstur tieru 3:\n&eKwarc (Miksutra Absorpcji)\n&eMuchomor (Mikstura Skoku) -Guides.Alchemy.Section.5=&3Sk\u0142adniki mikstur tieru 4:\n&eJab\u0142ko (Mikstura boostu zdrowia)\n&eZgni\u0142e Mi\u0119so (PMiksutra G\u0142odu)\n\n&3Sk\u0142adniki mikstur tieru 5:\n&eBr\u0105zowy Grzyb (Mikstura Md\u0142o\u015bci)\n&eAtrament (Mikstura O\u015blepienia) -Guides.Alchemy.Section.6=&3Sk\u0142adniki mikstur tieru 6:\n&ePapro\u0107 (Mikstura Nasycenia)\n\n&3Sk\u0142adniki mikstur tieru 7:\n&eZatruty Ziemniak (Mikstura Rozk\u0142adu)\n\n&3Sk\u0142adniki mikstur tieru 8:\n&eZ\u0142ote Jab\u0142ko (Mikstura Odporno\u015bci) +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 \u0141ucznictwie:\n&e\u0141ucznictwo polega na strzelaniu z \u0142uku strza\u0142.\n&eZapewnia r\u00f3\u017cne bonusy bojowe, takie jak zwi\u0119kszenie obra\u017ce\u0144,\n&ekt\u00f3re skaluje si\u0119 z twoim poziomem i daje mo\u017cliwo\u015b\u0107 oszo\u0142omienia\n&eprzeciwnik\u00f3w w PvP. W dodatku mo\u017cesz odzyska\u0107\n&ecz\u0119\u015b\u0107 strza\u0142 z martwych wrog\u00f3w.\n\n\n&3ZDOBYWANIE XP:\n&eAby zdoby\u0107 XP w tej umiej\u0119tno\u015bci, musisz strzela\u0107 do mob\u00f3w lub\n&edo innych graczy. -Guides.Archery.Section.1=&3Jak dzia\u0142a Umiej\u0119tne Strzelanie??\n&eUmiej\u0119tne strzelanie zapewnia dodatkowe obra\u017cenia strza\u0142om.\n&eDodatkowe obra\u017cenia rosn\u0105 wraz z poziomem \u0141ucznictwa.\n&ePrzy domy\u015blnych ustawieniach twoje obra\u017cenia zwi\u0119kszaj\u0105 si\u0119 o 10% co 50 poziom\u00f3w, do maksymalnie 200% dodatkowych obra\u017ce\u0144. -Guides.Archery.Section.2=&3Jak dzia\u0142a Oszo\u0142omienie?\n&eMasz pasywn\u0105 szans\u0119 oszo\u0142omienia innych graczy, gdy do nich strzelasz. Aktywacja Oszo\u0142omienia zmusza przeciwnik\u00f3w do patrzenia prosto w g\u00f3r\u0119 przez kr\u00f3tki czas. Strza\u0142a oszo\u0142omiaj\u0105ca zadaje dodatkowe 4 obra\u017cenia (2 serca). -Guides.Archery.Section.3=&3Jak dzia\u0142a Odzyskiwanie Strza\u0142?\n&eMasz pasywn\u0105 szans\u0119 na odzyskanie niekt\u00f3rych strza\u0142, gdy zabijesz \u0142ukiem. Ta szansa ro\u015bnie wraz ze zdobywaniem kolejnych poziom\u00f3w w \u0141ucznictwie. Domy\u015blnie zdolno\u015b\u0107 ta ro\u015bnie o 0,1% na poziom, do 100% na poziomie 1000. +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\u0119tno\u015bci\u0105 Topory mo\u017cesz zrobi\u0107 co\u015b wi\u0119cej\n&eni\u017c niszczy\u0107 lasy! Mo\u017cesz hakowa\u0107 i sieka\u0107 moby\n&ei graczy, aby zdobywa\u0107 XP, musisz atakowa\u0107 moby siekier\u0105 z efektem\n&eodrzucenie i zada\u0107 \u015bmiertelny cios.\n&eTw\u00f3j top\u00f3r r\u00f3wnie\u017c staje si\u0119 r\u0119cznym r\u0119bakiem,\n&eponiewa\u017c bardzo obni\u017casz poziom zbroi\n&eprzeciwnikom wraz z poziomiem umiej\u0119tno\u015bci.\n&3ZDOBYWANIE XP:\n&eAby zdobywa\u0107 XP musisz atakowa\u0107 moby\n&elub graczy siekier\u0105. -Guides.Axes.Section.1=&3Jak dzia\u0142a Przecinacz Czaszek?\n&eTa umiej\u0119tno\u015b\u0107 pozwala Ci zada\u0107 obra\u017cenia AoE (Obszarowe). Obra\u017cenia obszarowe zadaj\u0105 po\u0142ow\u0119 Twoich obra\u017ce\u0144, co czyni je dobrym sposobem do zabijania grup mob\u00f3w. -Guides.Axes.Section.2=&3Jak dzia\u0142a Trafienie Krytyczne?\n&eTrafienia krytyczne jest to pasywna umiej\u0119tno\u015b\u0107, kt\u00f3ra daje Ci mo\u017cliwo\u015b\u0107 zadania dodatkowych obra\u017ce\u0144. Przy domy\u015blnych ustawieniach co 2 poziom umiej\u0119tno\u015bci daje Ci 0.1% szansy na trafienie krytyczne, kt\u00f3re zadaje 2x mobom lub 1.5x przeciwko graczom. -Guides.Axes.Section.3=&3Jak dzia\u0142a Mistrz Siekier?\n&eJest to umiej\u0119tno\u015b\u0107 pasywna, kt\u00f3ra daje Ci mo\u017cliwo\u015b\u0107 zadania dodatkowych obra\u017ce\u0144 przy u\u017cyciu toporka. Obra\u017cenia zwi\u0119kszaj\u0105 si\u0119 o 1 co 50 poziom\u00f3w, do maksymalnie 4 obra\u017ce\u0144 na poziomie 200. -Guides.Axes.Section.4=&3Jak dzia\u0142a Uderzenie Pancerza?\n&eUderz z wystarczaj\u0105c\u0105 si\u0142\u0105, aby rozbi\u0107 zbroj\u0119! Uderzenie Pancerza posiada pasywn\u0105 umiej\u0119tno\u015b\u0107, kt\u00f3ra mo\u017ce uszkodzi\u0107 pancerz Twojego przeciwnika. Obra\u017cenia te s\u0105 zwi\u0119kszanie wraz z poziomem Siekiery. -Guides.Axes.Section.5=&3Jak dzia\u0142a Wi\u0119kszy Wp\u0142yw?\n&eZ ka\u017cdym uderzeniem masz coraz wi\u0119ksz\u0105 szanse na aktywacje Wi\u0119kszy Wp\u0142yw, gdy uderzasz gracza lub moba skiekier\u0105. Domy\u015blna szansa wynosi 25%. Pasywna umiej\u0119tno\u015b\u0107 posiada extremalny efekt odrzutu, podobny do Odrzutu II, jednak\u017ce zadaje ona wi\u0119cej obra\u017ce\u0144\n&eenchantment. Ponadto zadaje dodatkowe obra\u017cenia celowi. +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\u015b\u0107 polegaj\u0105ca na wykopywaniu ziemi w celu znalezienia skarb\u00f3w..\n&eIm wi\u0119cej b\u0119dziesz kopa\u0107, tym wi\u0119cej znajdziesz skarb\u00f3w.\n\n&3ZDOBYWANIE XP:\n&eAby zdoby\u0107 XP w tej umiej\u0119tno\u015bci nale\u017cy kopa\u0107 \u0142opat\u0105. Tylko niekt\u00f3re rzeczy mo\u017cna wykopa\u0107, aby zdoby\u0107 skarby i EXP. Aby przygotowa\u0107 narz\u0119dzie wci\u015bnij prawy przycisk myszy z \u0142opat\u0105 w d\u0142oni. -Guides.Excavation.Section.1=&3Kompatybilne Materia\u0142y:\n&eTrawa, Ziemia, Piasek, Glina, \u017bwir, Mycelinium, Piasek Dusz, \u015anieg -Guides.Excavation.Section.2=&3Jak u\u017cy\u0107 Giga Wiert\u0142o:\n&eKliknij prawy przycisk z \u0142opat\u0105 w r\u0119ce, aby aktywowa\u0107 Giga Wiert\u0142o.\n&eGdy znajdziesz si\u0119 w tym stanie, masz oko\u0142o 4 sekund na kontakt z materia\u0142ami kompatybilnymi z Wykopalisko, aktywuje to Giga Wiert\u0142o. -Guides.Excavation.Section.3=&3Co to Giga Wiert\u0142o?\n&eGiga Wiert\u0142o to umiej\u0119tno\u015b\u0107 posiadaj\u0105ca czas odnowienia. Daje Ci potr\u00f3jn\u0105 szans\u0119 na znalezienie skarb\u00f3w oraz umo\u017cliwia natychmiastowe kopanie. -Guides.Excavation.Section.4=&3Jak dzia\u0142a Archeologia?\n&eKa\u017cdy skarb posiada sw\u00f3j wymagany poziom, dlatego otrzymujesz skarb w zale\u017clo\u015bci od Twojego poziomu umiej\u0119tno\u015bci. Pami\u0119taj im wy\u017cszy jest Tw\u00f3j poziom umiej\u0119tno\u015bci, tym wi\u0119cej skarb\u00f3w mo\u017cesz znale\u017a\u0107. Ka\u017cdy skarb, wykopywany z r\u00f3\u017cnych materia\u0142\u00f3w posiada swoj\u0105 unikalna list\u0119 przedmiot\u00f3w, kt\u00f3re si\u0119 w nim znajduj\u0105. Inny skarb otrzymasz z bruku, a zupe\u0142nie inny ze \u017cwiru. -Guides.Excavation.Section.5=&3Notatki o Wykopaliskach:\n&ePrzedmioty z wykopalisk s\u0105 w pe\u0142ni konfigurowalne, tak wi\u0119c wyniki r\u00f3\u017cni\u0105 si\u0119 mi\u0119dzy serwerami. +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\u0119dkarstwie:\n&eDzi\u0119ki umiej\u0119tno\u015bci W\u0119dkarstwo, w\u0119dkarstwo zn\u00f3w jest ekscytuj\u0105ce! Znajd\u017a ukryte skarby i strz\u0105\u015bnij przedmioty z mob\u00f3w.\n\n&3ZDOBYWANIE XP:\n&e\u0141owienie ryb. -Guides.Fishing.Section.1=&3Jak dzia\u0142a \u0141owca Skarb\u00f3w?\n&eTa umiej\u0119tno\u015b\u0107 pozwala ci znale\u017a\u0107 skarb z \u0142owienia z niewielk\u0105 szans\u0105 na zakl\u0119cie przedmiot\u00f3w. Ka\u017cdy mo\u017cliwy skarb dla w\u0119dkarzy ma szans\u0119 spa\u015b\u0107 na dowolnym poziomie. Zale\u017cy to jednak od rzadko\u015bci przedmiotu, jak cz\u0119sto b\u0119dzie on wypada\u0142. Im wy\u017cszy poziom umiej\u0119tno\u015bci \u0141owienie ryb, tym wi\u0119ksze masz szanse na znalezienie lepszych skarb\u00f3w. -Guides.Fishing.Section.2=&3Jak dzia\u0142aj\u0105 Mro\u017ane Po\u0142owy?\n&eTa umiej\u0119tno\u015b\u0107 pasywna pozwala \u0142owi\u0107 ryby w lodowych jeziorach! Wrzu\u0107 w\u0119dk\u0119 do lodowego jeziora, a stworzysz w lodzie ma\u0142\u0105 dziur\u0119 do \u0142owienia. -Guides.Fishing.Section.3=&3Jak dzia\u0142a Mistrz W\u0119dkarstwa?\n&eTa umiej\u0119tno\u015b\u0107 pasywna zwi\u0119ksza szans\u0119 brania podczas \u0142owienia. Po odblokowaniu tej umiej\u0119tno\u015bci \u0142owienie na \u0142odzi zwi\u0119ksza szanse na z\u0142owienie ryby. -Guides.Fishing.Section.4=&3Jak dzia\u0142a Potrz\u0105sanie?\n&eTa aktywna umiej\u0119tno\u015b\u0107 pozwala strz\u0105sa\u0107 przedmioty z mob\u00f3w poprzez zaczepienie ich w\u0119dk\u0105. Moby upuszczaj\u0105 przedmioty, kt\u00f3re normalnie upuszczaj\u0105 po \u015bmierci. Mo\u017cliwe jest r\u00f3wnie\u017c zdobycie czaszek mob\u00f3w, kt\u00f3re normalnie s\u0105 nieosi\u0105galne w trybie przetrwania. -Guides.Fishing.Section.5=&3Jak dzia\u0142a Dieta Rybaka?\n&eTa umiej\u0119tno\u015b\u0107 pasywna zwi\u0119ksza ilo\u015b\u0107 przywracanego g\u0142odu po jedzeniu ryby. -Guides.Fishing.Section.6=&3Notatki o W\u0119dkarstwie:\n&ePrzedmioty z \u0142owienia s\u0105 w pe\u0142ni konfigurowalne, tak wi\u0119c wyniki r\u00f3\u017cni\u0105 si\u0119 mi\u0119dzy serwerami. +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\u00f3\u0142 i ro\u015blin.\n\n\n&3ZDOBYWANIE XP:\n&eZbieraj ro\u015bliny i zio\u0142a. -Guides.Herbalism.Section.1=&3Kompatybilne ro\u015bliny:\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\u0142a Zielona Terra?\n&eZielona Terra to umiej\u0119tno\u015b\u0107 aktywna, mo\u017cesz przytrzyma\u0107 motyk\u0119 prawym przyciskiem myszy, aby aktywowa\u0107 Zielon\u0105 Terr\u0119. Zielona Terra daje graczom szans\u0119 na zdobycie 3x przedmiot\u00f3w ze zbioru ro\u015blin. Daje tak\u017ce graczom mo\u017cliwo\u015b\u0107 dzielenia \u017cycia na bloki i przekszta\u0142cania ich za pomoc\u0105 nasion z ekwipunku. -Guides.Herbalism.Section.3=&3Jak dzia\u0142a Zielona R\u0105czka (Nasiona)?\n&eTa pasywna umiej\u0119tno\u015b\u0107 automatycznie przesadza plony podczas zbioru. Twoja szansa na sukces zale\u017cy od umiej\u0119tno\u015bci zielarstwa. -Guides.Herbalism.Section.4=&3Jak dzia\u0142a Zielona R\u0105czka (Bruk/Kamienne Ceg\u0142y/Ziemia)?\n&eTa aktywna zdolno\u015b\u0107 pozwala zamieni\u0107 bloki w ich odpowiedniki „zwi\u0105zane z ro\u015blinami”. Mo\u017cesz to zrobi\u0107, klikaj\u0105c prawym przyciskiem myszy blok, trzymaj\u0105c jednocze\u015bnie nasiona. To poch\u0142onie 1 ziarno. -Guides.Herbalism.Section.5=&3Jak dzia\u0142a Dieta Farmera?\n&eTa umiej\u0119tno\u015b\u0107 pasywna zwi\u0119ksza ilo\u015b\u0107 przywracanego g\u0142odu podczas jedzenia chleba, ciastek, arbuz\u00f3w, zupy grzybowej, marchwi i ziemniak\u00f3w. -Guides.Herbalism.Section.6=&3Jak dzia\u0142a Wielkie Szcz\u0119\u015bcie?\n&eTa pasywna umiej\u0119tno\u015b\u0107 daje ci szans\u0119 na znalezienie rzadkich przedmiot\u00f3w, gdy niekt\u00f3re bloki zostan\u0105 rozbite mieczem. -Guides.Herbalism.Section.7=&3Jak dzia\u0142a Podw\u00f3jny \u0141up?\n&eTa pasywna umiej\u0119tno\u015b\u0107 zapewnia graczom wi\u0119ksze plony. +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\u00f3rnictwie:\n&eG\u00f3rnictwo obejmuje wydobywanie kamienia i rud. Zapewnia bonusy do ilo\u015bci upuszczanych materia\u0142\u00f3w podczas wydobywania.\n\n&3ZDOBYWANIE XP:\n&eAby zdoby\u0107 XP w tej umiej\u0119tno\u015bci, musisz kopa\u0107 z kilofem w d\u0142oni. Tylko niekt\u00f3re bloki zapewniaj\u0105 XP . -Guides.Mining.Section.1=&3Kompatybilne Minera\u0142y:\n&eKamie\u0144, Ruda W\u0119gla, Ruda \u017belaza, Ruda Z\u0142ota, Ruda Diamentu, Ruda Redstone,\n&eRuda Lapisu, Obsydian, Zamszony Bruk, Kamie\u0144 Endu,\n&eJasnog\u0142az, i Netherrack. -Guides.Mining.Section.2=&3Jak u\u017cy\u0107 Super Niszczyciela:\n&eKliknij prawy przycisk z kilofem w r\u0119ce, aby aktywowa\u0107 Super Niszczyciel.\n&eGdy znajdziesz si\u0119 w tym stanie, masz oko\u0142o 4 sekund na kontakt z materia\u0142ami kompatybilnymi z Wykopalisko, aktywuje to Super Niszczyciel. -Guides.Mining.Section.3=&3Co to Super Niszczyciel?\n&eSuper Niszczyciel to umiej\u0119tno\u015b\u0107, kt\u00f3rej czas odnowienia jest powi\u0105zany z umiej\u0119tno\u015bci\u0105 G\u00f3rnictwo. Potroi szans\u0119 na upuszczenie dodatkowych przedmiot\u00f3w i umo\u017cliwia natychmiastowe niszczenie przy wydobywaniu materia\u0142\u00f3w. -Guides.Mining.Section.4=&3Jak u\u017cy\u0107 Podm\u00f3ch G\u00f3rnictwa:\n&eZ kilofem w d\u0142oni kucnij i kliknij prawym przyciskiem myszy na TNT z daleka. Spowoduje to natychmiastow\u0105 eksplozj\u0119 TNT. -Guides.Mining.Section.5=&3Jak dzia\u0142\u0105 Podm\u00f3ch G\u00f3rnictwa?\n&ePodm\u00f3ch G\u00f3rnictwa to umiej\u0119tno\u015b\u0107, kt\u00f3rej czas odnowienia jest powi\u0105zany z umiej\u0119tno\u015bci\u0105 G\u00f3rnictwo. Daje bonusy podczas wydobywania z TNT i pozwala zdalnie zdetonowa\u0107 TNT. Podm\u00f3ch G\u00f3rnictwa sk\u0142ada si\u0119 z trzech cz\u0119\u015bci. Pierwsza cz\u0119\u015b\u0107 to Wi\u0119ksze Bomby, kt\u00f3ra zwi\u0119ksza zasi\u0119g ra\u017cenia. Druga to Eksportyza Rozbi\u00f3rki, kt\u00f3ra zmniejsza obra\u017cenia od wybuch\u00f3w TNT. Trzecia cz\u0119\u015b\u0107 po prostu zwi\u0119ksza ilo\u015b\u0107 rud zrzucanych z trotylu i zmniejsza ilo\u015b\u0107 upuszczanych gruzu. +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\u017cliwia u\u017cycie \u017celaznego bloku do naprawy zbroi i narz\u0119dzi .\n\n&3ZDOBYWANIE XP:\n&eNapraw narz\u0119dzia lub zbroj\u0119 za pomoc\u0105 kowad\u0142a mcMMO. Jest to domy\u015blnie \u017celazny blok i nie nale\u017cy go myli\u0107 z kowad\u0142em Vanilla. -Guides.Repair.Section.1=&3Jak naprawia\u0107 w mcMMO?\n&ePo\u0142\u00f3\u017c kowad\u0142o mcMMO i kliknij prawym przyciskiem myszy, aby naprawi\u0107 przedmiot, kt\u00f3ry aktualnie trzymasz. Przy ka\u017cdym u\u017cyciu zu\u017cywa 1 przedmiot (Na przyk\u0142ad przy \u017celaznych narz\u0119dziach zu\u017cyje jedno \u017celazo). -Guides.Repair.Section.2=&3Jak dzia\u0142a Mistrz Napraw?\n&ePoziom Mistrza Napraw zwi\u0119ksza si\u0119 wraz z naprawianymi przedmiotami. Dodatkow\u0105 przywr\u00f3con\u0105 wytrzyma\u0142o\u015b\u0107 zale\u017cy od poziomu Naprawianie. -Guides.Repair.Section.3=&3Jak dzia\u0142a Super Naprawa?\n&eSuper Naprawa to umiej\u0119tno\u015b\u0107 pasywna. Podczas naprawy przedmiotu daje graczom szans\u0119 na naprawienie przedmiotu z podw\u00f3jn\u0105 skuteczno\u015bci\u0105. -Guides.Repair.Section.4=&3Jak dzia\u0142a Tajemne Fa\u0142szowanie?\n&eTa pasywna umiej\u0119tno\u015b\u0107 pozwala naprawia\u0107 przedmioty z pewn\u0105 szans\u0105 na utrzymanie zakl\u0119\u0107. Zakl\u0119cia mog\u0105 pozosta\u0107 na dotychczasowych poziomach, zdegradowane do ni\u017cszych lub ca\u0142kowicie utracone. +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\u015bci\u0142e\u015b odzyskiwanie pozwala ci u\u017cy\u015b z\u0142otego bloku do odzyskania zbroi i narz\u0119dzi..\n\n&3ZDOBYWANIE XP:\n&eOdzyskiwanie to umiej\u0119tno\u015b\u0107 podrz\u0119dna Naprawy i W\u0119dkarstwa, wi\u0119c Tw\u00f3j poziom umiej\u0119tno\u015bci Odzyskiwania jest oparty na twoich poziomach umiej\u0119tno\u015bci W\u0119dkarstwa i Naprawy. -Guides.Salvage.Section.1=&3Jak u\u017cwa\u0107 Odzyskiwanie?\n&ePo\u0142\u00f3\u017c kowad\u0142o mcMMO (tj. z\u0142oty blok) i kliknij prawym przyciskiem myszy, aby odzyska\u0107 przedmioty z narz\u0119dzia, kt\u00f3ry aktualnie trzymasz. Spowoduje to zniszczenie przedmiotu i zwr\u00f3cenie materia\u0142\u00f3w u\u017cytych do wytworzenia przedmiotu. -Guides.Salvage.Section.2=&3Jak dzia\u0142a Zaawansowane Odzyskiwanie?\n&ePo odblokowaniu umiej\u0119tno\u015b\u0107 ta pozwala na odzyskanie uszkodzonych przedmiot\u00f3w. Procent zysku ro\u015bnie wraz ze wzrostem poziomu. Wy\u017csza wydajno\u015b\u0107 oznacza, \u017ce mo\u017cna odzyska\u0107 wi\u0119cej materia\u0142\u00f3w. Dzi\u0119ki zaawansowanemu odzyskowi zawsze otrzymasz 1 materia\u0142 z powrotem, chyba \u017ce przedmiot jest zbyt uszkodzony. Nie musisz wi\u0119c martwi\u0107 si\u0119 o niszczenie przedmiot\u00f3w, nie otrzymuj\u0105c niczego w zamian. -Guides.Salvage.Section.3=&3Aby pokaza\u0107 przyk\u0142ad, tutaj go opisujemy:\n&ePowiedzmy, \u017ce odzyskujemy z\u0142oty kilof, kt\u00f3ry jest uszkodzony o 20%, co oznacza, \u017ce maksymalna kwota, jak\u0105 mo\u017cesz zdoby\u0107, to tylko 2 (poniewa\u017c kilof jest tworzony z 3 sztabek - ka\u017cdy wart 33,33% wytrzyma\u0142o\u015bci), co jest r\u00f3wne 66% . Je\u015bli Tw\u00f3j procent wytrzyma\u0142o\u015bci jest ni\u017cszy ni\u017c 66%, nie jeste\u015b w stanie uzyska\u0107 2 sztabek. Je\u015bli jest powy\u017cej tej warto\u015bci, mo\u017cesz uzyska\u0107 „pe\u0142n\u0105 kwot\u0119”, co oznacza, \u017ce otrzymasz 2 sztabki. -Guides.Salvage.Section.4=&3Jak dzia\u0142a Tajemne Odzyskiwanie?\n&eTa umiej\u0119tno\u015b\u0107 pozwala zdoby\u0107 zakl\u0119te ksi\u0105\u017cki podczas odzyskiwania zakl\u0119tych przedmiot\u00f3w. W zale\u017cno\u015bci od twojego poziomu, szansa na pomy\u015blne wyodr\u0119bnienie pe\u0142nego lub cz\u0119\u015bciowego zakl\u0119cia jest r\u00f3\u017cna.\n\n&eKiedy zakl\u0119cie zostanie cz\u0119\u015bciowo wydobyte, ksi\u0119ga zakl\u0119\u0107 b\u0119dzie mia\u0142a ni\u017cszy poziom zakl\u0119cia w por\u00f3wnaniu z tym, co znajdowa\u0142o si\u0119 na przedmiocie. +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\u00f3tce... +Guides.Smelting.Section.0=Wkrótce... ##Swords -Guides.Swords.Section.0=&3O Mieczach:\n&eTa umiej\u0119tno\u015b\u0107 zapewnia premie bojowe ka\u017cdemu, kto walczy mieczem..\n\n&3ZDOBYWANIE XP:\n&eXP jest zdobywane w oparciu o ilo\u015b\u0107 obra\u017ce\u0144 zadanych mobom lub innym graczom, gdy dzier\u017cysz miecz. . -Guides.Swords.Section.1=&3Jak dzia\u0142aj\u0105 Z\u0105bkowane Uderzenia?\n&eZ\u0105bkowane Uderzenia to umiej\u0119tno\u015b\u0107 aktywna, kt\u00f3r\u0105 mo\u017cna aktywowa\u0107, klikaj\u0105c prawym przyciskiem myszy mieczem. Ta umiej\u0119tno\u015b\u0107 pozwala na zadanie trafienia obszarowego. Ten obszar dzia\u0142ania zadaje dodatkowe 25% obra\u017ce\u0144 i wywo\u0142a efekt krwawienia trwaj\u0105cy 5 tik\u00f3w. -Guides.Swords.Section.2=&3Jak dzia\u0142a Kontraatak?\n&eKontratak to aktywna umiej\u0119tno\u015b\u0107. Podczas blokowania i przyjmowania trafie\u0144 od mob\u00f3w, b\u0119dziesz mia\u0142 szans\u0119 odbi\u0107 50% otrzymanych obra\u017ce\u0144. -Guides.Swords.Section.3=&3Jak dzia\u0142a Rozerwanie?\n&eRozerwanie powoduje, \u017ce wrogowie otrzymuj\u0105 obra\u017cenia co dwie sekundy. Cel b\u0119dzie krwawi\u0142 do momentu ust\u0105pienia efektu lub \u015bmierci, w zale\u017cno\u015bci od tego, co nast\u0105pi wcze\u015bniej. Poziom umiej\u0119tno\u015bci Miecze zwi\u0119ksza czas trwania krwawienia. +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\u00f3\u017cne bonusy bojowe podczas u\u017cywania oswojonych wilk\u00f3w.\n\n&3ZDOBYWANIE XP:\n&eAby zdoby\u0107 XP w tej umiej\u0119tno\u015bci, musisz oswoi\u0107 wilki lub oceloty i wyruszy\u0107 do walki ze swoimi sprzymierze\u0144cami. -Guides.Taming.Section.1=&3Jak dzia\u0142a Zew Natury?\n&eZew Natury to aktywna umiej\u0119tno\u015b\u0107, kt\u00f3ra pozwoli ci przywo\u0142a\u0107 wilka lub ocelota do swojego boku. Mo\u017cesz to zrobi\u0107 kucaj\u0105c (shift) + klikni\u0119cie lewym przyciskiem myszy, trzymaj\u0105c ko\u015bci lub ryb\u0119. -Guides.Taming.Section.2=&3Jak dzia\u0142a Wiedza Bestii?\n&eWiedza Bestii pozwala graczom na zbadanie zwierzak\u00f3w i sprawdzanie stanu wilk\u00f3w i ocelot\u00f3w. Kliknij lewym przyciskiem myszy na wilka lub ocelota, aby u\u017cy\u0107 Wiedzy Bestii. -Guides.Taming.Section.3=&3How does Gore work?\n&eKrwawienie to pasywna umiej\u0119tno\u015b\u0107, kt\u00f3ra ma szans\u0119 wywo\u0142a\u0107 efekt krwawienia na celach przez Twoich wilk\u00f3w. -Guides.Taming.Section.4=&3Jak dzia\u0142aj\u0105 Zaostrzone Pazury?\n&eZaostrzone Pazury zapewnia premi\u0119 do obra\u017ce\u0144 zadawanych przez wilki. Premia do obra\u017ce\u0144 zale\u017cy od Twojego poziomu Oswajania. -Guides.Taming.Section.5=&3Jak dzia\u0142a Sprzymierzeniec Natury?\n&eTa pasywna umiej\u0119tno\u015b\u0107 pozwoli wilkom teleportowa\u0107 si\u0119 do ciebie, gdy zbli\u017c\u0105 si\u0119 do niebezpiecze\u0144stw, takich jak kaktusy czy lawa. Zapewni tak\u017ce wilkom odporno\u015b\u0107 na obra\u017cenia od upadku. -Guides.Taming.Section.6=&3Jak dzia\u0142a grube futro??\n&eTa pasywna umiej\u0119tno\u015b\u0107 zmniejszy obra\u017cenia i sprawi, \u017ce wilki b\u0119d\u0105 odporne na ogie\u0144. -Guides.Taming.Section.7=&3Jak dzia\u0142a odporno\u015b\u0107 na wstrz\u0105sy?\n&eTa umiej\u0119tno\u015b\u0107 pasywna zmniejsza obra\u017cenia zadawane wilkom od eksplozji. -Guides.Taming.Section.8=&3Jak dzia\u0142a serwis Fast Food??\n&eTa pasywna umiej\u0119tno\u015b\u0107 daje wilkom szans\u0119 na uleczenie si\u0119, gdy wykonaj\u0105 atak. +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. @@ -964,138 +964,138 @@ Guides.Unarmed.Section.3=&3How does Arrow Deflect work?\n&eArrow Deflect is a pa 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\u017cdym razem, gdy niszczysz bloki k\u0142\u00f3d. -Guides.Woodcutting.Section.1=&3Jak dzia\u0142a \u015acinacz Drzew?\n&e\u015cinacz Drzew to aktywna umiej\u0119tno\u015b\u0107, mo\u0107na klikn\u0105\u0107 prawym przyciskiem trzymaj\u0105c siekier\u0119, aby aktywowa\u0107 \u015cinacz Drzew. Spowoduje to natychmiastowe zniszczenie ca\u0142ego drzewa, zrzucaj\u0105c jednocze\u015bnie wszystkie k\u0142ody. -Guides.Woodcutting.Section.2=&3Jak dzia\u0142a Dmuchawa Do Li\u015bci?\n&eDmuchawa do li\u015bci to umiej\u0119tno\u015b\u0107 pasywna, kt\u00f3ra powoduje, \u017ce bloki li\u015bci natychmiast si\u0119 niszcz\u0105 po uderzeniu siekier\u0105. Umiej\u0119tno\u015b\u0107 ta domy\u015blnie odblokowuje si\u0119 na poziomie 100. -Guides.Woodcutting.Section.3=&3Jak dzia\u0142a Podw\u00f3jny \u0141up?\n&eTa pasywna umiej\u0119tno\u015b\u0107 daje ci szans\u0119 na uzyskanie dodatkowego bloku za ka\u017cd\u0105 posiekan\u0105 k\u0142od\u0119. +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\u0144 do sprawdzania graczy offline! +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\u015b za daleko, aby sprawdzi\u0107 tego gracza! +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\u0119 do \u0142\u00f3\u017cka. -Item.ChimaeraWing.NotEnough=Potrzebujesz &e{0}&c wi\u0119cej o &6{1}&c! -Item.NotEnough=Potrzebujesz &e{0}&c wi\u0119cej o &6{1}&c! -Item.Generic.Wait=Musisz odczeka\u0107 zanim ponownie to u\u017cyjesz! &e({0}s) -Item.Injured.Wait=Niedawno by\u0142e\u015b kontuzjowany i musisz poczeka\u0107, zanim to wykorzystasz. &e({0}s) -Item.FluxPickaxe.Name=Topi\u0105cy Kilof +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\u0119... +Teleport.Commencing=&7Rozpoczynanie teleportacji… Przez &6({0}) &7sekund, nie ruszaj się... Teleport.Cancelled=&4Teleportacja anulowana! #SKILLS -Skills.Child=&6(SUB-UMIEJ\u0118TNO\u015aCI) -Skills.Disarmed=&4Zosta\u0142e\u015b rozbrojony! +Skills.Child=&6(SUB-UMIEJĘTNOŚCI) +Skills.Disarmed=&4Zostałeś rozbrojony! Skills.Header=-----[] &a{0}&c []----- -Skills.NeedMore=&4Potrzebujesz wi\u0119cej &7{0} -Skills.NeedMore.Extra=&4Potrzebujesz wi\u0119cej &7{0}{1} -Skills.Parents= UMIEJ\u0118TNO\u015a\u0106 +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\u015b zbyt zm\u0119czony, aby ponownie u\u017cy\u0107 tej zdolno\u015bci. &e({0}s) +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\u0119tno\u015bci - {1} +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\u0107 &6{0}&a. Lewy, aby anulowa\u0107. -Skills.AbilityGateRequirementFail=&7Potrzebujesz wi\u0119kszy poziom o &e{0}&7, aby u\u017cy\u0107 super umiej\u0119tno\u015b\u0107 &3{1}&7. +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\u0118TNO\u015aCI WALKI=- -Stats.Header.Gathering=&6-=ZBI\u00d3R UMIEJ\u0118TNO\u015aCI=- -Stats.Header.Misc=&6-=R\u00d3\u017bNE UMIEJ\u0118TNO\u015aCI=- +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\u015bwiadczenie -Perks.XP.Desc=Otrzymuj zwi\u0119kszone XP w niekt\u00f3rych wiadomo\u015bciach. -Perks.Lucky.Name=Szcz\u0119\u015bcie -Perks.Lucky.Desc=Daje {0} umiej\u0119tno\u015bci i zdolno\u015bci o 33.3% wi\u0119kszej szansy na aktywacje. -Perks.Lucky.Desc.Login=Daje niekt\u00f3rym umiej\u0119tno\u015bciom i zdolno\u015bciom o 33,3% wi\u0119ksz\u0105 szans\u0119 na aktywacj\u0119. -Perks.Lucky.Bonus=&6 ({0} z perkiem Szcz\u0119\u015bcie) -Perks.Cooldowns.Name=Szybki powr\u00f3t do zdrowia +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\u0142o\u015b\u0107 -Perks.ActivationTime.Desc=Zwi\u0119ksza czas aktywacji umiej\u0119tno\u015bci o {0} sekund. -Perks.ActivationTime.Bonus=&6 ({0}s z perkiem Wytrzyma\u0142o\u015b\u0107) +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\u0142\u0105czony dla {1}. -Hardcore.Mode.Enabled=&6[mcMMO] Hardcore mode {0} w\u0142\u0105czony dla {1}. +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\u0142e\u015b/a\u015b &9{0}&4 poziom\u00f3w przez \u015bmier\u0107. -Hardcore.DeathStatLoss.PercentageChanged=&6[mcMMO] Procent utraty statystyk zosta\u0142 zmieniony na {0}. +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\u0142/a zbyt niewykwalifikowany, aby udzieli\u0107 ci jakiejkolwiek wiedzy. -Hardcore.Vampirism.Killer.Success=&6[mcMMO] &3Ukrad\u0142e\u015b/a\u015b &9{0}&3 poziom\u00f3w od &e{1}. -Hardcore.Vampirism.Victim.Failure=&6[mcMMO] &e{0}&7 nie by\u0142 wstanie Ci ukra\u015b\u0107 umiej\u0119tno\u015bci! -Hardcore.Vampirism.Victim.Success=&6[mcMMO] &e{0}&4 ukrad\u0142/a &9{1}&4 poziom\u00f3w od Ciebie! -Hardcore.Vampirism.PercentageChanged=&6[mcMMO] Procent wampiryzmu zosta\u0142 zmieniony na {0}. +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\u0142\u0105czony: &4{0} +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\u0107 Sztuk\u0119 -Smelting.SubSkill.UnderstandingTheArt.Description=Mo\u017ce sp\u0119dzasz za du\u017co czasu przepalaj\u0105c rudy w jaskini.\nTa umiej\u0119tno\u015b\u0107 wzmacnia r\u00f3\u017cne w\u0142a\u015bciwo\u015bci wytapiania. -Smelting.SubSkill.UnderstandingTheArt.Stat=Mno\u017cnik XP z piecyk\u00f3w: &e{0}x -Smelting.Ability.Locked.0=ZABLOKOWANE DO {0}+ UMIEJ\u0118TNO\u015a\u0106 (WZMOCNIEENIE XP VANILLA) -Smelting.Ability.Locked.1=ZABLOKOWANE DO {0}+ UMIEJ\u0118TNO\u015a\u0106 (G\u00d3RNICZE PRZEPALANIE) -Smelting.SubSkill.FuelEfficiency.Name=Efektywno\u015b\u0107 Paliwa -Smelting.SubSkill.FuelEfficiency.Description=Zwi\u0119ksza czas po jakim spala si\u0119 paliwo u\u017cywane w piecyku. -Smelting.SubSkill.FuelEfficiency.Stat=Mno\u017cnik efektywno\u015bci paliwa: &e{0}x -Smelting.SubSkill.SecondSmelt.Name=Podw\u00f3jne przepalanie +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\u0119ksza XP dostawane za przepalanie w piecykach -Smelting.SubSkill.FluxMining.Name=G\u00f3rnicze Przepalanie +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\u017cytkownika -Commands.Description.adminchat=W\u0142\u0105cz/wy\u0142\u0105cz czat administratora mcMMO lub wysy\u0142anie wiadomo\u015bci na czacie administracyjnym +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\u0142\u0105cz/wy\u0142\u0105cz tryb hardcore -Commands.Description.inspect=Wy\u015bwietl szczeg\u00f3\u0142owe informacje mcMMO o innym graczu -Commands.Description.mcability=W\u0142\u0105cz/wy\u0142\u0105cz przygotowywanie umiej\u0119tno\u015bci mcMMO po klikni\u0119ciu prawym przyciskiem myszy -Commands.Description.mccooldown=Zobacz wszystkie czasy odnowienia zdolno\u015bci mcMMO -Commands.Description.mcchatspy=W\u0142\u0105cz/wy\u0142\u0105cz mcMMO spy czat\u00f3w dru\u017cynowych -Commands.Description.mcgod=Prze\u0142\u0105cz mcMMO god-mode: w\u0142\u0105cz/wy\u0142\u0105cz -Commands.Description.mchud=Zmie\u0144 sw\u00f3j styl mcMMO HUD -Commands.Description.mcmmo=Poka\u017c kr\u00f3tki opis mcMMO -Commands.Description.mcnotify=W\u0142\u0105cz/wy\u0142\u0105cz mcMMO wy\u015bwietlanie powiadomie\u0144 o umiej\u0119tno\u015bciach na czacie -Commands.Description.mcpurge=Usu\u0144 u\u017cytkownik\u00f3w bez poziom\u00f3w umiej\u0119tno\u015bci mcMMO i u\u017cytkownik\u00f3w, kt\u00f3rzy nie nawi\u0105zali po\u0142\u0105czenia od ponad {0} miesi\u0119cy z baz\u0105 danych mcMMO. -Commands.Description.mcrank=Poka\u017c ranking mcMMO dla gracza -Commands.Description.mcrefresh=Od\u015bwie\u017c wszystkie czasy odnowienia mcMMO -Commands.Description.mcremove=Usu\u0144 gracza z bazy danych mcMMO -Commands.Description.mcscoreboard=Zarz\u0105dzaj tablic\u0105 wynik\u00f3w mcMMO -Commands.Description.mcstats=Poka\u017c swoje poziomy i XP w mcMMO -Commands.Description.mctop=Poka\u017c tablice lider\u00f3w mcMMO -Commands.Description.mmoedit=Edytuj poziomy mcMMO dla u\u017cytkownika -Commands.Description.mmodebug=Prze\u0142\u0105cz tryb debugowania, kt\u00f3ry wy\u015bwietla przydatne informacje po trafieniu w bloki -Commands.Description.mmoupdate=Przeprowad\u017a migracj\u0119 bazy danych mcMMO ze starej bazy danych do bie\u017c\u0105cej -Commands.Description.mcconvert=Konwertuje typy baz danych lub typy formu\u0142 do\u015bwiadczenia -Commands.Description.mmoshowdb=Poka\u017c nazw\u0119 bie\u017c\u0105cego typu bazy danych (do p\u00f3\u017aniejszego u\u017cycia /mmoupdate) -Commands.Description.party=Kontroluj r\u00f3\u017cne ustawienia dru\u017cyn mcMMO -Commands.Description.partychat=W\u0142\u0105cz / wy\u0142\u0105cz czat grupy mcMMO lub wysy\u0142anie wiadomo\u015bci czatu w grupie -Commands.Description.ptp=Teleportuj si\u0119 do cz\u0142onka dru\u017cyny mcMMO -Commands.Description.Skill=Wy\u015bwietl szczeg\u00f3\u0142owe informacje o umiej\u0119tno\u015bciach mcMMO dla gracza {0} -Commands.Description.skillreset=Zresetuj poziomy mcMMO dla u\u017cytkownika -Commands.Description.vampirism=Zmodyfikuj procent wampiryzmu mcMMO lub w\u0142\u0105cz/wy\u0142\u0105cz tryb wampiryzmu -Commands.Description.xplock=Zablokuj pasek mcMMO XP na okre\u015blonej umiej\u0119tno\u015bci mcMMO -Commands.Description.xprate=Zmie\u0144 ilo\u015b\u0107 mcMMO XP lub rozpocznij wydarzenie mcMMO XP +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\u017cywasz przestarza\u0142ej wersji mcMMO! -UpdateChecker.NewAvailable=Jest nowa wersja dost\u0119pna na Spigot. +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 @@ -1105,39 +1105,39 @@ Scoreboard.Header.PowerLevel=&cPoziom Mocy Scoreboard.Misc.PowerLevel=&6Poziom Poziomu Scoreboard.Misc.Level=&3Poziom Scoreboard.Misc.CurrentXP=&aAktualne XP -Scoreboard.Misc.RemainingXP=&eBrakuj\u0105ce XP +Scoreboard.Misc.RemainingXP=&eBrakujące XP Scoreboard.Misc.Cooldown=&dCzas Odnowienia -Scoreboard.Misc.Overall=&6Og\u00f3lne -Scoreboard.Misc.Ability=Umiej\u0119tno\u015b\u0107 +Scoreboard.Misc.Overall=&6Ogólne +Scoreboard.Misc.Ability=Umiejętność #DATABASE RECOVERY -Profile.PendingLoad=&cTwoja baza danych graczy mcMMO nie zosta\u0142a jeszcze za\u0142adowana. -Profile.Loading.Success=&aTw\u00f3j profil mcMMO zosta\u0142 za\u0142adowany. +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\u00f3g\u0142 za\u0142adowa\u0107 danych odtwarzacza dla &e{0}&c. &dSprawd\u017a konfiguracj\u0119 bazy danych. Pr\u00f3by podj\u0119te do tej pory: {1}. +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\u0119\u015bliwej {0} rocznicy!\n&9Na cze\u015b\u0107 ca\u0142ej pracy nossr50 i wszystkich tw\u00f3rc\u00f3w, oto pokaz sztucznych ogni! +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\u0144 od mcMMO, aby w\u0142\u0105czy\u0107 powiadomienia, uruchom ponownie komend\u0119 /mcnotify. To jest automatyczne przypomnienie godzinowe. +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\u0142adowane! +Locale.Reloaded=&aPliki lokalne przeładowane! #Player Leveling Stuff -LevelCap.PowerLevel=&6(&amcMMO&6) &eOsi\u0105gn\u0105\u0142e\u015b maksymalny poziom mocy wynosz\u0105cy &c{0}&e. Od tego momentu przestaniesz zdobywa\u0107 kolejne poziomy od tej umiej\u0119tno\u015bci. -LevelCap.Skill=&6(&amcMMO&6) &eOsi\u0105gn\u0105\u0142e\u015b maksymalny poziom &c{0}&e dla &6{1}&e. Od tego momentu przestaniesz zdobywa\u0107 kolejne poziomy tej umiej\u0119tno\u015bci. -Commands.XPBar.Usage=Prawid\u0142owe u\u017cycie to /mmoxpbar +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\u015bci lub w pe\u0142ni funkcjonalna. -Compatibility.Layer.Unsupported=&6Kompatybilno\u015b\u0107 dla &a{0}&6 is nie jest wspierana dla tej wersji Minecraft. -Compatibility.Layer.PartialSupport=&6Kompatybilno\u015b\u0107 dla &a{0}&6 nie jest w pe\u0142ni wspierana dla tej wersji Minecraft, ale mcMMO uruchamia dodatkowy system, aby emulowa\u0107 niekt\u00f3re brakuj\u0105ce funkcje. -Commands.XPBar.DisableAll=&6 Wszystkie paski mcMMO XP s\u0105 teraz wy\u0142\u0105czone, u\u017cyj /mmoxpbar reset, aby przywr\u00f3ci\u0107 ustawienia domy\u015blne. +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\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.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\u015bci czatu b\u0119d\u0105 teraz automatycznie dostarczane do kana\u0142u &a{0}&e. -Chat.Channel.Off=&6(&amcMMO-Chat&6) &7Twoje wiadomo\u015bci na czacie nie b\u0119d\u0105 ju\u017c automatycznie dostarczane do okre\u015blonych kana\u0142\u00f3w czatu. -Chat.Spy.Party=&6[&eSPY&6-&a{2}&6] &r{0} &b\u2192 &r{1} -Broadcasts.LevelUpMilestone=&6(&amcMMO&6) {0}&7 osi\u0105gn\u0105\u0142 poziom &a{1}&7 w &3{2}&7! -Broadcasts.PowerLevelUpMilestone=&6(&amcMMO&6) {0}&7 osi\u0105gn\u0105\u0142 poziom mocy &a{1}&7! -Scoreboard.Recovery=Pr\u00f3ba odzyskania tablicy wynik\u00f3w mcMMO... +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 429955868..cb8a98cd3 100644 --- a/src/main/resources/locale/locale_pt_BR.properties +++ b/src/main/resources/locale/locale_pt_BR.properties @@ -1,13 +1,13 @@ #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\u00e7\u00e3o +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\u00edvel necess\u00e1rio +JSON.LevelRequirement=Nível necessário JSON.JWrapper.Target.Type=Tipo do alvo: JSON.JWrapper.Target.Block=Bloco JSON.JWrapper.Target.Player=Jogador @@ -18,12 +18,12 @@ JSON.Acrobatics=Acrobacia JSON.Alchemy=Alquimia JSON.Archery=Arquearia JSON.Axes=Machados -JSON.Excavation=Escava\u00e7\u00e3o +JSON.Excavation=Escavação JSON.Fishing=Pesca JSON.Herbalism=Herbalismo -JSON.Mining=Minera\u00e7\u00e3o -JSON.Repair=Repara\u00e7\u00e3o -JSON.Salvage=Recupera\u00e7\u00e3o +JSON.Mining=Mineração +JSON.Repair=Reparação +JSON.Salvage=Recuperação JSON.Swords=Espadas JSON.Taming=Adestramento JSON.Unarmed=Desarmado @@ -32,11 +32,11 @@ 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\u00ednguas! +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\u00f3ximo aprimoramento no n\u00edvel {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 @@ -51,8 +51,8 @@ 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\u00ea estiver segurando o bot\u00e3o de agachar enquanto cai, pode evitar at\u00e9 o dobro do dano que voc\u00ea normalmente receberia! -Anvil.SingleItemStack=&cVoc\u00ea n\u00e3o pode recuparar ou reparar pilhas de itens com mais de um item, divida a pilha de itens primeiro. +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 @@ -72,10 +72,10 @@ 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\u00edsticas +Commands.Stats.Self.Overhaul=Estatísticas Commands.XPGain.Overhaul=&6XP RECEBIDA: &3{0} -MOTD.Version.Overhaul=&6[mcMMO] &3Vers\u00e3o do plugin&6 - &3{0} -Overhaul.mcMMO.Header=&c[]=====[]&a mcMMO - Vers\u00e3o do plugin &c[]=====[] +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] @@ -85,13 +85,13 @@ Overhaul.Name.Acrobatics=Acrobacia Overhaul.Name.Alchemy=Alquimia Overhaul.Name.Archery=Arquearia Overhaul.Name.Axes=Machados -Overhaul.Name.Excavation=Escava\u00e7\u00e3o +Overhaul.Name.Excavation=Escavação Overhaul.Name.Fishing=Pesca Overhaul.Name.Herbalism=Herbalismo -Overhaul.Name.Mining=Minera\u00e7\u00e3o -Overhaul.Name.Repair=Repara\u00e7\u00e3o -Overhaul.Name.Salvage=Recupera\u00e7\u00e3o -Overhaul.Name.Smelting=Fundi\u00e7\u00e3o +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 @@ -109,13 +109,13 @@ 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\u00e7\u00e3o 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\u00e7\u00e3o Nv.&6{0} -XPBar.Repair=Repara\u00e7\u00e3o Nv.&6{0} -XPBar.Salvage=Recupera\u00e7\u00e3o Nv.&6{0} -XPBar.Smelting=Fundi\u00e7\u00e3o 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} @@ -132,10 +132,10 @@ Acrobatics.SubSkill.Roll.Stats=&6Chance de rolar &e{0}%&6 Chance de rolar gracio 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\u00e1tegicamente para evitar dano. +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 \u00e9 uma sub-habilidade ativa com um componente passivo.\nQuando voc\u00ea sofre dano de queda, voc\u00ea tem a chance de negar completamente o dano baseado no n\u00edvel da sua habilidade, no n\u00edvel &e{6}%&7 voc\u00ea tem &e{0}%&7 de chance de prevenir dano, e &e{1}%&7 se voc\u00ea ativar o rolamento gracioso.\nA chance de sucesso \u00e9 determinado pelo n\u00edvel da sua habilidade em uma curva linear at\u00e9 o n\u00edvel &e{2}&7 que \u00e9 quando ela chega em seu m\u00e1ximo, cada n\u00edvel de Acrobacia te d\u00e1 uma chance de &e{3}%&7 de sucesso.\nSegurando o bot\u00e3o de agachar, voc\u00ea consegue dobrar suas chances de evitar danos de queda e tamb\u00e9m consegue evitar at\u00e9 o dobro do dano de queda! Segurar o bot\u00e3o de agachar ir\u00e1 transformar seu teste normal em um Teste Gracioso.\nRolar ir\u00e1 prevenir at\u00e9 &c{4}&7 de dano. Rolagens graciosas evitar\u00e3o at\u00e9 &a{5}&7 de dano. +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 @@ -146,83 +146,83 @@ Acrobatics.Roll.Text=&o**Rolou** Acrobatics.SkillName=ACROBACIA #ALQUIMIA -Alchemy.SubSkill.Catalysis.Name=Cat\u00e1lise -Alchemy.SubSkill.Catalysis.Description=Aumenta a velocidade de prepara\u00e7\u00e3o da po\u00e7\u00e3o -Alchemy.SubSkill.Catalysis.Stat=Velocidade de prepara\u00e7\u00e3o +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\u00e7\u00f5es com mais ingredientes +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=BLOQUEADO AT\u00c9 CHEGAR NO NÍVEL {0}+ HABILIDADE (CAT\U00e1LISE) +Alchemy.Ability.Locked.0=BLOQUEADO ATÉ CHEGAR NO NÍVEL {0}+ HABILIDADE (CAT\U00e1LISE) Alchemy.SkillName=ALQUIMIA #ARQUEARIA -Archery.SubSkill.SkillShot.Name=Profici\u00eancia em Tiro +Archery.SubSkill.SkillShot.Name=Proficiência em Tiro Archery.SubSkill.SkillShot.Description=Aumenta o dano com o arco -Archery.SubSkill.SkillShot.Stat=B\u00f4nus de dano com Profici\u00eancia em Tiro +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\u00e7\u00e3o de Flechas +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\u00e7\u00e3o de flechas +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\u00edceis. Feito para PVP, Fica a crit\u00e9 das configura\u00e7\u00f5es do servidor se vai ou n\u00e3o aumentar o dano no PVE. -Archery.SubSkill.ArcheryLimitBreak.Stat=DANO m\u00e1ximo com a quebra de limite +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=Maestria com Machado -Axes.Ability.Bonus.1=B\u00f4nus de {0} de dano +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\u00ea abaixou seu Machado. -Axes.Ability.Ready=&7Voc\u00ea est\u00e1 com seu Machado &6pronto. -Axes.Ability.Ready.Extra=&3Você &6est\u00e1 com seu&3 Machado pronto. &7({0} está em recarga por {1}s) -Axes.Combat.CritStruck=&4Voc\u00ea recebey um dano CR\u00cdTICO! -Axes.Combat.CriticalHit=&cDANO CRIT\u00cdCO! -Axes.Combat.GI.Proc=&a**GOLPEADO COM UMA GRANDE FOR\u00c7A** +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\u00c2NIO! -Axes.SubSkill.SkullSplitter.Name=Racha Cr\u00e2nio -Axes.SubSkill.SkullSplitter.Description=Deu dano em \u00e1rea -Axes.SubSkill.SkullSplitter.Stat=Dura\u00e7\u00e3o do Racha Cr\u00e2nio -Axes.SubSkill.CriticalStrikes.Name=Golpes cr\u00edticos +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\u00edtico +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\u00edceis. Feito para PVP, Fica a crit\u00e9 das configura\u00e7\u00f5es do servidor se vai ou n\u00e3o aumentar o dano no PVE. -Axes.SubSkill.AxesLimitBreak.Stat=DANO m\u00e1ximo com a quebra de limite +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\u00e7a suficiente para quebrar 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=**Racha Cr\u00e2nio foi desativado** -Axes.Skills.SS.On=&a**Racha Cr\u00e2nio ATIVADO** -Axes.Skills.SS.Refresh=&aSua habilidade &eRacha Cr\u00e2nio &afoi recarregada! -Axes.Skills.SS.Other.Off=Racha Cr\u00e2nio&a foi desativada por &e{0} -Axes.Skills.SS.Other.On=&a{0}&2 usou &cRacha Cr\u00e2nio! +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! #ESCAVAÇÃO -Excavation.Ability.Lower=&7Voc\u00ea abaixou sua p\u00e1. -Excavation.Ability.Ready=Voc\u00ea est\u00e1 com a sua p\u00e1 &6pronta.&3 +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\u00e7\u00e3o da Super Broca +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\u00edvel alto dessa habilidade aumenta as suas chances de encontrar orbes de experi\u00eancia ao encontrar um tesouro! -Excavation.SubSkill.Archaeology.Stat=Chance de orbes de experi\u00eancia de Arqueologia -Excavation.SubSkill.Archaeology.Stat.Extra=Quantidade de orbes de experi\u00eancia de Arqueologia -Excavation.Listener=Escava\u00e7\u00e3o: -Excavation.SkillName=ESCAVA\u00c7\u00c3O +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! @@ -230,21 +230,21 @@ Excavation.Skills.GigaDrillBreaker.Other.Off=Super Broca&a foi desativada por &e Excavation.Skills.GigaDrillBreaker.Other.On=&a{0}&2 usou &cSuper Broca! #PESCA -Fishing.ScarcityTip=&e&oEsta \u00e1rea est\u00e1 sofrendo de pesca excessiva, pesque em outro lugar para pegar mais peixes. No min\u00edmo {0} blocos de dist\u00e2ncia. -Fishing.Scared=&7&oMovimentos ca\u00f3ticos ir\u00e3o assustar os peixes! -Fishing.Exhausting=&c&oUso impr\u00f3prio da vara de pesca vai causar fadiga e ir\u00e1 desgastar a vara! -Fishing.LowResourcesTip=&7Voc\u00ea sente que talvez n\u00e3o tenha muitos peixes sobrando nessa \u00e1rea. Tente pescar \u00e0 no m\u00ednimo {0} blocos de dist\u00e2ncia. -Fishing.Ability.Info=Ca\u00e7ador M\u00e1gico: &7 **Aumenta com o rank de Ca\u00e7ador de Tesouros** -Fishing.Ability.Locked.0=BLOQUEADO AT\u00c9 CHEGAR NO N\u00cdVEL {0}+ HABILIDADE (SACUDIR) -Fishing.Ability.Locked.1=BLOQUEADO AT\u00c9 CHEGAR NO N\u00cdVEL {0}+ HABILIDADE (PESCA NO GELO) -Fishing.Ability.Locked.2=BLOQUEADO AT\u00c9 CHEGAR NO N\u00cdVEL {0}+ HABILIDADE (MESTRE PESCADOR) -Fishing.SubSkill.TreasureHunter.Name=Ca\u00e7ador de Tesouros +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\u00e7ador 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\u00c9pico{3} &6Lend\u00e1rio: &e{4} &bM\u00edstico: &e{5} -Fishing.SubSkill.MagicHunter.Name=Ca\u00e7ador M\u00e1gico +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\u00e7ador M\u00e1gico +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 @@ -253,32 +253,32 @@ Fishing.SubSkill.FishermansDiet.Description=Aumenta a fome restaurada de comidas 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\u00e7\u00e3o de tempo de espera m\u00ednima do peixe: &a-{0} segundos -Fishing.SubSkill.MasterAngler.Stat.Extra=Redu\u00e7\u00e3o de tempo de espera m\u00e1xima do peixe: &a-{0} segundos +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\u00f4nus de chuva +Fishing.Chance.Raining=&9 Bônus de chuva Fishing.Listener=Pesca: -Fishing.Ability.TH.MagicFound=&7voc\u00ea sente um toque de m\u00e1gica com essa fisgada... +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\u00e3o cheira bem... +Fishing.Ability.TH.Poison=&7Algo não cheira bem... Fishing.SkillName=PESCA #HERBALISMO -Herbalism.Ability.GTe.NeedMore=Voc\u00ea precisa de mais sementes para espalhar Terra Verde. +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\u00ea abaixou sua enxada. -Herbalism.Ability.Ready=&3Voc\u00ea est\u00e1 com a sua enxada &6pronta. +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\u00e7\u00e3o da Terra 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\u00e1gio do Polegar Verde: &a Planta\u00e7\u00f5es crescem no est\u00e1gio {0} +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 @@ -288,12 +288,12 @@ 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\u00e1 uma pequena chance de encontrar itens raros +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\u00e1 com voc\u00ea hoje! +Herbalism.HylianLuck=&aA sorte de Hylian está com você hoje! Herbalism.Listener=Herbalismo: Herbalism.SkillName=HERBALISMO Herbalism.Skills.GTe.Off=**Terra Verde foi desativada** @@ -303,29 +303,29 @@ Herbalism.Skills.GTe.Other.Off=Terra Verde&a foi desativada por &e{0} Herbalism.Skills.GTe.Other.On=&a{0}&2 usou &cTerra Verde! #MINERAÇÃO -Mining.Ability.Locked.0=BLOQUEADO AT\u00c9 CHEGAR NO N\u00cdVEL {0}+ HABILIDADE (MINERA\u00c7\u00c3O EXPLOSIVA) -Mining.Ability.Locked.1=BLOQUEADO AT\u00c9 CHEGAR NO N\u00cdVEL {0}+ HABILIDADE (BOMBAS MAIORES) -Mining.Ability.Locked.2=BLOQUEADO AT\u00c9 CHEGAR NO N\u00cdVEL {0}+ HABILIDADE (ESPECIALISTA EM DEMOLI\u00c7\u00c3O) -Mining.Ability.Lower=&7Voc\u00ea abaixou sua picareta. -Mining.Ability.Ready=&3Voc\u00ea est\u00e1 com a sua picareta &6pronta. +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\u00e7\u00e3o da Super Quebra +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\u00e7\u00e3o Explosiva -Mining.SubSkill.BlastMining.Description=B\u00f4nus ao minerar com TNT -Mining.SubSkill.BlastMining.Stat=Minera\u00e7\u00e3o Explosiva:&a Rank {0}/{1} &7({2}) -Mining.SubSkill.BlastMining.Stat.Extra=Aumenta o raio das explos\u00f5es: &a+{0} +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\u00f5es de TNT -Mining.SubSkill.DemolitionsExpertise.Name=Especialista em Demoli\u00e7\u00e3o -Mining.SubSkill.DemolitionsExpertise.Description=Diminui o dano recebido por explos\u00f5es de TNT -Mining.SubSkill.DemolitionsExpertise.Stat=Diminui\u00e7\u00e3o de dano do Especialista em Demoli\u00e7\u00e3o +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 -Mining.Listener=Minera\u00e7\u00e3o: -Mining.SkillName=MINERA\u00c7\u00c3O +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} @@ -335,18 +335,18 @@ Mining.Skills.SuperBreaker.Refresh=&aSua habilidade &eSuper Quebra &afoi recarre #Mineração Explosiva Mining.Blast.Boom=&7**BOOM** Mining.Blast.Cooldown= -Mining.Blast.Effect=+{0} min\u00e9rios de rendimento, {1}x drops -Mining.Blast.Other.On=&a{0}&2 usou &cMinera\u00e7\u00e3o Explosiva! -Mining.Blast.Refresh=&aSua habilidade &eMinera\u00e7\u00e3o Explosiva &afoi recarregada! +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! #REPARAÇÃO -Repair.SubSkill.Repair.Name=Repara\u00e7\u00e3o +Repair.SubSkill.Repair.Name=Reparação Repair.SubSkill.Repair.Description=Repara ferramentas e armaduras -Repair.SubSkill.GoldRepair.Name=Repara\u00e7\u00e3o de Ouro ({0}+ HABILIDADE) +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\u00e7\u00e3o de Ferro ({0}+ HABILIDADE) +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\u00e7\u00e3o de pedra ({0}+ HABILIDADE) +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 @@ -357,65 +357,65 @@ 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\u00e1gicos +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\u00e7\u00e3o: -Repair.SkillName=REPARA\u00c7\u00c3O -Repair.Skills.AdeptDiamond=&4Voc\u00ea não tem habilidade o suficiente para reparar Diamante. -Repair.Skills.AdeptGold=&4Voc\u00ea não tem habilidade o suficiente para reparar Ouro. -Repair.Skills.AdeptIron=&4Voc\u00ea não tem habilidade o suficiente para reparar Ferro. -Repair.Skills.AdeptStone=&4Voc\u00ea não tem habilidade o suficiente para reparar Pedra. -Repair.Skills.Adept=&cVoc\u00ea deve estar no n\u00edvel &e{0}&c para reparar &e{1} -Repair.Skills.FeltEasy=&7Isso pareceu f\u00e1cil. -Repair.Skills.FullDurability=&7Isso j\u00e1 est\u00e1 com durabilidade m\u00e1xima. -Repair.Skills.StackedItems=&4Voc\u00ea n\u00e3o pode reparar itens empilhados. -Repair.Pretty.Name=Repara\u00e7\u00e3o +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 #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\u00ea n\u00e3o foi habilidoso o suficiente para manter os encantamentos. -Repair.Arcane.Perfect=&aVoc\u00ea manteve as energias arcanas neste 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\u00e7\u00e3o +Salvage.Pretty.Name=Recuperação Salvage.SubSkill.UnderstandingTheArt.Name=Entendendo a Arte -Salvage.SubSkill.UnderstandingTheArt.Description=Voc\u00ea n\u00e3o est\u00e1 s\u00f3 vasculhando o lixo de seus vizinhos, mas tamb\u00e9m est\u00e1 cuidando do meio ambiente.\nAumenta v\u00e1rias propriedades de Recupera\u00e7\u00e3o. +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\u00e7\u00e3o perfeita depende de habilidade e sorte. +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\u00e7\u00e3o Arcana +Salvage.SubSkill.ArcaneSalvage.Name=Recuperação Arcana Salvage.SubSkill.ArcaneSalvage.Description=Extrai encantamentos de um item -Salvage.SubSkill.ArcaneSalvage.Stat=Recupera\u00e7\u00e3o Arcana: &eRank {0}/{1} +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\u00ea n\u00e3o \u00e9 habilidoso o suficiente para recuperar itens danificados. -Salvage.Skills.Adept.Level=Voc\u00ea deve estar no n\u00edvel &e{0}&c para recuperar &e{1} -Salvage.Skills.TooDamaged=&4Esse item est\u00e1 muito danificado para ser recuperado. -Salvage.Skills.ArcaneFailed=&cVoc\u00ea n\u00e3o conseguiu extrair o conhecimento contido dentro deste item. -Salvage.Skills.ArcanePartial=&cVoc\u00ea s\u00f3 conseguiu extrair um pouco do conhecimento contido dentro deste item. -Salvage.Skills.ArcaneSuccess=&aVoc\u00ea conseguiu extrair todo o conhecimento contido dentro deste item! -Salvage.Listener.Anvil=&4Voc\u00ea colocou uma birgona de recupera\u00e7\u00e3o, use ela para recuperar ferramentas e armaduras. -Salvage.Listener=Recupera\u00e7\u00e3o: -Salvage.SkillName=RECUPERA\u00c7\u00c3O -Salvage.Skills.Lottery.Normal=&6Voc\u00ea conseguiu recuperar &3{0}&6 materiais de &e{1}&6. -Salvage.Skills.Lottery.Perfect=&a&lPerfeito!&r&6 Voc\u00ea recuperou &3{1}&6 sem esfoço algum, reavendo &3{0}&6 materiais. -Salvage.Skills.Lottery.Untrained=&7Voc\u00ea n\u00e3o est\u00e1 bem treinado em recupera\u00e7\u00e3o. S\u00f3 conseguiu recuperar &c{0}&7 materiais de &a{1}&7. +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 \u00e9 inquebrav\u00e9l! +Anvil.Unbreakable=Este item é inquebravél! #ESPADAS -Swords.Ability.Lower=&7Voc\u00ea abaixou sua espada. -Swords.Ability.Ready=&3Voc\u00ea est\u00e1 com a sua espada &6pronta. -Swords.Combat.Rupture.Note.Update.One=&7(Nota de ruptura): O dano peri\u00f3dico n\u00e3o \u00e9 letal, acontece duas vezes por segundo e ignora armadura -Swords.Combat.Bleeding.Started=&4 Voc\u00ea est\u00e1 sangrando! +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! @@ -425,18 +425,18 @@ 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\u00e1 uma parte do dano em \u00e1rea com chance de aplicar Ruptura! -Swords.SubSkill.SerratedStrikes.Stat=Dura\u00e7\u00e3o dos 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\u00edceis. Feito para PVP, Fica a crit\u00e9 das configura\u00e7\u00f5es do servidor se vai ou n\u00e3o aumentar o dano no PVE. -Swords.SubSkill.SwordsLimitBreak.Stat=DANO m\u00e1ximo da Quebra de Limite +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\u00e7\u00e3o da Ruptura: &e{0}s&a vs Jogadores, &e{1}s&a vs Mobs. +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+ @@ -450,116 +450,116 @@ Swords.Skills.SS.Other.Off=Ataques Cortantes&a foi desligado por &e{0} Swords.Skills.SS.Other.On=&a{0}&2 usou &cAtaques Cortantes! #ADESTRAMENTO -Taming.Ability.Bonus.0=Consci\u00eancia Ambiental +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\u00eancia ao fogo -Taming.Ability.Bonus.4=Resist\u00eanCIA a impactos -Taming.Ability.Bonus.5=Explosivos d\u00e3o 1/{0} do dano normal +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} Dano -Taming.Ability.Bonus.8=Servi\u00e7o de Fast Food +Taming.Ability.Bonus.8=Serviço de Fast Food Taming.Ability.Bonus.9={0} Chance de curar ao atacar -Taming.Ability.Bonus.10=C\u00e3o Piedoso -Taming.Ability.Bonus.11=Recupere vida ao tomar dano m\u00e1gico ou por veneno -Taming.Ability.Locked.0=BLOQUEADO AT\u00c9 CHEGAR NO N\u00cdVEL {0}+ HABILIDADE (CONSCI\u00caNCIA AMBIENTAL) -Taming.Ability.Locked.1=BLOQUEADO AT\u00c9 CHEGAR NO N\u00cdVEL {0}+ HABILIDADE (PELO GROSSO) -Taming.Ability.Locked.2=BLOQUEADO AT\u00c9 CHEGAR NO N\u00cdVEL {0}+ HABILIDADE (RESIST\u00caNCIA A IMPACTOS) -Taming.Ability.Locked.3=BLOQUEADO AT\u00c9 CHEGAR NO N\u00cdVEL {0}+ HABILIDADE(GARRAS AFIADAS) -Taming.Ability.Locked.4=BLOQUEADO AT\u00c9 CHEGAR NO N\u00cdVEL {0}+ HABILIDADE (SERVI\u00c7O DE FAST FOOD) -Taming.Ability.Locked.5=BLOQUEADO AT\u00c9 CHEGAR NO N\u00cdVEL {0}+ HABILIDADE (C\u00c3O PIEDOSO) +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\u00eancia a impactos -Taming.SubSkill.ShockProof.Description=Redu\u00e7\u00e3o de dano de explosivo +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\u00e3o direito com\n {0} {1} (Jaguatirica), {2} {3} (Lobo), {4} {5} (Cavalo) -Taming.SubSkill.FastFoodService.Name=Servi\u00e7o de Fast Food +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\u00e3o Piedoso +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\u00edtico que aplica Ruptura +Taming.SubSkill.Gore.Description=Ataque crítico que aplica Ruptura Taming.SubSkill.SharpenedClaws.Name=Garras Afiadas -Taming.SubSkill.SharpenedClaws.Description=B\u00f4nus de dano -Taming.SubSkill.EnvironmentallyAware.Name=Consci\u00eancia Ambiental -Taming.SubSkill.EnvironmentallyAware.Description=Fobia de Cacto/Lava, Imune \u00e0 dano de queda +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\u00e7\u00e3o de DANO, Resist\u00eancia ao fogo +Taming.SubSkill.ThickFur.Description=Redução de DANO, Resistência ao fogo Taming.SubSkill.Pummel.Name=Patada -Taming.SubSkill.Pummel.Description=Seus lobos t\u00eam chance de repelir inimigos -Taming.SubSkill.Pummel.TargetMessage=Voc\u00ea foi repelido por um lobo! -Taming.Listener.Wolf=&8Seu lobo corre de volta para voc\u00ea... +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\u00ea invocou um &6{0}&7 -Taming.Summon.COTW.Success.WithLifespan=&a(Call Of The Wild) &7Voc\u00ea invocou um &6{0}&7 e ele tem uma dura\u00e7\u00e3o de &6{1}&7 segundos. -Taming.Summon.COTW.Limit=&a(Call Of The Wild) &7Voc\u00ea s\u00f3 pode ter &c{0} &7animais &7{1} invocados ao mesmo tempo. +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\u00ea n\u00e3o pode procriar animais invocados. -Taming.Summon.COTW.NeedMoreItems=&a(Chamado da Natureza) &7Voc\u00ea precisa de &e{0}&7 mais &3{1}&7(s) +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.Bonus.0=Estilo bra\u00e7o de A\u00e7o +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\u00ea ser desarmado! -Unarmed.Ability.Lower=&7Voc\u00ea abaixou seus punhos. -Unarmed.Ability.Ready=&3Voc\u00ea est\u00e1 com seus punhos &6prontos.. -Unarmed.SubSkill.Berserk.Name=F\u00faria -Unarmed.SubSkill.Berserk.Description=+50% de DANO, quebra materiais fr\u00e1geis -Unarmed.SubSkill.Berserk.Stat=Dura\u00e7\u00e3o da F\u00faria +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\u00e3os +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\u00edceis. Feito para PVP, Fica a crit\u00e9 das configura\u00e7\u00f5es do servidor se vai ou n\u00e3o aumentar o dano no PVE. -Unarmed.SubSkill.UnarmedLimitBreak.Stat=Dano m\u00e1ximo da quebra de limite -Unarmed.SubSkill.SteelArmStyle.Name=Estilo bra\u00e7o de A\u00e7o -Unarmed.SubSkill.SteelArmStyle.Description=Deixa seu bra\u00e7o mais duro com o tempo +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\u00ea seja desarmado +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=**F\u00faria foi desativada** -Unarmed.Skills.Berserk.On=&a**F\u00daRIA ATIVADA** -Unarmed.Skills.Berserk.Other.Off=F\u00faria&a foi desativada por &e{0} +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\u00faria foi recarregada! +Unarmed.Skills.Berserk.Refresh=&aSua &aHabilidade &eFúria foi recarregada! #C0RTE DE ÁRVORE Woodcutting.Ability.0=Soprador de Folhas Woodcutting.Ability.1=Sopra as folhas para longe -Woodcutting.Ability.Locked.0=BLOQUEADO AT\u00c9 CHEGAR NO N\u00cdVEL {0}+ HABILIDADE (SOPRADOR DE FOLHAS) +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 \u00c1rvores -Woodcutting.SubSkill.TreeFeller.Stat=Dura\u00e7\u00e3o do 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 \u00e1rvores -Woodcutting.SubSkill.KnockOnWood.Loot.Rank2=Drop normal de \u00e1rvores e de orbes de experi\u00eancia +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 \u00c1rvore de forma mais efici\u00eante. -Woodcutting.SubSkill.BarkSurgeon.Name=Cirurgi\u00e3o de Tronco -Woodcutting.SubSkill.BarkSurgeon.Description=Extrai materiais \u00fateis ao remover \u00c1rvores. +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\u00eancia da natureza. +Woodcutting.SubSkill.NaturesBounty.Description=Ganhe experiência da natureza. Woodcutting.Listener=Lenhador: Woodcutting.SkillName=Lenhador Woodcutting.Skills.TreeFeller.Off=**Lenhador foi desligado** @@ -567,8 +567,8 @@ 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\u00c7OU EM V\u00c1RIOS PEDA\u00c7OS! -Woodcutting.Skills.TreeFeller.Threshold=Essa \u00c1rvore \u00e9 muito grande! +Woodcutting.Skills.TreeFeller.Splinter=SEU MACHADO SE ESTILHAÇOU EM VÁRIOS PEDAÇOS! +Woodcutting.Skills.TreeFeller.Threshold=Essa Árvore é muito grande! #HABILIDADE @@ -578,54 +578,54 @@ 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\u00e7a do pulo do cavalo (&aMax\u00edmo de {0} blocos&3) +Combat.BeastLoreHorseJumpStrength=&3força do pulo do cavalo (&aMaxímo de {0} blocos&3) Combat.Gore=&a**Mordido** -Combat.StruckByGore=**VOC\u00ca FOI Mordido** -Combat.TargetDazed=Alvo est\u00e1 &4atordoado -Combat.TouchedFuzzy=&4vis\u00e3o turva. Sente tonturas. +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 \u00e9 um &6mod de RPG &cOpen Source &6criado em fevereiro de 2011, &6pelo &9nossr50 &6.O objetivo dele \u00e9 fornecer uma experi\u00eancia de RPG de qualidade. &3Dicas:&6 - &aUse &c/mcmmo help&a para ver os comandos,&6 - &aDigite &c/NOMEDAHABILIDADE&a para ver informa\u00e7\u00f5es detalhadas sobre as habilidades, &3Desenvolvedores:&6 - &anossr50 &9(Criador e L\u00edder do Projeto),&6 - &aelectronicboy &9(Dev),&6 - &akashike &9(Dev),&6 - &at00thpick1 &9(Respons\u00e1vel pela vers\u00e3o cl\u00e1ssica) +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\u00ea foi presenteado com {0} n\u00edveis em todas as habilidades! +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\u00ea foi presenteado com {0} n\u00edveis em {1}! +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\u00ea foi presenteado com {0} de experi\u00eancia em todas as habilidades! -Commands.addxp.AwardSkill=&aVoc\u00ea foi presenteado com {0} de experi\u00eancia em {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\u00f3 para Admins &cDesativado -Commands.AdminChat.On=Chat s\u00f3 para Admins &aAtivado +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\u00ea deve esperar {0} millisegundos antes de usar esse comando de novo. -Commands.Database.Cooldown=Voc\u00ea deve esperar {0} segundos antes de usar esse comando de novo. -Commands.Database.Processing=O comando anterior que voc\u00ea usou ainda est\u00e1 sendo processado. Por favor, aguarde. -Commands.Disabled=Este comando est\u00e1 desabilitado. -Commands.DoesNotExist= &cJogador n\u00e3o existe no banco de dados! +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\u00e3o: &a{0}&6] &f{1} -Commands.GodMode.Forbidden=[mcMMO] God Mode n\u00e3o pode ser usado nesse mundo (Veja as permiss\u00f5es) +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\u00e7\u00f5es&f. +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\u00e1lido! -Commands.Inspect= &a- veja informa\u00e7\u00f5es detalhadas do jogador +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.Leaderboards= &a- Leaderboards Commands.mcgod=&a- GodMod alterado -Commands.mchud.Invalid=Esse n\u00e3o \u00e9 um tipo de HUD v\u00e1lido. +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} @@ -636,32 +636,32 @@ 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\u00edveis de todas suas habilidades foram definidos para {0}! -Commands.mmoedit.Modified.1=&aSeu n\u00edvel em {0} foi definido para {1}! +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\u00ea j\u00e1 est\u00e1 usando o banco de dados {0}! -Commands.mcconvert.Database.InvalidType={0} n\u00e3o \u00e9 um tipo de banco de dados v\u00e1lido. -Commands.mcconvert.Database.Start=&7Come\u00e7\u00e3ndo a convers\u00e3o de {0} para {1}... -Commands.mcconvert.Database.Finish=&7Migra\u00e7\u00e3o de banco de dados conclu\u00edda; o banco de dados {1} agora tem todos os dados do banco de dados {0}. -Commands.mmoshowdb=O banco de dados usado atualmente \u00e9 &a{0} -Commands.mcconvert.Experience.Invalid=Tipo de f\u00f3rmula de xp desconhecida! Os tipos v\u00e1lidos s\u00e3o: &aLINEAR &ce &aEXPONENCIAL. -Commands.mcconvert.Experience.Same=J\u00e1 est\u00e1 usando a f\u00f3rmula {0} -Commands.mcconvert.Experience.Start=&7Come\u00e7\u00e3ndo a convers\u00e3o de {0} para curva {1} -Commands.mcconvert.Experience.Finish=&7Convers\u00e3o de f\u00f3rmula conclu\u00edda; usando agora a curva {0} XP. -Commands.ModDescription=&a- Leia a descri\u00e7\u00e3o resumida do mod -Commands.NoConsole=Este comando n\u00e3o pode ser usado no console. -Commands.Notifications.Off=Notifica\u00e7\u00f5es de habilidade &cdesativada -Commands.Notifications.On=Notifica\u00e7\u00f5es de habilidade &aativada -Commands.Offline=Este comando n\u00e3o funciona para jogadores offline. -Commands.NotLoaded=O perfil do jogador ainda n\u00e3o foi carregada. -Commands.Party.Status=&8NOME: &f{0} {1} &8N\u00cdVEL: &3{2} -Commands.Party.Status.Alliance=&8ALIAN\u00c7A: &f{0} +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\u00ca &3{0}&8/&3{1} +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 @@ -669,77 +669,77 @@ 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\u00ea entrou no grupo {0} +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\u00e1 cheio! -Commands.Party.PartyFull.Invite=Voce n\u00e3o pode convidar &e{0}&c para &a{1}&c porque j\u00e1 tem &3{2}&c jogadores nela! -Commands.Party.PartyFull.InviteAccept=Voc\u00ea n\u00e3o pode entrar em &a{0}&c porque j\u00e1 tem &3{1}&c jogadores nela! +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\u00e1 existe! -Commands.Party.Kick=&cVoc\u00ea foi kickado do grupo &a{0}&c! -Commands.Party.Leave=&eVoc\u00ea saiu do grupo +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\u00ea n\u00e3o est\u00e1 em um grupo. +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\u00c7\u00c3 DO GRUPO&c[]----- +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\u00c7A&c[]----- -Commands.Party.Alliance.Invite.0=ALERTa: &aVoc\u00ea recebeu um convite de alian\u00e7\u00e3 de {0} do grupo {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\u00e7\u00e3 aceito. -Commands.Party.Alliance.None=&cO seu grupo n\u00e3o possui alian\u00e7\u00e3s. -Commands.Party.Alliance.AlreadyAllies=&cSeu grupo j\u00e1 possui uma alian\u00e7\u00e3. desfaça a alian\u00e7\u00e3 digitando &3/party alliance disband -Commands.Party.Alliance.Help.0=&cEsse grupo n\u00e3o possui uma alian\u00e7\u00e3. Convide o l\u00edder do grupo para formar a alian\u00e7\u00e3 -Commands.Party.Alliance.Help.1=&c para um alian\u00e7\u00e3 digitando &3/party alliance invite &c. +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\u00ea n\u00e3o possui pedidos de teletransporte no momento -Commands.ptp.NoWorldPermissions=&c[mcMMO] Voc\u00ea n\u00e3o tem permiss\u00e3o para teletransportar para o mundo {0}. -Commands.ptp.Request1=&e{0} &asolicitou teletransporte para voc\u00ea. +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\u00e7\u00e3o de teletransporte de grupo &aativado -Commands.ptp.AcceptAny.Disabled=Confirma\u00e7\u00e3o de teletransporte de grupo &cdesativado +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\u00edvel de Poder-- -Commands.PowerLevel.Capped=&4N\u00cdVEL DE PODER: &a{0} &4N\u00cdVEL M\u00c1XIMO: &e{1} -Commands.PowerLevel=&4N\u00cdVEL DE PODER: &a{0} -Commands.Reset.All=&aTodos os seus n\u00edveis de habilidade foram resetados com sucesso. -Commands.Reset.Single=&aSeu n\u00edvel da hablidade {0} foi resetado com sucesso. -Commands.Reset=&a- Reseta o n\u00edvel de uma habilidade para 0 +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\u00e3o est\u00e1 ativo. -Commands.Scoreboard.Keep=&3O scoreboard do mcMMO ficar\u00e1 assim at\u00e9 que voc\u00ea use o comando &a/mcscoreboard clear&3. -Commands.Scoreboard.Timer=&3O scoreboard do mcMMO ser\u00e1 limpo daqui &6{0}&3 segundos. +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\u00e9m o scoreboard do mc MMO +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\u00e1 sendo exibido para evitar que ele suma. +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\u00e7\u00f5es da Barra de XP do mcMMO foram resetadas. -Commands.XPBar.SettingChanged=&6configura\u00e7\u00f5es da Barra de XP de &a{0}&6 agora foi definida para &a{1} -Commands.Skill.Invalid=Esse n\u00e3o \u00e9 um nome de habilidade v\u00e1lido! -Commands.Skill.ChildSkill=Habilidades dependentes n\u00e3o s\u00e3o v\u00e1lidas para esse comando! +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\u00e7\u00f5es detalhadas sobre uma habilidade -Commands.Stats=&a- Veja as suas estat\u00edsticas do mcMMO -Commands.ToggleAbility=&a- Altere a ativa\u00e7\u00e3o da habilidade com o bot\u00e3o direito -Commands.Usage.0=&cO jeito certo de usar \u00e9 /{0} -Commands.Usage.1=&cO jeito certo de usar \u00e9 /{0} {1} -Commands.Usage.2=&cO jeito certo de usar \u00e9 /{0} {1} {2} -Commands.Usage.3=&cO jeito certo de usar \u00e9 /{0} {1} {2} {3} -Commands.Usage.3.XP=&cO jeito certo de usar \u00e9 /{0} {1} {2} {3}&7 (voc\u00ea pode colocar -s no fim para executar o comando sem informar o jogador, silenciando-o efetivamente) +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\u00edvel +Commands.Usage.Level=nível Commands.Usage.Message=mensagem -Commands.Usage.Page=p\u00e1gina +Commands.Usage.Page=página Commands.Usage.PartyName=nome Commands.Usage.Password=senha Commands.Usage.Player=jogador @@ -747,25 +747,25 @@ 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\u00e2nica. -Commands.MmoInfo.Mystery=&7Voc\u00ea ainda n\u00e3o liberou essa habilidade, mas quando \u00e1-la, conseguir\u00e1 ler detalhes sobre ela aqui! -Commands.MmoInfo.NoMatch=Essa sub-habilidade n\u00e3o existe! -Commands.MmoInfo.Header=&3-=[]=====[]&6 Informa\u00e7\u00f5es do MMO &3[]=====[]=- +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\u00e3o sendo convertidas para um sistema modular de habilidades aprimorado, infelizmente essa habilidade ainda n\u00e3o foi convertida e n\u00e3o possui estat\u00edsticas detalhadas. O novo sistema permitir\u00e1 libera\u00e7\u00f5es mais r\u00e1pidas de novas habilidades do mcMMO e maior flexibilidade com as habilidades existentes. -Commands.MmoInfo.Mechanics=&3-=[]=====[]&6 Mec\u00e2nicas &3[]=====[]=- -Commands.MmoInfo.Stats=Estat\u00edsticas: {0} -Commands.Mmodebug.Toggle=Modo de Debug do mcMMO agora \u00e9 &6{0}&7, use esse comando novamente para ativar ou desativar. Com o modo ativado, voc\u00ea pode bater em blocos para exibir informa\u00e7\u00f5es \u00fateis usadas para ajuda. -mcMMO.NoInvites=&cVoc\u00ea n\u00e3o possui convites no momento -mcMMO.NoPermission=&4permiss\u00f5es insuficientes. -mcMMO.NoSkillNote=&8Se voc\u00ea n\u00e3o tiver acesso a uma habilidade, ela n\u00e3o aparecer\u00e1 aqui. +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. ##grupo -Party.Forbidden=[mcMMO] Grupos n\u00e3o s\u00e3o permitidos neste mundo (Veja as permiss\u00f5es) -Party.Help.0=&cO jeito certo de usar \u00e9 &3{0} [senha]. +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\u00e7\u00f5es +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} @@ -777,360 +777,360 @@ Party.Help.10=&cUse &3{0} &cpara habilitar o compartilhamento de xp com membros 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\u00e3o \u00e9 um nome grupo v\u00e1lido. -Party.Invite.Self=&cVoc\u00ea n\u00e3o pode se convidar para seu pr\u00f3prio grupo! -Party.IsLocked=&cEste grupo j\u00e1 est\u00e1 fechado! -Party.IsntLocked=&cEste grupo n\u00e3o est\u00e1 fechado! -Party.Locked=&cGrupo fechado, apenas o l\u00edder pode convidar. -Party.NotInYourParty=&4{0} n\u00e3o est\u00e1 no seu grupo. -Party.NotOwner=&4voc\u00ea n\u00e3o \u00e9 o l\u00edder do grupo. -Party.Target.NotOwner=&4{0} n\u00e3o \u00e9 o l\u00edder do grupo. -Party.Owner.New=&a{0} \u00e9 o novo l\u00edder do grupo. -Party.Owner.NotLeader=&4Voc\u00ea n\u00e3o \u00e9 mais o l\u00edder do grupo. -Party.Owner.Player =&aAgora voc\u00ea \u00e9 o l\u00edder do grupo. -Party.Password.None=&cEste grupo est\u00e1 protegido por senha. Por favor, insira a senha para entrar. -Party.Password.Incorrect=&cA senha do grupo est\u00e1 incorreta. +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\u00e3o tem mais senha. -Party.Player.Invalid=&cEsse n\u00e3o \u00e9 um jogador v\u00e1lido. -Party.NotOnline=&4{0} n\u00e3o est\u00e1 online! -Party.Player.InSameParty=&c{0} j\u00e1 est\u00e1 no seu grupo! -Party.PlayerNotInParty=&4{0} n\u00e3o est\u00e1 em um grupo -Party.Specify=&cVoc\u00ea tem que especificar o grupo. -Party.Teleport.Dead=&cVoc\u00ea n\u00e3o pode se teletransportar para um jogador morto. -Party.Teleport.Hurt=&cVoc\u00ea recebeu dano nos \u00faltimos {0} segundos e n\u00e3o pode se teletransportar. -Party.Teleport.Player=&aVoc\u00ea se teletransportou para {0}. -Party.Teleport.Self=&cVoc\u00ea n\u00e3o pode se teletransportar para si mesmo! -Party.Teleport.Target=&a{0} se teletransportou para voc\u00ea. -Party.Teleport.Disabled=&c{0} n\u00e3o permite teletransporte para membros do grupo. -Party.Rename.Same=&cEsse j\u00e1 \u00e9 o nome do seu grupo! -Party.Join.Self=&cVoc\u00ea n\u00e3o pode jutar-se a si mesmo! -Party.Unlocked=&7Grupo est\u00e1 aberto +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 \u00e9 aliado de &a{0} -Party.Alliance.Disband=&7O seu grupo n\u00e3o \u00e9 mais aliado de &c{0} +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\u00edvel do grupo subiu para {0}. Total ({1}) +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\u00e7as +Party.Feature.Alliance=Alianças Party.Feature.ItemShare=Compartilhamento de itens Party.Feature.XpShare=Compartilhamento de XP -Party.Feature.Locked.Chat=BLOQUEADO AT\u00c9 CHEGAR NO N\u00cdVEL {0}+ (CHAT D0 GRUPO) -Party.Feature.Locked.Teleport=BLOQUEADO AT\u00c9 CHEGAR NO N\u00cdVEL {0}+ (TELETRANSPORTE DE GRUPO) -Party.Feature.Locked.Alliance=BLOQUEADO AT\u00c9 CHEGAR NO N\u00cdVEL {0}+ (ALIAN\u00c7AS) -Party.Feature.Locked.ItemShare=BLOQUEADO AT\u00c9 CHEGAR NO N\u00cdVEL {0}+ (COMPARTILHAMENTO DE ITENS) -Party.Feature.Locked.XpShare=BLOQUEADO AT\u00c9 CHEGAR NO N\u00cdVEL {0}+ (COMPARTILHAMENTO DE XP) -Party.Feature.Disabled.1=&cChat do grupo ainda n\u00e3o foi desbloqueado. -Party.Feature.Disabled.2=&cTeletransporte de grupo ainda n\u00e3o foi desbloqueado. -Party.Feature.Disabled.3=&cAlian\u00e7s ainda n\u00e3o est\u00e1 desbloqueada. -Party.Feature.Disabled.4=&cCompartilhamento de itens com o grupo ainda n\u00e3o foi desbloqueado. -Party.Feature.Disabled.5=&cCompartilhamento de XP com o grupo ainda n\u00e3o foi desbloqueado. +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=IGUAL -Party.ShareMode.Random=ALEAT\u00d3RIO +Party.ShareMode.Random=ALEATÓRIO Party.ItemShare.Category.Loot=Saque -Party.ItemShare.Category.Mining=Minera\u00e7\u00e3o +Party.ItemShare.Category.Mining=Mineração Party.ItemShare.Category.Herbalism=Herbalismo -Party.ItemShare.Category.Woodcutting=Corte de \u00e1rvore +Party.ItemShare.Category.Woodcutting=Corte de árvore Party.ItemShare.Category.Misc=Diversos ##xp Commands.XPGain.Acrobatics=Caindo -Commands.XPGain.Alchemy=Preparando Po\u00e7\u00f5es +Commands.XPGain.Alchemy=Preparando Poções Commands.XPGain.Archery=Atacando Monstros Commands.XPGain.Axes=Atacando Monstros -Commands.XPGain.Child=Ganhando n\u00edveis pelas habilidades principais +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\u00e9rios +Commands.XPGain.Mining=Minerando pedras e minérios Commands.XPGain.Repair=Reparando Commands.XPGain.Swords=Atacando Monstros Commands.XPGain.Taming=Adestrando animais, ou lutando junto com os seus lobos Commands.XPGain.Unarmed=Atacando Monstros -Commands.XPGain.Woodcutting=Cortando \u00e1rvores +Commands.XPGain.Woodcutting=Cortando árvores Commands.XPGain=&8XP GANHO: &f{0} -Commands.xplock.locked=&6Sua BARRA DE XP agora est\u00e1 em {0}! -Commands.xplock.unlocked=&6Sua BARRA DE XP agora est\u00e1 &aDESBLOQUEADA&6! +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 \u00e9 /xprate -Commands.xprate.proper.1=&cO jeito certo de voltar para a configura\u00e7\u00e3o padr\u00e3o da taxa de XP \u00e9 /xprate reset -Commands.xprate.proper.2=&cPor favor, coloque true ou false para indicar se isso \u00e9 um evento de XP ou n\u00e3o -Commands.NegativeNumberWarn=N\u00e3 use n\u00fameros negativos! +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 \u00e9 &6{0}&3x -Commands.xprate.started.0=&6EVENTO DE XP DO mcMMO COME\u00c7OU! -Commands.xprate.started.1=&6TAXA DE XP DO mcMMO AGORA \u00c9 {0}x! +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\u00ea definiu o multiplicador da taxa de XP global para &6{0}x -Notifications.Admin.XPRate.End.Self=&7Voc\u00ea finalizou o evento de taxa de XP. +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} # Evento -XPRate.Event=&6mcMMO atualmente est\u00e1 tendo evento de taxa de XP! a taxa de XP atual \u00e9 {0}x! +XPRate.Event=&6mcMMO atualmente está tendo evento de taxa de XP! a taxa de XP atual é {0}x! ##GUIAS -Guides.Available=&7Guia de {0} dispon\u00edvel - digite /{1} ? [p\u00e1gina] +Guides.Available=&7Guia de {0} disponível - digite /{1} ? [página] Guides.Header=&6-=&a{0} Guia&6=- -Guides.Page.Invalid=N\u00e3o \u00e9 um n\u00famero de p\u00e1gina v\u00e1lida! -Guides.Page.OutOfRange=Essa p\u00e1gina n\u00e3o existe, tem apenas {0} p\u00e1ginas totais. -Guides.Usage= Para usar digite /{0} ? [p\u00e1gina] +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\u00e1cia:\n&eAcrobacia \u00e9 a arte de se mover graciosamente no mcMMO.\n&eEla d\u00e1 b\u00f4nus de combate e b\u00f4nus de dano no ambiente.\n\n&3COMO GANHAR XP:\n&ePara ganhar XP nesta habilidade, voc\u00ea precisa se esquivar\n&eem um combate ou sobreviver a quedas de alturas que te d\u00f5o dano. -Guides.Acrobatics.Section.1=&3Como rolar funciona?\n&eVoc\u00ea tem uma chance passiva quando sofre dano de queda\n&ede negar o dano. Voc\u00ea pode segurar o bot\u00e3o de se agachar para\n&edobrar suas chances durante uma queda.\n&eIsso aciona um rolamento gracioso ao inv\u00e9s de um normal.\n&eRolamentos graciosos s\u00e3o como rolamentos normais, mas tem duas vezes mais probabilidade de\n&eocorrerem e fornecem mais seguran\u00e7\u00e3 contra danos do que os rolamentos normais.\n&eA chance do rolamento est\u00e1 ligada ao seu n\u00edvel de habilidade -Guides.Acrobatics.Section.2=&3Como a esquiva funciona?\n&eEsquiva \u00e9 uma chance passiva de que quando voc\u00ea receber\n&edano em combate ele seja reduzido pela metade.\n&eIsso est\u00e1 ligado ao seu n\u00edvel de habilidade. +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 \u00e9 sobre prepara\u00e7\u00f5es de alquimia.\n[[YELLOW]]Ela d\u00e1 um aumento na velocidade do tempo de prepara\u00e7\u00e3o\n de po\u00e7\u00f5es bem como\n[[YELLOW]] a adi\u00e7\u00e3o de novas po\u00e7\u00f5es(antigamente) imposs\u00edveis de \nse conseguir no modo sobreviv\u00eancia.\n\n\n[[DARK_AQUA]]COMO GANHAR XP:\n[[YELLOW]]Para ganhar xp nessa habilidade, voc\u00ea precisa preparar po\u00e7\u00f5es. -Guides.Alchemy.Section.1=[[DARK_AQUA]]Como a cat\u00e1lise funciona?\n[[YELLOW]]Cat\u00e1lise aumenta o processo de prepara\u00e7\u00e3o, com a\n[[YELLOW]]velocidade m\u00e1xima de 4x no n\u00edvel 1000.\n[[YELLOW]]Essa habilidade \u00e9 desbloqueada por padr\u00e3o no n\u00edvel 100. -Guides.Alchemy.Section.2=[[DARK_AQUA]]Como as Misturas funcionam?\n[[YELLOW]]As misturas permitem a prepara\u00e7\u00e3o de mais po\u00e7\u00f5es com ingredientes personalizados.\n[[YELLOW]]Quais ingredientes especiais s\u00e3o desbloqueados \u00e9 determinado\n[[YELLOW]]pelo seu Rank. Existem 8 ranks para se desbloquear. -Guides.Alchemy.Section.3=[[DARK_AQUA]]Mistura de n\u00edvel 1, ingredientes:\n[[YELLOW]]P\u00f3 de Blaze, Olho de Aranha Fermentado, L\u00e1grima de ghast, Redstone,\n[[YELLOW]]P\u00f3 de pedra luminosa, A\u00e7\u00faar, Fatia de Melancia Reluzente, Cenoura Dourada,\n[[YELLOW]]Creme de Magma, Fungo do Nether, Olho de aranha, Enxofre, V\u00edtoria-r\u00e9gia,\n[[YELLOW]]Baiacu\n[[YELLOW]](Po\u00e7\u00f5es Cl\u00e1ssicas) -Guides.Alchemy.Section.4=[[DARK_AQUA]]Mistura de n\u00edvel 2, ingredientes:\n[[YELLOW]]Cenoura (Po\u00e7\u00e3o de Pressa)\n[[YELLOW]]Slimeball (Po\u00e7\u00e3o de Dullness)\n\n[[DARK_AQUA]]Mistura de n\u00edvel 3, ingredientes:\n[[YELLOW]]Quartzo (Po\u00e7\u00e3o de Absor\u00e7\u00e3o)\n[[YELLOW]]P\u00e9 de coelho (Po\u00e7\u00e3o de Salto) -Guides.Alchemy.Section.5=[[DARK_AQUA]]Mistura de n\u00edvel 4, ingredientes:\n[[YELLOW]]Ma\u00e7\u00e3 (Po\u00e7\u00e3o de Vida Extra)\n[[YELLOW]]Carne podre (Po\u00e7\u00e3o da Fome)\n\n[[DARK_AQUA]]Mistura de n\u00edvel 5, ingredientes:\n[[YELLOW]]Cogumelo Marrom (Po\u00e7\u00e3o da N\u00e1usea)\n[[YELLOW]]Bolsa de Tinta (Po\u00e7\u00e3o da Cegueira) -Guides.Alchemy.Section.6=[[DARK_AQUA]]Mistura de n\u00edvel 6, ingredientes:\n[[YELLOW]]Samambaia (Po\u00e7\u00e3o da Satura\u00e7\u00e3o)\n\n[[DARK_AQUA]]Mistura de n\u00edvel 7, ingredientes:\n[[YELLOW]]Batata venenosa (Po\u00e7\u00e3o de Decaimento)\n\n[[DARK_AQUA]]Mistura de n\u00edvel 8, ingredientes:\n[[YELLOW]]Ma\u00e7\u00e3 dourada normal (Po\u00e7\u00e3o de Resist\u00eancia) +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 \u00e9 sobre atirar com arco e flecha\n&eEssa habilidade d\u00e1 v\u00e1rios b\u00f4nus de combate, como b\u00f4nus de dano\n&eque escala com o seu n\u00edvel e a habilidade de atordoar seus\n&eoponentes no PvP. Al\u00e9m disso, voc\u00ea 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\u00ea precisa atirar em mobs ou\n&eoutros jogadores. -Guides.Archery.Section.1=&3Profici\u00eancia em Tiro?\n&eA habilidade Profici\u00eancia em Tiro d\u00e1 dano adicional aos seus tiros.\n&eO b\u00f4nus de dano da Profici\u00eancia em Tiro aumenta conforme voc\u00ea\n&esobe de n\u00edvel em arquearia.\n&eCom as configura\u00e7\u00f5es padr\u00e3o, o seu dano com flechas aumenta em 10%\n&ea cada n\u00edvel, at\u00e9 um m\u00e1ximo de 200% de b\u00f4nus de dano. -Guides.Archery.Section.2=&3Como o Atordoamento funciona?\n&eVoc\u00ea tem uma chance passiva de atordoar outros jogadores quando\n&eatira neles. Quando o Atordoamento \u00e9 ativado, ele for\u00e7a o inimigo\n&ea olhar para cima por um curto per\u00edodo de tempo.\n&eUm tiro Atordoante tamb\u00e9m tem um dano adiconal de 4 (2 cora\u00e7\u00f5es). -Guides.Archery.Section.3=&3Como Recupera\u00e7\u00e3o de Flechas funciona?\n&eVoc\u00ea tem uma chance passiva de recuperar algumas flechas\n&equando voc\u00ea mata um mob com o arco.\n&eEssa chance aumenta conforme voc\u00ea sobe de n\u00edvel em Arquearia.\n&ePor padr\u00e3o, essa habilidade aumenta 0.1% por n\u00edvel, at\u00e9 um m\u00e1ximo de 100%\n&eno n\u00edvel 1000. +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\u00ea pode usar seu machado para muito mais coisas do que\n&eapenas desflorestamento! Voc\u00ea pode fazer picadinho de mobs \n&ee de jogadores para ganhar XP, batendo nos mobs com o efeito de\n&erepuls\u00e3o e inflingir cr\u00edticos MORTAIS em mobs e jogadores\n&eSeu machado tamb\u00e9m se torna um cortador de madeira port\u00e1til,\n&equebre a armadura dos inimigos com facilidade conforme seu n\u00edvel\n&eaumenta.\n&3COMO GANHAR XP:\n&ePara ganhar XP nesta habilidade, voc\u00ea precisa acertar mobs ou outros jogadores\n&eCom um machado. -Guides.Axes.Section.1=&3Como Racha Cr\u00e2nio funciona?\n&eEssa habilidade te permite dar dano em \u00e1rea.\n&eEsse dano em \u00e1rea da metade do dano que voc\u00ea deu\n&eno alvo principal, ent\u00e3o \u00e9 bom para matar grandes hordas de mobs. -Guides.Axes.Section.2=&3Como Golpes cr\u00edticos funciona?\n&eGolpes cr\u00edticos \u00e9 uma habildiade passiva que concede ao jogador a\n&echance de dar dano adicional.\n&eCom as configura\u00e7\u00f5es padr\u00e3o, cada 2 n\u00edveis te concede\n&e0.1% de chance de dar um Golpe cr\u00edtico, 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 \u00e9 uma habildiade passiva que concede dano adicional\n&eao seus golpes quando se est\u00e1 usando um Machado.\n&eCom as configura\u00e7\u00f5es padr\u00e3o, esse dano adicional aumenta em 1 a cada 50 n\u00edveis,\n&eat\u00e9 um m\u00e1ximo de 4 no n\u00edvel 200. -Guides.Axes.Section.4=&3Como o Impacto na armadura funciona?\n&eAtaca com for\u00e7a 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\u00ea sobe de n\u00edvel em Machados. -Guides.Axes.Section.5=&3Como Grande Impacto funciona?\n&eVoc\u00ea tem uma chance passiva de dar um Grande Impacto quando\n&ebate em um mob ou jogador com o seu machado.\n&ePor padr\u00e3o essa chance \u00e9 de 25%. Essa habilidade passiva tem um\n&eefeito de repuls\u00e3o muito grande, parecido com o encamento de\n&eRepuls\u00e3o II. Al\u00e9m disso, ele d\u00e1 dano adicional no alvo. +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\u00e7\u00e3o:\n&eEscava\u00e7\u00e3o \u00e9 o ato de cavar terra para encontrar tesouros.\n&eAo escavar voc\u00ea encontrar\u00e1 tesouros.\n&eQuanto mais voc\u00ea faz isso, mais tesouros pode encontrar.\n\n&3COMO GANHAR XP:\n&ePara ganhar XP nesta habilidade, voc\u00ea deve cavar com uma p\u00e1.\n&eApenas certos materiais podem ser cavados para tesouros e XP. -Guides.Excavation.Section.1=&3M\u00e1terias compat\u00edveis:\n&eGrama, Terra, Areia, Argila, Cascalho, Mic\u00e9lio, Areia das Almas, Neve -Guides.Excavation.Section.2=&3Como usar a Super Broca:\n&eCom uma p\u00e1 na m\u00e3o, clique com o bot\u00e3o direito para preparar sua ferramenta\n&eQuando estiver neste estado, voc\u00ea tem cerca de 4 segundos para entrar\n&entrar em contato com M\u00e1terias compat\u00edveis com Escava\u00e7\u00e3o, isso ir\u00e1\n&eativar a Super Broca. -Guides.Excavation.Section.3=&3O que \u00e9 Super Broca?\n&eSuper Broca \u00e9 uma hablidade com cooldown\n&eligada com a habilidade de Escava\u00e7\u00e3o. Ela triplica sua chance\n&ede encontrar tesouros e ativa quebra instant\u00e2nea\n&ede M\u00e1terias de Escava\u00e7\u00e3o. -Guides.Excavation.Section.4=&3Como arqueologia funciona?\n&eCada tipo de tesouro de Escava\u00e7\u00e3o tem sue pr\u00f3prio\n&en\u00edvel de habilidade necess\u00e1rio para dropar, assim \u00e9\n&e dif\u00edcil dizer o quanto isso est\u00e1 te ajudando.\n&eApenas tenha em mente que quanto maior for sua habilidade de Escava\u00e7\u00e3o\n&mais tesouros podem ser encontrados.\n&eE tamb\u00e9m tenha em mente que cada tipo de material compat\u00edvel com\n&eEscava\u00e7\u00e3o tem sua pr\u00f3pria lista \u00fanica de tesouros.\n&eIResumindo, voc\u00ea encontrar\u00e1 diferentes tesouros em Terra\n&edo que em cascalho. -Guides.Excavation.Section.5=&3Notas sobre Escava\u00e7\u00e3o:\n&eOs drops de Escava\u00e7\u00e3o s\u00e3o totalmente costumiz\u00e1veis\n&eEnt\u00e3o os resultados variam de servidor para servidor. +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 \u00e9 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\u00e7ador 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\u00edveis podem\n&edropar em qualquer n\u00edvel. No entanto, depende da raridade do item e da frequ\u00eancia com que ele dropa.\n&eQuanto maior for o n\u00edvel de pesca, melhor\n&es\u00e3o suas chances de encontrar tesouros. -Guides.Fishing.Section.2=&3Como Pesca no Gelo funciona?\n&eEsta habilidade passiva permite que voc\u00ea pesque em lagos de gelo!\n&eUse sua vara de pesca em um lago de gelo e a habilidade ir\u00e1\n&ecriar um pequeno buraco no gelo onde voc\u00ea poder\u00e1 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\u00ea 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\u00ea sacuda mobs fazendo-os derrubar itens\n&eHookando eles com a vara de pescar.\n&eMobs v\u00e3o dropar itens que normalmente dropariam ao morrer.\n&eTamb\u00e9m \u00e9 poss\u00edvel conseguir cr\u00e2nios de mobs, que normalmente s\u00e3o\n&eimposs\u00edveis de serem obtidos no modo de sobreviv\u00eancia. -Guides.Fishing.Section.5=&3Como Dieta de Pescador funciona?\n&eEsta \u00e9 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\u00e3o totalmente costumiz\u00e1veis\n&eEnt\u00e3o os resultados variam de servidor para servidor. +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 \u00e9 sobre coletar ervas e plantas.\n\n\n&3COMO GANHAR XP:\n&eColete plantas e ervas. -Guides.Herbalism.Section.1=&3Blocos compat\u00edveis\n&eTrigo, Batatas, Cenouras, Melancias, \n&eAb\u00f3bora, Cana-de-a\u00e7\u00facar, Sementes de Cacau, Flores, Cacto, Cogumelos,\n&eFundo do Nether, V\u00edtoria-r\u00e9gia, and Trepadeiras. -Guides.Herbalism.Section.2=&3Como Terra Verde Funciona?\n&eTerra Verde \u00e9 uma habildade ativa, voc\u00ea pode clicar com o bot\u00e3o 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\u00e9m da ao jogador a habilidade de\n&eespalhar a vida em blocos e transform\u00e1-lo usando sementes\n&edo seu invent\u00e1rio. -Guides.Herbalism.Section.3=&3Como Polegar Verde funciona (em planta\u00e7\u00e3o)?\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\u00ea transforme esses blocos\n&e em suas contra-partes"com plantas". Voc\u00ea consegue fazer isso usando o bot\u00e3o direito em\n&eum bloco, enquanto segura sementes. Isto ir\u00e1 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\u00e3es, 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\u00e3o quebrados com uma espada. +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\u00e7\u00e3o:\n&eMinera\u00e7\u00e3o consiste em minerar pedras e min\u00e9rios. Fornece b\u00f4nus\n&ena quantidade de materiais dropados enquanto minera.\n\n&3COMO GANHAR XP:\n&ePara ganhar XP nesta habilidade, voc\u00ea deve minerar com uma picareta na m\u00e3o.\n&eApenas alguns blocos d\u00e3o XP. -Guides.Mining.Section.1=&3Materiais compat\u00edveis:\n&ePedra, Min\u00e9rio de Carv\u00e3o, Min\u00e9rio de Ferro, Min\u00e9rio de Ouro, Min\u00e9rio de diamante, Min\u00e9rio de Redstone,\n&eMin\u00e9rio de l\u00e1pis-laz\u00fali, 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\u00e3os, clique com o bot\u00e3o direito para deixar sua picareta preparada.\n&eQuando ela estiver nesse estado, voc\u00ea tem cerca de 4 segundos para fazer contato\n&ecom materiais compat\u00edveis com minera\u00e7\u00e3o, o que ir\u00e1 ativar a Super\n&eQuebra. -Guides.Mining.Section.3=&3O que \u00e9 Super Quebra?\n&eSuper Quebra \u00e9 uma habilidade com cooldown vinculado a habilidade\n&eMinera\u00e7\u00e3o. Ele triplica sua chance de itens extras serem dropados e\n&ehabilita a quebra instant\u00e2nea de materiais de Minera\u00e7\u00e3o -Guides.Mining.Section.4=&3Como usar Minera\u00e7\u00e3o Explosiva:\n&eCom uma picareta na m\u00e3o,\n&eagache-se e clique com o bot\u00e3o direito do mouse em uma TNT \u00e0 dist\u00e2ncia. Isso far\u00e1 com que a TNT\n&eexploda instantaneamente. -Guides.Mining.Section.5=&3Como Minera\u00e7\u00e3o Explosiva funciona?\n&eMinera\u00e7\u00e3o \u00e9 uma habilidade com um cooldown vinculado a habilidade\n&eMinera\u00e7\u00e3o. A habilidade d\u00e1 b\u00f4nus ao minerar com TNT e permite que voc\u00ea\n&edetone TNT remotamente. Tem 3 partes da Minera\u00e7\u00e3o Explosiva.\n&eA primeira \u00e9 Bombas Maiores\n&eA segunda \u00e9 Especialista em Demoli\u00e7\u00e3o, que diminui o dano\n&eproveniente de explos\u00f5es de TNT. A terceira simplesmente aumenta a\n&equantidade de min\u00e9rios dropados usando TNT e diminui os\n&edetritos dropados. +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\u00e7\u00e3o:\n&eRepara\u00e7\u00e3o peemite que voc\u00ea 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 \u00e9 um\n&epor padr\u00e3o, um bloco de ferro e n\u00e3o deve ser confundido com\n&eA bigorna do Minecraft cl\u00e1ssico. -Guides.Repair.Section.1=&3Como posso usar a Repara\u00e7\u00e3o?\n&eColoque uma bigorna do mcMMO e clique com o bot\u00e3o direito para reparar o item\n&eque voc\u00ea est\u00e1 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 \u00e9 influenciada pelo seu n\u00edvel de habilidade de Repara\u00e7\u00e3o. -Guides.Repair.Section.3=&3Como Super Reparo Funciona?\n&eSuper Reparo \u00e9 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\u00ea conserte itens com uma certa chance de\n&emanter seus encantamentos. Os encantamentos podem\n&emanter seus n\u00edveis atuais, diminuir de n\u00edvel,\n&eou perder totalmente o encantamento. +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\u00e7\u00e3o:\n&eRecupera\u00e7\u00e3o permite que voc\u00ea use um bloco de ouro para recuperar armaduras e\n&eferramentas.\n\n&3COMO GANHAR XP:\n&eRecupera\u00e7\u00e3o \u00e9 uma habilidade dependente de Repara\u00e7\u00e3o e Pesca, seu n\u00edvel de Repara\u00e7\u00e3o \u00e9 baseado em seus n\u00edveis das habilidades Pesca e Repara\u00e7\u00e3o. -Guides.Salvage.Section.1=&3Como posso usar Repara\u00e7\u00e3o?\n&eColoque uma bigorna de Recupera\u00e7\u00e3o do mcMMO e clique com o bot\u00e3o direito para Recuperar\n&eo item que voc\u00ea est\u00e1 segurando no momento. Isso ir\u00e1 quebrar o item,\n&ee ir\u00e1 te devolver os materiais usados para fabricar o item.\n\n&ePor exemplo, recuperar uma picareta de ferro lhe dar\u00e1 barras de ferro. -Guides.Salvage.Section.2=&3Como Repara\u00e7\u00e3o avan\u00e7ada funciona?\n&eQuando desbloqueada, essa habilidade permite que voc\u00ea repare itens danificados.\n&eA porcentagem de rendimento aumenta conforme voc\u00ea sobe de n\u00edvel. Um rendimento maior\n&e=significa que voc\u00ea pode obter mais materiais de volta.\n&eCom a Repara\u00e7\u00e3o avan\u00e7ada, voc\u00ea sempre receber\u00e1 1 material de volta,\n&ea menos que o item esteja muito danificado. Ent\u00e3o n\u00e3o tem que se preocupar\n&eem destruir um item sem recuperar nada. -Guides.Salvage.Section.3=&3Para ilustrar como isso funciona, aqui est\u00e1 um exemplo:\n&eDigamos que Recuperamos uma picareta de ouro que estava 20% danificada,\n&eisso significa que o valor m\u00e1ximo que voc\u00ea pode obter de volta \u00e9 apenas 2\n&e(Porque a picareta \u00e9 feita com 3 barras - cada uma conrespondendo a\n&e33,33% de durabilidade) O que \u00e9 igual a 66%. Se a sua porcentagem de\n&erendimento estiver abaixo de 66% voc\u00ea n\u00e3o vai conseguir recuperar 2 barras.\n&eSe estiver acima desse valor, voc\u00ea pode receber o "valor total",\n&eo que significa que voc\u00ea receber\u00e1 2 barras. -Guides.Salvage.Section.4=&3Como funciona Recupera\u00e7\u00e3o Arcana?\n&eEssa habilidade permite que voc\u00ea obtenha livros de encantamentos ao recuperar\n&eitens encantados. dependendo do seu n\u00edvel, a chance de\n&eextrair com sucesso um encantamento total ou parcial varia.\n\n&eQuando um encantamento \u00e9 parcialmente extra\u00eddo, o livro de\n&encantamento ter\u00e1 um n\u00edvel de encantamento menor em compara\u00e7\u00e3o\n&ecom o encantamento original do item. +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\u00f4nus de combate para aqueles que lutam com uma\n&eespada.\n\n&3COMO GANHAR XP:\n&eXP \u00e9 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 \u00e9 uma habilidade ativa, voc\u00ea pode ativ\u00e1-la\n&eclicando com o bot\u00e3o direito com uma espada. Esta habilidade te permite dar \n&edano em \u00e1rea. Esse dano em \u00e1rea 25% de dano\n&eb\u00f4nus e pode causar Ruptura. -Guides.Swords.Section.2=&3Como Contra-Ataque funciona?\n&eContra-Ataque \u00e9 uma habilidade ativa. quando bloquear e receber\n&egolpes de mobs, voc\u00ea ter\u00e1 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\u00e1 sangrar at\u00c9 que o efeito acabe, ou ele morra, \n&eo que vier primeiro.\n&eA dura\u00e7\u00e3o do sangramento aumenta com o n\u00edvel da sua habilidade de 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\u00e1 aos jogadores v\u00e1rios b\u00f4nus de combate ao usar\n&elobos domados.\n\n&3COMO GANHAR XP:\n&epara ganhar XP nessa habilidade voc\u00ea ter\u00e1 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 \u00e9 uma habilidade que te permite invocar\n&eum lobo ou uma jaguatirica do seu lado. Voc\u00ea pode fazer isso \n&eagachando + clicando com o bot\u00e3o 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\u00e7\u00e3o e verifiquem as\n&estat\u00edsticas de lobos e jaguatiricas. Clique com o bot\u00e3o esquerdo em um lobo ou jaguatirica para usar\n&eConhecimento de Feras. -Guides.Taming.Section.3=&3Como mordida funciona?\n&eMordida \u00e9 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\u00e1 b\u00f4nus de dano para o dano causado\n&epor lobos. O b\u00f4nus de dano depende do seu n\u00edvel de Adestramento. -Guides.Taming.Section.5=&3Como Consci\u00eancia Ambiental funciona?\n&eEssa habilidade passiva permitir\u00e1 que seus lobos se teletransportem para voc\u00ea quando\n&eeles se aproximarem de coisas perigosas como cacto e Lava. Tamb\u00e9m dar\u00e1\n&eimunidade a dano por queda para os lobos. -Guides.Taming.Section.6=&3Como Pelo Grosso funciona?\n&eEsta habilidade passiva reduzir\u00e1 o dano e faz os lobos serem \n&eresistentes ao fogo. -Guides.Taming.Section.7=&3Como Resist\u00eancia a impactos funciona?\n&eEsta habilidade passiva reduz o dano recebido pelos lobos\n&ede explos\u00f5es. -Guides.Taming.Section.8=&3Como Servi\u00e7o de Fast Food funciona?\n&eEsta habilidade passiva d\u00e1 aos lobos chance de se curarem sempre que\n&eatacarem. +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\u00e1 aos jogadores v\u00e1rios b\u00f4nus de combate ao usar\n&eseus punhos como armas. \n\n&3GANHO DE XP:\n&eXP \u00e9 recebida baseada na quantidade de dano causada a mobs\n&eou em outros jogadores quando voc\u00ea est\u00e1 desarmado. -Guides.Unarmed.Section.1=&3Como F\u00faria funciona?\n&eF\u00faria \u00e9 uma habilidade ativa que \u00e9 ativada\n&e clicando com o bot\u00e3o direito. Enquanto estiver no modo de F\u00faria voc\u00ea dar\u00e1 50% mais de\n&edano e poder\u00e1 quebrar materiais fr\u00e1geis instantaneamente, como\n&eTerra e Grama. -Guides.Unarmed.Section.2=&3Como Estilo bra\u00e7o de A\u00e7o funciona?\n&eEstilo bra\u00e7o de A\u00e7o 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 \u00e9 uma habilidade passiva que te d\u00e1 chance\n&ede refletir flechas atiradas por Esqueletos ou outros jogadores.\n&eA flecha cair\u00e1 no ch\u00e3o sem causar danos ao jogador. -Guides.Unarmed.Section.4=&3Como Punho de ferro funciona?\n&ePunho de ferro \u00e9 uma habilidade passiva que neutraliza a habilidade desarmamento. Conforme seu \n&en\u00edvel de desarmado aumenta, a chance de prevenir que voc\u00ea seja desarmado tamb\u00e9m 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\u00e3o. +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 \u00e9 sobre derrubar \u00c1rvores.\n\n&3COMO GANHAR XP:\n&eXP \u00e9 obtida sempre que voc\u00ea quebra blocos de madeira. -Guides.Woodcutting.Section.1=&3Como Lenhador funciona?\n&eLenhador \u00e9 uma habilidade ativa, voc\u00ea pode clicar com o bot\u00e3o direito\n&eenquanto segura um machado para ativar a habilidade Lenhador. Ir\u00e1\n&efazer com que a \u00c1rvore inteira seja quebrada instantaneamente, dropando todos\n&eos blocos de madeira de uma vez s\u00f3. -Guides.Woodcutting.Section.2=&3Como Soprador de Folhas funciona?\n&eSoprador de Folhas \u00e9 uma habilidade passiva que far\u00e1 com que os blocos de\n&efolha se quebrem instantaneamente uando atingido por um machado. Por padr\u00e3o\n&eessa habilidade \u00e9 desbloqueada no n\u00edvel 100. -Guides.Woodcutting.Section.3=&3Como Drops duplos funcionam?\n&eEsta habilidade passiva te d\u00e1 a chance de obter um bloco\n&eextra para cada bloco de madeira que voc\u00ea corta. +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. #INSPECIONAR -Inspect.Offline= &cVoc\u00ea n\u00e3o tem permiss\u00e3o para inspecionar jogadores offline! -Inspect.OfflineStats=Estat\u00edsticas do mcMMO do jogador offline &e{0} -Inspect.Stats=&aEstat\u00edsticas do mcMMO do jogador &e{0} -Inspect.TooFar=Voc\u00ea est\u00e1 muito longe para inspecionar esse jogador! +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! #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\u00ea para a sua cama. -Item.ChimaeraWing.NotEnough=Voc\u00ea precisa &e{0}&c mais &6{1}&c! -Item.NotEnough=Voc\u00ea precisa &e{0}&c mais &6{1}&c! -Item.Generic.Wait=Voc\u00ea precisa esperar para poder usar isso de novo! &e({0}s) -Item.Injured.Wait=Voc\u00ea recebeu dano recentemente e deve esperar para usar isso. &e({0}s) +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\u00e9rios. -Item.FluxPickaxe.Lore.2=&7Necessita de fundi\u00e7\u00e3o n\u00edvel {0}+ +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\u00e7\u00e3ndo o teletransporte em &6({0}) &7segundos, por favor, fique parado... +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\u00ea foi desarmado! +Skills.Disarmed=&4Você foi desarmado! Skills.Header=-----[] &a{0}&c []----- -Skills.NeedMore=&4Voc\u00ea precisa de mais &7{0} -Skills.NeedMore.Extra=&4Voc\u00ea precisa de mais &7{0}{1} +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\u00e1ximo -Skills.TooTired=Voc\u00ea est\u00e1 muito cansado para usar essa habilidade de novo. &e({0}s) +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\u00e3o direito de novo para confirmar &6{0}&a. clique no bot\u00e3o esquerdo para cancelar. -Skills.AbilityGateRequirementFail=&7Voc\u00ea precisa de mais &e{0}&7 n\u00edveis de &3{1}&7 para usar essa Super Habilidade. +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\u00edsticas +Stats.Own.Stats=&a[mcMMO] Estatísticas #VANTAGENS -Perks.XP.Name=Experi\u00eancia -Perks.XP.Desc=Receba b\u00f4nus de XP em certas habilidades. +Perks.XP.Name=Experiência +Perks.XP.Desc=Receba bônus de XP em certas habilidades. Perks.Lucky.Name=Sorte -Perks.Lucky.Desc=D\u00e1 33.3% a mais de chance de ativar habilidades {0}. -Perks.Lucky.Desc.Login=D\u00e1 33.3% a mais de chance de ativar habilidades certas habilidades. +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\u00e7\u00e3o r\u00e1pida +Perks.Cooldowns.Name=Recuperação rápida Perks.Cooldowns.Desc=Diminui o cooldown em {0}. -Perks.ActivationTime.Name=Resist\u00eancia -Perks.ActivationTime.Desc=Aumenta o tempo de ativa\u00e7\u00e3o de habilidades por {0} segundos. -Perks.ActivationTime.Bonus=&6 ({0}s com a vantagem de resist\u00eancia) +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\u00ea perdeu &9{0}&4 n\u00edveis por ter morrido. -Hardcore.DeathStatLoss.PercentageChanged=&6[mcMMO] A porcentagem de perda de estat\u00edsticas foi mudada para {0}. +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\u00ea robou &9{0}&3 n\u00edveis de &e{1}. -Hardcore.Vampirism.Victim.Failure=&6[mcMMO] &e{0}&7 n\u00e3o conseguiu roubar conhecimento de voc\u00ea! -Hardcore.Vampirism.Victim.Success=&6[mcMMO] &e{0}&4 roubou &9{1}&4 n\u00edveis de voc\u00ea! -Hardcore.Vampirism.PercentageChanged=&6[mcMMO] A porcentagem de roubo de estat\u00edsticas foi alterada para {0}. +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\u00e7\u00f5es de Doa\u00e7\u00e3o: +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\u00edsticas por Vampirismo: &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\u00e3o &3{0} +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\u00ea esteja gastando muito tempo fundindo nas cavernas.\nAumenta v\u00e1rias propriedades de fundi\u00e7\u00e3o. -Smelting.SubSkill.UnderstandingTheArt.Stat=Multiplicador de XP Cl\u00e1ssico: &e{0}x -Smelting.Ability.Locked.0=BLOQUEADO AT\u00c9 CHEGAR NO NÍVEL {0}+ HABILIDADE (Multiplicador de XP Cl\u00e1ssico) -Smelting.Ability.Locked.1=BLOQUEADO AT\u00c9 CHEGAR NO NÍVEL {0}+ HABILIDADE (MINERA\u00c7\u00c3O DERRETEDORA) -Smelting.SubSkill.FuelEfficiency.Name=Efici\u00eancia do combust\u00edvel -Smelting.SubSkill.FuelEfficiency.Description=Aumenta o tempo de queima do combust\u00edvel usando fornalhas durante a fundi\u00e7\u00e3o -Smelting.SubSkill.FuelEfficiency.Stat=Multiplicador de efici\u00eancia de combust\u00edvel: &e{0}x -Smelting.SubSkill.SecondSmelt.Name=Segunda fundi\u00e7\u00e3o -Smelting.SubSkill.SecondSmelt.Description=Dobra os recursos obtidos com fundi\u00e7\u00e3o -Smelting.SubSkill.SecondSmelt.Stat=Chance da segunda fundi\u00e7\u00e3o -Smelting.Effect.4=Aumento de Xp cl\u00e1ssico -Smelting.Effect.5=Aumenta a XP cl\u00e1ssica obtida durante a fundi\u00e7\u00e3o -Smelting.SubSkill.FluxMining.Name=Minera\u00e7\u00e3o Derretedora -Smelting.SubSkill.FluxMining.Description=Chance de que os min\u00e9rios sejam fundidos instantaneamente durante a minera\u00e7\u00e3o -Smelting.SubSkill.FluxMining.Stat=Chance de minera\u00e7\u00e3o derretedora -Smelting.Listener=Fundi\u00e7\u00e3o: -Smelting.SkillName=FUNDI\u00c7\u00c3O +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\u00edveis do mcMMO a um jogador +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\u00e7\u00f5es detalhadas do mcMMO de outro jogador -Commands.Description.mcability=Ative/destive habilidades usadas com o bot\u00e3o direito do mcMMO +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\u00e7\u00e3o resumida do mcMMO -Commands.Description.mcnotify=Ative/desative as notifica\u00e7\u00f5es de bate-papo das habilidades do mcMMO -Commands.Description.mcpurge=Retira jogadores sem n\u00edveis do mcMMO e jogadores que n\u00e3o se conectam a {0} meses do banco de dados 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\u00edvel do mcMMO e XP +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\u00edvel do mcMMO de um jogador -Commands.Description.mmodebug=Ativa/desativa o modo de debug que mostra informa\u00e7\u00f5es \u00fateis quando voc\u00ea bate em blocos +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\u00f3rmula de XP +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\u00e1rias configura\u00e7\u00f5es de grupo do mcMMO +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\u00e7\u00f5es detalhadas de habilidades do mcMMO para {0} -Commands.Description.skillreset=Reseta os n\u00edveis do mcMMO de um jogador +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\u00edfica do mcMMO +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\u00ea est\u00e1 usando uma vers\u00e3o antiga do mcMMO! -UpdateChecker.NewAvailable=Tem uma nova vers\u00e3o dispon\u00edvel no Spigot. +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\u00edsticas do mcMMO +Scoreboard.Header.PlayerStats=&eEstatísticas do mcMMO Scoreboard.Header.PlayerCooldowns=&eCooldowns do mcMMO Scoreboard.Header.PlayerRank=&eRanks do mcMMO -Scoreboard.Header.PlayerInspect=&eEstat\u00edsticas do mcMMO: {0} -Scoreboard.Header.PowerLevel=&cN\u00edvel de poder -Scoreboard.Misc.PowerLevel=&6N\u00edvel de poder -Scoreboard.Misc.Level=&3N\u00edvel +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 @@ -1138,34 +1138,34 @@ 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\u00e3o foram carregados. +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\u00e1 tendo problemas para carregar seus dados, n\u00f3s tentamos carreg\u00e1-lo &a{0}&c vezes.&c Voc\u00ea pode tentar entrar em contato com os admins do servidor para falar sobre esse problema.O mcMMO tentar\u00e1 carregar seus dados at\u00e9 que voc\u00ea se desconecte, voc\u00ea n\u00e3o ganhar\u00e1 e nem ser\u00e1 capaz de usar suas habilidades enquanto os dados n\u00e3o estiverem carregados. -Profile.Loading.FailureNotice=&4[A]&c mcMMO n\u00e3o conseguiu carregar os dados do jogador &e{0}&c. &dPor favor, verifique a configura\u00e7\u00e3o do seu banco de dados. Quantidade de tentativas feitas at\u00e9 agora {1}. +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\u00e1 no n\u00edvel &a{1}&6! -Holiday.Anniversary=&9Feliz Anivers\u00e1rio de {0} anos!\n&9 em homenagem a todo o trabalho de nossr50 e todos os seus desenvolvedores, aqui est\u00e1 um show pirot\u00e9cnico! +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\u00ea n\u00e3o est\u00e1 recebendo notifica\u00e7\u00f5es do mcMMO, para habilitar as notifica\u00e7\u00f5es, digite /mcnotify de novo. Este \u00e9 um lembrete autom\u00e1tico de hora em hora. +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\u00ea chegou no N\u00edvel de Poder m\u00e1ximo em &c{0}&e. Voc\u00ea ir\u00e1 parar de subir de n\u00edvel de habilidades de agora em diante. -LevelCap.Skill=&6(&amcMMO&6) &eVoc\u00ea chegou no n\u00edvel m\u00e1xima de &c{0}&e em &6{1}&e. Voc\u00ea ir\u00e1 parar de subir de n\u00edvel de agora em diante. -Commands.XPBar.Usage=O jeito certo de usar \u00e9 /mmoxpbar -Commands.Description.mmoxpbar=Configura\u00e7\u00f5es da barra de XP do Jogador do mcMMO -Commands.Description.mmocompat=Informa\u00e7\u00f5es sobre o mcMMO e se est\u00e1 ou n\u00e3o em modo de compatibilidade ou totalmente funcional. -Compatibility.Layer.Unsupported=&6Compatibilidade com &a{0}&6 n\u00e3o \u00e9 funcional com esta vers\u00e3o do Minecraft. -Compatibility.Layer.PartialSupport=&6Compatibilidade com &a{0}&6 n\u00e3o \u00e9 totalmente funcional com esta vers\u00e3o do Minecraft, mas o mcMMO est\u00e1 executando um sistema secund\u00e1rio para emular alguns dos recursos ausentes. -Commands.XPBar.DisableAll=&6 Todas as barras de XP do mcMMO est\u00e3o desativadas agora, use /mmoxpbar reset para restaurar as configura\u00e7\u00f5es padr\u00e3o. +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\u2192 &r{1} -Chat.Style.Party=&a(G) &r{0} &a\u2192 &r{1} -Chat.Style.Party.Leader=&a(G) &r{0} &6\u2192 &r{1} +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\u00e3o enviadas automaticamente para o chat &a{0}. -Chat.Channel.Off=&6(&amcMMO-Chat&6) &7Suas mensagens digitadas n\u00e3o ser\u00e3o mais enviadas automaticamente para chats espec\u00edficos. -Chat.Spy.Party=&6[&eESPI\u00c3O&6-&a{2}&6] &r{0} &b\u2192 &r{1} -Broadcasts.LevelUpMilestone=&6(&amcMMO&6) {0}&7 chegou no n\u00edvel &a{1}&7 em &3{2}&7! -Broadcasts.PowerLevelUpMilestone=&6(&amcMMO&6) {0}&7 chegou no N\u00edvel de Poder &a{1}&7! +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 4770b0bec..8950be8fe 100644 --- a/src/main/resources/locale/locale_ru.properties +++ b/src/main/resources/locale/locale_ru.properties @@ -2,43 +2,43 @@ #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\u0443\u043C\u0435\u043D\u0438\u0435 -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 \u0443\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=&6\u0421 \u0443\u0434\u0430\u0447\u0435\u0439 -JSON.JWrapper.Perks.Lucky=\u0428\u0430\u043D\u0441 \u0432\u044B\u0448\u0435 \u043D\u0430 {0}% -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=\u0421\u0442\u0440\u0435\u043B\u044C\u0431\u0430 -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=\u0420\u0430\u0437\u0431\u043E\u0440\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\u0438\u0442\u0435 nossr50 \u0438 \u0435\u0433\u043E \u0440\u0430\u0431\u043E\u0442\u0443 \u043D\u0430\u0434 mcMMO \u043D\u0430 Patreon! -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\u0435\u0441\u0442\u0438 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=&6[ mcMMO&e @&3{0} &6\u0420\u0430\u043D\u0433 &3{1}&6 \u0440\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\u0435\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=&7??? JSON.Hover.Mystery2=&e[&8{0}&e]&8???&r @@ -52,76 +52,76 @@ JSON.Hover.AtSymbolURL=&e@ JSON.Notification.SuperAbility={0} #These are the JSON Strings used for SubSkills -JSON.Acrobatics.Roll.Interaction.Activated=\u0422\u0435\u0441\u0442 &c\u041A\u0443\u0432\u044B\u0440\u043E\u043A \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=&c\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Вы не можете чинить или перерабатывать предметы в стаках - разложите их по одному. #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**\u0423\u041C\u0415\u041D\u0418\u042F \u0412\u041E\u0421\u0421\u0422\u0410\u041D\u041E\u0412\u041B\u0415\u041D\u042B!** +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=\u042D\u0424\u0424\u0415\u041A\u0422\u042B -Effects.SubSkills.Overhaul=\u041F\u043E\u0434\u043D\u0430\u0432\u044B\u043A\u0438 -Effects.Child.Overhaul=&3\u0414\u043E\u0447\u0435\u0440\u043D\u0438\u0439 \u0443\u0440.&e {0}&3: {1} -Effects.Child.ParentList=&a{0}&6(&3\u0423\u0440.&e{1}&6) -Effects.Level.Overhaul=&6\u0423\u0420\u041E\u0412\u0415\u041D\u042C: &e{0} &3\u041E\u041F\u042B\u0422\u0410&e(&6{1}&e/&6{2}&e) +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=\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043A\u0430 -Commands.XPGain.Overhaul=&6\u041F\u041E\u041B\u0423\u0427\u0415\u041D\u041E \u041E\u041F\u042B\u0422\u0410: &3{0} -MOTD.Version.Overhaul=&6[mcMMO] &3\u042D\u0440\u0430 \u043F\u0435\u0440\u0435\u043C\u0435\u043D&6 - &3{0} -Overhaul.mcMMO.Header=&c[]=====[]&a mcMMO - \u042D\u0440\u0430 \u043F\u0435\u0440\u0435\u043C\u0435\u043D &c[]=====[] +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\u041F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0435\u0442\u044C \u044D\u0442\u043E\u0442 \u043D\u0430\u0432\u044B\u043A \u0432 \u0432\u0438\u043A\u0438!&e] +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} \u0443\u0432\u0435\u043B\u0438\u0447\u0435\u043D \u0434\u043E &r&a&l{2}&r&f. -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=\u0421\u0442\u0440\u0435\u043B\u044C\u0431\u0430 -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\u0435\u0440\u0441\u0442\u0432\u043E -Overhaul.Name.Repair=\u041F\u043E\u0447\u0438\u043D\u043A\u0430 -Overhaul.Name.Salvage=\u0420\u0430\u0437\u0431\u043E\u0440\u043A\u0430 -Overhaul.Name.Smelting=\u041F\u0435\u0440\u0435\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\u041A\u043E\u043C\u0430\u043D\u0434\u044B mcMMO&c[]--- -Commands.Other=&c---[]&a\u041E\u0421\u041E\u0411\u042B\u0415 \u041A\u041E\u041C\u0410\u041D\u0414\u042B&c[]--- -Commands.Party.Header=&c-----[]&a\u0413\u0420\u0423\u041F\u041F\u0410&c[]----- -Commands.Party.Features.Header=&c-----[]&a\u0424\u0423\u041D\u041A\u0426\u0418\u0418&c[]----- +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=&6\u041E\u0431\u0443\u0447\u0435\u043D\u0438\u0435 \u043D\u043E\u0432\u043E\u043C\u0443 \u043D\u0430\u0432\u044B\u043A\u0443... -XPBar.Acrobatics=\u0410\u043A\u0440\u043E\u0431\u0430\u0442\u0438\u043A\u0430 \u0443\u0440.&6{0} -XPBar.Alchemy=\u0410\u043B\u0445\u0438\u043C\u0438\u044F \u0443\u0440.&6{0} -XPBar.Archery=\u0421\u0442\u0440\u0435\u043B\u044C\u0431\u0430 \u0443\u0440.&6{0} -XPBar.Axes=\u0422\u043E\u043F\u043E\u0440\u044B \u0443\u0440.&6{0} -XPBar.Excavation=\u0420\u0430\u0441\u043A\u043E\u043F\u043A\u0438 \u0443\u0440.&6{0} -XPBar.Fishing=\u0420\u044B\u0431\u043E\u043B\u043E\u0432\u0441\u0442\u0432\u043E \u0443\u0440.&6{0} -XPBar.Herbalism=\u0422\u0440\u0430\u0432\u043D\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u0443\u0440.&6{0} -XPBar.Mining=\u0428\u0430\u0445\u0442\u0435\u0440\u0441\u0442\u0432\u043E \u0443\u0440.&6{0} -XPBar.Repair=\u041F\u043E\u0447\u0438\u043D\u043A\u0430 \u0443\u0440.&6{0} -XPBar.Salvage=\u0420\u0430\u0437\u0431\u043E\u0440\u043A\u0430 \u0443\u0440.&6{0} -XPBar.Smelting=\u041F\u0435\u0440\u0435\u043F\u043B\u0430\u0432\u043A\u0430 \u0443\u0440.&6{0} -XPBar.Swords=\u041C\u0435\u0447\u0438 \u0443\u0440.&6{0} -XPBar.Taming=\u0423\u043A\u0440\u043E\u0449\u0435\u043D\u0438\u0435 \u0443\u0440.&6{0} -XPBar.Unarmed=\u0411\u0435\u0437\u043E\u0440\u0443\u0436\u043D\u044B\u0439 \u0443\u0440.&6{0} -XPBar.Woodcutting=\u041B\u0435\u0441\u043E\u0440\u0443\u0431\u0441\u0442\u0432\u043E \u0443\u0440.&6{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} &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 @@ -129,1016 +129,1016 @@ XPBar.Complex.Template={0} &3 {4}&f% &3(&f{1}&3/&f{2}&3) # END STYLING #ACROBATICS -Acrobatics.Ability.Proc=&a**\u0413\u0440\u0430\u0446\u0438\u043E\u0437\u043D\u043E\u0435 \u043F\u0440\u0438\u0437\u0435\u043C\u043B\u0435\u043D\u0438\u0435** -Acrobatics.Combat.Proc=&a**\u0423\u043A\u043B\u043E\u043D\u0435\u043D\u0438\u0435** -Acrobatics.SubSkill.Roll.Stats=&6\u0428\u0430\u043D\u0441 \u041A\u0443\u0432\u044B\u0440\u043A\u0430 &e{0}%&6 \u0428\u0430\u043D\u0441 \u0413\u0440\u0430\u0446\u0438\u043E\u0437\u043D\u043E\u0433\u043E \u043A\u0443\u0432\u044B\u0440\u043A\u0430&e {1}% -Acrobatics.SubSkill.Roll.Stat=\u0428\u0430\u043D\u0441 \u041A\u0443\u0432\u044B\u0440\u043A\u0430 -Acrobatics.SubSkill.Roll.Stat.Extra=\u0428\u0430\u043D\u0441 \u0413\u0440\u0430\u0446\u0438\u043E\u0437\u043D\u043E\u0433\u043E \u043A\u0443\u0432\u044B\u0440\u043A\u0430 -Acrobatics.SubSkill.Roll.Name=\u041A\u0443\u0432\u044B\u0440\u043E\u043A -Acrobatics.SubSkill.Roll.Description=\u041F\u0440\u0438\u0437\u0435\u043C\u043B\u044F\u0439\u0442\u0435\u0441\u044C \u043F\u043E-\u0443\u043C\u043D\u043E\u043C\u0443 \u0434\u043B\u044F \u043D\u0438\u0432\u0435\u043B\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F \u0443\u0440\u043E\u043D\u0430. -Acrobatics.SubSkill.Roll.Chance=\u0428\u0430\u043D\u0441 \u041A\u0443\u0432\u044B\u0440\u043A\u0430: &e{0} % -Acrobatics.SubSkill.Roll.GraceChance=\u0428\u0430\u043D\u0441 \u0413\u0440\u0430\u0446\u0438\u043E\u0437\u043D\u043E\u0433\u043E \u043A\u0443\u0432\u044B\u0440\u043A\u0430: &e{0} -Acrobatics.SubSkill.Roll.Mechanics=&7\u041A\u0443\u0432\u044B\u0440\u043E\u043A - \u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0439 \u043F\u043E\u0434\u043D\u0430\u0432\u044B\u043A \u0441 \u043F\u0430\u0441\u0441\u0438\u0432\u043D\u044B\u043C \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442\u043E\u043C.!nasd\u041A\u043E\u0433\u0434\u0430 \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 \u0448\u0430\u043D\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 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043C\u043E\u0441\u0442\u0438 \u043E\u0442 \u0443\u0440\u043E\u0432\u043D\u044F \u043D\u0430\u0432\u044B\u043A\u0430. \u041D\u0430 \u0443\u0440\u043E\u0432\u043D\u0435 &e{6}&7 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044C &e{0}%&7 \u0448\u0430\u043D\u0441 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044C \u0443\u0440\u043E\u043D, \u0438 &e{1}%&7 \u0435\u0441\u043B\u0438 \u0430\u043A\u0442\u0438\u0432\u0438\u0440\u043E\u0432\u0430\u043D \u0418\u0437\u044F\u0449\u043D\u044B\u0439 \u043A\u0443\u0432\u044B\u0440\u043E\u043A.!nasd\u0428\u0430\u043D\u0441 \u0443\u0432\u0435\u043B\u0438\u0447\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 &e{2}&7, \u043D\u0430 \u043A\u043E\u0442\u043E\u0440\u043E\u043C \u043D\u0430\u0432\u044B\u043A \u0434\u043E\u0441\u0442\u0438\u0433\u0430\u0435\u0442 \u043C\u0430\u043A\u0441\u0438\u043C\u0443\u043C\u0430. \u041A\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 &e{3}%&7 \u0448\u0430\u043D\u0441\u0430 \u0443\u0441\u043F\u0435\u0445\u0430.!nasd\u0417\u0430\u0436\u0430\u0432 \u043A\u043D\u043E\u043F\u043A\u0443 \u043F\u0440\u0438\u0441\u0435\u0434\u0430, \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 \u043F\u0440\u0438\u0441\u0435\u0434\u0430 \u043F\u0435\u0440\u0435\u0432\u0435\u0434\u0435\u0442 \u0432\u0430\u0448\u0443 \u0441\u043F\u043E\u0441\u043E\u0431\u043D\u043E\u0441\u0442\u044C \u041A\u0443\u0432\u044B\u0440\u043E\u043A \u0432 \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0435 \u0413\u0440\u0430\u0446\u0438\u043E\u0437\u043D\u043E\u0433\u043E \u043A\u0443\u0432\u044B\u0440\u043A\u0430.!nasd\u041A\u0443\u0432\u044B\u0440\u043E\u043A \u043C\u043E\u0436\u0435\u0442 \u043D\u0438\u0432\u0435\u043B\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0434\u043E &c{4}&7 \u0443\u0440\u043E\u043D\u0430, \u0418\u0437\u044F\u0449\u043D\u044B\u0439 \u043A\u0443\u0432\u044B\u0440\u043E\u043A \u0434\u043E &a{5}&7 \u0443\u0440\u043E\u043D\u0430. -Acrobatics.SubSkill.GracefulRoll.Name=\u0413\u0440\u0430\u0446\u0438\u043E\u0437\u043D\u044B\u0439 \u043A\u0443\u0432\u044B\u0440\u043E\u043A -Acrobatics.SubSkill.GracefulRoll.Description=\u0412\u0434\u0432\u043E\u0435 \u044D\u0444\u0444\u0435\u043A\u0442\u0438\u0432\u043D\u0435\u0435 \u043E\u0431\u044B\u0447\u043D\u043E\u0433\u043E \u041A\u0443\u0432\u044B\u0440\u043A\u0430 -Acrobatics.SubSkill.Dodge.Name=\u0423\u043A\u043B\u043E\u043D\u0435\u043D\u0438\u0435 -Acrobatics.SubSkill.Dodge.Description=\u0423\u043C\u0435\u043D\u044C\u0448\u0435\u043D\u0438\u0435 \u0443\u0440\u043E\u043D\u0430 \u043E\u0442 \u0430\u0442\u0430\u043A\u0438 \u043D\u0430 \u043F\u043E\u043B\u043E\u0432\u0438\u043D\u0443 -Acrobatics.SubSkill.Dodge.Stat=\u0428\u0430\u043D\u0441 \u0423\u043A\u043B\u043E\u043D\u0435\u043D\u0438\u044F -Acrobatics.Listener=\u0410\u043A\u0440\u043E\u0431\u0430\u0442\u0438\u043A\u0430: -Acrobatics.Roll.Text=[[ITALIC]]**\u041A\u0443\u0432\u044B\u0440\u043E\u043A** -Acrobatics.SkillName=\u0410\u041A\u0420\u041E\u0411\u0410\u0422\u0418\u041A\u0410 +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=\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\u0435\u0434\u0438\u0435\u043D\u0442\u043E\u0432 -Alchemy.SubSkill.Concoctions.Stat=\u0420\u0430\u043D\u0433 \u041E\u0442\u0432\u0430\u0440\u043E\u0432: &a{0}&3/&a{1} -Alchemy.SubSkill.Concoctions.Stat.Extra=\u0418\u043D\u0433\u0440\u0435\u0434\u0438\u0435\u043D\u0442\u044B [&a{0}&3]: &a{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\u041E \u0414\u041E {0}+ \u041D\u0410\u0412\u042B\u041A\u0410 (\u041A\u0410\u0422\u0410\u041B\u0418\u0417\u0410\u0422\u041E\u0420) -Alchemy.SkillName=\u0410\u041B\u0425\u0418\u041C\u0418\u042F +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=\u0423\u043C\u0435\u043B\u044B\u0439 \u0432\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\u0430\u043C\u0438 -Archery.SubSkill.SkillShot.Stat=\u0411\u043E\u043D\u0443\u0441\u043D\u044B\u0439 \u0443\u0440\u043E\u043D \u043E\u0442 \u0423\u043C\u0435\u043B\u043E\u0433\u043E \u0432\u044B\u0441\u0442\u0440\u0435\u043B\u0430 -Archery.SubSkill.Daze.Name=\u041E\u0448\u0435\u043B\u043E\u043C\u043B\u0435\u043D\u0438\u0435 -Archery.SubSkill.Daze.Description=\u0414\u0435\u0437\u043E\u0440\u0438\u0435\u043D\u0442\u0438\u0440\u0443\u0435\u0442 \u0438 \u043D\u0430\u043D\u043E\u0441\u0438\u0442 \u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0439 \u0443\u0440\u043E\u043D -Archery.SubSkill.Daze.Stat=\u0428\u0430\u043D\u0441 \u041E\u0448\u0435\u043B\u043E\u043C\u043B\u0435\u043D\u0438\u044F -Archery.SubSkill.ArrowRetrieval.Name=\u0412\u043E\u0437\u0432\u0440\u0430\u0442 \u0441\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\u0442\u0430 \u0441\u0442\u0440\u0435\u043B -Archery.SubSkill.ArcheryLimitBreak.Name=\u0417\u0430\u043F\u0440\u0435\u0434\u0435\u043B\u044C\u043D\u0430\u044F \u0441\u0442\u0440\u0435\u043B\u044C\u0431\u0430 -Archery.SubSkill.ArcheryLimitBreak.Description=\u0412\u044B \u043F\u0440\u0435\u0432\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=\u041C\u0430\u043A\u0441. \u0443\u0440\u043E\u043D \u0417\u0430\u043F\u0440\u0435\u0434\u0435\u043B\u044C\u043D\u043E\u0439 \u0441\u0442\u0440\u0435\u043B\u044C\u0431\u044B -Archery.Listener=\u0421\u0442\u0440\u0435\u043B\u044C\u0431\u0430: -Archery.SkillName=\u0421\u0422\u0420\u0415\u041B\u042C\u0411\u0410 +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=\u0412\u043B\u0430\u0434\u0435\u043D\u0438\u0435 \u0442\u043E\u043F\u043E\u0440\u043E\u043C -Axes.Ability.Bonus.1=\u0411\u043E\u043D\u0443\u0441 {0} \u0443\u0440\u043E\u043D\u0430 -Axes.Ability.Bonus.2=\u0411\u0440\u043E\u043D\u0435\u0431\u043E\u0439\u043D\u044B\u0439 \u0443\u0434\u0430\u0440 -Axes.Ability.Bonus.3=\u041D\u0430\u043D\u043E\u0441\u0438\u0442 {0} \u0431\u043E\u043D\u0443\u0441\u043D\u043E\u0433\u043E \u0443\u0440\u043E\u043D\u0430 \u0431\u0440\u043E\u043D\u0435 -Axes.Ability.Bonus.4=\u041C\u043E\u0449\u043D\u044B\u0439 \u0443\u0434\u0430\u0440 -Axes.Ability.Bonus.5=\u041D\u0430\u043D\u043E\u0441\u0438\u0442 {0} \u0431\u043E\u043D\u0443\u0441\u043D\u043E\u0433\u043E \u0443\u0440\u043E\u043D\u0430 \u043D\u0435\u0431\u0440\u043E\u043D\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u043C \u0432\u0440\u0430\u0433\u0430\u043C -Axes.Ability.Lower=&7\u0412\u044B \u043E\u043F\u0443\u0441\u0442\u0438\u043B\u0438 \u0441\u0432\u043E\u0439 \u0442\u043E\u043F\u043E\u0440. -Axes.Ability.Ready=&3\u0412\u044B &6\u043F\u043E\u0434\u0433\u043E\u0442\u043E\u0432\u0438\u043B\u0438&3 \u0441\u0432\u043E\u0439 \u0442\u043E\u043F\u043E\u0440. -Axes.Ability.Ready.Extra=&3\u0412\u044B &6\u043F\u043E\u0434\u0433\u043E\u0442\u043E\u0432\u0438\u043B\u0438&3 \u0441\u0432\u043E\u0439 \u0442\u043E\u043F\u043E\u0440. &7({0} \u043D\u0430 \u043E\u0442\u043A\u0430\u0442\u0435 {1}\u0441) -Axes.Combat.CritStruck=&4\u0412\u0430\u043C \u043D\u0430\u043D\u0435\u0441\u0435\u043D \u041A\u0420\u0418\u0422\u0418\u0427\u0415\u0421\u041A\u0418\u0419 \u0443\u0434\u0430\u0440! -Axes.Combat.CriticalHit=\u041A\u0420\u0418\u0422\u0418\u0427\u0415\u0421\u041A\u0418\u0419 \u0423\u0414\u0410\u0420! -Axes.Combat.GI.Proc=&a**\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 \u041C\u041E\u0429\u041D\u042B\u041C \u0423\u0414\u0410\u0420\u041E\u041C** -Axes.Combat.SS.Struck=&4\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.SubSkill.SkullSplitter.Name=\u0420\u0430\u0441\u043A\u0430\u043B\u044B\u0432\u0430\u0442\u0435\u043B\u044C \u0447\u0435\u0440\u0435\u043F\u043E\u0432 -Axes.SubSkill.SkullSplitter.Description=\u041D\u0430\u043D\u043E\u0441\u0438\u0442 \u0443\u0434\u0430\u0440 \u043F\u043E \u043E\u0431\u043B\u0430\u0441\u0442\u0438 -Axes.SubSkill.SkullSplitter.Stat=\u041F\u0440\u043E\u0434\u043E\u043B\u0436\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u044C \u0420\u0430\u0441\u043A\u0430\u043B\u044B\u0432\u0430\u0442\u0435\u043B\u044F \u0447\u0435\u0440\u0435\u043F\u043E\u0432 -Axes.SubSkill.CriticalStrikes.Name=\u041A\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043A\u0438\u0439 \u0443\u0434\u0430\u0440 -Axes.SubSkill.CriticalStrikes.Description=\u0414\u0432\u043E\u0439\u043D\u043E\u0439 \u0443\u0440\u043E\u043D -Axes.SubSkill.CriticalStrikes.Stat=\u0428\u0430\u043D\u0441 \u041A\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0433\u043E \u0443\u0434\u0430\u0440\u0430 -Axes.SubSkill.AxeMastery.Name=\u0412\u043B\u0430\u0434\u0435\u043D\u0438\u0435 \u0442\u043E\u043F\u043E\u0440\u043E\u043C -Axes.SubSkill.AxeMastery.Description=\u041D\u0430\u043D\u043E\u0441\u0438\u0442 \u0431\u043E\u043D\u0443\u0441\u043D\u044B\u0439 \u0443\u0440\u043E\u043D -Axes.SubSkill.AxesLimitBreak.Name=\u0417\u0430\u043F\u0440\u0435\u0434\u0435\u043B\u044C\u043D\u044B\u0435 \u0442\u043E\u043F\u043E\u0440\u044B -Axes.SubSkill.AxesLimitBreak.Description=\u0412\u044B \u043F\u0440\u0435\u0432\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=\u041C\u0430\u043A\u0441. \u0443\u0440\u043E\u043D \u0417\u0430\u043F\u0440\u0435\u0434\u0435\u043B\u044C\u043D\u044B\u0445 \u0442\u043E\u043F\u043E\u0440\u043E\u0432 -Axes.SubSkill.ArmorImpact.Name=\u0411\u0440\u043E\u043D\u0435\u0431\u043E\u0439\u043D\u044B\u0439 \u0443\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=\u041C\u043E\u0449\u043D\u044B\u0439 \u0443\u0434\u0430\u0440 -Axes.SubSkill.GreaterImpact.Description=\u041D\u0430\u043D\u043E\u0441\u0438\u0442 \u0431\u043E\u043D\u0443\u0441\u043D\u044B\u0439 \u0443\u0440\u043E\u043D\u0430 \u043D\u0435\u0431\u0440\u043E\u043D\u0438\u0440\u043E\u0432\u0430\u043D\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=**\u0420\u0430\u0441\u043A\u0430\u043B\u044B\u0432\u0430\u0442\u0435\u043B\u044C \u0447\u0435\u0440\u0435\u043F\u043E\u0432 \u043F\u0440\u0435\u043A\u0440\u0430\u0442\u0438\u043B \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435** -Axes.Skills.SS.On=&a**\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** -Axes.Skills.SS.Refresh=&a\u0412\u0430\u0448\u0435 \u0443\u043C\u0435\u043D\u0438\u0435 &e\u0420\u0430\u0441\u043A\u0430\u043B\u044B\u0432\u0430\u0442\u0435\u043B\u044C \u0447\u0435\u0440\u0435\u043F\u043E\u0432 &a\u0432\u043E\u0441\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E! -Axes.Skills.SS.Other.Off=\u0420\u0430\u0441\u043A\u0430\u043B\u044B\u0432\u0430\u0442\u0435\u043B\u044C \u0447\u0435\u0440\u0435\u043F\u043E\u0432&a \u043F\u0440\u0435\u043A\u0440\u0430\u0442\u0438\u043B \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0443 &e{0} -Axes.Skills.SS.Other.On=&a{0}&2 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043B &c\u0420\u0430\u0441\u043A\u0430\u043B\u044B\u0432\u0430\u0442\u0435\u043B\u044C \u0447\u0435\u0440\u0435\u043F\u043E\u0432! +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\u0412\u044B \u043E\u043F\u0443\u0441\u0442\u0438\u043B\u0438 \u0441\u0432\u043E\u044E \u043B\u043E\u043F\u0430\u0442\u0443. -Excavation.Ability.Ready=&3\u0412\u044B &6\u043F\u043E\u0434\u0433\u043E\u0442\u043E\u0432\u0438\u043B\u0438&e \u0441\u0432\u043E\u044E \u043B\u043E\u043F\u0430\u0442\u0443. -Excavation.SubSkill.GigaDrillBreaker.Name=\u0413\u0438\u0433\u0430-\u0431\u0443\u0440 -Excavation.SubSkill.GigaDrillBreaker.Description=3x \u0434\u043E\u0431\u044B\u0447\u0430, 3x \u043E\u043F\u044B\u0442, +\u0441\u043A\u043E\u0440\u043E\u0441\u0442\u044C -Excavation.SubSkill.GigaDrillBreaker.Stat=\u041F\u0440\u043E\u0434\u043E\u043B\u0436\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u044C \u0413\u0438\u0433\u0430-\u0431\u0443\u0440\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\u0435 \u0442\u0430\u0439\u043D\u044B \u0437\u0435\u043C\u043B\u0438! \u041F\u043E\u0432\u044B\u0448\u0435\u043D\u0438\u0435 \u0443\u0440\u043E\u0432\u043D\u044F \u0443\u0432\u0435\u043B\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0448\u0430\u043D\u0441\u044B \u043F\u043E\u043B\u0443\u0447\u0435\u043D\u0438\u044F \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! -Excavation.SubSkill.Archaeology.Stat=\u0428\u0430\u043D\u0441 \u043F\u043E\u043B\u0443\u0447\u0435\u043D\u0438\u044F \u043E\u043F\u044B\u0442\u0430 \u0410\u0440\u0445\u0435\u043E\u043B\u043E\u0433\u0438\u0438 -Excavation.SubSkill.Archaeology.Stat.Extra=\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u043E\u043F\u044B\u0442\u0430 \u0410\u0440\u0445\u0435\u043E\u043B\u043E\u0433\u0438\u0438 -Excavation.Listener=\u0420\u0430\u0441\u043A\u043E\u043F\u043A\u0438: -Excavation.SkillName=\u0420\u0410\u0421\u041A\u041E\u041F\u041A\u0418 -Excavation.Skills.GigaDrillBreaker.Off=**\u0413\u0438\u0433\u0430-\u0431\u0443\u0440 \u043F\u0440\u0435\u043A\u0440\u0430\u0442\u0438\u043B \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435** -Excavation.Skills.GigaDrillBreaker.On=&a**\u0413\u0418\u0413\u0410-\u0411\u0423\u0420 \u0410\u041A\u0422\u0418\u0412\u0418\u0420\u041E\u0412\u0410\u041D** -Excavation.Skills.GigaDrillBreaker.Refresh=&a\u0412\u0430\u0448\u0435 \u0443\u043C\u0435\u043D\u0438\u0435 &e\u0413\u0438\u0433\u0430-\u0431\u0443\u0440 &a\u0432\u043E\u0441\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E! -Excavation.Skills.GigaDrillBreaker.Other.Off=\u0413\u0438\u0433\u0430-\u0431\u0443\u0440&a \u043F\u0440\u0435\u043A\u0440\u0430\u0442\u0438\u043B \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0443 &e{0} -Excavation.Skills.GigaDrillBreaker.Other.On=&a{0}&2 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043B &c\u0413\u0438\u0433\u0430-\u0431\u0443\u0440! +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\u0412 \u044D\u0442\u043E\u0439 \u0437\u043E\u043D\u0435 \u043D\u0435 \u043F\u0440\u0430\u043A\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u043D\u0435 \u043E\u0441\u0442\u0430\u043B\u043E\u0441\u044C \u0440\u044B\u0431\u044B - \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, \u0445\u043E\u0442\u044F \u0431\u044B \u043D\u0430 {0} \u0431\u043B\u043E\u043A\u043E\u0432 \u0434\u0430\u043B\u044C\u0448\u0435 \u043E\u0442\u0441\u044E\u0434\u0430. -Fishing.Scared=&7&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=&c&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 \u0432\u044B\u0437\u044B\u0432\u0435\u0442 \u0443\u0441\u0442\u0430\u043B\u043E\u0441\u0442\u044C \u0438 \u0438\u0437\u043D\u043E\u0441 \u0443\u0434\u043E\u0447\u043A\u0438! -Fishing.LowResourcesTip=&7\u0412\u044B \u043F\u043E\u043D\u0438\u043C\u0430\u0435\u0442\u0435, \u0447\u0442\u043E \u0432 \u044D\u0442\u043E\u043C \u0440\u0430\u0439\u043E\u043D\u0435 \u043E\u0441\u0442\u0430\u043B\u043E\u0441\u044C \u043C\u0430\u043B\u043E \u0440\u044B\u0431\u044B. \u041F\u043E\u043F\u0440\u043E\u0431\u0443\u0439\u0442\u0435 \u0440\u044B\u0431\u0430\u0447\u0438\u0442\u044C \u043D\u0430 {0} \u0431\u043B\u043E\u043A\u043E\u0432 \u0434\u0430\u043B\u044C\u0448\u0435 \u043E\u0442\u0441\u044E\u0434\u0430. -Fishing.Ability.Info=\u041E\u0445\u043E\u0442\u043D\u0438\u043A \u0437\u0430 \u0447\u0443\u0434\u0435\u0441\u0430\u043C\u0438: &7 **\u0421\u043E\u0432\u0435\u0440\u0448\u0435\u043D\u0441\u0442\u0432\u0443\u0435\u0442\u0441\u044F \u0441 \u0440\u0430\u043D\u0433\u043E\u043C \u041E\u0445\u043E\u0442\u043D\u0438\u043A\u0430 \u0437\u0430 \u0441\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 {0}+ \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 {0}+ \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 {0}+ \u041D\u0410\u0412\u042B\u041A\u0410 (\u041C\u0410\u0421\u0422\u0415\u0420-\u0420\u042B\u0411\u041E\u041B\u041E\u0412) -Fishing.SubSkill.TreasureHunter.Name=\u041E\u0445\u043E\u0442\u043D\u0438\u043A \u0437\u0430 \u0441\u043E\u043A\u0440\u043E\u0432\u0438\u0449\u0430\u043C\u0438 -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 \u0441\u043E\u043A\u0440\u043E\u0432\u0438\u0449\u0430\u043C\u0438: &a{0}&3/&a{1} -Fishing.SubSkill.TreasureHunter.Stat.Extra=\u0428\u0430\u043D\u0441 \u0434\u043E\u0431\u044B\u0447\u0438: &7\u041E\u0431\u044B\u0447\u043D\u043E\u0435: &e{0} &a\u041D\u0435\u043E\u0431\u044B\u0447\u043D\u043E\u0435: &e{1}!nasd&9\u0420\u0435\u0434\u043A\u043E\u0435: &e{2} &d\u042D\u043F\u0438\u0447\u0435\u0441\u043A\u043E\u0435: &e{3} &6\u041B\u0435\u0433\u0435\u043D\u0434\u0430\u0440\u043D\u043E\u0435: &e{4} &b\u041C\u0438\u0444\u0438\u0447\u0435\u0441\u043A\u043E\u0435: &e{5} -Fishing.SubSkill.MagicHunter.Name=\u041E\u0445\u043E\u0442\u043D\u0438\u043A \u0437\u0430 \u0447\u0443\u0434\u0435\u0441\u0430\u043C\u0438 -Fishing.SubSkill.MagicHunter.Description=\u041D\u0430\u0445\u043E\u0434\u043A\u0430 \u0437\u0430\u0447\u0430\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0445 \u043F\u0440\u0435\u0434\u043C\u0435\u0442\u043E\u0432 -Fishing.SubSkill.MagicHunter.Stat=\u0428\u0430\u043D\u0441 \u041E\u0445\u043E\u0442\u043D\u0438\u043A\u0430 \u0437\u0430 \u0447\u0443\u0434\u0435\u0441\u0430\u043C\u0438 -Fishing.SubSkill.Shake.Name=\u0412\u0441\u0442\u0440\u044F\u0441\u043A\u0430 -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 \u0438 \u0438\u0433\u0440\u043E\u043A\u043E\u0432 \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u0443\u0434\u043E\u0447\u043A\u0438 -Fishing.SubSkill.Shake.Stat=\u0428\u0430\u043D\u0441 \u0412\u0441\u0442\u0440\u044F\u0441\u043A\u0438 -Fishing.SubSkill.FishermansDiet.Name=\u0420\u044B\u0431\u0430\u0446\u043A\u0430\u044F \u0434\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 \u0434\u0438\u0435\u0442\u0430:&a \u0420\u0430\u043D\u0433 {0} -Fishing.SubSkill.MasterAngler.Name=\u041C\u0430\u0441\u0442\u0435\u0440-\u0440\u044B\u0431\u043E\u043B\u043E\u0432 -Fishing.SubSkill.MasterAngler.Description=\u0420\u044B\u0431\u0430 \u043B\u043E\u0432\u0438\u0442\u0441\u044F \u0447\u0430\u0449\u0435, \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u043B\u0443\u0447\u0448\u0435 \u043F\u0440\u0438 \u0440\u044B\u0431\u0430\u043B\u043A\u0435 \u0441 \u043B\u043E\u0434\u043A\u0438. -Fishing.SubSkill.MasterAngler.Stat=\u0423\u043C\u0435\u043D\u044C\u0448\u0435\u043D\u0438\u0435 \u043C\u0438\u043D\u0438\u043C\u0430\u043B\u044C\u043D\u043E\u0433\u043E \u043E\u0436\u0438\u0434\u0430\u043D\u0438\u044F \u043A\u043B\u0451\u0432\u0430: &a-{0} \u0441\u0435\u043A\u0443\u043D\u0434 -Fishing.SubSkill.MasterAngler.Stat.Extra=\u0423\u043C\u0435\u043D\u044C\u0448\u0435\u043D\u0438\u0435 \u043C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u043E\u0433\u043E \u043E\u0436\u0438\u0434\u0430\u043D\u0438\u044F \u043A\u043B\u0451\u0432\u0430: &a-{0} \u0441\u0435\u043A\u0443\u043D\u0434 -Fishing.SubSkill.IceFishing.Name=\u041F\u043E\u0434\u043B\u0435\u0434\u043D\u0430\u044F \u0440\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 \u0440\u044B\u0431\u0430\u043B\u043A\u0430 -Fishing.Chance.Raining=&9 \u0411\u043E\u043D\u0443\u0441 \u0434\u043E\u0436\u0434\u044F -Fishing.Listener=\u0420\u044B\u0431\u043E\u043B\u043E\u0432\u0441\u0442\u0432\u043E: -Fishing.Ability.TH.MagicFound=&7\u0422\u044B \u0447\u0443\u0432\u0441\u0442\u0432\u0443\u0435\u0448\u044C \u043D\u0435\u0447\u0442\u043E \u0447\u0443\u0434\u043E\u0442\u0432\u043E\u0440\u043D\u043E\u0435 \u043E\u0442 \u044D\u0442\u043E\u0433\u043E \u0443\u043B\u043E\u0432\u0430... -Fishing.Ability.TH.Boom=&7\u0412\u0420\u0415\u041C\u042F \u0412\u0417\u0420\u042B\u0412\u0410\u0422\u042C!!! -Fishing.Ability.TH.Poison=&7\u041F\u0430\u0445\u043D\u0435\u0442 \u0447\u0435\u043C-\u0442\u043E \u0441\u043E\u043C\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u043C... -Fishing.SkillName=\u0420\u042B\u0411\u041E\u041B\u041E\u0412\u0421\u0422\u0412\u041E +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=\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.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=&a**\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.Lower=&7\u0412\u044B \u043E\u043F\u0443\u0441\u0442\u0438\u043B\u0438 \u0441\u0432\u043E\u044E \u043C\u043E\u0442\u044B\u0433\u0443. -Herbalism.Ability.Ready=&3\u0412\u044B &6\u043F\u043E\u0434\u0433\u043E\u0442\u043E\u0432\u0438\u043B\u0438&3 \u0441\u0432\u043E\u044E \u043C\u043E\u0442\u044B\u0433\u0443. -Herbalism.Ability.ShroomThumb.Fail=**\u0413\u0420\u0418\u0411\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.SubSkill.GreenTerra.Name=\u041E\u0437\u0435\u043B\u0435\u043D\u0435\u043D\u0438\u0435 -Herbalism.SubSkill.GreenTerra.Description=\u0420\u0430\u0441\u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0435\u043D\u0438\u0435 \u0437\u0435\u043B\u0435\u043D\u0438, 3x \u0434\u043E\u0431\u044B\u0447\u0430, \u0443\u043B\u0443\u0447\u0448\u0430\u0435\u0442 \u0416\u0438\u0432\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0435 \u043F\u0440\u0438\u043A\u043E\u0441\u043D\u043E\u0432\u0435\u043D\u0438\u0435 -Herbalism.SubSkill.GreenTerra.Stat=\u0414\u043B\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u044C \u041E\u0437\u0435\u043B\u0435\u043D\u0435\u043D\u0438\u044F -Herbalism.SubSkill.GreenThumb.Name=\u0416\u0438\u0432\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0435 \u043F\u0440\u0438\u043A\u043E\u0441\u043D\u043E\u0432\u0435\u043D\u0438\u0435 -Herbalism.SubSkill.GreenThumb.Description=\u0410\u0432\u0442\u043E\u043F\u043E\u0441\u0430\u0434\u043A\u0430 \u0440\u0430\u0441\u0442\u0435\u043D\u0438\u0439 \u043F\u0440\u0438 \u0441\u0431\u043E\u0440\u0435 \u0443\u0440\u043E\u0436\u0430\u044F \u043C\u043E\u0442\u044B\u0433\u043E\u0439 -Herbalism.SubSkill.GreenThumb.Stat=\u0428\u0430\u043D\u0441 \u0416\u0438\u0432\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0433\u043E \u043F\u0440\u0438\u043A\u043E\u0441\u043D\u043E\u0432\u0435\u043D\u0438\u044F -Herbalism.SubSkill.GreenThumb.Stat.Extra=\u0421\u0442\u0430\u0434\u0438\u044F \u0416\u0438\u0432\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0433\u043E \u043F\u0440\u0438\u043A\u043E\u0441\u043D\u043E\u0432\u0435\u043D\u0438\u044F: &a \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 \u043F\u0440\u0438\u043A\u043E\u0441\u043D\u043E\u0432\u0435\u043D\u0438\u0435 (\u0431\u043B\u043E\u043A\u0438) -Herbalism.SubSkill.GreenThumb.Description.2=\u041F\u043E\u043A\u0440\u044B\u0432\u0430\u0435\u0442 \u043A\u0438\u0440\u043F\u0438\u0447\u0438 \u043C\u0445\u043E\u043C \u0438\u043B\u0438 \u0440\u0430\u0441\u0442\u0438\u0442 \u0442\u0440\u0430\u0432\u0443 -Herbalism.SubSkill.FarmersDiet.Name=\u0424\u0435\u0440\u043C\u0435\u0440\u0441\u043A\u0430\u044F \u0434\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 \u0434\u0438\u0435\u0442\u0430: &a\u0420\u0430\u043D\u0433 {0} -Herbalism.SubSkill.DoubleDrops.Name=\u0414\u0432\u043E\u0439\u043D\u0430\u044F \u0434\u043E\u0431\u044B\u0447\u0430 -Herbalism.SubSkill.DoubleDrops.Description=\u0423\u0434\u0432\u0430\u0438\u0432\u0430\u0435\u0442 \u043E\u0431\u044B\u0447\u043D\u0443\u044E \u0434\u043E\u0431\u044B\u0447\u0443 -Herbalism.SubSkill.DoubleDrops.Stat=\u0428\u0430\u043D\u0441 \u0414\u0432\u043E\u0439\u043D\u043E\u0439 \u0434\u043E\u0431\u044B\u0447\u0438 -Herbalism.SubSkill.HylianLuck.Name=\u0425\u0430\u0439\u043B\u0438\u0439\u0441\u043A\u0430\u044F \u0443\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=\u0428\u0430\u043D\u0441 \u0425\u0430\u0439\u043B\u0438\u0439\u0441\u043A\u043E\u0439 \u0443\u0434\u0430\u0447\u0438 -Herbalism.SubSkill.ShroomThumb.Name=\u0413\u0440\u0438\u0431\u043D\u043E\u0435 \u043F\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 \u0434\u0451\u0440\u043D -Herbalism.SubSkill.ShroomThumb.Stat=\u0428\u0430\u043D\u0441 \u0413\u0440\u0438\u0431\u043D\u043E\u0433\u043E \u043F\u0440\u0438\u043A\u043E\u0441\u043D\u043E\u0432\u0435\u043D\u0438\u044F -Herbalism.HylianLuck=&a\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=**\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\u0438\u0435** -Herbalism.Skills.GTe.On=&a**\u041E\u0417\u0415\u041B\u0415\u041D\u0415\u041D\u0418\u0415 \u0410\u041A\u0422\u0418\u0412\u0418\u0420\u041E\u0412\u0410\u041D\u041E** -Herbalism.Skills.GTe.Refresh=&a\u0412\u0430\u0448\u0435 \u0443\u043C\u0435\u043D\u0438\u0435 &e\u041E\u0437\u0435\u043B\u0435\u043D\u0435\u043D\u0438\u0435 &a\u0432\u043E\u0441\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E! -Herbalism.Skills.GTe.Other.Off=\u041E\u0437\u0435\u043B\u0435\u043D\u0435\u043D\u0438\u0435&a \u043F\u0440\u0435\u043A\u0440\u0430\u0442\u0438\u043B\u043E \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0443 &e{0} -Herbalism.Skills.GTe.Other.On=&a{0}&2 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043B &c\u041E\u0437\u0435\u043B\u0435\u043D\u0435\u043D\u0438\u0435! +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=\u0417\u0410\u0411\u041B\u041E\u041A\u0418\u0420\u041E\u0412\u0410\u041D\u041E \u0414\u041E {0}+ \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 {0}+ \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 {0}+ \u041D\u0410\u0412\u042B\u041A\u0410 (\u042D\u041A\u0421\u041F\u0415\u0420\u0422 \u0412\u0417\u0420\u042B\u0412\u041E\u0412) -Mining.Ability.Lower=&7\u0412\u044B \u043E\u043F\u0443\u0441\u0442\u0438\u043B\u0438 \u0441\u0432\u043E\u044E \u043A\u0438\u0440\u043A\u0443. -Mining.Ability.Ready=&3\u0412\u044B &6\u043F\u043E\u0434\u0433\u043E\u0442\u043E\u0432\u0438\u043B\u0438&3 \u0441\u0432\u043E\u044E \u043A\u0438\u0440\u043A\u0443. -Mining.SubSkill.SuperBreaker.Name=\u0421\u0443\u043F\u0435\u0440\u043A\u0440\u0443\u0448\u0438\u0442\u0435\u043B\u044C -Mining.SubSkill.SuperBreaker.Description=\u0421\u043A\u043E\u0440\u043E\u0441\u0442\u044C+, \u0448\u0430\u043D\u0441 \u0442\u0440\u043E\u0439\u043D\u043E\u0439 \u0434\u043E\u0431\u044B\u0447\u0438 -Mining.SubSkill.SuperBreaker.Stat=\u0414\u043B\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u044C \u0421\u0443\u043F\u0435\u0440\u043A\u0440\u0443\u0448\u0438\u0442\u0435\u043B\u044F -Mining.SubSkill.DoubleDrops.Name=\u0414\u0432\u043E\u0439\u043D\u0430\u044F \u0434\u043E\u0431\u044B\u0447\u0430 -Mining.SubSkill.DoubleDrops.Description=\u0423\u0434\u0432\u0430\u0438\u0432\u0430\u0435\u0442 \u043E\u0431\u044B\u0447\u043D\u0443\u044E \u0434\u043E\u0431\u044B\u0447\u0443 -Mining.SubSkill.DoubleDrops.Stat=\u0428\u0430\u043D\u0441 \u0414\u0432\u043E\u0439\u043D\u043E\u0439 \u0434\u043E\u0431\u044B\u0447\u0438 -Mining.SubSkill.BlastMining.Name=\u041F\u043E\u0434\u0440\u044B\u0432\u043D\u0430\u044F \u0434\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 \u0434\u0438\u043D\u0430\u043C\u0438\u0442\u0430 -Mining.SubSkill.BlastMining.Stat=\u041F\u043E\u0434\u0440\u044B\u0432\u043D\u0430\u044F \u0434\u043E\u0431\u044B\u0447\u0430:&a \u0420\u0430\u043D\u0433 {0}/{1} &7({2}) -Mining.SubSkill.BlastMining.Stat.Extra=\u0423\u0432\u0435\u043B\u0438\u0447\u0435\u043D\u0438\u0435 \u0440\u0430\u0434\u0438\u0443\u0441\u0430 \u0432\u0437\u0440\u044B\u0432\u0430: &a+{0} -Mining.SubSkill.BiggerBombs.Name=\u0411\u043E\u043B\u044C\u0448\u0438\u0435 \u0431\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 \u0434\u0438\u043D\u0430\u043C\u0438\u0442\u0430 -Mining.SubSkill.DemolitionsExpertise.Name=\u042D\u043A\u0441\u043F\u0435\u0440\u0442\u0438\u0437\u0430 \u043F\u043E\u0434\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 \u0434\u0438\u043D\u0430\u043C\u0438\u0442\u0430 -Mining.SubSkill.DemolitionsExpertise.Stat=\u0423\u043C\u0435\u043D\u044C\u0448\u0435\u043D\u0438\u0435 \u0443\u0440\u043E\u043D\u0430 \u042D\u043A\u0441\u043F\u0435\u0440\u0442\u0438\u0437\u044B \u043F\u043E\u0434\u0440\u044B\u0432\u043E\u0432 +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=\u0428\u0430\u0445\u0442\u0435\u0440\u0441\u0442\u0432\u043E: -Mining.SkillName=\u0428\u0410\u0425\u0422\u0415\u0420\u0421\u0422\u0412\u041E -Mining.Skills.SuperBreaker.Off=**\u0421\u0443\u043F\u0435\u0440\u043A\u0440\u0443\u0448\u0438\u0442\u0435\u043B\u044C \u043F\u0440\u0435\u043A\u0440\u0430\u0442\u0438\u043B \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435** -Mining.Skills.SuperBreaker.On=&a**\u0421\u0423\u041F\u0415\u0420\u041A\u0420\u0423\u0428\u0418\u0422\u0415\u041B\u042C \u0410\u041A\u0422\u0418\u0412\u0418\u0420\u041E\u0412\u0410\u041D** -Mining.Skills.SuperBreaker.Other.Off=\u0421\u0443\u043F\u0435\u0440\u043A\u0440\u0443\u0448\u0438\u0442\u0435\u043B\u044C&a \u043F\u0440\u0435\u043A\u0440\u0430\u0442\u0438\u043B \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0443 &e{0} -Mining.Skills.SuperBreaker.Other.On=&a{0}&2 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043B &c\u0421\u0443\u043F\u0435\u0440\u043A\u0440\u0443\u0448\u0438\u0442\u0435\u043B\u044C! -Mining.Skills.SuperBreaker.Refresh=&a\u0412\u0430\u0448\u0435 \u0443\u043C\u0435\u043D\u0438\u0435 &e\u0421\u0443\u043F\u0435\u0440\u043A\u0440\u0443\u0448\u0438\u0442\u0435\u043B\u044C &a\u0432\u043E\u0441\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E! +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**\u0411\u0423\u041C** +Mining.Blast.Boom=&7**БУМ** Mining.Blast.Cooldown= -Mining.Blast.Effect=+{0} \u0440\u0443\u0434\u044B, {1}x \u0434\u043E\u0431\u044B\u0447\u0430 -Mining.Blast.Other.On=&a{0}&2 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043B &c\u041F\u043E\u0434\u0440\u044B\u0432\u043D\u0443\u044E \u0434\u043E\u0431\u044B\u0447\u0443! -Mining.Blast.Refresh=&a\u0412\u0430\u0448\u0435 \u0443\u043C\u0435\u043D\u0438\u0435 &e\u041F\u043E\u0434\u0440\u044B\u0432\u043D\u0430\u044F \u0434\u043E\u0431\u044B\u0447\u0430 &a\u0432\u043E\u0441\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E! +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=\u0420\u0435\u043C\u043E\u043D\u0442 -Repair.SubSkill.Repair.Description=\u0420\u0435\u043C\u043E\u043D\u0442 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u043E\u0432 \u0438 \u0431\u0440\u043E\u043D\u0438 -Repair.SubSkill.GoldRepair.Name=\u0417\u043E\u043B\u043E\u0442\u043E\u0439 \u0440\u0435\u043C\u043E\u043D\u0442 ({0}+ \u041D\u0410\u0412\u042B\u041A) -Repair.SubSkill.GoldRepair.Description=\u0420\u0435\u043C\u043E\u043D\u0442 \u0437\u043E\u043B\u043E\u0442\u044B\u0445 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u043E\u0432 \u0438 \u0431\u0440\u043E\u043D\u0438 -Repair.SubSkill.IronRepair.Name=\u0416\u0435\u043B\u0435\u0437\u043D\u044B\u0439 \u0440\u0435\u043C\u043E\u043D\u0442 ({0}+ \u041D\u0410\u0412\u042B\u041A) -Repair.SubSkill.IronRepair.Description=\u0420\u0435\u043C\u043E\u043D\u0442 \u0436\u0435\u043B\u0435\u0437\u043D\u044B\u0445 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u043E\u0432 \u0438 \u0431\u0440\u043E\u043D\u0438 -Repair.SubSkill.StoneRepair.Name=\u041A\u0430\u043C\u0435\u043D\u043D\u044B\u0439 \u0440\u0435\u043C\u043E\u043D\u0442 ({0}+ \u041D\u0410\u0412\u042B\u041A) -Repair.SubSkill.StoneRepair.Description=\u0420\u0435\u043C\u043E\u043D\u0442 \u043A\u0430\u043C\u0435\u043D\u043D\u044B\u0445 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u043E\u0432 -Repair.SubSkill.RepairMastery.Name=\u041C\u0430\u0441\u0442\u0435\u0440\u0441\u0442\u0432\u043E \u0440\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\u0441\u0442\u0432\u043E \u0440\u0435\u043C\u043E\u043D\u0442\u0430: &a\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\u0440\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=\u0428\u0430\u043D\u0441 \u0421\u0443\u043F\u0435\u0440\u0440\u0435\u043C\u043E\u043D\u0442\u0430 -Repair.SubSkill.DiamondRepair.Name=\u0410\u043B\u043C\u0430\u0437\u043D\u044B\u0439 \u0440\u0435\u043C\u043E\u043D\u0442 ({0}+ \u041D\u0410\u0412\u042B\u041A) -Repair.SubSkill.DiamondRepair.Description=\u0420\u0435\u043C\u043E\u043D\u0442 \u0430\u043B\u043C\u0430\u0437\u043D\u044B\u0445 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u043E\u0432 \u0438 \u0431\u0440\u043E\u043D\u0438 -Repair.SubSkill.ArcaneForging.Name=\u0412\u043E\u043B\u0448\u0435\u0431\u043D\u0430\u044F \u043A\u043E\u0432\u043A\u0430 -Repair.SubSkill.ArcaneForging.Description=\u0420\u0435\u043C\u043E\u043D\u0442 \u0432\u043E\u043B\u0448\u0435\u0431\u043D\u044B\u0445 \u043F\u0440\u0435\u0434\u043C\u0435\u0442\u043E\u0432 -Repair.SubSkill.ArcaneForging.Stat=\u0412\u043E\u043B\u0448\u0435\u0431\u043D\u0430\u044F \u043A\u043E\u0432\u043A\u0430: &e\u0420\u0430\u043D\u0433 {0}/{1} -Repair.SubSkill.ArcaneForging.Stat.Extra=&3\u0428\u0430\u043D\u0441\u044B \u0412\u043E\u043B\u0448\u0435\u0431\u043D\u043E\u0439 \u043A\u043E\u0432\u043A\u0438:&7 \u0443\u0441\u043F\u0435\u0445 &a{0}&7%, \u043F\u0440\u043E\u0432\u0430\u043B &c{1}&7% -Repair.Error=&4\u0412 mcMMO \u043F\u0440\u043E\u0438\u0437\u043E\u0448\u043B\u0430 \u043E\u0448\u0438\u0431\u043A\u0430 \u043F\u0440\u0438 \u043F\u043E\u043F\u044B\u0442\u043A\u0435 \u043F\u043E\u0447\u0438\u043D\u0438\u0442\u044C \u044D\u0442\u043E\u0442 \u043F\u0440\u0435\u0434\u043C\u0435\u0442! -Repair.Listener.Anvil=&4\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=&4\u0412\u044B \u043D\u0435\u0434\u043E\u0441\u0442\u0430\u0442\u043E\u0447\u043D\u043E \u0443\u043C\u0435\u043B\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=&4\u0412\u044B \u043D\u0435\u0434\u043E\u0441\u0442\u0430\u0442\u043E\u0447\u043D\u043E \u0443\u043C\u0435\u043B\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=&4\u0412\u044B \u043D\u0435\u0434\u043E\u0441\u0442\u0430\u0442\u043E\u0447\u043D\u043E \u0443\u043C\u0435\u043B\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=&4\u0412\u044B \u043D\u0435\u0434\u043E\u0441\u0442\u0430\u0442\u043E\u0447\u043D\u043E \u0443\u043C\u0435\u043B\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=&c\u0423 \u0432\u0430\u0441 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u0443\u0440\u043E\u0432\u0435\u043D\u044C &e{0}&c, \u0447\u0442\u043E\u0431\u044B \u043E\u0442\u0440\u0435\u043C\u043E\u043D\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C &e{1} -Repair.Skills.FeltEasy=&7\u042D\u0442\u043E \u0431\u044B\u043B\u043E \u043B\u0435\u0433\u043A\u043E. -Repair.Skills.FullDurability=&7\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.StackedItems=&4\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.Pretty.Name=\u0420\u0435\u043C\u043E\u043D\u0442 +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=\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\u0434\u043E\u0441\u0442\u0430\u0442\u043E\u0447\u043D\u043E \u0443\u043C\u0435\u043B\u044B, \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=&a\u0412\u044B \u0441\u043E\u0445\u0440\u0430\u043D\u0438\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.Downgrade=Волшебная сила этого предмета уменьшается. +Repair.Arcane.Fail=Волшебная сила навсегда покинула предмет. +Repair.Arcane.Lost=Вы недостаточно умелы, чтобы сохранять зачарования. +Repair.Arcane.Perfect=&aВы сохранили волшебную силу этого предмета. #SALVAGE -Salvage.Pretty.Name=\u0420\u0430\u0437\u0431\u043E\u0440\u043A\u0430 -Salvage.SubSkill.UnderstandingTheArt.Name=\u041F\u043E\u043D\u0438\u043C\u0430\u043D\u0438\u0435 \u0438\u0441\u043A\u0443\u0441\u0441\u0442\u0432\u0430 -Salvage.SubSkill.UnderstandingTheArt.Description=\u0412\u044B \u043D\u0435 \u043F\u0440\u043E\u0441\u0442\u043E \u043A\u043E\u043F\u0430\u0435\u0442\u0435\u0441\u044C \u0432 \u0441\u043E\u0441\u0435\u0434\u0441\u043A\u043E\u043C \u043C\u0443\u0441\u043E\u0440\u0435 - \u0432\u044B \u0437\u0430\u0431\u043E\u0442\u0438\u0442\u0435\u0441\u044C \u043E\u0431 \u043E\u043A\u0440\u0443\u0436\u0430\u044E\u0449\u0435\u0439 \u0441\u0440\u0435\u0434\u0435.!nasd\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 \u0445\u043B\u0430\u043C\u0430 -Salvage.SubSkill.ScrapCollector.Description=\u0420\u0430\u0437\u0431\u0438\u0440\u0430\u0439\u0442\u0435 \u043F\u0440\u0435\u0434\u043C\u0435\u0442\u044B \u043D\u0430 \u043C\u0430\u0442\u0435\u0440\u0438\u0430\u043B\u044B, \u043A\u0430\u0447\u0435\u0441\u0442\u0432\u043E \u0440\u0430\u0437\u0431\u043E\u0440\u043A\u0438 \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 \u0445\u043B\u0430\u043C\u0430: &a\u0420\u0430\u0437\u0431\u0438\u0440\u0430\u0439\u0442\u0435 \u0434\u043E &e{0}&a \u043F\u0440\u0435\u0434\u043C\u0435\u0442\u043E\u0432. \u0423\u0434\u0430\u0447\u0430 \u043F\u0440\u0438\u0433\u043E\u0434\u0438\u0442\u0441\u044F. -Salvage.SubSkill.ArcaneSalvage.Name=\u041C\u0430\u0433\u0438\u0447\u0435\u0441\u043A\u0430\u044F \u043F\u0435\u0440\u0435\u0440\u0430\u0431\u043E\u0442\u043A\u0430 -Salvage.SubSkill.ArcaneSalvage.Description=\u0418\u0437\u0432\u043B\u0435\u0447\u0435\u043D\u0438\u0435 \u0437\u0430\u0447\u0430\u0440\u043E\u0432\u0430\u043D\u0438\u0439 \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 \u043F\u0435\u0440\u0435\u0440\u0430\u0431\u043E\u0442\u043A\u0430: &e\u0420\u0430\u043D\u0433 {0}/{1} -Salvage.Ability.Bonus.0=\u041A\u043E\u043B\u043B\u0435\u043A\u0446\u0438\u043E\u043D\u0435\u0440 \u0445\u043B\u0430\u043C\u0430 -Salvage.Ability.Bonus.1=\u0420\u0430\u0437\u0431\u0438\u0440\u0430\u0439\u0442\u0435 \u0434\u043E &e{0}&a \u043F\u0440\u0435\u0434\u043C\u0435\u0442\u043E\u0432. \u0423\u0434\u0430\u0447\u0430 \u043F\u0440\u0438\u0433\u043E\u0434\u0438\u0442\u0441\u044F. -Salvage.Arcane.ExtractFull=&7\u0428\u0430\u043D\u0441 \u041C\u041F \u0432\u0441\u0435\u0445 \u0437\u0430\u0447\u0430\u0440\u043E\u0432\u0430\u043D\u0438\u0439 -Salvage.Arcane.ExtractPartial=&7\u0428\u0430\u043D\u0441 \u041C\u041F \u0447\u0430\u0441\u0442\u0438 \u0437\u0430\u0447\u0430\u0440\u043E\u0432\u0430\u043D\u0438\u0439 -Salvage.Skills.Success=&a\u041F\u0440\u0435\u0434\u043C\u0435\u0442 \u0440\u0430\u0437\u043E\u0431\u0440\u0430\u043D! -Salvage.Skills.Adept.Damaged=&4\u0412\u044B \u043D\u0435\u0434\u043E\u0441\u0442\u0430\u0442\u043E\u0447\u043D\u043E \u0443\u043C\u0435\u043B\u044B, \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=\u0423 \u0432\u0430\u0441 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u0443\u0440\u043E\u0432\u0435\u043D\u044C &e{0}&c, \u0447\u0442\u043E\u0431\u044B \u0440\u0430\u0437\u043E\u0431\u0440\u0430\u0442\u044C &e{1} -Salvage.Skills.TooDamaged=&4\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 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044C \u0435\u0433\u043E. -Salvage.Skills.ArcaneFailed=&c\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=&c\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=&a\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=&4\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\u0451 \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=\u0420\u0430\u0437\u0431\u043E\u0440\u043A\u0430: -Salvage.SkillName=\u0420\u0410\u0417\u0411\u041E\u0420\u041A\u0410 -Salvage.Skills.Lottery.Normal=&6\u0423 \u0432\u0430\u0441 \u0432\u044B\u0448\u043B\u043E \u0438\u0437\u0432\u043B\u0435\u0447\u044C &3{0}&6 \u043C\u0430\u0442\u0435\u0440\u0438\u0430\u043B\u043E\u0432 \u0438\u0437 &e{1}&6. -Salvage.Skills.Lottery.Perfect=&a&l\u041F\u0440\u0435\u0432\u043E\u0441\u0445\u043E\u0434\u043D\u043E!&r&6 \u0412\u044B \u0440\u0430\u0437\u043E\u0431\u0440\u0430\u043B\u0438 &3{1}&6 \u0431\u0435\u0437 \u043E\u0441\u043E\u0431\u044B \u0443\u0441\u0438\u043B\u0438\u0439 \u0438 \u043F\u043E\u043B\u0443\u0447\u0438\u043B\u0438 &3{0}&6 \u043C\u0430\u0442\u0435\u0440\u0438\u0430\u043B\u043E\u0432. -Salvage.Skills.Lottery.Untrained=&7\u0412\u044B \u043D\u0435\u0434\u043E\u0441\u0442\u0430\u0442\u043E\u0447\u043D\u044B \u0443\u043C\u0435\u043B\u044B \u0432 \u0420\u0430\u0437\u0431\u043E\u0440\u043A\u0435. \u0423 \u0432\u0430\u0441 \u0432\u044B\u0448\u043B\u043E \u0438\u0437\u0432\u043B\u0435\u0447\u044C \u043B\u0438\u0448\u044C &c{0}&7 \u043C\u0430\u0442\u0435\u0440\u0438\u0430\u043B\u043E\u0432 \u0438\u0437 &a{1}&7. +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=\u042D\u0442\u043E\u0442 \u043F\u0440\u0435\u0434\u043C\u0435\u0442 \u043D\u0435\u0440\u0430\u0437\u0440\u0443\u0448\u0438\u043C! +Anvil.Unbreakable=Этот предмет неразрушим! #SWORDS -Swords.Ability.Lower=&7\u0412\u044B \u043E\u043F\u0443\u0441\u0442\u0438\u043B\u0438 \u0441\u0432\u043E\u0439 \u043C\u0435\u0447. -Swords.Ability.Ready=&4\u0412\u044B &6\u043F\u043E\u0434\u0433\u043E\u0442\u043E\u0432\u0438\u043B\u0438&e \u0441\u0432\u043E\u0439 \u043C\u0435\u0447. -Swords.Combat.Rupture.Note=&7\u041F\u0420\u0418\u041C\u0415\u0427\u0410\u041D\u0418\u0415: &e1 \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.Bleeding.Started=&4 \u0412\u044B \u0438\u0441\u0442\u0435\u043A\u0430\u0435\u0442\u0435 \u043A\u0440\u043E\u0432\u044C\u044E! -Swords.Combat.Bleeding.Stopped=&7\u041A\u0440\u043E\u0432\u043E\u0442\u0435\u0447\u0435\u043D\u0438\u0435 &a\u043F\u0440\u0435\u043A\u0440\u0430\u0442\u0438\u043B\u043E\u0441\u044C&7! -Swords.Combat.Bleeding=&a**\u0412\u0420\u0410\u0413 \u0418\u0421\u0422\u0415\u041A\u0410\u0415\u0422 \u041A\u0420\u041E\u0412\u042C\u042E** -Swords.Combat.Counter.Hit=&4\u041F\u043E\u0440\u0430\u0436\u0435\u043D \u043A\u043E\u043D\u0442\u0440\u0430\u0442\u0430\u043A\u043E\u0439! -Swords.Combat.Countered=&a**\u041A\u041E\u041D\u0422\u0420\u0410\u0422\u0410\u041A\u0410** -Swords.Combat.SS.Struck=&4\u041F\u043E\u0440\u0430\u0436\u0435\u043D \u0420\u0423\u0411\u042F\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\u0430\u0435\u0442 \u0447\u0430\u0441\u0442\u044C \u0443\u0440\u043E\u043D\u0430 \u043F\u0440\u0438 \u043D\u0430\u043F\u0430\u0434\u0435\u043D\u0438\u0438! -Swords.SubSkill.CounterAttack.Stat=\u0428\u0430\u043D\u0441 \u041A\u043E\u043D\u0442\u0440\u0430\u0442\u0430\u043A\u0438 -Swords.SubSkill.SerratedStrikes.Name=\u0420\u0443\u0431\u044F\u0449\u0438\u0439 \u0443\u0434\u0430\u0440 -Swords.SubSkill.SerratedStrikes.Description=\u041D\u0430\u043D\u043E\u0441\u0438\u0442 \u0447\u0430\u0441\u0442\u044C \u0443\u0440\u043E\u043D\u0430 \u043F\u043E \u043F\u043B\u043E\u0449\u0430\u0434\u0438 \u0441 \u0448\u0430\u043D\u0441\u043E\u043C \u043F\u0440\u0438\u043C\u0435\u043D\u0438\u0442\u044C \u0420\u0430\u0437\u0440\u044B\u0432! -Swords.SubSkill.SerratedStrikes.Stat=\u0414\u043B\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u044C \u0420\u0443\u0431\u044F\u0449\u0435\u0433\u043E \u0443\u0434\u0430\u0440\u0430 -Swords.SubSkill.Rupture.Name=\u0420\u0430\u0437\u0440\u044B\u0432 -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 -Swords.SubSkill.Stab.Name=\u041F\u0440\u043E\u043D\u0437\u0430\u043D\u0438\u0435 -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 \u041F\u0440\u043E\u043D\u0437\u0430\u043D\u0438\u044F -Swords.SubSkill.SwordsLimitBreak.Name=\u0417\u0430\u043F\u0440\u0435\u0434\u0435\u043B\u044C\u043D\u044B\u0435 \u043C\u0435\u0447\u0438 -Swords.SubSkill.SwordsLimitBreak.Description=\u0412\u044B \u043F\u0440\u0435\u0432\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=\u041C\u0430\u043A\u0441. \u0443\u0440\u043E\u043D \u0417\u0430\u043F\u0440\u0435\u0434\u0435\u043B\u044C\u043D\u044B\u0445 \u043C\u0435\u0447\u0435\u0439 -Swords.SubSkill.Rupture.Stat=\u0428\u0430\u043D\u0441 \u0420\u0430\u0437\u0440\u044B\u0432\u0430 -Swords.SubSkill.Rupture.Stat.Extra=\u0420\u0430\u0437\u0440\u044B\u0432: &a{0} \u0442\u0438\u043A\u043E\u0432 [{1} \u0443\u0440\u043E\u043D \u0438\u0433\u0440\u043E\u043A\u0430\u043C] [{2} \u0443\u0440\u043E\u043D \u043C\u043E\u0431\u0430\u043C] -Swords.Effect.4=\u0420\u0443\u0431\u044F\u0449\u0438\u0439 \u0443\u0434\u0430\u0440 \u0420\u0430\u0437\u0440\u044B\u0432+ - - -Swords.Effect.5={0} \u0442\u0438\u043A\u043E\u0432 \u0420\u0430\u0437\u0440\u044B\u0432\u0430 -Swords.Listener=\u041C\u0435\u0447\u0438: -Swords.SkillName=\u041C\u0435\u0447\u0438 -Swords.Skills.SS.Off=**\u0420\u0443\u0431\u044F\u0449\u0438\u0439 \u0443\u0434\u0430\u0440 \u043F\u0440\u0435\u043A\u0440\u0430\u0442\u0438\u043B \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435** -Swords.Skills.SS.On=&a**\u0420\u0423\u0411\u042F\u0429\u0418\u0419 \u0423\u0414\u0410\u0420 \u0410\u041A\u0422\u0418\u0412\u0418\u0420\u041E\u0412\u0410\u041D** -Swords.Skills.SS.Refresh=&a\u0412\u0430\u0448\u0435 \u0443\u043C\u0435\u043D\u0438\u0435 &e\u0420\u0443\u0431\u044F\u0449\u0438\u0439 \u0443\u0434\u0430\u0440 &a\u0432\u043E\u0441\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E! -Swords.Skills.SS.Other.Off=\u0420\u0443\u0431\u044F\u0449\u0438\u0439 \u0443\u0434\u0430\u0440&a \u043F\u0440\u0435\u043A\u0440\u0430\u0442\u0438\u043B \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0443 &e{0} -Swords.Skills.SS.Other.On=&a{0}&2 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043B &c\u0420\u0443\u0431\u044F\u0449\u0438\u0439 \u0443\u0434\u0430\u0440! +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=\u0417\u043D\u0430\u043D\u0438\u0435 \u0441\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 \u043C\u0435\u0445 -Taming.Ability.Bonus.3=1/{0} \u0443\u0440\u043E\u043D\u0430, \u043E\u0433\u043D\u0435\u0441\u0442\u043E\u0439\u043A\u043E\u0441\u0442\u044C -Taming.Ability.Bonus.4=\u0423\u0434\u0430\u0440\u043E\u043F\u0440\u043E\u0447\u043D\u043E\u0441\u0442\u044C -Taming.Ability.Bonus.5=\u0412\u0437\u0440\u044B\u0432\u044B \u043D\u0430\u043D\u043E\u0441\u044F\u0442 1/{0} \u043E\u0431\u044B\u0447\u043D\u043E\u0433\u043E \u0443\u0440\u043E\u043D\u0430 -Taming.Ability.Bonus.6=\u041E\u0441\u0442\u0440\u044B\u0435 \u043A\u043E\u0433\u0442\u0438 -Taming.Ability.Bonus.7=+{0} \u0443\u0440\u043E\u043D\u0430 -Taming.Ability.Bonus.8=\u0411\u044B\u0441\u0442\u0440\u043E\u0435 \u043F\u0438\u0442\u0430\u043D\u0438\u0435 -Taming.Ability.Bonus.9={0} \u0448\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\u0430\u044F \u0433\u043E\u043D\u0447\u0430\u044F -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 {0}+ \u041D\u0410\u0412\u042B\u041A\u0410 (\u0417\u041D\u0410\u041D\u0418\u0415 \u0421\u0420\u0415\u0414\u042B) -Taming.Ability.Locked.1=\u0417\u0410\u0411\u041B\u041E\u041A\u0418\u0420\u041E\u0412\u0410\u041D\u041E \u0414\u041E {0}+ \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 {0}+ \u041D\u0410\u0412\u042B\u041A\u0410 (\u0423\u0414\u0410\u0420\u041E\u041F\u0420\u041E\u0427\u041D\u041E\u0421\u0422\u042C) -Taming.Ability.Locked.3=\u0417\u0410\u0411\u041B\u041E\u041A\u0418\u0420\u041E\u0412\u0410\u041D\u041E \u0414\u041E {0}+ \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 {0}+ \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 {0}+ \u041D\u0410\u0412\u042B\u041A\u0410 (\u0421\u0412\u042F\u0422\u0410\u042F \u0413\u041E\u041D\u0427\u0410\u042F) -Taming.Combat.Chance.Gore=\u0428\u0430\u043D\u0441 \u0423\u043A\u0443\u0441\u0430 -Taming.SubSkill.BeastLore.Name=\u041F\u043E\u0437\u043D\u0430\u043D\u0438\u0435 \u0437\u0432\u0435\u0440\u0435\u0439 -Taming.SubSkill.BeastLore.Description=\u0423\u0434\u0430\u0440\u044C\u0442\u0435 \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=\u0423\u0434\u0430\u0440\u043E\u043F\u0440\u043E\u0447\u043D\u043E\u0441\u0442\u044C -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 \u043F\u0440\u0438\u0440\u043E\u0434\u044B -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=&7\u0417\u041F: \u041F\u0440\u0438\u0441\u044F\u0434\u044C\u0442\u0435 \u0438 \u043D\u0430\u0436\u043C\u0438\u0442\u0435 \u041B\u041A\u041C \u0441!nasd {0} {1} (\u041E\u0446\u0435\u043B\u043E\u0442), {2} {3} (\u0412\u043E\u043B\u043A), {4} {5} (\u041B\u043E\u0448\u0430\u0434\u044C) -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\u0430\u044F \u0433\u043E\u043D\u0447\u0430\u044F -Taming.SubSkill.HolyHound.Description=\u041B\u0435\u0447\u0435\u043D\u0438\u0435 \u0432\u043E\u043B\u0448\u0435\u0431\u0441\u0442\u0432\u043E\u043C \u0438 \u044F\u0434\u0430\u043C\u0438 -Taming.SubSkill.Gore.Name=\u0423\u043A\u0443\u0441 -Taming.SubSkill.Gore.Description=\u041A\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043A\u0438\u0439 \u0443\u0434\u0430\u0440, \u043F\u0440\u0438\u043C\u0435\u043D\u044F\u044E\u0449\u0438\u0439 \u0420\u0430\u0437\u0440\u044B\u0432 -Taming.SubSkill.SharpenedClaws.Name=\u041E\u0441\u0442\u0440\u044B\u0435 \u043A\u043E\u0433\u0442\u0438 -Taming.SubSkill.SharpenedClaws.Description=\u0411\u043E\u043D\u0443\u0441\u043D\u044B\u0439 \u0443\u0440\u043E\u043D -Taming.SubSkill.EnvironmentallyAware.Name=\u0417\u043D\u0430\u043D\u0438\u0435 \u0441\u0440\u0435\u0434\u044B -Taming.SubSkill.EnvironmentallyAware.Description=\u0411\u043E\u044F\u0437\u043D\u044C \u043A\u0430\u043A\u0442\u0443\u0441\u043E\u0432 \u0438 \u043B\u0430\u0432\u044B, \u0438\u043C\u043C\u0443\u043D\u0438\u0442\u0435\u0442 \u043A \u0443\u0440\u043E\u043D\u0443 \u043E\u0442 \u043F\u0430\u0434\u0435\u043D\u0438\u044F -Taming.SubSkill.ThickFur.Name=\u0413\u0443\u0441\u0442\u043E\u0439 \u043C\u0435\u0445 -Taming.SubSkill.ThickFur.Description=\u0421\u043D\u0438\u0436\u0435\u043D\u0438\u0435 \u0443\u0440\u043E\u043D\u0430, \u043E\u0433\u043D\u0435\u0441\u0442\u043E\u0439\u043A\u043E\u0441\u0442\u044C -Taming.SubSkill.Pummel.Name=\u0418\u0437\u0431\u0438\u0435\u043D\u0438\u0435 -Taming.SubSkill.Pummel.Description=\u0412\u0430\u0448\u0438 \u0432\u043E\u043B\u043A\u0438 \u0438\u043C\u0435\u044E\u0442 \u0448\u0430\u043D\u0441 \u043E\u0442\u0431\u0440\u043E\u0441\u0438\u0442\u044C \u0432\u0440\u0430\u0433\u043E\u0432 -Taming.SubSkill.Pummel.TargetMessage=\u0412\u044B \u0431\u044B\u043B\u0438 \u043E\u0442\u0431\u0440\u043E\u0448\u0435\u043D\u044B \u0432\u043E\u043B\u043A\u043E\u043C! -Taming.Listener.Wolf=&8\u0412\u0430\u0448 \u0432\u043E\u043B\u043A \u0445\u043E\u0447\u0435\u0442 \u0432\u0435\u0440\u043D\u0443\u0442\u0441\u044F \u043A \u0432\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.Summon.COTW.Success.WithoutLifespan=&a(\u0417\u043E\u0432 \u043F\u0440\u0438\u0440\u043E\u0434\u044B) &7\u0412\u044B \u043F\u0440\u0438\u0437\u0432\u0430\u043B\u0438 &6{0}&7 -Taming.Summon.COTW.Success.WithLifespan=&a(\u0417\u043E\u0432 \u043F\u0440\u0438\u0440\u043E\u0434\u044B) &7\u0412\u044B \u043F\u0440\u0438\u0437\u0432\u0430\u043B\u0438 &6{0}&7 \u043D\u0430 &6{1}&7 \u0441\u0435\u043A\u0443\u043D\u0434. -Taming.Summon.COTW.Limit=&a(\u0417\u043E\u0432 \u043F\u0440\u0438\u0440\u043E\u0434\u044B) &7\u041E\u0434\u043D\u043E\u0432\u0440\u0435\u043C\u0435\u043D\u043D\u043E \u043C\u043E\u0436\u043D\u043E \u0432\u044B\u0437\u0432\u0430\u0442\u044C \u0442\u043E\u043B\u044C\u043A\u043E{0} &7\u043F\u0438\u0442\u043E\u043C\u0446\u0435\u0432 &7{1}. -Taming.Summon.COTW.TimeExpired=&a(\u0417\u043E\u0432 \u043F\u0440\u0438\u0440\u043E\u0434\u044B) &7\u0412\u0440\u0435\u043C\u044F \u0432\u044B\u0448\u043B\u043E, \u0432\u0430\u0448 &6{0}&7 \u0443\u0445\u043E\u0434\u0438\u0442. -Taming.Summon.COTW.Removed=&a(\u0417\u043E\u0432 \u043F\u0440\u0438\u0440\u043E\u0434\u044B) &7\u041F\u0440\u0438\u0437\u0432\u0430\u043D\u043D\u044B\u0439 &6{0}&7 \u0438\u0441\u0447\u0435\u0437 \u0438\u0437 \u044D\u0442\u043E\u0433\u043E \u043C\u0438\u0440\u0430. -Taming.Summon.COTW.BreedingDisallowed=&a(\u0417\u043E\u0432 \u043F\u0440\u0438\u0440\u043E\u0434\u044B) &c\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=&a(\u0417\u043E\u0432 \u043F\u0440\u0438\u0440\u043E\u0434\u044B) &7\u0412\u0430\u043C \u043D\u0443\u0436\u043D\u043E \u043D\u0430 &e{0}&7 \u0431\u043E\u043B\u044C\u0448\u0435 &3{1} -Taming.Summon.Name.Format=&6(\u0417\u043E\u0432 \u041F\u0440\u0435\u0434\u043A\u043E\u0432) &f{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=&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=\u0421\u0442\u0438\u043B\u044C \u0421\u0442\u0430\u043B\u044C\u043D\u043E\u0433\u043E \u043A\u0443\u043B\u0430\u043A\u0430 -Unarmed.Ability.Bonus.1=+{0} \u0443\u043B\u0443\u0447\u0448\u0435\u043D\u0438\u0435 \u0443\u0440\u043E\u043D\u0430 -Unarmed.Ability.IronGrip.Attacker=\u0423 \u0432\u0430\u0448\u0435\u0433\u043E \u043E\u043F\u043F\u043E\u043D\u0435\u043D\u0442\u0430 \u0416\u0435\u043B\u0435\u0437\u043D\u0430\u044F \u0445\u0432\u0430\u0442\u043A\u0430! -Unarmed.Ability.IronGrip.Defender=&a\u0412\u0430\u0448\u0430 \u0416\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=&7\u0412\u044B \u043E\u043F\u0443\u0441\u0442\u0438\u043B\u0438 \u0441\u0432\u043E\u0438 \u043A\u0443\u043B\u0430\u043A\u0438. -Unarmed.Ability.Ready=&3\u0412\u044B &6\u043F\u043E\u0434\u0433\u043E\u0442\u043E\u0432\u0438\u043B\u0438&e \u0441\u0432\u043E\u0438 \u043A\u0443\u043B\u0430\u043A\u0438. -Unarmed.SubSkill.Berserk.Name=\u0411\u0435\u0440\u0441\u0435\u0440\u043A -Unarmed.SubSkill.Berserk.Description=+50% \u043A \u0443\u0440\u043E\u043D\u0443, \u0440\u0430\u0437\u0440\u0443\u0448\u0435\u043D\u0438\u0435 \u043D\u0435\u0442\u0432\u0435\u0440\u0434\u044B\u0445 \u0431\u043B\u043E\u043A\u043E\u0432 -Unarmed.SubSkill.Berserk.Stat=\u0414\u043B\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u044C \u0411\u0435\u0440\u0441\u0435\u0440\u043A\u0430 -Unarmed.SubSkill.Disarm.Name=\u0420\u0430\u0437\u043E\u0440\u0443\u0436\u0435\u043D\u0438\u0435 -Unarmed.SubSkill.Disarm.Description=\u0412\u044B\u0431\u0438\u0432\u0430\u0435\u0442 \u043F\u0440\u0435\u0434\u043C\u0435\u0442 \u0438\u0437 \u0440\u0443\u043A \u043F\u0440\u043E\u0442\u0438\u0432\u043D\u0438\u043A\u0430 -Unarmed.SubSkill.Disarm.Stat=\u0428\u0430\u043D\u0441 \u0420\u0430\u0437\u043E\u0440\u0443\u0436\u0435\u043D\u0438\u044F -Unarmed.SubSkill.UnarmedLimitBreak.Name=\u0417\u0430\u043F\u0440\u0435\u0434\u0435\u043B\u044C\u043D\u0430\u044F \u0431\u0435\u0437\u043E\u0440\u0443\u0436\u043D\u043E\u0441\u0442\u044C -Unarmed.SubSkill.UnarmedLimitBreak.Description=\u0412\u044B \u043F\u0440\u0435\u0432\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=\u041C\u0430\u043A\u0441. \u0443\u0440\u043E\u043D \u0417\u0430\u043F\u0440\u0435\u0434\u0435\u043B\u044C\u043D\u043E\u0439 \u0431\u0435\u0437\u043E\u0440\u0443\u0436\u043D\u043E\u0441\u0442\u0438 -Unarmed.SubSkill.SteelArmStyle.Name=\u0421\u0442\u0438\u043B\u044C \u0421\u0442\u0430\u043B\u044C\u043D\u043E\u0433\u043E \u043A\u0443\u043B\u0430\u043A\u0430 -Unarmed.SubSkill.SteelArmStyle.Description=\u0423\u043A\u0440\u0435\u043F\u043B\u044F\u0435\u0442 \u0432\u0430\u0448 \u0443\u0434\u0430\u0440 \u0441 \u0442\u0435\u0447\u0435\u043D\u0438\u0435\u043C \u0432\u0440\u0435\u043C\u0435\u043D\u0438 -Unarmed.SubSkill.ArrowDeflect.Name=\u041E\u0442\u0440\u0430\u0436\u0435\u043D\u0438\u0435 \u0441\u0442\u0440\u0435\u043B -Unarmed.SubSkill.ArrowDeflect.Description=\u041E\u0442\u0440\u0430\u0436\u0430\u0435\u0442 \u0441\u0442\u0440\u0435\u043B\u044B -Unarmed.SubSkill.ArrowDeflect.Stat=\u0428\u0430\u043D\u0441 \u041E\u0442\u0440\u0430\u0436\u0435\u043D\u0438\u044F \u0441\u0442\u0440\u0435\u043B -Unarmed.SubSkill.IronGrip.Name=\u0416\u0435\u043B\u0435\u0437\u043D\u0430\u044F \u0445\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=\u0428\u0430\u043D\u0441 \u0416\u0435\u043B\u0435\u0437\u043D\u043E\u0439 \u0445\u0432\u0430\u0442\u043A\u0438 -Unarmed.SubSkill.BlockCracker.Name=\u041A\u0440\u0443\u0448\u0438\u0442\u0435\u043B\u044C \u0431\u043B\u043E\u043A\u043E\u0432 -Unarmed.SubSkill.BlockCracker.Description=\u0420\u0430\u0437\u0440\u0443\u0448\u0430\u0439\u0442\u0435 \u0441\u043A\u0430\u043B\u044B \u0441\u0432\u043E\u0438\u043C\u0438 \u043A\u0443\u043B\u0430\u043A\u0430\u043C\u0438 -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=**\u0411\u0435\u0440\u0441\u0435\u0440\u043A \u043F\u0440\u0435\u043A\u0440\u0430\u0442\u0438\u043B \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435** -Unarmed.Skills.Berserk.On=&a**\u0411\u0415\u0420\u0421\u0415\u0420\u041A \u0410\u041A\u0422\u0418\u0412\u0418\u0420\u041E\u0412\u0410\u041D** -Unarmed.Skills.Berserk.Other.Off=\u0411\u0435\u0440\u0441\u0435\u0440\u043A&a \u043F\u0440\u0435\u043A\u0440\u0430\u0442\u0438\u043B \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0443 &e{0} -Unarmed.Skills.Berserk.Other.On=&a{0}&2 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043B &c\u0411\u0435\u0440\u0441\u0435\u0440\u043A\u0430! -Unarmed.Skills.Berserk.Refresh=&a\u0412\u0430\u0448\u0435 \u0443\u043C\u0435\u043D\u0438\u0435 &e\u0411\u0435\u0440\u0441\u0435\u0440\u043A &a\u0432\u043E\u0441\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E! +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=\u0421\u0434\u0443\u0432\u0430\u0442\u0435\u043B\u044C \u043B\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.Locked.0=\u0417\u0410\u0411\u041B\u041E\u041A\u0418\u0420\u041E\u0412\u0410\u041D\u041E \u0414\u041E {0}+ \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=\u0414\u0440\u043E\u0432\u043E\u0441\u0435\u043A -Woodcutting.SubSkill.TreeFeller.Description=\u0412\u0437\u0440\u044B\u0432\u0430\u0435\u0442 \u0434\u0435\u0440\u0435\u0432\u044C\u044F -Woodcutting.SubSkill.TreeFeller.Stat=\u0414\u043B\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u044C \u0414\u0440\u043E\u0432\u043E\u0441\u0435\u043A\u0430 -Woodcutting.SubSkill.LeafBlower.Name=\u0421\u0434\u0443\u0432\u0430\u0442\u0435\u043B\u044C \u043B\u0438\u0441\u0442\u044C\u0435\u0432 -Woodcutting.SubSkill.LeafBlower.Description=\u0421\u0434\u0443\u0432\u0430\u0439\u0442\u0435 \u043B\u0438\u0441\u0442\u044C\u044F \u043F\u0440\u043E\u0447\u044C -Woodcutting.SubSkill.KnockOnWood.Name=\u0421\u0442\u0443\u043A \u043F\u043E \u0434\u0435\u0440\u0435\u0432\u0443 -Woodcutting.SubSkill.KnockOnWood.Description=\u0411\u043E\u043B\u044C\u0448\u0435 \u0434\u043E\u0431\u044B\u0447\u0438 \u043F\u0440\u0438 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0438 \u0414\u0440\u043E\u0432\u043E\u0441\u0435\u043A\u0430 -Woodcutting.SubSkill.KnockOnWood.Stat=\u0421\u0442\u0443\u043A \u043F\u043E \u0434\u0435\u0440\u0435\u0432\u0443 -Woodcutting.SubSkill.KnockOnWood.Loot.Normal=\u041E\u0431\u044B\u0447\u043D\u0430\u044F \u0434\u043E\u0431\u044B\u0447\u0430 \u0441 \u0434\u0435\u0440\u0435\u0432\u044C\u0435\u0432 -Woodcutting.SubSkill.KnockOnWood.Loot.Rank2=\u041E\u0431\u044B\u0447\u043D\u0430\u044F \u0434\u043E\u0431\u044B\u0447\u0430 \u0438 \u043E\u043F\u044B\u0442 \u0441 \u0434\u0435\u0440\u0435\u0432\u044C\u0435\u0432 -Woodcutting.SubSkill.HarvestLumber.Name=\u0421\u0431\u043E\u0440 \u0434\u0440\u0435\u0432\u0435\u0441\u0438\u043D\u044B -Woodcutting.SubSkill.HarvestLumber.Description=\u0423\u043C\u0435\u043B\u043E \u043F\u043E\u043B\u0443\u0447\u0430\u0439\u0442\u0435 \u0431\u043E\u043B\u044C\u0448\u0435 \u0434\u0440\u0435\u0432\u0435\u0441\u0438\u043D\u044B -Woodcutting.SubSkill.HarvestLumber.Stat=\u0428\u0430\u043D\u0441 \u0414\u0432\u043E\u0439\u043D\u043E\u0439 \u0434\u043E\u0431\u044B\u0447\u0438 -Woodcutting.SubSkill.Splinter.Name=\u0412 \u0449\u0435\u043F\u043A\u0438 -Woodcutting.SubSkill.Splinter.Description=\u0421\u0440\u0443\u0431\u0430\u0439\u0442\u0435 \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=\u041A\u043E\u0440\u043E\u0432\u0430\u044F \u0445\u0438\u0440\u0443\u0440\u0433\u0438\u044F -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 \u043F\u0440\u0438\u0440\u043E\u0434\u044B -Woodcutting.SubSkill.NaturesBounty.Description=\u041F\u043E\u043B\u0443\u0447\u0430\u0439\u0442\u0435 \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=**\u0414\u0440\u043E\u0432\u043E\u0441\u0435\u043A \u043F\u0440\u0435\u043A\u0440\u0430\u0442\u0438\u043B \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435** -Woodcutting.Skills.TreeFeller.On=&a**\u0414\u0420\u041E\u0412\u041E\u0421\u0415\u041A \u0410\u041A\u0422\u0418\u0412\u0418\u0420\u041E\u0412\u0410\u041D** -Woodcutting.Skills.TreeFeller.Refresh=&a\u0412\u0430\u0448\u0435 \u0443\u043C\u0435\u043D\u0438\u0435 &e\u0414\u0440\u043E\u0432\u043E\u0441\u0435\u043A &a\u0432\u043E\u0441\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E! -Woodcutting.Skills.TreeFeller.Other.Off=\u0414\u0440\u043E\u0432\u043E\u0441\u0435\u043A&a \u043F\u0440\u0435\u043A\u0440\u0430\u0442\u0438\u043B\u043E \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0443 &e{0} -Woodcutting.Skills.TreeFeller.Other.On=&a{0}&2 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043B &c\u0414\u0440\u043E\u0432\u043E\u0441\u0435\u043A\u0430! -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 \u0431\u043E\u043B\u044C\u0448\u043E\u0435! +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**\u0421\u0422\u0420\u0415\u041B\u0410 \u041E\u0422\u0421\u041A\u041E\u0427\u0418\u041B\u0410** -Combat.BeastLore=&a**\u041F\u041E\u0417\u041D\u0410\u041D\u0418\u0415 \u0417\u0412\u0415\u0420\u0415\u0419** -Combat.BeastLoreHealth=&3\u0417\u0434\u043E\u0440\u043E\u0432\u044C\u0435 (&a{0}&3/{1}) -Combat.BeastLoreOwner=&3\u0425\u043E\u0437\u044F\u0438\u043D (&c{0}&3) -Combat.BeastLoreHorseSpeed=&3\u0421\u043A\u043E\u0440\u043E\u0441\u0442\u044C \u0434\u0432\u0438\u0436\u0435\u043D\u0438\u044F \u043B\u043E\u0448\u0430\u0434\u0438 (&a{0} \u0431\u043B\u043E\u043A\u043E\u0432/\u0441&3) -Combat.BeastLoreHorseJumpStrength=&3\u0421\u0438\u043B\u0430 \u043F\u0440\u044B\u0436\u043A\u0430 \u043B\u043E\u0448\u0430\u0434\u0438 (&a\u041C\u0430\u043A\u0441. {0} \u0431\u043B\u043E\u043A\u043E\u0432&3) -Combat.Gore=&a**\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 &4\u041E\u0448\u0435\u043B\u043E\u043C\u043B\u0435\u043D\u0430 -Combat.TouchedFuzzy=&4\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. +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\u041E \u043F\u0440\u043E\u0435\u043A\u0442\u0435 &emcMMO&3:,&6mcMMO \u044D\u0442\u043E RPG \u043C\u043E\u0434 &c\u0441 \u043E\u0442\u043A\u0440\u044B\u0442\u044B\u043C \u043A\u043E\u0434\u043E\u043C&6, &6\u0441\u043E\u0437\u0434\u0430\u043D\u043D\u044B\u0439 \u0432 \u0444\u0435\u0432\u0440\u0430\u043B\u0435 2011,&6\u0437\u0430 \u0430\u0432\u0442\u043E\u0440\u0441\u0442\u0432\u043E\u043C &9nossr50&6. \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.,&3\u041F\u043E\u0434\u0441\u043A\u0430\u0437\u043A\u0438:,&6 - &a\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 &c/mcmmo help&a \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,&6 - &a\u041D\u0430\u043F\u0435\u0447\u0430\u0442\u0430\u0439\u0442\u0435 &c/\u041D\u0410\u0417\u0412\u0410\u041D\u0418\u0415\u041D\u0410\u0412\u042B\u041A\u0410&a \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,&3\u0420\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A\u0438:,&6 - &anossr50 &9(\u0421\u043E\u0437\u0434\u0430\u0442\u0435\u043B\u044C \u0438 \u0420\u0443\u043A\u043E\u0432\u043E\u0434\u0438\u0442\u0435\u043B\u044C),&6 - &aelectronicboy &9(\u0420\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A),&6 - &akashike &9(\u0420\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A),&6 - &at00thpick1 &9(\u041F\u043E\u0434\u0434\u0435\u0440\u0436\u0430\u0442\u0435\u043B\u044C \u041A\u043B\u0430\u0441\u0441\u0438\u043A\u0438) -mcMMO.Description.FormerDevs=&3\u0411\u044B\u0432\u0448\u0438\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A\u0438: &aGJ, NuclearW, bm01, TfT_02, Glitchfinder -Commands.addlevels.AwardAll.1=&a\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=&a\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 \u0438\u0437\u043C\u0435\u043D\u0435\u043D \u043D\u0430 {1}. -Commands.addxp.AwardAll=&a\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=&a\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 &c\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 &a\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 \u043F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0435\u043D\u0430 \u0434\u043B\u044F &e{0} -Commands.AdminChat.Off=\u0420\u0435\u0436\u0438\u043C \u0430\u0434\u043C\u0438\u043D-\u0447\u0430\u0442\u0430 &c\u0432\u044B\u043A\u043B\u044E\u0447\u0435\u043D -Commands.AdminChat.On=\u0420\u0435\u0436\u0438\u043C \u0430\u0434\u043C\u0438\u043D-\u0447\u0430\u0442\u0430 &a\u0432\u043A\u043B\u044E\u0447\u0435\u043D -Commands.AdminToggle=&a- \u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435 \u0430\u0434\u043C\u0438\u043D-\u0447\u0430\u0442\u0430 -Commands.Chat.Console=*\u041A\u043E\u043D\u0441\u043E\u043B\u044C* -Commands.Cooldowns.Header=&6--= &a\u041E\u0442\u043A\u0430\u0442\u044B \u0443\u043C\u0435\u043D\u0438\u0439 mcMMO&6 =-- -Commands.Cooldowns.Row.N= &c{0}&f - &6{1} \u0441\u0435\u043A\u0443\u043D\u0434 \u043E\u0441\u0442\u0430\u043B\u043E\u0441\u044C -Commands.Cooldowns.Row.Y= &b{0}&f - &2\u0413\u043E\u0442\u043E\u0432\u043E! -Commands.Database.CooldownMS=\u0412\u044B \u0434\u043E\u043B\u0436\u043D\u044B \u043F\u043E\u0434\u043E\u0436\u0434\u0430\u0442\u044C {0} \u043C\u0438\u043B\u043B\u0438\u0441\u0435\u043A\u0443\u043D\u0434, \u043F\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043C \u0432\u043D\u043E\u0432\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.Cooldown=\u0412\u044B \u0434\u043E\u043B\u0436\u043D\u044B \u043F\u043E\u0434\u043E\u0436\u0434\u0430\u0442\u044C {0} \u0441\u0435\u043A\u0443\u043D\u0434, \u043F\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043C \u0432\u043D\u043E\u0432\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\u0451 \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442\u0441\u044F. \u041F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430, \u043F\u043E\u0434\u043E\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= &c\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 \u043E\u0442\u043A\u043B\u044E\u0447\u0435\u043D -Commands.GodMode.Enabled=\u0420\u0435\u0436\u0438\u043C \u0431\u043E\u0433\u0430 mcMMO \u0432\u043A\u043B\u044E\u0447\u0435\u043D -Commands.AdminChatSpy.Enabled=\u0421\u043B\u0435\u0436\u043A\u0430 \u0437\u0430 \u0447\u0430\u0442\u0430\u043C\u0438 \u0433\u0440\u0443\u043F\u043F mcMMO \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u0430 -Commands.AdminChatSpy.Disabled=\u0421\u043B\u0435\u0436\u043A\u0430 \u0437\u0430 \u0447\u0430\u0442\u0430\u043C\u0438 \u0433\u0440\u0443\u043F\u043F mcMMO \u043E\u0442\u043A\u043B\u044E\u0447\u0435\u043D\u0430 -Commands.AdminChatSpy.Toggle=\u0427\u0430\u0442 \u0433\u0440\u0443\u043F\u043F mcMMO \u043F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0435\u043D \u0434\u043B\u044F &e{0} -Commands.AdminChatSpy.Chat=&6[\u0428\u041F\u0418\u041A: &a{0}&6] &f{1} -Commands.GodMode.Forbidden=[mcMMO] \u0420\u0435\u0436\u0438\u043C \u0431\u043E\u0433\u0430 \u043D\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043D \u0432 \u044D\u0442\u043E\u043C \u043C\u0438\u0440\u0435 (\u043F\u0440\u043E\u0432\u0435\u0440\u044C\u0442\u0435 \u043F\u0440\u0430\u0432\u0430) -Commands.GodMode.Toggle=\u0420\u0435\u0436\u0438\u043C \u0431\u043E\u0433\u0430 \u043F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0435\u043D \u0434\u043B\u044F &e{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 &e\u0421\u0435\u0440\u0434\u0446\u0430&f. -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 &e\u041A\u0432\u0430\u0434\u0440\u0430\u0442\u044B&f. -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 &7\u043E\u0442\u043A\u043B\u044E\u0447\u0435\u043D\u043E&f. -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> &a- \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\u0431 \u0438\u0433\u0440\u043E\u043A\u0435 -Commands.Invite.Success=&a\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=<\u043D\u0430\u0432\u044B\u043A> <\u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0430> &a- \u0422\u0430\u0431\u043B\u0438\u0446\u0430 \u043B\u0438\u0434\u0435\u0440\u043E\u0432 -Commands.mcgod=&a- \u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0440\u0435\u0436\u0438\u043C \u0431\u043E\u0433\u0430 -Commands.mchud.Invalid=\u042D\u0442\u043E \u043D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u044B\u0439 \u0442\u0438\u043F HUD'\u0430. -Commands.mcpurge.Success=&a\u0411\u0430\u0437\u0430 \u0434\u0430\u043D\u043D\u044B\u0445 \u0443\u0441\u043F\u0435\u0448\u043D\u043E \u043E\u0447\u0438\u0449\u0435\u043D\u0430! -Commands.mcrank.Heading=&6-=\u041F\u0415\u0420\u0421\u041E\u041D\u0410\u041B\u042C\u041D\u042B\u0419 \u0420\u0415\u0419\u0422\u0418\u041D\u0413=- -Commands.mcrank.Overall=\u041E\u0431\u0449\u0438\u0439&a - &6\u0420\u0430\u043D\u0433 &f#&a{0} -Commands.mcrank.Player=&e\u0420\u0435\u0439\u0442\u0438\u043D\u0433 \u0434\u043B\u044F &f{0} -Commands.mcrank.Skill=&e{0}&a - &6\u0420\u0430\u043D\u0433 &f#&a{1} -Commands.mcrank.Unranked=&f\u0420\u044F\u0434\u043E\u0432\u043E\u0439 -Commands.mcrefresh.Success=\u041E\u0442\u043A\u0430\u0442\u044B {0} \u0431\u044B\u043B\u0438 \u0432\u043E\u0441\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u044B. -Commands.mcremove.Success=&a{0} \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=&6\u041F\u043E\u0434\u0441\u043A\u0430\u0437\u043A\u0430: \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 &c/mcrank&6, \u0447\u0442\u043E\u0431\u044B \u043F\u043E\u0441\u043C\u043E\u0442\u0440\u0435\u0442\u044C \u0441\u0432\u043E\u0439 \u0440\u0435\u0439\u0442\u0438\u043D\u0433! -Commands.mmoedit=[\u0438\u0433\u0440\u043E\u043A] <\u043D\u0430\u0432\u044B\u043A> <\u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435> &c - \u041C\u043E\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0446\u0435\u043B\u044C -Commands.mmoedit.AllSkills.1=&a\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=&a\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 \u0438\u0437\u043C\u0435\u043D\u0435\u043D \u043D\u0430 {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} \u043D\u0435 \u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \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=&7\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=&7\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 &a{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: &aLINEAR &c\u0438 &aEXPONENTIAL. -Commands.mcconvert.Experience.Same=\u0422\u0438\u043F \u0444\u043E\u0440\u043C\u0443\u043B\u044B {0} \u0443\u0436\u0435 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F -Commands.mcconvert.Experience.Start=&7\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=&7\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=&a- \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 &c\u043E\u0442\u043A\u043B\u044E\u0447\u0435\u043D\u044B -Commands.Notifications.On=\u0423\u0432\u0435\u0434\u043E\u043C\u043B\u0435\u043D\u0438\u044F \u043E\u0431 \u0443\u043C\u0435\u043D\u0438\u044F\u0445 &c\u0432\u043A\u043B\u044E\u0447\u0435\u043D\u044B -Commands.Offline=\u042D\u0442\u0430 \u043A\u043E\u043C\u0430\u043D\u0434\u0430 \u043D\u0435 \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0434\u043B\u044F \u0438\u0433\u0440\u043E\u043A\u043E\u0432 \u043D\u0435 \u0432 \u0441\u0435\u0442\u0438. -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.Party.Status=&8\u0418\u041C\u042F: &f{0} {1} &8\u0423\u0420\u041E\u0412\u0415\u041D\u042C: &e{2} -Commands.Party.Status.Alliance=&8\u0421\u041E\u042E\u0417: &f{0} -Commands.Party.UnlockedFeatures=&8\u0420\u0430\u0437\u0431\u043B\u043E\u043A\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0435 \u0444\u0443\u043D\u043A\u0446\u0438\u0438: &7[[ITALIC]]{0} -Commands.Party.ShareMode=&8\u0420\u0415\u0416\u0418\u041C \u0420\u0410\u0421\u041F\u0420\u0415\u0414\u0415\u041B\u0415\u041D\u0418\u042F: -Commands.Party.ItemShare=&7\u041F\u0420\u0415\u0414\u041C\u0415\u0422 &3({0}) -Commands.Party.ExpShare=&7\u041E\u041F\u042B\u0422 &3({0}) -Commands.Party.ItemShareCategories=&8\u0420\u0430\u0441\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u043F\u0440\u0435\u0434\u043C\u0435\u0442\u043E\u0432: &7[[ITALIC]]{0} -Commands.Party.MembersNear=&8\u0412\u041E\u0417\u041B\u0415 \u0412\u0410\u0421 &3{0}&8/&3{1} -Commands.Party.Accept=&a- \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=\u0420\u0435\u0436\u0438\u043C \u0447\u0430\u0442\u0430 \u0433\u0440\u0443\u043F\u043F\u044B &c\u043E\u0442\u043A\u043B\u044E\u0447\u0435\u043D -Commands.Party.Chat.On=\u0420\u0435\u0436\u0438\u043C \u0447\u0430\u0442\u0430 \u0433\u0440\u0443\u043F\u043F\u044B &c\u0432\u043A\u043B\u044E\u0447\u0435\u043D -Commands.Party.Commands=&c---[]&a\u041A\u041E\u041C\u0410\u041D\u0414\u042B \u0413\u0420\u0423\u041F\u041F\u042B&c[]--- -Commands.Party.Invite.0=&c\u0412\u041D\u0418\u041C\u0410\u041D\u0418\u0415: &a\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=&e\u0412\u0432\u0435\u0434\u0438\u0442\u0435 &a/party accept&e, \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=&a- \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=&a\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\u0438\u043D\u0438\u043B\u0438\u0441\u044C \u043A \u0433\u0440\u0443\u043F\u043F\u0435 {0} -Commands.Party.Join=&7\u041F\u0440\u0438\u0441\u043E\u0435\u0434\u0438\u043D\u0438\u043B\u0441\u044F \u043A \u0433\u0440\u0443\u043F\u043F\u0435: {0} -Commands.Party.PartyFull=&6{0}&c \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 &e{0}&c \u0432 &a{1}&c, \u043F\u043E\u0442\u043E\u043C\u0443 \u0447\u0442\u043E \u0432 \u043D\u0435\u0439 \u0443\u0436\u0435 &3{2}&c \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\u0438\u043D\u0438\u0442\u044C\u0441\u044F \u043A &a{0}&c, \u043F\u043E\u0442\u043E\u043C\u0443 \u0447\u0442\u043E \u0432 \u043D\u0435\u0439 \u0443\u0436\u0435 &3{1}&c \u0438\u0433\u0440\u043E\u043A\u043E\u0432! -Commands.Party.Create=&7\u0421\u043E\u0437\u0434\u0430\u043D\u0430 \u0433\u0440\u0443\u043F\u043F\u0430: {0} -Commands.Party.Rename=&7\u041D\u0430\u0437\u0432\u0430\u043D\u0438\u0435 \u0433\u0440\u0443\u043F\u043F\u044B \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u043E \u043D\u0430: &f{0} -Commands.Party.SetSharing=&7\u0420\u0430\u0441\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u0433\u0440\u0443\u043F\u043F\u044B {0} \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E \u043D\u0430: &3{1} -Commands.Party.ToggleShareCategory=&7\u0420\u0430\u0441\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u043F\u0440\u0435\u0434\u043C\u0435\u0442\u043E\u0432 \u0434\u043B\u044F &6{0} &7\u0431\u044B\u043B\u043E &3{1} -Commands.Party.AlreadyExists=&4\u0413\u0440\u0443\u043F\u043F\u0430 {0} \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442! -Commands.Party.Kick=&c\u0412\u044B \u0431\u044B\u043B\u0438 \u0432\u044B\u0433\u043D\u0430\u043D\u044B \u0438\u0437 \u0433\u0440\u0443\u043F\u043F\u044B &a{0}&c! -Commands.Party.Leave=&e\u0412\u044B \u043F\u043E\u043A\u0438\u043D\u0443\u043B\u0438 \u044D\u0442\u0443 \u0433\u0440\u0443\u043F\u043F\u0443 -Commands.Party.Members.Header=&c-----[]&a\u0423\u0427\u0410\u0421\u0422\u041D\u0418\u041A\u0418&c[]----- -Commands.Party.None=&c\u0412\u044B \u043D\u0435 \u0441\u043E\u0441\u0442\u043E\u0438\u0442\u0435 \u0432 \u0433\u0440\u0443\u043F\u043F\u0435. -Commands.Party.Quit=&a- \u041F\u043E\u043A\u0438\u043D\u0443\u0442\u044C \u0442\u0435\u043A\u0443\u0449\u0443\u044E \u0433\u0440\u0443\u043F\u043F\u0443 -Commands.Party.Teleport=&a- \u0422\u0435\u043B\u0435\u043F\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C\u0441\u044F \u043A \u0443\u0447\u0430\u0441\u0442\u043D\u0438\u043A\u0443 \u0433\u0440\u0443\u043F\u043F\u044B -Commands.Party.Toggle=&a- \u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0447\u0430\u0442 \u0433\u0440\u0443\u043F\u043F\u044B -Commands.Party1=&a- \u0421\u043E\u0437\u0434\u0430\u0442\u044C \u043D\u043E\u0432\u0443\u044E \u0433\u0440\u0443\u043F\u043F\u0443 -Commands.Party2=&a- \u041F\u0440\u0438\u0441\u043E\u0435\u0434\u0438\u043D\u0438\u0442\u044C\u0441\u044F \u043A \u0433\u0440\u0443\u043F\u043F\u0435 -Commands.Party.Alliance.Header=&c-----[]&a\u0421\u041E\u042E\u0417 \u0413\u0420\u0423\u041F\u041F\u042B&c[]----- -Commands.Party.Alliance.Ally=&f{0} &8\u0412 \u0421\u041E\u042E\u0417\u0415 \u0421: &f{1} -Commands.Party.Alliance.Members.Header=&c-----[]&a\u0423\u0427\u0410\u0421\u0422\u041D\u0418\u041A\u0418 \u0421\u041E\u042E\u0417\u0410&c[]----- -Commands.Party.Alliance.Invite.0=\u0412\u041D\u0418\u041C\u0410\u041D\u0418\u0415: &a\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=\u0412\u0432\u0435\u0434\u0438\u0442\u0435 &a/party alliance accept&e, \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=&a\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=&c\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=&c\u0412\u0430\u0448\u0430 \u0433\u0440\u0443\u043F\u043F\u0430 \u0443\u0436\u0435 \u0432 \u0441\u043E\u044E\u0437\u0435. \u0420\u0430\u0441\u0444\u043E\u0440\u043C\u0438\u0440\u0443\u0439\u0442\u0435 \u0435\u0433\u043E \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E &3/party alliance disband -Commands.Party.Alliance.Help.0=&c\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=&c \u0434\u043B\u044F \u0437\u0430\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u044F \u0441\u043E\u044E\u0437\u0430 &3/party alliance invite <\u0438\u0433\u0440\u043E\u043A>&c. -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 &a\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 &c\u043E\u0442\u043A\u043B\u044E\u0447\u0435\u043D\u0430 -Commands.ptp.NoRequests=&c\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=&c[mcMMO] \u0423 \u0432\u0430\u0441 \u043D\u0435\u0442 \u043F\u0440\u0430\u0432 \u043D\u0430 \u0442\u0435\u043B\u0435\u043F\u043E\u0440\u0442\u0430\u0446\u0438\u044E \u0432 \u043C\u0438\u0440 {0}. -Commands.ptp.Request1=&e{0} &a\u0437\u0430\u043F\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0442\u0435\u043B\u0435\u043F\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C\u0441\u044F \u043A \u0432\u0430\u043C. -Commands.ptp.Request2=&a\u0414\u043B\u044F \u0442\u0435\u043B\u0435\u043F\u043E\u0440\u0442\u0430\u0446\u0438\u0438 \u0432\u0432\u0435\u0434\u0438\u0442\u0435 &e/ptp accept&a. \u0417\u0430\u043F\u0440\u043E\u0441 \u0431\u0443\u0434\u0435\u0442 \u043E\u0442\u043C\u0435\u043D\u0435\u043D \u0447\u0435\u0440\u0435\u0437 &c{0} &a\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 &a\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 &c\u043E\u0442\u043A\u043B\u044E\u0447\u0435\u043D\u043E -Commands.ptp.RequestExpired=&c\u0413\u0440\u0443\u043F\u043F\u043E\u0432\u043E\u0439 \u0437\u0430\u043F\u0440\u043E\u0441 \u043D\u0430 \u0442\u0435\u043B\u0435\u043F\u043E\u0440\u0442\u0430\u0446\u0438\u044E \u0438\u0441\u0442\u0435\u043A! -Commands.PowerLevel.Leaderboard=&e--T\u0430\u0431\u043B\u0438\u0446\u0430 \u043B\u0438\u0434\u0435\u0440\u043E\u0432&9 \u043F\u043E \u0443\u0440\u043E\u0432\u043D\u044E \u0441\u0438\u043B\u044B &emcMMO-- -Commands.PowerLevel.Capped=&4\u0423\u0420\u041E\u0412\u0415\u041D\u042C \u0421\u0418\u041B\u042B: &a{0} &4\u041C\u0410\u041A\u0421. \u0423\u0420\u041E\u0412\u0415\u041D\u042C: &e{1} -Commands.PowerLevel=&4\u0423\u0420\u041E\u0412\u0415\u041D\u042C \u0421\u0418\u041B\u042B: &a{0} -Commands.Reset.All=&a\u0412\u0441\u0435 \u0432\u0430\u0448\u0438 \u0443\u0440\u043E\u0432\u043D\u0438 \u043D\u0430\u0432\u044B\u043A\u043E\u0432 \u0431\u044B\u043B\u0438 \u0443\u0441\u043F\u0435\u0448\u043D\u043E \u0441\u0431\u0440\u043E\u0448\u0435\u043D\u044B. -Commands.Reset.Single=&a\u0412\u0430\u0448 \u0443\u0440\u043E\u0432\u0435\u043D\u044C \u043D\u0430\u0432\u044B\u043A\u0430 {0} \u0431\u044B\u043B \u0443\u0441\u043F\u0435\u0448\u043D\u043E \u0441\u0431\u0440\u043E\u0448\u0435\u043D. -Commands.Reset=&a- \u0421\u0431\u0440\u043E\u0441 \u0443\u0440\u043E\u0432\u043D\u044F \u043D\u0430\u0432\u044B\u043A\u0430 \u0434\u043E 0 -Commands.Scoreboard.Clear=&3\u0422\u0430\u0431\u043B\u0438\u0446\u0430 mcMMO \u0443\u0431\u0440\u0430\u043D\u0430. -Commands.Scoreboard.NoBoard=&c\u0422\u0430\u0431\u043B\u0438\u0446\u0430 mcMMO \u043D\u0435 \u0430\u043A\u0442\u0438\u0432\u043D\u0430. -Commands.Scoreboard.Keep=&3\u0422\u0430\u0431\u043B\u0438\u0446\u0430 mcMMO \u0431\u0443\u0434\u0435\u0442 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C\u0441\u044F \u043F\u043E\u043A\u0430 \u0432\u044B \u043D\u0435 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0435 &a/mcscoreboard clear&3. -Commands.Scoreboard.Timer=&3\u0422\u0430\u0431\u043B\u0438\u0446\u0430 mcMMO \u0438\u0441\u0447\u0435\u0437\u043D\u0435\u0442 \u0447\u0435\u0440\u0435\u0437 &6{0}&3 \u0441\u0435\u043A\u0443\u043D\u0434. -Commands.Scoreboard.Help.0=&6 == &a\u041F\u043E\u043C\u043E\u0449\u044C \u043F\u043E &c/mcscoreboard&6 == -Commands.Scoreboard.Help.1=&3/mcscoreboard&b clear &f - \u0443\u0431\u0440\u0430\u0442\u044C \u0442\u0430\u0431\u043B\u0438\u0446\u0443 mcMMO -Commands.Scoreboard.Help.2=&3/mcscoreboard&b keep &f - \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 mcMMO -Commands.Scoreboard.Help.3=&3/mcscoreboard&b time [n] &f - \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 &dn&f \u0441\u0435\u043A\u0443\u043D\u0434 -Commands.Scoreboard.Tip.Keep=&6\u041F\u043E\u0434\u0441\u043A\u0430\u0437\u043A\u0430: \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 &c/mcscoreboard keep&6 \u0432\u043E \u0432\u0440\u0435\u043C\u044F \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0430 \u0442\u0430\u0431\u043B\u0438\u0446\u044B, \u0447\u0442\u043E\u0431\u044B \u043E\u043D\u0430 \u043D\u0435 \u0438\u0441\u0447\u0435\u0437\u0430\u043B\u0430. -Commands.Scoreboard.Tip.Clear=&6\u041F\u043E\u0434\u0441\u043A\u0430\u0437\u043A\u0430: \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 &c/mcscoreboard clear&6 \u0447\u0442\u043E\u0431\u044B \u0443\u0431\u0440\u0430\u0442\u044C \u0442\u0430\u0431\u043B\u0438\u0446\u0443. -Commands.XPBar.Reset=&6\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u0448\u043A\u0430\u043B\u044B \u043E\u043F\u044B\u0442\u0430 \u0434\u043B\u044F mcMMO \u0431\u044B\u043B\u0438 \u0441\u0431\u0440\u043E\u0448\u0435\u043D\u044B. -Commands.XPBar.SettingChanged=&6\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430 \u0448\u043A\u0430\u043B\u044B \u043E\u043F\u044B\u0442\u0430 \u0434\u043B\u044F &a{0}&6 \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u0430 \u043D\u0430 &a{1} -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.ChildSkill=\u0414\u043E\u0447\u0435\u0440\u043D\u0438\u0435 \u043D\u0430\u0432\u044B\u043A\u0438 \u043D\u0435\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043B\u044C\u043D\u044B \u0434\u043B\u044F \u044D\u0442\u043E\u0439 \u043A\u043E\u043C\u0430\u043D\u0434\u044B! -Commands.Skill.Leaderboard=--mcMMO &9{0}&e \u0442\u0430\u0431\u043B\u0438\u0446\u0430 \u043B\u0438\u0434\u0435\u0440\u043E\u0432-- -Commands.SkillInfo=&a- \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=&a- \u041F\u043E\u0441\u043C\u043E\u0442\u0440\u0435\u0442\u044C \u0441\u0432\u043E\u0438 \u0441\u0442\u0430\u0442\u044B mcMMO -Commands.ToggleAbility=&a- \u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0430\u043A\u0442\u0438\u0432\u0430\u0446\u0438\u044E \u0443\u043C\u0435\u043D\u0438\u0439 \u0447\u0435\u0440\u0435\u0437 \u041F\u041A\u041C -Commands.Usage.0=&c\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=&c\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=&c\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=&c\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.3.XP=&c\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}&7 (\u0412\u044B \u043C\u043E\u0436\u0435\u0442\u0435 \u0434\u043E\u0431\u0430\u0432\u0438\u0442\u044C -s \u0432 \u043A\u043E\u043D\u0446\u0435 \u0434\u043B\u044F \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u044F \u043A\u043E\u043C\u0430\u043D\u0434\u044B \u0431\u0435\u0437 \u0438\u043D\u0444\u043E\u0440\u043C\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F \u043E\u0431 \u044D\u0442\u043E\u043C \u0438\u0433\u0440\u043E\u043A\u0430) -Commands.Usage.FullClassName=\u043A\u043B\u0430\u0441\u0441 -Commands.Usage.Level=\u0443\u0440\u043E\u0432\u0435\u043D\u044C -Commands.Usage.Message=\u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435 -Commands.Usage.Page=\u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0430 -Commands.Usage.PartyName=\u0438\u043C\u044F -Commands.Usage.Password=\u043F\u0430\u0440\u043E\u043B\u044C -Commands.Usage.Player=\u0438\u0433\u0440\u043E\u043A -Commands.Usage.Rate=\u0447\u0430\u0441\u0442\u043E\u0442\u0430 -Commands.Usage.Skill=\u043D\u0430\u0432\u044B\u043A -Commands.Usage.SubSkill=\u043F\u043E\u0434\u043D\u0430\u0432\u044B\u043A -Commands.Usage.XP=\u043E\u043F\u044B\u0442 -Commands.Description.mmoinfo=\u041F\u0440\u043E\u0447\u0438\u0442\u0430\u0439\u0442\u0435 \u043F\u043E\u0434\u0440\u043E\u0431\u043D\u0435\u0435 \u043E \u043D\u0430\u0432\u044B\u043A\u0435 \u0438\u043B\u0438 \u043C\u0435\u0445\u0430\u043D\u0438\u043A\u0435. -Commands.MmoInfo.Mystery=&7\u0412\u044B \u0435\u0449\u0435 \u043D\u0435 \u0440\u0430\u0437\u0431\u043B\u043E\u043A\u0438\u0440\u043E\u0432\u0430\u043B\u0438 \u044D\u0442\u043E\u0442 \u043D\u0430\u0432\u044B\u043A, \u043D\u043E \u043A\u043E\u0433\u0434\u0430 \u0440\u0430\u0437\u0431\u043B\u043E\u043A\u0438\u0440\u0443\u0435\u0442\u0435, \u0441\u043C\u043E\u0436\u0435\u0442\u0435 \u043F\u0440\u043E\u0447\u0438\u0442\u0430\u0442\u044C \u043E \u043D\u0435\u043C \u0442\u0443\u0442! -Commands.MmoInfo.NoMatch=\u042D\u0442\u043E\u0433\u043E \u043F\u043E\u0434\u043D\u0430\u0432\u044B\u043A\u0430 \u043D\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442! -Commands.MmoInfo.Header=&3-=[]=====[]&6 MMO \u0438\u043D\u0444\u043E. &3[]=====[]=- -Commands.MmoInfo.SubSkillHeader=&6\u041D\u0430\u0437\u0432\u0430\u043D\u0438\u0435:&e {0} -Commands.MmoInfo.DetailsHeader=&3-=[]=====[]&a \u041F\u043E\u0434\u0440\u043E\u0431\u043D\u0435\u0435 &3[]=====[]=- -Commands.MmoInfo.OldSkill=&7\u041D\u0430\u0432\u044B\u043A\u0438 mcMMO \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, \u0438 \u043A \u0441\u043E\u0436\u0430\u043B\u0435\u043D\u0438\u044E \u0434\u0430\u043D\u043D\u044B\u0439 \u043D\u0430\u0432\u044B\u043A \u043F\u043E\u043A\u0430 \u043D\u0435 \u0431\u044B\u043B \u043F\u0435\u0440\u0435\u0440\u0430\u0431\u043E\u0442\u0430\u043D \u0438 \u043D\u0435\u0434\u043E\u0441\u0442\u0430\u0435\u0442 \u043E\u043F\u0438\u0441\u0430\u043D\u0438\u044F. \u041D\u043E\u0432\u0430\u044F \u0441\u0438\u0441\u0442\u0435\u043C\u0430 \u043F\u043E\u0437\u0432\u043E\u043B\u0438\u0442 \u0441\u043E\u0437\u0434\u0430\u0432\u0430\u0442\u044C \u043D\u0430\u0432\u044B\u043A\u0438 \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. -Commands.MmoInfo.Mechanics=&3-=[]=====[]&6 \u041C\u0435\u0445\u0430\u043D\u0438\u043A\u0438 &3[]=====[]=- -Commands.MmoInfo.Stats=\u0421\u0422\u0410\u0422\u042B: {0} -Commands.Mmodebug.Toggle=\u0420\u0435\u0436\u0438\u043C \u043E\u0442\u043B\u0430\u0434\u043A\u0438 mcMMO &6{0}&7, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u0443 \u0441\u043D\u043E\u0432\u0430 \u0434\u043B\u044F \u043F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u044F. \u0412 \u0440\u0435\u0436\u0438\u043C\u0435 \u043E\u0442\u043B\u0430\u0434\u043A\u0438 \u0432\u044B \u043C\u043E\u0436\u0435\u0442\u0435 \u0431\u0438\u0442\u044C \u0431\u043B\u043E\u043A\u0438, \u0447\u0442\u043E\u0431\u044B \u043F\u0440\u043E\u0441\u043C\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044C \u043F\u043E\u043B\u0435\u0437\u043D\u0443\u044E \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044E, \u0442\u0440\u0435\u0431\u0443\u0435\u043C\u0443\u044E \u0434\u043B\u044F \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u043A\u0438. -mcMMO.NoInvites=&c\u0421\u0435\u0439\u0447\u0430\u0441 \u0443 \u0432\u0430\u0441 \u043D\u0435\u0442 \u043F\u0440\u0438\u0433\u043B\u0430\u0448\u0435\u043D\u0438\u0439 -mcMMO.NoPermission=&4\u041D\u0435\u0434\u043E\u0441\u0442\u0430\u0442\u043E\u0447\u043D\u043E \u043F\u0440\u0430\u0432. -mcMMO.NoSkillNote=&8\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 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D \u0437\u0434\u0435\u0441\u044C. +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] \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 (\u043F\u0440\u043E\u0432\u0435\u0440\u044C\u0442\u0435 \u043F\u0440\u0430\u0432\u0430) -Party.Help.0=&c\u041F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u043E\u0435 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0435 &3{0} <\u0438\u0433\u0440\u043E\u043A> [\u043F\u0430\u0440\u043E\u043B\u044C]. -Party.Help.1=&c\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 &3{0} <\u043D\u0430\u0437\u0432\u0430\u043D\u0438\u0435> [\u043F\u0430\u0440\u043E\u043B\u044C]. -Party.Help.2=&c\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 &3{0} &c\u0434\u043B\u044F \u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0439 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0438 -Party.Help.3=&c\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 &3{0} <\u0438\u0433\u0440\u043E\u043A> [\u043F\u0430\u0440\u043E\u043B\u044C]&c, \u0447\u0442\u043E\u0431\u044B \u043F\u0440\u0438\u0441\u043E\u0435\u0434\u0438\u043D\u0438\u0442\u044C\u0441\u044F \u0438\u043B\u0438 &3{1}&c, \u0447\u0442\u043E\u0431\u044B \u0432\u044B\u0439\u0442\u0438 -Party.Help.4=&c\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 \u0441\u0432\u043E\u044E \u0433\u0440\u0443\u043F\u043F\u0443, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 &3{0} -Party.Help.5=&c\u0427\u0442\u043E\u0431\u044B \u0437\u0430\u0449\u0438\u0442\u0438\u0442\u044C \u0441\u0432\u043E\u044E \u0433\u0440\u0443\u043F\u043F\u0443 \u043F\u0430\u0440\u043E\u043B\u0435\u043C, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 &3{0} <\u043F\u0430\u0440\u043E\u043B\u044C> -Party.Help.6=\u0427\u0442\u043E\u0431\u044B \u0432\u044B\u0433\u043D\u0430\u0442\u044C \u0438\u0433\u0440\u043E\u043A\u0430 \u0438\u0437 \u0441\u0432\u043E\u0435\u0439 \u0433\u0440\u0443\u043F\u043F\u044B, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 &3{0} <\u0438\u0433\u0440\u043E\u043A> -Party.Help.7=\u0427\u0442\u043E\u0431\u044B \u043F\u0435\u0440\u0435\u0434\u0430\u0442\u044C \u043F\u0440\u0430\u0432\u0430 \u0443\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u044F \u0441\u0432\u043E\u0435\u0439 \u0433\u0440\u0443\u043F\u043F\u043E\u0439, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 &3{0} <\u0438\u0433\u0440\u043E\u043A> -Party.Help.8=&c\u0427\u0442\u043E\u0431\u044B \u0440\u0430\u0441\u0444\u043E\u0440\u043C\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0441\u0432\u043E\u044E \u0433\u0440\u0443\u043F\u043F\u0443, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 &3{0} -Party.Help.9=&c\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 &3{0} &c\u0434\u043B\u044F \u0440\u0430\u0441\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u043F\u0440\u0435\u0434\u043C\u0435\u0442\u043E\u0432 \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=&c\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 &3{0} &c\u0434\u043B\u044F \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u044F \u0440\u0430\u0441\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u044F \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} &a\u043F\u0440\u0438\u0441\u043E\u0435\u0434\u0438\u043D\u0438\u043B\u0441\u044F \u043A \u0432\u0430\u0448\u0435\u0439 \u0433\u0440\u0443\u043F\u043F\u0435 -Party.InformedOnQuit={0} &a\u043F\u043E\u043A\u0438\u043D\u0443\u043B \u0432\u0430\u0448\u0443 \u0433\u0440\u0443\u043F\u043F\u0443 -Party.InformedOnNameChange=&6{0} &a\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 &f{1} -Party.InvalidName=&4\u042D\u0442\u043E \u043D\u0435\u0434\u043E\u043F\u0443\u0441\u0442\u0438\u043C\u043E\u0435 \u043D\u0430\u0437\u0432\u0430\u043D\u0438\u0435 \u0433\u0440\u0443\u043F\u043F\u044B. -Party.Invite.Self=&c\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=&c\u042D\u0442\u0430 \u0433\u0440\u0443\u043F\u043F\u0430 \u0443\u0436\u0435 \u0437\u0430\u043A\u0440\u044B\u0442\u0430! -Party.IsntLocked=&c\u042D\u0442\u0430 \u0433\u0440\u0443\u043F\u043F\u0430 \u043D\u0435 \u0437\u0430\u043A\u0440\u044B\u0442\u0430! -Party.Locked=&c\u0413\u0440\u0443\u043F\u043F\u0430 \u0437\u0430\u043A\u0440\u044B\u0442\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=&4{0} \u043D\u0435\u0442 \u0432 \u0432\u0430\u0448\u0435\u0439 \u0433\u0440\u0443\u043F\u043F\u0435 -Party.NotOwner=&4\u0412\u044B \u043D\u0435 \u043B\u0438\u0434\u0435\u0440 \u0433\u0440\u0443\u043F\u043F\u044B. -Party.Target.NotOwner=&4{0} \u043D\u0435 \u043B\u0438\u0434\u0435\u0440 \u0433\u0440\u0443\u043F\u043F\u044B. -Party.Owner.New=&a{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=&4\u0412\u044B \u0431\u043E\u043B\u044C\u0448\u0435 \u043D\u0435 \u043B\u0438\u0434\u0435\u0440 \u0433\u0440\u0443\u043F\u043F\u044B. -Party.Owner.Player =&a\u0422\u0435\u043F\u0435\u0440\u044C \u0432\u044B \u043B\u0438\u0434\u0435\u0440 \u0433\u0440\u0443\u043F\u043F\u044B. -Party.Password.None=&c\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\u0438\u043D\u0438\u0442\u044C\u0441\u044F. -Party.Password.Incorrect=&c\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u044B\u0439 \u043F\u0430\u0440\u043E\u043B\u044C \u0433\u0440\u0443\u043F\u043F\u044B. -Party.Password.Set=&a\u041F\u0430\u0440\u043E\u043B\u044C \u0433\u0440\u0443\u043F\u043F\u044B \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D \u043D\u0430 {0} -Party.Password.Removed=&a\u041F\u0430\u0440\u043E\u043B\u044C \u0433\u0440\u0443\u043F\u043F\u044B \u0431\u044B\u043B \u0443\u0434\u0430\u043B\u0435\u043D. -Party.Player.Invalid=&c\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=&4{0} \u043D\u0435 \u0432 \u0441\u0435\u0442\u0438! -Party.Player.InSameParty=&c{0} \u0443\u0436\u0435 \u043D\u0430\u0445\u043E\u0434\u0438\u0442\u0441\u044F \u0432 \u0432\u0430\u0448\u0435\u0439 \u0433\u0440\u0443\u043F\u043F\u0435! -Party.PlayerNotInParty=&4{0} \u043D\u0435 \u0441\u043E\u0441\u0442\u043E\u0438\u0442 \u0432 \u0433\u0440\u0443\u043F\u043F\u0435 -Party.Specify=&c\u0412\u044B \u0434\u043E\u043B\u0436\u043D\u044B \u0443\u043A\u0430\u0437\u0430\u0442\u044C \u0433\u0440\u0443\u043F\u043F\u0443. -Party.Teleport.Dead=&c\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=&c\u0417\u0430 \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0438\u0435 {0} \u0441\u0435\u043A\u0443\u043D\u0434 \u0432\u044B \u043F\u043E\u043B\u0443\u0447\u0438\u043B\u0438 \u0443\u0440\u043E\u043D, \u0442\u0435\u043B\u0435\u043F\u043E\u0440\u0442\u0430\u0446\u0438\u044F \u043E\u0442\u043C\u0435\u043D\u0435\u043D\u0430. -Party.Teleport.Player=&a\u0412\u044B \u0442\u0435\u043B\u0435\u043F\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u043B\u0438\u0441\u044C \u043A {0}. -Party.Teleport.Self=&c\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\u0435\u0431\u0435! -Party.Teleport.Target=&a{0} \u0442\u0435\u043B\u0435\u043F\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u043B\u0441\u044F \u043A \u0432\u0430\u043C. -Party.Teleport.Disabled=&c\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=&c\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=&c\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=&7\u0413\u0440\u0443\u043F\u043F\u0430 \u043E\u0442\u043A\u0440\u044B\u0442\u0430 -Party.Disband=&7\u0413\u0440\u0443\u043F\u043F\u0430 \u0440\u0430\u0441\u0444\u043E\u0440\u043C\u0438\u0440\u043E\u0432\u0430\u043D\u0430 -Party.Alliance.Formed=&7\u0412\u0430\u0448\u0430 \u0433\u0440\u0443\u043F\u043F\u0430 \u0442\u0435\u043F\u0435\u0440\u044C \u0432 \u0441\u043E\u044E\u0437\u0435 \u0441 &a{0} -Party.Alliance.Disband=&7\u0412\u0430\u0448 \u0441\u043E\u044E\u0437 \u0441 &c{0} &7\u0440\u0430\u0441\u043F\u0430\u043B\u0441\u044F -Party.Status.Locked=&4(\u0422\u041E\u041B\u042C\u041A\u041E \u041F\u041E \u041F\u0420\u0418\u0413\u041B\u0410\u0428\u0415\u041D\u0418\u042E) -Party.Status.Unlocked=&2(\u041E\u0422\u041A\u0420\u042B\u0422\u0410) -Party.LevelUp=&e\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}. \u0412\u0441\u0435\u0433\u043E ({1}) -Party.Feature.Chat=\u0427\u0430\u0442 \u0433\u0440\u0443\u043F\u043F\u044B -Party.Feature.Teleport=\u0422\u0435\u043B\u0435\u043F\u043E\u0440\u0442\u0430\u0446\u0438\u044F \u0433\u0440\u0443\u043F\u043F\u044B -Party.Feature.Alliance=\u0421\u043E\u044E\u0437\u044B -Party.Feature.ItemShare=\u0420\u0430\u0441\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u043F\u0440\u0435\u0434\u043C\u0435\u0442\u043E\u0432 -Party.Feature.XpShare=\u0420\u0430\u0441\u043F\u0440\u0435\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=\u0417\u0410\u0411\u041B\u041E\u041A\u0418\u0420\u041E\u0412\u0410\u041D\u041E \u0414\u041E {0}+ (\u0422\u0415\u041B\u0415\u041F\u041E\u0420\u0422\u0410\u0426\u0418\u042F \u0413\u0420\u0423\u041F\u041F\u042B) -Party.Feature.Locked.Alliance=\u0417\u0410\u0411\u041B\u041E\u041A\u0418\u0420\u041E\u0412\u0410\u041D\u041E \u0414\u041E {0}+ (\u0421\u041E\u042E\u0417\u042B) -Party.Feature.Locked.ItemShare=\u0417\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=\u0417\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=&c\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=&c\u0422\u0435\u043B\u0435\u043F\u043E\u0440\u0442\u0430\u0446\u0438\u044F \u0433\u0440\u0443\u043F\u043F\u044B \u0435\u0449\u0435 \u043D\u0435 \u0440\u0430\u0437\u0431\u043B\u043E\u043A\u0438\u0440\u043E\u0432\u0430\u043D\u0430. -Party.Feature.Disabled.3=&c\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=&c\u0420\u0430\u0441\u043F\u0440\u0435\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=&c\u0420\u0430\u0441\u043F\u0440\u0435\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.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.ItemShare.Category.Loot=\u0414\u043E\u0431\u044B\u0447\u0430 -Party.ItemShare.Category.Mining=\u0428\u0430\u0445\u0442\u0435\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 +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=\u041F\u0430\u0434\u0435\u043D\u0438\u0435 -Commands.XPGain.Alchemy=\u0412\u0430\u0440\u043A\u0430 \u0437\u0435\u043B\u0438\u0439 -Commands.XPGain.Archery=\u0423\u0431\u0438\u0439\u0441\u0442\u0432\u043E \u043C\u043E\u043D\u0441\u0442\u0440\u043E\u0432 -Commands.XPGain.Axes=\u0423\u0431\u0438\u0439\u0441\u0442\u0432\u043E \u043C\u043E\u043D\u0441\u0442\u0440\u043E\u0432 -Commands.XPGain.Child=\u041F\u043E\u043B\u0443\u0447\u0430\u0435\u0442 \u0443\u0440\u043E\u0432\u043D\u0438 \u043E\u0442 \u0440\u043E\u0434\u0438\u0442\u0435\u043B\u044C\u0441\u043A\u043E\u0433\u043E \u043D\u0430\u0432\u044B\u043A\u0430 -Commands.XPGain.Excavation=\u0420\u0430\u0441\u043A\u043E\u043F\u043A\u0438 \u0438 \u043F\u043E\u0438\u0441\u043A \u0441\u043E\u043A\u0440\u043E\u0432\u0438\u0449 -Commands.XPGain.Fishing=\u0420\u044B\u0431\u0430\u043B\u043A\u0430 (\u043E\u0447\u0435\u0432\u0438\u0434\u043D\u043E) -Commands.XPGain.Herbalism=\u0421\u0431\u043E\u0440 \u0442\u0440\u0430\u0432 -Commands.XPGain.Mining=\u0414\u043E\u0431\u044B\u0447\u0430 \u043A\u0430\u043C\u043D\u0435\u0439 \u0438 \u0440\u0443\u0434 -Commands.XPGain.Repair=\u0420\u0435\u043C\u043E\u043D\u0442 \u0432\u0435\u0449\u0435\u0439 -Commands.XPGain.Swords=\u0423\u0431\u0438\u0439\u0441\u0442\u0432\u043E \u043C\u043E\u043D\u0441\u0442\u0440\u043E\u0432 -Commands.XPGain.Taming=\u041F\u0440\u0438\u0440\u0443\u0447\u0435\u043D\u0438\u0435 \u0436\u0438\u0432\u043E\u0442\u043D\u044B\u0445 \u0438\u043B\u0438 \u0441\u0440\u0430\u0436\u0435\u043D\u0438\u0435 \u0432\u043C\u0435\u0441\u0442\u0435 \u0441 \u0432\u043E\u043B\u043A\u0430\u043C\u0438 -Commands.XPGain.Unarmed=\u0423\u0431\u0438\u0439\u0441\u0442\u0432\u043E \u043C\u043E\u043D\u0441\u0442\u0440\u043E\u0432 -Commands.XPGain.Woodcutting=\u0420\u0443\u0431\u043A\u0430 \u0434\u0435\u0440\u0435\u0432\u044C\u0435\u0432 -Commands.XPGain=&8\u041F\u041E\u041B\u0423\u0427\u0415\u041D\u041E \u041E\u041F\u042B\u0422\u0410: &f{0} -Commands.xplock.locked=&6\u0412\u0430\u0448\u0430 \u043F\u0430\u043D\u0435\u043B\u044C \u043E\u043F\u044B\u0442\u0430 \u0442\u0435\u043F\u0435\u0440\u044C \u0437\u0430\u0444\u0438\u043A\u0441\u0438\u0440\u043E\u0432\u0430\u043D\u0430 \u043D\u0430 {0}! -Commands.xplock.unlocked=&6\u0412\u0430\u0448\u0430 \u043F\u0430\u043D\u0435\u043B\u044C \u043E\u043F\u044B\u0442\u0430 \u0442\u0435\u043F\u0435\u0440\u044C &a\u0420\u0410\u0417\u0411\u041B\u041E\u041A\u0418\u0420\u041E\u0412\u0410\u041D\u0410&6! -Commands.xprate.modified=&c\u041C\u041D\u041E\u0416\u0418T\u0415\u041B\u042C \u041E\u041F\u042BT\u0410 \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D \u043D\u0430 {0} -Commands.xprate.over=&c\u0421\u043E\u0431\u044B\u0442\u0438\u0435 \u043C\u043D\u043E\u0436\u0438\u0442\u0435\u043B\u044F \u043E\u043F\u044B\u0442\u0430 mcMMO \u0417\u0410\u0412\u0415\u0420\u0428\u0415\u041D\u041E!! -Commands.xprate.proper.0=&c\u041F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u043E\u0435 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u044F \u0434\u043B\u044F \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F \u043C\u043D\u043E\u0436\u0438\u0442\u0435\u043B\u044F \u043E\u043F\u044B\u0442\u0430 /xprate <\u0447\u0438\u0441\u043B\u043E> -Commands.xprate.proper.1=&c\u041F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u043E\u0435 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0435 \u0434\u043B\u044F \u0441\u0431\u0440\u043E\u0441\u0430 \u043C\u043D\u043E\u0436\u0438\u0442\u0435\u043B\u044F \u043E\u043F\u044B\u0442\u0430 /xprate reset -Commands.xprate.proper.2=&c\u041F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430, \u0432\u044B\u0431\u0435\u0440\u0438\u0442\u0435 true(\u0434\u0430) \u0438\u043B\u0438 false(\u043D\u0435\u0442), \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 \u0441\u043E\u0431\u044B\u0442\u0438\u0435\u043C \u043C\u043D\u043E\u0436\u0438\u0442\u0435\u043B\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=&amcMMO&6 \u0441\u043E\u0431\u044B\u0442\u0438\u0435! -Commands.Event.Stop=&amcMMO&3 \u0441\u043E\u0431\u044B\u0442\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u043E! -Commands.Event.Stop.Subtitle=&a\u041D\u0430\u0434\u0435\u044E\u0441\u044C, \u0432\u044B \u043F\u043E\u0432\u0435\u0441\u0435\u043B\u0438\u043B\u0438\u0441\u044C! -Commands.Event.XP=&3\u041C\u043D\u043E\u0436\u0438\u0442\u0435\u043B\u044C \u043E\u043F\u044B\u0442\u0430 \u0441\u0435\u0439\u0447\u0430\u0441 &6{0}&3x -Commands.xprate.started.0=&6\u0421\u041E\u0411\u042B\u0418T\u0415 \u041C\u041D\u041E\u0416\u0418T\u0415\u041B\u042F \u041E\u041F\u042BT\u0410 mcMMO \u041D\u0410\u0427\u0410\u041B\u041E\u0421\u042C! -Commands.xprate.started.1=&6\u041C\u041D\u041E\u0416\u0418T\u0415\u041B\u042C \u041E\u041F\u042BT\u0410 mcMMO \u0421\u0415\u0419\u0427\u0410\u0421 {0}x! +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[\u0421\u0435\u0440\u0432\u0435\u0440] -Notifications.Admin.XPRate.Start.Self=&7\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 &6{0}x -Notifications.Admin.XPRate.End.Self=&7\u0412\u044B \u0437\u0430\u0432\u0435\u0440\u0448\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} &7\u0437\u0430\u0432\u0435\u0440\u0448\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} &7\u043D\u0430\u0447\u0430\u043B \u0438\u043B\u0438 \u0438\u0437\u043C\u0435\u043D\u0438\u043B \u0441\u043E\u0431\u044B\u0442\u0438\u0435 \u043C\u043D\u043E\u0436\u0438\u0442\u0435\u043B\u044F \u043E\u043F\u044B\u0442\u0430 {1}x -Notifications.Admin.Format.Others=&6(&amcMMO &3\u0430\u0434\u043C\u0438\u043D&6) &7{0} +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\u0412 mcMMO \u0441\u043E\u0431\u044B\u0442\u0438\u0435 \u043C\u043D\u043E\u0436\u0438\u0442\u0435\u043B\u044F \u043E\u043F\u044B\u0442\u0430! \u041C\u043D\u043E\u0436\u0438\u0442\u0435\u043B\u044C \u043E\u043F\u044B\u0442\u0430 - {0}x! +XPRate.Event=&6В mcMMO событие множителя опыта! Множитель опыта - {0}x! #GUIDES -Guides.Available=&7\u0414\u043E\u0441\u0442\u0443\u043F\u043D\u043E \u0440\u0443\u043A\u043E\u0432\u043E\u0434\u0441\u0442\u0432\u043E \u0434\u043B\u044F {0} - \u0432\u0432\u0435\u0434\u0438\u0442\u0435 /{1} ? [\u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0430] -Guides.Header=&6-=&a\u0420\u0443\u043A\u043E\u0432\u043E\u0434\u0441\u0442\u0432\u043E {0} &6=- -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\u043E\u0439 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B \u043D\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 - \u0435\u0441\u0442\u044C \u043B\u0438\u0448\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] +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\u041E \u043D\u0430\u0432\u044B\u043A\u0435 \u0410\u043A\u0440\u043E\u0431\u0430\u0442\u0438\u043A\u0430:!nasd&e\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.!nasd&e\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.!nasd!nasd&3\u041F\u043E\u043B\u0443\u0447\u0435\u043D\u0438\u0435 \u043E\u043F\u044B\u0442\u0430:!nasd&e\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 !nasd&e\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=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u041A\u0443\u0432\u044B\u0440\u043E\u043A?!nasd&e\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\u0430\u0435\u043C\u044B\u0439 \u043F\u0440\u0438 \u043F\u0430\u0434\u0435\u043D\u0438\u0438.!nasd&e\u0415\u0441\u043B\u0438 \u0432\u043E \u0432\u0440\u0435\u043C\u044F \u043F\u0430\u0434\u0435\u043D\u0438\u044F \u0434\u0435\u0440\u0436\u0430\u0442\u044C \u043A\u043D\u043E\u043F\u043A\u0443 \u043F\u0440\u0438\u0441\u0435\u0434\u0430,!nasd&e\u0442\u043E \u044D\u0442\u043E\u0442 \u0448\u0430\u043D\u0441 \u043C\u043E\u0436\u043D\u043E \u0443\u0434\u0432\u043E\u0438\u0442\u044C.!nasd&e\u042D\u0442\u043E \u0432\u044B\u0437\u043E\u0432\u0435\u0442 \u0413\u0440\u0430\u0446\u0438\u043E\u0437\u043D\u044B\u0439 \u043A\u0443\u0432\u044B\u0440\u043E\u043A, \u0432\u043C\u0435\u0441\u0442\u043E \u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u043E\u0433\u043E.!nasd&e\u0413\u0440\u0430\u0446\u0438\u043E\u0437\u043D\u044B\u0435 \u043A\u0443\u0432\u044B\u0440\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!nasd&e\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.!nasd&e\u0428\u0430\u043D\u0441 \u043D\u0430 \u0443\u0434\u0430\u0447\u043D\u044B\u0439 \u041A\u0443\u0432\u044B\u0440\u043E\u043A \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043E\u0442 \u0443\u0440\u043E\u0432\u043D\u044F \u043D\u0430\u0432\u044B\u043A\u0430. -Guides.Acrobatics.Section.2=&3\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?!nasd&e\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 \u0448\u0430\u043D\u0441 \u0443\u043A\u043B\u043E\u043D\u0438\u0442\u044C\u0441\u044F!nasd&e\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.!nasd&e\u0428\u0430\u043D\u0441 \u043D\u0430 \u0443\u0434\u0430\u0447\u043D\u043E\u0435 \u0423\u043A\u043B\u043E\u043D\u0435\u043D\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043E\u0442 \u0443\u0440\u043E\u0432\u043D\u044F \u043D\u0430\u0432\u044B\u043A\u0430. +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\u041E \u043D\u0430\u0432\u044B\u043A\u0435 \u0410\u043B\u0445\u0438\u043C\u0438\u044F:!nasd&e\u0410\u043B\u0445\u0438\u043C\u0438\u044F - \u044D\u0442\u043E \u043F\u0440\u043E\u0438\u0437\u0432\u043E\u0434\u0441\u0442\u0432\u043E \u0437\u0435\u043B\u0438\u0439.!nasd&e\u041E\u043D\u0430 \u043E\u0431\u0435\u0441\u043F\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0443\u0441\u043A\u043E\u0440\u0435\u043D\u0438\u0435 \u0432\u0430\u0440\u043A\u0438 \u0437\u0435\u043B\u0438\u0439, \u0430 \u0442\u0430\u043A\u0436\u0435!nasd&e\u0434\u043E\u0431\u0430\u0432\u043B\u044F\u0435\u0442 \u043D\u043E\u0432\u044B\u0435, \u0440\u0430\u043D\u0435\u0435 \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0435 \u0437\u0435\u043B\u0438\u0439.!nasd!nasd!nasd&3\u041F\u041E\u041B\u0423\u0427\u0415\u041D\u0418 \u041E\u041F\u042BT\u0410:!nasd&e\u0427\u0442\u043E\u0431\u044B \u043F\u043E\u043B\u0443\u0447\u0438\u0442\u044C \u043E\u043F\u044B\u0442 \u0432 \u044D\u0442\u043E\u043C \u043D\u0430\u0432\u044B\u043A\u0435, \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E \u0432\u0430\u0440\u0438\u0442\u044C \u0437\u0435\u043B\u044C\u044F. -Guides.Alchemy.Section.1=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u041A\u0430\u0442\u0430\u043B\u0438\u0437\u0430\u0442\u043E\u0440?!nasd&e\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 \u0432\u0430\u0440\u043A\u0438 \u0434\u043E!nasd&e\u0441\u043A\u043E\u0440\u043E\u0441\u0442\u0438 4x \u043D\u0430 \u0443\u0440\u043E\u0432\u043D\u0435 1000.!nasd&e\u042D\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.Alchemy.Section.2=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u041E\u0442\u0432\u0430\u0440\u044B?!nasd&e\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\u0435\u0434\u0438\u0435\u043D\u0442\u0430\u043C\u0438.!nasd&e\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\u0435\u0434\u0438\u0435\u043D\u0442\u044B!nasd&e\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=&3\u0418\u043D\u0433\u0440\u0435\u0434\u0438\u0435\u043D\u0442\u044B 1 \u0440\u0430\u043D\u0433\u0430 \u041E\u0442\u0432\u0430\u0440\u043E\u0432:!nasd&e\u041E\u0433\u043D\u0435\u043D\u043D\u044B\u0439 \u043F\u043E\u0440\u043E\u0448\u043E\u043A, \u041C\u0430\u0440\u0438\u043D\u043E\u0432\u0430\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,!nasd&e\u0421\u0432\u0435\u0442\u043E\u043A\u0430\u043C\u0435\u043D\u043D\u0430\u044F \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 \u043C\u043E\u0440\u043A\u043E\u0432\u044C,!nasd&e\u0421\u0433\u0443\u0441\u0442\u043E\u043A \u043C\u0430\u0433\u043C\u044B, \u041D\u0435\u0437\u0435\u0440\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,!nasd&e\u0418\u0433\u043B\u043E\u0431\u0440\u044E\u0445!nasd&e(\u0412\u0430\u043D\u0438\u043B\u044C\u043D\u044B\u0435 \u0437\u0435\u043B\u044C\u044F) -Guides.Alchemy.Section.4=&3\u0418\u043D\u0433\u0440\u0435\u0434\u0438\u0435\u043D\u0442\u044B 2 \u0440\u0430\u043D\u0433\u0430 \u041E\u0442\u0432\u0430\u0440\u043E\u0432:!nasd&e\u041C\u043E\u0440\u043A\u043E\u0432\u044C (\u0417\u0435\u043B\u044C\u0435 \u0441\u043A\u043E\u0440\u043E\u0441\u0442\u0438)!nasd&e\u0421\u043B\u0438\u0437\u044C (\u0417\u0435\u043B\u044C\u0435 \u0442\u0443\u043F\u043E\u0441\u0442\u0438)!nasd!nasd&3\u0418\u043D\u0433\u0440\u0435\u0434\u0438\u0435\u043D\u0442\u044B 3 \u0440\u0430\u043D\u0433\u0430 \u041E\u0442\u0432\u0430\u0440\u043E\u0432:!nasd&e\u041A\u0432\u0430\u0440\u0446 (\u0417\u0435\u043B\u044C\u0435 \u043F\u043E\u0433\u043B\u043E\u0449\u0435\u043D\u0438\u044F)!nasd&e\u041C\u0443\u0445\u043E\u043C\u043E\u0440 (\u0417\u0435\u043B\u044C\u0435 \u043F\u0440\u044B\u0433\u0443\u0447\u0435\u0441\u0442\u0438) -Guides.Alchemy.Section.5=&3\u0418\u043D\u0433\u0440\u0435\u0434\u0438\u0435\u043D\u0442\u044B 4 \u0440\u0430\u043D\u0433\u0430 \u041E\u0442\u0432\u0430\u0440\u043E\u0432:!nasd&e\u042F\u0431\u043B\u043E\u043A\u043E (\u0417\u0435\u043B\u044C\u0435 \u0434\u043E\u043F. \u0437\u0434\u043E\u0440\u043E\u0432\u044C\u044F)!nasd&e\u0413\u043D\u0438\u043B\u0430\u044F \u041F\u043B\u043E\u0442\u044C (\u0417\u0435\u043B\u044C\u0435 \u0433\u043E\u043B\u043E\u0434\u0430)!nasd!nasd&3\u0418\u043D\u0433\u0440\u0435\u0434\u0438\u0435\u043D\u0442\u044B 5 \u0440\u0430\u043D\u0433\u0430 \u041E\u0442\u0432\u0430\u0440\u043E\u0432:!nasd&e\u041A\u043E\u0440\u0438\u0447\u043D\u0435\u0432\u044B\u0439 \u0433\u0440\u0438\u0431 (\u0417\u0435\u043B\u044C\u0435 \u0442\u043E\u0448\u043D\u043E\u0442\u044B)!nasd&e\u0427\u0435\u0440\u043D\u0438\u043B\u044C\u043D\u044B\u0439 \u043C\u0435\u0448\u043E\u043A (\u0417\u0435\u043B\u044C\u0435 \u0441\u043B\u0435\u043F\u043E\u0442\u044B) -Guides.Alchemy.Section.6=&3\u0418\u043D\u0433\u0440\u0435\u0434\u0438\u0435\u043D\u0442\u044B 6 \u0440\u0430\u043D\u0433\u0430 \u041E\u0442\u0432\u0430\u0440\u043E\u0432:!nasd&e\u041F\u0430\u043F\u043E\u0440\u043E\u0442\u043D\u0438\u043A (\u0417\u0435\u043B\u044C\u0435 \u043D\u0430\u0441\u044B\u0449\u0435\u043D\u0438\u044F)!nasd!nasd&3\u0418\u043D\u0433\u0440\u0435\u0434\u0438\u0435\u043D\u0442\u044B 7 \u0440\u0430\u043D\u0433\u0430 \u041E\u0442\u0432\u0430\u0440\u043E\u0432:!nasd&e\u042F\u0434\u043E\u0432\u0438\u0442\u044B\u0439 \u043A\u0430\u0440\u0442\u043E\u0444\u0435\u043B\u044C (\u0417\u0435\u043B\u044C\u0435 \u0437\u0430\u0433\u043D\u0438\u0432\u0430\u043D\u0438\u044F)!nasd!nasd&3\u0418\u043D\u0433\u0440\u0435\u0434\u0438\u0435\u043D\u0442\u044B 8 \u0440\u0430\u043D\u0433\u0430 \u041E\u0442\u0432\u0430\u0440\u043E\u0432:!nasd&e\u041E\u0431\u044B\u0447\u043D\u043E\u0435 \u0437\u043E\u043B\u043E\u0442\u043E\u0435 \u044F\u0431\u043B\u043E\u043A\u043E (\u0417\u0435\u043B\u044C\u0435 \u0437\u0430\u0449\u0438\u0442\u044B) +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\u041E \u043D\u0430\u0432\u044B\u043A\u0435 \u0421\u0442\u0440\u0435\u043B\u044C\u0431\u0430:!nasd&e\u041D\u0430\u0432\u044B\u043A \u0421\u0442\u0440\u0435\u043B\u044C\u0431\u044B \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u0435\u043D \u043D\u0430 \u0432\u0430\u0448\u0438 \u043B\u0443\u043A \u0438 \u0441\u0442\u0440\u0435\u043B\u044B.!nasd&e\u041E\u043D \u0434\u0430\u0435\u0442 \u0440\u0430\u0437\u043B\u0438\u0447\u043D\u044B\u0435 \u0431\u043E\u043D\u0443\u0441\u044B, \u0432\u0440\u043E\u0434\u0435 \u0443\u0432\u0435\u043B\u0438\u0447\u0435\u043D\u0438\u0435 \u0443\u0440\u043E\u043D\u0430,!nasd&e\u0432\u043E\u0437\u0440\u0430\u0441\u0442\u0430\u044E\u0449\u0435\u0433\u043E \u0441 \u0443\u0440\u043E\u0432\u043D\u0435\u043C, \u0430 \u0442\u0430\u043A\u0436\u0435 \u0443\u043C\u0435\u043D\u0438\u0435 \u043E\u0448\u0435\u043B\u043E\u043C\u0438\u0442\u044C!nasd&e\u043F\u0440\u043E\u0442\u0438\u0432\u043D\u0438\u043A\u0430 \u0432 \u041F\u0432\u041F. \u0422\u0430\u043A\u0436\u0435 \u0432\u044B \u043F\u043E\u043B\u0443\u0447\u0430\u0435\u0442\u0435 \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E\u0441\u0442\u044C!nasd&e\u0432\u0435\u0440\u043D\u0443\u0442\u044C \u0447\u0430\u0441\u0442\u044C \u0441\u0442\u0440\u0435\u043B \u0441 \u043F\u043E\u0432\u0435\u0440\u0436\u0435\u043D\u043D\u044B\u0445 \u0432\u0440\u0430\u0433\u043E\u0432.!nasd!nasd&3\u041F\u041E\u041B\u0423\u0427\u0415\u041D\u0418\u0415 \u041E\u041F\u042B\u0422\u0410:!nasd&e\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\u0435, \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E \u0441\u0442\u0440\u0435\u043B\u044F\u0442\u044C!nasd&e\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=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u0423\u043C\u0435\u043B\u044B\u0439 \u0432\u044B\u0441\u0442\u0440\u0435\u043B?!nasd&e\u0423\u043C\u0435\u043B\u044B\u0439 \u0432\u044B\u0441\u0442\u0440\u0435\u043B \u043D\u0430\u043D\u043E\u0441\u0438\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.!nasd&e\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 \u0432\u044B\u0441\u0442\u0440\u0435\u043B\u0435 \u0440\u0430\u0441\u0442\u0435\u0442 \u0441!nasd&e \u0432\u0430\u0448\u0438\u043C \u0443\u0440\u043E\u0432\u043D\u0435\u043C \u043D\u0430\u0432\u044B\u043A\u0430 \u0421\u0442\u0440\u0435\u043B\u044C\u0431\u044B. !nasd&e\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 \u0443\u0432\u0435\u043B\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044F \u043D\u0430 10% !nasd&e\u043A\u0430\u0436\u0434\u044B\u0435 50 \u0443\u0440\u043E\u0432\u043D\u0435\u0439, \u0432\u043F\u043B\u043E\u0442\u044C \u0434\u043E 200% \u0431\u043E\u043D\u0443\u0441\u043D\u043E\u0433\u043E \u0443\u0440\u043E\u043D\u0430. -Guides.Archery.Section.2=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u041E\u0448\u0435\u043B\u043E\u043C\u043B\u0435\u043D\u0438\u0435?!nasd&e\u0412\u044B \u0438\u043C\u0435\u0435\u0442\u0435 \u043F\u0430\u0441\u0441\u0438\u0432\u043D\u044B\u0439 \u0448\u0430\u043D\u0441 \u041E\u0448\u0435\u043B\u043E\u043C\u0438\u0442\u044C \u0434\u0440\u0443\u0433\u0438\u0445 \u0438\u0433\u0440\u043E\u043A\u043E\u0432,!nasd&e\u0441\u0442\u0440\u0435\u043B\u044F\u044F \u0432 \u043D\u0438\u0445. \u041E\u0448\u0435\u043B\u043E\u043C\u043B\u0435\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 !nasd&e\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\u0431\u043E\u043B\u044C\u0448\u043E\u0433\u043E \u0432\u0440\u0435\u043C\u0435\u043D\u0438.!nasd&e\u041E\u0448\u0435\u043B\u043E\u043C\u043B\u0435\u043D\u0438\u0435 \u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u043E \u043D\u0430\u043D\u043E\u0441\u0438\u0442 4 \u0443\u0440\u043E\u043D\u0430 (2 \u0441\u0435\u0440\u0434\u0446\u0430). -Guides.Archery.Section.3=&3\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 \u0441\u0442\u0440\u0435\u043B?!nasd&e\u0423 \u0432\u0430\u0441 \u0435\u0441\u0442\u044C \u043F\u0430\u0441\u0441\u0438\u0432\u043D\u044B\u0439 \u0448\u0430\u043D\u0441 \u0432\u0435\u0440\u043D\u0443\u0442\u044C \u0447\u0430\u0441\u0442\u044C \u0441\u0432\u043E\u0438\u0445!nasd&e\u0441\u0442\u0440\u0435\u043B \u043F\u043E\u0441\u043B\u0435 \u0443\u0431\u0438\u0439\u0441\u0442\u0432\u0430 \u043C\u043E\u0431\u0430 \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u043B\u0443\u043A\u0430.!nasd&e\u042D\u0442\u043E\u0442 \u0448\u0430\u043D\u0441 \u0440\u0430\u0441\u0442\u0435\u0442 \u0441 \u0443\u0440\u043E\u0432\u043D\u0435\u043C \u043D\u0430\u0432\u044B\u043A\u0430 \u0421\u0442\u0440\u0435\u043B\u044C\u0431\u044B.!nasd&e\u0423\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, \u0432\u043F\u043B\u043E\u0442\u044C!nasd&e\u0434\u043E 100% \u043D\u0430 1000 \u0443\u0440\u043E\u0432\u043D\u0435. +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\u041E \u043D\u0430\u0432\u044B\u043A\u0435 \u0422\u043E\u043F\u043E\u0440\u044B:!nasd&e\u0421 \u043D\u0430\u0432\u044B\u043A\u043E\u043C \u0422\u043E\u043F\u043E\u0440\u044B \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!nasd&e\u0442\u043E\u043B\u044C\u043A\u043E \u0434\u043B\u044F \u0440\u0443\u0431\u043A\u0438 \u043B\u0435\u0441\u0430! \u0412\u044B \u0441\u043C\u043E\u0436\u0435\u0442\u0435 \u043A\u0440\u043E\u043C\u0441\u0430\u0442\u044C \u043C\u043E\u0431\u043E\u0432!nasd&e\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!nasd&e\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.!nasd&e\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!nasd&e\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.!nasd&e\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.!nasd&3\u041F\u041E\u041B\u0423\u0427\u0415\u041D\u0418\u0415 \u041E\u041F\u042B\u0422\u0410:!nasd&e\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 !nasd&e\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=&3\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 \u0447\u0435\u0440\u0435\u043F\u043E\u0432?!nasd&e\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!nasd&e\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,!nasd&e\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=&3\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 \u0443\u0434\u0430\u0440?!nasd&e\u041A\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043A\u0438\u0439 \u0443\u0434\u0430\u0440 - \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!nasd&e\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.!nasd&e\u041A\u0430\u0436\u0434\u044B\u0435 2 \u0443\u0440\u043E\u0432\u043D\u044F \u043D\u0430\u0432\u044B\u043A\u0430 \u0422\u043E\u043F\u043E\u0440\u043E\u0432 \u0434\u0430\u044E\u0442 \u0432\u0430\u043C +0,1%!nasd&e\u0448\u0430\u043D\u0441 \u043D\u0430\u043D\u0435\u0441\u0442\u0438 \u041A\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043A\u0438\u0439 \u0443\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!nasd&e\u0443\u0440\u043E\u043D x2, \u0430 \u0434\u0440\u0443\u0433\u0438\u0435 \u0438\u0433\u0440\u043E\u043A\u0438 x1,5. -Guides.Axes.Section.3=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u041C\u0430\u0441\u0442\u0435\u0440\u0441\u0442\u0432\u043E \u0442\u043E\u043F\u043E\u0440\u0430?!nasd&e\u041C\u0430\u0441\u0442\u0435\u0440\u0441\u0442\u0432\u043E \u0442\u043E\u043F\u043E\u0440\u0430 - \u043F\u0430\u0441\u0441\u0438\u0432\u043D\u043E\u0435 \u0443\u043C\u0435\u043D\u0438\u0435, \u043A\u043E\u0442\u043E\u0440\u043E\u0435 \u043D\u0430\u043D\u043E\u0441\u0438\u0442!nasd&e\u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0439 \u0443\u0440\u043E\u043D \u043F\u0440\u0438 \u0432\u0430\u0448\u0438\u0445 \u0430\u0442\u0430\u043A\u0430\u0445 \u0442\u043E\u043F\u043E\u0440\u043E\u043C.!nasd&e\u0411\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!nasd&e\u043D\u0430\u0432\u044B\u043A\u0430, \u0432\u043F\u043B\u043E\u0442\u044C \u0434\u043E 4 \u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0433\u043E \u0443\u0440\u043E\u043D\u0430 \u043D\u0430 200 \u0443\u0440\u043E\u0432\u043D\u0435. -Guides.Axes.Section.4=&3\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 \u0443\u0434\u0430\u0440?!nasd&e\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!!nasd&e\u0411\u0440\u043E\u043D\u0435\u0431\u043E\u0439\u043D\u044B\u0439 \u0443\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!nasd&e\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 \u0443\u0440\u043E\u0432\u043D\u044F \u043D\u0430\u0432\u044B\u043A\u0430. -Guides.Axes.Section.5=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u041C\u043E\u0449\u043D\u044B\u0439 \u0443\u0434\u0430\u0440?!nasd&e\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 \u041C\u043E\u0449\u043D\u044B\u0439 \u0443\u0434\u0430\u0440, \u0441\u0440\u0430\u0436\u0430\u044F\u0441\u044C \u0441 !nasd&e\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, !nasd&e\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 \u044D\u0444\u0444\u0435\u043A\u0442!nasd&e\u0441\u0438\u043B\u044C\u043D\u043E\u0433\u043E \u043E\u0442\u043A\u0438\u0434\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\u043A\u0438\u0434\u044B\u0432\u0430\u043D\u0438\u0435 II!nasd&e\u041A \u0442\u043E\u043C\u0443 \u0436\u0435 \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. +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\u041E \u043D\u0430\u0432\u044B\u043A\u0435 \u0420\u0430\u0441\u043A\u043E\u043F\u043A\u0438:!nasd&e\u0420\u0430\u0441\u043A\u043E\u043F\u043A\u0438 - \u043F\u0440\u043E\u0446\u0435\u0441\u0441 \u043A\u043E\u043F\u0430\u043D\u0438\u044F \u0437\u0435\u043C\u043B\u0438 \u0432 \u043F\u043E\u0438\u0441\u043A\u0430\u0445 \u0441\u043E\u043A\u0440\u043E\u0432\u0438\u0449.!nasd&e\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.!nasd&e\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 \u043C\u043E\u0436\u0435\u0442\u0435 \u043D\u0430\u0439\u0442\u0438.!nasd!nasd&3\u041F\u041E\u041B\u0423\u0427\u0415\u041D\u0418\u0415 \u041E\u041F\u042B\u0422\u0410:!nasd&e\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.!nasd&e\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=&3\u041F\u043E\u0434\u0445\u043E\u0434\u044F\u0449\u0438\u0435 \u0431\u043B\u043E\u043A\u0438:!nasd&e\u0414\u0435\u0440\u043D, \u0417\u0435\u043C\u043B\u044F, \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, \u0421\u043D\u0435\u0433 -Guides.Excavation.Section.2=&3\u041A\u0430\u043A \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u0443\u043C\u0435\u043D\u0438\u0435 \u0413\u0438\u0433\u0430-\u0431\u0443\u0440:!nasd&e\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\u043E\u0434\u0433\u043E\u0442\u043E\u0432\u0438\u0442\u044C \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442.!nasd&e\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 \u043D\u0430\u0447\u0430\u043B\u0430 \u0434\u043E\u0431\u044B\u0447\u0438!nasd&e\u043F\u043E\u0434\u0445\u043E\u0434\u044F\u0449\u0438\u0445 \u0431\u043B\u043E\u043A\u043E\u0432, \u0447\u0442\u043E \u0430\u043A\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u0413\u0438\u0433\u0430-\u0431\u0443\u0440. -Guides.Excavation.Section.3=&3\u0427\u0442\u043E \u0442\u0430\u043A\u043E\u0435 \u0413\u0438\u0433\u0430-\u0431\u0443\u0440?!nasd&e\u0413\u0438\u0433\u0430-\u0431\u0443\u0440 - \u044D\u0442\u043E \u0443\u043C\u0435\u043D\u0438\u0435 \u0441 \u043E\u0442\u043A\u0430\u0442\u043E\u043C, \u0441\u0432\u044F\u0437\u0430\u043D\u043D\u043E\u0435!nasd&e\u0441 \u043D\u0430\u0432\u044B\u043A\u043E\u043C \u0420\u0430\u0441\u043A\u043E\u043F\u043E\u043A. \u041E\u043D\u043E \u0443\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u0448\u0430\u043D\u0441!nasd&e\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!nasd&e\u0440\u0430\u0437\u0440\u0443\u0448\u0430\u0442\u044C \u043F\u043E\u0434\u0445\u043E\u0434\u044F\u0449\u0438\u0435 \u0431\u043B\u043E\u043A\u0438 \u0441 \u043E\u0434\u043D\u043E\u0433\u043E \u0443\u0434\u0430\u0440\u0430. -Guides.Excavation.Section.4=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u0410\u0440\u0445\u0435\u043E\u043B\u043E\u0433\u0438\u044F?!nasd&e\u0412\u0441\u0435 \u0441\u043E\u043A\u0440\u043E\u0432\u0438\u0449\u0430 \u043D\u0430\u0432\u044B\u043A\u0430 \u0420\u0430\u0441\u043A\u043E\u043F\u043E\u043A \u0438\u043C\u0435\u044E\u0442 \u0441\u0432\u043E\u0439!nasd&e\u0442\u0440\u0435\u0431\u0443\u0435\u043C\u044B\u0439 \u0443\u0440\u043E\u0432\u0435\u043D\u044C \u043D\u0430\u0432\u044B\u043A\u0430, \u0442\u0430\u043A \u0447\u0442\u043E \u0441\u043B\u043E\u0436\u043D\u043E \u0441\u043A\u0430\u0437\u0430\u0442\u044C,!nasd&e\u043D\u0430\u0441\u043A\u043E\u043B\u044C\u043A\u043E \u0441\u0438\u043B\u044C\u043D\u043E \u0432\u0430\u043C \u043F\u043E\u043C\u043E\u0436\u0435\u0442 \u044D\u0442\u043E\u0442 \u043D\u0430\u0432\u044B\u043A.!nasd&e\u041F\u0440\u043E\u0441\u0442\u043E \u043F\u043E\u043C\u043D\u0438\u0442\u0435, \u0447\u0442\u043E \u0447\u0435\u043C \u0432\u044B\u0448\u0435 \u0432\u0430\u0448 \u043D\u0430\u0432\u044B\u043A \u0420\u0430\u0441\u043A\u043E\u043F\u043E\u043A,!nasd&e\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.!nasd&e\u0422\u0430\u043A\u0436\u0435 \u043D\u0435 \u0437\u0430\u0431\u044B\u0432\u0430\u0439\u0442\u0435, \u0447\u0442\u043E \u0434\u043B\u044F \u043A\u0430\u0436\u0434\u043E\u0433\u043E \u0441\u043E\u0432\u043C\u0435\u0441\u0442\u0438\u043C\u043E\u0433\u043E!nasd&e\u0441 \u0420\u0430\u0441\u043A\u043E\u043F\u043A\u0430\u043C\u0438 \u0431\u043B\u043E\u043A\u0430 \u0438\u043C\u0435\u044E\u0442\u0441\u044F \u0441\u0432\u043E\u0438 \u0443\u043D\u0438\u043A\u0430\u043B\u044C\u043D\u044B\u0435 \u0441\u043E\u043A\u0440\u043E\u0432\u0438\u0449\u0430.!nasd&e\u0414\u0440\u0443\u0433\u0438\u043C\u0438 \u0441\u043B\u043E\u0432\u0430\u043C\u0438, \u0432 \u0437\u0435\u043C\u043B\u0435 \u0432\u044B \u043D\u0430\u0439\u0434\u0435\u0442\u0435 \u0434\u0440\u0443\u0433\u0438\u0435 \u0441\u043E\u043A\u0440\u043E\u0432\u0438\u0449\u0430,!nasd&e\u043D\u0435\u0436\u0435\u043B\u0438, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, \u0432 \u0433\u0440\u0430\u0432\u0438\u0438. -Guides.Excavation.Section.5=&3\u041F\u0440\u0438\u043C\u0435\u0447\u0430\u043D\u0438\u044F \u043E \u0420\u0430\u0441\u043A\u043E\u043F\u043A\u0430\u0445:!nasd&e\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.!nasd&e\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. +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\u041E \u043D\u0430\u0432\u044B\u043A\u0435 \u0420\u044B\u0431\u043E\u043B\u043E\u0432\u0441\u0442\u0432\u043E:!nasd&e\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!!nasd&e\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!!nasd!nasd&3\u041F\u041E\u041B\u0423\u0427\u0415\u041D\u0418\u0415 \u041E\u041F\u042B\u0422\u0410:!nasd&e\u041B\u043E\u0432\u0438\u0442\u0435 \u0440\u044B\u0431\u0443. -Guides.Fishing.Section.1=&3\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 \u0441\u043E\u043A\u0440\u043E\u0432\u0438\u0449\u0430\u043C\u0438?!nasd&e\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!nasd&e\u0432\u0440\u0435\u043C\u044F \u0440\u044B\u0431\u0430\u043B\u043A\u0438, \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.!nasd&e\u0412\u0441\u0435 \u0441\u043E\u043A\u0440\u043E\u0432\u0438\u0449\u0430 \u0420\u044B\u0431\u043E\u043B\u043E\u0432\u0441\u0442\u0432\u0430 \u0438\u043C\u0435\u044E\u0442 \u0448\u0430\u043D\u0441!nasd&e\u043F\u043E\u0439\u043C\u0430\u0442\u044C\u0441\u044F \u043D\u0430 \u043B\u044E\u0431\u043E\u043C \u0443\u0440\u043E\u0432\u043D\u0435. \u0428\u0430\u043D\u0441 \u0432\u044B\u043F\u0430\u0434\u0435\u043D\u0438\u044F!nasd&e\u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043E\u0442 \u0440\u0435\u0434\u043A\u043E\u0441\u0442\u0438 \u0441\u043E\u043A\u0440\u043E\u0432\u0438\u0449\u0430.!nasd&e\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,!nasd&e\u0442\u0435\u043C \u0431\u043E\u043B\u044C\u0448\u0435 \u0448\u0430\u043D\u0441 \u043D\u0430\u0439\u0442\u0438 \u0445\u043E\u0440\u043E\u0448\u0438\u0435 \u0441\u043E\u043A\u0440\u043E\u0432\u0438\u0449\u0430. -Guides.Fishing.Section.2=&3\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 \u0440\u044B\u0431\u0430\u043B\u043A\u0430?!nasd&e\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!nasd&e\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!nasd&e\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=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u041C\u0430\u0441\u0442\u0435\u0440-\u0440\u044B\u0431\u043E\u043B\u043E\u0432?!nasd&&e\u042D\u0442\u043E\u0442 \u043F\u0430\u0441\u0441\u0438\u0432\u043D\u044B\u0439 \u043D\u0430\u0432\u044B\u043A \u0443\u0432\u0435\u043B\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0448\u0430\u043D\u0441 \u0443\u043B\u043E\u0432\u0430 \u0432\u043E \u0432\u0440\u0435\u043C\u044F \u0440\u044B\u0431\u0430\u043B\u043A\u0438.!nasd&e\u041A\u043E\u0433\u0434\u0430 \u0432\u044B \u0440\u0430\u0437\u0431\u043B\u043E\u043A\u0438\u0440\u0443\u0435\u0442\u0435 \u044D\u0442\u043E \u0443\u043C\u0435\u043D\u0438\u0435, \u0440\u044B\u0431\u0430\u043B\u043A\u0430 \u0432 \u043B\u043E\u0434\u043A\u0435!nasd&e\u0443\u0432\u0435\u043B\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0448\u0430\u043D\u0441\u044B \u043F\u043E\u0439\u043C\u0430\u0442\u044C \u0440\u044B\u0431\u0443. -Guides.Fishing.Section.4=&3\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?!nasd&e\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\u044B\u0442\u0440\u044F\u0445\u0438\u0432\u0430\u0442\u044C \u043F\u0440\u0435\u0434\u043C\u0435\u0442\u044B!nasd&e\u0438\u0437 \u043C\u043E\u0431\u043E\u0432, \u0446\u0435\u043F\u043B\u044F\u044F \u0438\u0445 \u0443\u0434\u043E\u0447\u043A\u043E\u0439.!nasd&e\u042D\u0442\u043E \u0431\u0443\u0434\u0443\u0442 \u043F\u0440\u0435\u0434\u043C\u0435\u0442\u044B, \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u0432\u044B\u043F\u0430\u0434\u0430\u044E\u0442 \u0438\u0437 \u043D\u0438\u0445 \u043F\u0440\u0438 \u0441\u043C\u0435\u0440\u0442\u0438.!nasd&e\u0422\u0430\u043A\u0436\u0435 \u0435\u0441\u0442\u044C \u0448\u0430\u043D\u0441 \u043F\u043E\u043B\u0443\u0447\u0438\u0442\u044C \u0447\u0435\u0440\u0435\u043F\u0430 \u043C\u043E\u0431\u043E\u0432, \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u043E\u0431\u044B\u0447\u043D\u043E!nasd&e\u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B \u0432 \u0440\u0435\u0436\u0438\u043C\u0435 \u0432\u044B\u0436\u0438\u0432\u0430\u043D\u0438\u044F. -Guides.Fishing.Section.5=&3\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 \u0434\u0438\u0435\u0442\u0430?!nasd&e\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!nasd&e\u043F\u0440\u0438 \u043F\u043E\u0435\u0434\u0430\u043D\u0438\u0438 \u0440\u044B\u0431\u044B. -Guides.Fishing.Section.6=&3\u041F\u0440\u0438\u043C\u0435\u0447\u0430\u043D\u0438\u044F \u043E \u0420\u044B\u0431\u043E\u043B\u043E\u0432\u0441\u0442\u0432\u0435:!nasd&e\u041F\u0440\u0435\u0434\u043C\u0435\u0442\u044B \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\u0438\u0432\u0430\u0435\u043C\u044B,!nasd&e\u0442\u0430\u043A \u0447\u0442\u043E \u043D\u0430 \u0440\u0430\u0437\u043D\u044B\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u0445 \u0438 \u0434\u043E\u0431\u044B\u0447\u0430 \u043C\u043E\u0436\u0435\u0442 \u0431\u044B\u0442\u044C \u0440\u0430\u0437\u043D\u0430\u044F. +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\u041E \u043D\u0430\u0432\u044B\u043A\u0435 \u0422\u0440\u0430\u0432\u043D\u0438\u0447\u0435\u0441\u0442\u0432\u043E:!nasd&e\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.!nasd!nasd&3\u041F\u041E\u041B\u0423\u0427\u0415\u041D\u0418\u0415 \u041E\u041F\u042B\u0422\u0410:!nasd&e\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=&3\u041F\u043E\u0434\u0445\u043E\u0434\u044F\u0449\u0438\u0435 \u0440\u0430\u0441\u0442\u0435\u043D\u0438\u044F:!nasd&e\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, !nasd&e\u0422\u044B\u043A\u0432\u044B, \u0421\u0430\u0445\u0430\u0440\u043D\u044B\u0439 \u0442\u0440\u043E\u0441\u0442\u043D\u0438\u043A, \u041A\u0430\u043A\u0430\u043E-\u0431\u043E\u0431\u044B, \u0426\u0432\u0435\u0442\u044B, \u041A\u0430\u043A\u0442\u0443\u0441\u044B,!nasd&e\u0413\u0440\u0438\u0431\u044B, \u041D\u0435\u0437\u0435\u0440\u0441\u043A\u0438\u0439 \u043D\u0430\u0440\u043E\u0441\u0442, \u041A\u0443\u0432\u0448\u0438\u043D\u043A\u0438, \u041B\u0438\u0430\u043D\u044B. -Guides.Herbalism.Section.2=&3\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?!nasd&e\u041E\u0437\u0435\u043B\u0435\u043D\u0435\u043D\u0438\u0435 - \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u0435 \u0443\u043C\u0435\u043D\u0438\u0435, \u043A\u043E\u0442\u043E\u0440\u043E\u0435!nasd&e\u0430\u043A\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u0442\u0441\u044F \u043D\u0430\u0436\u0430\u0442\u0438\u0435\u043C \u041F\u041A\u041C \u0441 \u043C\u043E\u0442\u044B\u0433\u043E\u0439 \u0432 \u0440\u0443\u043A\u0435.!nasd&e\u041E\u0437\u0435\u043B\u0435\u043D\u0435\u043D\u0438\u0435 \u0434\u0430\u0435\u0442 \u0448\u0430\u043D\u0441 3x \u0434\u043E\u0431\u044B\u0447\u0438 \u043F\u0440\u0438 \u0441\u0431\u043E\u0440\u0435!nasd&e\u0440\u0430\u0441\u0442\u0435\u043D\u0438\u0439. \u0422\u0430\u043A\u0436\u0435 \u043E\u043D\u043E \u0434\u0430\u0435\u0442 \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E\u0441\u0442\u044C !nasd&e\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 !nasd&e\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. -Guides.Herbalism.Section.3=&3\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 \u043F\u0440\u0438\u043A\u043E\u0441\u043D\u043E\u0432\u0435\u043D\u0438\u0435 (\u043D\u0430 \u0443\u0440\u043E\u0436\u0430\u0439)?!nasd&e\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!nasd&e\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. !nasd&e\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=&3\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 \u043F\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)?!nasd&e\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!nasd&e"\u0436\u0438\u0432\u044B\u0435" \u0432\u0430\u0440\u0438\u0430\u043D\u0442\u044B. \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!nasd&e\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\u0435\u0447\u043A\u043E. -Guides.Herbalism.Section.5=&3\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 \u0434\u0438\u0435\u0442\u0430?!nasd&e\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!nasd&e\u043F\u0440\u0438 \u043F\u043E\u0435\u0434\u0430\u043D\u0438\u0438 \u0445\u043B\u0435\u0431\u0430, \u043F\u0435\u0447\u0435\u043D\u044C\u044F, \u0430\u0440\u0431\u0443\u0437\u0430, \u0433\u0440\u0438\u0431\u043D\u043E\u0433\u043E \u0441\u0443\u043F\u0430,!nasd&e\u043C\u043E\u0440\u043A\u043E\u0432\u0438 \u0438 \u043A\u0430\u0440\u0442\u043E\u0448\u043A\u0438. -Guides.Herbalism.Section.6=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u0425\u0430\u0439\u043B\u0438\u0439\u0441\u043A\u0430\u044F \u0443\u0434\u0430\u0447\u0430?!nasd&e\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!nasd&e\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=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u0414\u0432\u043E\u0439\u043D\u0430\u044F \u0434\u043E\u0431\u044B\u0447\u0430?!nasd&e\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\u0435 \u0443\u0440\u043E\u0436\u0430\u044F \u043F\u0440\u0438!nasd&e\u0432\u043E \u0432\u0440\u0435\u043C\u044F \u0435\u0433\u043E \u0441\u0431\u043E\u0440\u0430. +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\u041E \u043D\u0430\u0432\u044B\u043A\u0435 \u0428\u0430\u0445\u0442\u0435\u0440\u0441\u0442\u0432\u043E:!nasd&e\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,!nasd&e\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.!nasd!nasd&3\u041F\u041E\u041B\u0423\u0427\u0415\u041D\u0418\u0415 \u041E\u041F\u042B\u0422\u0410:!nasd&e\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.!nasd&e\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=&3\u041F\u043E\u0434\u0445\u043E\u0434\u044F\u0449\u0438\u0435 \u0431\u043B\u043E\u043A\u0438:!nasd&e\u041A\u0430\u043C\u0435\u043D\u044C, \u041A\u0430\u043C\u0435\u043D\u043D\u044B\u0439 \u0443\u0433\u043E\u043B\u044C, \u0416\u0435\u043B\u0435\u0437\u043D\u0430\u044F \u0440\u0443\u0434\u0430, \u0417\u043E\u043B\u043E\u0442\u0430\u044F \u0440\u0443\u0434\u0430, \u0410\u043B\u043C\u0430\u0437\u043D\u0430\u044F \u0440\u0443\u0434\u0430,!nasd&e\u0420\u0435\u0434\u0441\u0442\u043E\u0443\u043D\u043E\u0432\u0430\u044F \u0440\u0443\u0434\u0430, \u041B\u0430\u0437\u0443\u0440\u0438\u0442\u043E\u0432\u0430\u044F \u0440\u0443\u0434\u0430, \u041E\u0431\u0441\u0438\u0434\u0438\u0430\u043D, \u0417\u0430\u043C\u0448\u0435\u043B\u044B\u0439 \u0431\u0443\u043B\u044B\u0436\u043D\u0438\u043A,!nasd&e\u042D\u043D\u0434\u0435\u0440\u043D\u044F\u043A, \u0421\u0432\u0435\u0442\u044F\u0449\u0438\u0439\u0441\u044F \u043A\u0430\u043C\u0435\u043D\u044C, \u041D\u0435\u0437\u0435\u0440\u0430\u043A. -Guides.Mining.Section.2=&3\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\u043A\u0440\u0443\u0448\u0438\u0442\u0435\u043B\u044C:!nasd&e\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\u043E\u0434\u0433\u043E\u0442\u043E\u0432\u0438\u0442\u044C \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442.!nasd&e\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 \u043D\u0430\u0447\u0430\u043B\u0430 \u0434\u043E\u0431\u044B\u0447\u0438!nasd&e\u043F\u043E\u0434\u0445\u043E\u0434\u044F\u0449\u0438\u0445 \u0431\u043B\u043E\u043A\u043E\u0432, \u0447\u0442\u043E \u0430\u043A\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u0421\u0443\u043F\u0435\u0440\u043A\u0440\u0443\u0448\u0438\u0442\u0435\u043B\u044C. -Guides.Mining.Section.3=&3\u0427\u0442\u043E \u0442\u0430\u043A\u043E\u0435 \u0421\u0443\u043F\u0435\u0440\u043A\u0440\u0443\u0448\u0438\u0442\u0435\u043B\u044C?!nasd&e\u0421\u0443\u043F\u0435\u0440\u043A\u0440\u0443\u0448\u0438\u0442\u0435\u043B\u044C - \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.!nasd&e\u041E\u043D\u043E \u0443\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u0448\u0430\u043D\u0441 \u043F\u043E\u043B\u0443\u0447\u0438\u0442\u044C \u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0435 \u043F\u0440\u0435\u0434\u043C\u0435\u0442\u044B \u0438!nasd&e\u0440\u0430\u0437\u0440\u0443\u0448\u0430\u0435\u0442 \u043F\u043E\u0434\u0445\u043E\u0434\u044F\u0449\u0438\u0435 \u0431\u043B\u043E\u043A\u0438 \u0441 \u043E\u0434\u043D\u043E\u0433\u043E \u0443\u0434\u0430\u0440\u0430. -Guides.Mining.Section.4=&3\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 \u0434\u043E\u0431\u044B\u0447\u0430:!nasd&e\u0421 \u043A\u0438\u0440\u043A\u043E\u0439 \u0432 \u0440\u0443\u043A\u0435,!nasd&e\u043F\u0440\u0438\u0441\u044F\u0434\u044C\u0442\u0435 \u0438 \u043D\u0430\u0436\u043C\u0438\u0442\u0435 \u041F\u041A\u041C \u043F\u043E \u0434\u0438\u043D\u0430\u043C\u0438\u0442\u0443 \u0441 \u0440\u0430\u0441\u0441\u0442\u043E\u044F\u043D\u0438\u044F. \u042D\u0442\u043E !nasd&e\u043C\u0433\u043D\u043E\u0432\u0435\u043D\u043D\u043E \u043F\u0440\u0438\u0432\u0435\u0434\u0435\u0442 \u043A \u043F\u043E\u0434\u0440\u044B\u0432\u0443 \u0434\u0438\u043D\u0430\u043C\u0438\u0442\u0430. -Guides.Mining.Section.5=&3\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 \u0434\u043E\u0431\u044B\u0447\u0430?!nasd&e\u041F\u043E\u0434\u0440\u044B\u0432\u043D\u0430\u044F \u0434\u043E\u0431\u044B\u0447\u0430 - \u0443\u043C\u0435\u043D\u0438\u0435 \u0441 \u043E\u0442\u043A\u0430\u0442\u043E\u043C, \u0441\u0432\u044F\u0437\u0430\u043D\u043D\u043E\u0435 \u0441 \u043D\u0430\u0432\u044B\u043A\u043E\u043C!nasd&e\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 \u0434\u043E\u0431\u044B\u0447\u0435 \u0441 \u0434\u0438\u043D\u0430\u043C\u0438\u0442\u043E\u043C \u0438 \u043F\u043E\u0437\u0432\u043E\u043B\u044F\u0435\u0442!nasd&e\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\u043E\u0431\u0435\u043D\u043D\u043E\u0441\u0442\u0438 \u041F\u043E\u0434\u0440\u044B\u0432\u043D\u043E\u0439 \u0434\u043E\u0431\u044B\u0447\u0438. !nasd&e\u041F\u0435\u0440\u0432\u0430\u044F - \u0443\u043C\u0435\u043D\u0438\u0435 \u0411\u043E\u043B\u044C\u0448\u0438\u0435 \u0431\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!nasd&e\u0432\u0437\u0440\u044B\u0432\u0430 \u0434\u0438\u043D\u0430\u043C\u0438\u0442\u0430. \u0412\u0442\u043E\u0440\u0430\u044F - \u0443\u043C\u0435\u043D\u0438\u0435 \u042D\u043A\u0441\u043F\u0435\u0440\u0442\u0438\u0437\u0430 \u043F\u043E\u0434\u0440\u044B\u0432\u043E\u0432, \u043A\u043E\u0442\u043E\u0440\u043E\u0435 \u0443\u043C\u0435\u043D\u044C\u0448\u0430\u0435\u0442 !nasd&e\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!nasd&e\u0434\u043E\u0431\u044B\u0447\u0438 \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\u043E\u0431\u044B\u0447\u0438 \u043F\u043E\u043B\u0435\u0437\u043D\u044B\u0445 \u0440\u0443\u0434. +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\u041E \u043D\u0430\u0432\u044B\u043A\u0435 \u0420\u0435\u043C\u043E\u043D\u0442:!nasd&e\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!nasd&e\u0431\u0440\u043E\u043D\u0438 \u0438 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u043E\u0432.!nasd!nasd&3\u041F\u043E\u043B\u0443\u0447\u0435\u043D\u0438\u0435 \u043E\u043F\u044B\u0442\u0430:!nasd&e\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 \u043D\u0430\u043A\u043E\u0432\u0430\u043B\u044C\u043D\u044E mcMMO. !nasd&e\u041D\u0430\u043A\u043E\u0432\u0430\u043B\u044C\u043D\u0435\u0439 \u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u043F\u043E\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u043D\u044B\u0439 \u0436\u0435\u043B\u0435\u0437\u043D\u044B\u0439 \u0431\u043B\u043E\u043A, \u0438 \u0435\u0451!nasd&e\u043D\u0435 \u0441\u043B\u0435\u0434\u0443\u0435\u0442 \u043F\u0443\u0442\u0430\u0442\u044C \u0441 \u043E\u0431\u044B\u0447\u043D\u043E\u0439 \u043D\u0430\u043A\u043E\u0432\u0430\u043B\u044C\u043D\u0435\u0439. -Guides.Repair.Section.1=&3\u041A\u0430\u043A \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u043D\u0430\u0432\u044B\u043A \u0420\u0435\u043C\u043E\u043D\u0442?!nasd&e\u0420\u0430\u0437\u043C\u0435\u0441\u0442\u0438\u0442\u0435 \u043D\u0430\u043A\u043E\u0432\u0430\u043B\u044C\u043D\u044E mcMMO \u0438 \u043A\u043B\u0438\u043A\u043D\u0438\u0442\u0435 \u043F\u043E \u043D\u0435\u0439 \u041F\u041A\u041C \u0434\u043B\u044F!nasd&e\u043F\u043E\u0447\u0438\u043D\u043A\u0438 \u043F\u0440\u0435\u0434\u043C\u0435\u0442\u0430 \u0432 \u0440\u0443\u043A\u0435. \u0420\u0430\u0441\u0445\u043E\u0434\u0443\u0435\u0442 1 \u0441\u044B\u0440\u044C\u0435 \u0437\u0430 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0435. -Guides.Repair.Section.2=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u041C\u0430\u0441\u0442\u0435\u0440\u0441\u0442\u0432\u043E \u0440\u0435\u043C\u043E\u043D\u0442\u0430?!nasd&e\u0423\u043C\u0435\u043D\u0438\u0435 \u041C\u0430\u0441\u0442\u0435\u0440\u0441\u0442\u0432\u043E \u0440\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.!nasd&e\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=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u0421\u0443\u043F\u0435\u0440\u0440\u0435\u043C\u043E\u043D\u0442?!nasd&e\u0421\u0443\u043F\u0435\u0440\u0440\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!nasd&e\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!nasd&e\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=&3\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 \u043A\u043E\u0432\u043A\u0430?!nasd&e\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!nasd&e\u0441 \u043E\u043F\u0440\u0435\u0434\u0435\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. !nasd&e\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,!nasd&e\u0441\u043D\u0438\u0437\u0438\u0442\u044C\u0441\u044F, \u0438\u043B\u0438 \u0432\u043E\u0432\u0441\u0435 \u0438\u0441\u0447\u0435\u0437\u043D\u0443\u0442\u044C. +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\u041E \u0420\u0430\u0437\u0431\u043E\u0440\u043A\u0435:!nasd&e\u0420\u0430\u0437\u0431\u043E\u0440\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!nasd&e\u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u043E\u0432.!nasd!nasd&3\u041F\u041E\u041B\u0423\u0427\u0415\u041D\u0418\u0415 \u041E\u041F\u042B\u0422\u0410:!nasd&e\u0420\u0430\u0437\u0431\u043E\u0440\u043A\u0430 \u044D\u0442\u043E \u0434\u043E\u0447\u0435\u0440\u043D\u0438\u0439 \u043D\u0430\u0432\u044B\u043A \u041F\u043E\u0447\u0438\u043D\u043A\u0438 \u0438 \u0420\u044B\u0431\u0430\u043B\u043A\u0438. \u0412\u0430\u0448 \u0443\u0440\u043E\u0432\u0435\u043D\u044C!nasd&e\u0440\u0430\u0437\u0431\u043E\u0440\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=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0420\u0430\u0437\u0431\u043E\u0440\u043A\u0430?!nasd&e\u0420\u0430\u0437\u043C\u0435\u0441\u0442\u0438\u0442\u0435 \u0420\u0430\u0437\u0431\u043E\u0440\u043E\u0447\u043D\u0443\u044E \u043D\u0430\u043A\u043E\u0432\u0430\u043B\u044C\u043D\u044E mcMMO \u0438 \u043A\u043B\u0438\u043A\u043D\u0438\u0442\u0435 \u043F\u043E !nasd&e\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. \u042D\u0442\u043E \u0443\u043D\u0438\u0447\u0442\u043E\u0436\u0438\u0442!nasd&e\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\u044B\u0435 \u043D\u0430 \u043D\u0435\u0433\u043E \u043C\u0430\u0442\u0435\u0440\u0438\u0430\u043B\u044B.!nasd!nasd&e\u041D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, \u0440\u0430\u0437\u0431\u043E\u0440\u043A\u0430 \u0436\u0435\u043B\u0435\u0437\u043D\u043E\u0439 \u043A\u0438\u0440\u043A\u0438 \u0432\u0435\u0440\u043D\u0435\u0442 \u0432\u0430\u043C \u0436\u0435\u043B\u0435\u0437\u043D\u044B\u0435 \u0441\u043B\u0438\u0442\u043A\u0438. -Guides.Salvage.Section.2=&3\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 \u0440\u0430\u0437\u0431\u043E\u0440\u043A\u0430?!nasd&e\u042D\u0442\u043E \u0443\u043C\u0435\u043D\u0438\u0435 \u043F\u043E\u0437\u0432\u043E\u043B\u044F\u0435\u0442 \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.!nasd&e\u041A\u0430\u0447\u0435\u0441\u0442\u0432\u043E \u0440\u0430\u0437\u0431\u043E\u0440\u043A\u0438 \u043F\u043E\u0432\u044B\u0448\u0430\u0435\u0442\u0441\u044F \u0432\u043C\u0435\u0441\u0442\u0435 \u0441 \u0443\u0440\u043E\u0432\u043D\u0435\u043C. \u0427\u0435\u043C \u043E\u043D\u043E \u0431\u043E\u043B\u044C\u0448\u0435,!nasd&e\u0442\u0435\u043C \u0431\u043E\u043B\u044C\u0448\u0435 \u043C\u0430\u0442\u0435\u0440\u0438\u0430\u043B\u043E\u0432 \u0432\u044B \u0441\u043C\u043E\u0436\u0435\u0442\u0435 \u043F\u043E\u043B\u0443\u0447\u0438\u0442\u044C \u043E\u0431\u0440\u0430\u0442\u043D\u043E.!nasd&e\u0421 \u0423\u043B\u0443\u0447\u0448\u0435\u043D\u043D\u043E\u0439 \u0440\u0430\u0437\u0431\u043E\u0440\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,!nasd&e\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 \u043F\u043E\u0432\u0440\u0435\u0436\u0434\u0435\u043D. \u0412\u0430\u043C \u043D\u0435 \u043D\u0443\u0436\u043D\u043E \u0432\u043E\u043B\u043D\u043E\u0432\u0430\u0442\u044C\u0441\u044F!nasd&e\u043E\u0431 \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=&3\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:!nasd&e\u041F\u0440\u0435\u0434\u043F\u043E\u043B\u043E\u0436\u0438\u043C \u043C\u044B \u0440\u0430\u0437\u0431\u0438\u0440\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%.!nasd&e\u042D\u0442\u043E \u0437\u043D\u0430\u0447\u0438\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!nasd&e\u043F\u043E\u043B\u0443\u0447\u0438\u0442\u044C - \u0432\u0441\u0435\u0433\u043E 2 (\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!nasd&e33,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\u0435 \u043A\u0430\u0447\u0435\u0441\u0442\u0432\u043E!nasd&e\u0440\u0430\u0437\u0431\u043E\u0440\u043A\u0438 \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.!nasd&e\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 "\u043F\u043E\u043B\u043D\u0443\u044E \u0441\u0442\u043E\u0438\u043C\u043E\u0441\u0442\u044C",!nasd&e\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=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u041C\u0430\u0433\u0438\u0447\u0435\u0441\u043A\u0430\u044F \u0440\u0430\u0437\u0431\u043E\u0440\u043A\u0430?!nasd&e\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!nasd&e\u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u0442\u0435 \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!nasd&e\u0432\u044B \u043C\u043E\u0436\u0435\u0442\u0435 \u043F\u043E\u043B\u0443\u0447\u0438\u0442\u044C \u043F\u043E\u043B\u043D\u0443\u044E \u0432\u0441\u0435 \u0438\u043B\u0438 \u043B\u0438\u0448\u044C \u0447\u0430\u0441\u0442\u044C \u0437\u0430\u0447\u0430\u0440\u043E\u0432\u0430\u043D\u0438\u0439.!nasd!nasd&e\u041A\u043E\u0433\u0434\u0430 \u0432\u044B \u0438\u0437\u0432\u043B\u0435\u043A\u0430\u0435\u0442\u0435 \u0447\u0430\u0441\u0442\u044C \u0437\u0430\u0447\u0430\u0440\u043E\u0432\u0430\u043D\u0438\u0439, \u0442\u043E \u0437\u0430\u0447\u0430\u0440\u043E\u0432\u0430\u043D\u0438\u044F!nasd&e\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\u044F,!nasd&e\u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u0431\u044B\u043B\u0438 \u043D\u0430 \u043F\u0440\u0435\u0434\u043C\u0435\u0442\u0435. +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=\u0421\u043A\u043E\u0440\u043E... +Guides.Smelting.Section.0=Скоро... ##Swords -Guides.Swords.Section.0=&3\u041E \u043D\u0430\u0432\u044B\u043A\u0435 \u041C\u0435\u0447\u0438:!nasd&e\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.!nasd!nasd&3\u041F\u041E\u041B\u0423\u0427\u0415\u041D\u0418\u0415 \u041E\u041F\u042B\u0422\u0410:!nasd&e\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!nasd&e\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=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u0420\u0443\u0431\u044F\u0449\u0438\u0439 \u0443\u0434\u0430\u0440?!nasd&e\u0420\u0443\u0431\u044F\u0449\u0438\u0439 \u0443\u0434\u0430\u0440 - \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!nasd&e\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!nasd&e\u0443\u0434\u0430\u0440 \u043F\u043E \u043E\u0431\u043B\u0430\u0441\u0442\u0438, \u0447\u0442\u043E \u043D\u0430\u043D\u043E\u0441\u044F\u0449\u0438\u0439 \u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u043E 25% \u0443\u0440\u043E\u043D\u0430!nasd&e\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=&3\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?!nasd&e\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!nasd&e\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=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u0420\u0430\u0437\u0440\u044B\u0432?!nasd&e\u0420\u044B\u0437\u0440\u044B\u0432 \u043D\u0430\u043D\u043E\u0441\u0438\u0442 \u043F\u0440\u043E\u0442\u0438\u0432\u043D\u0438\u043A\u0430\u043C \u0443\u0440\u043E\u043D \u043A\u0430\u0436\u0434\u044B\u0435 2 \u0441\u0435\u043A\u0443\u043D\u0434\u044B.!nasd&e\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!nasd&e\u0438\u043B\u0438 \u043D\u0435 \u043D\u0430\u0441\u0442\u0443\u043F\u0438\u0442 \u0441\u043C\u0435\u0440\u0442\u044C.!nasd&e\u041F\u0440\u043E\u0434\u043E\u043B\u0436\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u044C \u044D\u0444\u0444\u0435\u043A\u0442\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043E\u0442 \u0443\u0440\u043E\u0432\u043D\u044F \u043D\u0430\u0432\u044B\u043A\u0430 \u041C\u0435\u0447\u0435\u0439. +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\u041E \u043D\u0430\u0432\u044B\u043A\u0435 \u0423\u043A\u0440\u043E\u0449\u0435\u043D\u0438\u0435:!nasd&e\u0423\u043A\u0440\u043E\u0449\u0435\u043D\u0438\u0435 \u0434\u0430\u0435\u0442 \u0440\u0430\u0437\u043B\u0438\u0447\u043D\u044B\u0435 \u0431\u043E\u043D\u0443\u0441\u044B \u0432 \u0431\u0438\u0442\u0432\u0430\u0445 \u0432\u043C\u0435\u0441\u0442\u0435!nasd&e\u0441 \u043F\u0440\u0438\u0440\u0443\u0447\u0435\u043D\u043D\u044B\u043C\u0438 \u0432\u043E\u043B\u043A\u0430\u043C\u0438.!nasd!nasd&3\u041F\u041E\u041B\u0423\u0427\u0415\u041D\u0418\u0415 \u041E\u041F\u042B\u0422\u0410:!nasd&e\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!nasd&e\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=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u0417\u043E\u0432 \u043F\u0440\u0438\u0440\u043E\u0434\u044B?!nasd&e\u0417\u043E\u0432 \u043F\u0440\u0438\u0440\u043E\u0434\u044B - \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!nasd&e\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!nasd&e\u0441\u0434\u0435\u043B\u0430\u0442\u044C \u043F\u0440\u0438\u0441\u0435\u0432 \u0438 \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=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u041F\u043E\u0437\u043D\u0430\u043D\u0438\u0435 \u0437\u0432\u0435\u0440\u0435\u0439?!nasd&e\u041F\u043E\u0437\u043D\u0430\u043D\u0438\u0435 \u0437\u0432\u0435\u0440\u0435\u0439 \u043F\u043E\u0437\u0432\u043E\u043B\u044F\u0435\u0442 \u043F\u0440\u043E\u0432\u0435\u0440\u044F\u0442\u044C \u043F\u0438\u0442\u043E\u043C\u0446\u0435\u0432!nasd&e\u0438 \u043F\u043E\u043B\u0443\u0447\u0430\u0442\u044C \u0441\u0442\u0430\u0442\u044B \u043E \u043D\u0438\u0445. \u041A\u043B\u0438\u043A\u043D\u0438\u0442\u0435 \u041B\u041A\u041C \u043A\u043E\u0441\u0442\u044C\u044E \u043F\u043E \u0432\u043E\u043B\u043A\u0443 \u0438\u043B\u0438 !nasd&e\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 \u041F\u043E\u0437\u043D\u0430\u043D\u0438\u0435 \u0437\u0432\u0435\u0440\u0435\u0439. -Guides.Taming.Section.3=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u0423\u043A\u0443\u0441?!nasd&e\u0423\u043A\u0443\u0441 - \u043F\u0430\u0441\u0441\u0438\u0432\u043D\u043E\u0435 \u0443\u043C\u0435\u043D\u0438\u0435, \u0434\u0430\u044E\u0449\u0435\u0435 \u0448\u0430\u043D\u0441 \u0442\u043E\u0433\u043E, \u0447\u0442\u043E!nasd&e\u0430\u0442\u0430\u043A\u0430 \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=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u041E\u0441\u0442\u0440\u044B\u0435 \u043A\u043E\u0433\u0442\u0438?!nasd&e\u041E\u0441\u0442\u0440\u044B\u0435 \u043A\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 \u0431\u043E\u043D\u0443\u0441\u043D\u044B\u0439!nasd&e\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=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u0417\u043D\u0430\u043D\u0438\u0435 \u0441\u0440\u0435\u0434\u044B?!nasd&e\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\u044E\u0449\u0435\u0435 \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!nasd&e\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 \u043A\u0430\u043A\u0442\u0443\u0441 \u0438\u043B\u0438 \u043B\u0430\u0432\u0430. \u041E\u043D\u043E \u0442\u0430\u043A\u0436\u0435!nasd&e\u0434\u0430\u0435\u0442 \u0432\u0430\u0448\u0438\u043C \u0432\u043E\u043B\u043A\u0430\u043C \u0438\u043C\u043C\u0443\u043D\u0438\u0442\u0435\u0442 \u043A \u043F\u043E\u043B\u0443\u0447\u0435\u043D\u0438\u044E \u0443\u0440\u043E\u043D\u0430 \u043F\u0440\u0438 \u043F\u0430\u0434\u0435\u043D\u0438\u0438. -Guides.Taming.Section.6=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u0413\u0443\u0441\u0442\u043E\u0439 \u043C\u0435\u0445?!nasd&e\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\u044E\u0449\u0435\u0435 \u043F\u043E\u043B\u0443\u0447\u0430\u0435\u043C\u044B\u0439 \u0432\u0430\u0448\u0438\u043C\u0438!nasd&e\u0432\u043E\u043B\u043A\u0430\u043C\u0438 \u0443\u0440\u043E\u043D \u0438 \u043D\u0430\u0434\u0435\u043B\u044F\u044E\u0449\u0435\u0435 \u0438\u0445 \u043E\u0433\u043D\u0435\u0441\u0442\u043E\u0439\u043A\u043E\u0441\u0442\u044C\u044E. -Guides.Taming.Section.7=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u0423\u0434\u0430\u0440\u043E\u043F\u0440\u043E\u0447\u043D\u043E\u0441\u0442\u044C?!nasd&e\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\u044E\u0449\u0435\u0435 \u043F\u043E\u043B\u0443\u0447\u0430\u0435\u043C\u044B\u0439!nasd&e\u0432\u0430\u0448\u0438\u043C\u0438 \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=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u0411\u044B\u0441\u0442\u0440\u043E\u0435 \u043F\u0438\u0442\u0430\u043D\u0438\u0435?!nasd&e\u042D\u0442\u043E \u043F\u0430\u0441\u0441\u0438\u0432\u043D\u043E\u0435 \u0443\u043C\u0435\u043D\u0438\u0435, \u0434\u0430\u044E\u0449\u0435\u0435 \u0432\u0430\u0448\u0438\u043C \u0432\u043E\u043B\u043A\u0430\u043C \u0448\u0430\u043D\u0441!nasd&e\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. +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\u041E \u043D\u0430\u0432\u044B\u043A\u0435 \u0411\u0435\u0437\u043E\u0440\u0443\u0436\u043D\u044B\u0439:!nasd&e\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!nasd&e\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.!nasd!nasd&3\u041F\u041E\u041B\u0423\u0427\u0415\u041D\u0418\u0415 \u041E\u041F\u042B\u0422\u0410:!nasd&e\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!nasd&e\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=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u0411\u0435\u0440\u0441\u0435\u0440\u043A?!nasd&e\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.!nasd&e\u0412 \u0440\u0435\u0436\u0438\u043C\u0435 \u0431\u0435\u0440\u0441\u0435\u0440\u043A\u0430 \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!nasd&e\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 \u043D\u0435\u0442\u0432\u0435\u0440\u0434\u044B \u0431\u043B\u043E\u043A\u0438, \u0432\u0440\u043E\u0434\u0435 \u0437\u0435\u043C\u043B\u0438 \u0438 \u0434\u0435\u0440\u043D\u0430. -Guides.Unarmed.Section.2=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u0421\u0442\u0438\u043B\u044C \u0421\u0442\u0430\u043B\u044C\u043D\u043E\u0433\u043E \u043A\u0443\u043B\u0430\u043A\u0430?!nasd&e\u0421\u0442\u0438\u043B\u044C \u0421\u0442\u0430\u043B\u044C\u043D\u043E\u0433\u043E \u043A\u0443\u043B\u0430\u043A\u0430 \u0443\u0432\u0435\u043B\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0443\u0440\u043E\u043D, \u043D\u0430\u043D\u043E\u0441\u0438\u043C\u044B\u0439!nasd&e\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=&3\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 \u0441\u0442\u0440\u0435\u043B?!nasd&e\u041E\u0442\u0440\u0430\u0436\u0435\u043D\u0438\u0435 \u0441\u0442\u0440\u0435\u043B - \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!nasd&e\u043E\u0442\u0440\u0430\u0436\u0430\u0442\u044C \u0441\u0442\u0440\u0435\u043B\u044B, \u0432\u044B\u043F\u0443\u0449\u0435\u043D\u043D\u044B\u0435 \u0441\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.!nasd&e\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\u0438\u043D\u0435\u043D\u0438\u044F \u0432\u0430\u043C \u0432\u0440\u0435\u0434\u0430. -Guides.Unarmed.Section.4=&3\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 \u0445\u0432\u0430\u0442\u043A\u0430?!nasd&e\u0416\u0435\u043B\u0435\u0437\u043D\u0430\u044F \u0445\u0432\u0430\u0442\u043A\u0430 - \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!nasd&e\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=&3\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?!nasd&e\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\u044E\u0449\u0435\u0435 \u0440\u0430\u0437\u043E\u0440\u0443\u0436\u0430\u0442\u044C \u0434\u0440\u0443\u0433\u0438\u0445 \u0438\u0433\u0440\u043E\u043A\u043E\u0432,!nasd&e\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. +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\u041E \u043D\u0430\u0432\u044B\u043A\u0435 \u041B\u0435\u0441\u043E\u0440\u0443\u0431\u0441\u0442\u0432\u043E:!nasd&e\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.!nasd!nasd&3\u041F\u041E\u041B\u0423\u0427\u0415\u041D\u0418\u0415 \u041E\u041F\u042B\u0422\u0410:!nasd&e\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=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u0414\u0440\u043E\u0432\u043E\u0441\u0435\u043A?!nasd&e\u0414\u0440\u043E\u0432\u043E\u0441\u0435\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!nasd&e\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, !nasd&e\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, \u0430 \u0432\u0441\u0435 \u0431\u043B\u043E\u043A\u0438 \u0434\u0440\u0435\u0432\u0435\u0441\u0438\u043D\u044B!nasd&e\u0432\u044B\u043F\u0430\u0434\u0443\u0442 \u0437\u0430 \u0440\u0430\u0437. -Guides.Woodcutting.Section.2=&3\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 \u043B\u0438\u0441\u0442\u044C\u0435\u0432?!nasd&e\u0421\u0434\u0443\u0432\u0430\u0442\u0435\u043B\u044C \u043B\u0438\u0441\u0442\u044C\u0435\u0432 - \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!nasd&e\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. !nasd&e\u042D\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=&3\u041A\u0430\u043A \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0443\u043C\u0435\u043D\u0438\u0435 \u0414\u0432\u043E\u0439\u043D\u0430\u044F \u0434\u043E\u0431\u044B\u0447\u0430?!nasd&e\u042D\u0442\u043E \u043F\u0430\u0441\u0441\u0438\u0432\u043D\u043E\u0435 \u0443\u043C\u0435\u043D\u0438\u0435, \u0434\u0430\u044E\u0449\u0435\u0435 \u0448\u0430\u043D\u0441 \u0432\u044B\u043F\u0430\u0434\u0435\u043D\u0438\u044F!nasd&e\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. +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= &c\u0423 \u0432\u0430\u0441 \u043D\u0435\u0442 \u043F\u0440\u0430\u0432 \u043F\u0440\u043E\u0432\u0435\u0440\u044F\u0442\u044C \u0438\u0433\u0440\u043E\u043A\u043E\u0432 \u043D\u0435 \u0432 \u0441\u0435\u0442\u0438! -Inspect.OfflineStats=\u0421\u0442\u0430\u0442\u044B mcMMO \u0438\u0433\u0440\u043E\u043A\u0430 \u043D\u0435 \u0441\u0435\u0442\u0438 &e{0} -Inspect.Stats=&a\u0421\u0442\u0430\u0442\u044B mcMMO &e{0} -Inspect.TooFar=\u0412\u044B \u0441\u043B\u0438\u0448\u043A\u043E\u043C \u0434\u0430\u043B\u0435\u043A\u043E, \u0447\u0442\u043E\u0431\u044B \u043F\u0440\u043E\u0432\u0435\u0440\u044F\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=&c**\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** -Item.ChimaeraWing.Name=\u041A\u0440\u044B\u043B\u044C\u044F \u0425\u0438\u043C\u0435\u0440\u044B -Item.ChimaeraWing.Lore=&7\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 \u0435\u0449\u0451 &e{0}&c \u0448\u0442\u0443\u043A &6{1}&c! -Item.NotEnough=\u0412\u0430\u043C \u043D\u0443\u0436\u043D\u043E \u0435\u0449\u0451 &e{0}&c \u0448\u0442\u0443\u043A &6{1}&c! -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! &e({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. &e({0}s) -Item.FluxPickaxe.Name=\u0424\u043B\u044E\u0441\u043E\u0432\u0430\u044F \u043A\u0438\u0440\u043A\u0430 -Item.FluxPickaxe.Lore.1=&7\u0418\u043C\u0435\u0435\u0442 \u0448\u0430\u043D\u0441 \u043C\u0433\u043D\u043E\u0432\u0435\u043D\u043D\u043E \u043F\u0435\u0440\u0435\u043F\u043B\u0430\u0432\u0438\u0442\u044C \u0440\u0443\u0434\u0443. -Item.FluxPickaxe.Lore.2=&7\u041D\u0443\u0436\u0435\u043D \u0443\u0440\u043E\u0432\u0435\u043D\u044C \u041F\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=&7\u0422\u0435\u043B\u0435\u043F\u043E\u0440\u0442\u0430\u0446\u0438\u044F \u0447\u0435\u0440\u0435\u0437 &6({0}) &7\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=&4\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=&6(\u0414\u041E\u0427\u0415\u0420\u041D\u0418\u0419 \u041D\u0410\u0412\u042B\u041A) -Skills.Disarmed=&4\u0412\u044B \u043E\u0431\u0435\u0437\u043E\u0440\u0443\u0436\u0435\u043D\u044B! +Skills.Child=&6(ДОЧЕРНИЙ НАВЫК) +Skills.Disarmed=&4Вы обезоружены! Skills.Header=-----[] &a{0}&c []----- -Skills.NeedMore=&4\u0412\u0430\u043C \u043D\u0443\u0436\u043D\u043E \u0431\u043E\u043B\u044C\u0448\u0435 &7{0} -Skills.NeedMore.Extra=&4\u0412\u0430\u043C \u043D\u0443\u0436\u043D\u043E \u0431\u043E\u043B\u044C\u0448\u0435 &7{0}{1} -Skills.Parents= \u0420\u041E\u0414\u0418\u0422\u0415\u041B\u042C\u0421\u041A\u0418\u0419 -Skills.Stats={0}&a{1}&3 \u041E\u041F\u042B\u0422(&7{2}&3/&7{3}&3) +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=\u041C\u0430\u043A\u0441. -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. &e({0}\u0441) -Skills.TooTired.Named=&7(&6{0}&e {1}\u0441&7) -Skills.TooTired.Extra=&6{0} &e\u041E\u0442\u043A\u0430\u0442\u044B \u0441\u0443\u043F\u0435\u0440\u0443\u043C\u0435\u043D\u0438\u0439 - {1} -Skills.Cancelled=&7{0} &c\u043E\u0442\u043C\u0435\u043D\u0435\u043D! -Skills.ConfirmOrCancel=&a\u041D\u0430\u0436\u043C\u0438\u0442\u0435 \u041F\u041A\u041C \u0435\u0449\u0451 \u0440\u0430\u0437 \u0434\u043B\u044F \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043D\u0438\u044F &6{0}&a. \u041B\u041A\u041C \u0434\u043B\u044F \u043E\u0442\u043C\u0435\u043D\u044B. -Skills.AbilityGateRequirementFail=&7\u0412\u0430\u043C \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E \u0435\u0449\u0451 &e{0}&7 \u0443\u0440\u043E\u0432\u043D\u0435\u0439 &3{1}&7, \u0447\u0442\u043E\u0431\u044B \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u0434\u0430\u043D\u043D\u043E\u0435 \u0443\u043C\u0435\u043D\u0438\u0439. +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=&6-=\u0411\u041E\u0415\u0412\u042B\u0415 \u041D\u0410\u0412\u042B\u041A\u0418=- -Stats.Header.Gathering=&6-=\u041D\u0410\u0412\u042B\u041A\u0418 \u0421\u0411\u041E\u0420\u0410=- -Stats.Header.Misc=&6-=\u0420\u0410\u0417\u041D\u042B\u0415 \u041D\u0410\u0412\u042B\u041A\u0418=- -Stats.Own.Stats=&a[mcMMO] \u0421\u0442\u0430\u0442\u044B +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\u0439\u0442\u0435 \u0431\u043E\u043B\u044C\u0448\u0435 \u043E\u043F\u044B\u0442\u0430 \u0432 \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u043D\u043E\u043C \u043D\u0430\u0432\u044B\u043A\u0435. -Perks.Lucky.Name=\u0423\u0434\u0430\u0447\u0430 -Perks.Lucky.Desc=\u0414\u0430\u0435\u0442 {0} \u043D\u0430\u0432\u044B\u043A\u0430\u043C \u0438 \u0443\u043C\u0435\u043D\u0438\u044F\u043C \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. -Perks.Lucky.Desc.Login=\u0414\u0430\u0435\u0442 \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u043C \u043D\u0430\u0432\u044B\u043A\u0430\u043C \u0438 \u0443\u043C\u0435\u043D\u0438\u044F\u043C \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. -Perks.Lucky.Bonus=&6 ({0} \u0441 \u0423\u0434\u0430\u0447\u0435\u0439) -Perks.Cooldowns.Name=\u0411\u044B\u0441\u0442\u0440\u043E\u0435 \u0432\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 \u0432\u0440\u0435\u043C\u044F \u043E\u0442\u043A\u0430\u0442\u043E\u0432 \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=&6 ({0}% \u0441 \u0412\u044B\u043D\u043E\u0441\u043B\u0438\u0432\u043E\u0441\u0442\u044C\u044E) +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] \u0420\u0435\u0436\u0438\u043C \u0445\u0430\u0440\u0434\u043A\u043E\u0440\u0430 {0} \u043E\u0442\u043A\u043B\u044E\u0447\u0435\u043D \u0434\u043B\u044F {1}. -Hardcore.Mode.Enabled=&6[mcMMO] \u0420\u0435\u0436\u0438\u043C \u0445\u0430\u0440\u0434\u043A\u043E\u0440\u0430 {0} \u0432\u043A\u043B\u044E\u0447\u0435\u043D \u0434\u043B\u044F {1}. -Hardcore.DeathStatLoss.Name=\u0428\u0442\u0440\u0430\u0444 \u043D\u0430\u0432\u044B\u043A\u043E\u0432 \u0437\u0430 \u0441\u043C\u0435\u0440\u0442\u044C -Hardcore.DeathStatLoss.PlayerDeath=&6[mcMMO] &4\u0412\u044B \u043F\u043E\u0442\u0435\u0440\u044F\u043B\u0438 &9{0}&4 \u0443\u0440\u043E\u0432\u043D\u0435\u0439 \u043F\u0440\u0438 \u0441\u043C\u0435\u0440\u0442\u0438. -Hardcore.DeathStatLoss.PercentageChanged=&6[mcMMO] \u041F\u0440\u043E\u0446\u0435\u043D\u0442 \u043F\u043E\u0442\u0435\u0440\u0438 \u0441\u0442\u0430\u0442\u043E\u0432 \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=&6[mcMMO] &e{0}&7 \u0431\u044B\u043B \u0441\u043B\u0438\u0448\u043A\u043E\u043C \u043D\u0435\u0443\u043C\u0435\u043B, \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=&6[mcMMO] &3\u0412\u044B \u0443\u043A\u0440\u0430\u043B\u0438 &9{0}&3 \u0443\u0440\u043E\u0432\u043D\u0435\u0439 \u0443 &e{1}. -Hardcore.Vampirism.Victim.Failure=&6[mcMMO] &e{0}&7 \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=&6[mcMMO] &e{0}&4 \u0443\u043A\u0440\u0430\u043B \u0443 \u0432\u0430\u0441 &9{1}&4 \u0443\u0440\u043E\u0432\u043D\u0435\u0439! -Hardcore.Vampirism.PercentageChanged=&6[mcMMO] \u041F\u0440\u043E\u0446\u0435\u043D\u0442 \u043F\u043E\u0433\u043B\u043E\u0449\u0435\u043D\u0438\u044F \u0441\u0442\u0430\u0442\u043E\u0432 \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=&3\u041F\u043E\u0436\u0435\u0440\u0442\u0432\u043E\u0432\u0430\u043D\u0438\u044F: -MOTD.Hardcore.Enabled=&6[mcMMO] &3\u0420\u0435\u0436\u0438\u043C \u0445\u0430\u0440\u0434\u043A\u043E\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D: &4{0} -MOTD.Hardcore.DeathStatLoss.Stats=&6[mcMMO] &3\u0428\u0442\u0440\u0430\u0444 \u043D\u0430\u0432\u044B\u043A\u043E\u0432 \u0437\u0430 \u0441\u043C\u0435\u0440\u0442\u044C: &4{0}% -MOTD.Hardcore.Vampirism.Stats=&6[mcMMO] &3\u041F\u043E\u0433\u043B\u043E\u0449\u0435\u043D\u0438\u0435 \u0441\u0442\u0430\u0442\u043E\u0432 \u043E\u0442 \u0412\u0430\u043C\u043F\u0438\u0440\u0438\u0437\u043C\u0430: &4{0}% -MOTD.PerksPrefix=&6[mcMMO \u043E\u0441\u043E\u0431\u0435\u043D\u043D\u043E\u0441\u0442\u0438] -MOTD.Version=&6[mcMMO] \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F \u0432\u0435\u0440\u0441\u0438\u044F &3{0} -MOTD.Website=&6[mcMMO] &a{0}&e - \u0441\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 \u0438\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 \u0441\u043B\u0438\u0448\u043A\u043E\u043C \u043C\u043D\u043E\u0433\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.!nasd\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=\u041C\u043D\u043E\u0436\u0438\u0442\u0435\u043B\u044C \u043E\u0431\u044B\u0447\u043D\u043E\u0433\u043E \u043E\u043F\u044B\u0442\u0430: &e{0}x -Smelting.Ability.Locked.0=\u0417\u0410\u0411\u041B\u041E\u041A\u0418\u0420\u041E\u0412\u0410\u041D\u041E \u0414\u041E {0}+ \u041D\u0410\u0412\u042B\u041A\u0410 (\u0423\u0412\u0415\u041B\u0418\u0427\u0415\u041D\u0418\u0415 \u041E\u0411\u042B\u0427\u041D\u041E\u0413\u041E \u041E\u041F\u042B\u0422\u0410) -Smelting.Ability.Locked.1=\u0417\u0410\u0411\u041B\u041E\u041A\u0418\u0420\u041E\u0412\u0410\u041D\u041E \u0414\u041E {0}+ \u041D\u0410\u0412\u042B\u041A\u0410 (\u0424\u041B\u042E\u0421\u041E\u0412\u0410\u042F \u0414\u041E\u0411\u042B\u0427\u0410) -Smelting.SubSkill.FuelEfficiency.Name=\u042D\u0444\u0444\u0435\u043A\u0442\u0438\u0432\u043D\u043E\u0441\u0442\u044C \u0442\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 \u043F\u0440\u0438 \u043F\u0435\u0440\u0435\u043F\u043B\u0430\u043A\u0438 \u0432 \u043F\u0435\u0447\u0438 -Smelting.SubSkill.FuelEfficiency.Stat=\u041C\u043D\u043E\u0436\u0438\u0442\u0435\u043B\u044C \u044D\u0444\u0444\u0435\u043A\u0442\u0438\u0432\u043D\u043E\u0441\u0442\u0438 \u0442\u043E\u043F\u043B\u0438\u0432\u0430: &e{0}x -Smelting.SubSkill.SecondSmelt.Name=\u0412\u0442\u043E\u0440\u0430\u044F \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 \u043F\u0435\u0440\u0435\u043F\u043B\u0430\u0432\u043A\u0435 -Smelting.SubSkill.SecondSmelt.Stat=\u0428\u0430\u043D\u0441 \u0412\u0442\u043E\u0440\u043E\u0439 \u043F\u043B\u0430\u0432\u043A\u0438 -Smelting.Effect.4=\u0423\u0432\u0435\u043B\u0438\u0447\u0435\u043D\u0438\u0435 \u043E\u0431\u044B\u0447\u043D\u043E\u0433\u043E \u043E\u043F\u044B\u0442\u0430 -Smelting.Effect.5=\u0423\u0432\u0435\u043B\u0438\u0447\u0435\u043D\u0438\u0435 \u043E\u0431\u044B\u0447\u043D\u043E\u0433\u043E \u043E\u043F\u044B\u0442\u0430, \u043F\u043E\u043B\u0443\u0447\u0430\u0435\u043C\u043E\u0433\u043E \u043F\u0440\u0438 \u043F\u0435\u0440\u0435\u043F\u043B\u0430\u0432\u043A\u0435 -Smelting.SubSkill.FluxMining.Name=\u0424\u043B\u044E\u0441\u043E\u0432\u0430\u044F \u0434\u043E\u0431\u044B\u0447\u0430 -Smelting.SubSkill.FluxMining.Description=\u0428\u0430\u043D\u0441 \u043C\u0433\u043D\u043E\u0432\u0435\u043D\u043D\u043E\u0439 \u043F\u0435\u0440\u0435\u043F\u043B\u0430\u0432\u043A\u0438 \u0440\u0443\u0434 \u0432\u043E \u0432\u0440\u0435\u043C\u044F \u0434\u043E\u0431\u044B\u0447\u0438 -Smelting.SubSkill.FluxMining.Stat=\u0428\u0430\u043D\u0441 \u0424\u043B\u044E\u0441\u043E\u0432\u043E\u0439 \u0434\u043E\u0431\u044B\u0447\u0438 -Smelting.Listener=\u041F\u0435\u0440\u0435\u043F\u043B\u0430\u0432\u043A\u0430: -Smelting.SkillName=\u041F\u0415\u0420\u0415\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 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044E \u0443\u0440\u043E\u0432\u043D\u0435\u0439 mcMMO -Commands.Description.adminchat=\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0430\u0434\u043C\u0438\u043D-\u0447\u0430\u0442 mcMMO \u0438\u043B\u0438 \u043E\u0442\u043E\u0441\u043B\u0430\u0442\u044C \u0442\u0443\u0434\u0430 \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 \u0448\u0442\u0440\u0430\u0444 \u0445\u0430\u0440\u0434\u043A\u043E\u0440\u0430 mcMMO \u0438\u043B\u0438 \u043F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C \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=\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C \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 \u043E\u0442\u043A\u0430\u0442\u044B \u0443\u043C\u0435\u043D\u0438\u0439 mcMMO -Commands.Description.mcchatspy=\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0441\u043B\u0435\u0436\u043A\u0443 \u0437\u0430 \u0447\u0430\u0442\u0430\u043C\u0438 \u0433\u0440\u0443\u043F\u043F mcMMO -Commands.Description.mcgod=\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C \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 HUD 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=\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C \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\u0441\u044F \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=\u0421\u0431\u0440\u043E\u0441\u0438\u0442\u044C \u0432\u0441\u0435 \u043E\u0442\u043A\u0430\u0442\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\u0442\u044C \u0441\u0432\u043E\u0435\u0439 \u0442\u0430\u0431\u043B\u0438\u0446\u0435\u0439 mcMMO -Commands.Description.mcstats=\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0432\u0430\u0448\u0438 \u0443\u0440\u043E\u0432\u043D\u0438 \u0438 \u043E\u043F\u044B\u0442 mcMMO -Commands.Description.mctop=\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0442\u0430\u0431\u043B\u0438\u0446\u0443 \u043B\u0438\u0434\u0435\u0440\u043E\u0432 mcMMO -Commands.Description.mmoedit=\u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C \u0443\u0440\u043E\u0432\u0435\u043D\u044C mcMMO \u0434\u043B\u044F \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0435\u0439 -Commands.Description.mmodebug=\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0440\u0435\u0436\u0438\u043C \u043E\u0442\u043B\u0430\u0434\u043A\u0438, \u043A\u043E\u0442\u043E\u0440\u044B\u0439 \u0432\u044B\u0432\u043E\u0434\u0438\u0442 \u043F\u043E\u043B\u0435\u0437\u043D\u0443\u044E \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044E \u043F\u0440\u0438 \u0443\u0434\u0430\u0440\u0430\u0445 \u043F\u043E \u0431\u043B\u043E\u043A\u0430\u043C -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 /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 \u0433\u0440\u0443\u043F\u043F\u044B mcMMO -Commands.Description.partychat=\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0447\u0430\u0442 \u0433\u0440\u0443\u043F\u043F\u044B mcMMO \u0438\u043B\u0438 \u043E\u0442\u043E\u0441\u043B\u0430\u0442\u044C \u0442\u0443\u0434\u0430 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435 -Commands.Description.ptp=\u0422\u0435\u043B\u0435\u043F\u043E\u0440\u0442\u0430\u0446\u0438\u044F \u043A \u0447\u043B\u0435\u043D\u0430\u043C \u0433\u0440\u0443\u043F\u043F\u044B mcMMO -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 \u0412\u0430\u043C\u043F\u0438\u0440\u0438\u0437\u043C\u0430 \u0432 mcMMO \u0438\u043B\u0438 \u043F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0440\u0435\u0436\u0438\u043C \u0412\u0430\u043C\u043F\u0438\u0440\u0438\u0437\u043C\u0430 -Commands.Description.xplock=\u0417\u0430\u0444\u0438\u043A\u0441\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0448\u043A\u0430\u043B\u0443 \u043E\u043F\u044B\u0442\u0430 mcMMO \u043D\u0430 \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u043D\u043E\u043C \u043D\u0430\u0432\u044B\u043A\u0435 -Commands.Description.xprate=\u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C \u043C\u043D\u043E\u0436\u0438\u0442\u0435\u043B\u044C \u043E\u043F\u044B\u0442\u0430 mcMMO \u0438\u043B\u0438 \u043D\u0430\u0447\u0430\u0442\u044C \u0441\u043E\u0431\u044B\u0442\u0438\u0435 \u043C\u043D\u043E\u0436\u0438\u0442\u0435\u043B\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=&e\u0421\u0442\u0430\u0442\u044B mcMMO -Scoreboard.Header.PlayerCooldowns=&e\u041E\u0442\u043A\u0430\u0442\u044B mcMMO -Scoreboard.Header.PlayerRank=&e\u0420\u0435\u0439\u0442\u0438\u043D\u0433 mcMMO -Scoreboard.Header.PlayerInspect=&e\u0421\u0442\u0430\u0442\u044B mcMMO: {0} -Scoreboard.Header.PowerLevel=&c\u0423\u0440\u043E\u0432\u0435\u043D\u044C \u0441\u0438\u043B\u044B -Scoreboard.Misc.PowerLevel=&6\u0423\u0440\u043E\u0432\u0435\u043D\u044C \u0441\u0438\u043B\u044B -Scoreboard.Misc.Level=&3\u0423\u0440\u043E\u0432\u0435\u043D\u044C -Scoreboard.Misc.CurrentXP=&a\u0422\u0435\u043A\u0443\u0449\u0438\u0439 \u043E\u043F\u044B\u0442 -Scoreboard.Misc.RemainingXP=&e\u041E\u0441\u0442\u0430\u043B\u043E\u0441\u044C \u043E\u043F\u044B\u0442\u0430 -Scoreboard.Misc.Cooldown=&d\u041E\u0442\u043A\u0430\u0442 -Scoreboard.Misc.Overall=&6\u0412\u0441\u0435\u0433\u043E -Scoreboard.Misc.Ability=\u0423\u043C\u0435\u043D\u0438\u0435 +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=&c\u0412\u0430\u0448 \u043F\u0440\u043E\u0444\u0438\u043B\u044C mcMMO \u0435\u0449\u0451 \u043D\u0435 \u0431\u044B\u043B \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043D. -Profile.Loading.Success=&a\u0412\u0430\u0448 \u043F\u0440\u043E\u0444\u0438\u043B\u044C mcMMO \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u043B\u0441\u044F. -Profile.Loading.FailurePlayer=&cmcMMO \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 \u0443\u0436\u0435 &a{0}&c \u0440\u0430\u0437. \u0412\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\u0446\u0438\u0438 \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 \u043F\u043E\u043A\u0430 \u0432\u044B \u043D\u0435 \u043F\u043E\u043A\u0438\u043D\u0435\u0442\u0435 \u0438\u0433\u0440\u0443. \u041F\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, \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 \u043D\u0430\u0432\u044B\u043A\u0438. -Profile.Loading.FailureNotice=&4[\u0410]&c mcMMO \u043D\u0435 \u0441\u043C\u043E\u0433\u043B \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044C \u0434\u0430\u043D\u043D\u044B\u0435 \u0438\u0433\u0440\u043E\u043A\u0430 &e{0}&c. &d\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. \u041F\u043E\u043F\u044B\u0442\u043E\u043A \u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0438 \u0434\u0430\u043D\u043D\u044B\u0445 {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=&6{0} \u0442\u0435\u043F\u0435\u0440\u044C \u0443\u0440\u043E\u0432\u043D\u044F &a{1}&6! -Holiday.Anniversary=&9\u0421 {0} \u0413\u043E\u0434\u043E\u0432\u0449\u0438\u043D\u043E\u0439!!nasd&9\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, \u0434\u0430 \u0431\u0443\u0434\u0443\u0442 \u0444\u0435\u0439\u0435\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\u041D\u0430\u043F\u043E\u043C\u0438\u043D\u0430\u043D\u0438\u0435: \u0412 \u043D\u0430\u0441\u0442\u043E\u044F\u0449\u0435\u0435 \u0432\u0440\u0435\u043C\u044F \u0432\u044B \u043D\u0435 \u043F\u043E\u043B\u0443\u0447\u0430\u0435\u0442\u0435 \u0443\u0432\u0435\u0434\u043E\u043C\u043B\u0435\u043D\u0438\u044F \u043E\u0442 mcMMO; \u0447\u0442\u043E\u0431\u044B \u0432\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0443\u0432\u0435\u0434\u043E\u043C\u043B\u0435\u043D\u0438\u044F, \u043F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430, \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u0443 /mc!nasdotify \u0441\u043D\u043E\u0432\u0430. \u042D\u0442\u043E \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0435 \u043F\u043E\u0447\u0430\u0441\u043E\u0432\u043E\u0435 \u043D\u0430\u043F\u043E\u043C\u0438\u043D\u0430\u043D\u0438\u0435. +Reminder.Squelched=&7Напоминание: В настоящее время вы не получаете уведомления от mcMMO; чтобы включить уведомления, пожалуйста, введите команду /mc!nasdotify снова. Это автоматическое почасовое напоминание. #Locale -Locale.Reloaded=&a\u041B\u043E\u043A\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u044F \u043F\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043D\u0430! +Locale.Reloaded=&aЛокализация перезагружена! #Player Leveling Stuff -LevelCap.PowerLevel=&6(&amcMMO&6) &e\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 &c{0}&e. \u0412\u0430\u0448\u0438 \u043D\u0430\u0432\u044B\u043A\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=&6(&amcMMO&6) &e\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 &c{0}&e \u0434\u043B\u044F &6{1}&e. \u0412\u0430\u0448\u0438 \u043D\u0430\u0432\u044B\u043A\u0438 \u0431\u043E\u043B\u044C\u0448\u0435 \u043D\u0435 \u0431\u0443\u0434\u0443\u0442 \u0443\u043B\u0443\u0447\u0448\u0430\u0442\u044C\u0441\u044F. -Commands.XPBar.Usage=\u041F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u043E\u0435 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0435 - /mmoxpbar <\u043D\u0430\u0432\u044B\u043A | reset> -Commands.Description.mmoxpbar=\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u0438\u0433\u0440\u043E\u043A\u0430 \u0434\u043B\u044F \u0448\u043A\u0430\u043B\u044B \u043E\u043F\u044B\u0442\u0430 mcMMO -Commands.Description.mmocompat=\u0418\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F \u043E mcMMO \u0438 \u043E \u0442\u043E\u043C, \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u043B\u0438 \u0440\u0435\u0436\u0438\u043C \u0441\u043E\u0432\u043C\u0435\u0441\u0442\u0438\u043C\u043E\u0441\u0442\u0438 \u0438\u043B\u0438 \u043D\u0435\u0442. -Compatibility.Layer.Unsupported=&6\u0421\u043E\u0432\u043C\u0435\u0441\u0442\u0438\u043C\u043E\u0441\u0442\u044C \u0434\u043B\u044F &{0}&6 \u043D\u0435 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044F \u044D\u0442\u043E\u0439 \u0432\u0435\u0440\u0441\u0438\u0435\u0439 Minecraft. -Compatibility.Layer.PartialSupport=&6\u0421\u043E\u0432\u043C\u0435\u0441\u0442\u0438\u043C\u043E\u0441\u0442\u044C \u0434\u043B\u044F &{0}&6 \u043D\u0435 \u043F\u043E\u043B\u043D\u043E\u0441\u0442\u044C\u044E \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044F \u044D\u0442\u043E\u0439 \u0432\u0435\u0440\u0441\u0438\u0435\u0439 Minecraft, \u043D\u043E mcMMO \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442 \u0432\u0442\u043E\u0440\u0438\u0447\u043D\u0443\u044E \u0441\u0438\u0441\u0442\u0435\u043C\u0443 \u0434\u043B\u044F \u044D\u043C\u0443\u043B\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F \u043D\u0435\u043A\u043E\u0442\u043E\u0440\u044B\u0445 \u043D\u0435\u0434\u043E\u0441\u0442\u0430\u044E\u0449\u0438\u0445 \u0444\u0443\u043D\u043A\u0446\u0438\u0439. -Commands.XPBar.DisableAll=&6 \u0412\u0441\u0435 \u0448\u043A\u0430\u043B\u044B \u043E\u043F\u044B\u0442\u0430 mcMMO \u043E\u0442\u043A\u043B\u044E\u0447\u0435\u043D\u044B, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 /mmoxpbar \u0434\u043B\u044F \u0441\u0431\u0440\u043E\u0441\u0430 \u043D\u0430\u0441\u0442\u0440\u043E\u0435\u043A. +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(\u0410) &r{0} &b\u2192 &r{1} -Chat.Style.Party=&a(\u0413) &r{0} &a\u2192 &r{1} -Chat.Style.Party.Leader=&a(\u0413) &r{0} &6\u2192 &r{1} -Chat.Identity.Console=&6* \u041A\u043E\u043D\u0441\u043E\u043B\u044C * -Chat.Channel.On=&6(&amcMMO-\u0447\u0430\u0442&6) &e\u0412\u0430\u0448\u0438 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F \u0431\u0443\u0434\u0443\u0442 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u0434\u043E\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u044B \u0432 \u043A\u0430\u043D\u0430\u043B \u0447\u0430\u0442\u0430 &a{0}. -Chat.Channel.Off=&6(&amcMMO-\u0447\u0430\u0442&6) &e\u0412\u0430\u0448\u0438 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F \u0431\u043E\u043B\u044C\u0448\u0435 \u043D\u0435 \u0431\u0443\u0434\u0443\u0442 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u0434\u043E\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u044B \u0432 \u043A\u0430\u043D\u0430\u043B \u0447\u0430\u0442\u0430. -Chat.Spy.Party=&6[&e\u0428\u041F\u0418\u041A&6-&a{2}&6] &r{0} &b\u2192 &r{1} -Broadcasts.LevelUpMilestone=&6(&amcMMO&6) {0}&7 \u0434\u043E\u0441\u0442\u0438\u0433 \u0443\u0440\u043E\u0432\u043D\u044F &a{1}&7 \u0432 &e{2}&7! -Broadcasts.PowerLevelUpMilestone=&6(&amcMMO&6) {0}&7 \u0434\u043E\u0441\u0442\u0438\u0433 \u0443\u0440\u043E\u0432\u043D\u044F \u0441\u0438\u043B\u044B &a{1}&7! -Scoreboard.Recovery=\u041F\u043E\u043F\u044B\u0442\u043A\u0430 \u0432\u043E\u0441\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C \u0440\u0430\u0431\u043E\u0442\u0443 \u0442\u0430\u0431\u043B\u0438\u0446\u044B mcMMO... +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 852bca11f..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=&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=&7**DU S\u00c4NKER FIN YXA** +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\u00d6RRE EFFEKT** -Axes.Combat.SS.Length=Skallsplittrare l\u00e4ngd &e{0}s +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=&a**Skallsplittrare AKTIVERAD** -Axes.Skills.SS.Refresh=&aYour &eSkallsplittrar &af\u00f6rm\u00e5gan \u00e4r vederkvickad! -Axes.Skills.SS.Other.On=&a{0}&2 har anv\u00e4nt &cSkallsplittrare! -Axes.Skillup=Yxf\u00e4rdigheten har \u00f6kat med {0}. Totalt ({1}) -Excavation.Ability.Ready=&a**DU H\u00d6JER DIN SPADE** -Excavation.Listener=Gr\u00e4vning: -Excavation.SkillName=Gr\u00e4vning +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\u00e4vningsf\u00e4rdigheten har \u00f6kat med {0}. Totalt ({1}) -Fishing.Ability.TH.MagicFound=&7 Du f\u00e5r en k\u00e4nsla av magi med denna f\u00e5ngst.... -Herbalism.Ability.GTh=&a**GR\u00d6NA FINGRAR** -Herbalism.Ability.Ready=&a**DU H\u00d6JER DIN SKYFFEL** -Herbalism.Listener=V\u00e4xtk\u00e4nnedom: -Herbalism.Skills.GTe.Refresh=&aDina&eGr\u00f6na fingrar &af\u00f6rm\u00e5ga \u00e4r vederkvickad! -Herbalism.Skills.GTe.Other.Off=&cGr\u00f6na fingrar&a har avklingat f\u00f6r &e{0} -Herbalism.Skills.GTe.Other.On=&a{0}&2 har anv\u00e4nt &cGr\u00f6n Jord! -Mining.Ability.Length=Superbrytarl\u00e4ngd: &e{0}s -Mining.Ability.Lower=&7**DU S\u00c4NKER DIN HACKA** -Mining.Ability.Ready=&a**DU F\u00d6RBEREDER DIN HACKA** +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&a har avklingat f\u00f6r &e{0} -Mining.Skills.SuperBreaker.Refresh=&aDin &eSuperbrytar &af\u00f6rm\u00e5ga har uppdaterats! -Mining.Skillup=Hackf\u00e4rdigheten \u00f6kade med {0}. Totalt ({1}) -Mining.Blast.Radius.Increase=\u00d6KNING AV SPR\u00c4NGNINGSRADIEN: &e+{0} +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\u00e4nt &cExplosions Gruvdrift -Mining.Blast.Refresh=&aDin &eExplosionshacknings &af\u00f6rm\u00e5ga har vederkvickas! +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,100 +54,100 @@ Repair.SubSkill.ArcaneForging.Name=Magisk smide Repair.SubSkill.ArcaneForging.Description=Reparera magiska objekt Repair.Listener=Reparera Repair.SkillName=Reparera -Repair.Skills.AdeptDiamond=&4Du \u00e4r inte skicklig nog f\u00f6r att reparera Diamant. -Repair.Skills.AdeptGold=&4Du \u00e4r inte skicklig nog f\u00f6r att reparera Guld. -Repair.Skills.AdeptStone=&4Du \u00e4r inte skicklig nog f\u00f6r att reparera Sten. -Repair.Skillup=Smidesf\u00e4rdigheten \u00f6kade med {0}. Totalt ({1}) -Repair.Arcane.Chance.Downgrade=&7AF Chans f\u00f6r nedgradering: &e{0}% -Repair.Arcane.Chance.Success=&7AF Framg\u00e5ngsgrad: &e{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=&7**DU S\u00c4NKER DITT SV\u00c4RD** -Swords.Ability.Ready=&a**DU G\u00d6R DIG REDO MED SV\u00c4RDET** -Swords.Combat.Bleeding.Stopped=&7F\u00f6rbl\u00f6dningen har &astoppats&7! -Swords.Combat.Bleeding=&a**FIENDEN BL\u00d6DER** -Swords.Combat.Counter.Hit=&4Tr\u00e4ff med en motattack +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\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=&a**S\u00c5GTANDADE SLAG AKTIVERADE** -Swords.Skills.SS.Refresh=&aDina &eBl\u00f6dande slag &ahar vederkvickas! -Swords.Skills.SS.Other.Off=S\u00e5gtandat slag&a hat avklingat h\u00e4r f\u00f6r &e{0} -Swords.Skills.SS.Other.On=&a{0}&2 har anv\u00e4nt &cS\u00e5gtandat slag! -Taming.Ability.Bonus.2=Tjock P\u00e4ls -Taming.SubSkill.ShockProof.Name=Shocks\u00e4ker +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=&7COTW (Ocelot): Huka och v\u00e4nster-klicka med {0} Fisk i handen -Taming.Effect.15=&7COTW (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.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\u00e4mja: -Taming.Skillup=T\u00e4mjningsf\u00e4rdigheten \u00f6kade med {0}. Totalt ({1}) -Unarmed.Ability.Berserk.Length=Berserk l\u00e4ngd: &e{0}s -Unarmed.Listener=Obev\u00e4pnad -Unarmed.Skills.Berserk.Off=**B\u00e4rs\u00e4rk slut** -Unarmed.Skills.Berserk.Other.Off=B\u00e4rs\u00e4rk&a har avklingat f\u00f6r &e{0} -Unarmed.Skills.Berserk.Other.On=&a{0}&2 har anv\u00e4nt &cB\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=&aDin &etr\u00e4df\u00e4llarkraft &ahar vederkvickats! -Woodcutting.Skills.TreeFeller.Other.Off=tr\u00e5df\u00e4llning&a har avklingat f\u00f6r &e{0} -Woodcutting.Skills.TreeFeller.Other.On=&a{0}&2 har anv\u00e4nt &cTr\u00e4d f\u00e4llare +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}) +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\u00e4lsa (&a{0}&3/{1}) -Combat.TouchedFuzzy=&4R\u00f6rde luddigt. K\u00e4nde suddigt. +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\u00e4xla admin chat -Commands.Disabled=Det h\u00e4r kommandot \u00e4r avst\u00e4ngt. +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=&aF\u00f6rfr\u00e5gan accepterad. Du har nu g\u00e5tt med i gruppen {0} -Commands.mcgod=- V\u00e4xla till gudsl\u00e4ge -Commands.mmoedit=[player] &c - \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 &cav. -Commands.Party.Invite.0=VARNING: &aDu 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&9 Kraftniv\u00e5&eLeaderboard-- -Commands.PowerLevel=&4KRAFTNIV\u00c5: &a{0} -Commands.ToggleAbility=- V\u00e4xla aktiv egenskap med h\u00f6gerklick. -mcMMO.NoSkillNote=&8Om 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. +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 \u00e4r nu uppl\u00e5st +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=&8XP \u00d6KAT: &f{0} -Commands.xprate.proper.0=Riktigt anv\u00e4ndande f\u00f6r att \u00e4ndra XP graden \u00e4r /xprate -XPRate.Event=&6mcMMO \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=&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. &e({0}s) -Skills.Disarmed=&4Du har avv\u00e4pnats! -Stats.Header.Combat=&6-=Stridsf\u00e4rdigheter=- -Stats.Header.Gathering=&6-=SAMLA F\u00d6RM\u00c5GOR=- -Stats.Header.Misc=&6-=Varierande F\u00e4rdogheter=- +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 diff --git a/src/main/resources/locale/locale_th_TH.properties b/src/main/resources/locale/locale_th_TH.properties index 69541c19b..4faa11011 100644 --- a/src/main/resources/locale/locale_th_TH.properties +++ b/src/main/resources/locale/locale_th_TH.properties @@ -1,635 +1,635 @@ -Acrobatics.Ability.Proc=&a**\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 Graceful Landing** +Acrobatics.Ability.Proc=&a**ใช้ทักษะ Graceful Landing** Acrobatics.Combat.Proc=&a**Dodged** -Acrobatics.DodgeChance=Dodge \u0e42\u0e2d\u0e01\u0e32\u0e2a: &e{0} +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: &e{0} -Acrobatics.SubSkill.Roll.GraceChance=Graceful Roll \u0e42\u0e2d\u0e01\u0e32\u0e2a: &e{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: &e{0} -Archery.Combat.RetrieveChance=Retrieve Arrows \u0e42\u0e2d\u0e01\u0e32\u0e2a: &e{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: &e{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=&7**\u0e22\u0e01\u0e40\u0e25\u0e34\u0e01\u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30\u0e02\u0e2d\u0e07 Axe** -Axes.Ability.Ready=&a**\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=&4\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: &e{0} -Axes.Combat.CriticalHit=\u0e42\u0e08\u0e21\u0e15\u0e35 CRITICAL! -Axes.Combat.GI.Proc=&a**\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: &e{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=&a**\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 Skull Splitter** -Axes.Skills.SS.Refresh=&a\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e17\u0e31\u0e01\u0e29\u0e30 &eSkull Splitter &a\u0e04\u0e39\u0e25\u0e14\u0e32\u0e27\u0e19\u0e4c\u0e40\u0e2a\u0e23\u0e47\u0e08\u0e41\u0e25\u0e49\u0e27! -Axes.Skills.SS.Other.Off=Skull Splitter&a \u0e23\u0e2d\u0e01\u0e32\u0e23\u0e04\u0e39\u0e25\u0e14\u0e32\u0e27\u0e19\u0e4c &e{0} -Axes.Skills.SS.Other.On=&a{0}&2 \u0e44\u0e14\u0e49\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 &cSkull 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=&7**\u0e22\u0e01\u0e40\u0e25\u0e34\u0e01\u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30\u0e02\u0e2d\u0e07 Shovel** -Excavation.Ability.Ready=&a**\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: &e{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=&a**\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 GIGA DRILL BREAKER** -Excavation.Skills.GigaDrillBreaker.Refresh=&a\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e17\u0e31\u0e01\u0e29\u0e30 &eGiga Drill Breaker &a\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&a \u0e23\u0e2d\u0e01\u0e32\u0e23\u0e04\u0e39\u0e25\u0e14\u0e32\u0e27\u0e19\u0e4c &e{0} -Excavation.Skills.GigaDrillBreaker.Other.On=&a{0}&2 \u0e44\u0e14\u0e49\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 &cGiga 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: &e{0} -Fishing.Ability.Info=\u0e17\u0e31\u0e01\u0e29\u0e30 Magic Hunter: &7 **\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: &e{0}/5 -Fishing.Ability.TH.MagicRate=Magic Hunter \u0e42\u0e2d\u0e01\u0e32\u0e2a: &e{0} -Fishing.Ability.Shake=Shake \u0e42\u0e2d\u0e01\u0e32\u0e2a: &e{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: &e{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.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.SubSkill.IceFishing.Description=อนุญาติให้ตกปลาในน้ำแข็ง Fishing.Chance.Raining=&9 Rain Bonus -Fishing.Listener=\u0e17\u0e31\u0e01\u0e29\u0e30 Fishing: -Fishing.Ability.TH.MagicFound=&7\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.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: &e{0} -Herbalism.Ability.FD=Farmer\'\'s Diet \u0e23\u0e30\u0e14\u0e31\u0e1a: &e {0} -Herbalism.Ability.GTe.Length=Green Terra \u0e21\u0e35\u0e23\u0e30\u0e22\u0e30\u0e40\u0e27\u0e25\u0e32: &e{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: &e{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: &e{0} -Herbalism.Ability.GTh=&a**\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 GREEN THUMB** -Herbalism.Ability.HylianLuck=Hylian Luck \u0e42\u0e2d\u0e01\u0e32\u0e2a: &e{0} -Herbalism.Ability.Lower=&7**\u0e22\u0e01\u0e40\u0e25\u0e34\u0e01\u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30\u0e02\u0e2d\u0e07 Hoe** -Herbalism.Ability.Ready=&a**\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: &e{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=&a\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=&a**\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 GREEN TERRA** -Herbalism.Skills.GTe.Refresh=&aYour &eGreen Terra &a\u0e04\u0e39\u0e25\u0e14\u0e32\u0e27\u0e19\u0e4c\u0e40\u0e2a\u0e23\u0e47\u0e08\u0e41\u0e25\u0e49\u0e27! -Herbalism.Skills.GTe.Other.Off=Green Terra&a \u0e23\u0e2d\u0e01\u0e32\u0e23\u0e04\u0e39\u0e25\u0e14\u0e32\u0e27\u0e19\u0e4c &e{0} -Herbalism.Skills.GTe.Other.On=&a{0}&2 \u0e44\u0e14\u0e49\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 &cGreen 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: &e{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=&7**\u0e22\u0e01\u0e40\u0e25\u0e34\u0e01\u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30\u0e02\u0e2d\u0e07 Pickaxe** -Mining.Ability.Ready=&a**\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: &e{0} -Mining.Effect.DropChance=Double Drop \u0e42\u0e2d\u0e01\u0e32\u0e2a: &e{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=&a**\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 SUPER BREAKER** -Mining.Skills.SuperBreaker.Other.Off=Super Breaker&a \u0e23\u0e2d\u0e01\u0e32\u0e23\u0e04\u0e39\u0e25\u0e14\u0e32\u0e27\u0e19\u0e4c &e{0} -Mining.Skills.SuperBreaker.Other.On=&a{0}&2 \u0e44\u0e14\u0e49\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 &cSuper Breaker! -Mining.Skills.SuperBreaker.Refresh=&a\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e32\u0e21\u0e23\u0e16\u0e17\u0e31\u0e01\u0e29\u0e30 &eSuper Breaker &a\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.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} \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: &e+{0} -Mining.Blast.Rank=\u0e17\u0e31\u0e01\u0e29\u0e30 Blast Mining: &e \u0e23\u0e30\u0e14\u0e31\u0e1a {0}/8 &7({1}) -Mining.Blast.Other.On=&a{0}&2 \u0e44\u0e14\u0e49\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 &cBlast Mining! -Mining.Blast.Refresh=&a\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e17\u0e31\u0e01\u0e29\u0e30 &eBlast Mining &a\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.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=&4mcMMO \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=&4\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=&4\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=&4\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=&4\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=&4\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=&4\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=&4\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 &e{0}&c \u0e40\u0e1e\u0e35\u0e22\u0e07\u0e1e\u0e2d\u0e17\u0e35\u0e48\u0e08\u0e30\u0e0b\u0e48\u0e2d\u0e21\u0e41\u0e0b\u0e21 &e{1} -Repair.Skills.FeltEasy=&7\u0e23\u0e39\u0e49\u0e2a\u0e36\u0e01\u0e27\u0e48\u0e32\u0e21\u0e31\u0e19\u0e07\u0e48\u0e32\u0e22. -Repair.Skills.FullDurability=&7\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=&7\u0e2a\u0e34\u0e48\u0e07\u0e02\u0e2d\u0e07\u0e16\u0e39\u0e01\u0e01\u0e39\u0e49\u0e04\u0e37\u0e19! -Repair.Skills.NotFullDurability=&4\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: &e\u0e40\u0e1e\u0e34\u0e48\u0e21 {0} \u0e15\u0e48\u0e2d\u0e01\u0e32\u0e23\u0e0b\u0e48\u0e2d\u0e21\u0e41\u0e0b\u0e21 -Repair.Skills.StackedItems=&4\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: &e{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=&7AF \u0e21\u0e35\u0e42\u0e2d\u0e01\u0e32\u0e2a\u0e25\u0e14\u0e04\u0e27\u0e32\u0e21\u0e40\u0e2a\u0e35\u0e22\u0e2b\u0e32\u0e22: &e{0}% -Repair.Arcane.Chance.Success=&7AF \u0e42\u0e2d\u0e01\u0e32\u0e2a\u0e2a\u0e33\u0e40\u0e23\u0e47\u0e08: &e{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=&a\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: &e{0}/4 -Swords.Ability.Lower=&7**\u0e22\u0e01\u0e40\u0e25\u0e34\u0e01\u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 Sword** -Swords.Ability.Ready=&a**\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: &e{0} -Swords.Combat.Bleed.Length=Bleed \u0e21\u0e35\u0e23\u0e30\u0e22\u0e30\u0e40\u0e27\u0e25\u0e32: &e{0} ticks -Swords.Combat.Bleed.Note=&7NOTE: &e1 Tick \u0e40\u0e01\u0e34\u0e14\u0e02\u0e36\u0e49\u0e19\u0e17\u0e38\u0e01 2 \u0e27\u0e34\u0e19\u0e32\u0e17\u0e35 -Swords.Combat.Bleeding.Started=&4 \u0e04\u0e38\u0e13\u0e01\u0e33\u0e25\u0e31\u0e07\u0e40\u0e25\u0e37\u0e2d\u0e14\u0e44\u0e2b\u0e25! -Swords.Combat.Bleeding.Stopped=&7\u0e17\u0e31\u0e01\u0e29\u0e30 Enemy Bleeding \u0e2b\u0e21\u0e14\u0e2a\u0e20\u0e32\u0e1e&a -Swords.Combat.Bleeding=&a**\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 ENEMY BLEEDING** -Swords.Combat.Counter.Chance=Counter Attack \u0e42\u0e2d\u0e01\u0e32\u0e2a: &e{0} -Swords.Combat.Counter.Hit=&4\u0e42\u0e08\u0e21\u0e15\u0e35\u0e14\u0e49\u0e27\u0e22 counter-attack! -Swords.Combat.Countered=&a**\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 COUNTER-ATTACKED** -Swords.Combat.SS.Struck=&4\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=&a**\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e28\u0e30 SERRATED STRIKES** -Swords.Skills.SS.Refresh=&a\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e17\u0e31\u0e01\u0e29\u0e30 &eSerrated Strikes &a\u0e04\u0e39\u0e25\u0e14\u0e32\u0e27\u0e19\u0e4c\u0e40\u0e2a\u0e23\u0e47\u0e08\u0e41\u0e25\u0e49\u0e27! -Swords.Skills.SS.Other.Off=Serrated Strikes&a \u0e23\u0e2d\u0e01\u0e32\u0e23\u0e04\u0e39\u0e25\u0e14\u0e32\u0e27\u0e19\u0e4c &e{0} -Swords.Skills.SS.Other.On=&a{0}&2 \u0e44\u0e14\u0e49\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 &cSerrated 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: &e{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: &e{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=&7COTW (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=&7COTW (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=&8\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=&a\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: &e{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: &e{0} -Unarmed.Ability.Chance.Disarm=Disarm \u0e42\u0e2d\u0e01\u0e32\u0e2a: &e{0} -Unarmed.Ability.Chance.IronGrip=Iron Grip \u0e42\u0e2d\u0e01\u0e32\u0e2a: &e{0} -Unarmed.Ability.IronGrip.Attacker=\u0e1d\u0e48\u0e32\u0e22\u0e15\u0e23\u0e07\u0e02\u0e49\u0e32\u0e21\u0e21\u0e35 iron grip! -Unarmed.Ability.IronGrip.Defender=&aIron 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=&7**\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=&a**\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=&a**\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 BERSERK** -Unarmed.Skills.Berserk.Other.Off=Berserk&a \u0e23\u0e2d\u0e01\u0e32\u0e23\u0e04\u0e39\u0e25\u0e14\u0e32\u0e27\u0e19\u0e4c &e{0} -Unarmed.Skills.Berserk.Other.On=&a{0}&2 \u0e44\u0e14\u0e49\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 &cBerserk! -Unarmed.Skills.Berserk.Refresh=&a\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e17\u0e31\u0e01\u0e29\u0e30 &eBerserk &a\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: &e{0} -Woodcutting.Ability.Length=Tree Feller \u0e21\u0e35\u0e23\u0e30\u0e22\u0e30\u0e40\u0e27\u0e25\u0e32: &e{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=&a**\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 TREE FELLER** -Woodcutting.Skills.TreeFeller.Refresh=&a\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e17\u0e31\u0e01\u0e29\u0e30 &eTree Feller &a\u0e04\u0e39\u0e25\u0e14\u0e32\u0e27\u0e19\u0e4c\u0e40\u0e2a\u0e23\u0e47\u0e08\u0e41\u0e25\u0e49\u0e27! -Woodcutting.Skills.TreeFeller.Other.Off=Tree Feller&a \u0e23\u0e2d\u0e01\u0e32\u0e23\u0e04\u0e39\u0e25\u0e14\u0e32\u0e27\u0e19\u0e4c &e{0} -Woodcutting.Skills.TreeFeller.Other.On=&a{0}&2 \u0e44\u0e14\u0e49\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 &cTree 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=&a**\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 ABILITIES REFRESHED!** +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**\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 ARROW DEFLECT** -Combat.BeastLore=&a**\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 BEAST LORE** -Combat.BeastLoreHealth=&3\u0e23\u0e30\u0e14\u0e31\u0e1a\u0e40\u0e25\u0e37\u0e2d\u0e14 (&a{0}&3/{1}) -Combat.BeastLoreOwner=&3\u0e40\u0e08\u0e49\u0e32\u0e02\u0e2d\u0e07 (&c{0}&3) -Combat.Gore=&a**\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 &4\u0e21\u0e36\u0e19\u0e07\u0e07 -Combat.TouchedFuzzy=&4\u0e04\u0e38\u0e13\u0e23\u0e39\u0e49\u0e2a\u0e36\u0e01\u0e21\u0e36\u0e19 \u0e40\u0e1e\u0e23\u0e32\u0e30 \u0e17\u0e31\u0e01\u0e29\u0e30 Touched Fuzzy. +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\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=&a\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=&a\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=&a\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&a\u0e1b\u0e34\u0e14 -Commands.Ability.On=Ability \u0e2d\u0e22\u0e39\u0e48\u0e43\u0e19\u0e42\u0e2b\u0e21\u0e14&a\u0e40\u0e1b\u0e34\u0e14 -Commands.AdminChat.Off=Admin Chat &c\u0e16\u0e39\u0e01\u0e1b\u0e34\u0e14 -Commands.AdminChat.On=Admin Chat &a\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 +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= &c- \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=&a\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=&a\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.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\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07 mcMMO&c[]--- -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=&a\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=&6-=\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&a - &6\u0e23\u0e30\u0e14\u0e31\u0e1a &f#&a{0} -Commands.mcrank.Player=\u0e40\u0e1b\u0e49\u0e32\u0e2b\u0e21\u0e32\u0e22: &f{0} -Commands.mcrank.Skill={0}&a - &6\u0e25\u0e33\u0e14\u0e31\u0e1a &f#&a{1} +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}\'\'\u0e27\u0e34\u0e19\u0e32\u0e17\u0e35 \u0e04\u0e39\u0e25\u0e14\u0e32\u0e27\u0e19\u0e4c\u0e2a\u0e33\u0e40\u0e23\u0e47\u0e08. -Commands.mcremove.Success=&a{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=&6Tip: \u0e43\u0e0a\u0e49 &c/mcrank&6 \u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e14\u0e39\u0e25\u0e33\u0e14\u0e31\u0e1a\u0e02\u0e2d\u0e07\u0e1a\u0e38\u0e04\u0e04\u0e25! -Commands.mmoedit=[player] &c - \u0e41\u0e01\u0e49\u0e44\u0e02\u0e40\u0e1b\u0e49\u0e32\u0e2b\u0e21\u0e32\u0e22 -Commands.mmoedit.AllSkills.1=&a\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=&a\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 &c\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 &c\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=&a--\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07\u0e2d\u0e37\u0e48\u0e19\u0e46-- +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\u0e0a\u0e37\u0e48\u0e2d: &f{0} {1} -Commands.Party.ShareMode=&8\u0e42\u0e2b\u0e21\u0e14\u0e41\u0e1a\u0e48\u0e07\u0e1b\u0e31\u0e19: -Commands.Party.ItemShare=&7\u0e2a\u0e34\u0e48\u0e07\u0e02\u0e2d\u0e07 &3({0}) +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\u0e41\u0e1a\u0e48\u0e07\u0e1b\u0e31\u0e19\u0e2a\u0e34\u0e48\u0e07\u0e02\u0e2d\u0e07: &7&o{0} -Commands.Party.MembersNear=&8\u0e17\u0e35\u0e48\u0e2d\u0e22\u0e39\u0e48\u0e43\u0e01\u0e25\u0e49\u0e04\u0e38\u0e13 &3{0}&8/&3{1} -Commands.Party.Accept=- \u0e22\u0e34\u0e19\u0e22\u0e2d\u0e21\u0e04\u0e33\u0e40\u0e0a\u0e34\u0e0d -Commands.Party.Chat.Off=Party Chat &c\u0e16\u0e39\u0e01\u0e1b\u0e34\u0e14 -Commands.Party.Chat.On=Party Chat &a\u0e40\u0e1b\u0e34\u0e14 -Commands.Party.Commands=&a--\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07 PARTY-- -Commands.Party.Invite.0=ALERT: &a\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 &a/party accept&e \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=&7\u0e44\u0e14\u0e49\u0e40\u0e02\u0e49\u0e32\u0e23\u0e48\u0e27\u0e21 Party: {0} -Commands.Party.Create=&7\u0e2a\u0e23\u0e49\u0e32\u0e07 Party: {0} -Commands.Party.Rename=&7\u0e0a\u0e37\u0e48\u0e2d Party \u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e40\u0e1b\u0e47\u0e19: &f{0} -Commands.Party.SetSharing=&7Party {0} \u0e41\u0e1a\u0e48\u0e07\u0e1b\u0e31\u0e19\u0e16\u0e39\u0e01\u0e15\u0e31\u0e49\u0e07\u0e40\u0e1b\u0e47\u0e19: &3{1} -Commands.Party.ToggleShareCategory=&7Party \u0e41\u0e1a\u0e48\u0e07\u0e1b\u0e31\u0e19\u0e2a\u0e34\u0e48\u0e07\u0e02\u0e2d\u0e07\u0e43\u0e2b\u0e49 &6{0} &7\u0e44\u0e14\u0e49\u0e23\u0e31\u0e1a &3{1} -Commands.Party.AlreadyExists=&4Party {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=-----[]&a\u0e2a\u0e21\u0e32\u0e0a\u0e34\u0e01&c[]----- -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= &c- 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 &a\u0e16\u0e39\u0e01\u0e40\u0e1b\u0e34\u0e14 -Commands.ptp.Disabled=Party teleporting &c\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} &a\u0e15\u0e49\u0e2d\u0e07\u0e01\u0e32\u0e23 teleport \u0e21\u0e32\u0e2b\u0e32\u0e04\u0e38\u0e13. -Commands.ptp.Request2=&a\u0e40\u0e1e\u0e37\u0e48\u0e2d teleport \u0e43\u0e0a\u0e49 &e/ptp accept. &a\u0e20\u0e32\u0e22\u0e43\u0e19 &c{0} &a\u0e27\u0e34\u0e19\u0e32\u0e17\u0e35. -Commands.ptp.AcceptAny.Enabled=Party teleport &a\u0e16\u0e39\u0e01\u0e40\u0e1b\u0e34\u0e14 -Commands.ptp.AcceptAny.Disabled=Party teleport &c\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&9 \u0e23\u0e30\u0e14\u0e31\u0e1a\u0e1e\u0e25\u0e31\u0e07 &eLeaderboard-- -Commands.PowerLevel.Capped=&4\u0e23\u0e30\u0e14\u0e31\u0e1a\u0e1e\u0e25\u0e31\u0e07: &a{0} &4\u0e23\u0e30\u0e14\u0e31\u0e1a\u0e40\u0e15\u0e47\u0e21: &e{1} -Commands.PowerLevel=&4\u0e23\u0e30\u0e14\u0e31\u0e1a\u0e1e\u0e25\u0e31\u0e07: &a{0} -Commands.Reset.All=&a\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=&a\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.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=\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.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=&4\u0e2a\u0e34\u0e17\u0e18\u0e34\u0e4c\u0e44\u0e21\u0e48\u0e40\u0e1e\u0e35\u0e22\u0e07\u0e1e\u0e2d. -mcMMO.NoSkillNote=&8\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 &3{0} [password]. -Party.Help.1=\u0e2a\u0e23\u0e49\u0e32\u0e07 Party \u0e43\u0e2b\u0e21\u0e48\u0e43\u0e0a\u0e49 &3{0} [password]. -Party.Help.2=\u0e1b\u0e23\u0e36\u0e01\u0e29\u0e32 &3{0} &c\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 &3{0} [password] &c\u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e40\u0e02\u0e49\u0e32 &3{1} &c\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 &3{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 &3{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 &3{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 &3{0} -Party.Help.8=\u0e22\u0e01\u0e40\u0e25\u0e34\u0e01 Party \u0e43\u0e0a\u0e49 &3{0} -Party.Help.9=\u0e43\u0e0a\u0e49 &3{0} &c\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 &3{0} &c\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} &a\u0e44\u0e14\u0e49\u0e40\u0e02\u0e49\u0e32\u0e23\u0e48\u0e27\u0e21 Party \u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13 -Party.InformedOnQuit={0} &a\u0e44\u0e14\u0e49\u0e2d\u0e2d\u0e01\u0e08\u0e32\u0e01 Party \u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13 -Party.InformedOnNameChange=&6{0} &a\u0e44\u0e14\u0e49\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e0a\u0e37\u0e48\u0e2d Party \u0e40\u0e1b\u0e47\u0e19 &f{1} -Party.InvalidName=&4\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=&4{0} \u0e44\u0e21\u0e48\u0e44\u0e14\u0e49\u0e2d\u0e22\u0e39\u0e48\u0e43\u0e19 party \u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13 -Party.NotOwner=&4\u0e04\u0e38\u0e13\u0e44\u0e21\u0e48\u0e44\u0e14\u0e49\u0e40\u0e1b\u0e47\u0e19\u0e2b\u0e31\u0e27\u0e2b\u0e19\u0e49\u0e32 Party. -Party.Owner.New=&a{0} \u0e44\u0e14\u0e49\u0e40\u0e1b\u0e47\u0e19\u0e2b\u0e31\u0e27\u0e2b\u0e19\u0e49\u0e32 Party \u0e43\u0e2b\u0e21\u0e48. -Party.Owner.NotLeader=&4\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=&4\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=&a\u0e23\u0e2b\u0e31\u0e2a\u0e1c\u0e48\u0e32\u0e19 Party \u0e16\u0e39\u0e01\u0e15\u0e31\u0e49\u0e07\u0e40\u0e1b\u0e47\u0e19 {0} -Party.Password.Removed=&a\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=&4{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=&4{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=&a\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=&a{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=&7Party \u0e16\u0e39\u0e01\u0e1b\u0e25\u0e14\u0e25\u0e47\u0e2d\u0e01 -Party.Disband=&7Party \u0e16\u0e39\u0e01\u0e1b\u0e34\u0e14\u0e44\u0e27\u0e49 -Party.Status.Locked=&4(\u0e40\u0e0a\u0e34\u0e0d\u0e2d\u0e22\u0e48\u0e32\u0e07\u0e40\u0e14\u0e35\u0e22\u0e27) -Party.Status.Unlocked=&2(\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=&8EXP \u0e17\u0e35\u0e48\u0e44\u0e14\u0e49\u0e23\u0e31\u0e1a: &f{0} -Commands.xplock.locked=&6BAR EXP \u0e16\u0e39\u0e01\u0e1b\u0e14\u0e25\u0e47\u0e2d\u0e01 {0}! -Commands.xplock.unlocked=&6EXP BAR \u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13\u0e44\u0e14\u0e49\u0e16\u0e39\u0e01 &a\u0e1b\u0e25\u0e14\u0e25\u0e47\u0e2d\u0e01&6! -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=&6\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=&6mcMMO \u0e2d\u0e31\u0e15\u0e23\u0e32 EXP \u0e15\u0e2d\u0e19\u0e19\u0e35\u0e49 {0}x! -XPRate.Event=&6mcMMO \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=&8\u0e23\u0e30\u0e14\u0e31\u0e1a: &a{0} -Effects.Level=&8\u0e23\u0e30\u0e14\u0e31\u0e1a: &a{0} &3EXP&e(&6{1}&e/&6{2}&e) +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\u0e41\u0e19\u0e30\u0e19\u0e33 {0} \u0e04\u0e27\u0e23\u0e43\u0e0a\u0e49 - \u0e0a\u0e19\u0e34\u0e14 /{1} ? [\u0e2b\u0e19\u0e49\u0e32] -Guides.Header=&6-=&a{0} \u0e41\u0e19\u0e30\u0e19\u0e33&6=- -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 &e{0} -Inspect.Stats=&amcMMO \u0e2a\u0e16\u0e34\u0e15\u0e34\u0e02\u0e2d\u0e07 &e{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** +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=&7Teleports \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! &e({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. &e({0} \u0e27\u0e34\u0e19\u0e32\u0e17\u0e35) -Teleport.Commencing=&7\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07 teleport \u0e15\u0e49\u0e2d\u0e07\u0e23\u0e2d &6({0}) &7\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=&4Teleportation \u0e16\u0e39\u0e01\u0e22\u0e01\u0e40\u0e25\u0e34\u0e01! -Skills.Child=&6(\u0e17\u0e31\u0e01\u0e29\u0e30 CHILD) -Skills.Disarmed=&4\u0e04\u0e38\u0e13\u0e44\u0e14\u0e49\u0e1b\u0e25\u0e14\u0e25\u0e47\u0e2d\u0e01! +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\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 &7{0} +Skills.NeedMore=&4คุณต้องการข้อมูลเพิ่มเติม &7{0} Skills.Parents=PARENTS Skills.Stats={0}&a{1}&3 EXP(&7{2}&3/&7{3}&3) -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. &e({0}s) -Skills.Cancelled={0} \u0e16\u0e39\u0e01\u0e22\u0e01\u0e40\u0e25\u0e34\u0e01! -Skills.ConfirmOrCancel=&6-=&a{0} \u0e41\u0e19\u0e30\u0e19\u0e33&6=- -Stats.Header.Combat=&6-=\u0e17\u0e31\u0e01\u0e29\u0e30\u0e01\u0e32\u0e23\u0e15\u0e48\u0e2d\u0e2a\u0e39\u0e49=- -Stats.Header.Gathering=&6-=\u0e17\u0e31\u0e01\u0e29\u0e30 GATHERING=- -Stats.Header.Misc=&6-=\u0e17\u0e31\u0e01\u0e29\u0e30 MISC=- -Stats.Own.Stats=&a[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=&6 ({0} \u0e14\u0e49\u0e27\u0e22 Lucky Perk) +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=&6 ({0}\u0e27\u0e34\u0e19\u0e32\u0e17\u0e35 \u0e14\u0e49\u0e27\u0e22 Endurance Perk) -MOTD.Donate=&3\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25 Donation: -MOTD.Hardcore.DeathStatLoss.Stats=&6[mcMMO] &3\u0e17\u0e31\u0e01\u0e29\u0e30 Death Penalty: &4{0}% -MOTD.Hardcore.Vampirism.Stats=&6[mcMMO] &3\u0e16\u0e39\u0e01\u0e02\u0e42\u0e21\u0e22\u0e2a\u0e16\u0e34\u0e15\u0e34: &4{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=&6[mcMMO] \u0e43\u0e0a\u0e49 version &3{0} +MOTD.Version=&6[mcMMO] ใช้ version &3{0} MOTD.Website=&6[mcMMO] &a{0}&e - mcMMO Website -Smelting.Ability.FluxMining=Flux Mining \u0e42\u0e2d\u0e01\u0e32\u0e2a: &e{0} -Smelting.Ability.FuelEfficiency=Fuel Efficiency \u0e40\u0e1e\u0e34\u0e48\u0e21\u0e02\u0e36\u0e49\u0e19: &e{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: &e{0} -Smelting.Ability.VanillaXPBoost=Vanilla EXP \u0e40\u0e1e\u0e34\u0e48\u0e21\u0e02\u0e36\u0e49\u0e19: &e{0}x +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=&a\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 diff --git a/src/main/resources/locale/locale_zh_CN.properties b/src/main/resources/locale/locale_zh_CN.properties index 13ef26c48..fcb88284c 100644 --- a/src/main/resources/locale/locale_zh_CN.properties +++ b/src/main/resources/locale/locale_zh_CN.properties @@ -2,45 +2,45 @@ #不要在JSON关键字中使用颜色代码 #如果你想修改颜色请在advanced.yml中修改 -JSON.Rank=\u7b49\u7ea7 -JSON.DescriptionHeader=\u63cf\u8ff0 -JSON.JWrapper.Header=\u7ec6\u8282 -JSON.Type.Passive=\u88ab\u52a8 -JSON.Type.Active=\u4e3b\u52a8 -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=&6\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=&6[ mcMMO&e @&3{0} &6\u7b49\u7ea7 &3{1}&6 \u89e3\u9501! ] -JSON.Hover.Rank=&e&l\u7b49\u7ea7:&r &f{0} -JSON.Hover.NextRank=&7&o\u4e0b\u6b21\u5347\u7ea7\u7b49\u7ea7 {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=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\u672a\u77e5\u80fd\u529b +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 @@ -52,76 +52,76 @@ JSON.Hover.AtSymbolURL=&e@ JSON.Notification.SuperAbility={0} #这里是子技能使用的JSON字符串 -JSON.Acrobatics.Roll.Interaction.Activated=\u6d4b\u8bd5 &c\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=&c\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.Acrobatics.Roll.Interaction.Activated=测试 &c翻滚测试 +JSON.Acrobatics.SubSkill.Roll.Details.Tips=如果你在摔落时按下潜行键,你将触发两倍翻滚效果 +Anvil.SingleItemStack=&c你不能分解货修复有多个物品的物品堆, 请拆分后再使用. #不要在JSON关键字中使用颜色代码 #如果你想修改颜色请在advanced.yml中修改 mcMMO.Template.Prefix=&6(&amcMMO&6) # 开始风格化 -Ability.Generic.Refresh=&a**\u6280\u80fd\u51b7\u5374\u5b8c\u6bd5!** +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=\u6548\u679c -Effects.SubSkills.Overhaul=\u5b50\u6280\u80fd -Effects.Child.Overhaul=&3\u5b50\u7b49\u7ea7 Lv.&e {0}&3: {1} +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\u7b49\u7ea7: &e{0} &3XP&e(&6{1}&e/&6{2}&e) +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=\u7edf\u8ba1 -Commands.XPGain.Overhaul=&6\u7ecf\u9a8c\u6765\u6e90: &3{0} -MOTD.Version.Overhaul=&6[mcMMO] &3\u5927\u6539\u7248\u672c&6 - &3{0} -Overhaul.mcMMO.Header=&c[]=====[]&a mcMMO - \u5927\u6539\u7248\u672c &c[]=====[] +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\u5728WIKI\u4e0a\u67e5\u770b\u6b64\u6280\u80fd!&e] +Overhaul.mcMMO.MmoInfo.Wiki=&e[&f在WIKI上查看此技能!&e] # Overhaul.Levelup 可以使用下面的变量 {0} - 在Overhaul.Name中定义的技能名称 {1} - 获得的等级数 {2} - 现在的技能等级 -Overhaul.Levelup=&l{0} \u589e\u52a0\u5230 &r&a&l{2}&r&f. -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 +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 \u547d\u4ee4&c[]--- -Commands.Other=&c---[]&a\u5176\u4ed6\u547d\u4ee4&c[]--- -Commands.Party.Header=&c-----[]&a\u961f\u4f0d&c[]----- -Commands.Party.Features.Header=&c-----[]&a\u7279\u6027&c[]----- +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=&6\u6b63\u5728\u5b66\u4e60\u65b0\u6280\u80fd... -XPBar.Acrobatics=\u6742\u6280 Lv.&6{0} -XPBar.Alchemy=\u70bc\u91d1 Lv.&6{0} -XPBar.Archery=\u7bad\u672f Lv.&6{0} -XPBar.Axes=\u65a7\u6280 Lv.&6{0} -XPBar.Excavation=\u6316\u6398 Lv.&6{0} -XPBar.Fishing=\u9493\u9c7c Lv.&6{0} -XPBar.Herbalism=\u8349\u836f\u5b66 Lv.&6{0} -XPBar.Mining=\u6316\u77ff Lv.&6{0} -XPBar.Repair=\u4fee\u7406 Lv.&6{0} -XPBar.Salvage=\u5206\u89e3 Lv.&6{0} -XPBar.Smelting=\u51b6\u70bc Lv.&6{0} -XPBar.Swords=\u5251\u672f Lv.&6{0} -XPBar.Taming=\u9a6f\u517d Lv.&6{0} -XPBar.Unarmed=\u683c\u6597 Lv.&6{0} -XPBar.Woodcutting=\u4f10\u6728 Lv.&6{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} #这只是一个预设模板,如果在 Experience.yml 中打开了“ExtraDetails”设置(默认情况下关闭),则可以使用该模板,您可以忽略此模板,只需编辑上面的字符串 XPBar.Complex.Template={0} &3 {4}&f% &3(&f{1}&3/&f{2}&3) # 经验条可以使用以下变量 -- {0} = 技能等级, {1} 当前经验, {2} 到下一等级所需的经验, {3} 技能等级, {4} 当前等级的百分比 @@ -129,1016 +129,1016 @@ XPBar.Complex.Template={0} &3 {4}&f% &3(&f{1}&3/&f{2}&3) # 风格化结束 #杂技 -Acrobatics.Ability.Proc=&a**\u534e\u5c14\u5179\u822c\u7684\u964d\u843d** -Acrobatics.Combat.Proc=&a**\u95ea\u907f** -Acrobatics.SubSkill.Roll.Stats=&6\u7ffb\u6eda\u51e0\u7387 &e{0}%&6 \u4f18\u96c5\u7ffb\u6eda\u51e0\u7387&e {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: &e{0} -Acrobatics.SubSkill.Roll.GraceChance=\u4f18\u96c5\u7684\u7ffb\u6eda\u51e0\u7387: &e{0} -Acrobatics.SubSkill.Roll.Mechanics=&7\u7ffb\u6eda\u662f\u6742\u6280\u7684\u88ab\u52a8\u5b50\u6280\u80fd.\n\u5f53\u4f60\u53d7\u5230\u6454\u843d\u4f24\u5bb3\u65f6,\u4f1a\u6839\u636e\u4f60\u7684\u6742\u6280\u6280\u80fd\u7b49\u7ea7\u83b7\u5f97\u4e00\u5b9a\u51e0\u7387\u7684\u51cf\u4f24\u6216\u514d\u4f24, \u5728\u4f6050\u7ea7\u65f6\u4f60\u6709 &e{0}%&7 \u7684\u51e0\u7387\u83b7\u5f97\u51cf\u4f24\u6216\u514d\u4f24, \u5982\u679c\u4f60\u6fc0\u6d3b\u4f18\u96c5\u7684\u7ffb\u6eda\u5219\u6709 &e{1}%&7 \u7684\u51e0\u7387\u89e6\u53d1\u53cc\u500d\u7ffb\u6eda\u6548\u679c\uff0c.\n\u89e6\u53d1\u7684\u51e0\u7387\u4f1a\u6309\u7167\u4f60\u6280\u80fd\u7b49\u7ea7\u7ebf\u6027\u589e\u957f,\u76f4\u5230 &e{2}&7 \u7ea7, \u6bcf\u4e00\u7ea7\u7684\u6742\u6280\u7b49\u7ea7\u63d0\u4f9b &e{3}%&7 \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\u5c11 &c{4}&7 \u4f24\u5bb3. \u4f18\u96c5\u7ffb\u6eda\u6700\u591a\u51cf\u5c11 &a{5}&7 \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=&o**\u95ea\u907f** -Acrobatics.SkillName=\u6742\u6280 +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=\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: &a{0}&3/&a{1} -Alchemy.SubSkill.Concoctions.Stat.Extra=\u914d\u65b9 [&a{0}&3]: &a{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 +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 +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=\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=&7\u4f60\u653e\u4e0b\u4e86\u4f60\u7684\u65a7\u5b50. -Axes.Ability.Ready=&3\u4f60 &6\u63e1\u7d27&3 \u4e86\u4f60\u7684\u65a7\u5b50. -Axes.Ability.Ready.Extra=&3\u4f60 &6\u63e1\u7d27&3 \u4e86\u4f60\u7684\u65a7\u5b50. &7({0} \u6b63\u5728\u51b7\u5374\u4e2d {1}s) -Axes.Combat.CritStruck=&4\u4f60\u6253\u51fa\u4e86\u66b4\u51fb! -Axes.Combat.CriticalHit=\u66b4\u51fb! -Axes.Combat.GI.Proc=&a**\u5de8\u529b\u6253\u51fb** -Axes.Combat.GI.Struck=**\u88ab\u5f3a\u70c8\u51b2\u51fb\u51fb\u4e2d** -Axes.Combat.SS.Struck=&4\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=&a**\u65a9\u9996\u8005\u6280\u80fd\u542f\u52a8** -Axes.Skills.SS.Refresh=&a\u4f60\u7684 &e\u65a9\u9996\u8005 &a\u6280\u80fd\u53ef\u4ee5\u4f7f\u7528\u4e86! -Axes.Skills.SS.Other.Off=\u65a9\u9996\u8005&a \u7ed3\u675f\u4e86,\u8fdb\u5165\u51b7\u5374 &e{0} -Axes.Skills.SS.Other.On=&a{0}&2\u4f7f\u7528\u4e86 &c\u65a9\u9996\u8005! +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\u4f60\u653e\u4e0b\u4e86\u4f60\u7684\u94f2\u5b50. -Excavation.Ability.Ready=&3\u4f60 &6\u63e1\u7d27&3 \u4e86\u4f60\u7684\u94f2\u5b50. -Excavation.SubSkill.GigaDrillBreaker.Name=\u66b4\u8d70\u94bb\u5934 -Excavation.SubSkill.GigaDrillBreaker.Description=\u4e09\u500d\u6389\u843d, \u4e09\u500d\u7ecf\u9a8c, \u6316\u6398\u901f\u5ea6\u63d0\u5347 -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=&a**\u66b4\u8d70\u94bb\u5934\u6fc0\u6d3b** -Excavation.Skills.GigaDrillBreaker.Refresh=&a\u4f60\u7684 &e\u66b4\u8d70\u94bb\u5934 &a\u6280\u80fd\u53ef\u4ee5\u4f7f\u7528\u4e86! -Excavation.Skills.GigaDrillBreaker.Other.Off=\u66b4\u8d70\u94bb\u5934&a \u7ed3\u675f\u4e86,\u8fdb\u5165\u51b7\u5374 &e{0} -Excavation.Skills.GigaDrillBreaker.Other.On=&a{0}&2 \u4f7f\u7528\u4e86 &c\u66b4\u8d70\u94bb\u5934! +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\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=&7&o\u4e71\u52a8\u4f1a\u5413\u8dd1\u9c7c! -Fishing.Exhausting=&c&o\u4e0d\u6b63\u5f53\u4f7f\u7528\u9c7c\u7aff\u4f1a\u52a0\u5267\u8010\u4e45\u7684\u635f\u8017! -Fishing.LowResources=&7\u4f60\u89c9\u5f97\u8fd9\u5757\u533a\u57df\u4f3c\u4e4e\u6ca1\u6709\u591a\u5c11\u9c7c\u4e86. -Fishing.Ability.Info=\u9b54\u6cd5\u730e\u4eba: &7 **\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: &a{0}&3/&a{1} -Fishing.SubSkill.TreasureHunter.Stat.Extra=\u6389\u843d\u7387: &7\u4e00\u822c: &e{0} &a\u666e\u901a: &e{1}\n&9\u7a00\u6709: &e{2} &d\u7f55\u89c1: &e{3} &6\u53f2\u8bd7: &e{4} &b\u795e\u8bdd: &e{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:&a \u7b49\u7ea7 {0} -Fishing.SubSkill.MasterAngler.Name=\u9493\u9c7c\u5927\u5e08 -Fishing.SubSkill.MasterAngler.Description=\u9493\u9c7c\u7684\u6548\u7387\u63d0\u5347\u002c\u5982\u679c\u5728\u8239\u4e0a\u9493\u9c7c\u6548\u679c\u4f1a\u66f4\u597d -Fishing.SubSkill.MasterAngler.Stat=\u9493\u9c7c\u7684\u6700\u77ed\u7b49\u5f85\u65f6\u95f4\u51cf\u5c11: &a{0} \u79d2 -Fishing.SubSkill.MasterAngler.Stat.Extra=\u9493\u9c7c\u6700\u957f\u7b49\u5f85\u65f6\u95f4\u51cf\u5c11: &a{0} \u79d2 -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=&9 \u5927\u91cf\u5956\u52b1 -Fishing.Listener=\u9493\u9c7c: -Fishing.Ability.TH.MagicFound=&7\u4f60\u611f\u5230\u4e00\u80a1\u9b54\u529b\u7684\u6ce2\u52a8... -Fishing.Ability.TH.Boom=&7\u7e41\u8363\u65f6\u671f!!! -Fishing.Ability.TH.Poison=&7\u6709\u4ec0\u4e48\u4e1c\u897f\u95fb\u7740\u4e0d\u592a\u5bf9\u52b2... -Fishing.SkillName=\u9493\u9c7c +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=\u4f60\u9700\u8981\u66f4\u591a\u79cd\u5b50\u4f7f\u7528\u56ed\u827a\u5927\u5e08. -Herbalism.Ability.GTh.Fail=**\u7eff\u5316\u5931\u8d25** -Herbalism.Ability.GTh=&a**\u7eff\u5316** -Herbalism.Ability.Lower=&7\u4f60\u653e\u4e0b\u4e86\u4f60\u7684\u9504\u5934. -Herbalism.Ability.Ready=&3\u4f60 &6\u6311\u8d77&3 \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=\u56ed\u827a\u5927\u5e08 -Herbalism.SubSkill.GreenThumb.Description=\u6536\u83b7\u65f6\u81ea\u52a8\u64ad\u79cd\u79cd\u5b50 -Herbalism.SubSkill.GreenThumb.Stat=\u56ed\u827a\u5927\u5e08\u89e6\u53d1\u51e0\u7387 -Herbalism.SubSkill.GreenThumb.Stat.Extra=\u56ed\u827a\u5927\u5e08\u9636\u6bb5: &a \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: &a\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=&a\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=&a**\u571f\u795e\u5e87\u4f51\u6fc0\u6d3b** -Herbalism.Skills.GTe.Refresh=&a\u4f60\u7684 &e\u571f\u795e\u5e87\u4f51 &a\u6280\u80fd\u53ef\u4ee5\u4f7f\u7528\u4e86\uff01 -Herbalism.Skills.GTe.Other.Off=\u571f\u795e\u5e87\u4f51&a \u7ed3\u675f\u4e86,\u8fdb\u5165\u51b7\u5374 &e{0} -Herbalism.Skills.GTe.Other.On=&a{0}&2 \u4f7f\u7528\u4e86 &c\u571f\u795e\u5e87\u4f51! +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=\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=&7\u4f60\u653e\u4e0b\u4e86\u4f60\u7684\u9550\u5b50. -Mining.Ability.Ready=&3\u4f60 &6\u62ff\u8d77&3 \u4e86\u4f60\u7684\u9550\u5b50. -Mining.SubSkill.SuperBreaker.Name=\u8d85\u7ea7\u788e\u77f3\u673a -Mining.SubSkill.SuperBreaker.Description=\u4e09\u500d\u6389\u843d, \u6316\u77ff\u901f\u5ea6\u63d0\u5347 -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: &e{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:&a \u7b49\u7ea7 {0}/{1} &7({2}) -Mining.SubSkill.BlastMining.Stat.Extra=\u7206\u7834\u534a\u5f84\u52a0\u6210: &a+{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 +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=&a**\u8d85\u7ea7\u788e\u77f3\u673a\u6fc0\u6d3b** -Mining.Skills.SuperBreaker.Other.Off=\u8d85\u7ea7\u788e\u77f3\u673a &a \u7ed3\u675f\u4e86,\u8fdb\u5165\u51b7\u5374 &e{0} -Mining.Skills.SuperBreaker.Other.On=&a{0}&2 \u4f7f\u7528\u4e86 &c\u8d85\u7ea7\u788e\u77f3\u673a! -Mining.Skills.SuperBreaker.Refresh=&a\u4f60\u7684 &e\u8d85\u7ea7\u788e\u77f3\u673a &a\u6280\u80fd\u53ef\u4ee5\u4f7f\u7528\u4e86\uff01 +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**\u5623** +Mining.Blast.Boom=&7**嘣** Mining.Blast.Cooldown= -Mining.Blast.Effect=\u589e\u52a0 {0} \u77ff\u7269\u91cf, {1} \u500d\u6389\u843d -Mining.Blast.Other.On=&a{0}&2 \u4f7f\u7528\u4e86 &c\u7206\u7834\u5f00\u91c7! -Mining.Blast.Refresh=&a\u4f60\u7684 &e\u7206\u7834\u5f00\u91c7 &a\u6280\u80fd\u53ef\u4ee5\u4f7f\u7528\u4e86! +Mining.Blast.Effect=增加 {0} 矿物量, {1} 倍掉落 +Mining.Blast.Other.On=&a{0}&2 使用了 &c爆破开采! +Mining.Blast.Refresh=&a你的 &e爆破开采 &a技能可以使用了! #修理 -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: &a\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: &e\u7b49\u7ea7 {0}/{1} -Repair.SubSkill.ArcaneForging.Stat.Extra=&3\u79d8\u6cd5\u953b\u9020\u8d54\u7387:&7 \u6210\u529f &a{0}&7%, \u5931\u8d25 &c{1}&7% -Repair.Error=&4mcMMO \u5728\u5c1d\u8bd5\u4fee\u7406\u6b64\u7269\u54c1\u65f6\u53d1\u751f\u4e86\u9519\u8bef! -Repair.Listener.Anvil=&4\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=&4\u4f60\u7684\u6280\u80fd\u7b49\u7ea7\u4e0d\u8db3\u4ee5\u4fee\u7406\u94bb\u77f3\u88c5\u5907. -Repair.Skills.AdeptGold=&4\u4f60\u7684\u6280\u80fd\u7b49\u7ea7\u4e0d\u8db3\u4ee5\u4fee\u7406\u9ec4\u91d1\u88c5\u5907. -Repair.Skills.AdeptIron=&4\u4f60\u7684\u6280\u80fd\u4e0d\u8db3\u4ee5\u4fee\u590d\u94c1\u8d28\u88c5\u5907. -Repair.Skills.AdeptStone=&4\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 &e{0}&c \u624d\u80fd\u4fee\u7406 &e{1} -Repair.Skills.FeltEasy=&7\u90a3\u770b\u8d77\u6765\u5f88\u7b80\u5355. -Repair.Skills.FullDurability=&7\u4f60\u7684\u88c5\u5907\u5df2\u7ecf\u6ee1\u8010\u4e45\u5ea6\u4e86 -Repair.Skills.StackedItems=&4\u4f60\u65e0\u6cd5\u4fee\u7406\u5df2\u53e0\u52a0\u7684\u7269\u54c1. -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=&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=\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=&a\u4f60\u6210\u529f\u5730\u4fdd\u7559\u4e86\u8fd9\u4ef6\u7269\u54c1\u7684\u9644\u9b54. +Repair.Arcane.Downgrade=这件物品的附魔等级已下降. +Repair.Arcane.Fail=这件物品的附魔已消失. +Repair.Arcane.Lost=你的技能等级不足以保留附魔属性. +Repair.Arcane.Perfect=&a你成功地保留了这件物品的附魔. #分解 -Salvage.Pretty.Name=\u5206\u89e3 -Salvage.SubSkill.UnderstandingTheArt.Name=\u5206\u89e3\u7cbe\u901a -Salvage.SubSkill.UnderstandingTheArt.Description=\u4f60\u4e0d\u4ec5\u4ec5\u662f\u5728\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, \u80fd\u5426\u5b8c\u7f8e\u5206\u89e3\u53d6\u51b3\u4e8e\u6280\u80fd\u7b49\u7ea7\u548c\u8fd0\u6c14. -Salvage.SubSkill.ScrapCollector.Stat=\u5e9f\u6599\u56de\u6536: &a\u6700\u591a\u5206\u89e3\u51fa &e{0}&a \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: &e\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=&7\u5b8c\u5168\u62c6\u89e3\u51fa\u9644\u9b54\u51e0\u7387 -Salvage.Arcane.ExtractPartial=&7\u90e8\u5206\u62c6\u89e3\u51fa\u9644\u9b54\u51e0\u7387 -Salvage.Skills.Success=&a\u7269\u54c1\u5df2\u5206\u89e3\uff01 -Salvage.Skills.Adept.Damaged=&4\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 &e{0}&c \u7ea7\u624d\u80fd\u5206\u89e3 &e{1} -Salvage.Skills.TooDamaged=&4\u8be5\u7269\u54c1\u635f\u574f\u8fc7\u4e8e\u4e25\u91cd\uff0c\u65e0\u6cd5\u5206\u89e3. -Salvage.Skills.ArcaneFailed=&c\u60a8\u65e0\u6cd5\u62c6\u89e3\u51fa\u672c\u7269\u54c1\u6240\u8574\u542b\u7684\u77e5\u8bc6. -Salvage.Skills.ArcanePartial=&c\u60a8\u53ea\u80fd\u62c6\u89e3\u51fa\u672c\u7269\u54c1\u6240\u8574\u542b\u7684\u90e8\u5206\u77e5\u8bc6. -Salvage.Skills.ArcaneSuccess=&a\u60a8\u80fd\u591f\u5b8c\u5168\u62c6\u89e3\u51fa\u672c\u7269\u54c1\u6240\u542b\u7684\u77e5\u8bc6! -Salvage.Listener.Anvil=&4\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 +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=\u8fd9\u4e2a\u7269\u54c1\u4e0d\u4f1a\u635f\u574f! +Anvil.Unbreakable=这个物品不会损坏! # 剑术 -Swords.Ability.Lower=&7\u4f60\u653e\u4e0b\u4e86\u4f60\u7684\u5251. -Swords.Ability.Ready=&3\u4f60 &6\u63e1\u7d27&3 \u4e86\u4f60\u7684\u5251. -Swords.Combat.Rupture.Note=&7\u6ce8\u91ca: &e1 Tick \u7b49\u4ef7\u4e8e 0.5 \u79d2! -Swords.Combat.Bleeding.Started=&4 \u4f60\u5728\u6d41\u8840! -Swords.Combat.Bleeding.Stopped=&7\u6d41\u8840 &a\u5df2\u505c\u6b62&7! -Swords.Combat.Bleeding=&a**\u654c\u4eba\u6b63\u5728\u4e0d\u65ad\u6d41\u8840** -Swords.Combat.Counter.Hit=&4\u4f60\u53cd\u51fb\u4e86\u5bf9\u624b! -Swords.Combat.Countered=&a**\u53cd\u51fb\u4e86\u654c\u4eba** -Swords.Combat.SS.Struck=&4\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=[[DARK_AQUA]]\u6495\u88c2: &a{0} tick \u65f6\u95f4 [\u5bf9\u73a9\u5bb6\u9020\u6210 {1} \u4f24\u5bb3] [\u5bf9\u602a\u7269\u9020\u6210 {2} \u4f24\u5bb3] -Swords.SubSkill.Rupture.Stat.TickDamage=[[DARK_AQUA]]\u6495\u88c2\u6bcf\u9020\u6210\u7684\u7eaf\u4f24\u5bb3: &e{0}&a \u5bf9\u73a9\u5bb6, &e{1}&a \u5bf9\u602a\u7269. -Swords.SubSkill.Rupture.Stat.ExplosionDamage=[[DARK_AQUA]]\u7206\u70b8\u4f24\u5bb3: &e{0}&a \u5bf9\u73a9\u5bb6, &e{1}&a \u5bf9\u602a\u7269. -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=&a**\u5229\u5203\u7a81\u523a\u6fc0\u6d3b** -Swords.Skills.SS.Refresh=&a\u4f60\u7684 &e\u5229\u5203\u7a81\u523a &a\u6280\u80fd\u53ef\u4ee5\u4f7f\u7528\u4e86! -Swords.Skills.SS.Other.Off=\u5229\u5203\u7a81\u523a&a \u7ed3\u675f\u4e86,\u8fdb\u5165\u51b7\u5374 &e{0} -Swords.Skills.SS.Other.On=&a{0}&2 \u4f7f\u7528\u4e86 &c\u5229\u5203\u7a81\u523a! +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=\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 (\u5feb\u9910\u670d\u52a1) -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=&7\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=&8\u4f60\u7684\u72fc\u8dd1\u5230\u4f60\u8eab\u8fb9... -Taming.Listener=\u9a6f\u517d(Taming): -Taming.SkillName=\u9a6f\u517d -Taming.Summon.COTW.Success.WithoutLifespan=&a(\u91ce\u6027\u7684\u53ec\u5524) &7\u4f60\u5df2\u7ecf\u53ec\u5524\u4e86\u4e00\u4e2a &6{0}&7 -Taming.Summon.COTW.Success.WithLifespan=&a(\u91ce\u6027\u7684\u53ec\u5524) &7\u4f60\u5df2\u7ecf\u53ec\u5524\u4e86\u4e00\u4e2a &6{0}&7 \u5b83\u7684\u6301\u7eed\u65f6\u95f4\u4e3a &6{1}&7 \u79d2. -Taming.Summon.COTW.Limit=&a(\u91ce\u6027\u7684\u53ec\u5524) &7\u4f60\u53ea\u80fd\u540c\u65f6 &c{0} &7\u53ec\u5524 &7{1} \u53ea\u5ba0\u7269 -Taming.Summon.COTW.TimeExpired=&a(\u91ce\u6027\u7684\u53ec\u5524) &7\u65f6\u95f4\u5230,\u4f60\u7684 &6{0}&7 \u79bb\u5f00. -Taming.Summon.COTW.Removed=&a(\u91ce\u6027\u7684\u53ec\u5524) &7\u4f60\u53ec\u5524\u7684 &6{0}&7 \u5df2\u7ecf\u4ece\u8fd9\u4e2a\u4e16\u754c\u4e0a\u6d88\u5931\u4e86. -Taming.Summon.COTW.BreedingDisallowed=&a(\u91ce\u6027\u7684\u53ec\u5524) &c\u4f60\u4e0d\u80fd\u7e41\u6b96\u88ab\u53ec\u5524\u7684\u52a8\u7269. -Taming.Summon.COTW.NeedMoreItems=&a(\u91ce\u6027\u7684\u53ec\u5524) &7\u4f60\u9700\u8981 &e{0}&7 \u66f4\u591a\u7684 &3{1}&7(s) -Taming.Summon.Name.Format={0} \u7684 {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=&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=\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=&a\u4f60\u7684\u8d85\u5f3a\u63e1\u529b\u62b5\u6321\u4f4f\u4e86\u5bf9\u65b9\u7684\u7f34\u68b0\u653b\u51fb! -Unarmed.Ability.Lower=&7\u4f60\u677e\u5f00\u4e86\u4f60\u7684\u62f3\u5934. -Unarmed.Ability.Ready=&3\u4f60 &6\u63e1\u7d27&3 \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=&a**\u72c2\u66b4\u6fc0\u6d3b** -Unarmed.Skills.Berserk.Other.Off=\u72c2\u66b4&a \u7ed3\u675f\u4e86,\u8fdb\u5165\u51b7\u5374 &e{0} -Unarmed.Skills.Berserk.Other.On=&a{0}&2 \u4f7f\u7528\u4e86 &c\u72c2\u66b4! -Unarmed.Skills.Berserk.Refresh=&a\u4f60\u7684 &e\u72c2\u66b4 &a\u6280\u80fd\u53ef\u4ee5\u4f7f\u7528\u4e86! +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=\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.KnockOnWood.Name=\u8d70\u8fd0 -Woodcutting.SubSkill.KnockOnWood.Description=\u4f7f\u7528\u4f10\u6728\u673a\u65f6\u53d1\u73b0\u66f4\u591a\u597d\u4e1c\u897f -Woodcutting.SubSkill.KnockOnWood.Stat=\u8d70\u8fd0 -Woodcutting.SubSkill.KnockOnWood.Loot.Normal=\u4ece\u6811\u4e0a\u83b7\u53d6\u4e86\u6b63\u5e38\u7684\u7269\u54c1 -Woodcutting.SubSkill.KnockOnWood.Loot.Rank2=\u4ece\u6811\u4e0a\u83b7\u53d6\u4e86\u6b63\u5e38\u7684\u7269\u54c1\u548c\u7ecf\u9a8c\u7403 -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=&a**\u4f10\u6728\u5de5\u6fc0\u6d3b** -Woodcutting.Skills.TreeFeller.Refresh=&a\u4f60\u7684 &e\u4f10\u6728\u5de5 &a\u6280\u80fd\u53ef\u4ee5\u4f7f\u7528\u4e86! -Woodcutting.Skills.TreeFeller.Other.Off=\u4f10\u6728\u6280\u80fd &a \u7ed3\u675f\u4e86,\u8fdb\u5165\u51b7\u5374 &e{0} -Woodcutting.Skills.TreeFeller.Other.On=&a{0}&2 \u4f7f\u7528\u4e86 &c\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! +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.ArrowDeflect=&f**\u7bad\u77e2\u504f\u5411** -Combat.BeastLore=&a**\u9a6f\u517d\u77e5\u8bc6** -Combat.BeastLoreHealth=&3\u751f\u547d\u503c (&a{0}&3/{1}) -Combat.BeastLoreOwner=&3\u62e5\u6709\u8005 (&c{0}&3) -Combat.BeastLoreHorseSpeed=&3\u9a6c\u5339\u79fb\u901f (&a{0} \u683c/\u79d2&3) -Combat.BeastLoreHorseJumpStrength=&3\u9a6c\u5339\u8df3\u8dc3\u9ad8\u5ea6 (&a\u6700\u9ad8 {0} \u683c&3) -Combat.Gore=&a**\u76ee\u6807\u88ab\u653e\u8840** -Combat.StruckByGore=**\u4f60\u88ab\u653e\u8840\u4e86** -Combat.TargetDazed=\u76ee\u6807\u88ab &4\u88ab\u51fb\u6655 -Combat.TouchedFuzzy=&4\u5934\u6655\u76ee\u7729 +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\u5173\u4e8e &emcMMO&3:,&6mcMMO \u662f\u4e00\u4e2a &c\u5f00\u6e90&6 RPG mod \u521b\u5efa\u4e8e2011\u5e742\u6708,&6by &9nossr50&6. \u76ee\u6807\u4e3a\u73a9\u5bb6\u63d0\u4f9b\u4e00\u4e2a\u9ad8\u8d28\u91cf\u7684RPG\u4f53\u9a8c.,&3\u63d0\u793a:,&6 - &a\u4f7f\u7528 &c/mcmmo help&a \u67e5\u770b\u6307\u4ee4,&6 - &a\u8f93\u5165 &c/\u6280\u80fd\u540d&a \u67e5\u770b\u8be6\u7ec6\u7684\u6280\u80fd\u4fe1\u606f,&3\u5f00\u53d1\u8005:,&6 - &anossr50 &9(\u521b\u59cb\u4eba & \u9879\u76ee\u8d1f\u8d23\u4eba),&6 - &aGJ &9(\u9879\u76ee\u7ec4\u957f),&6 - &aNuclearW &9(\u5f00\u53d1\u8005),&6 - &abm01 &9(\u5f00\u53d1\u8005),&6 - &aTfT_02 &9(\u5f00\u53d1\u8005),&6 - &aGlitchfinder &9(\u5f00\u53d1\u8005),&6 - &at00thpick1 &9(\u5f00\u53d1\u8005)&6,&3\u7ffb\u8bd1\u4f5c\u8005:,&6 - &aFu_Meng/GhostDC,&3\u6709\u7528\u94fe\u63a5:,&6 - &ahttps://github.com/mcMMO-Dev/mcMMO/issues&6 Bug \u62a5\u544a,&6 - &ahttps://discord.gg/EJGVanb &6 \u5b98\u65b9 Discord -mcMMO.Description.FormerDevs=&3\u524d\u5f00\u53d1\u8005: &aGJ, 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=&a\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=&a\u4f60\u6240\u6709\u7684\u6280\u80fd\u83b7\u5f97 {0} \u7ecf\u9a8c! -Commands.addxp.AwardSkill=&a\u4f60\u7684 {0} \u6280\u80fd\u83b7\u5f97\u4e86 {1} \u7ecf\u9a8c! -Commands.Ability.Off=\u80fd\u529b\u4f7f\u7528\u5207\u6362 &c\u5173\u95ed -Commands.Ability.On=\u80fd\u529b\u4f7f\u7528\u5207\u6362 &a\u5f00\u542f -Commands.Ability.Toggle=\u80fd\u529b\u4f7f\u7528\u5df2\u5207\u6362\u4e3a &e{0} -Commands.AdminChat.Off=\u4ec5\u7ba1\u7406\u804a\u5929\u6a21\u5f0f &c\u5173\u95ed -Commands.AdminChat.On=\u4ec5\u7ba1\u7406\u804a\u5929\u6a21\u5f0f &a\u5f00\u542f -Commands.AdminToggle=&a- \u5207\u6362\u7ba1\u7406\u5458\u804a\u5929 -Commands.Chat.Console=*\u63a7\u5236\u53f0* -Commands.Cooldowns.Header=&6--= &amcMMO \u80fd\u529b\u51b7\u5374&6 =-- -Commands.Cooldowns.Row.N=\ &c{0}&f - \u5269\u4f59 &6{1} &f\u79d2 -Commands.Cooldowns.Row.Y=\ &b{0}&f - &2\u51c6\u5907\u5c31\u7eea! -Commands.Database.CooldownMS=\u4f60\u5fc5\u987b\u7b49\u5f85 {0} \u6beb\u79d2\u540e\u624d\u80fd\u518d\u6b21\u4f7f\u7528\u8fd9\u4e2a\u547d\u4ee4. -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= &c\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&e {0} -Commands.AdminChatSpy.Chat=&6[\u76d1\u89c6: &a{0}&6] &f{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 &e{0} -Commands.Healthbars.Changed.HEARTS=[mcMMO] \u4f60\u7684\u8840\u6761\u663e\u793a\u7c7b\u578b\u5df2\u66f4\u6539\u4e3a &c\u5fc3\u5f62&f. -Commands.Healthbars.Changed.BAR=[mcMMO] \u4f60\u7684\u8840\u6761\u663e\u793a\u7c7b\u578b\u5df2\u66f4\u6539\u4e3a &c\u65b9\u5f62&f. -Commands.Healthbars.Changed.DISABLED=[mcMMO] \u4f60\u7684\u602a\u7269\u8840\u6761\u663e\u793a\u5df2\u88ab &7\u7981\u7528&f. -Commands.Healthbars.Invalid=\u65e0\u6548\u7684\u8840\u6761\u7c7b\u578b! -Commands.Inspect= &a- \u67e5\u770b\u73a9\u5bb6\u8be6\u7ec6\u4fe1\u606f -Commands.Invite.Success=&a\u9080\u8bf7\u5df2\u6210\u529f\u53d1\u9001. -Commands.Leaderboards= &a- \u6392\u884c\u699c -Commands.mcgod=&a- \u5207\u6362\u4e0a\u5e1d\u6a21\u5f0f -Commands.mchud.Invalid=\u8fd9\u4e0d\u662f\u6709\u6548\u7684 HUD \u7c7b\u578b. -Commands.mcpurge.Success=&a\u6570\u636e\u5e93\u5df2\u6210\u529f\u6e05\u9664! -Commands.mcrank.Heading=&6-=\u4e2a\u4eba\u6392\u540d=- -Commands.mcrank.Overall=\u7efc\u5408&a - &6\u6392\u540d &f#&a{0} -Commands.mcrank.Player=&f{0} &e\u7684\u6392\u540d -Commands.mcrank.Skill=&e{0}&a - &6\u6392\u540d &f#&a{1} -Commands.mcrank.Unranked=&f\u65e0\u6392\u540d -Commands.mcrefresh.Success={0} \u7684\u51b7\u5374\u65f6\u95f4\u5df2\u5237\u65b0 -Commands.mcremove.Success=&a{0} \u4e00\u4ece\u6570\u636e\u5e93\u4e2d\u5220\u9664! -Commands.mctop.Tip=&6\u63d0\u793a: \u4f7f\u7528 &c/mcrank&6 \u6765\u67e5\u770b\u4f60\u6240\u6709\u7684\u4e2a\u4eba\u6392\u540d! -Commands.mmoedit=[player] &a - \u7f16\u8f91\u76ee\u6807 -Commands.mmoedit.AllSkills.1=&a\u4f60\u6240\u6709\u7684\u6280\u80fd\u7b49\u7ea7\u88ab\u8bbe\u7f6e\u4e3a {0} \u7ea7! -Commands.mmoedit.Modified.1=&a\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=&7\u5f00\u59cb\u4ece{0}\u8f6c\u6362\u81f3{1}... -Commands.mcconvert.Database.Finish=&7\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 &a{0} -Commands.mcconvert.Experience.Invalid=\u9519\u8bef\u7684\u516c\u5f0f\u7c7b\u578b! \u6709\u6548\u7c7b\u578b\u4e3a: &a\u7ebf\u6027 &c\u548c &a\u6307\u6570. -Commands.mcconvert.Experience.Same=\u6b63\u5728\u4f7f\u7528\u516c\u5f0f{0} -Commands.mcconvert.Experience.Start=&7\u5f00\u59cb\u4ece{0}\u8f6c\u6362\u5230{1}\u66f2\u7ebf -Commands.mcconvert.Experience.Finish=&7\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 &c\u5173\u95ed -Commands.Notifications.On=\u6280\u80fd\u63d0\u793a &a\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=&8\u540d\u5b57: &f{0} {1} &8\u7b49\u7ea7: &3{2} -Commands.Party.Status.Alliance=&8\u540c\u76df: &f{0} -Commands.Party.UnlockedFeatures=&8\u5df2\u89e3\u9501\u529f\u80fd: &7&o{0} -Commands.Party.ShareMode=&8\u5171\u4eab\u6a21\u5f0f: -Commands.Party.ItemShare=&7\u7269\u54c1 &3({0}) -Commands.Party.ExpShare=&7\u7ecf\u9a8c &3({0}) -Commands.Party.ItemShareCategories=&8\u7269\u54c1\u5206\u914d: &7&o{0} -Commands.Party.MembersNear=&8\u4f60\u9644\u8fd1 &3{0}&8/&3{1} -Commands.Party.Accept=&a- \u63a5\u53d7\u961f\u4f0d\u9080\u8bf7 -Commands.Party.Chat.Off=\u53ea\u5141\u8bb8\u961f\u4f0d\u804a\u5929 &c\u5173\u95ed -Commands.Party.Chat.On=\u53ea\u5141\u8bb8\u961f\u4f0d\u804a\u5929 &a\u5f00\u542f -Commands.Party.Commands=&c---[]&a\u961f\u4f0d\u547d\u4ee4&c[]--- -Commands.Party.Invite.0=&c\u6ce8\u610f: &a\u4f60\u6536\u5230\u4e86\u4e00\u4e2a\u7ec4\u961f\u9080\u8bf7 {0} \u6765\u81ea {1} -Commands.Party.Invite.1=&e\u8f93\u5165 &a/party accept&e \u6765\u63a5\u53d7\u9080\u8bf7 -Commands.Party.Invite=&a- \u53d1\u9001\u7ec4\u961f\u9080\u8bf7 -Commands.Party.Invite.Accepted=&a\u5df2\u63a5\u53d7\u7ec4\u961f\u9080\u8bf7\u3002\u60a8\u5df2\u7ecf\u52a0\u5165\u961f\u4f0d {0} -Commands.Party.Join=&7\u52a0\u5165\u7684\u961f\u4f0d: {0} -Commands.Party.PartyFull=&6{0}&c \u5df2\u6ee1! -Commands.Party.PartyFull.Invite=\u4f60\u4e0d\u80fd\u9080\u8bf7 &e{0}&c \u5230 &a{1}&c \u56e0\u4e3a\u961f\u4f0d\u5df2\u7ecf\u6709 &3{2}&c \u4e2a\u73a9\u5bb6\u4e86! -Commands.Party.PartyFull.InviteAccept=\u4f60\u4e0d\u80fd\u52a0\u5165\u961f\u4f0d &a{0}&c \u56e0\u4e3a\u961f\u4f0d\u5df2\u7ecf\u6709 &3{1}&c \u4e2a\u73a9\u5bb6\u4e86! -Commands.Party.Create=&7\u5df2\u521b\u5efa\u961f\u4f0d: {0} -Commands.Party.Rename=&7\u961f\u4f0d\u540d\u53d8\u66f4\u4e3a: &f{0} -Commands.Party.SetSharing=&7\u961f\u4f0d {0} \u5171\u4eab\u8bbe\u7f6e\u4e3a: &3{1} -Commands.Party.ToggleShareCategory=&7\u961f\u4f0d\u7269\u54c1\u5206\u914d\u7531 &6{0} &7 \u53d8\u4e3a &3{1} -Commands.Party.AlreadyExists=&4\u961f\u4f0d {0} \u5df2\u5b58\u5728! -Commands.Party.Kick=&c\u4f60\u5df2\u88ab &a{0}&c &c\u8e22\u51fa!! -Commands.Party.Leave=&e\u4f60\u79bb\u5f00\u4e86\u8fd9\u652f\u961f\u4f0d -Commands.Party.Members.Header=&c-----[]&a\u6210\u5458&c[]----- -Commands.Party.None=&c\u4f60\u4e0d\u5728\u961f\u4f0d\u4e2d. -Commands.Party.Quit=&a- \u79bb\u5f00\u4f60\u73b0\u6709\u7684\u961f\u4f0d -Commands.Party.Teleport=&a- \u4f20\u9001\u5230\u961f\u4f0d\u6210\u5458 -Commands.Party.Toggle=&a- \u5207\u6362\u961f\u4f0d\u804a\u5929 -Commands.Party1=&a- \u521b\u5efa\u4e00\u4e2a\u65b0\u961f\u4f0d -Commands.Party2=&a- \u52a0\u5165\u4e00\u4e2a\u73a9\u5bb6\u7684\u961f\u4f0d -Commands.Party.Alliance.Header=&c-----[]&a\u961f\u4f0d\u540c\u76df&c[]----- -Commands.Party.Alliance.Ally=&f{0} &8\u7684\u540c\u76df\u961f\u4f0d: &f{1} -Commands.Party.Alliance.Members.Header=&c-----[]&a\u540c\u76df\u6210\u5458&c[]----- -Commands.Party.Alliance.Invite.0=\u6ce8\u610f: &a\u60a8\u4ece {1} \u6536\u5230\u961f\u4f0d\u540c\u76df\u9080\u8bf7\u6765 {0} -Commands.Party.Alliance.Invite.1=\u8f93\u5165 &a/party alliance accept&e \u6765\u63a5\u53d7\u9080\u8bf7 -Commands.Party.Alliance.Invite.Accepted=&a\u5df2\u63a5\u53d7\u540c\u76df\u9080\u8bf7. -Commands.Party.Alliance.None=&c\u60a8\u6ca1\u6709\u540c\u76df.&c&a -Commands.Party.Alliance.AlreadyAllies=&c\u60a8\u7684\u961f\u4f0d\u5df2\u7ecf\u6709\u4e00\u4e2a\u540c\u76df. \u4f7f\u7528 &3/party alliance disband &c\u6765\u89e3\u6563\u5f53\u524d\u540c\u76df -Commands.Party.Alliance.Help.0=&c\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=&c \u4f7f\u7528 &3/party alliance invite <\u73a9\u5bb6>&c. -Commands.ptp.Enabled=\u961f\u4f0d\u4f20\u9001 &a\u542f\u7528 -Commands.ptp.Disabled=\u961f\u4f0d\u4f20\u9001 &c\u7981\u7528 -Commands.ptp.NoRequests=&c\u5f53\u524d\u6ca1\u6709\u4f20\u9001\u8bf7\u6c42 -Commands.ptp.NoWorldPermissions=&c[mcMMO] \u4f60\u6ca1\u6709\u6743\u9650\u4f20\u9001\u5230\u4e16\u754c {0}. -Commands.ptp.Request1=&e{0} &a\u5df2\u7ecf\u5411\u4f60\u53d1\u51fa\u8bf7\u6c42\u4f20\u9001 -Commands.ptp.Request2=&a\u540c\u610f\u4f20\u9001\u8f93\u5165 &e/ptp accept. &a\u8bf7\u6c42\u5c06\u5728 &c{0} &a \u79d2\u540e\u5931\u6548 -Commands.ptp.AcceptAny.Enabled=\u961f\u4f0d\u4f20\u9001\u8bf7\u6c42\u786e\u8ba4 &a\u542f\u7528 -Commands.ptp.AcceptAny.Disabled=\u961f\u4f0d\u4f20\u9001\u8bf7\u6c42\u786e\u8ba4 &c\u7981\u7528 -Commands.ptp.RequestExpired=&c\u961f\u4f0d\u4f20\u9001\u8bf7\u6c42\u5df2\u5931\u6548! -Commands.PowerLevel.Leaderboard=&e--mcMMO&9 \u6218\u6597\u529b &e\u6392\u884c\u699c-- -Commands.PowerLevel.Capped=&4]\u6218\u6597\u529b: &a{0} &4\u6700\u9ad8\u7b49\u7ea7: &e{1} -Commands.PowerLevel=&4\u6218\u6597\u529b: &a{0} -Commands.Reset.All=&a\u4f60\u7684\u6280\u80fd\u7b49\u7ea7\u5df2\u590d\u4f4d\u6210\u529f. -Commands.Reset.Single=&a\u4f60\u7684 {0} \u6280\u80fd\u7b49\u7ea7\u5df2\u6210\u529f\u91cd\u7f6e. -Commands.Reset=&a- \u91cd\u7f6e\u6280\u80fd\u7b49\u7ea7\u4e3a0 -Commands.Scoreboard.Clear=&3mcMMO \u8bb0\u5206\u677f\u5df2\u5173\u95ed. -Commands.Scoreboard.NoBoard=&cmcMMO \u8bb0\u5206\u677f\u5f53\u524d\u672a\u6fc0\u6d3b. -Commands.Scoreboard.Keep=&3mcMMO \u8bb0\u5206\u677f\u5c06\u60ac\u505c\u76f4\u5230\u60a8\u4f7f\u7528 &a/mcscoreboard clear&3 \u6765\u5173\u95ed. -Commands.Scoreboard.Timer=&3mcMMO \u8bb0\u5206\u677f\u5c06\u5728 &6{0}&3 \u79d2\u540e\u5173\u95ed -Commands.Scoreboard.Help.0=&6 == &c/mcscoreboard &a\u5e2e\u52a9&6 == -Commands.Scoreboard.Help.1=&3/mcscoreboard&b clear &f - \u6e05\u7a7a mcMMO \u8bb0\u5206\u677f -Commands.Scoreboard.Help.2=&3/mcscoreboard&b keep &f - \u4fdd\u6301 mcMMO \u8bb0\u5206\u677f\u60ac\u505c -Commands.Scoreboard.Help.3=&3/mcscoreboard&b time [n] &f - &dn&f \u79d2\u540e\u6e05\u7a7a mcMMO \u8bb0\u5206\u677f -Commands.Scoreboard.Tip.Keep=&6\u63d0\u793a: \u5f53\u8bb0\u5206\u677f\u663e\u793a\u65f6\u4f7f\u7528 &c/mcscoreboard keep&6 \u6765\u4fdd\u6301\u5b83\u4e0d\u6d88\u5931\u3002 -Commands.Scoreboard.Tip.Clear=&6\u63d0\u793a: \u4f7f\u7528 &c/mcscoreboard clear&6 \u6765\u5173\u95ed\u8ba1\u5206\u677f\u3002 -Commands.XPBar.Reset=&6mcMMO \u7684\u7ecf\u9a8c\u6761\u8bbe\u7f6e\u88ab\u91cd\u7f6e. -Commands.XPBar.SettingChanged=&a{0}&6 \u7684\u7ecf\u9a8c\u503c\u8bbe\u7f6e\u88ab\u8bbe\u7f6e\u4e3a &a{1} -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 &9{0}&e \u6392\u884c\u699c-- -Commands.SkillInfo=&a- \u67e5\u770b\u6280\u80fd\u7684\u8be6\u7ec6\u4fe1\u606f -Commands.Stats=&a- \u4f60\u7684\u4fe1\u606f -Commands.ToggleAbility=&a- \u7528\u9f20\u6807\u53f3\u952e\u5207\u6362\u6280\u80fd\u6fc0\u6d3b\u6a21\u5f0f -Commands.Usage.0=&c\u6b63\u786e\u7684\u7528\u6cd5\u662f /{0} -Commands.Usage.1=&c\u6b63\u786e\u7684\u7528\u6cd5\u662f /{0} {1} -Commands.Usage.2=&c\u6b63\u786e\u7684\u7528\u6cd5\u662f /{0} {1} {2} -Commands.Usage.3=&c\u6b63\u786e\u7684\u7528\u6cd5\u662f /{0} {1} {2} {3} -Commands.Usage.3.XP=&c\u6b63\u786e\u7684\u7528\u6cd5\u662f /{0} {1} {2} {3}&7 (\u60a8\u53ef\u4ee5\u5728\u672b\u5c3e\u6dfb\u52a0 -s \u4ee5\u5728\u4e0d\u901a\u77e5\u73a9\u5bb6\u7684\u60c5\u51b5\u4e0b\u6267\u884c\u547d\u4ee4\uff0c\u4ece\u800c\u6709\u6548\u5730\u4f7f\u5176\u9759\u97f3) -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=&7\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=&3-=[]=====[]&6 MMO \u4fe1\u606f &3[]=====[]=- -Commands.MmoInfo.SubSkillHeader=&6\u540d\u5b57:&e {0} -Commands.MmoInfo.DetailsHeader=&3-=[]=====[]&a \u7ec6\u8282 &3[]=====[]=- -Commands.MmoInfo.OldSkill=&7mcMMO\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=&3-=[]=====[]&6 \u673a\u68b0\u5b66 &3[]=====[]=- -Commands.MmoInfo.Stats=\u7edf\u8ba1: {0} -Commands.Mmodebug.Toggle=mcMMO \u8c03\u8bd5\u6a21\u5f0f &6{0}&7, \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=&c\u4f60\u73b0\u5728\u6ca1\u6709\u53d7\u5230\u4efb\u4f55\u9080\u8bf7 -mcMMO.NoPermission=&4\u6743\u9650\u4e0d\u8db3. -mcMMO.NoSkillNote=&8\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.. +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] \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=&c\u6b63\u786e\u7684\u7528\u6cd5 &3{0} [password]. -Party.Help.1=&c\u521b\u5efa\u4e00\u4e2a\u961f\u4f0d, \u4f7f\u7528 &3{0} [password]. -Party.Help.2=&c\u67e5\u9605 &3{0} &c\u83b7\u53d6\u66f4\u591a\u4fe1\u606f -Party.Help.3=&c\u4f7f\u7528 &3{0} [password] &c\u52a0\u5165\u6216 &3{1} &c\u9000\u51fa -Party.Help.4=&c\u9501\u5b9a\u6216\u89e3\u9501\u4f60\u7684\u961f\u4f0d, \u4f7f\u7528 &3{0} -Party.Help.5=&c\u8bbe\u7f6e\u961f\u4f0d\u5bc6\u7801, \u4f7f\u7528 &3{0} -Party.Help.6=&c\u4ece\u4f60\u7684\u961f\u4f0d\u4e2d\u8e22\u51fa\u73a9\u5bb6, \u4f7f\u7528 &3{0} -Party.Help.7=&c\u79fb\u4ea4\u961f\u957f, \u4f7f\u7528 &3{0} -Party.Help.8=&c\u89e3\u6563\u961f\u4f0d, \u4f7f\u7528 &3{0} -Party.Help.9=&c\u4f7f\u7528 &3{0} &c\u6765\u4e0e\u4f60\u7684\u961f\u4f0d\u6210\u5458\u5206\u4eab\u7269\u54c1 -Party.Help.10=&c\u4f7f\u7528 &3{0} &c\u5f00\u542f\u4e0e\u4f60\u7684\u961f\u4f0d\u6210\u5458\u5206\u4eab\u7ecf\u9a8c -Party.InformedOnJoin={0} &a\u5df2\u7ecf\u52a0\u5165\u4f60\u7684\u961f\u4f0d -Party.InformedOnQuit={0} &a\u79bb\u5f00\u4e86\u961f\u4f0d -Party.InformedOnNameChange=&6{0} &a\u5df2\u8bbe\u7f6e\u961f\u4f0d\u540d\u4e3a &f{1} -Party.InvalidName=&4\u90a3\u4e0d\u662f\u4e00\u4e2a\u6709\u6548\u7684\u961f\u4f0d\u540d\u5b57. -Party.Invite.Self=&c\u4f60\u4e0d\u80fd\u9080\u8bf7\u81ea\u5df1! -Party.IsLocked=&c\u8fd9\u4e2a\u961f\u4f0d\u5df2\u7ecf\u9501\u5b9a! -Party.IsntLocked=&c\u8fd9\u4e2a\u961f\u4f0d\u5e76\u6ca1\u6709\u9501\u5b9a! -Party.Locked=&c\u961f\u4f0d\u88ab\u9501\u5b9a, \u53ea\u6709\u961f\u957f\u53ef\u4ee5\u9080\u8bf7. -Party.NotInYourParty=&4{0} \u4f60\u4e0d\u5728\u4f60\u7684\u56e2\u961f -Party.NotOwner=&4\u4f60\u4e0d\u662f\u961f\u957f -Party.Target.NotOwner=&4{0} \u4e0d\u662f\u961f\u957f\u3002 -Party.Owner.New=&a{0} \u73b0\u5728\u662f\u65b0\u7684\u6d3e\u7cfb\u9886\u961f. -Party.Owner.NotLeader=&4\u4f60\u5df2\u7ecf\u4e0d\u518d\u662f\u6d3e\u7cfb\u5185\u7684\u9886\u961f. -Party.Owner.Player=&a\u4f60\u73b0\u5728\u4e0d\u662f\u961f\u957f\u4e86 -Party.Password.None=&c\u52a0\u5165\u8fd9\u4e2a\u961f\u4f0d\u9700\u8981\u5bc6\u7801. \u8bf7\u63d0\u4f9b\u5bc6\u7801\u518d\u52a0\u5165 -Party.Password.Incorrect=&c\u961f\u4f0d\u5bc6\u7801\u9519\u8bef -Party.Password.Set=&a\u961f\u4f0d\u5bc6\u7801\u8bbe\u7f6e\u4e3a {0} -Party.Password.Removed=&a\u961f\u4f0d\u5bc6\u7801\u5df2\u88ab\u6e05\u9664 -Party.Player.Invalid=&c\u8fd9\u4e0d\u662f\u4e00\u540d\u6709\u6548\u7684\u73a9\u5bb6 -Party.NotOnline=&4{0} \u4e0d\u5728\u7ebf! -Party.Player.InSameParty=&c{0} \u5df2\u7ecf\u5728\u961f\u4f0d\u4e2d! -Party.PlayerNotInParty=&4{0} \u4e0d\u5728\u961f\u4f0d\u91cc -Party.Specify=&c\u4f60\u5fc5\u987b\u6307\u5b9a\u4e00\u4e2a\u961f\u4f0d -Party.Teleport.Dead=&c\u4f60\u4e0d\u80fd\u4f20\u9001\u5230\u6b7b\u4ea1\u7684\u73a9\u5bb6\u8eab\u8fb9 -Party.Teleport.Hurt=&c\u4f60\u53d7\u5230\u4f24\u5bb3, \u81f3\u5c11 {0} \u79d2\u5185\u4e0d\u80fd\u4f20\u9001 -Party.Teleport.Player=&a\u4f60\u5df2\u7ecf\u4f20\u9001\u5230 {0}. -Party.Teleport.Self=&c\u4f60\u4e0d\u80fd\u4f20\u9001\u5230\u4f60\u81ea\u5df1\u90a3\u91cc! -Party.Teleport.Target=&a{0} \u5df2\u7ecf\u4f20\u9001\u5230\u4f60\u8eab\u8fb9. -Party.Teleport.Disabled=&c{0} \u4e0d\u5141\u8bb8\u961f\u4f0d\u4f20\u9001 -Party.Rename.Same=&c\u8fd9\u5df2\u7ecf\u662f\u4f60\u7684\u961f\u4f0d\u540d\u5b57\u4e86! -Party.Join.Self=&c\u4f60\u4e0d\u80fd\u52a0\u5165\u4f60\u81ea\u5df1! -Party.Unlocked=&7\u961f\u4f0d\u5df2\u89e3\u9501 -Party.Disband=&7\u961f\u4f0d\u5df2\u89e3\u6563 -Party.Alliance.Formed=&7\u60a8\u7684\u961f\u4f0d\u5f53\u524d\u4e0e &a{0} &7\u7ed3\u76df -Party.Alliance.Disband=&7\u60a8\u7684\u961f\u4f0d\u4e0d\u518d\u4e0e &c{0} &7\u7ed3\u76df -Party.Status.Locked=&4(\u4ec5\u9080\u8bf7) -Party.Status.Unlocked=&2(\u5f00\u542f) -Party.LevelUp=&e\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=&c\u961f\u4f0d\u804a\u5929\u5c1a\u672a\u89e3\u9501\u3002 -Party.Feature.Disabled.2=&c\u961f\u4f0d\u4f20\u9001\u5c1a\u672a\u89e3\u9501\u3002 -Party.Feature.Disabled.3=&c\u961f\u4f0d\u540c\u76df\u5c1a\u672a\u89e3\u9501\u3002 -Party.Feature.Disabled.4=&c\u961f\u4f0d\u7269\u54c1\u5171\u4eab\u5c1a\u672a\u89e3\u9501\u3002 -Party.Feature.Disabled.5=&c\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 +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=\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\u7814\u7a76\u5427!) -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=\u780d\u4f10\u6811\u6728 -Commands.XPGain=&8\u7ecf\u9a8c\u6765\u6e90: &f{0} -Commands.xplock.locked=&6\u4f60\u7684\u7ecf\u9a8c\u6761\u9501\u5b9a\u5728 {0}! -Commands.xplock.unlocked=&6\u4f60\u7684\u7ecf\u9a8c\u6761\u73b0\u5728 &a\u89e3\u9664\u9501\u5b9a\u4e86&6! -Commands.xprate.modified=&c\u7ecf\u9a8c\u500d\u7387\u5df2\u8bbe\u7f6e\u4e3a {0} -Commands.xprate.over=&cmcMMO \u9ad8\u500d\u7ecf\u9a8c\u4e8b\u4ef6\u7ed3\u675f!! -Commands.xprate.proper.0=&c\u60f3\u4fee\u6539\u7ecf\u9a8c\u83b7\u53d6\u7387\u8bf7\u8f93\u5165 /xprate -Commands.xprate.proper.1=&c\u60f3\u628a\u7ecf\u9a8c\u83b7\u53d6\u7387\u8c03\u6574\u4e3a\u9ed8\u8ba4\u8bf7\u8f93\u5165 /xprate reset -Commands.xprate.proper.2=&c\u8bf7\u6307\u5b9a true \u6216 false \u6765\u8868\u660e\u8fd9\u662f\u5426\u662f\u4e00\u4e2a\u7ecf\u9a8c\u6d3b\u52a8 -Commands.xprate.started.0=&6mcMMO \u9ad8\u500d\u7ecf\u9a8c\u6d3b\u52a8\u5df2\u5f00\u59cb! -Commands.xprate.started.1=&6mcMMO \u7ecf\u9a8c\u83b7\u53d6\u7387\u73b0\u5728\u4e3a {0} \u500d! -Commands.NegativeNumberWarn=\u4e0d\u8981\u4f7f\u7528\u8d1f\u6570! -Commands.Event.Start=&amcMMO&6 \u6d3b\u52a8! -Commands.Event.Stop=&amcMMO&3 \u6d3b\u52a8\u7ed3\u675f! -Commands.Event.Stop.Subtitle=&a\u6211\u5e0c\u671b\u4f60\u73a9\u7684\u5f00\u5fc3! -Commands.Event.XP=&3\u591a\u500d\u7ecf\u9a8c\u500d\u7387\u4e3a &6{0}&3 \u500d +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 倍 # 管理员提醒 Server.ConsoleName=&e[Server] -Notifications.Admin.XPRate.Start.Self=&7\u4f60\u5df2\u5c06\u5168\u5c40\u591a\u500d\u7ecf\u9a8c\u8bbe\u7f6e\u4e3a &6{0} \u500d -Notifications.Admin.XPRate.End.Self=&7\u4f60\u7ed3\u675f\u4e86\u591a\u500d\u7ecf\u9a8c\u4e8b\u4ef6. -Notifications.Admin.XPRate.End.Others={0} &7\u7ed3\u675f\u4e86\u591a\u500d\u7ecf\u9a8c\u4e8b\u4ef6 -Notifications.Admin.XPRate.Start.Others={0} &7\u5df2\u542f\u52a8\u6216\u4fee\u6539\u5177\u6709\u5168\u5c40 {1} \u500d\u7684\u591a\u500d\u7ecf\u9a8c\u4e8b\u4ef6 +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} # 事件 -XPRate.Event= &6mcMMO \u73b0\u5728\u6b63\u5904\u4e8e\u591a\u500d\u7ecf\u9a8c\u6d3b\u52a8\u9636\u6bb5! \u7ecf\u9a8c\u83b7\u53d6\u7387\u4e3a {0} \u500d! +XPRate.Event= &6mcMMO 现在正处于多倍经验活动阶段! 经验获取率为 {0} 倍! #指南 -Guides.Available=&7{0} \u7684\u5411\u5bfc - \u8f93\u5165 /{1} ? [\u9875\u6570] -Guides.Header=&6-=&a{0} \u5411\u5bfc&6=- -Guides.Page.Invalid=\u4e0d\u662f\u4e00\u4e2a\u6709\u6548\u7684\u9875\u6570! -Guides.Page.OutOfRange=\u90a3\u9875\u4e0d\u5b58\u5728, \u603b\u5171\u53ea\u6709 {0} \u9875 -Guides.Usage= \u7528\u6cd5 /{0} ? [\u9875\u6570] +Guides.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\u5173\u4e8e\u6742\u6280:\n&e\u6742\u6280\u662f mcMMO \u4e2d\u4f18\u96c5\u79fb\u52a8\u7684\u827a\u672f\u3002\n&e\u5b83\u63d0\u4f9b\u4e86\u6218\u6597\u52a0\u6210\u548c\u73af\u5883\u4f24\u5bb3\u52a0\u6210\u3002\n\n&3\u7ecf\u9a8c\u83b7\u53d6:\n&e\u901a\u8fc7\u5728\u6218\u6597\u4e2d\u95ea\u907f\u6216\u8005\u4ece\u9ad8\u5904\n&e\u8dcc\u843d\u65f6\u53d7\u4f24\u5e76\u5e78\u5b58\u6765\u83b7\u5f97\u7ecf\u9a8c\u3002 -Guides.Acrobatics.Section.1=&3\u7ffb\u6eda\u662f\u5982\u4f55\u5de5\u4f5c\u7684\uff1f\n&e\u5f53\u60a8\u53d7\u5230\u8dcc\u843d\u4f24\u5bb3\u65f6\u60a8\u6709\u88ab\u52a8\u673a\u4f1a\u6765\u514d\u53d7\u4f24\u5bb3\u3002\n&e\u60a8\u53ef\u4ee5\u5728\u8dcc\u843d\u4e2d\u6309\u4f4f\u6f5c\u884c\u952e\u6765\u63d0\u5347\u89e6\u53d1\u51e0\u7387\u3002\n&e\u8fd9\u5c06\u89e6\u53d1\u4e00\u4e2a\u4f18\u96c5\u5730\u7ffb\u6eda\u800c\u4e0d\u662f\u666e\u901a\u7684\u7ffb\u6eda\u3002\n&e\u4f18\u96c5\u5730\u7ffb\u6eda\u7c7b\u4f3c\u666e\u901a\u7684\u7ffb\u6eda\u4f46\u662f\u5b83\u6709\u53cc\u500d\u51e0\u7387\n&e\u53d1\u751f\uff0c\u5e76\u4e14\u80fd\u591f\u63d0\u4f9b\u6bd4\u666e\u901a\u5730\u7ffb\u6eda\u66f4\u9ad8\u7684\u4f24\u5bb3\u51cf\u514d\u3002\n&e\u7ffb\u6eda\u51e0\u7387\u53d6\u51b3\u4e8e\u60a8\u7684\u6280\u80fd\u7b49\u7ea7 -Guides.Acrobatics.Section.2=&3\u95ea\u907f\u662f\u5982\u4f55\u5de5\u4f5c\u7684?\n&e\u95ea\u907f\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd\n&e\u4ed6\u5728\u4f60\u88ab\u653b\u51fb\u65f6\u6709\u4e00\u5b9a\u51e0\u7387\u88ab\u6fc0\u53d1\n&e\u8fd9\u4e2a\u51e0\u7387\u548c\u4f60\u7684\u6280\u80fd\u7b49\u7ea7\u6709\u5173 +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\u5173\u4e8e\u70bc\u91d1:\n&e\u70bc\u91d1\u662f\u836f\u6c34\u917f\u9020\u7684\u6280\u80fd\u3002\n&e\u5b83\u63d0\u5347\u4e86\u836f\u6c34\u917f\u9020\u65f6\u7684\u901f\u5ea6\uff0c\u5e76\u4e14\u52a0\u5165\u4e86\n&e\u65b0\u7684\uff08\u76f8\u5bf9\u4e4b\u524d\uff09\u65e0\u6cd5\u83b7\u53d6\u7684\u836f\u6c34\u3002\n\n\n&3\u7ecf\u9a8c\u83b7\u53d6\uff1a\n&e\u901a\u8fc7\u917f\u9020\u836f\u6c34\u6765\u83b7\u53d6\u7ecf\u9a8c\u3002 -Guides.Alchemy.Section.1=&3\u50ac\u5316\u662f\u5982\u4f55\u5de5\u4f5c\u7684\uff1f\n&e\u50ac\u5316\u63d0\u5347\u917f\u9020\u7684\u901f\u5ea6\uff0c\u5728 1000 \u7ea7\n&e\u65f6\u80fd\u8fbe\u5230\u6700\u9ad8 4 \u500d\u3002\n&e\u6b64\u80fd\u529b\u9ed8\u8ba4\u5728 100 \u7ea7\u89e3\u9501\u3002 -Guides.Alchemy.Section.2=&3\u6df7\u5408\u662f\u5982\u4f55\u5de5\u4f5c\u7684\uff1f\n&e\u6df7\u5408\u5141\u8bb8\u4f7f\u7528\u81ea\u5b9a\u4e49\u539f\u6599\u917f\u9020\u66f4\u591a\u836f\u6c34\u3002\n&e\u7279\u6b8a\u539f\u6599\u6839\u636e\u60a8\u7684\u7b49\u7ea7\u6765\u89e3\u9501\u3002\n&e\u603b\u5171\u6709 8 \u4e2a\u7b49\u7ea7\u9700\u8981\u89e3\u9501\u3002 -Guides.Alchemy.Section.3=&3\u6df7\u5408\u7b2c 1 \u9636\u539f\u6599:\n&e\u70c8\u7130\u7c89, \u53d1\u9175\u86db\u773c, \u6076\u9b42\u4e4b\u6cea, \u7ea2\u77f3,\n&e\u8424\u77f3\u7c89, \u7cd6, \u95ea\u70c1\u7684\u897f\u74dc, \u91d1\u80e1\u841d\u535c,\n&e\u5ca9\u6d46\u818f, \u5730\u72f1\u75a3, \u8718\u86db\u773c, \u706b\u836f, \u7761\u83b2,\n&e\u6cb3\u8c5a\n&e(\u7eaf\u51c0\u836f\u6c34) -Guides.Alchemy.Section.4=&3\u6df7\u5408\u7b2c 2 \u9636\u539f\u6599:\n&e\u80e1\u841d\u535c (\u6025\u8feb\u836f\u6c34)\n&e\u7c98\u6db2\u7403 (\u8fdf\u949d\u836f\u6c34)\n\n&3\u6df7\u5408\u7b2c 3 \u9636\u539f\u6599:\n&e\u4e0b\u754c\u77f3\u82f1 (\u4f24\u5bb3\u5438\u6536\u836f\u6c34)\n&e\u7ea2\u8272\u8611\u83c7 (\u8df3\u8dc3\u836f\u6c34) -Guides.Alchemy.Section.5=&3\u6df7\u5408\u7b2c 4 \u9636\u539f\u6599:\n&e\u82f9\u679c (\u751f\u547d\u52a0\u6210\u836f\u6c34)\n&e\u8150\u8089 (\u9965\u997f\u836f\u6c34)\n\n&3\u6df7\u5408\u7b2c 5 \u9636\u539f\u6599:\n&e\u8910\u8272\u8611\u83c7 (\u53cd\u80c3\u836f\u6c34)\n&e\u58a8\u56ca (\u5931\u660e\u836f\u6c34) -Guides.Alchemy.Section.6=&3\u6df7\u5408\u7b2c 6 \u9636\u539f\u6599:\n&e\u8568\u7c7b (\u9971\u548c\u836f\u6c34)\n\n&3\u6df7\u5408\u7b2c 7 \u9636\u539f\u6599:\n&e\u6bd2\u9a6c\u94c3\u85af (Potion of Decay)\n\n[[\u8150\u70c2\u836f\u6c34]]\u6df7\u5408\u7b2c 8 \u9636\u539f\u6599:\n&e\u666e\u901a\u91d1\u82f9\u679c (\u6297\u6027\u63d0\u5347\u836f\u6c34) +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\u5173\u4e8e\u7bad\u672f:\n&e\u7bad\u672f\u662f\u7528\u5f13\u5c04\u7bad.\n&e\u4e3a\u4f60\u63d0\u4f9b\u5404\u79cd\u6218\u6597\u52a0\u6210, \n&e\u4f8b\u5982\u968f\u7740\u4f60\u7684\u7b49\u7ea7\u63d0\u5347\u4f24\u5bb3\uff0c\u63d0\u5347\u5c06\u5bf9\u624b\u51fb\u6655\u7684\u80fd\u529b\n&e\u9664\u6b64\u4e4b\u5916\u4f60\u8fd8\u80fd\u4ece\u5bf9\u624b\u7684\u8eab\u4e0a\u56de\u6536\u7bad\u77e2.\n\n\n&3\u7ecf\u9a8c\u6765\u6e90:\n&e\u8981\u83b7\u53d6\u6b64\u4ec5\u80fd\u7684\u7ecf\u9a8c\n&e\u4f60\u9700\u8981\u5c04\u51fb\u602a\u7269\u6216\u5176\u4ed6\u73a9\u5bb6. -Guides.Archery.Section.1=&3\u6280\u5de7\u5c04\u51fb\u5982\u4f55\u5de5\u4f5c?\n&e\u6280\u5de7\u5c04\u51fb\u4f1a\u4f7f\u4f60\u7684\u5c04\u7bad\u653b\u51fb\u83b7\u5f97\u4f24\u5bb3\u52a0\u6210.\n&e\u6280\u5de7\u5c04\u51fb\u63d0\u4f9b\u7684\u4f24\u5bb3\u52a0\u6210\u4f1a\u968f\u7740\n&e\u7bad\u672f\u7b49\u7ea7\u7684\u63d0\u5347\u800c\u589e\u52a0.\n&e\u4f7f\u7528\u9ed8\u8ba4\u8bbe\u7f6e\u4f60\u7684\u7bad\u672f\u6bcf\u4e94\u5341\u7ea7\u63d0\u9ad810%\u7684\u4f24\u5bb3\u52a0\u6210\n&e\u6700\u9ad8\u63d0\u4f9b200%\u7684\u4f24\u5bb3\u52a0\u6210. -Guides.Archery.Section.2=&3\u51fb\u6655\u5982\u4f55\u5de5\u4f5c?\n&e\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&e\u5f53\u51fb\u6655\u89e6\u53d1\u65f6\u4ed6\u4f1a\u65f6\n&e\u5bf9\u624b\u76f4\u89c6\u524d\u65b9\u4e00\u5b9a\u65f6\u95f4.\n&e\u5e76\u63d0\u4f9b4\u70b9\u7684\u989d\u5916\u4f24\u5bb3\uff082 \u5fc3\uff09. -Guides.Archery.Section.3=&3\u7bad\u77e2\u56de\u6536\u5982\u4f55\u5de5\u4f5c?\n&e\u5f53\u4f60\u7528\u5f13\u7bad\u51fb\u6740\u602a\u7269\u65f6\n&e\u6709\u51e0\u7387\u56de\u6536\u7bad\u77e2.\n&e\u8fd9\u4e2a\u51e0\u7387\u968f\u7740\u4f60\u7bad\u672f\u7b49\u7ea7\u7684\u63d0\u5347\u800c\u589e\u52a0.\n&e\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u8fd9\u4e2a\u80fd\u529b\u6bcf\u7ea7\u589e\u52a00.1%,\n&e1000\u7ea7\u589e\u52a0100%. +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\u5173\u4e8e \u65a7\u6280:\n&e\u6709\u4e86\u65a7\u5934\u6280\u80fd,\u65a7\u5b50\u4e0d\u518d\u53ea\u662f\u780d\u6811\u800c\u5df2.\n&e\u4f60\u8fd8\u53ef\u4ee5\u780d\u5176\u4ed6\u751f\u7269\u548c\u73a9\u5bb6\u6765\u8d5a\u53d6\u7ecf\u9a8c.\n&e\u6253\u51fb\u751f\u7269\u65f6\u9644\u52a0\u51fb\u9000\u6548\u679c.\n&e\u8fd8\u4f1a\u5bf9\u751f\u7269\u548c\u73a9\u5bb6\u9020\u6210\u81f4\u547d\u4f24\u5bb3.\n&e\u4f60\u7684\u65a7\u5b50\u4f1a\u50cf\u4f10\u6728\u673a\u4e00\u6837.\n&e\u8f7b\u677e\u524a\u6389\u654c\u4eba\u7684\u62a4\u7532.\n&e\u6548\u679c\u968f\u7740\u6280\u80fd\u7b49\u7ea7\u63d0\u9ad8.\n&3\u7ecf\u9a8c\u7684\u83b7\u53d6:\n&e\u624b\u6301\u65a7\u5b50\u653b\u51fb\u5176\u4ed6\u751f\u7269\u6216\u73a9\u5bb6. -Guides.Axes.Section.1=&3\u4ec0\u4e48\u662f\u65a9\u9996\u8005?\n&e\u8fd9\u4e2a\u6280\u80fd\u4f1a\u9020\u6210\u8303\u56f4\u6253\u51fb\u4f24\u5bb3\n&e\u4f24\u5bb3\u7b49\u4e8e\u5bf9\u4e3b\u8981\u653b\u51fb\u76ee\u6807\u9020\u6210\u4f24\u5bb3\u768450%\n&e\u6240\u4ee5\u5f88\u5bb9\u6613\u6e05\u7406\u6389\u4e00\u5927\u7247\u602a\u7269 -Guides.Axes.Section.2=&3\u4ec0\u4e48\u662f\u81f4\u547d\u4e00\u51fb?\n&e\u8fd9\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd\n&e\u4e00\u5b9a\u51e0\u7387\u5bf9\u76ee\u6807\u9020\u6210\u989d\u5916\u4f24\u5bb3\n&e\u9ed8\u8ba4\u6bcf2\u7ea7\u589e\u52a0 0.1%\n&e\u5bf9\u751f\u7269\u9020\u62102\u500d\u4f24\u5bb3\n&e\u5bf9\u73a9\u5bb6\u9020\u62101.5\u500d\u4f24\u5bb3 -Guides.Axes.Section.3=&3\u4ec0\u4e48\u662f\u65a7\u7cbe\u901a?\n&e\u8fd9\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd\n&e\u4f7f\u7528\u65a7\u5b50\u653b\u51fb\u65f6\u9644\u52a0\u989d\u5916\u4f24\u5bb3\n&e\u9ed8\u8ba4\u6bcf50\u7ea7\u989d\u5916\u63d0\u9ad81\u70b9\u4f24\u5bb3\n&e4\u70b9\u989d\u5916\u4f24\u5bb3\u5c01\u9876 -Guides.Axes.Section.4=&3\u4ec0\u4e48\u662f\u7834\u7532?\n&e\u7528\u8db3\u591f\u7684\u529b\u91cf\u51fb\u788e\u62a4\u7532!\n&e\u7834\u7532\u662f\u4e00\u4e2a\u88ab\u52a8\u7684\u80fd\u529b,\u5b83\u6709\u51e0\u7387\u4f1a\u635f\u8017\n&e\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=&3\u4ec0\u4e48\u662f\u5f3a\u529b\u51b2\u51fb?\n&e\u8fd9\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd\n&e\u4f7f\u7528\u65a7\u5b50\u653b\u51fb\u65f6\u4e00\u5b9a\u51e0\u7387\u7ed9\u654c\u4eba\u5e26\u6765\u5de8\u5927\u7684\u51b2\u51fb\u529b\n&e\u9ed8\u8ba4\u51e0\u7387\u4e3a 25%\n&e\u6548\u679c\u76f8\u5f53\u4e8e \u51fb\u9000 II \u7684\u9644\u9b54\u6548\u679c\n&e\u6b64\u5916\u8fd8\u4f1a\u5bf9\u76ee\u6807\u9020\u6210\u989d\u5916\u4f24\u5bb3 +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\u5173\u4e8e\u6316\u6398:\n&e\u6316\u6398\u662f\u4ee5\u6316\u6398\u6ce5\u571f\u4ee5\u5bfb\u627e\u5b9d\u85cf\u7684\u884c\u4e3a.\n&e\u901a\u8fc7\u6316\u6398,\u4f60\u5c06\u4f1a\u627e\u5230\u9690\u85cf\u7684\u5b9d\u85cf.\n&e\u4f60\u6316\u7684\u8d8a\u591a\u4f60\u627e\u5230\u7684\u5b9d\u85cf\u4e5f\u5c31\u8d8a\u591a.\n\n&3\u7ecf\u9a8c\u6765\u6e90:\n&e\u8981\u83b7\u5f97\u8be5\u6280\u80fd\u7684\u7ecf\u9a8c\u4f60\u5fc5\u987b\u624b\u6301\u94f2\u5b50\u6316\u6398.\n&e\u53ea\u6709\u7279\u5b9a\u7684\u65b9\u5757\u624d\u80fd\u83b7\u5f97\u7ecf\u9a8c,\u6316\u6398\u5230\u5b9d\u85cf. -Guides.Excavation.Section.1=&3\u53ef\u4ee5\u6316\u6398\u7684\u65b9\u5757:\n&e\u8349\u65b9\u5757, \u6ce5\u571f, \u6c99\u5b50, \u7c98\u571f, \u7802\u783e, \u83cc\u4e1d, \u7075\u9b42\u6c99, \u96ea -Guides.Excavation.Section.2=&3\u5982\u4f55\u4f7f\u7528\u66b4\u8d70\u94bb\u5934:\n&e\u624b\u62ff\u94f2\u5b50\u53f3\u952e\u5355\u51fb\u4ee5\u8fdb\u5165\u51c6\u5907\u72b6\u6001.\n&e\u4e00\u65e6\u8fdb\u5165\u8fd9\u79cd\u72b6\u6001,\u4f60\u7ea6\u67094\u79d2\u7684\u65f6\u95f4\u8ba9\u5de5\u5177\n&e\u70b9\u51fb\u4e0e\u6316\u6398\u673a\u80fd\u517c\u5bb9\u7684\u65b9\u5757\n&e\u8fd9\u6837\u5c31\u4f1a\u6fc0\u6d3b\u66b4\u8d70\u94bb\u5934\u6280\u80fd. -Guides.Excavation.Section.3=&3\u4ec0\u4e48\u662f\u66b4\u8d70\u94bb\u5934?\n&e\u66b4\u8d70\u94bb\u5934\u662f\u4e00\u79cd\u4e0e\u6316\u6398\u6280\u80fd\u76f8\u5173\u4e14\u6709\u65f6\u95f4\u9650\u5236\u7684\u80fd\u529b\n&e\u5b83\u4f7f\u4f60\u627e\u5230\u5b9d\u85cf\u7684\u51e0\u7387\u589e\u52a0\u4e09\u500d\n&e\u5e76\u4e14\u80fd\u77ac\u95f4\u6253\u7834\u517c\u5bb9\u7684\u65b9\u5757. -Guides.Excavation.Section.4=&3\u8003\u53e4\u5b66\u662f\u600e\u6837\u5de5\u4f5c\u7684?\n&e\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&e\u56e0\u6b64\u5f88\u96be\u8bf4\u5b83\u5bf9\u4f60\u7684\u5e2e\u52a9\u6709\u591a\u5927\n&e\u8bf7\u8bb0\u4f4f\uff0c\u6316\u6398\u673a\u80fd\u7b49\u7ea7\u8d8a\u9ad8\u6316\u5230\u7684\u5b9d\u85cf\u5c31\u8d8a\u591a.\n&e\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&e\u6362\u53e5\u8bdd\u8bf4,\u4f60\u5728\u6ce5\u571f\u4e2d\u627e\u5230\u7684\u5b9d\u85cf.\n&e\u5728\u7802\u783e\u4e2d\u4e0d\u4e00\u5b9a\u80fd\u627e\u5230. -Guides.Excavation.Section.5=&3\u5173\u4e8e\u6316\u6398\u6ce8\u610f\u4e8b\u9879:\n&e\u6316\u6398\u6389\u843d\u7269\u662f\u5b8c\u5168\u53ef\u5b9a\u5236\u7684\n&e\u56e0\u6b64\u6316\u51fa\u7684\u7ed3\u679c\u56e0\u670d\u52a1\u5668\u800c\u5f02. +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\u5173\u4e8e\u9493\u9c7c:\n&e\u5173\u4e8e\u9493\u9c7c\u6280\u80fd, \u9493\u9c7c\u518d\u6b21\u4f7f\u4eba\u632f\u594b!\n&e\u627e\u5230\u9690\u85cf\u7684\u5b9d\u85cf\u4ece\u602a\u7269\u8eab\u4e0a\u6296\u843d\u7269\u54c1.\n\n&3\u7ecf\u9a8c\u6765\u6e90:\n&e\u9493\u9c7c. -Guides.Fishing.Section.1=&3\u6dd8\u91d1\u8005\u5982\u4f55\u5de5\u4f5c?\n&e\u8fd9\u4e2a\u80fd\u529b\u4f7f\u4f60\u5728\u9493\u9c7c\u65f6\u627e\u5230\u5b9d\u85cf \n&e\u5e76\u4e14\u7269\u54c1\u6709\u5c0f\u51e0\u7387\u5e26\u6709\u9644\u9b54.\n&e\u9493\u9c7c\u6280\u80fd\u7684\u6bcf\u4e00\u4e2a\u7ea7\u522b\u7684\u5b9d\u85cf\u90fd\u6709\u6982\u7387\u6389\u843d\n&e.\u5b9d\u85cf\u7684\u6982\u7387\u53d6\u51b3\u4e8e\u7a00\u6709\u5ea6\u7684\u6389\u843d\u51e0\u7387\n&e\u4f60\u7684\u9493\u9c7c\u7b49\u7ea7\u8d8a\u9ad8,\u4f60\u8d8a\u6709\u53ef\u80fd\u627e\u5230\u66f4\u597d\u7684\u5b9d\u85cf.\n&e\u83b7\u5f97\u5b9d\u85cf\u7684\u51e0\u7387\u4e5f\u8d8a\u9ad8. -Guides.Fishing.Section.2=&3\u51b0\u9493\u5982\u4f55\u5de5\u4f5c?\n&e\u8fd9\u4e2a\u88ab\u52a8\u6280\u80fd\u53ef\u4ee5\u8ba9\u4f60\u5728\u51b0\u6e56\u4e2d\u9493\u9c7c!\n&e\u5c06\u4f60\u7684\u9c7c\u7aff\u6254\u5728\u51b0\u6e56\u91cc\u8fd9\u4e2a\u80fd\u529b\u4f1a\u5728\u51b0\u4e0a\n&e\u5f62\u6210\u4e00\u4e2a\u5c0f\u5b54\u4f9b\u4f60\u9493\u9c7c. -Guides.Fishing.Section.3=&3\u9493\u9c7c\u5927\u5e08\u5982\u4f55\u5de5\u4f5c?\n&e\u8fd9\u4e2a\u88ab\u52a8\u589e\u52a0\u4e86\u9493\u9c7c\u65f6\u54ac\u94a9\u7684\u51e0\u7387.\n&e\u5f53\u4f60\u89e3\u9501\u8fd9\u79cd\u80fd\u529b\u65f6\n&e\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=&3\u6296\u52a8\u5982\u4f55\u5de5\u4f5c?\n&e\u8fd9\u79cd\u4e3b\u52a8\u6280\u80fd\u53ef\u4ee5\u8ba9\u4f60\u7528\u9c7c\u7aff\u52fe\u4f4f\u751f\u7269\n&e\u5e76\u4ece\u4ed6\u4eec\u8eab\u4e0a\u83b7\u53d6\u7269\u54c1. \n&e\u751f\u7269\u4f1a\u6389\u843d\u4ed6\u4eec\u6b7b\u4ea1\u65f6\u6389\u843d\u7684\u7269\u54c1.\n&e\u4e5f\u53ef\u80fd\u83b7\u5f97\u602a\u7269\u7684\u5934 \n&e\u4e00\u822c\u60c5\u51b5\u4e0b\u8fd9\u4e9b\u5934\u65e0\u6cd5\u5728\u751f\u5b58\u6a21\u5f0f\u4e2d\u83b7\u5f97. -Guides.Fishing.Section.5=&3\u6e14\u592b\u7684\u98df\u8c31\u5982\u4f55\u5de5\u4f5c?\n&e\u8fd9\u4e2a\u88ab\u52a8\u589e\u52a0\u4e86\u5403\u9c7c\u65f6\u6062\u590d\u7684\u9971\u98df\u5ea6. -Guides.Fishing.Section.6=&3\u5173\u4e8e\u9493\u9c7c\u7684\u8bf4\u660e:\n&e\u9493\u9c7c\u7684\u6389\u843d\u7269\u662f\u53ef\u4ee5\u81ea\u5b9a\u4e49\u7684,\n&e\u6240\u4ee5\u6389\u843d\u7269\u56e0\u670d\u52a1\u5668\u800c\u5f02. +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\u5173\u4e8e\u8349\u836f\u5b66:\n&e\u8349\u836f\u5b66\u662f\u5173\u4e8e\u91c7\u96c6\u8349\u836f\u4e0e\u690d\u7269\u7684\u6280\u80fd.\n\n&3\u7ecf\u9a8c\u62c9\u8fdc:\n&e\u91c7\u96c6\u8349\u836f\u6216\u690d\u7269. -Guides.Herbalism.Section.1=&3\u53ef\u4f5c\u7528\u7684\u8349\u836f/\u690d\u7269\n&e\u5c0f\u9ea6, \u9a6c\u94c3\u85af, \u80e1\u841d\u535c, \u897f\u74dc, \n&e\u5357\u74dc, \u7518\u8517, \u53ef\u53ef\u8c46, \u82b1, \u4ed9\u4eba\u638c, \u8611\u83c7,\n&e\u5730\u72f1\u75a3, \u83b2\u53f6, \u4e0e\u85e4\u8513. -Guides.Herbalism.Section.2=&3\u5927\u5730\u795d\u798f\u5982\u4f55\u5de5\u4f5c?\n&e\u5927\u5730\u795d\u798f\u662f\u4e00\u4e2a\u4e3b\u52a8\u6280\u80fd, \u5f53\u4f60\u624b\u6301\u9504\u5934\u65f6\n&e\u70b9\u51fb\u53f3\u952e\u53ef\u53d1\u52a8\u6280\u80fd. \u5927\u5730\u795d\u798f\u63d0\u9ad8\u4e09\u500d\u6536\u83b7\u7684\u673a\u7387. \n&e\u540c\u65f6\u4e5f\u8ba9\u73a9\u5bb6\u6709\u80fd\u529b\u4f7f\u7528\u8eab\u4e0a\u7684\u79cd\u5b50\u6765\u8f6c\u5316\n&e\u65b9\u5757\u5e76\u8d4b\u4e88\u751f\u547d. -Guides.Herbalism.Section.3=&3\u56ed\u827a\u5927\u5e08(\u4f5c\u7269)\u5982\u4f55\u5de5\u4f5c?\n&e\u8fd9\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd,\u8ba9\u4f5c\u7269\u5728\u91c7\u96c6\u65f6\n&e\u81ea\u52a8\u79cd\u56de\u53bb.\n&e\u6982\u7387\u53d6\u51b3\u4e8e\u4f60\u7684\u8349\u836f\u5b66\u6280\u80fd\u7b49\u7ea7. -Guides.Herbalism.Section.4=&3\u56ed\u827a\u5927\u5e08(\u5706\u77f3/\u77f3\u7816/\u6ce5\u571f)\u5982\u4f55\u5de5\u4f5c?\n&e\u8fd9\u662f\u4e00\u4e2a\u4e3b\u52a8\u6280\u80fd,\u8ba9\u4f60\u5728\u624b\u62ff\u7740\u79cd\u5b50\u65f6,\n&e\u5bf9\u5706\u77f3\u77f3/\u77f3\u7816/\u6ce5\u571f,\u70b9\u51fb\u53f3\u952e,\u53ef\u4f7f\u5b83\u4eec\u53d8\u6210\n&e\u82d4\u77f3\u8349\u65b9\u5757\u7b49,\u4f1a\u6d88\u8017\u4e00\u9897\u79cd\u5b50. -Guides.Herbalism.Section.5=&3\u519c\u592b\u98df\u8c31\u5982\u4f55\u5de5\u4f5c?\n&e\u8fd9\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd, \u53ef\u589e\u52a0\u4e0b\u5217\u98df\u7269\u7684\u9971\u98df\u5ea6\u6062\u590d -\n&e\u9762\u5305, \u66f2\u5947, \u897f\u74dc, \u8611\u83c7\u6c64, \u80e1\u841d\u535c, \u9a6c\u94c3\u85af. -Guides.Herbalism.Section.6=&3\u6d77\u62c9\u5c14\u7684\u795d\u798f\u5982\u4f55\u5de5\u4f5c?\n&e\u8fd9\u662f\u4e00\u4e2a\u4e3b\u52a8\u6280\u80fd,\u6709\u673a\u7387\u5728\u7528\u5251\u7834\u574f\u7279\u5b9a\n&e\u65b9\u5757\u65f6\u83b7\u5f97\u7a00\u6709\u9053\u5177. -Guides.Herbalism.Section.7=&3\u53cc\u500d\u6389\u843d\u5982\u4f55\u5de5\u4f5c?\n&e\u8fd9\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd\u4f7f\u73a9\u5bb6\u80fd\u52a0\u500d\u6536\u83b7. +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\u5173\u4e8e\u6316\u77ff:\n&e\u6316\u77ff\u5305\u62ec\u6316\u6398\u77f3\u5934\u548c\u77ff\u7269. \n&e\u6316\u77ff\u6280\u80fd\u53ef\u4ee5\u63d0\u4f9b\u591a\u91cd\u77ff\u7269\u6389\u843d\u7684\u5956\u52b1.\n\n&3\u7ecf\u9a8c\u6765\u6e90:\n&e\u83b7\u53d6\u6b64\u6280\u80fd\u7684\u7ecf\u9a8c\u503c, \u4f60\u5fc5\u987b\u62ff\u7740\u77ff\u9550\u8fdb\u884c\u6316\u6398.\n&e\u53ea\u6709\u7279\u5b9a\u65b9\u5757\u624d\u80fd\u83b7\u53d6\u7ecf\u9a8c. -Guides.Mining.Section.1=&3\u517c\u5bb9\u6750\u6599:\n&e\u77f3\u5934,\u7164\u77ff\u77f3,\u94c1\u77ff\u77f3,\u91d1\u77ff\u77f3,\u94bb\u77f3\u77ff\u77f3,\u7ea2\u77f3\u77ff\u77f3,\n&e\u9752\u91d1\u77f3\u77ff\u77f3,\u9ed1\u66dc\u77f3,\u82d4\u77f3,\u672b\u5730\u77f3,\n&e\u8424\u77f3,\u5730\u72f1\u5ca9. -Guides.Mining.Section.2=&3\u5982\u4f55\u4f7f\u7528\u8d85\u7ea7\u788e\u77f3\u673a:\n&e\u628a\u9550\u5b50\u62ff\u5728\u4f60\u7684\u624b\u4e0a,\u6309\u4e0b\u53f3\u952e\u6765\u51c6\u5907\u4f60\u7684\u9550\u5b50.\n&e\u4f60\u5c06\u67094\u79d2\u949f\u7684\u65f6\u95f4\u6765\u6fc0\u53d1\u4f60\u7684\u6280\u80fd.\n&e\u5f53\u4f60\u6572\u4e0b\u5bf9\u5e94\u7684\u77f3\u5934\u4ee5\u540e,\u8d85\u7ea7\u788e\u77f3\u673a\u5c06\u88ab\u6fc0\u6d3b. -Guides.Mining.Section.3=&3\u4ec0\u4e48\u662f\u8d85\u7ea7\u788e\u77f3\u673a?\n&e\u8d85\u7ea7\u788e\u77f3\u673a\u662f\u4e00\u4e2a\u4e3b\u52a8\u6280\u80fd\n&e\u5b83\u80fd\u4f7f\u4f60\u5728\u6316\u6389\u5bf9\u5e94\u77ff\u77f3\u7684\u65f6\u5019\u589e\u52a03\u500d\u6389\u843d\u51e0\u7387\n&e\u5e76\u4e14\u5728\u6280\u80fd\u65f6\u95f4\u5185\u77ac\u95f4\u7834\u574f\u77f3\u5934\u548c\u77ff\u77f3 -Guides.Mining.Section.4=&3\u5982\u4f55\u4f7f\u7528\u7206\u7834\u5f00\u91c7:\n&e\u628a\u96f7\u7ba1\u62ff\u5728\u624b\u4e0a,\u9ed8\u8ba4\u7684\u60c5\u51b5\u4e0b\u662f\u6253\u706b\u5668.\n&e\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=&3\u4ec0\u4e48\u662f\u7206\u7834\u5f00\u91c7?\n&e\u7206\u7834\u5f00\u91c7\u662f\u4e00\u4e2a\u9700\u8981\u51b7\u5374\u65f6\u95f4\u7684\u6316\u77ff\u6280\u80fd\n&e\u5b83\u80fd\u4f7f\u4f60\u5728\u4f7f\u7528TNT\u70b8\u77ff\u65f6\u83b7\u5f97\u989d\u5916\u5956\u52b1\n&e\u7206\u7834\u5f00\u91c7\u603b\u5171\u67093\u4e2a\u529f\u80fd\n&e\u5927\u53f7\u70b8\u5f39:\u4f7f\u4f60\u7684TNT\u7206\u70b8\u8303\u56f4\u6269\u5927\n&e\u7206\u7834\u4e13\u5bb6:\u964d\u4f4e\u4f60\u53d7\u5230TNT\u7684\u7206\u70b8\u4f24\u5bb3\n&e\u7206\u7834\u5f00\u91c7:\u4f7f\u4f60\u70b9\u71c3\u7684TNT\u70b8\u4e0b\u8303\u56f4\u5185\u4e00\u5b9a\u6570\u91cf\u7684\u77ff\u77f3 +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\u5173\u4e8e\u4fee\u7406:\n&e\u4fee\u7406\u53ef\u4ee5\u8ba9\u4f60\u4f7f\u7528\u94c1\u5757\u6765\u4fee\u7406\u76d4\u7532\u548c\u5de5\u5177.\n\n&3\u7ecf\u9a8c\u6765\u6e90:\n&e\u4f7f\u7528mcMMO\u7684\u94c1\u7827\u4fee\u7406\u5de5\u5177\u6216\u88c5\u5907. \n&emcMMO\u9ed8\u8ba4\u7684\u4fee\u7406\u53f0\u662f\u94c1\u5757\n&e\u4e0d\u8981\u4e0e\u7528\u7ecf\u9a8c\u4fee\u590d\u7684\u94c1\u7827\u6df7\u6dc6. -Guides.Repair.Section.1=&3\u5982\u4f55\u4f7f\u7528\u4fee\u7406?\n&e\u653e\u7f6e\u4e00\u4e2amcMMO\u94c1\u7827(\u94c1\u5757),\u624b\u6301\u9700\u8981\u4fee\u7406\u7684\u9053\u5177 \n&e\uff0c\u53f3\u952e\u70b9\u51fb\u94c1\u5757\uff0c\u6bcf\u6b21\u4f7f\u7528\u6d88\u8017\u4e00\u4e2a\u7269\u54c1 -Guides.Repair.Section.2=&3\u4fee\u7406\u7cbe\u901a\u5982\u4f55\u5de5\u4f5c?\n&e\u4fee\u7406\u7cbe\u901a\u63d0\u5347\u4fee\u7406\u65f6\u8010\u4e45\u6062\u590d\u91cf. \n&e\u989d\u5916\u4fee\u7406\u7684\u8010\u4e45\u503c\u91cf\u53d6\u51b3\u4e8e\u4f60\u7684\u4fee\u7406\u6280\u80fd\u7b49\u7ea7. -Guides.Repair.Section.3=&3\u8d85\u7ea7\u4fee\u7406\u5982\u4f55\u5de5\u4f5c?\n&e\u8d85\u7ea7\u4fee\u7406\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd. \u5f53\u4fee\u7406\u4e00\u4e2a\u7269\u54c1\u65f6,\n&e\u4f1a\u4f7f\u7269\u54c1\u7684\u4fee\u7406\u6548\u679c\u7ffb\u500d. -Guides.Repair.Section.4=&3\u79d8\u6cd5\u953b\u9020\u5982\u4f55\u5de5\u4f5c?\n&e\u8fd9\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd\uff0c\u5141\u8bb8\u4f60\u4fee\u590d\u9644\u9b54\u7269\u54c1\n&e\u4fee\u7406\u7269\u54c1\u65f6\u6709\u4e00\u5b9a\u51e0\u7387\u4fdd\u7559\u9644\u9b54\u5c5e\u6027\n&e\u9644\u9b54\u5c5e\u6027\u53ef\u4ee5\u4fdd\u6301\u73b0\u6709\u7684\u7b49\u7ea7\uff0c\n&e\u964d\u7ea7\u5230\u4e00\u4e2a\u8f83\u4f4e\u7b49\u7ea7\u6216\u8005\u5b8c\u5168\u6d88\u5931. +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\u5173\u4e8e\u5206\u89e3:\n&e\u5206\u89e3\u4f7f\u4f60\u53ef\u4ee5\u4f7f\u7528\u91d1\u5757\u6765\u5206\u89e3\u88c5\u5907\u548c\u5de5\u5177.\n\n&3\u7ecf\u9a8c\u6765\u6e90:\n&e\u5206\u89e3\u65f6\u4fee\u7406\u548c\u9493\u9c7c\u7684\u5b50\u6280\u80fd\uff0c\n&e\u6280\u80fd\u7b49\u7ea7\u53d6\u51b3\u4e8e\u4f60\u7684\u9493\u9c7c\u548c\u4fee\u7406\u7684\u7b49\u7ea7. -Guides.Salvage.Section.1=&3\u5982\u4f55\u4f7f\u7528\u5206\u89e3?\n&e\u653e\u4e00\u4e2amcMMO\u5206\u89e3\u7827(\u91d1\u5757)\u62ff\u7740\u7269\u54c1\u53f3\u952e\u91d1\u5757.\n&e\u8fd9\u5c06\u62c6\u89e3\u7269\u54c1,\u5e76\u8fd4\u8fd8\u7269\u54c1\u7684\u5236\u4f5c\u539f\u6599\n&e\u4f8b\u5982:\u62c6\u89e3\u94c1\u9550\u4f60\u5c06\u83b7\u5f97\u94c1\u952d. -Guides.Salvage.Section.2=&3\u5982\u4f55\u4f7f\u7528\u8fdb\u9636\u5206\u89e3?\n&e\u89e3\u9501\u540e,\u6b64\u529f\u80fd\u4f7f\u4f60\u53ef\u4ee5\u5206\u89e3\u635f\u574f\u7684\u7269\u54c1.\n&e\u968f\u7740\u7b49\u7ea7\u7684\u63d0\u5347\u5206\u89e3\u6240\u5f97\u7684\u7269\u54c1\u4f1a\u83b7\u5f97\u66f4\u591a\u7684\u6750\u6599\n&e\u901a\u8fc7\u8fdb\u9636\u5206\u89e3\u4f60\u59cb\u7ec8\u80fd\u83b7\u5f97\u4e00\u4e2a\u6750\u6599.\n&e\u4e0d\u7528\u62c5\u5fc3\u4e0d\u4f1a\u83b7\u5f97\u6750\u6599\uff0c\u9664\u975e\u4f60\u7684\u8010\u4e45\u503c\u592a\u4f4e. -Guides.Salvage.Section.3=&3\u4e3a\u4e86\u8bf4\u660e\u8fd9\u662f\u5982\u4f55\u5de5\u4f5c\u7684, \u8fd9\u6709\u4e00\u4e2a\u4f8b\u5b50:\n&e\u5047\u8bbe\u6211\u4eec\u5206\u89e3\u4e86\u4e00\u4e2a\u635f\u574f\u4e8620%\u7684\u91d1\u9550,\n&e\u4ea6\u4e3a\u4e4b\u4f60\u6700\u591a\u83b7\u5f97\u4e24\u4e2a\u91d1\u952d\n&e(\u56e0\u4e3a\u91d1\u9550\u4f7f\u7528\u4e09\u4e2a\u91d1\u952d\u5236\u4f5c\u7684\uff0c\n&e33,33% \u7684\u635f\u8017) \u7b49\u4e8e 66% \u7684\u8010\u4e45\u503c. \n&e\u5982\u679c\u4f60\u5206\u89e3\u7684\u7269\u54c1\u8010\u4e45\u503c\u4f4e\u4e8e66%\u5219\u65e0\u6cd5\u83b7\u5f97\u4e24\u4e2a\u539f\u6599.\u9ad8\u4e8e\u6b64\u503c\u83b7\u5f97\u4e24\u4e2a. -Guides.Salvage.Section.4=&3\u5982\u4f55\u4f7f\u7528\u5965\u672f\u5206\u89e3?\n&e\u8fd9\u4e2a\u6280\u80fd\u53ef\u4ee5\u4f7f\u4f60\u5728\u5206\u89e3\u9644\u9b54\u7269\u54c1\u65f6\u83b7\u5f97\u9644\u9b54\u4e66\n&e\u6839\u636e\u4f60\u7684\u5206\u89e3\u7b49\u7ea7\uff0c\u5206\u4e3a\u5168\u90e8\u63d0\u53d6\u548c\u90e8\u5206\u63d0\u53d6\n&e\u5f53\u5206\u89e3\u4e3a\u90e8\u5206\u63d0\u53d6\u65f6.\n\n&e\u9644\u9b54\u4e66\u7684\u9644\u9b54\u4e0e\u7269\u54c1\u76f8\u6bd4\n&e\u9644\u9b54\u7b49\u7ea7\u504f\u4f4e. +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=\u9a6c\u4e0a\u5230\u6765... +Guides.Smelting.Section.0=马上到来... ##剑术 -Guides.Swords.Section.0=&3\u5173\u4e8e\u5251\u672f:\n&e\u8fd9\u4e2a\u6280\u80fd\u5728\u4f7f\u7528\u5251\u8fdb\u884c\u6218\u6597\u65f6\n&e\u63d0\u4f9b\u5404\u79cd\u52a0\u6210.\n\n&3\u7ecf\u9a8c\u6765\u6e90:\n&e\u7ecf\u9a8c\u503c\u662f\u901a\u8fc7\u7528\u5251\u5bf9\u602a\u7269\u6216\u5176\u4ed6\u73a9\u5bb6 \n&e\u9020\u6210\u4f24\u5bb3\u83b7\u5f97. -Guides.Swords.Section.1=&3\u5982\u4f55\u4f7f\u7528\u5229\u5203\u7a81\u523a?\n&e\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&e\u8fd9\u4e2a\u6280\u80fd\u8ba9\u4f60\u53d1\u52a8\u8303\u56f4\u653b\u51fb\uff0c\u63d0\u4f9b25%\u7684\u4f24\u5bb3\u52a0\u6210 \n&e\u5e76\u4f34\u6709\u6495\u88c2\u6548\u679c. -Guides.Swords.Section.2=&3\u53cd\u51fb\u5982\u4f55\u5de5\u4f5c?\n&e\u53cd\u51fb\u662f\u4e00\u4e2a\u4e3b\u52a8\u6280\u80fd\uff0c\u683c\u6321\u5bf9\u624b\u5bf9\u4f60\u7684\u4f24\u5bb3\n&e\u5e76\u6709\u51e0\u7387\u53cd\u5c0450%\u7684\u4f24\u5bb3\u7ed9\u5bf9\u624b. -Guides.Swords.Section.3=&3\u6495\u88c2\u5982\u4f55\u5de5\u4f5c?\n&e\u6495\u88c2\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd\uff0c\u653b\u51fb\u65f6\u6709\u51e0\u7387\u51fa\u53d1\u6495\u88c2. \n&e\u6495\u88c2\u4f1a\u5bf9\u5bf9\u5c11\u9020\u6210\u6301\u7eed\u7684\u6d41\u8840\u4f24\u5bb3,\u76f4\u5230\u6301\u7eed\u65f6\u95f4\u7ed3\u675f\u6216\u5bf9\u624b\u6b7b\u4ea1, \n&e\u6301\u7eed\u65f6\u95f4\u53d6\u51b3\u4e8e\u4f60\u7684\u5251\u672f\u7b49\u7ea7. +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\u9a6f\u517d\n&e\u9a6f\u517d\u6280\u80fd\u8ba9\u73a9\u5bb6\u80fd\u5728\u7528\u72fc\u6218\u6597\u65f6\n&e\u65f6\u6709\u52a0\u6210\u6548\u679c.\n\n&3\u7ecf\u9a8c\u6765\u6e90:\n&e\u8981\u83b7\u53d6\u7ecf\u9a8c,\u987b\u8bad\u670d\u72fc\u6216\u8c79\u732b,\n&e\u6216\u4e0e\u4f60\u7684\u72fc\u4e00\u540c\u6218\u6597. -Guides.Taming.Section.1=&3\u4ec0\u4e48\u662f\u91ce\u6027\u7684\u53ec\u5524?\n&e\u91ce\u6027\u7684\u53ec\u5524\u662f\u4e00\u4e2a\u4e3b\u52a8\u6280\u80fd\u8ba9\u4f60\n&e\u53ef\u4ee5\u53ec\u5524\u4e00\u53ea\u72fc\u6216\u8c79\u732b,\n&e\u53ea\u8981\u624b\u6301\u9aa8\u5934\u6216\u751f\u9c7c,\u70b9\u5de6\u952e. -Guides.Taming.Section.2=&3\u4ec0\u4e48\u662f\u91ce\u517d\u4fe1\u606f?\n&e\u91ce\u517d\u4fe1\u606f\u80fd\u8ba9\u4f60\u67e5\u770b\u5ba0\u7269\u7684\u72b6\u6001,\n&e\u5bf9\u5ba0\u7269\u70b9\u51fb\u5de6\u952e\u5c31\u80fd\u4f7f\u7528\u8fd9\u9879\u80fd\u529b. -Guides.Taming.Section.3=&3\u4ec0\u4e48\u662f\u55dc\u8840?\n&e\u8840\u8165\u653b\u51fb\u662f\u4e00\u4e2a\u4e3b\u52a8\u6280\u80fd,\u80fd\u9020\u6210\n&e\u72fc\u7684\u653b\u51fb\u76ee\u6807\u6709\u673a\u7387\u9677\u5165\u6d41\u8840\u72b6\u6001. -Guides.Taming.Section.4=&3\u4ec0\u4e48\u662f\u5229\u722a?\n&e\u5229\u722a\u4f7f\u72fc\u7684\u653b\u51fb\u529b\u968f\u7740\u9a6f\u517d\u7b49\u7ea7\n&e\u589e\u52a0\u800c\u589e\u52a0. -Guides.Taming.Section.5=&3\u4ec0\u4e48\u662f\u73af\u5883\u611f\u77e5?\n&e\u8fd9\u4e2a\u88ab\u52a8\u6280\u80fd\u80fd\u8ba9\u72fc\u5728\u9047\u5230\u5371\u9669\u65f6\n&e\u8fc5\u901f\u56de\u5230\u4f60\u8eab\u8fb9(\u5982\u4ed9\u4eba\u638c\u6216\u5ca9\u6d46),\n&e\u4e5f\u53ef\u4ee5\u51cf\u514d\u6454\u843d\u4f24\u5bb3. -Guides.Taming.Section.6=&3\u4ec0\u4e48\u662f\u6bdb\u76ae\u5f3a\u5316?\n&e\u8fd9\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd\u80fd\u8ba9\u72fc\n&e\u53d7\u5230\u653b\u51fb\u6216\u71c3\u70e7\u65f6\u51cf\u514d\u4f24\u5bb3. -Guides.Taming.Section.7=&3\u4ec0\u4e48\u662f\u51b2\u51fb\u6297\u6027?\n&e\u8fd9\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd,\u8ba9\u72fc\u7fa4\n&e\u51cf\u514d\u7206\u70b8\u4f24\u5bb3. -Guides.Taming.Section.8=&3\u4ec0\u4e48\u662f\u5feb\u9910\u670d\u52a1?\n&e\u8fd9\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd,\u8ba9\u72fc\u7fa4\u5728\u653b\u51fb\u65f6\n&e\u6709\u51e0\u7387\u6062\u590d\u8840\u91cf. +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\u683c\u6597:\n&e\u683c\u6597\u4f7f\u73a9\u5bb6\u5728\u4f7f\u7528\u62f3\u5934\u4f5c\u6218\u65f6\u6709\n&e\u5404\u79cd\u52a0\u6210\u6548\u679c.\n\n&3\u7ecf\u9a8c\u83b7\u53d6:\n&e\u5728\u7528\u624b\u653b\u51fb\u602a\u7269\u6216\u73a9\u5bb6\u65f6\u53ef\u4ee5\u83b7\u53d6\u7ecf\u9a8c. -Guides.Unarmed.Section.1=&3\u4ec0\u4e48\u662f\u72c2\u66b4?\n&e\u72c2\u66b4\u662f\u4e3b\u52a8\u6280\u80fd,\u7a7a\u624b\u65f6\u70b9\u51fb\u53f3\u952e\u53d1\u52a8.\n&e\u72c2\u66b4\u53ef\u4ee5\u52a0\u621050%\u5bf9\u65b9\u5757\u7684\u4f24\u5bb3,\n&e\u4f7f\u4f60\u53ef\u4ee5\u8f7b\u677e\u7834\u574f\u8106\u5f31\u7269\u4f53,\n&e\u5982\u6ce5\u571f\u4e0e\u6c99\u5b50. -Guides.Unarmed.Section.2=&3\u4ec0\u4e48\u662f\u94c1\u81c2\u5f0f?\n&e\u94c1\u81c2\u80fd\u589e\u52a0\u5f92\u624b\u653b\u51fb\u602a\u7269\u6216\n&e\u73a9\u5bb6\u7684\u4f24\u5bb3. -Guides.Unarmed.Section.3=&3\u4ec0\u4e48\u662f\u7bad\u77e2\u504f\u5411?\n&e\u7bad\u77e2\u504f\u5411\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd,\u8ba9\u4f60\u6709\u673a\u7387\n&e\u80fd\u6539\u53d8\u9ab7\u9ac5\u83b7\u73a9\u5bb6\u5c04\u5411\u4f60\u7684\u7bad\u7684\u65b9\u5411.\n&e\u7bad\u4f1a\u843d\u81f3\u5730\u9762. -Guides.Unarmed.Section.4=&3\u4ec0\u4e48\u662f\u94c1\u8155?\n&e\u94c1\u8155\u6709\u51e0\u7387\u9632\u6b62\u5bf9\u624b\u7684\u7f34\u68b0.\n&e\u51fa\u53d1\u7684\u51e0\u7387\u5374\u51b3\u4e8e\u4f60\u683c\u6597\u7684\u7b49\u7ea7. -Guides.Unarmed.Section.5=&3\u4ec0\u4e48\u662f\u7f34\u68b0?\n&e\u8fd9\u4e2a\u88ab\u52a8\u6280\u80fd\u8ba9\u73a9\u5bb6\u89e3\u9664\u5176\u4ed6\u73a9\u5bb6\u7684\u6b66\u88c5,\n&e\u4f7f\u76ee\u6807\u6240\u88c5\u5907\u7684\u7269\u54c1\u6389\u843d\u5230\u5730\u4e0a. +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\u5173\u4e8e\u4f10\u6728:\n&e\u4f10\u6728\u662f\u5173\u4e8e\u780d\u6811\u7684.\n\n&3\u7ecf\u9a8c\u6765\u6e90:\n&e\u7834\u574f\u6728\u5934\u7c7b\u7684\u65b9\u5757\u5c31\u4f1a\u83b7\u5f97\u4f10\u6728\u7ecf\u9a8c. -Guides.Woodcutting.Section.1=&3\u4f10\u6728\u5de5\u5982\u4f55\u5de5\u4f5c?\n&e\u4f10\u6728\u5de5\u662f\u4e00\u4e2a\u4e3b\u52a8\u6280\u80fd\n&e\u5728\u624b\u6301\u65a7\u5934\u7684\u540c\u65f6\u53f3\u952e\u5e76\u7834\u574f\u6728\u5934\u4ee5\u6fc0\u6d3b\u4f10\u6728\u5de5\n&e\u8fd9\u5c06\u77ac\u95f4\u7834\u574f\u6574\u68f5\u6811. -Guides.Woodcutting.Section.2=&3\u79cb\u98ce\u626b\u843d\u53f6\u5982\u4f55\u5de5\u4f5c?\n&e\u79cb\u98ce\u626b\u843d\u53f6\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd\n&e\u5f53\u65a7\u5934\u51fb\u4e2d\u6811\u53f6\u65b9\u5757\u65f6\u4f1a\u5bfc\u81f4\u77ac\u95f4\u6d88\u5931\n&e\u9ed8\u8ba4\u60c5\u51b5\u4e0b\uff0c100\u7ea7\u89e3\u9501. -Guides.Woodcutting.Section.3=&3\u6811\u6728\u4e30\u6536\u5982\u4f55\u5de5\u4f5c?\n&e\u8fd9\u4e2a\u88ab\u52a8\u6280\u80fd\u4f7f\u4f60\u5728\u780d\u6811\u65f6\n&e\u6709\u51e0\u7387\u6389\u843d\u53cc\u500d\u6728\u5934. +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\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 &e{0} -Inspect.Stats=&e{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! +Inspect.Offline= &c你没有查询不在线玩家信息的权限! +Inspect.OfflineStats=不在线玩家的mcMMO统计信息 &e{0} +Inspect.Stats=&e{0} 的mcMMO统计信息 +Inspect.TooFar=你无法检查那个玩家因为你们距离太远了! #物品 -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=&7\u4f20\u9001\u81f3\u4f60\u7684\u5e8a. -Item.ChimaeraWing.NotEnough=\u4f60\u9700\u8981 &e{0}&c \u66f4\u591a &6{1}&c! -Item.NotEnough=\u4f60\u9700\u8981 &e{0}&c \u66f4\u591a &6{1}&c! -Item.Generic.Wait=\u4f60\u9700\u8981\u7b49\u5f85\u4e00\u6bb5\u65f6\u95f4\u624d\u80fd\u518d\u6b21\u4f7f\u7528! &e({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. &e({0}s) -Item.FluxPickaxe.Name=\u707c\u70ed\u4e4b\u9550 -Item.FluxPickaxe.Lore.1=&7\u6709\u51e0\u7387\u77ac\u95f4\u7194\u70bc\u77ff\u7269\u3002 -Item.FluxPickaxe.Lore.2=&7\u9700\u8981\u7194\u70bc\u7b49\u7ea7 {0}+ +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\u4f20\u9001\u5c06\u5728 &6({0}) &7 \u79d2\u540e\u8fdb\u884c, \u8bf7\u4fdd\u6301\u7ad9\u7acb\u4e0d\u52a8... -Teleport.Cancelled=&4\u4f20\u9001\u5df2\u53d6\u6d88! +Teleport.Commencing=&7传送将在 &6({0}) &7 秒后进行, 请保持站立不动... +Teleport.Cancelled=&4传送已取消! #技能 -Skills.Child=&6(\u5206\u652f\u6280\u80fd) -Skills.Disarmed=&4\u4f60\u88ab\u7f34\u68b0\u4e86! +Skills.Child=&6(分支技能) +Skills.Disarmed=&4你被缴械了! Skills.Header=-----[] &a{0}&c []----- -Skills.NeedMore=&4\u4f60\u9700\u8981\u66f4\u591a &7{0} -Skills.NeedMore.Extra=&4\u4f60\u9700\u8981\u66f4\u591a &7{0}{1} -Skills.Parents=\u4e3b\u6280\u80fd +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=\u6700\u5927 -Skills.TooTired=\u4f60\u592a\u7d2f\u4e86\u6682\u65f6\u65e0\u6cd5\u4f7f\u7528\u8be5\u6280\u80fd.&e({0}s) +Skills.MaxXP=最大 +Skills.TooTired=你太累了暂时无法使用该技能.&e({0}s) Skills.TooTired.Named=&7(&6{0}&e {1}s&7) -Skills.TooTired.Extra=&6{0} &e\u6280\u80fd\u51b7\u5374\u65f6\u95f4 - {1} -Skills.Cancelled=&6{0} &c\u5df2\u53d6\u6d88! -Skills.ConfirmOrCancel=&a\u518d\u6b21\u53f3\u952e\u4ee5\u786e\u5b9a &6{0}&a. \u5de6\u952e\u53d6\u6d88. -Skills.AbilityGateRequirementFail=&7\u4f60\u9700\u8981 &e{0}&7 \u7ea7\u4ee5\u4e0a\u7684 &3{1}&7 \u6765\u4f7f\u7528\u8fd9\u4e2a\u80fd\u529b. +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-=\u683c\u6597\u6280\u80fd=- -Stats.Header.Gathering=&6-=\u91c7\u96c6\u6280\u80fd=- -Stats.Header.Misc=&6-=\u6742\u9879\u6280\u80fd=- -Stats.Own.Stats=&a[mcMMO] \u7edf\u8ba1\u4fe1\u606f +Stats.Header.Combat=&6-=格斗技能=- +Stats.Header.Gathering=&6-=采集技能=- +Stats.Header.Misc=&6-=杂项技能=- +Stats.Own.Stats=&a[mcMMO] 统计信息 #经验加成 -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=&6 ({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=&6 ({0} \u79d2\u989d\u5916\u6301\u7eed\u65f6\u95f4) +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] \u786c\u6838\u6a21\u5f0f {0} \u5173\u95ed. {1} -Hardcore.Mode.Enabled=&6[mcMMO] \u786c\u6838\u6a21\u5f0f {0} \u542f\u7528. {1} -Hardcore.DeathStatLoss.Name=\u6280\u80fd\u6b7b\u4ea1\u60e9\u7f5a -Hardcore.DeathStatLoss.PlayerDeath=&6[mcMMO] &4\u6b7b\u4ea1,\u4f60\u5931\u53bb\u4e86 &9{0}&4. -Hardcore.DeathStatLoss.PercentageChanged=&6[mcMMO] \u72b6\u6001\u9057\u5931\u7387\u53d8\u66f4\u4e3a {0}. -Hardcore.Vampirism.Name=\u5438\u8840\u6a21\u5f0f -Hardcore.Vampirism.Killer.Failure=&6[mcMMO] &e{0}&7\u592a\u4e0d\u719f\u7ec3\u6388\u4e88\u4f60\u83b7\u5f97\u4efb\u4f55\u7684\u77e5\u8bc6. -Hardcore.Vampirism.Killer.Success=&6[mcMMO] &3\u4f60\u4ece&e{1}&3\u90a3\u5077\u53d6\u4e86&9{0}&3\u4e2a\u7b49\u7ea7. -Hardcore.Vampirism.Victim.Failure=&6[mcMMO] &e{0}&7\u65e0\u6cd5\u4ece\u4f60\u8fd9\u5077\u53d6\u4efb\u4f55\u7684\u77e5\u8bc6! -Hardcore.Vampirism.Victim.Success=&6[mcMMO] &e{0}&4\u4ece\u4f60\u8fd9\u5077\u53d6\u4e86&9{1}&4\u4e2a\u7b49\u7ea7! -Hardcore.Vampirism.PercentageChanged=&6[mcMMO] \u72b6\u6001\u5438\u6536\u7387\u53d8\u66f4\u4e3a {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=&3\u6350\u8d60\u4fe1\u606f: -MOTD.Hardcore.Enabled=&6[mcMMO] &3\u786c\u6838\u6a21\u5f0f\u5df2\u542f\u7528: &4{0} -MOTD.Hardcore.DeathStatLoss.Stats=&6[mcMMO] &3\u6280\u80fd\u6b7b\u4ea1\u60e9\u7f5a: &4{0}% -MOTD.Hardcore.Vampirism.Stats=&6[mcMMO] &3Vampirism\u7edf\u8ba1: &4{0}% -MOTD.PerksPrefix=&6[mcMMO \u80fd\u529b] -MOTD.Version=&6[mcMMO] \u6b63\u5728\u8fd0\u884c\u7248\u672c &3{0} -MOTD.Website=&6[mcMMO] &a{0}&e - mcMMO \u7f51\u5740 +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=\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: &e{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: &e{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 +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=\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 +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=\u4f60\u6b63\u5728\u4f7f\u7528\u8fd9\u4e00\u4e2a\u65e7\u7248\u672c\u7684 mcMMO! -UpdateChecker.NewAvailable=Spigot \u4e0a\u6709\u4e00\u4e2a\u65b0\u7248\u672c. +UpdateChecker.Outdated=你正在使用这一个旧版本的 mcMMO! +UpdateChecker.NewAvailable=Spigot 上有一个新版本. #记分板抬头 -Scoreboard.Header.PlayerStats=&emcMMO \u7edf\u8ba1 -Scoreboard.Header.PlayerCooldowns=&emcMMO \u51b7\u5374 -Scoreboard.Header.PlayerRank=&emcMMO \u6392\u540d -Scoreboard.Header.PlayerInspect=&emcMMO \u7edf\u8ba1: {0} -Scoreboard.Header.PowerLevel=&c\u6218\u6597\u529b -Scoreboard.Misc.PowerLevel=&6\u6218\u6597\u529b -Scoreboard.Misc.Level=&3\u7b49\u7ea7 -Scoreboard.Misc.CurrentXP=&a\u5f53\u524d\u7ecf\u9a8c -Scoreboard.Misc.RemainingXP=&e\u5347\u7ea7\u6240\u9700\u7ecf\u9a8c -Scoreboard.Misc.Cooldown=&d\u51b7\u5374 -Scoreboard.Misc.Overall=&6\u603b\u4f53 -Scoreboard.Misc.Ability=\u80fd\u529b +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\u4f60\u7684mcMMO\u73a9\u5bb6\u6570\u636e\u672a\u52a0\u8f7d. -Profile.Loading.Success=&a\u4f60\u7684mcMMO\u6570\u636e\u5df2\u52a0\u8f7d -Profile.Loading.Failure=&cmcMMO \u65e0\u6cd5\u52a0\u8f7d\u4f60\u7684\u6570\u636e. \u8bf7\u8054\u7cfb &b\u670d\u52a1\u5668\u7ba1\u7406\u5458\u53cd\u9988\u4f60\u7684\u95ee\u9898.\n&e\u4f60\u53ef\u4ee5\u7ee7\u7eed\u5728\u670d\u52a1\u5668\u6e38\u73a9, \u4f46\u662f\u4f60 &l\u6ca1\u6709mcMMO\u7b49\u7ea7&e \u5e76\u4e14\u4f60\u83b7\u5f97\u7684\u4efb\u4f55\u7ecf\u9a8c\u90fd &l\u4e0d\u4f1a\u88ab\u4fdd\u5b58&e. -Profile.Loading.AdminFailureNotice=&4[A]&c mcMMO \u65e0\u6cd5\u52a0\u8f7d\u73a9\u5bb6 &e{0}&c \u7684\u6570\u636e. &d\u8bf7\u68c0\u67e5\u4f60\u7684\u6570\u636e\u5e93. +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} \u73b0\u5728 &a{1}&6 \u7ea7! -Holiday.Anniversary=&9mcMMO {0} \u5468\u5e74\u5feb\u4e50!\n&9\u4e3a\u4e86\u7eaa\u5ff5 nossr50 \u548c\u6240\u6709\u5f00\u53d1\u8005\u7684\u5de5\u4f5c, \u8fd9\u91cc\u6709\u4e00\u573a\u70df\u706b\u8868\u6f14! +Holiday.AprilFools.Levelup=&6{0} 现在 &a{1}&6 级! +Holiday.Anniversary=&9mcMMO {0} 周年快乐!\n&9为了纪念 nossr50 和所有开发者的工作, 这里有一场烟火表演! #提醒消息 -Reminder.Squelched=&7\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. +Reminder.Squelched=&7提醒: 你现在不接收来自mcMMO的通知消息, 如想启用请再次使用 /mcnotify 命令. 该提示每小时一次. #本地化 -Locale.Reloaded=&a\u8bed\u8a00\u914d\u7f6e\u5df2\u91cd\u65b0\u52a0\u8f7d\uff0c\u4e2d\u6587\u6c49\u5316By: GhostDC \u4fee\u6539\u81ea\u539f\u6c49\u5316\u4f5c\u8005:aFu_Meng\u53d1\u73b0\u9519\u522b\u5b57\u8bf7\u8054\u7cfb\u6211QQ:1007199608) +Locale.Reloaded=&a语言配置已重新加载,中文汉化By: GhostDC 修改自原汉化作者:aFu_Meng发现错别字请联系我QQ:1007199608) #玩家离开相关 -LevelCap.PowerLevel=&6(&amcMMO&6) &e\u4f60\u5df2\u7ecf\u5230\u8fbe\u4e86\u6218\u6597\u529b\u7684\u7b49\u7ea7\u5c01\u9876 &c{0}&e \u7ea7. \u4f60\u5c06\u505c\u6b62\u83b7\u53d6\u6280\u80fd\u7ecf\u9a8c. -LevelCap.Skill=&6(&amcMMO&6) &e\u4f60\u5df2\u7ecf\u5230\u8fbe\u4e86 &6{1}&e \u6280\u80fd\u7684\u7b49\u7ea7\u5c01\u9876 &c{0}&e . \u4f60\u7684\u8be5\u6280\u80fd\u5c06\u65e0\u6cd5\u518d\u5347\u7ea7. -Commands.XPBar.Usage=\u6b63\u786e\u7684\u7528\u6cd5\u662f /mmoxpbar -Commands.Description.mmoxpbar=mcMMO \u7ecf\u9a8c\u6761\u7684\u8bbe\u7f6e -Commands.Description.mmocompat=\u6709\u5173 mcMMO \u006d\u0063\u004d\u004d\u004f\u0020\u4ee5\u53ca\u5b83\u662f\u5426\u5904\u4e8e\u517c\u5bb9\u6a21\u5f0f\u6216\u529f\u80fd\u9f50\u5168\u7684\u4fe1\u606f\u3002. -Compatibility.Layer.Unsupported=&6\u6b64\u7248\u672c\u7684 Minecraft \u4e0e &a{0}&6 \u4e0d\u517c\u5bb9. -Compatibility.Layer.PartialSupport=&6\u6b64\u7248\u672c\u7684 Minecraft \u4e0e &a{0}&6 \u4e0d\u5b8c\u5168\u517c\u5bb9, \u4f46\u662f mcMMO \u6b63\u5728\u8fd0\u884c\u4e00\u4e2a\u8f85\u52a9\u7cfb\u7edf\u6765\u6a21\u62df\u4e00\u4e9b\u7f3a\u5931\u7684\u529f\u80fd\u3002. -Commands.XPBar.DisableAll=&6 \u6240\u6709\u7684 mcMMO \u7ecf\u9a8c\u6761\u73b0\u5728\u90fd\u5df2\u7ecf\u88ab\u7981\u7528, \u4f7f\u7528 /mmoxpbar reset \u6765\u91cd\u7f6e\u9ed8\u8ba4\u8bbe\u7f6e. +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\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* \u63a7\u5236\u53f0 * -Chat.Channel.On=&6(&amcMMO-\u804a\u5929&6) &e\u4f60\u7684\u804a\u5929\u6d88\u606f\u73b0\u5728\u5c06\u81ea\u52a8\u53d1\u9001\u5230 &a{0}&e \u804a\u5929\u9891\u9053. -Chat.Channel.Off=&6(&amcMMO-\u804a\u5929&6) &7\u4f60\u7684\u804a\u5929\u6d88\u606f\u5c06\u4e0d\u518d\u81ea\u52a8\u53d1\u9001\u5230\u7279\u5b9a\u7684\u804a\u5929\u9891\u9053. -Chat.Spy.Party=&6[&eSPY&6-&a{2}&6] &r{0} &b\u2192 &r{1} -Broadcasts.LevelUpMilestone=&6(&amcMMO&6) {0}&7 \u7684 &3{2}&7 \u6280\u80fd\u7b49\u7ea7\u63d0\u5347\u5230\u4e86 &a{1}&7! -Broadcasts.PowerLevelUpMilestone=&6(&amcMMO&6) {0}&7 \u603b\u7b49\u7ea7\u5df2\u8fbe\u5230 &a{1}&7! -Scoreboard.Recovery=\u6b63\u5728\u5c1d\u8bd5\u6062\u590d mcMMO \u8bb0\u5206\u724c... \ No newline at end of file +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 04af680c2..8bfb2a458 100644 --- a/src/main/resources/locale/locale_zh_TW.properties +++ b/src/main/resources/locale/locale_zh_TW.properties @@ -1,47 +1,47 @@ -#I'm going to try to normalize our locale file\uff0cforgive the mess for now. +#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=\u7b49\u7d1a -JSON.DescriptionHeader=\u63cf\u8ff0 -JSON.JWrapper.Header=\u7d30\u7bc0 -JSON.Type.Passive=\u88ab\u52d5 +JSON.Rank=等級 +JSON.DescriptionHeader=描述 +JSON.JWrapper.Header=細節 +JSON.Type.Passive=被動 JSON.Type.Active=Active -JSON.Type.SuperAbility=\u8d85\u80fd\u529b -JSON.Locked=-=[\u9396\u5b9a]=- -JSON.LevelRequirement=\u7b49\u7d1a\u9700\u6c42 -JSON.JWrapper.Target.Type=\u76ee\u6a19\u985e\u578b \uff1a -JSON.JWrapper.Target.Block=\u65b9\u584a -JSON.JWrapper.Target.Player=\u73a9\u5bb6 -JSON.JWrapper.Perks.Header=&6\u5e78\u904b\u6d25\u8cbc -JSON.JWrapper.Perks.Lucky={0}% \u66f4\u597d\u7684\u8ce0\u7387 -JSON.Hover.Tips=\u5c0f\u63d0\u9192 -JSON.Acrobatics=\u96dc\u6280 -JSON.Alchemy=\u7149\u91d1\u8853 -JSON.Archery=\u7bad\u8853 -JSON.Axes=\u65a7\u6280 -JSON.Excavation=\u6316\u6398 -JSON.Fishing=\u91e3\u9b5a -JSON.Herbalism=\u8349\u85e5\u5b78 -JSON.Mining=\u6316\u7926 -JSON.Repair=\u4fee\u7406 -JSON.Salvage=\u5206\u89e3 -JSON.Swords=\u528d\u8853 -JSON.Taming=\u99b4\u7378 -JSON.Unarmed=\u683c\u9b25 -JSON.Woodcutting=\u4f10\u6728 -JSON.URL.Website=mcMMO \u5b98\u65b9\u7db2\u7ad9 \uff01 -JSON.URL.Discord=mcMMO \u5b98\u65b9 Discord \u4f3a\u670d\u5668 \uff01 -JSON.URL.Patreon=\u652f\u63f4 nossr50 \u548c\u4ed6\u5728 Patreon \u4e0a\u70ba mcMMO \u6240\u505a\u7684\u5de5\u4f5c \uff01 -JSON.URL.Spigot=\u5b98\u65b9 mcMMO \u5728 Spigot \u4e0a\u7684\u8cc7\u6e90\u9801\u9762 \uff01 -JSON.URL.Translation=\u5c07 mcMMO \u7ffb\u8b6f\u6210\u5176\u4ed6\u8a9e\u8a00 \uff01 -JSON.URL.Wiki=\u5b98\u65b9 mcMMO \u7dad\u57fa\u767e\u79d1 \uff01 -JSON.SkillUnlockMessage=&6[mcMMO &e@&3{0} &6\u89e3\u9396\u7b49\u7d1a &3{1}&6 \u7d1a\uff01] -JSON.Hover.Rank=&e&l\u7b49\u7d1a \uff1a &r&f{0} -JSON.Hover.NextRank=&7&o\u4e0b\u6b21\u5347\u7d1a\u7b49\u7d1a {0} -# for JSON.Hover.Mystery you can add {0} to insert the level required into the name\uff0cI don't like how that looks so I'm not doing that atm -JSON.Hover.Mystery=&7\uff1f\uff1f\uff1f -JSON.Hover.Mystery2=&e[&8{0}&e]&8\uff1f\uff1f\uff1f&r +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 @@ -52,1093 +52,1093 @@ JSON.Hover.AtSymbolURL=&e@ JSON.Notification.SuperAbility={0} #These are the JSON Strings used for SubSkills -JSON.Acrobatics.Roll.Interaction.Activated=\u6e2c\u8a66 &c\u7ffb\u6efe\u6e2c\u8a66 -JSON.Acrobatics.SubSkill.Roll.Details.Tips=\u5982\u679c\u4f60\u5728\u6454\u843d\u6642\u6309\u4e0b\u8e72\u4e0b\u9375\uff0c\u4f60\u5c07\u89f8\u767c\u96d9\u500d\u7ffb\u6efe\u6548\u679c -Anvil.SingleItemStack=&c\u4f60\u4e0d\u80fd\u5206\u89e3\u6216\u4fee\u7406\u6709\u591a\u500b\u7269\u54c1\u7684\u7269\u54c1\u5806\uff0c\u8acb\u62c6\u5206\u5f8c\u518d\u4f7f\u7528\u3002 +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\uff08&amcMMO&6\uff09 +mcMMO.Template.Prefix=&6(&amcMMO&6) # BEGIN STYLING -Ability.Generic.Refresh=&a**\u6280\u80fd\u51b7\u537b\u5b8c\u7562 \uff01** +Ability.Generic.Refresh=&a**技能冷卻完畢 !** Ability.Generic.Template.Lock=&7{0} # Skill Command Styling -Ability.Generic.Template=&3{0} \uff1a &a{1} +Ability.Generic.Template=&3{0} : &a{1} Ability.Generic.Template.Custom=&3{0} Skills.Overhaul.Header=&c[]=====[]&a {0} &c[]=====[] -Effects.Effects=\u6548\u679c -Effects.SubSkills.Overhaul=\u5b50\u6280\u80fd -Effects.Child.Overhaul=&3\u5b50\u7b49\u7d1a Lv.& {0}&3 \uff1a {1} -Effects.Child.ParentList=&a{0}&6\uff08&3Lv.&{1}&6\uff09 -Effects.Level.Overhaul=&6\u7b49\u7d1a \uff1a &e{0} &3XP&e\uff08&6{1}&e/&6{2}&e\uff09 +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} \uff1a &a{1} -Commands.Stats.Self.Overhaul=\u7d71\u8a08 -Commands.XPGain.Overhaul=&6\u7d93\u9a57\u4f86\u6e90 \uff1a &3{0} -MOTD.Version.Overhaul=&6[mcMMO] &3\u5927\u6539\u7248\u672c&6 - &3{0} -Overhaul.mcMMO.Header=&c[]=====[]&a mcMMO - \u5927\u6539\u7248\u672c &c[]=====[] +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\u5728\u7dad\u57fa\u767e\u79d1\u4e0a\u67e5\u770b\u6b64\u6280\u80fd \uff01&e] +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}\u63d0\u5347\u5230&r&a&l{2}&r&f \u7d1a\u3002 -Overhaul.Name.Acrobatics=\u96dc\u6280 -Overhaul.Name.Alchemy=\u7149\u91d1\u8853 -Overhaul.Name.Archery=\u7bad\u8853 -Overhaul.Name.Axes=\u65a7\u6280 -Overhaul.Name.Excavation=\u6316\u6398 -Overhaul.Name.Fishing=\u91e3\u9b5a -Overhaul.Name.Herbalism=\u8349\u85e5\u5b78 -Overhaul.Name.Mining=\u6316\u7926 -Overhaul.Name.Repair=\u4fee\u7406 -Overhaul.Name.Salvage=\u5206\u89e3 -Overhaul.Name.Smelting=\u51b6\u7149 -Overhaul.Name.Swords=\u528d\u8853 -Overhaul.Name.Taming=\u99b4\u7378 -Overhaul.Name.Unarmed=\u683c\u9b25 -Overhaul.Name.Woodcutting=\u4f10\u6728 +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 \u6307\u4ee4&c[]--- -Commands.Other=&c---[]&a\u5176\u4ed6\u6307\u4ee4&c[]--- -Commands.Party.Header=&c-----[]&a\u968a\u4f0d&c[]----- -Commands.Party.Features.Header=&c-----[]&a\u7279\u8272&c[]----- -# XP BAR Allows for the following variables -- {0} = Skill Level\uff0c{1} Current XP\uff0c{2} XP Needed for next level\uff0c{3} Power Level\uff0c{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 \uff01 +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\u6b63\u5728\u5b78\u7fd2\u65b0\u6280\u80fd\u2026\u2026 -XPBar.Acrobatics=\u96dc\u6280 Lv.&6{0} -XPBar.Alchemy=\u7149\u91d1\u8853 Lv.&6{0} -XPBar.Archery=\u7bad\u8853 Lv.&6{0} -XPBar.Axes=\u65a7\u6280 Lv.&6{0} -XPBar.Excavation=\u6316\u6398 Lv.&6{0} -XPBar.Fishing=\u91e3\u9b5a Lv.&6{0} -XPBar.Herbalism=\u8349\u85e5\u5b78 Lv.&6{0} -XPBar.Mining=\u6316\u7926 Lv.&6{0} -XPBar.Repair=\u4fee\u7406 Lv.&6{0} -XPBar.Salvage=\u5206\u89e3 Lv.&6{0} -XPBar.Smelting=\u51b6\u7149 Lv.&6{0} -XPBar.Swords=\u528d\u8853 Lv.&6{0} -XPBar.Taming=\u99b4\u7378 Lv.&6{0} -XPBar.Unarmed=\u683c\u9b25 Lv.&6{0} -XPBar.Woodcutting=\u4f10\u6728 Lv.&6{0} -#This is just a preset template that gets used if the 'ExtraDetails' setting is turned on in experience.yml \uff08off by default\uff09\uff0cyou can ignore this template and just edit the strings above -XPBar.Complex.Template={0} &3{4}&f% &3\uff08&f{1}&3/&f{2}&3\uff09 -# XP BAR Allows for the following variables -- {0} = Skill Level\uff0c{1} Current XP\uff0c{2} XP Needed for next level\uff0c{3} Power Level\uff0c{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 \uff01 +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**\u83ef\u723e\u8332\u822c\u7684\u964d\u843d** -Acrobatics.Combat.Proc=&a**\u8ff4\u907f** -Acrobatics.SubSkill.Roll.Stats=&6\u7ffb\u6efe\u6a5f\u7387 &e{0}%&6 \u512a\u96c5\u7ffb\u6efe\u6a5f\u7387&e {1}% -Acrobatics.SubSkill.Roll.Stat=\u7ffb\u6efe\u6a5f\u7387 -Acrobatics.SubSkill.Roll.Stat.Extra=\u512a\u96c5\u7ffb\u6efe\u6a5f\u7387 -Acrobatics.SubSkill.Roll.Name=\u7ffb\u6efe -Acrobatics.SubSkill.Roll.Description=\u6e1b\u5c11\u6216\u8005\u53d6\u6d88\u6389\u843d\u50b7\u5bb3\u3002 -Acrobatics.SubSkill.Roll.Chance=\u7ffb\u6efe\u6a5f\u7387 \uff1a &e{0} -Acrobatics.SubSkill.Roll.GraceChance=\u512a\u96c5\u7684\u7ffb\u6efe\u6a5f\u7387 \uff1a &e{0} -Acrobatics.SubSkill.Roll.Mechanics=&7\u7ffb\u6efe\u662f\u96dc\u6280\u7684\u88ab\u52d5\u5b50\u6280\u80fd\u3002\n\u7576\u4f60\u53d7\u5230\u6454\u843d\u50b7\u5bb3\u6642\uff0c\u6709\u6a5f\u7387\u6703\u6839\u64da\u4f60\u7684\u96dc\u6280\u6280\u80fd\u7b49\u7d1a\u7372\u5f97\u6e1b\u5c11\u50b7\u5bb3\u6216\u514d\u9664\u50b7\u5bb3\uff0c\u5728\u4f60 50 \u7d1a\u6642\u4f60\u6709 &e{0}%&7 \u7684\u6a5f\u7387\u7372\u5f97\u6e1b\u5c11\u50b7\u5bb3\u6216\u514d\u9664\u50b7\u5bb3\uff0c\u5982\u679c\u4f60\u958b\u555f\u512a\u96c5\u7684\u7ffb\u6efe\u5247\u6709 &e{1}%&7 \u7684\u6a5f\u7387\u89f8\u767c\u96d9\u500d\u7ffb\u6efe\u6548\u679c\u3002\n\u89f8\u767c\u7684\u6a5f\u7387\u6703\u96a8\u8457\u4f60\u6280\u80fd\u7b49\u7d1a\u7dda\u6027\u589e\u9577\uff0c\u76f4\u5230 &e{2}&7 \u7d1a\uff0c\u6bcf\u4e00\u7d1a\u7684\u96dc\u6280\u7b49\u7d1a\u63d0\u4f9b &e{3}%&7 \u7684\u89f8\u767c\u6a5f\u7387\u3002\n\u900f\u904e\u6309\u4f4f\u8e72\u4e0b\u9375 \uff08shift\uff09 \u53ef\u4ee5\u7ffb\u500d\u7ffb\u6efe\u6a5f\u7387\u4ee5\u53ca\u96d9\u500d\u6e1b\u5c11\u50b7\u5bb3\u6548\u679c \uff01 \u7ffb\u6efe\u6700\u591a\u6e1b\u5c11\u50b7\u5bb3 &c{4}&7 \u9ede\u50b7\u5bb3\u3002 \u512a\u96c5\u7ffb\u6efe\u6700\u591a\u6e1b\u5c11\u50b7\u5bb3 &a{5}&7 \u9ede\u50b7\u5bb3\u3002 -Acrobatics.SubSkill.GracefulRoll.Name=\u512a\u96c5\u7ffb\u6efe -Acrobatics.SubSkill.GracefulRoll.Description=\u666e\u901a\u7ffb\u6efe\u7684\u96d9\u500d\u6548\u679c -Acrobatics.SubSkill.Dodge.Name=\u8ff4\u907f -Acrobatics.SubSkill.Dodge.Description=\u6e1b\u5c11\u4e00\u534a\u6240\u53d7\u653b\u64ca\u50b7\u5bb3 -Acrobatics.SubSkill.Dodge.Stat=\u8ff4\u907f\u6a5f\u7387 -Acrobatics.Listener=\u96dc\u6280 \uff08Acrobatics\uff09 \uff1a -Acrobatics.Roll.Text=&o**\u8ff4\u907f** -Acrobatics.SkillName=\u96dc\u6280 +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=\u50ac\u5316 -Alchemy.SubSkill.Catalysis.Description=\u63d0\u5347\u85e5\u6c34\u91c0\u9020\u901f\u5ea6 -Alchemy.SubSkill.Catalysis.Stat=\u91c0\u9020\u901f\u5ea6 -Alchemy.SubSkill.Concoctions.Name=\u6df7\u5408 -Alchemy.SubSkill.Concoctions.Description=\u91c0\u9020\u5e36\u6709\u591a\u91cd\u6750\u6599\u7684\u85e5\u6c34 -Alchemy.SubSkill.Concoctions.Stat=\u6df7\u5408\u7b49\u7d1a \uff1a &a{0}&3/&a{1} -Alchemy.SubSkill.Concoctions.Stat.Extra=\u914d\u65b9 [&a{0}&3] \uff1a &a{1} -Alchemy.Listener=\u7149\u91d1\u8853 \uff08Alchemy\uff09 \uff1a -Alchemy.Ability.Locked.0=\u9396\u5b9a\u72c0\u614b\uff0c\u76f4\u5230 {0}+ \u6280\u80fd\uff08\u50ac\u5316\uff09 -Alchemy.SkillName=\u7149\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) : +Alchemy.Ability.Locked.0=鎖定狀態,直到 {0}+ 技能(催化) +Alchemy.SkillName=煉金術 #ARCHERY -Archery.SubSkill.SkillShot.Name=\u6280\u5de7\u5c04\u64ca -Archery.SubSkill.SkillShot.Description=\u589e\u52a0\u5f13\u7bad\u9020\u6210\u7684\u50b7\u5bb3 -Archery.SubSkill.SkillShot.Stat=\u589e\u52a0\u5c04\u64ca\u9020\u6210\u7684\u50b7\u5bb3 -Archery.SubSkill.Daze.Name=\u64ca\u6688 -Archery.SubSkill.Daze.Description=\u8ff7\u60d1\u6575\u4eba\u4e26\u9020\u6210\u984d\u5916\u7684\u50b7\u5bb3 -Archery.SubSkill.Daze.Stat=\u64ca\u6688\u6a5f\u7387 -Archery.SubSkill.ArrowRetrieval.Name=\u7bad\u77e2\u56de\u6536 -Archery.SubSkill.ArrowRetrieval.Description=\u6709\u6a5f\u7387\u5f9e\u5c4d\u9ad4\u4e0a\u56de\u6536\u7bad\u77e2 -Archery.SubSkill.ArrowRetrieval.Stat=\u7bad\u77e2\u56de\u6536\u6a5f\u7387 -Archery.SubSkill.ArcheryLimitBreak.Name=\u7bad\u8853\u6975\u9650\u7a81\u7834 -Archery.SubSkill.ArcheryLimitBreak.Description=\u7a81\u7834\u4f60\u7684\u6975\u9650\u3002 -Archery.SubSkill.ArcheryLimitBreak.Stat=\u7a81\u7834\u6975\u9650\u7684\u50b7\u5bb3\u52a0\u6210 -Archery.Listener=\u7bad\u8853 \uff08Archery\uff09 \uff1a -Archery.SkillName=\u7bad\u8853 +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=\u65a7\u982d\u7cbe\u901a -Axes.Ability.Bonus.1=\u9644\u52a0 {0} \u50b7\u5bb3 -Axes.Ability.Bonus.2=\u7834\u7532 -Axes.Ability.Bonus.3=\u5c0d\u76d4\u7532\u9020\u6210 {0} \u9ede\u984d\u5916\u50b7\u5bb3 -Axes.Ability.Bonus.4=\u5f37\u529b\u885d\u64ca -Axes.Ability.Bonus.5=\u5c0d\u7121\u76d4\u7532\u7684\u6575\u4eba\u9020\u6210 {0} \u9ede\u984d\u5916\u50b7\u5bb3 -Axes.Ability.Lower=&7\u4f60\u653e\u4e0b\u4e86\u4f60\u7684\u65a7\u982d\u3002 -Axes.Ability.Ready=&3\u4f60 &6\u63e1\u7dca&3 \u4e86\u4f60\u7684\u65a7\u982d\u3002 -Axes.Ability.Ready.Extra=&3\u4f60 &6\u62ff\u8d77\u4e86&3 \u4f60\u7684\u65a7\u982d\u3002&7\uff08{0} \u6b63\u5728\u51b7\u537b {1} \u79d2\uff09 -Axes.Combat.CritStruck=&4\u4f60\u6253\u51fa\u4e86\u66b4\u64ca \uff01 -Axes.Combat.CriticalHit=\u66b4\u64ca \uff01 -Axes.Combat.GI.Proc=&a**\u5de8\u529b\u653b\u64ca** -Axes.Combat.GI.Struck=**\u88ab\u5f37\u70c8\u885d\u64ca\u64ca\u4e2d** -Axes.Combat.SS.Struck=&4\u88ab\u65ac\u9996\u8005\u6280\u80fd\u653b\u64ca \uff01 -Axes.SubSkill.SkullSplitter.Name=\u65ac\u9996\u8005 \uff08\u4e3b\u52d5\u6280\u80fd\uff09 -Axes.SubSkill.SkullSplitter.Description=\u9020\u6210\u7bc4\u570d\u50b7\u5bb3 -Axes.SubSkill.SkullSplitter.Stat=\u65ac\u9996\u8005\u6301\u7e8c\u6642\u9593 -Axes.SubSkill.CriticalStrikes.Name=\u66b4\u64ca -Axes.SubSkill.CriticalStrikes.Description=\u96d9\u500d\u50b7\u5bb3 -Axes.SubSkill.CriticalStrikes.Stat=\u66b4\u64ca\u6a5f\u7387 -Axes.SubSkill.AxeMastery.Name=\u65a7\u982d\u7cbe\u901a -Axes.SubSkill.AxeMastery.Description=\u589e\u52a0\u984d\u5916\u50b7\u5bb3 -Axes.SubSkill.AxesLimitBreak.Name=\u65a7\u6280\u6975\u9650\u7a81\u7834 -Axes.SubSkill.AxesLimitBreak.Description=\u7a81\u7834\u4f60\u7684\u6975\u9650\u3002 -Axes.SubSkill.AxesLimitBreak.Stat=\u7a81\u7834\u6975\u9650\u7684\u50b7\u5bb3\u52a0\u6210 -Axes.SubSkill.ArmorImpact.Name=\u7834\u7532 -Axes.SubSkill.ArmorImpact.Description=\u7528\u8db3\u5920\u7684\u529b\u91cf\u64ca\u788e\u76d4\u7532 -Axes.SubSkill.GreaterImpact.Name=\u5f37\u70c8\u885d\u64ca -Axes.SubSkill.GreaterImpact.Description=\u5c0d\u7121\u76d4\u7532\u6575\u4eba\u9020\u6210\u984d\u5916\u50b7\u5bb3 -Axes.Listener=\u65a7\u6280 \uff08Axes\uff09 \uff1a -Axes.SkillName=\u65a7\u6280 -Axes.Skills.SS.Off=**\u65ac\u9996\u8005\u6280\u80fd\u7d50\u675f** -Axes.Skills.SS.On=&a**\u65ac\u9996\u8005\u6280\u80fd\u555f\u52d5** -Axes.Skills.SS.Refresh=&a\u4f60\u7684 &e\u65ac\u9996\u8005 &a\u6280\u80fd\u53ef\u4ee5\u4f7f\u7528\u4e86 \uff01 -Axes.Skills.SS.Other.Off=\u65ac\u9996\u8005&a \u7d50\u675f\u4e86\uff0c\u9032\u5165\u51b7\u537b &e{0} -Axes.Skills.SS.Other.On=&a{0}&2\u4f7f\u7528\u4e86 &c\u65ac\u9996\u8005 \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=造成範圍傷害 +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\u4f60\u653e\u4e0b\u4e86\u4f60\u7684\u93df\u5b50\u3002 -Excavation.Ability.Ready=&3\u4f60 &6\u63e1\u7dca&3 \u4e86\u4f60\u7684\u93df\u5b50\u3002 -Excavation.SubSkill.GigaDrillBreaker.Name=\u66b4\u8d70\u947d\u982d -Excavation.SubSkill.GigaDrillBreaker.Description=3 \u500d\u6389\u843d\u548c 3 \u500d\u7d93\u9a57\u4ee5\u53ca+\u901f\u5ea6 -Excavation.SubSkill.GigaDrillBreaker.Stat=\u66b4\u8d70\u947d\u982d\u6301\u7e8c\u6642\u9593 -Excavation.SubSkill.Archaeology.Name=\u8003\u53e4\u5b78 -Excavation.SubSkill.Archaeology.Description=\u6316\u6398\u5927\u5730\u7684\u79d8\u5bc6 \uff01 \u8f03\u9ad8\u7684\u6316\u6398\u7b49\u7d1a\u4f7f\u4f60\u5728\u6316\u6398\u571f\u5730\u5bf6\u85cf\u6642\u6709\u8f03\u9ad8\u6a5f\u7387\u7372\u5f97\u7d93\u9a57\u503c \uff01 -Excavation.SubSkill.Archaeology.Stat=\u8003\u53e4\u5b78\u7372\u5f97\u7d93\u9a57\u503c\u7684\u6a5f\u7387 -Excavation.SubSkill.Archaeology.Stat.Extra=\u8003\u53e4\u5b78\u7372\u5f97\u7d93\u9a57\u503c\u7684\u6578\u91cf -Excavation.Listener=\u6316\u6398 \uff08Excavation\uff09 \uff1a -Excavation.SkillName=\u6316\u6398 -Excavation.Skills.GigaDrillBreaker.Off=**\u66b4\u8d70\u947d\u982d\u5df2\u7d50\u675f** -Excavation.Skills.GigaDrillBreaker.On=&a**\u66b4\u8d70\u947d\u982d\u958b\u555f** -Excavation.Skills.GigaDrillBreaker.Refresh=&a\u4f60\u7684 &e\u66b4\u8d70\u947d\u982d &a\u6280\u80fd\u53ef\u4ee5\u4f7f\u7528\u4e86 \uff01 -Excavation.Skills.GigaDrillBreaker.Other.Off=\u66b4\u8d70\u947d\u982d&a \u7d50\u675f\u4e86\uff0c\u9032\u5165\u51b7\u537b &e{0} -Excavation.Skills.GigaDrillBreaker.Other.On=&a{0}&2 \u4f7f\u7528\u4e86 &c\u66b4\u8d70\u947d\u982d \uff01 +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\u8a72\u5340\u57df\u5df2\u7d93\u904e\u5ea6\u6355\u6488\uff0c\u8acb\u5230\u81f3\u5c11 {0} \u7684\u65b9\u584a\u4ee5\u5916\u518d\u5617\u8a66\u3002 -Fishing.Scared=&7&o\u4e82\u52d5\u6703\u5687\u8dd1\u9b5a \uff01 -Fishing.Exhausting=&c&o\u4e0d\u6b63\u78ba\u4f7f\u7528\u91e3\u7aff\u6703\u52a0\u5287\u8010\u4e45\u7684\u640d\u8017 \uff01 -Fishing.LowResourcesTip=&7\u4f60\u89ba\u5f97\u9019\u584a\u5340\u57df\u4f3c\u4e4e\u6c92\u6709\u591a\u5c11\u9b5a\u4e86\u3002 -Fishing.Ability.Info=\u9b54\u6cd5\u7375\u4eba \uff1a &7**\u96a8\u8457\u6dd8\u91d1\u8005\u7b49\u7d1a\u63d0\u9ad8** -Fishing.Ability.Locked.0=\u9396\u5b9a\u72c0\u614b\uff0c\u76f4\u5230 {0}+ \u6280\u80fd\uff08\u6296\u52d5\uff09 -Fishing.Ability.Locked.1={0}+ \u7d1a\u5f8c\u89e3\u9396 \uff08\u51b0\u91e3\uff09 -Fishing.Ability.Locked.2=\u9396\u5b9a\u72c0\u614b\uff0c\u76f4\u5230 {0}+ \u6280\u80fd \uff08\u91e3\u9b5a\u5927\u5e2b\uff09 -Fishing.SubSkill.TreasureHunter.Name=\u6dd8\u91d1\u8005 -Fishing.SubSkill.TreasureHunter.Description=\u91e3\u51fa\u5404\u7a2e\u5404\u6a23\u7684\u7269\u54c1 -Fishing.SubSkill.TreasureHunter.Stat=\u6dd8\u91d1\u8005\u7b49\u7d1a \uff1a &a{0}&3/&a{1} -Fishing.SubSkill.TreasureHunter.Stat.Extra=\u6389\u843d\u7387 \uff1a &7\u4e00\u822c \uff1a &e{0} &a\u666e\u901a \uff1a &e{1}\n&9\u7a00\u6709 \uff1a &e{2} &d\u7f55\u898b \uff1a &e{3} &6\u53f2\u8a69 \uff1a &e{4} &b\u795e\u8a71 \uff1a &e{5} -Fishing.SubSkill.MagicHunter.Name=\u9b54\u6cd5\u7375\u4eba -Fishing.SubSkill.MagicHunter.Description=\u627e\u5230\u9644\u9b54\u7269\u54c1 -Fishing.SubSkill.MagicHunter.Stat=\u9b54\u6cd5\u7375\u4eba\u6a5f\u7387 -Fishing.SubSkill.Shake.Name=\u6296\u52d5 -Fishing.SubSkill.Shake.Description=\u7528\u91e3\u7aff\u628a\u73a9\u5bb6\u6216\u751f\u7269\u8eab\u4e0a\u7684\u7269\u54c1\u6296\u4e0b\u4f86 -Fishing.SubSkill.Shake.Stat=\u6296\u52d5\u6a5f\u7387 -Fishing.SubSkill.FishermansDiet.Name=\u6f01\u592b\u7684\u98df\u8b5c -Fishing.SubSkill.FishermansDiet.Description=\u63d0\u9ad8\u9b5a\u985e\u98df\u7269\u56de\u5fa9\u7684\u98fd\u98df\u5ea6 -Fishing.SubSkill.FishermansDiet.Stat=\u6f01\u592b\u7684\u98df\u8b5c \uff1a &a\u7b49\u7d1a {0} -Fishing.SubSkill.MasterAngler.Name=\u91e3\u9b5a\u5927\u5e2b -Fishing.SubSkill.MasterAngler.Description=\u9b5a\u983b\u7e41\u5730\u88ab\u6355\u7372\uff0c\u5f9e\u8239\u4e0a\u91e3\u9b5a\u6548\u679c\u66f4\u597d\u3002 -Fishing.SubSkill.MasterAngler.Stat=\u91e3\u9b5a\u6700\u5c11\u7b49\u5f85\u6642\u9593\u6e1b\u5c11 \uff1a &a-{0} \u79d2 -Fishing.SubSkill.MasterAngler.Stat.Extra=\u91e3\u9b5a\u6700\u591a\u7b49\u5f85\u6642\u9593\u6e1b\u5c11 \uff1a &a-{0} \u79d2 -Fishing.SubSkill.IceFishing.Name=\u51b0\u91e3 -Fishing.SubSkill.IceFishing.Description=\u5141\u8a31\u4f60\u5728\u51b0\u51b7\u7684\u74b0\u5883\u4e0b\u91e3\u9b5a -Fishing.SubSkill.IceFishing.Stat=\u51b0\u91e3 -Fishing.Chance.Raining=&9\u5927\u91cf\u734e\u52f5 -Fishing.Listener=\u91e3\u9b5a \uff08Fishing\uff09 \uff1a -Fishing.Ability.TH.MagicFound=&7\u4f60\u611f\u5230\u4e00\u80a1\u9b54\u529b\u7684\u6ce2\u52d5\u2026\u2026 -Fishing.Ability.TH.Boom=&7\u7e41\u69ae\u6642\u671f \uff01\uff01\uff01 -Fishing.Ability.TH.Poison=&7\u6709\u4ec0\u9ebc\u6771\u897f\u805e\u8d77\u4f86\u4e0d\u592a\u5c0d\u52c1\u2026\u2026 -Fishing.SkillName=\u91e3\u9b5a +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=\u4f60\u9700\u8981\u66f4\u591a\u7a2e\u5b50\u4f7f\u7528\u7da0\u624b\u6307\u3002 -Herbalism.Ability.GTh.Fail=**\u7da0\u5316\u5931\u6557** -Herbalism.Ability.GTh=&a**\u7da0\u5316** -Herbalism.Ability.Lower=&7\u4f60\u653e\u4e0b\u4e86\u4f60\u7684\u92e4\u982d\u3002 -Herbalism.Ability.Ready=&3\u4f60 &6\u6311\u8d77&3 \u4e86\u4f60\u7684\u92e4\u982d\u3002 -Herbalism.Ability.ShroomThumb.Fail=**\u83cc\u7d72\u5316\u5931\u6557** -Herbalism.SubSkill.GreenTerra.Name=\u5927\u5730\u795d\u798f -Herbalism.SubSkill.GreenTerra.Description=\u64ad\u6492\u5927\u5730\u4e4b\u795e\u7684\u6069\u60e0\uff0c\u7372\u5f97 3 \u500d\u6389\u7387 -Herbalism.SubSkill.GreenTerra.Stat=\u5927\u5730\u795d\u798f\u6301\u7e8c\u6642\u9593 -Herbalism.SubSkill.GreenThumb.Name=\u7da0\u624b\u6307 -Herbalism.SubSkill.GreenThumb.Description=\u6536\u7a6b\u6642\u81ea\u52d5\u64ad\u7a2e\u7a2e\u5b50 -Herbalism.SubSkill.GreenThumb.Stat=\u7da0\u624b\u6307\u89f8\u767c\u6a5f\u7387 -Herbalism.SubSkill.GreenThumb.Stat.Extra=\u7da0\u624b\u6307\u968e\u6bb5 \uff1a &a\u4f5c\u7269\u751f\u9577\u5728\u7b2c {0} \u968e\u6bb5 -Herbalism.Effect.4=\u7da0\u5316 \uff08\u65b9\u584a\uff09 -Herbalism.SubSkill.GreenThumb.Description.2=\u4f7f\u78da\u584a\u7b49\u9577\u82d4\u861a\uff0c\u6216\u8b93\u8349\u751f\u9577 -Herbalism.SubSkill.FarmersDiet.Name=\u8fb2\u592b\u98df\u8b5c -Herbalism.SubSkill.FarmersDiet.Description=\u98df\u7528\u8fb2\u7522\u54c1\u6642\u984d\u5916\u56de\u590d\u98e2\u9913\u5ea6 -Herbalism.SubSkill.FarmersDiet.Stat=\u8fb2\u592b\u98df\u8b5c \uff1a &a\u7b49\u7d1a {0} -Herbalism.SubSkill.DoubleDrops.Name=\u96d9\u500d\u6389\u843d -Herbalism.SubSkill.DoubleDrops.Description=\u96d9\u500d\u7269\u54c1 -Herbalism.SubSkill.DoubleDrops.Stat=\u96d9\u500d\u6389\u843d\u6a5f\u7387 -Herbalism.SubSkill.HylianLuck.Name=\u6d77\u62c9\u723e\u7684\u795d\u798f -Herbalism.SubSkill.HylianLuck.Description=\u7d66\u4e88\u5c0f\u6a5f\u7387\u627e\u5230\u7a00\u6709\u7269\u54c1\u7684\u80fd\u529b -Herbalism.SubSkill.HylianLuck.Stat=\u6d77\u62c9\u723e\u7684\u795d\u798f\u7684\u6a5f\u7387 -Herbalism.SubSkill.ShroomThumb.Name=\u83cc\u7d72\u5316 -Herbalism.SubSkill.ShroomThumb.Description=\u5411\u6ce5\u571f\u548c\u8349\u5730\u6563\u64ad\u83cc\u7d72 -Herbalism.SubSkill.ShroomThumb.Stat=\u83cc\u7d72\u5316\u6a5f\u7387 -Herbalism.HylianLuck=&a\u9858\u6d77\u62c9\u723e\u7684\u795d\u798f\u8207\u4f60\u540c\u5728 \uff01 -Herbalism.Listener=\u8349\u85e5\u5b78 \uff08Herbalism\uff09 \uff1a -Herbalism.SkillName=\u8349\u85e5\u5b78 -Herbalism.Skills.GTe.Off=**\u571f\u795e\u5e87\u4f51\u5df2\u7d50\u675f** -Herbalism.Skills.GTe.On=&a**\u571f\u795e\u5e87\u4f51\u958b\u555f** -Herbalism.Skills.GTe.Refresh=&a\u4f60\u7684 &e\u571f\u795e\u5e87\u4f51 &a\u6280\u80fd\u53ef\u4ee5\u4f7f\u7528\u4e86 \uff01 -Herbalism.Skills.GTe.Other.Off=\u571f\u795e\u5e87\u4f51&a \u7d50\u675f\u4e86\uff0c\u9032\u5165\u51b7\u537b &e{0} -Herbalism.Skills.GTe.Other.On=&a{0}&2 \u4f7f\u7528\u4e86 &c\u571f\u795e\u5e87\u4f51 \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=播撒大地之神的恩惠,獲得 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=\u9396\u5b9a\u76f4\u5230 {0}+ \u6280\u80fd \uff08\u7206\u7834\u958b\u6316\uff09 -Mining.Ability.Locked.1=\u9396\u5b9a\u76f4\u5230 {0}+ \u6280\u80fd \uff08\u5927\u578b\u70b8\u5f48\uff09 -Mining.Ability.Locked.2=\u9396\u5b9a\u76f4\u5230 {0}+ \u6280\u80fd \uff08\u7206\u7834\u5c08\u5bb6\uff09 -Mining.Ability.Lower=&7\u4f60\u653e\u4e0b\u4e86\u4f60\u7684\u93ac\u5b50\u3002 -Mining.Ability.Ready=&3\u4f60 &6\u62ff\u8d77&3 \u4e86\u4f60\u7684\u93ac\u5b50\u3002 -Mining.SubSkill.SuperBreaker.Name=\u8d85\u7d1a\u788e\u77f3\u6a5f -Mining.SubSkill.SuperBreaker.Description=+\u901f\u5ea6\u548c 3 \u500d\u6389\u843d\u7387 -Mining.SubSkill.SuperBreaker.Stat=\u8d85\u7d1a\u788e\u77f3\u6a5f\u6301\u7e8c\u6642\u9593 -Mining.SubSkill.DoubleDrops.Name=\u96d9\u500d\u6389\u843d -Mining.SubSkill.DoubleDrops.Description=\u96d9\u500d\u666e\u901a\u7269\u54c1 -Mining.SubSkill.DoubleDrops.Stat=\u96d9\u500d\u6389\u843d\u6a5f\u7387 \uff1a &e{0} -Mining.SubSkill.BlastMining.Name=\u7206\u7834\u958b\u6316 -Mining.SubSkill.BlastMining.Description=\u4f7f\u7528 TNT \u70b8\u7926\u7269\u6642\u6703\u7372\u5f97\u984d\u5916\u7269\u54c1 -Mining.SubSkill.BlastMining.Stat=\u7206\u7834\u958b\u6316 \uff1a &a\u7b49\u7d1a {0}/{1} &7\uff08{2}\uff09 -Mining.SubSkill.BlastMining.Stat.Extra=\u7206\u7834\u534a\u5f91\u52a0\u6210 \uff1a &a+{0} -Mining.SubSkill.BiggerBombs.Name=\u5927\u578b\u70b8\u5f48 -Mining.SubSkill.BiggerBombs.Description=\u589e\u52a0 TNT \u7206\u70b8\u7bc4\u570d -Mining.SubSkill.DemolitionsExpertise.Name=\u7206\u7834\u5c08\u5bb6 -Mining.SubSkill.DemolitionsExpertise.Description=\u6e1b\u5c11 TNT \u7684\u50b7\u5bb3 -Mining.SubSkill.DemolitionsExpertise.Stat=\u7206\u70b8\u50b7\u5bb3\u6e1b\u5c11 +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=\u6316\u7926 \uff08Mining\uff09 \uff1a -Mining.SkillName=\u6316\u7926 -Mining.Skills.SuperBreaker.Off=**\u8d85\u7d1a\u788e\u77f3\u6a5f\u7d50\u675f** -Mining.Skills.SuperBreaker.On=&a**\u8d85\u7d1a\u788e\u77f3\u6a5f\u958b\u555f** -Mining.Skills.SuperBreaker.Other.Off=\u8d85\u7d1a\u788e\u77f3\u6a5f &a\u7d50\u675f\u4e86\uff0c\u9032\u5165\u51b7\u537b &e{0} -Mining.Skills.SuperBreaker.Other.On=&a{0}&2 \u4f7f\u7528\u4e86 &c\u8d85\u7d1a\u788e\u77f3\u6a5f \uff01 -Mining.Skills.SuperBreaker.Refresh=&a\u4f60\u7684 &e\u8d85\u7d1a\u788e\u77f3\u6a5f &a\u6280\u80fd\u53ef\u4ee5\u4f7f\u7528\u4e86 \uff01 +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**\u5623** +Mining.Blast.Boom=&7**嘣** Mining.Blast.Cooldown= -Mining.Blast.Effect=+{0} \u7926\u7269\u91cf\u548c {1} \u500d\u6389\u843d -Mining.Blast.Other.On=&a{0}&2 \u4f7f\u7528\u4e86 &c\u7206\u7834\u958b\u6316 \uff01 -Mining.Blast.Refresh=&a\u4f60\u7684 &e\u7206\u7834\u958b\u6316 &a\u6280\u80fd\u53ef\u4ee5\u4f7f\u7528\u4e86 \uff01 +Mining.Blast.Effect=+{0} 礦物量和 {1} 倍掉落 +Mining.Blast.Other.On=&a{0}&2 使用了 &c爆破開挖 ! +Mining.Blast.Refresh=&a你的 &e爆破開挖 &a技能可以使用了 ! #REPAIR -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\u7269\u54c1 \uff08{0}+ \u6280\u80fd\uff09 -Repair.SubSkill.GoldRepair.Description=\u4fee\u7406\u9ec3\u91d1\u5de5\u5177\u548c\u88dd\u5099 -Repair.SubSkill.IronRepair.Name=\u4fee\u7406\u9435\u88fd\u7269\u54c1 \uff08{0}+ \u6280\u80fd\uff09 -Repair.SubSkill.IronRepair.Description=\u4fee\u7406\u9435\u88fd\u5de5\u5177\u548c\u76d4\u7532 -Repair.SubSkill.StoneRepair.Name=\u4fee\u7406\u77f3\u982d\u7269\u54c1 \uff08{0}+ \u6280\u80fd\uff09 -Repair.SubSkill.StoneRepair.Description=\u4fee\u7406\u77f3\u982d\u5de5\u5177 -Repair.SubSkill.RepairMastery.Name=\u4fee\u7406\u7cbe\u901a -Repair.SubSkill.RepairMastery.Description=\u4fee\u7406\u6642\u63d0\u5347\u56de\u5fa9\u7684\u8010\u4e45\u5ea6 -Repair.SubSkill.RepairMastery.Stat=\u4fee\u7406\u7cbe\u901a \uff1a &a\u984d\u5916\u56de\u5fa9 {0} \u8010\u4e45 -Repair.SubSkill.SuperRepair.Name=\u8d85\u7d1a\u4fee\u7406 -Repair.SubSkill.SuperRepair.Description=\u96d9\u500d\u4fee\u7406\u6548\u679c -Repair.SubSkill.SuperRepair.Stat=\u8d85\u7d1a\u4fee\u7406\u6a5f\u7387 -Repair.SubSkill.DiamondRepair.Name=\u947d\u77f3\u4fee\u7406 \uff08{0}+ \u6280\u80fd\uff09 -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.ArcaneForging.Stat=\u79d8\u6cd5\u935b\u9020 \uff1a &e\u7b49\u7d1a {0}/{1} -Repair.SubSkill.ArcaneForging.Stat.Extra=&3\u79d8\u6cd5\u935b\u9020\u8ce0\u7387 \uff1a &7\u6210\u529f &a{0}&7%\uff0c\u5931\u6557 &c{1}&7% -Repair.Error=&4mcMMO \u5728\u5617\u8a66\u4fee\u7406\u6b64\u7269\u54c1\u6642\u767c\u751f\u4e86\u932f\u8aa4 \uff01 -Repair.Listener.Anvil=&4\u4f60\u653e\u7f6e\u7684\u9435\u65b9\u584a\u53ef\u4ee5\u7528\u4f86\u4fee\u7406\u5de5\u5177\u548c\u88dd\u5099\u3002 -Repair.Listener=\u4fee\u7406 \uff08Repair\uff09 \uff1a -Repair.SkillName=\u4fee\u7406 -Repair.Skills.AdeptDiamond=&4\u4f60\u7684\u6280\u80fd\u7b49\u7d1a\u4e0d\u8db3\u4ee5\u4fee\u7406\u947d\u77f3\u88dd\u5099\u3002 -Repair.Skills.AdeptGold=&4\u4f60\u7684\u6280\u80fd\u7b49\u7d1a\u4e0d\u8db3\u4ee5\u4fee\u7406\u9ec3\u91d1\u88dd\u5099\u3002 -Repair.Skills.AdeptIron=&4\u4f60\u7684\u6280\u80fd\u4e0d\u8db3\u4ee5\u4fee\u7406\u9435\u88fd\u88dd\u5099\u3002 -Repair.Skills.AdeptStone=&4\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 &e{0}&c \u624d\u80fd\u4fee\u7406 &e{1} -Repair.Skills.FeltEasy=&7\u90a3\u770b\u8d77\u4f86\u5f88\u7c21\u55ae\u3002 -Repair.Skills.FullDurability=&7\u4f60\u7684\u88dd\u5099\u5df2\u7d93\u6eff\u8010\u4e45\u5ea6\u4e86 -Repair.Skills.StackedItems=&4\u4f60\u7121\u6cd5\u4fee\u7406\u5df2\u758a\u52a0\u7684\u7269\u54c1\u3002 -Repair.Pretty.Name=\u4fee\u7406 +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=\u9019\u4ef6\u7269\u54c1\u7684\u9644\u9b54\u7b49\u7d1a\u5df2\u4e0b\u964d\u3002 -Repair.Arcane.Fail=\u9019\u4ef6\u7269\u54c1\u7684\u9644\u9b54\u5df2\u6d88\u5931\u3002 -Repair.Arcane.Lost=\u4f60\u7684\u6280\u80fd\u7b49\u7d1a\u4e0d\u8db3\u4ee5\u4fdd\u7559\u9644\u9b54\u5c6c\u6027\u3002 -Repair.Arcane.Perfect=&a\u4f60\u6210\u529f\u5730\u4fdd\u7559\u4e86\u9019\u4ef6\u7269\u54c1\u7684\u9644\u9b54\u3002 +Repair.Arcane.Downgrade=這件物品的附魔等級已下降。 +Repair.Arcane.Fail=這件物品的附魔已消失。 +Repair.Arcane.Lost=你的技能等級不足以保留附魔屬性。 +Repair.Arcane.Perfect=&a你成功地保留了這件物品的附魔。 #SALVAGE -Salvage.Pretty.Name=\u5206\u89e3 -Salvage.SubSkill.UnderstandingTheArt.Name=\u5206\u89e3\u7cbe\u901a -Salvage.SubSkill.UnderstandingTheArt.Description=\u4f60\u4e0d\u53ea\u662f\u518d\u7ffb\u9130\u5c45\u7684\u5783\u573e\uff0c\u4f60\u662f\u5728\u4fdd\u8b77\u74b0\u5883\u3002\n\u589e\u5f37\u5206\u89e3\u7684\u5404\u7a2e\u5c6c\u6027\u3002 -Salvage.SubSkill.ScrapCollector.Name=\u5ee2\u7269\u5229\u7528 -Salvage.SubSkill.ScrapCollector.Description=\u5f9e\u7269\u54c1\u4e2d\u5206\u89e3\u51fa\u6750\u6599\uff0c\u5b8c\u7f8e\u5206\u89e3\u53d6\u6c7a\u65bc\u6280\u80fd\u548c\u904b\u6c23\u3002 -Salvage.SubSkill.ScrapCollector.Stat=\u5ee2\u7269\u5229\u7528 \uff1a &a\u6700\u591a\u5206\u89e3\u51fa &e{0}&a \u500b\u7269\u54c1\u3002\u4f54\u4e00\u4e9b\u904b\u6c23\u6210\u5206\u3002 -Salvage.SubSkill.ArcaneSalvage.Name=\u5967\u6578\u5206\u89e3 -Salvage.SubSkill.ArcaneSalvage.Description=\u5f9e\u7269\u54c1\u4e2d\u62c6\u89e3\u9644\u9b54 -Salvage.SubSkill.ArcaneSalvage.Stat=\u5967\u6578\u5206\u89e3 \uff1a &e\u7b49\u7d1a {0}/{1} -Salvage.Ability.Bonus.0=\u9032\u968e\u5206\u89e3 -Salvage.Ability.Bonus.1=\u6700\u5927\u9650\u5ea6\u56de\u6536 {0} \u640d\u58de\u7684\u7269\u54c1 -Salvage.Arcane.ExtractFull=&7\u5b8c\u5168\u62c6\u89e3\u51fa\u9644\u9b54\u6a5f\u7387 -Salvage.Arcane.ExtractPartial=&7\u90e8\u5206\u62c6\u89e3\u51fa\u9644\u9b54\u6a5f\u7387 -Salvage.Skills.Success=&a\u7269\u54c1\u5df2\u5206\u89e3 \uff01 -Salvage.Skills.Adept.Damaged=&4\u4f60\u7684\u6280\u80fd\u7b49\u7d1a\u4e0d\u8db3\u4ee5\u5206\u89e3\u640d\u58de\u7684\u7269\u54c1\u3002 -Salvage.Skills.Adept.Level=\u4f60\u5fc5\u9808\u9054\u5230 &e{0}&c \u7d1a\u624d\u80fd\u5206\u89e3 &e{1} -Salvage.Skills.TooDamaged=&4\u8a72\u7269\u54c1\u640d\u58de\u904e\u65bc\u56b4\u91cd\uff0c\u7121\u6cd5\u5206\u89e3\u3002 -Salvage.Skills.ArcaneFailed=&c\u4f60\u7121\u6cd5\u62c6\u89e3\u51fa\u672c\u7269\u54c1\u6240\u860a\u542b\u7684\u77e5\u8b58\u3002 -Salvage.Skills.ArcanePartial=&c\u4f60\u53ea\u80fd\u62c6\u89e3\u51fa\u672c\u7269\u54c1\u6240\u860a\u542b\u7684\u90e8\u5206\u77e5\u8b58\u3002 -Salvage.Skills.ArcaneSuccess=&a\u4f60\u80fd\u5920\u5b8c\u5168\u62c6\u89e3\u51fa\u672c\u7269\u54c1\u6240\u542b\u7684\u77e5\u8b58 \uff01 -Salvage.Listener.Anvil=&4\u4f60\u5df2\u7d93\u653e\u7f6e\u4e86\u5206\u89e3\u9435\u7827\uff0c\u4f7f\u7528\u5b83\u4f86\u5206\u89e3\u5de5\u5177\u548c\u76d4\u7532\u3002 -Salvage.Listener=\u5206\u89e3 \uff08Salvage\uff09 \uff1a -Salvage.SkillName=\u5206\u89e3 -Salvage.Skills.Lottery.Normal=&6\u4f60\u80fd\u5920\u5f9e &e{1}&6 \u4e2d\u56de\u6536 &3{0}&6 \u6750\u6599\u3002 -Salvage.Skills.Lottery.Perfect=&a&l\u5b8c\u7f8e \uff01&r&6 \u4f60\u6beb\u4e0d\u8cbb\u529b\u5730\u6436\u6551\u4e86 &3{1}&6\uff0c\u6aa2\u8996\u4e86 &3{0}&6 \u6750\u6599\u3002 -Salvage.Skills.Lottery.Untrained=&7\u4f60\u5728\u56de\u6536\u65b9\u9762\u6c92\u6709\u5f97\u5230\u9069\u7576\u7684\u8a13\u7df4\uff0c\u4f60\u53ea\u80fd\u5f9e &a{1}&7 \u4e2d\u56de\u5fa9 &c{0}&7 \u6750\u6599\u3002 +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=\u9019\u500b\u7269\u54c1\u4e0d\u6703\u640d\u58de \uff01 +Anvil.Unbreakable=這個物品不會損壞 ! #SWORDS -Swords.Ability.Lower=&7\u4f60\u653e\u4e0b\u4e86\u4f60\u7684\u528d\u3002 -Swords.Ability.Ready=&3\u4f60 &6\u63e1\u7dca&3 \u4e86\u4f60\u7684\u528d\u3002 -Swords.Combat.Rupture.Note=&7\u6ce8\u610f \uff1a &e\u9031\u671f\u50b7\u5bb3\u4e26\u975e\u81f4\u547d\u7684 \uff01 -Swords.Combat.Bleeding.Started=&4\u4f60\u5728\u6d41\u8840 \uff01 -Swords.Combat.Bleeding.Stopped=&7\u6d41\u8840 &a\u5df2\u505c\u6b62&7 \uff01 -Swords.Combat.Bleeding=&a**\u6575\u4eba\u6b63\u5728\u4e0d\u65b7\u6d41\u8840** -Swords.Combat.Counter.Hit=&4\u4f60\u53cd\u64ca\u4e86\u5c0d\u624b \uff01 -Swords.Combat.Countered=&a**\u53cd\u64ca\u4e86\u6575\u4eba** -Swords.Combat.SS.Struck=&4\u767c\u52d5\u5229\u5203\u7a81\u523a \uff01 -Swords.SubSkill.CounterAttack.Name=\u53cd\u64ca -Swords.SubSkill.CounterAttack.Description=\u53d7\u5230\u653b\u64ca\u6642\u53cd\u5c04\u4e00\u5b9a\u50b7\u5bb3 \uff01 -Swords.SubSkill.CounterAttack.Stat=\u53cd\u64ca\u6a5f\u7387 -Swords.SubSkill.SerratedStrikes.Name=\u5229\u5203\u7a81\u523a -Swords.SubSkill.SerratedStrikes.Description=\u5728\u7bc4\u570d\u653b\u64ca \uff08\u6a6b\u6383\uff09 \u6642\uff0c\u9020\u6210\u653b\u64ca\u7684\u90e8\u5206\u50b7\u5bb3\uff0c\u6709\u6a5f\u7387\u4f34\u96a8\u6495\u88c2 \uff01 -Swords.SubSkill.SerratedStrikes.Stat=\u5229\u5203\u7a81\u523a\u6301\u7e8c\u6642\u9593 -Swords.SubSkill.Rupture.Name=\u6495\u88c2 -Swords.SubSkill.Rupture.Description=\u9020\u6210\u6d41\u8840\u7684\u6301\u7e8c\u6027\u50b7\u5bb3 -Swords.SubSkill.Stab.Name=\u7a7f\u523a -Swords.SubSkill.Stab.Description=\u70ba\u4f60\u7684\u653b\u64ca\u589e\u52a0\u984d\u5916\u50b7\u5bb3\u3002 -Swords.SubSkill.Stab.Stat=\u7a7f\u523a\u50b7\u5bb3 -Swords.SubSkill.SwordsLimitBreak.Name=\u528d\u8853\u6975\u9650\u7a81\u7834 -Swords.SubSkill.SwordsLimitBreak.Description=\u7a81\u7834\u4f60\u7684\u6975\u9650\u3002 -Swords.SubSkill.SwordsLimitBreak.Stat=\u7a81\u7834\u6975\u9650\u7684\u50b7\u5bb3\u52a0\u6210 -Swords.SubSkill.Rupture.Stat=\u6495\u88c2\u6a5f\u7387 -Swords.SubSkill.Rupture.Stat.Extra=&3\u6495\u88c2\u6301\u7e8c\u6642\u9593 \uff1a&e{0}s&a \u5c0d\u6297\u73a9\u5bb6\uff0c&e{1}s&a \u5c0d\u6297\u751f\u7269\u3002 -Swords.SubSkill.Rupture.Stat.TickDamage=&3\u6495\u88c2\u6bcf\u523b\u50b7\u5bb3 \uff1a&e{0}&a \u5c0d\u6297\u73a9\u5bb6\uff0c&e{1}&a \u5c0d\u6297\u751f\u7269\u3002 -Swords.SubSkill.Rupture.Stat.ExplosionDamage=&3\u6495\u88c2\u7206\u88c2\u50b7\u5bb3 \uff1a&e{0}&a \u5c0d\u6297\u73a9\u5bb6\uff0c&e{1}&a \u5c0d\u6297\u751f\u7269\u3002 -Swords.Effect.4=\u5229\u5203\u7a81\u523a \u6495\u88c2+ -Swords.Effect.5={0} \u523b\u6495\u88c2 -Swords.Listener=\u528d\u8853 \uff08Swords\uff09 \uff1a -Swords.SkillName=\u528d\u8853 -Swords.Skills.SS.Off=**\u5229\u5203\u7a81\u523a\u7d50\u675f** -Swords.Skills.SS.On=&a**\u5229\u5203\u7a81\u523a\u958b\u555f** -Swords.Skills.SS.Refresh=&a\u4f60\u7684 &e\u5229\u5203\u7a81\u523a &a\u6280\u80fd\u53ef\u4ee5\u4f7f\u7528\u4e86 \uff01 -Swords.Skills.SS.Other.Off=\u5229\u5203\u7a81\u523a&a \u7d50\u675f\u4e86\uff0c\u9032\u5165\u51b7\u537b &e{0} -Swords.Skills.SS.Other.On=&a{0}&2 \u4f7f\u7528\u4e86 &c\u5229\u5203\u7a81\u523a \uff01 +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=\u74b0\u5883\u611f\u77e5 -Taming.Ability.Bonus.1=\u72fc\u6703\u907f\u514d\u5371\u96aa -Taming.Ability.Bonus.2=\u6bdb\u76ae\u5f37\u5316 -Taming.Ability.Bonus.3=1/{0} \u50b7\u5bb3\uff0c\u6297\u706b -Taming.Ability.Bonus.4=\u885d\u64ca\u6297\u6027 -Taming.Ability.Bonus.5=\u7206\u70b8\u9020\u6210 1/{0} \u666e\u901a\u50b7\u5bb3 -Taming.Ability.Bonus.6=\u5229\u722a -Taming.Ability.Bonus.7=+{0} \u50b7\u5bb3 -Taming.Ability.Bonus.8=\u901f\u98df\u670d\u52d9 -Taming.Ability.Bonus.9={0} \u7684\u6a5f\u7387\u653b\u64ca\u6642\u56de\u8840 -Taming.Ability.Bonus.10=\u72ac\u795e\u7684\u5e87\u8b77 -Taming.Ability.Bonus.11=\u53d7\u5230\u9b54\u6cd5\u6216\u4e2d\u6bd2\u50b7\u5bb3\u6642\u56de\u5fa9\u751f\u547d\u503c -Taming.Ability.Locked.0= {0}+ \u7d1a\u5f8c\u89e3\u9396 \uff08\u74b0\u5883\u611f\u77e5\uff09 -Taming.Ability.Locked.1=\u9396\u5b9a\u76f4\u5230 {0}+ \u6280\u80fd \uff08\u6bdb\u76ae\u5f37\u5316\uff09 -Taming.Ability.Locked.2=\u9396\u5b9a\u76f4\u5230 {0}+ \u6280\u80fd \uff08\u885d\u64ca\u6297\u6027\uff09 -Taming.Ability.Locked.3=\u9396\u5b9a\u76f4\u5230 {0}+ \u6280\u80fd \uff08\u5229\u722a\uff09 -Taming.Ability.Locked.4={0}+ \u7d1a\u5f8c\u89e3\u9396 \uff08\u901f\u98df\u670d\u52d9\uff09 -Taming.Ability.Locked.5={0}+ \u7d1a\u5f8c\u89e3\u9396 \uff08\u72ac\u795e\u7684\u5e87\u8b77\uff09 -Taming.Combat.Chance.Gore=\u55dc\u8840 -Taming.SubSkill.BeastLore.Name=\u91ce\u7378\u8cc7\u8a0a -Taming.SubSkill.BeastLore.Description=\u9aa8\u982d\u9ede\u64ca\u72fc\u6216\u5c71\u8c93 -Taming.SubSkill.ShockProof.Name=\u885d\u64ca\u6297\u6027 -Taming.SubSkill.ShockProof.Description=\u6e1b\u5c11\u7206\u70b8\u50b7\u5bb3 -Taming.SubSkill.CallOfTheWild.Name=\u91ce\u6027\u547c\u559a -Taming.SubSkill.CallOfTheWild.Description=\u70ba\u4f60\u53ec\u559a\u4e00\u96bb\u5bf5\u7269 -Taming.SubSkill.CallOfTheWild.Description.2=&7\u53ec\u559a \uff1a \u8e72\u4e0b\u548c\u9ede\u64ca\u5de6\u9375\uff0c\u624b\u6301\u6307\u5b9a\u7269\u54c1\n {0} {1} \uff08\u5c71\u8c93\uff09\u3001{2} {3} \uff08\u72fc\uff09\u3001{4} {5} \uff08\u99ac\uff09 -Taming.SubSkill.FastFoodService.Name=\u901f\u98df\u670d\u52d9 -Taming.SubSkill.FastFoodService.Description=\u4e00\u5b9a\u6a5f\u7387\u4f7f\u72fc\u5728\u653b\u64ca\u6642\u56de\u5fa9\u81ea\u8eab\u8840\u91cf -Taming.SubSkill.HolyHound.Name=\u72ac\u795e\u7684\u5e87\u8b77 -Taming.SubSkill.HolyHound.Description=\u5df2\u88ab\u9b54\u6cd5\u548c\u4e2d\u6bd2\u6548\u679c\u6cbb\u6108 -Taming.SubSkill.Gore.Name=\u55dc\u8840 -Taming.SubSkill.Gore.Description=\u81f4\u547d\u653b\u64ca\u6703\u7d66\u76ee\u6a19\u653e\u8840 -Taming.SubSkill.SharpenedClaws.Name=\u5229\u722a -Taming.SubSkill.SharpenedClaws.Description=\u984d\u5916\u50b7\u5bb3 -Taming.SubSkill.EnvironmentallyAware.Name=\u74b0\u5883\u611f\u77e5 -Taming.SubSkill.EnvironmentallyAware.Description=\u4ed9\u4eba\u638c/\u5ca9\u6f3f\u6050\u61fc\u75c7\uff0c\u6e1b\u5c11\u6454\u843d\u50b7\u5bb3 -Taming.SubSkill.ThickFur.Name=\u6bdb\u76ae\u5f37\u5316 -Taming.SubSkill.ThickFur.Description=\u524a\u6e1b\u53d7\u5230\u7684\u50b7\u5bb3\uff0c\u6297\u706b -Taming.SubSkill.Pummel.Name=\u731b\u64ca -Taming.SubSkill.Pummel.Description=\u4f60\u7684\u72fc\u6709\u6a5f\u7387\u64ca\u9000\u6575\u4eba -Taming.SubSkill.Pummel.TargetMessage=\u4f60\u88ab\u72fc\u64ca\u9000\u4e86 \uff01 -Taming.Listener.Wolf=&8\u4f60\u7684\u72fc\u56de\u5230\u4f60\u8eab\u908a\u2026\u2026 -Taming.Listener=\u99b4\u7378 \uff08Taming\uff09 \uff1a -Taming.SkillName=\u99b4\u7378 -Taming.Summon.COTW.Success.WithoutLifespan=&a\uff08\u91ce\u6027\u7684\u547c\u559a\uff09 &7\u4f60\u5df2\u7d93\u53ec\u559a\u4e86\u4e00\u500b &6{0}&7\u3002 -Taming.Summon.COTW.Success.WithLifespan=&a\uff08\u91ce\u6027\u7684\u547c\u559a\uff09 &7\u4f60\u5df2\u7d93\u53ec\u559a\u4e86\u4e00\u500b &6{0}&7\uff0c\u5b83\u7684\u6301\u7e8c\u6642\u9593\u70ba &6{1}&7 \u79d2\u3002 -Taming.Summon.COTW.Limit=&a\uff08Call Of The Wild\uff09 &7\u4f60\u53ea\u80fd\u540c\u6642\u64c1\u6709 &c{0} &7\u53ec\u559a &7{1} \u5bf5\u7269\u3002 -Taming.Summon.COTW.TimeExpired=&a\uff08\u91ce\u6027\u7684\u547c\u559a\uff09&7\u6642\u9593\u5230\u4e86\uff0c\u4f60\u7684 &6{0}&7 \u51fa\u767c\u4e86\u3002 -Taming.Summon.COTW.Removed=&a\uff08\u91ce\u6027\u7684\u547c\u559a\uff09 &7\u4f60\u53ec\u559a\u7684 &6{0}&7 \u5df2\u7d93\u5f9e\u9019\u500b\u4e16\u754c\u6d88\u5931\u4e86\u3002 -Taming.Summon.COTW.BreedingDisallowed=&a\uff08\u91ce\u6027\u7684\u547c\u559a\uff09 &c\u4f60\u4e0d\u80fd\u7e41\u6b96\u88ab\u53ec\u559a\u7684\u52d5\u7269\u3002 -Taming.Summon.COTW.NeedMoreItems=&a\uff08\u91ce\u6027\u7684\u547c\u559a\uff09&7\u4f60\u9084\u9700\u8981 &e{0}&7 \u500b &3{1}&7\u3002 -Taming.Summon.Name.Format={0} \u7684 {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=&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=\u9435\u81c2\u5f0f -Unarmed.Ability.Bonus.1=+{0} \u50b7\u5bb3\u52a0\u6210 -Unarmed.Ability.IronGrip.Attacker=\u4f60\u7684\u5c0d\u624b\u6709\u8d85\u5f37\u63e1\u529b \uff01 -Unarmed.Ability.IronGrip.Defender=&a\u4f60\u7684\u8d85\u5f37\u63e1\u529b\u62b5\u64cb\u4f4f\u4e86\u5c0d\u65b9\u7684\u7e73\u68b0\u653b\u64ca \uff01 -Unarmed.Ability.Lower=&7\u4f60\u9b06\u958b\u4e86\u4f60\u7684\u62f3\u982d\u3002 -Unarmed.Ability.Ready=&3\u4f60 &6\u63e1\u7dca&3 \u4e86\u4f60\u7684\u62f3\u982d\u3002 -Unarmed.SubSkill.Berserk.Name=\u72c2\u66b4 -Unarmed.SubSkill.Berserk.Description=+50% \u50b7\u5bb3\uff0c\u80fd\u7834\u58de\u786c\u5ea6\u4f4e\u7684\u65b9\u584a -Unarmed.SubSkill.Berserk.Stat=\u72c2\u66b4\u6301\u7e8c\u6642\u9593 -Unarmed.SubSkill.Disarm.Name=\u7e73\u68b0 -Unarmed.SubSkill.Disarm.Description=\u64ca\u843d\u6575\u4eba\u624b\u4e2d\u7684\u6b66\u5668 -Unarmed.SubSkill.Disarm.Stat=\u7e73\u68b0\u6a5f\u7387 -Unarmed.SubSkill.UnarmedLimitBreak.Name=\u683c\u9b25\u6975\u9650\u7a81\u7834 -Unarmed.SubSkill.UnarmedLimitBreak.Description=\u7a81\u7834\u4f60\u7684\u6975\u9650\u3002 -Unarmed.SubSkill.UnarmedLimitBreak.Stat=\u7a81\u7834\u6975\u9650\u7684\u50b7\u5bb3\u52a0\u6210 -Unarmed.SubSkill.SteelArmStyle.Name=\u9435\u81c2\u5f0f -Unarmed.SubSkill.SteelArmStyle.Description=\u96a8\u8457\u6642\u9593\u63a8\u79fb\uff0c\u624b\u81c2\u5c07\u8d8a\u4f86\u8d8a\u786c -Unarmed.SubSkill.ArrowDeflect.Name=\u7bad\u77e2\u504f\u5411 -Unarmed.SubSkill.ArrowDeflect.Description=\u8b93\u7bad\u77e2\u504f\u5411 -Unarmed.SubSkill.ArrowDeflect.Stat=\u7bad\u77e2\u504f\u5411\u6a5f\u7387 -Unarmed.SubSkill.IronGrip.Name=\u9435\u8155 -Unarmed.SubSkill.IronGrip.Description=\u9632\u6b62\u4f60\u88ab\u7e73\u68b0 -Unarmed.SubSkill.IronGrip.Stat=\u9435\u8155\u89f8\u767c\u6a5f\u7387 -Unarmed.SubSkill.BlockCracker.Name=\u65b9\u584a\u7c89\u788e\u6a5f -Unarmed.SubSkill.BlockCracker.Description=\u7528\u62f3\u982d\u6253\u788e\u77f3\u982d -Unarmed.Listener=\u683c\u9b25 \uff08Unarmed\uff09 \uff1a -Unarmed.SkillName=\u683c\u9b25 -Unarmed.Skills.Berserk.Off=**\u72c2\u66b4\u7d50\u675f** -Unarmed.Skills.Berserk.On=&a**\u72c2\u66b4\u958b\u555f** -Unarmed.Skills.Berserk.Other.Off=\u72c2\u66b4&a \u7d50\u675f\u4e86\uff0c\u9032\u5165\u51b7\u537b &e{0} -Unarmed.Skills.Berserk.Other.On=&a{0}&2 \u4f7f\u7528\u4e86 &c\u72c2\u66b4 \uff01 -Unarmed.Skills.Berserk.Refresh=&a\u4f60\u7684 &e\u72c2\u66b4 &a\u6280\u80fd\u53ef\u4ee5\u4f7f\u7528\u4e86 \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=突破你的極限。 +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=\u79cb\u98a8\u6383\u843d\u8449 -Woodcutting.Ability.1=\u6383\u9664\u6a39\u8449 -Woodcutting.Ability.Locked.0=\u9396\u5b9a\u72c0\u614b\uff0c\u76f4\u5230 {0}+ \u6280\u80fd \uff08\u79cb\u98a8\u6383\u843d\u8449\uff09 -Woodcutting.SubSkill.TreeFeller.Name=\u4f10\u6728\u5de5 -Woodcutting.SubSkill.TreeFeller.Description=\u7206\u767c\u5f0f\u780d\u6a39 -Woodcutting.SubSkill.TreeFeller.Stat=\u7206\u767c\u5f0f\u780d\u6a39\u6301\u7e8c\u6642\u9593 -Woodcutting.SubSkill.LeafBlower.Name=\u79cb\u98a8\u6383\u843d\u8449 -Woodcutting.SubSkill.LeafBlower.Description=\u6383\u9664\u6a39\u8449 -Woodcutting.SubSkill.KnockOnWood.Name=\u6572\u6728\u982d -Woodcutting.SubSkill.KnockOnWood.Description=\u4f7f\u7528\u4f10\u6728\u6a5f\u6642\u5c0b\u627e\u984d\u5916\u7684\u597d\u6771\u897f -Woodcutting.SubSkill.KnockOnWood.Stat=\u6572\u6728\u982d -Woodcutting.SubSkill.KnockOnWood.Loot.Normal=\u4f86\u81ea\u6a39\u6728\u7684\u6a19\u6e96\u6230\u5229\u54c1 -Woodcutting.SubSkill.KnockOnWood.Loot.Rank2=\u4f86\u81ea\u6a39\u6728\u548c\u7d93\u9a57\u503c\u7684\u6a19\u6e96\u6230\u5229\u54c1 -Woodcutting.SubSkill.HarvestLumber.Name=\u6a39\u6728\u8c50\u6536 -Woodcutting.SubSkill.HarvestLumber.Description=\u5de7\u5999\u5730\u7372\u5f97\u66f4\u591a\u6728\u982d\n\u6709\u6a5f\u7387\u96d9\u500d\u6389\u843d -Woodcutting.SubSkill.HarvestLumber.Stat=\u6a39\u6728\u8c50\u6536\u96d9\u500d\u6a5f\u7387 -Woodcutting.SubSkill.Splinter.Name=\u7c89\u788e -Woodcutting.SubSkill.Splinter.Description=\u66f4\u6709\u6548\u7684\u780d\u6a39\u3002 -Woodcutting.SubSkill.BarkSurgeon.Name=\u6a39\u6728\u5916\u79d1\u91ab\u751f -Woodcutting.SubSkill.BarkSurgeon.Description=\u525d\u6a39\u6642\u63d0\u53d6\u5be6\u7528\u7684\u6750\u6599\u3002 -Woodcutting.SubSkill.NaturesBounty.Name=\u5927\u81ea\u7136\u7684\u6069\u60e0 -Woodcutting.SubSkill.NaturesBounty.Description=\u5f9e\u5927\u81ea\u7136\u4e2d\u7372\u5f97\u7d93\u9a57\u3002 -Woodcutting.Listener=\u4f10\u6728 \uff08Woodcutting\uff09 \uff1a -Woodcutting.SkillName=\u4f10\u6728 -Woodcutting.Skills.TreeFeller.Off=**\u4f10\u6728\u5de5\u7d50\u675f** -Woodcutting.Skills.TreeFeller.On=&a**\u4f10\u6728\u5de5\u958b\u555f** -Woodcutting.Skills.TreeFeller.Refresh=&a\u4f60\u7684 &e\u4f10\u6728\u5de5 &a\u6280\u80fd\u53ef\u4ee5\u4f7f\u7528\u4e86 \uff01 -Woodcutting.Skills.TreeFeller.Other.Off=\u4f10\u6728\u6280\u80fd &a\u7d50\u675f\u4e86\uff0c\u9032\u5165\u51b7\u537b &e{0} -Woodcutting.Skills.TreeFeller.Other.On=&a{0}&2 \u4f7f\u7528\u4e86 &c\u4f10\u6728\u5de5\u6280\u80fd \uff01 -Woodcutting.Skills.TreeFeller.Splinter=\u4f60\u7684\u65a7\u982d\u8b8a\u6210\u4e86\u4e00\u5806\u788e\u7247 \uff01 -Woodcutting.Skills.TreeFeller.Threshold=\u90a3\u68f5\u6a39\u592a\u5927\u4e86 \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=巧妙地獲得更多木頭\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**\u7bad\u77e2\u504f\u5411** -Combat.BeastLore=&a**\u99b4\u7378\u77e5\u8b58** -Combat.BeastLoreHealth=&3\u751f\u547d\u503c \uff08&a{0}&3/{1}\uff09 -Combat.BeastLoreOwner=&3\u64c1\u6709\u8005 \uff08&c{0}&3\uff09 -Combat.BeastLoreHorseSpeed=&3\u99ac\u5339\u79fb\u52d5\u901f\u5ea6 \uff08&a{0} \u683c/\u79d2&3\uff09 -Combat.BeastLoreHorseJumpStrength=&3\u99ac\u5339\u8df3\u8e8d\u9ad8\u5ea6 \uff08&a\u6700\u9ad8 {0} \u683c&3\uff09 -Combat.Gore=&a**\u76ee\u6a19\u88ab\u653e\u8840** -Combat.StruckByGore=**\u4f60\u88ab\u653e\u8840\u4e86** -Combat.TargetDazed=\u76ee\u6a19\u88ab &4\u88ab\u64ca\u6688 -Combat.TouchedFuzzy=&4\u982d\u6688\u76ee\u7729\u3002 +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\u95dc\u65bc&e mcMMO &3\uff1a &6mcMMO \u662f&c\u958b\u6e90&6 RPG \u6a21\u7d44\uff0c&6\u7531 &9nossr50&6 \u4e3b\u5c0e\u5efa\u7acb\u65bc 2011 \u5e74 2 \u6708\u3002\u4e3b\u65e8\u70ba\u73a9\u5bb6\u63d0\u4f9b\u9ad8\u54c1\u8cea\u7684 RPG \u9ad4\u9a57\u3002&3\u5c0f\u63d0\u9192 \uff1a &6- &a\u4f7f\u7528&c/mcMMO help&a \u67e5\u770b\u6307\u4ee4\uff0c&6 - &a\u8f38\u5165 &c/mcmmo help&a \u67e5\u770b\u8a73\u7d30\u7684\u6280\u80fd\u8cc7\u8a0a\uff0c&3\u958b\u767c\u8005 \uff1a &6- &anossr50 &9\uff08\u5275\u59cb\u4eba& \u9805\u76ee\u8ca0\u8cac\u4eba\uff09&6 - &aGJ &9\uff08\u9805\u76ee\u7d44\u9577\uff09&6 - &aNuclearW &9\uff08\u958b\u767c\u8005\uff09&6 - &abm01 &9\uff08\u958b\u767c\u8005\uff09&6 - &aTfT_02 &9\uff08\u958b\u767c\u8005\uff09&6 - &aGlitchfinder &9\uff08\u958b\u767c\u8005\uff09&6 - &at00thpick1 &9\uff08\u958b\u767c\u8005\uff09&6 - &aFlandre_tw &3\u7ffb\u8b6f\u54e1\u3002&3\u5be6\u7528\u9023\u7d50 \uff1a&6 - &ahttps://github.com/mcMMO-Dev/mcMMO/issues&6 \u6f0f\u6d1e\u5831\u544a&6 - &ahttps://discord.gg/EJGVanb &6\u5b98\u65b9 Discord \u4f3a\u670d\u5668 -mcMMO.Description.FormerDevs=&3\u524d\u958b\u767c\u8005 \uff1a &aGJ\u3001NuclearW\u3001bm01\u3001TfT_02\u3001Glitchfinder -Commands.addlevels.AwardAll.1=\u4f60\u6240\u6709\u7684\u6280\u80fd\u7b49\u7d1a\u88ab\u63d0\u5347\u4e86 {0} \u7d1a \uff01 -Commands.addlevels.AwardAll.2=\u4f60\u6240\u6709\u7684\u6280\u80fd\u7b49\u7d1a\u5df2\u88ab {0} \u4fee\u6539\u3002 -Commands.addlevels.AwardSkill.1=&a\u4f60\u7684 {0} \u6280\u80fd\u7b49\u7d1a\u88ab\u63d0\u5347\u4e86 {1} \u7d1a \uff01 -Commands.addlevels.AwardSkill.2={0} \u6280\u80fd\u7b49\u7d1a\u5df2\u88ab {1} \u4fee\u6539\u3002 -Commands.addxp.AwardAll=&a\u4f60\u6240\u6709\u7684\u6280\u80fd\u7372\u5f97 {0} \u7d93\u9a57 \uff01 -Commands.addxp.AwardSkill=&a\u4f60\u7684 {0} \u6280\u80fd\u7372\u5f97\u4e86 {1} \u7d93\u9a57 \uff01 -Commands.Ability.Off=&c\u95dc\u9589\u80fd\u529b\u4f7f\u7528 -Commands.Ability.On=&a\u958b\u555f\u80fd\u529b\u4f7f\u7528 -Commands.Ability.Toggle=\u80fd\u529b\u4f7f\u7528\u5df2\u5207\u63db\u70ba &e{0} -Commands.AdminChat.Off=&c\u95dc\u9589\u7ba1\u7406\u804a\u5929\u6a21\u5f0f -Commands.AdminChat.On=&a\u958b\u555f\u7ba1\u7406\u804a\u5929\u6a21\u5f0f -Commands.AdminToggle=&a- \u5207\u63db\u7ba1\u7406\u54e1\u804a\u5929 -Commands.Chat.Console=*\u63a7\u5236\u53f0* -Commands.Cooldowns.Header=&6--= &amcMMO \u80fd\u529b\u51b7\u537b&6 =-- -Commands.Cooldowns.Row.N=\ &c{0}&f - \u5269\u9918 &6{1} &f\u79d2 -Commands.Cooldowns.Row.Y=\ &b{0}&f - &2\u6e96\u5099\u5c31\u7dd2 \uff01 -Commands.Database.CooldownMS=\u4f60\u5fc5\u9808\u7b49\u5f85 {0} \u6beb\u79d2\u624d\u80fd\u518d\u6b21\u4f7f\u7528\u8a72\u6307\u4ee4\u3002 -Commands.Database.Cooldown=\u4f60\u5fc5\u9808\u7b49\u5f85 {0} \u79d2\u624d\u80fd\u518d\u6b21\u4f7f\u7528\u8a72\u6307\u4ee4\u3002 -Commands.Database.Processing=\u4f60\u7684\u6307\u4ee4\u6b63\u5728\u8655\u7406\u4e2d\uff0c\u8acb\u8010\u5fc3\u7b49\u5f85\u3002 -Commands.Disabled=\u9019\u500b\u6307\u4ee4\u88ab\u95dc\u9589\u4e86\u3002 -Commands.DoesNotExist= &c\u8a72\u540d\u73a9\u5bb6\u4e0d\u5b58\u5728\u65bc\u8cc7\u6599\u5eab\u4e2d \uff01 -Commands.GodMode.Disabled=mcMMO \u4e0a\u5e1d\u6a21\u5f0f\u95dc\u9589 -Commands.GodMode.Enabled=mcMMO \u4e0a\u5e1d\u6a21\u5f0f\u958b\u555f -Commands.AdminChatSpy.Enabled=mcMMO \u968a\u4f0d\u804a\u5929\u76e3\u8996\u5df2\u958b\u555f -Commands.AdminChatSpy.Disabled=mcMMO \u968a\u4f0d\u804a\u5929\u76e3\u8996\u5df2\u95dc\u9589 -Commands.AdminChatSpy.Toggle=mcMMO \u968a\u4f0d\u804a\u5929\u5df2\u5207\u63db\u70ba&e {0} -Commands.AdminChatSpy.Chat=&6[\u76e3\u8996 \uff1a &a{0}&6] &f{1} -Commands.GodMode.Forbidden=[mcMMO] \u4e0a\u5e1d\u6a21\u5f0f\u4e0d\u5141\u8a31\u5728\u9019\u500b\u4e16\u754c\u958b\u555f \uff08\u8a73\u898b\u6b0a\u9650\u914d\u7f6e\uff09 -Commands.GodMode.Toggle=\u4e0a\u5e1d\u6a21\u5f0f\u5df2\u5207\u63db\u70ba &e{0} -Commands.Healthbars.Changed.HEARTS=[mcMMO] \u4f60\u7684\u8840\u91cf\u986f\u793a\u985e\u578b\u5df2\u66f4\u6539\u70ba &c\u5fc3\u5f62&f\u3002 -Commands.Healthbars.Changed.BAR=[mcMMO] \u4f60\u7684\u8840\u91cf\u986f\u793a\u985e\u578b\u5df2\u66f4\u6539\u70ba &c\u65b9\u5f62&f\u3002 -Commands.Healthbars.Changed.DISABLED=[mcMMO] \u4f60\u7684\u602a\u7269\u8840\u91cf\u986f\u793a\u5df2\u88ab &7\u95dc\u9589&f\u3002 -Commands.Healthbars.Invalid=\u7121\u6548\u7684\u8840\u91cf\u985e\u578b \uff01 -Commands.Inspect= &a- \u67e5\u770b\u73a9\u5bb6\u8a73\u7d30\u8cc7\u8a0a -Commands.Invite.Success=&a\u9080\u8acb\u5df2\u6210\u529f\u50b3\u9001\u3002 -Commands.Leaderboards= &a- \u6392\u540d\u677f -Commands.mcgod=&a- \u5207\u63db\u4e0a\u5e1d\u6a21\u5f0f -Commands.mchud.Invalid=\u9019\u4e0d\u662f\u6709\u6548\u7684 HUD \u985e\u578b\u3002 -Commands.mcpurge.Success=&a\u8cc7\u6599\u5eab\u5df2\u6210\u529f\u6e05\u9664 \uff01 -Commands.mcrank.Heading=&6-=\u500b\u4eba\u6392\u540d=- -Commands.mcrank.Overall=\u7d9c\u5408&a - &6\u6392\u540d &f#&a{0} -Commands.mcrank.Player=&f{0} &e\u7684\u6392\u540d -Commands.mcrank.Skill=&e{0}&a - &6\u6392\u540d &f#&a{1} -Commands.mcrank.Unranked=&f\u7121\u6392\u540d -Commands.mcrefresh.Success={0} \u7684\u51b7\u537b\u6642\u9593\u5df2\u91cd\u65b0\u6574\u7406 -Commands.mcremove.Success=&a{0} \u5f9e\u8cc7\u6599\u5eab\u4e2d\u522a\u9664 \uff01 -Commands.mctop.Tip=&6\u5c0f\u63d0\u9192 \uff1a \u4f7f\u7528 &c/mcrank&6 \u4f86\u67e5\u770b\u4f60\u6240\u6709\u7684\u500b\u4eba\u6392\u540d \uff01 -Commands.mmoedit=[player] &a- \u7de8\u8f2f\u76ee\u6a19 -Commands.mmoedit.AllSkills.1=&a\u4f60\u6240\u6709\u7684\u6280\u80fd\u7b49\u7d1a\u88ab\u8a2d\u5b9a\u70ba {0} \u7d1a \uff01 -Commands.mmoedit.Modified.1=&a\u4f60\u7684 {0} \u6280\u80fd\u7b49\u7d1a\u88ab\u8a2d\u5b9a\u70ba {1} \u7d1a \uff01 -Commands.mmoedit.Modified.2={0} \u5df2\u88ab {1} \u4fee\u6539\u3002 -Commands.mcconvert.Database.Same=\u4f60\u5df2\u7d93\u5728\u4f7f\u7528 {0} \u8cc7\u6599\u5eab \uff01 -Commands.mcconvert.Database.InvalidType={0} \u4e0d\u662f\u6709\u6548\u7684\u8cc7\u6599\u5eab\u985e\u578b\u3002 -Commands.mcconvert.Database.Start=&7\u958b\u59cb\u5f9e {0} \u8f49\u63db\u81f3 {1}\u2026\u2026 -Commands.mcconvert.Database.Finish=&7\u8cc7\u6599\u5eab\u9077\u79fb\u5b8c\u6210 \uff1b {1} \u8cc7\u6599\u5eab\u73fe\u5728\u64c1\u6709 {0} \u8cc7\u6599\u5eab\u7684\u6240\u6709\u8cc7\u6599\u3002 -Commands.mmoshowdb=\u76ee\u524d\u4f7f\u7528\u7684\u8cc7\u6599\u5eab\u70ba &a{0} -Commands.mcconvert.Experience.Invalid=\u932f\u8aa4\u7684\u516c\u5f0f\u985e\u578b \uff01 \u6709\u6548\u985e\u578b\u70ba \uff1a &a\u7dda\u6027 &c\u548c &a\u6307\u6578\u3002 -Commands.mcconvert.Experience.Same=\u6b63\u5728\u4f7f\u7528\u516c\u5f0f{0} -Commands.mcconvert.Experience.Start=&7\u958b\u59cb\u5f9e{0}\u8f49\u63db\u5230{1}\u66f2\u7dda -Commands.mcconvert.Experience.Finish=&7\u516c\u5f0f\u8f49\u63db\u5b8c\u6210 \uff1b \u73fe\u5728\u4f7f\u7528 {0} \u7d93\u9a57\u66f2\u7dda\u3002 -Commands.ModDescription=&a- \u8acb\u95b1\u8b80\u7c21\u8981\u63d2\u4ef6\u63cf\u8ff0 -Commands.NoConsole=\u9019\u500b\u6307\u4ee4\u4e0d\u652f\u63f4\u5728\u63a7\u5236\u53f0\u4f7f\u7528\u3002 -Commands.Notifications.Off=\u6280\u80fd\u5c0f\u63d0\u9192 &c\u95dc\u9589 -Commands.Notifications.On=\u6280\u80fd\u5c0f\u63d0\u9192 &a\u958b\u555f -Commands.Offline=\u9019\u500b\u6307\u4ee4\u5c0d\u96e2\u7dda\u73a9\u5bb6\u7121\u6548 -Commands.NotLoaded=\u73a9\u5bb6\u8cc7\u6599\u5c1a\u672a\u8f09\u5165\u3002 -Commands.Party.Status=&8\u540d\u7a31 \uff1a &f{0} {1} &8\u7b49\u7d1a \uff1a &3{2} -Commands.Party.Status.Alliance=&8\u7d44\u968a \uff1a &f{0} -Commands.Party.UnlockedFeatures=&8\u5df2\u89e3\u9396\u529f\u80fd \uff1a &7&o{0} -Commands.Party.ShareMode=&8\u5171\u4eab\u6a21\u5f0f \uff1a -Commands.Party.ItemShare=&7\u7269\u54c1 &3\uff08{0}\uff09 -Commands.Party.ExpShare=&7\u7d93\u9a57 &3\uff08{0}\uff09 -Commands.Party.ItemShareCategories=&8\u7269\u54c1\u5206\u914d \uff1a &7&o{0} -Commands.Party.MembersNear=&8\u4f60\u9644\u8fd1 &3{0}&8/&3{1} -Commands.Party.Accept=&a- \u63a5\u53d7\u968a\u4f0d\u9080\u8acb -Commands.Party.Chat.Off=\u53ea\u5141\u8a31\u968a\u4f0d\u804a\u5929 &c\u95dc\u9589 -Commands.Party.Chat.On=\u53ea\u5141\u8a31\u968a\u4f0d\u804a\u5929 &a\u958b\u555f -Commands.Party.Commands=&c---[]&a\u968a\u4f0d\u6307\u4ee4&c[]--- -Commands.Party.Invite.0=&c\u6ce8\u610f \uff1a &a\u4f60\u6536\u5230\u4e86\u7d44\u968a\u9080\u8acb {0} \u4f86\u81ea {1} -Commands.Party.Invite.1=&e\u8f38\u5165 &a/party accept&e \u4f86\u63a5\u53d7\u9080\u8acb -Commands.Party.Invite=&a- \u50b3\u9001\u7d44\u968a\u9080\u8acb -Commands.Party.Invite.Accepted=&a\u5df2\u63a5\u53d7\u7d44\u968a\u9080\u8acb\u3002\u4f60\u5df2\u7d93\u52a0\u5165\u968a\u4f0d {0} -Commands.Party.Join=&7\u52a0\u5165\u7684\u968a\u4f0d \uff1a {0} -Commands.Party.PartyFull=&6{0}&c \u5df2\u6eff \uff01 -Commands.Party.PartyFull.Invite=\u4f60\u4e0d\u80fd\u9080\u8acb &e{0}&c \u5230 &a{1}&c \u56e0\u70ba\u968a\u4f0d\u5df2\u7d93\u6709 &3{2}&c \u500b\u73a9\u5bb6\u4e86 \uff01 -Commands.Party.PartyFull.InviteAccept=\u4f60\u4e0d\u80fd\u52a0\u5165\u968a\u4f0d &a{0}&c \u56e0\u70ba\u968a\u4f0d\u5df2\u7d93\u6709 &3{1}&c \u500b\u73a9\u5bb6\u4e86 \uff01 -Commands.Party.Create=&7\u5df2\u5efa\u7acb\u968a\u4f0d \uff1a {0} -Commands.Party.Rename=&7\u968a\u4f0d\u540d\u8b8a\u66f4\u70ba \uff1a &f{0} -Commands.Party.SetSharing=&7\u968a\u4f0d {0} \u5171\u4eab\u8a2d\u5b9a\u70ba \uff1a &3{1} -Commands.Party.ToggleShareCategory=&7\u968a\u4f0d\u7269\u54c1\u5206\u914d\u7531 &6{0} &7\u8b8a\u70ba &3{1} -Commands.Party.AlreadyExists=&4\u968a\u4f0d {0} \u5df2\u5b58\u5728 \uff01 -Commands.Party.Kick=&c\u4f60\u5df2\u88ab &a{0}&c &c\u8e22\u51fa \uff01\uff01 -Commands.Party.Leave=&e\u4f60\u96e2\u958b\u4e86\u9019\u652f\u968a\u4f0d -Commands.Party.Members.Header=&c-----[]&a\u6210\u54e1&c[]----- -Commands.Party.None=&c\u4f60\u4e0d\u5728\u968a\u4f0d\u4e2d\u3002 -Commands.Party.Quit=&a- \u96e2\u958b\u4f60\u73fe\u6709\u7684\u968a\u4f0d -Commands.Party.Teleport=&a- \u50b3\u9001\u5230\u968a\u4f0d\u6210\u54e1 -Commands.Party.Toggle=&a- \u5207\u63db\u968a\u4f0d\u804a\u5929 -Commands.Party1=&a- \u5efa\u7acb\u65b0\u968a\u4f0d -Commands.Party2=&a- \u52a0\u5165\u73a9\u5bb6\u7684\u968a\u4f0d -Commands.Party.Alliance.Header=&c-----[]&a\u968a\u4f0d\u7d44\u968a&c[]----- -Commands.Party.Alliance.Ally=&f{0} &8\u7684\u7d44\u968a\u968a\u4f0d \uff1a &f{1} -Commands.Party.Alliance.Members.Header=&c-----[]&a\u7d44\u968a\u6210\u54e1&c[]----- -Commands.Party.Alliance.Invite.0=\u6ce8\u610f \uff1a &a\u4f60\u5f9e {1} \u6536\u5230\u968a\u4f0d\u7d44\u968a\u9080\u8acb\u4f86 {0} -Commands.Party.Alliance.Invite.1=\u8f38\u5165 &a/party alliance accept&e \u4f86\u63a5\u53d7\u9080\u8acb -Commands.Party.Alliance.Invite.Accepted=&a\u5df2\u63a5\u53d7\u7d44\u968a\u9080\u8acb\u3002 -Commands.Party.Alliance.None=&c\u4f60\u6c92\u6709\u7d44\u968a.&c&a -Commands.Party.Alliance.AlreadyAllies=&c\u4f60\u7684\u968a\u4f0d\u5df2\u7d93\u6709\u76df\u53cb\u3002\u4f7f\u7528 &3/party alliance disband &c\u4f86\u89e3\u6563\u76ee\u524d\u7d44\u968a\u3002 -Commands.Party.Alliance.Help.0=&c\u9019\u500b\u968a\u4f0d\u9084\u6c92\u6709\u7d44\u968a\uff0c\u9080\u8acb\u4ed6\u7684\u968a\u9577\u7d50\u6210\u7d44\u968a\u3002 -Commands.Party.Alliance.Help.1=&c\u4f7f\u7528 &3/party alliance invite <\u73a9\u5bb6>&c\u3002 -Commands.ptp.Enabled=\u968a\u4f0d\u50b3\u9001 &a\u958b\u555f -Commands.ptp.Disabled=\u968a\u4f0d\u50b3\u9001 &c\u95dc\u9589 -Commands.ptp.NoRequests=&c\u76ee\u524d\u6c92\u6709\u50b3\u9001\u8acb\u6c42 -Commands.ptp.NoWorldPermissions=&c[mcMMO] \u4f60\u6c92\u6709\u6b0a\u9650\u50b3\u9001\u5230\u4e16\u754c {0}\u3002 -Commands.ptp.Request1=&e{0} &a\u5df2\u7d93\u5411\u4f60\u767c\u51fa\u8acb\u6c42\u50b3\u9001 -Commands.ptp.Request2=&a\u540c\u610f\u50b3\u9001\u8f38\u5165 &e/ptp accept\u3002&a\u8acb\u6c42\u5c07\u5728 &c{0} &a\u79d2\u5f8c\u5931\u6548 -Commands.ptp.AcceptAny.Enabled=\u968a\u4f0d\u50b3\u9001\u8acb\u6c42\u78ba\u8a8d &a\u958b\u555f -Commands.ptp.AcceptAny.Disabled=\u968a\u4f0d\u50b3\u9001\u8acb\u6c42\u78ba\u8a8d &c\u95dc\u9589 -Commands.ptp.RequestExpired=&c\u968a\u4f0d\u50b3\u9001\u8acb\u6c42\u5df2\u5931\u6548 \uff01 -Commands.PowerLevel.Leaderboard=&e--mcMMO &9\u6230\u9b25\u529b &e\u6392\u540d\u699c-- -Commands.PowerLevel.Capped=&4\u6230\u9b25\u529b \uff1a &a{0} &4\u6700\u9ad8\u7b49\u7d1a \uff1a &e{1} -Commands.PowerLevel=&4\u6230\u9b25\u529b \uff1a &a{0} -Commands.Reset.All=&a\u4f60\u7684\u6280\u80fd\u7b49\u7d1a\u5df2\u5fa9\u4f4d\u6210\u529f\u3002 -Commands.Reset.Single=&a\u4f60\u7684 {0} \u6280\u80fd\u7b49\u7d1a\u5df2\u6210\u529f\u91cd\u8a2d\u3002 -Commands.Reset=&a- \u91cd\u8a2d\u6280\u80fd\u7b49\u7d1a\u70ba 0 -Commands.Scoreboard.Clear=&3mcMMO \u8a08\u5206\u677f\u5df2\u6e05\u7a7a\u3002 -Commands.Scoreboard.NoBoard=&cmcMMO \u8a08\u5206\u677f\u76ee\u524d\u672a\u958b\u555f\u3002 -Commands.Scoreboard.Keep=&3mcMMO \u8a08\u5206\u677f\u5c07\u61f8\u505c\u76f4\u5230\u4f60\u4f7f\u7528 &a/mcscoreboard clear&3\u3002 -Commands.Scoreboard.Timer=&3mcMMO \u8a08\u5206\u677f\u5c07\u5728 &6{0}&3 \u79d2\u5f8c\u6e05\u7a7a\u3002 -Commands.Scoreboard.Help.0=&6== &c/mcscoreboard &a\u5e6b\u52a9&6 == -Commands.Scoreboard.Help.1=&3/mcscoreboard&b clear &f- \u6e05\u7a7a mcMMO \u8a08\u5206\u677f -Commands.Scoreboard.Help.2=&3/mcscoreboard&b keep &f- \u4fdd\u6301 mcMMO \u8a08\u5206\u677f\u61f8\u505c -Commands.Scoreboard.Help.3=&3/mcscoreboard&b time [n] &f- &dn&f \u79d2\u5f8c\u6e05\u7a7a mcMMO \u8a08\u5206\u677f -Commands.Scoreboard.Tip.Keep=&6\u5c0f\u63d0\u9192 \uff1a \u7576\u8a08\u5206\u677f\u986f\u793a\u6642\u4f7f\u7528 &c/mcscoreboard keep&6 \u4f86\u4fdd\u6301\u5b83\u4e0d\u6d88\u5931\u3002 -Commands.Scoreboard.Tip.Clear=&6\u5c0f\u63d0\u9192 \uff1a \u4f7f\u7528 &c/mcscoreboard clear&6 \u4f86\u95dc\u9589\u8a08\u5206\u677f\u3002 -Commands.XPBar.Reset=&6XP \u5df2\u91cd\u8a2d mcMMO \u7684\u6b04\u4f4d\u8a2d\u5b9a\u3002 -Commands.XPBar.SettingChanged=&6\u7d93\u9a57\u503c &a{0}&6 \u7684\u6b04\u4f4d\u8a2d\u5b9a\u73fe\u5728\u8a2d\u5b9a\u70ba &a{1} -Commands.Skill.Invalid=\u9019\u4e0d\u662f\u6709\u6548\u7684\u6280\u80fd\u540d\u7a31 \uff01 -Commands.Skill.ChildSkill=\u5b50\u6280\u80fd\u5c0d\u8a72\u6307\u4ee4\u7121\u6548 \uff01 -Commands.Skill.Leaderboard=--mcMMO &9{0}&e \u6392\u540d\u699c-- -Commands.SkillInfo=&a- \u67e5\u770b\u6280\u80fd\u7684\u8a73\u7d30\u8cc7\u8a0a -Commands.Stats=&a- \u4f60\u7684\u8cc7\u8a0a -Commands.ToggleAbility=&a- \u9ede\u64ca\u53f3\u9375\u5207\u63db\u6280\u80fd\u958b\u555f\u6a21\u5f0f -Commands.Usage.0=&c\u6b63\u78ba\u7684\u7528\u6cd5\u662f /{0} -Commands.Usage.1=&c\u6b63\u78ba\u7684\u7528\u6cd5\u662f /{0} {1} -Commands.Usage.2=&c\u6b63\u78ba\u7684\u7528\u6cd5\u662f /{0} {1} {2} -Commands.Usage.3=&c\u6b63\u78ba\u7684\u7528\u6cd5\u662f /{0} {1} {2} {3} -Commands.Usage.3.XP=&c\u6b63\u78ba\u7684\u7528\u6cd5\u662f/{0} {1} {2} {3}&7 \uff08\u4f60\u53ef\u4ee5\u5728\u6700\u5f8c\u52a0\u4e0a -s \u4f86\u57f7\u884c\u6307\u4ee4\u800c\u4e0d\u901a\u77e5\u73a9\u5bb6\uff0c\u6709\u6548\u5730\u4f7f\u5176\u975c\u97f3\uff09 -Commands.Usage.FullClassName=\u8cc7\u6599\u985e\u578b -Commands.Usage.Level=\u7b49\u7d1a -Commands.Usage.Message=\u8a0a\u606f -Commands.Usage.Page=\u9801 -Commands.Usage.PartyName=\u540d\u7a31 -Commands.Usage.Password=\u5bc6\u78bc -Commands.Usage.Player=\u73a9\u5bb6 -Commands.Usage.Rate=\u6bd4\u7387 -Commands.Usage.Skill=\u6280\u80fd -Commands.Usage.SubSkill=\u5b50\u6280\u80fd -Commands.Usage.XP=\u7d93\u9a57\u503c -Commands.Description.mmoinfo=\u95b1\u8b80\u6709\u95dc\u6280\u80fd\u6216\u6a5f\u5236\u7684\u8a73\u7d30\u8cc7\u8a0a\u3002 -Commands.MmoInfo.Mystery=&7\u4f60\u6c92\u6709\u89e3\u9396\u9019\u9805\u80fd\u529b\uff0c\u4f46\u7576\u4f60\u89e3\u9396\u4e86\u9019\u9805\u80fd\u529b\u5f8c\u518d\u9ede\u64ca\u53ef\u4ee5\u67e5\u770b\u80fd\u529b\u7684\u8a73\u7d30\u8cc7\u8a0a \uff01 -Commands.MmoInfo.NoMatch=\u90a3\u500b\u5b50\u6280\u80fd\u4e0d\u5b58\u5728 \uff01 -Commands.MmoInfo.Header=&3-=[]=====[]&6 MMO \u8cc7\u8a0a &3[]=====[]=- -Commands.MmoInfo.SubSkillHeader=&6\u540d\u7a31 \uff1a &e{0} -Commands.MmoInfo.DetailsHeader=&3-=[]=====[]&a \u7d30\u7bc0 &3[]=====[]=- -Commands.MmoInfo.OldSkill=&7mcMMO \u6280\u80fd\u6b63\u5728\u88ab\u8f49\u63db\u70ba\u66f4\u5148\u9032\u7684\u6a21\u7d44\u5316\u6280\u80fd\u7cfb\u7d71\uff0c\u907a\u61be\u7684\u662f\u9019\u9805\u6280\u80fd\u5c1a\u672a\u8f49\u63db\uff0c\u7f3a\u5c11\u8a73\u7d30\u7684\u7d71\u8a08\u8cc7\u6599\u3002\u65b0\u7cfb\u7d71\u5c07\u5141\u8a31\u66f4\u5feb\u7684\u65b0 mcMMO \u6280\u80fd\u66f4\u5feb\u5730\u91cb\u653e\u548c\u73fe\u6709\u6280\u80fd\u66f4\u5927\u7684\u9748\u6d3b\u6027\u3002 -Commands.MmoInfo.Mechanics=&3-=[]=====[]&6 \u6a5f\u68b0\u5b78 &3[]=====[]=- -Commands.MmoInfo.Stats=\u7d71\u8a08 \uff1a {0} -Commands.Mmodebug.Toggle=mcMMO \u9664\u932f\u6a21\u5f0f &6{0}&7\uff0c\u4f7f\u7528\u9019\u500b\u6307\u4ee4\u5207\u63db\u72c0\u614b\u3002\u5982\u679c\u958b\u555f\u9664\u932f\u6a21\u5f0f\uff0c\u4f60\u53ef\u4ee5\u9ede\u64ca\u65b9\u584a\u8f38\u51fa\u7528\u65bc\u652f\u63f4\u7684\u5be6\u7528\u8cc7\u8a0a\u3002 -mcMMO.NoInvites=&c\u4f60\u73fe\u5728\u6c92\u6709\u6536\u5230\u4efb\u4f55\u9080\u8acb -mcMMO.NoPermission=&4\u4f60\u6c92\u6709\u4f7f\u7528\u8a72\u6307\u4ee4\u7684\u6b0a\u9650\u3002 -mcMMO.NoSkillNote=&8\u5982\u679c\u4f60\u6c92\u6709\u67d0\u500b\u6280\u80fd\u7684\u4f7f\u7528\u6b0a\u9650\uff0c\u90a3\u9ebc\u4ed6\u5c07\u4e0d\u6703\u5728\u9019\u88e1\u986f\u793a\u2026\u2026 +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] \u968a\u4f0d\u529f\u80fd\u4e0d\u5141\u8a31\u5728\u9019\u500b\u4e16\u754c\u958b\u555f \uff08\u8a73\u898b\u6b0a\u9650\u914d\u7f6e\uff09 -Party.Help.0=&c\u6b63\u78ba\u7684\u7528\u6cd5 &3{0} [password]\u3002 -Party.Help.1=&c\u5efa\u7acb\u968a\u4f0d\uff0c\u4f7f\u7528 &3{0} [password]\u3002 -Party.Help.2=&c\u67e5\u95b1 &3{0} &c\u7372\u5f97\u66f4\u591a\u8cc7\u8a0a -Party.Help.3=&c\u4f7f\u7528 &3{0} [password] &c\u52a0\u5165\u6216 &3{1} &c\u9000\u51fa -Party.Help.4=&c\u9396\u5b9a\u6216\u89e3\u9396\u4f60\u7684\u968a\u4f0d\uff0c\u4f7f\u7528 &3{0} -Party.Help.5=&c\u8a2d\u5b9a\u968a\u4f0d\u5bc6\u78bc\uff0c\u4f7f\u7528 &3{0} -Party.Help.6=&c\u5f9e\u4f60\u7684\u968a\u4f0d\u4e2d\u8e22\u51fa\u73a9\u5bb6\uff0c\u4f7f\u7528 &3{0} -Party.Help.7=&c\u79fb\u4ea4\u968a\u9577\uff0c\u4f7f\u7528 &3{0} -Party.Help.8=&c\u89e3\u6563\u968a\u4f0d\uff0c\u4f7f\u7528 &3{0} -Party.Help.9=&c\u4f7f\u7528 &3{0} &c\u4f86\u8207\u4f60\u7684\u968a\u4f0d\u6210\u54e1\u5206\u4eab\u7269\u54c1 -Party.Help.10=&c\u4f7f\u7528 &3{0} &c\u958b\u555f\u8207\u4f60\u7684\u968a\u4f0d\u6210\u54e1\u5206\u4eab\u7d93\u9a57 -Party.InformedOnJoin={0} &a\u5df2\u7d93\u52a0\u5165\u4f60\u7684\u968a\u4f0d -Party.InformedOnQuit={0} &a\u96e2\u958b\u4e86\u968a\u4f0d -Party.InformedOnNameChange=&6{0} &a\u5df2\u8a2d\u5b9a\u968a\u4f0d\u540d\u70ba &f{1} -Party.InvalidName=&4\u90a3\u4e0d\u662f\u6709\u6548\u7684\u968a\u4f0d\u540d\u7a31\u3002 -Party.Invite.Self=&c\u4f60\u4e0d\u80fd\u9080\u8acb\u81ea\u5df1 \uff01 -Party.IsLocked=&c\u9019\u500b\u968a\u4f0d\u5df2\u7d93\u9396\u5b9a \uff01 -Party.IsntLocked=&c\u9019\u500b\u968a\u4f0d\u4e26\u6c92\u6709\u9396\u5b9a \uff01 -Party.Locked=&c\u968a\u4f0d\u88ab\u9396\u5b9a\uff0c\u53ea\u6709\u968a\u9577\u53ef\u4ee5\u9080\u8acb\u3002 -Party.NotInYourParty=&4{0} \u4f60\u4e0d\u5728\u4f60\u7684\u5718\u968a -Party.NotOwner=&4\u4f60\u4e0d\u662f\u968a\u9577 -Party.Target.NotOwner=&4{0} \u4e0d\u662f\u968a\u9577\u3002 -Party.Owner.New=&a{0} \u73fe\u5728\u662f\u65b0\u7684\u968a\u4f0d\u968a\u9577\u3002 -Party.Owner.NotLeader=&4\u4f60\u5df2\u7d93\u4e0d\u518d\u662f\u968a\u4f0d\u5167\u7684\u968a\u9577\u3002 -Party.Owner.Player=&a\u4f60\u73fe\u5728\u4e0d\u662f\u968a\u9577\u4e86 -Party.Password.None=&c\u52a0\u5165\u9019\u500b\u968a\u4f0d\u9700\u8981\u5bc6\u78bc\u3002\u8acb\u63d0\u4f9b\u5bc6\u78bc\u518d\u52a0\u5165 -Party.Password.Incorrect=&c\u968a\u4f0d\u5bc6\u78bc\u932f\u8aa4 -Party.Password.Set=&a\u968a\u4f0d\u5bc6\u78bc\u8a2d\u5b9a\u70ba {0} -Party.Password.Removed=&a\u968a\u4f0d\u5bc6\u78bc\u5df2\u88ab\u6e05\u9664 -Party.Player.Invalid=&c\u9019\u4e0d\u662f\u4e00\u540d\u6709\u6548\u7684\u73a9\u5bb6 -Party.NotOnline=&4{0} \u96e2\u7dda \uff01 -Party.Player.InSameParty=&c{0} \u5df2\u7d93\u5728\u968a\u4f0d\u4e2d \uff01 -Party.PlayerNotInParty=&4{0} \u4e0d\u5728\u968a\u4f0d\u88e1 -Party.Specify=&c\u4f60\u5fc5\u9808\u6307\u5b9a\u968a\u4f0d -Party.Teleport.Dead=&c\u4f60\u4e0d\u80fd\u50b3\u9001\u5230\u6b7b\u4ea1\u7684\u73a9\u5bb6\u8eab\u908a -Party.Teleport.Hurt=&c\u4f60\u53d7\u5230\u50b7\u5bb3\uff0c\u81f3\u5c11 {0} \u79d2\u5167\u4e0d\u80fd\u50b3\u9001 -Party.Teleport.Player=&a\u4f60\u5df2\u7d93\u50b3\u9001\u5230 {0}\u3002 -Party.Teleport.Self=&c\u4f60\u4e0d\u80fd\u50b3\u9001\u5230\u4f60\u81ea\u5df1\u90a3\u88e1 \uff01 -Party.Teleport.Target=&a{0} \u5df2\u7d93\u50b3\u9001\u5230\u4f60\u8eab\u908a\u3002 -Party.Teleport.Disabled=&c{0} \u4e0d\u5141\u8a31\u968a\u4f0d\u50b3\u9001 -Party.Rename.Same=&c\u9019\u5df2\u7d93\u662f\u4f60\u7684\u968a\u4f0d\u540d\u7a31\u4e86 \uff01 -Party.Join.Self=&c\u4f60\u4e0d\u80fd\u52a0\u5165\u4f60\u81ea\u5df1 \uff01 -Party.Unlocked=&7\u968a\u4f0d\u5df2\u89e3\u9396 -Party.Disband=&7\u968a\u4f0d\u5df2\u89e3\u6563 -Party.Alliance.Formed=&7\u4f60\u7684\u968a\u4f0d\u76ee\u524d\u8207 &a{0} &7\u7d50\u76df -Party.Alliance.Disband=&7\u4f60\u7684\u968a\u4f0d\u4e0d\u518d\u8207 &c{0} &7\u7d50\u76df -Party.Status.Locked=&4\uff08\u50c5\u9080\u8acb\uff09 -Party.Status.Unlocked=&2\uff08\u958b\u555f\uff09 -Party.LevelUp=&e\u968a\u4f0d\u7b49\u7d1a\u63d0\u5347 {0} \u7d1a\u3002\u7e3d\u8a08 \uff08{1}\uff09 -Party.Feature.Chat=\u968a\u4f0d\u804a\u5929 -Party.Feature.Teleport=\u968a\u4f0d\u50b3\u9001 -Party.Feature.Alliance=\u7d44\u968a -Party.Feature.ItemShare=\u7269\u54c1\u5171\u4eab -Party.Feature.XpShare=\u7d93\u9a57\u5171\u4eab -Party.Feature.Locked.Chat=\u529f\u80fd\u9396\u5b9a\u76f4\u81f3 {0}+ \u7d1a\uff08\u968a\u4f0d\u804a\u5929\uff09 -Party.Feature.Locked.Teleport=\u529f\u80fd\u9396\u5b9a\u76f4\u81f3 {0}+ \uff08\u968a\u4f0d\u50b3\u9001\uff09 -Party.Feature.Locked.Alliance=\u529f\u80fd\u9396\u5b9a\u76f4\u81f3 {0}+ \uff08\u7d44\u968a\uff09 -Party.Feature.Locked.ItemShare=\u529f\u80fd\u9396\u5b9a\u76f4\u81f3 {0}+ \uff08\u7269\u54c1\u5171\u4eab\uff09 -Party.Feature.Locked.XpShare=\u529f\u80fd\u9396\u5b9a\u76f4\u81f3 {0}+ \uff08\u7d93\u9a57\u5171\u4eab\uff09 -Party.Feature.Disabled.1=&c\u968a\u4f0d\u804a\u5929\u5c1a\u672a\u89e3\u9396\u3002 -Party.Feature.Disabled.2=&c\u968a\u4f0d\u50b3\u9001\u5c1a\u672a\u89e3\u9396\u3002 -Party.Feature.Disabled.3=&c\u968a\u4f0d\u7d44\u968a\u5c1a\u672a\u89e3\u9396\u3002 -Party.Feature.Disabled.4=&c\u968a\u4f0d\u7269\u54c1\u5171\u4eab\u5c1a\u672a\u89e3\u9396\u3002 -Party.Feature.Disabled.5=&c\u968a\u4f0d\u7d93\u9a57\u5171\u4eab\u5c1a\u672a\u89e3\u9396\u3002 -Party.ShareType.Xp=\u7d93\u9a57 -Party.ShareType.Item=\u7269\u54c1 -Party.ShareMode.None=\u7121 -Party.ShareMode.Equal=\u5747\u52fb\u5206\u914d -Party.ShareMode.Random=\u96a8\u6a5f -Party.ItemShare.Category.Loot=\u63a0\u596a -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 +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=\u6389\u843d -Commands.XPGain.Alchemy=\u91c0\u9020\u85e5\u6c34 -Commands.XPGain.Archery=\u7a7a\u624b\u653b\u64ca\u602a\u7269 -Commands.XPGain.Axes=\u653b\u64ca\u602a\u7269 -Commands.XPGain.Child=\u5f9e\u4e3b\u6280\u80fd\u7372\u5f97\u7b49\u7d1a -Commands.XPGain.Excavation=\u6316\u5230\u5bf6\u7269 -Commands.XPGain.Fishing=\u91e3\u9b5a \uff08\u53bb\u60f3\u60f3\u5427\uff01\uff09 -Commands.XPGain.Herbalism=\u6536\u7a6b\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\uff0c\u548c\u4f60\u7684\u72fc\u4e00\u8d77\u6230\u9b25 -Commands.XPGain.Unarmed=\u653b\u64ca\u602a\u7269 -Commands.XPGain.Woodcutting=\u6b63\u5728\u780d\u5012\u6a39\u6728 -Commands.XPGain=&8\u7d93\u9a57\u4f86\u6e90 \uff1a &f{0} -Commands.xplock.locked=&6\u4f60\u7684\u7d93\u9a57\u689d\u9396\u5b9a\u5728 {0} \uff01 -Commands.xplock.unlocked=&6\u4f60\u7684\u7d93\u9a57\u689d\u73fe\u5728 &a\u89e3\u9664\u9396\u5b9a\u4e86&6 \uff01 -Commands.xprate.modified=&c\u7d93\u9a57\u500d\u7387\u5df2\u8a2d\u5b9a\u70ba {0} -Commands.xprate.over=&cmcMMO \u9ad8\u7d93\u9a57\u4e8b\u4ef6\u7d50\u675f \uff01\uff01 -Commands.xprate.proper.0=&c\u60f3\u4fee\u6539\u7d93\u9a57\u4f86\u6e90\u7387\u8acb\u8f38\u5165 /xprate -Commands.xprate.proper.1=&c\u60f3\u628a\u7d93\u9a57\u7372\u5f97\u7387\u8abf\u6574\u70ba\u9810\u8a2d\u8acb\u8f38\u5165 /xprate reset -Commands.xprate.proper.2=&c\u8acb\u6307\u5b9a true \u6216 false \u4f86\u8868\u660e\u9019\u662f\u5426\u662f\u7d93\u9a57\u4e8b\u4ef6 -Commands.NegativeNumberWarn=\u4e0d\u8981\u4f7f\u7528\u8ca0\u6578 \uff01 -Commands.Event.Start=&amcMMO &6\u4e8b\u4ef6 \uff01 -Commands.Event.Stop=&amcMMO &3\u4e8b\u4ef6\u7d50\u675f \uff01 -Commands.Event.Stop.Subtitle=&a\u5e0c\u671b\u4f60\u73a9\u7684\u958b\u5fc3 \uff01 -Commands.Event.XP=&3\u591a\u500d\u7d93\u9a57\u901f\u7387\u70ba &6{0}&3 \u500d -Commands.xprate.started.0=&6mcMMO \u7d93\u9a57\u4e8b\u4ef6\u5df2\u958b\u59cb \uff01 -Commands.xprate.started.1=&6mcMMO \u7d93\u9a57\u7372\u5f97\u7387\u73fe\u5728\u70ba {0} \u500d \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=&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\u4f60\u5df2\u5c07\u5168\u5c40\u591a\u500d\u7d93\u9a57\u8a2d\u5b9a\u70ba &6{0} \u500d -Notifications.Admin.XPRate.End.Self=&7\u4f60\u7d50\u675f\u4e86\u591a\u500d\u7d93\u9a57\u4e8b\u4ef6\u3002 -Notifications.Admin.XPRate.End.Others={0} &7\u7d50\u675f\u4e86\u591a\u500d\u7d93\u9a57\u4e8b\u4ef6 -Notifications.Admin.XPRate.Start.Others={0} &7\u5df2\u555f\u52d5\u6216\u4fee\u6539\u5177\u6709\u5168\u5c40 {1} \u500d\u7684\u591a\u500d\u7d93\u9a57\u4e8b\u4ef6 -Notifications.Admin.Format.Others=&6\uff08&amcMMO &3\u7ba1\u7406\u54e1&6\uff09 &7{0} -Notifications.Admin.Format.Self=&6\uff08&amcMMO&6\uff09 &7{0} +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 \u73fe\u5728\u6b63\u8655\u65bc\u591a\u500d\u7d93\u9a57\u4e8b\u4ef6\u968e\u6bb5 \uff01 \u7d93\u9a57\u7372\u5f97\u7387\u70ba {0}\u500d \uff01 +XPRate.Event=&6mcMMO 現在正處於多倍經驗事件階段 ! 經驗獲得率為 {0}倍 ! #GUIDES -Guides.Available=&7{0} \u7684\u56ae\u5c0e - \u8f38\u5165 /{1} ? [\u9801\u6578] -Guides.Header=&6-=&a{0} \u56ae\u5c0e&6=- -Guides.Page.Invalid=\u4e0d\u662f\u6709\u6548\u7684\u9801\u6578 \uff01 -Guides.Page.OutOfRange=\u90a3\u9801\u4e0d\u5b58\u5728\uff0c\u7e3d\u5171\u53ea\u6709 {0} \u9801 -Guides.Usage= \u7528\u6cd5 /{0} ? [\u9801\u6578] +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\u95dc\u65bc\u96dc\u6280 \uff1a \n&e\u96dc\u6280\u662f mcMMO \u4e2d\u512a\u96c5\u79fb\u52d5\u7684\u85dd\u8853\u3002\n&e\u5b83\u63d0\u4f9b\u4e86\u6230\u9b25\u52a0\u6210\u548c\u74b0\u5883\u50b7\u5bb3\u52a0\u6210\u3002\n\n&3\u7d93\u9a57\u4f86\u6e90 \uff1a \n&e\u900f\u904e\u5728\u6230\u9b25\u4e2d\u8ff4\u907f\u6216\u8005\u5f9e\u9ad8\u8655\n&e\u6454\u843d\u6642\u53d7\u50b7\u4e26\u5016\u5b58\u4f86\u7372\u5f97\u7d93\u9a57\u3002 -Guides.Acrobatics.Section.1=&3\u7ffb\u6efe\u662f\u5982\u4f55\u904b\u4f5c\u7684 \uff1f \n&e\u7576\u4f60\u53d7\u5230\u6454\u843d\u50b7\u5bb3\u6642\u4f60\u6709\u88ab\u52d5\u6a5f\u6703\u4f86\u514d\u53d7\u50b7\u5bb3\u3002\n&e\u4f60\u53ef\u4ee5\u5728\u6454\u843d\u4e2d\u6309\u4f4f\u8e72\u4e0b\u9375\u4f86\u63d0\u5347\u89f8\u767c\u6a5f\u7387\u3002\n&e\u9019\u5c07\u89f8\u767c\u512a\u96c5\u5730\u7ffb\u6efe\u800c\u4e0d\u662f\u666e\u901a\u7684\u7ffb\u6efe\u3002\n&e\u512a\u96c5\u5730\u7ffb\u6efe\u985e\u4f3c\u666e\u901a\u7684\u7ffb\u6efe\u4f46\u662f\u5b83\u6709\u96d9\u500d\u6a5f\u7387\n&e\u767c\u751f\uff0c\u4e26\u4e14\u80fd\u5920\u63d0\u4f9b\u6bd4\u666e\u901a\u5730\u7ffb\u6efe\u66f4\u9ad8\u7684\u50b7\u5bb3\u6e1b\u5c11\uff0c\n&e\u7ffb\u6efe\u6a5f\u7387\u53d6\u6c7a\u65bc\u4f60\u7684\u6280\u80fd\u7b49\u7d1a\u3002 -Guides.Acrobatics.Section.2=&3\u8ff4\u907f\u662f\u5982\u4f55\u904b\u4f5c\u7684 \uff1f \n&e\u8ff4\u907f\u662f\u88ab\u52d5\u6280\u80fd\n&e\u4ed6\u5728\u4f60\u88ab\u653b\u64ca\u6642\u6709\u4e00\u5b9a\u6a5f\u7387\u88ab\u6fc0\u767c\n&e\u9019\u500b\u6a5f\u7387\u548c\u4f60\u7684\u6280\u80fd\u7b49\u7d1a\u6709\u95dc\u3002 +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\u95dc\u65bc\u7149\u91d1\u8853 \uff1a \n&e\u7149\u91d1\u8853\u662f\u85e5\u6c34\u91c0\u9020\u7684\u6280\u80fd\u3002\n&e\u5b83\u63d0\u5347\u4e86\u85e5\u6c34\u91c0\u9020\u6642\u7684\u901f\u5ea6\uff0c\u4e26\u4e14\u52a0\u5165\u4e86\n&e\u65b0\u7684 \uff08\u76f8\u5c0d\u4e4b\u524d\uff09 \u7121\u6cd5\u7372\u5f97\u7684\u85e5\u6c34\u3002\n\n\n&3\u7d93\u9a57\u4f86\u6e90 \uff1a \n&e\u900f\u904e\u91c0\u9020\u85e5\u6c34\u4f86\u7372\u5f97\u7d93\u9a57\u3002 -Guides.Alchemy.Section.1=&3\u50ac\u5316\u662f\u5982\u4f55\u904b\u4f5c\u7684 \uff1f \n&e\u50ac\u5316\u63d0\u5347\u91c0\u9020\u7684\u901f\u5ea6\uff0c\u5728 1000 \u7d1a\n&e\u6642\u80fd\u9054\u5230\u6700\u9ad8 4 \u500d\u3002\n&e\u6b64\u80fd\u529b\u9810\u8a2d\u5728 100 \u7d1a\u89e3\u9396\u3002 -Guides.Alchemy.Section.2=&3\u6df7\u5408\u662f\u5982\u4f55\u904b\u4f5c\u7684 \uff1f \n&e\u6df7\u5408\u5141\u8a31\u4f7f\u7528\u81ea\u8a02\u6750\u6599\u91c0\u9020\u66f4\u591a\u85e5\u6c34\u3002\n&e\u7279\u6b8a\u6750\u6599\u6839\u64da\u4f60\u7684\u7b49\u7d1a\u4f86\u89e3\u9396\u3002\n&e\u7e3d\u5171\u6709 8 \u500b\u7b49\u7d1a\u9700\u8981\u89e3\u9396\u3002 -Guides.Alchemy.Section.3=&3\u6df7\u5408\u7b2c 1 \u968e\u6750\u6599 \uff1a \n&e\u70c8\u7130\u7c89\u3001\u767c\u9175\u8718\u86db\u773c\u3001\u5e7d\u9748\u4e4b\u6dda\u3001\u7d05\u77f3\u3001\n&e\u87a2\u77f3\u7c89\u3001\u7cd6\u3001\u9472\u91d1\u897f\u74dc\u7247\u3001\u91d1\u80e1\u863f\u8514\u3001\n&e\u5ca9\u6f3f\u7403\u3001\u5730\u7344\u7599\u7629\u3001\u8718\u86db\u773c\u3001\u706b\u85e5\u3001\u8377\u8449\u3001\n&e\u6cb3\u8c5a\n&e\uff08\u7d14\u6de8\u85e5\u6c34\uff09\u3002 -Guides.Alchemy.Section.4=&3\u6df7\u5408\u7b2c 2 \u968e\u6750\u6599 \uff1a \n&e\u80e1\u863f\u8514 \uff08\u6316\u6398\u52a0\u901f\u85e5\u6c34\uff09\n&e\u53f2\u840a\u59c6\u7403 \uff08\u7de9\u901f\u85e5\u6c34\uff09\n\n&3\u6df7\u5408\u7b2c 3 \u968e\u6750\u6599 \uff1a \n&e\u5730\u7344\u77f3\u82f1 \uff08\u5438\u6536\u85e5\u6c34\uff09\n&e\u7d05\u8272\u8611\u83c7 \uff08\u8df3\u8e8d\u85e5\u6c34\uff09\u3002 -Guides.Alchemy.Section.5=&3\u6df7\u5408\u7b2c 4 \u968e\u6750\u6599 \uff1a \n&e\u860b\u679c \uff08\u751f\u547d\u52a0\u6210\u85e5\u6c34\uff09\n&e\u8150\u8089\uff08\u98e2\u9913\u85e5\u6c34\uff09\n\n&3\u6df7\u5408\u7b2c 5 \u968e\u6750\u6599 \uff1a \n&e\u68d5\u8272\u8611\u83c7 \uff08\u53cd\u80c3\u85e5\u6c34\uff09\n&e\u58a8\u56ca \uff08\u5931\u660e\u85e5\u6c34\uff09\u3002 -Guides.Alchemy.Section.6=&3\u6df7\u5408\u7b2c 6 \u968e\u6750\u6599 \uff1a \n&e\u8568\u985e \uff08\u98fd\u548c\u85e5\u6c34\uff09\n\n&3\u6df7\u5408\u7b2c 7 \u968e\u6750\u6599 \uff1a \n&e\u6bd2\u99ac\u9234\u85af \uff08\u8150\u721b\u85e5\u6c34\uff09\n\n\u6df7\u5408\u7b2c 8 \u968e\u6750\u6599 \uff1a \n&e\u91d1\u860b\u679c \uff08\u6297\u6027\u63d0\u5347\u85e5\u6c34\uff09\u3002 +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\u95dc\u65bc\u7bad\u8853 \uff1a \n&e\u7bad\u8853\u662f\u7528\u5f13\u5c04\u7bad\u3002\n&e\u70ba\u4f60\u63d0\u4f9b\u5404\u7a2e\u6230\u9b25\u52a0\u6210\uff0c\n&e\u4f8b\u5982\u96a8\u8457\u4f60\u7684\u7b49\u7d1a\u63d0\u5347\u50b7\u5bb3\uff0c\u4ee5\u53ca\u5c07\u5c0d\u624b\u64ca\u6688\u7684\u80fd\u529b\n&e\u9664\u6b64\u4e4b\u5916\u4f60\u9084\u80fd\u5f9e\u5c0d\u624b\u7684\u8eab\u4e0a\u56de\u6536\u7bad\u77e2\u3002\n\n\n&3\u7d93\u9a57\u4f86\u6e90 \uff1a \n&e\u8981\u7372\u5f97\u6b64\u50c5\u80fd\u7684\u7d93\u9a57\n&e\u4f60\u9700\u8981\u5c04\u64ca\u602a\u7269\u6216\u5176\u4ed6\u73a9\u5bb6\u3002 -Guides.Archery.Section.1=&3\u6280\u5de7\u5c04\u64ca\u5982\u4f55\u904b\u4f5c \uff1f \n&e\u6280\u5de7\u5c04\u64ca\u6703\u4f7f\u4f60\u7684\u5c04\u7bad\u653b\u64ca\u7372\u5f97\u50b7\u5bb3\u52a0\u6210\u3002\n&e\u6280\u5de7\u5c04\u64ca\u63d0\u4f9b\u7684\u50b7\u5bb3\u52a0\u6210\u6703\u96a8\u8457\n&e\u7bad\u8853\u7b49\u7d1a\u7684\u63d0\u5347\u800c\u589e\u52a0\u3002\n&e\u4f7f\u7528\u9810\u8a2d\u8a2d\u5b9a\u4f60\u7684\u7bad\u8853\u6bcf\u4e94\u5341\u7d1a\u63d0\u9ad8 10% \u7684\u50b7\u5bb3\u52a0\u6210\n&e\u6700\u9ad8\u63d0\u4f9b 200% \u7684\u50b7\u5bb3\u52a0\u6210\u3002 -Guides.Archery.Section.2=&3\u64ca\u6688\u5982\u4f55\u904b\u4f5c \uff1f \n&e\u7576\u4f60\u5c04\u64ca\u73a9\u5bb6\u6642\uff0c\u9019\u500b\u88ab\u52d5\u6709\u6a5f\u7387\u4f7f\u5176\u4ed6\u73a9\u5bb6\u7372\u5f97\u7729\u6688\u3002\n&e\u7576\u64ca\u6688\u89f8\u767c\u6642\u4ed6\u6703\u6642\n&e\u5c0d\u624b\u76f4\u8996\u524d\u65b9\u4e00\u5b9a\u6642\u9593\u3002\n&e\u4e26\u63d0\u4f9b 4 \u9ede \uff082 \u9846\u5fc3\uff09 \u7684\u984d\u5916\u50b7\u5bb3\u3002 -Guides.Archery.Section.3=&3\u7bad\u77e2\u56de\u6536\u5982\u4f55\u904b\u4f5c \uff1f \n&e\u7576\u4f60\u7528\u5f13\u7bad\u64ca\u6bba\u602a\u7269\u6642\n&e\u6709\u6a5f\u7387\u56de\u6536\u7bad\u77e2\u3002\n&e\u9019\u500b\u6a5f\u7387\u96a8\u8457\u4f60\u7bad\u8853\u7b49\u7d1a\u7684\u63d0\u5347\u800c\u589e\u52a0\u3002\n&e\u9810\u8a2d\u60c5\u6cc1\u4e0b\u9019\u500b\u80fd\u529b\u6bcf\u7d1a\u589e\u52a0 0.1%\uff0c\n&e1000 \u7d1a\u589e\u52a0 100%\u3002 +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\u95dc\u65bc\u65a7\u6280 \uff1a \n&e\u6709\u4e86\u65a7\u6280\uff0c\u65a7\u982d\u4e0d\u518d\u53ea\u662f\u780d\u6a39\u800c\u5df2\u3002\n&e\u4f60\u9084\u53ef\u4ee5\u780d\u5176\u4ed6\u751f\u7269\u548c\u73a9\u5bb6\u4f86\u8cfa\u53d6\u7d93\u9a57\u3002\n&e\u653b\u64ca\u751f\u7269\u6642\u9644\u52a0\u64ca\u9000\u6548\u679c\u3002\n&e\u9084\u6703\u5c0d\u751f\u7269\u548c\u73a9\u5bb6\u9020\u6210\u81f4\u547d\u50b7\u5bb3\u3002\n&e\u4f60\u7684\u65a7\u982d\u6703\u50cf\u624b\u6301\u4f10\u6728\u6a5f\u4e00\u6a23\u3002\n&e\u8f15\u9b06\u524a\u6389\u6575\u4eba\u7684\u76d4\u7532\u3002\n&e\u6548\u679c\u96a8\u8457\u6280\u80fd\u7b49\u7d1a\u63d0\u9ad8\u3002\n&3\u7d93\u9a57\u7684\u7372\u5f97 \uff1a \n&e\u624b\u6301\u65a7\u982d\u653b\u64ca\u5176\u4ed6\u751f\u7269\u6216\u73a9\u5bb6\u3002 -Guides.Axes.Section.1=&3\u4ec0\u9ebc\u662f\u65ac\u9996\u8005 \uff1f \n&e\u9019\u500b\u6280\u80fd\u6703\u9020\u6210\u7bc4\u570d\u653b\u64ca\u50b7\u5bb3\n&e\u50b7\u5bb3\u7b49\u65bc\u5c0d\u4e3b\u8981\u653b\u64ca\u76ee\u6a19\u9020\u6210\u50b7\u5bb3\u7684 50%\n&e\u6240\u4ee5\u5f88\u5bb9\u6613\u6e05\u7406\u6389\u4e00\u5927\u7247\u602a\u7269\u3002 -Guides.Axes.Section.2=&3\u4ec0\u9ebc\u662f\u81f4\u547d\u4e00\u64ca \uff1f \n&e\u9019\u662f\u88ab\u52d5\u6280\u80fd\n&e\u4e00\u5b9a\u6a5f\u7387\u5c0d\u76ee\u6a19\u9020\u6210\u984d\u5916\u50b7\u5bb3\n&e\u9810\u8a2d\u6bcf 2 \u7d1a\u589e\u52a0 0.1%\n&e\u5c0d\u751f\u7269\u9020\u6210 2 \u500d\u50b7\u5bb3\n&e\u5c0d\u73a9\u5bb6\u9020\u6210 1.5 \u500d\u50b7\u5bb3\u3002 -Guides.Axes.Section.3=&3\u4ec0\u9ebc\u662f\u65a7\u7cbe\u901a \uff1f \n&e\u9019\u662f\u88ab\u52d5\u6280\u80fd\n&e\u4f7f\u7528\u65a7\u982d\u653b\u64ca\u6642\u9644\u52a0\u984d\u5916\u50b7\u5bb3\n&e\u9810\u8a2d\u6bcf 50 \u7d1a\u984d\u5916\u63d0\u9ad81\u9ede\u50b7\u5bb3\n&e4\u9ede\u984d\u5916\u50b7\u5bb3\u5c01\u9802\u3002 -Guides.Axes.Section.4=&3\u4ec0\u9ebc\u662f\u7834\u7532 \uff1f \n&e\u7528\u8db3\u5920\u7684\u529b\u91cf\u64ca\u788e\u76d4\u7532 \uff01 \n&e\u7834\u7532\u662f\u88ab\u52d5\u7684\u80fd\u529b\uff0c\u5b83\u6709\u6a5f\u7387\u6703\u640d\u8017\n&e\u5c0d\u624b\u76d4\u7532\u7684\u8010\u4e45\u5ea6\u3002\u9019\u500b\u50b7\u5bb3\u6703\u96a8\u8457\u4f60\u65a7\u6280\u6280\u80fd\u7b49\u7d1a\u63d0\u5347\u3002 -Guides.Axes.Section.5=&3\u4ec0\u9ebc\u662f\u5f37\u529b\u885d\u64ca \uff1f \n&e\u9019\u662f\u88ab\u52d5\u6280\u80fd\n&e\u4f7f\u7528\u65a7\u982d\u653b\u64ca\u6642\u4e00\u5b9a\u6a5f\u7387\u7d66\u6575\u4eba\u5e36\u4f86\u5de8\u5927\u7684\u885d\u64ca\u529b\n&e\u9810\u8a2d\u6a5f\u7387\u70ba 25%\n&e\u6548\u679c\u76f8\u7576\u65bc\u64ca\u9000 II \u7684\u9644\u9b54\u6548\u679c\n&e\u6b64\u5916\u9084\u6703\u5c0d\u76ee\u6a19\u9020\u6210\u984d\u5916\u50b7\u5bb3\u3002 +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\u95dc\u65bc\u6316\u6398 \uff1a \n&e\u6316\u6398\u662f\u4ee5\u6316\u6398\u6ce5\u571f\u4ee5\u5c0b\u627e\u5bf6\u85cf\u7684\u884c\u70ba\u3002\n&e\u900f\u904e\u6316\u6398\uff0c\u4f60\u5c07\u6703\u627e\u5230\u96b1\u85cf\u7684\u5bf6\u85cf\u3002\n&e\u4f60\u6316\u7684\u8d8a\u591a\u4f60\u627e\u5230\u7684\u5bf6\u85cf\u4e5f\u5c31\u8d8a\u591a\u3002\n\n&3\u7d93\u9a57\u4f86\u6e90 \uff1a \n&e\u8981\u7372\u5f97\u8a72\u6280\u80fd\u7684\u7d93\u9a57\u4f60\u5fc5\u9808\u624b\u6301\u93df\u5b50\u6316\u6398\u3002\n&e\u53ea\u6709\u7279\u5b9a\u7684\u65b9\u584a\u624d\u80fd\u7372\u5f97\u7d93\u9a57\u3001\u6316\u6398\u5230\u5bf6\u85cf\u3002 -Guides.Excavation.Section.1=&3\u53ef\u4ee5\u6316\u6398\u7684\u65b9\u584a \uff1a \n&e\u8349\u5730\u3001\u6ce5\u571f\u3001\u6c99\u5b50\u3001\u9ecf\u571f\u3001\u7802\u792b\u3001\u83cc\u7d72\u571f\u3001\u9748\u9b42\u6c99\u3001\u96ea\u3002 -Guides.Excavation.Section.2=&3\u5982\u4f55\u4f7f\u7528\u66b4\u8d70\u947d\u982d \uff1a \n&e\u624b\u62ff\u93df\u5b50\u9ede\u64ca\u53f3\u9375\u4ee5\u9032\u5165\u6e96\u5099\u72c0\u614b\u3002\n&e\u4e00\u65e6\u9032\u5165\u9019\u7a2e\u72c0\u614b\uff0c\u4f60\u7d04\u67094\u79d2\u7684\u6642\u9593\u8b93\u5de5\u5177\n&e\u9ede\u64ca\u8207\u6316\u6398\u6a5f\u80fd\u5c0d\u61c9\u7684\u65b9\u584a\n&e\u9019\u6a23\u5c31\u6703\u958b\u555f\u66b4\u8d70\u947d\u982d\u6280\u80fd\u3002 -Guides.Excavation.Section.3=&3\u4ec0\u9ebc\u662f\u66b4\u8d70\u947d\u982d \uff1f \n&e\u66b4\u8d70\u947d\u982d\u662f\u4e00\u7a2e\u8207\u6316\u6398\u6280\u80fd\u76f8\u95dc\uff0c\u4e14\u6709\u6642\u9593\u9650\u5236\u7684\u80fd\u529b\n&e\u5b83\u4f7f\u4f60\u627e\u5230\u5bf6\u85cf\u7684\u6a5f\u7387\u589e\u52a0 3 \u500d\n&e\u4e26\u4e14\u80fd\u77ac\u9593\u6253\u7834\u5c0d\u61c9\u7684\u65b9\u584a\u3002 -Guides.Excavation.Section.4=&3\u8003\u53e4\u5b78\u662f\u600e\u6a23\u904b\u4f5c\u7684 \uff1f \n&e\u6316\u6398\u51fa\u4f86\u7684\u6bcf\u500b\u5bf6\u85cf\u7684\u6389\u843d\u7269\u90fd\u6709\u81ea\u5df1\u7684\u6280\u80fd\u7b49\u7d1a\u8981\u6c42\n&e\u56e0\u6b64\u5f88\u96e3\u8aaa\u5b83\u5c0d\u4f60\u7684\u5e6b\u52a9\u6709\u591a\u5927\n&e\u8acb\u8a18\u4f4f\uff0c\u6316\u6398\u6a5f\u80fd\u7b49\u7d1a\u8d8a\u9ad8\u6316\u5230\u7684\u5bf6\u85cf\u5c31\u8d8a\u591a\u3002\n&e\u9084\u8981\u8a18\u5f97\u6bcf\u7a2e\u5c0d\u61c9\u6316\u6398\u7684\u65b9\u584a\u90fd\u6709\u81ea\u5df1\u7368\u7279\u7684\u5bf6\u85cf\u6e05\u55ae\n&e\u63db\u53e5\u8a71\u8aaa\uff0c\u4f60\u5728\u6ce5\u571f\u4e2d\u627e\u5230\u7684\u5bf6\u85cf\uff0c\n&e\u5728\u7802\u792b\u4e2d\u4e0d\u4e00\u5b9a\u80fd\u627e\u5230\u3002 -Guides.Excavation.Section.5=&3\u95dc\u65bc\u6316\u6398\u6ce8\u610f\u4e8b\u9805 \uff1a \n&e\u6316\u6398\u6389\u843d\u7269\u662f\u5b8c\u5168\u53ef\u5b9a\u5236\u7684\n&e\u56e0\u6b64\u6316\u51fa\u7684\u7d50\u679c\u56e0\u4f3a\u670d\u5668\u8a2d\u5b9a\u800c\u7570\u3002 +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\u95dc\u65bc\u91e3\u9b5a \uff1a \n&e\u95dc\u65bc\u91e3\u9b5a\u6280\u80fd\uff0c\u91e3\u9b5a\u518d\u6b21\u4f7f\u4eba\u632f\u596e \uff01 \n&e\u627e\u5230\u96b1\u85cf\u7684\u5bf6\u85cf\u5f9e\u602a\u7269\u8eab\u4e0a\u6296\u843d\u7269\u54c1\u3002\n\n&3\u7d93\u9a57\u4f86\u6e90 \uff1a \n&e\u91e3\u9b5a\u3002 -Guides.Fishing.Section.1=&3\u6dd8\u91d1\u8005\u5982\u4f55\u904b\u4f5c \uff1f \n&e\u9019\u500b\u80fd\u529b\u4f7f\u4f60\u5728\u91e3\u9b5a\u6642\u627e\u5230\u5bf6\u85cf\n&e\u4e26\u4e14\u7269\u54c1\u6709\u5c0f\u6a5f\u7387\u5e36\u6709\u9644\u9b54\u3002\n&e\u91e3\u9b5a\u6280\u80fd\u7684\u6bcf\u7d1a\u5225\u7684\u5bf6\u85cf\u90fd\u6709\u6a5f\u7387\u6389\u843d\n&e\u3002\u5bf6\u85cf\u7684\u6a5f\u7387\u53d6\u6c7a\u65bc\u7a00\u6709\u5ea6\u7684\u6389\u843d\u6a5f\u7387\n&e\u4f60\u7684\u91e3\u9b5a\u7b49\u7d1a\u8d8a\u9ad8\uff0c\u4f60\u8d8a\u6709\u53ef\u80fd\u627e\u5230\u66f4\u597d\u7684\u5bf6\u85cf\uff0c\n&e\u7372\u5f97\u5bf6\u85cf\u7684\u6a5f\u7387\u4e5f\u8d8a\u9ad8\u3002 -Guides.Fishing.Section.2=&3\u51b0\u91e3\u5982\u4f55\u904b\u4f5c \uff1f \n&e\u9019\u500b\u88ab\u52d5\u6280\u80fd\u53ef\u4ee5\u8b93\u4f60\u5728\u51b0\u6e56\u4e2d\u91e3\u9b5a \uff01 \n&e\u5c07\u4f60\u7684\u91e3\u7aff\u6254\u5728\u51b0\u6e56\u91cc\u9019\u500b\u80fd\u529b\u6703\u5728\u51b0\u4e0a\n&e\u5f62\u6210\u5c0f\u5b54\u4f9b\u4f60\u91e3\u9b5a\u3002 -Guides.Fishing.Section.3=&3\u91e3\u9b5a\u5927\u5e2b\u5982\u4f55\u904b\u4f5c \uff1f \n&e\u9019\u500b\u88ab\u52d5\u589e\u52a0\u4e86\u91e3\u9b5a\u6642\u54ac\u9264\u7684\u6a5f\u7387\u3002\n&e\u7576\u4f60\u89e3\u9396\u9019\u7a2e\u80fd\u529b\u6642\n&e\u5728\u8239\u4e0a\u6216\u8005\u5728\u6d77\u6d0b\u751f\u7269\u7fa4\u7cfb\u91e3\u9b5a\u6642\u91e3\u5230\u9b5a\u7684\u6a5f\u7387\u589e\u52a0\u4e00\u500d\u3002 -Guides.Fishing.Section.4=&3\u6296\u52d5\u5982\u4f55\u904b\u4f5c \uff1f \n&e\u9019\u7a2e\u4e3b\u52d5\u6280\u80fd\u53ef\u4ee5\u8b93\u4f60\u7528\u91e3\u7aff\u52fe\u4f4f\u751f\u7269\n&e\u4e26\u5f9e\u4ed6\u5011\u8eab\u4e0a\u7372\u5f97\u7269\u54c1\u3002\n&e\u751f\u7269\u6703\u6389\u843d\u4ed6\u5011\u6b7b\u4ea1\u6642\u6389\u843d\u7684\u7269\u54c1\u3002\n&e\u4e5f\u53ef\u80fd\u7372\u5f97\u602a\u7269\u7684\u982d\n&e\u4e00\u822c\u60c5\u6cc1\u4e0b\u9019\u4e9b\u982d\u7121\u6cd5\u5728\u751f\u5b58\u6a21\u5f0f\u4e2d\u7372\u5f97\u3002 -Guides.Fishing.Section.5=&3\u6f01\u592b\u7684\u98df\u8b5c\u5982\u4f55\u904b\u4f5c \uff1f \n&e\u9019\u500b\u88ab\u52d5\u589e\u52a0\u4e86\u5403\u9b5a\u6642\u56de\u5fa9\u7684\u98fd\u98df\u5ea6\u3002 -Guides.Fishing.Section.6=&3\u95dc\u65bc\u91e3\u9b5a\u7684\u8aaa\u660e \uff1a \n&e\u91e3\u9b5a\u7684\u6389\u843d\u7269\u662f\u53ef\u4ee5\u81ea\u5b9a\u7fa9\u7684\uff0c\n&e\u6240\u4ee5\u6389\u843d\u7269\u56e0\u4f3a\u670d\u5668\u8a2d\u5b9a\u800c\u7570\u3002 +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\u95dc\u65bc\u8349\u85e5\u5b78 \uff1a \n&e\u8349\u85e5\u5b78\u662f\u95dc\u65bc\u63a1\u96c6\u8349\u85e5\u8207\u690d\u7269\u7684\u6280\u80fd\u3002\n\n&3\u7d93\u9a57\u62c9\u9060 \uff1a \n&e\u63a1\u96c6\u8349\u85e5\u6216\u690d\u7269\u3002 -Guides.Herbalism.Section.1=&3\u53ef\u4f5c\u7528\u7684\u8349\u85e5/\u690d\u7269\n&e\u5c0f\u9ea5\u3001\u99ac\u9234\u85af\u3001\u80e1\u863f\u8514\u3001\u897f\u74dc\u3001\n&e\u5357\u74dc\u3001\u7518\u8517\u3001\u53ef\u53ef\u8c46\u3001\u4ed9\u4eba\u638c\u3001\u8611\u83c7\u3001\n&e\u5730\u7344\u7599\u7629\u3001\u8377\u8449\u8207\u85e4\u8513\u3002 -Guides.Herbalism.Section.2=&3\u5927\u5730\u795d\u798f\u5982\u4f55\u904b\u4f5c \uff1f \n&e\u5927\u5730\u795d\u798f\u662f\u4e3b\u52d5\u6280\u80fd\uff0c\u7576\u4f60\u624b\u6301\u92e4\u982d\u6642\n&e\u9ede\u64ca\u53f3\u9375\u53ef\u767c\u52d5\u6280\u80fd\uff0c\u5927\u5730\u795d\u798f\u63d0\u9ad8\u4e09\u500d\u6536\u7a6b\u7684\u6a5f\u7387\u3002\n&e\u540c\u6642\u4e5f\u8b93\u73a9\u5bb6\u6709\u80fd\u529b\u4f7f\u7528\u8eab\u4e0a\u7684\u7a2e\u5b50\u4f86\u8f49\u5316\n&e\u65b9\u584a\u4e26\u8ce6\u4e88\u751f\u547d\u3002 -Guides.Herbalism.Section.3=&3\u7da0\u624b\u6307 \uff08\u4f5c\u7269\uff09 \u5982\u4f55\u904b\u4f5c \uff1f \n&e\u9019\u662f\u88ab\u52d5\u6280\u80fd\uff0c\u8b93\u4f5c\u7269\u5728\u63a1\u96c6\u6642\n&e\u81ea\u52d5\u64ad\u7a2e\u56de\u53bb\u3002\n&e\u6a5f\u7387\u53d6\u6c7a\u65bc\u4f60\u7684\u8349\u85e5\u5b78\u6280\u80fd\u7b49\u7d1a\u3002 -Guides.Herbalism.Section.4=&3\u7da0\u624b\u6307 \uff08\u9d5d\u5375\u77f3/\u77f3\u78da/\u6ce5\u571f\uff09 \u5982\u4f55\u904b\u4f5c \uff1f \n&e\u9019\u662f\u4e3b\u52d5\u6280\u80fd\uff0c\u8b93\u4f60\u5728\u624b\u62ff\u8457\u7a2e\u5b50\u6642\uff0c\n&e\u5c0d\u9d5d\u5375\u77f3/\u77f3\u78da/\u6ce5\u571f\u9ede\u64ca\u53f3\u9375\uff0c\u53ef\u4f7f\u5b83\u5011\u8b8a\u6210\n&e\u9752\u82d4\u77f3\u3001\u8349\u5730\u7b49\uff0c\u9019\u6703\u6d88\u8017\u4e00\u9846\u7a2e\u5b50\u3002 -Guides.Herbalism.Section.5=&3\u8fb2\u592b\u98df\u8b5c\u5982\u4f55\u904b\u4f5c \uff1f \n&e\u9019\u662f\u88ab\u52d5\u6280\u80fd\uff0c\u53ef\u589e\u52a0\u4e0b\u5217\u98df\u7269\u7684\u98fd\u98df\u5ea6\u56de\u5fa9 -\n&e\u9eb5\u5305\uff0c\u9905\u4e7e\u3001\u897f\u74dc\u3001\u8611\u83c7\u6e6f\u3001\u80e1\u863f\u8514\u3001\u99ac\u9234\u85af\u3002 -Guides.Herbalism.Section.6=&3\u6d77\u62c9\u723e\u7684\u795d\u798f\u5982\u4f55\u904b\u4f5c \uff1f \n&e\u9019\u662f\u4e3b\u52d5\u6280\u80fd\uff0c\u6709\u6a5f\u7387\u5728\u7528\u528d\u7834\u58de\u7279\u5b9a\n&e\u65b9\u584a\u6642\u7372\u5f97\u7a00\u6709\u9053\u5177\u3002 -Guides.Herbalism.Section.7=&3\u96d9\u500d\u6389\u843d\u5982\u4f55\u904b\u4f5c \uff1f \n&e\u9019\u662f\u88ab\u52d5\u6280\u80fd\u4f7f\u73a9\u5bb6\u80fd\u52a0\u500d\u6536\u7a6b\u3002 +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\u95dc\u65bc\u6316\u7926 \uff1a \n&e\u6316\u7926\u5305\u62ec\u6316\u6398\u77f3\u982d\u548c\u7926\u7269\u3002\n&e\u6316\u7926\u6280\u80fd\u53ef\u4ee5\u63d0\u4f9b\u591a\u91cd\u7926\u7269\u6389\u843d\u7684\u734e\u52f5\u3002\n\n&3\u7d93\u9a57\u4f86\u6e90 \uff1a \n&e\u7372\u5f97\u6b64\u6280\u80fd\u7684\u7d93\u9a57\u503c\uff0c\u4f60\u5fc5\u9808\u62ff\u8457\u7926\u93ac\u9032\u884c\u6316\u6398\uff0c\n&e\u53ea\u6709\u7279\u5b9a\u65b9\u584a\u624d\u80fd\u7372\u5f97\u7d93\u9a57\u3002 -Guides.Mining.Section.1=&3\u5c0d\u61c9\u6750\u6599 \uff1a \n&e\u77f3\u982d\u3001\u7164\u7926\u3001\u9435\u7926\u3001\u91d1\u7926\u3001\u947d\u77f3\u7926\u3001\u7d05\u77f3\u7926\u3001\n&e\u9752\u91d1\u77f3\u7926\u3001\u9ed1\u66dc\u77f3\u3001\u9752\u82d4\u77f3\u3001\u7d42\u754c\u77f3\u3001\n&e\u87a2\u5149\u77f3\u3001\u5730\u7344\u77f3\u3002 -Guides.Mining.Section.2=&3\u5982\u4f55\u4f7f\u7528\u8d85\u7d1a\u788e\u77f3\u6a5f \uff1a \n&e\u628a\u93ac\u5b50\u62ff\u5728\u4f60\u7684\u624b\u4e0a\uff0c\u9ede\u64ca\u53f3\u9375\u4f86\u6e96\u5099\u4f60\u7684\u93ac\u5b50\u3002\n&e\u4f60\u5c07\u6709 4 \u79d2\u7684\u6642\u9593\u4f86\u6fc0\u767c\u4f60\u7684\u6280\u80fd\u3002\n&e\u7576\u4f60\u6572\u4e0b\u5c0d\u61c9\u7684\u77f3\u982d\u4ee5\u5f8c\uff0c\u8d85\u7d1a\u788e\u77f3\u6a5f\u5c07\u88ab\u958b\u555f\u3002 -Guides.Mining.Section.3=&3\u4ec0\u9ebc\u662f\u8d85\u7d1a\u788e\u77f3\u6a5f \uff1f \n&e\u8d85\u7d1a\u788e\u77f3\u6a5f\u662f\u4e3b\u52d5\u6280\u80fd\n&e\u5b83\u80fd\u4f7f\u4f60\u5728\u6316\u6389\u5c0d\u61c9\u7926\u7269\u7684\u6642\u5019\u589e\u52a0 3 \u500d\u6389\u843d\u6a5f\u7387\n&e\u4e26\u4e14\u5728\u6280\u80fd\u6642\u9593\u5167\u77ac\u9593\u7834\u58de\u77f3\u982d\u548c\u7926\u7269 -Guides.Mining.Section.4=&3\u5982\u4f55\u4f7f\u7528\u7206\u7834\u958b\u6316 \uff1a \n&e\u628a\u93ac\u5b50\u62ff\u5728\u624b\u4e0a\uff0c\n&e\u5728\u4e00\u5b9a\u8ddd\u96e2\u5167\u5c0d TNT \u9ede\u64ca\u53f3\u9375\uff0c\u9019\u5c07\u6703\u4f7f\u5f97 TNT \u5728\u77ac\u9593\u5167\u7206\u70b8\u3002 -Guides.Mining.Section.5=&3\u4ec0\u9ebc\u662f\u7206\u7834\u958b\u6316 \uff1f \n&e\u7206\u7834\u958b\u6316\u662f\u9700\u8981\u51b7\u537b\u6642\u9593\u7684\u6316\u7926\u6280\u80fd\n&e\u5b83\u80fd\u4f7f\u4f60\u5728\u4f7f\u7528 TNT \u70b8\u7926\u6642\u7372\u5f97\u984d\u5916\u734e\u52f5\n&e\u7206\u7834\u958b\u6316\u7e3d\u5171\u6709 3 \u500b\u529f\u80fd\n&e\u5927\u578b\u70b8\u5f48 \uff1a \u4f7f\u4f60\u7684 TNT \u7206\u70b8\u7bc4\u570d\u64f4\u5927\n&e\u7206\u7834\u5c08\u5bb6 \uff1a \u964d\u4f4e\u4f60\u53d7\u5230 TNT \u7684\u7206\u70b8\u50b7\u5bb3\n&e\u7206\u7834\u958b\u6316 \uff1a \u4f7f\u4f60\u9ede\u71c3\u7684 TNT \u70b8\u6389\u7bc4\u570d\u5167\u4e00\u5b9a\u6578\u91cf\u7684\u7926\u7269 +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\u95dc\u65bc\u4fee\u7406 \uff1a \n&e\u4fee\u7406\u53ef\u4ee5\u8b93\u4f60\u4f7f\u7528\u9435\u65b9\u584a\u4f86\u4fee\u7406\u76d4\u7532\u548c\u5de5\u5177\u3002\n\n&3\u7d93\u9a57\u4f86\u6e90 \uff1a \n&e\u4f7f\u7528 mcMMO \u7684\u9435\u7827\u4fee\u7406\u5de5\u5177\u6216\u88dd\u5099\u3002\n&emcMMO \u9810\u8a2d\u7684\u4fee\u7406\u53f0\u662f\u9435\u65b9\u584a\n&e\u4e0d\u8981\u8207\u7528\u7d93\u9a57\u4fee\u7406\u7684\u9435\u7827\u6df7\u6dc6\u3002 -Guides.Repair.Section.1=&3\u5982\u4f55\u4f7f\u7528\u4fee\u7406 \uff1f \n&e\u653e\u4e0b mcMMO \u9435\u7827 \uff08\u9435\u65b9\u584a\uff09\uff0c\u624b\u6301\u9700\u8981\u4fee\u7406\u7684\u9053\u5177 \n&e\uff0c\u5c0d\u9435\u65b9\u584a\u9ede\u64ca\u53f3\u9375\uff0c\u6bcf\u6b21\u4f7f\u7528\u6d88\u8017\u7269\u54c1\u3002 -Guides.Repair.Section.2=&3\u4fee\u7406\u7cbe\u901a\u5982\u4f55\u904b\u4f5c \uff1f \n&e\u4fee\u7406\u7cbe\u901a\u63d0\u5347\u4fee\u7406\u6642\u8010\u4e45\u56de\u5fa9\u91cf\u3002\n&e\u984d\u5916\u4fee\u7406\u7684\u8010\u4e45\u5ea6\u91cf\u53d6\u6c7a\u65bc\u4f60\u7684\u4fee\u7406\u6280\u80fd\u7b49\u7d1a\u3002 -Guides.Repair.Section.3=&3\u8d85\u7d1a\u4fee\u7406\u5982\u4f55\u904b\u4f5c \uff1f \n&e\u8d85\u7d1a\u4fee\u7406\u662f\u88ab\u52d5\u6280\u80fd\u3002\u7576\u4fee\u7406\u7269\u54c1\u6642\uff0c\n&e\u6703\u4f7f\u7269\u54c1\u7684\u4fee\u7406\u6548\u679c\u7ffb\u500d\u3002 -Guides.Repair.Section.4=&3\u79d8\u6cd5\u935b\u9020\u5982\u4f55\u904b\u4f5c \uff1f \n&e\u9019\u662f\u88ab\u52d5\u6280\u80fd\uff0c\u5141\u8a31\u4f60\u4fee\u7406\u9644\u9b54\u7269\u54c1\n&e\u4fee\u7406\u7269\u54c1\u6642\u6709\u4e00\u5b9a\u6a5f\u7387\u4fdd\u7559\u9644\u9b54\u5c6c\u6027\n&e\u9644\u9b54\u5c6c\u6027\u53ef\u4ee5\u4fdd\u6301\u73fe\u6709\u7684\u7b49\u7d1a\uff0c\n&e\u964d\u7d1a\u5230\u8f03\u4f4e\u7b49\u7d1a\u6216\u8005\u5b8c\u5168\u6d88\u5931\u3002 +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\u95dc\u65bc\u5206\u89e3 \uff1a \n&e\u5206\u89e3\u4f7f\u4f60\u53ef\u4ee5\u4f7f\u7528\u9ec3\u91d1\u65b9\u584a\u4f86\u5206\u89e3\u88dd\u5099\u548c\u5de5\u5177\u3002\n\n&3\u7d93\u9a57\u4f86\u6e90 \uff1a \n&e\u5206\u89e3\u6642\u4fee\u7406\u548c\u91e3\u9b5a\u7684\u5b50\u6280\u80fd\uff0c\n&e\u6280\u80fd\u7b49\u7d1a\u53d6\u6c7a\u65bc\u4f60\u7684\u91e3\u9b5a\u548c\u4fee\u7406\u7684\u7b49\u7d1a\u3002 -Guides.Salvage.Section.1=&3\u5982\u4f55\u4f7f\u7528\u5206\u89e3 \uff1f \n&e\u653e mcMMO \u5206\u89e3\u9435\u7827 \uff08\u9ec3\u91d1\u65b9\u584a\uff09 \u62ff\u8457\u7269\u54c1\u5c0d\u9ec3\u91d1\u65b9\u584a\u9ede\u64ca\u53f3\u9375\u3002\n&e\u9019\u5c07\u62c6\u89e3\u7269\u54c1\uff0c\u4e26\u8fd4\u9084\u7269\u54c1\u7684\u88fd\u4f5c\u6750\u6599\n&e\u4f8b\u5982 \uff1a \u62c6\u89e3\u9435\u93ac\u4f60\u5c07\u7372\u5f97\u9435\u9320\u3002 -Guides.Salvage.Section.2=&3\u5982\u4f55\u4f7f\u7528\u9032\u968e\u5206\u89e3 \uff1f \n&e\u89e3\u9396\u5f8c\uff0c\u6b64\u529f\u80fd\u4f7f\u4f60\u53ef\u4ee5\u5206\u89e3\u640d\u58de\u7684\u7269\u54c1\u3002\n&e\u96a8\u8457\u7b49\u7d1a\u7684\u63d0\u5347\u5206\u89e3\u6240\u5f97\u7684\u7269\u54c1\u6703\u7372\u5f97\u66f4\u591a\u7684\u6750\u6599\n&e\u900f\u904e\u9032\u968e\u5206\u89e3\u4f60\u59cb\u7d42\u80fd\u7372\u5f97\u6750\u6599\u3002\n&e\u4e0d\u7528\u64d4\u5fc3\u4e0d\u6703\u7372\u5f97\u6750\u6599\uff0c\u9664\u975e\u4f60\u7684\u8010\u4e45\u5ea6\u592a\u4f4e\u3002 -Guides.Salvage.Section.3=&3\u70ba\u4e86\u8aaa\u660e\u9019\u662f\u5982\u4f55\u904b\u4f5c\u7684\uff0c\u9019\u6709\u4f8b\u5b50 \uff1a \n&e\u5047\u8a2d\u6211\u5011\u5206\u89e3\u4e86\u640d\u58de\u4e86 20% \u7684\u91d1\u93ac\uff0c\n&e\u4ea6\u70ba\u4e4b\u4f60\u6700\u591a\u7372\u5f97\u5169\u500b\u91d1\u9320\n&e\uff08\u56e0\u70ba\u91d1\u93ac\u4f7f\u7528\u4e09\u500b\u91d1\u9320\u88fd\u4f5c\u7684\uff0c\n&e33\uff0c33% \u7684\u640d\u8017\uff09 \u7b49\u65bc 66% \u7684\u8010\u4e45\u5ea6\u3002\n&e\u5982\u679c\u4f60\u7684\u8010\u4e45\u5ea6\u4f4e\u65bc 66% \u5247\u7121\u6cd5\u7372\u5f97\u5169\u500b\u6750\u6599\uff0c\u9ad8\u65bc\u6b64\u503c\u7372\u5f97\u5169\u500b\u3002 -Guides.Salvage.Section.4=&3\u5982\u4f55\u4f7f\u7528\u5967\u8853\u5206\u89e3 \uff1f \n&e\u9019\u500b\u6280\u80fd\u53ef\u4ee5\u4f7f\u4f60\u5728\u5206\u89e3\u9644\u9b54\u7269\u54c1\u6642\u7372\u5f97\u9644\u9b54\u66f8\n&e\u6839\u64da\u4f60\u7684\u5206\u89e3\u7b49\u7d1a\uff0c\u5206\u70ba\u5168\u90e8\u63d0\u53d6\u548c\u90e8\u5206\u63d0\u53d6\n&e\u7576\u5206\u89e3\u4f4d\u90e8\u5206\u63d0\u53d6\u6642\u3002\n\n&e\u9644\u9b54\u66f8\u7684\u9644\u9b54\u8207\u7269\u54c1\u76f8\u6bd4\n&e\u9644\u9b54\u7b49\u7d1a\u504f\u4f4e\u3002 +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=\u99ac\u4e0a\u5230\u4f86\u2026\u2026 +Guides.Smelting.Section.0=馬上到來…… ##Swords -Guides.Swords.Section.0=&3\u95dc\u65bc\u528d\u8853 \uff1a \n&e\u9019\u500b\u6280\u80fd\u5728\u4f7f\u7528\u528d\u9032\u884c\u6230\u9b25\u6642\n&e\u63d0\u4f9b\u5404\u7a2e\u52a0\u6210\u3002\n\n&3\u7d93\u9a57\u4f86\u6e90 \uff1a \n&e\u7d93\u9a57\u503c\u662f\u900f\u904e\u7528\u528d\u5c0d\u602a\u7269\u6216\u5176\u4ed6\u73a9\u5bb6\n&e\u9020\u6210\u50b7\u5bb3\u7372\u5f97\u3002 -Guides.Swords.Section.1=&3\u5982\u4f55\u4f7f\u7528\u5229\u5203\u7a81\u523a \uff1f \n&e\u5229\u5203\u7a81\u523a\u662f\u4e3b\u52d5\u6280\u80fd\uff0c\u5c07\u528d\u62ff\u5728\u624b\u4e2d\u4e26\u9ede\u64ca\u53f3\u9375\u958b\u555f\n&e\u9019\u500b\u6280\u80fd\u8b93\u4f60\u767c\u52d5\u7bc4\u570d\u653b\u64ca\uff0c\u63d0\u4f9b 25% \u7684\u50b7\u5bb3\u52a0\u6210\n&e\u4e26\u4f34\u6709\u6495\u88c2\u6548\u679c\u3002 -Guides.Swords.Section.2=&3\u53cd\u64ca\u5982\u4f55\u904b\u4f5c \uff1f \n&e\u53cd\u64ca\u662f\u4e3b\u52d5\u6280\u80fd\uff0c\u683c\u64cb\u5c0d\u624b\u5c0d\u4f60\u7684\u50b7\u5bb3\n&e\u4e26\u6709\u6a5f\u7387\u53cd\u5c0450%\u7684\u50b7\u5bb3\u7d66\u5c0d\u624b\u3002 -Guides.Swords.Section.3=&3\u6495\u88c2\u5982\u4f55\u904b\u4f5c \uff1f \n&e\u6495\u88c2\u662f\u88ab\u52d5\u6280\u80fd\uff0c\u653b\u64ca\u6642\u6709\u6a5f\u7387\u89f8\u767c\u6495\u88c2\u3002\n&e\u6495\u88c2\u6703\u5c0d\u5c0d\u5c11\u9020\u6210\u6301\u7e8c\u7684\u6d41\u8840\u50b7\u5bb3\uff0c\u76f4\u5230\u7d50\u675f\u6216\u5c0d\u624b\u6b7b\u4ea1\uff0c\n&e\u6301\u7e8c\u6642\u9593\u53d6\u6c7a\u65bc\u4f60\u7684\u528d\u8853\u7b49\u7d1a\u3002 +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\u99b4\u7378\n&e\u99b4\u7378\u6280\u80fd\u8b93\u73a9\u5bb6\u80fd\u5728\u7528\u72fc\u6230\u9b25\u6642\n&e\u6642\u6709\u52a0\u6210\u6548\u679c\u3002\n\n&3\u7d93\u9a57\u4f86\u6e90 \uff1a \n&e\u8981\u7372\u5f97\u7d93\u9a57\uff0c\u9808\u99b4\u670d\u72fc\u6216\u5c71\u8c93\uff0c\n&e\u6216\u8207\u4f60\u7684\u72fc\u4e00\u540c\u6230\u9b25\u3002 -Guides.Taming.Section.1=&3\u4ec0\u9ebc\u662f\u91ce\u6027\u547c\u558a \uff1f \n&e\u91ce\u6027\u547c\u558a\u662f\u4e3b\u52d5\u6280\u80fd\u8b93\u4f60\n&e\u53ef\u4ee5\u53ec\u559a\u4e00\u96bb\u72fc\u6216\u5c71\u8c93\uff0c\n&e\u53ea\u8981\u624b\u6301\u9aa8\u982d\u6216\u751f\u9b5a\u5c0d\u5176\u9ede\u64ca\u5de6\u9375\u3002 -Guides.Taming.Section.2=&3\u4ec0\u9ebc\u662f\u91ce\u7378\u8cc7\u8a0a \uff1f \n&e\u91ce\u7378\u8cc7\u8a0a\u80fd\u8b93\u4f60\u67e5\u770b\u5bf5\u7269\u7684\u72c0\u614b\uff0c\n&e\u5c0d\u5bf5\u7269\u9ede\u64ca\u5de6\u9375\u5c31\u80fd\u4f7f\u7528\u9019\u9805\u80fd\u529b\u3002 -Guides.Taming.Section.3=&3\u4ec0\u9ebc\u662f\u55dc\u8840 \uff1f \n&e\u8840\u8165\u653b\u64ca\u662f\u4e3b\u52d5\u6280\u80fd\uff0c\u80fd\u9020\u6210\n&e\u72fc\u7684\u653b\u64ca\u76ee\u6a19\u6709\u6a5f\u7387\u9677\u5165\u6d41\u8840\u72c0\u614b\u3002 -Guides.Taming.Section.4=&3\u4ec0\u9ebc\u662f\u5229\u722a \uff1f \n&e\u5229\u722a\u4f7f\u72fc\u7684\u653b\u64ca\u529b\u96a8\u8457\u99b4\u7378\u7b49\u7d1a\n&e\u589e\u52a0\u800c\u589e\u52a0\u3002 -Guides.Taming.Section.5=&3\u4ec0\u9ebc\u662f\u74b0\u5883\u611f\u77e5 \uff1f \n&e\u9019\u500b\u88ab\u52d5\u6280\u80fd\u80fd\u8b93\u72fc\u5728\u9047\u5230\u5371\u96aa\u6642\n&e\u8fc5\u901f\u56de\u5230\u4f60\u8eab\u908a \uff08\u5982\u4ed9\u4eba\u638c\u6216\u5ca9\u6f3f\uff09\uff0c\n&e\u4e5f\u53ef\u4ee5\u6e1b\u5c11\u6454\u843d\u50b7\u5bb3\u3002 -Guides.Taming.Section.6=&3\u4ec0\u9ebc\u662f\u6bdb\u76ae\u5f37\u5316 \uff1f \n&e\u9019\u662f\u88ab\u52d5\u6280\u80fd\u80fd\u8b93\u72fc\n&e\u53d7\u5230\u653b\u64ca\u6216\u71c3\u71d2\u6642\u6e1b\u5c11\u9664\u50b7\u5bb3\u3002 -Guides.Taming.Section.7=&3\u4ec0\u9ebc\u662f\u885d\u64ca\u6297\u6027 \uff1f \n&e\u9019\u662f\u88ab\u52d5\u6280\u80fd\uff0c\u8b93\u72fc\u7fa4\n&e\u6e1b\u5c11\u7206\u70b8\u50b7\u5bb3\u3002 -Guides.Taming.Section.8=&3\u4ec0\u9ebc\u662f\u901f\u98df\u670d\u52d9 \uff1f \n&e\u9019\u662f\u88ab\u52d5\u6280\u80fd\uff0c\u8b93\u72fc\u7fa4\u5728\u653b\u64ca\u6642\n&e\u6709\u6a5f\u7387\u56de\u5fa9\u8840\u91cf\u3002 +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\u683c\u9b25 \uff1a \n&e\u683c\u9b25\u4f7f\u73a9\u5bb6\u5728\u4f7f\u7528\u62f3\u982d\u4f5c\u6230\u6642\u6709\n&e\u5404\u7a2e\u52a0\u6210\u6548\u679c\u3002\n\n&3\u7d93\u9a57\u4f86\u6e90 \uff1a \n&e\u5728\u7528\u624b\u653b\u64ca\u602a\u7269\u6216\u73a9\u5bb6\u6642\u53ef\u4ee5\u7372\u5f97\u7d93\u9a57\u3002 -Guides.Unarmed.Section.1=&3\u4ec0\u9ebc\u662f\u72c2\u66b4 \uff1f \n&e\u72c2\u66b4\u662f\u4e3b\u52d5\u6280\u80fd\uff0c\u7a7a\u624b\u6642\u9ede\u64ca\u53f3\u9375\u767c\u52d5\u3002\n&e\u72c2\u66b4\u53ef\u4ee5\u52a0\u6210 50% \u5c0d\u65b9\u584a\u7684\u50b7\u5bb3\uff0c\n&e\u4f7f\u4f60\u53ef\u4ee5\u8f15\u9b06\u7834\u58de\u8106\u5f31\u7269\u9ad4\uff0c\n&e\u5982\u6ce5\u571f\u8207\u6c99\u5b50\u3002 -Guides.Unarmed.Section.2=&3\u4ec0\u9ebc\u662f\u9435\u81c2\u5f0f \uff1f \n&e\u9435\u81c2\u80fd\u589e\u52a0\u5f92\u624b\u653b\u64ca\u602a\u7269\u6216\n&e\u73a9\u5bb6\u7684\u50b7\u5bb3\u3002 -Guides.Unarmed.Section.3=&3\u4ec0\u9ebc\u662f\u7bad\u77e2\u504f\u5411 \uff1f \n&e\u7bad\u77e2\u504f\u5411\u662f\u88ab\u52d5\u6280\u80fd\uff0c\u8b93\u4f60\u6709\u6a5f\u7387\n&e\u80fd\u6539\u8b8a\u9ab7\u9acf\u7372\u73a9\u5bb6\u5c04\u5411\u4f60\u7684\u7bad\u7684\u65b9\u5411\u3002\n&e\u7bad\u6703\u843d\u81f3\u5730\u9762\u3002 -Guides.Unarmed.Section.4=&3\u4ec0\u9ebc\u662f\u9435\u8155 \uff1f \n&e\u9435\u8155\u6709\u6a5f\u7387\u9632\u6b62\u5c0d\u624b\u7684\u7e73\u68b0\u3002\n&e\u89f8\u767c\u7684\u6a5f\u7387\u537b\u6c7a\u65bc\u4f60\u683c\u9b25\u7684\u7b49\u7d1a\u3002 -Guides.Unarmed.Section.5=&3\u4ec0\u9ebc\u662f\u7e73\u68b0 \uff1f \n&e\u9019\u500b\u88ab\u52d5\u6280\u80fd\u8b93\u73a9\u5bb6\u89e3\u9664\u5176\u4ed6\u73a9\u5bb6\u7684\u6b66\u88dd\uff0c\n&e\u4f7f\u76ee\u6a19\u6240\u88dd\u5099\u7684\u7269\u54c1\u6389\u843d\u5230\u5730\u4e0a\u3002 +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\u95dc\u65bc\u4f10\u6728 \uff1a \n&e\u4f10\u6728\u662f\u95dc\u65bc\u780d\u6a39\u7684\u3002\n\n&3\u7d93\u9a57\u4f86\u6e90 \uff1a \n&e\u7834\u58de\u6728\u982d\u985e\u7684\u65b9\u584a\u5c31\u6703\u7372\u5f97\u4f10\u6728\u7d93\u9a57\u3002 -Guides.Woodcutting.Section.1=&3\u4f10\u6728\u5de5\u5982\u4f55\u904b\u4f5c \uff1f \n&e\u4f10\u6728\u5de5\u662f\u4e3b\u52d5\u6280\u80fd\n&e\u5728\u624b\u6301\u65a7\u982d\u7684\u540c\u6642\u53f3\u9375\u4e26\u7834\u58de\u6728\u982d\u4ee5\u958b\u555f\u4f10\u6728\u5de5\n&e\u9019\u5c07\u77ac\u9593\u7834\u58de\u6574\u68f5\u6a39\u3002 -Guides.Woodcutting.Section.2=&3\u79cb\u98a8\u6383\u843d\u8449\u5982\u4f55\u904b\u4f5c \uff1f \n&e\u79cb\u98a8\u6383\u843d\u8449\u662f\u88ab\u52d5\u6280\u80fd\n&e\u7576\u65a7\u982d\u64ca\u4e2d\u6a39\u8449\u65b9\u584a\u6642\u6703\u5c0e\u81f4\u77ac\u9593\u6d88\u5931\n&e\u9810\u8a2d\u60c5\u6cc1\u4e0b\uff0c100 \u7d1a\u89e3\u9396\u3002 -Guides.Woodcutting.Section.3=&3\u6a39\u6728\u8c50\u6536\u5982\u4f55\u904b\u4f5c \uff1f \n&e\u9019\u500b\u88ab\u52d5\u6280\u80fd\u4f7f\u4f60\u5728\u780d\u6a39\u6642\n&e\u6709\u6a5f\u7387\u6389\u843d\u96d9\u500d\u6728\u982d\u3002 +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\u4f60\u6c92\u6709\u67e5\u8a62\u96e2\u7dda\u73a9\u5bb6\u8cc7\u8a0a\u7684\u6b0a\u9650 \uff01 -Inspect.OfflineStats=\u96e2\u7dda\u73a9\u5bb6\u7684 mcMMO \u7d71\u8a08\u8cc7\u8a0a &e{0} -Inspect.Stats=&e{0} \u7684 mcMMO \u7d71\u8a08\u8cc7\u8a0a -Inspect.TooFar=\u4f60\u7121\u6cd5\u67e5\u8a62\u90a3\u500b\u73a9\u5bb6\u56e0\u70ba\u4f60\u5011\u8ddd\u96e2\u592a\u9060\u4e86 \uff01 +Inspect.Offline= &c你沒有查詢離線玩家資訊的權限 ! +Inspect.OfflineStats=離線玩家的 mcMMO 統計資訊 &e{0} +Inspect.Stats=&e{0} 的 mcMMO 統計資訊 +Inspect.TooFar=你無法查詢那個玩家因為你們距離太遠了 ! #ITEMS -Item.ChimaeraWing.Fail=**\u5947\u7f8e\u62c9\u4e4b\u7ffc\u5931\u6557\u4e86 \uff01** -Item.ChimaeraWing.Pass=**\u5947\u7f8e\u62c9\u4e4b\u7ffc** -Item.ChimaeraWing.Name=\u5947\u7f8e\u62c9\u4e4b\u7ffc -Item.ChimaeraWing.Lore=&7\u50b3\u9001\u81f3\u4f60\u7684\u5e8a\u3002 -Item.ChimaeraWing.NotEnough=\u4f60\u9700\u8981 &e{0}&c \u66f4\u591a &6{1}&c \uff01 -Item.NotEnough=\u4f60\u9700\u8981 &e{0}&c \u66f4\u591a &6{1}&c \uff01 -Item.Generic.Wait=\u4f60\u9700\u8981\u7b49\u5f85\u4e00\u6bb5\u6642\u9593\u624d\u80fd\u518d\u6b21\u4f7f\u7528 \uff01&e\uff08{0}s\uff09 -Item.Injured.Wait=\u4f60\u6700\u8fd1\u53d7\u50b7\u4e86\u6240\u4ee5\u4f60\u5fc5\u9808\u7b49\u4e00\u6bb5\u6642\u9593\u624d\u80fd\u4f7f\u7528\u9019\u500b\u3002&e\uff08{0}s\uff09 -Item.FluxPickaxe.Name=\u707c\u71b1\u4e4b\u93ac -Item.FluxPickaxe.Lore.1=&7\u6709\u6a5f\u7387\u77ac\u9593\u51b6\u7149\u7926\u7269\u3002 -Item.FluxPickaxe.Lore.2=&7\u9700\u8981\u51b6\u7149\u7b49\u7d1a {0}+ +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\u50b3\u9001\u5c07\u5728 &6\uff08{0}\uff09 &7\u79d2\u5f8c\u9032\u884c\uff0c\u8acb\u4fdd\u6301\u7ad9\u7acb\u4e0d\u52d5\u2026\u2026 -Teleport.Cancelled=&4\u50b3\u9001\u5df2\u53d6\u6d88 \uff01 +Teleport.Commencing=&7傳送將在 &6({0}) &7秒後進行,請保持站立不動…… +Teleport.Cancelled=&4傳送已取消 ! #SKILLS -Skills.Child=&6\uff08\u5206\u652f\u6280\u80fd\uff09 -Skills.Disarmed=&4\u4f60\u88ab\u7e73\u68b0\u4e86 \uff01 +Skills.Child=&6(分支技能) +Skills.Disarmed=&4你被繳械了 ! Skills.Header=-----[] &a{0}&c []----- -Skills.NeedMore=&4\u4f60\u9700\u8981\u66f4\u591a &7{0} -Skills.NeedMore.Extra=&4\u4f60\u9700\u8981\u66f4\u591a &7{0}{1} -Skills.Parents=\u4e3b\u6280\u80fd -Skills.Stats={0}&a{1}&3 \u9ede\u7d93\u9a57\u503c \uff08&7{2}&3/&7{3}&3\uff09 +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=\u6700\u5927 -Skills.TooTired=\u4f60\u592a\u7d2f\u4e86\u66ab\u6642\u7121\u6cd5\u4f7f\u7528\u8a72\u6280\u80fd\u3002&\uff08{0}s\uff09 -Skills.TooTired.Named=&7\uff08&6{0}&e {1}s&7\uff09 -Skills.TooTired.Extra=&6{0} &e\u8d85\u80fd\u529b\u51b7\u537b - {1} -Skills.Cancelled=&6{0} &c\u5df2\u53d6\u6d88 \uff01 -Skills.ConfirmOrCancel=&a\u518d\u6b21\u9ede\u64ca\u53f3\u9375\u4ee5\u78ba\u5b9a &6{0}&a\uff0c\u9ede\u64ca\u5de6\u9375\u53d6\u6d88\u3002 -Skills.AbilityGateRequirementFail=&7\u4f60\u9700\u8981 &e{0}&7 \u7d1a\u4ee5\u4e0a\u7684 &3{1}&7 \u4f86\u4f7f\u7528\u9019\u500b\u80fd\u529b\u3002 +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-=\u683c\u9b25\u6280\u80fd=- -Stats.Header.Gathering=&6-=\u63a1\u96c6\u6280\u80fd=- -Stats.Header.Misc=&6-=\u96dc\u9805\u6280\u80fd=- -Stats.Own.Stats=&a[mcMMO] \u7d71\u8a08\u8cc7\u8a0a +Stats.Header.Combat=&6-=格鬥技能=- +Stats.Header.Gathering=&6-=採集技能=- +Stats.Header.Misc=&6-=雜項技能=- +Stats.Own.Stats=&a[mcMMO] 統計資訊 #PERKS -Perks.XP.Name=\u7d93\u9a57 -Perks.XP.Desc=\u5f9e\u6280\u80fd\u5b78\u7fd2\u4e2d\u7372\u5f97\u7d93\u9a57\u63d0\u5347 -Perks.Lucky.Name=\u5e78\u904b -Perks.Lucky.Desc=\u7d66\u4e88 {0} \u6280\u80fd\u548c\u80fd\u529b 33.3% \u7684\u66f4\u9ad8\u6a5f\u7387\u89f8\u767c -Perks.Lucky.Desc.Login=\u7d66\u4e88\u6280\u80fd\u548c\u80fd\u529b 33.3% \u5f97\u66f4\u9ad8\u6a5f\u7387\u89f8\u767c -Perks.Lucky.Bonus=&6\uff08{0} \u7684\u597d\u904b\u52a0\u6210\uff09 -Perks.Cooldowns.Name=\u5feb\u901f\u56de\u5fa9 -Perks.Cooldowns.Desc=\u6e1b\u5c11\u51b7\u537b\u6642\u9593 {0}\u3002 -Perks.ActivationTime.Name=\u8010\u529b -Perks.ActivationTime.Desc=\u63d0\u9ad8\u80fd\u529b\u958b\u555f\u6642\u9593 {0} \u79d2\u3002 -Perks.ActivationTime.Bonus=&6\uff08{0} \u79d2\u984d\u5916\u6301\u7e8c\u6642\u9593\uff09 +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] \u786c\u6838\u6a21\u5f0f {0} \u95dc\u9589\u3002{1} -Hardcore.Mode.Enabled=&6[mcMMO] \u786c\u6838\u6a21\u5f0f {0} \u958b\u555f\u3002{1} -Hardcore.DeathStatLoss.Name=\u6280\u80fd\u6b7b\u4ea1\u61f2\u7f70 -Hardcore.DeathStatLoss.PlayerDeath=&6[mcMMO] &4\u6b7b\u4ea1\uff0c\u4f60\u5931\u53bb\u4e86 &9{0}&4\u3002 -Hardcore.DeathStatLoss.PercentageChanged=&6[mcMMO] \u72c0\u614b\u907a\u5931\u7387\u8b8a\u66f4\u70ba {0}\u3002 -Hardcore.Vampirism.Name=\u5438\u8840\u6a21\u5f0f -Hardcore.Vampirism.Killer.Failure=&6[mcMMO] &e{0}&7\u592a\u4e0d\u719f\u7df4\u6388\u4e88\u4f60\u7372\u5f97\u4efb\u4f55\u7684\u77e5\u8b58\u3002 -Hardcore.Vampirism.Killer.Success=&6[mcMMO] &3\u4f60\u5f9e&e{1}&3\u90a3\u5077\u53d6\u4e86 &9{0}&3 \u500b\u7b49\u7d1a\u3002 -Hardcore.Vampirism.Victim.Failure=&6[mcMMO] &e{0}&7\u7121\u6cd5\u5f9e\u4f60\u9019\u5077\u53d6\u4efb\u4f55\u7684\u77e5\u8b58 \uff01 -Hardcore.Vampirism.Victim.Success=&6[mcMMO] &e{0}&4\u5f9e\u4f60\u9019\u5077\u53d6\u4e86 &9{1}&4 \u500b\u7b49\u7d1a \uff01 -Hardcore.Vampirism.PercentageChanged=&6[mcMMO] \u72c0\u614b\u5438\u8840\u7387\u8b8a\u66f4\u70ba {0}\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] &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\u6350\u8d08\u8cc7\u8a0a \uff1a -MOTD.Hardcore.Enabled=&6[mcMMO] &3\u786c\u6838\u6a21\u5f0f\u5df2\u958b\u555f \uff1a &4{0} -MOTD.Hardcore.DeathStatLoss.Stats=&6[mcMMO] &3\u6280\u80fd\u6b7b\u4ea1\u61f2\u7f70 \uff1a &4{0}% -MOTD.Hardcore.Vampirism.Stats=&6[mcMMO] &3\u5438\u8840\u7d71\u8a08 \uff1a &4{0}% -MOTD.PerksPrefix=&6[mcMMO \u80fd\u529b] -MOTD.Version=&6[mcMMO] \u6b63\u5728\u904b\u884c\u7248\u672c &3{0} -MOTD.Website=&6[mcMMO] &a{0}&e -mcMMO \u7db2\u7ad9 +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=\u51b6\u7149\u7cbe\u901a -Smelting.SubSkill.UnderstandingTheArt.Description=\u4e5f\u8a31\u4f60\u82b1\u8cbb\u4e86\u592a\u591a\u6642\u9593\u5728\u6d1e\u7a74\u4e2d\u51b6\u7149\uff0c\n\u63d0\u5347\u51b6\u7149\u7684\u5404\u7a2e\u5c6c\u6027\u3002 -Smelting.SubSkill.UnderstandingTheArt.Stat=\u7d93\u9a57\u503c\u500d\u6578 \uff1a &e{0} \u500d -Smelting.Ability.Locked.0={0}+ \u7d1a\u5f8c\u89e3\u9396 \uff08\u66f4\u591a\u51b6\u7149\u7d93\u9a57\u503c\uff09 -Smelting.Ability.Locked.1={0}+ \u7d1a\u5f8c\u89e3\u9396 \uff08\u795d\u878d\u4e4b\u93ac\uff09 -Smelting.SubSkill.FuelEfficiency.Name=\u71c3\u6599\u6548\u7387 -Smelting.SubSkill.FuelEfficiency.Description=\u51b6\u7149\u6642\u63d0\u9ad8\u7194\u7210\u5167\u71c3\u6599\u7684\u71c3\u71d2\u6642\u9593 -Smelting.SubSkill.FuelEfficiency.Stat=\u71c3\u6599\u6548\u7387\u500d\u6578 \uff1a &e{0} \u500d -Smelting.SubSkill.SecondSmelt.Name=\u4e8c\u6b21\u51b6\u7149 -Smelting.SubSkill.SecondSmelt.Description=\u900f\u904e\u51b6\u7149\u7372\u5f97\u96d9\u500d\u8cc7\u6e90 -Smelting.SubSkill.SecondSmelt.Stat=\u4e8c\u6b21\u51b6\u7149\u89f8\u767c\u7684\u6a5f\u7387 -Smelting.Effect.4=\u66f4\u591a\u51b6\u7149\u7d93\u9a57\u503c -Smelting.Effect.5=\u63d0\u9ad8\u51b6\u7149\u7372\u5f97\u7684\u7d93\u9a57\u503c -Smelting.SubSkill.FluxMining.Name=\u795d\u878d\u4e4b\u93ac -Smelting.SubSkill.FluxMining.Description=\u6316\u7926\u6642\u4e00\u5b9a\u6a5f\u7387\u4f7f\u7926\u7269\u7acb\u5373\u88ab\u51b6\u7149 -Smelting.SubSkill.FluxMining.Stat=\u795d\u878d\u4e4b\u93ac\u767c\u52d5\u6a5f\u7387 -Smelting.Listener=\u51b6\u7149 \uff08Smelting\uff09 \uff1a -Smelting.SkillName=\u51b6\u7149 +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=\u7d66\u73a9\u5bb6\u589e\u52a0 mcMMO \u7b49\u7d1a -Commands.Description.adminchat=\u5207\u63db mcMMO \u7ba1\u7406\u54e1\u804a\u5929\u6216\u50b3\u9001\u7ba1\u7406\u54e1\u804a\u5929\u8cc7\u8a0a -Commands.Description.addxp=\u7d66\u73a9\u5bb6\u589e\u52a0 mcMMO \u7d93\u9a57 -Commands.Description.hardcore=\u4fee\u6539 mcMMO \u786c\u6838\u6a21\u5f0f\u767e\u5206\u6bd4\u6216\u5207\u63db\u786c\u6838\u6a21\u5f0f\u958b/\u95dc -Commands.Description.inspect=\u67e5\u770b\u73a9\u5bb6\u8a73\u7d30\u7684 mcMMO \u8cc7\u8a0a -Commands.Description.mcability=\u5207\u63db mcMMO \u6280\u80fd\u9ede\u64ca\u53f3\u9375\u958b\u555f \u958b/\u95dc -Commands.Description.mccooldown=\u67e5\u770b\u6240\u6709 mcMMO \u6280\u80fd\u51b7\u537b\u6642\u9593 -Commands.Description.mcchatspy=\u5207\u63db\u968a\u4f0d\u804a\u5929\u76e3\u8996\u958b/\u95dc -Commands.Description.mcgod=\u5207\u63db mcMMO \u4e0a\u5e1d\u6a21\u5f0f\u958b/\u95dc -Commands.Description.mchud=\u8b8a\u66f4\u4f60\u7684 mcMMO HUD \u6a23\u5f0f -Commands.Description.mcmmo=\u986f\u793a mcMMO \u7684\u7c21\u55ae\u63cf\u8ff0 -Commands.Description.mcnotify=\u5207\u63db mcMMO \u6280\u80fd\u63d0\u9192\u958b\u95dc -Commands.Description.mcpurge=\u6e05\u9664\u6c92\u6709 mcMMO \u7b49\u7d1a\u7684\u73a9\u5bb6\u548c\u8d85\u904e {0} \u500b\u6708\u6c92\u6709\u767b\u5165\u7684\u73a9\u5bb6\u7684 mcMMO \u8cc7\u6599 -Commands.Description.mcrank=\u986f\u793a\u73a9\u5bb6\u7684 mcMMO \u6392\u540d -Commands.Description.mcrefresh=\u91cd\u65b0\u6574\u7406\u6240\u6709\u7684 mcMMO \u51b7\u537b\u6642\u9593 -Commands.Description.mcremove=\u5f9e mcMMO \u8cc7\u6599\u5eab\u4e2d\u79fb\u9664\u73a9\u5bb6 -Commands.Description.mcscoreboard=\u7ba1\u7406\u4f60\u7684 mcMMO \u8a08\u5206\u677f -Commands.Description.mcstats=\u986f\u793a\u4f60\u7684 mcMMO \u7b49\u7d1a\u548c\u7d93\u9a57 -Commands.Description.mctop=\u986f\u793a mcMMO \u6392\u540d\u699c -Commands.Description.mmoedit=\u7de8\u8f2f\u7528\u6236\u7684 mcMMO \u7684\u7b49\u7d1a -Commands.Description.mmodebug=\u5207\u63db\u9664\u932f\u6a21\u5f0f\uff0c\u9ede\u64ca\u65b9\u584a\u8f38\u51fa\u5be6\u7528\u7684\u8cc7\u8a0a -Commands.Description.mmoupdate=\u5f9e\u820a\u7684 mcMMO \u8cc7\u6599\u5eab\u9077\u79fb\u5230\u76ee\u524d\u8cc7\u6599\u5eab\u5167 -Commands.Description.mcconvert=\u8f49\u63db\u8cc7\u6599\u5eab\u7684\u985e\u578b\u6216\u7d93\u9a57\u503c\u516c\u5f0f\u7684\u985e\u578b -Commands.Description.mmoshowdb=\u986f\u793a\u76ee\u524d\u8cc7\u6599\u5eab\u985e\u578b\u540d\u7a31 \uff08\u820a\u7248\u672c\u4f7f\u7528 /mmoupdate\uff09 -Commands.Description.party=\u63a7\u5236\u5404\u7a2e mcMMO \u968a\u4f0d\u8a2d\u5b9a -Commands.Description.partychat=\u5207\u63db mcMMO \u968a\u4f0d\u804a\u5929\u6216\u50b3\u9001\u968a\u4f0d\u804a\u5929\u8a0a\u606f -Commands.Description.ptp=\u50b3\u9001\u81f3 mcMMO \u968a\u4f0d\u6210\u54e1 -Commands.Description.Skill=\u986f\u793a {0} \u8a73\u7d30\u7684 mcMMO \u6280\u80fd\u8cc7\u8a0a -Commands.Description.skillreset=\u91cd\u8a2d mcMMO \u7b49\u7d1a -Commands.Description.vampirism=\u66f4\u6539 mcMMO \u69a8\u53d6\u767e\u5206\u6bd4 \u6216\u5207\u63db\u5438\u8840\u6a21\u5f0f\u958b/\u95dc -Commands.Description.xplock=\u9396\u5b9a\u6307\u5b9a mcMMO \u6280\u80fd\u7684\u7d93\u9a57\u689d -Commands.Description.xprate=\u66f4\u6539 mcMMO \u7d93\u9a57\u500d\u7387\u6216\u958b\u555f mcMMO \u7d93\u9a57\u7ffb\u500d\u4e8b\u4ef6 +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=\u4f60\u6b63\u5728\u4f7f\u7528\u9019\u820a\u7248\u672c\u7684 mcMMO \uff01 -UpdateChecker.NewAvailable=Spigot \u4e0a\u6709\u65b0\u7248\u672c\u3002 +UpdateChecker.Outdated=你正在使用這舊版本的 mcMMO ! +UpdateChecker.NewAvailable=Spigot 上有新版本。 #SCOREBOARD HEADERS -Scoreboard.Header.PlayerStats=&emcMMO \u7d71\u8a08 -Scoreboard.Header.PlayerCooldowns=&emcMMO \u51b7\u537b -Scoreboard.Header.PlayerRank=&emcMMO \u6392\u540d -Scoreboard.Header.PlayerInspect=&emcMMO \u7d71\u8a08 \uff1a {0} -Scoreboard.Header.PowerLevel=&c\u6230\u9b25\u529b -Scoreboard.Misc.PowerLevel=&6\u6230\u9b25\u529b -Scoreboard.Misc.Level=&3\u7b49\u7d1a -Scoreboard.Misc.CurrentXP=&a\u76ee\u524d\u7d93\u9a57 -Scoreboard.Misc.RemainingXP=&e\u5347\u7d1a\u6240\u9700\u7d93\u9a57 -Scoreboard.Misc.Cooldown=&d\u51b7\u537b -Scoreboard.Misc.Overall=&6\u7e3d\u9ad4 -Scoreboard.Misc.Ability=\u80fd\u529b +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\u4f60\u7684 mcMMO \u73a9\u5bb6\u8cc7\u6599\u672a\u8f09\u5165\u3002 -Profile.Loading.Success=&a\u4f60\u7684 mcMMO \u8cc7\u6599\u5df2\u8f09\u5165\u3002 -Profile.Loading.FailurePlayer=&cmcMMO \u7121\u6cd5\u8f09\u5165\u4f60\u7684\u8cc7\u6599\uff0c\u8acb\u806f\u7e6b&b\u4f3a\u670d\u5668\u7ba1\u7406\u54e1\u56de\u994b\u4f60\u7684\u554f\u984c\u3002\n&e\u4f60\u53ef\u4ee5\u7e7c\u7e8c\u5728\u4f3a\u670d\u5668\u904a\u73a9\uff0c\u4f46\u662f\u4f60&l\u6c92\u6709 mcMMO \u7b49\u7d1a&e\u4e26\u4e14\u4f60\u7372\u5f97\u7684\u4efb\u4f55\u7d93\u9a57\u90fd&l\u4e0d\u6703\u88ab\u5132\u5b58&e\u3002 -Profile.Loading.FailureNotice=&4[A]&c mcMMO \u7121\u6cd5\u8f09\u5165\u73a9\u5bb6 &e{0}&c \u7684\u8cc7\u6599\u3002&d\u8acb\u6aa2\u67e5\u4f60\u7684\u8cc7\u6599\u5eab\uff0c\u5230\u76ee\u524d\u70ba\u6b62\u7684\u5617\u8a66 {1}\u3002 +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} \u73fe\u5728 &a{1}&6 \u7d1a \uff01 -Holiday.Anniversary=&9mcMMO {0} \u9031\u5e74\u5feb\u6a02 \uff01 \n&9\u70ba\u4e86\u7d00\u5ff5 nossr50 \u548c\u6240\u6709\u958b\u767c\u8005\u7684\u5de5\u4f5c\uff0c\u9019\u88e1\u6709\u4e00\u5834\u7159\u706b\u8868\u6f14 \uff01 +Holiday.AprilFools.Levelup=&6{0} 現在 &a{1}&6 級 ! +Holiday.Anniversary=&9mcMMO {0} 週年快樂 ! \n&9為了紀念 nossr50 和所有開發者的工作,這裡有一場煙火表演 ! #Reminder Messages -Reminder.Squelched=&7\u63d0\u9192 \uff1a \u4f60\u73fe\u5728\u4e0d\u518d\u63a5\u6536\u4f86\u81ea mcMMO \u7684\u901a\u77e5\u8a0a\u606f\uff0c\u5982\u60f3\u958b\u555f\u8acb\u518d\u6b21\u4f7f\u7528 /mcnotify \u6307\u4ee4\uff0c\u6bcf\u5c0f\u6642\u63d0\u9192\u4e00\u6b21\u3002 +Reminder.Squelched=&7提醒 : 你現在不再接收來自 mcMMO 的通知訊息,如想開啟請再次使用 /mcnotify 指令,每小時提醒一次。 #Locale -Locale.Reloaded=&a\u8a9e\u8a00\u914d\u7f6e\u5df2\u7d93\u91cd\u65b0\u8f09\u5165\uff0c\u4e2d\u6587\u5316\u91cd\u7de8 \uff1a Flandre_tw\uff0c\u539f\u4f5c\u70ba\u7c21\u9ad4\u4e2d\u6587 \uff08\u6709\u554f\u984c\u8acb\u806f\u7d61 Discord \u862d\u862d\u9732#4885\uff09 +Locale.Reloaded=&a語言配置已經重新載入,中文化重編 : Flandre_tw,原作為簡體中文 (有問題請聯絡 Discord 蘭蘭露#4885) #Player Leveling Stuff -LevelCap.PowerLevel=&6\uff08&amcMMO&6\uff09 &e\u4f60\u5df2\u7d93\u5230\u9054\u4e86\u6230\u9b25\u529b\u7684\u7b49\u7d1a\u5c01\u9802 &c{0}&e \u7d1a\uff0c\u4f60\u7684\u8a72\u6280\u80fd\u5c07\u7121\u6cd5\u518d\u5347\u7d1a\u3002 -LevelCap.Skill=&6\uff08&amcMMO&6\uff09 &e\u4f60\u5df2\u7d93\u5230\u9054\u4e86&6{1}&e\u6280\u80fd\u7684\u7b49\u7d1a\u5c01\u9802 &c{0}&e \u7d1a\uff0c\u4f60\u7684\u8a72\u6280\u80fd\u5c07\u7121\u6cd5\u518d\u5347\u7d1a\u3002 -Commands.XPBar.Usage=\u6b63\u78ba\u7684\u7528\u6cd5\u662f /mmoxpbar -Commands.Description.mmoxpbar=mcMMO \u7d93\u9a57\u689d\u7684\u73a9\u5bb6\u8a2d\u5b9a -Commands.Description.mmocompat=\u6709\u95dc mcMMO \u4ee5\u53ca\u5b83\u662f\u5426\u8655\u65bc\u76f8\u5bb9\u6a21\u5f0f\u6216\u529f\u80fd\u9f4a\u5168\u7684\u8cc7\u8a0a\u3002 -Compatibility.Layer.Unsupported=&6\u6b64\u7248\u672c\u7684 Minecraft \u4e0d\u652f\u6301 &a{0}&6 \u7684\u76f8\u5bb9\u6027\u3002 -Compatibility.Layer.PartialSupport=&6\u76f8\u5bb9\u6027 &a{0}&6 \u9019\u500b\u7248\u672c\u7684 Minecraft \u4e26\u4e0d\u5b8c\u5168\u652f\u63f4\uff0c\u4f46\u662f mcMMO \u6b63\u5728\u904b\u884c\u4e00\u500b\u8f14\u52a9\u7cfb\u7d71\u4f86\u6a21\u64ec\u4e00\u4e9b\u7f3a\u5931\u7684\u529f\u80fd\u3002 -Commands.XPBar.DisableAll=&6\u6240\u6709 mcMMO \u7d93\u9a57\u6b04\u73fe\u5728\u90fd\u88ab\u95dc\u9589\uff0c\u4f7f\u7528 /mmoxpbar reset \u56de\u5fa9\u9810\u8a2d\u8a2d\u5b9a\u3002 +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\uff08A\uff09 &r{0} &b\u2192 &r{1} -Chat.Style.Party=&a\uff08P\uff09 &r{0} &a\u2192 &r{1} -Chat.Style.Party.Leader=&a\uff08P\uff09 &r{0} &6\u2192 &r{1} -Chat.Identity.Console=&6* \u63a7\u5236\u53f0 * -Chat.Channel.On=&6\uff08&amcMMO -\u804a\u5929&6\uff09 &e\u4f60\u7684\u804a\u5929\u8a0a\u606f\u73fe\u5728\u5c07\u81ea\u52d5\u50b3\u9001\u5230 &a{0}&e \u804a\u5929\u983b\u9053\u3002 -Chat.Channel.Off=&6\uff08&amcMMO -\u804a\u5929&6\uff09 &7\u4f60\u7684\u804a\u5929\u8a0a\u606f\u5c07\u4e0d\u518d\u81ea\u52d5\u50b3\u9001\u5230\u7279\u5b9a\u7684\u804a\u5929\u983b\u9053\u3002 -Chat.Spy.Party=&6[&eSPY&6-&a{2}&6] &r{0} &b\u2192 &r{1} -Broadcasts.LevelUpMilestone=&6\uff08&amcMMO&6\uff09 {0}&7 \u5728&3{2}&7 \u5df2\u7d93\u9054\u5230\u4e86 &a{1}&7 \u7d1a \uff01 -Broadcasts.PowerLevelUpMilestone=&6\uff08&amcMMO&6\uff09 {0}&7 \u5df2\u7d93\u9054\u5230 &a{1}&7 \u7684\u6700\u9ad8\u7b49\u7d1a \uff01 -Scoreboard.Recovery=\u6b63\u5728\u5617\u8a66\u56de\u5fa9 mcMMO \u8a08\u5206\u677f\u2026\u2026 +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 計分板…… From 341dc45202bc8731dbfe8fb694316573ff327f39 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 14 Dec 2021 23:27:51 -0800 Subject: [PATCH 638/662] Takeout this warning --- src/main/java/com/gmail/nossr50/locale/LocaleLoader.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/gmail/nossr50/locale/LocaleLoader.java b/src/main/java/com/gmail/nossr50/locale/LocaleLoader.java index 7f0630165..f43662a0d 100644 --- a/src/main/java/com/gmail/nossr50/locale/LocaleLoader.java +++ b/src/main/java/com/gmail/nossr50/locale/LocaleLoader.java @@ -246,7 +246,6 @@ public final class LocaleLoader { "# 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" + From 61388f46f1be282cc438911210d1c691a4a2cc89 Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Mon, 27 Dec 2021 18:27:13 +0100 Subject: [PATCH 639/662] Fixed #4694 (#4695) --- .../nossr50/skills/salvage/SalvageManager.java | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) 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 4ffb1baae..4e4c04ff3 100644 --- a/src/main/java/com/gmail/nossr50/skills/salvage/SalvageManager.java +++ b/src/main/java/com/gmail/nossr50/skills/salvage/SalvageManager.java @@ -129,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 @@ -144,6 +136,15 @@ 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(); From ddc9a69f4b19081dbd5fba84f96803341cb16f73 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 27 Dec 2021 10:46:56 -0800 Subject: [PATCH 640/662] Fix ScoreboardManager NPE and added locale messages relating to scoreboards --- Changelog.txt | 7 +++++-- .../gmail/nossr50/commands/McscoreboardCommand.java | 10 ++++++++++ .../nossr50/util/scoreboards/ScoreboardManager.java | 4 ++++ src/main/resources/locale/locale_en_US.properties | 4 +++- 4 files changed, 22 insertions(+), 3 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 6146ec210..4d90c234d 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,6 +1,9 @@ Version 2.1.207 - Added unicode support to locale files (no more UTF-16 codes) - Temporarily rolling required Java version back to 16 until 1.18 is stable and everyone can migrate to it safely + 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 diff --git a/src/main/java/com/gmail/nossr50/commands/McscoreboardCommand.java b/src/main/java/com/gmail/nossr50/commands/McscoreboardCommand.java index 4748a5708..ff5b4ab2d 100644 --- a/src/main/java/com/gmail/nossr50/commands/McscoreboardCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/McscoreboardCommand.java @@ -23,6 +23,16 @@ public class McscoreboardCommand implements TabExecutor { 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")) { 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 9e081bcd6..1851f5479 100644 --- a/src/main/java/com/gmail/nossr50/util/scoreboards/ScoreboardManager.java +++ b/src/main/java/com/gmail/nossr50/util/scoreboards/ScoreboardManager.java @@ -574,6 +574,10 @@ public class ScoreboardManager { 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; diff --git a/src/main/resources/locale/locale_en_US.properties b/src/main/resources/locale/locale_en_US.properties index a144f7803..992ea77a3 100644 --- a/src/main/resources/locale/locale_en_US.properties +++ b/src/main/resources/locale/locale_en_US.properties @@ -1142,4 +1142,6 @@ Chat.Channel.Off=&6(&amcMMO-Chat&6) &7Your chat messages will no longer be autom 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... \ No newline at end of file +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 From dd550feb65d1dc02ce5728af22a84dc30969311c Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 27 Dec 2021 11:09:27 -0800 Subject: [PATCH 641/662] Update BlockTracker to use Spigot API directly instead of compatibility layer Fixes #4692 Fixes #4698 --- .../nossr50/listeners/BlockListener.java | 29 ++++---------- .../com/gmail/nossr50/util/BlockUtils.java | 11 +++-- .../util/blockmeta/BitSetChunkStore.java | 21 +++++----- .../util/compat/CompatibilityManager.java | 27 ------------- .../layers/world/WorldCompatibilityLayer.java | 11 ----- .../world/WorldCompatibilityLayer_1_16_4.java | 16 -------- .../util/blockmeta/ChunkStoreTest.java | 40 ++++++------------- 7 files changed, 38 insertions(+), 117 deletions(-) delete mode 100644 src/main/java/com/gmail/nossr50/util/compat/layers/world/WorldCompatibilityLayer.java delete mode 100644 src/main/java/com/gmail/nossr50/util/compat/layers/world/WorldCompatibilityLayer_1_16_4.java diff --git a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java index 479228b19..d4da8e1a0 100644 --- a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java @@ -21,7 +21,6 @@ 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.*; -import com.gmail.nossr50.util.compat.layers.world.WorldCompatibilityLayer; import com.gmail.nossr50.util.player.UserManager; import com.gmail.nossr50.util.skills.SkillUtils; import com.gmail.nossr50.util.sounds.SoundManager; @@ -131,12 +130,10 @@ public class BlockListener implements Listener { BlockFace direction = event.getDirection(); Block movedBlock; - WorldCompatibilityLayer worldCompatibilityLayer = mcMMO.getCompatibilityManager().getWorldCompatibilityLayer(); - for (Block block : event.getBlocks()) { movedBlock = block.getRelative(direction); - if(BlockUtils.isWithinWorldBounds(worldCompatibilityLayer, movedBlock)) { + if(BlockUtils.isWithinWorldBounds(movedBlock)) { mcMMO.getPlaceStore().setTrue(movedBlock); } } @@ -161,15 +158,13 @@ public class BlockListener implements Listener { BlockFace direction = event.getDirection(); Block movedBlock = event.getBlock().getRelative(direction); - WorldCompatibilityLayer worldCompatibilityLayer = mcMMO.getCompatibilityManager().getWorldCompatibilityLayer(); - //Spigot makes bad things happen in its API - if(BlockUtils.isWithinWorldBounds(worldCompatibilityLayer, movedBlock)) { + if(BlockUtils.isWithinWorldBounds(movedBlock)) { mcMMO.getPlaceStore().setTrue(movedBlock); } for (Block block : event.getBlocks()) { - if(BlockUtils.isWithinWorldBounds(worldCompatibilityLayer, block)) { + if(BlockUtils.isWithinWorldBounds(block)) { mcMMO.getPlaceStore().setTrue(block.getRelative(direction)); } } @@ -192,10 +187,9 @@ public class BlockListener implements Listener { BlockState blockState = event.getNewState(); if(ExperienceConfig.getInstance().isSnowExploitPrevented() && BlockUtils.shouldBeWatched(blockState)) { - WorldCompatibilityLayer worldCompatibilityLayer = mcMMO.getCompatibilityManager().getWorldCompatibilityLayer(); Block block = blockState.getBlock(); - if(BlockUtils.isWithinWorldBounds(worldCompatibilityLayer, block)) { + if(BlockUtils.isWithinWorldBounds(block)) { mcMMO.getPlaceStore().setTrue(block); } } @@ -215,10 +209,9 @@ public class BlockListener implements Listener { if(ExperienceConfig.getInstance().preventStoneLavaFarming()) { BlockState newState = event.getNewState(); - WorldCompatibilityLayer worldCompatibilityLayer = mcMMO.getCompatibilityManager().getWorldCompatibilityLayer(); if(newState.getType() != Material.OBSIDIAN && ExperienceConfig.getInstance().doesBlockGiveSkillXP(PrimarySkillType.MINING, newState.getBlockData())) { - if(BlockUtils.isWithinWorldBounds(worldCompatibilityLayer, newState.getBlock())) { + if(BlockUtils.isWithinWorldBounds(newState.getBlock())) { mcMMO.getPlaceStore().setTrue(newState); } } @@ -243,9 +236,7 @@ public class BlockListener implements Listener { return; } - WorldCompatibilityLayer worldCompatibilityLayer = mcMMO.getCompatibilityManager().getWorldCompatibilityLayer(); - - if(BlockUtils.isWithinWorldBounds(worldCompatibilityLayer, block)) { + 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); @@ -283,10 +274,8 @@ public class BlockListener implements Listener { BlockState blockState = replacedBlockState.getBlock().getState(); Block block = blockState.getBlock(); - WorldCompatibilityLayer worldCompatibilityLayer = mcMMO.getCompatibilityManager().getWorldCompatibilityLayer(); - /* Check if the blocks placed should be monitored so they do not give out XP in the future */ - if(BlockUtils.isWithinWorldBounds(worldCompatibilityLayer, block)) { + 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())) { @@ -311,9 +300,7 @@ public class BlockListener implements Listener { 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 - WorldCompatibilityLayer worldCompatibilityLayer = mcMMO.getCompatibilityManager().getWorldCompatibilityLayer(); - - if(BlockUtils.isWithinWorldBounds(worldCompatibilityLayer, block)) { + if(BlockUtils.isWithinWorldBounds(block)) { mcMMO.getPlaceStore().setFalse(block); } } diff --git a/src/main/java/com/gmail/nossr50/util/BlockUtils.java b/src/main/java/com/gmail/nossr50/util/BlockUtils.java index f3c1dbd25..c899fc148 100644 --- a/src/main/java/com/gmail/nossr50/util/BlockUtils.java +++ b/src/main/java/com/gmail/nossr50/util/BlockUtils.java @@ -7,7 +7,6 @@ import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.skills.repair.Repair; import com.gmail.nossr50.skills.salvage.Salvage; -import com.gmail.nossr50.util.compat.layers.world.WorldCompatibilityLayer; import com.gmail.nossr50.util.random.RandomChanceSkill; import com.gmail.nossr50.util.random.RandomChanceUtil; import org.bukkit.Material; @@ -302,11 +301,17 @@ public final class BlockUtils { return hasWoodcuttingXP(block.getState()) || isNonWoodPartOfTree(block.getType()); } - public static boolean isWithinWorldBounds(@NotNull WorldCompatibilityLayer worldCompatibilityLayer, @NotNull Block block) { + /** + * 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() >= worldCompatibilityLayer.getMinWorldHeight(world) && block.getY() < worldCompatibilityLayer.getMaxWorldHeight(world); + return block.getY() >= world.getMinHeight() && block.getY() < world.getMaxHeight(); } } diff --git a/src/main/java/com/gmail/nossr50/util/blockmeta/BitSetChunkStore.java b/src/main/java/com/gmail/nossr50/util/blockmeta/BitSetChunkStore.java index d850cec06..bdee4a3b9 100644 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/BitSetChunkStore.java +++ b/src/main/java/com/gmail/nossr50/util/blockmeta/BitSetChunkStore.java @@ -1,6 +1,5 @@ package com.gmail.nossr50.util.blockmeta; -import com.gmail.nossr50.mcMMO; import org.bukkit.Bukkit; import org.bukkit.World; import org.jetbrains.annotations.NotNull; @@ -25,7 +24,7 @@ public class BitSetChunkStore implements ChunkStore { private transient boolean dirty = false; public BitSetChunkStore(@NotNull World world, int cx, int cz) { - this(world.getUID(), mcMMO.getCompatibilityManager().getWorldCompatibilityLayer().getMinWorldHeight(world), world.getMaxHeight(), cx, cz); + this(world.getUID(), world.getMinHeight(), world.getMaxHeight(), cx, cz); } private BitSetChunkStore(@NotNull UUID worldUid, int worldMin, int worldMax, int cx, int cz) { @@ -109,23 +108,23 @@ public class BitSetChunkStore implements ChunkStore { return (z * 16 + x) + (256 * (y + yOffset)); } - private static int getWorldMin(@NotNull UUID worldUid, int storedWorldMin) { + 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) - return storedWorldMin; + throw new RuntimeException("Cannot grab a minimum world height for an unloaded world"); - return mcMMO.getCompatibilityManager().getWorldCompatibilityLayer().getMinWorldHeight(world); + return world.getMinHeight(); } - private static int getWorldMax(@NotNull UUID worldUid, int storedWorldMax) + 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) - return storedWorldMax; + throw new RuntimeException("Cannot grab a maximum world height for an unloaded world"); return world.getMaxHeight(); } @@ -171,8 +170,8 @@ public class BitSetChunkStore implements ChunkStore { in.readFully(temp); BitSet stored = BitSet.valueOf(temp); - int currentWorldMin = getWorldMin(worldUid, worldMin); - int currentWorldMax = getWorldMax(worldUid, worldMax); + 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 @@ -273,8 +272,8 @@ public class BitSetChunkStore implements ChunkStore { public @NotNull BitSetChunkStore convert() { - int currentWorldMin = getWorldMin(worldUid, 0); - int currentWorldMax = getWorldMax(worldUid, worldMax); + int currentWorldMin = getWorldMin(worldUid); + int currentWorldMax = getWorldMax(worldUid); BitSetChunkStore converted = new BitSetChunkStore(worldUid, currentWorldMin, currentWorldMax, cx, cz); 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 44231f0b0..f1f0b185b 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/CompatibilityManager.java +++ b/src/main/java/com/gmail/nossr50/util/compat/CompatibilityManager.java @@ -10,12 +10,9 @@ import com.gmail.nossr50.util.compat.layers.persistentdata.SpigotPersistentDataL import com.gmail.nossr50.util.compat.layers.persistentdata.SpigotPersistentDataLayer_1_14; import com.gmail.nossr50.util.compat.layers.skills.AbstractMasterAnglerCompatibility; import com.gmail.nossr50.util.compat.layers.skills.MasterAnglerCompatibilityLayer; -import com.gmail.nossr50.util.compat.layers.world.WorldCompatibilityLayer; -import com.gmail.nossr50.util.compat.layers.world.WorldCompatibilityLayer_1_16_4; import com.gmail.nossr50.util.nms.NMSVersion; import com.gmail.nossr50.util.platform.MinecraftGameVersion; import com.gmail.nossr50.util.text.StringUtils; -import org.bukkit.World; import org.bukkit.command.CommandSender; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -40,7 +37,6 @@ public class CompatibilityManager { private AbstractPersistentDataLayer persistentDataLayer; private AbstractBungeeSerializerCompatibilityLayer bungeeSerializerCompatibilityLayer; private AbstractMasterAnglerCompatibility masterAnglerCompatibility; - private WorldCompatibilityLayer worldCompatibilityLayer; public CompatibilityManager(@NotNull MinecraftGameVersion minecraftGameVersion) { mcMMO.p.getLogger().info("Loading compatibility layers..."); @@ -71,29 +67,10 @@ public class CompatibilityManager { initPersistentDataLayer(); initBungeeSerializerLayer(); initMasterAnglerLayer(); - initWorldCompatibilityLayer(); isFullyCompatibleServerSoftware = true; } - private void initWorldCompatibilityLayer() { - if(minecraftGameVersion.isAtLeast(1, 17, 0)) { - worldCompatibilityLayer = new WorldCompatibilityLayer_1_16_4(); - } else { - worldCompatibilityLayer = new WorldCompatibilityLayer() { - @Override - public int getMinWorldHeight(@NotNull World world) { - return WorldCompatibilityLayer.super.getMinWorldHeight(world); - } - - @Override - public int getMaxWorldHeight(@NotNull World world) { - return WorldCompatibilityLayer.super.getMaxWorldHeight(world); - } - }; - } - } - private void initMasterAnglerLayer() { if(minecraftGameVersion.isAtLeast(1, 16, 3)) { masterAnglerCompatibility = new MasterAnglerCompatibilityLayer(); @@ -202,10 +179,6 @@ public class CompatibilityManager { return masterAnglerCompatibility; } - public @NotNull WorldCompatibilityLayer getWorldCompatibilityLayer() { - return worldCompatibilityLayer; - } - public @Nullable MinecraftGameVersion getMinecraftGameVersion() { return minecraftGameVersion; } diff --git a/src/main/java/com/gmail/nossr50/util/compat/layers/world/WorldCompatibilityLayer.java b/src/main/java/com/gmail/nossr50/util/compat/layers/world/WorldCompatibilityLayer.java deleted file mode 100644 index 115aeb7fb..000000000 --- a/src/main/java/com/gmail/nossr50/util/compat/layers/world/WorldCompatibilityLayer.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.gmail.nossr50.util.compat.layers.world; - -import com.gmail.nossr50.util.compat.CompatibilityLayer; -import org.bukkit.World; -import org.jetbrains.annotations.NotNull; - -public interface WorldCompatibilityLayer extends CompatibilityLayer { - default int getMinWorldHeight(@NotNull World world) { return 0; } - - default int getMaxWorldHeight(@NotNull World world) { return 256; } -} diff --git a/src/main/java/com/gmail/nossr50/util/compat/layers/world/WorldCompatibilityLayer_1_16_4.java b/src/main/java/com/gmail/nossr50/util/compat/layers/world/WorldCompatibilityLayer_1_16_4.java deleted file mode 100644 index 4e67aaf5c..000000000 --- a/src/main/java/com/gmail/nossr50/util/compat/layers/world/WorldCompatibilityLayer_1_16_4.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.gmail.nossr50.util.compat.layers.world; - -import org.bukkit.World; -import org.jetbrains.annotations.NotNull; - -public class WorldCompatibilityLayer_1_16_4 implements WorldCompatibilityLayer { - @Override - public int getMinWorldHeight(@NotNull World world) { - return world.getMinHeight(); - } - - @Override - public int getMaxWorldHeight(@NotNull World world) { - return world.getMaxHeight(); - } -} diff --git a/src/test/java/com/gmail/nossr50/util/blockmeta/ChunkStoreTest.java b/src/test/java/com/gmail/nossr50/util/blockmeta/ChunkStoreTest.java index f10b77898..1e0c209fe 100644 --- a/src/test/java/com/gmail/nossr50/util/blockmeta/ChunkStoreTest.java +++ b/src/test/java/com/gmail/nossr50/util/blockmeta/ChunkStoreTest.java @@ -4,7 +4,6 @@ package com.gmail.nossr50.util.blockmeta; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.BlockUtils; import com.gmail.nossr50.util.compat.CompatibilityManager; -import com.gmail.nossr50.util.compat.layers.world.WorldCompatibilityLayer; import com.gmail.nossr50.util.platform.PlatformManager; import com.google.common.io.Files; import org.bukkit.Bukkit; @@ -39,10 +38,7 @@ class ChunkStoreTest { } private World mockWorld; - private CompatibilityManager compatibilityManager; - private WorldCompatibilityLayer worldCompatibilityLayer; - private PlatformManager platformManager; - + private MockedStatic bukkitMock; private MockedStatic mcMMOMock; @@ -57,24 +53,10 @@ class ChunkStoreTest { bukkitMock = Mockito.mockStatic(Bukkit.class); bukkitMock.when(() -> Bukkit.getWorld(worldUUID)).thenReturn(mockWorld); - platformManager = Mockito.mock(PlatformManager.class); - compatibilityManager = Mockito.mock(CompatibilityManager.class); - worldCompatibilityLayer = Mockito.mock(WorldCompatibilityLayer.class); - mcMMOMock = Mockito.mockStatic(mcMMO.class); - mcMMOMock.when(() -> mcMMO.getPlatformManager()).thenReturn(platformManager); - Assertions.assertNotNull(mcMMO.getPlatformManager()); - - mcMMOMock.when(() -> mcMMO.getCompatibilityManager()).thenReturn(compatibilityManager); - Assertions.assertNotNull(mcMMO.getCompatibilityManager()); - - Mockito.when(platformManager.getCompatibilityManager()).thenReturn(compatibilityManager); - Mockito.when(platformManager.getCompatibilityManager().getWorldCompatibilityLayer()).thenReturn(worldCompatibilityLayer); - Assertions.assertNotNull(mcMMO.getCompatibilityManager().getWorldCompatibilityLayer()); - Mockito.when(worldCompatibilityLayer.getMinWorldHeight(mockWorld)).thenReturn(LEGACY_WORLD_HEIGHT_MIN); - Mockito.when(worldCompatibilityLayer.getMaxWorldHeight(mockWorld)).thenReturn(LEGACY_WORLD_HEIGHT_MAX); - + Mockito.when(mockWorld.getMinHeight()).thenReturn(LEGACY_WORLD_HEIGHT_MIN); + Mockito.when(mockWorld.getMaxHeight()).thenReturn(LEGACY_WORLD_HEIGHT_MAX); } @AfterEach @@ -85,7 +67,7 @@ class ChunkStoreTest { @Test void testIndexOutOfBounds() { - Mockito.when(mcMMO.getCompatibilityManager().getWorldCompatibilityLayer().getMinWorldHeight(mockWorld)).thenReturn(-64); + Mockito.when(mockWorld.getMinHeight()).thenReturn(-64); HashChunkManager hashChunkManager = new HashChunkManager(); // Top Block @@ -96,7 +78,7 @@ class ChunkStoreTest { @Test void testSetTrue() { - Mockito.when(mcMMO.getCompatibilityManager().getWorldCompatibilityLayer().getMinWorldHeight(mockWorld)).thenReturn(-64); + Mockito.when(mockWorld.getMinHeight()).thenReturn(-64); HashChunkManager hashChunkManager = new HashChunkManager(); int radius = 2; // Could be anything but drastically changes test time @@ -117,7 +99,7 @@ class ChunkStoreTest { Block bottomBlock = initMockBlock(1337, 0, -1337); Assertions.assertFalse(hashChunkManager.isTrue(bottomBlock)); - Assertions.assertTrue(BlockUtils.isWithinWorldBounds(worldCompatibilityLayer, bottomBlock)); + Assertions.assertTrue(BlockUtils.isWithinWorldBounds(bottomBlock)); hashChunkManager.setTrue(bottomBlock); Assertions.assertTrue(hashChunkManager.isTrue(bottomBlock)); @@ -125,7 +107,7 @@ class ChunkStoreTest { Block topBlock = initMockBlock(1337, 255, -1337); Assertions.assertFalse(hashChunkManager.isTrue(topBlock)); - Assertions.assertTrue(BlockUtils.isWithinWorldBounds(worldCompatibilityLayer, topBlock)); + Assertions.assertTrue(BlockUtils.isWithinWorldBounds(topBlock)); hashChunkManager.setTrue(topBlock); Assertions.assertTrue(hashChunkManager.isTrue(topBlock)); } @@ -161,7 +143,7 @@ class ChunkStoreTest { @Test void testNegativeWorldMin() throws IOException { - Mockito.when(mcMMO.getCompatibilityManager().getWorldCompatibilityLayer().getMinWorldHeight(mockWorld)).thenReturn(-64); + Mockito.when(mockWorld.getMinHeight()).thenReturn(-64); BitSetChunkStore original = new BitSetChunkStore(mockWorld, 1, 2); original.setTrue(14, -32, 12); @@ -180,8 +162,9 @@ class ChunkStoreTest { original.setTrue(13, 3, 12); byte[] serializedBytes = serializeChunkstore(original); - Mockito.when(mcMMO.getCompatibilityManager().getWorldCompatibilityLayer().getMinWorldHeight(mockWorld)).thenReturn(-64); + Mockito.when(mockWorld.getMinHeight()).thenReturn(-64); ChunkStore deserialized = BitSetChunkStore.Serialization.readChunkStore(new DataInputStream(new ByteArrayInputStream(serializedBytes))); + assert deserialized != null; assertEqualIgnoreMinMax(original, deserialized); } @@ -202,6 +185,7 @@ class ChunkStoreTest { 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); } @@ -221,6 +205,7 @@ class ChunkStoreTest { 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(); @@ -299,7 +284,6 @@ class ChunkStoreTest { } public static class LegacyChunkStore implements ChunkStore, Serializable { - private static final long serialVersionUID = -1L; transient private boolean dirty = false; public boolean[][][] store; From ef714f98c9bffc5440628101854b91ca6cc05e1a Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 27 Dec 2021 11:22:16 -0800 Subject: [PATCH 642/662] Fix parties at level cap gaining XP and thus spamming messages Fixes #4686 --- Changelog.txt | 2 ++ src/main/java/com/gmail/nossr50/datatypes/party/Party.java | 4 ++-- .../java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java | 2 +- src/main/java/com/gmail/nossr50/util/EventUtils.java | 1 - 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 4d90c234d..b8384fc0d 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,4 +1,6 @@ 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 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 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 40c684234..edf661791 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/party/Party.java +++ b/src/main/java/com/gmail/nossr50/datatypes/party/Party.java @@ -252,10 +252,10 @@ public class Party { SoundManager.sendSound(leader, leader.getLocation(), SoundType.LEVEL_UP); } } - return; + } else { + PartyManager.informPartyMembersLevelUp(this, levelsGained, getLevel()); } - PartyManager.informPartyMembersLevelUp(this, levelsGained, getLevel()); } public boolean hasReachedLevelCap() { 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 f60583457..3e0b6018f 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java +++ b/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java @@ -642,7 +642,7 @@ public class McMMOPlayer implements Identified { applyXpGain(skill, modifyXpGain(skill, xp), xpGainReason, xpGainSource); - if (party == null) { + if (party == null || party.hasReachedLevelCap()) { return; } diff --git a/src/main/java/com/gmail/nossr50/util/EventUtils.java b/src/main/java/com/gmail/nossr50/util/EventUtils.java index 4dd661aba..acec911dd 100644 --- a/src/main/java/com/gmail/nossr50/util/EventUtils.java +++ b/src/main/java/com/gmail/nossr50/util/EventUtils.java @@ -370,7 +370,6 @@ public final class EventUtils { boolean isCancelled = event.isCancelled(); if (isCancelled) { - party.setLevel(party.getLevel() + levelsChanged); party.addXp(xpRemoved); } From 2ca3544741cc1bade6128bd5cd604bf1cdaa45c6 Mon Sep 17 00:00:00 2001 From: JeBobs Date: Mon, 27 Dec 2021 14:29:54 -0500 Subject: [PATCH 643/662] Added option to disallow using enchanted materials to repair items. (#4693) --- .../gmail/nossr50/config/AdvancedConfig.java | 1 + .../nossr50/skills/repair/RepairManager.java | 34 +++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java b/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java index fd2736190..dda173802 100644 --- a/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java +++ b/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java @@ -680,6 +680,7 @@ public class AdvancedConfig extends AutoUpdateConfigLoader { /* 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 boolean getAllowEnchantedRepairMaterials() { return config.getBoolean("Skills.Repair.Use_Enchanted_Materials", false); } 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); } 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 aec9f007c..42bc3cdea 100644 --- a/src/main/java/com/gmail/nossr50/skills/repair/RepairManager.java +++ b/src/main/java/com/gmail/nossr50/skills/repair/RepairManager.java @@ -28,8 +28,13 @@ 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; +import java.util.stream.Collector; +import java.util.stream.Collectors; public class RepairManager extends SkillManager { private boolean placedAnvil; @@ -128,6 +133,35 @@ public class RepairManager extends SkillManager { // 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()) { From 9d08d88f2abebd6c66240b3ef1775f5b13953796 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 27 Dec 2021 11:34:55 -0800 Subject: [PATCH 644/662] Add new repair setting to default file --- Changelog.txt | 2 ++ pom.xml | 8 ++++---- src/main/resources/config.yml | 1 + 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index b8384fc0d..d1ffe936c 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,6 +1,8 @@ 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 diff --git a/pom.xml b/pom.xml index 92fd1226b..9a0b92191 100755 --- a/pom.xml +++ b/pom.xml @@ -326,25 +326,25 @@ org.junit.jupiter junit-jupiter - 5.8.1 + 5.8.2 test org.mockito mockito-core - 4.0.0 + 4.2.0 test org.mockito mockito-inline - 4.0.0 + 4.2.0 test org.apache.tomcat tomcat-jdbc - 10.0.12 + 10.0.14 compile diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 29dae4df0..84798fd72 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -391,6 +391,7 @@ Skills: 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: From 40160498ca4da582e14dea1aafbfca0ada2fb866 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 27 Dec 2021 11:40:33 -0800 Subject: [PATCH 645/662] 2.1.207 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 9a0b92191..98abc10f8 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.207-SNAPSHOT + 2.1.207 mcMMO https://github.com/mcMMO-Dev/mcMMO From c92ae16c7f3d229be8a760f90dc910b2e32fd2e6 Mon Sep 17 00:00:00 2001 From: Olivia Date: Thu, 30 Dec 2021 17:21:46 -0500 Subject: [PATCH 646/662] Fix extra 0 in level for gunpowder in retro mode (#4701) --- src/main/resources/treasures.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/treasures.yml b/src/main/resources/treasures.yml index ad3ae1464..a28024472 100755 --- a/src/main/resources/treasures.yml +++ b/src/main/resources/treasures.yml @@ -16,7 +16,7 @@ Excavation: Drop_Chance: 10.0 Level_Requirement: Standard_Mode: 10 - Retro_Mode: 1000 + Retro_Mode: 100 Drops_From: [Gravel] BONE: Amount: 1 @@ -246,4 +246,4 @@ Hylian_Luck: Level_Requirement: Standard_Mode: 0 Retro_Mode: 0 - Drops_From: [Pots] \ No newline at end of file + Drops_From: [Pots] From 829aaea5d44ad44734d7ac82008d4ff95e983f14 Mon Sep 17 00:00:00 2001 From: dexasz <37642364+dexasz@users.noreply.github.com> Date: Sun, 9 Jan 2022 21:07:18 +0200 Subject: [PATCH 647/662] add & translate missing strings & fix a typo that broke placeholders (#4707) --- .../resources/locale/locale_lt_LT.properties | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/main/resources/locale/locale_lt_LT.properties b/src/main/resources/locale/locale_lt_LT.properties index 964f1c2e8..040aecec0 100644 --- a/src/main/resources/locale/locale_lt_LT.properties +++ b/src/main/resources/locale/locale_lt_LT.properties @@ -146,7 +146,7 @@ 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=ACROBATICSS +Acrobatics.SkillName=ACROBATICS #ALCHEMY Alchemy.SubSkill.Catalysis.Name=Katalizė Alchemy.SubSkill.Catalysis.Description=Sumažina stebuklingo gėrimo gaminimo laiką @@ -1109,3 +1109,19 @@ LevelCap.Skill=&6(&amcMMO&6) &eJūs pasiekete įgūdžio viršų &c{0}&e iki &6{ 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. From d5ce8fc6ff5e761099ca31b0a9393e29ea4a27f6 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sun, 9 Jan 2022 11:14:11 -0800 Subject: [PATCH 648/662] Dev mode --- Changelog.txt | 3 +++ pom.xml | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index d1ffe936c..b3e89687d 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,6 @@ +Version 2.1.208 + Updated lithuanian locale (thanks dexasz) + 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 diff --git a/pom.xml b/pom.xml index 98abc10f8..2ad096872 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.207 + 2.1.208-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO From dd4a5a6b9aa108059c997ea58638fdfd193c1947 Mon Sep 17 00:00:00 2001 From: the456gamer Date: Sun, 9 Jan 2022 19:16:17 +0000 Subject: [PATCH 649/662] remove YAML parsing hacks in favor of native bukkit provided parsing (#4714) * fix yaml config to use native comment handling. fixes #4702 replaces #4713 --- .../config/AutoUpdateConfigLoader.java | 101 ++++-------------- 1 file changed, 21 insertions(+), 80 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/config/AutoUpdateConfigLoader.java b/src/main/java/com/gmail/nossr50/config/AutoUpdateConfigLoader.java index f2c936a56..c1ded1333 100644 --- a/src/main/java/com/gmail/nossr50/config/AutoUpdateConfigLoader.java +++ b/src/main/java/com/gmail/nossr50/config/AutoUpdateConfigLoader.java @@ -5,10 +5,9 @@ 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 { @@ -33,7 +32,9 @@ public abstract class AutoUpdateConfigLoader extends ConfigLoader { protected void saveConfig() { try { mcMMO.p.getLogger().info("Saving changes to config file - "+fileName); - config.save(configFile); + YamlConfiguration yamlConfiguration = (YamlConfiguration) config; + yamlConfiguration.options().indent(4); + yamlConfiguration.save(configFile); } catch (IOException e) { e.printStackTrace(); } @@ -53,22 +54,25 @@ public abstract class AutoUpdateConfigLoader extends ConfigLoader { boolean needSave = false; + // keys present in current config file that are not in the template Set oldKeys = new HashSet<>(configKeys); oldKeys.removeAll(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) { -// mcMMO.p.debug("Detected potentially unused key: " + key); -// //config.set(key, null); -// } for (String key : newKeys) { mcMMO.p.debug("Adding new key: " + key + " = " + internalConfig.get(key)); @@ -76,70 +80,8 @@ public abstract class AutoUpdateConfigLoader extends ConfigLoader { } 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(mcMMO.p.getResource(fileName))); - LinkedHashMap comments = new LinkedHashMap<>(); - StringBuilder temp = new StringBuilder(); - - String line; - while ((line = reader.readLine()) != null) { - if (line.contains("#")) { - temp.append(line).append("\n"); - } - else if (line.contains(":")) { - line = line.substring(0, line.indexOf(":") + 1); - if (temp.length() > 0) { - if(comments.containsKey(line)) { - int index = 0; - while(comments.containsKey(line + index)) { - index++; - } - - line = line + index; - } - - comments.put(line, temp.toString()); - temp = new StringBuilder(); - } - } - } - - // 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; @@ -153,11 +95,10 @@ public abstract class AutoUpdateConfigLoader extends ConfigLoader { } File newSaveFile = new File(dataFolder, saveName); - FileWriter fileWriter = new FileWriter(newSaveFile.getAbsolutePath()); - BufferedWriter writer = new BufferedWriter(fileWriter); - writer.write(output); - writer.flush(); - writer.close(); + YamlConfiguration yamlConfiguration = (YamlConfiguration) config; + yamlConfiguration.options().indent(4); + yamlConfiguration.save(newSaveFile); + } catch (Exception e) { e.printStackTrace(); From c21a040ddbb92d22e5898eb1ae14d2e9fc5e6ab8 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 10 Jan 2022 22:29:22 -0800 Subject: [PATCH 650/662] Huge changes to how config files are loaded/updated, fixes many issues Fixes #4715 --- Changelog.txt | 10 +- .../gmail/nossr50/config/AdvancedConfig.java | 365 ++++++-- .../config/AutoUpdateConfigLoader.java | 17 +- .../gmail/nossr50/config/BukkitConfig.java | 192 ++++ .../com/gmail/nossr50/config/ChatConfig.java | 4 +- .../gmail/nossr50/config/ConfigLoader.java | 20 +- .../nossr50/config/CoreSkillsConfig.java | 34 +- .../gmail/nossr50/config/GeneralConfig.java | 864 ++++++++++++++---- .../nossr50/config/PersistentDataConfig.java | 2 +- .../com/gmail/nossr50/config/RankConfig.java | 83 +- .../com/gmail/nossr50/config/SoundConfig.java | 55 +- .../gmail/nossr50/config/WorldBlacklist.java | 41 +- .../config/experience/ExperienceConfig.java | 291 ++++-- .../config/mods/CustomArmorConfig.java | 10 +- .../config/mods/CustomBlockConfig.java | 24 +- .../config/mods/CustomEntityConfig.java | 5 +- .../nossr50/config/mods/CustomToolConfig.java | 15 +- .../config/party/ItemWeightConfig.java | 7 +- .../config/skills/alchemy/PotionConfig.java | 33 +- .../config/skills/repair/RepairConfig.java | 45 +- .../skills/repair/RepairConfigManager.java | 27 +- .../config/skills/salvage/SalvageConfig.java | 53 +- .../skills/salvage/SalvageConfigManager.java | 25 +- .../treasure/FishingTreasureConfig.java | 84 +- .../config/treasure/TreasureConfig.java | 48 +- .../database/FlatFileDatabaseManager.java | 1 - src/main/java/com/gmail/nossr50/mcMMO.java | 2 +- .../nossr50/skills/child/ChildConfig.java | 4 +- .../nossr50/skills/repair/RepairManager.java | 2 - .../util/experience/ExperienceBarWrapper.java | 2 +- .../nossr50/util/upgrade/UpgradeManager.java | 4 +- src/main/resources/coreskills.yml | 8 +- src/main/resources/repair.vanilla.yml | 1 - .../util/blockmeta/ChunkStoreTest.java | 2 - 34 files changed, 1644 insertions(+), 736 deletions(-) create mode 100644 src/main/java/com/gmail/nossr50/config/BukkitConfig.java diff --git a/Changelog.txt b/Changelog.txt index b3e89687d..825d647e4 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,6 +1,14 @@ 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 diff --git a/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java b/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java index dda173802..84da46281 100644 --- a/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java +++ b/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java @@ -10,13 +10,18 @@ import java.io.File; import java.util.ArrayList; import java.util.List; -public class AdvancedConfig extends AutoUpdateConfigLoader { +public class AdvancedConfig extends BukkitConfig { public AdvancedConfig(File dataFolder) { super("advanced.yml", dataFolder); validate(); } + @Override + public void initDefaults() { + config.addDefault("Skills.General.StartingLevel", 0); + } + @Override protected boolean validateKeys() { // Validate all the settings! @@ -99,8 +104,7 @@ public class AdvancedConfig extends AutoUpdateConfigLoader { } /* AXES */ - if(getAxeMasteryRankDamageMultiplier() < 0) - { + if (getAxeMasteryRankDamageMultiplier() < 0) { reason.add("Skills.Axes.AxeMastery.RankDamageMultiplier should be at least 0!"); } @@ -404,12 +408,18 @@ public class AdvancedConfig extends AutoUpdateConfigLoader { } @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); @@ -418,10 +428,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); @@ -430,27 +441,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) { @@ -462,35 +478,29 @@ public class AdvancedConfig extends AutoUpdateConfigLoader { 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() - { + public boolean sendAbilityNotificationToOtherPlayers() { return config.getBoolean("Feedback.Events.AbilityActivation.SendNotificationToOtherPlayers", true); } @@ -509,6 +519,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() @@ -557,7 +568,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); @@ -598,111 +608,243 @@ 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 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); + } /* 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 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 getFishingReductionMinWaitTicks() { return config.getInt("Skills.Fishing.MasterAngler.Tick_Reduction_Per_Rank.Min_Wait", 10);} - 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 int getFishingVanillaXPModifier(int rank) { + return config.getInt("Skills.Fishing.VanillaXPMultiplier.Rank_" + rank); + } + + public int getFishingReductionMinWaitTicks() { + return config.getInt("Skills.Fishing.MasterAngler.Tick_Reduction_Per_Rank.Min_Wait", 10); + } + + 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); } + 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 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); } + 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 boolean getAllowEnchantedRepairMaterials() { return config.getBoolean("Skills.Repair.Use_Enchanted_Materials", false); } + public double getRepairMasteryMaxBonus() { + return config.getDouble("Skills.Repair.RepairMastery.MaxBonusPercentage", 200.0D); + } - 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 int getRepairMasteryMaxLevel() { + return config.getInt("Skills.Repair.RepairMastery.MaxBonusLevel", 100); + } - 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 getAllowEnchantedRepairMaterials() { + return config.getBoolean("Skills.Repair.Use_Enchanted_Materials", false); + } - public boolean getArcaneSalvageEnchantDowngradeEnabled() { return config.getBoolean("Skills.Salvage.ArcaneSalvage.EnchantDowngradeEnabled", true); } - public boolean getArcaneSalvageEnchantLossEnabled() { return config.getBoolean("Skills.Salvage.ArcaneSalvage.EnchantLossEnabled", true); } + public boolean getArcaneForgingEnchantLossEnabled() { + return config.getBoolean("Skills.Repair.ArcaneForging.May_Lose_Enchants", 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); } + public double getArcaneForgingKeepEnchantsChance(int rank) { + return config.getDouble("Skills.Repair.ArcaneForging.Keep_Enchants_Chance.Rank_" + rank); + } + + 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 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 double getFluxMiningChance() { return config.getDouble("Skills.Smelting.FluxMining.Chance", 33.0D); } + public double getFluxMiningChance() { + return config.getDouble("Skills.Smelting.FluxMining.Chance", 33.0D); + } /* SWORDS */ public double getRuptureTickDamage(boolean isTargetPlayer, int rank) { @@ -732,35 +874,68 @@ public class AdvancedConfig extends AutoUpdateConfigLoader { return config.getDouble(root + rank, 33); } - public double getCounterModifier() { return config.getDouble("Skills.Swords.CounterAttack.DamageModifier", 2.0D); } + 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); } + 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 double getGoreModifier() { return config.getDouble("Skills.Taming.Gore.Modifier", 2.0D); } + public double getGoreModifier() { + return config.getDouble("Skills.Taming.Gore.Modifier", 2.0D); + } - 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 double getThickFurModifier() { return config.getDouble("Skills.Taming.ThickFur.Modifier", 2.0D); } + public double getPummelChance() { + return config.getDouble("Skills.Taming.Pummel.Chance", 10.0D); + } - public double getShockProofModifier() { return config.getDouble("Skills.Taming.ShockProof.Modifier", 6.0D); } + public double getThickFurModifier() { + return config.getDouble("Skills.Taming.ThickFur.Modifier", 2.0D); + } - public double getSharpenedClawsBonus() { return config.getDouble("Skills.Taming.SharpenedClaws.Bonus", 2.0D); } + public double getShockProofModifier() { + return config.getDouble("Skills.Taming.ShockProof.Modifier", 6.0D); + } - 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 getSharpenedClawsBonus() { + return config.getDouble("Skills.Taming.SharpenedClaws.Bonus", 2.0D); + } + + public double getMinHorseJumpStrength() { + return config.getDouble("Skills.Taming.CallOfTheWild.MinHorseJumpStrength", 0.7D); + } + + public double getMaxHorseJumpStrength() { + return config.getDouble("Skills.Taming.CallOfTheWild.MaxHorseJumpStrength", 2.0D); + } /* UNARMED */ - public boolean isSteelArmDamageCustom() { return config.getBoolean("Skills.Unarmed.SteelArmStyle.Damage_Override", 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); } + + public boolean getDisarmProtected() { + return config.getBoolean("Skills.Unarmed.Disarm.AntiTheft", false); + } /* WOODCUTTING */ - public boolean isKnockOnWoodXPOrbEnabled() { return config.getBoolean("Skills.Woodcutting.TreeFeller.Knock_On_Wood.Add_XP_Orbs_To_Drops", true); } + 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 c1ded1333..710534e36 100644 --- a/src/main/java/com/gmail/nossr50/config/AutoUpdateConfigLoader.java +++ b/src/main/java/com/gmail/nossr50/config/AutoUpdateConfigLoader.java @@ -31,10 +31,9 @@ public abstract class AutoUpdateConfigLoader extends ConfigLoader { protected void saveConfig() { try { - mcMMO.p.getLogger().info("Saving changes to config file - "+fileName); - YamlConfiguration yamlConfiguration = (YamlConfiguration) config; - yamlConfiguration.options().indent(4); - yamlConfiguration.save(configFile); + mcMMO.p.getLogger().info("Saving changes to config file - " + fileName); + config.options().indent(2); + config.save(configFile); } catch (IOException e) { e.printStackTrace(); } @@ -59,13 +58,12 @@ public abstract class AutoUpdateConfigLoader extends ConfigLoader { oldKeys.removeAll(internalConfigKeys); if (!oldKeys.isEmpty()) { - mcMMO.p.debug("old key(s) in \"" +fileName+"\""); + 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); @@ -82,7 +80,7 @@ public abstract class AutoUpdateConfigLoader extends ConfigLoader { if (needSave) { // Save it - if(dataFolder == null) { + if (dataFolder == null) { mcMMO.p.getLogger().severe("Data folder should never be null!"); return; } @@ -95,12 +93,11 @@ public abstract class AutoUpdateConfigLoader extends ConfigLoader { } File newSaveFile = new File(dataFolder, saveName); - YamlConfiguration yamlConfiguration = (YamlConfiguration) config; + YamlConfiguration yamlConfiguration = config; yamlConfiguration.options().indent(4); yamlConfiguration.save(newSaveFile); - } - catch (Exception e) { + } 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..c14712f43 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/config/BukkitConfig.java @@ -0,0 +1,192 @@ +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.List; +import java.util.Set; + +public abstract class BukkitConfig { + public static final String CURRENT_CONFIG_PATCH_VER = "ConfigPatchVersion: 1"; + protected final String fileName; + protected final File configFile; + protected YamlConfiguration config; + protected @NotNull + final File dataFolder; + + 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); + } + + @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); + config.options().parseComments(true); + config.options().copyDefaults(true); + + try { + config.load(configFile); + } catch (IOException | InvalidConfigurationException e) { + e.printStackTrace(); + } + + return config; + } + + protected abstract void loadKeys(); + + protected boolean validateKeys() { + return true; + } + + protected boolean noErrorsInConfig(List issues) { + for (String issue : issues) { + mcMMO.p.getLogger().warning(issue); + } + + return issues.isEmpty(); + } + + protected void validate() { + if (validateKeys()) { + 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); + mcMMO.p.noErrorsInConfigFiles = false; + } + } + + 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; + } + + if (line.startsWith("#")) { + 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(); + } + } +} \ 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 index 1440194fc..bbda1b69c 100644 --- a/src/main/java/com/gmail/nossr50/config/ChatConfig.java +++ b/src/main/java/com/gmail/nossr50/config/ChatConfig.java @@ -4,7 +4,7 @@ import com.gmail.nossr50.datatypes.chat.ChatChannel; import com.gmail.nossr50.util.text.StringUtils; import org.jetbrains.annotations.NotNull; -public class ChatConfig extends AutoUpdateConfigLoader { +public class ChatConfig extends BukkitConfig { private static ChatConfig instance; private ChatConfig() { @@ -41,7 +41,9 @@ public class ChatConfig extends AutoUpdateConfigLoader { /** * 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) { diff --git a/src/main/java/com/gmail/nossr50/config/ConfigLoader.java b/src/main/java/com/gmail/nossr50/config/ConfigLoader.java index a1c75058d..972bd697e 100644 --- a/src/main/java/com/gmail/nossr50/config/ConfigLoader.java +++ b/src/main/java/com/gmail/nossr50/config/ConfigLoader.java @@ -1,7 +1,6 @@ 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; @@ -9,10 +8,10 @@ import java.io.File; import java.util.List; public abstract class ConfigLoader { - protected String fileName; protected final File configFile; - protected FileConfiguration config; - protected @NotNull final File dataFolder; + protected final @NotNull File dataFolder; + protected String fileName; + protected YamlConfiguration config; public ConfigLoader(String relativePath, String fileName, @NotNull File dataFolder) { this.fileName = fileName; @@ -46,17 +45,15 @@ public abstract class ConfigLoader { protected void loadFile() { if (!configFile.exists()) { - mcMMO.p.debug("Creating mcMMO " + fileName + " File..."); + mcMMO.p.getLogger().info("Creating mcMMO " + fileName + " File..."); try { mcMMO.p.saveResource(fileName, false); // Normal files - } - catch (IllegalArgumentException ex) { + } catch (IllegalArgumentException ex) { mcMMO.p.saveResource(configFile.getParentFile().getName() + File.separator + fileName, false); // Mod files } - } - else { - mcMMO.p.debug("Loading mcMMO " + fileName + " File..."); + } else { + mcMMO.p.getLogger().info("Loading mcMMO " + fileName + " File..."); } config = YamlConfiguration.loadConfiguration(configFile); @@ -79,8 +76,7 @@ public abstract class ConfigLoader { protected void validate() { if (validateKeys()) { mcMMO.p.debug("No errors found in " + fileName + "!"); - } - else { + } else { mcMMO.p.getLogger().warning("Errors were found in " + fileName + "! mcMMO was disabled!"); mcMMO.p.getServer().getPluginManager().disablePlugin(mcMMO.p); mcMMO.p.noErrorsInConfigFiles = false; diff --git a/src/main/java/com/gmail/nossr50/config/CoreSkillsConfig.java b/src/main/java/com/gmail/nossr50/config/CoreSkillsConfig.java index 4a10cdf2a..f92990ad6 100644 --- a/src/main/java/com/gmail/nossr50/config/CoreSkillsConfig.java +++ b/src/main/java/com/gmail/nossr50/config/CoreSkillsConfig.java @@ -4,28 +4,26 @@ import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.datatypes.skills.subskills.AbstractSubSkill; 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 protected void loadKeys() { } - public static CoreSkillsConfig getInstance() - { - if(instance == null) - return new CoreSkillsConfig(); - - return instance; - } - @Override protected boolean validateKeys() { @@ -39,21 +37,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 index 6e2dbd572..fb86a42f4 100644 --- a/src/main/java/com/gmail/nossr50/config/GeneralConfig.java +++ b/src/main/java/com/gmail/nossr50/config/GeneralConfig.java @@ -18,7 +18,7 @@ import java.util.List; import java.util.Locale; import java.util.Set; -public class GeneralConfig extends AutoUpdateConfigLoader { +public class GeneralConfig extends BukkitConfig { public GeneralConfig(@NotNull File dataFolder) { super("config.yml", dataFolder); @@ -159,99 +159,264 @@ public class GeneralConfig extends AutoUpdateConfigLoader { */ /* General Settings */ - public boolean getIsMetricsEnabled() { return config.getBoolean("Metrics.bstats", true); } + 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 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 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 getMatchOfflinePlayers() { + return config.getBoolean("Commands.Generic.Match_OfflinePlayers", false); + } - public boolean getLevelUpSoundsEnabled() { return config.getBoolean("General.LevelUp_Sounds", true); } - public boolean getRefreshChunksEnabled() { return config.getBoolean("General.Refresh_Chunks", false); } + public long getDatabasePlayerCooldown() { + return config.getLong("Commands.Database.Player_Cooldown", 1750); + } - public boolean getMobHealthbarEnabled() { return config.getBoolean("Mob_Healthbar.Enabled", true); } + 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) { + } catch (IllegalArgumentException ex) { return MobHealthbarType.HEARTS; } } - public int getMobHealthbarTime() { return Math.max(1, config.getInt("Mob_Healthbar.Display_Time", 3)); } + 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 getScoreboardsEnabled() { + return config.getBoolean("Scoreboard.UseScoreboards", 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 getPowerLevelTagsEnabled() { + return config.getBoolean("Scoreboard.Power_Level_Tags", false); + } - 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 getAllowKeepBoard() { + return config.getBoolean("Scoreboard.Allow_Keep", true); + } - 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 int getTipsAmount() { + return config.getInt("Scoreboard.Tips_Amount", 5); + } - 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 getShowStatsAfterLogin() { + return config.getBoolean("Scoreboard.Show_Stats_After_Login", false); + } - 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 getScoreboardRainbows() { + return config.getBoolean("Scoreboard.Rainbows", false); + } - 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); } + 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); } + 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); } + 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); } + 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); @@ -267,113 +432,279 @@ public class GeneralConfig extends AutoUpdateConfigLoader { } /* 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 boolean getHardcoreStatLossEnabled(PrimarySkillType primarySkillType) { + return config.getBoolean("Hardcore.Death_Stat_Loss.Enabled." + StringUtils.getCapitalized(primarySkillType.toString()), false); + } - 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 void setHardcoreStatLossEnabled(PrimarySkillType primarySkillType, boolean enabled) { + config.set("Hardcore.Death_Stat_Loss.Enabled." + StringUtils.getCapitalized(primarySkillType.toString()), enabled); + } - public int getHardcoreDeathStatPenaltyLevelThreshold() { return config.getInt("Hardcore.Death_Stat_Loss.Level_Threshold", 0); } + public double getHardcoreDeathStatPenaltyPercentage() { + return config.getDouble("Hardcore.Death_Stat_Loss.Penalty_Percentage", 75.0D); + } - 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 void setHardcoreDeathStatPenaltyPercentage(double value) { + config.set("Hardcore.Death_Stat_Loss.Penalty_Percentage", value); + } - 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 getHardcoreDeathStatPenaltyLevelThreshold() { + return config.getInt("Hardcore.Death_Stat_Loss.Level_Threshold", 0); + } - public int getHardcoreVampirismLevelThreshold() { return config.getInt("Hardcore.Vampirism.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); } + 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 int getChimaeraUseCost() { + return config.getInt("Items.Chimaera_Wing.Use_Cost", 1); + } - public boolean getFluxPickaxeSoundEnabled() { return config.getBoolean("Items.Flux_Pickaxe.Sound_Enabled", true); } + 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 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 boolean getPartyFriendlyFire() { + return config.getBoolean("Party.FriendlyFire", false); + } - 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 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 getPartyXpCurveMultiplier() { + return config.getInt("Party.Leveling.Xp_Curve_Modifier", 3); + } - public int getPartyFeatureUnlockLevel(PartyFeature partyFeature) { return config.getInt("Party.Leveling." + StringUtils.getPrettyPartyFeatureString(partyFeature).replace(" ", "") + "_UnlockLevel", 0); } + 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); } + 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); } + 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 boolean getUrlLinksEnabled() { + return config.getBoolean("Commands.Skills.URL_Links"); + } - 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()); } + 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); } + public int getAbilityToolDamage() { + return config.getInt("Abilities.Tools.Durability_Loss", 1); + } /* Thresholds */ - public int getTreeFellerThreshold() { return config.getInt("Abilities.Limits.Tree_Feller_Threshold", 1000); } + 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")) + if (material.toString().equalsIgnoreCase("LILY_PAD")) return false; return config.getBoolean("Bonus_Drops." + StringUtils.getCapitalized(skill.toString()) + "." + StringUtils.getPrettyItemString(material).replace(" ", "_")); @@ -398,54 +729,134 @@ public class GeneralConfig extends AutoUpdateConfigLoader { } /* Axes */ - public int getAxesGate() { return config.getInt("Skills.Axes.Ability_Activation_Level_Gate", 10); } + 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); } + 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); } + 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); } + 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")); } + 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); } + 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); } + 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); } + 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); } + 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); } + 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")); } @@ -454,19 +865,43 @@ public class GeneralConfig extends AutoUpdateConfigLoader { // 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); } + 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); } + 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); } + public boolean getHerbalismPreventAFK() { + return config.getBoolean("Skills.Herbalism.Prevent_AFK_Leveling", true); + } /* Level Caps */ public int getPowerLevelCap() { @@ -484,33 +919,88 @@ public class GeneralConfig extends AutoUpdateConfigLoader { return config.getInt("Skills." + StringUtils.getCapitalized(skill.toString()) + ".Ability_Activation_Level_Gate"); }*/ - public boolean getTruncateSkills() { return config.getBoolean("General.TruncateSkills", false); } + 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 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 broadcastEventMessages() { + return config.getBoolean("General.EventBroadcasts", 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 playerJoinEventInfo() { + return config.getBoolean("General.EventInfoOnPlayerJoin", true); + } - 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 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/PersistentDataConfig.java b/src/main/java/com/gmail/nossr50/config/PersistentDataConfig.java index 2f9a23066..11b605eaa 100644 --- a/src/main/java/com/gmail/nossr50/config/PersistentDataConfig.java +++ b/src/main/java/com/gmail/nossr50/config/PersistentDataConfig.java @@ -2,7 +2,7 @@ package com.gmail.nossr50.config; import com.gmail.nossr50.util.compat.layers.persistentdata.MobMetaFlagType; -public class PersistentDataConfig extends AutoUpdateConfigLoader { +public class PersistentDataConfig extends BukkitConfig { private static PersistentDataConfig instance; private PersistentDataConfig() { diff --git a/src/main/java/com/gmail/nossr50/config/RankConfig.java b/src/main/java/com/gmail/nossr50/config/RankConfig.java index d164d64ca..003b27a4d 100644 --- a/src/main/java/com/gmail/nossr50/config/RankConfig.java +++ b/src/main/java/com/gmail/nossr50/config/RankConfig.java @@ -12,26 +12,24 @@ import java.util.List; public class RankConfig extends AutoUpdateConfigLoader { private static RankConfig instance; - public RankConfig() - { + public RankConfig() { super("skillranks.yml"); validate(); instance = this; } - @Override - protected void loadKeys() { - - } - - public static RankConfig getInstance() - { - if(instance == null) + public static RankConfig getInstance() { + if (instance == null) return new RankConfig(); return instance; } + @Override + protected void loadKeys() { + + } + @Override protected boolean validateKeys() { List reason = new ArrayList<>(); @@ -46,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); @@ -59,33 +58,37 @@ 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, boolean retroMode) - { + 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 + * @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(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) { @@ -127,60 +130,55 @@ public class RankConfig extends AutoUpdateConfigLoader { String key = getRankAddressKey(subSkillType, rank, retroMode); int defaultValue = getInternalConfig().getInt(key); config.set(key, defaultValue); - mcMMO.p.getLogger().info(key +" SET -> " + defaultValue); + mcMMO.p.getLogger().info(key + " SET -> " + defaultValue); } /** * Checks for valid keys for subskill ranks */ - private void checkKeys(@NotNull List reasons) - { + private void checkKeys(@NotNull List reasons) { HashSet badSkillSetup = new HashSet<>(); - + //For now we will only check ranks of stuff I've overhauled checkConfig(reasons, badSkillSetup, true); checkConfig(reasons, badSkillSetup, false); //Fix bad entries - if(badSkillSetup.isEmpty()) + 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()); + 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()) - { + 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++) - { - int index = x+1; + for (int x = 0; x < subSkillType.getNumRanks(); x++) { + int index = x + 1; - if(curRank > 0) + if (curRank > 0) prevRank = curRank; curRank = getSubSkillUnlockLevel(subSkillType, index, retroMode); //Do we really care if its below 0? Probably not - if(curRank < 0) - { - reasons.add("(CONFIG ISSUE) " + subSkillType.toString() + " should not have any ranks that require a negative level!"); + 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 - mcMMO.p.getLogger().info("(CONFIG ISSUE) 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); } } @@ -188,9 +186,8 @@ public class RankConfig extends AutoUpdateConfigLoader { } private void fixBadEntries(@NotNull SubSkillType subSkillType) { - for(int x = 0; x < subSkillType.getNumRanks(); x++) - { - int index = x+1; + for (int x = 0; x < subSkillType.getNumRanks(); x++) { + int index = x + 1; //Reset Retromode entries resetRankValue(subSkillType, index, true); diff --git a/src/main/java/com/gmail/nossr50/config/SoundConfig.java b/src/main/java/com/gmail/nossr50/config/SoundConfig.java index 61960803d..e19ad7f44 100644 --- a/src/main/java/com/gmail/nossr50/config/SoundConfig.java +++ b/src/main/java/com/gmail/nossr50/config/SoundConfig.java @@ -3,45 +3,39 @@ 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(); instance = this; } + public static SoundConfig getInstance() { + if (instance == null) + return new SoundConfig(); + + return instance; + } + @Override protected void loadKeys() { } - 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) - { - mcMMO.p.getLogger().info("[mcMMO] Sound volume cannot be below 0 for "+soundType.toString()); + 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); return false; } //Sounds with custom pitching don't use pitch values - if(!soundType.usesCustomPitch()) - { - if(config.getDouble("Sounds."+soundType.toString()+".Pitch") < 0) - { - mcMMO.p.getLogger().info("[mcMMO] Sound pitch cannot be below 0 for "+soundType.toString()); + if (!soundType.usesCustomPitch()) { + if (config.getDouble("Sounds." + soundType + ".Pitch") < 0) { + mcMMO.p.getLogger().info("[mcMMO] Sound pitch cannot be below 0 for " + soundType); return false; } } @@ -49,23 +43,22 @@ public class SoundConfig extends AutoUpdateConfigLoader { 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 f0fd6bd2b..44ec42530 100644 --- a/src/main/java/com/gmail/nossr50/config/WorldBlacklist.java +++ b/src/main/java/com/gmail/nossr50/config/WorldBlacklist.java @@ -15,20 +15,28 @@ public class WorldBlacklist { 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(); @@ -48,12 +56,11 @@ public class WorldBlacklist { 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); } @@ -66,11 +73,11 @@ public class WorldBlacklist { closeRead(fileReader); } - plugin.getLogger().info(blacklist.size()+" entries in mcMMO World Blacklist"); + plugin.getLogger().info(blacklist.size() + " entries in mcMMO World Blacklist"); } private void closeRead(Reader reader) { - if(reader != null) { + if (reader != null) { try { reader.close(); } catch (IOException e) { @@ -78,16 +85,4 @@ public class WorldBlacklist { } } } - - public static boolean isWorldBlacklisted(World world) - { - - for(String s : blacklist) - { - if(world.getName().equalsIgnoreCase(s)) - return true; - } - - 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 ac47887c4..d10145212 100644 --- a/src/main/java/com/gmail/nossr50/config/experience/ExperienceConfig.java +++ b/src/main/java/com/gmail/nossr50/config/experience/ExperienceConfig.java @@ -1,6 +1,6 @@ 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; @@ -17,7 +17,7 @@ import org.bukkit.entity.EntityType; import java.util.ArrayList; import java.util.List; -public class ExperienceConfig extends AutoUpdateConfigLoader { +public class ExperienceConfig extends BukkitConfig { private static ExperienceConfig instance; private ExperienceConfig() { @@ -34,7 +34,8 @@ public class ExperienceConfig extends AutoUpdateConfigLoader { } @Override - protected void loadKeys() {} + protected void loadKeys() { + } @Override protected boolean validateKeys() { @@ -139,84 +140,182 @@ public class ExperienceConfig extends AutoUpdateConfigLoader { 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 isNPCInteractionPrevented() { return config.getBoolean("ExploitFix.PreventPluginNPCInteraction", true); } + public boolean isSnowExploitPrevented() { + return config.getBoolean("ExploitFix.SnowGolemExcavation", 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 isEndermanEndermiteFarmingPrevented() { + return config.getBoolean("ExploitFix.EndermanEndermiteFarms", true); + } - public boolean isAcrobaticsExploitingPrevented() { return config.getBoolean("ExploitFix.Acrobatics", true); } - public boolean isTreeFellerXPReduced() { return config.getBoolean("ExploitFix.TreeFellerReducedXP", 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 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); } + 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 material) - { + 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")) + if (material.toString().equalsIgnoreCase("LILY_PAD")) return 0; String baseString = "Experience_Values." + StringUtils.getCapitalized(skill.toString()) + "."; @@ -233,8 +332,7 @@ public class ExperienceConfig extends AutoUpdateConfigLoader { } /* 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()) + "."; @@ -251,8 +349,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()) + "."; @@ -269,8 +366,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)) @@ -284,8 +380,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)) @@ -297,8 +392,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)) @@ -314,32 +408,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; } @@ -347,13 +444,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; } @@ -362,29 +457,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 94c30580a..0d456b588 100644 --- a/src/main/java/com/gmail/nossr50/config/mods/CustomArmorConfig.java +++ b/src/main/java/com/gmail/nossr50/config/mods/CustomArmorConfig.java @@ -14,14 +14,12 @@ import java.util.List; import java.util.Set; public class CustomArmorConfig extends ConfigLoader { - private boolean needsUpdate = false; - - public List customBoots = new ArrayList<>(); + public List customBoots = new ArrayList<>(); public List customChestplates = new ArrayList<>(); - public List customHelmets = new ArrayList<>(); - public List customLeggings = new ArrayList<>(); - + public List customHelmets = new ArrayList<>(); + public List customLeggings = new ArrayList<>(); public List repairables = new ArrayList<>(); + private boolean needsUpdate = false; protected CustomArmorConfig(String fileName) { super("mods", fileName); 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 881b483fe..3d96ba7f9 100644 --- a/src/main/java/com/gmail/nossr50/config/mods/CustomBlockConfig.java +++ b/src/main/java/com/gmail/nossr50/config/mods/CustomBlockConfig.java @@ -12,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); @@ -85,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 64155043d..27cfb1fd9 100644 --- a/src/main/java/com/gmail/nossr50/config/mods/CustomEntityConfig.java +++ b/src/main/java/com/gmail/nossr50/config/mods/CustomEntityConfig.java @@ -11,7 +11,7 @@ import java.util.HashMap; public class CustomEntityConfig extends ConfigLoader { public HashMap customEntityClassMap = new HashMap<>(); - public HashMap customEntityTypeMap = new HashMap<>(); + public HashMap customEntityTypeMap = new HashMap<>(); protected CustomEntityConfig(String fileName) { super("mods", fileName); @@ -31,8 +31,7 @@ public class CustomEntityConfig extends ConfigLoader { try { clazz = ClassUtils.getClass(className); - } - catch (ClassNotFoundException e) { + } catch (ClassNotFoundException e) { mcMMO.p.getLogger().warning("Invalid class (" + className + ") detected for " + entityName + "."); mcMMO.p.getLogger().warning("This custom entity may not function properly."); } 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 28dd85b58..4ec07e220 100644 --- a/src/main/java/com/gmail/nossr50/config/mods/CustomToolConfig.java +++ b/src/main/java/com/gmail/nossr50/config/mods/CustomToolConfig.java @@ -16,18 +16,15 @@ import java.util.List; import java.util.Set; public class CustomToolConfig extends ConfigLoader { - private boolean needsUpdate = false; - - public List customAxes = new ArrayList<>(); - public List customBows = new ArrayList<>(); - public List customHoes = new ArrayList<>(); + 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 List customShovels = new ArrayList<>(); + public List customSwords = new ArrayList<>(); public HashMap customToolMap = new HashMap<>(); - public List repairables = new ArrayList<>(); + private boolean needsUpdate = false; protected CustomToolConfig(String fileName) { super("mods", fileName); 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 6864b71e6..f36a9d24b 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.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() { @@ -40,5 +40,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 bc2ae7417..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 @@ -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,7 +129,7 @@ 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) { @@ -155,18 +154,16 @@ 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; if (potion_section.contains("Color")) { color = Color.fromRGB(potion_section.getInt("Color")); - } - else { + } else { color = this.generateColor(effects); } @@ -176,16 +173,14 @@ public class PotionConfig extends ConfigLoader { 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,7 +247,7 @@ public class PotionConfig extends ConfigLoader { } return null; } - + public Color generateColor(List effects) { if (effects != null && !effects.isEmpty()) { List colors = new ArrayList<>(); @@ -270,7 +265,7 @@ public class PotionConfig extends ConfigLoader { } return null; } - + public Color calculateAverageColor(List colors) { int red = 0; int green = 0; @@ -280,7 +275,7 @@ public class PotionConfig extends ConfigLoader { green += color.getGreen(); blue += color.getBlue(); } - return Color.fromRGB(red/colors.size(), green/colors.size(), blue/colors.size()); + 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 02066fc98..604a18e9c 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; @@ -13,9 +13,9 @@ import org.bukkit.inventory.ItemStack; import java.util.*; -public class RepairConfig extends ConfigLoader { - private List repairables; +public class RepairConfig extends BukkitConfig { private final HashSet notSupported; + private List repairables; public RepairConfig(String fileName) { super(fileName); @@ -62,33 +62,25 @@ 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) { + } catch (IllegalArgumentException ex) { reason.add(key + " has an invalid MaterialType of " + repairMaterialTypeString); } } @@ -122,16 +114,13 @@ 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) { + } catch (IllegalArgumentException ex) { reason.add(key + " has an invalid ItemType of " + repairItemTypeString); } } @@ -146,7 +135,7 @@ public class RepairConfig extends ConfigLoader { // Minimum Quantity int minimumQuantity = config.getInt("Repairables." + key + ".MinimumQuantity"); - if(minimumQuantity == 0) { + if (minimumQuantity == 0) { minimumQuantity = -1; } @@ -158,13 +147,13 @@ public class RepairConfig extends ConfigLoader { //Report unsupported StringBuilder stringBuilder = new StringBuilder(); - if(notSupported.size() > 0) { + 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()) { + if (!iterator.hasNext()) { stringBuilder.append(unsupportedMaterial); } else { stringBuilder.append(unsupportedMaterial).append(", "); 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 da02f5fe2..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 @@ -1,28 +1,28 @@ package com.gmail.nossr50.config.skills.repair; -import com.gmail.nossr50.datatypes.database.UpgradeType; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.skills.repair.repairables.Repairable; -import com.gmail.nossr50.util.FixSpellingNetheriteUtil; 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; } @@ -33,19 +33,12 @@ public class RepairConfigManager { continue; } - - if(mcMMO.getUpgradeManager().shouldUpgrade(UpgradeType.FIX_SPELLING_NETHERITE_REPAIR)) { - //Check spelling mistakes (early versions of 1.16 support had Netherite misspelled) - plugin.getLogger().info("Checking for certain invalid material names in Repair config..."); - FixSpellingNetheriteUtil.processFileCheck(mcMMO.p, fileName, UpgradeType.FIX_SPELLING_NETHERITE_REPAIR); - } - RepairConfig rConfig = new RepairConfig(fileName); repairables.addAll(rConfig.getLoadedRepairables()); } } - 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 47bc7acea..c8700274d 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,6 @@ 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; @@ -16,9 +16,9 @@ import org.bukkit.inventory.ItemStack; 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); @@ -28,7 +28,7 @@ public class SalvageConfig extends ConfigLoader { @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); @@ -40,9 +40,9 @@ public class SalvageConfig extends ConfigLoader { //Original version of 1.16 support had maximum quantities that were bad, this fixes it - if(mcMMO.getUpgradeManager().shouldUpgrade(UpgradeType.FIX_NETHERITE_SALVAGE_QUANTITIES)) { + 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()) { + for (String namespacedkey : mcMMO.getMaterialMapStore().getNetheriteArmor()) { config.set("Salvageables." + namespacedkey.toUpperCase() + ".MaximumQuantity", 4); //TODO: Doesn't make sense to default to 4 for everything } @@ -78,33 +78,25 @@ 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.NETHERITE; } - } - else { + } else { try { salvageMaterialType = MaterialType.valueOf(salvageMaterialTypeString.replace(" ", "_").toUpperCase(Locale.ENGLISH)); - } - catch (IllegalArgumentException ex) { + } catch (IllegalArgumentException ex) { reason.add(key + " has an invalid MaterialType of " + salvageMaterialTypeString); } } @@ -130,16 +122,13 @@ 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) { + } catch (IllegalArgumentException ex) { reason.add(key + " has an invalid ItemType of " + salvageItemTypeString); } } @@ -176,13 +165,13 @@ public class SalvageConfig extends ConfigLoader { //Report unsupported StringBuilder stringBuilder = new StringBuilder(); - if(notSupported.size() > 0) { + 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()) { + if (!iterator.hasNext()) { stringBuilder.append(unsupportedMaterial); } else { stringBuilder.append(unsupportedMaterial).append(", "); @@ -194,8 +183,8 @@ public class SalvageConfig extends ConfigLoader { } } - protected List getLoadedSalvageables() { - return salvageables == null ? new ArrayList<>() : salvageables; + protected Collection getLoadedSalvageables() { + return salvageables == null ? new HashSet<>() : salvageables; } private boolean noErrorsInSalvageable(List issues) { 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 21189ec0f..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 @@ -1,9 +1,7 @@ package com.gmail.nossr50.config.skills.salvage; -import com.gmail.nossr50.datatypes.database.UpgradeType; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.skills.salvage.salvageables.Salvageable; -import com.gmail.nossr50.util.FixSpellingNetheriteUtil; import java.io.File; import java.util.ArrayList; @@ -11,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; } @@ -33,20 +34,12 @@ public class SalvageConfigManager { continue; } - - if(mcMMO.getUpgradeManager().shouldUpgrade(UpgradeType.FIX_SPELLING_NETHERITE_SALVAGE)) { - //Check spelling mistakes (early versions of 1.16 support had Netherite misspelled) - plugin.getLogger().info("Checking for certain invalid material names in Salvage config..."); - FixSpellingNetheriteUtil.processFileCheck(mcMMO.p, fileName, UpgradeType.FIX_SPELLING_NETHERITE_SALVAGE); - } - - SalvageConfig salvageConfig = new SalvageConfig(fileName); salvageables.addAll(salvageConfig.getLoadedSalvageables()); } } 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 index dc129344d..1a9dd41c5 100755 --- a/src/main/java/com/gmail/nossr50/config/treasure/FishingTreasureConfig.java +++ b/src/main/java/com/gmail/nossr50/config/treasure/FishingTreasureConfig.java @@ -1,6 +1,6 @@ package com.gmail.nossr50.config.treasure; -import com.gmail.nossr50.config.ConfigLoader; +import com.gmail.nossr50.config.BukkitConfig; import com.gmail.nossr50.datatypes.treasure.*; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.EnchantmentUtils; @@ -18,14 +18,14 @@ import org.jetbrains.annotations.NotNull; import java.util.*; -public class FishingTreasureConfig extends ConfigLoader { +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> fishingRewards = new HashMap<>(); public @NotNull HashMap> fishingEnchantments = new HashMap<>(); - public @NotNull HashMap> shakeMap = new HashMap<>(); + public @NotNull HashMap> shakeMap = new HashMap<>(); private FishingTreasureConfig() { super(FILENAME); @@ -45,33 +45,39 @@ public class FishingTreasureConfig extends ConfigLoader { 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; + ConfigurationSection enchantment_drop_rates = config.getConfigurationSection("Enchantment_Drop_Rates"); - 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(enchantment_drop_rates != null) { + for (String tier : enchantment_drop_rates.getKeys(false)) { + double totalEnchantDropRate = 0; + double totalItemDropRate = 0; - if ((enchantDropRate < 0.0 || enchantDropRate > 100.0)) { - reason.add("The enchant drop rate for " + tier + " items that are " + rarity.toString() + "should be between 0.0 and 100.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)) { + reason.add("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) { + reason.add("The item drop rate for " + tier + " items that are " + rarity + "should be between 0.0 and 100.0!"); + } + + totalEnchantDropRate += enchantDropRate; + totalItemDropRate += itemDropRate; } - 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!"); + if (totalEnchantDropRate < 0 || totalEnchantDropRate > 100.0) { + reason.add("The total enchant drop rate for " + tier + " 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!"); + if (totalItemDropRate < 0 || totalItemDropRate > 100.0) { + reason.add("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."); } return noErrorsInConfig(reason); @@ -89,7 +95,7 @@ public class FishingTreasureConfig extends ConfigLoader { for (EntityType entity : EntityType.values()) { if (entity.isAlive()) { - loadTreasures("Shake." + entity.toString()); + loadTreasures("Shake." + entity); } } } @@ -175,7 +181,7 @@ public class FishingTreasureConfig extends ConfigLoader { if (isFishing) { String rarityStr = config.getString(type + "." + treasureName + ".Rarity"); - if(rarityStr != null) { + if (rarityStr != null) { rarity = Rarity.getRarity(rarityStr); } else { mcMMO.p.getLogger().severe("Please edit your config and add a Rarity definition for - " + treasureName); @@ -192,7 +198,7 @@ public class FishingTreasureConfig extends ConfigLoader { String customName = null; - if(hasCustomName(type, treasureName)) { + if (hasCustomName(type, treasureName)) { customName = config.getString(type + "." + treasureName + ".Custom_Name"); } @@ -204,7 +210,7 @@ public class FishingTreasureConfig extends ConfigLoader { item = new ItemStack(mat, amount, data); PotionMeta itemMeta = (PotionMeta) item.getItemMeta(); - if(itemMeta == null) { + if (itemMeta == null) { mcMMO.p.getLogger().severe("Item meta when adding potion to fishing treasure was null, contact the mcMMO devs!"); continue; } @@ -232,7 +238,7 @@ public class FishingTreasureConfig extends ConfigLoader { } item.setItemMeta(itemMeta); } - } else if(material == Material.ENCHANTED_BOOK) { + } 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(); @@ -276,7 +282,6 @@ public class FishingTreasureConfig extends ConfigLoader { } - if (noErrorsInConfig(reason)) { if (isFishing) { addFishingTreasure(rarity, new FishingTreasure(item, xp)); @@ -307,26 +312,27 @@ public class FishingTreasureConfig extends ConfigLoader { /** * 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()) { + if (enchantListStr.isEmpty()) { return; } - for(String str : enchantListStr) { + for (String str : enchantListStr) { boolean foundMatch = false; - for(Enchantment enchantment : Enchantment.values()) { - if(enchantment.getKey().getKey().equalsIgnoreCase(str)) { + 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); + if (!foundMatch) { + mcMMO.p.getLogger().info("[Fishing Treasure Init] Could not find any enchantments which matched the user defined enchantment named: " + str); } } } @@ -344,7 +350,7 @@ public class FishingTreasureConfig extends ConfigLoader { } for (String enchantmentName : enchantmentSection.getKeys(false)) { - int level = config.getInt("Enchantments_Rarity." + rarity.toString() + "." + enchantmentName); + int level = config.getInt("Enchantments_Rarity." + rarity + "." + enchantmentName); Enchantment enchantment = EnchantmentUtils.getByName(enchantmentName); if (enchantment == null) { @@ -374,10 +380,10 @@ public class FishingTreasureConfig extends ConfigLoader { } public double getItemDropRate(int tier, @NotNull Rarity rarity) { - return config.getDouble("Item_Drop_Rates.Tier_" + tier + "." + rarity.toString()); + 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.toString()); + 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 eb9030d71..1827188dd 100755 --- a/src/main/java/com/gmail/nossr50/config/treasure/TreasureConfig.java +++ b/src/main/java/com/gmail/nossr50/config/treasure/TreasureConfig.java @@ -1,6 +1,6 @@ package com.gmail.nossr50.config.treasure; -import com.gmail.nossr50.config.ConfigLoader; +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; @@ -20,7 +20,7 @@ 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"; @@ -32,7 +32,7 @@ public class TreasureConfig extends ConfigLoader { private static TreasureConfig instance; public HashMap> excavationMap = new HashMap<>(); - public HashMap> hylianMap = new HashMap<>(); + public HashMap> hylianMap = new HashMap<>(); private TreasureConfig() { super(FILENAME); @@ -115,32 +115,32 @@ public class TreasureConfig extends ConfigLoader { DropLevelKeyConversionType conversionType; //Check for legacy drop level values and convert - if(getWrongKeyValue(type, treasureName, DropLevelKeyConversionType.LEGACY) != -1) { + 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) { + 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) { + 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()) { + 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) { + if (dropLevel == -1) { mcMMO.p.getLogger().severe("Could not find a Level_Requirement entry for treasure " + treasureName); mcMMO.p.getLogger().severe("Skipping treasure"); continue; @@ -258,7 +258,7 @@ public class TreasureConfig extends ConfigLoader { } //Apply our fix - if(shouldWeUpdateFile) { + if (shouldWeUpdateFile) { try { config.save(getFile()); } catch (IOException e) { @@ -283,7 +283,7 @@ public class TreasureConfig extends ConfigLoader { 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) { + 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 } @@ -295,7 +295,7 @@ public class TreasureConfig extends ConfigLoader { 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) { + if (wrongKeyValueRetro != -1) { config.set(type + "." + treasureName + LEVEL_REQUIREMENT_RETRO_MODE, wrongKeyValueRetro); } @@ -306,22 +306,12 @@ public class TreasureConfig extends ConfigLoader { } private int getWrongKeyValue(String type, String treasureName, DropLevelKeyConversionType dropLevelKeyConversionType) { - switch (dropLevelKeyConversionType) { - case LEGACY: - return config.getInt(type + "." + treasureName + LEGACY_DROP_LEVEL, -1); - case WRONG_KEY_STANDARD: - return config.getInt(type + "." + treasureName + WRONG_KEY_VALUE_STANDARD, -1); - case WRONG_KEY_RETRO: - return config.getInt(type + "." + treasureName + WRONG_KEY_VALUE_RETRO, -1); - } + 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); + }; - return -1; - } - - private enum DropLevelKeyConversionType { - LEGACY, - WRONG_KEY_STANDARD, - WRONG_KEY_RETRO } private void AddHylianTreasure(String dropper, HylianTreasure treasure) { @@ -329,4 +319,10 @@ public class TreasureConfig extends ConfigLoader { hylianMap.put(dropper, new ArrayList<>()); hylianMap.get(dropper).add(treasure); } + + private enum DropLevelKeyConversionType { + LEGACY, + WRONG_KEY_STANDARD, + WRONG_KEY_RETRO + } } diff --git a/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java index dc1b40855..6733680c1 100644 --- a/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java @@ -120,7 +120,6 @@ public final class FlatFileDatabaseManager implements DatabaseManager { BufferedReader in = null; FileWriter out = null; - // This code is O(n) instead of O(n²) synchronized (fileWritingLock) { try { in = new BufferedReader(new FileReader(usersFilePath)); diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index 6656f4512..28e78225c 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -578,7 +578,7 @@ public class mcMMO extends JavaPlugin { // Load salvage configs, make manager and register them at this time SalvageConfigManager sManager = new SalvageConfigManager(this); - List salvageables = new ArrayList<>(sManager.getLoadedSalvageables()); + List salvageables = sManager.getLoadedSalvageables(); salvageableManager = new SimpleSalvageableManager(salvageables.size()); salvageableManager.registerSalvageables(salvageables); } 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 4944fb97c..ae4360de7 100644 --- a/src/main/java/com/gmail/nossr50/skills/child/ChildConfig.java +++ b/src/main/java/com/gmail/nossr50/skills/child/ChildConfig.java @@ -1,6 +1,6 @@ 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.mcMMO; import com.gmail.nossr50.util.text.StringUtils; @@ -9,7 +9,7 @@ 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(); 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 42bc3cdea..203244107 100644 --- a/src/main/java/com/gmail/nossr50/skills/repair/RepairManager.java +++ b/src/main/java/com/gmail/nossr50/skills/repair/RepairManager.java @@ -33,8 +33,6 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Objects; import java.util.Optional; -import java.util.stream.Collector; -import java.util.stream.Collectors; public class RepairManager extends SkillManager { private boolean placedAnvil; 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 64ea51da3..5ae2032c6 100644 --- a/src/main/java/com/gmail/nossr50/util/experience/ExperienceBarWrapper.java +++ b/src/main/java/com/gmail/nossr50/util/experience/ExperienceBarWrapper.java @@ -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/upgrade/UpgradeManager.java b/src/main/java/com/gmail/nossr50/util/upgrade/UpgradeManager.java index 3ed01d378..2325b2800 100644 --- a/src/main/java/com/gmail/nossr50/util/upgrade/UpgradeManager.java +++ b/src/main/java/com/gmail/nossr50/util/upgrade/UpgradeManager.java @@ -1,6 +1,6 @@ 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; @@ -8,7 +8,7 @@ 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() { 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/repair.vanilla.yml b/src/main/resources/repair.vanilla.yml index c7d5735e4..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 diff --git a/src/test/java/com/gmail/nossr50/util/blockmeta/ChunkStoreTest.java b/src/test/java/com/gmail/nossr50/util/blockmeta/ChunkStoreTest.java index 1e0c209fe..969de6ec4 100644 --- a/src/test/java/com/gmail/nossr50/util/blockmeta/ChunkStoreTest.java +++ b/src/test/java/com/gmail/nossr50/util/blockmeta/ChunkStoreTest.java @@ -3,8 +3,6 @@ package com.gmail.nossr50.util.blockmeta; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.BlockUtils; -import com.gmail.nossr50.util.compat.CompatibilityManager; -import com.gmail.nossr50.util.platform.PlatformManager; import com.google.common.io.Files; import org.bukkit.Bukkit; import org.bukkit.World; From 3e645a022de3ff388d4436887ec44b761379cf6e Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 10 Jan 2022 22:34:21 -0800 Subject: [PATCH 651/662] 2.1.208 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 2ad096872..7cb67a8e0 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.208-SNAPSHOT + 2.1.208 mcMMO https://github.com/mcMMO-Dev/mcMMO From 5d2028b5dc79f26b329a302e8a567eb2399c607b Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 10 Jan 2022 22:36:37 -0800 Subject: [PATCH 652/662] Java 16 compile target --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 7cb67a8e0..b20b94c6c 100755 --- a/pom.xml +++ b/pom.xml @@ -102,7 +102,7 @@ maven-compiler-plugin 3.8.1 - 17 + 16 -parameters From db0ae36fa739256f76f4f70c39a0f0066923f9d8 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 11 Jan 2022 19:22:28 -0800 Subject: [PATCH 653/662] fixed bug where duplicate comments with leading whitespace were ignored --- pom.xml | 2 +- .../gmail/nossr50/config/BukkitConfig.java | 25 +++++++++++++++++-- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index b20b94c6c..7991b0d73 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.208 + 2.1.209-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO diff --git a/src/main/java/com/gmail/nossr50/config/BukkitConfig.java b/src/main/java/com/gmail/nossr50/config/BukkitConfig.java index c14712f43..4feef929e 100644 --- a/src/main/java/com/gmail/nossr50/config/BukkitConfig.java +++ b/src/main/java/com/gmail/nossr50/config/BukkitConfig.java @@ -11,7 +11,9 @@ import java.util.List; import java.util.Set; public abstract class BukkitConfig { - public static final String CURRENT_CONFIG_PATCH_VER = "ConfigPatchVersion: 1"; + public static final String CONFIG_PATCH_PREFIX = "ConfigPatchVersion:"; + public static final String CURRENT_CONFIG_PATCH_VER = "ConfigPatchVersion: 2"; + public static final char COMMENT_PREFIX = '#'; protected final String fileName; protected final File configFile; protected YamlConfiguration config; @@ -149,7 +151,11 @@ public abstract class BukkitConfig { break; } - if (line.startsWith("#")) { + //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 @@ -189,4 +195,19 @@ public abstract class BukkitConfig { 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 From 405de477d314623d644c20bc63b55f6c13d7a1c9 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 11 Jan 2022 19:28:18 -0800 Subject: [PATCH 654/662] (thanks chew) Fix older MC versions not loading config files Fixes #4716 --- src/main/java/com/gmail/nossr50/config/BukkitConfig.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/gmail/nossr50/config/BukkitConfig.java b/src/main/java/com/gmail/nossr50/config/BukkitConfig.java index 4feef929e..ecc4fd60d 100644 --- a/src/main/java/com/gmail/nossr50/config/BukkitConfig.java +++ b/src/main/java/com/gmail/nossr50/config/BukkitConfig.java @@ -62,7 +62,14 @@ public abstract class BukkitConfig { mcMMO.p.getLogger().info("[config] Loading config from disk: " + fileName); YamlConfiguration config = new YamlConfiguration(); config.options().indent(4); - config.options().parseComments(true); + + 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 { From 68ffe312463e3fa05880d75cb2d8179884319e29 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 14 Jan 2022 16:41:33 -0800 Subject: [PATCH 655/662] 2.1.209 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 7991b0d73..50eb1fbd6 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.209-SNAPSHOT + 2.1.209 mcMMO https://github.com/mcMMO-Dev/mcMMO From 2e0a371ed81e0b7cae54398d02849923277e2108 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 14 Jan 2022 16:50:19 -0800 Subject: [PATCH 656/662] Update changelog --- Changelog.txt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Changelog.txt b/Changelog.txt index 825d647e4..a69371b6e 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,10 @@ +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 From 74ced18bd0e259bbaff9d04fcd1ce9b4e9fbed56 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sat, 15 Jan 2022 11:51:44 -0800 Subject: [PATCH 657/662] Dev mode --- Changelog.txt | 2 ++ pom.xml | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index a69371b6e..ee1f53163 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,5 @@ +Version 2.1.210 + Version 2.1.209 Fixed a bug where some config files did not get trimmed completely diff --git a/pom.xml b/pom.xml index 50eb1fbd6..1484101cc 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.209 + 2.1.210-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO From 3be15d3f65fa1054bf827e78e702a0cf352b5f72 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 17 Jan 2022 15:32:02 -0800 Subject: [PATCH 658/662] Rewrite how mob/item/block metadata is tracked/retrieved Fixes #4720 --- Changelog.txt | 5 + .../nossr50/config/PersistentDataConfig.java | 2 +- .../nossr50/listeners/EntityListener.java | 28 +-- src/main/java/com/gmail/nossr50/mcMMO.java | 11 +- .../metadata/BlockMetadataService.java | 49 ++++ .../nossr50/metadata/ItemMetadataService.java | 110 +++++++++ .../nossr50/metadata/MetadataService.java | 71 ++++++ .../MobMetaFlagType.java | 2 +- .../nossr50/metadata/MobMetadataService.java | 187 +++++++++++++++ .../nossr50/skills/taming/TamingManager.java | 4 +- .../nossr50/util/TransientEntityTracker.java | 2 +- .../nossr50/util/TransientMetadataTools.java | 7 +- .../util/compat/CompatibilityManager.java | 23 +- .../AbstractPersistentDataLayer.java | 137 ----------- .../SpigotPersistentDataLayer_1_13.java | 172 -------------- .../SpigotPersistentDataLayer_1_14.java | 220 ------------------ .../nossr50/util/skills/CombatUtils.java | 20 +- .../gmail/nossr50/util/skills/SkillUtils.java | 23 +- .../nossr50/util/skills/SmeltingTracker.java | 4 +- 19 files changed, 477 insertions(+), 600 deletions(-) create mode 100644 src/main/java/com/gmail/nossr50/metadata/BlockMetadataService.java create mode 100644 src/main/java/com/gmail/nossr50/metadata/ItemMetadataService.java create mode 100644 src/main/java/com/gmail/nossr50/metadata/MetadataService.java rename src/main/java/com/gmail/nossr50/{util/compat/layers/persistentdata => metadata}/MobMetaFlagType.java (74%) create mode 100644 src/main/java/com/gmail/nossr50/metadata/MobMetadataService.java delete mode 100644 src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/AbstractPersistentDataLayer.java delete mode 100644 src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer_1_13.java delete mode 100644 src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer_1_14.java diff --git a/Changelog.txt b/Changelog.txt index ee1f53163..9a33c8ee2 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,4 +1,9 @@ Version 2.1.210 + Fixed a memory leak involving mob metadata + + 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 diff --git a/src/main/java/com/gmail/nossr50/config/PersistentDataConfig.java b/src/main/java/com/gmail/nossr50/config/PersistentDataConfig.java index 11b605eaa..089db89b8 100644 --- a/src/main/java/com/gmail/nossr50/config/PersistentDataConfig.java +++ b/src/main/java/com/gmail/nossr50/config/PersistentDataConfig.java @@ -1,6 +1,6 @@ package com.gmail.nossr50.config; -import com.gmail.nossr50.util.compat.layers.persistentdata.MobMetaFlagType; +import com.gmail.nossr50.metadata.MobMetaFlagType; public class PersistentDataConfig extends BukkitConfig { private static PersistentDataConfig instance; diff --git a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java index 6690efab3..14a940763 100644 --- a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java @@ -10,6 +10,8 @@ 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; @@ -19,8 +21,6 @@ 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.*; -import com.gmail.nossr50.util.compat.layers.persistentdata.AbstractPersistentDataLayer; -import com.gmail.nossr50.util.compat.layers.persistentdata.MobMetaFlagType; import com.gmail.nossr50.util.player.NotificationManager; import com.gmail.nossr50.util.player.UserManager; import com.gmail.nossr50.util.random.RandomChanceUtil; @@ -51,7 +51,7 @@ import org.jetbrains.annotations.NotNull; public class EntityListener implements Listener { private final mcMMO pluginRef; - private final @NotNull AbstractPersistentDataLayer persistentDataLayer; + private final @NotNull MobMetadataService mobMetadataService; /** * We can use this {@link NamespacedKey} for {@link Enchantment} comparisons to @@ -61,7 +61,7 @@ public class EntityListener implements Listener { public EntityListener(final mcMMO pluginRef) { this.pluginRef = pluginRef; - persistentDataLayer = mcMMO.getCompatibilityManager().getPersistentDataLayer(); + mobMetadataService = mcMMO.getMetadataService().getMobMetadataService(); } // @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) @@ -94,11 +94,11 @@ public class EntityListener implements Listener { LivingEntity livingEntity = (LivingEntity) event.getEntity(); //Transfer metadata keys from mob-spawned mobs to new mobs - if(persistentDataLayer.hasMobFlags(livingEntity)) { + if(mobMetadataService.hasMobFlags(livingEntity)) { for(Entity entity : event.getTransformedEntities()) { if(entity instanceof LivingEntity) { LivingEntity transformedEntity = (LivingEntity) entity; - persistentDataLayer.addMobFlags(livingEntity, transformedEntity); + mobMetadataService.addMobFlags(livingEntity, transformedEntity); } } } @@ -122,8 +122,8 @@ public class EntityListener implements Listener { if(event.getEntity() instanceof Enderman) { Enderman enderman = (Enderman) event.getEntity(); - if(!persistentDataLayer.hasMobFlag(MobMetaFlagType.EXPLOITED_ENDERMEN, enderman)) { - persistentDataLayer.flagMetadata(MobMetaFlagType.EXPLOITED_ENDERMEN, enderman); + if(!mobMetadataService.hasMobFlag(MobMetaFlagType.EXPLOITED_ENDERMEN, enderman)) { + mobMetadataService.flagMetadata(MobMetaFlagType.EXPLOITED_ENDERMEN, enderman); } } } @@ -729,11 +729,11 @@ public class EntityListener implements Listener { } private void trackSpawnedAndPassengers(LivingEntity livingEntity, MobMetaFlagType mobMetaFlagType) { - persistentDataLayer.flagMetadata(mobMetaFlagType, livingEntity); + mobMetadataService.flagMetadata(mobMetaFlagType, livingEntity); for(Entity passenger : livingEntity.getPassengers()) { if(passenger != null) { - persistentDataLayer.flagMetadata(mobMetaFlagType, livingEntity); + mobMetadataService.flagMetadata(mobMetaFlagType, livingEntity); } } } @@ -741,7 +741,7 @@ public class EntityListener implements Listener { @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) public void onEntityBreed(EntityBreedEvent event) { if(ExperienceConfig.getInstance().isCOTWBreedingPrevented()) { - if(persistentDataLayer.hasMobFlag(MobMetaFlagType.COTW_SUMMONED_MOB, event.getFather()) || persistentDataLayer.hasMobFlag(MobMetaFlagType.COTW_SUMMONED_MOB, event.getMother())) { + 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(); @@ -1007,12 +1007,12 @@ public class EntityListener implements Listener { if (!UserManager.hasPlayerDataKey(player) || (ExperienceConfig.getInstance().isNPCInteractionPrevented() && Misc.isNPCEntityExcludingVillagers(livingEntity)) - || persistentDataLayer.hasMobFlag(MobMetaFlagType.EGG_MOB, livingEntity) - || persistentDataLayer.hasMobFlag(MobMetaFlagType.MOB_SPAWNER_MOB, livingEntity)) { + || mobMetadataService.hasMobFlag(MobMetaFlagType.EGG_MOB, livingEntity) + || mobMetadataService.hasMobFlag(MobMetaFlagType.MOB_SPAWNER_MOB, livingEntity)) { return; } - persistentDataLayer.flagMetadata(MobMetaFlagType.PLAYER_TAMED_MOB, livingEntity); + mobMetadataService.flagMetadata(MobMetaFlagType.PLAYER_TAMED_MOB, livingEntity); //Profile not loaded if(UserManager.getPlayer(player) == null) diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index 28e78225c..8a8d3192b 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -18,6 +18,7 @@ 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.SaveTimerTask; import com.gmail.nossr50.runnables.backups.CleanBackupsTask; @@ -77,8 +78,9 @@ 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; @@ -175,6 +177,9 @@ public class mcMMO extends JavaPlugin { //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)); @@ -466,6 +471,10 @@ public class mcMMO extends JavaPlugin { return platformManager.getCompatibilityManager(); } + public static MetadataService getMetadataService() { + return metadataService; + } + @Deprecated public static void setDatabaseManager(DatabaseManager databaseManager) { mcMMO.databaseManager = databaseManager; 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/util/compat/layers/persistentdata/MobMetaFlagType.java b/src/main/java/com/gmail/nossr50/metadata/MobMetaFlagType.java similarity index 74% rename from src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/MobMetaFlagType.java rename to src/main/java/com/gmail/nossr50/metadata/MobMetaFlagType.java index 1bf5eb2df..618bcd3a3 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/MobMetaFlagType.java +++ b/src/main/java/com/gmail/nossr50/metadata/MobMetaFlagType.java @@ -1,4 +1,4 @@ -package com.gmail.nossr50.util.compat.layers.persistentdata; +package com.gmail.nossr50.metadata; public enum MobMetaFlagType { MOB_SPAWNER_MOB, 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..87af92f4e --- /dev/null +++ b/src/main/java/com/gmail/nossr50/metadata/MobMetadataService.java @@ -0,0 +1,187 @@ +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.*; + +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); + } + } + } + + /** + * Helper method to simplify generating namespaced keys + * + * @param key the {@link String} value of the key + * + * @return the generated {@link NamespacedKey} + */ + private @NotNull NamespacedKey getNamespacedKey(@NotNull String key) { + return new NamespacedKey(mcMMO.p, key); + } + + /** + * 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/skills/taming/TamingManager.java b/src/main/java/com/gmail/nossr50/skills/taming/TamingManager.java index cd5f14545..d51b50291 100644 --- a/src/main/java/com/gmail/nossr50/skills/taming/TamingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/taming/TamingManager.java @@ -10,10 +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.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.compat.layers.persistentdata.MobMetaFlagType; import com.gmail.nossr50.util.player.NotificationManager; import com.gmail.nossr50.util.random.RandomChanceSkillStatic; import com.gmail.nossr50.util.random.RandomChanceUtil; @@ -475,7 +475,7 @@ public class TamingManager extends SkillManager { private void applyMetaDataToCOTWEntity(LivingEntity summonedEntity) { //This helps identify the entity as being summoned by COTW - mcMMO.getCompatibilityManager().getPersistentDataLayer().flagMetadata(MobMetaFlagType.COTW_SUMMONED_MOB, summonedEntity); + mcMMO.getMetadataService().getMobMetadataService().flagMetadata(MobMetaFlagType.COTW_SUMMONED_MOB, summonedEntity); } /** diff --git a/src/main/java/com/gmail/nossr50/util/TransientEntityTracker.java b/src/main/java/com/gmail/nossr50/util/TransientEntityTracker.java index 6e1b44938..e9d2fca83 100644 --- a/src/main/java/com/gmail/nossr50/util/TransientEntityTracker.java +++ b/src/main/java/com/gmail/nossr50/util/TransientEntityTracker.java @@ -273,7 +273,7 @@ public class TransientEntityTracker { } //Remove our metadata - mcMMO.getCompatibilityManager().getPersistentDataLayer().removeMobFlags(livingEntity); + mcMMO.getMetadataService().getMobMetadataService().removeMobFlags(livingEntity); //Clean from trackers unregisterEntity(livingEntity); diff --git a/src/main/java/com/gmail/nossr50/util/TransientMetadataTools.java b/src/main/java/com/gmail/nossr50/util/TransientMetadataTools.java index 15f14c03e..8b21e9d1a 100644 --- a/src/main/java/com/gmail/nossr50/util/TransientMetadataTools.java +++ b/src/main/java/com/gmail/nossr50/util/TransientMetadataTools.java @@ -18,11 +18,6 @@ public class TransientMetadataTools { entity.removeMetadata(MetadataConstants.METADATA_KEY_CUSTOM_NAME, pluginRef); } -// if(entity.hasMetadata(MetadataConstants.METADATA_KEY_OLD_NAME_KEY)) { -// CombatUtils.fixNames(entity); -// entity.removeMetadata(MetadataConstants.METADATA_KEY_OLD_NAME_KEY, 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()); @@ -35,7 +30,7 @@ public class TransientMetadataTools { } //Cleanup mob metadata - mcMMO.getCompatibilityManager().getPersistentDataLayer().removeMobFlags(entity); + 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) { 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 f1f0b185b..063c858c5 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/CompatibilityManager.java +++ b/src/main/java/com/gmail/nossr50/util/compat/CompatibilityManager.java @@ -5,9 +5,6 @@ import com.gmail.nossr50.mcMMO; 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.persistentdata.AbstractPersistentDataLayer; -import com.gmail.nossr50.util.compat.layers.persistentdata.SpigotPersistentDataLayer_1_13; -import com.gmail.nossr50.util.compat.layers.persistentdata.SpigotPersistentDataLayer_1_14; 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; @@ -25,7 +22,7 @@ import java.util.HashMap; * In 2.2 we are switching to modules and that will clean things up significantly * */ -//TODO: I need to rewrite this crap +//TODO: I need to delete this crap public class CompatibilityManager { private @NotNull HashMap supportedLayers; private boolean isFullyCompatibleServerSoftware = true; //true if all compatibility layers load successfully @@ -33,8 +30,6 @@ public class CompatibilityManager { private final @NotNull NMSVersion nmsVersion; /* Compatibility Layers */ -// private PlayerAttackCooldownExploitPreventionLayer playerAttackCooldownExploitPreventionLayer; - private AbstractPersistentDataLayer persistentDataLayer; private AbstractBungeeSerializerCompatibilityLayer bungeeSerializerCompatibilityLayer; private AbstractMasterAnglerCompatibility masterAnglerCompatibility; @@ -64,7 +59,6 @@ public class CompatibilityManager { * For any unsupported layers, load a dummy layer */ private void initCompatibilityLayers() { - initPersistentDataLayer(); initBungeeSerializerLayer(); initMasterAnglerLayer(); @@ -89,17 +83,6 @@ public class CompatibilityManager { supportedLayers.put(CompatibilityType.BUNGEE_SERIALIZER, true); } - private void initPersistentDataLayer() { - if(minecraftGameVersion.isAtLeast(1, 14, 2)) { - persistentDataLayer = new SpigotPersistentDataLayer_1_14(); - } else { - - persistentDataLayer = new SpigotPersistentDataLayer_1_13(); - } - - supportedLayers.put(CompatibilityType.PERSISTENT_DATA, true); - } - //TODO: move to text manager public void reportCompatibilityStatus(@NotNull CommandSender commandSender) { if(isFullyCompatibleServerSoftware) { @@ -171,10 +154,6 @@ public class CompatibilityManager { return bungeeSerializerCompatibilityLayer; } - public AbstractPersistentDataLayer getPersistentDataLayer() { - return persistentDataLayer; - } - public @Nullable AbstractMasterAnglerCompatibility getMasterAnglerCompatibilityLayer() { return masterAnglerCompatibility; } diff --git a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/AbstractPersistentDataLayer.java b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/AbstractPersistentDataLayer.java deleted file mode 100644 index 7ecf6dfb3..000000000 --- a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/AbstractPersistentDataLayer.java +++ /dev/null @@ -1,137 +0,0 @@ -package com.gmail.nossr50.util.compat.layers.persistentdata; - -import com.gmail.nossr50.mcMMO; -import com.gmail.nossr50.util.MetadataConstants; -import com.gmail.nossr50.util.compat.layers.AbstractCompatibilityLayer; -import org.bukkit.NamespacedKey; -import org.bukkit.block.Furnace; -import org.bukkit.entity.LivingEntity; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.List; -import java.util.UUID; - -public abstract class AbstractPersistentDataLayer extends AbstractCompatibilityLayer { - - protected final @NotNull NamespacedKey NSK_SUPER_ABILITY_BOOSTED_ITEM; - protected final @NotNull NamespacedKey NSK_MOB_SPAWNER_MOB; - protected final @NotNull NamespacedKey NSK_EGG_MOB; - protected final @NotNull NamespacedKey NSK_NETHER_GATE_MOB; - protected final @NotNull NamespacedKey NSK_COTW_SUMMONED_MOB; - protected final @NotNull NamespacedKey NSK_PLAYER_BRED_MOB; - protected final @NotNull NamespacedKey NSK_PLAYER_TAMED_MOB; - protected final @NotNull NamespacedKey NSK_VILLAGER_TRADE_ORIGIN_ITEM; - protected final @NotNull NamespacedKey NSK_EXPLOITED_ENDERMEN; - - protected final @NotNull NamespacedKey NSK_FURNACE_UUID_MOST_SIG; - protected final @NotNull NamespacedKey NSK_FURNACE_UUID_LEAST_SIG; - - public final @NotNull String LEGACY_ABILITY_TOOL_LORE = "mcMMO Ability Tool"; - - public AbstractPersistentDataLayer() { - 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); - - initializeLayer(); - } - - - /** - * Helper method to simplify generating namespaced keys - * @param key the {@link String} value of the key - * @return the generated {@link NamespacedKey} - */ - private @NotNull NamespacedKey getNamespacedKey(@NotNull String key) { - return new NamespacedKey(mcMMO.p, key); - } - - /** - * 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 abstract boolean hasMobFlag(@NotNull MobMetaFlagType flag, @NotNull LivingEntity livingEntity); - - /** - * 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 abstract boolean hasMobFlags(@NotNull LivingEntity livingEntity); - - /** - * 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 abstract void addMobFlags(@NotNull LivingEntity sourceEntity, @NotNull LivingEntity targetEntity); - - /** - * 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 abstract void flagMetadata(@NotNull MobMetaFlagType flag, @NotNull LivingEntity livingEntity); - - /** - * Removes a specific mob flag from target {@link LivingEntity} - * @param flag desired flag to remove - * @param livingEntity the target living entity - */ - public abstract void removeMobFlag(@NotNull MobMetaFlagType flag, @NotNull LivingEntity livingEntity); - - /** - * Remove all mcMMO related mob flags from the target {@link LivingEntity} - * @param livingEntity target entity - */ - public void removeMobFlags(@NotNull LivingEntity livingEntity) { - for(MobMetaFlagType flag : MobMetaFlagType.values()) { - removeMobFlag(flag, livingEntity); - } - } - - public abstract @Nullable UUID getFurnaceOwner(@NotNull Furnace furnace); - - public abstract void setFurnaceOwner(@NotNull Furnace furnace, @NotNull UUID uuid); - - public abstract void setSuperAbilityBoostedItem(@NotNull ItemStack itemStack, int originalDigSpeed); - - public abstract boolean isSuperAbilityBoosted(@NotNull ItemStack itemStack); - - public abstract int getSuperAbilityToolOriginalDigSpeed(@NotNull ItemStack itemStack); - - public abstract void removeBonusDigSpeedOnSuperAbilityTool(@NotNull ItemStack itemStack); - - 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/util/compat/layers/persistentdata/SpigotPersistentDataLayer_1_13.java b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer_1_13.java deleted file mode 100644 index 8f7877a1e..000000000 --- a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer_1_13.java +++ /dev/null @@ -1,172 +0,0 @@ -package com.gmail.nossr50.util.compat.layers.persistentdata; - -import com.gmail.nossr50.api.exceptions.IncompleteNamespacedKeyRegister; -import com.gmail.nossr50.datatypes.meta.UUIDMeta; -import com.gmail.nossr50.mcMMO; -import com.gmail.nossr50.util.MetadataConstants; -import org.bukkit.block.Furnace; -import org.bukkit.enchantments.Enchantment; -import org.bukkit.entity.LivingEntity; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; -import org.bukkit.inventory.meta.tags.CustomItemTagContainer; -import org.bukkit.inventory.meta.tags.ItemTagType; -import org.bukkit.metadata.Metadatable; -import org.jetbrains.annotations.NotNull; - -import java.util.EnumMap; -import java.util.UUID; - -/** - * Persistent Data API is unavailable - */ -public class SpigotPersistentDataLayer_1_13 extends AbstractPersistentDataLayer { - - private final @NotNull String KEY_FURNACE_OWNER = "mcMMO_furnace_owner"; - private final @NotNull EnumMap mobFlagKeyMap; - - public SpigotPersistentDataLayer_1_13() { - mobFlagKeyMap = new EnumMap<>(MobMetaFlagType.class); - initMobFlagKeyMap(); - } - - @Override - public boolean initializeLayer() { - return true; - } - - private void initMobFlagKeyMap() throws IncompleteNamespacedKeyRegister { - for(MobMetaFlagType flagType : MobMetaFlagType.values()) { - switch (flagType) { - case MOB_SPAWNER_MOB -> mobFlagKeyMap.put(flagType, MetadataConstants.METADATA_KEY_MOB_SPAWNER_MOB); - case EGG_MOB -> mobFlagKeyMap.put(flagType, MetadataConstants.METADATA_KEY_EGG_MOB); - case NETHER_PORTAL_MOB -> mobFlagKeyMap.put(flagType, MetadataConstants.METADATA_KEY_NETHER_PORTAL_MOB); - case COTW_SUMMONED_MOB -> mobFlagKeyMap.put(flagType, MetadataConstants.METADATA_KEY_COTW_SUMMONED_MOB); - case PLAYER_BRED_MOB -> mobFlagKeyMap.put(flagType, MetadataConstants.METADATA_KEY_PLAYER_BRED_MOB); - case PLAYER_TAMED_MOB -> mobFlagKeyMap.put(flagType, MetadataConstants.METADATA_KEY_PLAYER_TAMED_MOB); - case EXPLOITED_ENDERMEN -> mobFlagKeyMap.put(flagType, MetadataConstants.METADATA_KEY_EXPLOITED_ENDERMEN); - default -> throw new IncompleteNamespacedKeyRegister("Missing flag register for: " + flagType); - } - } - } - - @Override - public boolean hasMobFlag(@NotNull MobMetaFlagType flag, @NotNull LivingEntity livingEntity) { - return livingEntity.hasMetadata(mobFlagKeyMap.get(flag)); - } - - @Override - public boolean hasMobFlags(@NotNull LivingEntity livingEntity) { - for(String currentKey : mobFlagKeyMap.values()) { - if(livingEntity.hasMetadata(currentKey)) { - return true; - } - } - - return false; - } - - @Override - public void addMobFlags(@NotNull LivingEntity sourceEntity, @NotNull LivingEntity targetEntity) { - for(MobMetaFlagType flag : MobMetaFlagType.values()) { - if(hasMobFlag(flag, sourceEntity)) { - flagMetadata(flag, targetEntity); - } - } - } - - @Override - public void flagMetadata(@NotNull MobMetaFlagType flag, @NotNull LivingEntity livingEntity) { - if(!hasMobFlag(flag, livingEntity)) { - livingEntity.setMetadata(mobFlagKeyMap.get(flag), MetadataConstants.MCMMO_METADATA_VALUE); - } - } - - @Override - public void removeMobFlag(@NotNull MobMetaFlagType flag, @NotNull LivingEntity livingEntity) { - if(hasMobFlag(flag, livingEntity)) { - livingEntity.removeMetadata(mobFlagKeyMap.get(flag), mcMMO.p); - } - } - - @Override - public UUID getFurnaceOwner(@NotNull Furnace furnace) { - if(furnace.getMetadata(KEY_FURNACE_OWNER).size() > 0) { - UUIDMeta uuidMeta = (UUIDMeta) ((Metadatable) furnace).getMetadata(KEY_FURNACE_OWNER).get(0); - return (UUID) uuidMeta.value(); - } else { - return null; - } - } - - @Override - public void setFurnaceOwner(@NotNull Furnace furnace, @NotNull UUID uuid) { - - if(furnace.getMetadata(KEY_FURNACE_OWNER).size() > 0) { - furnace.removeMetadata(KEY_FURNACE_OWNER, mcMMO.p); - } - - furnace.setMetadata(KEY_FURNACE_OWNER, new UUIDMeta(mcMMO.p, uuid)); - } - - @Override - public void setSuperAbilityBoostedItem(@NotNull ItemStack itemStack, int originalDigSpeed) { - ItemMeta itemMeta = itemStack.getItemMeta(); - - if(itemMeta == null) { - mcMMO.p.getLogger().severe("Item meta should never be null for a super boosted item!"); - return; - } - - itemMeta.getCustomTagContainer().setCustomTag(NSK_SUPER_ABILITY_BOOSTED_ITEM, ItemTagType.INTEGER, originalDigSpeed); - itemStack.setItemMeta(itemMeta); - } - - @Override - public boolean isSuperAbilityBoosted(@NotNull ItemStack itemStack) { - ItemMeta itemMeta = itemStack.getItemMeta(); - - if(itemMeta == null) - return false; - - CustomItemTagContainer tagContainer = itemMeta.getCustomTagContainer(); - return tagContainer.hasCustomTag(NSK_SUPER_ABILITY_BOOSTED_ITEM, ItemTagType.INTEGER); - } - - @Override - public int getSuperAbilityToolOriginalDigSpeed(@NotNull ItemStack itemStack) { - ItemMeta itemMeta = itemStack.getItemMeta(); - - if(itemMeta == null) - return 0; - - CustomItemTagContainer tagContainer = itemMeta.getCustomTagContainer(); - - if(tagContainer.hasCustomTag(NSK_SUPER_ABILITY_BOOSTED_ITEM, ItemTagType.INTEGER)) { - return tagContainer.getCustomTag(NSK_SUPER_ABILITY_BOOSTED_ITEM, ItemTagType.INTEGER); - } else { - return 0; - } - } - - @Override - public void removeBonusDigSpeedOnSuperAbilityTool(@NotNull ItemStack itemStack) { - int originalSpeed = getSuperAbilityToolOriginalDigSpeed(itemStack); - ItemMeta itemMeta = itemStack.getItemMeta(); - - if(itemMeta == null) - return; - - if(itemMeta.hasEnchant(Enchantment.DIG_SPEED)) { - itemMeta.removeEnchant(Enchantment.DIG_SPEED); - } - - - if(originalSpeed > 0) { - itemMeta.addEnchant(Enchantment.DIG_SPEED, originalSpeed, true); - } - - //TODO: needed? - itemStack.setItemMeta(itemMeta); - } -} diff --git a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer_1_14.java b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer_1_14.java deleted file mode 100644 index f4b340fec..000000000 --- a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer_1_14.java +++ /dev/null @@ -1,220 +0,0 @@ -package com.gmail.nossr50.util.compat.layers.persistentdata; - -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.block.Furnace; -import org.bukkit.enchantments.Enchantment; -import org.bukkit.entity.LivingEntity; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; -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.EnumMap; -import java.util.UUID; - -public class SpigotPersistentDataLayer_1_14 extends AbstractPersistentDataLayer { - - private final @NotNull EnumMap mobFlagKeyMap; - private final @NotNull SpigotPersistentDataLayer_1_13 transientLayer; - - public SpigotPersistentDataLayer_1_14() { - mobFlagKeyMap = new EnumMap<>(MobMetaFlagType.class); - initMobFlagKeyMap(); - transientLayer = new SpigotPersistentDataLayer_1_13(); //For disabled persistent types - } - - @Override - public boolean initializeLayer() { - return true; - } - - /** - * Registers the namespaced keys required by the API (CB/Spigot) - */ - private void initMobFlagKeyMap() throws IncompleteNamespacedKeyRegister { - for(MobMetaFlagType mobMetaFlagType : MobMetaFlagType.values()) { - switch(mobMetaFlagType) { - case MOB_SPAWNER_MOB: - mobFlagKeyMap.put(mobMetaFlagType, NSK_MOB_SPAWNER_MOB); - break; - case EGG_MOB: - mobFlagKeyMap.put(mobMetaFlagType, NSK_EGG_MOB); - break; - case NETHER_PORTAL_MOB: - mobFlagKeyMap.put(mobMetaFlagType, NSK_NETHER_GATE_MOB); - break; - case COTW_SUMMONED_MOB: - mobFlagKeyMap.put(mobMetaFlagType, NSK_COTW_SUMMONED_MOB); - break; - case PLAYER_BRED_MOB: - mobFlagKeyMap.put(mobMetaFlagType, NSK_PLAYER_BRED_MOB); - break; - case EXPLOITED_ENDERMEN: - mobFlagKeyMap.put(mobMetaFlagType, NSK_EXPLOITED_ENDERMEN); - break; - case PLAYER_TAMED_MOB: - mobFlagKeyMap.put(mobMetaFlagType, NSK_PLAYER_TAMED_MOB); - break; - default: - throw new IncompleteNamespacedKeyRegister("missing namespaced key register for type: "+ mobMetaFlagType.toString()); - } - } - } - - @Override - public boolean hasMobFlag(@NotNull MobMetaFlagType flag, @NotNull LivingEntity livingEntity) { - if(PersistentDataConfig.getInstance().isMobPersistent(flag)) { - return livingEntity.getPersistentDataContainer().has(mobFlagKeyMap.get(flag), PersistentDataType.BYTE); - } else { - return transientLayer.hasMobFlag(flag, livingEntity); - } - } - - @Override - public boolean hasMobFlags(@NotNull LivingEntity livingEntity) { - for(MobMetaFlagType currentFlag : MobMetaFlagType.values()) { - if(hasMobFlag(currentFlag, livingEntity)) { - return true; - } - } - - return false; - } - - @Override - public void addMobFlags(@NotNull LivingEntity sourceEntity, @NotNull LivingEntity targetEntity) { - for(MobMetaFlagType flag : MobMetaFlagType.values()) { - if(hasMobFlag(flag, sourceEntity)) { - flagMetadata(flag, targetEntity); - } - } - } - - @Override - 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 { - transientLayer.flagMetadata(flag, livingEntity); - } - } - - @Override - 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 { - transientLayer.removeMobFlag(flag, livingEntity); - } - } - - @Override - 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; - } - } - - @Override - 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(); - } - - @Override - 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); - } - - @Override - 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; - } - - @Override - 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); - } - } - - @Override - public void removeBonusDigSpeedOnSuperAbilityTool(@NotNull ItemStack itemStack) { - int originalSpeed = getSuperAbilityToolOriginalDigSpeed(itemStack); - ItemMeta itemMeta = itemStack.getItemMeta(); - - //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); - } -} 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 00e6f01d0..a855f3a4c 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java @@ -10,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; @@ -19,8 +21,6 @@ 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.util.*; -import com.gmail.nossr50.util.compat.layers.persistentdata.AbstractPersistentDataLayer; -import com.gmail.nossr50.util.compat.layers.persistentdata.MobMetaFlagType; import com.gmail.nossr50.util.player.NotificationManager; import com.gmail.nossr50.util.player.UserManager; import com.google.common.collect.ImmutableMap; @@ -50,8 +50,8 @@ public final class CombatUtils { private CombatUtils() {} - private static @NotNull AbstractPersistentDataLayer getPersistentData() { - return mcMMO.getCompatibilityManager().getPersistentDataLayer(); + private static @NotNull MobMetadataService getMobMetadataService() { + return mcMMO.getMetadataService().getMobMetadataService(); } //Likely.. because who knows what plugins are throwing around @@ -801,17 +801,17 @@ public final class CombatUtils { } } - if(getPersistentData().hasMobFlag(MobMetaFlagType.COTW_SUMMONED_MOB, target)) { + if(getMobMetadataService().hasMobFlag(MobMetaFlagType.COTW_SUMMONED_MOB, target)) { baseXP = 0; - } else if(getPersistentData().hasMobFlag(MobMetaFlagType.MOB_SPAWNER_MOB, target) || target.hasMetadata("ES")) { + } else if(getMobMetadataService().hasMobFlag(MobMetaFlagType.MOB_SPAWNER_MOB, target) || target.hasMetadata("ES")) { baseXP *= ExperienceConfig.getInstance().getSpawnedMobXpMultiplier(); - } else if(getPersistentData().hasMobFlag(MobMetaFlagType.NETHER_PORTAL_MOB, target)) { + } else if(getMobMetadataService().hasMobFlag(MobMetaFlagType.NETHER_PORTAL_MOB, target)) { baseXP *= ExperienceConfig.getInstance().getNetherPortalXpMultiplier(); - } else if(getPersistentData().hasMobFlag(MobMetaFlagType.EGG_MOB, target)) { + } else if(getMobMetadataService().hasMobFlag(MobMetaFlagType.EGG_MOB, target)) { baseXP *= ExperienceConfig.getInstance().getEggXpMultiplier(); - } else if (getPersistentData().hasMobFlag(MobMetaFlagType.PLAYER_BRED_MOB, target)) { + } else if (getMobMetadataService().hasMobFlag(MobMetaFlagType.PLAYER_BRED_MOB, target)) { baseXP *= ExperienceConfig.getInstance().getBredMobXpMultiplier(); - } else if(getPersistentData().hasMobFlag(MobMetaFlagType.PLAYER_TAMED_MOB, target)) { + } else if(getMobMetadataService().hasMobFlag(MobMetaFlagType.PLAYER_TAMED_MOB, target)) { baseXP *= ExperienceConfig.getInstance().getTamedMobXpMultiplier(); } 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 9c9e962c5..6a15963ef 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/SkillUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/SkillUtils.java @@ -10,9 +10,9 @@ 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.compat.layers.persistentdata.AbstractPersistentDataLayer; import com.gmail.nossr50.util.player.NotificationManager; import com.gmail.nossr50.util.player.UserManager; import com.gmail.nossr50.util.text.StringUtils; @@ -156,8 +156,7 @@ public final class SkillUtils { ItemUtils.addDigSpeedToItem(heldItem, heldItem.getEnchantmentLevel(Enchantment.DIG_SPEED)); //1.13.2+ will have persistent metadata for this item - AbstractPersistentDataLayer compatLayer = mcMMO.getCompatibilityManager().getPersistentDataLayer(); - compatLayer.setSuperAbilityBoostedItem(heldItem, originalDigSpeed); + mcMMO.getMetadataService().getItemMetadataService().setSuperAbilityBoostedItem(heldItem, originalDigSpeed); } else { int duration = 0; int amplifier = 0; @@ -214,20 +213,22 @@ public final class SkillUtils { //1.13.2+ will have persistent metadata for this itemStack - AbstractPersistentDataLayer compatLayer = mcMMO.getCompatibilityManager().getPersistentDataLayer(); + ItemMetadataService itemMetadataService = mcMMO.getMetadataService().getItemMetadataService(); - if(compatLayer.isLegacyAbilityTool(itemStack)) { + if(itemMetadataService.isLegacyAbilityTool(itemStack)) { ItemMeta itemMeta = itemStack.getItemMeta(); - // This is safe to call without prior checks. - itemMeta.removeEnchant(Enchantment.DIG_SPEED); + if(itemMeta != null) { + // This is safe to call without prior checks. + itemMeta.removeEnchant(Enchantment.DIG_SPEED); - itemStack.setItemMeta(itemMeta); - ItemUtils.removeAbilityLore(itemStack); + itemStack.setItemMeta(itemMeta); + ItemUtils.removeAbilityLore(itemStack); + } } - if(compatLayer.isSuperAbilityBoosted(itemStack)) { - compatLayer.removeBonusDigSpeedOnSuperAbilityTool(itemStack); + if(itemMetadataService.isSuperAbilityBoosted(itemStack)) { + itemMetadataService.removeBonusDigSpeedOnSuperAbilityTool(itemStack); } } diff --git a/src/main/java/com/gmail/nossr50/util/skills/SmeltingTracker.java b/src/main/java/com/gmail/nossr50/util/skills/SmeltingTracker.java index dfa313181..83e993a10 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/SmeltingTracker.java +++ b/src/main/java/com/gmail/nossr50/util/skills/SmeltingTracker.java @@ -34,7 +34,7 @@ public class SmeltingTracker { } private void setFurnaceOwner(Furnace furnace, Player player) { - mcMMO.getCompatibilityManager().getPersistentDataLayer().setFurnaceOwner(furnace, player.getUniqueId()); + mcMMO.getMetadataService().getBlockMetadataService().setFurnaceOwner(furnace, player.getUniqueId()); } private void printOwnershipGainDebug(Furnace furnace, McMMOPlayer mcMMOPlayer) { @@ -65,7 +65,7 @@ public class SmeltingTracker { } public @Nullable OfflinePlayer getFurnaceOwner(Furnace furnace) { - UUID uuid = mcMMO.getCompatibilityManager().getPersistentDataLayer().getFurnaceOwner(furnace); + UUID uuid = mcMMO.getMetadataService().getBlockMetadataService().getFurnaceOwner(furnace); if(uuid != null) { return Bukkit.getOfflinePlayer(uuid); From 8f0fb768474fbb811e2e9fee7a3a1190a1f1eaf6 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 17 Jan 2022 15:57:04 -0800 Subject: [PATCH 659/662] Silence API out of date warning on config load --- .../java/com/gmail/nossr50/config/BukkitConfig.java | 2 +- .../gmail/nossr50/metadata/MobMetadataService.java | 12 +----------- 2 files changed, 2 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/config/BukkitConfig.java b/src/main/java/com/gmail/nossr50/config/BukkitConfig.java index ecc4fd60d..a22990e00 100644 --- a/src/main/java/com/gmail/nossr50/config/BukkitConfig.java +++ b/src/main/java/com/gmail/nossr50/config/BukkitConfig.java @@ -67,7 +67,7 @@ public abstract class BukkitConfig { 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!"); + // mcMMO.p.getLogger().severe("Your Spigot/CraftBukkit API is out of date, update your server software!"); } config.options().copyDefaults(true); diff --git a/src/main/java/com/gmail/nossr50/metadata/MobMetadataService.java b/src/main/java/com/gmail/nossr50/metadata/MobMetadataService.java index 87af92f4e..c0ff78c0c 100644 --- a/src/main/java/com/gmail/nossr50/metadata/MobMetadataService.java +++ b/src/main/java/com/gmail/nossr50/metadata/MobMetadataService.java @@ -17,6 +17,7 @@ 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 @@ -54,17 +55,6 @@ public class MobMetadataService { } } - /** - * Helper method to simplify generating namespaced keys - * - * @param key the {@link String} value of the key - * - * @return the generated {@link NamespacedKey} - */ - private @NotNull NamespacedKey getNamespacedKey(@NotNull String key) { - return new NamespacedKey(mcMMO.p, key); - } - /** * Whether or not a target {@link LivingEntity} has a specific mcMMO mob flags * From 86e7bfbf89f027fec63730fa5a5da1884ed8a098 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sun, 30 Jan 2022 14:24:21 -0800 Subject: [PATCH 660/662] Disabling mcMMO when the config breaks is dumb Fixes #4732 --- src/main/java/com/gmail/nossr50/config/BukkitConfig.java | 4 +--- src/main/java/com/gmail/nossr50/mcMMO.java | 7 ------- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/config/BukkitConfig.java b/src/main/java/com/gmail/nossr50/config/BukkitConfig.java index a22990e00..f17b5c5f9 100644 --- a/src/main/java/com/gmail/nossr50/config/BukkitConfig.java +++ b/src/main/java/com/gmail/nossr50/config/BukkitConfig.java @@ -99,9 +99,7 @@ public abstract class BukkitConfig { if (validateKeys()) { 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); - mcMMO.p.noErrorsInConfigFiles = false; + mcMMO.p.getLogger().warning("Errors were found in " + fileName + ", overwriting invalid values!"); } } diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index 8a8d3192b..3d33807b3 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -125,9 +125,6 @@ public class mcMMO extends JavaPlugin { // API checks private static boolean serverAPIOutdated = false; - // Config Validation Check - public boolean noErrorsInConfigFiles = true; - // XP Event Check private boolean xpEventEnabled; @@ -199,10 +196,6 @@ public class mcMMO extends JavaPlugin { loadConfigFiles(); - if (!noErrorsInConfigFiles) { - return; - } - if (getServer().getName().equals("Cauldron") || getServer().getName().equals("MCPC+")) { checkModConfigs(); } From 16e90da8fdfe49741074294b9d7cc6438f6d27a2 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sun, 30 Jan 2022 15:31:52 -0800 Subject: [PATCH 661/662] Config validation rewrite part 1 --- .../gmail/nossr50/config/AdvancedConfig.java | 182 +++++++++--------- .../gmail/nossr50/config/BukkitConfig.java | 38 ++-- .../com/gmail/nossr50/config/ChatConfig.java | 5 +- .../gmail/nossr50/config/ConfigLoader.java | 1 - .../nossr50/config/CoreSkillsConfig.java | 6 +- .../gmail/nossr50/config/GeneralConfig.java | 60 +++--- .../nossr50/config/PersistentDataConfig.java | 5 +- .../com/gmail/nossr50/config/SoundConfig.java | 11 +- .../config/experience/ExperienceConfig.java | 61 +++--- .../config/party/ItemWeightConfig.java | 5 + .../config/skills/repair/RepairConfig.java | 13 +- .../config/skills/salvage/SalvageConfig.java | 13 +- .../treasure/FishingTreasureConfig.java | 45 ++--- .../config/treasure/TreasureConfig.java | 100 +++++----- .../nossr50/skills/child/ChildConfig.java | 5 + .../nossr50/util/upgrade/UpgradeManager.java | 6 + 16 files changed, 293 insertions(+), 263 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java b/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java index 84da46281..50b9a0b1f 100644 --- a/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java +++ b/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java @@ -14,7 +14,6 @@ public class AdvancedConfig extends BukkitConfig { public AdvancedConfig(File dataFolder) { super("advanced.yml", dataFolder); - validate(); } @Override @@ -23,125 +22,125 @@ public class AdvancedConfig extends BukkitConfig { } @Override - protected boolean validateKeys() { - // Validate all the settings! + 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!"); } 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!"); } /* 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!"); + 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 */ @@ -149,262 +148,261 @@ public class AdvancedConfig extends BukkitConfig { 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!"); } /* 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!"); } /* 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 (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!"); } /* SWORDS */ 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!"); } - return noErrorsInConfig(reason); } @Override diff --git a/src/main/java/com/gmail/nossr50/config/BukkitConfig.java b/src/main/java/com/gmail/nossr50/config/BukkitConfig.java index f17b5c5f9..ccf59b5a9 100644 --- a/src/main/java/com/gmail/nossr50/config/BukkitConfig.java +++ b/src/main/java/com/gmail/nossr50/config/BukkitConfig.java @@ -7,18 +7,18 @@ import org.jetbrains.annotations.NotNull; import java.io.*; import java.util.HashSet; -import java.util.List; import java.util.Set; public abstract class BukkitConfig { - public static final String CONFIG_PATCH_PREFIX = "ConfigPatchVersion:"; - public static final String CURRENT_CONFIG_PATCH_VER = "ConfigPatchVersion: 2"; - public static final char COMMENT_PREFIX = '#'; + 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); @@ -30,6 +30,7 @@ public abstract class BukkitConfig { initDefaults(); updateFile(); mcMMO.p.getLogger().info("[config] Config initialized: " + fileName); + validate(); } @Deprecated @@ -83,23 +84,28 @@ public abstract class BukkitConfig { protected abstract void loadKeys(); - protected boolean validateKeys() { - return true; + 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 } - protected boolean noErrorsInConfig(List issues) { - for (String issue : issues) { - mcMMO.p.getLogger().warning(issue); - } + private void validate() { + //TODO: Rewrite legacy validation code + validateConfigKeys(); - return issues.isEmpty(); - } - - protected void validate() { - if (validateKeys()) { + if (unmodifiedConfig) { mcMMO.p.debug("No errors found in " + fileName + "!"); } else { - mcMMO.p.getLogger().warning("Errors were found in " + fileName + ", overwriting invalid values!"); + 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(); + } } } diff --git a/src/main/java/com/gmail/nossr50/config/ChatConfig.java b/src/main/java/com/gmail/nossr50/config/ChatConfig.java index bbda1b69c..b01fdb84a 100644 --- a/src/main/java/com/gmail/nossr50/config/ChatConfig.java +++ b/src/main/java/com/gmail/nossr50/config/ChatConfig.java @@ -9,7 +9,6 @@ public class ChatConfig extends BukkitConfig { private ChatConfig() { super("chat.yml"); - validate(); } public static ChatConfig getInstance() { @@ -26,8 +25,8 @@ public class ChatConfig extends BukkitConfig { } @Override - protected boolean validateKeys() { - return true; + protected void validateConfigKeys() { + //TODO: Rewrite legacy validation code } public boolean isChatEnabled() { diff --git a/src/main/java/com/gmail/nossr50/config/ConfigLoader.java b/src/main/java/com/gmail/nossr50/config/ConfigLoader.java index 972bd697e..376aa2944 100644 --- a/src/main/java/com/gmail/nossr50/config/ConfigLoader.java +++ b/src/main/java/com/gmail/nossr50/config/ConfigLoader.java @@ -79,7 +79,6 @@ public abstract class ConfigLoader { } else { mcMMO.p.getLogger().warning("Errors were found in " + fileName + "! mcMMO was disabled!"); mcMMO.p.getServer().getPluginManager().disablePlugin(mcMMO.p); - mcMMO.p.noErrorsInConfigFiles = false; } } diff --git a/src/main/java/com/gmail/nossr50/config/CoreSkillsConfig.java b/src/main/java/com/gmail/nossr50/config/CoreSkillsConfig.java index f92990ad6..16b763d7c 100644 --- a/src/main/java/com/gmail/nossr50/config/CoreSkillsConfig.java +++ b/src/main/java/com/gmail/nossr50/config/CoreSkillsConfig.java @@ -9,7 +9,6 @@ public class CoreSkillsConfig extends BukkitConfig { public CoreSkillsConfig() { super("coreskills.yml"); - validate(); } public static CoreSkillsConfig getInstance() { @@ -25,9 +24,8 @@ public class CoreSkillsConfig extends BukkitConfig { } @Override - protected boolean validateKeys() { - - return true; + protected void validateConfigKeys() { + //TODO: Rewrite legacy validation code } /* diff --git a/src/main/java/com/gmail/nossr50/config/GeneralConfig.java b/src/main/java/com/gmail/nossr50/config/GeneralConfig.java index fb86a42f4..4749d908d 100644 --- a/src/main/java/com/gmail/nossr50/config/GeneralConfig.java +++ b/src/main/java/com/gmail/nossr50/config/GeneralConfig.java @@ -5,6 +5,7 @@ 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; @@ -22,7 +23,6 @@ public class GeneralConfig extends BukkitConfig { public GeneralConfig(@NotNull File dataFolder) { super("config.yml", dataFolder); - validate(); } @Override @@ -31,127 +31,125 @@ public class GeneralConfig extends BukkitConfig { } @Override - protected boolean validateKeys() { - // Validate all the settings! + protected void validateConfigKeys() { + //TODO: Rewrite legacy validation code List reason = new ArrayList<>(); /* General Settings */ if (getSaveInterval() <= 0) { - reason.add("General.Save_Interval should be greater than 0!"); + mcMMO.p.getLogger().info("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!"); + mcMMO.p.getLogger().warning("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!"); + mcMMO.p.getLogger().warning("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."); + 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) { - reason.add("Database_Purging.Purge_Interval should be greater than, or equal to -1!"); + mcMMO.p.getLogger().warning("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!"); + mcMMO.p.getLogger().warning("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!"); + mcMMO.p.getLogger().warning("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!"); + mcMMO.p.getLogger().warning("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!"); + mcMMO.p.getLogger().warning("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!"); + mcMMO.p.getLogger().warning("Items.Chimaera_Wing.Recipe_Cost only accepts values from 1 to 9!"); } if (getChimaeraItem() == null) { - reason.add("Items.Chimaera_Wing.Item_Name is invalid!"); + mcMMO.p.getLogger().warning("Items.Chimaera_Wing.Item_Name is invalid!"); } /* Particles */ if (getLevelUpEffectsTier() < 1) { - reason.add("Particles.LevelUp_Tier should be at least 1!"); + mcMMO.p.getLogger().warning("Particles.LevelUp_Tier should be at least 1!"); } /* PARTY SETTINGS */ if (getAutoPartyKickInterval() < -1) { - reason.add("Party.AutoKick_Interval should be at least -1!"); + mcMMO.p.getLogger().warning("Party.AutoKick_Interval should be at least -1!"); } if (getAutoPartyKickTime() < 0) { - reason.add("Party.Old_Party_Member_Cutoff should be at least 0!"); + mcMMO.p.getLogger().warning("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!"); + mcMMO.p.getLogger().warning("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!"); + mcMMO.p.getLogger().warning("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!"); + mcMMO.p.getLogger().warning("Party.Sharing.ExpShare_bonus_cap should be greater than 0!"); } if (getPartyShareRange() <= 0) { - reason.add("Party.Sharing.Range should be greater than 0!"); + mcMMO.p.getLogger().warning("Party.Sharing.Range should be greater than 0!"); } if (getPartyXpCurveMultiplier() < 1) { - reason.add("Party.Leveling.Xp_Curve_Modifier should be at least 1!"); + mcMMO.p.getLogger().warning("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!"); + mcMMO.p.getLogger().warning("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!"); + mcMMO.p.getLogger().warning("Commands.inspect.Max_Distance should be greater than 0!"); } if (getTreeFellerThreshold() <= 0) { - reason.add("Abilities.Limits.Tree_Feller_Threshold should be greater than 0!"); + mcMMO.p.getLogger().warning("Abilities.Limits.Tree_Feller_Threshold should be greater than 0!"); } if (getFishingLureModifier() < 0) { - reason.add("Abilities.Fishing.Lure_Modifier should be at least 0!"); + mcMMO.p.getLogger().warning("Abilities.Fishing.Lure_Modifier should be at least 0!"); } if (getRepairAnvilMaterial() == null) { - reason.add("Skills.Repair.Anvil_Type is invalid!!"); + mcMMO.p.getLogger().warning("Skills.Repair.Anvil_Type is invalid!!"); } if (getSalvageAnvilMaterial() == null) { - reason.add("Skills.Repair.Salvage_Anvil_Type is invalid!"); + mcMMO.p.getLogger().warning("Skills.Repair.Salvage_Anvil_Type is invalid!"); } if (getRepairAnvilMaterial() == getSalvageAnvilMaterial()) { - reason.add("Cannot use the same item for Repair and Salvage anvils!"); + mcMMO.p.getLogger().warning("Cannot use the same item for Repair and Salvage anvils!"); } - - return noErrorsInConfig(reason); } /* diff --git a/src/main/java/com/gmail/nossr50/config/PersistentDataConfig.java b/src/main/java/com/gmail/nossr50/config/PersistentDataConfig.java index 089db89b8..e0fd3d8e9 100644 --- a/src/main/java/com/gmail/nossr50/config/PersistentDataConfig.java +++ b/src/main/java/com/gmail/nossr50/config/PersistentDataConfig.java @@ -7,7 +7,6 @@ public class PersistentDataConfig extends BukkitConfig { private PersistentDataConfig() { super("persistent_data.yml"); - validate(); } public static PersistentDataConfig getInstance() { @@ -24,8 +23,8 @@ public class PersistentDataConfig extends BukkitConfig { } @Override - protected boolean validateKeys() { - return true; + protected void validateConfigKeys() { + //TODO: Rewrite legacy validation code } //Persistent Data Toggles diff --git a/src/main/java/com/gmail/nossr50/config/SoundConfig.java b/src/main/java/com/gmail/nossr50/config/SoundConfig.java index e19ad7f44..d365ab31b 100644 --- a/src/main/java/com/gmail/nossr50/config/SoundConfig.java +++ b/src/main/java/com/gmail/nossr50/config/SoundConfig.java @@ -8,7 +8,6 @@ public class SoundConfig extends BukkitConfig { public SoundConfig() { super("sounds.yml"); - validate(); instance = this; } @@ -25,22 +24,24 @@ public class SoundConfig extends BukkitConfig { } @Override - protected boolean validateKeys() { + 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); - return false; + //TODO: Rewrite legacy validation code + //return false; } //Sounds with custom pitching don't use pitch values if (!soundType.usesCustomPitch()) { if (config.getDouble("Sounds." + soundType + ".Pitch") < 0) { mcMMO.p.getLogger().info("[mcMMO] Sound pitch cannot be below 0 for " + soundType); - return false; + //TODO: Rewrite legacy validation code + //return false; } } } - return true; } public float getMasterVolume() { 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 d10145212..8a51736c8 100644 --- a/src/main/java/com/gmail/nossr50/config/experience/ExperienceConfig.java +++ b/src/main/java/com/gmail/nossr50/config/experience/ExperienceConfig.java @@ -5,6 +5,7 @@ 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.mcMMO; import com.gmail.nossr50.util.text.StringUtils; import org.bukkit.Material; import org.bukkit.block.Block; @@ -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 BukkitConfig { private static ExperienceConfig instance; private ExperienceConfig() { super("experience.yml"); - validate(); } public static ExperienceConfig getInstance() { @@ -33,12 +35,18 @@ public class ExperienceConfig extends BukkitConfig { return instance; } + @Override + public void initDefaults() { + super.initDefaults(); + } + @Override protected void loadKeys() { } @Override - protected boolean validateKeys() { + protected void validateConfigKeys() { + //TODO: Rewrite legacy validation code List reason = new ArrayList<>(); /* @@ -46,41 +54,48 @@ public class ExperienceConfig extends BukkitConfig { */ /* 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!"); } /* @@ -90,54 +105,52 @@ public class ExperienceConfig extends BukkitConfig { /* 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() { 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 f36a9d24b..75620e389 100644 --- a/src/main/java/com/gmail/nossr50/config/party/ItemWeightConfig.java +++ b/src/main/java/com/gmail/nossr50/config/party/ItemWeightConfig.java @@ -22,6 +22,11 @@ public class ItemWeightConfig extends BukkitConfig { 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")); } 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 604a18e9c..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 @@ -23,6 +23,11 @@ public class RepairConfig extends BukkitConfig { loadKeys(); } + @Override + protected void validateConfigKeys() { + //TODO: Rewrite legacy validation code + } + @Override protected void loadKeys() { repairables = new ArrayList<>(); @@ -81,7 +86,7 @@ public class RepairConfig extends BukkitConfig { try { repairMaterialType = MaterialType.valueOf(repairMaterialTypeString); } catch (IllegalArgumentException ex) { - reason.add(key + " has an invalid MaterialType of " + repairMaterialTypeString); + mcMMO.p.getLogger().warning(key + " has an invalid MaterialType of " + repairMaterialTypeString); } } @@ -102,7 +107,7 @@ public class RepairConfig extends BukkitConfig { } 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 @@ -121,7 +126,7 @@ public class RepairConfig extends BukkitConfig { try { repairItemType = ItemType.valueOf(repairItemTypeString); } catch (IllegalArgumentException ex) { - reason.add(key + " has an invalid ItemType of " + repairItemTypeString); + mcMMO.p.getLogger().warning(key + " has an invalid ItemType of " + repairItemTypeString); } } @@ -129,7 +134,7 @@ public class RepairConfig extends BukkitConfig { 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 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 c8700274d..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 @@ -26,6 +26,11 @@ public class SalvageConfig extends BukkitConfig { loadKeys(); } + @Override + protected void validateConfigKeys() { + //TODO: Rewrite legacy validation code + } + @Override protected void loadKeys() { salvageables = new HashSet<>(); @@ -97,7 +102,7 @@ public class SalvageConfig extends BukkitConfig { try { salvageMaterialType = MaterialType.valueOf(salvageMaterialTypeString.replace(" ", "_").toUpperCase(Locale.ENGLISH)); } catch (IllegalArgumentException ex) { - reason.add(key + " has an invalid MaterialType of " + salvageMaterialTypeString); + mcMMO.p.getLogger().warning(key + " has an invalid MaterialType of " + salvageMaterialTypeString); } } @@ -129,7 +134,7 @@ public class SalvageConfig extends BukkitConfig { try { salvageItemType = ItemType.valueOf(salvageItemTypeString.replace(" ", "_").toUpperCase(Locale.ENGLISH)); } catch (IllegalArgumentException ex) { - reason.add(key + " has an invalid ItemType of " + salvageItemTypeString); + mcMMO.p.getLogger().warning(key + " has an invalid ItemType of " + salvageItemTypeString); } } @@ -137,7 +142,7 @@ public class SalvageConfig extends BukkitConfig { 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 @@ -154,7 +159,7 @@ public class SalvageConfig extends BukkitConfig { } 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)) { diff --git a/src/main/java/com/gmail/nossr50/config/treasure/FishingTreasureConfig.java b/src/main/java/com/gmail/nossr50/config/treasure/FishingTreasureConfig.java index 1a9dd41c5..277997ec0 100755 --- a/src/main/java/com/gmail/nossr50/config/treasure/FishingTreasureConfig.java +++ b/src/main/java/com/gmail/nossr50/config/treasure/FishingTreasureConfig.java @@ -30,7 +30,6 @@ public class FishingTreasureConfig extends BukkitConfig { private FishingTreasureConfig() { super(FILENAME); loadKeys(); - validate(); } public static FishingTreasureConfig getInstance() { @@ -42,8 +41,8 @@ public class FishingTreasureConfig extends BukkitConfig { } @Override - protected boolean validateKeys() { - // Validate all the settings! + protected void validateConfigKeys() { + //TODO: Rewrite legacy validation code List reason = new ArrayList<>(); ConfigurationSection enchantment_drop_rates = config.getConfigurationSection("Enchantment_Drop_Rates"); @@ -57,11 +56,11 @@ public class FishingTreasureConfig extends BukkitConfig { double itemDropRate = config.getDouble("Item_Drop_Rates." + tier + "." + rarity); if ((enchantDropRate < 0.0 || enchantDropRate > 100.0)) { - reason.add("The enchant drop rate for " + tier + " items that are " + rarity + "should be between 0.0 and 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) { - reason.add("The item drop rate for " + tier + " items that are " + rarity + "should be between 0.0 and 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; @@ -69,18 +68,16 @@ public class FishingTreasureConfig extends BukkitConfig { } if (totalEnchantDropRate < 0 || totalEnchantDropRate > 100.0) { - reason.add("The total enchant drop rate for " + tier + " should be between 0.0 and 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) { - reason.add("The total item drop rate for " + tier + " should be between 0.0 and 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."); } - - return noErrorsInConfig(reason); } @Override @@ -141,7 +138,7 @@ public class FishingTreasureConfig extends BukkitConfig { short data = (treasureInfo.length == 2) ? Short.parseShort(treasureInfo[1]) : (short) config.getInt(type + "." + treasureName + ".Data"); if (material == null) { - reason.add("Cannot find matching item type in this version of MC, skipping - " + materialName); + mcMMO.p.getLogger().warning("Cannot find matching item type in this version of MC, skipping - " + materialName); continue; } @@ -150,7 +147,7 @@ public class FishingTreasureConfig extends BukkitConfig { } if (material.isBlock() && (data > 127 || data < -128)) { - reason.add("Data of " + treasureName + " is invalid! " + data); + mcMMO.p.getLogger().warning("Data of " + treasureName + " is invalid! " + data); } /* @@ -162,15 +159,15 @@ public class FishingTreasureConfig extends BukkitConfig { int dropLevel = config.getInt(type + "." + treasureName + ".Drop_Level"); 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); + mcMMO.p.getLogger().warning(treasureName + " has an invalid Drop_Chance: " + dropChance); } if (dropLevel < 0) { - reason.add("Fishing Config: " + treasureName + " has an invalid Drop_Level: " + dropLevel); + mcMMO.p.getLogger().warning("Fishing Config: " + treasureName + " has an invalid Drop_Level: " + dropLevel); } /* @@ -205,7 +202,7 @@ public class FishingTreasureConfig extends BukkitConfig { if (materialName.contains("POTION")) { Material mat = Material.matchMaterial(materialName); if (mat == null) { - reason.add("Potion format for " + FILENAME + " has changed"); + mcMMO.p.getLogger().warning("Potion format for " + FILENAME + " has changed"); } else { item = new ItemStack(mat, amount, data); PotionMeta itemMeta = (PotionMeta) item.getItemMeta(); @@ -219,7 +216,7 @@ public class FishingTreasureConfig extends BukkitConfig { 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); @@ -282,15 +279,15 @@ public class FishingTreasureConfig extends BukkitConfig { } - if (noErrorsInConfig(reason)) { - if (isFishing) { - addFishingTreasure(rarity, 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 (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); - } + EntityType entityType = EntityType.valueOf(type.substring(6)); + addShakeTreasure(shakeTreasure, entityType); } } } 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 1827188dd..44bd4121e 100755 --- a/src/main/java/com/gmail/nossr50/config/treasure/TreasureConfig.java +++ b/src/main/java/com/gmail/nossr50/config/treasure/TreasureConfig.java @@ -37,7 +37,6 @@ public class TreasureConfig extends BukkitConfig { private TreasureConfig() { super(FILENAME); loadKeys(); - validate(); } public static TreasureConfig getInstance() { @@ -49,11 +48,8 @@ public class TreasureConfig extends BukkitConfig { } @Override - protected boolean validateKeys() { - // Validate all the settings! - List reason = new ArrayList<>(); - - return noErrorsInConfig(reason); + protected void validateConfigKeys() { + //TODO: Rewrite legacy validation code } @Override @@ -95,7 +91,7 @@ public class TreasureConfig extends BukkitConfig { 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) { @@ -103,7 +99,7 @@ public class TreasureConfig extends BukkitConfig { } 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); } /* @@ -147,11 +143,11 @@ public class TreasureConfig extends BukkitConfig { } 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); + mcMMO.p.getLogger().warning(treasureName + " has an invalid Drop_Chance: " + dropChance); } /* @@ -162,7 +158,7 @@ public class TreasureConfig extends BukkitConfig { if (materialName.contains("POTION")) { Material mat = Material.matchMaterial(materialName); if (mat == null) { - reason.add("Potion format for " + FILENAME + " has changed"); + mcMMO.p.getLogger().warning("Potion format for " + FILENAME + " has changed"); } else { item = new ItemStack(mat, amount, data); PotionMeta itemMeta = (PotionMeta) item.getItemMeta(); @@ -171,7 +167,7 @@ public class TreasureConfig extends BukkitConfig { 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); @@ -210,49 +206,49 @@ public class TreasureConfig extends BukkitConfig { } } - if (noErrorsInConfig(reason)) { - if (isExcavation) { - ExcavationTreasure excavationTreasure = new ExcavationTreasure(item, xp, dropChance, dropLevel); - List dropList = config.getStringList(type + "." + treasureName + ".Drops_From"); + //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"); - for (String blockType : dropList) { - if (!excavationMap.containsKey(blockType)) - excavationMap.put(blockType, new ArrayList<>()); - excavationMap.get(blockType).add(excavationTreasure); + 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 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); } } } 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 ae4360de7..c3d99ffc4 100644 --- a/src/main/java/com/gmail/nossr50/skills/child/ChildConfig.java +++ b/src/main/java/com/gmail/nossr50/skills/child/ChildConfig.java @@ -15,6 +15,11 @@ public class ChildConfig extends BukkitConfig { loadKeys(); } + @Override + protected void validateConfigKeys() { + //TODO: Rewrite legacy validation code + } + @Override protected void loadKeys() { config.setDefaults(YamlConfiguration.loadConfiguration(mcMMO.p.getResourceAsReader("child.yml"))); 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 2325b2800..99e8f0f86 100644 --- a/src/main/java/com/gmail/nossr50/util/upgrade/UpgradeManager.java +++ b/src/main/java/com/gmail/nossr50/util/upgrade/UpgradeManager.java @@ -19,6 +19,12 @@ public class UpgradeManager extends BukkitConfig { 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. * From 0ccd89fad4897b4a15e36437bed0d2f9b4ef7544 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sun, 30 Jan 2022 15:47:08 -0800 Subject: [PATCH 662/662] Update changelog --- Changelog.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Changelog.txt b/Changelog.txt index 9a33c8ee2..9221f7f4c 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,5 +1,7 @@ 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