Bladeren bron

merge master

nossr50 1 jaar geleden
bovenliggende
commit
fba6e8a961
37 gewijzigde bestanden met toevoegingen van 1600 en 1569 verwijderingen
  1. 22 0
      Changelog.txt
  2. 65 27
      src/main/java/com/gmail/nossr50/api/PartyAPI.java
  3. 2 2
      src/main/java/com/gmail/nossr50/commands/CommandManager.java
  4. 1 1
      src/main/java/com/gmail/nossr50/commands/chat/PartyChatCommand.java
  5. 3 2
      src/main/java/com/gmail/nossr50/commands/party/PartyAcceptCommand.java
  6. 1 1
      src/main/java/com/gmail/nossr50/commands/party/PartyChangeOwnerCommand.java
  7. 55 51
      src/main/java/com/gmail/nossr50/commands/party/PartyCommand.java
  8. 4 3
      src/main/java/com/gmail/nossr50/commands/party/PartyCreateCommand.java
  9. 3 2
      src/main/java/com/gmail/nossr50/commands/party/PartyDisbandCommand.java
  10. 1 1
      src/main/java/com/gmail/nossr50/commands/party/PartyInfoCommand.java
  11. 3 3
      src/main/java/com/gmail/nossr50/commands/party/PartyInviteCommand.java
  12. 5 4
      src/main/java/com/gmail/nossr50/commands/party/PartyJoinCommand.java
  13. 3 3
      src/main/java/com/gmail/nossr50/commands/party/PartyKickCommand.java
  14. 3 2
      src/main/java/com/gmail/nossr50/commands/party/PartyQuitCommand.java
  15. 3 2
      src/main/java/com/gmail/nossr50/commands/party/PartyRenameCommand.java
  16. 2 1
      src/main/java/com/gmail/nossr50/commands/party/alliance/PartyAllianceAcceptCommand.java
  17. 1 1
      src/main/java/com/gmail/nossr50/commands/party/alliance/PartyAllianceCommand.java
  18. 2 1
      src/main/java/com/gmail/nossr50/commands/party/alliance/PartyAllianceDisbandCommand.java
  19. 2 1
      src/main/java/com/gmail/nossr50/commands/party/alliance/PartyAllianceInviteCommand.java
  20. 1 1
      src/main/java/com/gmail/nossr50/commands/party/teleport/PtpCommand.java
  21. 5 1
      src/main/java/com/gmail/nossr50/config/AdvancedConfig.java
  22. 21 0
      src/main/java/com/gmail/nossr50/config/party/PartyConfig.java
  23. 1 1
      src/main/java/com/gmail/nossr50/datatypes/party/Party.java
  24. 11 8
      src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java
  25. 4 0
      src/main/java/com/gmail/nossr50/events/skills/rupture/McMMOEntityDamageByRuptureEvent.java
  26. 15 13
      src/main/java/com/gmail/nossr50/listeners/EntityListener.java
  27. 34 8
      src/main/java/com/gmail/nossr50/mcMMO.java
  28. 221 240
      src/main/java/com/gmail/nossr50/party/PartyManager.java
  29. 2 2
      src/main/java/com/gmail/nossr50/party/ShareHandler.java
  30. 2 2
      src/main/java/com/gmail/nossr50/runnables/SaveTimerTask.java
  31. 1 1
      src/main/java/com/gmail/nossr50/runnables/items/TeleportationWarmup.java
  32. 2 2
      src/main/java/com/gmail/nossr50/runnables/party/PartyAutoKickTask.java
  33. 4 57
      src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java
  34. 4 3
      src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java
  35. 989 1122
      src/main/resources/locale/locale_ko.properties
  36. 4 0
      src/main/resources/party.yml
  37. 98 0
      src/test/java/com/gmail/nossr50/party/PartyManagerTest.java

+ 22 - 0
Changelog.txt

@@ -51,6 +51,28 @@ Version 2.2.000
     Currently these skills scale up to a maximum 50% chance if a player has 10,000 skill, you can adjust this in advanced.yml
 
 
+Version 2.1.231
+    Fixed a bug preventing parties from being made without passwords (Thanks Momshroom)
+    Updated korean locale (thanks mangchi57)
+    Added some unit tests for party creation
+
+Version 2.1.230
+    Fixed an error that could happen when mcMMO was saving when parties were disabled by party.yml (thanks IAISI & L4BORG)
+    Fixed several exceptions when checking PVP damage when parties were disabled by party.yml (thanks IAISI & L4BORG)
+
+Version 2.1.229
+    Added new party.yml config, which lets admins disable the party system entirely without having to use permissions
+    Fixed error caused by missing API in McMMOEntityDamageByRuptureEvent
+    (API) Major API changes to PartyManager
+    (API) PartyManager is no longer a static singleton class, use mcMMO.getPartyManager() to get the PartyManager
+    (API) Added com.gmail.nossr50.mcMMO.isPartySystemEnabled to check if the party system is enabled
+    (API) Added com.gmail.nossr50.api.PartyAPI.isPartySystemEnabled as an alternative, to check if the party system is enabled
+    (API) Added missing com.gmail.nossr50.events.skills.rupture.McMMOEntityDamageByRuptureEvent.getHandlerList
+
+    NOTES:
+    Admins can now enable/disable the whole party system with a setting in the new party.yml config
+    You'll have to start your server one time to generate the config, then change the setting and reboot your server.
+
 Version 2.1.228
     Fixed a stack trace due to Spigot API break on EntityDamageEvent and EntityDamageByEntity event
     (API) - Removed FakeEntityDamageEvent and FakeEntityDamageByEntityEvent

+ 65 - 27
src/main/java/com/gmail/nossr50/api/PartyAPI.java

@@ -3,12 +3,15 @@ package com.gmail.nossr50.api;
 import com.gmail.nossr50.datatypes.interactions.NotificationType;
 import com.gmail.nossr50.datatypes.party.Party;
 import com.gmail.nossr50.datatypes.party.PartyLeader;
+import com.gmail.nossr50.datatypes.player.McMMOPlayer;
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.party.PartyManager;
 import com.gmail.nossr50.util.player.NotificationManager;
 import com.gmail.nossr50.util.player.UserManager;
+import jdk.jfr.Experimental;
 import org.bukkit.OfflinePlayer;
 import org.bukkit.entity.Player;
+import org.jetbrains.annotations.Nullable;
 
 import java.util.*;
 
