From 37610f76ceb3accd7ca353e2f9242a87855d4a54 Mon Sep 17 00:00:00 2001 From: Riley Park Date: Wed, 3 Mar 2021 21:56:44 -0800 Subject: [PATCH 001/326] 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 002/326] 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 003/326] 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 004/326] 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 005/326] 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 006/326] 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 007/326] 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 008/326] 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 009/326] 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 010/326] 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 011/326] 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 012/326] 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 013/326] 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 014/326] 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 015/326] 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 016/326] 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 017/326] 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 018/326] 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 019/326] 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 020/326] 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 021/326] 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 022/326] 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 023/326] 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 024/326] 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 025/326] 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 026/326] 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 027/326] 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 028/326] 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 029/326] 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 030/326] 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 031/326] 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 032/326] 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 033/326] 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 034/326] 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 035/326] 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 036/326] 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 037/326] 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 038/326] 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 039/326] 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 040/326] 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 041/326] 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 042/326] 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 043/326] 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 044/326] 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 045/326] 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 046/326] 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 047/326] 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 048/326] 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 049/326] 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 050/326] 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 051/326] 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 052/326] 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 053/326] 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 054/326] 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 055/326] 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 056/326] 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 057/326] 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 058/326] 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 059/326] 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 060/326] 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 061/326] 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 062/326] 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 063/326] 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 064/326] 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 065/326] 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 066/326] 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 067/326] 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 068/326] 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 069/326] 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 070/326] 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 071/326] 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 072/326] 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 073/326] 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 074/326] 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 075/326] 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 076/326] 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 077/326] 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 078/326] 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 079/326] 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 080/326] 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 081/326] 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 082/326] 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 083/326] 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 084/326] 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 085/326] 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 086/326] 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 087/326] 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 088/326] 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 089/326] 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 090/326] 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 091/326] 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 092/326] 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 093/326] 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 094/326] 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 095/326] 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 096/326] 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 097/326] 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 098/326] 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 099/326] 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 100/326] 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 101/326] 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 102/326] 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 103/326] 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 104/326] 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 105/326] 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 106/326] 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 107/326] 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 108/326] 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 109/326] 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 110/326] 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 111/326] 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 112/326] 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 113/326] 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 114/326] 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 115/326] 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 116/326] 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 117/326] 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 118/326] 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 119/326] 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 120/326] 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 121/326] 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 122/326] 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 123/326] 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 124/326] 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 125/326] 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 126/326] 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 127/326] 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 128/326] 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 129/326] 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 130/326] 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 131/326] 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 132/326] 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 133/326] 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 134/326] 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 135/326] 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 136/326] 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 137/326] 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 138/326] 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 139/326] 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 140/326] 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 141/326] 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 142/326] 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 143/326] 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 144/326] 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 145/326] 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 146/326] 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 147/326] 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 148/326] 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 149/326] 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 150/326] 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 151/326] 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 152/326] 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 153/326] 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 154/326] 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 155/326] 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 156/326] 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 157/326] 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 158/326] 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 159/326] 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 160/326] 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 161/326] 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 162/326] 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 163/326] 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 164/326] 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 165/326] 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 166/326] 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 167/326] 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 168/326] 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 169/326] 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 170/326] 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 171/326] 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 172/326] 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 173/326] 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 174/326] 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 175/326] 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 176/326] 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 177/326] 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 178/326] 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 179/326] 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 180/326] 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 181/326] 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 182/326] 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 183/326] 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 184/326] 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 185/326] 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 186/326] 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 187/326] 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 188/326] 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 189/326] 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 190/326] 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 191/326] 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 192/326] 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 193/326] 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 194/326] 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 195/326] 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 196/326] 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 197/326] 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 198/326] 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 199/326] 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 200/326] 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 201/326] 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 202/326] 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 203/326] 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 204/326] 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 205/326] 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 206/326] 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 207/326] 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 208/326] 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 209/326] 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 210/326] 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 211/326] 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 212/326] 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 213/326] 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 214/326] 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 215/326] 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 216/326] 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 217/326] 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 218/326] 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 219/326] 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 220/326] 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 221/326] 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 222/326] 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 223/326] 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 224/326] 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 225/326] 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 226/326] 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 227/326] 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 228/326] 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 229/326] 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 230/326] 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 231/326] 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 232/326] 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 233/326] 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 234/326] 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 235/326] 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 236/326] 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 237/326] 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 238/326] 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 239/326] 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 240/326] 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 241/326] 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 242/326] 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 243/326] 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 244/326] 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 245/326] 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 246/326] 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 247/326] 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 248/326] 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 249/326] 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 250/326] 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 251/326] 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 252/326] 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 253/326] 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 254/326] 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 255/326] 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 256/326] 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 257/326] 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 258/326] 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 259/326] 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 260/326] 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 261/326] 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 262/326] 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 263/326] 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 264/326] 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 265/326] 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 266/326] 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 267/326] 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 268/326] 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 269/326] 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 270/326] (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 271/326] 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 272/326] 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 273/326] 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 274/326] 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 275/326] 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 276/326] 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 277/326] 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 278/326] 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 From 8b6a4c1e5b0bbff7ba81710af9e0801a043ca93a Mon Sep 17 00:00:00 2001 From: "Mads U. Jensen" Date: Fri, 11 Feb 2022 02:31:22 +0100 Subject: [PATCH 279/326] Update doubledrops IDs (#4743) --- src/main/resources/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 84798fd72..5892692c7 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -577,7 +577,7 @@ Bonus_Drops: Netherrack: true Obsidian: true Nether_Quartz_Ore: true - Nether_Quartz: true + Quartz: true Redstone_Ore: true Redstone: true Redstone_Dust: true From fa33fa3d32d0057fbacd1139f9eb584f12347a43 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 17 Mar 2022 13:49:07 -0700 Subject: [PATCH 280/326] Revert 3 commits (work will be continued in branch) Revert "Disabling mcMMO when the config breaks is dumb" This reverts commit 86e7bfbf89f027fec63730fa5a5da1884ed8a098. Revert "Config validation rewrite part 1" This reverts commit 16e90da8fdfe49741074294b9d7cc6438f6d27a2. Revert "Update changelog" This reverts commit 0ccd89fad4897b4a15e36437bed0d2f9b4ef7544. --- Changelog.txt | 2 - .../gmail/nossr50/config/AdvancedConfig.java | 182 +++++++++--------- .../gmail/nossr50/config/BukkitConfig.java | 40 ++-- .../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 | 98 +++++----- src/main/java/com/gmail/nossr50/mcMMO.java | 7 + .../nossr50/skills/child/ChildConfig.java | 5 - .../nossr50/util/upgrade/UpgradeManager.java | 6 - 18 files changed, 271 insertions(+), 294 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 9221f7f4c..9a33c8ee2 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,7 +1,5 @@ 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 diff --git a/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java b/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java index 50b9a0b1f..84da46281 100644 --- a/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java +++ b/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java @@ -14,6 +14,7 @@ public class AdvancedConfig extends BukkitConfig { public AdvancedConfig(File dataFolder) { super("advanced.yml", dataFolder); + validate(); } @Override @@ -22,125 +23,125 @@ public class AdvancedConfig extends BukkitConfig { } @Override - protected void validateConfigKeys() { - //TODO: Rewrite legacy validation code + protected boolean validateKeys() { + // Validate all the settings! List reason = new ArrayList<>(); /* GENERAL */ if (getAbilityLength() < 1) { - mcMMO.p.getLogger().warning("Skills.General.Ability.Length..IncreaseLevel should be at least 1!"); + reason.add("Skills.General.Ability.Length..IncreaseLevel should be at least 1!"); } if (getEnchantBuff() < 1) { - mcMMO.p.getLogger().warning("Skills.General.Ability.EnchantBuff should be at least 1!"); + reason.add("Skills.General.Ability.EnchantBuff should be at least 1!"); } /* ACROBATICS */ if (getMaximumProbability(SubSkillType.ACROBATICS_DODGE) < 1) { - mcMMO.p.getLogger().warning("Skills.Acrobatics.Dodge.ChanceMax should be at least 1!"); + reason.add("Skills.Acrobatics.Dodge.ChanceMax should be at least 1!"); } if (getMaxBonusLevel(SubSkillType.ACROBATICS_DODGE) < 1) { - mcMMO.p.getLogger().warning("Skills.Acrobatics.Dodge.MaxBonusLevel should be at least 1!"); + reason.add("Skills.Acrobatics.Dodge.MaxBonusLevel should be at least 1!"); } if (getDodgeDamageModifier() <= 1) { - mcMMO.p.getLogger().warning("Skills.Acrobatics.Dodge.DamageModifier should be greater than 1!"); + reason.add("Skills.Acrobatics.Dodge.DamageModifier should be greater than 1!"); } if (getMaximumProbability(SubSkillType.ACROBATICS_ROLL) < 1) { - mcMMO.p.getLogger().warning("Skills.Acrobatics.Roll.ChanceMax should be at least 1!"); + reason.add("Skills.Acrobatics.Roll.ChanceMax should be at least 1!"); } if (getMaxBonusLevel(SubSkillType.ACROBATICS_ROLL) < 1) { - mcMMO.p.getLogger().warning("Skills.Acrobatics.Roll.MaxBonusLevel should be at least 1!"); + reason.add("Skills.Acrobatics.Roll.MaxBonusLevel should be at least 1!"); } if (getRollDamageThreshold() < 0) { - mcMMO.p.getLogger().warning("Skills.Acrobatics.Roll.DamageThreshold should be at least 0!"); + reason.add("Skills.Acrobatics.Roll.DamageThreshold should be at least 0!"); } if (getGracefulRollDamageThreshold() < 0) { - mcMMO.p.getLogger().warning("Skills.Acrobatics.GracefulRoll.DamageThreshold should be at least 0!"); + reason.add("Skills.Acrobatics.GracefulRoll.DamageThreshold should be at least 0!"); } if (getCatalysisMinSpeed() <= 0) { - mcMMO.p.getLogger().warning("Skills.Alchemy.Catalysis.MinSpeed must be greater than 0!"); + reason.add("Skills.Alchemy.Catalysis.MinSpeed must be greater than 0!"); } if (getCatalysisMaxSpeed() < getCatalysisMinSpeed()) { - mcMMO.p.getLogger().warning("Skills.Alchemy.Catalysis.MaxSpeed should be at least Skills.Alchemy.Catalysis.MinSpeed!"); + reason.add("Skills.Alchemy.Catalysis.MaxSpeed should be at least Skills.Alchemy.Catalysis.MinSpeed!"); } /* ARCHERY */ if (getSkillShotRankDamageMultiplier() <= 0) { - mcMMO.p.getLogger().warning("Skills.Archery.SkillShot.RankDamageMultiplier should be greater than 0!"); + reason.add("Skills.Archery.SkillShot.RankDamageMultiplier should be greater than 0!"); } if (getMaximumProbability(SubSkillType.ARCHERY_DAZE) < 1) { - mcMMO.p.getLogger().warning("Skills.Archery.Daze.ChanceMax should be at least 1!"); + reason.add("Skills.Archery.Daze.ChanceMax should be at least 1!"); } if (getMaxBonusLevel(SubSkillType.ARCHERY_DAZE) < 1) { - mcMMO.p.getLogger().warning("Skills.Archery.Daze.MaxBonusLevel should be at least 1!"); + reason.add("Skills.Archery.Daze.MaxBonusLevel should be at least 1!"); } if (getDazeBonusDamage() < 0) { - mcMMO.p.getLogger().warning("Skills.Archery.Daze.BonusDamage should be at least 0!"); + reason.add("Skills.Archery.Daze.BonusDamage should be at least 0!"); } if (getMaximumProbability(SubSkillType.ARCHERY_ARROW_RETRIEVAL) < 1) { - mcMMO.p.getLogger().warning("Skills.Archery.Retrieve.ChanceMax should be at least 1!"); + reason.add("Skills.Archery.Retrieve.ChanceMax should be at least 1!"); } if (getMaxBonusLevel(SubSkillType.ARCHERY_ARROW_RETRIEVAL) < 1) { - mcMMO.p.getLogger().warning("Skills.Archery.Retrieve.MaxBonusLevel should be at least 1!"); + reason.add("Skills.Archery.Retrieve.MaxBonusLevel should be at least 1!"); } if (getForceMultiplier() < 0) { - mcMMO.p.getLogger().warning("Skills.Archery.ForceMultiplier should be at least 0!"); + reason.add("Skills.Archery.ForceMultiplier should be at least 0!"); } /* AXES */ if (getAxeMasteryRankDamageMultiplier() < 0) { - mcMMO.p.getLogger().warning("Skills.Axes.AxeMastery.RankDamageMultiplier should be at least 0!"); + reason.add("Skills.Axes.AxeMastery.RankDamageMultiplier should be at least 0!"); } if (getMaximumProbability(SubSkillType.AXES_CRITICAL_STRIKES) < 1) { - mcMMO.p.getLogger().warning("Skills.Axes.CriticalHit.ChanceMax should be at least 1!"); + reason.add("Skills.Axes.CriticalHit.ChanceMax should be at least 1!"); } if (getMaxBonusLevel(SubSkillType.AXES_CRITICAL_STRIKES) < 1) { - mcMMO.p.getLogger().warning("Skills.Axes.CriticalHit.MaxBonusLevel should be at least 1!"); + reason.add("Skills.Axes.CriticalHit.MaxBonusLevel should be at least 1!"); } if (getCriticalStrikesPVPModifier() < 1) { - mcMMO.p.getLogger().warning("Skills.Axes.CriticalStrikes.PVP_Modifier should be at least 1!"); + reason.add("Skills.Axes.CriticalStrikes.PVP_Modifier should be at least 1!"); } if (getCriticalStrikesPVPModifier() < 1) { - mcMMO.p.getLogger().warning("Skills.Axes.CriticalStrikes.PVE_Modifier should be at least 1!"); + reason.add("Skills.Axes.CriticalStrikes.PVE_Modifier should be at least 1!"); } if (getGreaterImpactChance() < 1) { - mcMMO.p.getLogger().warning("Skills.Axes.GreaterImpact.Chance should be at least 1!"); + reason.add("Skills.Axes.GreaterImpact.Chance should be at least 1!"); } if (getGreaterImpactModifier() < 1) { - mcMMO.p.getLogger().warning("Skills.Axes.GreaterImpact.KnockbackModifier should be at least 1!"); + reason.add("Skills.Axes.GreaterImpact.KnockbackModifier should be at least 1!"); } if (getGreaterImpactBonusDamage() < 1) { - mcMMO.p.getLogger().warning("Skills.Axes.GreaterImpact.BonusDamage should be at least 1!"); + reason.add("Skills.Axes.GreaterImpact.BonusDamage should be at least 1!"); } if (getImpactChance() < 1) { - mcMMO.p.getLogger().warning("Skills.Axes.ArmorImpact.Chance should be at least 1!"); + reason.add("Skills.Axes.ArmorImpact.Chance should be at least 1!"); } if (getSkullSplitterModifier() < 1) { - mcMMO.p.getLogger().warning("Skills.Axes.SkullSplitter.DamageModifier should be at least 1!"); + reason.add("Skills.Axes.SkullSplitter.DamageModifier should be at least 1!"); } /* FISHING */ @@ -148,261 +149,262 @@ public class AdvancedConfig extends BukkitConfig { for (int rank : fishingTierList) { if (getFishingTierLevel(tier) < 0) { - mcMMO.p.getLogger().warning("Skills.Fishing.Rank_Levels.Rank_" + rank + " should be at least 0!"); + reason.add("Skills.Fishing.Rank_Levels.Rank_" + rank + " should be at least 0!"); } if (getShakeChance(tier) < 0) { - mcMMO.p.getLogger().warning("Skills.Fishing.Shake_Chance.Rank_" + rank + " should be at least 0!"); + reason.add("Skills.Fishing.Shake_Chance.Rank_" + rank + " should be at least 0!"); } if (getFishingVanillaXPModifier(tier) < 0) { - mcMMO.p.getLogger().warning("Skills.Fishing.VanillaXPMultiplier.Rank_" + rank + " should be at least 0!"); + reason.add("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)) { - mcMMO.p.getLogger().warning("Skills.Fishing.Rank_Levels.Rank_" + rank + " should be less than or equal to Skills.Fishing.Rank_Levels.Rank_" + nextrank + "!"); + reason.add("Skills.Fishing.Rank_Levels.Rank_" + rank + " should be less than or equal to Skills.Fishing.Rank_Levels.Rank_" + nextrank + "!"); } if (getShakeChance(tier) > getShakeChance(nextTier)) { - mcMMO.p.getLogger().warning("Skills.Fishing.Shake_Chance.Rank_" + rank + " should be less than or equal to Skills.Fishing.Shake_Chance.Rank_" + nextrank + "!"); + reason.add("Skills.Fishing.Shake_Chance.Rank_" + rank + " should be less than or equal to Skills.Fishing.Shake_Chance.Rank_" + nextrank + "!"); } if (getFishingVanillaXPModifier(tier) > getFishingVanillaXPModifier(nextTier)) { - mcMMO.p.getLogger().warning("Skills.Fishing.VanillaXPMultiplier.Rank_" + rank + " should be less than or equal to Skills.Fishing.VanillaXPMultiplier.Rank_" + nextrank + "!"); + reason.add("Skills.Fishing.VanillaXPMultiplier.Rank_" + rank + " should be less than or equal to Skills.Fishing.VanillaXPMultiplier.Rank_" + nextrank + "!"); } } }*/ if (getFishermanDietRankChange() < 1) { - mcMMO.p.getLogger().warning("Skills.Fishing.FishermansDiet.RankChange should be at least 1!"); + reason.add("Skills.Fishing.FishermansDiet.RankChange should be at least 1!"); } /*if (getIceFishingUnlockLevel() < 0) { - mcMMO.p.getLogger().warning("Skills.Fishing.IceFishing.UnlockLevel should be at least 0!"); + reason.add("Skills.Fishing.IceFishing.UnlockLevel should be at least 0!"); } if (getMasterAnglerUnlockLevel() < 0) { - mcMMO.p.getLogger().warning("Skills.Fishing.MasterAngler.UnlockLevel should be at least 0!"); + reason.add("Skills.Fishing.MasterAngler.UnlockLevel should be at least 0!"); }*/ if (getMasterAnglerBoatModifier() < 1) { - mcMMO.p.getLogger().warning("Skills.Fishing.MasterAngler.BoatModifier should be at least 1!"); + reason.add("Skills.Fishing.MasterAngler.BoatModifier should be at least 1!"); } if (getMasterAnglerBiomeModifier() < 1) { - mcMMO.p.getLogger().warning("Skills.Fishing.MasterAngler.BiomeModifier should be at least 1!"); + reason.add("Skills.Fishing.MasterAngler.BiomeModifier should be at least 1!"); } /* HERBALISM */ if (getFarmerDietRankChange() < 1) { - mcMMO.p.getLogger().warning("Skills.Herbalism.FarmersDiet.RankChange should be at least 1!"); + reason.add("Skills.Herbalism.FarmersDiet.RankChange should be at least 1!"); } if (getGreenThumbStageChange() < 1) { - mcMMO.p.getLogger().warning("Skills.Herbalism.GreenThumb.StageChange should be at least 1!"); + reason.add("Skills.Herbalism.GreenThumb.StageChange should be at least 1!"); } if (getMaximumProbability(SubSkillType.HERBALISM_GREEN_THUMB) < 1) { - mcMMO.p.getLogger().warning("Skills.Herbalism.GreenThumb.ChanceMax should be at least 1!"); + reason.add("Skills.Herbalism.GreenThumb.ChanceMax should be at least 1!"); } if (getMaxBonusLevel(SubSkillType.HERBALISM_GREEN_THUMB) < 1) { - mcMMO.p.getLogger().warning("Skills.Herbalism.GreenThumb.MaxBonusLevel should be at least 1!"); + reason.add("Skills.Herbalism.GreenThumb.MaxBonusLevel should be at least 1!"); } if (getMaximumProbability(SubSkillType.HERBALISM_DOUBLE_DROPS) < 1) { - mcMMO.p.getLogger().warning("Skills.Herbalism.DoubleDrops.ChanceMax should be at least 1!"); + reason.add("Skills.Herbalism.DoubleDrops.ChanceMax should be at least 1!"); } if (getMaxBonusLevel(SubSkillType.HERBALISM_DOUBLE_DROPS) < 1) { - mcMMO.p.getLogger().warning("Skills.Herbalism.DoubleDrops.MaxBonusLevel should be at least 1!"); + reason.add("Skills.Herbalism.DoubleDrops.MaxBonusLevel should be at least 1!"); } if (getMaximumProbability(SubSkillType.HERBALISM_HYLIAN_LUCK) < 1) { - mcMMO.p.getLogger().warning("Skills.Herbalism.HylianLuck.ChanceMax should be at least 1!"); + reason.add("Skills.Herbalism.HylianLuck.ChanceMax should be at least 1!"); } if (getMaxBonusLevel(SubSkillType.HERBALISM_HYLIAN_LUCK) < 1) { - mcMMO.p.getLogger().warning("Skills.Herbalism.HylianLuck.MaxBonusLevel should be at least 1!"); + reason.add("Skills.Herbalism.HylianLuck.MaxBonusLevel should be at least 1!"); } if (getMaximumProbability(SubSkillType.HERBALISM_SHROOM_THUMB) < 1) { - mcMMO.p.getLogger().warning("Skills.Herbalism.ShroomThumb.ChanceMax should be at least 1!"); + reason.add("Skills.Herbalism.ShroomThumb.ChanceMax should be at least 1!"); } if (getMaxBonusLevel(SubSkillType.HERBALISM_SHROOM_THUMB) < 1) { - mcMMO.p.getLogger().warning("Skills.Herbalism.ShroomThumb.MaxBonusLevel should be at least 1!"); + reason.add("Skills.Herbalism.ShroomThumb.MaxBonusLevel should be at least 1!"); } /* MINING */ if (getMaximumProbability(SubSkillType.MINING_DOUBLE_DROPS) < 1) { - mcMMO.p.getLogger().warning("Skills.Mining.DoubleDrops.ChanceMax should be at least 1!"); + reason.add("Skills.Mining.DoubleDrops.ChanceMax should be at least 1!"); } if (getMaxBonusLevel(SubSkillType.MINING_DOUBLE_DROPS) < 1) { - mcMMO.p.getLogger().warning("Skills.Mining.DoubleDrops.MaxBonusLevel should be at least 1!"); + reason.add("Skills.Mining.DoubleDrops.MaxBonusLevel should be at least 1!"); } /* REPAIR */ if (getRepairMasteryMaxBonus() < 1) { - mcMMO.p.getLogger().warning("Skills.Repair.RepairMastery.MaxBonusPercentage should be at least 1!"); + reason.add("Skills.Repair.RepairMastery.MaxBonusPercentage should be at least 1!"); } if (getRepairMasteryMaxLevel() < 1) { - mcMMO.p.getLogger().warning("Skills.Repair.RepairMastery.MaxBonusLevel should be at least 1!"); + reason.add("Skills.Repair.RepairMastery.MaxBonusLevel should be at least 1!"); } if (getMaximumProbability(SubSkillType.REPAIR_SUPER_REPAIR) < 1) { - mcMMO.p.getLogger().warning("Skills.Repair.SuperRepair.ChanceMax should be at least 1!"); + reason.add("Skills.Repair.SuperRepair.ChanceMax should be at least 1!"); } if (getMaxBonusLevel(SubSkillType.REPAIR_SUPER_REPAIR) < 1) { - mcMMO.p.getLogger().warning("Skills.Repair.SuperRepair.MaxBonusLevel should be at least 1!"); + reason.add("Skills.Repair.SuperRepair.MaxBonusLevel should be at least 1!"); } /* SMELTING */ if (getBurnModifierMaxLevel() < 1) { - mcMMO.p.getLogger().warning("Skills.Smelting.FuelEfficiency.MaxBonusLevel should be at least 1!"); + reason.add("Skills.Smelting.FuelEfficiency.MaxBonusLevel should be at least 1!"); } if (getMaxBonusLevel(SubSkillType.SMELTING_SECOND_SMELT) < 1) { - mcMMO.p.getLogger().warning("Skills.Smelting.SecondSmelt.MaxBonusLevel should be at least 1!"); + reason.add("Skills.Smelting.SecondSmelt.MaxBonusLevel should be at least 1!"); } if (getMaximumProbability(SubSkillType.SMELTING_SECOND_SMELT) < 1) { - mcMMO.p.getLogger().warning("Skills.Smelting.SecondSmelt.ChanceMax should be at least 1!"); + reason.add("Skills.Smelting.SecondSmelt.ChanceMax should be at least 1!"); } if (getFluxMiningChance() < 1) { - mcMMO.p.getLogger().warning("Skills.Smelting.FluxMining.Chance should be at least 1!"); + reason.add("Skills.Smelting.FluxMining.Chance should be at least 1!"); } /* SWORDS */ if (getMaximumProbability(SubSkillType.SWORDS_COUNTER_ATTACK) < 1) { - mcMMO.p.getLogger().warning("Skills.Swords.CounterAttack.ChanceMax should be at least 1!"); + reason.add("Skills.Swords.CounterAttack.ChanceMax should be at least 1!"); } if (getMaxBonusLevel(SubSkillType.SWORDS_COUNTER_ATTACK) < 1) { - mcMMO.p.getLogger().warning("Skills.Swords.CounterAttack.MaxBonusLevel should be at least 1!"); + reason.add("Skills.Swords.CounterAttack.MaxBonusLevel should be at least 1!"); } if (getCounterModifier() < 1) { - mcMMO.p.getLogger().warning("Skills.Swords.CounterAttack.DamageModifier should be at least 1!"); + reason.add("Skills.Swords.CounterAttack.DamageModifier should be at least 1!"); } if (getSerratedStrikesModifier() < 1) { - mcMMO.p.getLogger().warning("Skills.Swords.SerratedStrikes.DamageModifier should be at least 1!"); + reason.add("Skills.Swords.SerratedStrikes.DamageModifier should be at least 1!"); } if (getSerratedStrikesTicks() < 1) { - mcMMO.p.getLogger().warning("Skills.Swords.SerratedStrikes.RuptureTicks should be at least 1!"); + reason.add("Skills.Swords.SerratedStrikes.RuptureTicks should be at least 1!"); } /* TAMING */ if (getMaximumProbability(SubSkillType.TAMING_GORE) < 1) { - mcMMO.p.getLogger().warning("Skills.Taming.Gore.ChanceMax should be at least 1!"); + reason.add("Skills.Taming.Gore.ChanceMax should be at least 1!"); } if (getMaxBonusLevel(SubSkillType.TAMING_GORE) < 1) { - mcMMO.p.getLogger().warning("Skills.Taming.Gore.MaxBonusLevel should be at least 1!"); + reason.add("Skills.Taming.Gore.MaxBonusLevel should be at least 1!"); } /*if (getGoreRuptureTicks() < 1) { - mcMMO.p.getLogger().warning("Skills.Taming.Gore.RuptureTicks should be at least 1!"); + reason.add("Skills.Taming.Gore.RuptureTicks should be at least 1!"); }*/ if (getGoreModifier() < 1) { - mcMMO.p.getLogger().warning("Skills.Taming.Gore.Modifier should be at least 1!"); + reason.add("Skills.Taming.Gore.Modifier should be at least 1!"); } /*if (getFastFoodUnlock() < 0) { - mcMMO.p.getLogger().warning("Skills.Taming.FastFood.UnlockLevel should be at least 0!"); + reason.add("Skills.Taming.FastFood.UnlockLevel should be at least 0!"); }*/ if (getFastFoodChance() < 1) { - mcMMO.p.getLogger().warning("Skills.Taming.FastFood.Chance should be at least 1!"); + reason.add("Skills.Taming.FastFood.Chance should be at least 1!"); } /*if (getEnviromentallyAwareUnlock() < 0) { - mcMMO.p.getLogger().warning("Skills.Taming.EnvironmentallyAware.UnlockLevel should be at least 0!"); + reason.add("Skills.Taming.EnvironmentallyAware.UnlockLevel should be at least 0!"); }*/ /*if (getThickFurUnlock() < 0) { - mcMMO.p.getLogger().warning("Skills.Taming.ThickFur.UnlockLevel should be at least 0!"); + reason.add("Skills.Taming.ThickFur.UnlockLevel should be at least 0!"); }*/ if (getThickFurModifier() < 1) { - mcMMO.p.getLogger().warning("Skills.Taming.ThickFur.Modifier should be at least 1!"); + reason.add("Skills.Taming.ThickFur.Modifier should be at least 1!"); } /*if (getHolyHoundUnlock() < 0) { - mcMMO.p.getLogger().warning("Skills.Taming.HolyHound.UnlockLevel should be at least 0!"); + reason.add("Skills.Taming.HolyHound.UnlockLevel should be at least 0!"); } if (getShockProofUnlock() < 0) { - mcMMO.p.getLogger().warning("Skills.Taming.ShockProof.UnlockLevel should be at least 0!"); + reason.add("Skills.Taming.ShockProof.UnlockLevel should be at least 0!"); }*/ if (getShockProofModifier() < 1) { - mcMMO.p.getLogger().warning("Skills.Taming.ShockProof.Modifier should be at least 1!"); + reason.add("Skills.Taming.ShockProof.Modifier should be at least 1!"); } /*if (getSharpenedClawsUnlock() < 0) { - mcMMO.p.getLogger().warning("Skills.Taming.SharpenedClaws.UnlockLevel should be at least 0!"); + reason.add("Skills.Taming.SharpenedClaws.UnlockLevel should be at least 0!"); }*/ if (getSharpenedClawsBonus() < 1) { - mcMMO.p.getLogger().warning("Skills.Taming.SharpenedClaws.Bonus should be at least 1!"); + reason.add("Skills.Taming.SharpenedClaws.Bonus should be at least 1!"); } if (getMaxHorseJumpStrength() < 0 || getMaxHorseJumpStrength() > 2) { - mcMMO.p.getLogger().warning("Skills.Taming.CallOfTheWild.MaxHorseJumpStrength should be between 0 and 2!"); + reason.add("Skills.Taming.CallOfTheWild.MaxHorseJumpStrength should be between 0 and 2!"); } /* UNARMED */ if (getMaximumProbability(SubSkillType.UNARMED_DISARM) < 1) { - mcMMO.p.getLogger().warning("Skills.Unarmed.Disarm.ChanceMax should be at least 1!"); + reason.add("Skills.Unarmed.Disarm.ChanceMax should be at least 1!"); } if (getMaxBonusLevel(SubSkillType.UNARMED_DISARM) < 1) { - mcMMO.p.getLogger().warning("Skills.Unarmed.Disarm.MaxBonusLevel should be at least 1!"); + reason.add("Skills.Unarmed.Disarm.MaxBonusLevel should be at least 1!"); } if (getMaximumProbability(SubSkillType.UNARMED_ARROW_DEFLECT) < 1) { - mcMMO.p.getLogger().warning("Skills.Unarmed.ArrowDeflect.ChanceMax should be at least 1!"); + reason.add("Skills.Unarmed.ArrowDeflect.ChanceMax should be at least 1!"); } if (getMaxBonusLevel(SubSkillType.UNARMED_ARROW_DEFLECT) < 1) { - mcMMO.p.getLogger().warning("Skills.Unarmed.ArrowDeflect.MaxBonusLevel should be at least 1!"); + reason.add("Skills.Unarmed.ArrowDeflect.MaxBonusLevel should be at least 1!"); } if (getMaximumProbability(SubSkillType.UNARMED_IRON_GRIP) < 1) { - mcMMO.p.getLogger().warning("Skills.Unarmed.IronGrip.ChanceMax should be at least 1!"); + reason.add("Skills.Unarmed.IronGrip.ChanceMax should be at least 1!"); } if (getMaxBonusLevel(SubSkillType.UNARMED_IRON_GRIP) < 1) { - mcMMO.p.getLogger().warning("Skills.Unarmed.IronGrip.MaxBonusLevel should be at least 1!"); + reason.add("Skills.Unarmed.IronGrip.MaxBonusLevel should be at least 1!"); } /* WOODCUTTING */ /*if (getLeafBlowUnlockLevel() < 0) { - mcMMO.p.getLogger().warning("Skills.Woodcutting.LeafBlower.UnlockLevel should be at least 0!"); + reason.add("Skills.Woodcutting.LeafBlower.UnlockLevel should be at least 0!"); }*/ if (getMaximumProbability(SubSkillType.WOODCUTTING_HARVEST_LUMBER) < 1) { - mcMMO.p.getLogger().warning("Skills.Woodcutting.HarvestLumber.ChanceMax should be at least 1!"); + reason.add("Skills.Woodcutting.HarvestLumber.ChanceMax should be at least 1!"); } if (getMaxBonusLevel(SubSkillType.WOODCUTTING_HARVEST_LUMBER) < 1) { - mcMMO.p.getLogger().warning("Skills.Woodcutting.HarvestLumber.MaxBonusLevel should be at least 1!"); + reason.add("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 ccf59b5a9..a22990e00 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 { - protected static final String CONFIG_PATCH_PREFIX = "ConfigPatchVersion:"; - protected static final String CURRENT_CONFIG_PATCH_VER = "ConfigPatchVersion: 2"; - protected static final char COMMENT_PREFIX = '#'; + 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; 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,7 +30,6 @@ public abstract class BukkitConfig { initDefaults(); updateFile(); mcMMO.p.getLogger().info("[config] Config initialized: " + fileName); - validate(); } @Deprecated @@ -84,28 +83,25 @@ public abstract class BukkitConfig { protected abstract void loadKeys(); - protected abstract void validateConfigKeys(); - - protected void fixConfigKey(@NotNull String key, @NotNull String value, @NotNull String reason) { - mcMMO.p.getLogger().warning(reason); - config.set(key, value); - this.unmodifiedConfig = false; //flag to save config + protected boolean validateKeys() { + return true; } - private void validate() { - //TODO: Rewrite legacy validation code - validateConfigKeys(); + protected boolean noErrorsInConfig(List issues) { + for (String issue : issues) { + mcMMO.p.getLogger().warning(issue); + } - if (unmodifiedConfig) { + 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 + ", overwriting invalid values with defaults"); - try { - config.save(configFile); - unmodifiedConfig = true; - } catch (IOException e) { - e.printStackTrace(); - } + 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/ChatConfig.java b/src/main/java/com/gmail/nossr50/config/ChatConfig.java index b01fdb84a..bbda1b69c 100644 --- a/src/main/java/com/gmail/nossr50/config/ChatConfig.java +++ b/src/main/java/com/gmail/nossr50/config/ChatConfig.java @@ -9,6 +9,7 @@ public class ChatConfig extends BukkitConfig { private ChatConfig() { super("chat.yml"); + validate(); } public static ChatConfig getInstance() { @@ -25,8 +26,8 @@ public class ChatConfig extends BukkitConfig { } @Override - protected void validateConfigKeys() { - //TODO: Rewrite legacy validation code + protected boolean validateKeys() { + return true; } 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 376aa2944..972bd697e 100644 --- a/src/main/java/com/gmail/nossr50/config/ConfigLoader.java +++ b/src/main/java/com/gmail/nossr50/config/ConfigLoader.java @@ -79,6 +79,7 @@ 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 16b763d7c..f92990ad6 100644 --- a/src/main/java/com/gmail/nossr50/config/CoreSkillsConfig.java +++ b/src/main/java/com/gmail/nossr50/config/CoreSkillsConfig.java @@ -9,6 +9,7 @@ public class CoreSkillsConfig extends BukkitConfig { public CoreSkillsConfig() { super("coreskills.yml"); + validate(); } public static CoreSkillsConfig getInstance() { @@ -24,8 +25,9 @@ public class CoreSkillsConfig extends BukkitConfig { } @Override - protected void validateConfigKeys() { - //TODO: Rewrite legacy validation code + protected boolean validateKeys() { + + return true; } /* diff --git a/src/main/java/com/gmail/nossr50/config/GeneralConfig.java b/src/main/java/com/gmail/nossr50/config/GeneralConfig.java index 4749d908d..fb86a42f4 100644 --- a/src/main/java/com/gmail/nossr50/config/GeneralConfig.java +++ b/src/main/java/com/gmail/nossr50/config/GeneralConfig.java @@ -5,7 +5,6 @@ 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; @@ -23,6 +22,7 @@ public class GeneralConfig extends BukkitConfig { public GeneralConfig(@NotNull File dataFolder) { super("config.yml", dataFolder); + validate(); } @Override @@ -31,125 +31,127 @@ public class GeneralConfig extends BukkitConfig { } @Override - protected void validateConfigKeys() { - //TODO: Rewrite legacy validation code + protected boolean validateKeys() { + // Validate all the settings! List reason = new ArrayList<>(); /* General Settings */ if (getSaveInterval() <= 0) { - mcMMO.p.getLogger().info("General.Save_Interval should be greater than 0!"); + reason.add("General.Save_Interval should be greater than 0!"); } /* MySQL Settings */ for (PoolIdentifier identifier : PoolIdentifier.values()) { if (getMySQLMaxConnections(identifier) <= 0) { - mcMMO.p.getLogger().warning("MySQL.Database.MaxConnections." + StringUtils.getCapitalized(identifier.toString()) + " should be greater than 0!"); + reason.add("MySQL.Database.MaxConnections." + StringUtils.getCapitalized(identifier.toString()) + " should be greater than 0!"); } if (getMySQLMaxPoolSize(identifier) <= 0) { - mcMMO.p.getLogger().warning("MySQL.Database.MaxPoolSize." + StringUtils.getCapitalized(identifier.toString()) + " should be greater than 0!"); + reason.add("MySQL.Database.MaxPoolSize." + StringUtils.getCapitalized(identifier.toString()) + " should be greater than 0!"); } } /* Mob Healthbar */ if (getMobHealthbarTime() == 0) { - mcMMO.p.getLogger().warning("Mob_Healthbar.Display_Time cannot be 0! Set to -1 to disable or set a valid value."); + reason.add("Mob_Healthbar.Display_Time cannot be 0! Set to -1 to disable or set a valid value."); } /* Database Purging */ if (getPurgeInterval() < -1) { - mcMMO.p.getLogger().warning("Database_Purging.Purge_Interval should be greater than, or equal to -1!"); + reason.add("Database_Purging.Purge_Interval should be greater than, or equal to -1!"); } if (getOldUsersCutoff() != -1 && getOldUsersCutoff() <= 0) { - mcMMO.p.getLogger().warning("Database_Purging.Old_User_Cutoff should be greater than 0 or -1!"); + reason.add("Database_Purging.Old_User_Cutoff should be greater than 0 or -1!"); } /* Hardcore Mode */ if (getHardcoreDeathStatPenaltyPercentage() < 0.01 || getHardcoreDeathStatPenaltyPercentage() > 100) { - mcMMO.p.getLogger().warning("Hardcore.Death_Stat_Loss.Penalty_Percentage only accepts values from 0.01 to 100!"); + reason.add("Hardcore.Death_Stat_Loss.Penalty_Percentage only accepts values from 0.01 to 100!"); } if (getHardcoreVampirismStatLeechPercentage() < 0.01 || getHardcoreVampirismStatLeechPercentage() > 100) { - mcMMO.p.getLogger().warning("Hardcore.Vampirism.Leech_Percentage only accepts values from 0.01 to 100!"); + reason.add("Hardcore.Vampirism.Leech_Percentage only accepts values from 0.01 to 100!"); } /* Items */ if (getChimaeraUseCost() < 1 || getChimaeraUseCost() > 64) { - mcMMO.p.getLogger().warning("Items.Chimaera_Wing.Use_Cost only accepts values from 1 to 64!"); + reason.add("Items.Chimaera_Wing.Use_Cost only accepts values from 1 to 64!"); } if (getChimaeraRecipeCost() < 1 || getChimaeraRecipeCost() > 9) { - mcMMO.p.getLogger().warning("Items.Chimaera_Wing.Recipe_Cost only accepts values from 1 to 9!"); + reason.add("Items.Chimaera_Wing.Recipe_Cost only accepts values from 1 to 9!"); } if (getChimaeraItem() == null) { - mcMMO.p.getLogger().warning("Items.Chimaera_Wing.Item_Name is invalid!"); + reason.add("Items.Chimaera_Wing.Item_Name is invalid!"); } /* Particles */ if (getLevelUpEffectsTier() < 1) { - mcMMO.p.getLogger().warning("Particles.LevelUp_Tier should be at least 1!"); + reason.add("Particles.LevelUp_Tier should be at least 1!"); } /* PARTY SETTINGS */ if (getAutoPartyKickInterval() < -1) { - mcMMO.p.getLogger().warning("Party.AutoKick_Interval should be at least -1!"); + reason.add("Party.AutoKick_Interval should be at least -1!"); } if (getAutoPartyKickTime() < 0) { - mcMMO.p.getLogger().warning("Party.Old_Party_Member_Cutoff should be at least 0!"); + reason.add("Party.Old_Party_Member_Cutoff should be at least 0!"); } if (getPartyShareBonusBase() <= 0) { - mcMMO.p.getLogger().warning("Party.Sharing.ExpShare_bonus_base should be greater than 0!"); + reason.add("Party.Sharing.ExpShare_bonus_base should be greater than 0!"); } if (getPartyShareBonusIncrease() < 0) { - mcMMO.p.getLogger().warning("Party.Sharing.ExpShare_bonus_increase should be at least 0!"); + reason.add("Party.Sharing.ExpShare_bonus_increase should be at least 0!"); } if (getPartyShareBonusCap() <= 0) { - mcMMO.p.getLogger().warning("Party.Sharing.ExpShare_bonus_cap should be greater than 0!"); + reason.add("Party.Sharing.ExpShare_bonus_cap should be greater than 0!"); } if (getPartyShareRange() <= 0) { - mcMMO.p.getLogger().warning("Party.Sharing.Range should be greater than 0!"); + reason.add("Party.Sharing.Range should be greater than 0!"); } if (getPartyXpCurveMultiplier() < 1) { - mcMMO.p.getLogger().warning("Party.Leveling.Xp_Curve_Modifier should be at least 1!"); + reason.add("Party.Leveling.Xp_Curve_Modifier should be at least 1!"); } for (PartyFeature partyFeature : PartyFeature.values()) { if (getPartyFeatureUnlockLevel(partyFeature) < 0) { - mcMMO.p.getLogger().warning("Party.Leveling." + StringUtils.getPrettyPartyFeatureString(partyFeature).replace(" ", "") + "_UnlockLevel should be at least 0!"); + reason.add("Party.Leveling." + StringUtils.getPrettyPartyFeatureString(partyFeature).replace(" ", "") + "_UnlockLevel should be at least 0!"); } } /* Inspect command distance */ if (getInspectDistance() <= 0) { - mcMMO.p.getLogger().warning("Commands.inspect.Max_Distance should be greater than 0!"); + reason.add("Commands.inspect.Max_Distance should be greater than 0!"); } if (getTreeFellerThreshold() <= 0) { - mcMMO.p.getLogger().warning("Abilities.Limits.Tree_Feller_Threshold should be greater than 0!"); + reason.add("Abilities.Limits.Tree_Feller_Threshold should be greater than 0!"); } if (getFishingLureModifier() < 0) { - mcMMO.p.getLogger().warning("Abilities.Fishing.Lure_Modifier should be at least 0!"); + reason.add("Abilities.Fishing.Lure_Modifier should be at least 0!"); } if (getRepairAnvilMaterial() == null) { - mcMMO.p.getLogger().warning("Skills.Repair.Anvil_Type is invalid!!"); + reason.add("Skills.Repair.Anvil_Type is invalid!!"); } if (getSalvageAnvilMaterial() == null) { - mcMMO.p.getLogger().warning("Skills.Repair.Salvage_Anvil_Type is invalid!"); + reason.add("Skills.Repair.Salvage_Anvil_Type is invalid!"); } if (getRepairAnvilMaterial() == getSalvageAnvilMaterial()) { - mcMMO.p.getLogger().warning("Cannot use the same item for Repair and Salvage anvils!"); + reason.add("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 e0fd3d8e9..089db89b8 100644 --- a/src/main/java/com/gmail/nossr50/config/PersistentDataConfig.java +++ b/src/main/java/com/gmail/nossr50/config/PersistentDataConfig.java @@ -7,6 +7,7 @@ public class PersistentDataConfig extends BukkitConfig { private PersistentDataConfig() { super("persistent_data.yml"); + validate(); } public static PersistentDataConfig getInstance() { @@ -23,8 +24,8 @@ public class PersistentDataConfig extends BukkitConfig { } @Override - protected void validateConfigKeys() { - //TODO: Rewrite legacy validation code + protected boolean validateKeys() { + return true; } //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 d365ab31b..e19ad7f44 100644 --- a/src/main/java/com/gmail/nossr50/config/SoundConfig.java +++ b/src/main/java/com/gmail/nossr50/config/SoundConfig.java @@ -8,6 +8,7 @@ public class SoundConfig extends BukkitConfig { public SoundConfig() { super("sounds.yml"); + validate(); instance = this; } @@ -24,24 +25,22 @@ public class SoundConfig extends BukkitConfig { } @Override - protected void validateConfigKeys() { - //TODO: Rewrite legacy validation code + 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); - //TODO: Rewrite legacy validation code - //return false; + 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); - //TODO: Rewrite legacy validation code - //return false; + 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 8a51736c8..d10145212 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,6 @@ 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; @@ -14,17 +13,16 @@ 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() { @@ -35,18 +33,12 @@ public class ExperienceConfig extends BukkitConfig { return instance; } - @Override - public void initDefaults() { - super.initDefaults(); - } - @Override protected void loadKeys() { } @Override - protected void validateConfigKeys() { - //TODO: Rewrite legacy validation code + protected boolean validateKeys() { List reason = new ArrayList<>(); /* @@ -54,48 +46,41 @@ public class ExperienceConfig extends BukkitConfig { */ /* Curve values */ - final BiConsumer consumer = (String str, Object obj) -> config.set(str, obj); - - if (getMultiplier(FormulaType.LINEAR) <= 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) { + reason.add("Experience_Formula.Exponential_Values.multiplier should be greater than 0!"); } - 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 (getMultiplier(FormulaType.LINEAR) <= 0) { + reason.add("Experience_Formula.Linear_Values.multiplier should be greater than 0!"); } if (getExponent(FormulaType.EXPONENTIAL) <= 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); + reason.add("Experience_Formula.Exponential_Values.exponent should be greater than 0!"); } /* Global modifier */ if (getExperienceGainsGlobalMultiplier() <= 0) { - mcMMO.p.getLogger().warning("Experience_Formula.Multiplier.Global should be at least 0!"); - config.set("Experience_Formula.Multiplier.Global", 1.0); - + reason.add("Experience_Formula.Multiplier.Global should be greater than 0!"); } /* PVP modifier */ if (getPlayerVersusPlayerXP() < 0) { - mcMMO.p.getLogger().warning("Experience_Formula.Multiplier.PVP should be at least 0!"); + reason.add("Experience_Formula.Multiplier.PVP should be at least 0!"); } /* Spawned Mob modifier */ if (getSpawnedMobXpMultiplier() < 0) { - mcMMO.p.getLogger().warning("Experience_Formula.Mobspawners.Multiplier should be at least 0!"); + reason.add("Experience_Formula.Mobspawners.Multiplier should be at least 0!"); } /* Bred Mob modifier */ if (getBredMobXpMultiplier() < 0) { - mcMMO.p.getLogger().warning("Experience_Formula.Breeding.Multiplier should be at least 0!"); + reason.add("Experience_Formula.Breeding.Multiplier should be at least 0!"); } /* Conversion */ if (getExpModifier() <= 0) { - mcMMO.p.getLogger().warning("Conversion.Exp_Modifier should be greater than 0!"); + reason.add("Conversion.Exp_Modifier should be greater than 0!"); } /* @@ -105,52 +90,54 @@ public class ExperienceConfig extends BukkitConfig { /* Alchemy */ for (PotionStage potionStage : PotionStage.values()) { if (getPotionXP(potionStage) < 0) { - mcMMO.p.getLogger().warning("Experience_Values.Alchemy.Potion_Stage_" + potionStage.toNumerical() + " should be at least 0!"); + reason.add("Experience_Values.Alchemy.Potion_Stage_" + potionStage.toNumerical() + " should be at least 0!"); } } /* Archery */ if (getArcheryDistanceMultiplier() < 0) { - mcMMO.p.getLogger().warning("Experience_Values.Archery.Distance_Multiplier should be at least 0!"); + reason.add("Experience_Values.Archery.Distance_Multiplier should be at least 0!"); } /* Combat XP Multipliers */ if (getAnimalsXP() < 0) { - mcMMO.p.getLogger().warning("Experience_Values.Combat.Multiplier.Animals should be at least 0!"); + reason.add("Experience_Values.Combat.Multiplier.Animals should be at least 0!"); } if (getDodgeXPModifier() < 0) { - mcMMO.p.getLogger().warning("Skills.Acrobatics.Dodge_XP_Modifier should be at least 0!"); + reason.add("Skills.Acrobatics.Dodge_XP_Modifier should be at least 0!"); } if (getRollXPModifier() < 0) { - mcMMO.p.getLogger().warning("Skills.Acrobatics.Roll_XP_Modifier should be at least 0!"); + reason.add("Skills.Acrobatics.Roll_XP_Modifier should be at least 0!"); } if (getFallXPModifier() < 0) { - mcMMO.p.getLogger().warning("Skills.Acrobatics.Fall_XP_Modifier should be at least 0!"); + reason.add("Skills.Acrobatics.Fall_XP_Modifier should be at least 0!"); } /* Fishing */ // TODO: Add validation for each fish type once enum is available. if (getFishingShakeXP() <= 0) { - mcMMO.p.getLogger().warning("Experience_Values.Fishing.Shake should be greater than 0!"); + reason.add("Experience_Values.Fishing.Shake should be greater than 0!"); } /* Repair */ if (getRepairXPBase() <= 0) { - mcMMO.p.getLogger().warning("Experience_Values.Repair.Base should be greater than 0!"); + reason.add("Experience_Values.Repair.Base should be greater than 0!"); } /* Taming */ if (getTamingXP(EntityType.WOLF) <= 0) { - mcMMO.p.getLogger().warning("Experience_Values.Taming.Animal_Taming.Wolf should be greater than 0!"); + reason.add("Experience_Values.Taming.Animal_Taming.Wolf should be greater than 0!"); } if (getTamingXP(EntityType.OCELOT) <= 0) { - mcMMO.p.getLogger().warning("Experience_Values.Taming.Animal_Taming.Ocelot should be greater than 0!"); + reason.add("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 75620e389..f36a9d24b 100644 --- a/src/main/java/com/gmail/nossr50/config/party/ItemWeightConfig.java +++ b/src/main/java/com/gmail/nossr50/config/party/ItemWeightConfig.java @@ -22,11 +22,6 @@ 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 ed582208f..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 @@ -23,11 +23,6 @@ public class RepairConfig extends BukkitConfig { loadKeys(); } - @Override - protected void validateConfigKeys() { - //TODO: Rewrite legacy validation code - } - @Override protected void loadKeys() { repairables = new ArrayList<>(); @@ -86,7 +81,7 @@ public class RepairConfig extends BukkitConfig { try { repairMaterialType = MaterialType.valueOf(repairMaterialTypeString); } catch (IllegalArgumentException ex) { - mcMMO.p.getLogger().warning(key + " has an invalid MaterialType of " + repairMaterialTypeString); + reason.add(key + " has an invalid MaterialType of " + repairMaterialTypeString); } } @@ -107,7 +102,7 @@ public class RepairConfig extends BukkitConfig { } if (maximumDurability <= 0) { - mcMMO.p.getLogger().warning("Maximum durability of " + key + " must be greater than 0!"); + reason.add("Maximum durability of " + key + " must be greater than 0!"); } // Item Type @@ -126,7 +121,7 @@ public class RepairConfig extends BukkitConfig { try { repairItemType = ItemType.valueOf(repairItemTypeString); } catch (IllegalArgumentException ex) { - mcMMO.p.getLogger().warning(key + " has an invalid ItemType of " + repairItemTypeString); + reason.add(key + " has an invalid ItemType of " + repairItemTypeString); } } @@ -134,7 +129,7 @@ public class RepairConfig extends BukkitConfig { double xpMultiplier = config.getDouble("Repairables." + key + ".XpMultiplier", 1); if (minimumLevel < 0) { - mcMMO.p.getLogger().warning(key + " has an invalid MinimumLevel of " + minimumLevel); + reason.add(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 d47a42d77..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 @@ -26,11 +26,6 @@ public class SalvageConfig extends BukkitConfig { loadKeys(); } - @Override - protected void validateConfigKeys() { - //TODO: Rewrite legacy validation code - } - @Override protected void loadKeys() { salvageables = new HashSet<>(); @@ -102,7 +97,7 @@ public class SalvageConfig extends BukkitConfig { try { salvageMaterialType = MaterialType.valueOf(salvageMaterialTypeString.replace(" ", "_").toUpperCase(Locale.ENGLISH)); } catch (IllegalArgumentException ex) { - mcMMO.p.getLogger().warning(key + " has an invalid MaterialType of " + salvageMaterialTypeString); + reason.add(key + " has an invalid MaterialType of " + salvageMaterialTypeString); } } @@ -134,7 +129,7 @@ public class SalvageConfig extends BukkitConfig { try { salvageItemType = ItemType.valueOf(salvageItemTypeString.replace(" ", "_").toUpperCase(Locale.ENGLISH)); } catch (IllegalArgumentException ex) { - mcMMO.p.getLogger().warning(key + " has an invalid ItemType of " + salvageItemTypeString); + reason.add(key + " has an invalid ItemType of " + salvageItemTypeString); } } @@ -142,7 +137,7 @@ public class SalvageConfig extends BukkitConfig { double xpMultiplier = config.getDouble("Salvageables." + key + ".XpMultiplier", 1); if (minimumLevel < 0) { - mcMMO.p.getLogger().warning(key + " has an invalid MinimumLevel of " + minimumLevel); + reason.add(key + " has an invalid MinimumLevel of " + minimumLevel); } // Maximum Quantity @@ -159,7 +154,7 @@ public class SalvageConfig extends BukkitConfig { } if (maximumQuantity <= 0) { - mcMMO.p.getLogger().warning("Maximum quantity of " + key + " must be greater than 0!"); + reason.add("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 277997ec0..1a9dd41c5 100755 --- a/src/main/java/com/gmail/nossr50/config/treasure/FishingTreasureConfig.java +++ b/src/main/java/com/gmail/nossr50/config/treasure/FishingTreasureConfig.java @@ -30,6 +30,7 @@ public class FishingTreasureConfig extends BukkitConfig { private FishingTreasureConfig() { super(FILENAME); loadKeys(); + validate(); } public static FishingTreasureConfig getInstance() { @@ -41,8 +42,8 @@ public class FishingTreasureConfig extends BukkitConfig { } @Override - protected void validateConfigKeys() { - //TODO: Rewrite legacy validation code + protected boolean validateKeys() { + // Validate all the settings! List reason = new ArrayList<>(); ConfigurationSection enchantment_drop_rates = config.getConfigurationSection("Enchantment_Drop_Rates"); @@ -56,11 +57,11 @@ public class FishingTreasureConfig extends BukkitConfig { double itemDropRate = config.getDouble("Item_Drop_Rates." + tier + "." + rarity); if ((enchantDropRate < 0.0 || enchantDropRate > 100.0)) { - mcMMO.p.getLogger().warning("The enchant drop rate for " + tier + " items that are " + rarity + "should be between 0.0 and 100.0!"); + 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) { - mcMMO.p.getLogger().warning("The item drop rate for " + tier + " items that are " + rarity + "should be between 0.0 and 100.0!"); + reason.add("The item drop rate for " + tier + " items that are " + rarity + "should be between 0.0 and 100.0!"); } totalEnchantDropRate += enchantDropRate; @@ -68,16 +69,18 @@ public class FishingTreasureConfig extends BukkitConfig { } if (totalEnchantDropRate < 0 || totalEnchantDropRate > 100.0) { - mcMMO.p.getLogger().warning("The total enchant drop rate for " + tier + " should be between 0.0 and 100.0!"); + reason.add("The total enchant drop rate for " + tier + " should be between 0.0 and 100.0!"); } if (totalItemDropRate < 0 || totalItemDropRate > 100.0) { - mcMMO.p.getLogger().warning("The total item drop rate for " + tier + " should be between 0.0 and 100.0!"); + 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); } @Override @@ -138,7 +141,7 @@ public class FishingTreasureConfig extends BukkitConfig { short data = (treasureInfo.length == 2) ? Short.parseShort(treasureInfo[1]) : (short) config.getInt(type + "." + treasureName + ".Data"); if (material == null) { - mcMMO.p.getLogger().warning("Cannot find matching item type in this version of MC, skipping - " + materialName); + reason.add("Cannot find matching item type in this version of MC, skipping - " + materialName); continue; } @@ -147,7 +150,7 @@ public class FishingTreasureConfig extends BukkitConfig { } if (material.isBlock() && (data > 127 || data < -128)) { - mcMMO.p.getLogger().warning("Data of " + treasureName + " is invalid! " + data); + reason.add("Data of " + treasureName + " is invalid! " + data); } /* @@ -159,15 +162,15 @@ public class FishingTreasureConfig extends BukkitConfig { int dropLevel = config.getInt(type + "." + treasureName + ".Drop_Level"); if (xp < 0) { - mcMMO.p.getLogger().warning(treasureName + " has an invalid XP value: " + xp); + reason.add(treasureName + " has an invalid XP value: " + xp); } if (dropChance < 0.0D) { - mcMMO.p.getLogger().warning(treasureName + " has an invalid Drop_Chance: " + dropChance); + reason.add(treasureName + " has an invalid Drop_Chance: " + dropChance); } if (dropLevel < 0) { - mcMMO.p.getLogger().warning("Fishing Config: " + treasureName + " has an invalid Drop_Level: " + dropLevel); + reason.add("Fishing Config: " + treasureName + " has an invalid Drop_Level: " + dropLevel); } /* @@ -202,7 +205,7 @@ public class FishingTreasureConfig extends BukkitConfig { if (materialName.contains("POTION")) { Material mat = Material.matchMaterial(materialName); if (mat == null) { - mcMMO.p.getLogger().warning("Potion format for " + FILENAME + " has changed"); + reason.add("Potion format for " + FILENAME + " has changed"); } else { item = new ItemStack(mat, amount, data); PotionMeta itemMeta = (PotionMeta) item.getItemMeta(); @@ -216,7 +219,7 @@ public class FishingTreasureConfig extends BukkitConfig { try { potionType = PotionType.valueOf(config.getString(type + "." + treasureName + ".PotionData.PotionType", "WATER")); } catch (IllegalArgumentException ex) { - mcMMO.p.getLogger().warning("Invalid Potion_Type: " + config.getString(type + "." + treasureName + ".PotionData.PotionType", "WATER")); + 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); @@ -279,15 +282,15 @@ public class FishingTreasureConfig extends BukkitConfig { } - //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); + if (noErrorsInConfig(reason)) { + 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 44bd4121e..1827188dd 100755 --- a/src/main/java/com/gmail/nossr50/config/treasure/TreasureConfig.java +++ b/src/main/java/com/gmail/nossr50/config/treasure/TreasureConfig.java @@ -37,6 +37,7 @@ public class TreasureConfig extends BukkitConfig { private TreasureConfig() { super(FILENAME); loadKeys(); + validate(); } public static TreasureConfig getInstance() { @@ -48,8 +49,11 @@ public class TreasureConfig extends BukkitConfig { } @Override - protected void validateConfigKeys() { - //TODO: Rewrite legacy validation code + protected boolean validateKeys() { + // Validate all the settings! + List reason = new ArrayList<>(); + + return noErrorsInConfig(reason); } @Override @@ -91,7 +95,7 @@ public class TreasureConfig extends BukkitConfig { short data = (treasureInfo.length == 2) ? Short.parseShort(treasureInfo[1]) : (short) config.getInt(type + "." + treasureName + ".Data"); if (material == null) { - mcMMO.p.getLogger().warning("Invalid material: " + materialName); + reason.add("Invalid material: " + materialName); } if (amount <= 0) { @@ -99,7 +103,7 @@ public class TreasureConfig extends BukkitConfig { } if (material != null && material.isBlock() && (data > 127 || data < -128)) { - mcMMO.p.getLogger().warning("Data of " + treasureName + " is invalid! " + data); + reason.add("Data of " + treasureName + " is invalid! " + data); } /* @@ -143,11 +147,11 @@ public class TreasureConfig extends BukkitConfig { } if (xp < 0) { - mcMMO.p.getLogger().warning(treasureName + " has an invalid XP value: " + xp); + reason.add(treasureName + " has an invalid XP value: " + xp); } if (dropChance < 0.0D) { - mcMMO.p.getLogger().warning(treasureName + " has an invalid Drop_Chance: " + dropChance); + reason.add(treasureName + " has an invalid Drop_Chance: " + dropChance); } /* @@ -158,7 +162,7 @@ public class TreasureConfig extends BukkitConfig { if (materialName.contains("POTION")) { Material mat = Material.matchMaterial(materialName); if (mat == null) { - mcMMO.p.getLogger().warning("Potion format for " + FILENAME + " has changed"); + reason.add("Potion format for " + FILENAME + " has changed"); } else { item = new ItemStack(mat, amount, data); PotionMeta itemMeta = (PotionMeta) item.getItemMeta(); @@ -167,7 +171,7 @@ public class TreasureConfig extends BukkitConfig { try { potionType = PotionType.valueOf(config.getString(type + "." + treasureName + ".PotionData.PotionType", "WATER")); } catch (IllegalArgumentException ex) { - mcMMO.p.getLogger().warning("Invalid Potion_Type: " + config.getString(type + "." + treasureName + ".PotionData.PotionType", "WATER")); + 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); @@ -206,49 +210,49 @@ public class TreasureConfig extends BukkitConfig { } } - //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"); + if (noErrorsInConfig(reason)) { + if (isExcavation) { + ExcavationTreasure excavationTreasure = new ExcavationTreasure(item, xp, dropChance, dropLevel); + List dropList = config.getStringList(type + "." + treasureName + ".Drops_From"); - for (String blockType : dropList) { - if (!excavationMap.containsKey(blockType)) - excavationMap.put(blockType, new ArrayList<>()); - excavationMap.get(blockType).add(excavationTreasure); - } - } else if (isHylian) { - HylianTreasure hylianTreasure = new HylianTreasure(item, xp, dropChance, dropLevel); - List dropList = config.getStringList(type + "." + treasureName + ".Drops_From"); + for (String blockType : dropList) { + if (!excavationMap.containsKey(blockType)) + excavationMap.put(blockType, new ArrayList<>()); + excavationMap.get(blockType).add(excavationTreasure); + } + } 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); + 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; + 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/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index 3d33807b3..8a8d3192b 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -125,6 +125,9 @@ 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; @@ -196,6 +199,10 @@ public class mcMMO extends JavaPlugin { loadConfigFiles(); + if (!noErrorsInConfigFiles) { + return; + } + if (getServer().getName().equals("Cauldron") || getServer().getName().equals("MCPC+")) { checkModConfigs(); } 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 c3d99ffc4..ae4360de7 100644 --- a/src/main/java/com/gmail/nossr50/skills/child/ChildConfig.java +++ b/src/main/java/com/gmail/nossr50/skills/child/ChildConfig.java @@ -15,11 +15,6 @@ 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 99e8f0f86..2325b2800 100644 --- a/src/main/java/com/gmail/nossr50/util/upgrade/UpgradeManager.java +++ b/src/main/java/com/gmail/nossr50/util/upgrade/UpgradeManager.java @@ -19,12 +19,6 @@ 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 0bf3f98d9531f6c266f5a14382e6b3e4453f1bd9 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 17 Mar 2022 13:59:17 -0700 Subject: [PATCH 281/326] 2.1.210 --- Changelog.txt | 2 ++ pom.xml | 2 +- .../com/gmail/nossr50/api/ExperienceAPI.java | 2 +- .../nossr50/util/player/UserManager.java | 27 ++++++++++++------- .../nossr50/util/skills/CombatUtils.java | 7 +++-- 5 files changed, 25 insertions(+), 15 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 9a33c8ee2..7618395dd 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,7 +1,9 @@ Version 2.1.210 Fixed a memory leak involving mob metadata + Fixed a potential null pointer exception in InventoryListener NOTES: + If you're having issues with "immortal players" this is a known plugin incompatibility between mcMMO and another plugin, I need more info on what plugins need to be present to cause it. Please post info to GitHub issues or tag me on discord. 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 diff --git a/pom.xml b/pom.xml index 1484101cc..3aa6e813f 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.210-SNAPSHOT + 2.1.210 mcMMO https://github.com/mcMMO-Dev/mcMMO diff --git a/src/main/java/com/gmail/nossr50/api/ExperienceAPI.java b/src/main/java/com/gmail/nossr50/api/ExperienceAPI.java index 678f1346b..7fb2ed7ee 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 { * @param skillType A string that may or may not be a skill * @return true if this is a valid mcMMO skill */ - public static boolean isValidSkillType(String skillType) { + public static boolean isValidSkillType(@NotNull String skillType) { return mcMMO.p.getSkillTools().matchSkill(skillType) != null; } 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 732840720..ef0b63e43 100644 --- a/src/main/java/com/gmail/nossr50/util/player/UserManager.java +++ b/src/main/java/com/gmail/nossr50/util/player/UserManager.java @@ -8,6 +8,8 @@ import org.bukkit.OfflinePlayer; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.metadata.FixedMetadataValue; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.Collection; @@ -24,7 +26,7 @@ public final class UserManager { * * @param mcMMOPlayer the player profile to start tracking */ - public static void track(McMMOPlayer mcMMOPlayer) { + public static void track(@NotNull McMMOPlayer mcMMOPlayer) { mcMMOPlayer.getPlayer().setMetadata(MetadataConstants.METADATA_KEY_PLAYER_DATA, new FixedMetadataValue(mcMMO.p, mcMMOPlayer)); if(playerDataSet == null) @@ -43,8 +45,12 @@ public final class UserManager { * * @param player The Player object */ - public static void remove(Player player) { + public static void remove(@NotNull Player player) { McMMOPlayer mcMMOPlayer = getPlayer(player); + + if(mcMMOPlayer == null) + return; + mcMMOPlayer.cleanup(); player.removeMetadata(MetadataConstants.METADATA_KEY_PLAYER_DATA, mcMMO.p); @@ -91,7 +97,7 @@ public final class UserManager { mcMMO.p.getLogger().info("Finished save operation for "+trackedSyncData.size()+" players!"); } - public static Collection getPlayers() { + public static @NotNull Collection getPlayers() { Collection playerCollection = new ArrayList<>(); for (Player player : mcMMO.p.getServer().getOnlinePlayers()) { @@ -109,11 +115,11 @@ public final class UserManager { * @param playerName The name of the player whose McMMOPlayer to retrieve * @return the player's McMMOPlayer object */ - public static McMMOPlayer getPlayer(String playerName) { + public static @Nullable McMMOPlayer getPlayer(String playerName) { return retrieveMcMMOPlayer(playerName, false); } - public static McMMOPlayer getOfflinePlayer(OfflinePlayer player) { + public static @Nullable McMMOPlayer getOfflinePlayer(OfflinePlayer player) { if (player instanceof Player) { return getPlayer((Player) player); } @@ -121,7 +127,7 @@ public final class UserManager { return retrieveMcMMOPlayer(player.getName(), true); } - public static McMMOPlayer getOfflinePlayer(String playerName) { + public static @Nullable McMMOPlayer getOfflinePlayer(String playerName) { return retrieveMcMMOPlayer(playerName, true); } @@ -130,7 +136,7 @@ public final class UserManager { * @param player target player * @return McMMOPlayer object for this player, null if Player has not been loaded */ - public static McMMOPlayer getPlayer(Player player) { + public static @Nullable McMMOPlayer getPlayer(@Nullable Player player) { //Avoid Array Index out of bounds if(player != null && player.hasMetadata(MetadataConstants.METADATA_KEY_PLAYER_DATA)) return (McMMOPlayer) player.getMetadata(MetadataConstants.METADATA_KEY_PLAYER_DATA).get(0).value(); @@ -138,7 +144,10 @@ public final class UserManager { return null; } - private static McMMOPlayer retrieveMcMMOPlayer(String playerName, boolean offlineValid) { + private static @Nullable McMMOPlayer retrieveMcMMOPlayer(@Nullable String playerName, boolean offlineValid) { + if(playerName == null) + return null; + Player player = mcMMO.p.getServer().getPlayerExact(playerName); if (player == null) { @@ -152,7 +161,7 @@ public final class UserManager { return getPlayer(player); } - public static boolean hasPlayerDataKey(Entity entity) { + public static boolean hasPlayerDataKey(@Nullable Entity entity) { 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 a855f3a4c..e576baae2 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java @@ -320,14 +320,13 @@ public final class CombatUtils { Entity painSource = event.getDamager(); EntityType entityType = painSource.getType(); - if (target instanceof Player) { + if (target instanceof Player player) { if(ExperienceConfig.getInstance().isNPCInteractionPrevented()) { if (Misc.isNPCEntityExcludingVillagers(target)) { return; } } - Player player = (Player) target; if (!UserManager.hasPlayerDataKey(player)) { return; } @@ -738,7 +737,7 @@ public final class CombatUtils { * @param target The defending entity * @param primarySkillType The skill being used */ - public static void processCombatXP(@NotNull McMMOPlayer mcMMOPlayer, LivingEntity target, PrimarySkillType primarySkillType) { + public static void processCombatXP(@NotNull McMMOPlayer mcMMOPlayer, @NotNull LivingEntity target, @NotNull PrimarySkillType primarySkillType) { processCombatXP(mcMMOPlayer, target, primarySkillType, 1.0); } @@ -750,7 +749,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(@NotNull McMMOPlayer mcMMOPlayer, LivingEntity target, PrimarySkillType primarySkillType, double multiplier) { + public static void processCombatXP(@NotNull McMMOPlayer mcMMOPlayer, @NotNull LivingEntity target, @NotNull PrimarySkillType primarySkillType, double multiplier) { double baseXP = 0; XPGainReason xpGainReason; From 5ea18e8ba722b886dcde37ba1622e302cf2914eb Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 17 Mar 2022 15:03:42 -0700 Subject: [PATCH 282/326] Add combat debug info for player versus player combat /mmodebug --- Changelog.txt | 2 + pom.xml | 2 +- .../nossr50/listeners/EntityListener.java | 58 +++++++++++++++++++ 3 files changed, 61 insertions(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index 7618395dd..556a336e5 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,5 @@ +Version 2.1.211 + Added /mmodebug info for players hitting other players Version 2.1.210 Fixed a memory leak involving mob metadata Fixed a potential null pointer exception in InventoryListener diff --git a/pom.xml b/pom.xml index 3aa6e813f..091a939e8 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.210 + 2.1.211-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 14a940763..74f2fa2db 100644 --- a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java @@ -28,9 +28,11 @@ 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.ChatColor; import org.bukkit.Material; import org.bukkit.NamespacedKey; import org.bukkit.OfflinePlayer; +import org.bukkit.attribute.Attribute; import org.bukkit.block.Block; import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.*; @@ -453,6 +455,62 @@ public class EntityListener implements Listener { if(entityDamageEvent.getDamager() instanceof Projectile) { CombatUtils.cleanupArrowMetadata((Projectile) entityDamageEvent.getDamager()); } + + if(entityDamageEvent.getEntity() instanceof Player player && entityDamageEvent.getDamager() instanceof Player) { + McMMOPlayer mmoPlayer = UserManager.getPlayer(player); + if(mmoPlayer != null) { + if(mmoPlayer.isDebugMode()) { + player.sendMessage(ChatColor.GOLD + "(mmodebug start of combat report) EntityDamageByEntityEvent DEBUG Info:"); + player.sendMessage("You are being damaged by another player in this event"); + player.sendMessage("Damage: " + entityDamageEvent.getDamage()); + player.sendMessage("Final damage: " + entityDamageEvent.getFinalDamage()); + player.sendMessage("Your max health: "+player.getAttribute(Attribute.GENERIC_MAX_HEALTH)); + player.sendMessage("Your current health: "+player.getHealth()); + + if(entityDamageEvent instanceof FakeEntityDamageByEntityEvent) { + player.sendMessage("This report is for a fake damage event used by mcMMO to test a players permission to hurt another"); + } + + if(entityDamageEvent instanceof McMMOEntityDamageByRuptureEvent) { + player.sendMessage("This report is for a Rupture damage event, which is sent out by mcMMO"); + } + + if(entityDamageEvent.isCancelled()) { + player.sendMessage("Event was cancelled, which means no damage should be done."); + } + + player.sendMessage(ChatColor.RED + "(mmodebug end of combat report)"); + } + } + } + + if(entityDamageEvent.getDamager() instanceof Player player && entityDamageEvent.getEntity() instanceof Player otherPlayer) { + McMMOPlayer mmoPlayer = UserManager.getPlayer(player); + if(mmoPlayer != null) { + if(mmoPlayer.isDebugMode()) { + player.sendMessage(ChatColor.GOLD + "(mmodebug start of combat report) EntityDamageByEntityEvent DEBUG Info:"); + player.sendMessage("You are dealing damage to another player in this event"); + player.sendMessage("Damage: " + entityDamageEvent.getDamage()); + player.sendMessage("Final damage: " + entityDamageEvent.getFinalDamage()); + player.sendMessage("Target players max health: "+otherPlayer.getAttribute(Attribute.GENERIC_MAX_HEALTH)); + player.sendMessage("Target players current health: "+otherPlayer.getHealth()); + + if(entityDamageEvent instanceof FakeEntityDamageByEntityEvent) { + player.sendMessage("This report is for a fake damage event used by mcMMO to test a players permission to hurt another"); + } + + if(entityDamageEvent instanceof McMMOEntityDamageByRuptureEvent) { + player.sendMessage("This report is for a Rupture damage event, which is sent out by mcMMO"); + } + + if(entityDamageEvent.isCancelled()) { + player.sendMessage("Event was cancelled, which means no damage should be done."); + } + + player.sendMessage(ChatColor.RED + "(mmodebug end of combat report)"); + } + } + } } public boolean checkParties(Cancellable event, Player defendingPlayer, Player attackingPlayer) { From 8066f7f7f204eb72a667d3e71e0aa300d3b96947 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 17 Mar 2022 16:08:50 -0700 Subject: [PATCH 283/326] Tweak damage debug info to show modifier values --- .../nossr50/listeners/EntityListener.java | 22 ++++++++++++++----- 1 file changed, 17 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 74f2fa2db..010074168 100644 --- a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java @@ -462,11 +462,17 @@ public class EntityListener implements Listener { if(mmoPlayer.isDebugMode()) { player.sendMessage(ChatColor.GOLD + "(mmodebug start of combat report) EntityDamageByEntityEvent DEBUG Info:"); player.sendMessage("You are being damaged by another player in this event"); - player.sendMessage("Damage: " + entityDamageEvent.getDamage()); - player.sendMessage("Final damage: " + entityDamageEvent.getFinalDamage()); - player.sendMessage("Your max health: "+player.getAttribute(Attribute.GENERIC_MAX_HEALTH)); + player.sendMessage("Raw Damage: " + entityDamageEvent.getDamage()); + player.sendMessage("Your max health: "+player.getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue()); player.sendMessage("Your current health: "+player.getHealth()); + player.sendMessage(ChatColor.GREEN + "Damage Modifiers (final damage)"); + for (EntityDamageEvent.DamageModifier modifier : EntityDamageEvent.DamageModifier.values()) { + player.sendMessage("Modifier "+modifier.name()+": " + entityDamageEvent.getDamage(modifier)); + } + + player.sendMessage("Final damage: " + entityDamageEvent.getFinalDamage()); + if(entityDamageEvent instanceof FakeEntityDamageByEntityEvent) { player.sendMessage("This report is for a fake damage event used by mcMMO to test a players permission to hurt another"); } @@ -490,9 +496,15 @@ public class EntityListener implements Listener { if(mmoPlayer.isDebugMode()) { player.sendMessage(ChatColor.GOLD + "(mmodebug start of combat report) EntityDamageByEntityEvent DEBUG Info:"); player.sendMessage("You are dealing damage to another player in this event"); - player.sendMessage("Damage: " + entityDamageEvent.getDamage()); + player.sendMessage("Raw Damage: " + entityDamageEvent.getDamage()); + + player.sendMessage(ChatColor.GREEN + "Damage Modifiers (final damage)"); + for (EntityDamageEvent.DamageModifier modifier : EntityDamageEvent.DamageModifier.values()) { + player.sendMessage("Modifier "+modifier.name()+": " + entityDamageEvent.getDamage(modifier)); + } + player.sendMessage("Final damage: " + entityDamageEvent.getFinalDamage()); - player.sendMessage("Target players max health: "+otherPlayer.getAttribute(Attribute.GENERIC_MAX_HEALTH)); + player.sendMessage("Target players max health: "+otherPlayer.getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue()); player.sendMessage("Target players current health: "+otherPlayer.getHealth()); if(entityDamageEvent instanceof FakeEntityDamageByEntityEvent) { From 5ab55c16539f4f3db0bd7c84882f5fa719b9a440 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 17 Mar 2022 19:58:42 -0700 Subject: [PATCH 284/326] mcMMO will no longer use the DamageModifier API (potentially fix immortal player bug) --- .../nossr50/chat/SamePartyPredicate.java | 3 +- .../commands/skills/MmoInfoCommand.java | 3 +- .../database/FlatFileDatabaseManager.java | 2 +- .../nossr50/database/SQLDatabaseManager.java | 4 +- .../database/flatfile/FlatFileDataUtil.java | 3 +- .../datatypes/LevelUpBroadcastPredicate.java | 3 +- .../PowerLevelUpBroadcastPredicate.java | 3 +- .../nossr50/datatypes/json/McMMOUrl.java | 2 +- .../gmail/nossr50/datatypes/party/Party.java | 4 +- .../nossr50/datatypes/player/McMMOPlayer.java | 12 +- .../datatypes/player/PlayerProfile.java | 19 +- .../fake/FakeEntityDamageByEntityEvent.java | 21 -- .../events/fake/FakeEntityDamageEvent.java | 21 -- .../McMMOEntityDamageByRuptureEvent.java | 5 +- .../nossr50/listeners/BlockListener.java | 3 +- .../nossr50/listeners/EntityListener.java | 70 ++---- .../nossr50/listeners/InventoryListener.java | 6 +- .../nossr50/listeners/PlayerListener.java | 12 +- .../gmail/nossr50/locale/LocaleLoader.java | 72 +++--- src/main/java/com/gmail/nossr50/mcMMO.java | 9 +- .../player/PlayerProfileLoadingTask.java | 2 +- .../runnables/skills/AbilityDisableTask.java | 2 +- .../runnables/skills/DelayedCropReplant.java | 3 +- .../skills/acrobatics/AcrobaticsManager.java | 3 +- .../nossr50/skills/axes/AxesManager.java | 16 +- .../skills/herbalism/HerbalismManager.java | 17 +- .../nossr50/skills/mining/BlastMining.java | 3 +- .../nossr50/skills/mining/MiningManager.java | 2 +- .../nossr50/skills/swords/SwordsManager.java | 13 +- .../nossr50/skills/taming/TamingManager.java | 9 +- .../com/gmail/nossr50/util/BlockUtils.java | 3 +- .../com/gmail/nossr50/util/EventUtils.java | 4 +- .../gmail/nossr50/util/MobHealthbarUtils.java | 2 +- .../nossr50/util/TransientEntityTracker.java | 2 +- .../util/blockmeta/McMMOSimpleRegionFile.java | 8 +- .../util/experience/ExperienceBarManager.java | 2 +- .../util/platform/MajorMinorPatchVersion.java | 6 +- .../nossr50/util/skills/CombatUtils.java | 227 +++++------------- .../gmail/nossr50/util/skills/RankUtils.java | 2 +- .../gmail/nossr50/util/skills/SkillTools.java | 10 +- .../gmail/nossr50/util/text/StringUtils.java | 3 +- .../platform/MinecraftGameVersionTest.java | 4 +- 42 files changed, 188 insertions(+), 432 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/chat/SamePartyPredicate.java b/src/main/java/com/gmail/nossr50/chat/SamePartyPredicate.java index 6d4636d6c..226eab83d 100644 --- a/src/main/java/com/gmail/nossr50/chat/SamePartyPredicate.java +++ b/src/main/java/com/gmail/nossr50/chat/SamePartyPredicate.java @@ -23,8 +23,7 @@ public class SamePartyPredicate implements Predicate if(t instanceof ConsoleCommandSender) { return false; //Party audiences are special, we exclude console from them to avoid double messaging since we send a more verbose version to consoles } else { - if(t instanceof Player) { - Player player = (Player) t; + if(t instanceof Player player) { McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); if(mcMMOPlayer != null) { return mcMMOPlayer.getParty() == party; 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 d3090f46b..0f0a4a710 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/MmoInfoCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/MmoInfoCommand.java @@ -27,12 +27,11 @@ public class MmoInfoCommand implements TabExecutor { /* * Only allow players to use this command */ - if(commandSender instanceof Player) + if(commandSender instanceof Player player) { if(args.length < 1) return false; - Player player = (Player) commandSender; if(Permissions.mmoinfo(player)) { if(args == null || args[0] == null) diff --git a/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java index 6733680c1..7325f61fe 100644 --- a/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java @@ -25,7 +25,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 EnumMap> playerStatHash = new EnumMap<>(PrimarySkillType.class); private final @NotNull List powerLevels = new ArrayList<>(); private long lastUpdate = 0; private final @NotNull String usersFilePath; diff --git a/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java index 413d9d49c..9d32407d8 100644 --- a/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java @@ -1122,8 +1122,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 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; diff --git a/src/main/java/com/gmail/nossr50/database/flatfile/FlatFileDataUtil.java b/src/main/java/com/gmail/nossr50/database/flatfile/FlatFileDataUtil.java index e4048cdf0..da41a7acc 100644 --- a/src/main/java/com/gmail/nossr50/database/flatfile/FlatFileDataUtil.java +++ b/src/main/java/com/gmail/nossr50/database/flatfile/FlatFileDataUtil.java @@ -29,8 +29,7 @@ public class FlatFileDataUtil { /* * First fix the bad data values if they exist */ - if(dataContainer instanceof BadCategorizedFlatFileData) { - BadCategorizedFlatFileData badData = (BadCategorizedFlatFileData) dataContainer; + if(dataContainer instanceof BadCategorizedFlatFileData badData) { splitData = repairBadData(dataContainer.getSplitData(), badData.getBadDataIndexes()); } else { splitData = dataContainer.getSplitData(); diff --git a/src/main/java/com/gmail/nossr50/datatypes/LevelUpBroadcastPredicate.java b/src/main/java/com/gmail/nossr50/datatypes/LevelUpBroadcastPredicate.java index 51ab29a14..1644fdd1b 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/LevelUpBroadcastPredicate.java +++ b/src/main/java/com/gmail/nossr50/datatypes/LevelUpBroadcastPredicate.java @@ -37,8 +37,7 @@ public class LevelUpBroadcastPredicate implements Predi return false; } - if(t instanceof Player) { - Player listeningPlayer = (Player) t; + if(t instanceof Player listeningPlayer) { //Party Member Check if(mcMMO.p.getGeneralConfig().isLevelUpBroadcastsPartyMembersOnly()) { diff --git a/src/main/java/com/gmail/nossr50/datatypes/PowerLevelUpBroadcastPredicate.java b/src/main/java/com/gmail/nossr50/datatypes/PowerLevelUpBroadcastPredicate.java index b50d731eb..17bc2fd04 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/PowerLevelUpBroadcastPredicate.java +++ b/src/main/java/com/gmail/nossr50/datatypes/PowerLevelUpBroadcastPredicate.java @@ -37,8 +37,7 @@ public class PowerLevelUpBroadcastPredicate implements return false; } - if(t instanceof Player) { - Player listeningPlayer = (Player) t; + if(t instanceof Player listeningPlayer) { //Party Member Check if(mcMMO.p.getGeneralConfig().isPowerLevelUpBroadcastsPartyMembersOnly()) { 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 8d9d4e634..c7fa9da4f 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/json/McMMOUrl.java +++ b/src/main/java/com/gmail/nossr50/datatypes/json/McMMOUrl.java @@ -5,7 +5,7 @@ public class McMMOUrl { public static final String urlDiscord = "https://discord.gg/bJ7pFS9"; 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 urlSpigot = "https://spigot.mcmmo.org"; public static final String urlTranslate = "https://translate.mcmmo.org/"; public static String getUrl(McMMOWebLinks webLinks) diff --git a/src/main/java/com/gmail/nossr50/datatypes/party/Party.java b/src/main/java/com/gmail/nossr50/datatypes/party/Party.java index edf661791..ccf1c991c 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/party/Party.java +++ b/src/main/java/com/gmail/nossr50/datatypes/party/Party.java @@ -403,12 +403,10 @@ public class Party { return false; } - if (!(obj instanceof Party)) { + if (!(obj instanceof Party other)) { return false; } - Party other = (Party) obj; - if ((this.getName() == null) || (other.getName() == null)) { return false; } 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 3e0b6018f..83463ebb4 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java +++ b/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java @@ -79,7 +79,7 @@ public class McMMOPlayer implements Identified { private final Player player; private final PlayerProfile profile; - private final Map skillManagers = new EnumMap(PrimarySkillType.class); + private final Map skillManagers = new EnumMap<>(PrimarySkillType.class); private final ExperienceBarManager experienceBarManager; private Party party; @@ -98,10 +98,10 @@ public class McMMOPlayer implements Identified { private ChatChannel chatChannel; - private final Map abilityMode = new EnumMap(SuperAbilityType.class); - private final Map abilityInformed = new EnumMap(SuperAbilityType.class); + private final Map abilityMode = new EnumMap<>(SuperAbilityType.class); + private final Map abilityInformed = new EnumMap<>(SuperAbilityType.class); - private final Map toolMode = new EnumMap(ToolType.class); + private final Map toolMode = new EnumMap<>(ToolType.class); private int recentlyHurt; private int respawnATS; @@ -943,7 +943,7 @@ public class McMMOPlayer implements Identified { SkillUtils.removeAbilityBuff(player.getInventory().getItemInMainHand()); // Enable the ability - profile.setAbilityDATS(superAbilityType, System.currentTimeMillis() + (ticks * Misc.TIME_CONVERSION_FACTOR)); + profile.setAbilityDATS(superAbilityType, System.currentTimeMillis() + ((long) ticks * Misc.TIME_CONVERSION_FACTOR)); setAbilityMode(superAbilityType, true); if (superAbilityType == SuperAbilityType.SUPER_BREAKER || superAbilityType == SuperAbilityType.GIGA_DRILL_BREAKER) { @@ -951,7 +951,7 @@ public class McMMOPlayer implements Identified { } setToolPreparationMode(tool, false); - new AbilityDisableTask(this, superAbilityType).runTaskLater(mcMMO.p, ticks * Misc.TICK_CONVERSION_FACTOR); + new AbilityDisableTask(this, superAbilityType).runTaskLater(mcMMO.p, (long) ticks * Misc.TICK_CONVERSION_FACTOR); } public void processAbilityActivation(@NotNull PrimarySkillType 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 7f383ed61..976ee3434 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/player/PlayerProfile.java +++ b/src/main/java/com/gmail/nossr50/datatypes/player/PlayerProfile.java @@ -14,10 +14,7 @@ import com.google.common.collect.ImmutableMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.EnumMap; -import java.util.Map; -import java.util.Set; -import java.util.UUID; +import java.util.*; import java.util.concurrent.DelayQueue; public class PlayerProfile { @@ -35,12 +32,12 @@ public class PlayerProfile { /* Skill Data */ 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..) + 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 Map rollingSkillsXp = new EnumMap(PrimarySkillType.class); + private final Map rollingSkillsXp = new EnumMap<>(PrimarySkillType.class); @Deprecated public PlayerProfile(String playerName) { @@ -160,14 +157,10 @@ 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 This is only function for FlatFileDB atm, and it's only here for unit testing right now */ - @Deprecated public @NotNull Long getLastLogin() { - if(lastLogin == null) - return -1L; - else - return lastLogin; + return Objects.requireNonNullElse(lastLogin, -1L); } public void updateLastLogin() { 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 51f2210da..e88e01ded 100644 --- a/src/main/java/com/gmail/nossr50/events/fake/FakeEntityDamageByEntityEvent.java +++ b/src/main/java/com/gmail/nossr50/events/fake/FakeEntityDamageByEntityEvent.java @@ -1,35 +1,14 @@ package com.gmail.nossr50.events.fake; -import com.google.common.base.Function; import org.bukkit.entity.Entity; import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.jetbrains.annotations.NotNull; -import java.util.EnumMap; -import java.util.Map; - /** * Called when mcMMO applies damage from an entity due to special abilities. */ public class FakeEntityDamageByEntityEvent extends EntityDamageByEntityEvent implements FakeEvent { - - 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(@NotNull Entity damager, @NotNull Entity damagee, @NotNull DamageCause cause, double damage) { super(damager, damagee, cause, damage); } - - @NotNull - public static EnumMap> getFunctionModifiers(@NotNull Map modifiers) { - EnumMap> modifierFunctions = new EnumMap<>(DamageModifier.class); - - for (DamageModifier modifier : modifiers.keySet()) { - modifierFunctions.put(modifier, (o -> -0.0)); - } - - return modifierFunctions; - } } diff --git a/src/main/java/com/gmail/nossr50/events/fake/FakeEntityDamageEvent.java b/src/main/java/com/gmail/nossr50/events/fake/FakeEntityDamageEvent.java index df12fff94..ac915eaf6 100644 --- a/src/main/java/com/gmail/nossr50/events/fake/FakeEntityDamageEvent.java +++ b/src/main/java/com/gmail/nossr50/events/fake/FakeEntityDamageEvent.java @@ -1,35 +1,14 @@ 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.EntityDamageEvent; -import java.util.EnumMap; -import java.util.Map; - /** * Called when mcMMO applies damage due to special abilities. */ public class FakeEntityDamageEvent extends EntityDamageEvent implements FakeEvent { - - public FakeEntityDamageEvent(Entity damagee, DamageCause cause, final Map modifiers) { - super(damagee, cause, modifiers, getFunctionModifiers(modifiers)); - } - @Deprecated public FakeEntityDamageEvent(Entity damagee, DamageCause cause, double damage) { super(damagee, cause, damage); } - - public static EnumMap> getFunctionModifiers(Map modifiers) { - EnumMap> modifierFunctions = new EnumMap<>(DamageModifier.class); - Function ZERO = Functions.constant(-0.0); - - for (DamageModifier modifier : modifiers.keySet()) { - modifierFunctions.put(modifier, ZERO); - } - - 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 index fd64ce27a..41a7e11fd 100644 --- a/src/main/java/com/gmail/nossr50/events/skills/rupture/McMMOEntityDamageByRuptureEvent.java +++ b/src/main/java/com/gmail/nossr50/events/skills/rupture/McMMOEntityDamageByRuptureEvent.java @@ -1,18 +1,15 @@ 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)))); + super(damager.getPlayer(), damagee, DamageCause.CUSTOM, damage); this.mcMMODamager = damager; } diff --git a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java index d4da8e1a0..57c9572bb 100644 --- a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java @@ -696,9 +696,8 @@ public class BlockListener implements Listener { player.sendMessage("[mcMMO DEBUG] World Guard xp flag is not permitted for this player in this region"); } - if(blockState instanceof Furnace) + if(blockState instanceof Furnace furnace) { - Furnace furnace = (Furnace) blockState; if(mcMMO.getSmeltingTracker().isFurnaceOwned(furnace)) { player.sendMessage("[mcMMO DEBUG] This furnace has a registered owner"); diff --git a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java index 010074168..e94ff9c6a 100644 --- a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java @@ -92,14 +92,12 @@ public class EntityListener implements Listener { @EventHandler(priority = EventPriority.MONITOR) public void onEntityTransform(EntityTransformEvent event) { - if(event.getEntity() instanceof LivingEntity) { - LivingEntity livingEntity = (LivingEntity) event.getEntity(); + if(event.getEntity() instanceof LivingEntity livingEntity) { //Transfer metadata keys from mob-spawned mobs to new mobs if(mobMetadataService.hasMobFlags(livingEntity)) { for(Entity entity : event.getTransformedEntities()) { - if(entity instanceof LivingEntity) { - LivingEntity transformedEntity = (LivingEntity) entity; + if(entity instanceof LivingEntity transformedEntity) { mobMetadataService.addMobFlags(livingEntity, transformedEntity); } } @@ -121,8 +119,7 @@ public class EntityListener implements Listener { //Prevent entities from giving XP if they target endermite if(event.getTarget() instanceof Endermite) { - if(event.getEntity() instanceof Enderman) { - Enderman enderman = (Enderman) event.getEntity(); + if(event.getEntity() instanceof Enderman enderman) { if(!mobMetadataService.hasMobFlag(MobMetaFlagType.EXPLOITED_ENDERMEN, enderman)) { mobMetadataService.flagMetadata(MobMetaFlagType.EXPLOITED_ENDERMEN, enderman); @@ -137,9 +134,8 @@ public class EntityListener implements Listener { if(WorldBlacklist.isWorldBlacklisted(event.getEntity().getWorld())) return; - if(event.getEntity() instanceof Player) + if(event.getEntity() instanceof Player player) { - Player player = (Player) event.getEntity(); /* WORLD GUARD MAIN FLAG CHECK */ if(WorldGuardUtils.isWorldGuardLoaded()) @@ -175,9 +171,8 @@ public class EntityListener implements Listener { if(WorldBlacklist.isWorldBlacklisted(event.getEntity().getWorld())) return; - if(event.getEntity().getShooter() instanceof Player) + if(event.getEntity().getShooter() instanceof Player player) { - Player player = (Player) event.getEntity().getShooter(); /* WORLD GUARD MAIN FLAG CHECK */ if(WorldGuardUtils.isWorldGuardLoaded()) { @@ -267,19 +262,15 @@ public class EntityListener implements Listener { @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 - if(event.getEntity() instanceof Player) { - Player defender = (Player) event.getEntity(); + if(event.getEntity() instanceof Player defender) { - if(event.getCombuster() instanceof Projectile) { - Projectile projectile = (Projectile) event.getCombuster(); - if(projectile.getShooter() instanceof Player) { - Player attacker = (Player) projectile.getShooter(); + if(event.getCombuster() instanceof Projectile projectile) { + if(projectile.getShooter() instanceof Player attacker) { if(checkParties(event, defender, attacker)) { event.setCancelled(true); } } - } else if(event.getCombuster() instanceof Player) { - Player attacker = (Player) event.getCombuster(); + } else if(event.getCombuster() instanceof Player attacker) { if(checkParties(event, defender, attacker)) { event.setCancelled(true); } @@ -311,9 +302,7 @@ public class EntityListener implements Listener { return; } - } else if(attacker instanceof Projectile) { - - Projectile projectile = (Projectile) attacker; + } else if(attacker instanceof Projectile projectile) { if(projectile.getShooter() instanceof Player) { if(!WorldGuardManager.getInstance().hasMainFlag((Player) projectile.getShooter())) { @@ -342,12 +331,10 @@ public class EntityListener implements Listener { } - if ((ExperienceConfig.getInstance().isNPCInteractionPrevented() && Misc.isNPCEntityExcludingVillagers(defender)) || !defender.isValid() || !(defender instanceof LivingEntity)) { + if ((ExperienceConfig.getInstance().isNPCInteractionPrevented() && Misc.isNPCEntityExcludingVillagers(defender)) || !defender.isValid() || !(defender instanceof LivingEntity target)) { return; } - LivingEntity target = (LivingEntity) defender; - if (CombatUtils.isInvincible(target, damage)) { return; } @@ -374,14 +361,12 @@ public class EntityListener implements Listener { } //Friendly fire checks - if (defender instanceof Player) { - Player defendingPlayer = (Player) defender; + if (defender instanceof Player defendingPlayer) { Player attackingPlayer; //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; + if(attacker instanceof Projectile projectile) { if(((Projectile) attacker).getShooter() instanceof Player) { attackingPlayer = (Player) projectile.getShooter(); @@ -443,8 +428,7 @@ public class EntityListener implements Listener { @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = false) public void onEntityDamageMonitor(EntityDamageByEntityEvent entityDamageEvent) { - if(entityDamageEvent.getEntity() instanceof LivingEntity) { - LivingEntity livingEntity = (LivingEntity) entityDamageEvent.getEntity(); + if(entityDamageEvent.getEntity() instanceof LivingEntity livingEntity) { if(entityDamageEvent.getFinalDamage() >= livingEntity.getHealth()) { //This sets entity names back to whatever they are supposed to be @@ -564,9 +548,8 @@ public class EntityListener implements Listener { event.getEntity().removeMetadata(MetadataConstants.METADATA_KEY_EXPLOSION_FROM_RUPTURE, mcMMO.p); } - if(event.getEntity() instanceof Player) + if(event.getEntity() instanceof Player player) { - Player player = (Player) event.getEntity(); /* WORLD GUARD MAIN FLAG CHECK */ if(WorldGuardUtils.isWorldGuardLoaded()) { @@ -605,12 +588,10 @@ public class EntityListener implements Listener { } */ - if ((ExperienceConfig.getInstance().isNPCInteractionPrevented() && Misc.isNPCEntityExcludingVillagers(entity)) || !entity.isValid() || !(entity instanceof LivingEntity)) { + if ((ExperienceConfig.getInstance().isNPCInteractionPrevented() && Misc.isNPCEntityExcludingVillagers(entity)) || !entity.isValid() || !(entity instanceof LivingEntity livingEntity)) { return; } - LivingEntity livingEntity = (LivingEntity) entity; - if (CombatUtils.isInvincible(livingEntity, damage)) { return; } @@ -642,13 +623,11 @@ public class EntityListener implements Listener { } - else if (livingEntity instanceof Tameable) { - Tameable pet = (Tameable) livingEntity; + else if (livingEntity instanceof Tameable pet) { AnimalTamer owner = pet.getOwner(); - if(owner instanceof Player) + if(owner instanceof Player player) { - Player player = (Player) owner; /* WORLD GUARD MAIN FLAG CHECK */ if(WorldGuardUtils.isWorldGuardLoaded()) { @@ -821,8 +800,7 @@ public class EntityListener implements Listener { father.setLoveModeTicks(0); //Inform the player - if(event.getBreeder() instanceof Player) { - Player player = (Player) event.getBreeder(); + if(event.getBreeder() instanceof Player player) { NotificationManager.sendPlayerInformationChatOnly(player, "Taming.Summon.COTW.BreedingDisallowed"); } } @@ -936,12 +914,10 @@ public class EntityListener implements Listener { Entity entity = event.getEntity(); - if (!(entity instanceof Player)) { + if (!(entity instanceof Player player)) { return; } - Player player = (Player) entity; - //Profile not loaded if(UserManager.getPlayer(player) == null) { @@ -1108,12 +1084,10 @@ public class EntityListener implements Listener { Entity entity = event.getEntity(); Entity target = event.getTarget(); - if (!(entity instanceof Tameable) || !(target instanceof Player)) { + if (!(entity instanceof Tameable tameable) || !(target instanceof Player player)) { return; } - Player player = (Player) target; - /* WORLD GUARD MAIN FLAG CHECK */ if(WorldGuardUtils.isWorldGuardLoaded()) { @@ -1121,8 +1095,6 @@ public class EntityListener implements Listener { return; } - Tameable tameable = (Tameable) entity; - if (!UserManager.hasPlayerDataKey(player) || !CombatUtils.isFriendlyPet(player, tameable)) { return; } diff --git a/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java b/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java index f675ec4f7..a47acbfbf 100644 --- a/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java @@ -105,8 +105,7 @@ public class InventoryListener implements Listener { return; } - if(blockState instanceof Furnace) { - Furnace furnace = (Furnace) blockState; + if(blockState instanceof Furnace furnace) { OfflinePlayer offlinePlayer = mcMMO.getSmeltingTracker().getFurnaceOwner(furnace); if(offlinePlayer != null) { @@ -191,7 +190,7 @@ public class InventoryListener implements Listener { InventoryHolder holder = inventory.getHolder(); - if (!(holder instanceof BrewingStand)) { + if (!(holder instanceof BrewingStand stand)) { return; } @@ -208,7 +207,6 @@ public class InventoryListener implements Listener { return; } - BrewingStand stand = (BrewingStand) holder; ItemStack clicked = event.getCurrentItem(); ItemStack cursor = event.getCursor(); diff --git a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java index f1d53c47f..d5f7a9ffc 100644 --- a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java @@ -119,9 +119,8 @@ public class PlayerListener implements Listener { @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)) + if (!(event.getEntity() instanceof Player player)) return; - Player player = (Player) event.getEntity(); // get the attacker LivingEntity attacker; @@ -413,9 +412,8 @@ public class PlayerListener implements Listener { { event.setExpToDrop(0); - if(caught instanceof Item) + if(caught instanceof Item caughtItem) { - Item caughtItem = (Item) caught; caughtItem.remove(); } @@ -489,9 +487,8 @@ public class PlayerListener implements Listener { return; } - if(event.getEntity() instanceof Player) + if(event.getEntity() instanceof Player player) { - Player player = (Player) event.getEntity(); /* WORLD GUARD MAIN FLAG CHECK */ if(WorldGuardUtils.isWorldGuardLoaded()) @@ -1013,8 +1010,7 @@ public class PlayerListener implements Listener { * We can check for an instance instead of EntityType here, so we are * ready for the infamous "Glow Item Frame" in 1.17 too! */ - if (event.getRightClicked() instanceof ItemFrame) { - ItemFrame frame = (ItemFrame) event.getRightClicked(); + if (event.getRightClicked() instanceof ItemFrame frame) { // Check for existing items (ignore rotations) if (frame.getItem().getType() != Material.AIR) { diff --git a/src/main/java/com/gmail/nossr50/locale/LocaleLoader.java b/src/main/java/com/gmail/nossr50/locale/LocaleLoader.java index f43662a0d..38944f720 100644 --- a/src/main/java/com/gmail/nossr50/locale/LocaleLoader.java +++ b/src/main/java/com/gmail/nossr50/locale/LocaleLoader.java @@ -256,45 +256,49 @@ public final class LocaleLoader { @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"; + return """ + This.Is.An.Example.Put.Locale.Keys.Here.One=&aExample text using hex color codes + This.Is.An.Example.Put.Locale.Keys.Here.Two=[[DARK_AQUA]]Example text using our own color codes + This.Is.An.Example.Put.Locale.Keys.Here.Three=Example text with no colors + """; } @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"; + """ + # -- Are you looking to change the language of mcMMO but without editing it yourself? -- + + # 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 + # Odds are, if you speak a popular language on earth we already have a translation for it. + # However our translations are done by the community, and update infrequently. (Please help us out <3) + # 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 + # For a list of built in translations, view this link: https://github.com/mcMMO-Dev/mcMMO/tree/master/src/main/resources/locale + + + # -- Using a built in translation --\s + # 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 + + + # -- Do you want to change the text in mcMMO? Including adding colors? ( Locale Override ) --\s + # First, a brief explanation. + # Locales are the language files used by mcMMO, they also contain color codes and most of the styling used by mcMMO. + # You can customize a locale outside of the JAR in version 2.1.51 and up. + # + # Locales can be overridden by editing this file + # You can find the up to date current locale files here https://github.com/mcMMO-Dev/mcMMO/tree/master/src/main/resources/locale + # 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 + # + # 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. + # 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. + + + # 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! + # 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 + # WARNING: Some keys in our master file are unused, make gratuitous use of Ctrl+F + # HOW TO APPLY: You can either restart the server for these changes to take effect or run /mcreloadlocale. + # -- Add Keys Below -- + """; return localeExplanation; } diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index 8a8d3192b..9fafa309d 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -381,15 +381,10 @@ public class mcMMO extends JavaPlugin { // Remove other tasks BEFORE starting the Backup, or we just cancel it straight away. try { ZipLibrary.mcMMOBackup(); - } - catch (IOException e) { - getLogger().severe(e.toString()); - } - catch(NoClassDefFoundError e) { + } 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) { + } catch (Throwable e) { getLogger().severe(e.toString()); } } 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 5a82b43da..572f36e0f 100644 --- a/src/main/java/com/gmail/nossr50/runnables/player/PlayerProfileLoadingTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/player/PlayerProfileLoadingTask.java @@ -73,7 +73,7 @@ public class PlayerProfileLoadingTask extends BukkitRunnable { // Increment attempt counter and try attempt++; - new PlayerProfileLoadingTask(player, attempt).runTaskLaterAsynchronously(mcMMO.p, (100 + (attempt * 100))); + new PlayerProfileLoadingTask(player, attempt).runTaskLaterAsynchronously(mcMMO.p, (100 + (attempt * 100L))); } private class ApplySuccessfulProfile extends BukkitRunnable { 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 876aba4ca..7265b386b 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,7 @@ public class AbilityDisableTask extends BukkitRunnable { SkillUtils.sendSkillMessage(player, NotificationType.SUPER_ABILITY_ALERT_OTHERS, ability.getAbilityPlayerOff()); } if(!mcMMO.isServerShutdownExecuted()) { - new AbilityCooldownTask(mcMMOPlayer, ability).runTaskLater(mcMMO.p, PerksUtils.handleCooldownPerks(player, ability.getCooldown()) * Misc.TICK_CONVERSION_FACTOR); + new AbilityCooldownTask(mcMMOPlayer, ability).runTaskLater(mcMMO.p, (long) PerksUtils.handleCooldownPerks(player, ability.getCooldown()) * Misc.TICK_CONVERSION_FACTOR); } } 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 617d1b735..31f19fada 100644 --- a/src/main/java/com/gmail/nossr50/runnables/skills/DelayedCropReplant.java +++ b/src/main/java/com/gmail/nossr50/runnables/skills/DelayedCropReplant.java @@ -35,8 +35,7 @@ public class DelayedCropReplant extends BukkitRunnable { public DelayedCropReplant(BlockBreakEvent blockBreakEvent, BlockState cropState, int desiredCropAge, boolean wasImmaturePlant) { BlockData cropData = cropState.getBlockData(); - if(cropData instanceof Directional) { - Directional cropDir = (Directional) cropData; + if(cropData instanceof Directional cropDir) { cropFace = cropDir.getFacing(); } 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 5d959b096..b9c558d1a 100644 --- a/src/main/java/com/gmail/nossr50/skills/acrobatics/AcrobaticsManager.java +++ b/src/main/java/com/gmail/nossr50/skills/acrobatics/AcrobaticsManager.java @@ -102,8 +102,7 @@ public class AcrobaticsManager extends SkillManager { } if (SkillUtils.cooldownExpired(mmoPlayer.getRespawnATS(), Misc.PLAYER_RESPAWN_COOLDOWN_SECONDS)) { - if(attacker instanceof Mob) { - Mob mob = (Mob) attacker; + if(attacker instanceof Mob mob) { //Check to see how many dodge XP rewards this mob has handed out 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 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 8f28f6ac8..d7ce592d8 100644 --- a/src/main/java/com/gmail/nossr50/skills/axes/AxesManager.java +++ b/src/main/java/com/gmail/nossr50/skills/axes/AxesManager.java @@ -15,12 +15,9 @@ import com.gmail.nossr50.util.random.RandomChanceUtil; import com.gmail.nossr50.util.skills.*; 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; - public class AxesManager extends SkillManager { public AxesManager(McMMOPlayer mcMMOPlayer) { super(mcMMOPlayer, PrimarySkillType.AXES); @@ -93,8 +90,7 @@ public class AxesManager extends SkillManager { NotificationManager.sendPlayerInformation(player, NotificationType.SUBSKILL_MESSAGE, "Axes.Combat.CriticalHit"); } - if (target instanceof Player) { - Player defender = (Player) target; + if (target instanceof Player defender) { if (NotificationManager.doesPlayerUseNotifications(defender)) { NotificationManager.sendPlayerInformation(defender, NotificationType.SUBSKILL_MESSAGE, "Axes.Combat.CritStruck"); @@ -150,8 +146,7 @@ public class AxesManager extends SkillManager { NotificationManager.sendPlayerInformation(player, NotificationType.SUBSKILL_MESSAGE, "Axes.Combat.GI.Proc"); } - if (target instanceof Player) { - Player defender = (Player) target; + if (target instanceof Player defender) { if (NotificationManager.doesPlayerUseNotifications(defender)) { NotificationManager.sendPlayerInformation(defender, NotificationType.SUBSKILL_MESSAGE, "Axes.Combat.GI.Struck"); @@ -163,11 +158,10 @@ public class AxesManager extends SkillManager { /** * Handle the effects of the Skull Splitter ability - * - * @param target The {@link LivingEntity} being affected by the ability + * @param target The {@link LivingEntity} being affected by the ability * @param damage The amount of damage initially dealt by the event */ - public void skullSplitterCheck(@NotNull LivingEntity target, double damage, Map modifiers) { - CombatUtils.applyAbilityAoE(getPlayer(), target, damage / Axes.skullSplitterModifier, modifiers, skill); + public void skullSplitterCheck(@NotNull LivingEntity target, double damage) { + CombatUtils.applyAbilityAoE(getPlayer(), target, damage / Axes.skullSplitterModifier, skill); } } 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 541a8ac18..ddefee49e 100644 --- a/src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java +++ b/src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java @@ -88,11 +88,9 @@ public class HerbalismManager extends SkillManager { mmoPlayer.getPlayer().sendMessage("Processing sweet berry bush rewards"); } //Check the age - if(blockState.getBlockData() instanceof Ageable) { + if(blockState.getBlockData() instanceof Ageable ageable) { int rewardByAge = 0; - Ageable ageable = (Ageable) blockState.getBlockData(); - if(ageable.getAge() == 2) { rewardByAge = 1; //Normal XP } else if(ageable.getAge() == 3) { @@ -134,8 +132,7 @@ public class HerbalismManager extends SkillManager { BlockState blockState = block.getState(); if(blockState.getType().toString().equalsIgnoreCase("sweet_berry_bush")) { - if(blockState.getBlockData() instanceof Ageable) { - Ageable ageable = (Ageable) blockState.getBlockData(); + if(blockState.getBlockData() instanceof Ageable ageable) { if(ageable.getAge() <= 1) { applyXpGain(xpReward, XPGainReason.PVE, XPGainSource.SELF); @@ -351,8 +348,7 @@ public class HerbalismManager extends SkillManager { */ //Not all things that are natural should give double drops, make sure its fully mature as well - if(plantData instanceof Ageable) { - Ageable ageable = (Ageable) plantData; + if(plantData instanceof Ageable ageable) { if(isAgeableMature(ageable) || isBizarreAgeable(plantData)) { if(checkDoubleDrop(brokenPlantState)) { @@ -447,8 +443,7 @@ public class HerbalismManager extends SkillManager { */ //Calculate XP - if(plantData instanceof Ageable) { - Ageable plantAgeable = (Ageable) plantData; + if(plantData instanceof Ageable plantAgeable) { if(isAgeableMature(plantAgeable) || isBizarreAgeable(plantData)) { xpToReward += ExperienceConfig.getInstance().getXp(PrimarySkillType.HERBALISM, brokenBlockNewState.getType()); @@ -764,12 +759,10 @@ public class HerbalismManager extends SkillManager { BlockData blockData = blockState.getBlockData(); - if (!(blockData instanceof Ageable)) { + if (!(blockData instanceof Ageable ageable)) { return false; } - Ageable ageable = (Ageable) blockData; - //If the ageable is NOT mature and the player is NOT using a hoe, abort Player player = getPlayer(); 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 23fde19d3..98b8cf8b6 100644 --- a/src/main/java/com/gmail/nossr50/skills/mining/BlastMining.java +++ b/src/main/java/com/gmail/nossr50/skills/mining/BlastMining.java @@ -8,7 +8,6 @@ import com.gmail.nossr50.util.skills.RankUtils; import org.bukkit.entity.Player; import org.bukkit.entity.TNTPrimed; import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.event.entity.EntityDamageEvent.DamageModifier; public class BlastMining { // The order of the values is extremely important, a few methods depend on it to work properly @@ -114,7 +113,7 @@ public class BlastMining { return false; } - event.setDamage(DamageModifier.BASE, miningManager.processDemolitionsExpertise(event.getDamage())); + event.setDamage(miningManager.processDemolitionsExpertise(event.getDamage())); if (event.getFinalDamage() == 0) { event.setCancelled(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 2d91949a8..6205173aa 100644 --- a/src/main/java/com/gmail/nossr50/skills/mining/MiningManager.java +++ b/src/main/java/com/gmail/nossr50/skills/mining/MiningManager.java @@ -130,7 +130,7 @@ public class MiningManager extends SkillManager { 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); + new AbilityCooldownTask(mmoPlayer, SuperAbilityType.BLAST_MINING).runTaskLater(mcMMO.p, (long) SuperAbilityType.BLAST_MINING.getCooldown() * Misc.TICK_CONVERSION_FACTOR); } /** 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 7d864e36e..5b34fcc34 100644 --- a/src/main/java/com/gmail/nossr50/skills/swords/SwordsManager.java +++ b/src/main/java/com/gmail/nossr50/skills/swords/SwordsManager.java @@ -21,12 +21,9 @@ import com.gmail.nossr50.util.skills.SkillActivationType; import org.bukkit.entity.Entity; 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; - public class SwordsManager extends SkillManager { public SwordsManager(McMMOPlayer mcMMOPlayer) { super(mcMMOPlayer, PrimarySkillType.SWORDS); @@ -81,8 +78,7 @@ public class SwordsManager extends SkillManager { if (RandomChanceUtil.rollDice(mcMMO.p.getAdvancedConfig().getRuptureChanceToApplyOnHit(getRuptureRank()), 100)) { - if (target instanceof Player) { - Player defender = (Player) target; + if (target instanceof Player defender) { //Don't start or add to a bleed if they are blocking if(defender.isBlocking()) @@ -158,11 +154,10 @@ public class SwordsManager extends SkillManager { /** * Handle the effects of the Serrated Strikes ability - * - * @param target The {@link LivingEntity} being affected by the ability + * @param target The {@link LivingEntity} being affected by the ability * @param damage The amount of damage initially dealt by the event */ - public void serratedStrikes(@NotNull LivingEntity target, double damage, Map modifiers) { - CombatUtils.applyAbilityAoE(getPlayer(), target, damage / Swords.serratedStrikesModifier, modifiers, skill); + public void serratedStrikes(@NotNull LivingEntity target, double damage) { + CombatUtils.applyAbilityAoE(getPlayer(), target, damage / Swords.serratedStrikesModifier, skill); } } 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 d51b50291..7d4ad8849 100644 --- a/src/main/java/com/gmail/nossr50/skills/taming/TamingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/taming/TamingManager.java @@ -240,8 +240,7 @@ public class TamingManager extends SkillManager { message = message.concat(LocaleLoader.getString("Combat.BeastLoreHealth", target.getHealth(), target.getMaxHealth())); // Bred mules & donkeys can actually have horse-like stats, but llamas cannot. - if (beast instanceof AbstractHorse && !(beast instanceof Llama)) { - AbstractHorse horseLikeCreature = (AbstractHorse) beast; + if (beast instanceof AbstractHorse horseLikeCreature && !(beast instanceof Llama)) { AttributeInstance jumpAttribute = horseLikeCreature.getAttribute(Attribute.HORSE_JUMP_STRENGTH); if(jumpAttribute != null) { @@ -277,8 +276,7 @@ public class TamingManager extends SkillManager { ParticleEffectUtils.playGreaterImpactEffect(target); target.setVelocity(wolf.getLocation().getDirection().normalize().multiply(1.5D)); - if (target instanceof Player) { - Player defender = (Player) target; + if (target instanceof Player defender) { if (NotificationManager.doesPlayerUseNotifications(defender)) { NotificationManager.sendPlayerInformation(defender, NotificationType.SUBSKILL_MESSAGE, "Taming.SubSkill.Pummel.TargetMessage"); @@ -287,9 +285,8 @@ public class TamingManager extends SkillManager { } public void attackTarget(LivingEntity target) { - if(target instanceof Tameable) + if(target instanceof Tameable tameable) { - Tameable tameable = (Tameable) target; if(tameable.getOwner() == getPlayer()) { return; diff --git a/src/main/java/com/gmail/nossr50/util/BlockUtils.java b/src/main/java/com/gmail/nossr50/util/BlockUtils.java index c899fc148..06b0ef31b 100644 --- a/src/main/java/com/gmail/nossr50/util/BlockUtils.java +++ b/src/main/java/com/gmail/nossr50/util/BlockUtils.java @@ -290,8 +290,7 @@ public final class BlockUtils { if (data.getMaterial() == Material.CACTUS || data.getMaterial() == Material.SUGAR_CANE) { return true; } - if (data instanceof Ageable) { - Ageable ageable = (Ageable) data; + if (data instanceof Ageable ageable) { return ageable.getAge() == ageable.getMaximumAge(); } return true; diff --git a/src/main/java/com/gmail/nossr50/util/EventUtils.java b/src/main/java/com/gmail/nossr50/util/EventUtils.java index acec911dd..81bec7e50 100644 --- a/src/main/java/com/gmail/nossr50/util/EventUtils.java +++ b/src/main/java/com/gmail/nossr50/util/EventUtils.java @@ -130,12 +130,10 @@ public final class EventUtils { if(Misc.isNPCEntityExcludingVillagers(entity)) return false; - if (!entity.isValid() || !(entity instanceof LivingEntity)) { + if (!entity.isValid() || !(entity instanceof LivingEntity livingEntity)) { return false; } - LivingEntity livingEntity = (LivingEntity) entity; - if (CombatUtils.isInvincible(livingEntity, damage)) { return false; } diff --git a/src/main/java/com/gmail/nossr50/util/MobHealthbarUtils.java b/src/main/java/com/gmail/nossr50/util/MobHealthbarUtils.java index 638a9f488..285d88981 100644 --- a/src/main/java/com/gmail/nossr50/util/MobHealthbarUtils.java +++ b/src/main/java/com/gmail/nossr50/util/MobHealthbarUtils.java @@ -81,7 +81,7 @@ public final class MobHealthbarUtils { 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 + new MobHealthDisplayUpdaterTask(target).runTaskLater(mcMMO.p, (long) displayTime * Misc.TICK_CONVERSION_FACTOR); // Clear health display after 3 seconds } } diff --git a/src/main/java/com/gmail/nossr50/util/TransientEntityTracker.java b/src/main/java/com/gmail/nossr50/util/TransientEntityTracker.java index e9d2fca83..8b258d03a 100644 --- a/src/main/java/com/gmail/nossr50/util/TransientEntityTracker.java +++ b/src/main/java/com/gmail/nossr50/util/TransientEntityTracker.java @@ -92,7 +92,7 @@ public class TransientEntityTracker { * @param playerUUID player to register */ private synchronized void registerPlayer(@NotNull UUID playerUUID) { - getPerPlayerTransientEntityMap().put(playerUUID, new HashMap>()); + getPerPlayerTransientEntityMap().put(playerUUID, new HashMap<>()); for(CallOfTheWildType callOfTheWildType : CallOfTheWildType.values()) { getPerPlayerTransientEntityMap().get(playerUUID).put(callOfTheWildType, new HashSet<>()); 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 3f61c9bef..80f15699b 100644 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/McMMOSimpleRegionFile.java +++ b/src/main/java/com/gmail/nossr50/util/blockmeta/McMMOSimpleRegionFile.java @@ -132,7 +132,7 @@ public class McMMOSimpleRegionFile { 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.seek((long) newSegmentIndex << segmentExponent); // Seek to file location file.write(buffer, 0, size); // Write data // update in memory info chunkSegmentIndex[index] = newSegmentIndex; @@ -141,9 +141,9 @@ public class McMMOSimpleRegionFile { // Mark segments in use markChunkSegments(index, true); // Update header info - file.seek(SEEK_CHUNK_SEGMENT_INDICES + (4 * index)); + file.seek(SEEK_CHUNK_SEGMENT_INDICES + (4L * index)); file.writeInt(chunkSegmentIndex[index]); - file.seek(SEEK_CHUNK_BYTE_LENGTHS + (4 * index)); + file.seek(SEEK_CHUNK_BYTE_LENGTHS + (4L * index)); file.writeInt(chunkNumBytes[index]); } @@ -157,7 +157,7 @@ public class McMMOSimpleRegionFile { byte[] data = new byte[byteLength]; - file.seek(chunkSegmentIndex[index] << segmentExponent); // Seek to file location + file.seek((long) chunkSegmentIndex[index] << segmentExponent); // Seek to file location file.readFully(data); // Read in the data return new DataInputStream(new InflaterInputStream(new ByteArrayInputStream(data))); } 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 ccc09be80..e77641d32 100644 --- a/src/main/java/com/gmail/nossr50/util/experience/ExperienceBarManager.java +++ b/src/main/java/com/gmail/nossr50/util/experience/ExperienceBarManager.java @@ -77,7 +77,7 @@ public class ExperienceBarManager { return; ExperienceBarHideTask experienceBarHideTask = new ExperienceBarHideTask(this, mcMMOPlayer, primarySkillType); - experienceBarHideTask.runTaskLater(plugin, 20* delaySeconds); + experienceBarHideTask.runTaskLater(plugin, 20L * delaySeconds); experienceBarHideTaskHashMap.put(primarySkillType, experienceBarHideTask); } diff --git a/src/main/java/com/gmail/nossr50/util/platform/MajorMinorPatchVersion.java b/src/main/java/com/gmail/nossr50/util/platform/MajorMinorPatchVersion.java index 7faa31d2a..b933786f6 100644 --- a/src/main/java/com/gmail/nossr50/util/platform/MajorMinorPatchVersion.java +++ b/src/main/java/com/gmail/nossr50/util/platform/MajorMinorPatchVersion.java @@ -32,11 +32,7 @@ public abstract class MajorMinorPatchVersion implements Versioned { this.majorVersion = majorVersion; this.minorVersion = minorVersion; - if(patchVersion == null) { - this.patchVersion = new SimpleNumericVersion(0); - } else { - this.patchVersion = patchVersion; - } + this.patchVersion = Objects.requireNonNullElseGet(patchVersion, () -> new SimpleNumericVersion(0)); } public MajorMinorPatchVersion(int majorVerNumber, int minorVerNumber, int patchVerNumber) { 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 e576baae2..181cddde6 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java @@ -8,7 +8,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.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; @@ -23,7 +22,6 @@ import com.gmail.nossr50.skills.unarmed.UnarmedManager; import com.gmail.nossr50.util.*; import com.gmail.nossr50.util.player.NotificationManager; import com.gmail.nossr50.util.player.UserManager; -import com.google.common.collect.ImmutableMap; import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.Material; @@ -33,7 +31,6 @@ 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.MetadataValue; import org.bukkit.potion.PotionEffectType; @@ -41,10 +38,7 @@ import org.bukkit.projectiles.ProjectileSource; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.EnumMap; -import java.util.HashMap; import java.util.List; -import java.util.Map; public final class CombatUtils { @@ -56,14 +50,10 @@ public final class CombatUtils { //Likely.. because who knows what plugins are throwing around public static boolean isDamageLikelyFromNormalCombat(@NotNull DamageCause damageCause) { - switch (damageCause) { - case ENTITY_ATTACK: - case ENTITY_SWEEP_ATTACK: - case PROJECTILE: - return true; - default: - return false; - } + return switch (damageCause) { + case ENTITY_ATTACK, ENTITY_SWEEP_ATTACK, PROJECTILE -> true; + default -> false; + }; } public static boolean hasWeakenedDamage(@NotNull LivingEntity livingEntity) { @@ -83,10 +73,7 @@ public final class CombatUtils { } SwordsManager swordsManager = mcMMOPlayer.getSwordsManager(); - double initialDamage = event.getDamage(); - double finalDamage = initialDamage; - - Map modifiers = getModifiers(event); + double boostedDamage = event.getDamage(); if (swordsManager.canActivateAbility()) { mcMMOPlayer.checkAbilityActivation(PrimarySkillType.SWORDS); @@ -99,19 +86,19 @@ public final class CombatUtils { //Add Stab Damage if(swordsManager.canUseStab()) { - finalDamage+=(swordsManager.getStabDamage() * mcMMOPlayer.getAttackStrength()); + boostedDamage += (swordsManager.getStabDamage() * mcMMOPlayer.getAttackStrength()); } if (swordsManager.canUseSerratedStrike()) { - swordsManager.serratedStrikes(target, initialDamage, modifiers); + swordsManager.serratedStrikes(target, event.getDamage()); } if(canUseLimitBreak(player, target, SubSkillType.SWORDS_SWORDS_LIMIT_BREAK)) { - finalDamage+=(getLimitBreakDamage(player, target, SubSkillType.SWORDS_SWORDS_LIMIT_BREAK) * mcMMOPlayer.getAttackStrength()); + boostedDamage += (getLimitBreakDamage(player, target, SubSkillType.SWORDS_SWORDS_LIMIT_BREAK) * mcMMOPlayer.getAttackStrength()); } - applyScaledModifiers(initialDamage, finalDamage, event); + event.setDamage(boostedDamage); processCombatXP(mcMMOPlayer, target, PrimarySkillType.SWORDS); printFinalDamageDebug(player, event, mcMMOPlayer); @@ -133,10 +120,8 @@ public final class CombatUtils { if (event.getCause() == DamageCause.THORNS) { return; } - - double initialDamage = event.getDamage(); - double finalDamage = initialDamage; - Map modifiers = getModifiers(event); + + double boostedDamage = event.getDamage(); McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); @@ -152,30 +137,30 @@ public final class CombatUtils { } if (axesManager.canUseAxeMastery()) { - finalDamage+=axesManager.axeMastery(); + boostedDamage+=axesManager.axeMastery(); } if (axesManager.canImpact(target)) { axesManager.impactCheck(target); } else if (axesManager.canGreaterImpact(target)) { - finalDamage+=axesManager.greaterImpact(target); + boostedDamage+=axesManager.greaterImpact(target); } if (axesManager.canUseSkullSplitter(target)) { - axesManager.skullSplitterCheck(target, initialDamage, modifiers); + axesManager.skullSplitterCheck(target, event.getDamage()); } if (axesManager.canCriticalHit(target)) { - finalDamage+=(axesManager.criticalHit(target, finalDamage) * mcMMOPlayer.getAttackStrength()); + boostedDamage+=(axesManager.criticalHit(target, boostedDamage) * mcMMOPlayer.getAttackStrength()); } if(canUseLimitBreak(player, target, SubSkillType.AXES_AXES_LIMIT_BREAK)) { - finalDamage+=(getLimitBreakDamage(player, target, SubSkillType.AXES_AXES_LIMIT_BREAK) * mcMMOPlayer.getAttackStrength()); + boostedDamage+=(getLimitBreakDamage(player, target, SubSkillType.AXES_AXES_LIMIT_BREAK) * mcMMOPlayer.getAttackStrength()); } - applyScaledModifiers(initialDamage, finalDamage, event); + event.setDamage(boostedDamage); processCombatXP(mcMMOPlayer, target, PrimarySkillType.AXES); printFinalDamageDebug(player, event, mcMMOPlayer); @@ -186,8 +171,7 @@ public final class CombatUtils { return; } - double initialDamage = event.getDamage(); - double finalDamage = initialDamage; + double boostedDamage = event.getDamage(); McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); @@ -203,11 +187,11 @@ public final class CombatUtils { } if (unarmedManager.canUseSteelArm()) { - finalDamage+=(unarmedManager.calculateSteelArmStyleDamage() * mcMMOPlayer.getAttackStrength()); + boostedDamage+=(unarmedManager.calculateSteelArmStyleDamage() * mcMMOPlayer.getAttackStrength()); } if (unarmedManager.canUseBerserk()) { - finalDamage+=(unarmedManager.berserkDamage(finalDamage) * mcMMOPlayer.getAttackStrength()); + boostedDamage+=(unarmedManager.berserkDamage(boostedDamage) * mcMMOPlayer.getAttackStrength()); } if (unarmedManager.canDisarm(target)) { @@ -216,10 +200,10 @@ public final class CombatUtils { if(canUseLimitBreak(player, target, SubSkillType.UNARMED_UNARMED_LIMIT_BREAK)) { - finalDamage+=(getLimitBreakDamage(player, target, SubSkillType.UNARMED_UNARMED_LIMIT_BREAK) * mcMMOPlayer.getAttackStrength()); + boostedDamage+=(getLimitBreakDamage(player, target, SubSkillType.UNARMED_UNARMED_LIMIT_BREAK) * mcMMOPlayer.getAttackStrength()); } - applyScaledModifiers(initialDamage, finalDamage, event); + event.setDamage(boostedDamage); processCombatXP(mcMMOPlayer, target, PrimarySkillType.UNARMED); printFinalDamageDebug(player, event, mcMMOPlayer); @@ -227,7 +211,7 @@ public final class CombatUtils { private static void processTamingCombat(@NotNull LivingEntity target, @Nullable Player master, @NotNull Wolf wolf, @NotNull EntityDamageByEntityEvent event) { double initialDamage = event.getDamage(); - double finalDamage = initialDamage; + double boostedDamage = initialDamage; if(master != null && master.isOnline() && master.isValid()) { McMMOPlayer mcMMOPlayer = UserManager.getPlayer(master); @@ -246,14 +230,14 @@ public final class CombatUtils { tamingManager.pummel(target, wolf); if (tamingManager.canUseSharpenedClaws()) { - finalDamage+=tamingManager.sharpenedClaws(); + boostedDamage+=tamingManager.sharpenedClaws(); } if (tamingManager.canUseGore()) { - finalDamage+=tamingManager.gore(target, initialDamage); + boostedDamage+=tamingManager.gore(target, initialDamage); } - applyScaledModifiers(initialDamage, finalDamage, event); + event.setDamage(boostedDamage); processCombatXP(mcMMOPlayer, target, PrimarySkillType.TAMING, 3); } @@ -272,15 +256,15 @@ public final class CombatUtils { ArcheryManager archeryManager = mcMMOPlayer.getArcheryManager(); - double finalDamage = event.getDamage(); + double boostedDamage = event.getDamage(); if (archeryManager.canSkillShot()) { //Not Additive - finalDamage = archeryManager.skillShot(initialDamage); + boostedDamage = archeryManager.skillShot(initialDamage); } if (archeryManager.canDaze(target)) { - finalDamage+=archeryManager.daze((Player) target); //the cast is checked by the if condition + boostedDamage+=archeryManager.daze((Player) target); //the cast is checked by the if condition } if (!arrow.hasMetadata(MetadataConstants.METADATA_KEY_INF_ARROW) && archeryManager.canRetrieveArrows()) { @@ -289,7 +273,7 @@ public final class CombatUtils { if(canUseLimitBreak(player, target, SubSkillType.ARCHERY_ARCHERY_LIMIT_BREAK)) { - finalDamage+=getLimitBreakDamage(player, target, SubSkillType.ARCHERY_ARCHERY_LIMIT_BREAK); + boostedDamage+=getLimitBreakDamage(player, target, SubSkillType.ARCHERY_ARCHERY_LIMIT_BREAK); } double distanceMultiplier = archeryManager.distanceXpBonusMultiplier(target, arrow); @@ -298,15 +282,14 @@ public final class CombatUtils { if(arrow.hasMetadata(MetadataConstants.METADATA_KEY_BOW_FORCE)) forceMultiplier = arrow.getMetadata(MetadataConstants.METADATA_KEY_BOW_FORCE).get(0).asDouble(); - applyScaledModifiers(initialDamage, finalDamage, event); - + event.setDamage(boostedDamage); processCombatXP(mcMMOPlayer, target, PrimarySkillType.ARCHERY, forceMultiplier * distanceMultiplier); printFinalDamageDebug(player, event, mcMMOPlayer, "Distance Multiplier: "+distanceMultiplier, "Force Multiplier: "+forceMultiplier, "Initial Damage: "+initialDamage, - "Final Damage: "+finalDamage); + "Final Damage: "+boostedDamage); //Clean data cleanupArrowMetadata(arrow); } @@ -351,8 +334,7 @@ public final class CombatUtils { } } - if (painSourceRoot instanceof Player && entityType == EntityType.PLAYER) { - Player player = (Player) painSourceRoot; + if (painSourceRoot instanceof Player player && entityType == EntityType.PLAYER) { if (!UserManager.hasPlayerDataKey(player)) { return; @@ -410,8 +392,7 @@ public final class CombatUtils { Wolf wolf = (Wolf) painSource; AnimalTamer tamer = wolf.getOwner(); - if (tamer instanceof Player && mcMMO.p.getSkillTools().canCombatSkillsTrigger(PrimarySkillType.TAMING, target)) { - Player master = (Player) tamer; + if (tamer instanceof Player master && mcMMO.p.getSkillTools().canCombatSkillsTrigger(PrimarySkillType.TAMING, target)) { if (!Misc.isNPCEntityExcludingVillagers(master) && mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(master, PrimarySkillType.TAMING)) { processTamingCombat(target, master, wolf, event); @@ -422,8 +403,7 @@ public final class CombatUtils { Projectile arrow = (Projectile) painSource; ProjectileSource projectileSource = arrow.getShooter(); - if (projectileSource instanceof Player && mcMMO.p.getSkillTools().canCombatSkillsTrigger(PrimarySkillType.ARCHERY, target)) { - Player player = (Player) projectileSource; + if (projectileSource instanceof Player player && mcMMO.p.getSkillTools().canCombatSkillsTrigger(PrimarySkillType.ARCHERY, target)) { if (!Misc.isNPCEntityExcludingVillagers(player) && mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, PrimarySkillType.ARCHERY)) { processArcheryCombat(target, player, event, arrow); @@ -472,8 +452,7 @@ public final class CombatUtils { * @return the RAW damage bonus from Limit Break which is applied before reductions */ public static int getLimitBreakDamage(@NotNull Player attacker, @NotNull LivingEntity defender, @NotNull SubSkillType subSkillType) { - if(defender instanceof Player) { - Player playerDefender = (Player) defender; + if(defender instanceof Player playerDefender) { return getLimitBreakDamageAgainstQuality(attacker, subSkillType, getArmorQualityLevel(playerDefender)); } else { return getLimitBreakDamageAgainstQuality(attacker, subSkillType, 1000); @@ -683,13 +662,12 @@ public final class CombatUtils { /** * Apply Area-of-Effect ability actions. - * - * @param attacker The attacking player + * @param attacker The attacking player * @param target The defending entity * @param damage The initial damage amount * @param type The type of skill being used */ - public static void applyAbilityAoE(@NotNull Player attacker, @NotNull LivingEntity target, double damage, Map modifiers, @NotNull PrimarySkillType type) { + public static void applyAbilityAoE(@NotNull Player attacker, @NotNull LivingEntity target, double damage, @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); @@ -698,11 +676,11 @@ public final class CombatUtils { break; } - if ((ExperienceConfig.getInstance().isNPCInteractionPrevented() && Misc.isNPCEntityExcludingVillagers(entity)) || !(entity instanceof LivingEntity) || !shouldBeAffected(attacker, entity)) { + if ((ExperienceConfig.getInstance().isNPCInteractionPrevented() && Misc.isNPCEntityExcludingVillagers(entity)) + || !(entity instanceof LivingEntity livingEntity) || !shouldBeAffected(attacker, entity)) { continue; } - LivingEntity livingEntity = (LivingEntity) entity; EventUtils.callFakeArmSwingEvent(attacker); switch (type) { @@ -711,7 +689,12 @@ public final class CombatUtils { NotificationManager.sendPlayerInformation((Player)entity, NotificationType.SUBSKILL_MESSAGE, "Swords.Combat.SS.Struck"); } - UserManager.getPlayer(attacker).getSwordsManager().processRupture(livingEntity); + McMMOPlayer mmoAttacker = UserManager.getPlayer(attacker); + + if(mmoAttacker != null) { + mmoAttacker.getSwordsManager().processRupture(livingEntity); + } + break; case AXES: @@ -753,13 +736,12 @@ public final class CombatUtils { double baseXP = 0; XPGainReason xpGainReason; - if (target instanceof Player) { + if (target instanceof Player defender) { if (!ExperienceConfig.getInstance().getExperienceGainsPlayerVersusPlayerEnabled() || PartyManager.inSameParty(mcMMOPlayer.getPlayer(), (Player) target)) { return; } xpGainReason = XPGainReason.PVP; - Player defender = (Player) target; if (defender.isOnline() && SkillUtils.cooldownExpired(mcMMOPlayer.getRespawnATS(), Misc.PLAYER_RESPAWN_COOLDOWN_SECONDS)) { baseXP = 20 * ExperienceConfig.getInstance().getPlayerVersusPlayerXP(); @@ -833,9 +815,7 @@ public final class CombatUtils { * @return true if the Entity should be damaged, false otherwise. */ private static boolean shouldBeAffected(@NotNull Player player, @NotNull Entity entity) { - if (entity instanceof Player) { - Player defender = (Player) entity; - + if (entity instanceof Player defender) { //TODO: NPC Interaction? if(UserManager.getPlayer(defender) == null) return true; @@ -854,16 +834,8 @@ public final class CombatUtils { } // Spectators should not be affected - if (defender.getGameMode() == GameMode.SPECTATOR) { - return false; - } - - // It may seem a bit redundant but we need a check here to prevent bleed from being applied in applyAbilityAoE() - return getFakeDamageFinalResult(player, entity, 1.0) != 0; - } - else if (entity instanceof Tameable) { - Tameable tameableEntity = (Tameable) entity; - + return defender.getGameMode() != GameMode.SPECTATOR; + } else if (entity instanceof Tameable tameableEntity) { 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 @@ -901,8 +873,7 @@ public final class CombatUtils { if (pet.isTamed()) { AnimalTamer tamer = pet.getOwner(); - if (tamer instanceof Player) { - Player owner = (Player) tamer; + if (tamer instanceof Player owner) { return (owner == attacker || PartyManager.inSameParty(attacker, owner) || PartyManager.areAllies(attacker, owner)); } @@ -911,99 +882,13 @@ public final class CombatUtils { return false; } - @Deprecated - 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(@Nullable Entity attacker, @NotNull Entity target, @NotNull DamageCause damageCause, double damage) { - EntityDamageEvent damageEvent = sendEntityDamageEvent(attacker, target, damageCause, damage); - - if (damageEvent.isCancelled()) { - return 0; - } - - return damageEvent.getFinalDamage(); - } - public static boolean canDamage(@NotNull Entity attacker, @NotNull Entity target, @NotNull DamageCause damageCause, double damage) { - EntityDamageEvent damageEvent = sendEntityDamageEvent(attacker, target, damageCause, damage); + EntityDamageEvent damageEvent = new FakeEntityDamageByEntityEvent(attacker, target, damageCause, damage); + mcMMO.p.getServer().getPluginManager().callEvent(damageEvent); return !damageEvent.isCancelled(); } - 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(@Nullable Entity attacker, @NotNull Entity target, @NotNull Map modifiers) { - return getFakeDamageFinalResult(attacker, target, DamageCause.ENTITY_ATTACK, 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(@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); - - if (damageEvent.isCancelled()) { - return 0; - } - - return damageEvent.getFinalDamage(); - } - - private static @NotNull Map getModifiers(@NotNull EntityDamageEvent event) { - Map modifiers = new HashMap<>(); - for (DamageModifier modifier : DamageModifier.values()) { - modifiers.put(modifier, event.getDamage(modifier)); - } - - return modifiers; - } - - private static @NotNull Map getScaledModifiers(double damage, @NotNull Map modifiers) { - Map scaledModifiers = new HashMap<>(); - - for (DamageModifier modifier : modifiers.keySet()) { - if (modifier == DamageModifier.BASE) { - scaledModifiers.put(modifier, damage); - continue; - } - - scaledModifiers.put(modifier, damage * modifiers.get(modifier)); - } - - return scaledModifiers; - } - - public static @NotNull EntityDamageByEntityEvent applyScaledModifiers(double initialDamage, double finalDamage, @NotNull EntityDamageByEntityEvent event) { - // No additional damage - if (initialDamage == finalDamage) { - return event; - } - - for (DamageModifier modifier : DamageModifier.values()) { - if (!event.isApplicable(modifier)) { - continue; - } - - if (modifier == DamageModifier.BASE) { - event.setDamage(modifier, finalDamage); - continue; - } - - event.setDamage(modifier, finalDamage / initialDamage * event.getDamage(modifier)); - } - - return event; - } - /** * Get the upgrade tier of the item in hand. * @@ -1038,12 +923,10 @@ public final class CombatUtils { } public static void handleHealthbars(@NotNull Entity attacker, @NotNull LivingEntity target, double damage, @NotNull mcMMO plugin) { - if (!(attacker instanceof Player)) { + if (!(attacker instanceof Player player)) { return; } - Player player = (Player) attacker; - if (Misc.isNPCEntityExcludingVillagers(player) || Misc.isNPCEntityExcludingVillagers(target)) { return; } @@ -1089,6 +972,6 @@ public final class CombatUtils { * @param entity the projectile */ public static void delayArrowMetaCleanup(@NotNull Projectile entity) { - Bukkit.getServer().getScheduler().runTaskLater(mcMMO.p, () -> { cleanupArrowMetadata(entity);}, 20*60); + Bukkit.getServer().getScheduler().runTaskLater(mcMMO.p, () -> cleanupArrowMetadata(entity), 20*60); } } 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 697e20e30..c36821cc7 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/RankUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/RankUtils.java @@ -48,7 +48,7 @@ public class RankUtils { { SkillUnlockNotificationTask skillUnlockNotificationTask = new SkillUnlockNotificationTask(mcMMOPlayer, subSkillType, newLevel); - skillUnlockNotificationTask.runTaskLater(plugin, (count * 100)); + skillUnlockNotificationTask.runTaskLater(plugin, (count * 100L)); count++; } 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 c8f88e65f..416926fe4 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/SkillTools.java +++ b/src/main/java/com/gmail/nossr50/util/skills/SkillTools.java @@ -58,7 +58,7 @@ public class SkillTools { /* * Setup subskill -> parent relationship map */ - EnumMap tempSubParentMap = new EnumMap(SubSkillType.class); + EnumMap tempSubParentMap = new EnumMap<>(SubSkillType.class); //Super hacky and disgusting for(PrimarySkillType primarySkillType1 : PrimarySkillType.values()) { @@ -78,7 +78,7 @@ public class SkillTools { * Setup primary -> (collection) subskill map */ - EnumMap> tempPrimaryChildMap = new EnumMap>(PrimarySkillType.class); + EnumMap> tempPrimaryChildMap = new EnumMap<>(PrimarySkillType.class); //Init the empty Hash Sets for(PrimarySkillType primarySkillType1 : PrimarySkillType.values()) { @@ -98,7 +98,7 @@ public class SkillTools { /* * Setup primary -> tooltype map */ - EnumMap tempToolMap = new EnumMap(PrimarySkillType.class); + EnumMap tempToolMap = new EnumMap<>(PrimarySkillType.class); tempToolMap.put(PrimarySkillType.AXES, ToolType.AXE); tempToolMap.put(PrimarySkillType.WOODCUTTING, ToolType.AXE); @@ -115,8 +115,8 @@ public class SkillTools { * Setup primary -> ability map */ - EnumMap tempAbilityParentRelationshipMap = new EnumMap(SuperAbilityType.class); - EnumMap tempMainActivatedAbilityChildMap = new EnumMap(PrimarySkillType.class); + EnumMap tempAbilityParentRelationshipMap = new EnumMap<>(SuperAbilityType.class); + EnumMap tempMainActivatedAbilityChildMap = new EnumMap<>(PrimarySkillType.class); for(SuperAbilityType superAbilityType : SuperAbilityType.values()) { try { 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 34aac4fc8..d0252a846 100644 --- a/src/main/java/com/gmail/nossr50/util/text/StringUtils.java +++ b/src/main/java/com/gmail/nossr50/util/text/StringUtils.java @@ -109,8 +109,7 @@ public class StringUtils { case CARROTS: case POTATOES: case NETHER_WART: { - if (data instanceof Ageable) { - Ageable ageData = (Ageable) data; + if (data instanceof Ageable ageData) { if (ageData.getAge() == ageData.getMaximumAge()) { return getPrettyItemString(data.getMaterial()).replace(" ", "_") + "_Ripe"; } 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 3af0553a3..11c0d4060 100644 --- a/src/test/java/com/gmail/nossr50/util/platform/MinecraftGameVersionTest.java +++ b/src/test/java/com/gmail/nossr50/util/platform/MinecraftGameVersionTest.java @@ -91,8 +91,8 @@ class MinecraftGameVersionTest { try (MockedStatic bukkit = Mockito.mockStatic(Bukkit.class)) { // Inject our own Bukkit versions - bukkit.when(() -> Bukkit.getVersion()).thenReturn(serverSoftwareVersion); - bukkit.when(() -> Bukkit.getBukkitVersion()).thenReturn(gameVersion); + bukkit.when(Bukkit::getVersion).thenReturn(serverSoftwareVersion); + bukkit.when(Bukkit::getBukkitVersion).thenReturn(gameVersion); PlatformManager manager = new PlatformManager(); Platform platform = manager.getPlatform(); From 8821fb0b2f2bf8b416eb2792a8735787b82d03b9 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 18 Mar 2022 15:07:02 -0700 Subject: [PATCH 285/326] 2.1.211 --- Changelog.txt | 6 ++++++ pom.xml | 2 +- .../com/gmail/nossr50/runnables/skills/RuptureTask.java | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 556a336e5..49e4dede8 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,5 +1,11 @@ Version 2.1.211 Added /mmodebug info for players hitting other players + Fixed Immortal Player bug + Removed all of Spigot's buggy and deprecated DamageModifier API, this fixes the bug where players would become immortal when using certain other plugins + Rupture is back to doing "pure" damage (due to the above change) + + NOTES: + Rupture damage will be tweaked based on feedback as it is dealing "pure" damage Version 2.1.210 Fixed a memory leak involving mob metadata Fixed a potential null pointer exception in InventoryListener diff --git a/pom.xml b/pom.xml index 091a939e8..2d681e385 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.211-SNAPSHOT + 2.1.211 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 1b4c56197..4a93893cb 100644 --- a/src/main/java/com/gmail/nossr50/runnables/skills/RuptureTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/skills/RuptureTask.java @@ -88,7 +88,7 @@ public class RuptureTask extends BukkitRunnable { mcMMO.p.getServer().getPluginManager().callEvent(event); //Ensure the event wasn't cancelled and damage is still greater than 0 - double damage = event.getFinalDamage(); + double damage = event.getDamage(); //Use raw damage for Rupture if (event.isCancelled() || damage <= 0 || healthBeforeRuptureIsApplied - damage <= 0) return true; From c41d2d1f397bd904a93df89f417024f73c222e8d Mon Sep 17 00:00:00 2001 From: Werner Date: Sun, 10 Apr 2022 22:09:03 +0200 Subject: [PATCH 286/326] Bump shade-plugin to 3.3.1 (#4762) fixes building --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 2d681e385..4a5d0331d 100755 --- a/pom.xml +++ b/pom.xml @@ -130,7 +130,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.3.0-SNAPSHOT + 3.3.1-SNAPSHOT From 4a8630262ebc91883af38393e0e2a0fecced2d70 Mon Sep 17 00:00:00 2001 From: Warrior <50800980+Warriorrrr@users.noreply.github.com> Date: Thu, 28 Apr 2022 17:33:45 +0200 Subject: [PATCH 287/326] Fix hanging plants searching up instead of down. (#4766) --- .../skills/herbalism/HerbalismManager.java | 16 ++++++++++------ .../com/gmail/nossr50/util/MaterialMapStore.java | 15 +++++++++++++-- 2 files changed, 23 insertions(+), 8 deletions(-) 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 ddefee49e..aae793b6d 100644 --- a/src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java +++ b/src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java @@ -578,7 +578,7 @@ public class HerbalismManager extends SkillManager { if (isChorusBranch(brokenBlock.getType())) { brokenBlocks = getBrokenChorusBlocks(brokenBlock); } else { - brokenBlocks = getBlocksBrokenAbove(brokenBlock, false); + brokenBlocks = getBlocksBrokenAboveOrBelow(brokenBlock, false, mcMMO.getMaterialMapStore().isMultiBlockHangingPlant(brokenBlock.getType())); } return brokenBlocks; @@ -599,9 +599,11 @@ public class HerbalismManager extends SkillManager { * Multi-block plants are hard-coded and kept in {@link MaterialMapStore} * * @param originBlock The point of the "break" + * @param inclusive Whether to include the origin block + * @param below Whether to search down instead of up. * @return A set of blocks above the target block which can be assumed to be broken */ - private HashSet getBlocksBrokenAbove(BlockState originBlock, boolean inclusive) { + private HashSet getBlocksBrokenAboveOrBelow(BlockState originBlock, boolean inclusive, boolean below) { HashSet brokenBlocks = new HashSet<>(); Block block = originBlock.getBlock(); @@ -612,16 +614,18 @@ public class HerbalismManager extends SkillManager { //Limit our search int maxHeight = 512; + final BlockFace relativeFace = below ? BlockFace.DOWN : BlockFace.UP; + // Search vertically for multi-block plants, exit early if any non-multi block plants for (int y = 0; y < maxHeight; y++) { //TODO: Should this grab state? It would be more expensive.. - Block relativeUpBlock = block.getRelative(BlockFace.UP, y); + Block relativeBlock = block.getRelative(relativeFace, y); //Abandon our search if the block isn't multi - if(!mcMMO.getMaterialMapStore().isMultiBlockPlant(relativeUpBlock.getType())) + if (isOneBlockPlant(relativeBlock.getType())) break; - brokenBlocks.add(relativeUpBlock); + brokenBlocks.add(relativeBlock); } return brokenBlocks; @@ -634,7 +638,7 @@ public class HerbalismManager extends SkillManager { * @return true if the block is not contained in the collection of multi-block plants */ private boolean isOneBlockPlant(Material material) { - return !mcMMO.getMaterialMapStore().isMultiBlockPlant(material); + return !mcMMO.getMaterialMapStore().isMultiBlockPlant(material) && !mcMMO.getMaterialMapStore().isMultiBlockHangingPlant(material); } /** diff --git a/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java b/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java index 90104acce..2d1c39a9e 100644 --- a/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java +++ b/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java @@ -24,6 +24,7 @@ public class MaterialMapStore { private final @NotNull HashSet blockCrackerWhiteList; private final @NotNull HashSet canMakeShroomyWhiteList; private final @NotNull HashSet multiBlockPlant; + private final @NotNull HashSet multiBlockHangingPlant; private final @NotNull HashSet foodItemWhiteList; private final @NotNull HashSet glassBlocks; @@ -71,6 +72,7 @@ public class MaterialMapStore { blockCrackerWhiteList = new HashSet<>(); canMakeShroomyWhiteList = new HashSet<>(); multiBlockPlant = new HashSet<>(); + multiBlockHangingPlant = new HashSet<>(); foodItemWhiteList = new HashSet<>(); glassBlocks = new HashSet<>(); @@ -121,6 +123,7 @@ public class MaterialMapStore { fillBlockCrackerWhiteList(); fillShroomyWhiteList(); fillMultiBlockPlantSet(); + fillMultiBlockHangingPlantSet(); fillFoodWhiteList(); fillGlassBlockWhiteList(); fillArmors(); @@ -137,6 +140,10 @@ public class MaterialMapStore { return multiBlockPlant.contains(material.getKey().getKey()); } + public boolean isMultiBlockHangingPlant(@NotNull Material material) { + return multiBlockHangingPlant.contains(material.getKey().getKey()); + } + public boolean isAbilityActivationBlackListed(@NotNull Material material) { return abilityBlackList.contains(material.getKey().getKey()); @@ -974,8 +981,12 @@ public class MaterialMapStore { multiBlockPlant.add("large_fern"); multiBlockPlant.add("tall_grass"); multiBlockPlant.add("bamboo"); - multiBlockPlant.add("weeping_vines_plant"); - multiBlockPlant.add("twisted_vines_plant"); + } + + private void fillMultiBlockHangingPlantSet() { + multiBlockHangingPlant.add("weeping_vines_plant"); + multiBlockHangingPlant.add("twisted_vines_plant"); + multiBlockHangingPlant.add("cave_vines_plant"); } private void fillShroomyWhiteList() From d19cf1e2606c350f718cdd5dea4ea570f244e312 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 28 Apr 2022 18:31:10 -0700 Subject: [PATCH 288/326] 2.1.212 - Fixed herbalism exploit and added damage limit for XP calculations used in combat --- Changelog.txt | 7 +++++++ pom.xml | 2 +- .../nossr50/config/experience/ExperienceConfig.java | 13 +++++++++++++ .../nossr50/runnables/skills/AwardCombatXpTask.java | 6 ++++++ .../com/gmail/nossr50/util/skills/CombatUtils.java | 5 ++++- src/main/resources/experience.yml | 4 ++++ 6 files changed, 35 insertions(+), 2 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 49e4dede8..58589232f 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,10 @@ +Version 2.1.212 + An herbalism exploit has been patched (thanks WhatsTheBadNews) + Added 'ExploitFix.Combat.XPCeiling.Enabled' to experience.yml + Added 'ExploitFix.Combat.XPCeiling.Damage_Limit' to experience.yml + Single instances of combat damage above 100 give are capped to give the same reward as 100 by default (100 is a lot, but you can change this in settings) + + NOTES: The damage ceiling won't affect server that don't have mobs running around with abnormally high health, if your server does you'll want to adjust this limit or disable it. Version 2.1.211 Added /mmodebug info for players hitting other players Fixed Immortal Player bug diff --git a/pom.xml b/pom.xml index 4a5d0331d..f0cc4b158 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.211 + 2.1.212 mcMMO https://github.com/mcMMO-Dev/mcMMO 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..75686cfcd 100644 --- a/src/main/java/com/gmail/nossr50/config/experience/ExperienceConfig.java +++ b/src/main/java/com/gmail/nossr50/config/experience/ExperienceConfig.java @@ -25,6 +25,12 @@ public class ExperienceConfig extends BukkitConfig { validate(); } + @Override + public void initDefaults() { + config.addDefault("ExploitFix.Combat.XPCeiling.Enabled", true); + config.addDefault("ExploitFix.Combat.XPCeiling.Damage_Limit", 100); + } + public static ExperienceConfig getInstance() { if (instance == null) { instance = new ExperienceConfig(); @@ -423,6 +429,13 @@ public class ExperienceConfig extends BukkitConfig { public boolean getAddExtraDetails() { return config.getBoolean("Experience_Bars.ThisMayCauseLag.AlwaysUpdateTitlesWhenXPIsGained.ExtraDetails", false); } + public boolean useCombatHPCeiling() { + return config.getBoolean("ExploitFix.Combat.XPCeiling.Enabled", true); + } + + public int getCombatHPCeiling() { + return config.getInt("ExploitFix.Combat.XPCeiling.HP_Modifier_Limit", 100); + } public boolean isExperienceBarsEnabled() { return config.getBoolean("Experience_Bars.Enable", 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 735ed8c17..e9aea8f2a 100644 --- a/src/main/java/com/gmail/nossr50/runnables/skills/AwardCombatXpTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/skills/AwardCombatXpTask.java @@ -1,5 +1,7 @@ package com.gmail.nossr50.runnables.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.experience.XPGainSource; import com.gmail.nossr50.datatypes.player.McMMOPlayer; @@ -39,6 +41,10 @@ public class AwardCombatXpTask extends BukkitRunnable { damage += health; } + if(ExperienceConfig.getInstance().useCombatHPCeiling()) { + damage = Math.min(damage, ExperienceConfig.getInstance().getCombatHPCeiling()); + } + mcMMOPlayer.beginXpGain(primarySkillType, (int) (damage * baseXp), xpGainReason, XPGainSource.SELF); } } 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 181cddde6..85c1e09b2 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java @@ -732,7 +732,10 @@ public final class CombatUtils { * @param primarySkillType The skill being used * @param multiplier final XP result will be multiplied by this */ - public static void processCombatXP(@NotNull McMMOPlayer mcMMOPlayer, @NotNull LivingEntity target, @NotNull PrimarySkillType primarySkillType, double multiplier) { + public static void processCombatXP(@NotNull McMMOPlayer mcMMOPlayer, + @NotNull LivingEntity target, + @NotNull PrimarySkillType primarySkillType, + double multiplier) { double baseXP = 0; XPGainReason xpGainReason; diff --git a/src/main/resources/experience.yml b/src/main/resources/experience.yml index 18b4d446e..0401e34be 100644 --- a/src/main/resources/experience.yml +++ b/src/main/resources/experience.yml @@ -25,6 +25,10 @@ EarlyGameBoost: Enabled: true ExploitFix: + Combat: + XPCeiling: + Enabled: true + Damage_Limit: 100 COTWBreeding: true UnsafeEnchantments: false # Prevent many exploits related to fishing From 27854720f0e88a49c8e75f3a1d6d6627e99840b7 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sun, 15 May 2022 15:24:25 -0700 Subject: [PATCH 289/326] Add some exploit prevention to fishing --- pom.xml | 2 +- .../gmail/nossr50/listeners/PlayerListener.java | 14 ++++++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index f0cc4b158..ccd012f05 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.212 + 2.1.213-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 d5f7a9ffc..2eb17c405 100644 --- a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java @@ -428,7 +428,9 @@ public class PlayerListener implements Listener { ItemStack inHand = player.getInventory().getItemInMainHand(); //Grab lure level - if(inHand != null && inHand.getType().getKey().getKey().equalsIgnoreCase("fishing_rod")) { + if(inHand != null + && inHand.getItemMeta() != 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")) { @@ -436,10 +438,14 @@ public class PlayerListener implements Listener { } } } - } - fishingManager.masterAngler(event.getHook(), lureLevel); - fishingManager.setFishingTarget(); + // Prevent any potential odd behavior by only processing if no offhand fishing rod is present + if(!player.getInventory().getItemInOffHand().getType().getKey().getKey().equalsIgnoreCase("fishing_rod")) { + // In case of offhand fishing rod, don't process anything + fishingManager.masterAngler(event.getHook(), lureLevel); + fishingManager.setFishingTarget(); + } + } } return; case CAUGHT_FISH: From f6268fe291037efba770247a41c5b28bb94d83ce Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 7 Jun 2022 18:00:32 -0700 Subject: [PATCH 290/326] Add in new 1.19 stuff and tweak treasures.yml --- Changelog.txt | 30 ++++++++++ .../gmail/nossr50/util/MaterialMapStore.java | 10 +++- src/main/resources/experience.yml | 15 +++++ src/main/resources/treasures.yml | 59 +++++++++++++++++-- 4 files changed, 107 insertions(+), 7 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 58589232f..eb6674753 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,33 @@ +Version 2.1.213 + Updated various mechanics to recognize and understand the new blocks + Added 'Packed_Mud' to mining xp + Added 'Mud_Bricks' to mining xp + Added 'Reinforced_Deepslate' to mining xp + Added 'Mud' to excavation xp + Added 'Muddy Mangrove Roots' to excavation xp + Added 'Mangrove_Roots' to woodcutting xp + Added 'Stripped_Mangrove_Log' to woodcutting xp + Added 'Stripped_Crimson_Stem' to woodcutting xp + Added 'Stripped_Warped_Stem' to woodcutting xp + Added 'Allay' to combat experience + Added 'Frog' to combat experience and taming experience + Added 'Tadpole' to combat experience + Added 'Warden' to combat experience + + Changes to excavation treasures (requires manual editing or regenerating the config) + Added Mud as a block which can drop various treasures (see notes) + Added Muddy_Mangrove_Roots as a block which can drop various treasures (see notes) + Added Stick as a new excavation drop, which drops from mud and muddy mangrove roots (see notes) + Added Potato as a new excavation drop, which drops from mud and dirt (see notes) + Added Feather as a new excavation drop, which drops from mud (see notes) + Added Spyglass as a new excavation drop, which drops rarely from mud and dirt (see notes) + Added Trident as a new excavation drop, which drops somewhat rarely from mud, muddy mangrove roots, and clay (see notes) + Added Heart of the Sea as a new excavation drop, which drops very rarely from mud and requires a very high excavation level to appear + + NOTES: + To get the new excavation drop list, the easiest way is to delete treasures.yml and mcMMO will regenerate it with the newest version + I'll likely be tweaking the treasures list in the near future, leave feedback on discord if you have suggestions + Version 2.1.212 An herbalism exploit has been patched (thanks WhatsTheBadNews) Added 'ExploitFix.Combat.XPCeiling.Enabled' to experience.yml diff --git a/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java b/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java index 2d1c39a9e..446372101 100644 --- a/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java +++ b/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java @@ -237,6 +237,9 @@ public class MaterialMapStore { intendedToolPickAxe.addAll(ores); intendedToolPickAxe.add("lapis_lazuli_ore"); + intendedToolPickAxe.add("packed_mud"); + intendedToolPickAxe.add("mud_bricks"); + intendedToolPickAxe.add("reinforced_deepslate"); intendedToolPickAxe.add("ice"); intendedToolPickAxe.add("packed_ice"); intendedToolPickAxe.add("blue_ice"); @@ -1021,6 +1024,8 @@ public class MaterialMapStore { treeFellerDestructibleWhiteList.add("spruce_leaves"); treeFellerDestructibleWhiteList.add("azalea_leaves"); treeFellerDestructibleWhiteList.add("flowering_azalea_leaves"); + treeFellerDestructibleWhiteList.add("mangrove_leaves"); + treeFellerDestructibleWhiteList.add("mangrove_roots"); treeFellerDestructibleWhiteList.add("nether_wart_block"); treeFellerDestructibleWhiteList.add("warped_wart_block"); treeFellerDestructibleWhiteList.add("brown_mushroom_block"); @@ -1166,8 +1171,6 @@ public class MaterialMapStore { private void fillToolBlackList() { - //TODO: Add anvils / missing logs - //TODO: Reorganize this list, can we also dynamically populate some of this? toolBlackList.add("black_bed"); toolBlackList.add("blue_bed"); toolBlackList.add("brown_bed"); @@ -1276,6 +1279,9 @@ public class MaterialMapStore { toolBlackList.add("stripped_oak_wood"); toolBlackList.add("stripped_spruce_log"); toolBlackList.add("stripped_spruce_wood"); + toolBlackList.add("mangrove_wood"); + toolBlackList.add("mangrove_log"); + toolBlackList.add("stripped_mangrove_log"); toolBlackList.add("acacia_log"); toolBlackList.add("acacia_wood"); toolBlackList.add("birch_log"); diff --git a/src/main/resources/experience.yml b/src/main/resources/experience.yml index 0401e34be..e63f1663d 100644 --- a/src/main/resources/experience.yml +++ b/src/main/resources/experience.yml @@ -264,6 +264,8 @@ Experience_Values: Snow_Block: 40 Soul_Sand: 40 Soul_Soil: 40 + Mud: 80 + Muddy_Mangrove_Roots: 90 Woodcutting: Crimson_Hyphae: 50 Stripped_Crimson_Hyphae: 50 @@ -292,12 +294,17 @@ Experience_Values: Stripped_Jungle_Wood: 100 Stripped_Acacia_Wood: 90 Stripped_Dark_Oak_Wood: 90 + Stripped_Mangrove_Log: 110 + Stripped_Crimson_Stem: 50 + Stripped_Warped_Stem: 50 Oak_Wood: 70 Spruce_Wood: 70 Birch_Wood: 70 Jungle_Wood: 70 Acacia_Wood: 70 Dark_Oak_Wood: 70 + Mangrove_Wood: 80 + Mangrove_Roots: 10 Red_Mushroom_Block: 70 Brown_Mushroom_Block: 70 Mushroom_Stem: 80 @@ -394,6 +401,7 @@ Experience_Values: Lily_Of_The_Valley: 150 Wither_Rose: 500 Mining: + Reinforced_Deepslate: 500 Tuff: 10 Copper_Ore: 1400 Deepslate_Copper_Ore: 1900 @@ -486,6 +494,8 @@ Experience_Values: Purpur_Pillar: 250 Purpur_Slab: 150 Purpur_Stairs: 250 + Packed_Mud: 30 + Mud_Bricks: 40 Repair: Base: 1000.0 Wood: 0.6 @@ -539,6 +549,7 @@ Experience_Values: Bee: 100 Goat: 250 Axolotl: 600 + Frog: 900 Combat: Multiplier: Animals: 1.0 @@ -611,3 +622,7 @@ Experience_Values: Goat: 1.5 Axolotl: 1.75 Glow_Squid: 1.5 + Allay: 0.2 + Frog: 1.7 + Warden: 6.0 + Tadpole: 0.2 diff --git a/src/main/resources/treasures.yml b/src/main/resources/treasures.yml index a28024472..7134667dc 100755 --- a/src/main/resources/treasures.yml +++ b/src/main/resources/treasures.yml @@ -2,6 +2,54 @@ # Settings for Excavation's Archaeology ### Excavation: + HEART_OF_THE_SEA: + Amount: 1 + XP: 9999 + Drop_Chance: 0.01 + Level_Requirement: + Standard_Mode: 90 + Retro_Mode: 900 + Drops_From: [Mud] + POTATO: + Amount: 1 + XP: 50 + Drop_Chance: 3.0 + Level_Requirement: + Standard_Mode: 10 + Retro_Mode: 100 + Drops_From: [Dirt, Mud] + SPYGLASS: + Amount: 1 + XP: 500 + Drop_Chance: 0.1 + Level_Requirement: + Standard_Mode: 7 + Retro_Mode: 70 + Drops_From: [Mud, Dirt] + STICK: + Amount: 2 + XP: 50 + Drop_Chance: 2.0 + Level_Requirement: + Standard_Mode: 1 + Retro_Mode: 10 + Drops_From: [Mud, Muddy_Mangrove_Roots] + FEATHER: + Amount: 3 + XP: 100 + Drop_Chance: 1.0 + Level_Requirement: + Standard_Mode: 5 + Retro_Mode: 50 + Drops_From: [Mud] + TRIDENT: + Amount: 1 + XP: 100 + Drop_Chance: 0.02 + Level_Requirement: + Standard_Mode: 40 + Retro_Mode: 400 + Drops_From: [ Mud, Clay, Muddy_Mangrove_Roots ] CAKE: Amount: 1 XP: 3000 @@ -25,7 +73,7 @@ Excavation: Level_Requirement: Standard_Mode: 20 Retro_Mode: 200 - Drops_From: [Gravel] + Drops_From: [Gravel, Mud] APPLE: Amount: 1 XP: 100 @@ -65,7 +113,7 @@ Excavation: Level_Requirement: Standard_Mode: 50 Retro_Mode: 500 - Drops_From: [Dirt, Coarse_Dirt, Podzol, Grass_Block, Mycelium] + Drops_From: [Dirt, Coarse_Dirt, Podzol, Grass_Block, Mycelium, Mud] BROWN_MUSHROOM: Amount: 1 XP: 80 @@ -73,7 +121,7 @@ Excavation: Level_Requirement: Standard_Mode: 50 Retro_Mode: 500 - Drops_From: [Dirt, Coarse_Dirt, Podzol, Grass_Block, Mycelium] + Drops_From: [Dirt, Coarse_Dirt, Podzol, Grass_Block, Mycelium, Mud] EGG: Amount: 1 XP: 100 @@ -145,7 +193,7 @@ Excavation: 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] + Drops_From: [Dirt, Coarse_Dirt, Podzol, Grass_Block, Sand, Red_Sand, Gravel, Clay, Mycelium, Soul_Sand, Soul_Soil, Mud] COCOA_BEANS: Amount: 1 XP: 100 @@ -153,7 +201,7 @@ Excavation: Level_Requirement: Standard_Mode: 35 Retro_Mode: 350 - Drops_From: [Dirt, Coarse_Dirt, Podzol, Grass_Block, Mycelium] + Drops_From: [Dirt, Coarse_Dirt, Podzol, Grass_Block, Mycelium, Mud] QUARTZ: Amount: 1 XP: 100 @@ -170,6 +218,7 @@ Excavation: 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, Level_Requirement is multiplied by 10. From c40af913f47c25b053ac91646a2c8324c889a9ff Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 7 Jun 2022 18:07:14 -0700 Subject: [PATCH 291/326] mcMMO 2.1.213 --- pom.xml | 18 +++++++++++------- src/main/resources/treasures.yml | 2 +- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/pom.xml b/pom.xml index ccd012f05..e2ecfc1cf 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.213-SNAPSHOT + 2.1.213 mcMMO https://github.com/mcMMO-Dev/mcMMO @@ -237,6 +237,10 @@ aikar https://repo.aikar.co/content/groups/aikar/ + + sonatype-oss-snapshots1 + https://s01.oss.sonatype.org/content/repositories/snapshots/ + @@ -250,27 +254,27 @@ net.kyori adventure-text-serializer-gson - 4.9.3 + 4.11.0 net.kyori adventure-api - 4.9.3 + 4.11.0 net.kyori adventure-nbt - 4.9.3 + 4.11.0 net.kyori adventure-key - 4.9.3 + 4.11.0 net.kyori adventure-text-serializer-gson-legacy-impl - 4.9.3 + 4.11.0 net.kyori @@ -296,7 +300,7 @@ org.spigotmc spigot-api - 1.18.1-R0.1-SNAPSHOT + 1.19-R0.1-SNAPSHOT provided diff --git a/src/main/resources/treasures.yml b/src/main/resources/treasures.yml index 7134667dc..3de5a78a4 100755 --- a/src/main/resources/treasures.yml +++ b/src/main/resources/treasures.yml @@ -49,7 +49,7 @@ Excavation: Level_Requirement: Standard_Mode: 40 Retro_Mode: 400 - Drops_From: [ Mud, Clay, Muddy_Mangrove_Roots ] + Drops_From: [Mud, Clay, Muddy_Mangrove_Roots] CAKE: Amount: 1 XP: 3000 From d543843235f003db5a6e93798aa1b08f6dfedddc Mon Sep 17 00:00:00 2001 From: abridgedcarp <37029664+abridgedcarp@users.noreply.github.com> Date: Thu, 9 Jun 2022 21:26:50 +0000 Subject: [PATCH 292/326] Fix Maven build failure (#4779) --- .../gmail/nossr50/events/fake/FakePlayerAnimationEvent.java | 5 +++-- .../java/com/gmail/nossr50/listeners/PlayerListener.java | 2 +- src/main/java/com/gmail/nossr50/util/EventUtils.java | 3 ++- 3 files changed, 6 insertions(+), 4 deletions(-) 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 075928bb4..3f7a8cfec 100644 --- a/src/main/java/com/gmail/nossr50/events/fake/FakePlayerAnimationEvent.java +++ b/src/main/java/com/gmail/nossr50/events/fake/FakePlayerAnimationEvent.java @@ -2,12 +2,13 @@ package com.gmail.nossr50.events.fake; import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerAnimationEvent; +import org.bukkit.event.player.PlayerAnimationType; /** * Called when handling extra drops to avoid issues with NoCheat. */ public class FakePlayerAnimationEvent extends PlayerAnimationEvent implements FakeEvent { - public FakePlayerAnimationEvent(Player player) { - super(player); + public FakePlayerAnimationEvent(Player player, PlayerAnimationType playerAnimationType) { + super(player, playerAnimationType); } } diff --git a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java index 2eb17c405..c28a91ef5 100644 --- a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java @@ -841,7 +841,7 @@ public class PlayerListener implements Listener { HerbalismManager herbalismManager = mcMMOPlayer.getHerbalismManager(); - FakePlayerAnimationEvent fakeSwing = new FakePlayerAnimationEvent(event.getPlayer()); //PlayerAnimationEvent compat + FakePlayerAnimationEvent fakeSwing = new FakePlayerAnimationEvent(event.getPlayer(), PlayerAnimationType.ARM_SWING); //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) { diff --git a/src/main/java/com/gmail/nossr50/util/EventUtils.java b/src/main/java/com/gmail/nossr50/util/EventUtils.java index 81bec7e50..7ccfa1856 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.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.event.Event; import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.player.PlayerAnimationType; import org.bukkit.event.player.PlayerFishEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.plugin.Plugin; @@ -225,7 +226,7 @@ public final class EventUtils { } public static FakePlayerAnimationEvent callFakeArmSwingEvent(Player player) { - FakePlayerAnimationEvent event = new FakePlayerAnimationEvent(player); + FakePlayerAnimationEvent event = new FakePlayerAnimationEvent(player, PlayerAnimationType.ARM_SWING); mcMMO.p.getServer().getPluginManager().callEvent(event); return event; From 1a34d2f647b9f778802d01184166c2fc19b53797 Mon Sep 17 00:00:00 2001 From: Smudge <68658429+smuddgge@users.noreply.github.com> Date: Thu, 9 Jun 2022 22:31:06 +0100 Subject: [PATCH 293/326] Added 25% xp boost permission (#4773) --- .../com/gmail/nossr50/util/Permissions.java | 7 +- .../gmail/nossr50/util/skills/PerksUtils.java | 3 + src/main/resources/plugin.yml | 71 +++++++++++++++++++ 3 files changed, 80 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/gmail/nossr50/util/Permissions.java b/src/main/java/com/gmail/nossr50/util/Permissions.java index 2dabff51e..c405f84ab 100644 --- a/src/main/java/com/gmail/nossr50/util/Permissions.java +++ b/src/main/java/com/gmail/nossr50/util/Permissions.java @@ -133,7 +133,12 @@ public final class Permissions { return permissible.hasPermission("mcmmo.perks.xp.50percentboost.all") || permissible.hasPermission("mcmmo.perks.xp.50percentboost." + skill.toString().toLowerCase(Locale.ENGLISH)); } - + + public static boolean oneAndAQuarterXp(Permissible permissible, PrimarySkillType skill) { + return permissible.hasPermission("mcmmo.perks.xp.25percentboost.all") + || permissible.hasPermission("mcmmo.perks.xp.25percentboost." + 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)); 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 1aa39105a..2d83cb063 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/PerksUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/PerksUtils.java @@ -74,6 +74,9 @@ public final class PerksUtils { else if (Permissions.oneAndOneHalfXp(player, skill)) { modifier = 1.5; } + else if (Permissions.oneAndAQuarterXp(player, skill)) { + modifier = 1.25; + } else if (Permissions.oneAndOneTenthXp(player, skill)) { modifier = 1.1; } diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 2173e7de9..23915d427 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1495,6 +1495,7 @@ permissions: children: mcmmo.perks.xp.150percentboost.all: true mcmmo.perks.xp.50percentboost.all: true + mcmmo.perks.xp.25percentboost.all: true mcmmo.perks.xp.10percentboost.all: true mcmmo.perks.xp.customboost.all: true mcmmo.perks.xp.double.all: true @@ -1640,6 +1641,76 @@ permissions: mcmmo.perks.xp.50percentboost.woodcutting: default: false description: Multiplies incoming Woodcutting XP by 1.5 + mcmmo.perks.xp.25percentboost.*: + default: false + description: Multiplies incoming XP by 1.25 + children: + mcmmo.perks.xp.25percentboost.all: true + mcmmo.perks.xp.25percentboost: + default: false + description: Multiplies incoming XP by 1.25 + children: + mcmmo.perks.xp.25percentboost.all: true + mcmmo.perks.xp.25percentboost.all: + default: false + description: Multiplies incoming XP by 1.25 + children: + mcmmo.perks.xp.25percentboost.acrobatics: true + mcmmo.perks.xp.25percentboost.alchemy: true + mcmmo.perks.xp.25percentboost.archery: true + mcmmo.perks.xp.25percentboost.axes: true + mcmmo.perks.xp.25percentboost.excavation: true + mcmmo.perks.xp.25percentboost.fishing: true + mcmmo.perks.xp.25percentboost.herbalism: true + mcmmo.perks.xp.25percentboost.mining: true + mcmmo.perks.xp.25percentboost.repair: true + mcmmo.perks.xp.25percentboost.smelting: true + mcmmo.perks.xp.25percentboost.swords: true + mcmmo.perks.xp.25percentboost.taming: true + mcmmo.perks.xp.25percentboost.unarmed: true + mcmmo.perks.xp.25percentboost.woodcutting: true + mcmmo.perks.xp.25percentboost.acrobatics: + default: false + description: Multiplies incoming Acrobatics XP by 1.25 + mcmmo.perks.xp.25percentboost.alchemy: + default: false + description: Multiplies incoming Acrobatics XP by 1.25 + mcmmo.perks.xp.25percentboost.archery: + default: false + description: Multiplies incoming Archery XP by 1.25 + mcmmo.perks.xp.25percentboost.axes: + default: false + description: Multiplies incoming Axes XP by 1.25 + mcmmo.perks.xp.25percentboost.excavation: + default: false + description: Multiplies incoming Excavation XP by 1.25 + mcmmo.perks.xp.25percentboost.fishing: + default: false + description: Multiplies incoming Fishing XP by 1.25 + mcmmo.perks.xp.25percentboost.herbalism: + default: false + description: Multiplies incoming Herbalism XP by 1.25 + mcmmo.perks.xp.25percentboost.mining: + default: false + description: Multiplies incoming Mining XP by 1.25 + mcmmo.perks.xp.25percentboost.repair: + default: false + description: Multiplies incoming Repair XP by 1.25 + mcmmo.perks.xp.25percentboost.smelting: + default: false + description: Multiplies incoming Smelting XP by 1.25 + mcmmo.perks.xp.25percentboost.swords: + default: false + description: Multiplies incoming Swords XP by 1.25 + mcmmo.perks.xp.25percentboost.taming: + default: false + description: Multiplies incoming Taming XP by 1.25 + mcmmo.perks.xp.25percentboost.unarmed: + default: false + description: Multiplies incoming Unarmed XP by 1.5 + mcmmo.perks.xp.25percentboost.woodcutting: + default: false + description: Multiplies incoming Woodcutting XP by 1.25 mcmmo.perks.xp.10percentboost.*: default: false description: Multiplies incoming XP by 1.1 From 444e1532f2f43d103d0bfde2dd41cf6433ffca57 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 9 Jun 2022 22:39:11 -0700 Subject: [PATCH 294/326] 2.1.214 --- Changelog.txt | 10 +++++++ pom.xml | 2 +- .../events/fake/FakePlayerAnimationEvent.java | 28 +++++++++---------- .../nossr50/listeners/PlayerListener.java | 7 ++--- .../com/gmail/nossr50/util/EventUtils.java | 19 +++++++------ .../util/scoreboards/ScoreboardWrapper.java | 2 +- .../nossr50/util/skills/CombatUtils.java | 2 +- 7 files changed, 40 insertions(+), 30 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index eb6674753..1227eb850 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,13 @@ +Version 2.1.214 + Temporarily removed FakePlayerAnimationEvent (see notes) + + NOTES: + Spigot updated PlayerAnimationEvent with an API break between versions 1.18 and 1.19, as a temporary fix for mcMMO to be able to support both of these + Minecraft versions I have temporarily removed FakePlayerAnimationEvent. I am working on a fix to dynamically use the correct API depending on the version of MC + as many people will likely be stuck on 1.18 for a while. + FakePlayerAnimationEvent existed to circumvent false positives on anti-cheat plugins such as NoCheat, however + I am unsure if it is still needed and removing it may have no ill effects.. however I cannot be certain. + Anti-cheat plugin authors should be informed to update if you run into false positives with mcMMO after this update so they can make the appropriate changes. Version 2.1.213 Updated various mechanics to recognize and understand the new blocks Added 'Packed_Mud' to mining xp diff --git a/pom.xml b/pom.xml index e2ecfc1cf..bdbb9333c 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.213 + 2.1.214 mcMMO https://github.com/mcMMO-Dev/mcMMO 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 3f7a8cfec..e4eb1ec88 100644 --- a/src/main/java/com/gmail/nossr50/events/fake/FakePlayerAnimationEvent.java +++ b/src/main/java/com/gmail/nossr50/events/fake/FakePlayerAnimationEvent.java @@ -1,14 +1,14 @@ -package com.gmail.nossr50.events.fake; - -import org.bukkit.entity.Player; -import org.bukkit.event.player.PlayerAnimationEvent; -import org.bukkit.event.player.PlayerAnimationType; - -/** - * Called when handling extra drops to avoid issues with NoCheat. - */ -public class FakePlayerAnimationEvent extends PlayerAnimationEvent implements FakeEvent { - public FakePlayerAnimationEvent(Player player, PlayerAnimationType playerAnimationType) { - super(player, playerAnimationType); - } -} +//package com.gmail.nossr50.events.fake; +// +//import org.bukkit.entity.Player; +//import org.bukkit.event.player.PlayerAnimationEvent; +//import org.bukkit.event.player.PlayerAnimationType; +// +///** +// * Called when handling extra drops to avoid issues with NoCheat. +// */ +//public class FakePlayerAnimationEvent extends PlayerAnimationEvent implements FakeEvent { +// public FakePlayerAnimationEvent(Player player, PlayerAnimationType playerAnimationType) { +// super(player, playerAnimationType); +// } +//} diff --git a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java index c28a91ef5..9ebc19ad4 100644 --- a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java @@ -8,7 +8,6 @@ import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.datatypes.skills.subskills.taming.CallOfTheWildType; import com.gmail.nossr50.events.McMMOReplaceVanillaTreasureEvent; -import com.gmail.nossr50.events.fake.FakePlayerAnimationEvent; import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.party.ShareHandler; @@ -841,7 +840,7 @@ public class PlayerListener implements Listener { HerbalismManager herbalismManager = mcMMOPlayer.getHerbalismManager(); - FakePlayerAnimationEvent fakeSwing = new FakePlayerAnimationEvent(event.getPlayer(), PlayerAnimationType.ARM_SWING); //PlayerAnimationEvent compat + // FakePlayerAnimationEvent fakeSwing = new FakePlayerAnimationEvent(event.getPlayer(), PlayerAnimationType.ARM_SWING); //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) { @@ -860,7 +859,7 @@ public class PlayerListener implements Listener { if (herbalismManager.canGreenThumbBlock(blockState)) { //call event for Green Thumb Block if(!EventUtils.callSubSkillBlockEvent(player, SubSkillType.HERBALISM_GREEN_THUMB, block).isCancelled()) { - Bukkit.getPluginManager().callEvent(fakeSwing); + // Bukkit.getPluginManager().callEvent(fakeSwing); player.getInventory().getItemInMainHand().setAmount(heldItem.getAmount() - 1); player.updateInventory(); if (herbalismManager.processGreenThumbBlocks(blockState) && EventUtils.simulateBlockBreak(block, player, false)) { @@ -871,7 +870,7 @@ public class PlayerListener implements Listener { /* SHROOM THUMB CHECK */ else if (herbalismManager.canUseShroomThumb(blockState)) { if(!EventUtils.callSubSkillBlockEvent(player, SubSkillType.HERBALISM_SHROOM_THUMB, block).isCancelled()) { - Bukkit.getPluginManager().callEvent(fakeSwing); + // Bukkit.getPluginManager().callEvent(fakeSwing); event.setCancelled(true); if (herbalismManager.processShroomThumb(blockState) && EventUtils.simulateBlockBreak(block, player, false)) { diff --git a/src/main/java/com/gmail/nossr50/util/EventUtils.java b/src/main/java/com/gmail/nossr50/util/EventUtils.java index 7ccfa1856..c92b1f10d 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.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.event.Event; import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.player.PlayerAnimationEvent; import org.bukkit.event.player.PlayerAnimationType; import org.bukkit.event.player.PlayerFishEvent; import org.bukkit.inventory.ItemStack; @@ -225,12 +226,12 @@ public final class EventUtils { return event; } - public static FakePlayerAnimationEvent callFakeArmSwingEvent(Player player) { - FakePlayerAnimationEvent event = new FakePlayerAnimationEvent(player, PlayerAnimationType.ARM_SWING); - mcMMO.p.getServer().getPluginManager().callEvent(event); - - return event; - } +// public static Event callFakeArmSwingEvent(@NotNull Player player) { +// PlayerAnimationEvent event = new FakePlayerAnimationEvent(player, PlayerAnimationType.ARM_SWING); +// mcMMO.p.getServer().getPluginManager().callEvent(event); +// +// return event; +// } public static boolean tryLevelChangeEvent(Player player, PrimarySkillType skill, int levelsChanged, float xpRemoved, boolean isLevelUp, XPGainReason xpGainReason) { McMMOPlayerLevelChangeEvent event = isLevelUp ? new McMMOPlayerLevelUpEvent(player, skill, levelsChanged, xpGainReason) : new McMMOPlayerLevelDownEvent(player, skill, levelsChanged, xpGainReason); @@ -315,9 +316,9 @@ public final class EventUtils { PluginManager pluginManager = mcMMO.p.getServer().getPluginManager(); // Support for NoCheat - if (shouldArmSwing) { - callFakeArmSwingEvent(player); - } + //if (shouldArmSwing) { + // callFakeArmSwingEvent(player); + //} FakeBlockDamageEvent damageEvent = new FakeBlockDamageEvent(player, block, player.getInventory().getItemInMainHand(), true); pluginManager.callEvent(damageEvent); 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 be3e97cb4..24634bad2 100644 --- a/src/main/java/com/gmail/nossr50/util/scoreboards/ScoreboardWrapper.java +++ b/src/main/java/com/gmail/nossr50/util/scoreboards/ScoreboardWrapper.java @@ -626,7 +626,7 @@ public class ScoreboardWrapper { } } - public void acceptLeaderboardData(List leaderboardData) { + public void acceptLeaderboardData(@NotNull List leaderboardData) { for (PlayerStat stat : leaderboardData) { String name = stat.name; 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 85c1e09b2..bf4a3a4ee 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java @@ -681,7 +681,7 @@ public final class CombatUtils { continue; } - EventUtils.callFakeArmSwingEvent(attacker); + //EventUtils.callFakeArmSwingEvent(attacker); switch (type) { case SWORDS: From fa82fe8e6788e57553371d58fa783df01c32717f Mon Sep 17 00:00:00 2001 From: nossr50 Date: Thu, 9 Jun 2022 22:50:36 -0700 Subject: [PATCH 295/326] Level up broadcasts should be visible to the player of origin --- Changelog.txt | 1 + .../com/gmail/nossr50/datatypes/LevelUpBroadcastPredicate.java | 2 +- .../gmail/nossr50/datatypes/PowerLevelUpBroadcastPredicate.java | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 1227eb850..098c849e4 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,5 +1,6 @@ Version 2.1.214 Temporarily removed FakePlayerAnimationEvent (see notes) + Players can now see their own level up broadcasts NOTES: Spigot updated PlayerAnimationEvent with an API break between versions 1.18 and 1.19, as a temporary fix for mcMMO to be able to support both of these diff --git a/src/main/java/com/gmail/nossr50/datatypes/LevelUpBroadcastPredicate.java b/src/main/java/com/gmail/nossr50/datatypes/LevelUpBroadcastPredicate.java index 1644fdd1b..f19ec041e 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/LevelUpBroadcastPredicate.java +++ b/src/main/java/com/gmail/nossr50/datatypes/LevelUpBroadcastPredicate.java @@ -74,7 +74,7 @@ public class LevelUpBroadcastPredicate implements Predi } //Visibility checks - if(!listeningPlayer.canSee(mmoBroadcastingPlayer.getPlayer())) { + if(!listeningPlayer.canSee(mmoBroadcastingPlayer.getPlayer()) && listeningPlayer != mmoBroadcastingPlayer.getPlayer()) { return false; //Player who leveled should be invisible to this player so don't send the message } diff --git a/src/main/java/com/gmail/nossr50/datatypes/PowerLevelUpBroadcastPredicate.java b/src/main/java/com/gmail/nossr50/datatypes/PowerLevelUpBroadcastPredicate.java index 17bc2fd04..05e7a3a1a 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/PowerLevelUpBroadcastPredicate.java +++ b/src/main/java/com/gmail/nossr50/datatypes/PowerLevelUpBroadcastPredicate.java @@ -74,7 +74,7 @@ public class PowerLevelUpBroadcastPredicate implements } //Visibility checks - if(!listeningPlayer.canSee(mmoBroadcastingPlayer.getPlayer())) { + if(!listeningPlayer.canSee(mmoBroadcastingPlayer.getPlayer()) && listeningPlayer != mmoBroadcastingPlayer.getPlayer()) { return false; //Player who leveled should be invisible to this player so don't send the message } From aa4011a2263fd043269d468c907fef8b5e4a5cc7 Mon Sep 17 00:00:00 2001 From: destro174 <40720638+destro174@users.noreply.github.com> Date: Sun, 12 Jun 2022 01:41:27 +0200 Subject: [PATCH 296/326] Use item in mainhand to get drops when using treefeller (#4781) --- .../nossr50/skills/woodcutting/WoodcuttingManager.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 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 d08cad2da..866ef91d2 100644 --- a/src/main/java/com/gmail/nossr50/skills/woodcutting/WoodcuttingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/woodcutting/WoodcuttingManager.java @@ -281,6 +281,7 @@ public class WoodcuttingManager extends SkillManager { Player player = getPlayer(); int xp = 0; int processedLogCount = 0; + ItemStack itemStack = player.getInventory().getItemInMainHand(); for (BlockState blockState : treeFellerBlocks) { int beforeXP = xp; @@ -299,7 +300,7 @@ public class WoodcuttingManager extends SkillManager { xp += processTreeFellerXPGains(blockState, processedLogCount); //Drop displaced block - Misc.spawnItemsFromCollection(getPlayer(), Misc.getBlockCenter(blockState), block.getDrops(), ItemSpawnReason.TREE_FELLER_DISPLACED_BLOCK); + Misc.spawnItemsFromCollection(getPlayer(), Misc.getBlockCenter(blockState), block.getDrops(itemStack), ItemSpawnReason.TREE_FELLER_DISPLACED_BLOCK); //Bonus Drops / Harvest lumber checks processHarvestLumber(blockState); @@ -307,7 +308,7 @@ public class WoodcuttingManager extends SkillManager { //Drop displaced non-woodcutting XP blocks if(RankUtils.hasUnlockedSubskill(player, SubSkillType.WOODCUTTING_KNOCK_ON_WOOD)) { - Misc.spawnItemsFromCollection(getPlayer(), Misc.getBlockCenter(blockState), block.getDrops(), ItemSpawnReason.TREE_FELLER_DISPLACED_BLOCK); + Misc.spawnItemsFromCollection(getPlayer(), Misc.getBlockCenter(blockState), block.getDrops(itemStack), ItemSpawnReason.TREE_FELLER_DISPLACED_BLOCK); if(RankUtils.hasReachedRank(2, player, SubSkillType.WOODCUTTING_KNOCK_ON_WOOD)) { if(mcMMO.p.getAdvancedConfig().isKnockOnWoodXPOrbEnabled()) { @@ -319,7 +320,7 @@ public class WoodcuttingManager extends SkillManager { } } else { - Misc.spawnItemsFromCollection(getPlayer(), Misc.getBlockCenter(blockState), block.getDrops(), ItemSpawnReason.TREE_FELLER_DISPLACED_BLOCK, 1); + Misc.spawnItemsFromCollection(getPlayer(), Misc.getBlockCenter(blockState), block.getDrops(itemStack), ItemSpawnReason.TREE_FELLER_DISPLACED_BLOCK, 1); } } From 90721ee85935bed9eaedad5ec350cde45fdb6a6f Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sun, 26 Jun 2022 18:43:09 -0700 Subject: [PATCH 297/326] Add missing Mangrove_Log to experience.yml --- Changelog.txt | 2 ++ pom.xml | 2 +- src/main/resources/experience.yml | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index 098c849e4..33c72dd20 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,5 @@ +Version 2.1.215 + Version 2.1.214 Temporarily removed FakePlayerAnimationEvent (see notes) Players can now see their own level up broadcasts diff --git a/pom.xml b/pom.xml index bdbb9333c..7decc9e6e 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.214 + 2.1.215-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO diff --git a/src/main/resources/experience.yml b/src/main/resources/experience.yml index e63f1663d..0855dd341 100644 --- a/src/main/resources/experience.yml +++ b/src/main/resources/experience.yml @@ -304,6 +304,7 @@ Experience_Values: Acacia_Wood: 70 Dark_Oak_Wood: 70 Mangrove_Wood: 80 + Mangrove_Log: 95 Mangrove_Roots: 10 Red_Mushroom_Block: 70 Brown_Mushroom_Block: 70 From 2c09a0fdb64d5df0032e950bbd20c5fe2d1ca96d Mon Sep 17 00:00:00 2001 From: PikaMug <2267126+PikaMug@users.noreply.github.com> Date: Sat, 2 Jul 2022 22:25:27 -0400 Subject: [PATCH 298/326] Switch to new sk89q repo (#4791) --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 7decc9e6e..e97572fca 100755 --- a/pom.xml +++ b/pom.xml @@ -226,8 +226,8 @@ https://repo.codemc.org/repository/maven-public - sk89q-repo - https://maven.sk89q.com/repo/ + enginehub-repo + https://maven.enginehub.org/repo/ sonatype-oss From 88b6517f8843e6c9af6f929134a464fc0ae64304 Mon Sep 17 00:00:00 2001 From: Greymagic27 <46166848+Greymagic27@users.noreply.github.com> Date: Fri, 15 Jul 2022 23:07:19 +0100 Subject: [PATCH 299/326] Added Dripstone Block to experience.yml (#4796) --- 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 0855dd341..cf3e4003f 100644 --- a/src/main/resources/experience.yml +++ b/src/main/resources/experience.yml @@ -497,6 +497,7 @@ Experience_Values: Purpur_Stairs: 250 Packed_Mud: 30 Mud_Bricks: 40 + Dripstone_Block: 35 Repair: Base: 1000.0 Wood: 0.6 From edd85c2f197ec25dd22f6db0ee3d055a311a15dd Mon Sep 17 00:00:00 2001 From: Greymagic27 <46166848+Greymagic27@users.noreply.github.com> Date: Sun, 17 Jul 2022 21:38:44 +0100 Subject: [PATCH 300/326] Updated kyori adventure-platform dependencies (#4797) --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index e97572fca..a297fdfa7 100755 --- a/pom.xml +++ b/pom.xml @@ -279,12 +279,12 @@ net.kyori adventure-platform-bukkit - 4.0.1 + 4.1.1 net.kyori adventure-platform-api - 4.0.1 + 4.1.1 org.apache.maven.scm From 89fa26d0ebbf538bd64b30faa75c63130bc2ac29 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sun, 17 Jul 2022 14:00:03 -0700 Subject: [PATCH 301/326] Potential fix for #3005 --- .../nossr50/listeners/InventoryListener.java | 34 ++++---- .../skills/smelting/SmeltingManager.java | 79 ++----------------- 2 files changed, 25 insertions(+), 88 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java b/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java index a47acbfbf..b9c93abbf 100644 --- a/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java @@ -66,30 +66,32 @@ public class InventoryListener implements Listener { return; } - //Profile doesn't exist - if(UserManager.getOfflinePlayer(offlinePlayer) == null) { - return; - } + McMMOPlayer mmoPlayer = UserManager.getPlayer(player); + if(mmoPlayer != null) { + boolean debugMode = player.isOnline() && mmoPlayer.isDebugMode(); - 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()); + } - 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(mmoPlayer.getSmeltingManager().fuelEfficiency(event.getBurnTime())); - event.setBurnTime(UserManager.getPlayer(player).getSmeltingManager().fuelEfficiency(event.getBurnTime())); + if(debugMode) { + player.sendMessage("New Furnace Burn Length (after applying fuel efficiency) "+event.getBurnTime()); + player.sendMessage(""); + } - if(debugMode) { - player.sendMessage("New Furnace Burn Length (after applying fuel efficiency) "+event.getBurnTime()); - player.sendMessage(""); + // Potential fix for #3005 + if (event.getBurnTime() > 0 && !event.isBurning()) { + event.setBurning(true); + } } } } - } @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = 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 90ece98cf..83248c166 100644 --- a/src/main/java/com/gmail/nossr50/skills/smelting/SmeltingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/smelting/SmeltingManager.java @@ -23,93 +23,28 @@ public class SmeltingManager extends SkillManager { super(mcMMOPlayer, PrimarySkillType.SMELTING); } - /*public boolean canUseFluxMining(BlockState blockState) { - return getSkillLevel() >= Smelting.fluxMiningUnlockLevel - && BlockUtils.affectedByFluxMining(blockState) - && Permissions.isSubSkillEnabled(getPlayer(), SubSkillType.SMELTING_FLUX_MINING) - && !mcMMO.getPlaceStore().isTrue(blockState); - }*/ - public boolean isSecondSmeltSuccessful() { return Permissions.isSubSkillEnabled(getPlayer(), SubSkillType.SMELTING_SECOND_SMELT) && 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 - * @return true if the ability was successful, false otherwise - */ - /*public boolean processFluxMining(BlockState blockState) { - Player player = getPlayer(); - - if (RandomChanceUtil.checkRandomChanceExecutionSuccess(getPlayer(), SubSkillType.SMELTING_FLUX_MINING, true)) { - ItemStack item = null; - - switch (blockState.getType()) { - case IRON_ORE: - item = new ItemStack(Material.IRON_INGOT); - break; - - case GOLD_ORE: - item = new ItemStack(Material.GOLD_INGOT); - break; - - default: - break; - } - - if (item == null) { - return false; - } - - if (!EventUtils.simulateBlockBreak(blockState.getBlock(), player, true)) { - return false; - } - - // We need to distribute Mining XP here, because the block break event gets cancelled - applyXpGain(Mining.getBlockXp(blockState), XPGainReason.PVE, XPGainSource.PASSIVE); - - SkillUtils.handleDurabilityChange(getPlayer().getInventory().getItemInMainHand(), Config.getInstance().getAbilityToolDamage()); - - Misc.dropItems(Misc.getBlockCenter(blockState), item, isSecondSmeltSuccessful() ? 2 : 1); - - blockState.setType(Material.AIR); - - if (Config.getInstance().getFluxPickaxeSoundEnabled()) { - SoundManager.sendSound(player, blockState.getLocation(), SoundType.FIZZ); - } - - ParticleEffectUtils.playFluxEffect(blockState.getLocation()); - return true; - } - - return false; - }*/ - /** * Increases burn time for furnace fuel. * * @param burnTime The initial burn time from the {@link FurnaceBurnEvent} */ public int fuelEfficiency(int burnTime) { - return burnTime * getFuelEfficiencyMultiplier(); + return Math.max(1, burnTime * getFuelEfficiencyMultiplier()); } public int getFuelEfficiencyMultiplier() { - switch(RankUtils.getRank(getPlayer(), SubSkillType.SMELTING_FUEL_EFFICIENCY)) - { - case 1: - return 2; - case 2: - return 3; - case 3: - return 4; - default: - return 1; - } + return switch (RankUtils.getRank(getPlayer(), SubSkillType.SMELTING_FUEL_EFFICIENCY)) { + case 1 -> 2; + case 2 -> 3; + case 3 -> 4; + default -> 1; + }; } public void smeltProcessing(@NotNull FurnaceSmeltEvent furnaceSmeltEvent, @NotNull Furnace furnace) { From 38f937fa01920cff15f7697206d4bb3aeb3bccda Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sun, 17 Jul 2022 14:56:44 -0700 Subject: [PATCH 302/326] revert potential furnace animation bug fix --- .../java/com/gmail/nossr50/listeners/InventoryListener.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java b/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java index b9c93abbf..95c4e4a81 100644 --- a/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java @@ -84,11 +84,6 @@ public class InventoryListener implements Listener { player.sendMessage("New Furnace Burn Length (after applying fuel efficiency) "+event.getBurnTime()); player.sendMessage(""); } - - // Potential fix for #3005 - if (event.getBurnTime() > 0 && !event.isBurning()) { - event.setBurning(true); - } } } } From b266c7ce5b59dae81f93b48778ad4bc1efcdb2a1 Mon Sep 17 00:00:00 2001 From: Greymagic27 <46166848+Greymagic27@users.noreply.github.com> Date: Sun, 17 Jul 2022 22:59:19 +0100 Subject: [PATCH 303/326] Updated Dependencies (#4798) * Updated Dependencies * Fix spelling mistake in dependencies * Fixed dependency error that would prevent the plugin from loading. Turned out I put in the wrong acf-bukkit, preventing the plugin from working. Oops! --- pom.xml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/pom.xml b/pom.xml index a297fdfa7..4a309e51a 100755 --- a/pom.xml +++ b/pom.xml @@ -248,7 +248,7 @@ co.aikar acf-bukkit - 0.5.0-SNAPSHOT + 0.5.1-SNAPSHOT @@ -289,12 +289,12 @@ org.apache.maven.scm maven-scm-provider-gitexe - 1.12.0 + 2.0.0-M1 org.bstats bstats-bukkit - 2.2.1 + 3.0.0 compile @@ -306,7 +306,7 @@ com.sk89q.worldguard worldguard-core - 7.0.4 + 7.0.7 @@ -330,36 +330,36 @@ org.junit.jupiter junit-jupiter - 5.8.2 + 5.9.0-RC1 test org.mockito mockito-core - 4.2.0 + 4.6.1 test org.mockito mockito-inline - 4.2.0 + 4.6.1 test org.apache.tomcat tomcat-jdbc - 10.0.14 + 10.1.0-M16 compile org.jetbrains annotations - 22.0.0 + 23.0.0 com.google.guava guava - 31.0.1-jre + 31.1-jre compile From e1a54b72a96a7e81faf03cb5dd4e4b4d7297d93c Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sat, 23 Jul 2022 13:34:38 -0700 Subject: [PATCH 304/326] update changelog --- Changelog.txt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Changelog.txt b/Changelog.txt index 33c72dd20..bf402aa0a 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,4 +1,12 @@ Version 2.1.215 + Level up broadcasts from level milestones will now be visible to the player who achieved them + Fixed a bug where hovering over skill descriptions did not display anything (thanks Greymagic27) + Added Dripstone to experience.yml (thanks Greymagic27) + Added Mangrove_Log to experience.yml (should fix behavior for tree-feller etc) + Item in main hand is now used for Tree Feller drops (thanks destro174) + + NOTES: + There is a bug where you may lose your config comments, this will be complex to solve, for now you can check our GitHub for the configs with comments. Version 2.1.214 Temporarily removed FakePlayerAnimationEvent (see notes) From eb1393c02c84acf3cd1dec12f9b39ebff09dad6a Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sat, 23 Jul 2022 14:24:31 -0700 Subject: [PATCH 305/326] Fix burnTime debug prints on mmodebug players --- .../nossr50/listeners/InventoryListener.java | 43 +++++++++---------- 1 file changed, 20 insertions(+), 23 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java b/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java index 95c4e4a81..2ac87e12a 100644 --- a/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java @@ -54,36 +54,33 @@ public class InventoryListener implements Listener { } Furnace furnace = (Furnace) furnaceState; - OfflinePlayer offlinePlayer = mcMMO.getSmeltingTracker().getFurnaceOwner(furnace); + Player player; - if(offlinePlayer != null && offlinePlayer.isOnline()) { + if(offlinePlayer != null && offlinePlayer.isOnline() && offlinePlayer instanceof Player) { + player = (Player) offlinePlayer; - Player player = Bukkit.getPlayer(offlinePlayer.getUniqueId()); + if (!Permissions.isSubSkillEnabled(player, SubSkillType.SMELTING_FUEL_EFFICIENCY)) { + return; + } - if(player != null) { - if (!Permissions.isSubSkillEnabled(player, SubSkillType.SMELTING_FUEL_EFFICIENCY)) { - return; + McMMOPlayer mmoPlayer = UserManager.getPlayer(player); + + if(mmoPlayer != null) { + boolean debugMode = mmoPlayer.isDebugMode(); + + if(debugMode) { + player.sendMessage("FURNACE FUEL EFFICIENCY DEBUG REPORT"); + player.sendMessage("Furnace - "+furnace.hashCode()); + player.sendMessage("Furnace Type: "+furnaceBlock.getType()); + player.sendMessage("Burn Length before Fuel Efficiency is applied - "+event.getBurnTime()); } - McMMOPlayer mmoPlayer = UserManager.getPlayer(player); + event.setBurnTime(mmoPlayer.getSmeltingManager().fuelEfficiency(event.getBurnTime())); - if(mmoPlayer != null) { - boolean debugMode = player.isOnline() && mmoPlayer.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(mmoPlayer.getSmeltingManager().fuelEfficiency(event.getBurnTime())); - - if(debugMode) { - player.sendMessage("New Furnace Burn Length (after applying fuel efficiency) "+event.getBurnTime()); - player.sendMessage(""); - } + if(debugMode) { + player.sendMessage("New Furnace Burn Length (after applying fuel efficiency) "+event.getBurnTime()); + player.sendMessage(""); } } } From 4db6e035170954b9230fe96f70f0caf96658554f Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sat, 23 Jul 2022 14:43:24 -0700 Subject: [PATCH 306/326] Hacky workaround for Spigot API bug not showing burntime to the client when burntime was too high --- 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 bf402aa0a..b736bc608 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,4 +1,5 @@ Version 2.1.215 + Added hacky workaround for Spigot API bug that resulted in burnTimes not showing burning animation to the client Level up broadcasts from level milestones will now be visible to the player who achieved them Fixed a bug where hovering over skill descriptions did not display anything (thanks Greymagic27) Added Dripstone to experience.yml (thanks Greymagic27) 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 83248c166..98d5a5a6f 100644 --- a/src/main/java/com/gmail/nossr50/skills/smelting/SmeltingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/smelting/SmeltingManager.java @@ -34,7 +34,7 @@ public class SmeltingManager extends SkillManager { * @param burnTime The initial burn time from the {@link FurnaceBurnEvent} */ public int fuelEfficiency(int burnTime) { - return Math.max(1, burnTime * getFuelEfficiencyMultiplier()); + return Math.min(Short.MAX_VALUE, Math.max(1, burnTime * getFuelEfficiencyMultiplier())); } public int getFuelEfficiencyMultiplier() From 9cf856221d057460ebf25cff9d2501e7dd8f90f0 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sat, 23 Jul 2022 14:47:32 -0700 Subject: [PATCH 307/326] update changelog --- Changelog.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index b736bc608..9cb1f2dfe 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,5 +1,5 @@ Version 2.1.215 - Added hacky workaround for Spigot API bug that resulted in burnTimes not showing burning animation to the client + Fixed Coal Blocks and potentially other fuel sources not showing burning animation to players (see notes) Level up broadcasts from level milestones will now be visible to the player who achieved them Fixed a bug where hovering over skill descriptions did not display anything (thanks Greymagic27) Added Dripstone to experience.yml (thanks Greymagic27) @@ -7,6 +7,7 @@ Version 2.1.215 Item in main hand is now used for Tree Feller drops (thanks destro174) NOTES: + The burning animation bug is actually in Spigot, it takes an int for setBurnTime when it really should only take a short as the game is expecting a short value, I implemented a hacky workaround via Math.min There is a bug where you may lose your config comments, this will be complex to solve, for now you can check our GitHub for the configs with comments. Version 2.1.214 From 993b418fbcf3b69a63eee74a31c517e8b7a23ac3 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sat, 23 Jul 2022 16:13:49 -0700 Subject: [PATCH 308/326] Players who used unarmed combat are still considered using unarmed while not holding weapons for a brief time period --- Changelog.txt | 3 + .../nossr50/listeners/BlockListener.java | 3 +- .../skills/unarmed/UnarmedManager.java | 19 ++++- .../com/gmail/nossr50/util/ItemUtils.java | 13 +--- .../nossr50/util/skills/CombatUtils.java | 74 ++++++++++++------- 5 files changed, 73 insertions(+), 39 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 9cb1f2dfe..0ddc94644 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,4 +1,5 @@ Version 2.1.215 + Unarmed bonuses apply to players who hurt an entity with empty fists in the last 60 seconds, these bonuses do not get applied if you are using another mcMMO tool/weapon/trident/etc (see notes) Fixed Coal Blocks and potentially other fuel sources not showing burning animation to players (see notes) Level up broadcasts from level milestones will now be visible to the player who achieved them Fixed a bug where hovering over skill descriptions did not display anything (thanks Greymagic27) @@ -7,6 +8,8 @@ Version 2.1.215 Item in main hand is now used for Tree Feller drops (thanks destro174) NOTES: + The unarmed change is to lower the penalty for picking up items during a fight, as an alternative solution, you can turn on Skills.Unarmed.Items_As_Unarmed in config.yml to have players be considered to be using unarmed while holding items regardless of last unarmed combat (holding tools/weapons/tridents will disqualify you from this) + Players who damage another entity with empty hands are considered "recently unarmed" for the next 60 seconds, during this period if they attack with items in their hands (other weapons/tools/tridents excluded) they will be processed as if they are using unarmed combat, this also works with stuff like block breaker The burning animation bug is actually in Spigot, it takes an int for setBurnTime when it really should only take a short as the game is expecting a short value, I implemented a hacky workaround via Math.min There is a bug where you may lose your config comments, this will be complex to solve, for now you can check our GitHub for the configs with comments. diff --git a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java index 57c9572bb..e08eadf9d 100644 --- a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java @@ -22,6 +22,7 @@ import com.gmail.nossr50.skills.salvage.Salvage; import com.gmail.nossr50.skills.woodcutting.WoodcuttingManager; import com.gmail.nossr50.util.*; import com.gmail.nossr50.util.player.UserManager; +import com.gmail.nossr50.util.skills.CombatUtils; import com.gmail.nossr50.util.skills.SkillUtils; import com.gmail.nossr50.util.sounds.SoundManager; import com.gmail.nossr50.util.sounds.SoundType; @@ -622,7 +623,7 @@ public class BlockListener implements Listener { blockState.update(true); } } - else if (mcMMOPlayer.getAbilityMode(SuperAbilityType.BERSERK) && (heldItem.getType() == Material.AIR || mcMMO.p.getGeneralConfig().getUnarmedItemsAsUnarmed())) { + else if (mcMMOPlayer.getAbilityMode(SuperAbilityType.BERSERK) && ItemUtils.isUnarmed(mcMMOPlayer.getPlayer().getInventory().getItemInMainHand()) || CombatUtils.isUsingUnarmedCombat(mcMMOPlayer)) { 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/skills/unarmed/UnarmedManager.java b/src/main/java/com/gmail/nossr50/skills/unarmed/UnarmedManager.java index 93dc5eef5..020ecf212 100644 --- a/src/main/java/com/gmail/nossr50/skills/unarmed/UnarmedManager.java +++ b/src/main/java/com/gmail/nossr50/skills/unarmed/UnarmedManager.java @@ -13,6 +13,7 @@ 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; +import com.gmail.nossr50.util.skills.CombatUtils; import com.gmail.nossr50.util.skills.RankUtils; import com.gmail.nossr50.util.skills.SkillActivationType; import org.bukkit.Material; @@ -24,6 +25,14 @@ import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; public class UnarmedManager extends SkillManager { + private long lastUsedUnarmed = 0L; + + /** + * Players are considered using Unarmed if they have damaged another entity with empty fists in the last 60 seconds + */ + public boolean usedUnarmedCombatRecently() { + return lastUsedUnarmed + 60000 > System.currentTimeMillis(); + } public UnarmedManager(McMMOPlayer mcMMOPlayer) { super(mcMMOPlayer, PrimarySkillType.UNARMED); @@ -57,7 +66,11 @@ public class UnarmedManager extends SkillManager { Player player = getPlayer(); - return ItemUtils.isUnarmed(player.getInventory().getItemInMainHand()) && Permissions.isSubSkillEnabled(getPlayer(), SubSkillType.UNARMED_ARROW_DEFLECT); + McMMOPlayer mmoPlayer = UserManager.getPlayer(player); + if(mmoPlayer == null) + return false; + + return CombatUtils.isUsingUnarmedCombat(mmoPlayer) && Permissions.isSubSkillEnabled(getPlayer(), SubSkillType.UNARMED_ARROW_DEFLECT); } public boolean canUseBlockCracker() { @@ -188,4 +201,8 @@ public class UnarmedManager extends SkillManager { return false; } + + public void updateLastUsedUnarmed() { + this.lastUsedUnarmed = System.currentTimeMillis(); + } } diff --git a/src/main/java/com/gmail/nossr50/util/ItemUtils.java b/src/main/java/com/gmail/nossr50/util/ItemUtils.java index 2e46341c2..cd0216678 100644 --- a/src/main/java/com/gmail/nossr50/util/ItemUtils.java +++ b/src/main/java/com/gmail/nossr50/util/ItemUtils.java @@ -2,6 +2,7 @@ package com.gmail.nossr50.util; import com.gmail.nossr50.config.experience.ExperienceConfig; import com.gmail.nossr50.config.party.ItemWeightConfig; +import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.datatypes.treasure.EnchantmentWrapper; import com.gmail.nossr50.datatypes.treasure.FishingTreasureBook; import com.gmail.nossr50.locale.LocaleLoader; @@ -178,18 +179,12 @@ public final class ItemUtils { return mcMMO.getMaterialMapStore().isPickAxe(item.getType().getKey().getKey()); } - /** - * Checks if the item counts as unarmed. - * - * @param item Item to check - * @return true if the item counts as unarmed, false otherwise - */ - public static boolean isUnarmed(ItemStack item) { + public static boolean isUnarmed(@NotNull ItemStack itemInMainHand) { if (mcMMO.p.getGeneralConfig().getUnarmedItemsAsUnarmed()) { - return !isMinecraftTool(item); + return !isMinecraftTool(itemInMainHand); } - return item.getType() == Material.AIR; + return itemInMainHand.getType() == Material.AIR; } /** 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 bf4a3a4ee..4c4a25e3e 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java @@ -40,6 +40,8 @@ import org.jetbrains.annotations.Nullable; import java.util.List; +import static com.gmail.nossr50.util.ItemUtils.isMinecraftTool; + public final class CombatUtils { private CombatUtils() {} @@ -166,47 +168,45 @@ public final class CombatUtils { printFinalDamageDebug(player, event, mcMMOPlayer); } - private static void processUnarmedCombat(@NotNull LivingEntity target, @NotNull Player player, @NotNull EntityDamageByEntityEvent event) { + private static void processUnarmedCombat(@NotNull LivingEntity target, @NotNull McMMOPlayer mmoPlayer, @NotNull EntityDamageByEntityEvent event) { if (event.getCause() == DamageCause.THORNS) { return; } double boostedDamage = event.getDamage(); - McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); + UnarmedManager unarmedManager = mmoPlayer.getUnarmedManager(); - //Make sure the profiles been loaded - if(mcMMOPlayer == null) { - return; - } + if(isUsingUnarmedCombat(mmoPlayer)) { + if (unarmedManager.canActivateAbility()) { + mmoPlayer.checkAbilityActivation(PrimarySkillType.UNARMED); + } - UnarmedManager unarmedManager = mcMMOPlayer.getUnarmedManager(); + if (unarmedManager.canUseSteelArm()) { + boostedDamage+=(unarmedManager.calculateSteelArmStyleDamage() * mmoPlayer.getAttackStrength()); + } - if (unarmedManager.canActivateAbility()) { - mcMMOPlayer.checkAbilityActivation(PrimarySkillType.UNARMED); - } + if (unarmedManager.canUseBerserk()) { + boostedDamage+=(unarmedManager.berserkDamage(boostedDamage) * mmoPlayer.getAttackStrength()); + } - if (unarmedManager.canUseSteelArm()) { - boostedDamage+=(unarmedManager.calculateSteelArmStyleDamage() * mcMMOPlayer.getAttackStrength()); - } + if (unarmedManager.canDisarm(target)) { + unarmedManager.disarmCheck((Player) target); + } - if (unarmedManager.canUseBerserk()) { - boostedDamage+=(unarmedManager.berserkDamage(boostedDamage) * mcMMOPlayer.getAttackStrength()); - } - - if (unarmedManager.canDisarm(target)) { - unarmedManager.disarmCheck((Player) target); - } - - if(canUseLimitBreak(player, target, SubSkillType.UNARMED_UNARMED_LIMIT_BREAK)) - { - boostedDamage+=(getLimitBreakDamage(player, target, SubSkillType.UNARMED_UNARMED_LIMIT_BREAK) * mcMMOPlayer.getAttackStrength()); + if(canUseLimitBreak(mmoPlayer.getPlayer(), target, SubSkillType.UNARMED_UNARMED_LIMIT_BREAK)) + { + boostedDamage+=(getLimitBreakDamage(mmoPlayer.getPlayer(), target, SubSkillType.UNARMED_UNARMED_LIMIT_BREAK) * mmoPlayer.getAttackStrength()); + } } event.setDamage(boostedDamage); - processCombatXP(mcMMOPlayer, target, PrimarySkillType.UNARMED); + processCombatXP(mmoPlayer, target, PrimarySkillType.UNARMED); + printFinalDamageDebug(mmoPlayer.getPlayer(), event, mmoPlayer); - printFinalDamageDebug(player, event, mcMMOPlayer); + if (ItemUtils.isUnarmed(mmoPlayer.getPlayer().getInventory().getItemInMainHand())) { + mmoPlayer.getUnarmedManager().updateLastUsedUnarmed(); + } } private static void processTamingCombat(@NotNull LivingEntity target, @Nullable Player master, @NotNull Wolf wolf, @NotNull EntityDamageByEntityEvent event) { @@ -335,6 +335,7 @@ public final class CombatUtils { } if (painSourceRoot instanceof Player player && entityType == EntityType.PLAYER) { + McMMOPlayer mmoPlayer = UserManager.getPlayer(player); if (!UserManager.hasPlayerDataKey(player)) { return; @@ -377,13 +378,13 @@ public final class CombatUtils { processAxeCombat(target, player, event); } } - else if (ItemUtils.isUnarmed(heldItem)) { + else if (mmoPlayer != null && (mmoPlayer.getUnarmedManager().usedUnarmedCombatRecently() || ItemUtils.isUnarmed(heldItem))) { if (!mcMMO.p.getSkillTools().canCombatSkillsTrigger(PrimarySkillType.UNARMED, target)) { return; } if (mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, PrimarySkillType.UNARMED)) { - processUnarmedCombat(target, player, event); + processUnarmedCombat(target, mmoPlayer, event); } } } @@ -977,4 +978,21 @@ public final class CombatUtils { public static void delayArrowMetaCleanup(@NotNull Projectile entity) { Bukkit.getServer().getScheduler().runTaskLater(mcMMO.p, () -> cleanupArrowMetadata(entity), 20*60); } + + /** + * Check if a player is considered "unarmed" + * + * @param mmoPlayer target player + * @return true if the item counts as unarmed, false otherwise + */ + public static boolean isUsingUnarmedCombat(@NotNull McMMOPlayer mmoPlayer) { + ItemStack itemInMainHand = mmoPlayer.getPlayer().getInventory().getItemInMainHand(); + + // player has to have been unarmed recently or config allows items as unarmed + if (mmoPlayer.getUnarmedManager().usedUnarmedCombatRecently() || mcMMO.p.getGeneralConfig().getUnarmedItemsAsUnarmed()) { + return !isMinecraftTool(itemInMainHand); + } + + return itemInMainHand.getType() == Material.AIR; + } } From c0e4d7a43de2a080a446ebb4edaa2a114b15cb9a Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sat, 23 Jul 2022 16:22:02 -0700 Subject: [PATCH 309/326] 2.1.215 - Unarmed change + Bug Fixes --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 4a309e51a..823055971 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.215-SNAPSHOT + 2.1.215 mcMMO https://github.com/mcMMO-Dev/mcMMO From 25d558a5fa8475fd77035d438bd31bf14fd27f48 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sat, 23 Jul 2022 16:57:42 -0700 Subject: [PATCH 310/326] Added Sculk blocks to Mining --- Changelog.txt | 5 +++++ pom.xml | 2 +- src/main/resources/experience.yml | 5 +++++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index 0ddc94644..9b798d95c 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,8 @@ +Version 2.1.216 + Added Sculk_* blocks to Mining XP + + NOTES: + The Sculk blocks don't quite fit perfectly as mining-related, especially since hoes are the fastest tool to use for them. Let me know what you think. Version 2.1.215 Unarmed bonuses apply to players who hurt an entity with empty fists in the last 60 seconds, these bonuses do not get applied if you are using another mcMMO tool/weapon/trident/etc (see notes) Fixed Coal Blocks and potentially other fuel sources not showing burning animation to players (see notes) diff --git a/pom.xml b/pom.xml index 823055971..4f4989ab2 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.215 + 2.1.216-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO diff --git a/src/main/resources/experience.yml b/src/main/resources/experience.yml index cf3e4003f..f1bde0450 100644 --- a/src/main/resources/experience.yml +++ b/src/main/resources/experience.yml @@ -402,6 +402,11 @@ Experience_Values: Lily_Of_The_Valley: 150 Wither_Rose: 500 Mining: + Sculk: 4 + Sculk_Vein: 3 + Sculk_Sensor: 6 + Sculk_Catalyst: 10 + Sculk_Shrieker: 12 Reinforced_Deepslate: 500 Tuff: 10 Copper_Ore: 1400 From df0362bcbad8cc36fa4f409e9a390b584cc8c196 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sat, 23 Jul 2022 17:04:43 -0700 Subject: [PATCH 311/326] Allow mining benefits while using Hoe --- src/main/java/com/gmail/nossr50/listeners/BlockListener.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java index e08eadf9d..b5fa7c0cc 100644 --- a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java @@ -389,7 +389,10 @@ public class BlockListener implements Listener { } /* MINING */ - else if (BlockUtils.affectedBySuperBreaker(blockState) && ItemUtils.isPickaxe(heldItem) && mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, PrimarySkillType.MINING) && !mcMMO.getPlaceStore().isTrue(blockState)) { + else if (BlockUtils.affectedBySuperBreaker(blockState) + && (ItemUtils.isPickaxe(heldItem) || ItemUtils.isHoe(heldItem)) + && mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, PrimarySkillType.MINING) + && !mcMMO.getPlaceStore().isTrue(blockState)) { MiningManager miningManager = mcMMOPlayer.getMiningManager(); miningManager.miningBlockCheck(blockState); } From 45f96793a5117e3c278ddbdbade3a65702fd0363 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sun, 24 Jul 2022 10:05:56 -0700 Subject: [PATCH 312/326] Revert "Players who used unarmed combat are still considered using unarmed while not holding weapons for a brief time period" This reverts commit 993b418fbcf3b69a63eee74a31c517e8b7a23ac3. --- Changelog.txt | 3 - .../nossr50/listeners/BlockListener.java | 3 +- .../skills/unarmed/UnarmedManager.java | 19 +---- .../com/gmail/nossr50/util/ItemUtils.java | 13 +++- .../nossr50/util/skills/CombatUtils.java | 74 +++++++------------ 5 files changed, 39 insertions(+), 73 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 9b798d95c..7e6855e94 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -4,7 +4,6 @@ Version 2.1.216 NOTES: The Sculk blocks don't quite fit perfectly as mining-related, especially since hoes are the fastest tool to use for them. Let me know what you think. Version 2.1.215 - Unarmed bonuses apply to players who hurt an entity with empty fists in the last 60 seconds, these bonuses do not get applied if you are using another mcMMO tool/weapon/trident/etc (see notes) Fixed Coal Blocks and potentially other fuel sources not showing burning animation to players (see notes) Level up broadcasts from level milestones will now be visible to the player who achieved them Fixed a bug where hovering over skill descriptions did not display anything (thanks Greymagic27) @@ -13,8 +12,6 @@ Version 2.1.215 Item in main hand is now used for Tree Feller drops (thanks destro174) NOTES: - The unarmed change is to lower the penalty for picking up items during a fight, as an alternative solution, you can turn on Skills.Unarmed.Items_As_Unarmed in config.yml to have players be considered to be using unarmed while holding items regardless of last unarmed combat (holding tools/weapons/tridents will disqualify you from this) - Players who damage another entity with empty hands are considered "recently unarmed" for the next 60 seconds, during this period if they attack with items in their hands (other weapons/tools/tridents excluded) they will be processed as if they are using unarmed combat, this also works with stuff like block breaker The burning animation bug is actually in Spigot, it takes an int for setBurnTime when it really should only take a short as the game is expecting a short value, I implemented a hacky workaround via Math.min There is a bug where you may lose your config comments, this will be complex to solve, for now you can check our GitHub for the configs with comments. diff --git a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java index b5fa7c0cc..fcfb8096a 100644 --- a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java @@ -22,7 +22,6 @@ import com.gmail.nossr50.skills.salvage.Salvage; import com.gmail.nossr50.skills.woodcutting.WoodcuttingManager; import com.gmail.nossr50.util.*; import com.gmail.nossr50.util.player.UserManager; -import com.gmail.nossr50.util.skills.CombatUtils; import com.gmail.nossr50.util.skills.SkillUtils; import com.gmail.nossr50.util.sounds.SoundManager; import com.gmail.nossr50.util.sounds.SoundType; @@ -626,7 +625,7 @@ public class BlockListener implements Listener { blockState.update(true); } } - else if (mcMMOPlayer.getAbilityMode(SuperAbilityType.BERSERK) && ItemUtils.isUnarmed(mcMMOPlayer.getPlayer().getInventory().getItemInMainHand()) || CombatUtils.isUsingUnarmedCombat(mcMMOPlayer)) { + 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/skills/unarmed/UnarmedManager.java b/src/main/java/com/gmail/nossr50/skills/unarmed/UnarmedManager.java index 020ecf212..93dc5eef5 100644 --- a/src/main/java/com/gmail/nossr50/skills/unarmed/UnarmedManager.java +++ b/src/main/java/com/gmail/nossr50/skills/unarmed/UnarmedManager.java @@ -13,7 +13,6 @@ 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; -import com.gmail.nossr50.util.skills.CombatUtils; import com.gmail.nossr50.util.skills.RankUtils; import com.gmail.nossr50.util.skills.SkillActivationType; import org.bukkit.Material; @@ -25,14 +24,6 @@ import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; public class UnarmedManager extends SkillManager { - private long lastUsedUnarmed = 0L; - - /** - * Players are considered using Unarmed if they have damaged another entity with empty fists in the last 60 seconds - */ - public boolean usedUnarmedCombatRecently() { - return lastUsedUnarmed + 60000 > System.currentTimeMillis(); - } public UnarmedManager(McMMOPlayer mcMMOPlayer) { super(mcMMOPlayer, PrimarySkillType.UNARMED); @@ -66,11 +57,7 @@ public class UnarmedManager extends SkillManager { Player player = getPlayer(); - McMMOPlayer mmoPlayer = UserManager.getPlayer(player); - if(mmoPlayer == null) - return false; - - return CombatUtils.isUsingUnarmedCombat(mmoPlayer) && Permissions.isSubSkillEnabled(getPlayer(), SubSkillType.UNARMED_ARROW_DEFLECT); + return ItemUtils.isUnarmed(player.getInventory().getItemInMainHand()) && Permissions.isSubSkillEnabled(getPlayer(), SubSkillType.UNARMED_ARROW_DEFLECT); } public boolean canUseBlockCracker() { @@ -201,8 +188,4 @@ public class UnarmedManager extends SkillManager { return false; } - - public void updateLastUsedUnarmed() { - this.lastUsedUnarmed = System.currentTimeMillis(); - } } diff --git a/src/main/java/com/gmail/nossr50/util/ItemUtils.java b/src/main/java/com/gmail/nossr50/util/ItemUtils.java index cd0216678..2e46341c2 100644 --- a/src/main/java/com/gmail/nossr50/util/ItemUtils.java +++ b/src/main/java/com/gmail/nossr50/util/ItemUtils.java @@ -2,7 +2,6 @@ package com.gmail.nossr50.util; import com.gmail.nossr50.config.experience.ExperienceConfig; import com.gmail.nossr50.config.party.ItemWeightConfig; -import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.datatypes.treasure.EnchantmentWrapper; import com.gmail.nossr50.datatypes.treasure.FishingTreasureBook; import com.gmail.nossr50.locale.LocaleLoader; @@ -179,12 +178,18 @@ public final class ItemUtils { return mcMMO.getMaterialMapStore().isPickAxe(item.getType().getKey().getKey()); } - public static boolean isUnarmed(@NotNull ItemStack itemInMainHand) { + /** + * Checks if the item counts as unarmed. + * + * @param item Item to check + * @return true if the item counts as unarmed, false otherwise + */ + public static boolean isUnarmed(ItemStack item) { if (mcMMO.p.getGeneralConfig().getUnarmedItemsAsUnarmed()) { - return !isMinecraftTool(itemInMainHand); + return !isMinecraftTool(item); } - return itemInMainHand.getType() == Material.AIR; + return item.getType() == Material.AIR; } /** 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 4c4a25e3e..bf4a3a4ee 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java @@ -40,8 +40,6 @@ import org.jetbrains.annotations.Nullable; import java.util.List; -import static com.gmail.nossr50.util.ItemUtils.isMinecraftTool; - public final class CombatUtils { private CombatUtils() {} @@ -168,45 +166,47 @@ public final class CombatUtils { printFinalDamageDebug(player, event, mcMMOPlayer); } - private static void processUnarmedCombat(@NotNull LivingEntity target, @NotNull McMMOPlayer mmoPlayer, @NotNull EntityDamageByEntityEvent event) { + private static void processUnarmedCombat(@NotNull LivingEntity target, @NotNull Player player, @NotNull EntityDamageByEntityEvent event) { if (event.getCause() == DamageCause.THORNS) { return; } double boostedDamage = event.getDamage(); - UnarmedManager unarmedManager = mmoPlayer.getUnarmedManager(); + McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); - if(isUsingUnarmedCombat(mmoPlayer)) { - if (unarmedManager.canActivateAbility()) { - mmoPlayer.checkAbilityActivation(PrimarySkillType.UNARMED); - } + //Make sure the profiles been loaded + if(mcMMOPlayer == null) { + return; + } - if (unarmedManager.canUseSteelArm()) { - boostedDamage+=(unarmedManager.calculateSteelArmStyleDamage() * mmoPlayer.getAttackStrength()); - } + UnarmedManager unarmedManager = mcMMOPlayer.getUnarmedManager(); - if (unarmedManager.canUseBerserk()) { - boostedDamage+=(unarmedManager.berserkDamage(boostedDamage) * mmoPlayer.getAttackStrength()); - } + if (unarmedManager.canActivateAbility()) { + mcMMOPlayer.checkAbilityActivation(PrimarySkillType.UNARMED); + } - if (unarmedManager.canDisarm(target)) { - unarmedManager.disarmCheck((Player) target); - } + if (unarmedManager.canUseSteelArm()) { + boostedDamage+=(unarmedManager.calculateSteelArmStyleDamage() * mcMMOPlayer.getAttackStrength()); + } - if(canUseLimitBreak(mmoPlayer.getPlayer(), target, SubSkillType.UNARMED_UNARMED_LIMIT_BREAK)) - { - boostedDamage+=(getLimitBreakDamage(mmoPlayer.getPlayer(), target, SubSkillType.UNARMED_UNARMED_LIMIT_BREAK) * mmoPlayer.getAttackStrength()); - } + if (unarmedManager.canUseBerserk()) { + boostedDamage+=(unarmedManager.berserkDamage(boostedDamage) * mcMMOPlayer.getAttackStrength()); + } + + if (unarmedManager.canDisarm(target)) { + unarmedManager.disarmCheck((Player) target); + } + + if(canUseLimitBreak(player, target, SubSkillType.UNARMED_UNARMED_LIMIT_BREAK)) + { + boostedDamage+=(getLimitBreakDamage(player, target, SubSkillType.UNARMED_UNARMED_LIMIT_BREAK) * mcMMOPlayer.getAttackStrength()); } event.setDamage(boostedDamage); - processCombatXP(mmoPlayer, target, PrimarySkillType.UNARMED); - printFinalDamageDebug(mmoPlayer.getPlayer(), event, mmoPlayer); + processCombatXP(mcMMOPlayer, target, PrimarySkillType.UNARMED); - if (ItemUtils.isUnarmed(mmoPlayer.getPlayer().getInventory().getItemInMainHand())) { - mmoPlayer.getUnarmedManager().updateLastUsedUnarmed(); - } + printFinalDamageDebug(player, event, mcMMOPlayer); } private static void processTamingCombat(@NotNull LivingEntity target, @Nullable Player master, @NotNull Wolf wolf, @NotNull EntityDamageByEntityEvent event) { @@ -335,7 +335,6 @@ public final class CombatUtils { } if (painSourceRoot instanceof Player player && entityType == EntityType.PLAYER) { - McMMOPlayer mmoPlayer = UserManager.getPlayer(player); if (!UserManager.hasPlayerDataKey(player)) { return; @@ -378,13 +377,13 @@ public final class CombatUtils { processAxeCombat(target, player, event); } } - else if (mmoPlayer != null && (mmoPlayer.getUnarmedManager().usedUnarmedCombatRecently() || ItemUtils.isUnarmed(heldItem))) { + else if (ItemUtils.isUnarmed(heldItem)) { if (!mcMMO.p.getSkillTools().canCombatSkillsTrigger(PrimarySkillType.UNARMED, target)) { return; } if (mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, PrimarySkillType.UNARMED)) { - processUnarmedCombat(target, mmoPlayer, event); + processUnarmedCombat(target, player, event); } } } @@ -978,21 +977,4 @@ public final class CombatUtils { public static void delayArrowMetaCleanup(@NotNull Projectile entity) { Bukkit.getServer().getScheduler().runTaskLater(mcMMO.p, () -> cleanupArrowMetadata(entity), 20*60); } - - /** - * Check if a player is considered "unarmed" - * - * @param mmoPlayer target player - * @return true if the item counts as unarmed, false otherwise - */ - public static boolean isUsingUnarmedCombat(@NotNull McMMOPlayer mmoPlayer) { - ItemStack itemInMainHand = mmoPlayer.getPlayer().getInventory().getItemInMainHand(); - - // player has to have been unarmed recently or config allows items as unarmed - if (mmoPlayer.getUnarmedManager().usedUnarmedCombatRecently() || mcMMO.p.getGeneralConfig().getUnarmedItemsAsUnarmed()) { - return !isMinecraftTool(itemInMainHand); - } - - return itemInMainHand.getType() == Material.AIR; - } } From 8a4fe8ae5d8db4b453ea485ca00a482d2afea134 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sun, 24 Jul 2022 10:09:48 -0700 Subject: [PATCH 313/326] 2.1.216 --- Changelog.txt | 3 +++ pom.xml | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index 7e6855e94..026011b66 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,7 +1,10 @@ Version 2.1.216 + Reverted Unarmed changes from 2.1.215 (fixes block breaker/beserk active at all time for all players) Added Sculk_* blocks to Mining XP + You can use Hoe(s) to gain mining XP, Hoe(s) won't benefit from Super Breaker nor will they activate it (see notes) NOTES: + Hoe's being able to gain Mining XP is primarily for Sculk blocks which have Hoe as the fastest tool yet to me feel like Mining blocks, let me know what you think The Sculk blocks don't quite fit perfectly as mining-related, especially since hoes are the fastest tool to use for them. Let me know what you think. Version 2.1.215 Fixed Coal Blocks and potentially other fuel sources not showing burning animation to players (see notes) diff --git a/pom.xml b/pom.xml index 4f4989ab2..70ce15b69 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.216-SNAPSHOT + 2.1.216 mcMMO https://github.com/mcMMO-Dev/mcMMO From 8feba60e2c747d10e6d60ea80a626d88b2413769 Mon Sep 17 00:00:00 2001 From: dod0lp <56415227+dod0lp@users.noreply.github.com> Date: Wed, 3 Aug 2022 16:43:03 +0200 Subject: [PATCH 314/326] Update config.yml (#4809) --- src/main/resources/config.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 5892692c7..4bf2c25a2 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -609,6 +609,8 @@ Bonus_Drops: Jungle_Log: true Spruce_Wood: true Spruce_Log: true + Mangrove_Wood: true + Mangrove_Log: true Smelting: Iron_Ingot: true Gold_Ingot: true From 33e615f0f134cd59d0f48428408dc3de6713300c Mon Sep 17 00:00:00 2001 From: Greymagic27 <46166848+Greymagic27@users.noreply.github.com> Date: Sun, 7 Aug 2022 22:19:46 +0100 Subject: [PATCH 315/326] Updated dependencies to fix hovering over subskills for 1.19.2 (#4814) * Updated dependencies that should fix the issue * Updated spigotmc version * Updated rest of dependencies * Updated dependencies that fix the issue. Investigating what dependency update breaks compiling. * Found the dependency that caused the compile issue, so have not updated that one --- pom.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index 70ce15b69..dd93c9e9a 100755 --- a/pom.xml +++ b/pom.xml @@ -279,12 +279,12 @@ net.kyori adventure-platform-bukkit - 4.1.1 + 4.1.2 net.kyori adventure-platform-api - 4.1.1 + 4.1.2 org.apache.maven.scm @@ -300,7 +300,7 @@ org.spigotmc spigot-api - 1.19-R0.1-SNAPSHOT + 1.19.2-R0.1-SNAPSHOT provided @@ -330,7 +330,7 @@ org.junit.jupiter junit-jupiter - 5.9.0-RC1 + 5.9.0 test @@ -348,7 +348,7 @@ org.apache.tomcat tomcat-jdbc - 10.1.0-M16 + 10.1.0-M17 compile From 032a407c8a885a555dbe41f1dbecaeafe9397104 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sun, 7 Aug 2022 14:27:42 -0700 Subject: [PATCH 316/326] Update changelog and version --- Changelog.txt | 3 +++ pom.xml | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index 026011b66..b26e211f2 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,6 @@ +Version 2.1.217 + Fixed mouse-hover tooltips (thanks Greymagic27) + Version 2.1.216 Reverted Unarmed changes from 2.1.215 (fixes block breaker/beserk active at all time for all players) Added Sculk_* blocks to Mining XP diff --git a/pom.xml b/pom.xml index dd93c9e9a..bb63483ee 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.216 + 2.1.217-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO From fb738d85f64b8a1fb6a91b2312db09b5ac51253c Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sun, 7 Aug 2022 15:54:22 -0700 Subject: [PATCH 317/326] Mangrove trees are now properly marked natural from growth Fixes #4810 --- .../gmail/nossr50/listeners/PlayerListener.java | 15 ++++++++------- .../gmail/nossr50/listeners/WorldListener.java | 12 +++++++++--- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java index 9ebc19ad4..fb906ad1d 100644 --- a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java @@ -844,13 +844,14 @@ public class PlayerListener implements Listener { 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: + switch (blockState.getType().toString()) { + case "BEETROOTS": + case "CARROT": + case "COCOA": + case "WHEAT": + case "NETHER_WART_BLOCK": + case "POTATO": + case "MANGROVE_PROPAGULE": mcMMO.getPlaceStore().setFalse(blockState); break; } diff --git a/src/main/java/com/gmail/nossr50/listeners/WorldListener.java b/src/main/java/com/gmail/nossr50/listeners/WorldListener.java index 5abea42b3..5dbcb3ab3 100644 --- a/src/main/java/com/gmail/nossr50/listeners/WorldListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/WorldListener.java @@ -1,7 +1,10 @@ package com.gmail.nossr50.listeners; import com.gmail.nossr50.config.WorldBlacklist; +import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.util.player.UserManager; +import org.bukkit.Bukkit; import org.bukkit.Chunk; import org.bukkit.block.BlockState; import org.bukkit.event.EventHandler; @@ -10,6 +13,7 @@ import org.bukkit.event.Listener; import org.bukkit.event.world.ChunkUnloadEvent; import org.bukkit.event.world.StructureGrowEvent; import org.bukkit.event.world.WorldUnloadEvent; +import org.bukkit.scheduler.BukkitRunnable; public class WorldListener implements Listener { private final mcMMO plugin; @@ -29,9 +33,11 @@ public class WorldListener implements Listener { if(WorldBlacklist.isWorldBlacklisted(event.getWorld())) return; - for (BlockState blockState : event.getBlocks()) { - mcMMO.getPlaceStore().setFalse(blockState); - } + Bukkit.getScheduler().scheduleSyncDelayedTask(mcMMO.p, () -> { + for (BlockState blockState : event.getBlocks()) { + mcMMO.getPlaceStore().setFalse(blockState); + } + }, 1); } /** From 101c43a4bcf7d50c5ce086e0f649ee647d9eaadb Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sun, 7 Aug 2022 15:55:19 -0700 Subject: [PATCH 318/326] Tree Feller now partially destroys trees if the whole tree is too big Fixes #4811 --- Changelog.txt | 2 + .../gmail/nossr50/config/BukkitConfig.java | 158 +++++++++--------- .../woodcutting/WoodcuttingManager.java | 19 +-- .../com/gmail/nossr50/util/ItemUtils.java | 54 +++--- 4 files changed, 115 insertions(+), 118 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index b26e211f2..12a0f0f8c 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,5 +1,7 @@ Version 2.1.217 Fixed mouse-hover tooltips (thanks Greymagic27) + Tree Feller will now break blocks within the limit instead of refusing to fell the entire tree (partial big tree destruction) + Mangrove trees resulting from growth are now marked as natural (existing trees marked unnatural before this update will not be retroactively fixed) Version 2.1.216 Reverted Unarmed changes from 2.1.215 (fixes block breaker/beserk active at all time for all players) diff --git a/src/main/java/com/gmail/nossr50/config/BukkitConfig.java b/src/main/java/com/gmail/nossr50/config/BukkitConfig.java index a22990e00..e1bd830cd 100644 --- a/src/main/java/com/gmail/nossr50/config/BukkitConfig.java +++ b/src/main/java/com/gmail/nossr50/config/BukkitConfig.java @@ -25,7 +25,7 @@ public abstract class BukkitConfig { this.fileName = fileName; this.dataFolder = dataFolder; configFile = new File(dataFolder, fileName); - purgeComments(true); + // purgeComments(true); this.config = initConfig(); initDefaults(); updateFile(); @@ -124,84 +124,84 @@ public abstract class BukkitConfig { return configFile; } - /** - * Somewhere between December 2021-January 2022 Spigot updated their - * SnakeYAML dependency/API and due to our own crappy legacy code - * this introduced a very problematic bug where comments got duplicated - *

- * This method hotfixes the problem by just deleting any existing comments - * it's ugly, but it gets the job done - * - * @param silentFail when true mcMMO will report errors during the patch process or debug information - * the option to have it fail silently is because mcMMO wants to check files before they are parsed as a file with a zillion comments will fail to even load - */ - private void purgeComments(boolean silentFail) { - if(!configFile.exists()) - return; - - int dupedLines = 0, lineCount = 0, lineCountAfter = 0; - try (FileReader fileReader = new FileReader(configFile); - BufferedReader bufferedReader = new BufferedReader(fileReader)) { - StringBuilder stringBuilder = new StringBuilder(); - String line; - Set seenBefore = new HashSet<>(); - - stringBuilder.append(CURRENT_CONFIG_PATCH_VER).append(System.lineSeparator()); - boolean noPatchNeeded = false; - - // While not at the end of the file - while ((line = bufferedReader.readLine()) != null) { - lineCount++; - - if(line.startsWith(CURRENT_CONFIG_PATCH_VER)) { - noPatchNeeded = true; - break; - } - - //Older version, don't append this line - if(line.startsWith(CONFIG_PATCH_PREFIX)) - continue; - - if (isFirstCharAsciiCharacter(line, COMMENT_PREFIX)) { - if(seenBefore.contains(line)) - dupedLines++; - else - seenBefore.add(line); - - continue; //Delete the line by not appending it - } - - stringBuilder - .append(line) //Convert existing files into two-spaced format - .append(System.lineSeparator()); - lineCountAfter++; - } - - if(noPatchNeeded) - return; - - if(lineCount == 0 && !silentFail) { - mcMMO.p.getLogger().info("[config patcher] Config line count: " + lineCount); - throw new InvalidConfigurationException("[config patcher] Patching of config file resulted in an empty file, this will not be saved. Contact the mcMMO devs!"); - } - - if(dupedLines > 0 && !silentFail) { - mcMMO.p.getLogger().info("[config patcher] Found "+dupedLines+" duplicate comments in config file: " + configFile.getName()); - mcMMO.p.getLogger().info("[config patcher] Purging the duplicate comments... (Nothing is broken, this is just info used for debugging)"); - mcMMO.p.getLogger().info("[config patcher] Line count before: "+lineCount); - mcMMO.p.getLogger().info("[config patcher] Line count after: "+lineCountAfter); - } - - // Write out the *patched* file - // AKA the file without any comments - try (FileWriter fileWriter = new FileWriter(configFile)) { - fileWriter.write(stringBuilder.toString()); - } - } catch (IOException | InvalidConfigurationException ex) { - mcMMO.p.getLogger().severe("Failed to patch config file: " + configFile.getName()); - ex.printStackTrace(); - } - } +// /** +// * Somewhere between December 2021-January 2022 Spigot updated their +// * SnakeYAML dependency/API and due to our own crappy legacy code +// * this introduced a very problematic bug where comments got duplicated +// *

+// * This method hotfixes the problem by just deleting any existing comments +// * it's ugly, but it gets the job done +// * +// * @param silentFail when true mcMMO will report errors during the patch process or debug information +// * the option to have it fail silently is because mcMMO wants to check files before they are parsed as a file with a zillion comments will fail to even load +// */ +// private void purgeComments(boolean silentFail) { +// if(!configFile.exists()) +// return; +// +// int dupedLines = 0, lineCount = 0, lineCountAfter = 0; +// try (FileReader fileReader = new FileReader(configFile); +// BufferedReader bufferedReader = new BufferedReader(fileReader)) { +// StringBuilder stringBuilder = new StringBuilder(); +// String line; +// Set seenBefore = new HashSet<>(); +// +// stringBuilder.append(CURRENT_CONFIG_PATCH_VER).append(System.lineSeparator()); +// boolean noPatchNeeded = false; +// +// // While not at the end of the file +// while ((line = bufferedReader.readLine()) != null) { +// lineCount++; +// +// if(line.startsWith(CURRENT_CONFIG_PATCH_VER)) { +// noPatchNeeded = true; +// break; +// } +// +// //Older version, don't append this line +// if(line.startsWith(CONFIG_PATCH_PREFIX)) +// continue; +// +// if (isFirstCharAsciiCharacter(line, COMMENT_PREFIX)) { +// if(seenBefore.contains(line)) +// dupedLines++; +// else +// seenBefore.add(line); +// +// continue; //Delete the line by not appending it +// } +// +// stringBuilder +// .append(line) //Convert existing files into two-spaced format +// .append(System.lineSeparator()); +// lineCountAfter++; +// } +// +// if(noPatchNeeded) +// return; +// +// if(lineCount == 0 && !silentFail) { +// mcMMO.p.getLogger().info("[config patcher] Config line count: " + lineCount); +// throw new InvalidConfigurationException("[config patcher] Patching of config file resulted in an empty file, this will not be saved. Contact the mcMMO devs!"); +// } +// +// if(dupedLines > 0 && !silentFail) { +// mcMMO.p.getLogger().info("[config patcher] Found "+dupedLines+" duplicate comments in config file: " + configFile.getName()); +// mcMMO.p.getLogger().info("[config patcher] Purging the duplicate comments... (Nothing is broken, this is just info used for debugging)"); +// mcMMO.p.getLogger().info("[config patcher] Line count before: "+lineCount); +// mcMMO.p.getLogger().info("[config patcher] Line count after: "+lineCountAfter); +// } +// +// // Write out the *patched* file +// // AKA the file without any comments +// try (FileWriter fileWriter = new FileWriter(configFile)) { +// fileWriter.write(stringBuilder.toString()); +// } +// } catch (IOException | InvalidConfigurationException ex) { +// mcMMO.p.getLogger().severe("Failed to patch config file: " + configFile.getName()); +// ex.printStackTrace(); +// } +// } private boolean isFirstCharAsciiCharacter(String line, char character) { if(line == null || line.isEmpty()) { 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 866ef91d2..e894d22ab 100644 --- a/src/main/java/com/gmail/nossr50/skills/woodcutting/WoodcuttingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/woodcutting/WoodcuttingManager.java @@ -85,6 +85,9 @@ public class WoodcuttingManager extends SkillManager { } public void processWoodcuttingBlockXP(@NotNull BlockState blockState) { + if(mcMMO.getPlaceStore().isTrue(blockState)) + return; + int xp = getExperienceFromLog(blockState); applyXpGain(xp, XPGainReason.PVE); } @@ -102,19 +105,6 @@ public class WoodcuttingManager extends SkillManager { processTree(blockState, treeFellerBlocks); - // If the player is trying to break too many blocks - if (treeFellerReachedThreshold) { - treeFellerReachedThreshold = false; - - NotificationManager.sendPlayerInformation(player, NotificationType.SUBSKILL_MESSAGE_FAILED, "Woodcutting.Skills.TreeFeller.Threshold"); - - //Tree feller won't be activated for this block, award normal xp. - processWoodcuttingBlockXP(blockState); - processHarvestLumber(blockState); - - return; - } - // If the tool can't sustain the durability loss if (!handleDurabilityLoss(treeFellerBlocks, player.getInventory().getItemInMainHand(), player)) { NotificationManager.sendPlayerInformation(player, NotificationType.SUBSKILL_MESSAGE_FAILED, "Woodcutting.Skills.TreeFeller.Splinter"); @@ -352,6 +342,9 @@ public class WoodcuttingManager extends SkillManager { * @return Amount of experience */ private static int processTreeFellerXPGains(BlockState blockState, int woodCount) { + if(mcMMO.getPlaceStore().isTrue(blockState)) + return 0; + int rawXP = ExperienceConfig.getInstance().getXp(PrimarySkillType.WOODCUTTING, blockState.getType()); if(rawXP <= 0) diff --git a/src/main/java/com/gmail/nossr50/util/ItemUtils.java b/src/main/java/com/gmail/nossr50/util/ItemUtils.java index 2e46341c2..9f3d58e23 100644 --- a/src/main/java/com/gmail/nossr50/util/ItemUtils.java +++ b/src/main/java/com/gmail/nossr50/util/ItemUtils.java @@ -510,32 +510,34 @@ public final class ItemUtils { * @return true if the item is a woodcutting drop, false otherwise */ public static boolean isWoodcuttingDrop(ItemStack item) { - switch (item.getType()) { - case ACACIA_LOG: - case BIRCH_LOG: - case DARK_OAK_LOG: - case JUNGLE_LOG: - case OAK_LOG: - case SPRUCE_LOG: - case STRIPPED_ACACIA_LOG: - case STRIPPED_BIRCH_LOG: - case STRIPPED_DARK_OAK_LOG: - case STRIPPED_JUNGLE_LOG: - case STRIPPED_OAK_LOG: - case STRIPPED_SPRUCE_LOG: - case ACACIA_SAPLING: - case SPRUCE_SAPLING: - case BIRCH_SAPLING: - case DARK_OAK_SAPLING: - case JUNGLE_SAPLING: - case OAK_SAPLING: - case ACACIA_LEAVES: - case BIRCH_LEAVES: - case DARK_OAK_LEAVES: - case JUNGLE_LEAVES: - case OAK_LEAVES: - case SPRUCE_LEAVES: - case APPLE: + switch (item.getType().toString()) { + case "ACACIA_LOG": + case "BIRCH_LOG": + case "DARK_OAK_LOG": + case "JUNGLE_LOG": + case "OAK_LOG": + case "SPRUCE_LOG": + case "STRIPPED_ACACIA_LOG": + case "STRIPPED_BIRCH_LOG": + case "STRIPPED_DARK_OAK_LOG": + case "STRIPPED_JUNGLE_LOG": + case "STRIPPED_OAK_LOG": + case "STRIPPED_SPRUCE_LOG": + case "STRIPPED_MANGROVE_LOG": + case "ACACIA_SAPLING": + case "SPRUCE_SAPLING": + case "BIRCH_SAPLING": + case "DARK_OAK_SAPLING": + case "JUNGLE_SAPLING": + case "OAK_SAPLING": + case "ACACIA_LEAVES": + case "BIRCH_LEAVES": + case "DARK_OAK_LEAVES": + case "JUNGLE_LEAVES": + case "OAK_LEAVES": + case "SPRUCE_LEAVES": + case "BEE_NEST": + case "APPLE": return true; default: From fed0483d40e20142c4dbee6ad91194cffc436702 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sun, 7 Aug 2022 16:03:55 -0700 Subject: [PATCH 319/326] 2.1.217 --- Changelog.txt | 7 ++++++- pom.xml | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 12a0f0f8c..558e2bd6b 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,7 +1,12 @@ Version 2.1.217 - Fixed mouse-hover tooltips (thanks Greymagic27) Tree Feller will now break blocks within the limit instead of refusing to fell the entire tree (partial big tree destruction) Mangrove trees resulting from growth are now marked as natural (existing trees marked unnatural before this update will not be retroactively fixed) + Fixed a bug removing comments from configs (see notes) + Fixed mouse-hover tooltip windows (thanks Greymagic27) + + NOTES: + Regarding the secure chat feature Minecraft rolled out, once APIs have updated I will look into rolling support for that into admin/party chat. + Comments should no longer get removed from config but I haven't added any code to add missing comments back in, for now if you want comments you can delete the config file to regenerate it (sorry for the inconvenience) Version 2.1.216 Reverted Unarmed changes from 2.1.215 (fixes block breaker/beserk active at all time for all players) diff --git a/pom.xml b/pom.xml index bb63483ee..5cea83d44 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.217-SNAPSHOT + 2.1.217 mcMMO https://github.com/mcMMO-Dev/mcMMO From 2b219f48ec9e177fa94dc0907bb543645b4e0f25 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sun, 7 Aug 2022 16:13:18 -0700 Subject: [PATCH 320/326] Dev mode --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 5cea83d44..8d1b20524 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.217 + 2.1.218-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO From 30ac82181e557a6e6dc28403d9390ceee7694111 Mon Sep 17 00:00:00 2001 From: Greymagic27 <46166848+Greymagic27@users.noreply.github.com> Date: Tue, 9 Aug 2022 15:35:12 +0100 Subject: [PATCH 321/326] Updated plugins to latest version (#4817) --- pom.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/pom.xml b/pom.xml index 8d1b20524..30afd4dff 100755 --- a/pom.xml +++ b/pom.xml @@ -75,7 +75,7 @@ maven-surefire-plugin - 3.0.0-M5 + 3.0.0-M7 org.junit.jupiter:junit-jupiter @@ -84,7 +84,7 @@ maven-failsafe-plugin - 3.0.0-M5 + 3.0.0-M7 org.junit.jupiter:junit-jupiter @@ -95,12 +95,12 @@ org.apache.maven.plugins maven-release-plugin - 2.5.2 + 3.0.0-M6 org.apache.maven.plugins maven-compiler-plugin - 3.8.1 + 3.10.1 16 @@ -130,7 +130,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.3.1-SNAPSHOT + 3.3.0 @@ -205,7 +205,7 @@ org.apache.maven.wagon wagon-file - 2.2 + 3.5.2 From 93c64a877077f7f3c86388765a11b0a4f47d2e78 Mon Sep 17 00:00:00 2001 From: MrPowerGamerBR <9496359+MrPowerGamerBR@users.noreply.github.com> Date: Sun, 4 Dec 2022 19:19:48 -0300 Subject: [PATCH 322/326] Fix pt_BR ability on typo (#4837) --- 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 cb8a98cd3..308cc0518 100644 --- a/src/main/resources/locale/locale_pt_BR.properties +++ b/src/main/resources/locale/locale_pt_BR.properties @@ -595,7 +595,7 @@ Commands.addlevels.AwardSkill.2={0} foi modificada(o) por {1}. Commands.addxp.AwardAll=&aVocê foi presenteado com {0} de experiência em todas as habilidades! Commands.addxp.AwardSkill=&aVocê foi presenteado com {0} de experiência em {1}! Commands.Ability.Off=Uso de habilidade &cDesativado -Commands.Ability.On=Uso de habilidade &Dtivado +Commands.Ability.On=Uso de habilidade &cAtivado Commands.Ability.Toggle=Uso de habilidade for alterado por &e{0} Commands.AdminChat.Off=Chat só para Admins &cDesativado Commands.AdminChat.On=Chat só para Admins &aAtivado From c865c2d2e372f74e90df3ecb76219ed2015ed92c Mon Sep 17 00:00:00 2001 From: DarkKnights22 Date: Sun, 4 Dec 2022 22:21:22 +0000 Subject: [PATCH 323/326] Fix bug where players could know staff are invis (#4833) * Fix bug where players could know staff are invis * remove whitespace --- .../nossr50/commands/player/InspectCommand.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) 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 5779147ea..f1b93b1af 100644 --- a/src/main/java/com/gmail/nossr50/commands/player/InspectCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/player/InspectCommand.java @@ -85,11 +85,19 @@ public class InspectCommand implements TabExecutor { } } - sender.sendMessage(LocaleLoader.getString("Inspect.Stats", target.getName())); + if (isVanished) { + sender.sendMessage(LocaleLoader.getString("Inspect.OfflineStats", playerName)); + } else { + 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 (!isVanished) { + sender.sendMessage(LocaleLoader.getString("Commands.PowerLevel", mcMMOPlayer.getPowerLevel())); + } } return true; From 59aecb79a1bddb71398eaa489a5d994d8d01a946 Mon Sep 17 00:00:00 2001 From: Daniil Z Date: Mon, 5 Dec 2022 01:21:44 +0300 Subject: [PATCH 324/326] Update Russian locale (#4832) Added/updated some lines Fixed new-line characters --- .../resources/locale/locale_ru.properties | 205 +++++++++--------- 1 file changed, 104 insertions(+), 101 deletions(-) diff --git a/src/main/resources/locale/locale_ru.properties b/src/main/resources/locale/locale_ru.properties index 8950be8fe..1698a5b04 100644 --- a/src/main/resources/locale/locale_ru.properties +++ b/src/main/resources/locale/locale_ru.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 @@ -138,14 +139,14 @@ 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.Roll.Mechanics=&7Кувырок - активный поднавык с пассивным компонентом.\nКогда вы получаете урон от падения, то у вас есть шанс полностью нивелировать урон в зависимости от уровня навыка. На уровне &e{6}&7 у вас есть &e{0}%&7 шанс избежать урон, и &e{1}%&7 если активирован Изящный кувырок.\nШанс увеличивается линейно на основе вашего уровня вплоть до уровня &e{2}&7, на котором навык достигает максимума. Каждый уровень Акробатики дает вам &e{3}%&7 шанса успеха.\nЗажав кнопку приседа, вы можете удвоить свои шансы на избежание урона от падения! Зажатие кнопки приседа переведет вашу способность Кувырок в состояние Грациозного кувырка.\nКувырок может нивелировать до &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.Roll.Text=&o**Кувырок** Acrobatics.SkillName=АКРОБАТИКА #ALCHEMY Alchemy.SubSkill.Catalysis.Name=Катализатор @@ -230,7 +231,7 @@ Excavation.Skills.GigaDrillBreaker.Refresh=&aВаше умение &eГига-б Excavation.Skills.GigaDrillBreaker.Other.Off=Гига-бур&a прекратил действие у &e{0} Excavation.Skills.GigaDrillBreaker.Other.On=&a{0}&2 использовал &cГига-бур! #FISHING -Fishing.ScarcityTip=&e&oВ этой зоне не практически не осталось рыбы - используй удочку в другом месте, хотя бы на {0} блоков дальше отсюда. +Fishing.ScarcityTip=&e&oВ этой зоне практически не осталось рыбы - используй удочку в другом месте, хотя бы на {0} блоков дальше отсюда. Fishing.Scared=&7&oХаотичные движения испугают рыбу! Fishing.Exhausting=&c&oНеправильное использование удочки вызывет усталость и износ удочки! Fishing.LowResourcesTip=&7Вы понимаете, что в этом районе осталось мало рыбы. Попробуйте рыбачить на {0} блоков дальше отсюда. @@ -241,7 +242,7 @@ 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.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=Шанс Охотника за чудесами @@ -260,7 +261,7 @@ Fishing.SubSkill.IceFishing.Description=Позволяет вам рыбачит Fishing.SubSkill.IceFishing.Stat=Подледная рыбалка Fishing.Chance.Raining=&9 Бонус дождя Fishing.Listener=Рыболовство: -Fishing.Ability.TH.MagicFound=&7Ты чувствуешь нечто чудотворное от этого улова... +Fishing.Ability.TH.MagicFound=&7Вы чувствуете нечто чудотворное от этого улова... Fishing.Ability.TH.Boom=&7ВРЕМЯ ВЗРЫВАТЬ!!! Fishing.Ability.TH.Poison=&7Пахнет чем-то сомнительным... Fishing.SkillName=РЫБОЛОВСТВО @@ -377,7 +378,7 @@ Repair.Arcane.Perfect=&aВы сохранили волшебную силу эт #SALVAGE Salvage.Pretty.Name=Разборка Salvage.SubSkill.UnderstandingTheArt.Name=Понимание искусства -Salvage.SubSkill.UnderstandingTheArt.Description=Вы не просто копаетесь в соседском мусоре - вы заботитесь об окружающей среде.!nasdУлучшает различные параметры Переработки. +Salvage.SubSkill.UnderstandingTheArt.Description=Вы не просто копаетесь в соседском мусоре - вы заботитесь об окружающей среде.\nУлучшает различные параметры Переработки. Salvage.SubSkill.ScrapCollector.Name=Коллекционер хлама Salvage.SubSkill.ScrapCollector.Description=Разбирайте предметы на материалы, качество разборки зависит от навыка и удачи. Salvage.SubSkill.ScrapCollector.Stat=Коллекционер хлама: &aРазбирайте до &e{0}&a предметов. Удача пригодится. @@ -406,7 +407,7 @@ Anvil.Unbreakable=Этот предмет неразрушим! #SWORDS Swords.Ability.Lower=&7Вы опустили свой меч. Swords.Ability.Ready=&4Вы &6подготовили&e свой меч. -Swords.Combat.Rupture.Note=&7ПРИМЕЧАНИЕ: &e1 тик происходит каждые 0.5 секунд! +Swords.Combat.Rupture.Note.Update.One=&7(Примечание о Разрыве): Периодический урон нелетальный, наносится дважды в секунду и игнорирует броню Swords.Combat.Bleeding.Started=&4 Вы истекаете кровью! Swords.Combat.Bleeding.Stopped=&7Кровотечение &aпрекратилось&7! Swords.Combat.Bleeding=&a**ВРАГ ИСТЕКАЕТ КРОВЬЮ** @@ -420,7 +421,7 @@ Swords.SubSkill.SerratedStrikes.Name=Рубящий удар Swords.SubSkill.SerratedStrikes.Description=Наносит часть урона по площади с шансом применить Разрыв! Swords.SubSkill.SerratedStrikes.Stat=Длительность Рубящего удара Swords.SubSkill.Rupture.Name=Разрыв -Swords.SubSkill.Rupture.Description=Накладывает сильное кровотечение +Swords.SubSkill.Rupture.Description=Постепенно наносит урон Swords.SubSkill.Stab.Name=Пронзание Swords.SubSkill.Stab.Description=Добавляет бонусный урон вашим атакам. Swords.SubSkill.Stab.Stat=Урон Пронзания @@ -428,10 +429,10 @@ 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.SubSkill.Rupture.Stat.Extra=&3Длительность Разрыва: &e{0}с.&a на игроках, &e{1}с.&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.SkillName=Мечи @@ -466,7 +467,7 @@ 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.CallOfTheWild.Description.2=&7ЗП: Присядьте и нажмите ЛКМ с\n {0} {1} (Оцелот), {2} {3} (Волк), {4} {5} (Лошадь) Taming.SubSkill.FastFoodService.Name=Быстрое Питание Taming.SubSkill.FastFoodService.Description=У волков есть шанс вылечиться при атаке Taming.SubSkill.HolyHound.Name=Святая гончая @@ -573,7 +574,7 @@ Combat.TargetDazed=Ваша цель &4Ошеломлена Combat.TouchedFuzzy=&4Вы истекаете кровью. Кружится голова. #COMMANDS ##generic -mcMMO.Description=&3О проекте &emcMMO&3:,&6mcMMO это RPG мод &cс открытым кодом&6, &6созданный в феврале 2011,&6за авторством &9nossr50&6. Его целью является обеспечение качественного RPG опыта в игре.,&3Подсказки:,&6 - &aИспользуйте &c/mcmmo help&a чтобы увидеть доступные комманды,&6 - &aНапечатайте &c/НАЗВАНИЕНАВЫКА&a чтобы увидеть детальную информацию о навыке,&3Разработчики:,&6 - &anossr50 &9(Создатель и Руководитель),&6 - &aelectronicboy &9(Разработчик),&6 - &akashike &9(Разработчик),&6 - &at00thpick1 &9(Поддержатель Классики) +mcMMO.Description=&3О проекте &emcMMO&3:,&6mcMMO это созданный в феврале 2011 RPG мод &cс открытым кодом,&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}. @@ -612,7 +613,7 @@ Commands.Inspect=<игрок> &a- Посмотреть детальную инф Commands.Invite.Success=&aПриглашение успешно отправлено. Commands.Leaderboards=<навык> <страница> &a- Таблица лидеров Commands.mcgod=&a- Переключить режим бога -Commands.mchud.Invalid=Это неправильный тип HUD'а. +Commands.mchud.Invalid=Это неправильный тип HUD''а. Commands.mcpurge.Success=&aБаза данных успешно очищена! Commands.mcrank.Heading=&6-=ПЕРСОНАЛЬНЫЙ РЕЙТИНГ=- Commands.mcrank.Overall=Общий&a - &6Ранг &f#&a{0} @@ -643,11 +644,11 @@ 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.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[[ITALIC]]{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отключен @@ -873,102 +874,102 @@ Guides.Page.Invalid=Неправильный номер страницы! Guides.Page.OutOfRange=Этой страницы не существует - есть лишь {0} страниц. Guides.Usage= Используйте /{0} ? [страница] ##Acrobatics -Guides.Acrobatics.Section.0=&3О навыке Акробатика:!nasd&eАкробатика - это навык грациозного передвижения в mcMMO.!nasd&eОн дает бонусы в бою и защищает от природных повреждений.!nasd!nasd&3Получение опыта:!nasd&eЧтобы получать опыт в этом навыке, нужно выполнять уклонения !nasd&eв бою или падать с большой высоты, получая урон. -Guides.Acrobatics.Section.1=&3Как работает умение Кувырок?!nasd&eУ вас есть шанс свести на нет урон, получаемый при падении.!nasd&eЕсли во время падения держать кнопку приседа,!nasd&eто этот шанс можно удвоить.!nasd&eЭто вызовет Грациозный кувырок, вместо стандартного.!nasd&eГрациозные кувырки похожи на обычные, но происходят в два!nasd&eраза реже и дают большую защиту при падении.!nasd&eШанс на удачный Кувырок зависит от уровня навыка. -Guides.Acrobatics.Section.2=&3Как работает умение Уклонение?!nasd&eБлагодаря этому умению у вас есть шанс уклониться!nasd&eво время бытвы, что вдвое уменьшит полученный урон.!nasd&eШанс на удачное Уклонение зависит от уровня навыка. +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раза реже и дают большую защиту при падении.\n&eШанс на удачный Кувырок зависит от уровня навыка. +Guides.Acrobatics.Section.2=&3Как работает умение Уклонение?\n&eБлагодаря этому умению у вас есть шанс уклониться\n&eво время бытвы, что вдвое уменьшит полученный урон.\n&eШанс на удачное Уклонение зависит от уровня навыка. ##Alchemy -Guides.Alchemy.Section.0=&3О навыке Алхимия:!nasd&eАлхимия - это производство зелий.!nasd&eОна обеспечивает ускорение варки зелий, а также!nasd&eдобавляет новые, ранее недоступные зелий.!nasd!nasd!nasd&3ПОЛУЧЕНИ ОПЫTА:!nasd&eЧтобы получить опыт в этом навыке, необходимо варить зелья. -Guides.Alchemy.Section.1=&3Как работает умение Катализатор?!nasd&eКатализатор ускоряет процесс варки до!nasd&eскорости 4x на уровне 1000.!nasd&eЭто умение разблокируется на уровне 100. -Guides.Alchemy.Section.2=&3Как работает умение Отвары?!nasd&eОтвары позволяют варить больше зелий с новыми ингредиентами.!nasd&eОт вашего ранга зависит какие ингредиенты!nasd&eбудут разблокированы. Всего доступно 8 рангов. -Guides.Alchemy.Section.3=&3Ингредиенты 1 ранга Отваров:!nasd&eОгненный порошок, Маринованный паучий глаз, Слеза гаста, Редстоун,!nasd&eСветокаменная пыль, Сахар, Сверкающий ломтик арбуза, Золотая морковь,!nasd&eСгусток магмы, Незерский нарост, Паучий глаз, Порох, Кувшинка,!nasd&eИглобрюх!nasd&e(Ванильные зелья) -Guides.Alchemy.Section.4=&3Ингредиенты 2 ранга Отваров:!nasd&eМорковь (Зелье скорости)!nasd&eСлизь (Зелье тупости)!nasd!nasd&3Ингредиенты 3 ранга Отваров:!nasd&eКварц (Зелье поглощения)!nasd&eМухомор (Зелье прыгучести) -Guides.Alchemy.Section.5=&3Ингредиенты 4 ранга Отваров:!nasd&eЯблоко (Зелье доп. здоровья)!nasd&eГнилая Плоть (Зелье голода)!nasd!nasd&3Ингредиенты 5 ранга Отваров:!nasd&eКоричневый гриб (Зелье тошноты)!nasd&eЧернильный мешок (Зелье слепоты) -Guides.Alchemy.Section.6=&3Ингредиенты 6 ранга Отваров:!nasd&eПапоротник (Зелье насыщения)!nasd!nasd&3Ингредиенты 7 ранга Отваров:!nasd&eЯдовитый картофель (Зелье загнивания)!nasd!nasd&3Ингредиенты 8 ранга Отваров:!nasd&eОбычное золотое яблоко (Зелье защиты) +Guides.Alchemy.Section.0=&3О навыке Алхимия:\n&eАлхимия - это производство зелий.\n&eОна обеспечивает ускорение варки зелий, а также\n&eдобавляет новые, ранее недоступные зелий.\n\n\n&3ПОЛУЧЕНИ ОПЫTА:\n&eЧтобы получить опыт в этом навыке, необходимо варить зелья. +Guides.Alchemy.Section.1=&3Как работает умение Катализатор?\n&eКатализатор ускоряет процесс варки до\n&eскорости 4x на уровне 1000.\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&3Ингредиенты 8 ранга Отваров:\n&eОбычное золотое яблоко (Зелье защиты) ##Archery -Guides.Archery.Section.0=&3О навыке Стрельба:!nasd&eНавык Стрельбы направлен на ваши лук и стрелы.!nasd&eОн дает различные бонусы, вроде увеличение урона,!nasd&eвозрастающего с уровнем, а также умение ошеломить!nasd&eпротивника в ПвП. Также вы получаете возможность!nasd&eвернуть часть стрел с поверженных врагов.!nasd!nasd&3ПОЛУЧЕНИЕ ОПЫТА:!nasd&eЧтобы получать опыт в этом навые, необходимо стрелять!nasd&eв мобов или других игроков. -Guides.Archery.Section.1=&3Как работает умение Умелый выстрел?!nasd&eУмелый выстрел наносит дополнительный урон при стрельбе.!nasd&eДополнительный урон при Умелом выстреле растет с!nasd&e вашим уровнем навыка Стрельбы. !nasd&eПо умолчанию, урон от стрельбы увеличивается на 10% !nasd&eкаждые 50 уровней, вплоть до 200% бонусного урона. -Guides.Archery.Section.2=&3Как работает умение Ошеломление?!nasd&eВы имеете пассивный шанс Ошеломить других игроков,!nasd&eстреляя в них. Ошеломление вынуждает вашего оппонента !nasd&eсмотреть строго вверх на протяжении небольшого времени.!nasd&eОшеломление дополнительно наносит 4 урона (2 сердца). -Guides.Archery.Section.3=&3Как работает умение Возвращение стрел?!nasd&eУ вас есть пассивный шанс вернуть часть своих!nasd&eстрел после убийства моба с помощью лука.!nasd&eЭтот шанс растет с уровнем навыка Стрельбы.!nasd&eУмение растет на 0,1% с каждым уровнем, вплоть!nasd&eдо 100% на 1000 уровне. +Guides.Archery.Section.0=&3О навыке Стрельба:\n&eНавык Стрельбы направлен на ваши лук и стрелы.\n&eОн дает различные бонусы, вроде увеличение урона,\n&eвозрастающего с уровнем, а также умение ошеломить\n&eпротивника в ПвП. Также вы получаете возможность\n&eвернуть часть стрел с поверженных врагов.\n\n&3ПОЛУЧЕНИЕ ОПЫТА:\n&eЧтобы получать опыт в этом навые, необходимо стрелять\n&eв мобов или других игроков. +Guides.Archery.Section.1=&3Как работает умение Умелый выстрел?\n&eУмелый выстрел наносит дополнительный урон при стрельбе.\n&eДополнительный урон при Умелом выстреле растет с\n&e вашим уровнем навыка Стрельбы. \n&eПо умолчанию, урон от стрельбы увеличивается на 10% \n&eкаждые 50 уровней, вплоть до 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&eдо 100% на 1000 уровне. ##Axes -Guides.Axes.Section.0=&3О навыке Топоры:!nasd&eС навыком Топоры вы сможете использовать свой топор не!nasd&eтолько для рубки леса! Вы сможете кромсать мобов!nasd&eи игроков для получения опыта, наносить им смертельные!nasd&eкритические повреждения и отбрасывать от себя.!nasd&eТакже ваш топор становится инструментом для быстрого и!nasd&eлегкого разрушения брони противников.!nasd&eЧем выше ваш уровень навыка, тем быстрее разрушается броня.!nasd&3ПОЛУЧЕНИЕ ОПЫТА:!nasd&eЧтобы получать опыт в этом навыке, вы должны топором !nasd&eнаносить повреждения мобам или другим игрокам. -Guides.Axes.Section.1=&3Как работает умение Раскалыватель черепов?!nasd&eЭто умение позволяет вам наносить удар по области. После этого удара!nasd&eвсе в области получат половину урона, нанесенного вами главной цели,!nasd&eтак что это хороший способ быстро уничтожать скопления мобов. -Guides.Axes.Section.2=&3Как работает умение Критический удар?!nasd&eКритический удар - пассивное умение, которое дает вам шанс!nasd&eнанести дополнительный урон.!nasd&eКаждые 2 уровня навыка Топоров дают вам +0,1%!nasd&eшанс нанести Критический удар, из-за которого мобы получат!nasd&eурон x2, а другие игроки x1,5. -Guides.Axes.Section.3=&3Как работает умение Мастерство топора?!nasd&eМастерство топора - пассивное умение, которое наносит!nasd&eдополнительный урон при ваших атаках топором.!nasd&eБонусный урон возрастает на 1 каждые 50 уровней!nasd&eнавыка, вплоть до 4 дополнительного урона на 200 уровне. -Guides.Axes.Section.4=&3Как работает умение Бронебойный удар?!nasd&eБейте с такой силой, чтобы сокрушать броню врагов!!nasd&eБронебойный удар дает вам пассивный шанс повредить броню!nasd&eвашего оппонента. Сила повреждений зависит от уровня навыка. -Guides.Axes.Section.5=&3Как работает умение Мощный удар?!nasd&eВы имеете пассивный шанс нанести Мощный удар, сражаясь с !nasd&eтопором против мобов или других игроков. По умолчанию, !nasd&eэтот шанс равен 25%. Это пассивное умение дает эффект!nasd&eсильного откидывания, как при зачаровании Откидывание II!nasd&eК тому же этот удар наносит дополнительные повреждения. +Guides.Axes.Section.0=&3О навыке Топоры:\n&eС навыком Топоры вы сможете использовать свой топор не\n&eтолько для рубки леса! Вы сможете кромсать мобов\n&eи игроков для получения опыта, наносить им смертельные\n&eкритические повреждения и отбрасывать от себя.\n&eТакже ваш топор становится инструментом для быстрого и\n&eлегкого разрушения брони противников.\n&eЧем выше ваш уровень навыка, тем быстрее разрушается броня.\n&3ПОЛУЧЕНИЕ ОПЫТА:\n&eЧтобы получать опыт в этом навыке, вы должны топором \n&eнаносить повреждения мобам или другим игрокам. +Guides.Axes.Section.1=&3Как работает умение Раскалыватель черепов?\n&eЭто умение позволяет вам наносить удар по области. После этого удара\n&eвсе в области получат половину урона, нанесенного вами главной цели,\n&eтак что это хороший способ быстро уничтожать скопления мобов. +Guides.Axes.Section.2=&3Как работает умение Критический удар?\n&eКритический удар - пассивное умение, которое дает вам шанс\n&eнанести дополнительный урон.\n&eКаждые 2 уровня навыка Топоров дают вам +0,1%\n&eшанс нанести Критический удар, из-за которого мобы получат\n&eурон x2, а другие игроки x1,5. +Guides.Axes.Section.3=&3Как работает умение Мастерство топора?\n&eМастерство топора - пассивное умение, которое наносит\n&eдополнительный урон при ваших атаках топором.\n&eБонусный урон возрастает на 1 каждые 50 уровней\n&eнавыка, вплоть до 4 дополнительного урона на 200 уровне. +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О навыке Раскопки:!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Так что, на разных серверах находки могут сильно отличаться. +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подходящих блоков, что активирует умение Гига-бур. +Guides.Excavation.Section.3=&3Что такое Гига-бур?\n&eГига-бур - это умение с откатом, связанное\n&eс навыком Раскопок. Оно утраивает шанс\n&eнайти сокровища и дает возможность\n&eразрушать подходящие блоки с одного удара. +Guides.Excavation.Section.4=&3Как работает умение Археология?\n&eВсе сокровища навыка Раскопок имеют свой\n&eтребуемый уровень навыка, так что сложно сказать,\n&eнасколько сильно вам поможет этот навык.\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О навыке Рыболовство:!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так что на разных серверах и добыча может быть разная. +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Чем больше уровень навыка Рыболовство,\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Это умение увеличивает качество утоления голода\n&eпри поедании рыбы. +Guides.Fishing.Section.6=&3Примечания о Рыболовстве:\n&eПредметы при рыбалке полностью настраиваемы,\n&eтак что на разных серверах и добыча может быть разная. ##Herbalism -Guides.Herbalism.Section.0=&3О навыке Травничество:!nasd&eТравничество - это все что, касается сбора трав и растений.!nasd!nasd&3ПОЛУЧЕНИЕ ОПЫТА:!nasd&eСобирайте травы и растения. -Guides.Herbalism.Section.1=&3Подходящие растения:!nasd&eПшеница, Картошка, Морковь, Арбузы, !nasd&eТыквы, Сахарный тростник, Какао-бобы, Цветы, Кактусы,!nasd&eГрибы, Незерский нарост, Кувшинки, Лианы. -Guides.Herbalism.Section.2=&3Как работает умение Озеленение?!nasd&eОзеленение - активное умение, которое!nasd&eактивируется нажатием ПКМ с мотыгой в руке.!nasd&eОзеленение дает шанс 3x добычи при сборе!nasd&eрастений. Также оно дает возможность !nasd&eвселить жизнь в мертвые блоки, трансформировать их !nasd&eиспользуя семена из вашего инвентаря. -Guides.Herbalism.Section.3=&3Как работает умение Живительное прикосновение (на урожай)?!nasd&eЭто пассивное умение дает вам шанс автоматически!nasd&eпосадить новые растения при сборе уже созревших. !nasd&eЭтот шанс зависит от уровня навыка Травничество. -Guides.Herbalism.Section.4=&3Как работает умение Живительное прикосновение (на камень/грязь)?!nasd&eЭто активное умение позволяет вам превращать мертвые блоки в их!nasd&e"живые" варианты. Вы можете сделать это, кликнув ПКМ!nasd&eна блок с семенами в руке. Это потратит 1 семечко. -Guides.Herbalism.Section.5=&3Как работает умение Фермерская диета?!nasd&eЭто умение увеличивает качество утоления голода!nasd&eпри поедании хлеба, печенья, арбуза, грибного супа,!nasd&eморкови и картошки. -Guides.Herbalism.Section.6=&3Как работает умение Хайлийская удача?!nasd&eЭто пассивное умение дает вам шанс найти редкие!nasd&eпредметы, ломая мечем определенные блоки. -Guides.Herbalism.Section.7=&3Как работает умение Двойная добыча?!nasd&eЭто пассивное умение дает больше урожая при!nasd&eво время его сбора. +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Озеленение дает шанс 3x добычи при сборе\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на блок с семенами в руке. Это потратит 1 семечко. +Guides.Herbalism.Section.5=&3Как работает умение Фермерская диета?\n&eЭто умение увеличивает качество утоления голода\n&eпри поедании хлеба, печенья, арбуза, грибного супа,\n&eморкови и картошки. +Guides.Herbalism.Section.6=&3Как работает умение Хайлийская удача?\n&eЭто пассивное умение дает вам шанс найти редкие\n&eпредметы, ломая мечем определенные блоки. +Guides.Herbalism.Section.7=&3Как работает умение Двойная добыча?\n&eЭто пассивное умение дает больше урожая при\n&eво время его сбора. ##Mining -Guides.Mining.Section.0=&3О навыке Шахтерство:!nasd&eШахтерство включает в себя добычу камня и руд. Оно дает шанс,!nasd&eчто некоторые редкие материалы будут найдены во время добычи.!nasd!nasd&3ПОЛУЧЕНИЕ ОПЫТА:!nasd&eЧтобы получать опыт, вы должны вести добычу с киркой в руке.!nasd&eОпыт дается за добычу определенных блоков. -Guides.Mining.Section.1=&3Подходящие блоки:!nasd&eКамень, Каменный уголь, Железная руда, Золотая руда, Алмазная руда,!nasd&eРедстоуновая руда, Лазуритовая руда, Обсидиан, Замшелый булыжник,!nasd&eЭндерняк, Светящийся камень, Незерак. -Guides.Mining.Section.2=&3Как использовать умение Суперкрушитель:!nasd&eС киркой в руке кликните ПКМ, чтобы подготовить инструмент.!nasd&eПосле этого у вас есть около 4 секунд для начала добычи!nasd&eподходящих блоков, что активирует умение Суперкрушитель. -Guides.Mining.Section.3=&3Что такое Суперкрушитель?!nasd&eСуперкрушитель - это умение, связанное с навыком Шахтерство.!nasd&eОно утраивает шанс получить дополнительные предметы и!nasd&eразрушает подходящие блоки с одного удара. -Guides.Mining.Section.4=&3Как использовать умение Подрывная добыча:!nasd&eС киркой в руке,!nasd&eприсядьте и нажмите ПКМ по динамиту с расстояния. Это !nasd&eмгновенно приведет к подрыву динамита. -Guides.Mining.Section.5=&3Как работает умение Подрывная добыча?!nasd&eПодрывная добыча - умение с откатом, связанное с навыком!nasd&eШахтерство. Оно дает бонусы при добыче с динамитом и позволяет!nasd&eвзрывать его на расстоянии. Есть три особенности Подрывной добычи. !nasd&eПервая - умение Большие бомбы, которое увеличивает радиус!nasd&eвзрыва динамита. Вторая - умение Экспертиза подрывов, которое уменьшает !nasd&eполученные вами повреждения от взрыва TNT. Третья - уменьшение!nasd&eдобычи простых камней и увеличение добычи полезных руд. +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Оно утраивает шанс получить дополнительные предметы и\n&eразрушает подходящие блоки с одного удара. +Guides.Mining.Section.4=&3Как использовать умение Подрывная добыча:\n&eС киркой в руке,\n&eприсядьте и нажмите ПКМ по динамиту с расстояния. Это \n&eмгновенно приведет к подрыву динамита. +Guides.Mining.Section.5=&3Как работает умение Подрывная добыча?\n&eПодрывная добыча - умение с откатом, связанное с навыком\n&eШахтерство. Оно дает бонусы при добыче с динамитом и позволяет\n&eвзрывать его на расстоянии. Есть три особенности Подрывной добычи. \n&eПервая - умение Большие бомбы, которое увеличивает радиус\n&eвзрыва динамита. Вторая - умение Экспертиза подрывов, которое уменьшает \n&eполученные вами повреждения от взрыва TNT. Третья - уменьшение\n&eдобычи простых камней и увеличение добычи полезных руд. ##Repair -Guides.Repair.Section.0=&3О навыке Ремонт:!nasd&eРемонт позволяет использовать железный блок для починки!nasd&eброни и инструментов.!nasd!nasd&3Получение опыта:!nasd&eЧините инструменты и броню, используя наковальню mcMMO. !nasd&eНаковальней является поставленный железный блок, и её!nasd&eне следует путать с обычной наковальней. -Guides.Repair.Section.1=&3Как использовать навык Ремонт?!nasd&eРазместите наковальню mcMMO и кликните по ней ПКМ для!nasd&eпочинки предмета в руке. Расходует 1 сырье за использование. -Guides.Repair.Section.2=&3Как работает умение Мастерство ремонта?!nasd&eУмение Мастерство ремонта повышает эффективность починки.!nasd&eЭффективность зависит от уровня навыка Ремонта. -Guides.Repair.Section.3=&3Как работает умение Суперремонт?!nasd&eСуперремонт - это пассивное умение. При починке!nasd&eпредмета оно дает вам шанс отремонтировать его!nasd&eс двойной эффективностью. -Guides.Repair.Section.4=&3Как работает умение Волшебная ковка?!nasd&eЭто пассивное умение позволяет вам ремонтировать предметы!nasd&eс определенным шансом сохранить их зачарование. !nasd&eЭто зачарование может остаться на прежнем уровне,!nasd&eснизиться, или вовсе исчезнуть. +Guides.Repair.Section.0=&3О навыке Ремонт:\n&eРемонт позволяет использовать железный блок для починки\n&eброни и инструментов.\n\n&3Получение опыта:\n&eЧините инструменты и броню, используя наковальню mcMMO. \n&eНаковальней является поставленный железный блок, и её\n&eне следует путать с обычной наковальней. +Guides.Repair.Section.1=&3Как использовать навык Ремонт?\n&eРазместите наковальню mcMMO и кликните по ней ПКМ для\n&eпочинки предмета в руке. Расходует 1 сырье за использование. +Guides.Repair.Section.2=&3Как работает умение Мастерство ремонта?\n&eУмение Мастерство ремонта повышает эффективность починки.\n&eЭффективность зависит от уровня навыка Ремонта. +Guides.Repair.Section.3=&3Как работает умение Суперремонт?\n&eСуперремонт - это пассивное умение. При починке\n&eпредмета оно дает вам шанс отремонтировать его\n&eс двойной эффективностью. +Guides.Repair.Section.4=&3Как работает умение Волшебная ковка?\n&eЭто пассивное умение позволяет вам ремонтировать предметы\n&eс определенным шансом сохранить их зачарование. \n&eЭто зачарование может остаться на прежнем уровне,\n&eснизиться, или вовсе исчезнуть. ##Salvage -Guides.Salvage.Section.0=&3О Разборке:!nasd&eРазборка позволяет вам использовать золотой блок для переработки брони и!nasd&eинструментов.!nasd!nasd&3ПОЛУЧЕНИЕ ОПЫТА:!nasd&eРазборка это дочерний навык Починки и Рыбалки. Ваш уровень!nasd&eразборки зависит от ваших уровней Починки и Рыбалки. -Guides.Salvage.Section.1=&3Как работает Разборка?!nasd&eРазместите Разборочную наковальню mcMMO и кликните по !nasd&eней ПКМ, чтобы разобрать предмет в руке. Это уничтожит!nasd&eпредмет и вернет использованные на него материалы.!nasd!nasd&eНапример, разборка железной кирки вернет вам железные слитки. -Guides.Salvage.Section.2=&3Как работает умение Улучшенная разборка?!nasd&eЭто умение позволяет перерабатывать поврежденные вещи.!nasd&eКачество разборки повышается вместе с уровнем. Чем оно больше,!nasd&eтем больше материалов вы сможете получить обратно.!nasd&eС Улучшенной разборкой вы будете всегда получать 1 материал обратно,!nasd&eкроме случаев, когда предмет слишком поврежден. Вам не нужно волноваться!nasd&eоб уничтожении предметов без получения чего-то обратно. -Guides.Salvage.Section.3=&3Чтобы показать, как это работает, вот пример:!nasd&eПредположим мы разбираем золотую кирку, которая повреждена на 20%.!nasd&eЭто значит, что максимальное количество слитков, которое вы можете!nasd&eполучить - всего 2 (потому что кирка требует 3 слитка - каждый стоит!nasd&e33,33% прочности), что эквивалентно 66%. Если ваше качество!nasd&eразборки ниже 66%, то вы не сможете получить 2 слитка.!nasd&eЕсли он выше этого значения, то вы сможете получить "полную стоимость",!nasd&eчто значит - вы получите 2 слитка. -Guides.Salvage.Section.4=&3Как работает Магическая разборка?!nasd&eЭта способность позволяет вам получать книги зачарования, когда вы!nasd&eразбираете зачарованные предметы. В зависимости от шанса успеха!nasd&eвы можете получить полную все или лишь часть зачарований.!nasd!nasd&eКогда вы извлекаете часть зачарований, то зачарования!nasd&eна книге будет иметь меньший уровень, чем зачарования,!nasd&eкоторые были на предмете. +Guides.Salvage.Section.0=&3О Разборке:\n&eРазборка позволяет вам использовать золотой блок для переработки брони и\n&eинструментов.\n\n&3ПОЛУЧЕНИЕ ОПЫТА:\n&eРазборка это дочерний навык Починки и Рыбалки. Ваш уровень\n&eразборки зависит от ваших уровней Починки и Рыбалки. +Guides.Salvage.Section.1=&3Как работает Разборка?\n&eРазместите Разборочную наковальню mcMMO и кликните по \n&eней ПКМ, чтобы разобрать предмет в руке. Это уничтожит\n&eпредмет и вернет использованные на него материалы.\n\n&eНапример, разборка железной кирки вернет вам железные слитки. +Guides.Salvage.Section.2=&3Как работает умение Улучшенная разборка?\n&eЭто умение позволяет перерабатывать поврежденные вещи.\n&eКачество разборки повышается вместе с уровнем. Чем оно больше,\n&eтем больше материалов вы сможете получить обратно.\n&eС Улучшенной разборкой вы будете всегда получать 1 материал обратно,\n&eкроме случаев, когда предмет слишком поврежден. Вам не нужно волноваться\n&eоб уничтожении предметов без получения чего-то обратно. +Guides.Salvage.Section.3=&3Чтобы показать, как это работает, вот пример:\n&eПредположим мы разбираем золотую кирку, которая повреждена на 20%.\n&eЭто значит, что максимальное количество слитков, которое вы можете\n&eполучить - всего 2 (потому что кирка требует 3 слитка - каждый стоит\n&e33,33% прочности), что эквивалентно 66%. Если ваше качество\n&eразборки ниже 66%, то вы не сможете получить 2 слитка.\n&eЕсли он выше этого значения, то вы сможете получить "полную стоимость",\n&eчто значит - вы получите 2 слитка. +Guides.Salvage.Section.4=&3Как работает Магическая разборка?\n&eЭта способность позволяет вам получать книги зачарования, когда вы\n&eразбираете зачарованные предметы. В зависимости от шанса успеха\n&eвы можете получить полную все или лишь часть зачарований.\n\n&eКогда вы извлекаете часть зачарований, то зачарования\n&eна книге будет иметь меньший уровень, чем зачарования,\n&eкоторые были на предмете. ##Smelting Guides.Smelting.Section.0=Скоро... ##Swords -Guides.Swords.Section.0=&3О навыке Мечи:!nasd&eЭтот навык дает различные бонусы при битве мечем.!nasd!nasd&3ПОЛУЧЕНИЕ ОПЫТА:!nasd&eОпыт начисляется в зависимости от урона, нанесенного!nasd&eмобам или другим игрокам при помощи меча. -Guides.Swords.Section.1=&3Как работает умение Рубящий удар?!nasd&eРубящий удар - активное умение, которое активируется!nasd&eнажатием ПКМ с мечем в руке. Это умение позволяет совершить!nasd&eудар по области, что наносящий дополнительно 25% урона!nasd&eи вызовет эффект кровотечения, который продлится 5 тиков. -Guides.Swords.Section.2=&3Как работает умение Контратака?!nasd&eКонтратака - это активное умение, которое дает шанс при!nasd&eпри блокировании ударов отразить 50% полученного урона. -Guides.Swords.Section.3=&3Как работает умение Разрыв?!nasd&eРызрыв наносит противникам урон каждые 2 секунды.!nasd&eЦель будет кровоточить, пока не прекратится действие эффекта!nasd&eили не наступит смерть.!nasd&eПродолжительность эффекта зависит от уровня навыка Мечей. +Guides.Swords.Section.0=&3О навыке Мечи:\n&eЭтот навык дает различные бонусы при битве мечем.\n\n&3ПОЛУЧЕНИЕ ОПЫТА:\n&eОпыт начисляется в зависимости от урона, нанесенного\n&eмобам или другим игрокам при помощи меча. +Guides.Swords.Section.1=&3Как работает умение Рубящий удар?\n&eРубящий удар - активное умение, которое активируется\n&eнажатием ПКМ с мечем в руке. Это умение позволяет совершить\n&eудар по области, что наносящий дополнительно 25% урона\n&eи может вызвать эффект Разрыва. +Guides.Swords.Section.2=&3Как работает умение Контратака?\n&eКонтратака - это активное умение, которое дает шанс при\n&eпри блокировании ударов отразить 50% полученного урона. +Guides.Swords.Section.3=&3Как работает умение Разрыв?\n&eРызрыв наносит противникам урон каждые 2 секунды.\n&eЦель будет кровоточить, пока не прекратится действие эффекта\n&eили не наступит смерть.\n&eПродолжительность эффекта зависит от уровня навыка Мечей. ##Taming -Guides.Taming.Section.0=&3О навыке Укрощение:!nasd&eУкрощение дает различные бонусы в битвах вместе!nasd&eс прирученными волками.!nasd!nasd&3ПОЛУЧЕНИЕ ОПЫТА:!nasd&eЧтобы получать опыт в этом навыке, вам нужно приручать волков!nasd&eили оцелотов, а также сражаться при помощи волков. -Guides.Taming.Section.1=&3Как работает умение Зов природы?!nasd&eЗов природы - это активное умение, которое позволяет вам!nasd&eпризывать к себе прирученных волков или оцелотов. Это можно!nasd&eсделать присев и нажав ЛКМ, держа в руке кости или рыбу. -Guides.Taming.Section.2=&3Как работает умение Познание зверей?!nasd&eПознание зверей позволяет проверять питомцев!nasd&eи получать статы о них. Кликните ЛКМ костью по волку или !nasd&eоцелоту, чтобы использовать умение Познание зверей. -Guides.Taming.Section.3=&3Как работает умение Укус?!nasd&eУкус - пассивное умение, дающее шанс того, что!nasd&eатака ваших волков приведет к кровотечению цели. -Guides.Taming.Section.4=&3Как работает умение Острые когти?!nasd&eОстрые когти позволяет вашими волкам наносить бонусный!nasd&eурон, который зависит от уровня навыка Укрощение. -Guides.Taming.Section.5=&3Как работает умение Знание среды?!nasd&eЭто пассивное умение, позволяющее вашим волкам телепортироватся!nasd&eк вам, если им угрожает опасность, например кактус или лава. Оно также!nasd&eдает вашим волкам иммунитет к получению урона при падении. -Guides.Taming.Section.6=&3Как работает умение Густой мех?!nasd&eЭто пассивное умение, уменьшающее получаемый вашими!nasd&eволками урон и наделяющее их огнестойкостью. -Guides.Taming.Section.7=&3Как работает умение Ударопрочность?!nasd&eЭто пассивное умение, уменьшающее получаемый!nasd&eвашими волками урон при взрывах. -Guides.Taming.Section.8=&3Как работает умение Быстрое питание?!nasd&eЭто пассивное умение, дающее вашим волкам шанс!nasd&eисцелиться, когда они атакуют кого-либо. +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и получать статы о них. Кликните ЛКМ костью по волку или \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О навыке Безоружный:!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то есть приводит к выпадению на землю оружия противника. +Guides.Unarmed.Section.0=&3О навыке Безоружный:\n&eНавык Безоружный дает различные боевые бонусы, когда\n&eвы используете ваши кулаки как оружие.\n\n&3ПОЛУЧЕНИЕ ОПЫТА:\n&eКоличество получаемого опыта зависит от урона, нанесенного\n&eкулаками мобам или другим игрокам. +Guides.Unarmed.Section.1=&3Как работает умение Берсерк?\n&eБерсерк - это активное умение, которое активируется нажатием ПКМ.\n&eВ режиме берсерка вы будете наносить на 50% больше урона и\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О навыке Лесорубство:!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дополнительного блока древесины при рубке. +Guides.Woodcutting.Section.0=&3О навыке Лесорубство:\n&eЛесорубство - это все, что касается рубки деревьев.\n\n&3ПОЛУЧЕНИЕ ОПЫТА:\n&eОпыт дается при разрушении блоков древесины. +Guides.Woodcutting.Section.1=&3Как работает умение Дровосек?\n&eДровосек - это активное умение, которое активируется\n&eнажатием ПКМ с топором в руке. Это приведет к тому, \n&eчто все дерево вмиг будет срублено, а все блоки древесины\n&eвыпадут за раз. +Guides.Woodcutting.Section.2=&3Как работает умение Сдуватель листьев?\n&eСдуватель листьев - пассивное умение, которое приводит\n&eк тому, что блоки листвы вмиг разрушаются при ударе топором. \n&eЭто умение разблокируется на уровне 100. +Guides.Woodcutting.Section.3=&3Как работает умение Двойная добыча?\n&eЭто пассивное умение, дающее шанс выпадения\n&eдополнительного блока древесины при рубке. #INSPECT Inspect.Offline= &cУ вас нет прав проверять игроков не в сети! Inspect.OfflineStats=Статы mcMMO игрока не сети &e{0} @@ -1044,7 +1045,7 @@ MOTD.Version=&6[mcMMO] Используется версия &3{0} MOTD.Website=&6[mcMMO] &a{0}&e - сайт mcMMO #SMELTING Smelting.SubSkill.UnderstandingTheArt.Name=Понимание искусства -Smelting.SubSkill.UnderstandingTheArt.Description=Возможно, вы тратите слишком много времени переплавляя руды в пещерах.!nasdУлучшает различные параметры Переплавки. +Smelting.SubSkill.UnderstandingTheArt.Description=Возможно, вы тратите слишком много времени переплавляя руды в пещерах.\nУлучшает различные параметры Переплавки. Smelting.SubSkill.UnderstandingTheArt.Stat=Множитель обычного опыта: &e{0}x Smelting.Ability.Locked.0=ЗАБЛОКИРОВАНО ДО {0}+ НАВЫКА (УВЕЛИЧЕНИЕ ОБЫЧНОГО ОПЫТА) Smelting.Ability.Locked.1=ЗАБЛОКИРОВАНО ДО {0}+ НАВЫКА (ФЛЮСОВАЯ ДОБЫЧА) @@ -1114,12 +1115,12 @@ Scoreboard.Misc.Ability=Умение 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}. +Profile.Loading.FailureNotice=&4[А]&c mcMMO не смог загрузить данные игрока &e{0}&c. &dПожалуйста, проверьте ваши параметры базы данных. Попыток загрузки данных: {1}. #Holiday Holiday.AprilFools.Levelup=&6{0} теперь уровня &a{1}&6! -Holiday.Anniversary=&9С {0} Годовщиной!!nasd&9В честь всей проделанной nossr50 работы, а также других разработчиков, да будут фейерверки! +Holiday.Anniversary=&9С {0} Годовщиной!\n&9В честь всей проделанной nossr50 работы, а также других разработчиков, да будут фейерверки! #Reminder Messages -Reminder.Squelched=&7Напоминание: В настоящее время вы не получаете уведомления от mcMMO; чтобы включить уведомления, пожалуйста, введите команду /mc!nasdotify снова. Это автоматическое почасовое напоминание. +Reminder.Squelched=&7Напоминание: В настоящее время вы не получаете уведомления от mcMMO; чтобы включить уведомления, пожалуйста, введите команду /mcnotify снова. Это автоматическое почасовое напоминание. #Locale Locale.Reloaded=&aЛокализация перезагружена! #Player Leveling Stuff @@ -1127,7 +1128,7 @@ LevelCap.PowerLevel=&6(&amcMMO&6) &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 и о том, работает ли режим совместимости или нет. +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 для сброса настроек. @@ -1142,3 +1143,5 @@ 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... +Scoreboard.Disabled=Таблицы mcMMO отключены на этом сервере. Эту настройку можно найти в mcMMO/config.yml +Scoreboard.NotSetupYet=Ваша таблица mcMMO ещё не подготовлена, попробуйте позже. From 75822472fc4d029f72cb066c197afcc7ad2ed71b Mon Sep 17 00:00:00 2001 From: destro174 <40720638+destro174@users.noreply.github.com> Date: Sun, 4 Dec 2022 23:22:37 +0100 Subject: [PATCH 325/326] Add item in mainhand when spawning in lumber bonus blocks. (#4826) --- .../gmail/nossr50/skills/woodcutting/WoodcuttingManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 e894d22ab..891399070 100644 --- a/src/main/java/com/gmail/nossr50/skills/woodcutting/WoodcuttingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/woodcutting/WoodcuttingManager.java @@ -379,6 +379,6 @@ public class WoodcuttingManager extends SkillManager { * @param blockState Block being broken */ protected void spawnHarvestLumberBonusDrops(@NotNull BlockState blockState) { - Misc.spawnItemsFromCollection(getPlayer(), Misc.getBlockCenter(blockState), blockState.getBlock().getDrops(), ItemSpawnReason.BONUS_DROPS); + Misc.spawnItemsFromCollection(getPlayer(), Misc.getBlockCenter(blockState), blockState.getBlock().getDrops(getPlayer().getInventory().getItemInMainHand()), ItemSpawnReason.BONUS_DROPS); } } From 965540dfafc03312a125e07645b1584b4e20f233 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sun, 4 Dec 2022 14:32:34 -0800 Subject: [PATCH 326/326] 2.1.218 --- Changelog.txt | 6 ++++++ pom.xml | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index 558e2bd6b..01e963a4b 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,9 @@ +Version 2.1.218 + Fixed locale pt_BR type (thanks MrPowerGamerBR) + Updated Russian Locale (thanks imDaniX) + Harvest Lumber checks main hand enchantments when delivering bonuses (thanks destro174) + Fixed bug where players could use inspect to determine if vanished players were online (thanks DarkKnights22) + Version 2.1.217 Tree Feller will now break blocks within the limit instead of refusing to fell the entire tree (partial big tree destruction) Mangrove trees resulting from growth are now marked as natural (existing trees marked unnatural before this update will not be retroactively fixed) diff --git a/pom.xml b/pom.xml index 30afd4dff..1b70bbae7 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.218-SNAPSHOT + 2.1.218 mcMMO https://github.com/mcMMO-Dev/mcMMO