@@ -24,13 +27,22 @@ public final class PartyAPI {
      * @return the name of the player's party, or null if not in a party
      */
     public static String getPartyName(Player player) {
-        if (!inParty(player)) {
+        if (!mcMMO.p.getPartyConfig().isPartyEnabled() || !inParty(player)) {
             return null;
         }
 
         return UserManager.getPlayer(player).getParty().getName();
     }
 
+    /**
+     * Check if the party system is enabled.
+     *
+     * @return true if the party system is enabled, false otherwise
+     */
+    public static boolean isPartySystemEnabled() {
+        return mcMMO.p.getPartyConfig().isPartyEnabled();
+    }
+
     /**
      * Checks if a player is in a party.
      * </br>
@@ -40,7 +52,7 @@ public final class PartyAPI {
      * @return true if the player is in a party, false otherwise
      */
     public static boolean inParty(Player player) {
-        if(UserManager.getPlayer(player) == null)
+        if(!mcMMO.p.getPartyConfig().isPartyEnabled() || UserManager.getPlayer(player) == null)
             return false;
 
         return UserManager.getPlayer(player).inParty();
@@ -51,12 +63,15 @@ public final class PartyAPI {
      * </br>
      * This function is designed for API usage.
      *
-     * @param playera The first player to check
-     * @param playerb The second player to check
+     * @param playerA The first player to check
+     * @param playerB The second player to check
      * @return true if the two players are in the same party, false otherwise
      */
-    public static boolean inSameParty(Player playera, Player playerb) {
-        return PartyManager.inSameParty(playera, playerb);
+    public static boolean inSameParty(Player playerA, Player playerB) {
+        if (!mcMMO.p.getPartyConfig().isPartyEnabled())
+            return false;
+
+        return mcMMO.p.getPartyManager().inSameParty(playerA, playerB);
     }
 
     /**
@@ -67,7 +82,7 @@ public final class PartyAPI {
      * @return the list of parties.
      */
     public static List<Party> getParties() {
-        return PartyManager.getParties();
+        return mcMMO.p.getPartyManager().getParties();
     }
 
     /**
@@ -81,23 +96,29 @@ public final class PartyAPI {
      */
     @Deprecated
     public static void addToParty(Player player, String partyName) {
+        if(!mcMMO.p.getPartyConfig().isPartyEnabled()) {
+            return;
+        }
+
         //Check if player profile is loaded
-        if(UserManager.getPlayer(player) == null)
+        final McMMOPlayer mmoPlayer = UserManager.getPlayer(player);
+
+        if(mmoPlayer == null)
             return;
 
-        Party party = PartyManager.getParty(partyName);
+        Party party = mcMMO.p.getPartyManager().getParty(partyName);
 
         if (party == null) {
             party = new Party(new PartyLeader(player.getUniqueId(), player.getName()), partyName);
         } else {
-            if(PartyManager.isPartyFull(player, party))
+            if(mcMMO.p.getPartyManager().isPartyFull(player, party))
             {
                 NotificationManager.sendPlayerInformation(player, NotificationType.PARTY_MESSAGE, "Commands.Party.PartyFull", party.toString());
                 return;
             }
         }
 
-        PartyManager.addToParty(UserManager.getPlayer(player), party);
+        mcMMO.p.getPartyManager().addToParty(mmoPlayer, party);
     }
 
     /**
@@ -119,19 +140,18 @@ public final class PartyAPI {
      * @param partyName The party to add the player to
      * @param bypassLimit if true bypasses party size limits
      */
-    //TODO: bypasslimit not used?
     public static void addToParty(Player player, String partyName, boolean bypassLimit) {
         //Check if player profile is loaded
-        if(UserManager.getPlayer(player) == null)
+        if(!mcMMO.p.getPartyConfig().isPartyEnabled() || UserManager.getPlayer(player) == null)
             return;
 
-        Party party = PartyManager.getParty(partyName);
+        Party party = mcMMO.p.getPartyManager().getParty(partyName);
 
         if (party == null) {
             party = new Party(new PartyLeader(player.getUniqueId(), player.getName()), partyName);
         }
 
-        PartyManager.addToParty(UserManager.getPlayer(player), party);
+        mcMMO.p.getPartyManager().addToParty(UserManager.getPlayer(player), party);
     }
 
     /**
@@ -143,10 +163,10 @@ public final class PartyAPI {
      */
     public static void removeFromParty(Player player) {
         //Check if player profile is loaded
-        if(UserManager.getPlayer(player) == null)
+        if(!mcMMO.p.getPartyConfig().isPartyEnabled() || UserManager.getPlayer(player) == null)
             return;
 
-        PartyManager.removeFromParty(UserManager.getPlayer(player));
+        mcMMO.p.getPartyManager().removeFromParty(UserManager.getPlayer(player));
     }
 
     /**
@@ -157,8 +177,11 @@ public final class PartyAPI {
      * @param partyName The party name
      * @return the leader of the party
      */
-    public static String getPartyLeader(String partyName) {
-        return PartyManager.getPartyLeaderName(partyName);
+    public static @Nullable String getPartyLeader(String partyName) {
+        if(!mcMMO.p.getPartyConfig().isPartyEnabled())
+            return null;
+
+        return mcMMO.p.getPartyManager().getPartyLeaderName(partyName);
     }
 
     /**
@@ -171,7 +194,10 @@ public final class PartyAPI {
      */
     @Deprecated
     public static void setPartyLeader(String partyName, String playerName) {
-        PartyManager.setPartyLeader(mcMMO.p.getServer().getOfflinePlayer(playerName).getUniqueId(), PartyManager.getParty(partyName));
+        if(!mcMMO.p.getPartyConfig().isPartyEnabled())
+            return;
+
+        mcMMO.p.getPartyManager().setPartyLeader(mcMMO.p.getServer().getOfflinePlayer(playerName).getUniqueId(), mcMMO.p.getPartyManager().getParty(partyName));
     }
 
     /**
@@ -184,9 +210,12 @@ public final class PartyAPI {
      */
     @Deprecated
     public static List<OfflinePlayer> getOnlineAndOfflineMembers(Player player) {
-        List<OfflinePlayer> members = new ArrayList<>();
+        if(!mcMMO.p.getPartyConfig().isPartyEnabled()) {
+            return null;
+        }
 
-        for (UUID memberUniqueId : PartyManager.getAllMembers(player).keySet()) {
+        List<OfflinePlayer> members = new ArrayList<>();
+        for (UUID memberUniqueId : mcMMO.p.getPartyManager().getAllMembers(player).keySet()) {
             OfflinePlayer member = mcMMO.p.getServer().getOfflinePlayer(memberUniqueId);
             members.add(member);
         }
@@ -203,7 +232,10 @@ public final class PartyAPI {
      */
     @Deprecated
     public static LinkedHashSet<String> getMembers(Player player) {
-        return (LinkedHashSet<String>) PartyManager.getAllMembers(player).values();
+        if(!mcMMO.p.getPartyConfig().isPartyEnabled())
+            return null;
+
+        return (LinkedHashSet<String>) mcMMO.p.getPartyManager().getAllMembers(player).values();
     }
 
     /**
@@ -215,7 +247,10 @@ public final class PartyAPI {
      * @return all the player names and uuids in the player's party
      */
     public static LinkedHashMap<UUID, String> getMembersMap(Player player) {
-        return PartyManager.getAllMembers(player);
+        if(!mcMMO.p.getPartyConfig().isPartyEnabled())
+            return null;
+
+        return mcMMO.p.getPartyManager().getAllMembers(player);
     }
 
     /**
@@ -227,7 +262,10 @@ public final class PartyAPI {
      * @return all online players in this party
      */
     public static List<Player> getOnlineMembers(String partyName) {
-        return PartyManager.getOnlineMembers(partyName);
+        if(!mcMMO.p.getPartyConfig().isPartyEnabled())
+            return null;
+
+        return mcMMO.p.getPartyManager().getOnlineMembers(partyName);
     }
 
     /**
@@ -239,7 +277,7 @@ public final class PartyAPI {
      * @return all online players in the player's party
      */
     public static List<Player> getOnlineMembers(Player player) {
-        return PartyManager.getOnlineMembers(player);
+        return mcMMO.p.getPartyManager().getOnlineMembers(player);
     }
 
     public static boolean hasAlly(String partyName) {
@@ -247,7 +285,7 @@ public final class PartyAPI {
     }
 
     public static String getAllyName(String partyName) {
-        Party ally = PartyManager.getParty(partyName).getAlly();
+        Party ally = mcMMO.p.getPartyManager().getParty(partyName).getAlly();
         if (ally != null) {
             return ally.getName();
         }

+ 2 - 2
src/main/java/com/gmail/nossr50/commands/CommandManager.java

@@ -60,7 +60,7 @@ public class CommandManager {
             if(ChatConfig.getInstance().isChatChannelEnabled(ChatChannel.ADMIN)) {
                 bukkitCommandManager.registerCommand(new AdminChatCommand(pluginRef));
             }
-            if(ChatConfig.getInstance().isChatChannelEnabled(ChatChannel.PARTY)) {
+            if(pluginRef.getPartyConfig().isPartyEnabled() && ChatConfig.getInstance().isChatChannelEnabled(ChatChannel.PARTY)) {
                 bukkitCommandManager.registerCommand(new PartyChatCommand(pluginRef));
             }
         }
@@ -136,7 +136,7 @@ public class CommandManager {
     public void validatePlayerParty(@NotNull Player player) {
         McMMOPlayer mmoPlayer = UserManager.getPlayer(player);
 
-        if(mmoPlayer.getParty() == null) {
+        if(!pluginRef.getPartyConfig().isPartyEnabled() || mmoPlayer.getParty() == null) {
             throw new ConditionFailedException(LocaleLoader.getString("Commands.Party.None"));
         }
     }

+ 1 - 1
src/main/java/com/gmail/nossr50/commands/chat/PartyChatCommand.java

@@ -78,7 +78,7 @@ public class PartyChatCommand extends BaseCommand {
             mcMMO.p.getLogger().severe("You need to specify a party name and then write a message afterwards.");
         } else {
             //Grab party
-            Party targetParty = PartyManager.getParty(args[0]);
+            Party targetParty = mcMMO.p.getPartyManager().getParty(args[0]);
 
             if(targetParty != null) {
                 pluginRef.getChatManager().processConsoleMessage(StringUtils.buildStringAfterNthElement(args, 1), targetParty);

+ 3 - 2
src/main/java/com/gmail/nossr50/commands/party/PartyAcceptCommand.java

@@ -2,6 +2,7 @@ package com.gmail.nossr50.commands.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.player.UserManager;
 import org.bukkit.command.Command;
@@ -31,11 +32,11 @@ public class PartyAcceptCommand implements CommandExecutor {
             }
 
             // Changing parties
-            if (!PartyManager.changeOrJoinParty(mcMMOPlayer, mcMMOPlayer.getPartyInvite().getName())) {
+            if (!mcMMO.p.getPartyManager().changeOrJoinParty(mcMMOPlayer, mcMMOPlayer.getPartyInvite().getName())) {
                 return true;
             }
 
-            PartyManager.joinInvitedParty(mcMMOPlayer);
+            mcMMO.p.getPartyManager().joinInvitedParty(mcMMOPlayer);
             return true;
         }
         sender.sendMessage(LocaleLoader.getString("Commands.Usage.1", "party", "accept"));

+ 1 - 1
src/main/java/com/gmail/nossr50/commands/party/PartyChangeOwnerCommand.java

@@ -31,7 +31,7 @@ public class PartyChangeOwnerCommand implements CommandExecutor {
                 return true;
             }
 
-            PartyManager.setPartyLeader(target.getUniqueId(), playerParty);
+            mcMMO.p.getPartyManager().setPartyLeader(target.getUniqueId(), playerParty);
             return true;
         }
         sender.sendMessage(LocaleLoader.getString("Commands.Usage.2", "party", "owner", "<" + LocaleLoader.getString("Commands.Usage.Player") + ">"));

+ 55 - 51
src/main/java/com/gmail/nossr50/commands/party/PartyCommand.java

@@ -23,11 +23,45 @@ import java.util.Collections;
 import java.util.List;
 
 public class PartyCommand implements TabExecutor {
-    private static final List<String> PARTY_SUBCOMMANDS;
-    private static final List<String> XPSHARE_COMPLETIONS = ImmutableList.of("none", "equal");
-    private static final List<String> ITEMSHARE_COMPLETIONS = ImmutableList.of("none", "equal", "random", "loot", "mining", "herbalism", "woodcutting", "misc");
+    private final List<String> PARTY_SUBCOMMANDS;
+    private final List<String> XPSHARE_COMPLETIONS = ImmutableList.of("none", "equal");
+    private final List<String> ITEMSHARE_COMPLETIONS = ImmutableList.of("none", "equal", "random", "loot", "mining", "herbalism", "woodcutting", "misc");
+    private final CommandExecutor partyJoinCommand;
+    private final CommandExecutor partyAcceptCommand;
+    private final CommandExecutor partyCreateCommand;
+    private final CommandExecutor partyQuitCommand;
+    private final CommandExecutor partyXpShareCommand;
+    private final CommandExecutor partyItemShareCommand;
+    private final CommandExecutor partyInviteCommand;
+    private final CommandExecutor partyKickCommand;
+    private final CommandExecutor partyDisbandCommand;
+    private final CommandExecutor partyChangeOwnerCommand;
+    private final CommandExecutor partyLockCommand;
+    private final CommandExecutor partyChangePasswordCommand;
+    private final CommandExecutor partyRenameCommand;
+    private final CommandExecutor partyInfoCommand;
+    private final CommandExecutor partyHelpCommand;
+    private final CommandExecutor partyTeleportCommand;
+    private final CommandExecutor partyAllianceCommand;
+    public PartyCommand() {
+        partyJoinCommand           = new PartyJoinCommand();
+        partyAcceptCommand         = new PartyAcceptCommand();
+        partyCreateCommand         = new PartyCreateCommand();
+        partyQuitCommand           = new PartyQuitCommand();
+        partyXpShareCommand        = new PartyXpShareCommand();
+        partyItemShareCommand      = new PartyItemShareCommand();
+        partyInviteCommand         = new PartyInviteCommand();
+        partyKickCommand           = new PartyKickCommand();
+        partyDisbandCommand        = new PartyDisbandCommand();
+        partyChangeOwnerCommand    = new PartyChangeOwnerCommand();
+        partyLockCommand           = new PartyLockCommand();
+        partyChangePasswordCommand = new PartyChangePasswordCommand();
+        partyRenameCommand         = new PartyRenameCommand();
+        partyInfoCommand           = new PartyInfoCommand();
+        partyHelpCommand           = new PartyHelpCommand();
+        partyTeleportCommand       = new PtpCommand();
+        partyAllianceCommand       = new PartyAllianceCommand();
 
-    static {
         ArrayList<String> subcommands = new ArrayList<>();
 
         for (PartySubcommandType subcommand : PartySubcommandType.values()) {
@@ -38,24 +72,6 @@ public class PartyCommand implements TabExecutor {
         PARTY_SUBCOMMANDS = ImmutableList.copyOf(subcommands);
     }
 
-    private final CommandExecutor partyJoinCommand           = new PartyJoinCommand();
-    private final CommandExecutor partyAcceptCommand         = new PartyAcceptCommand();
-    private final CommandExecutor partyCreateCommand         = new PartyCreateCommand();
-    private final CommandExecutor partyQuitCommand           = new PartyQuitCommand();
-    private final CommandExecutor partyXpShareCommand        = new PartyXpShareCommand();
-    private final CommandExecutor partyItemShareCommand      = new PartyItemShareCommand();
-    private final CommandExecutor partyInviteCommand         = new PartyInviteCommand();
-    private final CommandExecutor partyKickCommand           = new PartyKickCommand();
-    private final CommandExecutor partyDisbandCommand        = new PartyDisbandCommand();
-    private final CommandExecutor partyChangeOwnerCommand    = new PartyChangeOwnerCommand();
-    private final CommandExecutor partyLockCommand           = new PartyLockCommand();
-    private final CommandExecutor partyChangePasswordCommand = new PartyChangePasswordCommand();
-    private final CommandExecutor partyRenameCommand         = new PartyRenameCommand();
-    private final CommandExecutor partyInfoCommand           = new PartyInfoCommand();
-    private final CommandExecutor partyHelpCommand           = new PartyHelpCommand();
-    private final CommandExecutor partyTeleportCommand       = new PtpCommand();
-    private final CommandExecutor partyAllianceCommand       = new PartyAllianceCommand();
-
     @Override
     public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) {
         if (CommandUtils.noConsoleUsage(sender)) {
@@ -73,13 +89,13 @@ public class PartyCommand implements TabExecutor {
             return true;
         }
 
-        if(UserManager.getPlayer(player) == null)
+        McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
+        if(mcMMOPlayer == null)
         {
             player.sendMessage(LocaleLoader.getString("Profile.PendingLoad"));
             return true;
         }
 
-        McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
 
         if (args.length < 1) {
             if (!mcMMOPlayer.inParty()) {
@@ -140,31 +156,18 @@ public class PartyCommand implements TabExecutor {
             return true;
         }
 
-        switch (subcommand) {
-            case XPSHARE:
-                return partyXpShareCommand.onCommand(sender, command, label, args);
-            case ITEMSHARE:
-                return partyItemShareCommand.onCommand(sender, command, label, args);
-            case KICK:
-                return partyKickCommand.onCommand(sender, command, label, args);
-            case DISBAND:
-                return partyDisbandCommand.onCommand(sender, command, label, args);
-            case OWNER:
-                return partyChangeOwnerCommand.onCommand(sender, command, label, args);
-            case LOCK:
-            case UNLOCK:
-                return partyLockCommand.onCommand(sender, command, label, args);
-            case PASSWORD:
-                return partyChangePasswordCommand.onCommand(sender, command, label, args);
-            case RENAME:
-                return partyRenameCommand.onCommand(sender, command, label, args);
-            case ALLIANCE:
-                return partyAllianceCommand.onCommand(sender, command, label, args);
-            default:
-                break;
-        }
-
-        return true;
+        return switch (subcommand) {
+            case XPSHARE -> partyXpShareCommand.onCommand(sender, command, label, args);
+            case ITEMSHARE -> partyItemShareCommand.onCommand(sender, command, label, args);
+            case KICK -> partyKickCommand.onCommand(sender, command, label, args);
+            case DISBAND -> partyDisbandCommand.onCommand(sender, command, label, args);
+            case OWNER -> partyChangeOwnerCommand.onCommand(sender, command, label, args);
+            case LOCK, UNLOCK -> partyLockCommand.onCommand(sender, command, label, args);
+            case PASSWORD -> partyChangePasswordCommand.onCommand(sender, command, label, args);
+            case RENAME -> partyRenameCommand.onCommand(sender, command, label, args);
+            case ALLIANCE -> partyAllianceCommand.onCommand(sender, command, label, args);
+            default -> true;
+        };
     }
 
     @Override
@@ -179,12 +182,13 @@ public class PartyCommand implements TabExecutor {
                     return ImmutableList.of();
                 }
 
+                List<String> playerNames = CommandUtils.getOnlinePlayerNames(sender);
+
                 switch (subcommand) {
                     case JOIN:
                     case INVITE:
                     case KICK:
                     case OWNER:
-                        List<String> playerNames = CommandUtils.getOnlinePlayerNames(sender);
                         return StringUtil.copyPartialMatches(args[1], playerNames, new ArrayList<>(playerNames.size()));
                     case XPSHARE:
                         return StringUtil.copyPartialMatches(args[1], XPSHARE_COMPLETIONS, new ArrayList<>(XPSHARE_COMPLETIONS.size()));
@@ -198,7 +202,7 @@ public class PartyCommand implements TabExecutor {
                     case TELEPORT:
                         List<String> matches = StringUtil.copyPartialMatches(args[1], PtpCommand.TELEPORT_SUBCOMMANDS, new ArrayList<>(PtpCommand.TELEPORT_SUBCOMMANDS.size()));
 
-                        if (matches.size() == 0) {
+                        if (matches.isEmpty()) {
                             Player player = (Player) sender;
                             final McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
 

+ 4 - 3
src/main/java/com/gmail/nossr50/commands/party/PartyCreateCommand.java

@@ -2,6 +2,7 @@ package com.gmail.nossr50.commands.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.player.UserManager;
 import org.bukkit.command.Command;
@@ -26,16 +27,16 @@ public class PartyCreateCommand implements CommandExecutor {
                 }
 
                 // Check to see if the party exists, and if it does cancel creating a new party
-                if (PartyManager.checkPartyExistence(player, args[1])) {
+                if (mcMMO.p.getPartyManager().checkPartyExistence(player, args[1])) {
                     return true;
                 }
 
                 // Changing parties
-                if (!PartyManager.changeOrJoinParty(mcMMOPlayer, args[1])) {
+                if (!mcMMO.p.getPartyManager().changeOrJoinParty(mcMMOPlayer, args[1])) {
                     return true;
                 }
 
-                PartyManager.createParty(mcMMOPlayer, args[1], getPassword(args));
+                mcMMO.p.getPartyManager().createParty(mcMMOPlayer, args[1], getPassword(args));
                 return true;
 
             default:

+ 3 - 2
src/main/java/com/gmail/nossr50/commands/party/PartyDisbandCommand.java

@@ -4,6 +4,7 @@ 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.mcMMO;
 import com.gmail.nossr50.party.PartyManager;
 import com.gmail.nossr50.util.player.UserManager;
 import org.bukkit.command.Command;
@@ -26,14 +27,14 @@ public class PartyDisbandCommand implements CommandExecutor {
             final String partyName = playerParty.getName();
 
             for (Player member : playerParty.getOnlineMembers()) {
-                if (!PartyManager.handlePartyChangeEvent(member, partyName, null, EventReason.KICKED_FROM_PARTY)) {
+                if (!mcMMO.p.getPartyManager().handlePartyChangeEvent(member, partyName, null, EventReason.KICKED_FROM_PARTY)) {
                     return true;
                 }
 
                 member.sendMessage(LocaleLoader.getString("Party.Disband"));
             }
 
-            PartyManager.disbandParty(mcMMOPlayer, playerParty);
+            mcMMO.p.getPartyManager().disbandParty(mcMMOPlayer, playerParty);
             return true;
         }
         sender.sendMessage(LocaleLoader.getString("Commands.Usage.1", "party", "disband"));

+ 1 - 1
src/main/java/com/gmail/nossr50/commands/party/PartyInfoCommand.java

@@ -125,7 +125,7 @@ public class PartyInfoCommand implements CommandExecutor {
          * Only show members of the party that this member can see
          */
 
-        List<Player> nearMembers = PartyManager.getNearVisibleMembers(mcMMOPlayer);
+        List<Player> nearMembers = mcMMO.p.getPartyManager().getNearVisibleMembers(mcMMOPlayer);
         int membersOnline = party.getVisibleMembers(player).size();
 
         player.sendMessage(LocaleLoader.getString("Commands.Party.Members.Header"));

+ 3 - 3
src/main/java/com/gmail/nossr50/commands/party/PartyInviteCommand.java

@@ -40,19 +40,19 @@ public class PartyInviteCommand implements CommandExecutor {
                 return true;
             }
 
-            if (PartyManager.inSameParty(player, target)) {
+            if (mcMMO.p.getPartyManager().inSameParty(player, target)) {
                 sender.sendMessage(LocaleLoader.getString("Party.Player.InSameParty", targetName));
                 return true;
             }
 
-            if (!PartyManager.canInvite(mcMMOPlayer)) {
+            if (!mcMMO.p.getPartyManager().canInvite(mcMMOPlayer)) {
                 player.sendMessage(LocaleLoader.getString("Party.Locked"));
                 return true;
             }
 
             Party playerParty = mcMMOPlayer.getParty();
 
-            if (PartyManager.isPartyFull(target, playerParty)) {
+            if (mcMMO.p.getPartyManager().isPartyFull(target, playerParty)) {
                 player.sendMessage(LocaleLoader.getString("Commands.Party.PartyFull.Invite", target.getName(), playerParty.toString(), mcMMO.p.getGeneralConfig().getPartyMaxSize()));
                 return true;
             }

+ 5 - 4
src/main/java/com/gmail/nossr50/commands/party/PartyJoinCommand.java

@@ -3,6 +3,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.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,25 +52,25 @@ public class PartyJoinCommand implements CommandExecutor {
                 String password = getPassword(args);
 
                 // Make sure party passwords match
-                if (!PartyManager.checkPartyPassword(player, targetParty, password)) {
+                if (!mcMMO.p.getPartyManager().checkPartyPassword(player, targetParty, password)) {
                     return true;
                 }
 
                 String partyName = targetParty.getName();
 
                 // Changing parties
-                if (!PartyManager.changeOrJoinParty(mcMMOPlayer, partyName)) {
+                if (!mcMMO.p.getPartyManager().changeOrJoinParty(mcMMOPlayer, partyName)) {
                     return true;
                 }
 
-                if(PartyManager.isPartyFull(player, targetParty))
+                if(mcMMO.p.getPartyManager().isPartyFull(player, targetParty))
                 {
                     player.sendMessage(LocaleLoader.getString("Commands.Party.PartyFull", targetParty.toString()));
                     return true;
                 }
 
                 player.sendMessage(LocaleLoader.getString("Commands.Party.Join", partyName));
-                PartyManager.addToParty(mcMMOPlayer, targetParty);
+                mcMMO.p.getPartyManager().addToParty(mcMMOPlayer, targetParty);
                 return true;
 
             default:

+ 3 - 3
src/main/java/com/gmail/nossr50/commands/party/PartyKickCommand.java

@@ -37,15 +37,15 @@ public class PartyKickCommand implements CommandExecutor {
                 Player onlineTarget = target.getPlayer();
                 String partyName = playerParty.getName();
 
-                if (!PartyManager.handlePartyChangeEvent(onlineTarget, partyName, null, EventReason.KICKED_FROM_PARTY)) {
+                if (!mcMMO.p.getPartyManager().handlePartyChangeEvent(onlineTarget, partyName, null, EventReason.KICKED_FROM_PARTY)) {
                     return true;
                 }
 
-                PartyManager.processPartyLeaving(UserManager.getPlayer(onlineTarget));
+                mcMMO.p.getPartyManager().processPartyLeaving(UserManager.getPlayer(onlineTarget));
                 onlineTarget.sendMessage(LocaleLoader.getString("Commands.Party.Kick", partyName));
             }
 
-            PartyManager.removeFromParty(target, playerParty);
+            mcMMO.p.getPartyManager().removeFromParty(target, playerParty);
             return true;
         }
         sender.sendMessage(LocaleLoader.getString("Commands.Usage.2", "party", "kick", "<" + LocaleLoader.getString("Commands.Usage.Player") + ">"));

+ 3 - 2
src/main/java/com/gmail/nossr50/commands/party/PartyQuitCommand.java

@@ -4,6 +4,7 @@ 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.mcMMO;
 import com.gmail.nossr50.party.PartyManager;
 import com.gmail.nossr50.util.player.UserManager;
 import org.bukkit.command.Command;
@@ -26,11 +27,11 @@ public class PartyQuitCommand implements CommandExecutor {
             McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
             Party playerParty = mcMMOPlayer.getParty();
 
-            if (!PartyManager.handlePartyChangeEvent(player, playerParty.getName(), null, EventReason.LEFT_PARTY)) {
+            if (!mcMMO.p.getPartyManager().handlePartyChangeEvent(player, playerParty.getName(), null, EventReason.LEFT_PARTY)) {
                 return true;
             }
 
-            PartyManager.removeFromParty(mcMMOPlayer);
+            mcMMO.p.getPartyManager().removeFromParty(mcMMOPlayer);
             sender.sendMessage(LocaleLoader.getString("Commands.Party.Leave"));
             return true;
         }

+ 3 - 2
src/main/java/com/gmail/nossr50/commands/party/PartyRenameCommand.java

@@ -4,6 +4,7 @@ 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.mcMMO;
 import com.gmail.nossr50.party.PartyManager;
 import com.gmail.nossr50.util.player.UserManager;
 import org.bukkit.command.Command;
@@ -36,14 +37,14 @@ public class PartyRenameCommand implements CommandExecutor {
             Player player = mcMMOPlayer.getPlayer();
 
             // Check to see if the party exists, and if it does cancel renaming the party
-            if (PartyManager.checkPartyExistence(player, newPartyName)) {
+            if (mcMMO.p.getPartyManager().checkPartyExistence(player, newPartyName)) {
                 return true;
             }
 
             String leaderName = playerParty.getLeader().getPlayerName();
 
             for (Player member : playerParty.getOnlineMembers()) {
-                if (!PartyManager.handlePartyChangeEvent(member, oldPartyName, newPartyName, EventReason.CHANGED_PARTIES)) {
+                if (!mcMMO.p.getPartyManager().handlePartyChangeEvent(member, oldPartyName, newPartyName, EventReason.CHANGED_PARTIES)) {
                     return true;
                 }
 

+ 2 - 1
src/main/java/com/gmail/nossr50/commands/party/alliance/PartyAllianceAcceptCommand.java

@@ -2,6 +2,7 @@ package com.gmail.nossr50.commands.party.alliance;
 
 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.command.Command;
@@ -31,7 +32,7 @@ public class PartyAllianceAcceptCommand implements CommandExecutor {
                 return true;
             }
 
-            PartyManager.acceptAllianceInvite(mcMMOPlayer);
+            mcMMO.p.getPartyManager().acceptAllianceInvite(mcMMOPlayer);
             return true;
         }
         sender.sendMessage(LocaleLoader.getString("Commands.Usage.2", "party", "alliance", "accept"));

+ 1 - 1
src/main/java/com/gmail/nossr50/commands/party/alliance/PartyAllianceCommand.java

@@ -129,7 +129,7 @@ public class PartyAllianceCommand implements TabExecutor {
     }
 
     private void displayMemberInfo(McMMOPlayer mcMMOPlayer) {
-        List<Player> nearMembers = PartyManager.getNearMembers(mcMMOPlayer);
+        List<Player> nearMembers = mcMMO.p.getPartyManager().getNearMembers(mcMMOPlayer);
         player.sendMessage(LocaleLoader.getString("Commands.Party.Alliance.Members.Header"));
         player.sendMessage(playerParty.createMembersList(player));
         player.sendMessage(ChatColor.DARK_GRAY + "----------------------------");

+ 2 - 1
src/main/java/com/gmail/nossr50/commands/party/alliance/PartyAllianceDisbandCommand.java

@@ -3,6 +3,7 @@ package com.gmail.nossr50.commands.party.alliance;
 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.player.UserManager;
 import org.bukkit.command.Command;
@@ -28,7 +29,7 @@ public class PartyAllianceDisbandCommand implements CommandExecutor {
                 return true;
             }
 
-            PartyManager.disbandAlliance(player, party, party.getAlly());
+            mcMMO.p.getPartyManager().disbandAlliance(player, party, party.getAlly());
             return true;
         }
         sender.sendMessage(LocaleLoader.getString("Commands.Usage.2", "party", "alliance", "disband"));

+ 2 - 1
src/main/java/com/gmail/nossr50/commands/party/alliance/PartyAllianceInviteCommand.java

@@ -3,6 +3,7 @@ package com.gmail.nossr50.commands.party.alliance;
 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;
@@ -44,7 +45,7 @@ public class PartyAllianceInviteCommand implements CommandExecutor {
                 return true;
             }
 
-            if (PartyManager.inSameParty(player, target)) {
+            if (mcMMO.p.getPartyManager().inSameParty(player, target)) {
                 sender.sendMessage(LocaleLoader.getString("Party.Player.InSameParty", targetName));
                 return true;
             }

+ 1 - 1
src/main/java/com/gmail/nossr50/commands/party/teleport/PtpCommand.java

@@ -210,7 +210,7 @@ public class PtpCommand implements TabExecutor {
             return false;
         }
 
-        if (!PartyManager.inSameParty(player, target)) {
+        if (!mcMMO.p.getPartyManager().inSameParty(player, target)) {
             player.sendMessage(LocaleLoader.getString("Party.NotInYourParty", targetName));
             return false;
         }

+ 5 - 1
src/main/java/com/gmail/nossr50/config/AdvancedConfig.java

@@ -627,7 +627,11 @@ public class AdvancedConfig extends BukkitConfig {
 
     /* ALCHEMY */
     public int getCatalysisMaxBonusLevel() {
-        return config.getInt("Skills.Alchemy.Catalysis.MaxBonusLevel", 1000);
+        if (mcMMO.isRetroModeEnabled()) {
+            return config.getInt("Skills.Alchemy.Catalysis.MaxBonusLevel.RetroMode", 1000);
+        } else {
+            return config.getInt("Skills.Alchemy.Catalysis.MaxBonusLevel.Standard", 100);
+        }
     }
 
     public double getCatalysisMinSpeed() {

+ 21 - 0
src/main/java/com/gmail/nossr50/config/party/PartyConfig.java

@@ -0,0 +1,21 @@
+package com.gmail.nossr50.config.party;
+
+import com.gmail.nossr50.config.BukkitConfig;
+
+import java.io.File;
+
+public class PartyConfig extends BukkitConfig {
+    public PartyConfig(File dataFolder) {
+        super("party.yml", dataFolder);
+        validate();
+    }
+
+    @Override
+    protected void loadKeys() {
+
+    }
+
+    public boolean isPartyEnabled() {
+        return config.getBoolean("Party.Enabled", true);
+    }
+}

+ 1 - 1
src/main/java/com/gmail/nossr50/datatypes/party/Party.java

@@ -253,7 +253,7 @@ public class Party {
                 }
             }
         } else {
-            PartyManager.informPartyMembersLevelUp(this, levelsGained, getLevel());
+            mcMMO.p.getPartyManager().informPartyMembersLevelUp(this, levelsGained, getLevel());
         }
 
     }

+ 11 - 8
src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java

@@ -67,6 +67,7 @@ import org.bukkit.metadata.FixedMetadataValue;
 import org.bukkit.plugin.Plugin;
 import org.checkerframework.checker.nullness.qual.NonNull;
 import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 import java.util.EnumMap;
 import java.util.Map;
@@ -649,11 +650,11 @@ public class McMMOPlayer implements Identified {
 
         applyXpGain(skill, modifyXpGain(skill, xp), xpGainReason, xpGainSource);
 
-        if (party == null || party.hasReachedLevelCap()) {
+        if (!mcMMO.p.getPartyConfig().isPartyEnabled() || party == null || party.hasReachedLevelCap()) {
             return;
         }
 
-        if (!mcMMO.p.getGeneralConfig().getPartyXpNearMembersNeeded() || !PartyManager.getNearMembers(this).isEmpty()) {
+        if (!mcMMO.p.getGeneralConfig().getPartyXpNearMembersNeeded() || !mcMMO.p.getPartyManager().getNearMembers(this).isEmpty()) {
             party.applyXpGain(modifyXpGain(skill, xp));
         }
     }
@@ -753,11 +754,13 @@ public class McMMOPlayer implements Identified {
      */
 
     public void setupPartyData() {
-        party = PartyManager.getPlayerParty(player.getName(), player.getUniqueId());
-        ptpRecord = new PartyTeleportRecord();
+        if (mcMMO.p.isPartySystemEnabled()) {
+            party = mcMMO.p.getPartyManager().getPlayerParty(player.getName(), player.getUniqueId());
+            ptpRecord = new PartyTeleportRecord();
 
-        if (inParty()) {
-            loginParty();
+            if (inParty()) {
+                loginParty();
+            }
         }
     }
 
@@ -777,7 +780,7 @@ public class McMMOPlayer implements Identified {
         this.party = party;
     }
 
-    public Party getParty() {
+    public @Nullable Party getParty() {
         return party;
     }
 
@@ -793,7 +796,7 @@ public class McMMOPlayer implements Identified {
         invite = null;
     }
 
-    public PartyTeleportRecord getPartyTeleportRecord() {
+    public @Nullable PartyTeleportRecord getPartyTeleportRecord() {
         return ptpRecord;
     }
 

+ 4 - 0
src/main/java/com/gmail/nossr50/events/skills/rupture/McMMOEntityDamageByRuptureEvent.java

@@ -54,4 +54,8 @@ public class McMMOEntityDamageByRuptureEvent extends EntityEvent implements Canc
     public HandlerList getHandlers() {
         return handlers;
     }
+
+    public static @NotNull HandlerList getHandlerList() {
+        return handlers;
+    }
 }

+ 15 - 13
src/main/java/com/gmail/nossr50/listeners/EntityListener.java

@@ -9,7 +9,6 @@ import com.gmail.nossr50.events.fake.FakeEntityTameEvent;
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.metadata.MobMetaFlagType;
 import com.gmail.nossr50.metadata.MobMetadataService;
-import com.gmail.nossr50.party.PartyManager;
 import com.gmail.nossr50.runnables.TravelingBlockMetaCleanup;
 import com.gmail.nossr50.skills.archery.Archery;
 import com.gmail.nossr50.skills.crossbows.Crossbows;
@@ -238,12 +237,12 @@ public class EntityListener implements Listener {
 
             if(event.getCombuster() instanceof Projectile projectile) {
                 if(projectile.getShooter() instanceof Player attacker) {
-                    if(checkParties(event, defender, attacker)) {
+                    if(checkIfInPartyOrSamePlayer(event, defender, attacker)) {
                         event.setCancelled(true);
                     }
                 }
             } else if(event.getCombuster() instanceof Player attacker) {
-                if(checkParties(event, defender, attacker)) {
+                if(checkIfInPartyOrSamePlayer(event, defender, attacker)) {
                     event.setCancelled(true);
                 }
             }
@@ -339,8 +338,8 @@ public class EntityListener implements Listener {
             //If the attacker is a Player or a projectile belonging to a player
             if(attacker instanceof Projectile projectile) {
                 if(projectile.getShooter() instanceof Player attackingPlayer && !attackingPlayer.equals(defendingPlayer)) {
-                    //Check for party friendly fire and cancel the event
-                    if (checkParties(event, defendingPlayer, attackingPlayer)) {
+                    //Check for friendly fire and cancel the event
+                    if (checkIfInPartyOrSamePlayer(event, defendingPlayer, attackingPlayer)) {
                         return;
                     }
                 }
@@ -358,7 +357,7 @@ public class EntityListener implements Listener {
                     }
                 }
             } else if (attacker instanceof Player attackingPlayer){
-                if (checkParties(event, defendingPlayer, attackingPlayer))
+                if (checkIfInPartyOrSamePlayer(event, defendingPlayer, attackingPlayer))
                     return;
             }
         }
@@ -457,21 +456,24 @@ public class EntityListener implements Listener {
         }
     }
 
-    public boolean checkParties(Cancellable event, Player defendingPlayer, Player attackingPlayer) {
-        if (!UserManager.hasPlayerDataKey(defendingPlayer) || !UserManager.hasPlayerDataKey(attackingPlayer)) {
+    public boolean checkIfInPartyOrSamePlayer(Cancellable event, Player defendingPlayer, Player attackingPlayer) {
+        // This check is probably necessary outside of the party system
+        if (defendingPlayer.equals(attackingPlayer)) {
             return true;
         }
 
-        // We want to make sure we're not gaining XP or applying abilities
-        // when we hit ourselves
-        if (defendingPlayer.equals(attackingPlayer)) {
+        if(!pluginRef.isPartySystemEnabled()) {
+            return false;
+        }
+
+        if (!UserManager.hasPlayerDataKey(defendingPlayer) || !UserManager.hasPlayerDataKey(attackingPlayer)) {
             return true;
         }
 
         //Party Friendly Fire
         if(!mcMMO.p.getGeneralConfig().getPartyFriendlyFire())
-            if ((PartyManager.inSameParty(defendingPlayer, attackingPlayer)
-                    || PartyManager.areAllies(defendingPlayer, attackingPlayer))
+            if ((mcMMO.p.getPartyManager().inSameParty(defendingPlayer, attackingPlayer)
+                    || mcMMO.p.getPartyManager().areAllies(defendingPlayer, attackingPlayer))
                     && !(Permissions.friendlyFire(attackingPlayer)
                     && Permissions.friendlyFire(defendingPlayer))) {
                 event.setCancelled(true);

+ 34 - 8
src/main/java/com/gmail/nossr50/mcMMO.java

@@ -8,6 +8,7 @@ import com.gmail.nossr50.config.mods.ArmorConfigManager;
 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.party.PartyConfig;
 import com.gmail.nossr50.config.skills.alchemy.PotionConfig;
 import com.gmail.nossr50.config.skills.repair.RepairConfigManager;
 import com.gmail.nossr50.config.skills.salvage.SalvageConfigManager;
@@ -138,8 +139,10 @@ public class mcMMO extends JavaPlugin {
 
     private GeneralConfig generalConfig;
     private AdvancedConfig advancedConfig;
+    private PartyConfig partyConfig;
 
     private FoliaLib foliaLib;
+    private PartyManager partyManager;
 
 //    private RepairConfig repairConfig;
 //    private SalvageConfig salvageConfig;
@@ -181,6 +184,7 @@ public class mcMMO extends JavaPlugin {
 
             //Init configs
             advancedConfig = new AdvancedConfig(getDataFolder());
+            partyConfig = new PartyConfig(getDataFolder());
 
             //Store this value so other plugins can check it
             isRetroModeEnabled = generalConfig.getIsRetroMode();
@@ -258,7 +262,10 @@ public class mcMMO extends JavaPlugin {
                 registerCoreSkills();
                 registerCustomRecipes();
 
-                PartyManager.loadParties();
+                if (partyConfig.isPartyEnabled()) {
+                    partyManager = new PartyManager(this);
+                    partyManager.loadParties();
+                }
 
                 formulaManager = new FormulaManager();
 
@@ -376,7 +383,8 @@ public class mcMMO extends JavaPlugin {
             UserManager.saveAll();      // Make sure to save player information if the server shuts down
             UserManager.clearAll();
             Alchemy.finishAllBrews();   // Finish all partially complete AlchemyBrewTasks to prevent vanilla brewing continuation on restart
-            PartyManager.saveParties(); // Save our parties
+            if(partyConfig.isPartyEnabled())
+                getPartyManager().saveParties(); // Save our parties
 
             //TODO: Needed?
             if(generalConfig.getScoreboardsEnabled())
@@ -660,13 +668,14 @@ public class mcMMO extends JavaPlugin {
         }
 
         // Automatically remove old members from parties
-        long kickIntervalTicks = generalConfig.getAutoPartyKickInterval() * 60L * 60L * Misc.TICK_CONVERSION_FACTOR;
+        if(partyConfig.isPartyEnabled()) {
+            long kickIntervalTicks = generalConfig.getAutoPartyKickInterval() * 60L * 60L * Misc.TICK_CONVERSION_FACTOR;
 
-        if (kickIntervalTicks == 0) {
-            getFoliaLib().getImpl().runLater(new PartyAutoKickTask(), 2 * Misc.TICK_CONVERSION_FACTOR); // Start 2 seconds after startup.
-        }
-        else if (kickIntervalTicks > 0) {
-            getFoliaLib().getImpl().runTimer(new PartyAutoKickTask(), kickIntervalTicks, kickIntervalTicks);
+            if (kickIntervalTicks == 0) {
+                getFoliaLib().getImpl().runLater(new PartyAutoKickTask(), 2 * Misc.TICK_CONVERSION_FACTOR); // Start 2 seconds after startup.
+            } else if (kickIntervalTicks > 0) {
+                getFoliaLib().getImpl().runTimer(new PartyAutoKickTask(), kickIntervalTicks, kickIntervalTicks);
+            }
         }
 
         // Update power level tag scoreboards
@@ -780,6 +789,23 @@ public class mcMMO extends JavaPlugin {
         return advancedConfig;
     }
 
+    public @NotNull PartyConfig getPartyConfig() {
+        return partyConfig;
+    }
+
+    /**
+     * Check if the party system is enabled
+     *
+     * @return true if the party system is enabled, false otherwise
+     */
+    public boolean isPartySystemEnabled() {
+        return partyConfig.isPartyEnabled();
+    }
+
+    public PartyManager getPartyManager() {
+        return partyManager;
+    }
+
     public @NotNull FoliaLib getFoliaLib() {
         return foliaLib;
     }

+ 221 - 240
src/main/java/com/gmail/nossr50/party/PartyManager.java

@@ -22,6 +22,8 @@ import com.gmail.nossr50.util.sounds.SoundType;
 import org.bukkit.OfflinePlayer;
 import org.bukkit.configuration.file.YamlConfiguration;
 import org.bukkit.entity.Player;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 import java.io.File;
 import java.util.ArrayList;
@@ -31,104 +33,44 @@ import java.util.Map.Entry;
 import java.util.UUID;
 import java.util.logging.Level;
 
-public final class PartyManager {
-    private static final String partiesFilePath = mcMMO.getFlatFileDirectory() + "parties.yml";
-    private static final List<Party> parties = new ArrayList<>();
-    private static final File partyFile = new File(partiesFilePath);
-
-    private PartyManager() {}
+import static java.util.Objects.requireNonNull;
 
-    /**
-     * Check if a party with a given name already exists.
-     *
-     * @param player The player to notify
-     * @param partyName The name of the party to check
-     * @return true if a party with that name exists, false otherwise
-     */
-    public static boolean checkPartyExistence(Player player, String partyName) {
-        if (getParty(partyName) == null) {
-            return false;
-        }
+public final class PartyManager {
+    private final @NotNull List<Party> parties;
+    private final @NotNull File partyFile;
+    private final @NotNull mcMMO pluginRef;
 
-        player.sendMessage(LocaleLoader.getString("Commands.Party.AlreadyExists", partyName));
-        return true;
+    public PartyManager(@NotNull mcMMO pluginRef) {
+        this.pluginRef = pluginRef;
+        final String partiesFilePath = mcMMO.getFlatFileDirectory() + "parties.yml";
+        this.partyFile = new File(partiesFilePath);
+        this.parties = new ArrayList<>();
     }
 
     /**
      * Checks if the player can join a party, parties can have a size limit, although there is a permission to bypass this
-     * @param player player who is attempting to join the party
+     *
+     * @param player      player who is attempting to join the party
      * @param targetParty the target party
      * @return true if party is full and cannot be joined
      */
-    public static boolean isPartyFull(Player player, Party targetParty)
-    {
-        return !Permissions.partySizeBypass(player) && mcMMO.p.getGeneralConfig().getPartyMaxSize() >= 1 && targetParty.getOnlineMembers().size() >= mcMMO.p.getGeneralConfig().getPartyMaxSize();
-    }
-
-    /**
-     * Attempt to change parties or join a new party.
-     *
-     * @param mcMMOPlayer The player changing or joining parties
-     * @param newPartyName The name of the party being joined
-     * @return true if the party was joined successfully, false otherwise
-     */
-    public static boolean changeOrJoinParty(McMMOPlayer mcMMOPlayer, String newPartyName) {
-        Player player = mcMMOPlayer.getPlayer();
-
-        if (mcMMOPlayer.inParty()) {
-            Party oldParty = mcMMOPlayer.getParty();
-
-            if (!handlePartyChangeEvent(player, oldParty.getName(), newPartyName, EventReason.CHANGED_PARTIES)) {
-                return false;
-            }
-
-            removeFromParty(mcMMOPlayer);
-        }
-        else return handlePartyChangeEvent(player, null, newPartyName, EventReason.JOINED_PARTY);
-
-        return true;
+    public boolean isPartyFull(@NotNull Player player, @NotNull Party targetParty) {
+        requireNonNull(player, "player cannot be null!");
+        requireNonNull(targetParty, "targetParty cannot be null!");
+        return !Permissions.partySizeBypass(player) && pluginRef.getGeneralConfig().getPartyMaxSize() >= 1 && targetParty.getOnlineMembers().size() >= pluginRef.getGeneralConfig().getPartyMaxSize();
     }
 
-    /**
-     * Check if two online players are in the same party.
-     *
-     * @param firstPlayer The first player
-     * @param secondPlayer The second player
-     * @return true if they are in the same party, false otherwise
-     */
-    public static boolean inSameParty(Player firstPlayer, Player secondPlayer) {
-        //Profile not loaded
-        if(UserManager.getPlayer(firstPlayer) == null)
-        {
-            return false;
-        }
-
-        //Profile not loaded
-        if(UserManager.getPlayer(secondPlayer) == null)
-        {
-            return false;
-        }
-
-        Party firstParty = UserManager.getPlayer(firstPlayer).getParty();
-        Party secondParty = UserManager.getPlayer(secondPlayer).getParty();
-
-        if (firstParty == null || secondParty == null) {
-            return false;
-        }
-
-        return firstParty.equals(secondParty);
-    }
+    public boolean areAllies(@NotNull Player firstPlayer, @NotNull Player secondPlayer) {
+        requireNonNull(firstPlayer, "firstPlayer cannot be null!");
+        requireNonNull(secondPlayer, "secondPlayer cannot be null!");
 
-    public static boolean areAllies(Player firstPlayer, Player secondPlayer) {
         //Profile not loaded
-        if(UserManager.getPlayer(firstPlayer) == null)
-        {
+        if (UserManager.getPlayer(firstPlayer) == null) {
             return false;
         }
 
         //Profile not loaded
-        if(UserManager.getPlayer(secondPlayer) == null)
-        {
+        if (UserManager.getPlayer(secondPlayer) == null) {
             return false;
         }
 
@@ -145,16 +87,17 @@ public final class PartyManager {
     /**
      * Get the near party members.
      *
-     * @param mcMMOPlayer The player to check
+     * @param mmoPlayer The player to check
      * @return the near party members
      */
-    public static List<Player> getNearMembers(McMMOPlayer mcMMOPlayer) {
+    public @NotNull List<Player> getNearMembers(@NotNull McMMOPlayer mmoPlayer) {
+        requireNonNull(mmoPlayer, "mmoPlayer cannot be null!");
         List<Player> nearMembers = new ArrayList<>();
-        Party party = mcMMOPlayer.getParty();
+        Party party = mmoPlayer.getParty();
 
         if (party != null) {
-            Player player = mcMMOPlayer.getPlayer();
-            double range = mcMMO.p.getGeneralConfig().getPartyShareRange();
+            Player player = mmoPlayer.getPlayer();
+            double range = pluginRef.getGeneralConfig().getPartyShareRange();
 
             for (Player member : party.getOnlineMembers()) {
                 if (!player.equals(member) && member.isValid() && Misc.isNear(player.getLocation(), member.getLocation(), range)) {
@@ -166,13 +109,14 @@ public final class PartyManager {
         return nearMembers;
     }
 
-    public static List<Player> getNearVisibleMembers(McMMOPlayer mcMMOPlayer) {
+    public @NotNull List<Player> getNearVisibleMembers(@NotNull McMMOPlayer mmoPlayer) {
+        requireNonNull(mmoPlayer, "mmoPlayer cannot be null!");
         List<Player> nearMembers = new ArrayList<>();
-        Party party = mcMMOPlayer.getParty();
+        Party party = mmoPlayer.getParty();
 
         if (party != null) {
-            Player player = mcMMOPlayer.getPlayer();
-            double range = mcMMO.p.getGeneralConfig().getPartyShareRange();
+            Player player = mmoPlayer.getPlayer();
+            double range = pluginRef.getGeneralConfig().getPartyShareRange();
 
             for (Player member : party.getVisibleMembers(player)) {
                 if (!player.equals(member)
@@ -186,14 +130,14 @@ public final class PartyManager {
         return nearMembers;
     }
 
-
     /**
      * Get a list of all players in this player's party.
      *
      * @param player The player to check
      * @return all the players in the player's party
      */
-    public static LinkedHashMap<UUID, String> getAllMembers(Player player) {
+    public @NotNull LinkedHashMap<UUID, String> getAllMembers(@NotNull Player player) {
+        requireNonNull(player, "player cannot be null!");
         Party party = getParty(player);
 
         return party == null ? new LinkedHashMap<>() : party.getMembers();
@@ -205,7 +149,8 @@ public final class PartyManager {
      * @param partyName The party to check
      * @return all online players in this party
      */
-    public static List<Player> getOnlineMembers(String partyName) {
+    public @NotNull List<Player> getOnlineMembers(@NotNull String partyName) {
+        requireNonNull(partyName, "partyName cannot be null!");
         return getOnlineMembers(getParty(partyName));
     }
 
@@ -215,11 +160,12 @@ public final class PartyManager {
      * @param player The player to check
      * @return all online players in this party
      */
-    public static List<Player> getOnlineMembers(Player player) {
+    public @NotNull List<Player> getOnlineMembers(@NotNull Player player) {
+        requireNonNull(player, "player cannot be null!");
         return getOnlineMembers(getParty(player));
     }
 
-    private static List<Player> getOnlineMembers(Party party) {
+    private List<Player> getOnlineMembers(@Nullable Party party) {
         return party == null ? new ArrayList<>() : party.getOnlineMembers();
     }
 
@@ -229,7 +175,8 @@ public final class PartyManager {
      * @param partyName The party name
      * @return the existing party, null otherwise
      */
-    public static Party getParty(String partyName) {
+    public @Nullable Party getParty(@NotNull String partyName) {
+        requireNonNull(partyName, "partyName cannot be null!");
         for (Party party : parties) {
             if (party.getName().equalsIgnoreCase(partyName)) {
                 return party;
@@ -246,9 +193,10 @@ public final class PartyManager {
      * @return the existing party, null otherwise
      */
     @Deprecated
-    public static Party getPlayerParty(String playerName) {
+    public @Nullable Party getPlayerParty(@NotNull String playerName) {
+        requireNonNull(playerName, "playerName cannot be null!");
         for (Party party : parties) {
-            if (party.getMembers().containsKey(playerName)) {
+            if (party.getMembers().containsValue(playerName)) {
                 return party;
             }
         }
@@ -262,7 +210,9 @@ public final class PartyManager {
      * @param uuid The members uuid
      * @return the existing party, null otherwise
      */
-    public static Party getPlayerParty(String playerName, UUID uuid) {
+    public @Nullable Party getPlayerParty(@NotNull String playerName, @NotNull UUID uuid) {
+        requireNonNull(playerName, "playerName cannot be null!");
+        requireNonNull(uuid, "uuid cannot be null!");
         for (Party party : parties) {
             LinkedHashMap<UUID, String> members = party.getMembers();
             if (members.containsKey(uuid) || members.containsValue(playerName)) {
@@ -285,16 +235,18 @@ public final class PartyManager {
      * @param player The member
      * @return the existing party, null otherwise
      */
-    public static Party getParty(Player player) {
+    public @Nullable Party getParty(@NotNull Player player) {
+        requireNonNull(player, "player cannot be null!");
         //Profile not loaded
-        if(UserManager.getPlayer(player) == null)
-        {
+        if (UserManager.getPlayer(player) == null) {
             return null;
         }
 
-        McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
+        final McMMOPlayer mmoPlayer = UserManager.getPlayer(player);
+        if(mmoPlayer == null)
+            return null;
 
-        return mcMMOPlayer.getParty();
+        return mmoPlayer.getParty();
     }
 
     /**
@@ -302,7 +254,7 @@ public final class PartyManager {
      *
      * @return the list of parties.
      */
-    public static List<Party> getParties() {
+    public @NotNull List<Party> getParties() {
         return parties;
     }
 
@@ -310,9 +262,12 @@ public final class PartyManager {
      * Remove a player from a party.
      *
      * @param player The player to remove
-     * @param party The party
+     * @param party  The party
      */
-    public static void removeFromParty(OfflinePlayer player, Party party) {
+    public void removeFromParty(@NotNull OfflinePlayer player, @NotNull Party party) {
+        requireNonNull(player, "player cannot be null!");
+        requireNonNull(party, "party cannot be null!");
+
         LinkedHashMap<UUID, String> members = party.getMembers();
         String playerName = player.getName();
 
@@ -324,8 +279,7 @@ public final class PartyManager {
 
         if (members.isEmpty()) {
             parties.remove(party);
-        }
-        else {
+        } else {
             // If the leaving player was the party leader, appoint a new leader from the party members
             if (party.getLeader().getUniqueId().equals(player.getUniqueId())) {
                 setPartyLeader(members.keySet().iterator().next(), party);
@@ -340,7 +294,12 @@ public final class PartyManager {
      *
      * @param mcMMOPlayer The player to remove
      */
-    public static void removeFromParty(McMMOPlayer mcMMOPlayer) {
+    public void removeFromParty(@NotNull McMMOPlayer mcMMOPlayer) {
+        requireNonNull(mcMMOPlayer, "mcMMOPlayer cannot be null!");
+        if (mcMMOPlayer.getParty() == null) {
+            return;
+        }
+
         removeFromParty(mcMMOPlayer.getPlayer(), mcMMOPlayer.getParty());
         processPartyLeaving(mcMMOPlayer);
     }
@@ -351,21 +310,23 @@ public final class PartyManager {
      * @param party The party to remove
      * @deprecated Use {@link #disbandParty(McMMOPlayer, Party)}
      */
-    public static void disbandParty(Party party) {
+    public void disbandParty(@NotNull Party party) {
+        requireNonNull(party, "party cannot be null!");
         disbandParty(null, party);
     }
 
     /**
      * Disband a party. Kicks out all members and removes the party.
      *
+     * @param mcMMOPlayer The player to remove (can be null? lol)
      * @param party The party to remove
      */
-    public static void disbandParty(McMMOPlayer mcMMOPlayer, Party party) {
+    public void disbandParty(@Nullable McMMOPlayer mcMMOPlayer, @NotNull Party party) {
+        requireNonNull(party, "party cannot be null!");
         //TODO: Potential issues with unloaded profile?
         for (final Player member : party.getOnlineMembers()) {
             //Profile not loaded
-            if(UserManager.getPlayer(member) == null)
-            {
+            if (UserManager.getPlayer(member) == null) {
                 continue;
             }
 
@@ -387,10 +348,13 @@ public final class PartyManager {
      * Create a new party
      *
      * @param mcMMOPlayer The player to add to the party
-     * @param partyName The party to add the player to
-     * @param password The password for this party, null if there was no password
+     * @param partyName   The party to add the player to
+     * @param password    The password for this party, null if there was no password
      */
-    public static void createParty(McMMOPlayer mcMMOPlayer, String partyName, String password) {
+    public void createParty(@NotNull McMMOPlayer mcMMOPlayer, @NotNull String partyName, @Nullable String password) {
+        requireNonNull(mcMMOPlayer, "mcMMOPlayer cannot be null!");
+        requireNonNull(partyName, "partyName cannot be null!");
+
         Player player = mcMMOPlayer.getPlayer();
 
         Party party = new Party(new PartyLeader(player.getUniqueId(), player.getName()), partyName.replace(".", ""), password);
@@ -409,12 +373,12 @@ public final class PartyManager {
     /**
      * Check if a player can join a party
      *
-     * @param player The player trying to join a party
-     * @param party The party
+     * @param player   The player trying to join a party
+     * @param party    The party
      * @param password The password provided by the player
      * @return true if the player can join the party
      */
-    public static boolean checkPartyPassword(Player player, Party party, String password) {
+    public boolean checkPartyPassword(@NotNull Player player, @NotNull Party party, @Nullable String password) {
         if (party.isLocked()) {
             String partyPassword = party.getPassword();
 
@@ -442,7 +406,8 @@ public final class PartyManager {
      *
      * @param mcMMOPlayer The player to add to the party
      */
-    public static void joinInvitedParty(McMMOPlayer mcMMOPlayer) {
+    public void joinInvitedParty(@NotNull McMMOPlayer mcMMOPlayer) {
+        requireNonNull(mcMMOPlayer, "mcMMOPlayer cannot be null!");
         Party invite = mcMMOPlayer.getPartyInvite();
 
         // Check if the party still exists, it might have been disbanded
@@ -454,9 +419,8 @@ public final class PartyManager {
         /*
          * Don't let players join a full party
          */
-        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(mcMMO.p.getGeneralConfig().getPartyMaxSize()));
+        if (pluginRef.getGeneralConfig().getPartyMaxSize() > 0 && invite.getMembers().size() >= pluginRef.getGeneralConfig().getPartyMaxSize()) {
+            NotificationManager.sendPlayerInformation(mcMMOPlayer.getPlayer(), NotificationType.PARTY_MESSAGE, "Commands.Party.PartyFull.InviteAccept", invite.getName(), String.valueOf(pluginRef.getGeneralConfig().getPartyMaxSize()));
             return;
         }
 
@@ -470,7 +434,8 @@ public final class PartyManager {
      *
      * @param mcMMOPlayer The player who accepts the alliance invite
      */
-    public static void acceptAllianceInvite(McMMOPlayer mcMMOPlayer) {
+    public void acceptAllianceInvite(@NotNull McMMOPlayer mcMMOPlayer) {
+        requireNonNull(mcMMOPlayer, "mcMMOPlayer cannot be null!");
         Party invite = mcMMOPlayer.getPartyAllianceInvite();
         Player player = mcMMOPlayer.getPlayer();
 
@@ -490,7 +455,10 @@ public final class PartyManager {
         createAlliance(mcMMOPlayer.getParty(), invite);
     }
 
-    public static void createAlliance(Party firstParty, Party secondParty) {
+    public void createAlliance(@NotNull Party firstParty, @NotNull Party secondParty) {
+        requireNonNull(firstParty, "firstParty cannot be null!");
+        requireNonNull(secondParty, "secondParty cannot be null!");
+
         firstParty.setAlly(secondParty);
         secondParty.setAlly(firstParty);
 
@@ -503,16 +471,22 @@ public final class PartyManager {
         }
     }
 
-    public static boolean disbandAlliance(Player player, Party firstParty, Party secondParty){
+    public boolean disbandAlliance(@NotNull Player player, @NotNull Party firstParty, @NotNull Party secondParty) {
+        requireNonNull(player, "player cannot be null!");
+        requireNonNull(firstParty, "firstParty cannot be null!");
+        requireNonNull(secondParty, "secondParty cannot be null!");
+
         if (!handlePartyChangeAllianceEvent(player, firstParty.getName(), secondParty.getName(), McMMOPartyAllianceChangeEvent.EventReason.DISBAND_ALLIANCE)) {
             return false;
         }
 
-        PartyManager.disbandAlliance(firstParty, secondParty);
+        disbandAlliance(firstParty, secondParty);
         return true;
     }
 
-    private static void disbandAlliance(Party firstParty, Party secondParty) {
+    private void disbandAlliance(@NotNull Party firstParty, @NotNull Party secondParty) {
+        requireNonNull(firstParty, "firstParty cannot be null!");
+        requireNonNull(secondParty, "secondParty cannot be null!");
         firstParty.setAlly(null);
         secondParty.setAlly(null);
 
@@ -529,9 +503,12 @@ public final class PartyManager {
      * Add a player to a party
      *
      * @param mcMMOPlayer The player to add to the party
-     * @param party The party
+     * @param party       The party
      */
-    public static void addToParty(McMMOPlayer mcMMOPlayer, Party party) {
+    public void addToParty(@NotNull McMMOPlayer mcMMOPlayer, @NotNull Party party) {
+        requireNonNull(mcMMOPlayer, "mcMMOPlayer cannot be null!");
+        requireNonNull(party, "party cannot be null!");
+
         Player player = mcMMOPlayer.getPlayer();
         String playerName = player.getName();
 
@@ -547,7 +524,8 @@ public final class PartyManager {
      * @param partyName The party name
      * @return the leader of the party
      */
-    public static String getPartyLeaderName(String partyName) {
+    public @Nullable String getPartyLeaderName(@NotNull String partyName) {
+        requireNonNull(partyName, "partyName cannot be null!");
         Party party = getParty(partyName);
 
         return party == null ? null : party.getLeader().getPlayerName();
@@ -556,11 +534,13 @@ public final class PartyManager {
     /**
      * Set the leader of a party.
      *
-     * @param uuid The uuid of the player to set as leader
+     * @param uuid  The uuid of the player to set as leader
      * @param party The party
      */
-    public static void setPartyLeader(UUID uuid, Party party) {
-        OfflinePlayer player = mcMMO.p.getServer().getOfflinePlayer(uuid);
+    public void setPartyLeader(@NotNull UUID uuid, @NotNull Party party) {
+        requireNonNull(uuid, "uuid cannot be null!");
+        requireNonNull(party, "party cannot be null!");
+        OfflinePlayer player = pluginRef.getServer().getOfflinePlayer(uuid);
         UUID leaderUniqueId = party.getLeader().getUniqueId();
 
         for (Player member : party.getOnlineMembers()) {
@@ -568,11 +548,9 @@ public final class PartyManager {
 
             if (memberUniqueId.equals(player.getUniqueId())) {
                 member.sendMessage(LocaleLoader.getString("Party.Owner.Player"));
-            }
-            else if (memberUniqueId.equals(leaderUniqueId)) {
+            } else if (memberUniqueId.equals(leaderUniqueId)) {
                 member.sendMessage(LocaleLoader.getString("Party.Owner.NotLeader"));
-            }
-            else {
+            } else {
                 member.sendMessage(LocaleLoader.getString("Party.Owner.New", player.getName()));
             }
         }
@@ -585,25 +563,97 @@ public final class PartyManager {
      *
      * @return true if the player can invite
      */
-    public static boolean canInvite(McMMOPlayer mcMMOPlayer) {
+    public boolean canInvite(@NotNull McMMOPlayer mcMMOPlayer) {
+        requireNonNull(mcMMOPlayer, "mcMMOPlayer cannot be null!");
         Party party = mcMMOPlayer.getParty();
 
         return !party.isLocked() || party.getLeader().getUniqueId().equals(mcMMOPlayer.getPlayer().getUniqueId());
     }
 
+    /**
+     * Check if a party with a given name already exists.
+     *
+     * @param player    The player to notify
+     * @param partyName The name of the party to check
+     * @return true if a party with that name exists, false otherwise
+     */
+    public boolean checkPartyExistence(@NotNull Player player, @NotNull String partyName) {
+        requireNonNull(player, "player cannot be null!");
+        requireNonNull(partyName, "partyName cannot be null!");
+
+        if (getParty(partyName) == null) {
+            return false;
+        }
+
+        player.sendMessage(LocaleLoader.getString("Commands.Party.AlreadyExists", partyName));
+        return true;
+    }
+
+    /**
+     * Attempt to change parties or join a new party.
+     *
+     * @param mmoPlayer    The player changing or joining parties
+     * @param newPartyName The name of the party being joined
+     * @return true if the party was joined successfully, false otherwise
+     */
+    public boolean changeOrJoinParty(@NotNull McMMOPlayer mmoPlayer, @NotNull String newPartyName) {
+        requireNonNull(mmoPlayer, "mmoPlayer cannot be null!");
+        requireNonNull(newPartyName, "newPartyName cannot be null!");
+
+        final Player player = mmoPlayer.getPlayer();
+
+        if (mmoPlayer.inParty()) {
+            final Party oldParty = mmoPlayer.getParty();
+
+            if (!handlePartyChangeEvent(player, oldParty.getName(), newPartyName, EventReason.CHANGED_PARTIES)) {
+                return false;
+            }
+
+            removeFromParty(mmoPlayer);
+        } else return handlePartyChangeEvent(player, null, newPartyName, EventReason.JOINED_PARTY);
+
+        return true;
+    }
+
+    /**
+     * Check if two online players are in the same party.
+     *
+     * @param firstPlayer  The first player
+     * @param secondPlayer The second player
+     * @return true if they are in the same party, false otherwise
+     */
+    public boolean inSameParty(@NotNull Player firstPlayer, @NotNull Player secondPlayer) {
+        requireNonNull(firstPlayer, "firstPlayer cannot be null!");
+        requireNonNull(secondPlayer, "secondPlayer cannot be null!");
+
+        //Profile not loaded
+        if (UserManager.getPlayer(firstPlayer) == null) {
+            return false;
+        }
+
+        //Profile not loaded
+        if (UserManager.getPlayer(secondPlayer) == null) {
+            return false;
+        }
+
+        Party firstParty = UserManager.getPlayer(firstPlayer).getParty();
+        Party secondParty = UserManager.getPlayer(secondPlayer).getParty();
+
+        if (firstParty == null || secondParty == null) {
+            return false;
+        }
+
+        return firstParty.equals(secondParty);
+    }
+
     /**
      * Load party file.
      */
-    public static void loadParties() {
-        if (!partyFile.exists()) {
+    public void loadParties() {
+        if (!pluginRef.getPartyConfig().isPartyEnabled() || !partyFile.exists()) {
             return;
         }
 
-//        if (mcMMO.getUpgradeManager().shouldUpgrade(UpgradeType.ADD_UUIDS_PARTY)) {
-//            loadAndUpgradeParties();
-//            return;
-//        }
-
         try {
             YamlConfiguration partiesFile;
             partiesFile = YamlConfiguration.loadConfiguration(partyFile);
@@ -641,31 +691,30 @@ public final class PartyManager {
 
                     parties.add(party);
                 } catch (Exception e) {
-                    mcMMO.p.getLogger().log(Level.WARNING, "An exception occurred while loading a party with name '" + partyName + "'. Skipped loading party.", e);
+                    pluginRef.getLogger().log(Level.WARNING, "An exception occurred while loading a party with name '" + partyName + "'. Skipped loading party.", e);
                 }
             }
 
-            LogUtils.debug(mcMMO.p.getLogger(), "Loaded (" + parties.size() + ") Parties...");
+            LogUtils.debug(pluginRef.getLogger(), "Loaded (" + parties.size() + ") Parties...");
 
             for (Party party : hasAlly) {
-                party.setAlly(PartyManager.getParty(partiesFile.getString(party.getName() + ".Ally")));
+                party.setAlly(getParty(partiesFile.getString(party.getName() + ".Ally")));
             }
 
         } catch (Exception e) {
             e.printStackTrace();
         }
-
     }
 
     /**
      * Save party file.
      */
-    public static void saveParties() {
-        LogUtils.debug(mcMMO.p.getLogger(), "[Party Data] Saving...");
+    public void saveParties() {
+        LogUtils.debug(pluginRef.getLogger(), "[Party Data] Saving...");
 
         if (partyFile.exists()) {
             if (!partyFile.delete()) {
-                mcMMO.p.getLogger().warning("Could not delete party file. Party saving failed!");
+                pluginRef.getLogger().warning("Could not delete party file. Party saving failed!");
                 return;
             }
         }
@@ -705,91 +754,23 @@ public final class PartyManager {
 
         try {
             partiesFile.save(partyFile);
-        }
-        catch (Exception e) {
+        } catch (Exception e) {
             e.printStackTrace();
         }
     }
 
-//    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<Party> 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<UUID, String> 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);
-//        }
-//
-//        LogUtils.debug(mcMMO.p.getLogger(), "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.
      *
-     * @param player The player changing parties
+     * @param player       The player changing parties
      * @param oldPartyName The name of the old party
      * @param newPartyName The name of the new party
-     * @param reason The reason for changing parties
+     * @param reason       The reason for changing parties
      * @return true if the change event was successful, false otherwise
      */
-    public static boolean handlePartyChangeEvent(Player player, String oldPartyName, String newPartyName, EventReason reason) {
+    public boolean handlePartyChangeEvent(Player player, String oldPartyName, String newPartyName, EventReason reason) {
         McMMOPartyChangeEvent event = new McMMOPartyChangeEvent(player, oldPartyName, newPartyName, reason);
-        mcMMO.p.getServer().getPluginManager().callEvent(event);
+        pluginRef.getServer().getPluginManager().callEvent(event);
 
         return !event.isCancelled();
     }
@@ -797,15 +778,15 @@ public final class PartyManager {
     /**
      * Handle party alliance change event.
      *
-     * @param player The player changing party alliances
+     * @param player      The player changing party alliances
      * @param oldAllyName The name of the old ally
      * @param newAllyName The name of the new ally
-     * @param reason The reason for changing allies
+     * @param reason      The reason for changing allies
      * @return true if the change event was successful, false otherwise
      */
-    public static boolean handlePartyChangeAllianceEvent(Player player, String oldAllyName, String newAllyName, McMMOPartyAllianceChangeEvent.EventReason reason) {
+    public boolean handlePartyChangeAllianceEvent(Player player, String oldAllyName, String newAllyName, McMMOPartyAllianceChangeEvent.EventReason reason) {
         McMMOPartyAllianceChangeEvent event = new McMMOPartyAllianceChangeEvent(player, oldAllyName, newAllyName, reason);
-        mcMMO.p.getServer().getPluginManager().callEvent(event);
+        pluginRef.getServer().getPluginManager().callEvent(event);
 
         return !event.isCancelled();
     }
@@ -815,7 +796,7 @@ public final class PartyManager {
      *
      * @param mcMMOPlayer The player to remove party data from.
      */
-    public static void processPartyLeaving(McMMOPlayer mcMMOPlayer) {
+    public void processPartyLeaving(@NotNull McMMOPlayer mcMMOPlayer) {
         mcMMOPlayer.removeParty();
         mcMMOPlayer.setChatMode(ChatChannel.NONE);
         mcMMOPlayer.setItemShareModifier(10);
@@ -824,12 +805,12 @@ public final class PartyManager {
     /**
      * Notify party members when the party levels up.
      *
-     * @param party The concerned party
+     * @param party        The concerned party
      * @param levelsGained The amount of levels gained
-     * @param level The current party level
+     * @param level        The current party level
      */
-    public static void informPartyMembersLevelUp(Party party, int levelsGained, int level) {
-        boolean levelUpSoundsEnabled = mcMMO.p.getGeneralConfig().getLevelUpSoundsEnabled();
+    public void informPartyMembersLevelUp(Party party, int levelsGained, int level) {
+        boolean levelUpSoundsEnabled = pluginRef.getGeneralConfig().getLevelUpSoundsEnabled();
         for (Player member : party.getOnlineMembers()) {
             member.sendMessage(LocaleLoader.getString("Party.LevelUp", levelsGained, level));
 
@@ -842,10 +823,10 @@ public final class PartyManager {
     /**
      * Notify party members when a player joins.
      *
-     * @param party The concerned party
+     * @param party      The concerned party
      * @param playerName The name of the player that joined
      */
-    private static void informPartyMembersJoin(Party party, String playerName) {
+    private void informPartyMembersJoin(Party party, String playerName) {
         for (Player member : party.getOnlineMembers()) {
             member.sendMessage(LocaleLoader.getString("Party.InformedOnJoin", playerName));
         }
@@ -854,10 +835,10 @@ public final class PartyManager {
     /**
      * Notify party members when a party member quits.
      *
-     * @param party The concerned party
+     * @param party      The concerned party
      * @param playerName The name of the player that left
      */
-    private static void informPartyMembersQuit(Party party, String playerName) {
+    private void informPartyMembersQuit(Party party, String playerName) {
         for (Player member : party.getOnlineMembers()) {
             member.sendMessage(LocaleLoader.getString("Party.InformedOnQuit", playerName));
         }

+ 2 - 2
src/main/java/com/gmail/nossr50/party/ShareHandler.java

@@ -35,7 +35,7 @@ public final class ShareHandler {
             return false;
         }
 
-        List<Player> nearMembers = PartyManager.getNearVisibleMembers(mcMMOPlayer);
+        List<Player> nearMembers = mcMMO.p.getPartyManager().getNearVisibleMembers(mcMMOPlayer);
 
         if (nearMembers.isEmpty()) {
             return false;
@@ -87,7 +87,7 @@ public final class ShareHandler {
             return false;
         }
 
-        List<Player> nearMembers = PartyManager.getNearMembers(mcMMOPlayer);
+        List<Player> nearMembers = mcMMO.p.getPartyManager().getNearMembers(mcMMOPlayer);
 
         if (nearMembers.isEmpty()) {
             return false;

+ 2 - 2
src/main/java/com/gmail/nossr50/runnables/SaveTimerTask.java

@@ -20,7 +20,7 @@ public class SaveTimerTask extends CancellableRunnable {
             count++;
         }
 
-
-        PartyManager.saveParties();
+        if(mcMMO.p.getPartyConfig().isPartyEnabled())
+            mcMMO.p.getPartyManager().saveParties();
     }
 }

+ 1 - 1
src/main/java/com/gmail/nossr50/runnables/items/TeleportationWarmup.java

@@ -32,7 +32,7 @@ public class TeleportationWarmup extends CancellableRunnable {
 
         mcMMOPlayer.setTeleportCommenceLocation(null);
 
-        if (!PartyManager.inSameParty(teleportingPlayer, targetPlayer)) {
+        if (!mcMMO.p.getPartyManager().inSameParty(teleportingPlayer, targetPlayer)) {
             teleportingPlayer.sendMessage(LocaleLoader.getString("Party.NotInYourParty", targetPlayer.getName()));
             return;
         }

+ 2 - 2
src/main/java/com/gmail/nossr50/runnables/party/PartyAutoKickTask.java

@@ -22,7 +22,7 @@ public class PartyAutoKickTask extends CancellableRunnable {
 
         long currentTime = System.currentTimeMillis();
 
-        for (Party party : PartyManager.getParties()) {
+        for (Party party : mcMMO.p.getPartyManager().getParties()) {
             for (UUID memberUniqueId : party.getMembers().keySet()) {
                 OfflinePlayer member = mcMMO.p.getServer().getOfflinePlayer(memberUniqueId);
                 boolean isProcessed = processedPlayers.contains(memberUniqueId);
@@ -38,7 +38,7 @@ public class PartyAutoKickTask extends CancellableRunnable {
         }
 
         for (Entry<OfflinePlayer, Party> entry : toRemove.entrySet()) {
-            PartyManager.removeFromParty(entry.getKey(), entry.getValue());
+            mcMMO.p.getPartyManager().removeFromParty(entry.getKey(), entry.getValue());
         }
     }
 }

+ 4 - 57
src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java

@@ -145,15 +145,6 @@ public final class CommandRegistrationManager {
         command.setExecutor(new McgodCommand());
     }
 
-//    private static void registerDropTreasureCommand() {
-//        PluginCommand command = mcMMO.p.getCommand("mmodroptreasures");
-//        command.setDescription(LocaleLoader.getString("Commands.Description.droptreasures"));
-//        command.setPermission("mcmmo.commands.droptreasures");
-//        command.setPermissionMessage(permissionsMessage);
-//        command.setUsage(LocaleLoader.getString("Commands.Usage.0", "mcgod"));
-//        command.setExecutor(new DropTreasureCommand());
-//    }
-
     private static void registerMmoInfoCommand() {
         PluginCommand command = mcMMO.p.getCommand("mmoinfo");
         command.setDescription(LocaleLoader.getString("Commands.Description.mmoinfo"));
@@ -323,28 +314,6 @@ public final class CommandRegistrationManager {
         command.setExecutor(new McconvertCommand());
     }
 
-//    private static void registerAdminChatCommand() {
-//        PluginCommand command = mcMMO.p.getCommand("adminchat");
-//        command.setDescription(LocaleLoader.getString("Commands.Description.adminchat"));
-//        command.setPermission("mcmmo.chat.adminchat");
-//        command.setPermissionMessage(permissionsMessage);
-//        command.setUsage(LocaleLoader.getString("Commands.Usage.0", "adminchat"));
-//        command.setUsage(command.getUsage() + "\n" + LocaleLoader.getString("Commands.Usage.1", "adminchat", "<on|off>"));
-//        command.setUsage(command.getUsage() + "\n" + LocaleLoader.getString("Commands.Usage.1", "adminchat", "<" + LocaleLoader.getString("Commands.Usage.Message") + ">"));
-//        command.setExecutor(new AdminChatCommand());
-//    }
-
-//    private static void registerPartyChatCommand() {
-//        PluginCommand command = mcMMO.p.getCommand("partychat");
-//        command.setDescription(LocaleLoader.getString("Commands.Description.partychat"));
-//        command.setPermission("mcmmo.chat.partychat;mcmmo.commands.party");
-//        command.setPermissionMessage(permissionsMessage);
-//        command.setUsage(LocaleLoader.getString("Commands.Usage.0", "partychat"));
-//        command.setUsage(command.getUsage() + "\n" + LocaleLoader.getString("Commands.Usage.1", "partychat", "<on|off>"));
-//        command.setUsage(command.getUsage() + "\n" + LocaleLoader.getString("Commands.Usage.1", "partychat", "<" + LocaleLoader.getString("Commands.Usage.Message") + ">"));
-//        command.setExecutor(new PartyChatCommand());
-//    }
-
     private static void registerPartyCommand() {
         PluginCommand command = mcMMO.p.getCommand("party");
         command.setDescription(LocaleLoader.getString("Commands.Description.party"));
@@ -366,26 +335,6 @@ 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 registerMcnotifyCommand() {
         PluginCommand command = mcMMO.p.getCommand("mcnotify");
         command.setDescription(LocaleLoader.getString("Commands.Description.mcnotify"));
@@ -465,13 +414,11 @@ public final class CommandRegistrationManager {
         registerMmoeditCommand();
         registerSkillresetCommand();
 
-        // Hardcore Commands
-//        registerHardcoreCommand();
-//        registerVampirismCommand();
-
         // Party Commands
-        registerPartyCommand();
-        registerPtpCommand();
+        if (mcMMO.p.getPartyConfig().isPartyEnabled()) {
+            registerPartyCommand();
+            registerPtpCommand();
+        }
 
         // Player Commands
         registerInspectCommand();

+ 4 - 3
src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java

@@ -810,7 +810,8 @@ public final class CombatUtils {
 
         if (target instanceof Player defender) {
             if (!ExperienceConfig.getInstance().getExperienceGainsPlayerVersusPlayerEnabled()
-                    || PartyManager.inSameParty(mcMMOPlayer.getPlayer(), (Player) target)) {
+                    ||
+                    (mcMMO.p.getPartyConfig().isPartyEnabled() && mcMMO.p.getPartyManager().inSameParty(mcMMOPlayer.getPlayer(), (Player) target))) {
                 return;
             }
 
@@ -898,7 +899,7 @@ public final class CombatUtils {
                 return false;
             }
 
-            if ((PartyManager.inSameParty(player, defender) || PartyManager.areAllies(player, defender)) && !(Permissions.friendlyFire(player) && Permissions.friendlyFire(defender))) {
+            if ((mcMMO.p.getPartyManager().inSameParty(player, defender) || mcMMO.p.getPartyManager().areAllies(player, defender)) && !(Permissions.friendlyFire(player) && Permissions.friendlyFire(defender))) {
                 return false;
             }
 
@@ -949,7 +950,7 @@ public final class CombatUtils {
 
             if (tamer instanceof Player owner) {
 
-                return (owner == attacker || PartyManager.inSameParty(attacker, owner) || PartyManager.areAllies(attacker, owner));
+                return (owner == attacker || mcMMO.p.getPartyManager().inSameParty(attacker, owner) || mcMMO.p.getPartyManager().areAllies(attacker, owner));
             }
         }
 

+ 989 - 1122
src/main/resources/locale/locale_ko.properties

@@ -1,60 +1,49 @@
 # korean locale file v2.0
 # -----------------
-# Setting up a new standard for string names, for easier localization.
-# SkillName.SubType.LocalEffect.Increment
-# Skill name, such as ACROBATICS, MINING.
-# Sub-type, such as EFFECT, ABILITY, COMBAT.
-# Local Effect, local text for Skill Name; ACROBATICS_ROLL, IGNITIONTIME,GRACECHANCE.
-# Increment, for multi-line or array-like lists.
-# ######
-#
-# EXAMPLES:
-#
-# Acrobatics.Ability.Proc
-# Axes.Ability.Refresh.1
-#
-#                                 --wolfwork
+# Work : MangChi__ / JJangGu
+#로케일 파일을 정규화하려고 합니다. 지금은 혼란스러운 점을 용서해 주세요.
+# TODO: 16진수를 지원하도록 JSON을 업데이트합니다.
 
-#DO NOT USE COLOR CODES IN THE JSON KEYS
-#COLORS ARE DEFINED IN advanced.yml IF YOU WISH TO CHANGE THEM
-JSON.Rank=랭크
+#JSON 키에 색상 코드를 사용하지 마세요.
+#색상을 변경하려는 경우에는 Advanced.yml에 정의되어 있습니다.
+JSON.Rank=등급
 JSON.DescriptionHeader=설명
 JSON.JWrapper.Header=세부 정보
-JSON.Type.Passive=패시브
-JSON.Type.Active=액티브
+JSON.Type.Passive=수동적
+JSON.Type.Active=능동적
 JSON.Type.SuperAbility=슈퍼 능력
-JSON.Locked=-=[해금되지 않음]=-
+JSON.Locked=-=[잠김]=-
 JSON.LevelRequirement=레벨 요구 사항
 JSON.JWrapper.Target.Type=대상 유형:
 JSON.JWrapper.Target.Block=블록
 JSON.JWrapper.Target.Player=플레이어
-JSON.JWrapper.Perks.Header=&6행운 퍽
+JSON.JWrapper.Perks.Header=&6운이 좋은 특성
 JSON.JWrapper.Perks.Lucky={0}% 더 좋은 확률
 JSON.Hover.Tips=팁
 JSON.Acrobatics=곡예
 JSON.Alchemy=연금술
-JSON.Archery=궁술
-JSON.Axes=부술
-JSON.Excavation=발굴
+JSON.Archery=활쏘기
+JSON.Axes=참수
+JSON.Excavation=파괴
 JSON.Fishing=낚시
-JSON.Herbalism=약초
+JSON.Herbalism=약초 채집
 JSON.Mining=채광
 JSON.Repair=수리
-JSON.Salvage=회수
+JSON.Salvage=분해
 JSON.Swords=검술
-JSON.Taming=조련
-JSON.Unarmed=비무장
-JSON.Woodcutting=벌목
-JSON.URL.Website=mcMMO 공식 웹사이트!
-JSON.URL.Discord=mcMMO 공식 디스코드 서버!
-JSON.URL.Patreon=nossr50와 mcMMO를 위한 Patreon에서 지원하세요!
-JSON.URL.Spigot=mcMMO 공식 Spigot 리소스 페이지!
+JSON.Taming=길들이기
+JSON.Unarmed=맨손전투
+JSON.Woodcutting=나무 베기
+JSON.URL.Website=공식 mcMMO 웹사이트!
+JSON.URL.Discord=공식 mcMMO 디스코드 서버!
+JSON.URL.Patreon=nossr50과 mcMMO에 대한 작업을 Patreon에서 지원하세요!
+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.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에 {0}을 추가하여 필요한 레벨을 이름에 삽입할 수 있지만, 현재는 사용하지 않습니다.
 JSON.Hover.Mystery=&7???
 JSON.Hover.Mystery2=&e[&8{0}&e]&8???&r
 JSON.Hover.SkillName=&3{0}&r
@@ -63,29 +52,27 @@ JSON.Hover.MaxRankSkillName=&6{0}&r
 JSON.Hover.AtSymbolSkills=&e@
 JSON.Hover.AtSymbolURL=&e@
 
-#This is the message sent to players when an ability is activated
+# 능력이 활성화될 때 플레이어에게 전송되는 메시지입니다.
 JSON.Notification.SuperAbility={0}
 
-#These are the JSON Strings used for SubSkills
-JSON.Acrobatics.Roll.Interaction.Activated=테스트 &c구른 테스트
-JSON.Acrobatics.SubSkill.Roll.Details.Tips=낙하 중 웅크리기 키를 누르면 일반적으로 받을 데미지의 2배까지 방할 수 있습니다!
-Anvil.SingleItemStack=&c하나 이상의 아이템을 가진 아이템 스택은 회수하거나 수리할 수 없습니다. 먼저 스택을 분할하세요.
+# 하위 스킬에 사용되는 JSON 문자열입니다.
+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
-#COLORS ARE DEFINED IN advanced.yml IF YOU WISH TO CHANGE THEM
+#JSON 키에 색상 코드를 사용하지 마세요.
+#색상을 변경하려는 경우에는 Advanced.yml에 정의되어 있습니다.
 
 mcMMO.Template.Prefix=&6(&amcMMO&6) &7{0}
-
-# BEGIN STYLING
-Ability.Generic.Refresh=&a**능력이 갱신되었습니다!**
+# 스타일링 시작
+Ability.Generic.Refresh=&a**능력 갱신됨!**
 Ability.Generic.Template.Lock=&7{0}
-
-# Skill Command Styling
+# 스킬 명령어 스타일링
 Ability.Generic.Template=&3{0}: &a{1}
 Ability.Generic.Template.Custom=&3{0}
 Skills.Overhaul.Header=&c[]=====[]&a {0} &c[]=====[]
 Effects.Effects=효과
-Effects.SubSkills.Overhaul=부가 스킬
+Effects.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)
@@ -93,1197 +80,1077 @@ Effects.Parent=&6{0} -
 Effects.Template=&3{0}: &a{1}
 Commands.Stats.Self.Overhaul=스탯
 Commands.XPGain.Overhaul=&6경험치 획득: &3{0}
-MOTD.Version.Overhaul=&6[mcMMO] &3Overhaul 시대&6 - &3{0}
-Overhaul.mcMMO.Header=&c[]=====[]&a mcMMO - Overhaul 시대 &c[]=====[]
+MOTD.Version.Overhaul=&6[mcMMO] &3오버홀 시대&6 - &3{0}
+Overhaul.mcMMO.Header=&c[]=====[]&a mcMMO - 오버홀 시대 &c[]=====[]
 Overhaul.mcMMO.Url.Wrap.Prefix=&c[|
 Overhaul.mcMMO.Url.Wrap.Suffix=&c|]
-Overhaul.mcMMO.MmoInfo.Wiki=&e[&f이 스킬을 위키에서 보기!&e]
-
+Overhaul.mcMMO.MmoInfo.Wiki=&e[&f이 스킬을 위키에서 확인하세요!&e]
+# Overhaul.Levelup can take {0} - Skill Name defined in Overhaul.Name {1} - Amount of levels gained {2} - Level in skill
+Overhaul.Levelup=&l{0} 능력이 증가하여 &r&a&l{2}&r&f이 되었습니다.
+Overhaul.Name.Acrobatics=곡예
+Overhaul.Name.Alchemy=연금술
+Overhaul.Name.Archery=활쏘기
+Overhaul.Name.Axes=참수
+Overhaul.Name.Excavation=파괴
+Overhaul.Name.Fishing=낚시
+Overhaul.Name.Herbalism=약초 채집
+Overhaul.Name.Mining=채광
+Overhaul.Name.Repair=수리
+Overhaul.Name.Salvage=분해
+Overhaul.Name.Smelting=제련
+Overhaul.Name.Swords=검술
+Overhaul.Name.Taming=길들이기
+Overhaul.Name.Unarmed=맨손 전투
+Overhaul.Name.Woodcutting=벌목
 # /mcMMO Command Style Stuff
 Commands.mcc.Header=&c---[]&amcMMO 명령어&c[]---
 Commands.Other=&c---[]&a특수 명령어&c[]---
 Commands.Party.Header=&c-----[]&a파티&c[]-----
 Commands.Party.Features.Header=&c-----[]&a기능&c[]-----
-# XP BAR Allows for the following variables -- {0} = Skill Level, {1} Current XP, {2} XP Needed for next level, {3} Power Level, {4} Percentage of Level
-# Make sure you turn on Experience_Bars.ThisMayCauseLag.AlwaysUpdateTitlesWhenXPIsGained if you want the XP bar title to update every time a player gains XP!
+# XP 바는 다음 변수를 사용할 수 있습니다. -- {0} = 스킬 레벨, {1} 현재 경험치, {2} 다음 레벨까지 필요한 경험치, {3} 파워 레벨, {4} 레벨의 백분율
+# XP 바 제목이 플레이어가 경험치를 획득할 때마다 업데이트되기를 원한다면 Experience_Bars.ThisMayCauseLag.AlwaysUpdateTitlesWhenXPIsGained를 켜주세요!
 XPBar.Template={0}
-XPBar.Template.EarlyGameBoost=&6새로운 스킬을 습득하는 중...
-XPBar.Acrobatics=곡예 Lv.&6{0}
-XPBar.Alchemy=연금술 Lv.&6{0}
-XPBar.Archery=궁술 Lv.&6{0}
-XPBar.Axes=부술 Lv.&6{0}
-XPBar.Excavation=발굴 Lv.&6{0}
-XPBar.Fishing=낚시 Lv.&6{0}
-XPBar.Herbalism=약초학 Lv.&6{0}
-XPBar.Mining=채광 Lv.&6{0}
-XPBar.Repair=수리 Lv.&6{0}
-XPBar.Salvage=회수 Lv.&6{0}
-XPBar.Smelting=제련 Lv.&6{0}
-XPBar.Swords=검술 Lv.&6{0}
-XPBar.Taming=조련 Lv.&6{0}
-XPBar.Unarmed=비무장 Lv.&6{0}
-XPBar.Woodcutting=벌목 Lv.&6{0}
+XPBar.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}
+#이것은 experience.yml에서 'ExtraDetails' 설정이 켜져 있는 경우(기본적으로 꺼져 있음) 사용되는 미리 설정된 템플릿일 뿐입니다. 이 템플릿을 무시하고 위의 문자열만 편집하면 됩니다.
 XPBar.Complex.Template={0} &3 {4}&f% &3(&f{1}&3/&f{2}&3)
-#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.SubSkill.Roll.Stats=&6구르기 확률 &e{0}%&6 우아한 구르기 확률&e {1}%
-Acrobatics.SubSkill.Roll.Stat=구르기 확률
-Acrobatics.SubSkill.Roll.Stat.Extra=우아한 구르기 확률
-Acrobatics.SubSkill.Roll.Chance=구르기 확률: &e{0}
-Acrobatics.SubSkill.Roll.Mechanics=&7구르기는 수동적인 부분이 있는 능력입니다.\n낙하 데미지를 입을 때마다, 당신은 당신의 능력 레벨에 따라 데미지를 완전히 무효화할 수 있습니다. 능력 레벨이 &e{6}%&7일 때, 당신은 &e{0}%&7의 확률로 데미지를 무효화할 수 있으며, 우아한 구르기를 활성화하면 &e{1}%&7의 확률로 데미지를 무효화할 수 있습니다.\n성공 확률은 능력 레벨에 따라 선형적으로 조정되며, 능력 레벨 &e{2}&7에서 최대치에 도달합니다. 곡예 능력을 1 레벨 올릴 때마다 &e{3}%&7의 확률이 증가합니다.\n웅크리기 버튼을 누르면 구르기 확률이 2배가 되며, 데미지를 2배로 감소시킬 수 있습니다. 웅크리기를 누르면 일반적인 구르기가 우아한 구르기로 변합니다.\n구르기는 최대 &c{4}&7의 데미지를 무효화합니다. 우아한 구르기는 최대 &a{5}&7의 데미지를 무효화합니다.
-Acrobatics.SubSkill.GracefulRoll.Name=우아한 구르기
-Acrobatics.SubSkill.Dodge.Stat=구르기 확률
-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배 효과
+# XP 바는 다음 변수를 사용할 수 있습니다. -- {0} = 스킬 레벨, {1} 현재 경험치, {2} 다음 레벨까지 필요한 경험치, {3} 파워 레벨, {4} 레벨의 백분율
+# XP 바 제목이 플레이어가 경험치를 획득할 때마다 업데이트되기를 원한다면 Experience_Bars.ThisMayCauseLag.AlwaysUpdateTitlesWhenXPIsGained를 켜주세요!
+# 스타일링 끝
+
+#재주 넘기
+Acrobatics.Ability.Proc=&a**용아치** (Graceful Landing)
+Acrobatics.Combat.Proc=&a**회피** (Dodged)
+Acrobatics.SubSkill.Roll.Stats=&6Roll 확률 &e{0}%&6 우아한 Roll 확률 &e{1}%
+Acrobatics.SubSkill.Roll.Stat=Roll 확률
+Acrobatics.SubSkill.Roll.Stat.Extra=우아한 Roll 확률
+Acrobatics.SubSkill.Roll.Name=Roll
+Acrobatics.SubSkill.Roll.Description=전략적으로 착지하여 피해를 피합니다.
+Acrobatics.SubSkill.Roll.Chance=Roll 확률: &e{0}
+Acrobatics.SubSkill.Roll.GraceChance=우아한 Roll 확률: &e{0}
+Acrobatics.SubSkill.Roll.Mechanics=&7Roll은 수동 구성 요소가 있는 능동적인 하위 기술입니다.\n낙하 피해를 입을 때마다 기술 레벨에 따라 피해를 완전히 무효화할 기회가 있습니다. 레벨 &e{6}%&7에서 피해를 방지할 확률은 &e{0}%&7이며, 우아한 Roll을 활성화하면 &e{1}%&7입니다.\n성공 확률은 능력 레벨에 따라 선형 곡선으로 조정되며, 능력이 있는 Acrobatics 레벨마다 &e{3}%&7의 성공 확률이 주어집니다.\n스니크 버튼을 누르면 낙하 피해를 피하는 기회가 두 배로 늘어나며, 최대 2배의 낙하 피해를 피할 수 있습니다! 스니크를 누르면 일반적인 Roll이 우아한 Roll로 변합니다.\nRoll은 최대 &c{4}&7의 피해를 방지할 수 있으며, 우아한 Roll은 최대 &a{5}&7의 피해를 방지할 수 있습니다.
+Acrobatics.SubSkill.GracefulRoll.Name=우아한 Roll
+Acrobatics.SubSkill.GracefulRoll.Description=일반 Roll의 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.SubSkill.Dodge.Description=공격 피해를 절반으로 줄입니다.
+Acrobatics.SubSkill.Dodge.Stat=회피 확률
+Acrobatics.Listener=곡예:
+Acrobatics.Roll.Text=&o**Roll 사용**
 Acrobatics.SkillName=곡예
-Acrobatics.Skillup=낙법 기술이 {0} 올라 총 {1} 레벨이 되었습니다
 
-#ALCHEMY
-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} 레벨이 되었습니다
-Alchemy.SubSkill.Catalysis.Stat=양조 속도
-Alchemy.SubSkill.Concoctions.Stat=혼합 랭크: &a{0}&3/&a{1}
-Alchemy.SubSkill.Concoctions.Stat.Extra=성분 [&a{0}&3]: &a{1}
-Alchemy.Ability.Locked.0={0}+ 레벨에서 해금됩니다 (촉매)
+#연금술
+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}+ SKILL (CATALYSIS)까지 잠금
 Alchemy.SkillName=연금술
 
-#ARCHERY
-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.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.Listener=궁술(ARCHERY):
-Archery.SkillName=궁술
-Archery.Skillup=궁술 기술이 {0} 올라 총 {1} 레벨이 되었습니다
-Archery.SubSkill.SkillShot.Stat=스킬샷 추가 피해
-Archery.SubSkill.Daze.Stat=현혹 확률
+Archery.SubSkill.ArrowRetrieval.Description=시체에서 화살을 회수할 확률이 있습니다.
 Archery.SubSkill.ArrowRetrieval.Stat=화살 회수 확률
-Archery.SubSkill.ArcheryLimitBreak.Name=궁술 한계 돌파
-Archery.SubSkill.ArcheryLimitBreak.Description=한계 돌파. 강한 적에게 추가 피해를 줍니다. PVP를 위해 만들어졌으며, PVE에서 추가 피해를 줄지는 서버 설정에 따라 다릅니다.
-Archery.SubSkill.ArcheryLimitBreak.Stat=한계 돌파 최대 피해
-
-
-#AXES
-Axes.Ability.Bonus.0=도끼 마스터리
-Axes.Ability.Bonus.1={0} 추가 피해
-Axes.Ability.Bonus.2=갑옷 충격
-Axes.Ability.Bonus.3=방어구 추가 피해: {0}
-Axes.Ability.Bonus.4=엄청난 충격
-Axes.Ability.Bonus.5=비무장 추가 피해: {0}
-Axes.Ability.Lower=&7**도끼 준비 해제**
-Axes.Ability.Ready=&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}) 레벨이 되었습니다
-Axes.Ability.Ready.Extra=도끼 준비 완료. &7({0}은 {1}초 동안 쿨타임 중입니다)
-Axes.SubSkill.SkullSplitter.Stat=뼈 쪼개기 지속시간
-Axes.SubSkill.CriticalStrikes.Stat=크리티컬 스트라이크 확률
-Axes.SubSkill.AxesLimitBreak.Name=도끼 한계 돌파
-Axes.SubSkill.AxesLimitBreak.Description=한계를 돌파합니다. 강한 상대에 대한 추가 피해가 증가합니다. PVP를 위해 만들어졌으며, PVE에서 추가 피해를 줄지는 서버 설정에 따라 다릅니다.
+Archery.SubSkill.ArcheryLimitBreak.Name=양궁 한계 극복
+Archery.SubSkill.ArcheryLimitBreak.Description=한계를 극복합니다. 강력한 상대에 대한 피해량이 증가합니다. PVP용으로 적용되며, PVE에서 피해량을 증가시킬지는 서버 설정에 따릅니다.
+Archery.SubSkill.ArcheryLimitBreak.Stat=한계 극복 최대 피해량
+Archery.Listener=양궁:
+Archery.SkillName=양궁
+
+#참수
+Axes.Ability.Bonus.0=도끼 숙련
+Axes.Ability.Bonus.1=추가 {0} 피해
+Axes.Ability.Bonus.2=방어구 타격
+Axes.Ability.Bonus.3={0} 추가 피해를 방어구에 입힙니다.
+Axes.Ability.Bonus.4=강력한 타격
+Axes.Ability.Bonus.5={0} 추가 피해를 방어구가 없는 적에게 입힙니다.
+Axes.Ability.Lower=&7도끼를 내려놓습니다.
+Axes.Ability.Ready=&3도끼를 &6준비&3합니다.
+Axes.Ability.Ready.Extra=&3참수를 &6준비&3합니다. &7({0}이(가) {1}초 동안 재사용 대기 중입니다)
+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=한계를 돌파합니다. 강력한 적에 대한 추가 피해가 증가합니다. PVP를 위해 설계되었으며, PVE에서의 추가 피해 증가 여부는 서버 설정에 따릅니다.
 Axes.SubSkill.AxesLimitBreak.Stat=한계 돌파 최대 피해
-
-#EXCAVATION
-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} 레벨이 되었습니다
-Excavation.SubSkill.GigaDrillBreaker.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.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=고고학 경험치 구슬량
-
-#FISHING
-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} 레벨이 되었습니다
-Fishing.ScarcityTip=&e&o이 지역은 과잉 낚시로 인해 어필이 부족합니다. 더 많은 물고기를 잡으려면 다른 곳에 낚싯대를 던져보세요. 적어도 {0} 블록 이상 떨어진 곳에서 낚시하세요.
-Fishing.Scared=&7&o물고기를 놀라게 하는 불규칙한 움직임입니다!
-Fishing.Exhausting=&c&o낚싯대를 부적절하게 사용하면 피로가 쌓이고 낚싯대가 닳아버립니다!
-Fishing.LowResourcesTip=&7이 지역에는 물고기가 많이 남아있지 않을 것 같습니다. 적어도 {0} 블록 이상 떨어진 곳에서 낚시해보세요.
-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.Stat=매직 헌터 확률
+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.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} &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.Stat=어부의 다이어트: &a랭크 {0}
-Fishing.SubSkill.MasterAngler.Description=어부가 더 자주 물고기를 잡습니다. 보트에서 낚시할 때 더 잘 작동합니다.
+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=얼음 낚시
-
-#HERBALISM
-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):
+Fishing.Chance.Raining=&9 비 보너스
+Fishing.Listener=낚시:
+Fishing.Ability.TH.MagicFound=&7이 잡은 물고기에는 마법의 손길을 느낍니다...
+Fishing.Ability.TH.Boom=&7폭발 시간!!!
+Fishing.Ability.TH.Poison=&7뭔가 이상한 냄새가 납니다...
+Fishing.SkillName=낚시
+#약초학
+Herbalism.Ability.GTe.NeedMore=더 많은 씨앗이 필요합니다. 녹색 에너지를 전파하기 위해서입니다.
+Herbalism.Ability.GTh.Fail=**식물재배 실패**
+Herbalism.Ability.GTh=&a**식물재배**
+Herbalism.Ability.Lower=&7국지를 낮춥니다.
+Herbalism.Ability.Ready=&3국지를 &6준비&3합니다.
+Herbalism.Ability.ShroomThumb.Fail=**버섯썸 실패**
+Herbalism.SubSkill.GreenTerra.Name=그린 테라
+Herbalism.SubSkill.GreenTerra.Description=테라를 전파하며, 드롭 3배 증가, 식물재배 강화
+Herbalism.SubSkill.GreenTerra.Stat=그린 테라 지속시간
+Herbalism.SubSkill.GreenThumb.Name=식물재배
+Herbalism.SubSkill.GreenThumb.Description=국지로 작물 수확 시 자동으로 심기
+Herbalism.SubSkill.GreenThumb.Stat=식물재배 확률
+Herbalism.SubSkill.GreenThumb.Stat.Extra=식물재배 단계: &a작물 단계 {0}에서 자랍니다
+Herbalism.Effect.4=식물재배 (블록)
+Herbalism.SubSkill.GreenThumb.Description.2=벽돌에 이끼를 더하거나 풀을 자라게 합니다
+Herbalism.SubSkill.FarmersDiet.Name=농부의 식단
+Herbalism.SubSkill.FarmersDiet.Description=농산물로부터 회복되는 허기가 향상됩니다
+Herbalism.SubSkill.FarmersDiet.Stat=농부의 식단: &a등급 {0}
+Herbalism.SubSkill.DoubleDrops.Name=더블 드롭
+Herbalism.SubSkill.DoubleDrops.Description=보통 드롭의 2배 획득
+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={0}&2님은 &c재배의 대지를 사용했습니다!
-Herbalism.Skills.GTe.Other.On=&a{0}&2님은 &c재배의 대지를 사용했습니다!
-Herbalism.Skillup=약초학 기술이 {0} 올라 총 {1} 레벨이 되었습니다
-Herbalism.SubSkill.GreenTerra.Stat=재배의 대지 지속 시간
-Herbalism.SubSkill.GreenThumb.Stat=재배의 재능 확률
-Herbalism.SubSkill.GreenThumb.Stat.Extra=재배의 재능 단계: &a작물이 {0} 단계로 자라납니다
-Herbalism.SubSkill.FarmersDiet.Stat=농부의 다이어트: &a랭크 {0}
-Herbalism.SubSkill.DoubleDrops.Stat=2배 드롭 확률
-Herbalism.SubSkill.HylianLuck.Stat=하이랄인의 행운 확률
-Herbalism.SubSkill.ShroomThumb.Stat=버섯재배자의 숨결 확률
-
-#MINING
-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):
+Herbalism.Skills.GTe.Off=**그린 테라가 종료되었습니다**
+Herbalism.Skills.GTe.On=&a**그린 테라 활성화됨**
+Herbalism.Skills.GTe.Refresh=&a그린 테라 능력이 갱신되었습니다!
+Herbalism.Skills.GTe.Other.Off=&e{0}&a님의 그린 테라가 종료되었습니다
+Herbalism.Skills.GTe.Other.On=&a{0}&2님이 &c그린 테라를 사용했습니다!
+#채광
+Mining.Ability.Locked.0={0}+ 스킬이 필요합니다 (폭탄 채굴)
+Mining.Ability.Locked.1={0}+ 스킬이 필요합니다 (더 큰 폭탄)
+Mining.Ability.Locked.2={0}+ 스킬이 필요합니다 (폭파 전문가)
+Mining.Ability.Lower=&7곡괭이를 낮춥니다.
+Mining.Ability.Ready=&3곡괭이를 &6준비&3합니다.
+Mining.SubSkill.SuperBreaker.Name=슈퍼 브레이커
+Mining.SubSkill.SuperBreaker.Description=속도+, 드롭 3배 확률
+Mining.SubSkill.SuperBreaker.Stat=슈퍼 브레이커 지속시간
+Mining.SubSkill.DoubleDrops.Name=더블 드롭
+Mining.SubSkill.DoubleDrops.Description=보통 드롭의 2배 획득
+Mining.SubSkill.DoubleDrops.Stat=더블 드롭 확률
+Mining.SubSkill.BlastMining.Name=폭탄 채굴
+Mining.SubSkill.BlastMining.Description=TNT로 채굴 시 보너스 효과
+Mining.SubSkill.BlastMining.Stat=폭탄 채굴: &a등급 {0}/{1} &7({2})
+Mining.SubSkill.BlastMining.Stat.Extra=폭발 반경 증가: &a+{0}
+Mining.SubSkill.BiggerBombs.Name=더 큰 폭탄
+Mining.SubSkill.BiggerBombs.Description=TNT 폭발 반경 증가
+Mining.SubSkill.DemolitionsExpertise.Name=폭파 전문가
+Mining.SubSkill.DemolitionsExpertise.Description=TNT 폭발로 인한 피해 감소
+Mining.SubSkill.DemolitionsExpertise.Stat=폭파 전문가 피해 감소
+
+Mining.Listener=Mining:
 Mining.SkillName=채광
-Mining.Skills.SuperBreaker.Off=**파괴자 발동 해제**
-Mining.Skills.SuperBreaker.On=&a**파괴자 발동**
-Mining.Skills.SuperBreaker.Other.Off={0}&2님은 &c파괴자를 사용했습니다!
-Mining.Skills.SuperBreaker.Other.On=&a{0}&2님은 &c파괴자를 사용했습니다!
-Mining.Skills.SuperBreaker.Refresh=&a당신의 &e파괴자는 &a이제 사용 가능합니다!
-Mining.Skillup=채광 기술이 {0} 올라 총 {1} 레벨이 되었습니다
-Mining.SubSkill.SuperBreaker.Stat=파괴자 지속 시간
-Mining.SubSkill.DoubleDrops.Stat=드롭 2배 확률
-Mining.SubSkill.BlastMining.Stat=폭발 채광: &a랭크 {0}/{1} &7({2})
-Mining.SubSkill.BlastMining.Stat.Extra=폭발 범위 증가: &a+{0}
-Mining.SubSkill.DemolitionsExpertise.Stat=전문 폭파 피해 감소
-
-#폭발 채굴
-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기술은 이제 사용 가능합니다!
-
+Mining.Skills.SuperBreaker.Off=**슈퍼 브레이커가 사라졌습니다**
+Mining.Skills.SuperBreaker.On=&a**슈퍼 브레이커가 활성화되었습니다**
+Mining.Skills.SuperBreaker.Other.Off=슈퍼 브레이커가 &e{0}님에게서 사라졌습니다
+Mining.Skills.SuperBreaker.Other.On=&a{0}&2님이 &c슈퍼 브레이커를 사용하였습니다!
+Mining.Skills.SuperBreaker.Refresh=&a당신의 &e슈퍼 브레이커&a 능력이 갱신되었습니다!
+Mining.Listener=Mining:
+Mining.SkillName=채광
+Mining.Skills.SuperBreaker.Off=슈퍼 브레이커가 사라졌습니다
+Mining.Skills.SuperBreaker.On=&a슈퍼 브레이커가 활성화되었습니다
+Mining.Skills.SuperBreaker.Other.Off=슈퍼 브레이커가 &e{0}님에게서 사라졌습니다
+Mining.Skills.SuperBreaker.Other.On=&a{0}&2님이 &c슈퍼 브레이커를 사용하였습니다!
+Mining.Skills.SuperBreaker.Refresh=&a당신의 &e슈퍼 브레이커&a 능력이 갱신되었습니다!
+#Blast Mining
+Mining.Blast.Boom=&7펑
+Mining.Blast.Cooldown=
+Mining.Blast.Effect=채굴량 +{0}, 드롭 횟수 {1}배 증가
+Mining.Blast.Other.On=&a{0}&2님이 &c폭발 채굴을 사용하였습니다!
+Mining.Blast.Refresh=&a폭발 채굴 능력이 갱신되었습니다!
 #REPAIR
 Repair.SubSkill.Repair.Name=수리
-Repair.SubSkill.Repair.Description=도구 & 방어구 수리
-Repair.SubSkill.GoldRepair.Name=금 수리 ({0}레벨 이상)
-Repair.SubSkill.GoldRepair.Description=금 도구 & 방어구 수리
-Repair.SubSkill.IronRepair.Name=철 수리 ({0}레벨 이상)
-Repair.SubSkill.IronRepair.Description=철 도구 & 방어구 수리
-Repair.SubSkill.StoneRepair.Name=돌 수리 ({0}레벨 이상)
+Repair.SubSkill.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.Name=수리 숙련
+Repair.SubSkill.RepairMastery.Description=수리량 증가
+Repair.SubSkill.RepairMastery.Stat=수리 숙련도: &a추가로 {0} 내구도 복구
 Repair.SubSkill.SuperRepair.Name=슈퍼 수리
-Repair.SubSkill.SuperRepair.Description=효율 2배
-Repair.SubSkill.DiamondRepair.Name=다이아몬드 수리 ({0} 레벨)
-Repair.SubSkill.DiamondRepair.Description=다이아몬드 도구 & 방어구 수리
-Repair.SubSkill.ArcaneForging.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.Error=&4mcMMO이 아이템을 수리하려고 시도하는 동안 오류가 발생했습니다!
-Repair.Listener.Anvil=&4당신은 모루를 놓았습니다, 모루는 도구들과 방어구를 수리할 수 있습니다.
-Repair.Listener=수리(REPAIR):
+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.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.Skills.AdeptDiamond=&4다이아몬드 수리에 능숙하지 않습니다.
+Repair.Skills.AdeptGold=&4금 수리에 능숙하지 않습니다.
+Repair.Skills.AdeptIron=&4철 수리에 능숙하지 않습니다.
+Repair.Skills.AdeptStone=&4돌 수리에 능숙하지 않습니다.
+Repair.Skills.Adept=&c레벨 &e{0}&c 이상이어야 &e{1}&c을(를) 수리할 수 있습니다.
+Repair.Skills.FeltEasy=&7쉽게 느껴졌습니다.
+Repair.Skills.FullDurability=&7이 아이템은 완전한 내구도입니다.
+Repair.Skills.StackedItems=&4중첩된 아이템은 수리할 수 없습니다.
 Repair.Pretty.Name=수리
-Repair.SubSkill.RepairMastery.Stat=수리 마스터리: &a추가 {0} 내구성 복구
-Repair.SubSkill.SuperRepair.Stat=슈퍼 수리 확률
-Repair.SubSkill.ArcaneForging.Stat=인챈트 아이템 수리: &e랭크 {0}/{1}
-Repair.SubSkill.ArcaneForging.Stat.Extra=&3인챈트 아이템 수리 확률:&7 성공 &a{0}&7%, 실패 &c{1}&7%
-
 #Arcane Forging
-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}랭크
-
+Repair.Arcane.Downgrade=이 아이템의 신비한 힘이 감소되었습니다.
+Repair.Arcane.Fail=이 아이템의 신비한 힘이 영구히 사라졌습니다.
+Repair.Arcane.Lost=너무 능력이 부족하여 마법을 추출할 수 없었습니다.
+Repair.Arcane.Perfect=&a이 아이템의 신비한 힘을 유지하였습니다.
 #SALVAGE
-Salvage.Pretty.Name=회수
-Salvage.SubSkill.AdvancedSalvage.Name=전문적인 회수
-Salvage.SubSkill.AdvancedSalvage.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=회수
-Salvage.Pretty.Name=Salvage
+Salvage.Pretty.Name=분해
 Salvage.SubSkill.UnderstandingTheArt.Name=예술의 이해
-Salvage.SubSkill.UnderstandingTheArt.Description=이웃의 쓰레기를 뒤지는 것뿐만 아니라 환경을 보호하는 것입니다.\n회수의 다양한 속성을 강화합니다.
+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.Skills.Lottery.Normal=&6{1}&6에서 &3{0}&6개의 재료를 회수했습니다.
-Salvage.Skills.Lottery.Perfect=&a&l완벽합니다!&r&6{1}&6에서 수고 없이 &3{0}&6개의 재료를 회수했습니다.
-Salvage.Skills.Lottery.Untrained=&7회수에 적절하게 훈련되지 않았습니다. {1}&7에서는 &c{0}&7개의 재료만 회수할 수 있었습니다.
-
-#Anvil (Shared between SALVAGE and REPAIR)
-Anvil.Unbreakable=이 아이템은 Unbreakable입니다!
-
-#SWORDS
-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}초
-Swords.Combat.Rupture.Note.Update.One=&7(파열 노트): 주기적인 피해는 치명적이지 않으며 초당 두 번 발생하며 방어구를 무시합니다.
+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}&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=&6{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 자료만 복구할 수 있었습니다.
+#모루(SALVAGE와 REPAIR 간에 공유)
+Anvil.Unbreakable=이 아이템은 깨지지 않습니다!
+#검
+Swords.Ability.Lower=&7검을 내려놓습니다.
+Swords.Ability.Ready=&3당신은 &6검을 준비합니다&3.
+Swords.Combat.Rupture.Note.Update.One=&7(파열 노트): 주기적인 피해는 매초 두 번 발생하며 방어구를 뚫고 발생합니다.
+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.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=한계를 깨는 것. 강력한 상대에 대한 추가 피해. PVP를 위해 설계되었으며, PVE에서 피해 증가 여부는 서버 설정에 따릅니다.
+Swords.SubSkill.SwordsLimitBreak.Description=한계 돌파. 강한 상대에 대한 피해 증가. PVP용으로 의도되었으며 PVE에서 피해를 증가시킬 것인지는 서버 설정에 따라 다릅니다.
 Swords.SubSkill.SwordsLimitBreak.Stat=한계 돌파 최대 피해
 Swords.SubSkill.Rupture.Stat=파열 확률
-Swords.SubSkill.Rupture.Stat.Extra=[[DARK_AQUA]]파열 지속 시간: &e{0}초&a (플레이어), &e{1}초&a (몹).
-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 (몹).
-
-#TAMING
+Swords.SubSkill.Rupture.Stat.Extra=[[DARK_AQUA]]파열 지속 시간: &e{0}초&a 플레이어 대상, &e{1}초&a 몹 대상.
+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} 틱 파열
+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.Ability.Bonus.0=환경 인식
-Taming.Ability.Bonus.1=늑대 위험 회피
+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.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.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} (늑대), {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.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.SubSkill.Pummel.Name=퍼멜
-Taming.SubSkill.Pummel.Description=당신의 늑대는 상대방을 넉백시킬 확률이 있습니다.
-Taming.SubSkill.Pummel.TargetMessage=늑대에 의해 넉백당했습니다!
-Taming.Summon.COTW.Success.WithoutLifespan=&a(Call Of The Wild) &7당신은 &6{0}&7을 소환했습니다.
-Taming.Summon.COTW.Success.WithLifespan=&a(Call Of The Wild) &7당신은 &6{0}&7을 소환했으며, 지속 시간은 &6{1}&7초입니다.
-Taming.Summon.COTW.Limit=&a(Call Of The Wild) &7동시에 소환할 수 있는 애완동물은 최대 &c{0}마리&7입니다.
-Taming.Summon.COTW.TimeExpired=&a(Call Of The Wild) &7시간이 지났습니다. 당신의 &6{0}&7이(가) 떠납니다.
-Taming.Summon.COTW.Removed=&a(Call Of The Wild) &7소환된 &6{0}&7이(가) 이 세상에서 사라졌습니다.
-Taming.Summon.COTW.BreedingDisallowed=&a(Call Of The Wild) &c소환된 동물은 번식할 수 없습니다.
-Taming.Summon.COTW.NeedMoreItems=&a(Call Of The Wild) &7더 필요한 아이템은 &e{0}&7개의 &3{1}&7입니다.
-Taming.Summon.Name.Format=&6(COTW) &f{0}의 {1}
-
-#UNARMED
-Unarmed.Ability.Berserk.Length=버서커 지속시간: &e{0}초
-Unarmed.Ability.Bonus.0=아이언 암 스타일
+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동시에 &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=&6(야생의 부름) &f{0}의 {1}
+#비무장
+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} 레벨이 되었습니다
-Unarmed.SubSkill.Berserk.Stat=버서커 지속시간
-Unarmed.SubSkill.Disarm.Stat=비무장 확률
+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.Description=한계를 돌파합니다. 강력한 상대에 대한 피해가 증가합니다. PVP를 위해 의도되었으며 PVE에서 피해를 증가시킬 것인지는 서버 설정에 따릅니다.
 Unarmed.SubSkill.UnarmedLimitBreak.Stat=한계 돌파 최대 피해
-Unarmed.SubSkill.SteelArmStyle.Name=강철 팔 형태
-Unarmed.SubSkill.SteelArmStyle.Description=견고해지는 팔
-Unarmed.SubSkill.ArrowDeflect.Stat=화살 회피 확률
-Unarmed.SubSkill.IronGrip.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=주먹으로 바위 부수기
-
-#WOODCUTTING
-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} 레벨이 되었습니다
-Woodcutting.SubSkill.TreeFeller.Stat=나무꾼 지속시간
-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.Stat=드롭 2배 확률
+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.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.Splinter.Description=나무를 효율적으로 베어 내세요.
 Woodcutting.SubSkill.BarkSurgeon.Name=나무 껍질 수술
 Woodcutting.SubSkill.BarkSurgeon.Description=나무 껍질을 벗길 때 유용한 재료를 추출하세요.
-Woodcutting.SubSkill.NaturesBounty.Name=자연의 풍요
-Woodcutting.SubSkill.NaturesBounty.Description=자연에서 경험치를 모으세요.
-
-#ABILITIY
-
-#COMBAT
-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혼란이 일어났습니다. 아~ 어지러워.
+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=그 나무는 너무 큽니다!
+#전투
+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)
-
-#COMMANDS
-##generic
-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 채팅,
+Combat.Gore=&a**찔림**
+Combat.StruckByGore=**당신은 찔렸습니다**
+Combat.TargetDazed=대상이 &4현기를 잃었습니다
+Combat.TouchedFuzzy=&4털에 닿았습니다. 어지러웠습니다.
+
+#커멘드
+##일반적인
+mcMMO.Description=&3&emcMMO&3 프로젝트에 대해:,&6mcMMO는 2011년 2월에 &c오픈 소스&6 RPG 모드로 생성되었습니다,&6nossr50&6에 의해. 목표는 품질 높은 RPG 경험을 제공하는 것입니다.,&3팁:,&6 - &a/mcmmo help&a 명령어를 사용하여 명령어를 확인하세요,&6 - &a/SKILLNAME&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={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.Database.CooldownMS=이 명령어를 다시 사용하기 전에 {0} 밀리초를 기다려야 합니다.
-Commands.Disabled=이 명령어는 비활성화 되있습니다.
-Commands.DoesNotExist= &c플레이어가 데이터베이스에 존재하지 않습니다!
-Commands.AdminChatSpy.Enabled=mcMMO 파티 채팅 감시가 활성화되었습니다.
-Commands.AdminChatSpy.Disabled=mcMMO 파티 채팅 감시가 비활성화되었습니다.
-Commands.AdminChatSpy.Toggle=mcMMO 파티 채팅 감시가 &e{0}&6님에 의해 토글되었습니다.
-Commands.AdminChatSpy.Chat=&6[감시: &a{0}&6] &f{1}
-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.addlevels.AwardAll.1=&a모든 스킬에 {0} 레벨이 수여되었습니다!
+Commands.addlevels.AwardAll.2=모든 스킬에 {0}이(가) 수정되었습니다.
+Commands.addlevels.AwardSkill.1=&a{1} 스킬에서 {0} 레벨이 수여되었습니다!
+Commands.addlevels.AwardSkill.2={1}에서 {0}이(가) 수정되었습니다.
+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 파티 채팅 감시 활성화됨
+Commands.AdminChatSpy.Disabled=mcMMO 파티 채팅 감시 비활성화됨
+Commands.AdminChatSpy.Toggle=mcMMO 파티 채팅이 &e{0}&f에 대해 전환되었습니다
+Commands.AdminChatSpy.Chat=&6[SPY: &a{0}&6] &f{1}
+Commands.GodMode.Forbidden=[mcMMO] 이 월드에서 갓 모드가 허용되지 않습니다 (권한 참조)
+Commands.GodMode.Toggle=갓 모드가 &e{0}&f에 대해 전환되었습니다
+Commands.Healthbars.Changed.HEARTS=[mcMMO] 건강 막대 표시 유형이 &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- 리더보드
+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=플레이어 프로파일을 아직 불러오지 못했습니다.
-Commands.Other=---[]&a기타 명령어&c[]---
-Commands.Party.Header=-----[]&a파티&c[]-----
-Commands.Party.Features.Header=-----[]&a특징&c[]-----
+Commands.mcrank.Overall=종합&a - &6순위 &f#&a{0}
+Commands.mcrank.Player=&e{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=모든 스킬의 레벨이 {0}(으)로 설정되었습니다!
+Commands.mmoedit.Modified.1={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 및 &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비활성화&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.UnlockedFeatures=&8잠금 해제된 기능: &7&o{0}
 Commands.Party.ShareMode=&8공유 모드:
 Commands.Party.ItemShare=&7아이템 &3({0})
-Commands.Party.ExpShare=&7EXP &3({0})
-Commands.Party.ItemShareCategories=&8공유중인 아이템: &7&o{0}
-Commands.Party.MembersNear=&8당신의 근처 &3{0}&8/&3{1}
-Commands.Party.Accept=&a- 파티 초대 허용
-Commands.Party.Chat.Off=파티 채팅을 &c끕니다
-Commands.Party.Chat.On=파티 채팅을 &a켭니다
-Commands.Party.Commands=---[]&a파티 명령어&c[]---
-Commands.Party.Invite.0=알림: &a당신은 {1} 님으로부터 {0} 파티 초대에 권유받았습니다
-Commands.Party.Invite.1=타입 &a/party accept&e 명령어를 치면 파티 초대에 승낙됩니다
-Commands.Party.Invite=<플레이어> &a- 파티 초대를 보냅니다
-Commands.Party.Invite.Accepted=&a초대 수락됨. 당신은 {0} 파티에 가입되었습니다
-Commands.Party.Join=참여된 파티: {0}
-Commands.Party.Create=&7만들어진 파티: {0}
-Commands.Party.Rename=&7변경된 파티 이름: &f{0}
+Commands.Party.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{1}님이 {0}으로부터 파티 초대를 받았습니다.
+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=이미 &a{1}&c에 &e{0}&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=당신은 {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 <player>&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.Party.ToggleShareCategory=&7파티 &6{0} &7의 아이템 공유가 &3{1}&7로 변경되었습니다.
+Commands.Party.AlreadyExists=&4파티 {0}이(가) 이미 존재합니다!
+Commands.Party.Kick=&c{0}&c님이 파티에서 추방되었습니다: &a{1}&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=&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=파티 텔레포트 요청이 만기됨!
-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.ChildSkill=이 명령어에는 부가 스킬을 사용할 수 없습니다!
-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.3.XP=&c올바른 사용법은 /{0} {1} {2} {3}&7입니다 (명령어를 실행한 플레이어에게 알리지 않고 실행하려면 끝에 -s를 포함시킬 수 있습니다)
-Commands.Usage.FullClassName=클레스이름
+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 == &a/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 스코어보드를 &d[n]&f초 후에 지웁니다.
+Commands.Scoreboard.Tip.Keep=&6팁: 스코어보드가 표시된 상태에서 &c/mcscoreboard keep&6을 사용하여 보여지도록 유지하세요.
+Commands.Scoreboard.Tip.Clear=&6팁: 스코어보드를 제거하려면 &c/mcscoreboard clear&6를 사용하세요.
+Commands.XPBar.Reset=&6mcMMO의 XP 바 설정이 재설정되었습니다.
+Commands.XPBar.SettingChanged=&6{0}&a의 XP 바 설정이 &a{1}&a(으)로 변경되었습니다.
+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.Message=메
 Commands.Usage.Page=페이지
 Commands.Usage.PartyName=이름
 Commands.Usage.Password=비밀번호
 Commands.Usage.Player=플레이어
-Commands.Usage.Rate=
+Commands.Usage.Rate=
 Commands.Usage.Skill=스킬
-Commands.Usage.SubSkill=부가 스킬
-Commands.Usage.XP=xp
-Commands.XPBar.Reset=&6mcMMO의 XP 바 설정이 초기화되었습니다.
-Commands.XPBar.SettingChanged=&6{0}&6의 XP 바 설정이 &a{1}&6로 변경되었습니다.
-Commands.Description.mmoinfo=스킬 또는 메커니즘에 대한 자세한 정보를 읽습니다.
-Commands.MmoInfo.Mystery=&7아직 이 스킬을 해금하지 않았지만, 해금하면 여기에서 자세한 정보를 읽을 수 있습니다!
-Commands.MmoInfo.NoMatch=해당 부가 스킬이 존재하지 않습니다!
+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.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=이 시간에 당신은 초대하지 못합니다
-mcMMO.NoPermission=&4권한이 부족합니다.
-mcMMO.NoSkillNote=&8만약 당신이 스킬을 사용할 수 없다면 여기에 표시되지 않습니다.
-
-
-
-##party
-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} 레벨이 되었습니다
+Commands.Mmodebug.Toggle=mcMMO 디버그 모드가 이제 &6{0}&7입니다. 디버그 모드가 true이면 지원에 사용되는 유용한 정보를 얻기 위해 블록을 두드릴 수 있습니다.
+mcMMO.NoInvites=&c현재 초대가 없습니다.
+mcMMO.NoPermission=&4권한이 충분하지 않습니다.
+mcMMO.NoSkillNote=&8해당 스킬에 액세스 권한이 없으면 여기에 표시되지 않습니다.
+##파티
+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} &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=&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}&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파티 비밀번호가 &a{0}&a(으)로 설정되었습니다.
+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=파티 채팅은 아직 해제되지 않았습니다.
-Party.Feature.Disabled.2=파티 텔레포트는 아직 해제되지 않았습니다.
-Party.Feature.Disabled.3=파티 동맹은 아직 해제되지 않았습니다.
-Party.Feature.Disabled.4=아이템 공유는 아직 해제되지 않았습니다.
-Party.Feature.Disabled.5=경험치 공유는 아직 해제되지 않았습니다.
-Party.ShareType.Xp=경험치
+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=&c파티 XP 공유가 아직 잠금 해제되지 않았습니다.
+Party.ShareType.Xp=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.ShareMode.Equal=
+Party.ShareMode.Random=랜덤
+Party.ItemShare.Category.Loot=전리품
+Party.ItemShare.Category.Mining=채
+Party.ItemShare.Category.Herbalism=허브 수확
+Party.ItemShare.Category.Woodcutting=나무 벌채
 Party.ItemShare.Category.Misc=기타
-
 ##xp
-Commands.XPGain.Acrobatics=떨어지기
-Commands.XPGain.Alchemy=포션 양조하기
-Commands.XPGain.Archery=몬스터 공격하기
-Commands.XPGain.Axes=몬스터 공격하기
-Commands.XPGain.Child=상위 스킬들로 부터 레벨들을 얻습니다
-Commands.XPGain.Excavation=땅 파거나 보물 발견하기
-Commands.XPGain.Fishing=낚시하기
-Commands.XPGain.Herbalism=식물 수집하기
-Commands.XPGain.Mining=돌이나 광석 캐기
-Commands.XPGain.Repair=수리하기
-Commands.XPGain.Swords=몬스터 공격하기
-Commands.XPGain.Taming=동물을 조련하거나, 조련된 동물로 사냥하기
-Commands.XPGain.Unarmed=몬스터 공격하기
-Commands.XPGain.Woodcutting=나무 자르기
-Commands.XPGain=&8경험치 얻는 방법: &f{0}
-Commands.xplock.locked=&6당신의 경험치 바는 {0}로 잠겼습니다!
-Commands.xplock.unlocked=&6당신의 경험치 바는 &a잠금 해제되었습니다&6!
-Commands.xprate.modified=경험치 배율이 {0}배로 수정되었습니다
-Commands.xprate.over=mcMMO 경험치 이벤트가 종료되었습니다!!
-Commands.xprate.proper.0=경험치 배율 이벤트를 사용법: &f/xprate <배율> <true/false>
-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}배 입니다!
-Commands.NegativeNumberWarn=마이너스 숫자는 허용되지 않습니다!
-Commands.Event.Start=&amcMMO&6 이벤트 시작!
+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=&6XP 바가 이제 {0}으로 잠겨 있습니다!
+Commands.xplock.unlocked=&6XP 바가 이제 &a잠금 해제&6되었습니다!
+Commands.xprate.modified=&cXP 비율이 {0}(으)로 변경되었습니다
+Commands.xprate.over=&cmcMMO XP 비율 이벤트가 종료되었습니다!!
+Commands.xprate.proper.0=&cXP 비율을 변경하려면 올바른 사용법은 /xprate <정수> <true/false>입니다
+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}&3배입니다
+Commands.Event.Stop.Subtitle=&a즐거웠길 바랍니다!
+Commands.Event.XP=&3XP 비율은 이제 &6{0}&3배입니다
 Commands.xprate.started.0=&6mcMMO XP 이벤트가 시작되었습니다!
-Commands.xprate.started.1=&6mcMMO XP 배율은 이제 {0}배입니다!
+Commands.xprate.started.1=&6mcMMO XP 비율이 {0}배로 설정되었습니다!
 
-# Admin Notifications
+# 관리자 알림
 Server.ConsoleName=&e[서버]
-Notifications.Admin.XPRate.Start.Self=&7전체 XP 배율을 &6{0}배로 설정했습니다.
-Notifications.Admin.XPRate.End.Self=&7XP 율 이벤트를 종료했습니다.
-Notifications.Admin.XPRate.End.Others={0} &7님이 XP 배율 이벤트를 종료했습니다.
-Notifications.Admin.XPRate.Start.Others={0} &7님이 전체 XP 배율 {1}배로 이벤트를 시작 또는 수정했습니다.
+Notifications.Admin.XPRate.Start.Self=&7전역 XP 비율 배수를 &6{0}배&7로 설정했습니다
+Notifications.Admin.XPRate.End.Self=&7XP 율 이벤트를 종료했습니다.
+Notifications.Admin.XPRate.End.Others={0}&7님이 XP 비율 이벤트를 종료했습니다
+Notifications.Admin.XPRate.Start.Others={0}&7님이 전역 배수가 {1}배인 XP 비율 이벤트를 시작하거나 수정했습니다
 Notifications.Admin.Format.Others=&6(&amcMMO &3관리자&6) &7{0}
 Notifications.Admin.Format.Self=&6(&amcMMO&6) &7{0}
 
-#GUIDES
-Guides.Available=&7{0} 가이드가 있습니다 - 타입 /{1} ? [페이지]
-Guides.Header=&6-=&a{0} 가이드&6=-
-Guides.Page.Invalid=올바른 페이지 번호가 아닙니다!
-Guides.Page.OutOfRange=그 페이지는 존재하지 않습니다, 오직 총 {0} 페이지가 있습니다.
-Guides.Usage= 사용법 /{0} ? [페이지]
-
-##Acrobatics
-Guides.Acrobatics.Section.0=&3곡예에 대하여:\n&e곡예는 mcMMO의 우아하게 움직이는 예술입니다.\n&e전투 특혜와 환경 손상 특혜를 증가시킵니다.\n\n&3XP 얻기:\n&e이 스킬의 XP를 얻을려면 전투나 생존에서 피해를 \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=[[DARK_AQUA]]연금술에 대하여:\n[[YELLOW]]연금술은 물약을 양조하는 것입니다.\n[[YELLOW]]물약 양조 시간을 빠르게 하고, 이전에 얻을 수 없었던\n[[YELLOW]]새로운 물약을 추가합니다.\n\n\n[[DARK_AQUA]]XP 획득:\n[[YELLOW]]이 스킬에서 XP를 얻으려면 물약을 양조해야 합니다.
-Guides.Alchemy.Section.1=[[DARK_AQUA]]Catalysis는 어떻게 작동하나요?\n[[YELLOW]]Catalysis는 양조 과정을 가속화시키며, 최대\n[[YELLOW]]속도는 기본 설정에서 레벨 1000에서 4배입니다.\n[[YELLOW]]이 능력은 기본 설정에서 레벨 100에서 잠금 해제됩니다.
-Guides.Alchemy.Section.2=[[DARK_AQUA]]Concoctions는 어떻게 작동하나요?\n[[YELLOW]]Concoctions는 사용자 정의 재료로 더 많은 물약을 양조할 수 있게 합니다.\n[[YELLOW]]잠금 해제되는 특별한 재료는 등급에 따라 결정됩니다.\n[[YELLOW]]잠금 해제할 수 있는 등급은 총 8개입니다.
-Guides.Alchemy.Section.3=[[DARK_AQUA]]Concoctions 1단계 재료:\n[[YELLOW]]블레이즈 가루, 발효된 거미 눈, 가스트 눈물, 레드스톤,\n[[YELLOW]]발광석 가루, 설탕, 반짝이는 수박 조각, 황금 당근,\n[[YELLOW]]마그마 크림, 네더 사마귀, 거미 눈, 수플후르, 워터 릴리,\n[[YELLOW]]복어\n[[YELLOW]](바닐라 물약)
-Guides.Alchemy.Section.4=[[DARK_AQUA]]Concoctions 2단계 재료:\n[[YELLOW]]당근 (신속의 물약)\n[[YELLOW]]슬라임볼 (채굴 피로의 물약)\n\n[[DARK_AQUA]]Concoctions 3단계 재료:\n[[YELLOW]]석영 (흡수의 물약)\n[[YELLOW]]토끼 발 (도약의 물약)
-Guides.Alchemy.Section.5=[[DARK_AQUA]]Concoctions 4단계 재료:\n[[YELLOW]]사과 (생명력 강화의 물약)\n[[YELLOW]]썩은 고기 (허기의 물약)\n\n[[DARK_AQUA]]Concoctions 5단계 재료:\n[[YELLOW]]갈색 버섯 (멀미의 물약)\n[[YELLOW]]잉크 주머니 (실명의 물약)
-Guides.Alchemy.Section.6=[[DARK_AQUA]]Concoctions 6단계 재료:\n[[YELLOW]]고사리 (포화의 물약)\n\n[[DARK_AQUA]]Concoctions 7단계 재료:\n[[YELLOW]]독이 있는 감자 (부패의 물약)\n\n[[DARK_AQUA]]Concoctions 8단계 재료:\n[[YELLOW]]일반 황금 사과 (저항의 물약)
-
-##Archery
-Guides.Archery.Section.0=&3궁술에 대하여:\n&e궁술은 활과 화살로 사격하는 것입니다.\n&e레벨에 따라 증가하는 데미지 보너스와 PvP에서 상대를\n&e혼란시키는 능력과 같은 다양한 전투 보너스를 제공합니다.\n&e또한, 상대의 시체에서 사용한 화살을 일부 회수할 수 있습니다.\n\n\n&3XP 획득:\n&e이 스킬에서 XP를 얻으려면 몹이나 다른 플레이어를\n&e쏴서 맞춰야 합니다.
-Guides.Archery.Section.1=&3Skill Shot은 어떻게 작동하나요?\n&eSkill Shot은 사격에 추가 데미지를 제공합니다.\n&eSkill Shot의 보너스 데미지는 궁술 레벨에 따라\n&e증가합니다.\n&e기본 설정에서 Archery 레벨당 활 데미지가 50 레벨마다\n&e10% 증가하여 최대 200%의 보너스 데미지를 얻을 수 있습니다.
-Guides.Archery.Section.2=&3Daze는 어떻게 작동하나요?\n&e상대를 사격할 때 상대를 혼란시키는 확률이 있습니다.\n&eDaze가 발동되면 상대는 잠시 동안 위를 바라보게 됩니다.\n&eDaze 사격은 추가로 4의 데미지(2 하트)를 입힙니다.
-Guides.Archery.Section.3=&3Arrow Retrieval은 어떻게 작동하나요?\n&e활로 몹을 처치할 때 일부 화살을 회수할 수 있는\n&e확률이 있습니다.\n&e이 확률은 궁술 레벨에 따라 증가합니다.\n&e기본 설정에서 이 능력은 레벨당 0.1%씩 증가하여\n&e레벨 1000에서 100%까지 증가합니다.
-
-##Axes
-Guides.Axes.Section.0=&3부술에 대하여:\n&e부술 스킬을 사용하여 도끼로 나무를 베는 것 이상의 다양한 기능을 사용할 수 있습니다.\n&e부술 스킬을 사용하여 몹과 플레이어를 공격하고 경험치를 얻을 수 있으며,\n&e넉백 효과로 몹에게 치명적인 일격을 가할 수 있습니다.\n&e또한, 레벨이 올라감에 따라 적의 갑옷을 쉽게 파괴할 수 있는\n&e손에 들고 사용하는 나무 굴삭기가 됩니다.\n&3XP 획득:\n&e이 스킬에서 XP를 얻으려면 도끼로 다른 몹이나 플레이어를 공격해야 합니다.
-Guides.Axes.Section.1=&3뼈 쪼개기는 어떻게 작동하나요?\n&e이 능력을 사용하면 AoE(영역 효과) 공격을 할 수 있습니다.\n&e이 AoE 공격은 주요 대상에 가한 데미지의 절반만큼의 데미지를 입힙니다.\n&e따라서 대량의 몹을 제거하는 데에 효과적입니다.
-Guides.Axes.Section.2=&3크리티컬 히트는 어떻게 작동하나요?\n&e크리티컬 히트는 플레이어가 추가 데미지를 입힐 수 있는\n&e확률적인 능력입니다.\n&e기본 설정에서, 부술 스킬 레벨 2마다 0.1%의 확률로\n&e크리티컬 히트를 가할 수 있으며, 이로 인해 몹에게는\n&e2배의 데미지를, 다른 플레이어에게는 1.5배의 데미지를 입힙니다.
-Guides.Axes.Section.3=&3도끼 마스터리는 어떻게 작동하나요?\n&e도끼 마스터리는 액스를 사용할 때 공격에 추가 데미지를\n&e줍니다.\n&e기본 설정에서, 보너스 데미지는 레벨당 50마다 1씩 증가하며,\n&e레벨 200에서 최대 4의 추가 데미지를 얻을 수 있습니다.
-Guides.Axes.Section.4=&3갑옷 충격는 어떻게 작동하나요?\n&e강력한 힘으로 갑옷을 파괴하세요!\n&e갑옷 충격는 상대의 갑옷을 손상시킬 확률이 있습니다.\n&e이 확률은 부술 스킬 레벨이 올라감에 따라 증가합니다.
-Guides.Axes.Section.5=&3엄청난 충격는 어떻게 작동하나요?\n&e부술 스킬로 몹이나 플레이어를 공격할 때\n&e더 큰 영향을 줄 확률이 있습니다.\n&e기본 설정에서 이 확률은 25%입니다.\n&e이 패시브 능력은 넉백 II 마법과 유사한\n&e인챈트 효과를 가지며, 대상에게 추가 데미지를 입힙니다.
-
-##Excavation
-Guides.Excavation.Section.0=&3발굴에 대하여:\n&e발굴은 보물을 찾기 위해 흙을 파내는 행위입니다.\n&e땅을 파내면 보물을 찾을 수 있습니다.\n&e이를 계속하면 더 많은 보물을 찾을 수 있습니다.\n\n&3XP 획득:\n&e이 스킬에서 XP를 얻으려면 삽을 들고 파야 합니다.\n&e일부 재료만 보물과 XP를 얻을 수 있습니다.
-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발굴 재료를 즉시 부술 수 있게 합니다.
-Guides.Excavation.Section.4=&3고고학은 어떻게 작동하나요?\n&e발굴을 위한 가능한 모든 보물은 떨어지기 위한\n&e스킬 레벨 요구 사항이 있으므로, 얼마나 도움이 되는지\n&정확히 말하기는 어렵습니다.\n&e단지 기억해 두세요. 발굴 스킬이 높을수록\n&더 많은 보물을 찾을 수 있습니다.\n&또한, 각각의 발굴 호환 가능한 재료에는 고유한 보물 목록이 있습니다.\n&다시 말해, 흙에서 찾는 보물과 자갈에서 찾는 보물은 다릅니다.
-Guides.Excavation.Section.5=&3발굴에 대한 참고 사항:\n&e발굴 보상은 완전히 사용자 정의할 수 있으므로\n&결과는 서버마다 다릅니다.
-
-##Fishing
-Guides.Fishing.Section.0=&3낚시에 대하여:\n&e낚시 스킬이 있다면 낚시가 다시 즐거워집니다!\n&e숨겨진 보물을 찾고 몹에서 아이템을 떨어뜨립니다.\n\n&3XP 획득:\n&e물고기를 낚아서 경험치를 얻습니다.
-Guides.Fishing.Section.1=&3보물 사냥꾼은 어떻게 작동하나요?\n&e이 능력을 사용하면 낚시로 보물을 찾을 수 있습니다.\n&e아이템이 인챈트된 상태로 드롭될 수 있는 작은 확률이 있습니다.\n&e낚시로 얻을 수 있는 모든 보물은 어떤 레벨에서든 드롭될 수 있습니다.\n&e그러나 아이템의 희귀도에 따라 얼마나 자주 드롭되는지가 달라집니다.\n&e낚시 스킬이 높을수록 더 좋은 보물을 찾을 확률이 높아집니다.
-Guides.Fishing.Section.2=&3얼음 낚시는 어떻게 작동하나요?\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또한, 서바이벌 모드에서는 얻을 수 없는 몹 머리를 획득할 수도 있습니다.
-Guides.Fishing.Section.5=&3어부의 다이어트는 어떻게 작동하나요?\n&e이 패시브 스킬은 물고기를 먹을 때 회복되는 포만감을 증가시킵니다.
-Guides.Fishing.Section.6=&3낚시에 대한 참고 사항:\n&e낚시 아이템은 완전히 사용자 정의할 수 있으므로\n&결과는 서버마다 다릅니다.
-
-##Herbalism
-Guides.Herbalism.Section.0=&3약초학에 대하여:\n&e약초학은 허브와 식물을 수집하는 것에 관한 스킬입니다.\n\n\n&3XP 획득:\n&e식물과 허브를 수집하세요.
-Guides.Herbalism.Section.1=&3호환 가능한 블록:\n&e밀, 감자, 당근, 수박, \n&e호박, 사탕수수, 코코아 콩, 꽃, 선인장, 버섯,\n&e네더 사마귀, 원반, 덩굴.
-Guides.Herbalism.Section.2=&3재배의 대지는 어떻게 작동하나요?\n&e재배의 대지는 액티브 능력으로, 괭이를 들고 우클릭하여\n&e재배의 대지를 활성화할 수 있습니다.\n&e재배의 대지는 식물을 수확할 때 3배의 드롭을 얻을 확률을\n&제공합니다. 또한 인벤토리의 씨앗을 사용하여 블록에\n&생명을 불어넣고 변형시킬 수 있는 능력을 제공합니다.
-Guides.Herbalism.Section.3=&3재배의 재능 (작물)은 어떻게 작동하나요?\n&e이 패시브 능력은 작물을 수확할 때 자동으로 재심을\n&합니다. 성공 확률은 약초학 스킬 레벨에 따라 달라집니다.
-Guides.Herbalism.Section.4=&3재배의 재능 (석재/돌/흙)은 어떻게 작동하나요?\n&e이 액티브 능력은 블록을 해당하는 "식물 관련" 블록으로\n&변환할 수 있게 합니다. 씨앗을 들고 블록을 우클릭하여\n&사용할 수 있습니다. 이 과정에서 1개의 씨앗이 소모됩니다.
-Guides.Herbalism.Section.5=&3농부의 다이어트는 어떻게 작동하나요?\n&e이 패시브 스킬은 빵, 쿠키, 수박, 버섯 스튜, 당근,\n&감자를 섭취할 때 회복되는 포만감을 증가시킵니다.
-Guides.Herbalism.Section.6=&3하이랄인의 행운은 어떻게 작동하나요?\n&e이 패시브 능력은 검으로 특정 블록을 부술 때\n&희귀 아이템을 얻을 확률을 제공합니다.
-Guides.Herbalism.Section.7=&32배 드롭은 어떻게 작동하나요?\n&e이 패시브 능력은 수확 시 더 많은 수확량을 제공합니다.
-
-##Mining
-Guides.Mining.Section.0=&3채광에 대하여:\n&e채광은 돌과 광석을 캐는 것으로, 채굴 시 드롭되는 자원의 양에 보너스를 제공합니다.\n\n&3XP 획득:\n&e이 스킬에서 XP를 얻으려면 손에 곡괭이를 들고 채굴해야 합니다.\n&e일부 블록만 XP를 제공합니다.
-Guides.Mining.Section.1=&3호환 가능한 자료:\n&e돌, 석탄 광석, 철 광석, 금 광석, 다이아몬드 광석, 레드스톤 광석,\n&e청금석 광석, 흑요석, 이끼 낀 석재, 엔더 돌,\n&e발광석, 네더랙입니다.
-Guides.Mining.Section.2=&3파괴자는 어떻게 작동하나요?\n&e곡괭이를 손에 들고, 우클릭을 하면 도구가 준비 상태가 됩니다.\n&e이 상태에서, 4초 안에 채광 가능 블록을 좌클릭하면, 이것은 파괴자를 발동할 것입니다.
-Guides.Mining.Section.3=&3파괴자가 무엇인가요?\n&e파괴자는 채광 스킬과 연결된 재사용 대기시간이 있는 능력입니다. 이는 추가 아이템이 떨어질 확률을 세 배로 늘리고 채광 재료를 즉시 부술 수 있게 합니다.
-Guides.Mining.Section.4=&3폭발 채굴은 어떻게 작동하나요?\n&e곡괭이를 손에 들고 웅크리기를 한 후 TNT를 멀리서 우클릭하세요. 이것은 TNT를 즉시 폭발시킬 것입니다.
-Guides.Mining.Section.5=&3폭발 채굴은 어떻게 작동합니까?\n&e 폭발 채굴은 채광 스킬과 연결된 쿨타임이 있는 기능입니다. TNT로 채굴할 때 보너스를 제공하고 TNT를 원격으로 폭발시킬 수 있습니다. 폭발 채굴에는 세 가지 부분이 있습니다.\n&e 첫 번째 부분은 폭발 반경을 증가시키는 더 큰 폭탄입니다.\n&e 두 번째 부분은 TNT 폭발로 인한 피해를 감소시키는 해체 전문가입니다. 세 번째 부분은 단순히 TNT에서 떨어지는 광석의 양을 증가시키고 떨어지는 파편을 감소시킵니다.
-
-##Repair
-Guides.Repair.Section.0=&3수리에 대하여:\n&e수리는 철 블록을 사용하여 갑옷과 도구를 수리할 수 있게 합니다.\n\n&3XP 획득:\n&emcMMO 모루를 사용하여 도구나 갑옷을 수리하세요. 이는\n&e기본적으로 철 블록이며, Minecraft의 일반 모루와 혼동되지 않아야 합니다.
-Guides.Repair.Section.1=&3어떻게 수리를 사용할 수 있나요?\n&emcMMO 모루를 설치하고 현재 들고 있는 아이템을 우클릭하여 수리하세요. 이는 사용할 때마다 1개의 아이템을 소모합니다.
-Guides.Repair.Section.2=&3수리 마스터리은 어떻게 작동하나요?\n&e수리 마스터리은 수리량을 증가시킵니다. 추가로 수리되는 양은 수리 스킬 레벨에 영향을 받습니다.
-Guides.Repair.Section.3=&3슈퍼 수리는 어떻게 작동하나요?\n&e슈퍼 수리는 패시브 능력입니다. 아이템을 수리할 때\n&e더욱 효과적으로 아이템을 수리할 수 있는 기회를 제공합니다.
-Guides.Repair.Section.4=&3인챈트 아이템 수리는 어떻게 작동하나요?\n&e이 패시브 능력은 일정 확률로 아이템을 수리할 때\n&e인챈트를 유지할 수 있게 합니다. 인챈트는\n&e기존 레벨로 유지되거나 낮은 레벨로 강등되거나\n&완전히 사라질 수 있습니다.
-
-##Salvage
-Guides.Salvage.Section.0=&3회수에 대하여:\n&e회수는 금 블록을 사용하여 갑옷과 도구를 회수할 수 있게 합니다.\n\n&3XP 획득:\n&e회수는 수리 및 낚시의 부가 스킬로, 회수 스킬 레벨은 낚시 및 수리 스킬 레벨에 기반합니다.
-Guides.Salvage.Section.1=&3회수를 어떻게 사용할 수 있나요?\n&emcMMO 회수 모루를 설치하고 현재 들고 있는 아이템을 우클릭하여 회수하세요. 이렇게 하면 아이템이 분해되고 아이템을 제작하는 데 사용된 재료가 반환됩니다.\n\n&e예를 들어, 철 곡괭이를 회수하면 철 주괴를 얻을 수 있습니다.
-Guides.Salvage.Section.2=&3전문적인 회수는 어떻게 작동하나요?\n&e전문적인 회수를 잠금 해제하면 손상된 아이템을 회수할 수 있습니다. 레벨이 올라감에 따라 수확률이 증가합니다. 높은 수확률은 더 많은 재료를 얻을 수 있음을 의미합니다.\n&e전문적인 회수를 사용하면 항상 1개의 재료를 얻게 되며, 아이템이 너무 손상된 경우를 제외하고는 아이템을 파괴하고 아무것도 얻지 못하는 일은 없습니다.
-Guides.Salvage.Section.3=&3작동 방식을 설명하기 위해 예를 들어보겠습니다:\n&e손상된 금 곡괭이를 회수한다고 가정해 봅시다. 이 경우 최대로 얻을 수 있는 양은 2개입니다(곡괭이는 3개의 주괴로 제작되며 각각의 주괴는 33.33%의 내구성을 가지므로 66%에 해당하는 2개입니다). 수확률이 66%보다 낮으면 2개의 주괴를 얻을 수 없습니다. 수확률이 이 값보다 높으면 "전체 양"을 얻을 수 있으며, 즉 2개의 주괴를 얻게 됩니다.
-Guides.Salvage.Section.4=&3신비로운 회수는 어떻게 작동하나요?\n&e이 능력을 사용하면 마법이 부여된 아이템을 회수할 때 마법이 부여된 책을 얻을 수 있습니다. 레벨에 따라 완전한 부분 또는 부분적인 부여를 성공적으로 추출할 확률이 다릅니다.\n\n&e부분적으로 추출된 경우, 부여된 책은 아이템에 있던 부여보다 낮은 레벨의 부여를 가지게 됩니다.
-
-##Smelting
-Guides.Smelting.Section.0=준비 중...
-
-##Swords
-Guides.Swords.Section.0=&3검술에 대해:\n&e이 스킬은 검을 사용하는 사람에게 전투 보너스를 제공합니다.\n\n&3XP 획득:\n&e검을 사용하여 몹이나 다른 플레이어에게 입힌 데미지에 따라 경험치를 획득합니다.
-Guides.Swords.Section.1=&3톱날 공격은 어떻게 작동하나요?\n&e톱날 공격은 액티브 능력으로, 검으로 우클릭하여 활성화할 수 있습니다. 이 능력을 사용하면 AoE(영역 효과) 공격을 할 수 있습니다. 이 AoE는 추가 25%의 데미지를 입히며, Rupture를 적용할 수도 있습니다.
-Guides.Swords.Section.2=&3카운터 어택은 활성 능력입니다. 몹으로부터 공격을 막으면서 피해를 입을 때, 받은 피해의 50%를 반사할 확률이 있습니다.
-Guides.Swords.Section.3=&3파열은 적에게 2초마다 피해를 입힙니다. 이 효과는 피해를 입은 대상이 죽거나 효과가 사라질 때까지 계속됩니다. 검 기술이 높을수록 피 효과의 지속 시간이 증가합니다.
-
-##Taming
-Guides.Taming.Section.0=&3조련에 대하여:\n&e조련은 길들인 늑대를 사용할 때 다양한 전투 보너스를 제공합니다.\n\n&3XP 획득:\n&e이 스킬에서 경험치를 얻으려면 늑대/오셀롯을 길들이거나\n&e늑대와 전투해야 합니다.
-Guides.Taming.Section.1=&3야생의 포효는 어떻게 작동하나요?\n&e야생의 포효는 액티브 능력으로, 뼈다귀나 생선을 들고\n&e웅크리고 좌클릭하여 늑대나 오셀롯을 소환할 수 있습니다.
-Guides.Taming.Section.2=&3짐승의 포효는 어떻게 작동하나요?\n&e짐승의 포효는 펫을 검사하고 늑대와 오셀롯의\n&estats를 확인할 수 있게 합니다. 늑대나 오셀롯을 좌클릭하여\n&e짐승의 포효를 사용하세요.
-Guides.Taming.Section.3=&3돌진은 어떻게 작동하나요?\n&e돌진은 패시브 능력으로, 늑대의 대상에게 출혈 효과를\n&적용할 수 있는 확률이 있습니다.
-Guides.Taming.Section.4=&3날카로운 발톱은 어떻게 작동하나요?\n&e날카로운 발톱은 늑대가 입히는 피해에 추가적인 데미지 보너스를\n&제공합니다. 이 데미지 보너스는 테이밍 레벨에 따라 달라집니다.
-Guides.Taming.Section.5=&3환경 인식은 어떻게 작동하나요?\n&e이 패시브 능력은 늑대가 선인장/용암과 같은 위험 요소에\n&가까이 다가갈 때 당신에게 순간이동할 수 있게 합니다.\n&또한, 늑대에게 낙하 피해 면역성을 제공합니다.
-Guides.Taming.Section.6=&3두꺼운 털은 어떻게 작동하나요?\n&e이 패시브 능력은 늑대의 피해를 감소시키고\n&불에 대한 내성을 제공합니다.
-Guides.Taming.Section.7=&3충격 방지는 어떻게 작동하나요?\n&e이 패시브 능력은 늑대가 폭발로 인한 피해를\n&감소시킵니다.
-Guides.Taming.Section.8=&3빠른 음식 제공은 어떻게 작동하나요?\n&e이 패시브 능력은 늑대가 공격할 때마다 회복할\n&수 있는 기회를 제공합니다.
-
-##Unarmed
-Guides.Unarmed.Section.0=&3비무장에 대해:\n&e비무장은 주먹을 무기로 사용할 때 플레이어에게 다양한 전투 보너스를 제공합니다. \n\n&3XP 획득:\n&e맨손으로 몹이나 다른 플레이어에게 입힌 피해량에 따라 경험치를 획득합니다.
-Guides.Unarmed.Section.1=&3버서커는 어떻게 작동하나요?\n&e버서커는 우클릭으로 활성화되는 액티브 능력입니다. 버서커 모드에서는 추가로 50%의 피해를 입히며, 흙과 풀과 같은 약한 재료를 즉시 부술 수 있습니다.
-Guides.Unarmed.Section.2=&3강철 팔 형태는 어떻게 작동하나요?\n&e강철 팔 형태는 주먹으로 몹이나 플레이어를 때릴 때 입히는 피해량을 증가시킵니다.
-Guides.Unarmed.Section.3=&3화살 회피는 어떻게 작동하나요?\n&e화살 튕김은 스켈레톤이나 다른 플레이어가 발사한 화살을 튕길 확률을 제공하는 패시브 능력입니다. 화살은 피해를 입히지 않고 땅에 떨어집니다.
-Guides.Unarmed.Section.4=&3강철 주먹은 어떻게 작동하나요?\n&e강철 주먹은 다른 스킬의 강제 무장 해제 효과를 방지하는 패시브 능력입니다. 비무장 레벨이 올라갈수록 강제 무장 해제를 방지하는 확률이 증가합니다.
-Guides.Unarmed.Section.5=&3비무장은 어떻게 작동하나요?\n&e이 패시브 능력은 플레이어가 다른 플레이어의 무기를 해제할 수 있게 해줍니다. 대상의 장착된 아이템은 땅에 떨어집니다.
-
-##Woodcutting
-Guides.Woodcutting.Section.0=&3벌목에 대하여:\n&e벌목은 나무를 베는 것에 관한 스킬입니다.\n\n&3XP 획득:\n&e나무 블록을 부술 때마다 경험치를 얻습니다.
-Guides.Woodcutting.Section.1=&3나무꾼은 어떻게 작동하나요?\n&e나무꾼은 액티브 능력으로, 도끼를 들고 우클릭하여\n&e나무 베기를 활성화할 수 있습니다. 이렇게 하면\n&e전체 나무가 즉시 부서지고 한 번에 모든\n&나무 블록이 떨어집니다.
-Guides.Woodcutting.Section.2=&3나뭇잎 청소는 어떻게 작동하나요?\n&e나뭇잎 청소는 패시브 능력으로, 도끼로\n&맞힌 잎사귀 블록이 즉시 부서지게 합니다.\n&기본적으로 이 능력은 레벨 100에서 해금됩니다.
-Guides.Woodcutting.Section.3=&3드롭 2배는 어떻게 작동하나요?\n&e이 패시브 능력은 베는 나무마다 추가로\n&한 개의 블록을 얻을 수 있는 기회를 제공합니다.
+# 이벤트
+XPRate.Event=&6mcMMO가 현재 XP 비율 이벤트 중입니다! XP 비율은 {0}배입니다!
 
-#INSPECT
-Inspect.Offline= &c그 플레이어는 오프라인 상태이므로 검사할 수 없습니다. 오프라인 플레이어를 검사하려면 권한이 필요합니다.
-Inspect.OfflineStats=mcMMO 오프라인 유저 스텟은 &e{0} 입니다
-Inspect.Stats=&amcMMO 스텟은 &e{0} 입니다
-Inspect.TooFar=당신은 그 플레이어와 너무 멀리 떨어져 있어 검사할 수 없습니다!
-
-#ITEMS
-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텔레포트가 &6({0}) &7초안에 시작됩니다, 가만히 기다려주세요...
+#가이드
+Guides.Available=&7{0}에 대한 가이드 사용 가능 - /{1} ? [페이지]
+Guides.Header=&6-=&a{0} 가이드&6=-
+Guides.Page.Invalid=유효한 페이지 번호가 아닙니다!
+Guides.Page.OutOfRange=해당 페이지가 존재하지 않습니다. 전체 페이지 수는 {0}입니다.
+Guides.Usage= 사용법: /{0} ? [페이지]
+##곡예
+Guides.Acrobatics.Section.0=&3곡예에 대해:\n&e곡예는 mcMMO에서 우아하게 움직이는 예술입니다.\n&e전투 보너스 및 환경 피해 보너스를 제공합니다.\n\n&3XP 획득:\n&e이 스킬에서 XP를 획득하려면 전투에서 피격을 회피하거나\n&e높은 곳에서 떨어져서 피해를 입어야 합니다.
+Guides.Acrobatics.Section.1=&3롤링이 작동하는 방법은?\n&e낙하 피해를 입을 때 자동으로 피해를 무효화할\n&epassive한 확률이 있습니다.\n&eeSneak 버튼을 누르고 낙하 중에 확률을 두배로 늘릴 수 있습니다.\n&e이로 인해 표준 롤이 아닌 우아한 롤이 발생합니다.\n&e우아한 롤은 일반 롤과 유사하지만 두 배의 확률로\n&e발생하며 표준 롤보다 더 많은 피해 안전을 제공합니다.\n&e롤링 확률은 스킬 레벨에 결합됩니다.
+Guides.Acrobatics.Section.2=&3회피가 작동하는 방법은?\n&e회피는 전투 중에\n&e입은 피해를 절반으로 줄이는 자동 확률입니다.\n&e스킬 레벨에 결합됩니다.
+##연금술
+Guides.Alchemy.Section.0=[[DARK_AQUA]]연금술에 대해:\n[[YELLOW]]연금술는 포션 제조와 관련이 있습니다.\n[[YELLOW]]포션 제조 시간을 빠르게 할 뿐만 아니라\n[[YELLOW]]이전에 얻을 수 없던 새로운 포션도 추가합니다.\n\n\n[[DARK_AQUA]]XP 획득:\n[[YELLOW]]이 스킬에서 XP를 획득하려면 포션을 제조해야 합니다.
+Guides.Alchemy.Section.1=[[DARK_AQUA]]카탈리시스가 작동하는 방법은?\n[[YELLOW]]카탈리시스는 제조 과정을 가속화합니다.\n[[YELLOW]]레벨 100에서 최대 속도가 4배까지 증가합니다.\n[[YELLOW]]이 능력은 기본적으로 레벨 100에서 잠금 해제됩니다.
+Guides.Alchemy.Section.2=[[DARK_AQUA]]조제가 작동하는 방법은?\n[[YELLOW]]조제는 사용자 정의 재료로 더 많은 포션을 제조할 수 있습니다.\n[[YELLOW]]잠금 해제된 특별한 재료는 사용자의 등급에 따라 결정됩니다.\n[[YELLOW]]잠금 해제된 특별한 재료는 사용자의 등급에 따라 결정됩니다. 8개의 등급이 있습니다.
+Guides.Alchemy.Section.3=[[DARK_AQUA]]조제 1단계 재료:\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]](기본 포션)
+Guides.Alchemy.Section.4=[[DARK_AQUA]]조제 2단계 재료:\n[[YELLOW]]Carrot (Potion of Haste)\n[[YELLOW]]Slimeball (Potion of Dullness)\n\n[[DARK_AQUA]]조제 3단계 재료:\n[[YELLOW]]Quartz (Potion of Absorption)\n[[YELLOW]]Rabbit's Foot (Potion of Leaping)
+Guides.Alchemy.Section.5=[[DARK_AQUA]]조제 4단계 재료:\n[[YELLOW]]Apple (Potion of Health Boost)\n[[YELLOW]]Rotten Flesh (Potion of Hunger)\n\n[[DARK_AQUA]]조제 5단계 재료:\n[[YELLOW]]Brown Mushroom (Potion of Nausea)\n[[YELLOW]]Ink Sack (Potion of Blindness)
+Guides.Alchemy.Section.6=[[DARK_AQUA]]조제 6단계 재료:\n[[YELLOW]]Fern (Potion of Saturation)\n\n[[DARK_AQUA]]조제 7단계 재료:\n[[YELLOW]]Poisonous Potato (Potion of Decay)\n\n[[DARK_AQUA]]조제 8단계 재료:\n[[YELLOW]]Regular Golden Apple (Potion of Resistance)
+#양궁
+Guides.Archery.Section.0=&3양궁에 대해:\n&e양궁는 활과 화살로 사격하는 것에 관한 것입니다.\n&e전투 보너스로는 레벨에 따라 증가하는 추가 데미지\n&ee와 PvP에서 상대를 헷갈리게 하는 능력 등이 있습니다.\n&ee이외에도 적들의 시체에서 사용한 화살 중 일부를\n&ee회수할 수 있습니다.\n\n\n&3XP 획득:\n&e이 스킬에서 XP를 획득하려면 몹이나 다른 플레이어를\n&ee사격해야 합니다.
+Guides.Archery.Section.1=&3스킬샷이 작동하는 방법은?\n&e스킬샷은 사격에 추가 데미지를 제공합니다.\n&e스킬샷의 보너스 데미지는 양궁 레벨이\n&ee증가함에 따라 증가합니다.\n&e기본 설정에서 양궁 데미지는 매 50 레벨마다\n&ee 10%씩 증가하여 최대 200%의 보너스 데미지를 얻습니다.
+Guides.Archery.Section.2=&3현혹이 작동하는 방법은?\n&e상대를 사격할 때 다른 플레이어를 헷갈리게 할\n&e자동 확률이 있습니다. 현혹이 발생하면 상대방을\n&ekort 올려 상당한 시간 동안 움직일 수 없게 합니다.\n&e현훅 사격은 추가적으로 4 데미지(2 하트)를 줍니다.
+Guides.Archery.Section.3=&3화살 회수가 작동하는 방법은?\n&e활로 몹을 죽일 때 사용한 화살 중 일부를\n&e회수할 수 있는 자동 확률이 있습니다.\n&e양궁 레벨이 증가함에 따라 이 확률이\n&ee증가합니다.\n&e기본적으로 레벨마다 0.1%씩 증가하여 레벨 1000에서\n&ee 100%까지 증가합니다.
+##참수
+Guides.Axes.Section.0=&3참수에 대해:\n&eAxe 스킬을 사용하면 나무를 베는 것 이상의 일에\n&e도끼를 사용할 수 있습니다! 몹과 플레이어를 찍고\n&e베어 경험치를 얻을 수 있습니다. 다른 몹에게\n&e넉백 효과를 적용하고 몹과 플레이어에게 치명적인\n&e크리티컬을 입힐 수도 있습니다. 레벨이 오르면\n&ee아처의 갑옷을 쉽게 깨는 수동 핸드 헬드 우드칩퍼가 됩니다.\n&3XP 획득:\n&e이 스킬에서 XP를 획득하려면 도끼로 다른 몹이나 플레이어를\n&eb 치면 됩니다.
+Guides.Axes.Section.1=&3스컬 스플리터가 작동하는 방법은?\n&e이 능력은 범위 피해를 입히도록 허용합니다.\n&ee이 범위 피해는 주요 대상에 가한 피해의 절반이 됩니다.\n&e그래서 많은 몹을 쉽게 제거할 수 있습니다.
+Guides.Axes.Section.2=&3치명타가 작동하는 방법은?\n&e치명타는 추가 데미지를 줄 수 있는\n&e확률을 제공하는 수동 능력입니다.\n&e기본 설정에서 Axes 2 레벨마다 0.1%의 기회를\n&e얻으며, 이로 인해 몹에게는 2배의 데미지,\n&e플레이어에게는 1.5배의 데미지를 입힐 수 있습니다.
+Guides.Axes.Section.3=&3도끼 마스터리가 작동하는 방법은?\n&e도끼 마스터리는 도끼를 사용할 때 피해를 추가합니다.\n&e기본적으로 50 레벨마다 보너스 데미지가 1씩\n&e증가하여 레벨 200에서 최대 4의 추가 피해를\n&ee받습니다.
+Guides.Axes.Section.4=&3갑옷 충격이 작동하는 방법은?\n&e갑옷을 파괴할만큼 충격적으로 공격하세요!\n&e갑옷 충격에는 상대의 갑옷을 손상시킬 수 있는\n&ee자동 확률이 있습니다. Axes 레벨이 오르면\n&ee이 데미지가 증가합니다.
+Guides.Axes.Section.5=&3더 큰 영향이 작동하는 방법은?\n&e도끼로 몹이나 플레이어를 공격할 때 더 큰\n&e영향을 줄 수 있는 자동 확률이 있습니다.\n&e기본적으로 이 확률은 25%입니다. 이 자동 능력은\n&e넉백 II 인첸트와 유사한 극단적인 넉백 효과를\n&ee가지며 대상에게 추가 데미지를 줍니다.
+##발굴
+Guides.Excavation.Section.0=&3발굴에 대해:\n&e발굴은 보물을 찾기 위해 흙을 파는 작업입니다.\n&e땅을 파면 보물을 찾을 수 있습니다.\n&e이를 통해 더 많은 보물을 찾을 수 있습니다.\n\n&3XP 획득:\n&e이 스킬에서 XP를 획득하려면 손에 삽을 들고 파야 합니다.\n&e특정한 재료만이 보물과 XP를 얻을 수 있습니다.
+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&e3배로 늘리고 발굴 재료에 대한 즉시 부서를\n&ee능력화합니다.
+Guides.Excavation.Section.4=&3고고학이 작동하는 방법은?\n&e발굴을 위한 모든 가능한 보물은 획득을 위한\n&e스킬 레벨 요구 사항이 있기 때문에\n&e어느 정도 도움이 되는지 어렵습니다.\n&e단지 발굴 스킬이 높을수록 찾을 수 있는\n&ee보물이 많아집니다.\n&e또한 각 발굴 호환 재료 유형마다 고유한\n&e보물 목록이 있습니다.\n&e다시 말해 Dirt에서는 다른 보물을 발견합니다.\n&ee Gravel.
+Guides.Excavation.Section.5=&3발굴에 대한 참고 사항:\n&e발굴 드롭은 완전히 사용자 정의할 수 있습니다.\n&e결과는 서버마다 다릅니다.
+##낚시
+Guides.Fishing.Section.0=&3낚시에 관하여:\n&e낚시 스킬을 사용하면 낚시가 다시 흥미로워집니다!\n&e숨겨진 보물을 발견하고 몹에서 아이템을 떨어뜨릴 수 있습니다.\n\n&3XP 획득:\n&e물고기를 낚아라.
+Guides.Fishing.Section.1=&3보물 사냥꾼가 작동하는 방법은?\n&e이 능력을 통해 낚시로부터 보물을 발견할 수 있으며\n&e아이템의 일부가 마법부여되어 있는 작은 확률이 있습니다.\n&e낚시의 모든 가능한 보물은 어느 레벨에서나 떨어질 수 있는\n&e확률이 있습니다. 그러나 아이템의 희귀도에 따라\n&ee얼마나 자주 떨어지는지가 달라집니다.\n&e낚시 스킬이 높을수록 더 좋은 보물을 발견할 확률이\n&ee더 좋아집니다.
+Guides.Fishing.Section.2=&3얼음 낚시이 작동하는 방법은?\n&e이 수동 능력을 통해 얼음 호수에서 낚시할 수 있습니다!\n&e얼음 호수에 낚싯대를 던지면 능력이 활성화되어\n&e작은 구멍을 만들어 낚시를 할 수 있습니다.
+Guides.Fishing.Section.3=&3낚시꾼의 대가가 작동하는 방법은?\n&e이 수동 능력은 낚시할 때 물고기가 낚일 확률을\n&e증가시킵니다. 이 능력을 해제하면 보트에 탑승한\n&ee상태에서 낚시할 때 물고기를 잡을 확률이 높아집니다.
+Guides.Fishing.Section.4=&3떨림이 작동하는 방법은?\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&ee결과는 서버마다 다릅니다.
+##약초학
+Guides.Herbalism.Section.0=&3허브 수집에 관하여:\n&eHerbalism은 허브와 식물을 수집하는 것입니다.\n\n\n&3XP 획득:\n&e식물과 허브를 수집하십시오.
+Guides.Herbalism.Section.1=&3호환되는 블록\n&e밀, 감자, 당근, 수박,\n&e호박, 사탕수수, 코코아, 꽃, 선인장, 버섯,\n&e네더 와트, 연꽃잎, 덩굴.
+Guides.Herbalism.Section.2=&3녹색 에너지가 작동하는 방법은?\n&e녹색 에너지는 활성 능력으로, 괭이를 들고 있는\n&ee상태에서 마우스 오른쪽 버튼을 클릭하여 녹색 에너지를\n&e활성화할 수 있습니다.\n&e녹색 에너지는 플레이어에게 작물을 수확할 때 3배의 드롭을\n&ee얻을 기회를 부여합니다. 또한 인벤토리에서 씨앗을 사용하여\n&e블록에 생명을 주고 변형시킬 수 있는 능력을 제공합니다.
+Guides.Herbalism.Section.3=&3식물 재배 (Crops)가 작동하는 방법은?\n&e이 수동 능력은 수확할 때 자동으로 작물을 재배합니다.\n&ee성공 확률은 허브 스킬에 따라 다릅니다.
+Guides.Herbalism.Section.4=&3식물 재배 (Cobble/Stone Brick/Dirt)가 작동하는 방법은?\n&e이 수동 능력을 사용하면 블록을 "식물 관련" 동료로 변환할 수 있습니다.\n&e씨앗을 들고 블록을 마우스 오른쪽 버튼으로 클릭하면 됩니다. 이렇게 하면 1개의 씨앗이 소비됩니다.
+Guides.Herbalism.Section.5=&3Farmer's Diet가 작동하는 방법은?\n&e이 수동 능력은 빵, 쿠키, 수박, 버섯 수프, 당근,\n&ee감자를 먹을 때 회복되는 배고픔의 양을 증가시킵니다.
+Guides.Herbalism.Section.6=&3약초학의 행운이 작동하는 방법은?\n&e이 수동 능력은 일부 블록이 검술로 파괴될 때 희귀 아이템을 찾을 기회를 부여합니다.
+Guides.Herbalism.Section.7=&3더블 드롭이 작동하는 방법은?\n&e이 수동 능력은 수확할 때 플레이어에게 더 많은 수확량을 제공합니다.
+##채광
+Guides.Mining.Section.0=&3광업에 관하여:\n&e광업은 돌과 광물을 캐는 것으로, 채굴할 때 드롭되는 자원의 양을\n&e증가시켜줍니다.\n\n&3XP 획득:\n&e이 스킬에서 XP를 얻으려면 손에 곡괭이를 들고 채굴해야 합니다.\n&e일부 블록들만이 XP를 부여합니다.
+Guides.Mining.Section.1=&3호환되는 블록:\n&e돌, 석탄 광석, 철 광석, 금 광석, 다이아몬드 광석, 레드스톤 광석,\n&e청금석 광석, 옵시디언, 이끼 난간돌, 엔더 돌,\n&e발광석, 네더랙.
+Guides.Mining.Section.2=&3슈퍼 브레이커를 사용하는 방법은?\n&e손에 곡괭이를 들고 마우스 오른쪽 버튼을 클릭하여 도구를\n&e준비합니다. 이 상태에서 광업 호환되는 블록에 접촉하여\n&e슈퍼 브레이커를 활성화합니다.
+Guides.Mining.Section.3=&3슈퍼 브레이커란 무엇인가요?\n&e슈퍼 브레이커는 광업 스킬에 결합된 쿨다운이 있는 능력입니다.\n&e추가 아이템이 드롭되는 확률을 세 배로 증가시키고,\n&e광업 블록에 대해 즉시 파괴할 수 있습니다.
+Guides.Mining.Section.4=&3폭파 광업을 사용하는 방법은?\n&e손에 곡괭이를 들고,\n&e웅크리고 TNT를 거리에서 마우스 오른쪽 버튼으로 클릭합니다.\n&e그러면 TNT가 즉시 폭발합니다.
+Guides.Mining.Section.5=&3폭파 광업이 작동하는 방법은?\n&e폭파 광업은 광업 스킬에 결합된 쿨다운이 있는 능력입니다.\n&eTNT와 함께 채굴할 때 보너스를 제공하고,\n&eTNT를 원격으로 폭파할 수 있습니다. 폭파 광업에는 세 가지 부분이 있습니다.\n&e첫 번째는 Bigger Bombs로, 폭발 반경을 증가시킵니다.\n&e두 번째는 철거 전문가로, TNT 폭발로부터의\n&e피해를 감소시킵니다. 세 번째 부분은 단순히\n&eTNT로부터 드롭되는 광석의 양을 증가시키고\n&e파편을 감소시킵니다.
+##수리하다
+Guides.Repair.Section.0=&3수리에 관하여:\n&e수리를 사용하면 철 블록을 사용하여 갑옷과\n&e도구를 수리할 수 있습니다.\n\n&3XP 획득:\n&emcMMO 모루를 사용하여 도구나 갑옷을 수리하세요.\n&edefault로 철 블록이며, Vanilla Minecraft 모루와\n&e혼동해서는 안 됩니다.
+Guides.Repair.Section.1=&3어떻게 수리를 사용할 수 있나요?\n&emcMMO 모루를 설치하고 현재 들고 있는 아이템을 수리하려면\n&emcMMO 모루를 클릭합니다. 이렇게 하면 사용할 때마다 1개의 아이템이 소모됩니다.
+Guides.Repair.Section.2=&3수리 마스터리가 작동하는 방법은?\n&e수리 마스터리는 수리 양을 증가시킵니다. 추가로 수리된\n&e양은 수리 스킬 레벨에 영향을 받습니다.
+Guides.Repair.Section.3=&3슈퍼 수리가 작동하는 방법은?\n&e슈퍼 수리는 수동 능력입니다. 아이템을 수리할 때\n&ee더 효과적으로 아이템을 수리할 기회를 부여합니다.
+Guides.Repair.Section.4=&3비밀의 단조가 작동하는 방법은?\n&e이 수동 능력을 사용하면 특정 확률로 인챈트된 아이템을 수리하고\n&ee던지지 않을 수 있습니다. 인챈트는 현재 레벨에 따라\n&ee그대로 유지되거나 낮은 수준으로 강등되거나\n&ee완전히 손실될 수 있습니다.
+##산출기능술
+Guides.Salvage.Section.0=&3산출에 관하여:\n&e산출을 사용하면 금 블록을 사용하여 갑옷과\n&e도구를 분해할 수 있습니다.\n\n&3XP 획득:\n&e산출은 수리 및 어업의 하위 스킬이며, 여러분의 산출\n&eskil 레벨은 여러분의 낚시 및 수리 스킬 레벨에 기반합니다.
+Guides.Salvage.Section.1=&3어떻게 산출을 사용할 수 있나요?\n&emcMMO 산출 모루를 설치하고 현재 들고 있는 아이템을\n&emcMMO 산출 모루를 클릭합니다. 이렇게 하면 아이템이 분해되고,\n&e아이템을 제작하는 데 사용된 자원을 돌려받습니다.\n\n&예를 들어, 철 곡괭이를 산출하면 철 막대를 얻게 됩니다.
+Guides.Salvage.Section.2=&3고급 산출이 작동하는 방법은?\n&e이 능력을 잠금 해제하면 손상된 아이템을 분해할 수 있습니다.\n&e생산 비율은 레벨이 올라감에 따라 증가합니다. 높은 생산률은\n&ee더 많은 자원을 얻을 수 있다는 의미입니다.\n&e고급 산출로 인해 항상 1개의 자원을 얻게 되며,\n&e아이템이 너무 손상되어 있는 경우에는 아무것도 얻지 못합니다.\n&e부스러기를 드롭하지 않고.
+Guides.Salvage.Section.3=&3이를 설명하기 위해 예를 들어보겠습니다.\n&ee.g. 우리가 20% 손상된 금 곡괭이를 산출한다면,\n&ee최대 얻을 수 있는 양은 2개입니다.\n&e(곡괭이는 각각 33.33% 내구도로 제작되었으므로 각각 66%를 나타냅니다.)\n&ee당신의 수익률이 66% 미만인 경우 2개의 막대를 얻을 수 없습니다.\n&ee그 이상인 경우 "전체 양"을 얻을 수 있습니다.\n&ee이는 2개의 막대를 얻게됩니다.
+Guides.Salvage.Section.4=&3비밀의 산출이 작동하는 방법은?\n&e이 능력을 사용하면 인챈트된 아이템을 산출하여 인챈트된 책을\n&ee얻을 수 있습니다. 성공적으로 전체 또는 부분적인 인챈트를\n&ee추출할 확률은 여러분의 레벨에 따라 다릅니다.\n\n&ee인챈트가 부분적으로 추출되는 경우 인챈트된\n&ee책은 아이템에 있던 것보다 낮은 레벨의 인챈트를 가지게 됩니다.
+##제련
+Guides.Smelting.Section.0=곧 출시됩니다...
+##검
+Guides.Swords.Section.0=&3검에 관하여:\n&e이 스킬은 검을 사용하는 모든 사람에게 전투 보너스를 부여합니다.\n\n&3XP 획득:\n&e검을 사용하여 몹이나 다른 플레이어에게 입힌 데미지 양에 따라 XP를 획득합니다.
+Guides.Swords.Section.1=&3톱날 타격이 작동하는 방법은?\n&e톱날 타격은 액티브 능력으로, 검을 들고 우클릭하여 활성화할 수 있습니다.\n&ee오브리오트 (효과 범위) 타격을 할 수 있습니다. 이 AO는\n&e보너스 25% 데미지를 가하고 럽처를 적용할 수 있습니다.
+Guides.Swords.Section.2=&3반격이 작동하는 방법은?\n&e반격은 액티브 능력입니다. 몹으로부터 공격을 받을 때 블록하면\n&ee받은 데미지의 50%를 반사할 기회가 생깁니다.
+Guides.Swords.Section.3=&3파열이 작동하는 방법은?\n&e파열은 적이 매 두 초마다 피해를 입게 만듭니다. 효과가 사라지거나\n&ee적이 죽을 때까지 타겟은 출혈합니다.\n&e출혈 지속 시간은 검 스킬에 따라 증가합니다.
+##길들이기
+Guides.Taming.Section.0=&3테이밍에 관하여:\n&e테이밍은 길들인 늑대를 사용할 때 플레이어에게 다양한 전투 보너스를 부여합니다.\n\n&3XP 획득:\n&e이 스킬에서 XP를 얻으려면 늑대/오셀롯을 길들이거나\n&e자신의 늑대와 전투에 들어가야 합니다.
+Guides.Taming.Section.1=&3야생의 부름이 작동하는 방법은?\n&e야생의 부름은 능동적인 능력으로, 뼈나 생선을 들고 있을 때 웅크리고 왼쪽 클릭하여\n&e웅크리기 + 왼쪽 클릭를 하면 늑대나 오셀롯을 소환할 수 있습니다.
+Guides.Taming.Section.2=&3야수 상식이 작동하는 방법은?\n&e야수 상식을 사용하면 애완동물을 조사하고 늑대와 오셀롯의 통계를 확인할 수 있습니다.\n&ee야수 지식를 사용하려면 늑대나 오셀롯을 왼쪽 클릭합니다.
+Guides.Taming.Section.3=&3천식이 작동하는 방법은?\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이 패시브 능력은 데미지를 줄이고 늑대를 화염 내성으로 만듭니다.
+Guides.Taming.Section.7=&3충격 방지가 작동하는 방법은?\n&e이 패시브 능력은 폭발로 인한 늑대에게 가해지는 피해를 줄입니다.
+Guides.Taming.Section.8=&3패스트 푸드 서비스가 작동하는 방법은?\n&e이 패시브 능력은 늑대가 공격할 때마다 회복할 기회를 제공합니다.
+##비무장
+Guides.Unarmed.Section.0=&3무장에 관하여:\n&e무장은 주먹으로 무기를 사용할 때 플레이어에게 다양한 전투 보너스를 부여합니다.\n\n&3XP 획득:\n&e주먹으로 몹이나 다른 플레이어에게 가한 데미지 양에 따라 XP를 획득합니다.
+Guides.Unarmed.Section.1=&3광분이 작동하는 방법은?\n&e광분은 우클릭으로 활성화되는 액티브 능력입니다. 광분 모드에서는 50% 더 많은\n&e피해 를 가하고, 흙과 풀과 같은 약한 재료를 즉시 부술 수 있습니다.
+Guides.Unarmed.Section.2=&3철 팔 스타일이 작동하는 방법은?\n&e철 팔 스타일은 주먹으로 몹이나 플레이어를 때릴 때 가하는 피해를 증가시킵니다.
+Guides.Unarmed.Section.3=&3화살 반사가 작동하는 방법은?\n&e화살 반사는 스켈레톤이나 다른 플레이어가 발사한 화살을 반사할 기회를 주는 패시브 능력입니다.\n&e화살은 위험하게 땅에 떨어집니다.
+Guides.Unarmed.Section.4=&3철제 그립이 작동하는 방법은?\n&e철제 그립은 무장해제을 카운터하는 패시브 능력입니다. 무장 레벨이 올라갈수록 무장해제을\n&e방지하는 기회가 늘어납니다.
+Guides.Unarmed.Section.5=&3무장 해제가 작동하는 방법은?\n&e이 패시브 능력은 다른 플레이어를 무장해제하여 대상의 장비가 땅에 떨어지게 만듭니다.
+##벌목
+Guides.Woodcutting.Section.0=&3나무꾼에 관하여:\n&e나무꾼은 나무를 베는 데에 관한 것입니다.\n\n&3XP 획득:\n&e네모난 블록을 부술 때마다 XP가 획득됩니다.
+Guides.Woodcutting.Section.1=&3트리 펠러가 작동하는 방법은?\n&e트리 펠러는 액티브 능력으로, 도끼를 들고 우클릭하여 트리 펠러를 활성화할 수 있습니다.\n&ee전체 트리를 즉시 부수고 모든 나무를 한 번에 드랍합니다.
+Guides.Woodcutting.Section.2=&3잎 블로어가 작동하는 방법은?\n&e잎 블로어는 도끼로 맞을 때 잎 블록이 즉시 부서지도록 하는 패시브 능력입니다.\n&e기본으로 이 능력은 레벨 100에서 잠금 해제됩니다.
+Guides.Woodcutting.Section.3=&3더블 드롭이 작동하는 방법은?\n&e이 패시브 능력은 베어 나무마다 추가 블록을 얻을 기회를 제공합니다.
+#검사
+Inspect.Offline= &c오프라인 플레이어를 확인할 권한이 없습니다!
+Inspect.OfflineStats=오프라인 플레이어 &e{0}의 mcMMO 통계
+Inspect.Stats=&a{0}의 mcMMO 통계
+Inspect.TooFar=해당 플레이어를 확인하기에 너무 멀리 있습니다!
+#아이템
+Item.ChimaeraWing.Fail=&c**카이메라 날개 실패!**
+Item.ChimaeraWing.Pass=**카이메라 날개**
+Item.ChimaeraWing.Name=카이메라 날개
+Item.ChimaeraWing.Lore=&7침대로 이동합니다.
+Item.ChimaeraWing.NotEnough= &e{1}&c이(가) 더 필요합니다! {0}개
+Item.NotEnough= &e{1}&c이(가) 더 필요합니다! {0}개
+Item.Generic.Wait=다시 사용하기 전에 기다려야 합니다! &e({0}초)
+Item.Injured.Wait=최근에 부상당했으므로 사용을 기다려야 합니다. &e({0}초)
+Item.FluxPickaxe.Name=플럭스 곡괭이
+Item.FluxPickaxe.Lore.1=&7광물을 즉시 제련하는 기회가 있습니다.
+Item.FluxPickaxe.Lore.2=&7제련 레벨 {0} 이상 필요
+#텔레포트
+Teleport.Commencing=&7텔레포트 시작 &6({0}초), &7제자리에 서십시오...
 Teleport.Cancelled=&4텔레포트 취소됨!
-
-#SKILLS
-Skills.Child=&6(부가 스킬)
-Skills.Disarmed=&4당신은 무장 해제되었습니다!
-Skills.Header=-----[]&a{0}&c[]-----
-Skills.NeedMore=&4당신은 &7{0}&4가 더 필요합니다
-Skills.NeedMore.Extra=&4당신은 &7{0}{1}가 더 필요합니다
-Skills.Parents = 상위 속성들
-Skills.MaxXP=최대 XP
+#스킬
+Skills.Child=&6(하위 스킬)
+Skills.Disarmed=&4무장이 해제되었습니다!
+Skills.Header=-----[] &a{0}&c []-----
+Skills.NeedMore=&4{0}를 더 필요합니다
+Skills.NeedMore.Extra=&4{0}{1}를 더 필요합니다
+Skills.Parents= 상위 스킬
 Skills.Stats={0}&a{1}&3 XP(&7{2}&3/&7{3}&3)
 Skills.ChildStats={0}&a{1}
-Skills.TooTired=스킬 재 사용 대기시간: ({0}초)
-Skills.TooTired.Named=&7(&6{0}&e {1}s&7)
-Skills.TooTired.Extra=&6{0}&e의 쿨타임: {1}
-Skills.Cancelled={0} 취소됨!
-Skills.ConfirmOrCancel=&a다시 우-클릭을 하면 확인 &6{0}&a. 좌-클릭을 하면 취소가 됩니다.
-Skills.AbilityGateRequirementFail=&7이 슈퍼 능력을 사용하려면 &e{0}&7만큼의 &3{1}&7 스킬 레벨이 필요합니다.
-
-#STATISTICS
+Skills.MaxXP=최대
+Skills.TooTired=다시 사용하려면 너무 피곤합니다. &e({0}초)
+Skills.TooTired.Named=&7(&6{0}&e 초&7)
+Skills.TooTired.Extra=&6{0} &e슈퍼 능력 대기시간 - {1}
+Skills.Cancelled=&6{0} &c취소되었습니다!
+Skills.ConfirmOrCancel=&a다시 오른쪽 클릭하여 &6{0}&a 확인하십시오. 왼쪽 클릭하여 취소하십시오.
+Skills.AbilityGateRequirementFail=&7이 슈퍼 능력을 사용하려면 &3{1}&7 레벨이 더 필요합니다.
+#통계
 Stats.Header.Combat=&6-=전투 스킬=-
-Stats.Header.Gathering=&6-=수집 스킬=-
+Stats.Header.Gathering=&6-=집 스킬=-
 Stats.Header.Misc=&6-=기타 스킬=-
-Stats.Own.Stats=&a[mcMMO] 스텟
-
-#PERKS
+Stats.Own.Stats=&a[mcMMO] 통계
+#특전
 Perks.XP.Name=경험치
-Perks.XP.Desc=특정 스킬에 경험치 부스트를 받음.
+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.Lucky.Desc={0} 스킬과 능력이 33.3% 더 활성화됩니다.
+Perks.Lucky.Desc.Login=특정 스킬과 능력이 33.3% 더 활성화됩니다.
+Perks.Lucky.Bonus=&6 (행운 특전으로 {0})
 Perks.Cooldowns.Name=빠른 회복
-Perks.Cooldowns.Desc=재사용대기시간을 {0}만큼 줄입니다
-Perks.ActivationTime.Name=인내력
-Perks.ActivationTime.Desc=능력 활성 시간이 {0}초로 증가합니다.
-Perks.ActivationTime.Bonus=&6 ({0}초의 인내력 특전)
-
-#HARDCORE
-Hardcore.Mode.Disabled=&6[mcMMO] 하드코어 모드 {0}가 {1}에 비활성화됨.
-Hardcore.Mode.Enabled=&6[mcMMO] 하드코어 모드 {0}가 {1}에 활성화됨.
-Hardcore.DeathStatLoss.Name=스킬 데스 패널티
-Hardcore.DeathStatLoss.PlayerDeath=&6[mcMMO] &4당신은 죽어서 &9{0}&4 레벨을 잃었습니다.
-Hardcore.DeathStatLoss.PercentageChanged=&6[mcMMO] 스텟 감소 비율이 {0}로 변경되었습니다..
-Hardcore.Vampirism.Name=뱀파이어리즘
-Hardcore.Vampirism.Killer.Failure=&6[mcMMO] &e{0}&7님은 특별한 기술을 가지고 있지 않아 당신이 가져갈 지식이 없습니다.
-Hardcore.Vampirism.Killer.Success=&6[mcMMO] &3당신은 &e{1}&3님으로부터 &9{0}&3 레벨을 훔쳤습니다.
-Hardcore.Vampirism.Victim.Failure=&6[mcMMO] &e{0}&7님은 당신의 지식을 가져갈 수 없었습니다!
-Hardcore.Vampirism.Victim.Success=&6[mcMMO] &e{0}&4님은 당신에게서 &9{1}&4 레벨을 훔쳐갔습니다!
-
+Perks.Cooldowns.Desc=쿨다운 기간을 {0} 만큼 줄입니다.
+Perks.ActivationTime.Name=지속력
+Perks.ActivationTime.Desc=능력 활성화 시간을 {0}초로 증가시킵니다.
+Perks.ActivationTime.Bonus=&6 ({0}초의 지속력 특전)
+#하드코어
+Hardcore.Mode.Disabled=&6[mcMMO] 하드코어 모드 {0}이(가) {1}에 대해 비활성화되었습니다.
+Hardcore.Mode.Enabled=&6[mcMMO] 하드코어 모드 {0}이(가) {1}에 대해 활성화되었습니다.
+Hardcore.DeathStatLoss.Name=스킬 사망 페널티
+Hardcore.DeathStatLoss.PlayerDeath=&6[mcMMO] &4죽음으로 인해 &9{0} 레벨이 손실되었습니다.
+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} &9{0} 레벨을 훔쳤습니다.
+Hardcore.Vampirism.Victim.Failure=&6[mcMMO] &e{0}&7님이 당신으로부터 지식을 훔치는 데 실패했습니다!
+Hardcore.Vampirism.Victim.Success=&6[mcMMO] &e{0}&4님이 당신으로부터 &9{1} 레벨을 훔쳤습니다!
+Hardcore.Vampirism.PercentageChanged=&6[mcMMO] 플레이어로부터 지식을 흡수하는 비율이 {0}로 변경되었습니다.
 #MOTD
 MOTD.Donate=&3기부 정보:
 MOTD.Hardcore.Enabled=&6[mcMMO] &3하드코어 모드 활성화됨: &4{0}
-MOTD.Hardcore.DeathStatLoss.Stats=&6[mcMMO] &3데스 패널티 능력: &4{0}%
-MOTD.Hardcore.Vampirism.Stats=&6[mcMMO] &3뱀파이어리즘 스텟 흡수: &4{0}%
-MOTD.PerksPrefix=[mcMMO 특전]
-MOTD.Version=&6[mcMMO] 구동중인 버전 &3{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.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.UnderstandingTheArt.Name=예술의 이해
-Smelting.SubSkill.UnderstandingTheArt.Description=아마도 동굴에서 너무 많은 시간을 보내고 있을지도 모릅니다.\n제련의 다양한 속성을 강화합니다.
-Smelting.SubSkill.UnderstandingTheArt.Stat=바닐라 XP 배율: &e{0}배
+#제련
+Smelting.SubSkill.UnderstandingTheArt.Name=Understanding The Art
+Smelting.SubSkill.UnderstandingTheArt.Description=아마도 동굴에서 제련하는 데 너무 많은 시간을 소비하고 있습니다.\n제련의 다양한 속성을 강화합니다.
+Smelting.SubSkill.UnderstandingTheArt.Stat=바닐라 경험치 배율: &e{0}배
+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}배
-Smelting.SubSkill.FuelEfficiency.Description=화로에서 재련시 연료 연소 시간 증가
-Smelting.SubSkill.SecondSmelt.Name=두 번째 제련
-Smelting.SubSkill.SecondSmelt.Description=제련시 얻는 자원 2배
-Smelting.SubSkill.SecondSmelt.Stat=두 번째 재련 확률
+Smelting.SubSkill.SecondSmelt.Name=이중 제련
+Smelting.SubSkill.SecondSmelt.Description=제련으로 얻은 자원을 두 배로 늘립니다.
+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.FluxMining.Success=&a광물이 재련되었습니다!
-Smelting.Listener=제련(Smelting):
+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=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=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.mmodebug=블록을 때릴 때 유용한 정보를 출력하는 디버그 모드를 켜기/끄기.
-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=당신은 mcMMO 구버전을 사용중입니다!
-UpdateChecker.newavailable=신 버전이 Spigot에 업로드되어 있습니다.
-
-#SCOREBOARD HEADERS
-Scoreboard.Header.PlayerStats=mcMMO 스텟
-Scoreboard.Header.PlayerCooldowns=mcMMO 재 사용 대기시간
-Scoreboard.Header.PlayerRank=mcMMO 순위
-Scoreboard.Header.PlayerInspect=mcMMO 스텟:
-Scoreboard.Header.PowerLevel=총 레벨
-Scoreboard.Misc.PowerLevel=&6총 레벨
+#명령어 설명
+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 데이터베이스에서 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 이벤트를 시작합니다.
+#업데이트 체크
+UpdateChecker.Outdated=사용 중인 mcMMO 버전이 오래되었습니다!
+UpdateChecker.NewAvailable=Spigot에서 새 버전을 사용할 수 있습니다.
+#스코어보드 헤더
+Scoreboard.Header.PlayerStats=&emcMMO 통계
+Scoreboard.Header.PlayerCooldowns=&emcMMO 쿨다운
+Scoreboard.Header.PlayerRank=&emcMMO 순위
+Scoreboard.Header.PlayerInspect=&emcMMO 통계: {0}
+Scoreboard.Header.PowerLevel=&c파워 레벨
+Scoreboard.Misc.PowerLevel=&6파워 레벨
 Scoreboard.Misc.Level=&3레벨
 Scoreboard.Misc.CurrentXP=&a현재 XP
-Scoreboard.Misc.RemainingXP=남은 XP
-Scoreboard.Misc.Cooldown=&d재 사용 대기시간
-Scoreboard.Misc.Overall=&6종합
+Scoreboard.Misc.RemainingXP=&e남은 XP
+Scoreboard.Misc.Cooldown=&d쿨다운
+Scoreboard.Misc.Overall=&6전체
 Scoreboard.Misc.Ability=능력
-
-#DATABASE RECOVERY
-Profile.PendingLoad=&c당신의 mcMMO 프로파일을 아직 불러오지 못했습니다.
-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당신의 데이터베이스 설치를 검사해주세요.
-Profile.Loading.FailurePlayer=mcMMO가 데이터를 로드하는 데 문제가 발생했습니다. 로드 시도 횟수: {0}회. 이 문제에 대해 서버 관리자에게 문의하십시오. 데이터가 로드되지 않은 동안 XP를 획득하거나 기술을 사용할 수 없습니다.
-Profile.Loading.FailureNotice=&4[A]&c mcMMO는 &e{0}&c 플레이어 데이터를 로드하지 못했습니다. &d데이터베이스 설정을 확인하십시오. 현재까지 시도한 횟수: {1}.
-Commands.XPBar.Usage=올바른 사용법: /mmoxpbar <스킬명 | reset> <show | hide>
-Commands.Description.mmoxpbar=mcMMO XP 바에 대한 플레이어 설정
-Commands.Description.mmocompat=mcMMO의 호환 모드 또는 완전한 기능 여부에 대한 정보
-
+#데이터베이스 복구
+Profile.PendingLoad=&c당신의 mcMMO 플레이어 데이터가 아직로드되지 않았습니다.
+Profile.Loading.Success=&a당신의 mcMMO 프로필이 로드되었습니다.
+Profile.Loading.FailurePlayer=&cmcMMO는 데이터로드에 문제가 있습니다. 우리는 &a{0}번&c 시도했습니다. &c이 문제에 대해 서버 관리자에게 문의하십시오. mcMMO는 데이터가로드되지 않은 동안 XP를 획득하거나 기술을 사용할 수 없습니다.
+Profile.Loading.FailureNotice=&4[A]&c mcMMO가 &e{0}&c의 플레이어 데이터를로드하지 못했습니다. &d데이터베이스 설정을 확인하십시오. 지금까지 시도한 시도 {1}.
 #Holiday
-Holiday.AprilFools.Levelup=&6{0}은(는) 이제 &a{1}&6레벨입니다!
-Holiday.Anniversary=&9{0}주년을 축하합니다!\n&9nossr50의 모든 작업과 개발자들을 기리기 위해 불꽃쇼를 선물합니다!
-
+Holiday.AprilFools.Levelup=&6{0}님이 이제 레벨 &a{1}&6입니다!
+Holiday.Anniversary=&9{0}주년을 축하합니다!\n&9모든 nossr50의 작업과 개발자들을 기념하여 불꽃놀이를 여기에 선사합니다!
 #Reminder Messages
-Reminder.Squelched=&7알림: 현재 mcMMO로부터 알림을 받지 않고 있습니다. 알림을 활성화하려면 다시 /mcnotify 명령을 실행하십시오. 이것은 자동으로 매 시간마다 알림이 전송되는 것입니다.
-
+Reminder.Squelched=&7리마인더: 당신은 현재 mcMMO로부터 알림을받지 않습니다. 알림을 받으려면 다시 /mcnotify 명령을 실행하십시오. 이것은 자동으로 시간당 알림입니다.
 #Locale
-Locale.Reloaded=&a번역을 리로드했습니다!
-
+Locale.Reloaded=&a로케일이 다시로드되었습니다!
 #Player Leveling Stuff
-LevelCap.PowerLevel=&6(&amcMMO&6) &e파워 레벨 &c{0}&e에 도달했습니다. 이제부터 스킬 레벨이 상승하지 않습니다.
-LevelCap.Skill=&6(&amcMMO&6) &e&6{1}&e 스킬의 레벨 캡 &c{0}&e에 도달했습니다. 이제부터 이 스킬의 레벨이 상승하지 않습니다.
-Commands.XPBar.Usage=올바른 사용법: /mmoxpbar <스킬명 | reset> <show | hide>
+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 XP 바에 대한 플레이어 설정
-Commands.Description.mmocompat=mcMMO의 호환 모드 또는 완전한 기능 여부에 대한 정보
-Compatibility.Layer.Unsupported=&6{0}&6의 호환성은 이 버전의 Minecraft에서 지원되지 않습니다.
-Compatibility.Layer.PartialSupport=&6{0}&6의 호환성은 이 버전의 Minecraft에서 완전히 지원되지 않지만, mcMMO는 일부 기능을 에뮬레이션하기 위해 보조 시스템을 실행 중입니다.
-Commands.XPBar.DisableAll=&6모든 mcMMO XP 바가 비활성화되었습니다. 기본 설정으로 복원하려면 /mmoxpbar reset을 사용하세요.
-
+Commands.Description.mmocompat=mcMMO에 대한 정보 및 호환 모드 또는 완전 기능적 모드 여부.
+Compatibility.Layer.Unsupported=&6{0}&6의 호환성은 이 Minecraft 버전에서 지원되지 않습니다.
+Compatibility.Layer.PartialSupport=&6{0}&6의 호환성은 이 Minecraft 버전에서 완전히 지원되지 않지만, mcMMO는 일부 부족한 기능을 모방하기위한 보조 시스템을 실행 중입니다.
+Commands.XPBar.DisableAll=&6모든 mcMMO XP 바가 비활성화되었습니다. 기본 설정으로 복원하려면 /mmoxpbar 재설정을 사용하세요.
 #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* 콘솔 *
-Chat.Channel.On=&6(&amcMMO-Chat&6) &e당신의 채팅 메시지는 이제 &a{0}&e 채팅 채널로 자동 전달됩니다.
-Chat.Channel.Off=&6(&amcMMO-Chat&6) &7당신의 채팅 메시지는 더 이상 특정 채팅 채널로 자동 전달되지 않습니다.
+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\u2192 &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 점수판을 복구하는 중입니다...
-Scoreboard.Disabled=이 서버의 mcMMO 점수판이 비활성화되었습니다. 이 설정은 mcMMO/config.yml에서 찾을 수 있습니다.
-Scoreboard.NotSetupYet=당신의 mcMMO 점수판이 아직 설정되지 않았습니다. 나중에 다시 시도해보세요.
+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 스코어보드를 복구하는 중입니다...
+Scoreboard.Disabled=이 서버의 mcMMO 스코어보드가 비활성화되었습니다. 이 설정은 mcMMO/config.yml에서 찾을 수 있습니다.
+Scoreboard.NotSetupYet=당신의 mcMMO 스코어보드가 아직 설정되지 않았습니다. 나중에 다시 시도하십시오.

+ 4 - 0
src/main/resources/party.yml

@@ -0,0 +1,4 @@
+# Settings for mcMMO Party System
+Party:
+    # Enable or disable the mcMMO party system
+    Enabled: true

+ 98 - 0
src/test/java/com/gmail/nossr50/party/PartyManagerTest.java

@@ -0,0 +1,98 @@
+package com.gmail.nossr50.party;
+
+import com.gmail.nossr50.datatypes.player.McMMOPlayer;
+import com.gmail.nossr50.locale.LocaleLoader;
+import com.gmail.nossr50.mcMMO;
+import org.bukkit.Server;
+import org.bukkit.entity.Player;
+import org.bukkit.plugin.PluginManager;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+
+import java.util.UUID;
+
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.*;
+
+class PartyManagerTest {
+
+    static mcMMO mockMcMMO;
+
+    @BeforeAll
+    public static void setup() {
+        // create a static stub for LocaleLoader.class
+        mockStatic(LocaleLoader.class);
+        when(LocaleLoader.getString(anyString())).thenReturn("");
+
+        mockMcMMO = mock(mcMMO.class);
+        final Server mockServer = mock(Server.class);
+        when(mockMcMMO.getServer()).thenReturn(mockServer);
+        when(mockServer.getPluginManager()).thenReturn(mock(PluginManager.class));
+
+        // TODO: Add cleanup for static mock
+    }
+
+    @Test
+    public void createPartyWithoutPasswordShouldSucceed() {
+        // Given
+        PartyManager partyManager = new PartyManager(mockMcMMO);
+        String partyName = "TestParty";
+
+        // TODO: Update this with utils from the other dev branches in the future
+        Player player = mock(Player.class);
+        McMMOPlayer mmoPlayer = mock(McMMOPlayer.class);
+        when(mmoPlayer.getPlayer()).thenReturn(player);
+        when(player.getUniqueId()).thenReturn(new UUID(0, 0));
+
+        // When & Then
+        partyManager.createParty(mmoPlayer, partyName, null);
+    }
+
+    @Test
+    public void createPartyWithPasswordShouldSucceed() {
+        // Given
+        PartyManager partyManager = new PartyManager(mockMcMMO);
+        String partyName = "TestParty";
+        String partyPassword = "somePassword";
+
+        // TODO: Update this with utils from the other dev branches in the future
+        Player player = mock(Player.class);
+        McMMOPlayer mmoPlayer = mock(McMMOPlayer.class);
+        when(mmoPlayer.getPlayer()).thenReturn(player);
+        when(player.getUniqueId()).thenReturn(new UUID(0, 0));
+
+        // When & Then
+        partyManager.createParty(mmoPlayer, partyName, partyPassword);
+    }
+
+    @Test
+    public void createPartyWithoutNameShouldFail() {
+        // Given
+        PartyManager partyManager = new PartyManager(mockMcMMO);
+        String partyPassword = "somePassword";
+
+        // TODO: Update this with utils from the other dev branches in the future
+        Player player = mock(Player.class);
+        McMMOPlayer mmoPlayer = mock(McMMOPlayer.class);
+        when(mmoPlayer.getPlayer()).thenReturn(player);
+        when(player.getUniqueId()).thenReturn(new UUID(0, 0));
+
+        // When & Then
+        assertThrows(NullPointerException.class,
+                () -> partyManager.createParty(mmoPlayer, null, partyPassword));
+    }
+
+    @Test
+    public void createPartyWithoutPlayerShouldFail() {
+        // Given
+        PartyManager partyManager = new PartyManager(mockMcMMO);
+        String partyName = "TestParty";
+        String partyPassword = "somePassword";
+
+        // When & Then
+        assertThrows(NullPointerException.class,
+                () -> partyManager.createParty(null, partyName, partyPassword));
+    }
+
+}