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

Compare commits

..

85 Commits

Author SHA1 Message Date
GJ
2c87ce06eb Weekly beta releases are back! 2013-04-11 23:54:10 -04:00
GJ
875091a1ce Added ability to configure drops from Shake in treasures.yml 2013-04-11 21:40:09 -04:00
GJ
5ad7716137 Don't need to store that. 2013-04-11 10:24:22 -04:00
GJ
8c97399cec This is important. 2013-04-11 10:02:08 -04:00
GJ
27e0a9d3b6 Fixed experience commands affecting all skills. Fixes #951 2013-04-11 09:55:39 -04:00
GJ
07f9b287e7 Move exceptions to their own package.
This will break plugins that directly catch these exceptions.
2013-04-10 20:21:55 -04:00
GJ
fbee4f1b37 Remove debug messages. 2013-04-10 19:41:55 -04:00
GJ
26542f3d6e Because otherwise you can't fish at low levels. 2013-04-10 19:32:26 -04:00
GJ
14630fe956 Nerfin' it. 2013-04-10 18:44:11 -04:00
GJ
30f5c761d9 Because some plugins do stupid things. 2013-04-10 17:04:32 -04:00
GJ
365abaaa8f Reverse the order to avoid NPE 2013-04-10 14:04:46 -04:00
GJ
f4681a282c Better handling of picking up items with unarmed. 2013-04-10 13:20:44 -04:00
TfT_02
8a14d9ac26 Update the changelog 2013-04-10 17:19:34 +02:00
TfT_02
0ab1986202 Set a seperate cooldowns between getting hurt and teleportations
Closes #880
2013-04-10 17:19:14 +02:00
TfT_02
e11dc680de Add configurable warmup and cooldown timers for party teleportation
Closes #348
2013-04-10 17:18:06 +02:00
TfT_02
71249334c3 Change the ChimaeraWing timestamp into a general teleportation timestamp 2013-04-10 17:15:48 +02:00
NuclearW
fa41dbce16 Regex used mean look, could not escape! 2013-04-10 00:00:57 -04:00
GJ
4246e6c900 Use char codes instead of symbols, just to be safe. 2013-04-09 23:41:02 -04:00
GJ
1b421a24b0 Remove the drop. 2013-04-09 21:44:27 -04:00
GJ
9cc9eead52 Unbreak the API 2013-04-09 21:09:47 -04:00
GJ
8b21aea9c7 Check Fisherman's Diet permission when checking for display headers. 2013-04-09 20:53:55 -04:00
GJ
4f87cb6446 Added "Master Angler" ability to Fishing.
This ability increases the chance that a fish will bite the line while
fishing.
2013-04-09 20:53:54 -04:00
GJ
7525de1a72 ExperienceAPI methods will now throw InvalidSkillException if the skill
name passed in is invalid
2013-04-09 20:52:58 -04:00
GJ
78d2fa7520 Only care if it was unarmed. 2013-04-09 16:52:41 -04:00
GJ
7fe8122499 Avoid picking up items to the hotbar while using unarmed. Fixes #939 2013-04-09 16:52:38 -04:00
GJ
532c2e7450 Remove unused import 2013-04-09 16:52:35 -04:00
GJ
b391a53c6b Make our commands support tab-complete. 2013-04-08 17:34:23 -04:00
GJ
f3c6346b95 Clear mob health display if it gets stuck. Fixes #933 2013-04-08 00:34:54 -04:00
GJ
dd8984314f Validate here instead. 2013-04-08 00:26:12 -04:00
GJ
b82c3f41d3 Remove metadata, validation checks. 2013-04-08 00:24:38 -04:00
GJ
7d6eb65776 No need to reset. 2013-04-08 00:11:09 -04:00
GJ
dc0800e7e1 Even better regex. 2013-04-08 00:07:07 -04:00
GJ
c151366952 Better regex for this. 2013-04-07 23:58:53 -04:00
GJ
212137ec3e Fix issues with mob healthbars being used in death messages. Fixes #934 2013-04-07 23:22:59 -04:00
GJ
31f36935d3 Avoid NPE when using experience commands on offline players. 2013-04-07 09:01:31 -04:00
TfT_02
a14fc3e3c9 Fixed broken /party chat command
Closes #931
2013-04-06 12:20:20 +02:00
GJ
158b3c43f8 Fixed wolves from Call of the Wild only having 8 health. 2013-04-05 16:17:59 -04:00
GJ
e31c1e33d9 Don't handle removing the name if the entity is dead. 2013-04-05 16:15:24 -04:00
GJ
25dfa6d34d Better way to get the HUD type. 2013-04-04 23:15:37 -04:00
GJ
431429a29c Broken config files are bad. 2013-04-04 23:03:54 -04:00
GJ
d4c8cc28a1 Use new hasConflictingEnchant method. 2013-04-04 22:26:48 -04:00
GJ
ce08405c00 Use new NetherWartState values. 2013-04-04 22:24:02 -04:00
GJ
da29185b7d Added health display for mobs during combat.
During combat, players will now see a healthbar appear over the head of
hostile mobs when they are damaged. This healthbar will have two display
options - HEARTS and BAR - which can be changed via the /mobhealth
command.

New Permissions:
mcmmo.mobhealthdisplay - Allows viewing of mob health display
mcmmo.commands.mobhealth - Allows access to the /mobhealth command

New Config Options (config.yml):
Mob_Healthbar.Display_Type - the default health display type
Mob_Healthbar.Display_Time - the amount of time to show health display
2013-04-04 22:11:11 -04:00
TfT_02
87feb8c250 Added new API method to McMMOPlayerLevelUpEvent to set levels gained
Closes #352
2013-04-04 23:00:21 +02:00
TfT_02
12797893df Update the changelog 2013-04-04 22:50:32 +02:00
TfT_02
6d47e43ba9 Display partial names when trying to use the ptp command 2013-04-04 22:50:22 +02:00
TfT_02
f6b1643378 Minor formatting, added a missing white space 2013-04-04 22:21:13 +02:00
TfT_02
f1c16df63b Added new permission node for party teleportation.
`mcmmo.commands.ptp.send`
This permission node will be check before sending a teleport request
(or teleporting the sender if no request is required), this allows
admins to grant certain groups of users permissions to accept incoming
party teleport request without being able to send ptp requests
themselves.

Closes #927
2013-04-04 22:20:19 +02:00
TfT_02
c16e5231f4 Changed Chimaera Wing's recipe result to use the ingredient Material 2013-04-04 21:35:09 +02:00
GJ
2365c253dd Back to active development. 2013-04-04 10:23:06 -04:00
GJ
c4e7f2597e 1.4.05 bugfix release. 2013-04-04 10:22:09 -04:00
GJ
13fd522bd4 Updated localization files. Adds Thai (Thailand) and Lithuanian support. 2013-04-04 10:17:55 -04:00
GJ
b74f6e92dc Fixed party & admin chat errors when not aysnc 2013-04-04 10:14:52 -04:00
GJ
630c3e81e6 Fixed Chimera Wing displaying warmup message if warmup was set to 0 2013-04-04 09:59:10 -04:00
GJ
0f77cf8066 Fixed Chimera Wing spamming console if Metrics was disabled 2013-04-04 09:48:48 -04:00
GJ
52746fca76 Speed up our BlockBreakEvent checks a bit. 2013-04-04 09:29:07 -04:00
GJ
dae25c2f2d Don't check if we don't watch. 2013-04-04 08:10:24 -04:00
GJ
a272316301 Don't even bother running these checks if we don't watch the block. 2013-04-04 08:05:48 -04:00
GJ
6772f4f169 Track these IF they're somehow full-grown when placed. 2013-04-04 08:02:45 -04:00
GJ
9463e210b8 Compact our checks. 2013-04-04 07:42:33 -04:00
GJ
4c44b72f78 50 != 100 2013-04-04 07:06:07 -04:00
GJ
c849f751bb Fixed potion buff option not using the appropriate # of ticks 2013-04-03 11:41:43 -04:00
GJ
1cde45599e Fixed huge mushroom blocks not being properly tracked 2013-04-03 11:16:24 -04:00
GJ
f1a22f5f6b Shouldn't track this either, just to be safe. 2013-04-02 21:30:18 -04:00
GJ
90d6fbde48 Fix ClassCastException with Taming. Fixes #924 2013-04-02 21:24:02 -04:00
GJ
802ad84613 Fixed Berserk getting "stuck" when /mcrefresh is used. 2013-04-02 17:38:33 -04:00
GJ
c4aa9396fd Update changelog. 2013-04-02 13:48:05 -04:00
GJ
f0c937ad47 Fixed parties and /reload not playing nice together. 2013-04-02 13:47:52 -04:00
GJ
fcc36ee5d7 Trying to fix reload more. 2013-04-02 11:17:40 -04:00
GJ
0f023f627c Metadata > Hashmap 2013-04-02 08:41:51 -04:00
GJ
fa645b5e00 Clear after saving, save before clearing. 2013-04-02 08:29:38 -04:00
GJ
1fb28eeee0 Because reload is evil. 2013-04-02 08:20:55 -04:00
TfT_02
d7f67d43b3 I quite liked the fireworks display! 2013-04-02 13:08:07 +02:00
TfT_02
5a1ec745ce Update the changelog 2013-04-01 22:55:19 +02:00
TfT_02
6fd599bd31 Fixed bug where /addxp was not processessing level-ups for online players
Fixes #918
2013-04-01 22:54:36 +02:00
GJ
afd706bed8 Fix NPE with smelting & /mctop. Fixes #917 2013-04-01 16:41:58 -04:00
TfT_02
6c3820c747 Because some people really wanted to disable this,
mostly due to clientside lag.
2013-04-01 16:38:22 +02:00
TfT_02
0ebc555136 Fixed bug with ChimaeraWings not taking Wings from a players inventory properly
Fixes #914
2013-04-01 11:32:28 +02:00
TfT_02
4992c50098 Sharing with the dead is bad, they have nothing to gain. 2013-04-01 00:22:24 +02:00
NuclearW
4e9322485a Flush write buffer for saving PlayerProfile before closing it. 2013-03-31 17:12:45 -04:00
TfT_02
fc8ad40b00 Fixed bug where /addxp was setting instead of adding experience
Fixes #898
2013-03-30 10:50:05 +01:00
TfT_02
f62e053a84 Update the changelog 2013-03-30 10:42:50 +01:00
T00thpick1
0af3c7ab7d Just in case. 2013-03-29 22:35:55 -04:00
NuclearW
7f4efe1775 Added option to allow refreshing of chunks after block-breaking abilities.
This, if enabled, should fix the problem of clients believing they have broken more blocks than they really have when the enchanced enchantment is removed.
If testing proves it to be useful, could be enabled by default.  This currently send a 3x3 set of chunks centered around the player, so some servers may wish to disable it in that case.
2013-03-29 18:29:31 -04:00
GJ
80a5c2f9c4 Back to active development 2013-03-28 12:49:57 -04:00
82 changed files with 3167 additions and 593 deletions

View File

@@ -6,6 +6,41 @@ Key:
= Fix
! Change
- Removal
Version 1.4.06-dev
+ Added ability to configure drops from Shake in treasures.yml
+ Added "Master Angler" ability to Fishing.
+ Added health display for mobs during combat.
+ Added new API method to McMMOPlayerLevelUpEvent to set levels gained
+ Added new permission node for /ptp; mcmmo.commands.ptp.send (enabled by default)
+ Added configurable cooldown and warmup times when using /ptp
= Fixed displaying partial names when trying to use /ptp
= Fixed wolves from Call of the Wild only having 8 health
= Fixed bug where /party chat was not working
= Fixed bug where experience commands were adding levels to all skills when they shouldn't
! Changed Chimaera Wing's recipe result to use the ingredient Material
! Players will no longer pickup items to their hotbar while using Unarmed
! ExperienceAPI methods will now throw InvalidSkillException if the skill name passed in is invalid.
! Changed default value for recently-hurt cooldown between teleports, this is also fully configurable now
Version 1.4.05
+ Added option to allow refreshing of chunks after block-breaking abilities. (Disabled by default)
+ Added fireworks effects when a player levels-up, for every 100 levels (configurable)
= Fixed bug where /addxp was setting instead of adding experience
= Fixed bug where /addxp was not processessing level-ups for online players
= Fixed bug which allowed players to share experience with nearby dead players
= Fixed bug with ChimaeraWings not taking Wings from a players inventory properly
= Fixed bug which caused a NPE when trying to use /mctop smelting
= Fixed Berserk misbehaving when /reload was used
= Fixed parties misbehaving when /reload was used
= Fixed Berserk getting "stuck" when /mcrefresh was used
= Fixed ClassCastException with Taming
= Fixed huge mushroom blocks not being properly tracked
= Fixed potion buff option not using the appropriate # of ticks
= Fixed Chimera Wing spamming console if Metrics was disabled
= Fixed Chimera Wing displaying warmup message if warmup was set to 0
= Fixed party & admin chat errors when not aysnc
! Updated localization files
Version 1.4.04
+ Added functions to ExperienceAPI for use with offline players

View File

@@ -2,7 +2,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>com.gmail.nossr50.mcMMO</groupId>
<artifactId>mcMMO</artifactId>
<version>1.4.04</version>
<version>1.4.06-beta1</version>
<name>mcMMO</name>
<url>https://github.com/mcMMO-Dev/mcMMO</url>
<issueManagement>
@@ -177,4 +177,8 @@
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<ciManagement>
<system>Jenkins</system>
<url>ci.mcmmo.org</url>
</ciManagement>
</project>

View File

@@ -4,6 +4,8 @@ import java.util.Set;
import org.bukkit.entity.Player;
import com.gmail.nossr50.api.exceptions.InvalidPlayerException;
import com.gmail.nossr50.api.exceptions.InvalidSkillException;
import com.gmail.nossr50.config.Config;
import com.gmail.nossr50.datatypes.player.PlayerProfile;
import com.gmail.nossr50.datatypes.skills.SkillType;
@@ -21,9 +23,17 @@ public final class ExperienceAPI {
* @param player The player to add XP to
* @param skillType The skill to add XP to
* @param XP The amount of XP to add
*
* @throws InvalidSkillException if the given skill is not valid
*/
public static void addRawXP(Player player, String skillType, int XP) {
UserManager.getPlayer(player).applyXpGain(SkillType.getSkill(skillType), XP);
SkillType skill = SkillType.getSkill(skillType);
if (skill == null) {
throw new InvalidSkillException();
}
UserManager.getPlayer(player).applyXpGain(skill, XP);
}
/**
@@ -35,10 +45,17 @@ public final class ExperienceAPI {
* @param skillType The skill to add XP to
* @param XP The amount of XP to add
*
* @throws InvalidSkillException if the given skill is not valid
* @throws InvalidPlayerException if the given player does not exist in the database
*/
public static void addRawXPOffline(String playerName, String skillType, int XP) {
addOfflineXP(playerName, skillType, XP);
SkillType skill = SkillType.getSkill(skillType);
if (skill == null) {
throw new InvalidSkillException();
}
addOfflineXP(playerName, skill, XP);
}
/**
@@ -49,9 +66,17 @@ public final class ExperienceAPI {
* @param player The player to add XP to
* @param skillType The skill to add XP to
* @param XP The amount of XP to add
*
* @throws InvalidSkillException if the given skill is not valid
*/
public static void addMultipliedXP(Player player, String skillType, int XP) {
UserManager.getPlayer(player).applyXpGain(SkillType.getSkill(skillType), (int) (XP * Config.getInstance().getExperienceGainsGlobalMultiplier()));
SkillType skill = SkillType.getSkill(skillType);
if (skill == null) {
throw new InvalidSkillException();
}
UserManager.getPlayer(player).applyXpGain(skill, (int) (XP * Config.getInstance().getExperienceGainsGlobalMultiplier()));
}
/**
@@ -63,10 +88,17 @@ public final class ExperienceAPI {
* @param skillType The skill to add XP to
* @param XP The amount of XP to add
*
* @throws InvalidSkillException if the given skill is not valid
* @throws InvalidPlayerException if the given player does not exist in the database
*/
public static void addMultipliedXPOffline(String playerName, String skillType, int XP) {
addOfflineXP(playerName, skillType, (int) (XP * Config.getInstance().getExperienceGainsGlobalMultiplier()));
SkillType skill = SkillType.getSkill(skillType);
if (skill == null) {
throw new InvalidSkillException();
}
addOfflineXP(playerName, skill, (int) (XP * Config.getInstance().getExperienceGainsGlobalMultiplier()));
}
/**
@@ -77,10 +109,16 @@ public final class ExperienceAPI {
* @param player The player to add XP to
* @param skillType The skill to add XP to
* @param XP The amount of XP to add
*
* @throws InvalidSkillException if the given skill is not valid
*/
public static void addModifiedXP(Player player, String skillType, int XP) {
SkillType skill = SkillType.getSkill(skillType);
if (skill == null) {
throw new InvalidSkillException();
}
UserManager.getPlayer(player).applyXpGain(skill, (int) (XP / skill.getXpModifier() * Config.getInstance().getExperienceGainsGlobalMultiplier()));
}
@@ -93,10 +131,17 @@ public final class ExperienceAPI {
* @param skillType The skill to add XP to
* @param XP The amount of XP to add
*
* @throws InvalidSkillException if the given skill is not valid
* @throws InvalidPlayerException if the given player does not exist in the database
*/
public static void addModifiedXPOffline(String playerName, String skillType, int XP) {
addOfflineXP(playerName, skillType, (int) (XP / SkillType.getSkill(skillType).getXpModifier() * Config.getInstance().getExperienceGainsGlobalMultiplier()));
SkillType skill = SkillType.getSkill(skillType);
if (skill == null) {
throw new InvalidSkillException();
}
addOfflineXP(playerName, skill, (int) (XP / skill.getXpModifier() * Config.getInstance().getExperienceGainsGlobalMultiplier()));
}
/**
@@ -107,9 +152,17 @@ public final class ExperienceAPI {
* @param player The player to add XP to
* @param skillType The skill to add XP to
* @param XP The amount of XP to add
*
* @throws InvalidSkillException if the given skill is not valid
*/
public static void addXP(Player player, String skillType, int XP) {
UserManager.getPlayer(player).beginXpGain(SkillType.getSkill(skillType), XP);
SkillType skill = SkillType.getSkill(skillType);
if (skill == null) {
throw new InvalidSkillException();
}
UserManager.getPlayer(player).beginXpGain(skill, XP);
}
/**
@@ -120,9 +173,17 @@ public final class ExperienceAPI {
* @param player The player to get XP for
* @param skillType The skill to get XP for
* @return the amount of XP in a given skill
*
* @throws InvalidSkillException if the given skill is not valid
*/
public static int getXP(Player player, String skillType) {
return UserManager.getPlayer(player).getProfile().getSkillXpLevel(SkillType.getSkill(skillType));
SkillType skill = SkillType.getSkill(skillType);
if (skill == null) {
throw new InvalidSkillException();
}
return UserManager.getPlayer(player).getProfile().getSkillXpLevel(skill);
}
/**
@@ -133,10 +194,18 @@ public final class ExperienceAPI {
* @param playerName The player to get XP for
* @param skillType The skill to get XP for
* @return the amount of XP in a given skill
*
* @throws InvalidSkillException if the given skill is not valid
* @throws InvalidPlayerException if the given player does not exist in the database
*/
public static int getOfflineXP(String playerName, String skillType) {
return getOfflineProfile(playerName).getSkillXpLevel(SkillType.getSkill(skillType));
SkillType skill = SkillType.getSkill(skillType);
if (skill == null) {
throw new InvalidSkillException();
}
return getOfflineProfile(playerName).getSkillXpLevel(skill);
}
/**
@@ -147,9 +216,17 @@ public final class ExperienceAPI {
* @param player The player to get the XP amount for
* @param skillType The skill to get the XP amount for
* @return the amount of XP left before leveling up a specifc skill
*
* @throws InvalidSkillException if the given skill is not valid
*/
public static int getXPToNextLevel(Player player, String skillType) {
return UserManager.getPlayer(player).getProfile().getXpToLevel(SkillType.getSkill(skillType));
SkillType skill = SkillType.getSkill(skillType);
if (skill == null) {
throw new InvalidSkillException();
}
return UserManager.getPlayer(player).getProfile().getXpToLevel(skill);
}
/**
@@ -160,10 +237,18 @@ public final class ExperienceAPI {
* @param playerName The player to get XP for
* @param skillType The skill to get XP for
* @return the amount of XP in a given skill
*
* @throws InvalidSkillException if the given skill is not valid
* @throws InvalidPlayerException if the given player does not exist in the database
*/
public static int getOfflineXPToNextLevel(String playerName, String skillType) {
return getOfflineProfile(playerName).getXpToLevel(SkillType.getSkill(skillType));
SkillType skill = SkillType.getSkill(skillType);
if (skill == null) {
throw new InvalidSkillException();
}
return getOfflineProfile(playerName).getXpToLevel(skill);
}
/**
@@ -174,9 +259,17 @@ public final class ExperienceAPI {
* @param player The player to add levels to
* @param skillType Type of skill to add levels to
* @param levels Number of levels to add
*
* @throws InvalidSkillException if the given skill is not valid
*/
public static void addLevel(Player player, String skillType, int levels) {
UserManager.getPlayer(player).getProfile().addLevels(SkillType.getSkill(skillType), levels);
SkillType skill = SkillType.getSkill(skillType);
if (skill == null) {
throw new InvalidSkillException();
}
UserManager.getPlayer(player).getProfile().addLevels(skill, levels);
}
/**
@@ -188,13 +281,17 @@ public final class ExperienceAPI {
* @param skillType Type of skill to add levels to
* @param levels Number of levels to add
*
* @throws InvalidSkillException if the given skill is not valid
* @throws InvalidPlayerException if the given player does not exist in the database
*/
public static void addLevelOffline(String playerName, String skillType, int levels) {
PlayerProfile profile = getOfflineProfile(playerName);
SkillType skill = SkillType.getSkill(skillType);
if (skill == null) {
throw new InvalidSkillException();
}
if (skill.isChildSkill()) {
Set<SkillType> parentSkills = FamilyTree.getParents(skill);
@@ -218,9 +315,17 @@ public final class ExperienceAPI {
* @param player The player to get the level for
* @param skillType The skill to get the level for
* @return the level of a given skill
*
* @throws InvalidSkillException if the given skill is not valid
*/
public static int getLevel(Player player, String skillType) {
return UserManager.getPlayer(player).getProfile().getSkillLevel(SkillType.getSkill(skillType));
SkillType skill = SkillType.getSkill(skillType);
if (skill == null) {
throw new InvalidSkillException();
}
return UserManager.getPlayer(player).getProfile().getSkillLevel(skill);
}
/**
@@ -231,10 +336,18 @@ public final class ExperienceAPI {
* @param playerName The player to get the level for
* @param skillType The skill to get the level for
* @return the level of a given skill
*
* @throws InvalidSkillException if the given skill is not valid
* @throws InvalidPlayerException if the given player does not exist in the database
*/
public static int getLevelOffline(String playerName, String skillType) {
return getOfflineProfile(playerName).getSkillLevel(SkillType.getSkill(skillType));
SkillType skill = SkillType.getSkill(skillType);
if (skill == null) {
throw new InvalidSkillException();
}
return getOfflineProfile(playerName).getSkillLevel(skill);
}
/**
@@ -256,6 +369,7 @@ public final class ExperienceAPI {
*
* @param playerName The player to get the power level for
* @return the power level of the player
*
* @throws InvalidPlayerException if the given player does not exist in the database
*/
public static int getPowerLevelOffline(String playerName) {
@@ -280,9 +394,17 @@ public final class ExperienceAPI {
*
* @param skillType The skill to get the level cap for
* @return the level cap of a given skill
*
* @throws InvalidSkillException if the given skill is not valid
*/
public static int getLevelCap(String skillType) {
return Config.getInstance().getLevelCap(SkillType.getSkill(skillType));
SkillType skill = SkillType.getSkill(skillType);
if (skill == null) {
throw new InvalidSkillException();
}
return Config.getInstance().getLevelCap(skill);
}
/**
@@ -290,7 +412,7 @@ public final class ExperienceAPI {
* </br>
* This function is designed for API usage.
*
* @return the power level cap of a given skill
* @return the overall power level cap
*/
public static int getPowerLevelCap() {
return Config.getInstance().getPowerLevelCap();
@@ -304,9 +426,17 @@ public final class ExperienceAPI {
* @param player The player to set the level of
* @param skillType The skill to set the level for
* @param skillLevel The value to set the level to
*
* @throws InvalidSkillException if the given skill is not valid
*/
public static void setLevel(Player player, String skillType, int skillLevel) {
UserManager.getPlayer(player).getProfile().modifySkill(SkillType.getSkill(skillType), skillLevel);
SkillType skill = SkillType.getSkill(skillType);
if (skill == null) {
throw new InvalidSkillException();
}
UserManager.getPlayer(player).getProfile().modifySkill(skill, skillLevel);
}
/**
@@ -318,10 +448,17 @@ public final class ExperienceAPI {
* @param skillType The skill to set the level for
* @param skillLevel The value to set the level to
*
* @throws InvalidSkillException if the given skill is not valid
* @throws InvalidPlayerException if the given player does not exist in the database
*/
public static void setLevelOffline(String playerName, String skillType, int skillLevel) {
getOfflineProfile(playerName).modifySkill(SkillType.getSkill(skillType), skillLevel);
SkillType skill = SkillType.getSkill(skillType);
if (skill == null) {
throw new InvalidSkillException();
}
getOfflineProfile(playerName).modifySkill(skill, skillLevel);
}
/**
@@ -332,9 +469,17 @@ public final class ExperienceAPI {
* @param player The player to set the XP of
* @param skillType The skill to set the XP for
* @param newValue The value to set the XP to
*
* @throws InvalidSkillException if the given skill is not valid
*/
public static void setXP(Player player, String skillType, int newValue) {
UserManager.getPlayer(player).getProfile().setSkillXpLevel(SkillType.getSkill(skillType), newValue);
SkillType skill = SkillType.getSkill(skillType);
if (skill == null) {
throw new InvalidSkillException();
}
UserManager.getPlayer(player).getProfile().setSkillXpLevel(skill, newValue);
}
/**
@@ -346,10 +491,17 @@ public final class ExperienceAPI {
* @param skillType The skill to set the XP for
* @param newValue The value to set the XP to
*
* @throws InvalidSkillException if the given skill is not valid
* @throws InvalidPlayerException if the given player does not exist in the database
*/
public static void setXPOffline(String playerName, String skillType, int newValue) {
getOfflineProfile(playerName).setSkillXpLevel(SkillType.getSkill(skillType), newValue);
SkillType skill = SkillType.getSkill(skillType);
if (skill == null) {
throw new InvalidSkillException();
}
getOfflineProfile(playerName).setSkillXpLevel(skill, newValue);
}
/**
@@ -360,9 +512,17 @@ public final class ExperienceAPI {
* @param player The player to change the XP of
* @param skillType The skill to change the XP for
* @param xp The amount of XP to remove
*
* @throws InvalidSkillException if the given skill is not valid
*/
public static void removeXP(Player player, String skillType, int xp) {
UserManager.getPlayer(player).getProfile().removeXp(SkillType.getSkill(skillType), xp);
SkillType skill = SkillType.getSkill(skillType);
if (skill == null) {
throw new InvalidSkillException();
}
UserManager.getPlayer(player).getProfile().removeXp(skill, xp);
}
/**
@@ -374,10 +534,17 @@ public final class ExperienceAPI {
* @param skillType The skill to change the XP for
* @param xp The amount of XP to remove
*
* @throws InvalidSkillException if the given skill is not valid
* @throws InvalidPlayerException if the given player does not exist in the database
*/
public static void removeXPOffline(String playerName, String skillType, int xp) {
getOfflineProfile(playerName).removeXp(SkillType.getSkill(skillType), xp);
SkillType skill = SkillType.getSkill(skillType);
if (skill == null) {
throw new InvalidSkillException();
}
getOfflineProfile(playerName).removeXp(skill, xp);
}
/**
@@ -387,11 +554,9 @@ public final class ExperienceAPI {
* @param skillType The skill to check
* @param XP The amount of XP to award.
*/
private static void addOfflineXP(String playerName, String skillType, int XP) {
private static void addOfflineXP(String playerName, SkillType skill, int XP) {
PlayerProfile profile = getOfflineProfile(playerName);
SkillType skill = SkillType.getSkill(skillType);
if (skill.isChildSkill()) {
Set<SkillType> parentSkills = FamilyTree.getParents(skill);

View File

@@ -1,4 +1,4 @@
package com.gmail.nossr50.api;
package com.gmail.nossr50.api.exceptions;
public class InvalidPlayerException extends RuntimeException {
private static final long serialVersionUID = 907213002618581385L;

View File

@@ -0,0 +1,9 @@
package com.gmail.nossr50.api.exceptions;
public class InvalidSkillException extends RuntimeException {
private static final long serialVersionUID = 942705284195791157L;
public InvalidSkillException() {
super("That is not a valid skill.");
}
}

View File

@@ -1,74 +1,29 @@
package com.gmail.nossr50.commands;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.locale.LocaleLoader;
import com.gmail.nossr50.util.Permissions;
import com.gmail.nossr50.util.commands.CommandUtils;
import com.gmail.nossr50.util.player.UserManager;
public class McabilityCommand implements CommandExecutor {
private McMMOPlayer mcMMOPlayer;
private Player player;
public class McabilityCommand extends ToggleCommand {
@Override
protected boolean hasOtherPermission(CommandSender sender) {
return Permissions.mcabilityOthers(sender);
}
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
switch (args.length) {
case 0:
if (CommandUtils.noConsoleUsage(sender)) {
return true;
}
if (!Permissions.mcability(sender)) {
sender.sendMessage(command.getPermissionMessage());
return true;
}
mcMMOPlayer = UserManager.getPlayer(sender.getName());
player = mcMMOPlayer.getPlayer();
toggleAbilityUse();
return true;
case 1:
if (!Permissions.mcabilityOthers(sender)) {
sender.sendMessage(command.getPermissionMessage());
return true;
}
mcMMOPlayer = UserManager.getPlayer(args[0]);
if (!CommandUtils.checkPlayerExistence(sender, args[0], mcMMOPlayer)) {
return true;
}
player = mcMMOPlayer.getPlayer();
if (CommandUtils.isOffline(sender, player)) {
return true;
}
toggleAbilityUse();
sender.sendMessage("Ability use has been toggled for " + player.getName()); // TODO: Localize
return true;
default:
return false;
}
protected boolean hasSelfPermission(CommandSender sender) {
return Permissions.mcability(sender);
}
private void toggleAbilityUse() {
if (mcMMOPlayer.getAbilityUse()) {
player.sendMessage(LocaleLoader.getString("Commands.Ability.Off"));
}
else {
player.sendMessage(LocaleLoader.getString("Commands.Ability.On"));
}
@Override
protected void applyCommandAction() {
player.sendMessage(LocaleLoader.getString("Commands.Ability." + (mcMMOPlayer.getAbilityUse() ? "Off" : "On")));
mcMMOPlayer.toggleAbilityUse();
}
@Override
protected void sendSuccessMessage(CommandSender sender) {
sender.sendMessage("Ability use has been toggled for " + player.getName()); // TODO: Localize
}
}

View File

@@ -1,74 +1,29 @@
package com.gmail.nossr50.commands;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.locale.LocaleLoader;
import com.gmail.nossr50.util.Permissions;
import com.gmail.nossr50.util.commands.CommandUtils;
import com.gmail.nossr50.util.player.UserManager;
public class McgodCommand implements CommandExecutor {
private McMMOPlayer mcMMOPlayer;
private Player player;
public class McgodCommand extends ToggleCommand {
@Override
protected boolean hasOtherPermission(CommandSender sender) {
return Permissions.mcgodOthers(sender);
}
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
switch (args.length) {
case 0:
if (CommandUtils.noConsoleUsage(sender)) {
return true;
}
if (!Permissions.mcgod(sender)) {
sender.sendMessage(command.getPermissionMessage());
return true;
}
mcMMOPlayer = UserManager.getPlayer(sender.getName());
player = mcMMOPlayer.getPlayer();
toggleGodMode();
return true;
case 1:
if (!Permissions.mcgodOthers(sender)) {
sender.sendMessage(command.getPermissionMessage());
return true;
}
mcMMOPlayer = UserManager.getPlayer(args[0]);
if (!CommandUtils.checkPlayerExistence(sender, args[0], mcMMOPlayer)) {
return true;
}
player = mcMMOPlayer.getPlayer();
if (CommandUtils.isOffline(sender, player)) {
return true;
}
toggleGodMode();
sender.sendMessage("God mode has been toggled for " + player.getName()); // TODO: Localize
return true;
default:
return false;
}
protected boolean hasSelfPermission(CommandSender sender) {
return Permissions.mcgod(sender);
}
private void toggleGodMode() {
if (mcMMOPlayer.getGodMode()) {
player.sendMessage(LocaleLoader.getString("Commands.GodMode.Disabled"));
}
else {
player.sendMessage(LocaleLoader.getString("Commands.GodMode.Enabled"));
}
@Override
protected void applyCommandAction() {
player.sendMessage(LocaleLoader.getString("Commands.GodMode." + (mcMMOPlayer.getGodMode() ? "Disabled" : "Enabled")));
mcMMOPlayer.toggleGodMode();
}
@Override
protected void sendSuccessMessage(CommandSender sender) {
sender.sendMessage("God mode has been toggled for " + player.getName()); // TODO: Localize
}
}

View File

@@ -1,27 +1,25 @@
package com.gmail.nossr50.commands;
import java.util.List;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabExecutor;
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.locale.LocaleLoader;
import com.gmail.nossr50.util.player.UserManager;
public class McnotifyCommand implements CommandExecutor {
import com.google.common.collect.ImmutableList;
public class McnotifyCommand implements TabExecutor {
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
switch (args.length) {
case 0:
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(sender.getName());
if (mcMMOPlayer.useChatNotifications()) {
sender.sendMessage(LocaleLoader.getString("Commands.Notifications.Off"));
}
else {
sender.sendMessage(LocaleLoader.getString("Commands.Notifications.On"));
}
sender.sendMessage(LocaleLoader.getString("Commands.Notifications." + (mcMMOPlayer.useChatNotifications() ? "Off" : "On")));
mcMMOPlayer.toggleChatNotifications();
return true;
@@ -29,4 +27,9 @@ public class McnotifyCommand implements CommandExecutor {
return false;
}
}
@Override
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
return ImmutableList.of();
}
}

View File

@@ -1,73 +1,34 @@
package com.gmail.nossr50.commands;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.locale.LocaleLoader;
import com.gmail.nossr50.util.Permissions;
import com.gmail.nossr50.util.commands.CommandUtils;
import com.gmail.nossr50.util.player.UserManager;
public class McrefreshCommand implements CommandExecutor {
private McMMOPlayer mcMMOPlayer;
private Player player;
public class McrefreshCommand extends ToggleCommand {
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
switch (args.length) {
case 0:
if (CommandUtils.noConsoleUsage(sender)) {
return true;
}
if (!Permissions.mcrefresh(sender)) {
sender.sendMessage(command.getPermissionMessage());
return true;
}
mcMMOPlayer = UserManager.getPlayer(sender.getName());
player = mcMMOPlayer.getPlayer();
refreshPlayer();
return true;
case 1:
if (!Permissions.mcrefreshOthers(sender)) {
sender.sendMessage(command.getPermissionMessage());
return true;
}
mcMMOPlayer = UserManager.getPlayer(args[0]);
if (!CommandUtils.checkPlayerExistence(sender, args[0], mcMMOPlayer)) {
return true;
}
Player player = mcMMOPlayer.getPlayer();
if (CommandUtils.isOffline(sender, player)) {
return true;
}
refreshPlayer();
sender.sendMessage(LocaleLoader.getString("Commands.mcrefresh.Success", player.getName()));
return true;
default:
return false;
}
protected boolean hasOtherPermission(CommandSender sender) {
return Permissions.mcrefreshOthers(sender);
}
private void refreshPlayer() {
@Override
protected boolean hasSelfPermission(CommandSender sender) {
return Permissions.mcrefresh(sender);
}
@Override
protected void applyCommandAction() {
mcMMOPlayer.setRecentlyHurt(0);
mcMMOPlayer.getProfile().resetCooldowns();
mcMMOPlayer.resetToolPrepMode();
mcMMOPlayer.resetAbilityMode();
player = mcMMOPlayer.getPlayer();
player.setCanPickupItems(true);
player.sendMessage(LocaleLoader.getString("Ability.Generic.Refresh"));
}
@Override
protected void sendSuccessMessage(CommandSender sender) {
sender.sendMessage(LocaleLoader.getString("Commands.mcrefresh.Success", player.getName()));
}
}

View File

@@ -0,0 +1,68 @@
package com.gmail.nossr50.commands;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabExecutor;
import org.bukkit.util.StringUtil;
import com.gmail.nossr50.datatypes.MobHealthbarType;
import com.gmail.nossr50.datatypes.player.PlayerProfile;
import com.gmail.nossr50.util.commands.CommandUtils;
import com.gmail.nossr50.util.player.UserManager;
import com.google.common.collect.ImmutableList;
public class MobhealthCommand implements TabExecutor {
private static final List<String> MOB_HEALTHBAR_TYPES;
static {
ArrayList<String> types = new ArrayList<String>();
for (MobHealthbarType type : MobHealthbarType.values()) {
types.add(type.toString());
}
Collections.sort(types);
MOB_HEALTHBAR_TYPES = ImmutableList.copyOf(types);
}
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (CommandUtils.noConsoleUsage(sender)) {
return true;
}
switch (args.length) {
case 1:
PlayerProfile playerProfile = UserManager.getPlayer(sender.getName()).getProfile();
try {
MobHealthbarType type = MobHealthbarType.valueOf(args[0].toUpperCase().trim());
playerProfile.setMobHealthbarType(type);
sender.sendMessage("Display type changed to: " + type); //TODO: Localize
return true;
}
catch (IllegalArgumentException ex) {
sender.sendMessage("Invalid type!"); //TODO: Localize
return true;
}
default:
return false;
}
}
@Override
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
switch (args.length) {
case 1:
return StringUtil.copyPartialMatches(args[0], MOB_HEALTHBAR_TYPES, new ArrayList<String>(MOB_HEALTHBAR_TYPES.size()));
default:
return ImmutableList.of();
}
}
}

View File

@@ -0,0 +1,84 @@
package com.gmail.nossr50.commands;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabExecutor;
import org.bukkit.entity.Player;
import org.bukkit.util.StringUtil;
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.util.commands.CommandUtils;
import com.gmail.nossr50.util.player.UserManager;
import com.google.common.collect.ImmutableList;
public abstract class ToggleCommand implements TabExecutor {
protected McMMOPlayer mcMMOPlayer;
protected Player player;
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
switch (args.length) {
case 0:
if (CommandUtils.noConsoleUsage(sender)) {
return true;
}
if (!hasSelfPermission(sender)) {
sender.sendMessage(command.getPermissionMessage());
return true;
}
mcMMOPlayer = UserManager.getPlayer(sender.getName());
player = mcMMOPlayer.getPlayer();
applyCommandAction();
return true;
case 1:
if (!hasOtherPermission(sender)) {
sender.sendMessage(command.getPermissionMessage());
return true;
}
mcMMOPlayer = UserManager.getPlayer(args[0]);
if (!CommandUtils.checkPlayerExistence(sender, args[0], mcMMOPlayer)) {
return true;
}
player = mcMMOPlayer.getPlayer();
if (CommandUtils.isOffline(sender, player)) {
return true;
}
applyCommandAction();
sendSuccessMessage(sender);
return true;
default:
return false;
}
}
@Override
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
switch (args.length) {
case 1:
Set<String> playerNames = UserManager.getPlayers().keySet();
return StringUtil.copyPartialMatches(args[0], playerNames, new ArrayList<String>(playerNames.size()));
default:
return ImmutableList.of();
}
}
protected abstract boolean hasOtherPermission(CommandSender sender);
protected abstract boolean hasSelfPermission(CommandSender sender);
protected abstract void applyCommandAction();
protected abstract void sendSuccessMessage(CommandSender sender);
}

View File

@@ -1,16 +1,23 @@
package com.gmail.nossr50.commands;
import java.util.ArrayList;
import java.util.List;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabExecutor;
import org.bukkit.util.StringUtil;
import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.config.Config;
import com.gmail.nossr50.locale.LocaleLoader;
import com.gmail.nossr50.util.Permissions;
import com.gmail.nossr50.util.StringUtils;
import com.gmail.nossr50.util.commands.CommandUtils;
public class XprateCommand implements CommandExecutor {
import com.google.common.collect.ImmutableList;
public class XprateCommand implements TabExecutor {
private double originalRate;
public XprateCommand() {
@@ -75,4 +82,20 @@ public class XprateCommand implements CommandExecutor {
return false;
}
}
@Override
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
switch (args.length) {
case 1:
if (StringUtils.isInt(args[0])) {
return ImmutableList.of();
}
return StringUtil.copyPartialMatches(args[0], CommandUtils.RESET_OPTIONS, new ArrayList<String>(CommandUtils.RESET_OPTIONS.size()));
case 2:
return StringUtil.copyPartialMatches(args[1], CommandUtils.TRUE_FALSE_OPTIONS, new ArrayList<String>(CommandUtils.TRUE_FALSE_OPTIONS.size()));
default:
return ImmutableList.of();
}
}
}

View File

@@ -1,8 +1,12 @@
package com.gmail.nossr50.commands.chat;
import java.util.ArrayList;
import java.util.List;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabExecutor;
import org.bukkit.util.StringUtil;
import com.gmail.nossr50.chat.ChatMode;
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
@@ -10,7 +14,9 @@ import com.gmail.nossr50.locale.LocaleLoader;
import com.gmail.nossr50.util.commands.CommandUtils;
import com.gmail.nossr50.util.player.UserManager;
public abstract class ChatCommand implements CommandExecutor {
import com.google.common.collect.ImmutableList;
public abstract class ChatCommand implements TabExecutor {
protected ChatMode chatMode;
private McMMOPlayer mcMMOPlayer;
@@ -68,6 +74,16 @@ public abstract class ChatCommand implements CommandExecutor {
}
}
@Override
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
switch (args.length) {
case 1:
return StringUtil.copyPartialMatches(args[0], CommandUtils.TRUE_FALSE_OPTIONS, new ArrayList<String>(CommandUtils.TRUE_FALSE_OPTIONS.size()));
default:
return ImmutableList.of();
}
}
protected String buildChatMessage(String[] args, int index) {
StringBuilder builder = new StringBuilder();
builder.append(args[index]);

View File

@@ -1,8 +1,10 @@
package com.gmail.nossr50.commands.database;
import java.util.List;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabExecutor;
import com.gmail.nossr50.config.Config;
import com.gmail.nossr50.database.DatabaseManager;
@@ -10,7 +12,9 @@ import com.gmail.nossr50.database.LeaderboardManager;
import com.gmail.nossr50.locale.LocaleLoader;
import com.gmail.nossr50.util.Permissions;
public class McpurgeCommand implements CommandExecutor {
import com.google.common.collect.ImmutableList;
public class McpurgeCommand implements TabExecutor {
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (!Permissions.mcpurge(sender)) {
@@ -42,4 +46,9 @@ public class McpurgeCommand implements CommandExecutor {
return false;
}
}
@Override
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
return ImmutableList.of();
}
}

View File

@@ -1,17 +1,27 @@
package com.gmail.nossr50.commands.database;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabExecutor;
import org.bukkit.util.StringUtil;
import com.gmail.nossr50.config.Config;
import com.gmail.nossr50.database.DatabaseManager;
import com.gmail.nossr50.database.LeaderboardManager;
import com.gmail.nossr50.datatypes.player.PlayerProfile;
import com.gmail.nossr50.locale.LocaleLoader;
import com.gmail.nossr50.util.Misc;
import com.gmail.nossr50.util.Permissions;
import com.gmail.nossr50.util.commands.CommandUtils;
import com.gmail.nossr50.util.player.UserManager;
public class McremoveCommand implements CommandExecutor {
import com.google.common.collect.ImmutableList;
public class McremoveCommand implements TabExecutor {
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (!Permissions.mcremove(sender)) {
@@ -21,6 +31,10 @@ public class McremoveCommand implements CommandExecutor {
switch (args.length) {
case 1:
if (UserManager.getPlayer(args[0]) == null && CommandUtils.unloadedProfile(sender, new PlayerProfile(args[0], false))) {
return true;
}
/* MySQL */
if (Config.getInstance().getUseMySQL()) {
String tablePrefix = Config.getInstance().getMySQLTablePrefix();
@@ -29,18 +43,12 @@ public class McremoveCommand implements CommandExecutor {
Misc.profileCleanup(args[0]);
sender.sendMessage(LocaleLoader.getString("Commands.mcremove.Success", args[0]));
}
else {
sender.sendMessage(LocaleLoader.getString("Commands.DoesNotExist"));
}
}
else {
if (LeaderboardManager.removeFlatFileUser(args[0])) {
Misc.profileCleanup(args[0]);
sender.sendMessage(LocaleLoader.getString("Commands.mcremove.Success", args[0]));
}
else {
sender.sendMessage(LocaleLoader.getString("Commands.DoesNotExist"));
}
}
return true;
@@ -49,4 +57,15 @@ public class McremoveCommand implements CommandExecutor {
return false;
}
}
@Override
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
switch (args.length) {
case 1:
Set<String> playerNames = UserManager.getPlayers().keySet();
return StringUtil.copyPartialMatches(args[0], playerNames, new ArrayList<String>(playerNames.size()));
default:
return ImmutableList.of();
}
}
}

View File

@@ -1,8 +1,10 @@
package com.gmail.nossr50.commands.database;
import java.util.List;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabExecutor;
import org.bukkit.entity.Player;
import com.gmail.nossr50.mcMMO;
@@ -12,7 +14,9 @@ import com.gmail.nossr50.runnables.database.SQLConversionTask;
import com.gmail.nossr50.util.Permissions;
import com.gmail.nossr50.util.player.UserManager;
public class MmoupdateCommand implements CommandExecutor {
import com.google.common.collect.ImmutableList;
public class MmoupdateCommand implements TabExecutor {
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (!Permissions.mmoupdate(sender)) {
@@ -20,11 +24,17 @@ public class MmoupdateCommand implements CommandExecutor {
return true;
}
if (!Config.getInstance().getUseMySQL()) {
sender.sendMessage("SQL Mode is not enabled."); // TODO: Localize
return true;
}
switch (args.length) {
case 0:
sender.sendMessage(LocaleLoader.getString("Commands.mmoupdate.Start"));
UserManager.saveAll();
UserManager.clearAll();
convertToMySQL();
new SQLConversionTask().runTaskLaterAsynchronously(mcMMO.p, 1);
for (Player player : mcMMO.p.getServer().getOnlinePlayers()) {
UserManager.addUser(player);
@@ -38,14 +48,8 @@ public class MmoupdateCommand implements CommandExecutor {
}
}
/**
* Convert FlatFile data to MySQL data.
*/
private void convertToMySQL() {
if (!Config.getInstance().getUseMySQL()) {
return;
}
new SQLConversionTask().runTaskLaterAsynchronously(mcMMO.p, 1);
@Override
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
return ImmutableList.of();
}
}

View File

@@ -31,6 +31,5 @@ public class AddlevelsCommand extends ExperienceCommand {
@Override
protected void handlePlayerMessageSkill() {
player.sendMessage(LocaleLoader.getString("Commands.addlevels.AwardSkill.1", value, SkillUtils.getSkillName(skill)));
}
}

View File

@@ -24,7 +24,7 @@ public class AddxpCommand extends ExperienceCommand {
mcMMOPlayer.applyXpGain(skill, value);
}
else {
profile.setSkillXpLevel(skill, value);
profile.addExperience(skill, value);
}
}

View File

@@ -1,9 +1,14 @@
package com.gmail.nossr50.commands.experience;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabExecutor;
import org.bukkit.entity.Player;
import org.bukkit.util.StringUtil;
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.datatypes.player.PlayerProfile;
@@ -13,8 +18,9 @@ import com.gmail.nossr50.util.commands.CommandUtils;
import com.gmail.nossr50.util.player.UserManager;
import com.gmail.nossr50.util.skills.SkillUtils;
import com.google.common.collect.ImmutableList;
public abstract class ExperienceCommand implements CommandExecutor {
public abstract class ExperienceCommand implements TabExecutor {
protected McMMOPlayer mcMMOPlayer;
protected Player player;
protected PlayerProfile profile;
@@ -45,6 +51,7 @@ public abstract class ExperienceCommand implements CommandExecutor {
profile = mcMMOPlayer.getProfile();
editValues();
allSkills = false;
return true;
case 3:
@@ -72,10 +79,12 @@ public abstract class ExperienceCommand implements CommandExecutor {
}
else {
profile = mcMMOPlayer.getProfile();
player = mcMMOPlayer.getPlayer();
editValues();
}
handleSenderMessage(sender, args[0]);
allSkills = false;
return true;
default:
@@ -83,6 +92,19 @@ public abstract class ExperienceCommand implements CommandExecutor {
}
}
@Override
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
switch (args.length) {
case 1:
Set<String> playerNames = UserManager.getPlayers().keySet();
return StringUtil.copyPartialMatches(args[0], playerNames, new ArrayList<String>(playerNames.size()));
case 2:
return StringUtil.copyPartialMatches(args[1], SkillType.SKILL_NAMES, new ArrayList<String>(SkillType.SKILL_NAMES.size()));
default:
return ImmutableList.of();
}
}
protected abstract boolean permissionsCheckSelf(CommandSender sender);
protected abstract boolean permissionsCheckOthers(CommandSender sender);
protected abstract void handleCommand(SkillType skill);

View File

@@ -1,15 +1,21 @@
package com.gmail.nossr50.commands.hardcore;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabExecutor;
import org.bukkit.util.StringUtil;
import com.gmail.nossr50.util.Permissions;
import com.gmail.nossr50.util.StringUtils;
import com.gmail.nossr50.util.commands.CommandUtils;
public abstract class HardcoreModeCommand implements CommandExecutor {
import com.google.common.collect.ImmutableList;
public abstract class HardcoreModeCommand implements TabExecutor {
protected CommandSender sender;
protected double newPercent;
protected DecimalFormat percent;
@@ -76,6 +82,20 @@ public abstract class HardcoreModeCommand implements CommandExecutor {
}
}
@Override
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
switch (args.length) {
case 1:
if (StringUtils.isDouble(args[0])) {
return ImmutableList.of();
}
return StringUtil.copyPartialMatches(args[0], CommandUtils.TRUE_FALSE_OPTIONS, new ArrayList<String>(CommandUtils.TRUE_FALSE_OPTIONS.size()));
default:
return ImmutableList.of();
}
}
protected abstract boolean checkTogglePermissions();
protected abstract boolean checkModifyPermissions();
protected abstract boolean checkEnabled();

View File

@@ -1,21 +1,46 @@
package com.gmail.nossr50.commands.party;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabExecutor;
import org.bukkit.entity.Player;
import org.bukkit.util.StringUtil;
import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.commands.chat.PartyChatCommand;
import com.gmail.nossr50.commands.party.teleport.PtpCommand;
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.locale.LocaleLoader;
import com.gmail.nossr50.util.Permissions;
import com.gmail.nossr50.util.commands.CommandUtils;
import com.gmail.nossr50.util.player.UserManager;
import com.google.common.collect.ImmutableList;
public class PartyCommand implements CommandExecutor {
public class PartyCommand implements TabExecutor {
private McMMOPlayer mcMMOPlayer;
private Player player;
private static final List<String> PARTY_SUBCOMMANDS;
private static final List<String> EXPSHARE_COMPLETIONS = ImmutableList.of("none", "equal");
private static final List<String> ITEMSHARE_COMPLETIONS = ImmutableList.of("none", "equal", "random", "loot", "mining", "herbalism", "woodcutting");
static {
ArrayList<String> subcommands = new ArrayList<String>();
for (PartySubcommandType subcommand : PartySubcommandType.values()) {
subcommands.add(subcommand.toString());
}
Collections.sort(subcommands);
PARTY_SUBCOMMANDS = ImmutableList.copyOf(subcommands);
}
private CommandExecutor partyJoinCommand = new PartyJoinCommand();
private CommandExecutor partyAcceptCommand = new PartyAcceptCommand();
private CommandExecutor partyCreateCommand = new PartyCreateCommand();
@@ -32,7 +57,7 @@ public class PartyCommand implements CommandExecutor {
private CommandExecutor partyInfoCommand = new PartyInfoCommand();
private CommandExecutor partyHelpCommand = new PartyHelpCommand();
private CommandExecutor partyTeleportCommand = mcMMO.p.getCommand("ptp").getExecutor();
private CommandExecutor partyChatCommand = mcMMO.p.getCommand("partychat").getExecutor();
private CommandExecutor partyChatCommand = new PartyChatCommand();
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
@@ -134,6 +159,57 @@ public class PartyCommand implements CommandExecutor {
return true;
}
@Override
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
switch (args.length) {
case 1:
return StringUtil.copyPartialMatches(args[0], PARTY_SUBCOMMANDS, new ArrayList<String>(PARTY_SUBCOMMANDS.size()));
case 2:
PartySubcommandType subcommand = PartySubcommandType.getSubcommand(args[0]);
if (subcommand == null) {
return ImmutableList.of();
}
switch (PartySubcommandType.valueOf(args[0].toUpperCase())) {
case JOIN:
case INVITE:
case KICK:
case OWNER:
Set<String> playerNames = UserManager.getPlayers().keySet();
return StringUtil.copyPartialMatches(args[1], playerNames, new ArrayList<String>(playerNames.size()));
case EXPSHARE:
return StringUtil.copyPartialMatches(args[1], EXPSHARE_COMPLETIONS, new ArrayList<String>(EXPSHARE_COMPLETIONS.size()));
case ITEMSHARE:
return StringUtil.copyPartialMatches(args[1], ITEMSHARE_COMPLETIONS, new ArrayList<String>(ITEMSHARE_COMPLETIONS.size()));
case LOCK:
case CHAT:
return StringUtil.copyPartialMatches(args[1], CommandUtils.TRUE_FALSE_OPTIONS, new ArrayList<String>(CommandUtils.TRUE_FALSE_OPTIONS.size()));
case PASSWORD:
return StringUtil.copyPartialMatches(args[1], CommandUtils.RESET_OPTIONS, new ArrayList<String>(CommandUtils.RESET_OPTIONS.size()));
case TELEPORT:
List<String> matches = StringUtil.copyPartialMatches(args[1], PtpCommand.TELEPORT_SUBCOMMANDS, new ArrayList<String>(PtpCommand.TELEPORT_SUBCOMMANDS.size()));
if (matches.size() == 0) {
playerNames = UserManager.getPlayers().keySet();
return StringUtil.copyPartialMatches(args[1], playerNames, new ArrayList<String>(playerNames.size()));
}
return matches;
default:
return ImmutableList.of();
}
case 3:
if (PartySubcommandType.getSubcommand(args[0]) == PartySubcommandType.ITEMSHARE && isItemShareCategory(args[1])) {
return StringUtil.copyPartialMatches(args[2], CommandUtils.TRUE_FALSE_OPTIONS, new ArrayList<String>(CommandUtils.TRUE_FALSE_OPTIONS.size()));
}
return ImmutableList.of();
default:
return ImmutableList.of();
}
}
private boolean printUsage() {
player.sendMessage(LocaleLoader.getString("Party.Help.0", "/party join"));
player.sendMessage(LocaleLoader.getString("Party.Help.1", "/party create"));
@@ -150,4 +226,9 @@ public class PartyCommand implements CommandExecutor {
return newArgs;
}
private boolean isItemShareCategory(String category) {
return category.equalsIgnoreCase("loot") || category.equalsIgnoreCase("mining") || category.equalsIgnoreCase("herbalism") || category.equalsIgnoreCase("woodcutting");
}
}

View File

@@ -35,7 +35,7 @@ public class PartyExpShareCommand implements CommandExecutor {
handleChangingShareMode(ShareMode.EQUAL);
}
else {
sender.sendMessage(LocaleLoader.getString("Commands.Usage.2", "party", "expshare", "[NONE | EQUAL]"));
sender.sendMessage(LocaleLoader.getString("Commands.Usage.2", "party", "expshare", "<NONE | EQUAL>"));
}
return true;

View File

@@ -21,14 +21,21 @@ public class PartyInfoCommand implements CommandExecutor {
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(sender.getName());
player = mcMMOPlayer.getPlayer();
playerParty = mcMMOPlayer.getParty();
switch (args.length) {
case 0:
case 1:
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(sender.getName());
player = mcMMOPlayer.getPlayer();
playerParty = mcMMOPlayer.getParty();
displayPartyHeader();
displayShareModeInfo();
displayMemberInfo();
return true;
displayPartyHeader();
displayShareModeInfo();
displayMemberInfo();
return true;
default:
sender.sendMessage(LocaleLoader.getString("Commands.Usage.1", "party", "info"));
return true;
}
}
private String createMembersList() {

View File

@@ -58,7 +58,7 @@ public class PtpAcceptCommand implements CommandExecutor {
}
}
PtpCommand.handlePartyTeleportEvent(target, player);
PtpCommand.handleTeleportWarmup(target, player);
return true;
}
}

View File

@@ -1,9 +1,16 @@
package com.gmail.nossr50.commands.party.teleport;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabExecutor;
import org.bukkit.entity.Player;
import org.bukkit.util.StringUtil;
import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.config.Config;
@@ -11,14 +18,20 @@ import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.events.party.McMMOPartyTeleportEvent;
import com.gmail.nossr50.locale.LocaleLoader;
import com.gmail.nossr50.party.PartyManager;
import com.gmail.nossr50.runnables.items.TeleportationWarmup;
import com.gmail.nossr50.util.Misc;
import com.gmail.nossr50.util.Permissions;
import com.gmail.nossr50.util.commands.CommandUtils;
import com.gmail.nossr50.util.player.UserManager;
import com.gmail.nossr50.util.skills.SkillUtils;
import com.google.common.collect.ImmutableList;
public class PtpCommand implements CommandExecutor {
public class PtpCommand implements TabExecutor {
private static Player target;
private static McMMOPlayer mcMMOTarget;
public static final List<String> TELEPORT_SUBCOMMANDS = ImmutableList.of("toggle", "accept", "acceptany", "acceptall");
private CommandExecutor ptpToggleCommand = new PtpToggleCommand();
private CommandExecutor ptpAcceptAnyCommand = new PtpAcceptAnyCommand();
private CommandExecutor ptpAcceptCommand = new PtpAcceptCommand();
@@ -42,11 +55,11 @@ public class PtpCommand implements CommandExecutor {
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(sender.getName());
Player player = mcMMOPlayer.getPlayer();
int ptpCooldown = Config.getInstance().getPTPCommandCooldown();
long recentlyHurt = mcMMOPlayer.getRecentlyHurt();
int recentlyhurt_cooldown = Config.getInstance().getPTPCommandRecentlyHurtCooldown();
if (((recentlyHurt * Misc.TIME_CONVERSION_FACTOR) + (ptpCooldown * Misc.TIME_CONVERSION_FACTOR)) > System.currentTimeMillis()) {
player.sendMessage(LocaleLoader.getString("Party.Teleport.Hurt", ptpCooldown));
if (!SkillUtils.cooldownOver(recentlyHurt * Misc.TIME_CONVERSION_FACTOR, recentlyhurt_cooldown, player)) {
player.sendMessage(LocaleLoader.getString("Item.Injured.Wait", SkillUtils.calculateTimeLeft(recentlyHurt * Misc.TIME_CONVERSION_FACTOR, recentlyhurt_cooldown, player)));
return true;
}
@@ -54,6 +67,19 @@ public class PtpCommand implements CommandExecutor {
return ptpAcceptCommand.onCommand(sender, command, label, args);
}
if (!Permissions.partyTeleportSend(sender)) {
sender.sendMessage(command.getPermissionMessage());
return true;
}
int ptpCooldown = Config.getInstance().getPTPCommandCooldown();
long lastTeleport = mcMMOPlayer.getLastTeleport();
if (!SkillUtils.cooldownOver(lastTeleport * Misc.TIME_CONVERSION_FACTOR, ptpCooldown, player)) {
player.sendMessage(ChatColor.RED + "You need to wait before you can use this again! " + ChatColor.YELLOW + "(" + SkillUtils.calculateTimeLeft(lastTeleport * Misc.TIME_CONVERSION_FACTOR, ptpCooldown, player) + ")"); //TODO Locale!
return true;
}
sendTeleportRequest(sender, player, args[0]);
return true;
@@ -62,13 +88,30 @@ public class PtpCommand implements CommandExecutor {
}
}
@Override
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
switch (args.length) {
case 1:
List<String> matches = StringUtil.copyPartialMatches(args[0], TELEPORT_SUBCOMMANDS, new ArrayList<String>(TELEPORT_SUBCOMMANDS.size()));
if (matches.size() == 0) {
Set<String> playerNames = UserManager.getPlayers().keySet();
return StringUtil.copyPartialMatches(args[0], playerNames, new ArrayList<String>(playerNames.size()));
}
return matches;
default:
return ImmutableList.of();
}
}
private void sendTeleportRequest(CommandSender sender, Player player, String targetName) {
if (!canTeleport(sender, player, targetName)) {
return;
}
if (!mcMMOTarget.getPtpConfirmRequired()) {
handlePartyTeleportEvent(player, target);
handleTeleportWarmup(player, target);
return;
}
@@ -89,6 +132,7 @@ public class PtpCommand implements CommandExecutor {
}
target = mcMMOTarget.getPlayer();
targetName = target.getName();
if (player.equals(target)) {
player.sendMessage(LocaleLoader.getString("Party.Teleport.Self"));
@@ -113,7 +157,24 @@ public class PtpCommand implements CommandExecutor {
return true;
}
protected static void handlePartyTeleportEvent(Player teleportingPlayer, Player targetPlayer) {
protected static void handleTeleportWarmup(Player teleportingPlayer, Player targetPlayer) {
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(teleportingPlayer);
mcMMOTarget = UserManager.getPlayer(targetPlayer);
long warmup = Config.getInstance().getPTPCommandWarmup();
mcMMOPlayer.actualizeTeleportCommenceLocation(teleportingPlayer);
if (warmup > 0) {
teleportingPlayer.sendMessage(ChatColor.GRAY + "Commencing teleport in " + ChatColor.GOLD + "(" + warmup + ")" + ChatColor.GRAY + " seconds, please stand still..."); //TODO Locale!
new TeleportationWarmup(mcMMOPlayer, mcMMOTarget).runTaskLater(mcMMO.p, 20 * warmup);
}
else {
handlePartyTeleportEvent(teleportingPlayer, targetPlayer);
}
}
public static void handlePartyTeleportEvent(Player teleportingPlayer, Player targetPlayer) {
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(teleportingPlayer);
McMMOPartyTeleportEvent event = new McMMOPartyTeleportEvent(teleportingPlayer, targetPlayer, mcMMOPlayer.getParty().getName());

View File

@@ -1,9 +1,14 @@
package com.gmail.nossr50.commands.player;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabExecutor;
import org.bukkit.entity.Player;
import org.bukkit.util.StringUtil;
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.datatypes.player.PlayerProfile;
@@ -13,7 +18,9 @@ import com.gmail.nossr50.util.Permissions;
import com.gmail.nossr50.util.commands.CommandUtils;
import com.gmail.nossr50.util.player.UserManager;
public class InspectCommand implements CommandExecutor {
import com.google.common.collect.ImmutableList;
public class InspectCommand implements TabExecutor {
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
switch (args.length) {
@@ -68,4 +75,15 @@ public class InspectCommand implements CommandExecutor {
return false;
}
}
@Override
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
switch (args.length) {
case 1:
Set<String> playerNames = UserManager.getPlayers().keySet();
return StringUtil.copyPartialMatches(args[0], playerNames, new ArrayList<String>(playerNames.size()));
default:
return ImmutableList.of();
}
}
}

View File

@@ -1,8 +1,13 @@
package com.gmail.nossr50.commands.player;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabExecutor;
import org.bukkit.util.StringUtil;
import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.config.Config;
@@ -17,7 +22,9 @@ import com.gmail.nossr50.util.commands.CommandUtils;
import com.gmail.nossr50.util.player.UserManager;
import com.gmail.nossr50.util.skills.SkillUtils;
public class McrankCommand implements CommandExecutor {
import com.google.common.collect.ImmutableList;
public class McrankCommand implements TabExecutor {
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
switch (args.length) {
@@ -74,6 +81,17 @@ public class McrankCommand implements CommandExecutor {
}
}
@Override
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
switch (args.length) {
case 1:
Set<String> playerNames = UserManager.getPlayers().keySet();
return StringUtil.copyPartialMatches(args[0], playerNames, new ArrayList<String>(playerNames.size()));
default:
return ImmutableList.of();
}
}
private void flatfileDisplay(CommandSender sender, String playerName) {
LeaderboardManager.updateLeaderboards(); // Make sure the information is up to date

View File

@@ -1,8 +1,10 @@
package com.gmail.nossr50.commands.player;
import java.util.List;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabExecutor;
import org.bukkit.entity.Player;
import com.gmail.nossr50.config.Config;
@@ -11,7 +13,9 @@ import com.gmail.nossr50.locale.LocaleLoader;
import com.gmail.nossr50.util.commands.CommandUtils;
import com.gmail.nossr50.util.player.UserManager;
public class McstatsCommand implements CommandExecutor {
import com.google.common.collect.ImmutableList;
public class McstatsCommand implements TabExecutor {
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (CommandUtils.noConsoleUsage(sender)) {
@@ -45,4 +49,9 @@ public class McstatsCommand implements CommandExecutor {
return false;
}
}
@Override
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
return ImmutableList.of();
}
}

View File

@@ -1,9 +1,13 @@
package com.gmail.nossr50.commands.player;
import java.util.ArrayList;
import java.util.List;
import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabExecutor;
import org.bukkit.util.StringUtil;
import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.config.Config;
@@ -15,7 +19,9 @@ import com.gmail.nossr50.util.Permissions;
import com.gmail.nossr50.util.StringUtils;
import com.gmail.nossr50.util.commands.CommandUtils;
public class MctopCommand implements CommandExecutor {
import com.google.common.collect.ImmutableList;
public class MctopCommand implements TabExecutor {
private SkillType skill;
@Override
@@ -58,6 +64,16 @@ public class MctopCommand implements CommandExecutor {
}
}
@Override
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
switch (args.length) {
case 1:
return StringUtil.copyPartialMatches(args[1], SkillType.SKILL_NAMES, new ArrayList<String>(SkillType.SKILL_NAMES.size()));
default:
return ImmutableList.of();
}
}
private void display(int page, String skill, CommandSender sender, boolean sql, Command command) {
if (!skill.equalsIgnoreCase("all") && !Permissions.mctop(sender, this.skill)) {
sender.sendMessage(command.getPermissionMessage());
@@ -122,7 +138,7 @@ public class MctopCommand implements CommandExecutor {
skill = SkillType.getSkill(skillName);
if (CommandUtils.isChildSkill(sender, skill)) {
return true;
return false;
}
return true;

View File

@@ -15,11 +15,13 @@ public class FishingCommand extends SkillCommand {
private String shakeChance;
private String shakeChanceLucky;
private int fishermansDietRank;
private String biteChance;
private boolean canTreasureHunt;
private boolean canMagicHunt;
private boolean canShake;
private boolean canFishermansDiet;
private boolean canMasterAngler;
public FishingCommand() {
super(SkillType.FISHING);
@@ -27,12 +29,14 @@ public class FishingCommand extends SkillCommand {
@Override
protected void dataCalculations() {
boolean isStorming = player.getWorld().hasStorm();
// TREASURE HUNTER
if (canTreasureHunt) {
lootTier = mcMMOPlayer.getFishingManager().getLootTier();
double enchantChance = lootTier * AdvancedConfig.getInstance().getFishingMagicMultiplier();
if (player.getWorld().hasStorm()) {
if (isStorming) {
chanceRaining = LocaleLoader.getString("Fishing.Chance.Raining");
enchantChance *= 1.1D;
}
@@ -53,6 +57,11 @@ public class FishingCommand extends SkillCommand {
if (canFishermansDiet) {
fishermansDietRank = calculateRank(Fishing.fishermansDietMaxLevel, Fishing.fishermansDietRankLevel1);
}
// MASTER ANGLER
if (canMasterAngler) {
biteChance = calculateAbilityDisplayValues((skillValue / 10) / (isStorming ? 300 : 500))[0];
}
}
@Override
@@ -61,11 +70,12 @@ public class FishingCommand extends SkillCommand {
canMagicHunt = Permissions.magicHunter(player);
canShake = Permissions.shake(player);
canFishermansDiet = Permissions.fishermansDiet(player);
canMasterAngler = Permissions.masterAngler(player);
}
@Override
protected boolean effectsHeaderPermissions() {
return canTreasureHunt || canMagicHunt || canShake;
return canTreasureHunt || canMagicHunt || canShake || canMasterAngler || canFishermansDiet;
}
@Override
@@ -87,15 +97,23 @@ public class FishingCommand extends SkillCommand {
if (canFishermansDiet) {
player.sendMessage(LocaleLoader.getString("Effects.Template", LocaleLoader.getString("Fishing.Effect.6"), LocaleLoader.getString("Fishing.Effect.7")));
}
if (canMasterAngler) {
player.sendMessage(LocaleLoader.getString("Effects.Template", LocaleLoader.getString("Fishing.Effect.8"), LocaleLoader.getString("Fishing.Effect.9")));
}
}
@Override
protected boolean statsHeaderPermissions() {
return canTreasureHunt || canMagicHunt || canShake;
return canTreasureHunt || canMagicHunt || canShake || canMasterAngler || canFishermansDiet;
}
@Override
protected void statsDisplay() {
if (canMasterAngler) {
player.sendMessage(LocaleLoader.getString("Fishing.Ability.Chance", biteChance));
}
if (canTreasureHunt) {
player.sendMessage(LocaleLoader.getString("Fishing.Ability.Rank", lootTier));
}

View File

@@ -1,11 +1,13 @@
package com.gmail.nossr50.commands.skills;
import java.text.DecimalFormat;
import java.util.List;
import java.util.Set;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabExecutor;
import org.bukkit.entity.Player;
import com.gmail.nossr50.config.AdvancedConfig;
@@ -21,7 +23,9 @@ import com.gmail.nossr50.util.player.UserManager;
import com.gmail.nossr50.util.skills.PerksUtils;
import com.gmail.nossr50.util.skills.SkillUtils;
public abstract class SkillCommand implements CommandExecutor {
import com.google.common.collect.ImmutableList;
public abstract class SkillCommand implements TabExecutor {
protected SkillType skill;
protected String skillName;
@@ -102,6 +106,16 @@ public abstract class SkillCommand implements CommandExecutor {
}
}
@Override
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
switch (args.length) {
case 1:
return ImmutableList.of("?");
default:
return ImmutableList.of();
}
}
protected int calculateRank(int maxLevel, int rankChangeLevel) {
return Math.min((int) skillValue, maxLevel) / rankChangeLevel;
}

View File

@@ -1,12 +1,41 @@
package com.gmail.nossr50.commands.spout;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.util.StringUtil;
import com.gmail.nossr50.datatypes.spout.huds.HudType;
import com.gmail.nossr50.locale.LocaleLoader;
import com.google.common.collect.ImmutableList;
public class MchudCommand extends SpoutCommand {
private static final List<String> HUD_TYPES;
static {
ArrayList<String> types = new ArrayList<String>();
for (HudType type : HudType.values()) {
types.add(type.toString());
}
Collections.sort(types);
HUD_TYPES = ImmutableList.copyOf(types);
}
@Override
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
switch (args.length) {
case 1:
return StringUtil.copyPartialMatches(args[0], HUD_TYPES, new ArrayList<String>(HUD_TYPES.size()));
default:
return ImmutableList.of();
}
}
@Override
protected boolean noArguments(Command command, CommandSender sender, String[] args) {
return false;
@@ -14,16 +43,15 @@ public class MchudCommand extends SpoutCommand {
@Override
protected boolean oneArgument(Command command, CommandSender sender, String[] args) {
for (HudType hudType : HudType.values()) {
if (hudType.toString().equalsIgnoreCase(args[0])) {
playerProfile.setHudType(hudType);
spoutHud.initializeXpBar();
spoutHud.updateXpBar();
return true;
}
try {
playerProfile.setHudType(HudType.valueOf(args[0].toUpperCase().trim()));
spoutHud.initializeXpBar();
spoutHud.updateXpBar();
return true;
}
catch (IllegalArgumentException ex) {
sender.sendMessage(LocaleLoader.getString("Commands.mchud.Invalid"));
return true;
}
sender.sendMessage(LocaleLoader.getString("Commands.mchud.Invalid"));
return true;
}
}

View File

@@ -1,8 +1,8 @@
package com.gmail.nossr50.commands.spout;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabExecutor;
import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.config.spout.SpoutConfig;
@@ -12,7 +12,7 @@ import com.gmail.nossr50.locale.LocaleLoader;
import com.gmail.nossr50.util.commands.CommandUtils;
import com.gmail.nossr50.util.player.UserManager;
public abstract class SpoutCommand implements CommandExecutor {
public abstract class SpoutCommand implements TabExecutor {
protected PlayerProfile playerProfile;
protected McMMOHud spoutHud;

View File

@@ -1,15 +1,36 @@
package com.gmail.nossr50.commands.spout;
import java.util.ArrayList;
import java.util.List;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.util.StringUtil;
import com.gmail.nossr50.datatypes.skills.SkillType;
import com.gmail.nossr50.locale.LocaleLoader;
import com.gmail.nossr50.util.Permissions;
import com.gmail.nossr50.util.commands.CommandUtils;
import com.gmail.nossr50.util.skills.SkillUtils;
import com.google.common.collect.ImmutableList;
public class XplockCommand extends SpoutCommand {
@Override
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
switch (args.length) {
case 1:
List<String> matches = StringUtil.copyPartialMatches(args[0], CommandUtils.TRUE_FALSE_OPTIONS, new ArrayList<String>(CommandUtils.TRUE_FALSE_OPTIONS.size()));
if (matches.size() == 0) {
return StringUtil.copyPartialMatches(args[0], SkillType.SKILL_NAMES, new ArrayList<String>(SkillType.SKILL_NAMES.size()));
}
return matches;
default:
return ImmutableList.of();
}
}
@Override
protected boolean noArguments(Command command, CommandSender sender, String[] args) {
if (spoutHud.getXpBarLocked()) {

View File

@@ -6,6 +6,7 @@ import org.bukkit.Material;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.EntityType;
import com.gmail.nossr50.datatypes.MobHealthbarType;
import com.gmail.nossr50.datatypes.skills.AbilityType;
import com.gmail.nossr50.datatypes.skills.SkillType;
import com.gmail.nossr50.util.StringUtils;
@@ -48,6 +49,18 @@ public class Config extends AutoUpdateConfigLoader {
public boolean getPartyDisplayNames() { return config.getBoolean("Commands.p.Use_Display_Names", true); }
public boolean getAdminDisplayNames() { return config.getBoolean("Commands.a.Use_Display_Names", true); }
/* Mob Healthbar */
public MobHealthbarType getMobHealthbarDefault() {
try {
return MobHealthbarType.valueOf(config.getString("Mob_Healthbar.Display_Type", "HEARTS").toUpperCase().trim());
}
catch (IllegalArgumentException ex) {
return MobHealthbarType.HEARTS;
}
}
public int getMobHealthbarTime() { return config.getInt("Mob_Healthbar.Display_Time", 3); }
/* Database Purging */
public int getPurgeInterval() { return config.getInt("Database_Purging.Purge_Interval", -1); }
public int getOldUsersCutoff() { return config.getInt("Database_Purging.Old_User_Cutoff", 6); }
@@ -108,6 +121,7 @@ public class Config extends AutoUpdateConfigLoader {
public boolean getChimaeraPreventUseUnderground() { return config.getBoolean("Items.Chimaera_Wing.Prevent_Use_Underground", true); }
public int getChimaeraCooldown() { return config.getInt("Items.Chimaera_Wing.Cooldown", 240); }
public int getChimaeraWarmup() { return config.getInt("Items.Chimaera_Wing.Warmup", 5); }
public int getChimaeraRecentlyHurtCooldown() { return config.getInt("Items.Chimaera_Wing.RecentlyHurt_Cooldown", 60); }
/* Particles */
public boolean getAbilityActivationEffectEnabled() { return config.getBoolean("Particles.Ability_Activation", true); }
@@ -115,6 +129,8 @@ public class Config extends AutoUpdateConfigLoader {
public boolean getDodgeEffectEnabled() { return config.getBoolean("Particles.Dodge", true); }
public boolean getBleedEffectEnabled() { return config.getBoolean("Particles.Bleed", true); }
public boolean getGreaterImpactEffectEnabled() { return config.getBoolean("Particles.Greater_Impact", true); }
public boolean getLevelUpEffectsEnabled() { return config.getBoolean("Particles.LevelUp_Enabled", true); }
public int getLevelUpEffectsTier() { return config.getInt("Particles.LevelUp_Tier", 100); }
/* PARTY SETTINGS */
public int getAutoPartyKickInterval() { return config.getInt("Party.AutoKick_Interval", 12); }
@@ -127,7 +143,9 @@ public class Config extends AutoUpdateConfigLoader {
public double getPartyShareRange() { return config.getDouble("Party.Sharing.Range", 75.0); }
/* Party Teleport Settings */
public int getPTPCommandCooldown() { return config.getInt("Commands.ptp.Cooldown", 30); }
public int getPTPCommandCooldown() { return config.getInt("Commands.ptp.Cooldown", 120); }
public int getPTPCommandWarmup() { return config.getInt("Commands.ptp.Warmup", 5); }
public int getPTPCommandRecentlyHurtCooldown() { return config.getInt("Commands.ptp.RecentlyHurt_Cooldown", 60); }
public int getPTPCommandTimeout() { return config.getInt("Commands.ptp.Request_Timeout", 300); }
public boolean getPTPCommandConfirmRequired() { return config.getBoolean("Commands.ptp.Confirm_Required", true); }
public boolean getPTPCommandWorldPermissions() { return config.getBoolean("Commands.ptp.World_Based_Permissions", false); }

View File

@@ -11,6 +11,7 @@ public class HiddenConfig {
private static boolean chunkletsEnabled;
private static int conversionRate;
private static boolean useEnchantmentBuffs;
private static boolean resendChunksAfterBlockAbility;
public HiddenConfig(String fileName) {
HiddenConfig.fileName = fileName;
@@ -31,6 +32,7 @@ public class HiddenConfig {
chunkletsEnabled = config.getBoolean("Options.Chunklets", true);
conversionRate = config.getInt("Options.ConversionRate", 1);
useEnchantmentBuffs = config.getBoolean("Options.EnchantmentBuffs", true);
resendChunksAfterBlockAbility = config.getBoolean("Options.RefreshChunks", false);
}
}
@@ -45,4 +47,8 @@ public class HiddenConfig {
public boolean useEnchantmentBuffs() {
return useEnchantmentBuffs;
}
public boolean resendChunksAfterBlockAbility() {
return resendChunksAfterBlockAbility;
}
}

View File

@@ -6,11 +6,9 @@ import com.gmail.nossr50.datatypes.spout.huds.HudType;
public class SpoutConfig extends ConfigLoader {
private static SpoutConfig instance;
public HudType defaultHudType;
private SpoutConfig() {
super("spout.yml");
loadKeys();
}
public static SpoutConfig getInstance() {
@@ -24,17 +22,14 @@ public class SpoutConfig extends ConfigLoader {
@Override
protected void loadKeys() {
// Setup default HUD
String temp = config.getString("Spout.HUD.Default", "STANDARD");
}
for (HudType hudType : HudType.values()) {
if (hudType.toString().equalsIgnoreCase(temp)) {
defaultHudType = hudType;
break;
}
public HudType getDefaultHudType() {
try {
return HudType.valueOf(config.getString("Spout.HUD.Default", "STANDARD").toUpperCase().trim());
}
if (defaultHudType == null) {
defaultHudType = HudType.STANDARD;
catch (IllegalArgumentException ex) {
return HudType.STANDARD;
}
}

View File

@@ -9,13 +9,17 @@ import java.util.Set;
import org.bukkit.Material;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.EntityType;
import org.bukkit.inventory.ItemStack;
import org.bukkit.material.MaterialData;
import org.bukkit.potion.Potion;
import org.bukkit.potion.PotionType;
import com.gmail.nossr50.config.ConfigLoader;
import com.gmail.nossr50.datatypes.treasure.ExcavationTreasure;
import com.gmail.nossr50.datatypes.treasure.FishingTreasure;
import com.gmail.nossr50.datatypes.treasure.HylianTreasure;
import com.gmail.nossr50.datatypes.treasure.ShakeTreasure;
import com.gmail.nossr50.datatypes.treasure.Treasure;
public class TreasureConfig extends ConfigLoader {
@@ -33,6 +37,27 @@ public class TreasureConfig extends ConfigLoader {
public List<HylianTreasure> hylianFromFlowers = new ArrayList<HylianTreasure>();
public List<HylianTreasure> hylianFromPots = new ArrayList<HylianTreasure>();
public List<ShakeTreasure> shakeFromBlaze = new ArrayList<ShakeTreasure>();
public List<ShakeTreasure> shakeFromCaveSpider = new ArrayList<ShakeTreasure>();
public List<ShakeTreasure> shakeFromSpider = new ArrayList<ShakeTreasure>();
public List<ShakeTreasure> shakeFromChicken = new ArrayList<ShakeTreasure>();
public List<ShakeTreasure> shakeFromCow = new ArrayList<ShakeTreasure>();
public List<ShakeTreasure> shakeFromCreeper = new ArrayList<ShakeTreasure>();
public List<ShakeTreasure> shakeFromEnderman = new ArrayList<ShakeTreasure>();
public List<ShakeTreasure> shakeFromGhast = new ArrayList<ShakeTreasure>();
public List<ShakeTreasure> shakeFromIronGolem = new ArrayList<ShakeTreasure>();
public List<ShakeTreasure> shakeFromMagmaCube = new ArrayList<ShakeTreasure>();
public List<ShakeTreasure> shakeFromMushroomCow = new ArrayList<ShakeTreasure>();
public List<ShakeTreasure> shakeFromPig = new ArrayList<ShakeTreasure>();
public List<ShakeTreasure> shakeFromPigZombie = new ArrayList<ShakeTreasure>();
public List<ShakeTreasure> shakeFromSheep = new ArrayList<ShakeTreasure>();
public List<ShakeTreasure> shakeFromSkeleton = new ArrayList<ShakeTreasure>();
public List<ShakeTreasure> shakeFromSlime = new ArrayList<ShakeTreasure>();
public List<ShakeTreasure> shakeFromSnowman = new ArrayList<ShakeTreasure>();
public List<ShakeTreasure> shakeFromSquid = new ArrayList<ShakeTreasure>();
public List<ShakeTreasure> shakeFromWitch = new ArrayList<ShakeTreasure>();
public List<ShakeTreasure> shakeFromZombie = new ArrayList<ShakeTreasure>();
public List<FishingTreasure> fishingRewards = new ArrayList<FishingTreasure>();
private TreasureConfig() {
@@ -128,15 +153,32 @@ public class TreasureConfig extends ConfigLoader {
reason.add("Invalid Drop_Level: " + dropLevel);
}
/*
* Potions
*/
ItemStack item = null;
if (config.contains("Treasures." + treasureName + ".Potion_Type")) {
String potionType = config.getString("Treasures." + treasureName + ".Potion_Type");
try {
item = new Potion(PotionType.valueOf(potionType.toUpperCase())).toItemStack(amount);
}
catch (IllegalArgumentException ex) {
reason.add("Invalid Potion_Type: " + potionType);
}
}
else {
item = (new MaterialData(id, (byte) data)).toItemStack(amount);
}
/*
* Drops From & Max Level
*/
ItemStack item = (new MaterialData(id, (byte) data)).toItemStack(amount);
if (config.getBoolean("Treasures." + treasureName + ".Drops_From.Fishing", false)) {
if (config.getConfigurationSection("Treasures." + treasureName + ".Drops_From").getKeys(false).size() != 1) {
reason.add("Fishing drops cannot also be excavation drops");
reason.add("This can only be a fishing drop.");
}
if (!config.contains("Treasures." + treasureName + ".Max_Level")) {
@@ -150,6 +192,30 @@ public class TreasureConfig extends ConfigLoader {
treasures.put(treasureName, fTreasure);
}
}
else if (config.getBoolean("Treasures." + treasureName + "Drops_From.Shake", false)) {
if (config.getConfigurationSection("Treasures." + treasureName + ".Drops_From").getKeys(false).size() != 1) {
reason.add("This can only be a shake drop.");
}
if (!config.contains("Treasures." + treasureName + ".Mob")) {
reason.add("Missing Mob");
}
String mobType = config.getString("Treasures." + treasureName + ".Mob");
EntityType mob = null;
try {
mob = EntityType.valueOf(mobType.toUpperCase().trim());
}
catch (IllegalArgumentException ex){
reason.add("Invalid Mob: " + mobType);
}
if (noErrorsInTreasure(reason)) {
ShakeTreasure sTreasure = new ShakeTreasure(item, xp, dropChance, dropLevel, mob);
treasures.put(treasureName, sTreasure);
}
}
else {
ExcavationTreasure eTreasure = new ExcavationTreasure(item, xp, dropChance, dropLevel);
HylianTreasure hTreasure = new HylianTreasure(item, xp, dropChance, dropLevel);
@@ -195,7 +261,11 @@ public class TreasureConfig extends ConfigLoader {
}
if (config.getBoolean("Treasures." + treasureName + ".Drops_From.Fishing", false)) {
reason.add("Excavation drops cannot also be fishing drops");
reason.add("This cannot also be a fishing drop.");
}
if (config.getBoolean("Treasures." + treasureName + ".Drops_From.Shake", false)) {
reason.add("This cannot also be a shake drop.");
}
if (noErrorsInTreasure(reason) && hTreasure.getDropsFrom() == (byte) 0x0) {
@@ -210,6 +280,7 @@ public class TreasureConfig extends ConfigLoader {
List<String> excavationTreasures = config.getStringList("Excavation.Treasure");
List<String> fishingTreasures = config.getStringList("Fishing.Treasure");
List<String> hylianTreasures = config.getStringList("Hylian_Luck.Treasure");
List<String> shakeTreasures = config.getStringList("Shake.Treasure");
for (Entry<String, Treasure> nextEntry : treasures.entrySet()) {
String treasureKey = nextEntry.getKey();
@@ -222,6 +293,97 @@ public class TreasureConfig extends ConfigLoader {
fishingRewards.add((FishingTreasure) treasure);
}
else if (treasure instanceof ShakeTreasure) {
if (shakeTreasures == null || !shakeTreasures.contains(treasureKey)) {
continue;
}
ShakeTreasure e = (ShakeTreasure) treasure;
switch (e.getMob()) {
case BLAZE:
shakeFromBlaze.add(e);
break;
case CAVE_SPIDER:
shakeFromCaveSpider.add(e);
break;
case CHICKEN:
shakeFromChicken.add(e);
break;
case COW:
shakeFromCow.add(e);
break;
case CREEPER:
shakeFromCreeper.add(e);
break;
case ENDERMAN:
shakeFromEnderman.add(e);
break;
case GHAST:
shakeFromGhast.add(e);
break;
case IRON_GOLEM:
shakeFromIronGolem.add(e);
break;
case MAGMA_CUBE:
shakeFromMagmaCube.add(e);
break;
case MUSHROOM_COW:
shakeFromMushroomCow.add(e);
break;
case PIG:
shakeFromPig.add(e);
break;
case PIG_ZOMBIE:
shakeFromPigZombie.add(e);
break;
case SHEEP:
shakeFromSheep.add(e);
break;
case SKELETON:
shakeFromSkeleton.add(e);
break;
case SLIME:
shakeFromSlime.add(e);
break;
case SPIDER:
shakeFromSpider.add(e);
break;
case SNOWMAN:
shakeFromSnowman.add(e);
break;
case SQUID:
shakeFromSquid.add(e);
break;
case WITCH:
shakeFromWitch.add(e);
break;
case ZOMBIE:
shakeFromZombie.add(e);
break;
default:
break;
}
}
else if (treasure instanceof HylianTreasure) {
if (hylianTreasures == null || !hylianTreasures.contains(treasureKey)) {
continue;

View File

@@ -96,6 +96,7 @@ public final class DatabaseManager {
write("CREATE TABLE IF NOT EXISTS `" + tablePrefix + "huds` ("
+ "`user_id` int(10) unsigned NOT NULL,"
+ "`hudtype` varchar(50) NOT NULL DEFAULT 'STANDARD',"
+ "`mobhealthbar` varchar(50) NOT NULL DEFAULT 'HEARTS',"
+ "PRIMARY KEY (`user_id`),"
+ "FOREIGN KEY (`user_id`) REFERENCES `" + tablePrefix + "users` (`id`) "
+ "ON DELETE CASCADE) ENGINE=MyISAM DEFAULT CHARSET=latin1;");
@@ -153,6 +154,7 @@ public final class DatabaseManager {
checkDatabaseStructure(DatabaseUpdateType.BLAST_MINING);
checkDatabaseStructure(DatabaseUpdateType.CASCADE_DELETE);
checkDatabaseStructure(DatabaseUpdateType.INDEX);
checkDatabaseStructure(DatabaseUpdateType.MOB_HEALTHBARS);
}
/**
@@ -413,9 +415,10 @@ public final class DatabaseManager {
String skillName = skillType.name().toLowerCase();
String sql = "SELECT COUNT(*) AS rank FROM " + tablePrefix + "users JOIN " + tablePrefix + "skills ON user_id = id WHERE " + skillName + " > 0 " +
"AND " + skillName + " > (SELECT " + skillName + " FROM " + tablePrefix + "users JOIN " + tablePrefix + "skills ON user_id = id " +
"WHERE user = '" + playerName + "')";
"WHERE user = ?)";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setString(1, playerName);
resultSet = statement.executeQuery();
resultSet.next();
@@ -443,9 +446,10 @@ public final class DatabaseManager {
"WHERE taming+mining+woodcutting+repair+unarmed+herbalism+excavation+archery+swords+axes+acrobatics+fishing > 0 " +
"AND taming+mining+woodcutting+repair+unarmed+herbalism+excavation+archery+swords+axes+acrobatics+fishing > " +
"(SELECT taming+mining+woodcutting+repair+unarmed+herbalism+excavation+archery+swords+axes+acrobatics+fishing " +
"FROM " + tablePrefix + "users JOIN " + tablePrefix + "skills ON user_id = id WHERE user = '" + playerName + "')";
"FROM " + tablePrefix + "users JOIN " + tablePrefix + "skills ON user_id = id WHERE user = ?)";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setString(1, playerName);
resultSet = statement.executeQuery();
resultSet.next();
@@ -457,9 +461,10 @@ public final class DatabaseManager {
"WHERE taming+mining+woodcutting+repair+unarmed+herbalism+excavation+archery+swords+axes+acrobatics+fishing > 0 " +
"AND taming+mining+woodcutting+repair+unarmed+herbalism+excavation+archery+swords+axes+acrobatics+fishing = " +
"(SELECT taming+mining+woodcutting+repair+unarmed+herbalism+excavation+archery+swords+axes+acrobatics+fishing " +
"FROM " + tablePrefix + "users JOIN " + tablePrefix + "skills ON user_id = id WHERE user = '" + playerName + "') ORDER BY user";
"FROM " + tablePrefix + "users JOIN " + tablePrefix + "skills ON user_id = id WHERE user = ?) ORDER BY user";
statement = connection.prepareStatement(sql);
statement.setString(1, playerName);
resultSet = statement.executeQuery();
while (resultSet.next()) {
@@ -571,6 +576,10 @@ public final class DatabaseManager {
}
break;
case MOB_HEALTHBARS:
sql = "SELECT * FROM `" + tablePrefix + "huds` ORDER BY `" + tablePrefix + "huds`.`mobhealthbar` ASC LIMIT 0 , 30";
break;
default:
break;
}
@@ -607,6 +616,11 @@ public final class DatabaseManager {
write("ALTER TABLE `"+tablePrefix + "experience` ADD `fishing` int(10) NOT NULL DEFAULT '0' ;");
break;
case MOB_HEALTHBARS:
mcMMO.p.getLogger().info("Updating mcMMO MySQL tables for mob healthbars...");
write("ALTER TABLE `" + tablePrefix + "huds` ADD `mobhealthbar` varchar(50) NOT NULL DEFAULT 'HEARTS' ;");
break;
default:
break;
}

View File

@@ -0,0 +1,7 @@
package com.gmail.nossr50.datatypes;
public enum MobHealthbarType {
HEARTS,
BAR,
DISABLED;
}

View File

@@ -4,5 +4,6 @@ public enum DatabaseUpdateType {
FISHING,
BLAST_MINING,
CASCADE_DELETE,
INDEX;
INDEX,
MOB_HEALTHBARS;
}

View File

@@ -79,11 +79,12 @@ public class McMMOPlayer {
private Map<ToolType, Boolean> toolMode = new HashMap<ToolType, Boolean>();
private Map<ToolType, Integer> toolATS = new HashMap<ToolType, Integer>();
private int chimaeraWing;
private Location chimaeraWingCommence;
private int recentlyHurt;
private int respawnATS;
private int teleportLastUse;
private Location teleportCommence;
private boolean isUsingUnarmed;
public McMMOPlayer(Player player) {
String playerName = player.getName();
@@ -303,31 +304,31 @@ public class McMMOPlayer {
}
/*
* Chimaera Wing
* Teleportation cooldown & warmup
*/
public int getLastChimaeraTeleport() {
return chimaeraWing;
public int getLastTeleport() {
return teleportLastUse;
}
public void setLastChimaeraTeleport(int value) {
chimaeraWing = value;
public void setLastTeleport(int value) {
teleportLastUse = value;
}
public void actualizeLastChimaeraTeleport() {
chimaeraWing = (int) (System.currentTimeMillis() / Misc.TIME_CONVERSION_FACTOR);
public void actualizeLastTeleport() {
teleportLastUse = (int) (System.currentTimeMillis() / Misc.TIME_CONVERSION_FACTOR);
}
public Location getChimaeraCommenceLocation() {
return chimaeraWingCommence;
public Location getTeleportCommenceLocation() {
return teleportCommence;
}
public void setChimaeraCommenceLocation(Location location) {
chimaeraWingCommence = location;
public void setTeleportCommenceLocation(Location location) {
teleportCommence = location;
}
public void actualizeChimaeraCommenceLocation(Player player) {
setChimaeraCommenceLocation(player.getLocation());
public void actualizeTeleportCommenceLocation(Player player) {
setTeleportCommenceLocation(player.getLocation());
}
/*
@@ -491,6 +492,7 @@ public class McMMOPlayer {
spoutHud.setLastGained(skillType);
}
isUsingUnarmed = skillType == SkillType.UNARMED;
SkillUtils.xpCheckSkill(skillType, player, profile);
}
@@ -642,6 +644,10 @@ public class McMMOPlayer {
partyChatMode = !partyChatMode;
}
public boolean isUsingUnarmed() {
return isUsingUnarmed;
}
/**
* Modifies an experience gain using skill modifiers, global rate and perks
*
@@ -650,11 +656,7 @@ public class McMMOPlayer {
* @return Modified experience
*/
private int modifyXpGain(SkillType skillType, int xp) {
if (player.getGameMode() == GameMode.CREATIVE) {
return 0;
}
if ((skillType.getMaxLevel() < profile.getSkillLevel(skillType) + 1) || (Config.getInstance().getPowerLevelCap() < getPowerLevel() + 1)) {
if (player.getGameMode() == GameMode.CREATIVE || (skillType.getMaxLevel() < profile.getSkillLevel(skillType) + 1) || (Config.getInstance().getPowerLevelCap() < getPowerLevel() + 1)) {
return 0;
}

View File

@@ -13,6 +13,7 @@ import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.config.Config;
import com.gmail.nossr50.config.spout.SpoutConfig;
import com.gmail.nossr50.database.DatabaseManager;
import com.gmail.nossr50.datatypes.MobHealthbarType;
import com.gmail.nossr50.datatypes.skills.AbilityType;
import com.gmail.nossr50.datatypes.skills.SkillType;
import com.gmail.nossr50.datatypes.spout.huds.HudType;
@@ -27,6 +28,7 @@ public class PlayerProfile {
// HUD
private McMMOHud spoutHud;
private HudType hudType;
private MobHealthbarType mobHealthbarType;
// mySQL Stuff
private int userId;
@@ -41,9 +43,10 @@ public class PlayerProfile {
public PlayerProfile(String playerName, boolean addNew) {
this.playerName = playerName;
mobHealthbarType = Config.getInstance().getMobHealthbarDefault();
if (mcMMO.spoutEnabled) {
hudType = SpoutConfig.getInstance().defaultHudType;
hudType = SpoutConfig.getInstance().getDefaultHudType();
}
else {
hudType = HudType.DISABLED;
@@ -91,13 +94,11 @@ public class PlayerProfile {
DatabaseManager.write("INSERT INTO " + tablePrefix + "huds (user_id) VALUES (" + userId + ")");
}
else {
for (HudType type : HudType.values()) {
if (type.toString().equalsIgnoreCase(huds.get(1).get(0))) {
hudType = type;
}
}
hudType = HudType.valueOf(huds.get(1).get(0));
}
mobHealthbarType = MobHealthbarType.valueOf(DatabaseManager.read("SELECT mobhealthbar FROM " + tablePrefix + "huds WHERE user_id = " + userId).get(1).get(0));
HashMap<Integer, ArrayList<String>> cooldowns = DatabaseManager.read("SELECT mining, woodcutting, unarmed, herbalism, excavation, swords, axes, blast_mining FROM " + tablePrefix + "cooldowns WHERE user_id = " + userId);
ArrayList<String> cooldownValues = cooldowns.get(1);
@@ -307,11 +308,7 @@ public class PlayerProfile {
}
if (character.length > 33) {
for (HudType type : HudType.values()) {
if (type.toString().equalsIgnoreCase(character[33])) {
hudType = type;
}
}
hudType = HudType.valueOf(character[33]);
}
if (character.length > 34) {
@@ -326,6 +323,10 @@ public class PlayerProfile {
skillsDATS.put(AbilityType.BLAST_MINING, Integer.valueOf(character[36]));
}
if (character.length > 38) {
mobHealthbarType = MobHealthbarType.valueOf(character[38]);
}
loaded = true;
in.close();
@@ -348,6 +349,7 @@ public class PlayerProfile {
String tablePrefix = Config.getInstance().getMySQLTablePrefix();
DatabaseManager.write("UPDATE " + tablePrefix + "huds SET hudtype = '" + hudType.toString() + "' WHERE user_id = " + userId);
DatabaseManager.write("UPDATE " + tablePrefix + "huds SET mobhealthbar = '" + mobHealthbarType.toString() + "' WHERE user_id = " + userId);
DatabaseManager.write("UPDATE " + tablePrefix + "users SET lastlogin = " + ((int) (timestamp / Misc.TIME_CONVERSION_FACTOR)) + " WHERE id = " + userId);
DatabaseManager.write("UPDATE " + tablePrefix + "cooldowns SET "
+ " mining = " + skillsDATS.get(AbilityType.SUPER_BREAKER)
@@ -443,6 +445,7 @@ public class PlayerProfile {
writer.append(skillsXp.get(SkillType.FISHING)).append(":");
writer.append(skillsDATS.get(AbilityType.BLAST_MINING)).append(":");
writer.append(System.currentTimeMillis() / Misc.TIME_CONVERSION_FACTOR).append(":");
writer.append(mobHealthbarType.toString()).append(":");
writer.append("\r\n");
}
}
@@ -452,6 +455,7 @@ public class PlayerProfile {
// Write the new file
FileWriter out = new FileWriter(location);
out.write(writer.toString());
out.flush();
out.close();
}
catch (Exception e) {
@@ -505,6 +509,7 @@ public class PlayerProfile {
out.append("0:"); // FishingXp
out.append("0:"); // Blast Mining
out.append(String.valueOf(System.currentTimeMillis() / Misc.TIME_CONVERSION_FACTOR)).append(":"); // LastLogin
out.append(mobHealthbarType.toString()).append(":"); // Mob Healthbar HUD
// Add more in the same format as the line above
@@ -548,6 +553,18 @@ public class PlayerProfile {
this.hudType = hudType;
}
/*
* Mob Healthbars
*/
public MobHealthbarType getMobHealthbarType() {
return mobHealthbarType;
}
public void setMobHealthbarType(MobHealthbarType mobHealthbarType) {
this.mobHealthbarType = mobHealthbarType;
}
/*
* Cooldowns
*/
@@ -666,6 +683,20 @@ public class PlayerProfile {
skillsXp.put(skillType, 0);
}
/**
* Add Experience to a skill.
*
* @param skillType Type of skill to add experience to
* @param experience Number of experience to add
*/
public void addExperience(SkillType skillType, int experience) {
if (skillType.isChildSkill()) {
return;
}
skillsXp.put(skillType, skillsXp.get(skillType) + experience);
}
/**
* Get the amount of Xp remaining before the next level.
*

View File

@@ -1,5 +1,9 @@
package com.gmail.nossr50.datatypes.skills;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.bukkit.Color;
import com.gmail.nossr50.mcMMO;
@@ -20,6 +24,8 @@ import com.gmail.nossr50.skills.taming.TamingManager;
import com.gmail.nossr50.skills.unarmed.UnarmedManager;
import com.gmail.nossr50.skills.woodcutting.WoodcuttingManager;
import com.gmail.nossr50.util.StringUtils;
import com.gmail.nossr50.util.skills.SkillUtils;
import com.google.common.collect.ImmutableList;
public enum SkillType {
ACROBATICS(AcrobaticsManager.class, Color.WHITE),
@@ -41,6 +47,19 @@ public enum SkillType {
private AbilityType ability;
private ToolType tool;
public static final List<String> SKILL_NAMES;
static {
ArrayList<String> names = new ArrayList<String>();
for (SkillType skill : values()) {
names.add(SkillUtils.getSkillName(skill));
}
Collections.sort(names);
SKILL_NAMES = ImmutableList.copyOf(names);
}
private SkillType(Class<? extends SkillManager> managerClass, Color runescapeColor) {
this.managerClass = managerClass;
this.runescapeColor = runescapeColor;

View File

@@ -0,0 +1,21 @@
package com.gmail.nossr50.datatypes.treasure;
import org.bukkit.entity.EntityType;
import org.bukkit.inventory.ItemStack;
public class ShakeTreasure extends Treasure {
private EntityType mob;
public ShakeTreasure(ItemStack drop, int xp, double dropChance, int dropLevel, EntityType mob) {
super(drop, xp, dropChance, dropLevel);
this.mob = mob;
}
public EntityType getMob() {
return mob;
}
public void setMob(EntityType mob) {
this.mob = mob;
}
}

View File

@@ -17,6 +17,14 @@ public class McMMOPlayerLevelUpEvent extends McMMOPlayerExperienceEvent {
public McMMOPlayerLevelUpEvent(Player player, SkillType skill, int levelsGained) {
super(player, skill);
this.setLevelsGained(levelsGained);
}
/**
* @param levelsGained
* @return Set the number of levels gained in this event
*/
public void setLevelsGained(int levelsGained) {
this.levelsGained = levelsGained;
}

View File

@@ -63,7 +63,7 @@ public class BlockListener implements Listener {
Block futureEmptyBlock = event.getBlock().getRelative(direction); // Block that would be air after piston is finished
for (Block b : blocks) {
if (mcMMO.placeStore.isTrue(b)) {
if (BlockUtils.shouldBeWatched(b.getState()) && mcMMO.placeStore.isTrue(b)) {
b.getRelative(direction).setMetadata(mcMMO.blockMetadataKey, mcMMO.metadataValue);
if (b.equals(futureEmptyBlock)) {
mcMMO.placeStore.setFalse(b);
@@ -129,18 +129,19 @@ public class BlockListener implements Listener {
return;
}
Player player = event.getPlayer();
BlockState blockState = event.getBlock().getState();
if (Misc.isNPCEntity(player)) {
if (!BlockUtils.shouldBeWatched(blockState)) {
return;
}
if (player.getGameMode() == GameMode.CREATIVE) {
Player player = event.getPlayer();
if (Misc.isNPCEntity(player) || player.getGameMode() == GameMode.CREATIVE) {
return;
}
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
BlockState blockState = event.getBlock().getState();
ItemStack heldItem = player.getItemInHand();
/* HERBALISM */
@@ -190,9 +191,7 @@ public class BlockListener implements Listener {
}
/* Remove metadata from placed watched blocks */
if (BlockUtils.shouldBeWatched(blockState) && mcMMO.placeStore.isTrue(blockState)) {
mcMMO.placeStore.setFalse(blockState);
}
mcMMO.placeStore.setFalse(blockState);
}
/**
@@ -208,11 +207,7 @@ public class BlockListener implements Listener {
Player player = event.getPlayer();
if (Misc.isNPCEntity(player)) {
return;
}
if (player.getGameMode() == GameMode.CREATIVE) {
if (Misc.isNPCEntity(player) || player.getGameMode() == GameMode.CREATIVE) {
return;
}

View File

@@ -1,5 +1,6 @@
package com.gmail.nossr50.listeners;
import org.bukkit.OfflinePlayer;
import org.bukkit.block.Block;
import org.bukkit.entity.AnimalTamer;
import org.bukkit.entity.Entity;
@@ -106,7 +107,7 @@ public class EntityListener implements Listener {
else if (attacker instanceof Tameable) {
AnimalTamer animalTamer = ((Tameable) attacker).getOwner();
if (animalTamer != null) {
if (animalTamer != null && ((OfflinePlayer) animalTamer).isOnline()) {
attacker = (Entity) animalTamer;
}
}
@@ -317,14 +318,15 @@ public class EntityListener implements Listener {
public void onExplosionPrime(ExplosionPrimeEvent event) {
Entity entity = event.getEntity();
if (entity instanceof TNTPrimed) {
int id = entity.getEntityId();
if (entity instanceof TNTPrimed && entity.hasMetadata(mcMMO.tntMetadataKey)) {
// We can make this assumption because we (should) be the only ones using this exact metadata
Player player = plugin.getServer().getPlayer(entity.getMetadata(mcMMO.tntMetadataKey).get(0).asString());
if (!plugin.tntIsTracked(id)) {
if (Misc.isNPCEntity(player)) {
return;
}
MiningManager miningManager = UserManager.getPlayer(plugin.getTNTPlayer(id)).getMiningManager();
MiningManager miningManager = UserManager.getPlayer(player).getMiningManager();
if (miningManager.canUseBiggerBombs()) {
event.setRadius(miningManager.biggerBombs(event.getRadius()));
@@ -341,21 +343,20 @@ public class EntityListener implements Listener {
public void onEnitityExplode(EntityExplodeEvent event) {
Entity entity = event.getEntity();
if (entity instanceof TNTPrimed) {
int id = entity.getEntityId();
if (entity instanceof TNTPrimed && entity.hasMetadata(mcMMO.tntMetadataKey)) {
// We can make this assumption because we (should) be the only ones using this exact metadata
Player player = plugin.getServer().getPlayer(entity.getMetadata(mcMMO.tntMetadataKey).get(0).asString());
if (!plugin.tntIsTracked(id)) {
if (Misc.isNPCEntity(player)) {
return;
}
MiningManager miningManager = UserManager.getPlayer(plugin.getTNTPlayer(id)).getMiningManager();
MiningManager miningManager = UserManager.getPlayer(player).getMiningManager();
if (miningManager.canUseBlastMining()) {
miningManager.blastMiningDropProcessing(event.getYield(), event.blockList());
event.setYield(0);
}
plugin.removeFromTNTTracker(id);
}
}

View File

@@ -41,6 +41,7 @@ import com.gmail.nossr50.skills.herbalism.HerbalismManager;
import com.gmail.nossr50.skills.mining.MiningManager;
import com.gmail.nossr50.skills.repair.Repair;
import com.gmail.nossr50.skills.taming.TamingManager;
import com.gmail.nossr50.skills.unarmed.Unarmed;
import com.gmail.nossr50.util.BlockUtils;
import com.gmail.nossr50.util.ChimaeraWing;
import com.gmail.nossr50.util.HardcoreManager;
@@ -58,6 +59,18 @@ public class PlayerListener implements Listener {
this.plugin = plugin;
}
@EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
public void onPlayerDeathLowest(PlayerDeathEvent event) {
String deathMessage = event.getDeathMessage();
if (deathMessage == null) {
mcMMO.p.getLogger().severe("You have another plugin causing null death messages. mcMMO cannot process this death message.");
return;
}
event.setDeathMessage(deathMessage.replaceAll("(?:\u00A7(?:[0-9A-FK-ORa-fk-or]){1}(?:[\u2764\u25A0]{1,10})){1,2}", "a mob"));
}
/**
* Monitor PlayerDeath events.
*
@@ -164,6 +177,12 @@ public class PlayerListener implements Listener {
FishingManager fishingManager = UserManager.getPlayer(player).getFishingManager();
switch (event.getState()) {
case FISHING:
if (fishingManager.canMasterAngler()) {
fishingManager.masterAngler(event.getHook());
}
break;
case CAUGHT_FISH:
fishingManager.handleFishing((Item) event.getCaught());
@@ -193,7 +212,8 @@ public class PlayerListener implements Listener {
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onPlayerPickupItem(PlayerPickupItemEvent event) {
Player player = event.getPlayer();
Item item = event.getItem();
Item drop = event.getItem();
ItemStack dropStack = drop.getItemStack();
if (Misc.isNPCEntity(player)) {
return;
@@ -201,8 +221,21 @@ public class PlayerListener implements Listener {
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
if (mcMMOPlayer.inParty() && ItemUtils.isShareable(item.getItemStack())) {
ShareHandler.handleItemShare(event, mcMMOPlayer);
if (mcMMOPlayer.inParty() && ItemUtils.isShareable(dropStack)) {
event.setCancelled(ShareHandler.handleItemShare(drop, mcMMOPlayer));
if (event.isCancelled()) {
return;
}
}
if (mcMMOPlayer.isUsingUnarmed() && ItemUtils.isShareable(dropStack)) {
event.setCancelled(Unarmed.handleItemPickup(player.getInventory(), drop));
if (event.isCancelled()) {
player.updateInventory();
return;
}
}
}
@@ -279,11 +312,7 @@ public class PlayerListener implements Listener {
public void onPlayerInteractLowest(PlayerInteractEvent event) {
Player player = event.getPlayer();
if (Misc.isNPCEntity(player)) {
return;
}
if (player.getGameMode() == GameMode.CREATIVE) {
if (Misc.isNPCEntity(player) || player.getGameMode() == GameMode.CREATIVE) {
return;
}
@@ -342,11 +371,7 @@ public class PlayerListener implements Listener {
public void onPlayerInteract(PlayerInteractEvent event) {
Player player = event.getPlayer();
if (Misc.isNPCEntity(player)) {
return;
}
if (player.getGameMode() == GameMode.CREATIVE) {
if (Misc.isNPCEntity(player) || player.getGameMode() == GameMode.CREATIVE) {
return;
}
@@ -449,6 +474,7 @@ public class PlayerListener implements Listener {
return;
}
boolean isAsync = event.isAsynchronous();
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
if (mcMMOPlayer.getPartyChatMode()) {
@@ -459,11 +485,11 @@ public class PlayerListener implements Listener {
return;
}
ChatManager.handlePartyChat(plugin, party, player.getName(), player.getDisplayName(), event.getMessage(), true);
ChatManager.handlePartyChat(plugin, party, player.getName(), player.getDisplayName(), event.getMessage(), isAsync);
event.setCancelled(true);
}
else if (mcMMOPlayer.getAdminChatMode()) {
ChatManager.handleAdminChat(plugin, player.getName(), player.getDisplayName(), event.getMessage(), true);
ChatManager.handleAdminChat(plugin, player.getName(), player.getDisplayName(), event.getMessage(), isAsync);
event.setCancelled(true);
}
}

View File

@@ -1,20 +1,36 @@
package com.gmail.nossr50.listeners;
import java.util.Calendar;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import com.gmail.nossr50.config.Config;
import com.gmail.nossr50.events.experience.McMMOPlayerLevelUpEvent;
import com.gmail.nossr50.util.skills.ParticleEffectUtils;
public class SelfListener implements Listener {
protected Player player;
protected float skillValue;
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onPlayerLevelUp(McMMOPlayerLevelUpEvent event) {
Calendar today = Calendar.getInstance();
if (today.get(Calendar.MONTH) == Calendar.APRIL && today.get(Calendar.DAY_OF_MONTH) == 1) {
ParticleEffectUtils.runescapeModeCelebration(event.getPlayer(), event.getSkill());
if (!Config.getInstance().getLevelUpEffectsEnabled()) {
return;
}
int tier = Config.getInstance().getLevelUpEffectsTier();
if (tier <= 0) {
return;
}
player = event.getPlayer();
skillValue = event.getSkillLevel();
if ((skillValue % tier) == 0) {
ParticleEffectUtils.runescapeModeCelebration(player, event.getSkill());
}
}
}

View File

@@ -3,7 +3,6 @@ package com.gmail.nossr50;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import net.shatteredlands.shatt.backup.ZipLibrary;
@@ -25,6 +24,8 @@ import com.gmail.nossr50.config.spout.SpoutConfig;
import com.gmail.nossr50.config.treasure.TreasureConfig;
import com.gmail.nossr50.database.DatabaseManager;
import com.gmail.nossr50.database.LeaderboardManager;
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.datatypes.skills.AbilityType;
import com.gmail.nossr50.listeners.BlockListener;
import com.gmail.nossr50.listeners.EntityListener;
import com.gmail.nossr50.listeners.InventoryListener;
@@ -37,7 +38,6 @@ import com.gmail.nossr50.party.PartyManager;
import com.gmail.nossr50.runnables.SaveTimerTask;
import com.gmail.nossr50.runnables.database.UserPurgeTask;
import com.gmail.nossr50.runnables.party.PartyAutoKickTask;
import com.gmail.nossr50.runnables.party.PartyLoaderTask;
import com.gmail.nossr50.runnables.skills.BleedTimerTask;
import com.gmail.nossr50.runnables.skills.SkillMonitorTask;
import com.gmail.nossr50.skills.child.ChildConfig;
@@ -63,8 +63,6 @@ public class mcMMO extends JavaPlugin {
private final SelfListener selfListener = new SelfListener();
private final WorldListener worldListener = new WorldListener();
private HashMap<Integer, String> tntTracker = new HashMap<Integer, String>();
public static mcMMO p;
public static ChunkManager placeStore;
@@ -89,10 +87,14 @@ public class mcMMO extends JavaPlugin {
private boolean xpEventEnabled = false;
// Metadata Values
public static FixedMetadataValue metadataValue;
public final static String entityMetadataKey = "mcMMO: Spawned Entity";
public final static String blockMetadataKey = "mcMMO: Piston Tracking";
public final static String entityMetadataKey = "mcMMO: Spawned Entity";
public final static String blockMetadataKey = "mcMMO: Piston Tracking";
public final static String furnaceMetadataKey = "mcMMO: Tracked Furnace";
public final static String tntMetadataKey = "mcMMO: Tracked TNT";
public final static String customNameKey = "mcMMO: Custom Name";
public final static String customVisibleKey = "mcMMO: Name Visibility";
public static FixedMetadataValue metadataValue;
/**
* Things to be run when the plugin is enabled.
@@ -115,6 +117,8 @@ public class mcMMO extends JavaPlugin {
registerEvents();
registerCustomRecipes();
PartyManager.loadParties();
// Setup the leader boards
if (Config.getInstance().getUseMySQL()) {
// TODO: Why do we have to check for a connection that hasn't be made yet?
@@ -126,7 +130,7 @@ public class mcMMO extends JavaPlugin {
}
for (Player player : getServer().getOnlinePlayers()) {
UserManager.addUser(player); // In case of reload add all users back into PlayerProfile
UserManager.addUser(player); // In case of reload add all users back into UserManager
}
getLogger().info("Version " + getDescription().getVersion() + " is enabled!");
@@ -164,10 +168,11 @@ public class mcMMO extends JavaPlugin {
@Override
public void onDisable() {
try {
UserManager.saveAll(); // Make sure to save player information if the server shuts down
PartyManager.saveParties();
placeStore.saveAll(); // Save our metadata
placeStore.cleanUp(); // Cleanup empty metadata stores
reloadDisableHelper(); // Prevent Berserk from getting "stuck"
UserManager.saveAll(); // Make sure to save player information if the server shuts down
PartyManager.saveParties(); // Save our parties
placeStore.saveAll(); // Save our metadata
placeStore.cleanUp(); // Cleanup empty metadata stores
}
catch (NullPointerException e) {}
@@ -196,45 +201,6 @@ public class mcMMO extends JavaPlugin {
getLogger().info("Was disabled."); // How informative!
}
/**
* Add a set of values to the TNT tracker.
*
* @param tntID The EntityID of the TNT
* @param playerName The name of the detonating player
*/
public void addToTNTTracker(int tntID, String playerName) {
tntTracker.put(tntID, playerName);
}
/**
* Check to see if a given TNT Entity is tracked.
*
* @param tntID The EntityID of the TNT
* @return true if the TNT is being tracked, false otherwise
*/
public boolean tntIsTracked(int tntID) {
return tntTracker.containsKey(tntID);
}
/**
* Get the player who detonated the TNT.
*
* @param tntID The EntityID of the TNT
* @return the Player who detonated it
*/
public Player getTNTPlayer(int tntID) {
return getServer().getPlayer(tntTracker.get(tntID));
}
/**
* Remove TNT from the tracker after it explodes.
*
* @param tntID The EntityID of the TNT
*/
public void removeFromTNTTracker(int tntID) {
tntTracker.remove(tntID);
}
public static String getMainDirectory() {
return mainDirectory;
}
@@ -391,6 +357,7 @@ public class mcMMO extends JavaPlugin {
CommandRegistrationManager.registerHardcoreCommand();
CommandRegistrationManager.registerVampirismCommand();
CommandRegistrationManager.registerMcnotifyCommand();
CommandRegistrationManager.registerMobhealthCommand();
// Spout commands
CommandRegistrationManager.registerXplockCommand();
@@ -404,9 +371,6 @@ public class mcMMO extends JavaPlugin {
}
private void scheduleTasks() {
// Parties are loaded at the end of first server tick otherwise Server.getOfflinePlayer throws an IndexOutOfBoundsException
new PartyLoaderTask().runTaskLater(this, 0);
// Periodic save timer (Saves every 10 minutes by default)
long saveIntervalTicks = Config.getInstance().getSaveInterval() * 1200;
@@ -444,4 +408,17 @@ public class mcMMO extends JavaPlugin {
partyAutoKickTask.runTaskTimer(this, kickIntervalTicks, kickIntervalTicks);
}
}
/**
* Because /reload is the biggest piece of garbage in existence,
* we have to do some special checks to keep it from breaking everything.
*/
private void reloadDisableHelper() {
for (McMMOPlayer mcMMOPlayer : UserManager.getPlayers().values()) {
if (mcMMOPlayer.getAbilityMode(AbilityType.BERSERK)) {
mcMMOPlayer.setAbilityMode(AbilityType.BERSERK, false);
mcMMOPlayer.getPlayer().setCanPickupItems(true);
}
}
}
}

View File

@@ -15,6 +15,7 @@ import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.events.party.McMMOPartyChangeEvent;
import com.gmail.nossr50.events.party.McMMOPartyChangeEvent.EventReason;
import com.gmail.nossr50.locale.LocaleLoader;
import com.gmail.nossr50.runnables.party.PartyLoaderTask;
import com.gmail.nossr50.util.Misc;
import com.gmail.nossr50.util.player.UserManager;
@@ -84,7 +85,7 @@ public final class PartyManager {
List<Player> nearMembers = new ArrayList<Player>();
if (party != null) {
for (Player member : party.getOnlineMembers()) {
if (!player.getName().equalsIgnoreCase(member.getName()) && Misc.isNear(player.getLocation(), member.getLocation(), range)) {
if (!player.getName().equalsIgnoreCase(member.getName()) && !member.isDead() && Misc.isNear(player.getLocation(), member.getLocation(), range)) {
nearMembers.add(member);
}
}
@@ -438,6 +439,14 @@ public final class PartyManager {
* Load party file.
*/
public static void loadParties() {
try {
mcMMO.p.getServer().getOfflinePlayer("nossr50"); // TODO: Find a less-hacky way to manage reloading.
}
catch (IndexOutOfBoundsException ex){
new PartyLoaderTask().runTaskLater(mcMMO.p, 0);
return;
}
File file = new File(partiesFilePath);
if (!file.exists()) {

View File

@@ -4,7 +4,6 @@ import java.util.List;
import org.bukkit.entity.Item;
import org.bukkit.entity.Player;
import org.bukkit.event.player.PlayerPickupItemEvent;
import org.bukkit.inventory.ItemStack;
import com.gmail.nossr50.config.Config;
@@ -91,9 +90,8 @@ public final class ShareHandler {
* @param mcMMOPlayer Player who picked up the item
* @return True if the item has been shared
*/
public static boolean handleItemShare(PlayerPickupItemEvent event, McMMOPlayer mcMMOPlayer) {
Item item = event.getItem();
ItemStack itemStack = item.getItemStack();
public static boolean handleItemShare(Item drop, McMMOPlayer mcMMOPlayer) {
ItemStack itemStack = drop.getItemStack();
Party party = mcMMOPlayer.getParty();
Player player = mcMMOPlayer.getPlayer();
Player winningPlayer = null;
@@ -126,8 +124,7 @@ public final class ShareHandler {
nearMembers.add(player);
partySize = nearMembers.size();
event.setCancelled(true);
item.remove();
drop.remove();
int itemWeight = ItemWeightConfig.getInstance().getItemWeight(itemStack.getType());
for (int i = 0; i < itemStack.getAmount(); i++) {
@@ -172,8 +169,7 @@ public final class ShareHandler {
partySize = nearMembers.size() + 1;
event.setCancelled(true);
item.remove();
drop.remove();
for (int i = 0; i < itemStack.getAmount(); i++) {
int randomMember = Misc.getRandom().nextInt(partySize);

View File

@@ -0,0 +1,30 @@
package com.gmail.nossr50.runnables;
import org.bukkit.entity.LivingEntity;
import org.bukkit.scheduler.BukkitRunnable;
import com.gmail.nossr50.mcMMO;
public class MobHealthDisplayUpdaterTask extends BukkitRunnable {
private LivingEntity target;
private String oldName;
private boolean oldNameVisible;
public MobHealthDisplayUpdaterTask(LivingEntity target) {
if (target.isValid()) {
this.target = target;
this.oldName = target.getMetadata(mcMMO.customNameKey).get(0).asString();
this.oldNameVisible = target.getMetadata(mcMMO.customVisibleKey).get(0).asBoolean();
}
}
@Override
public void run() {
if (target.isValid()) {
target.setCustomNameVisible(oldNameVisible);
target.setCustomName(oldName);
target.removeMetadata(mcMMO.customNameKey, mcMMO.p);
target.removeMetadata(mcMMO.customVisibleKey, mcMMO.p);
}
}
}

View File

@@ -3,11 +3,14 @@ package com.gmail.nossr50.runnables.items;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.scheduler.BukkitRunnable;
import com.gmail.nossr50.config.Config;
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.locale.LocaleLoader;
import com.gmail.nossr50.util.ChimaeraWing;
import com.gmail.nossr50.util.ItemUtils;
import com.gmail.nossr50.util.Misc;
import com.gmail.nossr50.util.skills.SkillUtils;
@@ -25,25 +28,30 @@ public class ChimaeraWingWarmup extends BukkitRunnable {
private void checkChimaeraWingTeleport() {
Player player = mcMMOPlayer.getPlayer();
Location previousLocation = mcMMOPlayer.getChimaeraCommenceLocation();
Location previousLocation = mcMMOPlayer.getTeleportCommenceLocation();
Location newLocation = mcMMOPlayer.getPlayer().getLocation();
long recentlyHurt = mcMMOPlayer.getRecentlyHurt();
ItemStack inHand = player.getItemInHand();
if (newLocation.distanceSquared(previousLocation) > 1.0) {
player.sendMessage(ChatColor.RED + "Teleportation canceled!"); //TODO Locale!
mcMMOPlayer.setTeleportCommenceLocation(null);
mcMMOPlayer.setChimaeraCommenceLocation(null);
if (newLocation.distanceSquared(previousLocation) > 1.0 || !player.getInventory().containsAtLeast(ChimaeraWing.getChimaeraWing(0), 1)) {
player.sendMessage(ChatColor.DARK_RED + "Teleportation canceled!"); //TODO Locale!
return;
}
if (!SkillUtils.cooldownOver(recentlyHurt * Misc.TIME_CONVERSION_FACTOR, 60, player)) {
player.sendMessage(LocaleLoader.getString("Item.Injured.Wait", SkillUtils.calculateTimeLeft(recentlyHurt * Misc.TIME_CONVERSION_FACTOR, 60, player)));
mcMMOPlayer.setChimaeraCommenceLocation(null);
if (!ItemUtils.isChimaeraWing(inHand) || inHand.getAmount() < Config.getInstance().getChimaeraUseCost()) {
player.sendMessage(LocaleLoader.getString("Skills.NeedMore", "Chimaera Wings")); //TODO Locale!
return;
}
int recentlyhurt_cooldown = Config.getInstance().getChimaeraRecentlyHurtCooldown();
if (!SkillUtils.cooldownOver(recentlyHurt * Misc.TIME_CONVERSION_FACTOR, recentlyhurt_cooldown, player)) {
player.sendMessage(LocaleLoader.getString("Item.Injured.Wait", SkillUtils.calculateTimeLeft(recentlyHurt * Misc.TIME_CONVERSION_FACTOR, recentlyhurt_cooldown, player)));
return;
}
ChimaeraWing.chimaeraExecuteTeleport();
mcMMOPlayer.setChimaeraCommenceLocation(null);
}
}

View File

@@ -0,0 +1,60 @@
package com.gmail.nossr50.runnables.items;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable;
import com.gmail.nossr50.commands.party.teleport.PtpCommand;
import com.gmail.nossr50.config.Config;
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.locale.LocaleLoader;
import com.gmail.nossr50.party.PartyManager;
import com.gmail.nossr50.util.Misc;
import com.gmail.nossr50.util.skills.SkillUtils;
public class TeleportationWarmup extends BukkitRunnable {
private static Player teleportingPlayer;
private McMMOPlayer mcMMOPlayer;
private static Player targetPlayer;
private McMMOPlayer mcMMOTarget;
public TeleportationWarmup(McMMOPlayer mcMMOPlayer, McMMOPlayer mcMMOTarget) {
this.mcMMOPlayer = mcMMOPlayer;
this.mcMMOTarget = mcMMOTarget;
}
@Override
public void run() {
checkPartyTeleport();
}
private void checkPartyTeleport() {
teleportingPlayer = mcMMOPlayer.getPlayer();
targetPlayer = mcMMOTarget.getPlayer();
Location previousLocation = mcMMOPlayer.getTeleportCommenceLocation();
Location newLocation = mcMMOPlayer.getPlayer().getLocation();
long recentlyHurt = mcMMOPlayer.getRecentlyHurt();
mcMMOPlayer.setTeleportCommenceLocation(null);
if (!PartyManager.inSameParty(teleportingPlayer, targetPlayer)) {
teleportingPlayer.sendMessage(LocaleLoader.getString("Party.NotInYourParty", targetPlayer.getName()));
return;
}
if (newLocation.distanceSquared(previousLocation) > 1.0) {
teleportingPlayer.sendMessage(ChatColor.DARK_RED + "Teleportation canceled!"); //TODO Locale!
return;
}
int recentlyhurt_cooldown = Config.getInstance().getPTPCommandRecentlyHurtCooldown();
if (!SkillUtils.cooldownOver(recentlyHurt * Misc.TIME_CONVERSION_FACTOR, recentlyhurt_cooldown, teleportingPlayer)) {
teleportingPlayer.sendMessage(LocaleLoader.getString("Item.Injured.Wait", SkillUtils.calculateTimeLeft(recentlyHurt * Misc.TIME_CONVERSION_FACTOR, recentlyhurt_cooldown, teleportingPlayer)));
return;
}
PtpCommand.handlePartyTeleportEvent(teleportingPlayer, targetPlayer);
}
}

View File

@@ -1,16 +1,13 @@
package com.gmail.nossr50.skills.fishing;
import java.util.Map;
import java.util.Map.Entry;
import java.util.List;
import org.bukkit.DyeColor;
import org.bukkit.Material;
import org.bukkit.entity.LivingEntity;
import org.bukkit.inventory.ItemStack;
import org.bukkit.potion.Potion;
import org.bukkit.potion.PotionType;
import com.gmail.nossr50.config.AdvancedConfig;
import com.gmail.nossr50.config.treasure.TreasureConfig;
import com.gmail.nossr50.datatypes.treasure.ShakeTreasure;
import com.gmail.nossr50.util.Misc;
public final class Fishing {
@@ -66,115 +63,70 @@ public final class Fishing {
* @param target Targeted entity
* @param possibleDrops List of ItemStack that can be dropped
*/
protected static void findPossibleDrops(LivingEntity target, Map<ItemStack, Integer> possibleDrops) {
protected static List<ShakeTreasure> findPossibleDrops(LivingEntity target) {
switch (target.getType()) {
case BLAZE:
possibleDrops.put(new ItemStack(Material.BLAZE_ROD), 100);
break;
return TreasureConfig.getInstance().shakeFromBlaze;
case CAVE_SPIDER:
case SPIDER:
possibleDrops.put(new ItemStack(Material.SPIDER_EYE), 50);
possibleDrops.put(new ItemStack(Material.STRING), 50);
break;
return TreasureConfig.getInstance().shakeFromCaveSpider;
case CHICKEN:
possibleDrops.put(new ItemStack(Material.FEATHER), 34);
possibleDrops.put(new ItemStack(Material.RAW_CHICKEN), 33);
possibleDrops.put(new ItemStack(Material.EGG), 33);
break;
return TreasureConfig.getInstance().shakeFromChicken;
case COW:
possibleDrops.put(new ItemStack(Material.MILK_BUCKET), 2);
possibleDrops.put(new ItemStack(Material.LEATHER), 49);
possibleDrops.put(new ItemStack(Material.RAW_BEEF), 49);
break;
return TreasureConfig.getInstance().shakeFromCow;
case CREEPER:
possibleDrops.put(new ItemStack(Material.SKULL_ITEM, 1, (short) 4), 1);
possibleDrops.put(new ItemStack(Material.SULPHUR), 99);
break;
return TreasureConfig.getInstance().shakeFromCreeper;
case ENDERMAN:
possibleDrops.put(new ItemStack(Material.ENDER_PEARL), 100);
break;
return TreasureConfig.getInstance().shakeFromEnderman;
case GHAST:
possibleDrops.put(new ItemStack(Material.SULPHUR), 50);
possibleDrops.put(new ItemStack(Material.GHAST_TEAR), 50);
break;
return TreasureConfig.getInstance().shakeFromGhast;
case IRON_GOLEM:
possibleDrops.put(new ItemStack(Material.PUMPKIN), 3);
possibleDrops.put(new ItemStack(Material.IRON_INGOT), 12);
possibleDrops.put(new ItemStack(Material.RED_ROSE), 85);
break;
return TreasureConfig.getInstance().shakeFromIronGolem;
case MAGMA_CUBE:
possibleDrops.put(new ItemStack(Material.MAGMA_CREAM), 100);
break;
return TreasureConfig.getInstance().shakeFromMagmaCube;
case MUSHROOM_COW:
possibleDrops.put(new ItemStack(Material.MILK_BUCKET), 5);
possibleDrops.put(new ItemStack(Material.MUSHROOM_SOUP), 5);
possibleDrops.put(new ItemStack(Material.LEATHER), 30);
possibleDrops.put(new ItemStack(Material.RAW_BEEF), 30);
possibleDrops.put(new ItemStack(Material.RED_MUSHROOM, Misc.getRandom().nextInt(3) + 1), 30);
break;
return TreasureConfig.getInstance().shakeFromMushroomCow;
case PIG:
possibleDrops.put(new ItemStack(Material.PORK), 100);
break;
return TreasureConfig.getInstance().shakeFromPig;
case PIG_ZOMBIE:
possibleDrops.put(new ItemStack(Material.ROTTEN_FLESH), 50);
possibleDrops.put(new ItemStack(Material.GOLD_NUGGET), 50);
break;
return TreasureConfig.getInstance().shakeFromPigZombie;
case SHEEP:
possibleDrops.put(new ItemStack(Material.WOOL, Misc.getRandom().nextInt(6) + 1), 100);
break;
return TreasureConfig.getInstance().shakeFromSheep;
case SKELETON:
possibleDrops.put(new ItemStack(Material.SKULL_ITEM, 1, (short) 0), 2);
possibleDrops.put(new ItemStack(Material.BONE), 49);
possibleDrops.put(new ItemStack(Material.ARROW, Misc.getRandom().nextInt(3) + 1), 49);
break;
return TreasureConfig.getInstance().shakeFromSkeleton;
case SLIME:
possibleDrops.put(new ItemStack(Material.SLIME_BALL), 100);
break;
return TreasureConfig.getInstance().shakeFromSlime;
case SNOWMAN:
possibleDrops.put(new ItemStack(Material.PUMPKIN), 3);
possibleDrops.put(new ItemStack(Material.SNOW_BALL, Misc.getRandom().nextInt(4) + 1), 97);
break;
return TreasureConfig.getInstance().shakeFromSnowman;
case SPIDER:
return TreasureConfig.getInstance().shakeFromSpider;
case SQUID:
possibleDrops.put(new ItemStack(Material.INK_SACK, 1, DyeColor.BLACK.getDyeData()), 100);
break;
return TreasureConfig.getInstance().shakeFromSquid;
case WITCH:
possibleDrops.put(new Potion(PotionType.INSTANT_HEAL).toItemStack(1), 1);
possibleDrops.put(new Potion(PotionType.FIRE_RESISTANCE).toItemStack(1), 1);
possibleDrops.put(new Potion(PotionType.SPEED).toItemStack(1), 1);
possibleDrops.put(new ItemStack(Material.GLASS_BOTTLE), 9);
possibleDrops.put(new ItemStack(Material.GLOWSTONE_DUST), 13);
possibleDrops.put(new ItemStack(Material.SULPHUR), 12);
possibleDrops.put(new ItemStack(Material.REDSTONE), 13);
possibleDrops.put(new ItemStack(Material.SPIDER_EYE), 12);
possibleDrops.put(new ItemStack(Material.STICK), 13);
possibleDrops.put(new ItemStack(Material.SUGAR), 12);
possibleDrops.put(new ItemStack(Material.POTION), 13);
break;
return TreasureConfig.getInstance().shakeFromWitch;
case ZOMBIE:
possibleDrops.put(new ItemStack(Material.SKULL_ITEM, 1, (short) 2), 2);
possibleDrops.put(new ItemStack(Material.ROTTEN_FLESH), 98);
break;
return TreasureConfig.getInstance().shakeFromZombie;
default:
return;
return null;
}
}
@@ -184,15 +136,15 @@ public final class Fishing {
* @param possibleDrops List of ItemStack that can be dropped
* @return Chosen ItemStack
*/
protected static ItemStack chooseDrop(Map<ItemStack, Integer> possibleDrops) {
protected static ItemStack chooseDrop(List<ShakeTreasure> possibleDrops) {
int dropProbability = Misc.getRandom().nextInt(100);
int cumulatedProbability = 0;
double cumulatedProbability = 0;
for (Entry<ItemStack, Integer> entry : possibleDrops.entrySet()) {
cumulatedProbability += entry.getValue();
for (ShakeTreasure treasure : possibleDrops) {
cumulatedProbability += treasure.getDropChance();
if (dropProbability < cumulatedProbability) {
return entry.getKey();
return treasure.getDrop();
}
}

View File

@@ -2,13 +2,12 @@ package com.gmail.nossr50.skills.fishing;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.bukkit.Material;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Fish;
import org.bukkit.entity.Item;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
@@ -23,6 +22,7 @@ import com.gmail.nossr50.config.treasure.TreasureConfig;
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.datatypes.skills.SkillType;
import com.gmail.nossr50.datatypes.treasure.FishingTreasure;
import com.gmail.nossr50.datatypes.treasure.ShakeTreasure;
import com.gmail.nossr50.locale.LocaleLoader;
import com.gmail.nossr50.skills.SkillManager;
import com.gmail.nossr50.skills.fishing.Fishing.Tier;
@@ -41,6 +41,10 @@ public class FishingManager extends SkillManager {
return target instanceof LivingEntity && getSkillLevel() >= AdvancedConfig.getInstance().getShakeUnlockLevel() && Permissions.shake(getPlayer());
}
public boolean canMasterAngler() {
return Permissions.masterAngler(getPlayer());
}
/**
* Gets the loot tier
*
@@ -86,6 +90,10 @@ public class FishingManager extends SkillManager {
return SkillUtils.handleFoodSkills(getPlayer(), skill, eventFoodLevel, Fishing.fishermansDietRankLevel1, Fishing.fishermansDietMaxLevel, rankChange);
}
public void masterAngler(Fish hook) {
hook.setBiteChance(Math.min(hook.getBiteChance() * Math.max((getSkillLevel() / 10.0), 1.0), 1.0));
}
/**
* Process the results from a successful fishing trip
*
@@ -135,11 +143,9 @@ public class FishingManager extends SkillManager {
*/
public void shakeCheck(LivingEntity target) {
if (getShakeProbability() > Misc.getRandom().nextInt(getActivationChance())) {
Map<ItemStack, Integer> possibleDrops = new HashMap<ItemStack, Integer>();
List<ShakeTreasure> possibleDrops = Fishing.findPossibleDrops(target);
Fishing.findPossibleDrops(target, possibleDrops);
if (possibleDrops.isEmpty()) {
if (possibleDrops == null || possibleDrops.isEmpty()) {
return;
}
@@ -263,17 +269,7 @@ public class FishingManager extends SkillManager {
int specificChance = 1;
for (Enchantment possibleEnchantment : possibleEnchantments) {
boolean conflicts = false;
for (Enchantment currentEnchantment : treasureDrop.getEnchantments().keySet()) {
conflicts = currentEnchantment.conflictsWith(possibleEnchantment);
if (conflicts) {
break;
}
}
if (!conflicts && Misc.getRandom().nextInt(specificChance) == 0) {
if (!treasureDrop.getItemMeta().hasConflictingEnchant(possibleEnchantment) && Misc.getRandom().nextInt(specificChance) == 0) {
treasureDrop.addEnchantment(possibleEnchantment, Misc.getRandom().nextInt(possibleEnchantment.getMaxLevel()) + 1);
specificChance++;

View File

@@ -5,12 +5,14 @@ import java.util.List;
import org.bukkit.CropState;
import org.bukkit.Material;
import org.bukkit.NetherWartsState;
import org.bukkit.block.BlockState;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.PlayerInventory;
import org.bukkit.material.CocoaPlant;
import org.bukkit.material.CocoaPlant.CocoaPlantSize;
import org.bukkit.material.NetherWarts;
import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.config.Config;
@@ -307,20 +309,22 @@ public class HerbalismManager extends SkillManager {
return true;
case NETHER_WARTS:
NetherWarts warts = (NetherWarts) blockState.getData();
if (greenTerra) {
blockState.setRawData((byte) 2);
warts.setState(NetherWartsState.STAGE_TWO);
}
else {
int greenThumbStage = getGreenThumbStage();
if (greenThumbStage > 2) {
blockState.setRawData((byte) 2);
warts.setState(NetherWartsState.STAGE_TWO);
}
else if (greenThumbStage == 2) {
blockState.setRawData((byte) 1);
warts.setState(NetherWartsState.STAGE_ONE);
}
else {
blockState.setRawData((byte) 0);
warts.setState(NetherWartsState.SEEDED);
}
}

View File

@@ -10,6 +10,7 @@ import org.bukkit.block.BlockState;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Player;
import org.bukkit.entity.TNTPrimed;
import org.bukkit.metadata.FixedMetadataValue;
import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.config.Config;
@@ -100,7 +101,7 @@ public class MiningManager extends SkillManager{
SkillUtils.sendSkillMessage(player, AbilityType.BLAST_MINING.getAbilityPlayer(player));
player.sendMessage(LocaleLoader.getString("Mining.Blast.Boom"));
mcMMO.p.addToTNTTracker(tnt.getEntityId(), player.getName());
tnt.setMetadata(mcMMO.tntMetadataKey, new FixedMetadataValue(mcMMO.p, player.getName()));
tnt.setFuseTicks(0);
targetBlock.setData((byte) 0x0);
targetBlock.setType(Material.AIR);

View File

@@ -194,6 +194,7 @@ public class TamingManager extends SkillManager {
((Ocelot) entity).setCatType(Ocelot.Type.getType(1 + Misc.getRandom().nextInt(3)));
}
else {
entity.setMaxHealth(20);
entity.setHealth(entity.getMaxHealth());
}

View File

@@ -1,5 +1,11 @@
package com.gmail.nossr50.skills.unarmed;
import java.util.Iterator;
import org.bukkit.entity.Item;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.PlayerInventory;
import com.gmail.nossr50.config.AdvancedConfig;
import com.gmail.nossr50.config.Config;
@@ -19,4 +25,61 @@ public class Unarmed {
public static boolean blockCrackerSmoothBrick = Config.getInstance().getUnarmedBlockCrackerSmoothbrickToCracked();
public static double berserkDamageModifier = 1.5;
public static boolean handleItemPickup(PlayerInventory inventory, Item drop) {
ItemStack dropStack = drop.getItemStack();
int firstEmpty = inventory.firstEmpty();
if (inventory.containsAtLeast(dropStack, 1)) {
int dropAmount = dropStack.getAmount();
int nextSlot = 0;
for (Iterator<ItemStack> iterator = inventory.iterator(); iterator.hasNext();) {
ItemStack itemstack = iterator.next();
if (dropStack.isSimilar(itemstack)) {
int itemAmount = itemstack.getAmount();
int itemMax = itemstack.getMaxStackSize();
ItemStack addStack = itemstack.clone();
if (dropAmount + itemAmount <= itemMax) {
drop.remove();
addStack.setAmount(dropAmount + itemAmount);
inventory.setItem(nextSlot, addStack);
return true;
}
addStack.setAmount(itemMax);
dropAmount = dropAmount + itemAmount - itemMax;
inventory.setItem(nextSlot, addStack);
}
if (dropAmount == 0) {
drop.remove();
return true;
}
nextSlot++;
}
}
if (firstEmpty == inventory.getHeldItemSlot()) {
int nextSlot = firstEmpty + 1;
for (Iterator<ItemStack> iterator = inventory.iterator(nextSlot); iterator.hasNext();) {
ItemStack itemstack = iterator.next();
if (itemstack == null) {
drop.remove();
inventory.setItem(nextSlot, dropStack);
return true;
}
nextSlot++;
}
}
return false;
}
}

View File

@@ -1,9 +1,11 @@
package com.gmail.nossr50.util;
import org.bukkit.CropState;
import org.bukkit.NetherWartsState;
import org.bukkit.block.BlockState;
import org.bukkit.material.CocoaPlant;
import org.bukkit.material.CocoaPlant.CocoaPlantSize;
import org.bukkit.material.NetherWarts;
import com.gmail.nossr50.config.Config;
@@ -30,6 +32,8 @@ public final class BlockUtils {
case GOLD_ORE:
case GRASS:
case GRAVEL:
case HUGE_MUSHROOM_1:
case HUGE_MUSHROOM_2:
case IRON_ORE:
case LAPIS_ORE:
case LOG:
@@ -51,10 +55,20 @@ public final class BlockUtils {
case VINE:
case WATER_LILY:
case YELLOW_FLOWER:
case COCOA:
case EMERALD_ORE:
return true;
case CARROT:
case CROPS:
case POTATO:
return blockState.getRawData() == CropState.RIPE.getData();
case NETHER_WARTS:
return ((NetherWarts) blockState.getData()).getState() == NetherWartsState.RIPE;
case COCOA:
return ((CocoaPlant) blockState.getData()).getSize() == CocoaPlantSize.LARGE;
default:
return ModUtils.getCustomBlock(blockState) != null;
}
@@ -182,7 +196,7 @@ public final class BlockUtils {
return blockState.getRawData() == CropState.RIPE.getData();
case NETHER_WARTS:
return blockState.getRawData() == (byte) 0x3;
return ((NetherWarts) blockState.getData()).getState() == NetherWartsState.RIPE;
case COCOA:
return ((CocoaPlant) blockState.getData()).getSize() == CocoaPlantSize.LARGE;

View File

@@ -46,20 +46,22 @@ public final class ChimaeraWing {
location = player.getLocation();
int amount = inHand.getAmount();
long recentlyHurt = mcMMOPlayer.getRecentlyHurt();
long lastChimaeraWing = mcMMOPlayer.getLastChimaeraTeleport();
long lastTeleport = mcMMOPlayer.getLastTeleport();
if (Permissions.chimaeraWing(player) && ItemUtils.isChimaeraWing(inHand)) {
if (mcMMOPlayer.getChimaeraCommenceLocation() != null) {
if (mcMMOPlayer.getTeleportCommenceLocation() != null) {
return;
}
if (!SkillUtils.cooldownOver(lastChimaeraWing * Misc.TIME_CONVERSION_FACTOR, Config.getInstance().getChimaeraCooldown(), player)) {
player.sendMessage(ChatColor.RED + "You need to wait before you can use this again! " + ChatColor.YELLOW + "(" + SkillUtils.calculateTimeLeft(lastChimaeraWing * Misc.TIME_CONVERSION_FACTOR, Config.getInstance().getChimaeraCooldown(), player) + ")"); //TODO Locale!
if (Config.getInstance().getChimaeraCooldown() > 0 && !SkillUtils.cooldownOver(lastTeleport * Misc.TIME_CONVERSION_FACTOR, Config.getInstance().getChimaeraCooldown(), player)) {
player.sendMessage(ChatColor.RED + "You need to wait before you can use this again! " + ChatColor.YELLOW + "(" + SkillUtils.calculateTimeLeft(lastTeleport * Misc.TIME_CONVERSION_FACTOR, Config.getInstance().getChimaeraCooldown(), player) + ")"); //TODO Locale!
return;
}
if (!SkillUtils.cooldownOver(recentlyHurt * Misc.TIME_CONVERSION_FACTOR, 60, player)) {
player.sendMessage(LocaleLoader.getString("Item.Injured.Wait", SkillUtils.calculateTimeLeft(recentlyHurt * Misc.TIME_CONVERSION_FACTOR, 60, player)));
int recentlyhurt_cooldown = Config.getInstance().getChimaeraRecentlyHurtCooldown();
if (!SkillUtils.cooldownOver(recentlyHurt * Misc.TIME_CONVERSION_FACTOR, recentlyhurt_cooldown, player)) {
player.sendMessage(LocaleLoader.getString("Item.Injured.Wait", SkillUtils.calculateTimeLeft(recentlyHurt * Misc.TIME_CONVERSION_FACTOR, recentlyhurt_cooldown, player)));
return;
}
@@ -69,21 +71,27 @@ public final class ChimaeraWing {
}
if (Config.getInstance().getChimaeraPreventUseUnderground()) {
if (location.getY() < player.getWorld().getHighestBlockYAt(location)) {
player.setItemInHand(new ItemStack(getChimaeraWing(amount - Config.getInstance().getChimaeraUseCost())));
player.sendMessage(LocaleLoader.getString("Item.ChimaeraWing.Fail"));
player.setVelocity(new Vector(0, 0.5D, 0));
CombatUtils.dealDamage(player, Misc.getRandom().nextInt(player.getHealth() - 10));
mcMMOPlayer.actualizeLastChimaeraTeleport();
mcMMOPlayer.actualizeLastTeleport();
return;
}
}
mcMMOPlayer.actualizeChimaeraCommenceLocation(player);
mcMMOPlayer.actualizeTeleportCommenceLocation(player);
long warmup = Config.getInstance().getChimaeraWarmup();
player.sendMessage(ChatColor.GRAY + "Commencing teleport in " + ChatColor.GOLD + "(" + warmup + ")" + ChatColor.GRAY + " seconds, please stand still..."); //TODO Locale!
new ChimaeraWingWarmup(mcMMOPlayer).runTaskLater(mcMMO.p, 20 * warmup);
if (warmup > 0) {
player.sendMessage(ChatColor.GRAY + "Commencing teleport in " + ChatColor.GOLD + "(" + warmup + ")" + ChatColor.GRAY + " seconds, please stand still..."); //TODO Locale!
new ChimaeraWingWarmup(mcMMOPlayer).runTaskLater(mcMMO.p, 20 * warmup);
}
else {
chimaeraExecuteTeleport();
}
}
}
@@ -104,20 +112,26 @@ public final class ChimaeraWing {
}
player.setItemInHand(new ItemStack(getChimaeraWing(player.getItemInHand().getAmount() - Config.getInstance().getChimaeraUseCost())));
UserManager.getPlayer(player).actualizeLastChimaeraTeleport();
MetricsManager.chimeraWingUsed();
UserManager.getPlayer(player).actualizeLastTeleport();
if (Config.getInstance().getStatsTrackingEnabled()) {
MetricsManager.chimeraWingUsed();
}
player.playSound(location, Sound.BAT_TAKEOFF, Misc.BAT_VOLUME, Misc.BAT_PITCH);
player.sendMessage(LocaleLoader.getString("Item.ChimaeraWing.Pass"));
}
public static ItemStack getChimaeraWing(int amount) {
ItemStack itemStack = new ItemStack(Material.FEATHER, amount);
Material ingredient = Material.getMaterial(Config.getInstance().getChimaeraItemId());
ItemStack itemStack = new ItemStack(ingredient, amount);
ItemMeta itemMeta = itemStack.getItemMeta();
itemMeta.setDisplayName(ChatColor.GOLD + "Chimaera Wing"); //TODO Locale!
List<String> itemLore = new ArrayList<String>();
itemLore.add("mcMMO Item");
itemLore.add(ChatColor.GRAY + "Teleports you to your bed."); //TODO Locale!
itemMeta.setLore(itemLore);
itemStack.setItemMeta(itemMeta);
return itemStack;
}

View File

@@ -189,6 +189,14 @@ public final class Misc {
}
}
public static void resendChunkRadiusAt(Player player, int radius) {
for (int x = player.getLocation().getChunk().getX() - radius; x < player.getLocation().getChunk().getX() + radius; x++) {
for (int z = player.getLocation().getChunk().getZ() - radius; z < player.getLocation().getChunk().getZ() + radius; z++) {
player.getWorld().refreshChunk(x, z);
}
}
}
public static Random getRandom() {
return random;
}

View File

@@ -20,6 +20,7 @@ public final class Permissions {
*/
public static boolean motd(Permissible permissible) { return permissible.hasPermission("mcmmo.motd"); }
public static boolean mobHealthDisplay(Permissible permissible) { return permissible.hasPermission("mcmmo.mobhealthdisplay"); }
public static boolean updateNotifications(Permissible permissible) {return permissible.hasPermission("mcmmo.tools.updatecheck"); }
public static boolean chimaeraWing(Permissible permissible) { return permissible.hasPermission("mcmmo.item.chimaerawing"); }
@@ -142,6 +143,7 @@ public final class Permissions {
public static boolean fishermansDiet(Permissible permissible) { return permissible.hasPermission("mcmmo.ability.fishing.fishermansdiet"); }
public static boolean fishingTreasureHunter(Permissible permissible) { return permissible.hasPermission("mcmmo.ability.fishing.treasures"); }
public static boolean magicHunter(Permissible permissible) { return permissible.hasPermission("mcmmo.ability.fishing.magic"); }
public static boolean masterAngler(Permissible permissible) { return permissible.hasPermission("mcmmo.ability.fishing.masterangler"); }
public static boolean shake(Permissible permissible) { return permissible.hasPermission("mcmmo.ability.fishing.shakemob"); }
/* HERBALISM */
@@ -213,10 +215,11 @@ public final class Permissions {
*/
public static boolean party(Permissible permissible) { return permissible.hasPermission("mcmmo.commands.party"); }
public static boolean partySubcommand(Permissible permissible, PartySubcommandType subcommand) {return permissible.hasPermission("mcmmo.commands.party." + subcommand.toString().toLowerCase()); }
public static boolean partySubcommand(Permissible permissible, PartySubcommandType subcommand) { return permissible.hasPermission("mcmmo.commands.party." + subcommand.toString().toLowerCase()); }
public static boolean friendlyFire(Permissible permissible) { return permissible.hasPermission("mcmmo.party.friendlyfire"); }
/* TELEPORT */
public static boolean partyTeleportSend(Permissible permissible) { return permissible.hasPermission("mcmmo.commands.ptp.send"); }
public static boolean partyTeleportAccept(Permissible permissible) { return permissible.hasPermission("mcmmo.commands.ptp.accept"); }
public static boolean partyTeleportAcceptAll(Permissible permissible) { return permissible.hasPermission("mcmmo.commands.ptp.acceptall"); }
public static boolean partyTeleportToggle(Permissible permissible) { return permissible.hasPermission("mcmmo.commands.ptp.toggle"); }

View File

@@ -11,6 +11,7 @@ import com.gmail.nossr50.commands.McgodCommand;
import com.gmail.nossr50.commands.McmmoCommand;
import com.gmail.nossr50.commands.McnotifyCommand;
import com.gmail.nossr50.commands.McrefreshCommand;
import com.gmail.nossr50.commands.MobhealthCommand;
import com.gmail.nossr50.commands.XprateCommand;
import com.gmail.nossr50.commands.chat.AdminChatCommand;
import com.gmail.nossr50.commands.chat.PartyChatCommand;
@@ -366,4 +367,13 @@ public final class CommandRegistrationManager {
command.setUsage(LocaleLoader.getString("Commands.Usage.0", "mcnotify"));
command.setExecutor(new McnotifyCommand());
}
public static void registerMobhealthCommand() {
PluginCommand command = mcMMO.p.getCommand("mobhealth");
command.setDescription("Change the style of the mob healthbar"); //TODO: Localize
command.setPermission("mcmmo.commands.mobhealth");
command.setPermissionMessage(permissionsMessage);
command.setUsage(LocaleLoader.getString("Commands.Usage.1", "mobhealth", "<DISABLED | HEARTS | BAR>"));
command.setExecutor(new MobhealthCommand());
}
}

View File

@@ -1,5 +1,7 @@
package com.gmail.nossr50.util.commands;
import java.util.List;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@@ -13,7 +15,12 @@ import com.gmail.nossr50.util.StringUtils;
import com.gmail.nossr50.util.player.UserManager;
import com.gmail.nossr50.util.skills.SkillUtils;
import com.google.common.collect.ImmutableList;
public final class CommandUtils {
public static final List<String> TRUE_FALSE_OPTIONS = ImmutableList.of("on", "off", "true", "false", "enabled", "disabled");
public static final List<String> RESET_OPTIONS = ImmutableList.of("clear", "reset");
private CommandUtils() {}
public static boolean isChildSkill(CommandSender sender, SkillType skill) {

View File

@@ -13,7 +13,7 @@ import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
public final class UserManager {
private static Map<String, McMMOPlayer> players = new HashMap<String, McMMOPlayer>();
private final static Map<String, McMMOPlayer> players = new HashMap<String, McMMOPlayer>();
private UserManager() {};

View File

@@ -1,5 +1,6 @@
package com.gmail.nossr50.util.skills;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.entity.AnimalTamer;
import org.bukkit.entity.Animals;
@@ -17,15 +18,19 @@ import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
import org.bukkit.event.player.PlayerAnimationEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.metadata.FixedMetadataValue;
import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.config.Config;
import com.gmail.nossr50.datatypes.MobHealthbarType;
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.datatypes.player.PlayerProfile;
import com.gmail.nossr50.datatypes.skills.SkillType;
import com.gmail.nossr50.events.fake.FakeEntityDamageByEntityEvent;
import com.gmail.nossr50.events.fake.FakeEntityDamageEvent;
import com.gmail.nossr50.locale.LocaleLoader;
import com.gmail.nossr50.party.PartyManager;
import com.gmail.nossr50.runnables.MobHealthDisplayUpdaterTask;
import com.gmail.nossr50.runnables.skills.AwardCombatXpTask;
import com.gmail.nossr50.runnables.skills.BleedTimerTask;
import com.gmail.nossr50.skills.acrobatics.AcrobaticsManager;
@@ -284,6 +289,40 @@ public final class CombatUtils {
}
}
}
else if (attacker instanceof Player) {
Player player = (Player) attacker;
PlayerProfile profile = UserManager.getPlayer(player).getProfile();
if (Permissions.mobHealthDisplay(player) && profile.getMobHealthbarType() != MobHealthbarType.DISABLED) {
String oldName = target.getCustomName();
boolean oldNameVisible = target.isCustomNameVisible();
String newName = createHealthDisplay(profile, target, event.getDamage());
target.setCustomName(newName);
target.setCustomNameVisible(true);
int displayTime = Config.getInstance().getMobHealthbarTime();
if (displayTime != -1) {
if (oldName == null) {
oldName = "";
}
boolean updateName = !ChatColor.stripColor(oldName).equalsIgnoreCase(ChatColor.stripColor(newName));
if (updateName) {
target.setMetadata(mcMMO.customNameKey, new FixedMetadataValue(mcMMO.p, oldName));
target.setMetadata(mcMMO.customVisibleKey, new FixedMetadataValue(mcMMO.p, oldNameVisible));
}
else if (!target.hasMetadata(mcMMO.customNameKey)) {
target.setMetadata(mcMMO.customNameKey, new FixedMetadataValue(mcMMO.p, ""));
target.setMetadata(mcMMO.customVisibleKey, new FixedMetadataValue(mcMMO.p, false));
}
new MobHealthDisplayUpdaterTask(target).runTaskLater(mcMMO.p, displayTime * 20); // Clear health display after 3 seconds
}
}
}
}
/**
@@ -583,4 +622,67 @@ public final class CombatUtils {
return process;
}
private static String createHealthDisplay(PlayerProfile profile, LivingEntity entity, int damage) {
int maxHealth = entity.getMaxHealth();
int currentHealth = Math.max(entity.getHealth() - damage, 0);
double healthPercentage = (currentHealth / (double) maxHealth) * 100.0D;
int fullDisplay = 0;
ChatColor color = ChatColor.BLACK;
String symbol = "";
switch (profile.getMobHealthbarType()) {
case HEARTS:
fullDisplay = Math.min(maxHealth / 2, 10);
color = ChatColor.DARK_RED;
symbol = "";
break;
case BAR:
fullDisplay = 10;
if (healthPercentage >= 85) {
color = ChatColor.DARK_GREEN;
}
else if (healthPercentage >= 70) {
color = ChatColor.GREEN;
}
else if (healthPercentage >= 55) {
color = ChatColor.GOLD;
}
else if (healthPercentage >= 40) {
color = ChatColor.YELLOW;
}
else if (healthPercentage >= 25) {
color = ChatColor.RED;
}
else if (healthPercentage >= 0) {
color = ChatColor.DARK_RED;
}
symbol = "";
break;
default:
return null;
}
int coloredDisplay = (int) (fullDisplay * (healthPercentage / 100.0D));
int grayDisplay = fullDisplay - coloredDisplay;
String healthbar = color + "";
for (int i = 0; i < coloredDisplay; i++) {
healthbar += symbol;
}
healthbar += ChatColor.GRAY;
for (int i = 0; i < grayDisplay; i++) {
healthbar += symbol;
}
return healthbar;
}
}

View File

@@ -187,6 +187,10 @@ public class SkillUtils {
handleAbilitySpeedDecrease(player);
}
if (HiddenConfig.getInstance().resendChunksAfterBlockAbility() && (ability == AbilityType.BERSERK || ability == AbilityType.SUPER_BREAKER || ability == AbilityType.GIGA_DRILL_BREAKER)) {
Misc.resendChunkRadiusAt(player, 1);
}
mcMMOPlayer.setAbilityMode(ability, false);
mcMMOPlayer.setAbilityInformed(ability, false);
@@ -499,10 +503,10 @@ public class SkillUtils {
int ticks = 0;
if (mcMMOPlayer.getAbilityMode(AbilityType.SUPER_BREAKER)) {
ticks = ((int) (mcMMOPlayer.getProfile().getSkillDATS(AbilityType.SUPER_BREAKER) - System.currentTimeMillis())) / Misc.TIME_CONVERSION_FACTOR;
ticks = ((int) (mcMMOPlayer.getProfile().getSkillDATS(AbilityType.SUPER_BREAKER) - (System.currentTimeMillis() / Misc.TIME_CONVERSION_FACTOR))) * 20;
}
else if (mcMMOPlayer.getAbilityMode(AbilityType.GIGA_DRILL_BREAKER)) {
ticks = ((int) (mcMMOPlayer.getProfile().getSkillDATS(AbilityType.GIGA_DRILL_BREAKER) - System.currentTimeMillis())) / Misc.TIME_CONVERSION_FACTOR;
ticks = ((int) (mcMMOPlayer.getProfile().getSkillDATS(AbilityType.GIGA_DRILL_BREAKER) - (System.currentTimeMillis() / Misc.TIME_CONVERSION_FACTOR))) * 20;
}
PotionEffect abilityBuff = new PotionEffect(PotionEffectType.FAST_DIGGING, duration + ticks, amplifier + 10);

View File

@@ -27,6 +27,12 @@ General:
# Should mcMMO over-write configs to update, or make new ones ending in .new?
Config_Update_Overwrite: true
Mob_Healthbar:
# Default display for mob health bars - HEARTS, BAR, or DISABLED
Display_Type: HEARTS
# Amount of time (in seconds) to display. To display permanently, set to -1
Display_Time: 3
Database_Purging:
# Amount of time (in hours) to wait between database purging
# To only run at server start, set to 0
@@ -74,6 +80,7 @@ Items:
Enabled: true
Cooldown: 240
Warmup: 5
RecentlyHurt_Cooldown: 60
Prevent_Use_Underground: true
Use_Cost: 1
Recipe_Cost: 5
@@ -349,7 +356,9 @@ Commands:
mcmmo:
Donate_Message: true
ptp:
Cooldown: 30
Cooldown: 120
Warmup: 5
RecentlyHurt_Cooldown: 60
Confirm_Required: true
Request_Timeout: 300
# If true, require players to have a mcmmo.commands.ptp.world.[WorldName] permission
@@ -368,8 +377,13 @@ Particles:
# These settings determine if fireworks should get launched when a player activates/deactivates an ability
Ability_Activation: true
Ability_Deactivation: true
# Use particle effect when these abilities trigger
Dodge: true
Bleed: true
Greater_Impact: true
# These settings determine if fireworks should get launched when a player levels-up,
# this will happen by default for every 100 levels.
LevelUp_Enabled: true
LevelUp_Tier: 100

View File

@@ -8,4 +8,6 @@ Options:
# Square root of the number of chunks to convert per tick.
ConversionRate: 1
# true to use enchantment buffs for Super Breaker & Giga Drill Breaker, false to use potion buffs
EnchantmentBuffs: true
EnchantmentBuffs: true
# true to enable refreshing of chunks around a player at the end of Super Breaker, Giga Drill Breaker, and Berserk. This should fix blocks being broken client side, but not server-side
RefreshChunks: false

View File

@@ -90,9 +90,12 @@ Fishing.SkillName=RYBARENI
Fishing.Skillup=[[YELLOW]]Dovednost v rybareni byla navysena o {0}. Celkem ({1})
Herbalism.Ability.DoubleDropChance=[[RED]]\u0160ance na dvojn\u00e1sobn\u00fd zisk: [[YELLOW]]{0}
Herbalism.Ability.GTe.Length=[[RED]]D\u00e9lka trv\u00e1n\u00ed Zelen\u00e9 planety: [[YELLOW]]{0}s
Herbalism.Ability.GTe.NeedMore=[[RED]]Bude\u0161 pot\u0159ebovat v\u00edc sem\u00ednek pro Green Tera.
Herbalism.Ability.GTh.Chance=[[RED]]\u0160ance na dovednost Zahradn\u00edk: [[YELLOW]]{0}
Herbalism.Ability.GTh.Fail=[[RED]]**ZAHRADN\u00cdK SELHAL**
Herbalism.Ability.GTh.Stage=[[RED]] Zahradn\u00edk Stage: [[\u017dlut\u00e9]] Plodiny rostou ve st\u00e1diu {0}
Herbalism.Ability.GTh=[[GREEN]]**ZAHRADNIK**
Herbalism.Ability.HylianLuck=[[RED]]Hylian Luck zm\u011bn\u011bn: [[YELLOW]]{0}
Herbalism.Ability.Lower=[[GRAY]]**SKLONIL JSI SVOJI MOTYKU**
Herbalism.Ability.Ready=[[GREEN]]**PRIPRAVIL JSI SVOU MOTYKU**
Herbalism.Effect.0=Green Terra (SCHOPNOST)
@@ -105,6 +108,8 @@ Herbalism.Effect.6=Farm\u00e1\u0159\u016fv apetit
Herbalism.Effect.7=Zvysuje obnovu hladu ze sklizenych jidel
Herbalism.Effect.8=Dvojnasobny zisk (vsechny byliny)
Herbalism.Effect.9=Zdvojnasobi normalni zisk
Herbalism.Effect.11=D\u00e1v\u00e1 malou \u0161anci naj\u00edt vz\u00e1cn\u00e9 p\u0159edm\u011bty
Herbalism.HylianLuck=[[GREEN]]The luck of Hyrule t\u011b doprov\u00e1z\u00ed!
Herbalism.Listener=Bylinarstvi:
Herbalism.SkillName=Bylinkarstvi
Herbalism.Skills.GTe.Off=[[RED]]**Green Terra byla deaktivovana**
@@ -159,6 +164,7 @@ Repair.Effect.6=Oprava diamantovych predmetu ({0}+ SKILL)
Repair.Effect.7=Oprava diamantovych nastroju a brneni
Repair.Effect.8=Tajemne kovani
Repair.Effect.9=Oprava enchantovanych predmetu
Repair.Error=[[DARK_RED]]V mcMMO do\u0161lo k chyb\u011b p\u0159i oprav\u011b tohoto itemu!
Repair.Listener.Anvil=[[DARK_RED]]Polo\u017eil si kovadlinu, na kovadlin\u011b m\u016f\u017ee\u0161 opravovat n\u00e1stroje a zbroj.
Repair.Listener.Anvil2=[[DARK_RED]]Polozil jsi Salvage kovadlinu, pouzij ji na zachranu armoru.
Repair.Listener=Opravovani:
@@ -170,6 +176,7 @@ Repair.Skills.AdeptStone=[[DARK_RED]]Nemas dostatek dovednosti pro opravu Kamenn
Repair.Skills.Adept=[[RED]]Mus\u00ed\u0161 m\u00edt level [[YELLOW]]{0}[[RED]] k oprav\u011b [[YELLOW]]{1}
Repair.Skills.FeltEasy=[[GRAY]]To bylo snadn\u00e9.
Repair.Skills.FullDurability=[[GRAY]]Tento p\u0159edm\u011bt nen\u00ed po\u0161kozen\u00fd.
Repair.Skills.SalvageSuccess=[[GRAY]] Item zachr\u00e1n\u011bn!
Repair.Skills.Mastery=[[RED]]Mistrovstvi v opravovani: [[YELLOW]]Extra {0} \u017eivotnosti obnovena
Repair.Skills.StackedItems=[[DARK_RED]]Nem\u016f\u017ee\u0161 opravovat nestackovan\u00e9 p\u0159edm\u011bty.
Repair.Skills.Super.Chance=[[RED]]\u0160ance na superopravov\u00e1n\u00ed: [[YELLOW]]{0}
@@ -245,6 +252,7 @@ Unarmed.Ability.Bonus.0=Styl \u017eelezn\u00e9 pa\u017ee
Unarmed.Ability.Bonus.1=+{0} Zv\u00fd\u0161en\u00ed zran\u011bn\u00ed
Unarmed.Ability.Chance.ArrowDeflect=[[RED]]\u0160ance na vych\u00edlen\u00ed \u0161\u00edpu: [[YELLOW]]{0}
Unarmed.Ability.Chance.Disarm=[[RED]]\u0160ance na odzbrojen\u00ed: [[YELLOW]]{0}
Unarmed.Ability.IronGrip.Attacker=[[RED]] Tv\u016fj soupe\u0159 m\u00e1 \u017eelezn\u00e9 sev\u0159en\u00ed!
Unarmed.Ability.Lower=[[GRAY]]**SKL\u00c1N\u00cd\u0160 SV\u00c9 P\u011aSTI**
Unarmed.Ability.Ready=[[GREEN]]**PRIPRAVIL JSI SVOJE PESTI**
Unarmed.Effect.0=B\u011bsn\u011bn\u00ed (SCHOPNOST)
@@ -294,11 +302,15 @@ Combat.Gore=[[GREEN]]**PRUNIK**
Combat.StruckByGore=[[RED]]**BYL JSI PROBODNUT**
Combat.TargetDazed=C\u00edl byl [[DARK_RED]]Omr\u00e1\u010den
Combat.TouchedFuzzy=[[DARK_RED]]Nejasne dotcen. Mas zavrat.
Commands.addlevels.AwardAll.2=[[RED]]V\u0161echny schopnosti byly zm\u011bn\u011bny na {0}.
Commands.addlevels.AwardSkill.1=[[GREEN]]Tvoje dovednost {1} je nyn\u00ed {0}!
Commands.addxp.AwardSkill=[[GREEN]]Z\u00edskal si {0} zku\u0161enost\u00ed v {1}!
Commands.Ability.Off=Pou\u017eit\u00ed schopnosti bylo [[RED]] vypnuto
Commands.Ability.On=Pou\u017eit\u00ed schopnosti bylo [[GREEN]]zapnuto
Commands.AdminChat.Off=Admin chat [[RED]]Vypnuty
Commands.AdminChat.On=Admin Chat[[GREEN]]Zapnut\u00fd
Commands.AdminToggle=[[RED]]- Prepnout admin chat
Commands.Chat.Console=*\u0158\u00edd\u00edc\u00ed panel*
Commands.Disabled=[[RED]]Tento prikaz je vypnuty.
Commands.DoesNotExist=[[RED]]Hrac se v databaze nenachazi!
Commands.GodMode.Disabled=[[YELLOW]]mcMMO Godmod vypnuty
@@ -310,9 +322,12 @@ Commands.Invite.Success=[[GREEN]]Pozv\u00e1nka \u00faspesne odesl\u00e1na.
Commands.Leaderboards=<skill> <page> [[RED]]- Tabulka nejlep\u0161\u00edch
Commands.mcgod=[[RED]]- Prepnout GodMod
Commands.mchud.Invalid=Nespr\u00e1vn\u00fd typ HUD.
Commands.mcpurge.Success=[[GREEN]]Datab\u00e1ze byla \u00fasp\u011b\u0161n\u011b vy\u010dist\u011bna!
Commands.mcrank.Heading=[[GOLD]]-=OSOBN\u00cd HODNOCEN\u00cd=-
Commands.mcremove.Success=[[GREEN]]{0} byl \u00fasp\u011b\u0161n\u011b vymaz\u00e1n z datab\u00e1ze!
Commands.mctop.Tip=[[GOLD]]Tip: Pro osobn\u00ed statistiky pou\u017eij [[RED]]/mcrank[[GOLD]]!
Commands.mmoedit=[player] <skill> <newvalue> [[RED]] - Modify target
Commands.mmoedit.Modified.1=[[GREEN]]Tv\u016fj skill v {0} byl pozm\u011bn\u011bn na {1}!
Commands.ModDescription=[[RED]]- Precti si strucny popis pluginu
Commands.NoConsole=Tento prikaz nepodporuje pouziti z konzole.
Commands.Other=[[GREEN]]--OSTATNI PRIKAZY--
@@ -332,7 +347,8 @@ Commands.Party.Toggle=[[RED]]- Zapnout party chat
Commands.PowerLevel.Leaderboard=[[YELLOW]]--mcMMO[[BLUE]] Rebricek [[YELLOW]]Celkovych levelu--
Commands.PowerLevel=[[DARK_RED]]CELKOVY LEVEL: [[GREEN]]{0}
Commands.Reset.All=[[GREEN]] Vsechny vase dovednosti byli byli uspesne resetov\u00e1ny.
Commands.Reset.Single=[[GREEN]] Vsechny vase dovednosti byly uspesne resetov\u00e1ny.
Commands.Reset.Single=[[GREEN]]Tvoje dovednost {0} byla uspesne restartovana.
Commands.Reset=[[RED]]Resetov\u00e1n\u00ed zku\u0161enost\u00ed na level 0
Commands.Skill.Invalid=[[RED]]Neplatny nazev dovednosti!
Commands.Skill.Leaderboard=[[YELLOW]]--mcMMO [[BLUE]]{0}[[YELLOW]] Tabulka nejlepsich--
Commands.SkillInfo=/<skill> [[RED]]- Zjist\u00ed\u0161 bliz\u0161\u00ed informace o skillu
@@ -352,6 +368,10 @@ Party.IsLocked=[[RED]]Tahla parta je ji\u017e uzamknuta!
Party.IsntLocked=[[RED]]Tato parta je zamknuta!
Party.Locked=[[RED]]Parta je zamnuta, pouze velitel party t\u011b m\u016f\u017ee p\u0159izvat.
Party.NotInYourParty=[[DARK_RED]]{0} nen\u00ed ve tv\u00e9 part\u011b.
Party.Owner.New=[[GREEN]]{0} se stal v\u016fdce party.
Party.Owner.NotLeader=[[DARK_RED]]U\u017e nejsi v\u016fdce party.
Party.Owner.Player=[[GREEN]]Nyn\u00ed jsi v\u016fdce party.
Party.Password.Incorrect=[[RED]]Heslo k part\u011b je \u0161patn\u011b!
Party.Password.Set=[[GREEN]]Heslo do party nastaveno na {0}
Party.Player.Invalid=[[RED]]Tohle neni platny hrac.
Party.NotOnline=[[DARK_RED]]{0} nen\u00ed online!
@@ -373,6 +393,7 @@ Commands.XPGain.Repair=Opravovani
Commands.XPGain.Swords=Zabijenim monster.
Commands.XPGain.Taming=Ochoceni zvirat nebo boj s vlky
Commands.XPGain.Unarmed=Zabijenim monster.
Commands.XPGain.Woodcutting=K\u00e1cen\u00ed strom\u016f
Commands.XPGain=[[DARK_GRAY]]Zisk dovednosti: [[WHITE]]{0}
Commands.xplock.locked=[[GOLD]]Tvuj XP bar byl uzamcen na {0}!
Commands.xplock.unlocked=[[GOLD]]Tvuj XP bar je nyni [[GREEN]]ODEMCEN[[GOLD]]!
@@ -392,6 +413,8 @@ Guides.Available=[[DARK_AQUA]]N\u00e1vod k {0} - napi\u0161te /{1} ? [page]
Guides.Excavation=[[DARK_AQUA]]O kopani:\n[[YELLOW]]Kopani je cinnost vykonavana nicenim bloku hliny lopatou a nachazenim pokladu.\n[[YELLOW]]Nicenim bloku lopatou ziskavate sanci, ze naleznete poklady.\n[[YELLOW]]Cim dele tuhle cinnost provozujete, tim vic zvysujete svou sanci k naleznuti.\n[[DARK_AQUA]]Zisk dovednosti:\n[[YELLOW]]Pro zisk dovednosti v kopani musite nicit hlinene bloky lopatou.\n[[YELLOW]]Pro naleznuti pokladu muzou byt niceni jen nektere bloky.\n[[DARK_AQUA]]Seznam bloku se sanci pro nalezeni pokladu:\n[[YELLOW]]Trava, Hlina, Pisek, Jil, Sterk, Podhubi, Zvetrany pisek\n[[DARK_AQUA]]Jak pouzivat Giga Drill Breaker:\n[[YELLOW]]S lopatou v ruce a klikem pravym tlacidlem aktivujete svuj nastroj.\n[[YELLOW]]Once in this state you have about 4 seconds to make\n[[YELLOW]]contact with Excavation compatible materials this will\n[[YELLOW]]activate Giga Drill Breaker.\n[[DARK_AQUA]]What is Giga Drill Breaker?\n[[YELLOW]]Giga Drill Breaker is an ability with a cooldown\n[[YELLOW]]tied to Excavation skill. It triples your chance\n[[YELLOW]]of finding treasures and enables instant break\n[[YELLOW]]on Excavation materials.\n[[DARK_AQUA]]How does Treasure Hunter work?\n[[YELLOW]]Every possible treasure for Excavation has its own\n[[YELLOW]]skill level requirement for it to drop, as a result it\'s\n[[YELLOW]]difficult to say how much it is helping you.\n[[YELLOW]]Just keep in mind that the higher your Excavation skill\n[[YELLOW]]is, the more treasures that can be found.\n[[YELLOW]]And also keep in mind that each type of Excavation\n[[YELLOW]]compatible material has its own unique list of treasures.\n[[YELLOW]]In other words you will find different treasures in Dirt\n[[YELLOW]]than you would in Gravel.\n[[DARK_AQUA]]Notes about Excavation:\n[[YELLOW]]Excavation drops are completely customizeable\n[[YELLOW]]So results vary server to server.
Guides.Mining=[[DARK_AQUA]]O Miningu:\n[[YELLOW]]Mining spo\u010d\u00edv\u00e1 v t\u011b\u017een\u00ed kamenu a rud. Poskytuje bonusy\n[[YELLOW]]v po\u010dtu materi\u00e1lu, kter\u00fd vyt\u011b\u017e\u00edte.\n\n[[DARK_AQUA]]Z\u00edskan\u00ed XP:\n[[YELLOW]]Aby jste dostali XP, mus\u00edte m\u00edt v ruce krump\u00e1\u010d.\n[[YELLOW]]XP v\u00e1m d\u00e1vaj\u00ed jenom jist\u00e9 bloky.\n\n[[DARK_AQUA]]Kompatibiln\u00ed materi\u00e1ly:\n[[YELLOW]]Stone, Coal Ore, Iron Ore, Gold Ore, Diamond Ore, Redstone Ore,\n[[YELLOW]]Lapis Ore, Obsidian, Mossy Cobblestone, Ender Stone,\n[[YELLOW]]Glowstone, a Netherrack.\n\n\n[[DARK_AQUA]]Jak pou\u017e\u00edt Super Breaker:\n[[YELLOW]]Dr\u017ete v ruce krump\u00e1\u010d a stisknete prav\u00e9 tla\u010ditko na my\u0161i.\n[[YELLOW]]Vr\u00e1mci \u010dty\u0159 sekund m\u00fa\u017eete buchnout do bloku, kter\u00fd je naps\u00e1n\n[[YELLOW]]v kompatibiln\u00edch materi\u00e1lech, kter\u00e9 aktivujou\n[[YELLOW]]Super Breaker.\n\n[[DARK_AQUA]]Co je to Super Breaker?\n[[YELLOW]]Super Breaker je schopnost, kter\u00e1 trv\u00e1 podle toho,\n[[YELLOW]]jak\u00fd m\u00e1te skill. Ztrojn\u00e1sobuje va\u0161i \u0161anci na z\u00edskan\u00ed extra v\u011bc\u00ed\n[[YELLOW]]a t\u011b\u017e\u00edte bloky na jednu r\u00e1nu.\n\n[[DARK_AQUA]]Jak pou\u017e\u00edt Blast Mining:\n[[YELLOW]]Kdy\u017e m\u00e1te v ruce odpalova\u010d, kter\u00fdm je flint and steel ve vychoz\u00edm nastaven\u00ed,\n[[YELLOW]]klikn\u011bte prav\u00fdm tla\u010ditkem na my\u0161i na TNT, a to zp\u016fsob\u00ed,\n[[YELLOW]]\u017ee hned bouchne.\n\n[[DARK_AQUA]]Jak funguje Blast Mining?\n[[YELLOW]]Blast Mining je schopnost, kter\u00e1 trv\u00e1 podle toho, jak\u00fd m\u00e1te\n[[YELLOW]]skill. D\u00e1va bonusy kdy\u017e t\u011b\u017e\u00edte pou\u017eit\u00edm TNT a umo\u017e\u0148uje v\u00e1m\n[[YELLOW]]d\u00e1lkov\u011b odp\u00e1lit TNT. Blast mining m\u00e1 3 \u010d\u00e1sti.\n[[YELLOW]]Prvn\u00ed \u010d\u00e1st je Bigger Bombs, kter\u00e1 zv\u011bt\u0161uje oblast v\u00fdbuchu.\n[[YELLOW]]Druh\u00e1 \u010d\u00e1st je Demolitions Expert, kter\u00e1 zvy\u0161uje po\u0161kozen\u00ed\n[[YELLOW]]v\u00fdbuchem TNT. T\u0159et\u00ed \u010d\u00e1st prost\u011b zvy\u0161uje mno\u017estvi rud, kter\u00e9\n[[YELLOW]]z\u00edsk\u00e1te z TNT a zni\u017euje su\u0165,\n[[YELLOW]]kter\u00e1 padne.
Guides.Page.Invalid=Nespr\u00e1vn\u00e9 \u010d\u00edslo str\u00e1nky!
Guides.Page.OutOfRange=Tato str\u00e1nka neexistuje, je tu pouze {0} str\u00e1nek.
Guides.Repair=[[DARK_AQUA]]Opravov\u00e1n\u00ed:\n[[YELLOW]]Oprava umo\u017e\u0148uje pou\u017e\u00edvat \u017eelezn\u00fd blok k oprav\u011b brn\u011bn\u00ed a\n[[YELLOW]]n\u00e1stroje, nebo zlat\u00fd blok, aby zachr\u00e1nil zbroj a n\u00e1stroje.\n\n[[DARK_AQUA]]XP ZISK:\n[[YELLOW]]Pro opravu n\u00e1stroj\u016f nebo brn\u011bn\u00ed se pou\u017e\u00edv\u00e1 mcMMO kovadlina.Je to\n[[YELLOW]]\u017eelezn\u00fd blok ve v\u00fdchoz\u00edm nastaven\u00ed a nem\u011bl by b\u00fdt zam\u011b\u0148ov\u00e1n s\n[[YELLOW]]the Vanilla Minecraft Anvil.\n[[DARK_AQUA]]Jak si m\u00e1m n\u011bco opravit?\n[[YELLOW]]Polo\u017e te mcMMO kovadlinu a prav\u00edm kliknut\u00edm na opravu polo\u017eky \n[[YELLOW]]kter\u00fd pr\u00e1v\u011b dr\u017e\u00ed\u0161.Spot\u0159ebuje to 1 polo\u017eku na ka\u017ed\u00e9 pou\u017eit\u00ed.\n\n[[DARK_AQUA]]Jak opravit Mastery v\u011bci?\n[[YELLOW]]Repair Mastery increases the repair amount. The extra amount\n[[YELLOW]]repaired is influenced by your Repair skill level.\n\n[[DARK_AQUA]]Jak funguje super opravov\u00e1n\u00ed?\n[[YELLOW]]Super Repair je pasivn\u00ed schopnost.P\u0159i oprav\u00e1ch polo\u017eky,\n[[YELLOW]] ud\u011bl\u00ed hr\u00e1\u010d\u016fm \u0161anci opravit polo\u017eku s\n[[YELLOW]]s dvojitou \u00fa\u010dinost\u00ed.\n\n\n\n\n[[DARK_AQUA]]Jak Arcane Forging funguje?\n[[YELLOW]]Tato pasivn\u00ed schopnost umo\u017e\u0148uje k oprav\u011b polo\u017eky s ur\u010ditou\n[[YELLOW]]\u0161ance na zachov\u00e1n\u00ed jejich kouzla. Tyto enchanty mohou b\u00fdt\n[[YELLOW]]zachov\u00e1ny, nebo sn\u00ed\u017eeny na ni\u017e\u0161\u00ed \u00farove\u0148,\n[[YELLOW]]nebo \u00fapln\u011b ztraceny.\n\n\n\n[[DARK_AQUA]]Jak funguje Salvage?\n[[YELLOW]]Polo\u017ete mcMMO kovadlinu a klikn\u011bte prav\u00fdm tla\u010d\u00edtkem my\u0161i na z\u00e1chranu\n[[YELLOW]]itemu kter\u00fd pr\u00e1v\u011b dr\u017e\u00ed\u0161.\n[[YELLOW]]This will break the item apart en give back the used ingots.\n[[YELLOW]]Pozn\u00e1mka:Je mo\u017en\u00e9 zachr\u00e1nit pouze pln\u011b opraven\u00e9 n\u00e1stroje nebo brn\u011bn\u00ed.
Inspect.Offline=[[RED]]Nem\u00e1\u0161 pr\u00e1va kontrolovat hr\u00e1\u010de co nejsou online!
Inspect.OfflineStats=mcMMO Statistiky pro offline hrace [[YELLOW]]{0}
Inspect.Stats=[[GREEN]]mcMMO Statistiky pro [[YELLOW]]{0}
@@ -414,8 +437,10 @@ Perks.lucky.name=\u0160test\u00ed
Perks.cooldowns.name=Rychle zotaveni
Perks.activationtime.name=Vytrvalost
Perks.activationtime.desc=Prodlu\u017euje pou\u017eit\u00ed schopnosti na {0} sekund.
Hardcore.Player.Loss=[GOLD]][mcMMO] [[DARK_RED]]Ztratil jsi [[BLUE]]{0}[[DARK_RED]] za smrt.
Vampirism.Killer.Success=[[GOLD]][mcMMO] [[DARK_AQUA]]Z\u00edskal jsi [[BLUE]]{0}[[DARK_AQUA]] level\u016f od [[YELLOW]]{1}.
Spout.Donate=[[YELLOW]][mcMMO] P\u0159isp\u011bjte!
Spout.Menu.ExitButton=V\u00fdchod
Spout.Menu.HudButton.1=Typ HUD: {0}
Spout.Menu.HudButton.2=Zm\u011b\u0148te si styl HUD!
MOTD.Version=[[GOLD]][mcMMO] - verze [[DARK_AQUA]]{0}

View File

@@ -98,6 +98,7 @@ Excavation.Skills.GigaDrillBreaker.Other.On=[[GREEN]]{0}[[DARK_GREEN]] has used
Excavation.Skillup=[[YELLOW]]Excavation skill increased by {0}. Total ({1})
#FISHING
Fishing.Ability.Chance=[[RED]]Bite Chance: [[YELLOW]]{0}
Fishing.Ability.Info=[[RED]]Magic Hunter: [[GRAY]] **Improves With Treasure Hunter Rank**
Fishing.Ability.Locked.0=LOCKED UNTIL {0}+ SKILL (SHAKE)
Fishing.Ability.Rank=[[RED]]Treasure Hunter Rank: [[YELLOW]]{0}/5
@@ -111,6 +112,8 @@ Fishing.Effect.4=Shake (vs. Entities)
Fishing.Effect.5=Shake items off of mobs w/ fishing pole
Fishing.Effect.6=Fisherman's Diet
Fishing.Effect.7=Improves hunger restored from fished foods
Fishing.Effect.8=Master Angler
Fishing.Effect.9=Improves chance of getting a bite while fishing
Fishing.Enchant.Chance=[[RED]]Magic Hunter Chance: [[YELLOW]]{0}
Fishing.Chance.Raining=[[BLUE]] Rain Bonus
Fishing.ItemFound=[[GRAY]]Treasure found!

View File

@@ -0,0 +1,14 @@
Acrobatics.Combat.Proc=[[GREEN]]**I\u0161vengta**
Acrobatics.SkillName=AKROBATIKA
Acrobatics.Skillup=[[YELLOW]]Akrobatiko \u012fg\u016bdis pakilo {0}. Bendras ({1})
Excavation.SkillName=KASIN\u0116JIMAS
Herbalism.Listener=\u017dOLININKYST\u0116
Mining.Ability.Ready=[[GREEN]]**TU PARUOSEI SAVO KIRTIKLI**
Mining.Skillup=[[YELLOW]]Kasinejimo igudis pakilo {0}. Bendras ({1})
Mining.Blast.Refresh=[[GREEN]]Tavo [[YELLOW]]Sprogimo kasimo [[GREEN]]sugeb\u0117jimas atsinaujino!
Swords.Combat.Bleeding.Stopped=[[GRAY]]Kraujavimas [[GREEN]]sustojo[[GRAY]]!
Commands.Party.Kick=[[RED]]Tu buvai i\u0161mestas i\u0161 grup\u0117s {0}!
Party.Unlocked=[[GRAY]]Grupe yra atrakinta
Commands.XPGain.Taming=Gyvunu prijaukinimas arba kova su savo vilkais
Commands.XPGain=[[DARK_GRAY]]PATIRTIES GAUTA: [[WHITE]]{0}
Stats.Header.Combat=[[GOLD]]-=KOVOS IGUDZIAI=-

View File

@@ -1,10 +1,36 @@
Acrobatics.Combat.Proc=[[GREEN]]**Esquivou**
Acrobatics.Effect.0=Rolar
Acrobatics.Effect.4=Esquivou
Acrobatics.Roll.Text=**Rolou**
Acrobatics.SkillName=ACROBACIA
Fishing.ItemFound=[[GRAY]]Treasure found!
Acrobatics.Skillup=[[AMARELO]]Habilidade Acrobacia aumentada em {0}. Total ({1})
Archery.Listener=Arqueiro
Archery.SkillName=ARQUEIRO
Archery.Skillup=[[AMARELO]]Habilidade Arqueiro aumentada em {0}. Total ({1})
Axes.Ability.Bonus.0=Machado
Axes.SkillName=Machado
Excavation.Effect.3=Habilidade de cavar tesouros
Excavation.SkillName=Escava\u00e7\u00e3o
Fishing.ItemFound=[[GRAY]]Tesouro encontrado!
Fishing.MagicFound=[[GRAY]]You feel a touch of magic with this catch...
Fishing.SkillName=PESCARIA
Herbalism.Listener=Herbalismo
Herbalism.SkillName=HERBALISMO
Mining.Ability.Ready=[[VERDE]]**VOC\u00ca PREPARA A SUA PICARETA**
Mining.Skillup=[[AMARELO]]Capacidade de Minar aumentada em {0}. Total ({1})
Mining.SkillName=MINERAR
Mining.Skillup=[[YELLOW]]Habilidade Minerar aumentada em {0}. Total ({1})
Mining.Blast.Boom=[[GRAY]]**BOOM**
Repair.Skills.AdeptGold=[[DARK_RED]]Voc\u00ea n\u00e3o tem nivel suficiente pra reparar Ouro.
Repair.Arcane.Fail=[[VERMELHO]]Poder misterioso saiu permanentemente do item.
Swords.Combat.Bleeding.Stopped=[[CINZA]]O sangramento tem [[VERDE]]Parado[[CINZA]]!
Swords.Combat.Bleeding.Stopped=[[GRAY]]O sangramento[[GREEN]]parou[[GRAY]]!
Swords.Effect.0=Contra-ataque
Swords.Effect.6=Sangrou
Swords.SkillName=Espada
Taming.Listener=Domar
Taming.SkillName=DOMAR
Unarmed.SkillName=DESARMAR
Woodcutting.Listener=Lenhador
Woodcutting.SkillName=Lenhador
Ability.Generic.Template=[[VERMELHO]]{0}:[[AMARELO]]{1}
Combat.ArrowDeflect=[[WHITE]]*DESVIOU A FLECHA*
Combat.BeastLore=[[GREEN]]*CONHECIMENTO DE FERAS*
@@ -14,25 +40,31 @@ Combat.Gore=[[GREEN]]*MORDIDA*
Combat.StruckByGore=[[RED]]*ATINGIDO POR MORDIDA*
Combat.TargetDazed=Alvo foi [[DARK_RED]]Atordoado
Combat.TouchedFuzzy=[[DARK_RED]]Visao turva. Sente Tonturas.
Commands.DoesNotExist=[[RED]]Player does not exist in the database!
Commands.NoConsole=This command does not support console usage.
Commands.DoesNotExist=[[RED]]Player n\u00e3o existe na database!
Commands.GodMode.Disabled=[[YELLOW]]mcMMO Modo God desabilitado
Commands.NoConsole=Esse comando n\u00e3o suporta uso no console
Commands.Party.Kick=[[RED]]Voc\u00ea foi kickado da party {0}!
Commands.Stats.Self=SEUS STATS
Party.Forbidden=[mcMMO] Parties not permitted on this world (See Permissions)
Party.Locked=[[RED]]Equipe est\u00e1 trancada, s\u00f3 o l\u00edder pode convidar.
Party.Locked=[[RED]]Equipe est\u00e1 bloqueada, s\u00f3 o l\u00edder pode convidar.
Party.NotInYourParty=[[DARK_RED]]{0} nao est\u00e1 na sua equipe
Party.Password.Set=[[GREEN]]Senha da equipe: {0}
Party.Unlocked=[[GRAY]]Equipe foi Destrancada
Commands.XPGain.Mining=Minar Pedra & Min\u00e9rio
Commands.XPGain.Acrobatics=CAINDO
Commands.XPGain.Excavation=Cavando e achando tesouros
Commands.XPGain.Mining=Minerar Pedra & Min\u00e9rio
Commands.XPGain=[[DARK_GRAY]]XP ADQUIRIDO: [[WHITE]]{0}
Commands.xplock.locked=[[GOLD]]Sua barra de XP BAR est\u00e1 travada em {0}!
Commands.xplock.unlocked=[[GOLD]]Sua barra de XP foi [[GREEN]]DESTRAVADA[[GOLD]]!
Commands.xprate.over=[[RED]]Evento de XP Rate acabou!!
XPRate.Event=[[GOLD]]mcMMO is currently in an XP rate event! XP rate is {0}x!
Guides.Axes=Guide coming soon...
Guides.Excavation=[[DARK_AQUA]]About Excavation:\n[[YELLOW]]Excavation is the act of digging up dirt to find treasures.\n[[YELLOW]]By excavating the land you will find treasures.\n[[YELLOW]]The more you do this the more treasures you can find.\n\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]To gain XP in this skill you must dig with a shovel in hand.\n[[YELLOW]]Only certain materials can be dug up for treasures and XP.\n[[DARK_AQUA]]Compatible Materials:\n[[YELLOW]]Grass, Dirt, Sand, Clay, Gravel, Mycelium, Soul Sand\n\n[[DARK_AQUA]]How to use Giga Drill Breaker:\n[[YELLOW]]With a shovel in hand right click to ready your tool.\n[[YELLOW]]Once in this state you have about 4 seconds to make\n[[YELLOW]]contact with Excavation compatible materials this will\n[[YELLOW]]activate Giga Drill Breaker.\n[[DARK_AQUA]]What is Giga Drill Breaker?\n[[YELLOW]]Giga Drill Breaker is an ability with a cooldown\n[[YELLOW]]tied to Excavation skill. It triples your chance\n[[YELLOW]]of finding treasures and enables instant break\n[[YELLOW]]on Excavation materials.\n\n[[DARK_AQUA]]How does Treasure Hunter work?\n[[YELLOW]]Every possible treasure for Excavation has its own\n[[YELLOW]]skill level requirement for it to drop, as a result it\'s\n[[YELLOW]]difficult to say how much it is helping you.\n[[YELLOW]]Just keep in mind that the higher your Excavation skill\n[[YELLOW]]is, the more treasures that can be found.\n[[YELLOW]]And also keep in mind that each type of Excavation\n[[YELLOW]]compatible material has its own unique list of treasures.\n[[YELLOW]]In other words you will find different treasures in Dirt\n[[YELLOW]]than you would in Gravel.\n[[DARK_AQUA]]Notes about Excavation:\n[[YELLOW]]Excavation drops are completely customizeable\n[[YELLOW]]So results vary server to server.
Guides.Excavation=[[DARK_AQUA]] Sobre escava\u00e7\u00e3o:.. \\ N [[YELLOW]] Escava\u00e7\u00e3o \u00e9 o ato de cavar terra para encontrar tesouros \\ n [[YELLOW]] Por escavando a terra que voc\u00ea vai encontrar tesouros \\ n [[YELLOW]] Quanto mais voc\u00ea fizer isso mais os tesouros que voc\u00ea pode encontrar \\ n \\ n [[DARK_AQUA]] gANHO XP:. \\ n [[YELLOW]] Para ganhar XP neste habilidade que voc\u00ea tem que cavar com uma p\u00e1 na m\u00e3o \\ n [[. YELLOW]] Apenas certos materiais pode ser desenterrado para tesouros e XP \\ n [[DARK_AQUA]] Materiais compat\u00edveis:. \\ n [[YELLOW]] grama, terra, areia, argila, cascalho, Mic\u00e9lio, Areia Alma \\ n \\ n [[DARK_AQUA]] Como usar Broca Giga Breaker: \\ n [[YELLOW]] com uma p\u00e1 na m\u00e3o direita clique para pronta sua ferramenta \\ n [[YELLOW]] uma vez neste estado tem cerca de 4 segundos para fazer \\. n [[YELLOW]] contato com materiais de escava\u00e7\u00e3o compat\u00edveis esta \\ n [[YELLOW]] ativar disjuntor Broca Giga. \\ n [[DARK_AQUA]] O que \u00e9 o Giga disjuntor broca? \\ n [[YELLOW]] Disjuntor Broca Giga \u00e9 uma habilidade com um cooldown \\ n [[YELLOW]] ligada \u00e0 habilidade de escava\u00e7\u00e3o. Triplica sua chance \\ n [[YELLOW]] de encontrar tesouros e permite quebra instant\u00e2nea \\ n [[YELLOW]] em materiais de escava\u00e7\u00e3o. \\ N \\ n [[DARK_AQUA]] Como Treasure Hunter trabalho? \\ N [[] YELLOW ] Cada tesouro poss\u00edvel para escava\u00e7\u00e3o tem a sua pr\u00f3pria \\ n [[YELLOW]] exig\u00eancia de n\u00edvel de habilidade para a sua queda, como resultado, \u00e9 \\ n [[YELLOW]] dif\u00edcil dizer o quanto ele est\u00e1 ajudando voc\u00ea. \\ n [[YELLOW ]] Basta ter em mente que a habilidade maior escava\u00e7\u00e3o sua \\ n [[YELLOW]] \u00e9, os mais tesouros que podem ser encontrados. \\ n [[YELLOW]] E tamb\u00e9m ter em mente que cada tipo de escava\u00e7\u00e3o \\ n [[YELLOW]] material compat\u00edvel tem sua pr\u00f3pria lista \u00fanica de tesouros. \\ n [[YELLOW]] em outras palavras, voc\u00ea vai encontrar tesouros diferentes na sujeira \\ n [[YELLOW]] do que voc\u00ea em cascalho. \\ n [[DARK_AQUA]] notas sobre a escava\u00e7\u00e3o: \\ n [[YELLOW]] gotas de escava\u00e7\u00e3o s\u00e3o completamente customizeable \\ n [[YELLOW]] Ent\u00e3o, os resultados variam de servidor para servidor.\n
Guides.Mining=[[DARK_AQUA]]About Mining:\n[[YELLOW]]Mining consists of mining stone and ores. It provides bonuses\n[[YELLOW]]to the amount of materials dropped while mining.\n\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]To gain XP in this skill, you must mine with a pickaxe in hand.\n[[YELLOW]]Only certain blocks award XP.\n\n[[DARK_AQUA]]Compatible Materials:\n[[YELLOW]]Stone, Coal Ore, Iron Ore, Gold Ore, Diamond Ore, Redstone Ore,\n[[YELLOW]]Lapis Ore, Obsidian, Mossy Cobblestone, Ender Stone,\n[[YELLOW]]Glowstone, and Netherrack.\n\n[[DARK_AQUA]]How to use Super Breaker:\n[[YELLOW]]With a pickaxe in your hand, right click to ready your tool.\n[[YELLOW]]Once in this state, you have about 4 seconds to make contact\n[[YELLOW]]with Mining compatible materials, which will activate Super\n[[YELLOW]]Breaker.\n\n[[DARK_AQUA]]What is Super Breaker?\n[[YELLOW]]Super Breaker is an ability with a cooldown tied to the Mining\n[[YELLOW]]skill. It triples your chance of extra items dropping and\n[[YELLOW]]enables instant break on Mining materials.\n\n[[DARK_AQUA]]How to use Blast Mining:\n[[YELLOW]]With a detonator in hand, which is a flint & steel by default,\n[[YELLOW]]right-click on TNT from a distance. This will cause the TNT\n[[YELLOW]]to instantly explode.\n\n[[DARK_AQUA]]How does Blast Mining work?\n[[YELLOW]]Blast Mining is an ability with a cooldown tied to the Mining\n[[YELLOW]]skill. It gives bonuses when mining with TNT and allows you\n[[YELLOW]]to remote detonate TNT. There are three parts to Blast Mining.\n[[YELLOW]]The first part is Bigger Bombs, which increases blast radius.\n[[YELLOW]]The second is Demolitions Expert, which decreases damage\n[[YELLOW]]from TNT explosions. The third part simply increases the\n[[YELLOW]]amount of ores dropped from TNT and decreases the\n[[YELLOW]]debris dropped.
Inspect.OfflineStats=mcMMO Stats for Offline Player [[YELLOW]]{0}
Inspect.OfflineStats=mcMMO Statsde player offline[[YELLOW]]{0}
Inspect.Stats=[[GREEN]]mcMMO Stats for [[YELLOW]]{0}
Inspect.TooFar=[[RED]]You are too far away to inspect that player!
Skills.Disarmed=[[DARK_RED]]Voc\u00ea foi Desarmado!
Skills.NeedMore=[[DARK_RED]]Voc\u00ea precisa de mais
Skills.TooTired=[[RED]]Voc\u00ea est\u00e1 cansado pra usar essa habilidade.
Stats.Header.Combat=[[DOURADO]]-=HABILIDADES DE COMBATE=-
Stats.Header.Combat=[[GOLD]]-=SKILLS DE COMBATE=-

View File

@@ -593,6 +593,8 @@ Smelting.SkillName=\u0412\u042b\u041f\u041b\u0410\u0412\u041a\u0410
Commands.Description.addlevels=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c mcMMO \u0443\u0440\u043e\u0432\u043d\u0435\u0439 \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439
Commands.Description.adminchat=\u0412\u043a\u043b./\u043e\u0442\u043a\u043b. \u0440\u0435\u0436\u0438\u043c \u0447\u0430\u0442\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u0435\u0436\u0434\u0443 \u0430\u0434\u043c\u0438\u043d\u0430\u043c\u0438 \u0438\u043b\u0438 \u043f\u043e\u0441\u043b\u0430\u0442\u044c \u0430\u0434\u043c\u0438\u043d\u0441\u043a\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435
Commands.Description.addxp=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u043e\u043f\u044b\u0442 mcMMO
Commands.Description.hardcore=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u043d\u0442 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0445\u0430\u0440\u0434\u043a\u043e\u0440 \u043c\u043e\u0434 \u0432\u043a\u043b/\u0432\u044b\u043a\u043b
Commands.Description.inspect=\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u0443\u044e mcMMO \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0434\u0440\u0443\u0433\u043e\u043c \u0438\u0433\u0440\u043e\u043a\u0435
Commands.Description.mcability=\u0412\u043a\u043b./\u043e\u0442\u043a\u043b. \u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u044e \u0443\u043c\u0435\u043d\u0438\u0439 mcMMO \u043a\u043b\u0438\u043a\u043e\u043c \u041f\u041a\u041c
Commands.Description.mcgod=\u0412\u043a\u043b./\u043e\u0442\u043a\u043b. \u0440\u0435\u0436\u0438\u043c-\u0431\u043e\u0433\u0430 mcMMO
Commands.Description.mcmmo=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u0440\u0430\u0442\u043a\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 mcMMO

View File

@@ -0,0 +1,656 @@
Acrobatics.Ability.Proc=[[GREEN]]**\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 Graceful Landing**
Acrobatics.DodgeChance=[[RED]]Dodge \u0e42\u0e2d\u0e01\u0e32\u0e2a: [[YELLOW]]{0}
Acrobatics.Effect.0=Roll
Acrobatics.Effect.1=\u0e25\u0e14\u0e04\u0e27\u0e32\u0e21\u0e40\u0e2a\u0e35\u0e22\u0e2b\u0e32\u0e22\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e15\u0e01\u0e08\u0e32\u0e01\u0e17\u0e35\u0e48\u0e2a\u0e39\u0e07
Acrobatics.Effect.2=Graceful Roll
Acrobatics.Effect.3=\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e1b\u0e23\u0e30\u0e2a\u0e34\u0e17\u0e18\u0e34\u0e20\u0e32\u0e1e\u0e2a\u0e2d\u0e07\u0e40\u0e17\u0e48\u0e32
Acrobatics.Effect.4=Dodge
Acrobatics.Effect.5=\u0e25\u0e14\u0e01\u0e32\u0e23\u0e44\u0e14\u0e49\u0e23\u0e31\u0e1a\u0e04\u0e27\u0e32\u0e21\u0e40\u0e2a\u0e35\u0e22\u0e2b\u0e32\u0e22\u0e04\u0e23\u0e36\u0e48\u0e07\u0e2b\u0e19\u0e36\u0e48\u0e07
Acrobatics.Listener=\u0e17\u0e31\u0e01\u0e29\u0e30 Acrobatics:
Acrobatics.Roll.Chance=[[RED]]Roll \u0e42\u0e2d\u0e01\u0e32\u0e2a: [[YELLOW]]{0}
Acrobatics.Roll.GraceChance=[[RED]]Graceful Roll \u0e42\u0e2d\u0e01\u0e32\u0e2a: [[YELLOW]]{0}
Acrobatics.Roll.Text=**\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 Rolled**
Acrobatics.SkillName=ACROBATICS
Acrobatics.Skillup=[[YELLOW]]\u0e17\u0e31\u0e01\u0e29\u0e30 Acrobatics \u0e40\u0e1e\u0e34\u0e48\u0e21\u0e02\u0e36\u0e49\u0e19 {0}. \u0e21\u0e35\u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14 ({1})
Archery.Combat.DazeChance=[[RED]]Daze \u0e42\u0e2d\u0e01\u0e32\u0e2a: [[YELLOW]]{0}
Archery.Combat.RetrieveChance=[[RED]]Retrieve Arrows \u0e42\u0e2d\u0e01\u0e32\u0e2a: [[YELLOW]]{0}
Archery.Combat.SkillshotBonus=[[RED]]\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e04\u0e27\u0e32\u0e21\u0e40\u0e2a\u0e35\u0e22\u0e2b\u0e32\u0e22\u0e14\u0e49\u0e27\u0e22\u0e18\u0e19\u0e39: [[YELLOW]]{0}
Archery.Effect.0=Skill Shot
Archery.Effect.1=\u0e04\u0e27\u0e32\u0e21\u0e40\u0e2a\u0e35\u0e22\u0e2b\u0e32\u0e22\u0e14\u0e49\u0e27\u0e22\u0e18\u0e19\u0e39\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e02\u0e36\u0e49\u0e19
Archery.Effect.2=(Players) \u0e16\u0e39\u0e01\u0e17\u0e33\u0e43\u0e2b\u0e49\u0e21\u0e36\u0e19\u0e07\u0e07
Archery.Effect.3=Disorients \u0e28\u0e31\u0e15\u0e23\u0e39\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e04\u0e27\u0e32\u0e21\u0e40\u0e2a\u0e35\u0e22\u0e2b\u0e32\u0e22 {0}
Archery.Effect.4=Arrow Retrieval
Archery.Effect.5=\u0e21\u0e35\u0e42\u0e2d\u0e01\u0e32\u0e2a\u0e44\u0e14\u0e49\u0e23\u0e31\u0e1a\u0e18\u0e19\u0e39\u0e04\u0e37\u0e19\u0e2b\u0e25\u0e31\u0e07\u0e01\u0e32\u0e23\u0e2a\u0e31\u0e07\u0e2b\u0e32\u0e23
Archery.Listener=\u0e17\u0e31\u0e01\u0e29\u0e30 Archery:
Archery.SkillName=ARCHERY
Archery.Skillup=[[YELLOW]]\u0e17\u0e31\u0e01\u0e29\u0e30 Archery \u0e40\u0e1e\u0e34\u0e48\u0e21\u0e02\u0e36\u0e49\u0e19{0}. \u0e21\u0e35\u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14 ({1})
Axes.Ability.Bonus.0=\u0e17\u0e31\u0e01\u0e29\u0e30 Axe Mastery
Axes.Ability.Bonus.1=\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e04\u0e27\u0e32\u0e21\u0e40\u0e2a\u0e35\u0e22\u0e2b\u0e32\u0e22 {0}
Axes.Ability.Bonus.2=Armor Impact
Axes.Ability.Bonus.3=\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e04\u0e27\u0e32\u0e21\u0e40\u0e2a\u0e35\u0e22\u0e2b\u0e32\u0e22 {0} \u0e43\u0e2b\u0e49\u0e01\u0e31\u0e1a\u0e40\u0e01\u0e23\u0e32\u0e30
Axes.Ability.Bonus.4=Greater Impact
Axes.Ability.Bonus.5=\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e04\u0e27\u0e32\u0e21\u0e40\u0e2a\u0e35\u0e22\u0e2b\u0e32\u0e22 {0} \u0e43\u0e2b\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 unarmored
Axes.Ability.Lower=[[GRAY]]**\u0e22\u0e01\u0e40\u0e25\u0e34\u0e01\u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30\u0e02\u0e2d\u0e07 Axe**
Axes.Ability.Ready=[[GREEN]]**\u0e04\u0e38\u0e13\u0e1e\u0e23\u0e49\u0e2d\u0e21\u0e17\u0e35\u0e48\u0e08\u0e30\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30\u0e02\u0e2d\u0e07 Axe**
Axes.Combat.CritStruck=[[DARK_RED]]\u0e04\u0e38\u0e13\u0e44\u0e14\u0e49\u0e17\u0e33 CRITICALLY HIT \u0e43\u0e2a\u0e48\u0e1c\u0e39\u0e49\u0e40\u0e25\u0e48\u0e19!
Axes.Combat.CritChance=[[RED]]Critically Strike \u0e42\u0e2d\u0e01\u0e32\u0e2a: [[YELLOW]]{0}
Axes.Combat.CriticalHit=[[RED]]\u0e42\u0e08\u0e21\u0e15\u0e35 CRITICAL!
Axes.Combat.GI.Proc=[[GREEN]]**\u0e17\u0e33\u0e04\u0e27\u0e32\u0e21\u0e40\u0e2a\u0e35\u0e22\u0e2b\u0e32\u0e22\u0e14\u0e49\u0e27\u0e22 GREAT FORCE**
Axes.Combat.GI.Struck=[[RED]]**\u0e42\u0e08\u0e21\u0e15\u0e35\u0e14\u0e49\u0e27\u0e22 GREATER IMPACT**
Axes.Combat.SS.Length=[[RED]]Skull Splitter \u0e21\u0e35\u0e23\u0e30\u0e22\u0e30\u0e40\u0e27\u0e25\u0e32: [[YELLOW]]{0}\u0e27\u0e34\u0e19\u0e32\u0e17\u0e35
Axes.Effect.0=Skull Splitter (Ability)
Axes.Effect.1=\u0e17\u0e33\u0e04\u0e27\u0e32\u0e21\u0e40\u0e2a\u0e35\u0e22\u0e2b\u0e32\u0e22\u0e27\u0e07\u0e01\u0e27\u0e49\u0e32\u0e07
Axes.Effect.2=Critical Strikes
Axes.Effect.3=\u0e01\u0e32\u0e23\u0e42\u0e08\u0e21\u0e15\u0e35\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e02\u0e36\u0e49\u0e19
Axes.Effect.4=\u0e17\u0e31\u0e01\u0e29\u0e30 Axe Mastery
Axes.Effect.5=\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e42\u0e1a\u0e19\u0e31\u0e2a\u0e04\u0e27\u0e32\u0e21\u0e40\u0e2a\u0e35\u0e22\u0e2b\u0e32\u0e22
Axes.Effect.6=Armor Impact
Axes.Effect.7=\u0e42\u0e08\u0e21\u0e15\u0e35\u0e40\u0e02\u0e49\u0e32\u0e40\u0e2a\u0e37\u0e49\u0e2d\u0e40\u0e01\u0e23\u0e32\u0e30\u0e17\u0e33\u0e43\u0e2b\u0e49\u0e40\u0e01\u0e23\u0e32\u0e30\u0e40\u0e2a\u0e35\u0e22\u0e2b\u0e32\u0e22\u0e21\u0e32\u0e01
Axes.Effect.8=Greater Impact
Axes.Effect.9=\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e04\u0e27\u0e32\u0e21\u0e40\u0e2a\u0e35\u0e22\u0e2b\u0e32\u0e22\u0e43\u0e2b\u0e49\u0e01\u0e31\u0e1a\u0e17\u0e31\u0e01\u0e29\u0e30 Unarmored
Axes.Listener=\u0e17\u0e31\u0e01\u0e29\u0e30 Axes:
Axes.SkillName=AXES
Axes.Skills.SS.Off=[[RED]]**\u0e17\u0e31\u0e01\u0e29\u0e30 Skull Splitter \u0e2b\u0e21\u0e14\u0e2a\u0e20\u0e32\u0e1e**
Axes.Skills.SS.On=[[GREEN]]**\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 Skull Splitter**
Axes.Skills.SS.Refresh=[[GREEN]]\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e17\u0e31\u0e01\u0e29\u0e30 [[YELLOW]]Skull Splitter [[GREEN]]\u0e04\u0e39\u0e25\u0e14\u0e32\u0e27\u0e19\u0e4c\u0e40\u0e2a\u0e23\u0e47\u0e08\u0e41\u0e25\u0e49\u0e27!
Axes.Skills.SS.Other.Off=[[RED]]Skull Splitter[[GREEN]] \u0e23\u0e2d\u0e01\u0e32\u0e23\u0e04\u0e39\u0e25\u0e14\u0e32\u0e27\u0e19\u0e4c [[YELLOW]]{0}
Axes.Skills.SS.Other.On=[[GREEN]]{0}[[DARK_GREEN]] \u0e44\u0e14\u0e49\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 [[RED]]Skull Splitter!
Axes.Skillup=[[YELLOW]]\u0e17\u0e31\u0e01\u0e29\u0e30 Axes \u0e40\u0e1e\u0e34\u0e48\u0e21\u0e02\u0e36\u0e49\u0e19 {0}. \u0e21\u0e35\u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14 ({1})
Excavation.Ability.Lower=[[GRAY]]**\u0e22\u0e01\u0e40\u0e25\u0e34\u0e01\u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30\u0e02\u0e2d\u0e07 Shovel**
Excavation.Ability.Ready=[[GREEN]]**\u0e04\u0e38\u0e13\u0e1e\u0e23\u0e49\u0e2d\u0e21\u0e17\u0e35\u0e48\u0e08\u0e30\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30\u0e02\u0e2d\u0e07 Shovel**
Excavation.Effect.0=Giga Drill Breaker (ABILITY)
Excavation.Effect.1=\u0e2d\u0e31\u0e15\u0e23\u0e32\u0e14\u0e23\u0e2d\u0e1b 3x , EXP 3x, +\u0e04\u0e27\u0e32\u0e21\u0e40\u0e23\u0e47\u0e27
Excavation.Effect.2=Treasure Hunter
Excavation.Effect.3=\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e43\u0e19\u0e01\u0e32\u0e23\u0e02\u0e38\u0e14\u0e2b\u0e32\u0e2a\u0e21\u0e1a\u0e31\u0e15\u0e34
Excavation.Effect.Length=[[RED]]Giga Drill Breaker \u0e21\u0e35\u0e23\u0e30\u0e22\u0e30\u0e40\u0e27\u0e25\u0e32: [[YELLOW]]{0}\u0e27\u0e34\u0e19\u0e32\u0e17\u0e35
Excavation.Listener=\u0e17\u0e31\u0e01\u0e29\u0e30 Excavation:
Excavation.SkillName=EXCAVATION
Excavation.Skills.GigaDrillBreaker.Off=[[RED]]**\u0e17\u0e31\u0e01\u0e29\u0e30 Giga Drill Breaker \u0e2b\u0e21\u0e14\u0e2a\u0e20\u0e32\u0e1e**
Excavation.Skills.GigaDrillBreaker.On=[[GREEN]]**\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 GIGA DRILL BREAKER**
Excavation.Skills.GigaDrillBreaker.Refresh=[[GREEN]]\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e17\u0e31\u0e01\u0e29\u0e30 [[YELLOW]]Giga Drill Breaker [[GREEN]]\u0e04\u0e39\u0e25\u0e14\u0e32\u0e27\u0e19\u0e4c\u0e40\u0e2a\u0e23\u0e47\u0e08\u0e41\u0e25\u0e49\u0e27!
Excavation.Skills.GigaDrillBreaker.Other.Off=[[RED]]Giga Drill Breaker[[GREEN]] \u0e23\u0e2d\u0e01\u0e32\u0e23\u0e04\u0e39\u0e25\u0e14\u0e32\u0e27\u0e19\u0e4c [[YELLOW]]{0}
Excavation.Skills.GigaDrillBreaker.Other.On=[[GREEN]]{0}[[DARK_GREEN]] \u0e44\u0e14\u0e49\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 [[RED]]Giga Drill Breaker!
Excavation.Skillup=[[YELLOW]]\u0e17\u0e31\u0e01\u0e29\u0e30 Excavation \u0e40\u0e1e\u0e34\u0e48\u0e21\u0e02\u0e36\u0e49\u0e19 {0}. \u0e21\u0e35\u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14 ({1})
Fishing.Ability.Info=[[RED]]\u0e17\u0e31\u0e01\u0e29\u0e30 Magic Hunter: [[GRAY]] **\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e41\u0e1b\u0e25\u0e07\u0e42\u0e14\u0e22\u0e23\u0e30\u0e14\u0e31\u0e1a\u0e17\u0e31\u0e01\u0e29\u0e30 Treasure Hunter**
Fishing.Ability.Locked.0=\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e1b\u0e25\u0e14\u0e25\u0e47\u0e2d\u0e01\u0e44\u0e14\u0e49\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e23\u0e30\u0e14\u0e31\u0e1a {0}+ (SHAKE)
Fishing.Ability.Rank=[[RED]]Treasure Hunter \u0e23\u0e30\u0e14\u0e31\u0e1a: [[YELLOW]]{0}/5
Fishing.Ability.Shake=[[RED]]Shake \u0e42\u0e2d\u0e01\u0e32\u0e2a: [[YELLOW]]{0}
Fishing.Ability.FD=[[RED]]Fisherman\'\'s Diet \u0e23\u0e30\u0e14\u0e31\u0e1a: [[YELLOW]]{0}
Fishing.Effect.0=Treasure Hunter (Passive)
Fishing.Effect.1=\u0e44\u0e14\u0e49\u0e23\u0e31\u0e1a\u0e27\u0e31\u0e15\u0e16\u0e38\u0e08\u0e32\u0e01\u0e01\u0e32\u0e23\u0e15\u0e01\u0e1b\u0e25\u0e32
Fishing.Effect.2=Magic Hunter
Fishing.Effect.3=\u0e04\u0e49\u0e19\u0e2b\u0e32\u0e2a\u0e34\u0e48\u0e07\u0e02\u0e2d\u0e07 enchanted
Fishing.Effect.4=Shake (vs. Entities)
Fishing.Effect.5=\u0e40\u0e02\u0e22\u0e48\u0e32\u0e40\u0e2d\u0e32\u0e2a\u0e34\u0e48\u0e07\u0e02\u0e2d\u0e07\u0e08\u0e32\u0e01 monster w/ \u0e14\u0e49\u0e27\u0e22\u0e04\u0e31\u0e19\u0e40\u0e1a\u0e47\u0e14
Fishing.Effect.6=Fisherman\'s Diet
Fishing.Effect.7=\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e04\u0e27\u0e32\u0e21\u0e2d\u0e34\u0e48\u0e21\u0e08\u0e32\u0e01\u0e01\u0e32\u0e23\u0e01\u0e34\u0e19\u0e1b\u0e25\u0e32
Fishing.Enchant.Chance=[[RED]]Magic Hunter \u0e42\u0e2d\u0e01\u0e32\u0e2a: [[YELLOW]]{0}
Fishing.Chance.Raining=[[BLUE]] Rain Bonus
Fishing.ItemFound=[[GRAY]]\u0e44\u0e14\u0e49\u0e1e\u0e1a\u0e2a\u0e21\u0e1a\u0e31\u0e15\u0e34!
Fishing.Listener=\u0e17\u0e31\u0e01\u0e29\u0e30 Fishing:
Fishing.MagicFound=[[GRAY]]\u0e04\u0e38\u0e13\u0e23\u0e39\u0e49\u0e2a\u0e36\u0e01\u0e44\u0e14\u0e49\u0e16\u0e36\u0e07\u0e2a\u0e31\u0e21\u0e1c\u0e31\u0e2a\u0e02\u0e2d\u0e07\u0e40\u0e27\u0e17\u0e21\u0e19\u0e15\u0e23\u0e4c\u0e14\u0e49\u0e27\u0e22\u0e01\u0e32\u0e23\u0e08\u0e31\u0e1a\u0e2a\u0e34\u0e48\u0e07\u0e19\u0e35\u0e49 ...
Fishing.SkillName=FISHING
Fishing.Skillup=[[YELLOW]]\u0e17\u0e31\u0e01\u0e29\u0e30 Fishing \u0e40\u0e1e\u0e34\u0e48\u0e21\u0e02\u0e36\u0e49\u0e19 {0}. \u0e21\u0e35\u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14 ({1})
Herbalism.Ability.DoubleDropChance=[[RED]]Double Drop \u0e42\u0e2d\u0e01\u0e32\u0e2a: [[YELLOW]]{0}
Herbalism.Ability.FD=[[RED]]Farmer\'\'s Diet \u0e23\u0e30\u0e14\u0e31\u0e1a: [[YELLOW]] {0}
Herbalism.Ability.GTe.Length=[[RED]]Green Terra \u0e21\u0e35\u0e23\u0e30\u0e22\u0e30\u0e40\u0e27\u0e25\u0e32: [[YELLOW]]{0}\u0e27\u0e34\u0e19\u0e32\u0e17\u0e35
Herbalism.Ability.GTe.NeedMore=[[RED]]\u0e41\u0e15\u0e48\u0e04\u0e38\u0e13\u0e15\u0e49\u0e2d\u0e07\u0e01\u0e32\u0e23\u0e40\u0e21\u0e25\u0e47\u0e14\u0e1e\u0e31\u0e19\u0e18\u0e38\u0e4c\u0e21\u0e32\u0e01\u0e02\u0e36\u0e49\u0e19\u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e43\u0e0a\u0e49 Green Terra.
Herbalism.Ability.GTh.Chance=[[RED]]Green Thumb \u0e42\u0e2d\u0e01\u0e32\u0e2a: [[YELLOW]]{0}
Herbalism.Ability.GTh.Fail=[[RED]]**GREEN THUMB \u0e25\u0e49\u0e21\u0e40\u0e2b\u0e25\u0e27**
Herbalism.Ability.GTh.Stage=[[RED]]Green Thumb \u0e08\u0e33\u0e19\u0e27\u0e19: [[YELLOW]]{0}
Herbalism.Ability.GTh=[[GREEN]]**\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 GREEN THUMB**
Herbalism.Ability.HylianLuck=[[RED]]Hylian Luck \u0e42\u0e2d\u0e01\u0e32\u0e2a: [[YELLOW]]{0}
Herbalism.Ability.Lower=[[GRAY]]**\u0e22\u0e01\u0e40\u0e25\u0e34\u0e01\u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30\u0e02\u0e2d\u0e07 Hoe**
Herbalism.Ability.Ready=[[GREEN]]**\u0e04\u0e38\u0e13\u0e1e\u0e23\u0e49\u0e2d\u0e21\u0e17\u0e35\u0e48\u0e08\u0e30\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30\u0e02\u0e2d\u0e07 Hoe**
Herbalism.Ability.ShroomThumb.Chance=[[RED]]Shroom Thumb \u0e42\u0e2d\u0e01\u0e32\u0e2a: [[YELLOW]]{0}
Herbalism.Ability.ShroomThumb.Fail=[[RED]]**SHROOM THUMB \u0e25\u0e49\u0e21\u0e40\u0e2b\u0e25\u0e27**
Herbalism.Effect.0=Green Terra (ABILITY)
Herbalism.Effect.1=\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e2d\u0e31\u0e15\u0e23\u0e32\u0e01\u0e32\u0e23\u0e14\u0e23\u0e2d\u0e1b x3
Herbalism.Effect.2=Green Thumb (\u0e02\u0e49\u0e32\u0e27\u0e40\u0e17\u0e48\u0e32\u0e19\u0e31\u0e49\u0e19)
Herbalism.Effect.3=\u0e1e\u0e37\u0e0a\u0e42\u0e15\u0e2d\u0e31\u0e15\u0e42\u0e19\u0e21\u0e31\u0e15\u0e34\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e40\u0e01\u0e47\u0e1a\u0e40\u0e01\u0e35\u0e48\u0e22\u0e27
Herbalism.Effect.4=Green Thumb (\u0e43\u0e0a\u0e49\u0e01\u0e31\u0e1a Cobble/Stone Brick/Dirt)
Herbalism.Effect.5=\u0e17\u0e33\u0e2d\u0e34\u0e10\u0e40\u0e2a\u0e35\u0e22\u0e2b\u0e23\u0e37\u0e2d\u0e17\u0e33\u0e43\u0e2b\u0e49\u0e2b\u0e0d\u0e49\u0e32\u0e40\u0e15\u0e34\u0e1a\u0e42\u0e15
Herbalism.Effect.6=Farmer\'s Diet
Herbalism.Effect.7=\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e04\u0e27\u0e32\u0e21\u0e2d\u0e34\u0e48\u0e21\u0e08\u0e32\u0e01\u0e01\u0e32\u0e23\u0e01\u0e34\u0e19\u0e2d\u0e32\u0e2b\u0e32\u0e23
Herbalism.Effect.8=Drops x2 (\u0e2a\u0e21\u0e38\u0e19\u0e44\u0e1e\u0e23\u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14)
Herbalism.Effect.9=\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e2d\u0e31\u0e04\u0e23\u0e32\u0e01\u0e32\u0e23 Drops
Herbalism.Effect.10=Hylian Luck
Herbalism.Effect.11=\u0e43\u0e2b\u0e49\u0e21\u0e35\u0e42\u0e2d\u0e01\u0e32\u0e2a\u0e40\u0e25\u0e47\u0e01\u0e19\u0e49\u0e2d\u0e22\u0e43\u0e19\u0e01\u0e32\u0e23\u0e2b\u0e32\u0e2a\u0e34\u0e48\u0e07\u0e02\u0e2d\u0e07\u0e17\u0e35\u0e48\u0e2b\u0e32\u0e22\u0e32\u0e01
Herbalism.Effect.12=Shroom Thumb
Herbalism.Effect.13=\u0e01\u0e23\u0e30\u0e08\u0e32\u0e22\u0e40\u0e2a\u0e49\u0e19\u0e43\u0e22\u0e14\u0e34\u0e19\u0e41\u0e25\u0e30\u0e2b\u0e0d\u0e49\u0e32
Herbalism.HylianLuck=[[GREEN]]\u0e04\u0e38\u0e13\u0e21\u0e35\u0e42\u0e0a\u0e04\u0e43\u0e19\u0e27\u0e31\u0e19\u0e19\u0e35\u0e49!
Herbalism.Listener=\u0e17\u0e31\u0e01\u0e29\u0e30 Herbalism:
Herbalism.SkillName=HERBALISM
Herbalism.Skills.GTe.Off=[[RED]]**\u0e17\u0e31\u0e01\u0e29\u0e30 Green Terra \u0e2b\u0e21\u0e14\u0e2a\u0e20\u0e32\u0e1e**
Herbalism.Skills.GTe.On=[[GREEN]]**\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 GREEN TERRA**
Herbalism.Skills.GTe.Refresh=[[GREEN]]Your [[YELLOW]]Green Terra [[GREEN]]\u0e04\u0e39\u0e25\u0e14\u0e32\u0e27\u0e19\u0e4c\u0e40\u0e2a\u0e23\u0e47\u0e08\u0e41\u0e25\u0e49\u0e27!
Herbalism.Skills.GTe.Other.Off=[[RED]]Green Terra[[GREEN]] \u0e23\u0e2d\u0e01\u0e32\u0e23\u0e04\u0e39\u0e25\u0e14\u0e32\u0e27\u0e19\u0e4c [[YELLOW]]{0}
Herbalism.Skills.GTe.Other.On=[[GREEN]]{0}[[DARK_GREEN]] \u0e44\u0e14\u0e49\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 [[RED]]Green Terra!
Herbalism.Skillup=[[YELLOW]]\u0e17\u0e31\u0e01\u0e29\u0e30 Herbalism \u0e40\u0e1e\u0e34\u0e48\u0e21\u0e02\u0e36\u0e49\u0e19 {0}. \u0e21\u0e35\u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14 ({1})
Mining.Ability.Length=[[RED]]Super Breaker \u0e23\u0e30\u0e22\u0e30\u0e40\u0e27\u0e25\u0e32: [[YELLOW]]{0}s
Mining.Ability.Locked.0=\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e1b\u0e25\u0e14\u0e25\u0e47\u0e2d\u0e01\u0e44\u0e14\u0e49\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e23\u0e30\u0e14\u0e31\u0e1a {0}+ (BLAST MINING)
Mining.Ability.Locked.1=\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e1b\u0e25\u0e14\u0e25\u0e47\u0e2d\u0e01\u0e44\u0e14\u0e49\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e23\u0e30\u0e14\u0e31\u0e1a {0}+ (BIGGER BOMBS)
Mining.Ability.Locked.2=\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e1b\u0e25\u0e14\u0e25\u0e47\u0e2d\u0e01\u0e44\u0e14\u0e49\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e23\u0e30\u0e14\u0e31\u0e1a {0}+ (DEMOLITIONS EXPERTISE)
Mining.Ability.Lower=[[GRAY]]**\u0e22\u0e01\u0e40\u0e25\u0e34\u0e01\u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30\u0e02\u0e2d\u0e07 Pickaxe**
Mining.Ability.Ready=[[GREEN]]**\u0e04\u0e38\u0e13\u0e1e\u0e23\u0e49\u0e2d\u0e21\u0e17\u0e35\u0e48\u0e08\u0e30\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30\u0e02\u0e2d\u0e07 Pickaxe**
Mining.Effect.0=Super Breaker (ABILITY)
Mining.Effect.1=+\u0e04\u0e27\u0e32\u0e21\u0e40\u0e23\u0e47\u0e27, \u0e40\u0e1e\u0e34\u0e48\u0e21\u0e42\u0e2d\u0e01\u0e32\u0e2a\u0e14\u0e23\u0e2d\u0e1b x3
Mining.Effect.2=Drops x2
Mining.Effect.3=\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e2d\u0e31\u0e04\u0e23\u0e32\u0e01\u0e32\u0e23 Drops
Mining.Effect.4=Blast Mining
Mining.Effect.5=\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e41\u0e23\u0e48\u0e08\u0e32\u0e01\u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49 TNT
Mining.Effect.6=Bigger Bombs
Mining.Effect.7=\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e23\u0e31\u0e28\u0e21\u0e35\u0e02\u0e2d\u0e07 TNT
Mining.Effect.8=Demolitions Expertise
Mining.Effect.9=\u0e25\u0e14\u0e01\u0e32\u0e23\u0e44\u0e14\u0e49\u0e23\u0e31\u0e1a\u0e04\u0e27\u0e32\u0e21\u0e40\u0e2a\u0e35\u0e22\u0e2b\u0e32\u0e22\u0e08\u0e32\u0e01 TNT
Mining.Effect.Decrease=[[RED]]Demolitions \u0e25\u0e14\u0e04\u0e27\u0e32\u0e21\u0e40\u0e2a\u0e35\u0e22\u0e2b\u0e32\u0e22: [[YELLOW]]{0}
Mining.Effect.DropChance=[[RED]]Double Drop \u0e42\u0e2d\u0e01\u0e32\u0e2a: [[YELLOW]]{0}
Mining.Listener=\u0e17\u0e31\u0e01\u0e29\u0e30 Mining:
Mining.SkillName=MINING
Mining.Skills.SuperBreaker.Off=[[RED]]**\u0e17\u0e31\u0e01\u0e29\u0e30 Super Breaker \u0e2b\u0e21\u0e14\u0e2a\u0e20\u0e32\u0e1e**
Mining.Skills.SuperBreaker.On=[[GREEN]]**\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 SUPER BREAKER**
Mining.Skills.SuperBreaker.Other.Off=[[RED]]Super Breaker[[GREEN]] \u0e23\u0e2d\u0e01\u0e32\u0e23\u0e04\u0e39\u0e25\u0e14\u0e32\u0e27\u0e19\u0e4c [[YELLOW]]{0}
Mining.Skills.SuperBreaker.Other.On=[[GREEN]]{0}[[DARK_GREEN]] \u0e44\u0e14\u0e49\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 [[RED]]Super Breaker!
Mining.Skills.SuperBreaker.Refresh=[[GREEN]]\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e32\u0e21\u0e23\u0e16\u0e17\u0e31\u0e01\u0e29\u0e30 [[YELLOW]]Super Breaker [[GREEN]]\u0e04\u0e39\u0e25\u0e14\u0e32\u0e27\u0e19\u0e4c\u0e40\u0e2a\u0e23\u0e47\u0e08\u0e41\u0e25\u0e49\u0e27!
Mining.Skillup=[[YELLOW]]\u0e17\u0e31\u0e01\u0e29\u0e30 Mining \u0e40\u0e1e\u0e34\u0e48\u0e21\u0e02\u0e36\u0e49\u0e19 {0}. \u0e21\u0e35\u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14 ({1})
Mining.Blast.Boom=[[GRAY]]**BOOM**
Mining.Blast.Effect=+{0} \u0e1c\u0e25\u0e1c\u0e25\u0e34\u0e15\u0e41\u0e23\u0e48, -{1} \u0e1c\u0e25\u0e1c\u0e25\u0e34\u0e15\u0e40\u0e28\u0e29, {2}x \u0e14\u0e23\u0e2d\u0e1b
Mining.Blast.Radius.Increase=[[RED]]\u0e23\u0e31\u0e28\u0e21\u0e35\u0e02\u0e2d\u0e07\u0e23\u0e30\u0e40\u0e1a\u0e34\u0e14\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e02\u0e36\u0e49\u0e19: [[YELLOW]]+{0}
Mining.Blast.Rank=[[RED]]\u0e17\u0e31\u0e01\u0e29\u0e30 Blast Mining: [[YELLOW]] \u0e23\u0e30\u0e14\u0e31\u0e1a {0}/8 [[GRAY]]({1})
Mining.Blast.Other.On=[[GREEN]]{0}[[DARK_GREEN]] \u0e44\u0e14\u0e49\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 [[RED]]Blast Mining!
Mining.Blast.Refresh=[[GREEN]]\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e17\u0e31\u0e01\u0e29\u0e30 [[YELLOW]]Blast Mining [[GREEN]]\u0e04\u0e39\u0e25\u0e14\u0e32\u0e27\u0e19\u0e4c\u0e40\u0e2a\u0e23\u0e47\u0e08\u0e41\u0e25\u0e49\u0e27!
Repair.AnvilPlaced.Spout1=[mcMMO] Anvil \u0e16\u0e39\u0e01\u0e27\u0e32\u0e07
Repair.AnvilPlaced.Spout2=\u0e04\u0e25\u0e34\u0e01\u0e02\u0e27\u0e32\u0e40\u0e1e\u0e37\u0e48\u0e21\u0e0b\u0e48\u0e2d\u0e21\u0e2a\u0e34\u0e48\u0e07\u0e02\u0e2d\u0e07!
Repair.Effect.0=\u0e0b\u0e48\u0e2d\u0e21\u0e41\u0e0b\u0e21
Repair.Effect.1=\u0e0b\u0e48\u0e2d\u0e21\u0e41\u0e0b\u0e21\u0e2d\u0e38\u0e1b\u0e01\u0e23\u0e13\u0e4c\u0e41\u0e25\u0e30\u0e40\u0e01\u0e23\u0e32\u0e30
Repair.Effect.10=\u0e0b\u0e48\u0e2d\u0e21\u0e2d\u0e38\u0e1b\u0e01\u0e23\u0e13\u0e4c\u0e17\u0e2d\u0e07 (\u0e17\u0e31\u0e01\u0e29\u0e30\u0e15\u0e49\u0e2d\u0e07\u0e01\u0e32\u0e23 {0}+)
Repair.Effect.11=\u0e0b\u0e48\u0e2d\u0e21\u0e41\u0e0b\u0e21 \u0e2d\u0e38\u0e1b\u0e01\u0e23\u0e13\u0e4c\u0e17\u0e2d\u0e07\u0e41\u0e25\u0e30\u0e40\u0e01\u0e23\u0e32\u0e30
Repair.Effect.12=\u0e0b\u0e48\u0e2d\u0e21\u0e2d\u0e38\u0e1b\u0e01\u0e23\u0e13\u0e4c\u0e40\u0e2b\u0e25\u0e47\u0e01 (\u0e17\u0e31\u0e01\u0e29\u0e30\u0e15\u0e49\u0e2d\u0e07\u0e01\u0e32\u0e23 {0}+)
Repair.Effect.13=\u0e0b\u0e48\u0e2d\u0e21\u0e41\u0e0b\u0e21 \u0e2d\u0e38\u0e1b\u0e01\u0e23\u0e13\u0e4c\u0e40\u0e2b\u0e25\u0e47\u0e01\u0e41\u0e25\u0e30\u0e40\u0e01\u0e23\u0e32\u0e30
Repair.Effect.14=\u0e0b\u0e48\u0e2d\u0e21\u0e2d\u0e38\u0e1b\u0e01\u0e23\u0e13\u0e4c\u0e2b\u0e34\u0e19 (\u0e17\u0e31\u0e01\u0e29\u0e30\u0e15\u0e49\u0e2d\u0e07\u0e01\u0e32\u0e23 {0}+)
Repair.Effect.15=\u0e0b\u0e48\u0e2d\u0e21\u0e41\u0e0b\u0e21\u0e2d\u0e38\u0e1b\u0e01\u0e23\u0e13\u0e4c\u0e2b\u0e34\u0e19
Repair.Effect.2=\u0e17\u0e31\u0e01\u0e29\u0e30 Repair Mastery
Repair.Effect.3=\u0e08\u0e33\u0e19\u0e27\u0e19\u0e40\u0e07\u0e34\u0e19\u0e17\u0e35\u0e48\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e02\u0e36\u0e49\u0e19\u0e43\u0e19\u0e01\u0e32\u0e23\u0e0b\u0e48\u0e2d\u0e21
Repair.Effect.4=Super Repair
Repair.Effect.5=\u0e1c\u0e25\u0e01\u0e32\u0e23\u0e44\u0e14\u0e49 Double
Repair.Effect.6=\u0e17\u0e31\u0e01\u0e29\u0e30 Diamond Repair ({0}+ SKILL)
Repair.Effect.7=\u0e0b\u0e48\u0e2d\u0e21\u0e41\u0e0b\u0e21 \u0e2d\u0e38\u0e1b\u0e01\u0e23\u0e13\u0e4c\u0e40\u0e1e\u0e0a\u0e23\u0e41\u0e25\u0e30\u0e40\u0e01\u0e23\u0e32\u0e30
Repair.Effect.8=Arcane Forging
Repair.Effect.9=\u0e0b\u0e48\u0e2d\u0e21\u0e2a\u0e34\u0e48\u0e07\u0e02\u0e2d\u0e07\u0e44\u0e14\u0e49\u0e23\u0e31\u0e1a\u0e01\u0e32\u0e23\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e1b\u0e23\u0e30\u0e2a\u0e34\u0e17\u0e18\u0e34\u0e20\u0e32\u0e1e\u0e02\u0e36\u0e49\u0e19
Repair.Effect.16=\u0e17\u0e31\u0e01\u0e29\u0e30 Salvage (\u0e15\u0e49\u0e2d\u0e07\u0e01\u0e32\u0e23\u0e17\u0e31\u0e01\u0e29\u0e30 {0}+)
Repair.Effect.17=\u0e01\u0e39\u0e2d\u0e38\u0e1b\u0e01\u0e23\u0e13\u0e4c\u0e41\u0e25\u0e30\u0e40\u0e01\u0e23\u0e32\u0e30
Repair.Error=[[DARK_RED]]mcMMO \u0e1e\u0e1a\u0e02\u0e49\u0e2d\u0e1c\u0e34\u0e14\u0e1e\u0e25\u0e32\u0e14\u0e1e\u0e22\u0e32\u0e22\u0e32\u0e21\u0e17\u0e35\u0e48\u0e08\u0e30\u0e0b\u0e48\u0e2d\u0e21\u0e41\u0e0b\u0e21\u0e2a\u0e34\u0e19\u0e04\u0e49\u0e32\u0e23\u0e32\u0e22\u0e01\u0e32\u0e23\u0e19\u0e35\u0e49!
Repair.Listener.Anvil=[[DARK_RED]]\u0e04\u0e38\u0e13\u0e44\u0e14\u0e49\u0e27\u0e32\u0e07 Anvil \u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e0b\u0e48\u0e2d\u0e21\u0e41\u0e0b\u0e21\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e21\u0e37\u0e2d\u0e41\u0e25\u0e30\u0e40\u0e01\u0e23\u0e32\u0e30.
Repair.Listener.Anvil2=[[DARK_RED]]\u0e04\u0e38\u0e13\u0e44\u0e14\u0e49\u0e27\u0e32\u0e07\u0e17\u0e31\u0e48\u0e07\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e01\u0e39\u0e49\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e21\u0e37\u0e2d\u0e41\u0e25\u0e30\u0e40\u0e01\u0e23\u0e32\u0e30.
Repair.Listener=\u0e17\u0e31\u0e01\u0e29\u0e30 Repair:
Repair.SkillName=REPAIR
Repair.Skills.AdeptSalvage=[[DARK_RED]]\u0e04\u0e38\u0e13\u0e44\u0e21\u0e48\u0e0a\u0e33\u0e19\u0e32\u0e0d\u0e1e\u0e2d\u0e17\u0e35\u0e48\u0e08\u0e30\u0e01\u0e2d\u0e1a\u0e01\u0e39\u0e49\u0e2a\u0e34\u0e48\u0e07\u0e02\u0e2d\u0e07\u0e19\u0e35\u0e49.
Repair.Skills.AdeptDiamond=[[DARK_RED]]\u0e17\u0e31\u0e01\u0e29\u0e30 Repair \u0e44\u0e21\u0e48\u0e1e\u0e2d\u0e17\u0e35\u0e48\u0e08\u0e30\u0e0b\u0e48\u0e2d\u0e21\u0e2d\u0e38\u0e1b\u0e01\u0e23\u0e13\u0e4c\u0e40\u0e1e\u0e0a\u0e23.
Repair.Skills.AdeptGold=[[DARK_RED]]\u0e17\u0e31\u0e01\u0e29\u0e30 Repair \u0e44\u0e21\u0e48\u0e1e\u0e2d\u0e17\u0e35\u0e48\u0e08\u0e30\u0e0b\u0e48\u0e2d\u0e21\u0e2d\u0e38\u0e1b\u0e01\u0e23\u0e13\u0e4c\u0e17\u0e2d\u0e07.
Repair.Skills.AdeptIron=[[DARK_RED]]\u0e17\u0e31\u0e01\u0e29\u0e30 Repair \u0e44\u0e21\u0e48\u0e1e\u0e2d\u0e17\u0e35\u0e48\u0e08\u0e30\u0e0b\u0e48\u0e2d\u0e21\u0e2d\u0e38\u0e1b\u0e01\u0e23\u0e13\u0e4c\u0e40\u0e2b\u0e25\u0e47\u0e01.
Repair.Skills.AdeptStone=[[DARK_RED]]\u0e17\u0e31\u0e01\u0e29\u0e30 Repair \u0e44\u0e21\u0e48\u0e1e\u0e2d\u0e17\u0e35\u0e48\u0e08\u0e30\u0e0b\u0e48\u0e2d\u0e21\u0e2d\u0e38\u0e1b\u0e01\u0e23\u0e13\u0e4c\u0e2b\u0e34\u0e19.
Repair.Skills.Adept=[[RED]]\u0e04\u0e38\u0e13\u0e21\u0e35\u0e23\u0e30\u0e14\u0e31\u0e1a\u0e01\u0e32\u0e23\u0e0b\u0e48\u0e2d\u0e21\u0e41\u0e0b\u0e21 [[YELLOW]]{0}[[RED]] \u0e40\u0e1e\u0e35\u0e22\u0e07\u0e1e\u0e2d\u0e17\u0e35\u0e48\u0e08\u0e30\u0e0b\u0e48\u0e2d\u0e21\u0e41\u0e0b\u0e21 [[YELLOW]]{1}
Repair.Skills.FeltEasy=[[GRAY]]\u0e23\u0e39\u0e49\u0e2a\u0e36\u0e01\u0e27\u0e48\u0e32\u0e21\u0e31\u0e19\u0e07\u0e48\u0e32\u0e22.
Repair.Skills.FullDurability=[[GRAY]]\u0e2a\u0e34\u0e48\u0e07\u0e19\u0e35\u0e49\u0e21\u0e35\u0e04\u0e27\u0e32\u0e21\u0e04\u0e07\u0e17\u0e19\u0e40\u0e15\u0e47\u0e21\u0e41\u0e25\u0e49\u0e27.
Repair.Skills.SalvageSuccess=[[GRAY]]\u0e2a\u0e34\u0e48\u0e07\u0e02\u0e2d\u0e07\u0e16\u0e39\u0e01\u0e01\u0e39\u0e49\u0e04\u0e37\u0e19!
Repair.Skills.NotFullDurability=[[DARK_RED]]\u0e04\u0e38\u0e13\u0e44\u0e21\u0e48\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e01\u0e2d\u0e1a\u0e01\u0e39\u0e49\u0e04\u0e27\u0e32\u0e21\u0e40\u0e2a\u0e35\u0e22\u0e2b\u0e32\u0e22\u0e2a\u0e34\u0e48\u0e07\u0e02\u0e2d\u0e07\u0e19\u0e35\u0e49.
Repair.Skills.Mastery=[[RED]]Repair Mastery: [[YELLOW]]\u0e40\u0e1e\u0e34\u0e48\u0e21 {0} \u0e15\u0e48\u0e2d\u0e01\u0e32\u0e23\u0e0b\u0e48\u0e2d\u0e21\u0e41\u0e0b\u0e21
Repair.Skills.StackedItems=[[DARK_RED]]\u0e04\u0e38\u0e13\u0e44\u0e21\u0e48\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e0b\u0e48\u0e2d\u0e21\u0e41\u0e0b\u0e21\u0e23\u0e32\u0e22\u0e01\u0e32\u0e23\u0e0b\u0e49\u0e2d\u0e19\u0e01\u0e31\u0e19\u0e44\u0e14\u0e49.
Repair.Skills.Super.Chance=[[RED]]Super Repair \u0e42\u0e2d\u0e01\u0e32\u0e2a: [[YELLOW]]{0}
Repair.Skillup=[[YELLOW]]\u0e17\u0e31\u0e01\u0e29\u0e30 Repair \u0e40\u0e1e\u0e34\u0e48\u0e21\u0e02\u0e36\u0e49\u0e19 {0}. \u0e21\u0e35\u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14 ({1})
Repair.Arcane.Chance.Downgrade=[[GRAY]]AF \u0e21\u0e35\u0e42\u0e2d\u0e01\u0e32\u0e2a\u0e25\u0e14\u0e04\u0e27\u0e32\u0e21\u0e40\u0e2a\u0e35\u0e22\u0e2b\u0e32\u0e22: [[YELLOW]]{0}%
Repair.Arcane.Chance.Success=[[GRAY]]AF \u0e42\u0e2d\u0e01\u0e32\u0e2a\u0e2a\u0e33\u0e40\u0e23\u0e47\u0e08: [[YELLOW]]{0}%
Repair.Arcane.Downgrade=[[RED]]\u0e2d\u0e33\u0e19\u0e32\u0e08\u0e25\u0e35\u0e49\u0e25\u0e31\u0e1a\u0e44\u0e14\u0e49\u0e25\u0e14\u0e25\u0e07\u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a\u0e23\u0e32\u0e22\u0e01\u0e32\u0e23\u0e19\u0e35\u0e49.
Repair.Arcane.Fail=[[RED]]\u0e2d\u0e33\u0e19\u0e32\u0e08\u0e25\u0e35\u0e49\u0e25\u0e31\u0e1a\u0e44\u0e14\u0e49\u0e17\u0e34\u0e49\u0e07\u0e2d\u0e22\u0e48\u0e32\u0e07\u0e16\u0e32\u0e27\u0e23.
Repair.Arcane.Lost=[[RED]]\u0e04\u0e38\u0e13\u0e44\u0e21\u0e48\u0e21\u0e35\u0e17\u0e31\u0e01\u0e29\u0e30\u0e1e\u0e2d\u0e17\u0e35\u0e48\u0e08\u0e30\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e1b\u0e23\u0e30\u0e2a\u0e34\u0e17\u0e18\u0e34\u0e20\u0e32\u0e1e
Repair.Arcane.Perfect=[[GREEN]]\u0e04\u0e38\u0e13\u0e44\u0e14\u0e49\u0e2d\u0e22\u0e48\u0e32\u0e07\u0e22\u0e31\u0e48\u0e07\u0e22\u0e37\u0e19\u0e1e\u0e25\u0e31\u0e07\u0e07\u0e32\u0e19\u0e25\u0e35\u0e49\u0e25\u0e31\u0e1a\u0e43\u0e19\u0e23\u0e32\u0e22\u0e01\u0e32\u0e23\u0e19\u0e35\u0e49.
Repair.Arcane.Rank=[[RED]]Arcane Forging \u0e23\u0e30\u0e14\u0e31\u0e1a: [[YELLOW]]{0}/4
Swords.Ability.Lower=[[GRAY]]**\u0e22\u0e01\u0e40\u0e25\u0e34\u0e01\u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 Sword**
Swords.Ability.Ready=[[GREEN]]**\u0e04\u0e38\u0e13\u0e1e\u0e23\u0e49\u0e2d\u0e21\u0e17\u0e35\u0e48\u0e08\u0e30\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30\u0e02\u0e2d\u0e07 Sword**
Swords.Combat.Bleed.Chance=[[RED]]Bleed \u0e42\u0e2d\u0e01\u0e32\u0e2a: [[YELLOW]]{0}
Swords.Combat.Bleed.Length=[[RED]]Bleed \u0e21\u0e35\u0e23\u0e30\u0e22\u0e30\u0e40\u0e27\u0e25\u0e32: [[YELLOW]]{0} ticks
Swords.Combat.Bleed.Note=[[GRAY]]NOTE: [[YELLOW]]1 Tick \u0e40\u0e01\u0e34\u0e14\u0e02\u0e36\u0e49\u0e19\u0e17\u0e38\u0e01 2 \u0e27\u0e34\u0e19\u0e32\u0e17\u0e35
Swords.Combat.Bleeding.Started=[[DARK_RED]] \u0e04\u0e38\u0e13\u0e01\u0e33\u0e25\u0e31\u0e07\u0e40\u0e25\u0e37\u0e2d\u0e14\u0e44\u0e2b\u0e25!
Swords.Combat.Bleeding.Stopped=[[GRAY]]\u0e17\u0e31\u0e01\u0e29\u0e30 Enemy Bleeding \u0e2b\u0e21\u0e14\u0e2a\u0e20\u0e32\u0e1e[[GREEN]]
Swords.Combat.Bleeding=[[GREEN]]**\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 ENEMY BLEEDING**
Swords.Combat.Counter.Chance=[[RED]]Counter Attack \u0e42\u0e2d\u0e01\u0e32\u0e2a: [[YELLOW]]{0}
Swords.Combat.Counter.Hit=[[DARK_RED]]\u0e42\u0e08\u0e21\u0e15\u0e35\u0e14\u0e49\u0e27\u0e22 counter-attack!
Swords.Combat.Countered=[[GREEN]]**\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 COUNTER-ATTACKED**
Swords.Combat.SS.Struck=[[DARK_RED]]\u0e23\u0e39\u0e49\u0e2a\u0e36\u0e01\u0e21\u0e36\u0e19\u0e07\u0e07 \u0e40\u0e1e\u0e23\u0e32\u0e30 \u0e17\u0e31\u0e01\u0e29\u0e30 SERRATED STRIKES!
Swords.Effect.0=Counter Attack
Swords.Effect.1=\u0e2a\u0e30\u0e17\u0e49\u0e2d\u0e19\u0e04\u0e27\u0e32\u0e21\u0e40\u0e2a\u0e35\u0e22\u0e2b\u0e32\u0e22 {0} \u0e04\u0e37\u0e19
Swords.Effect.2=Serrated Strikes (ABILITY)
Swords.Effect.3={0} \u0e04\u0e27\u0e32\u0e21\u0e40\u0e2a\u0e35\u0e22\u0e2b\u0e32\u0e22\u0e01\u0e23\u0e30\u0e08\u0e32\u0e22, \u0e40\u0e25\u0e37\u0e2d\u0e14\u0e44\u0e2b\u0e25+ \u0e01\u0e23\u0e30\u0e08\u0e32\u0e22
Swords.Effect.4=Serrated Strikes Bleed+
Swords.Effect.5={0} Tick \u0e15\u0e48\u0e2d\u0e01\u0e32\u0e23\u0e40\u0e25\u0e37\u0e2d\u0e14\u0e44\u0e2b\u0e25
Swords.Effect.6=Bleed
Swords.Effect.7=\u0e40\u0e25\u0e37\u0e2d\u0e14\u0e44\u0e2b\u0e25\u0e2d\u0e2d\u0e01
Swords.Listener=\u0e17\u0e31\u0e01\u0e29\u0e30 Swords:
Swords.SkillName=SWORDS
Swords.Skills.SS.Off=[[RED]]**\u0e17\u0e31\u0e01\u0e29\u0e30 Serrated Strikes \u0e2b\u0e21\u0e14\u0e2a\u0e20\u0e32\u0e1e**
Swords.Skills.SS.On=[[GREEN]]**\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e28\u0e30 SERRATED STRIKES**
Swords.Skills.SS.Refresh=[[GREEN]]\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e17\u0e31\u0e01\u0e29\u0e30 [[YELLOW]]Serrated Strikes [[GREEN]]\u0e04\u0e39\u0e25\u0e14\u0e32\u0e27\u0e19\u0e4c\u0e40\u0e2a\u0e23\u0e47\u0e08\u0e41\u0e25\u0e49\u0e27!
Swords.Skills.SS.Other.Off=[[RED]]Serrated Strikes[[GREEN]] \u0e23\u0e2d\u0e01\u0e32\u0e23\u0e04\u0e39\u0e25\u0e14\u0e32\u0e27\u0e19\u0e4c [[YELLOW]]{0}
Swords.Skills.SS.Other.On=[[GREEN]]{0}[[DARK_GREEN]] \u0e44\u0e14\u0e49\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 [[RED]]Serrated Strikes!
Swords.Skillup=[[YELLOW]]\u0e17\u0e31\u0e01\u0e29\u0e30 Swords \u0e40\u0e1e\u0e34\u0e48\u0e21\u0e02\u0e36\u0e49\u0e19 {0}. \u0e21\u0e35\u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14 ({1})
Swords.SS.Length=[[RED]]Serrated Strikes \u0e21\u0e35\u0e23\u0e30\u0e22\u0e30\u0e40\u0e27\u0e25\u0e32: [[YELLOW]]{0}\u0e27\u0e34\u0e19\u0e32\u0e17\u0e35
Taming.Ability.Bonus.0=Environmentally Aware
Taming.Ability.Bonus.1=\u0e2b\u0e21\u0e32\u0e1b\u0e48\u0e32\u0e2b\u0e25\u0e35\u0e01\u0e40\u0e25\u0e35\u0e48\u0e22\u0e07\u0e2d\u0e31\u0e19\u0e15\u0e23\u0e32\u0e22
Taming.Ability.Bonus.2=Thick Fur
Taming.Ability.Bonus.3=1/{0} \u0e04\u0e27\u0e32\u0e21\u0e40\u0e2a\u0e35\u0e22\u0e2b\u0e32\u0e22 \u0e15\u0e49\u0e32\u0e19\u0e17\u0e32\u0e19\u0e44\u0e1f
Taming.Ability.Bonus.4=Shock Proof
Taming.Ability.Bonus.5=\u0e41\u0e23\u0e07\u0e23\u0e30\u0e40\u0e1a\u0e34\u0e14\u0e40\u0e1b\u0e47\u0e19 1/{0} \u0e08\u0e32\u0e01\u0e04\u0e27\u0e32\u0e21\u0e40\u0e2a\u0e35\u0e22\u0e2b\u0e32\u0e22\u0e1b\u0e01\u0e15\u0e34
Taming.Ability.Bonus.6=Sharpened Claws
Taming.Ability.Bonus.7=\u0e04\u0e27\u0e32\u0e21\u0e40\u0e2a\u0e35\u0e22\u0e2b\u0e32\u0e22+{0}
Taming.Ability.Bonus.8=Fast Food Service
Taming.Ability.Bonus.9={0} \u0e42\u0e2d\u0e01\u0e32\u0e2a\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e42\u0e08\u0e21\u0e15\u0e35\u0e41\u0e25\u0e49\u0e27\u0e08\u0e30\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e1e\u0e25\u0e31\u0e07\u0e0a\u0e35\u0e27\u0e34\u0e15
Taming.Ability.Bonus.10=Holy Hound
Taming.Ability.Bonus.11=\u0e1f\u0e37\u0e49\u0e19\u0e2a\u0e38\u0e02\u0e20\u0e32\u0e1e\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e40\u0e01\u0e34\u0e14\u0e04\u0e27\u0e32\u0e21\u0e40\u0e2a\u0e35\u0e22\u0e2b\u0e32\u0e22\u0e08\u0e32\u0e01\u0e40\u0e27\u0e17\u0e21\u0e19\u0e15\u0e23\u0e4c\u0e2b\u0e23\u0e37\u0e2d\u0e22\u0e32\u0e1e\u0e34\u0e29
Taming.Ability.Locked.0=\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e1b\u0e25\u0e14\u0e25\u0e47\u0e2d\u0e01\u0e44\u0e14\u0e49\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e23\u0e30\u0e14\u0e31\u0e1a {0}+ (ENVIRONMENTALLY AWARE)
Taming.Ability.Locked.1=\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e1b\u0e25\u0e14\u0e25\u0e47\u0e2d\u0e01\u0e44\u0e14\u0e49\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e23\u0e30\u0e14\u0e31\u0e1a {0}+ (THICK FUR)
Taming.Ability.Locked.2=\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e1b\u0e25\u0e14\u0e25\u0e47\u0e2d\u0e01\u0e44\u0e14\u0e49\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e23\u0e30\u0e14\u0e31\u0e1a {0}+ (SHOCK PROOF)
Taming.Ability.Locked.3=\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e1b\u0e25\u0e14\u0e25\u0e47\u0e2d\u0e01\u0e44\u0e14\u0e49\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e23\u0e30\u0e14\u0e31\u0e1a {0}+ (SHARPENED CLAWS)
Taming.Ability.Locked.4=\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e1b\u0e25\u0e14\u0e25\u0e47\u0e2d\u0e01\u0e44\u0e14\u0e49\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e23\u0e30\u0e14\u0e31\u0e1a {0}+ (FAST FOOD SERVICE)
Taming.Ability.Locked.5=\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e1b\u0e25\u0e14\u0e25\u0e47\u0e2d\u0e01\u0e44\u0e14\u0e49\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e23\u0e30\u0e14\u0e31\u0e1a {0}+ (HOLY HOUND)
Taming.Combat.Chance.Gore=[[RED]]Gore \u0e42\u0e2d\u0e01\u0e32\u0e2a: [[YELLOW]]{0}
Taming.Effect.0=Beast Lore
Taming.Effect.1=\u0e01\u0e23\u0e30\u0e14\u0e39\u0e01\u0e43\u0e0a\u0e49\u0e15\u0e23\u0e27\u0e08\u0e2b\u0e21\u0e32\u0e1b\u0e48\u0e32\u0e41\u0e25\u0e30 ocelots
Taming.Effect.10=Shock Proof
Taming.Effect.11=\u0e04\u0e27\u0e32\u0e21\u0e40\u0e2a\u0e35\u0e22\u0e2b\u0e32\u0e22\u0e08\u0e32\u0e01\u0e23\u0e30\u0e40\u0e1a\u0e34\u0e14\u0e25\u0e14\u0e25\u0e07
Taming.Effect.12=Call of the Wild
Taming.Effect.13=\u0e40\u0e23\u0e35\u0e22\u0e01\u0e2a\u0e31\u0e15\u0e27\u0e4c\u0e21\u0e32\u0e14\u0e49\u0e32\u0e19\u0e02\u0e49\u0e32\u0e07\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13
Taming.Effect.14=[[GRAY]]COTW (Ocelot): \u0e21\u0e2d\u0e1a\u0e1b\u0e25\u0e32\u0e43\u0e19\u0e21\u0e37\u0e2d {0} \u0e0a\u0e34\u0e49\u0e19\u0e42\u0e14\u0e22\u0e01\u0e32\u0e23\u0e04\u0e25\u0e34\u0e01\u0e0b\u0e49\u0e32\u0e22
Taming.Effect.15=[[GRAY]]COTW (Wolf): \u0e21\u0e2d\u0e1a\u0e01\u0e23\u0e30\u0e14\u0e39\u0e01\u0e43\u0e19\u0e21\u0e37\u0e2d {0} \u0e0a\u0e34\u0e49\u0e19\u0e42\u0e14\u0e22\u0e04\u0e25\u0e34\u0e01\u0e0b\u0e49\u0e32\u0e22
Taming.Effect.16=Fast Food Service
Taming.Effect.17=\u0e42\u0e2d\u0e01\u0e32\u0e2a\u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a\u0e2b\u0e21\u0e32\u0e1b\u0e48\u0e32\u0e17\u0e35\u0e48\u0e08\u0e30\u0e23\u0e31\u0e01\u0e29\u0e32\u0e15\u0e31\u0e27\u0e40\u0e2d\u0e07\u0e43\u0e19\u0e01\u0e32\u0e23\u0e42\u0e08\u0e21\u0e15\u0e35
Taming.Effect.18=Holy Hound
Taming.Effect.19=\u0e23\u0e31\u0e01\u0e29\u0e32\u0e1e\u0e34\u0e29\u0e41\u0e25\u0e30\u0e40\u0e27\u0e17\u0e21\u0e19\u0e15\u0e4c
Taming.Effect.2=Gore
Taming.Effect.3=\u0e42\u0e08\u0e21\u0e15\u0e35\u0e17\u0e33 Critical \u0e41\u0e25\u0e30\u0e42\u0e2d\u0e01\u0e32\u0e2a\u0e17\u0e33\u0e43\u0e2b\u0e49\u0e40\u0e25\u0e37\u0e2d\u0e14\u0e44\u0e2b\u0e25
Taming.Effect.4=Sharpened Claws
Taming.Effect.5=\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e04\u0e27\u0e32\u0e21\u0e40\u0e2a\u0e35\u0e22\u0e2b\u0e32\u0e22
Taming.Effect.6=Environmentally Aware
Taming.Effect.7=\u0e25\u0e14\u0e04\u0e27\u0e32\u0e21\u0e40\u0e2a\u0e35\u0e22\u0e2b\u0e32\u0e22\u0e08\u0e32\u0e01\u0e01\u0e23\u0e30\u0e1a\u0e2d\u0e07\u0e40\u0e1e\u0e0a\u0e23 \u0e25\u0e32\u0e27\u0e32 \u0e01\u0e32\u0e23\u0e15\u0e01\u0e08\u0e32\u0e01\u0e17\u0e35\u0e48\u0e2a\u0e39\u0e07
Taming.Effect.8=Thick Fur
Taming.Effect.9=\u0e25\u0e14\u0e04\u0e27\u0e32\u0e21\u0e40\u0e2a\u0e35\u0e22\u0e2b\u0e32\u0e22\u0e08\u0e32\u0e01\u0e44\u0e1f
Taming.Listener.Wolf=[[DARK_GRAY]]\u0e2b\u0e21\u0e32\u0e1b\u0e48\u0e32\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13\u0e44\u0e14\u0e49\u0e01\u0e25\u0e31\u0e1a\u0e21\u0e32\u0e2b\u0e32\u0e04\u0e38\u0e13...
Taming.Listener=\u0e17\u0e31\u0e01\u0e29\u0e30 Taming:
Taming.SkillName=TAMING
Taming.Skillup=[[YELLOW]]\u0e17\u0e31\u0e01\u0e29\u0e30 Taming \u0e40\u0e1e\u0e34\u0e48\u0e21\u0e02\u0e36\u0e49\u0e19 {0}. \u0e21\u0e35\u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14 ({1})
Taming.Summon.Complete=[[GREEN]]\u0e40\u0e23\u0e35\u0e22\u0e01\u0e2a\u0e31\u0e15\u0e27\u0e4c\u0e2d\u0e2d\u0e01\u0e21\u0e32\u0e2a\u0e33\u0e40\u0e23\u0e47\u0e08
Taming.Summon.Fail.Ocelot=[[RED]]\u0e04\u0e38\u0e13\u0e21\u0e35 ocelots \u0e21\u0e32\u0e01\u0e40\u0e01\u0e34\u0e19\u0e44\u0e1b\u0e44\u0e21\u0e48\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e40\u0e23\u0e35\u0e22\u0e01\u0e2d\u0e2d\u0e01\u0e21\u0e32\u0e44\u0e14\u0e49
Taming.Summon.Fail.Wolf=[[RED]]\u0e04\u0e38\u0e13\u0e21\u0e35 wolf \u0e21\u0e32\u0e01\u0e40\u0e01\u0e34\u0e19\u0e44\u0e1b\u0e44\u0e21\u0e48\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e40\u0e23\u0e35\u0e22\u0e01\u0e2d\u0e2d\u0e01\u0e21\u0e32\u0e44\u0e14\u0e49
Unarmed.Ability.Berserk.Length=[[RED]]Berserk \u0e21\u0e35\u0e23\u0e30\u0e22\u0e30\u0e40\u0e27\u0e25\u0e32: [[YELLOW]]{0}\u0e27\u0e34\u0e19\u0e32\u0e17\u0e35
Unarmed.Ability.Bonus.0=Iron Arm Style
Unarmed.Ability.Bonus.1=+{0} \u0e04\u0e27\u0e32\u0e21\u0e40\u0e2a\u0e35\u0e22\u0e2b\u0e32\u0e22\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e02\u0e36\u0e49\u0e19
Unarmed.Ability.Chance.ArrowDeflect=[[RED]]Arrow Deflect \u0e42\u0e2d\u0e01\u0e32\u0e2a: [[YELLOW]]{0}
Unarmed.Ability.Chance.Disarm=[[RED]]Disarm \u0e42\u0e2d\u0e01\u0e32\u0e2a: [[YELLOW]]{0}
Unarmed.Ability.Chance.IronGrip=[[RED]]Iron Grip \u0e42\u0e2d\u0e01\u0e32\u0e2a: [[YELLOW]]{0}
Unarmed.Ability.IronGrip.Attacker=[[RED]]\u0e1d\u0e48\u0e32\u0e22\u0e15\u0e23\u0e07\u0e02\u0e49\u0e32\u0e21\u0e21\u0e35 iron grip!
Unarmed.Ability.IronGrip.Defender=[[GREEN]]Iron grip \u0e17\u0e33\u0e43\u0e2b\u0e49\u0e04\u0e38\u0e13\u0e44\u0e21\u0e48\u0e44\u0e14\u0e49\u0e23\u0e31\u0e1a\u0e04\u0e27\u0e32\u0e21\u0e40\u0e2a\u0e35\u0e22\u0e2b\u0e32\u0e22!
Unarmed.Ability.Lower=[[GRAY]]**\u0e04\u0e38\u0e13\u0e1e\u0e23\u0e49\u0e2d\u0e21\u0e17\u0e35\u0e48\u0e08\u0e30\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30\u0e02\u0e2d\u0e07 \u0e21\u0e37\u0e2d**
Unarmed.Ability.Ready=[[GREEN]]**\u0e04\u0e38\u0e13\u0e1e\u0e23\u0e49\u0e2d\u0e21\u0e17\u0e35\u0e48\u0e08\u0e30\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30\u0e02\u0e2d\u0e07 \u0e21\u0e37\u0e2d**
Unarmed.Effect.0=Berserk (ABILITY)
Unarmed.Effect.1=\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e01\u0e32\u0e23\u0e17\u0e33\u0e04\u0e27\u0e32\u0e21\u0e40\u0e2a\u0e35\u0e22\u0e2b\u0e32\u0e22 +50%, \u0e17\u0e33\u0e25\u0e32\u0e22\u0e27\u0e31\u0e15\u0e16\u0e38\u0e17\u0e35\u0e48\u0e2d\u0e48\u0e2d\u0e19
Unarmed.Effect.2=Disarm (Players)
Unarmed.Effect.3=\u0e02\u0e42\u0e21\u0e22\u0e2a\u0e34\u0e48\u0e07\u0e02\u0e2d\u0e07\u0e43\u0e19\u0e21\u0e37\u0e2d\u0e02\u0e2d\u0e07\u0e1c\u0e39\u0e49\u0e40\u0e25\u0e48\u0e19
Unarmed.Effect.4=Iron Arm Style
Unarmed.Effect.5=\u0e41\u0e02\u0e47\u0e07\u0e15\u0e31\u0e27\u0e41\u0e02\u0e19\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e40\u0e27\u0e25\u0e32\u0e1c\u0e48\u0e32\u0e19\u0e44\u0e1b
Unarmed.Effect.6=Arrow Deflect
Unarmed.Effect.7=Deflect arrows
Unarmed.Effect.8=Iron Grip
Unarmed.Effect.9=\u0e1b\u0e49\u0e2d\u0e07\u0e01\u0e31\u0e19\u0e44\u0e21\u0e48\u0e43\u0e2b\u0e49\u0e04\u0e38\u0e13\u0e08\u0e32\u0e01\u0e01\u0e32\u0e23\u0e16\u0e39\u0e01\u0e1b\u0e25\u0e14
Unarmed.Listener=\u0e17\u0e31\u0e01\u0e29\u0e30 Unarmed:
Unarmed.SkillName=UNARMED
Unarmed.Skills.Berserk.Off=[[RED]]**\u0e17\u0e31\u0e01\u0e29\u0e30 Berserk \u0e2b\u0e21\u0e14\u0e2a\u0e20\u0e32\u0e1e**
Unarmed.Skills.Berserk.On=[[GREEN]]**\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 BERSERK**
Unarmed.Skills.Berserk.Other.Off=[[RED]]Berserk[[GREEN]] \u0e23\u0e2d\u0e01\u0e32\u0e23\u0e04\u0e39\u0e25\u0e14\u0e32\u0e27\u0e19\u0e4c [[YELLOW]]{0}
Unarmed.Skills.Berserk.Other.On=[[GREEN]]{0}[[DARK_GREEN]] \u0e44\u0e14\u0e49\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 [[RED]]Berserk!
Unarmed.Skills.Berserk.Refresh=[[GREEN]]\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e17\u0e31\u0e01\u0e29\u0e30 [[YELLOW]]Berserk [[GREEN]]\u0e04\u0e39\u0e25\u0e14\u0e32\u0e27\u0e19\u0e4c\u0e40\u0e2a\u0e23\u0e47\u0e08\u0e41\u0e25\u0e49\u0e27!
Unarmed.Skillup=[[YELLOW]]\u0e17\u0e31\u0e01\u0e29\u0e30 Unarmed \u0e40\u0e1e\u0e34\u0e48\u0e21\u0e02\u0e36\u0e49\u0e19 {0}. \u0e21\u0e35\u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14 ({1})
Woodcutting.Ability.0=\u0e17\u0e31\u0e01\u0e29\u0e30 Leaf Blower
Woodcutting.Ability.1=\u0e17\u0e33\u0e25\u0e32\u0e22\u0e43\u0e1a\u0e44\u0e21\u0e49\u0e2d\u0e2d\u0e01
Woodcutting.Ability.Chance.DDrop=[[RED]]Double Drop \u0e42\u0e2d\u0e01\u0e32\u0e2a: [[YELLOW]]{0}
Woodcutting.Ability.Length=[[RED]]Tree Feller \u0e21\u0e35\u0e23\u0e30\u0e22\u0e30\u0e40\u0e27\u0e25\u0e32: [[YELLOW]]{0}\u0e27\u0e34\u0e19\u0e32\u0e17\u0e35
Woodcutting.Ability.Locked.0=\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e1b\u0e25\u0e14\u0e25\u0e47\u0e2d\u0e01\u0e44\u0e14\u0e49\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e23\u0e30\u0e14\u0e31\u0e1a {0}+ (LEAF BLOWER)
Woodcutting.Effect.0=Tree Feller (ABILITY)
Woodcutting.Effect.1=\u0e17\u0e33\u0e43\u0e2b\u0e49\u0e15\u0e49\u0e19\u0e44\u0e21\u0e49\u0e23\u0e30\u0e40\u0e1a\u0e34\u0e14
Woodcutting.Effect.2=Leaf Blower
Woodcutting.Effect.3=\u0e17\u0e33\u0e25\u0e32\u0e22\u0e43\u0e1a\u0e44\u0e21\u0e49\u0e2d\u0e2d\u0e01
Woodcutting.Effect.4=\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e2d\u0e31\u0e15\u0e23\u0e32\u0e01\u0e32\u0e23 Drops
Woodcutting.Effect.5=\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e2d\u0e31\u0e04\u0e23\u0e32\u0e01\u0e32\u0e23 Drops
Woodcutting.Listener=\u0e17\u0e31\u0e01\u0e29\u0e30 Woodcutting:
Woodcutting.SkillName=WOODCUTTING
Woodcutting.Skills.TreeFeller.Off=[[RED]]**\u0e17\u0e31\u0e01\u0e29\u0e30 Tree Feller \u0e2b\u0e21\u0e14\u0e2a\u0e20\u0e32\u0e1e**
Woodcutting.Skills.TreeFeller.On=[[GREEN]]**\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 TREE FELLER**
Woodcutting.Skills.TreeFeller.Refresh=[[GREEN]]\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e17\u0e31\u0e01\u0e29\u0e30 [[YELLOW]]Tree Feller [[GREEN]]\u0e04\u0e39\u0e25\u0e14\u0e32\u0e27\u0e19\u0e4c\u0e40\u0e2a\u0e23\u0e47\u0e08\u0e41\u0e25\u0e49\u0e27!
Woodcutting.Skills.TreeFeller.Other.Off=[[RED]]Tree Feller[[GREEN]] \u0e23\u0e2d\u0e01\u0e32\u0e23\u0e04\u0e39\u0e25\u0e14\u0e32\u0e27\u0e19\u0e4c [[YELLOW]]{0}
Woodcutting.Skills.TreeFeller.Other.On=[[GREEN]]{0}[[DARK_GREEN]] \u0e44\u0e14\u0e49\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 [[RED]]Tree Feller!
Woodcutting.Skills.TreeFeller.Splinter=[[RED]]\u0e02\u0e27\u0e32\u0e19\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13\u0e1e\u0e31\u0e07\u0e41\u0e25\u0e49\u0e27!
Woodcutting.Skills.TreeFellerThreshold=[[RED]]\u0e15\u0e49\u0e19\u0e44\u0e21\u0e49\u0e15\u0e49\u0e19\u0e19\u0e35\u0e49\u0e43\u0e2b\u0e0d\u0e48\u0e40\u0e01\u0e34\u0e19\u0e44\u0e1b!
Woodcutting.Skillup=[[YELLOW]]\u0e17\u0e31\u0e01\u0e29\u0e30 Woodcutting \u0e40\u0e1e\u0e34\u0e48\u0e21\u0e02\u0e36\u0e49\u0e19 {0}. \u0e21\u0e35\u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14 ({1})
Ability.Generic.Refresh=[[GREEN]]**\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 ABILITIES REFRESHED!**
Ability.Generic.Template.Lock=[[GRAY]]{0}
Ability.Generic.Template=[[RED]]{0}: [[YELLOW]]{1}
Combat.ArrowDeflect=[[WHITE]]**\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 ARROW DEFLECT**
Combat.BeastLore=[[GREEN]]**\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 BEAST LORE**
Combat.BeastLoreHealth=[[DARK_AQUA]]\u0e23\u0e30\u0e14\u0e31\u0e1a\u0e40\u0e25\u0e37\u0e2d\u0e14 ([[GREEN]]{0}[[DARK_AQUA]]/{1})
Combat.BeastLoreOwner=[[DARK_AQUA]]\u0e40\u0e08\u0e49\u0e32\u0e02\u0e2d\u0e07 ([[RED]]{0}[[DARK_AQUA]])
Combat.Gore=[[GREEN]]**\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 GORED**
Combat.StruckByGore=[[RED]]**\u0e04\u0e38\u0e13\u0e16\u0e39\u0e01\u0e17\u0e31\u0e01\u0e29\u0e30 Gored**
Combat.TargetDazed=\u0e40\u0e1b\u0e49\u0e32\u0e2b\u0e21\u0e32\u0e22\u0e17\u0e35\u0e48 [[DARK_RED]]\u0e21\u0e36\u0e19\u0e07\u0e07
Combat.TouchedFuzzy=[[DARK_RED]]\u0e04\u0e38\u0e13\u0e23\u0e39\u0e49\u0e2a\u0e36\u0e01\u0e21\u0e36\u0e19 \u0e40\u0e1e\u0e23\u0e32\u0e30 \u0e17\u0e31\u0e01\u0e29\u0e30 Touched Fuzzy.
mcMMO.Description=[[DARK_AQUA]]About the [[YELLOW]]mcMMO[[DARK_AQUA]] Project:,[[GOLD]]mcMMO is an [[RED]]open source[[GOLD]] RPG mod created in February 2011,[[GOLD]]by [[BLUE]]nossr50[[GOLD]]. The goal is to provide a quality RPG experience.,[[DARK_AQUA]]Tips:,[[GOLD]] - [[GREEN]]Use [[RED]]/mcmmo help[[GREEN]] to see commands,[[GOLD]] - [[GREEN]]Type [[RED]]/SKILLNAME[[GREEN]] to see detailed skill info,[[DARK_AQUA]]Developers:,[[GOLD]] - [[GREEN]]nossr50 [[BLUE]](Founder),[[GOLD]] - [[GREEN]]GJ [[BLUE]](Project Lead),[[GOLD]] - [[GREEN]]NuclearW [[BLUE]](Developer),[[GOLD]] - [[GREEN]]bm01 [[BLUE]](Developer),[[GOLD]] - [[GREEN]]TfT_02 [[BLUE]](Developer),[[GOLD]] - [[GREEN]]Glitchfinder [[BLUE]](Developer),[[GOLD]] - [[GREEN]]t00thpick1 [[BLUE]](Developer),[[DARK_AQUA]]Useful Links:,[[GOLD]] - [[GREEN]]https://github.com/mcMMO-Dev/mcMMO/issues[[GOLD]] Bug Reporting,[[GOLD]] - [[GREEN]]#mcmmo @ irc.esper.net[[GOLD]] IRC Chat,
Commands.addlevels.AwardAll.1=[[GREEN]]\u0e04\u0e38\u0e13\u0e44\u0e14\u0e49\u0e23\u0e31\u0e1a\u0e23\u0e32\u0e07\u0e27\u0e31\u0e25 {0} \u0e17\u0e38\u0e01\u0e17\u0e31\u0e01\u0e29\u0e30!
Commands.addlevels.AwardAll.2=[[RED]]\u0e17\u0e31\u0e01\u0e29\u0e30\u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14\u0e44\u0e14\u0e49\u0e23\u0e31\u0e1a\u0e01\u0e32\u0e23\u0e41\u0e01\u0e49\u0e44\u0e02\u0e40\u0e1e\u0e37\u0e48\u0e2d {0}.
Commands.addlevels.AwardSkill.1=[[GREEN]]\u0e04\u0e38\u0e13\u0e44\u0e14\u0e49\u0e23\u0e31\u0e1a\u0e23\u0e32\u0e07\u0e27\u0e31\u0e25 {0} \u0e43\u0e19\u0e17\u0e31\u0e01\u0e29\u0e30 {1}!
Commands.addlevels.AwardSkill.2=[[RED]]{0} \u0e44\u0e14\u0e49\u0e23\u0e31\u0e1a\u0e01\u0e32\u0e23\u0e41\u0e01\u0e49\u0e44\u0e02\u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a {1}.
Commands.addxp.AwardAll=[[GREEN]]\u0e04\u0e38\u0e13\u0e44\u0e14\u0e49\u0e23\u0e31\u0e1a\u0e23\u0e32\u0e07\u0e27\u0e31\u0e25 {0} \u0e1b\u0e23\u0e30\u0e2a\u0e1a\u0e01\u0e32\u0e23\u0e13\u0e4c\u0e43\u0e19\u0e17\u0e31\u0e01\u0e29\u0e30\u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14!
Commands.addxp.AwardSkill=[[GREEN]]\u0e04\u0e38\u0e13\u0e44\u0e14\u0e49\u0e23\u0e31\u0e1a\u0e23\u0e32\u0e07\u0e27\u0e31\u0e25 {0} \u0e1b\u0e23\u0e30\u0e2a\u0e1a\u0e01\u0e32\u0e23\u0e13\u0e4c\u0e17\u0e31\u0e01\u0e29\u0e30 {1}!
Commands.Ability.Off=Ability \u0e2d\u0e22\u0e39\u0e48\u0e43\u0e19\u0e42\u0e2b\u0e21\u0e14[[GREEN]]\u0e1b\u0e34\u0e14
Commands.Ability.On=Ability \u0e2d\u0e22\u0e39\u0e48\u0e43\u0e19\u0e42\u0e2b\u0e21\u0e14[[GREEN]]\u0e40\u0e1b\u0e34\u0e14
Commands.AdminChat.Off=Admin Chat [[RED]]\u0e16\u0e39\u0e01\u0e1b\u0e34\u0e14
Commands.AdminChat.On=Admin Chat [[GREEN]]\u0e40\u0e1b\u0e34\u0e14\u0e43\u0e0a\u0e49\u0e07\u0e32\u0e19
Commands.AdminChat.Prefix=[[AQUA]][[[WHITE]]{0}[[AQUA]]]
Commands.AdminToggle=[[RED]]- \u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e42\u0e2b\u0e21\u0e14 admin chat
Commands.Chat.Console=*Console*
Commands.Disabled=[[RED]]\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07\u0e19\u0e35\u0e49\u0e16\u0e39\u0e01\u0e1b\u0e34\u0e14\u0e44\u0e27\u0e49.
Commands.DoesNotExist=[[RED]]\u0e44\u0e21\u0e48\u0e1e\u0e1a\u0e1c\u0e39\u0e49\u0e40\u0e25\u0e48\u0e19\u0e43\u0e19\u0e10\u0e32\u0e19\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25!
Commands.GodMode.Disabled=[[YELLOW]]mcMMO \u0e42\u0e2b\u0e21\u0e14 God \u0e16\u0e39\u0e01\u0e1b\u0e34\u0e14\u0e2d\u0e22\u0e39\u0e48
Commands.GodMode.Enabled=[[YELLOW]]mcMMO \u0e42\u0e2b\u0e21\u0e14 God \u0e16\u0e39\u0e01\u0e40\u0e1b\u0e34\u0e14
Commands.GodMode.Forbidden=[mcMMO] \u0e04\u0e38\u0e13\u0e44\u0e21\u0e48\u0e44\u0e14\u0e49\u0e23\u0e31\u0e1a\u0e2d\u0e19\u0e38\u0e0d\u0e32\u0e15\u0e1a\u0e19\u0e42\u0e25\u0e01\u0e19\u0e35\u0e49 (\u0e14\u0e39 Permissions)
Commands.Inspect=<player> [[RED]]- \u0e14\u0e39\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e23\u0e32\u0e22\u0e25\u0e30\u0e40\u0e2d\u0e35\u0e22\u0e14\u0e02\u0e2d\u0e07\u0e1c\u0e39\u0e49\u0e40\u0e25\u0e48\u0e19
Commands.Invite.Accepted=[[GREEN]]\u0e22\u0e34\u0e19\u0e22\u0e2d\u0e21\u0e01\u0e32\u0e23\u0e23\u0e31\u0e1a\u0e40\u0e0a\u0e34\u0e0d. \u0e04\u0e38\u0e13\u0e44\u0e14\u0e49\u0e40\u0e02\u0e49\u0e32 party {0}
Commands.Invite.Success=[[GREEN]]\u0e2a\u0e48\u0e07\u0e04\u0e33\u0e40\u0e0a\u0e34\u0e0d\u0e41\u0e25\u0e49\u0e27\u0e1b\u0e23\u0e30\u0e2a\u0e1a\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e33\u0e40\u0e23\u0e47\u0e08.
Commands.Leaderboards=<skill> <page> [[RED]]- Leaderboards
Commands.mcc.Header=[[RED]]---[][[YELLOW]]\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07 mcMMO[[RED]][]---
Commands.mcgod=[[RED]]- \u0e42\u0e2b\u0e21\u0e14 God
Commands.mchud.Invalid=[[RED]]\u0e44\u0e21\u0e48\u0e1e\u0e1a HUD \u0e0a\u0e19\u0e34\u0e14\u0e19\u0e35\u0e49.
Commands.mcpurge.Success=[[GREEN]]\u0e10\u0e32\u0e19\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e01\u0e33\u0e25\u0e31\u0e07\u0e25\u0e49\u0e32\u0e07\u0e40\u0e23\u0e35\u0e22\u0e1a\u0e23\u0e49\u0e2d\u0e22\u0e41\u0e25\u0e49\u0e27!
Commands.mcrank.Heading=[[GOLD]]-=\u0e01\u0e32\u0e23\u0e08\u0e31\u0e14\u0e2d\u0e31\u0e19\u0e14\u0e31\u0e1a\u0e02\u0e2d\u0e07\u0e1a\u0e38\u0e04\u0e04\u0e25=-
Commands.mcrank.Overall=[[YELLOW]]\u0e23\u0e27\u0e21\u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14[[GREEN]] - [[GOLD]]\u0e23\u0e30\u0e14\u0e31\u0e1a [[WHITE]]#[[GREEN]]{0}
Commands.mcrank.Player=[[RED]]\u0e40\u0e1b\u0e49\u0e32\u0e2b\u0e21\u0e32\u0e22: [[WHITE]]{0}
Commands.mcrank.Unranked=[[WHITE]]Unranked
Commands.mcrefresh.Success=[[RED]]{0}\'\'\u0e27\u0e34\u0e19\u0e32\u0e17\u0e35 \u0e04\u0e39\u0e25\u0e14\u0e32\u0e27\u0e19\u0e4c\u0e2a\u0e33\u0e40\u0e23\u0e47\u0e08.
Commands.mcremove.Success=[[GREEN]]{0} \u0e08\u0e30\u0e16\u0e39\u0e01\u0e25\u0e1a\u0e2d\u0e2d\u0e01\u0e08\u0e32\u0e01\u0e10\u0e32\u0e19\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e17\u0e35\u0e48\u0e1b\u0e23\u0e30\u0e2a\u0e1a\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e33\u0e40\u0e23\u0e47\u0e08!
Commands.mctop.Tip=[[GOLD]]Tip: \u0e43\u0e0a\u0e49 [[RED]]/mcrank[[GOLD]] \u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e14\u0e39\u0e25\u0e33\u0e14\u0e31\u0e1a\u0e02\u0e2d\u0e07\u0e1a\u0e38\u0e04\u0e04\u0e25!
Commands.mmoedit=[player] <skill> <newvalue> [[RED]] - \u0e41\u0e01\u0e49\u0e44\u0e02\u0e40\u0e1b\u0e49\u0e32\u0e2b\u0e21\u0e32\u0e22
Commands.mmoedit.AllSkills.1=[[GREEN]]\u0e23\u0e30\u0e14\u0e31\u0e1a\u0e17\u0e31\u0e01\u0e29\u0e30\u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14\u0e16\u0e39\u0e01\u0e15\u0e31\u0e49\u0e07\u0e40\u0e1b\u0e47\u0e19 {0}!
Commands.mmoedit.Modified.1=[[GREEN]]\u0e23\u0e30\u0e14\u0e31\u0e1a\u0e40\u0e14\u0e34\u0e21\u0e04\u0e38\u0e13\u0e04\u0e37\u0e2d {0} \u0e16\u0e39\u0e01\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e40\u0e1b\u0e47\u0e19 {1}!
Commands.mmoedit.Modified.2=[[RED]]{0} \u0e44\u0e14\u0e49\u0e23\u0e31\u0e1a\u0e01\u0e32\u0e23\u0e41\u0e01\u0e49\u0e44\u0e02\u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a {1}.
Commands.mmoupdate.Start=[[GRAY]]\u0e40\u0e23\u0e34\u0e48\u0e21\u0e15\u0e49\u0e19\u0e01\u0e32\u0e23\u0e41\u0e1b\u0e25\u0e07 ...
Commands.mmoupdate.Finish=[[GREEN]]\u0e01\u0e32\u0e23\u0e41\u0e1b\u0e25\u0e07\u0e40\u0e2a\u0e23\u0e47\u0e08!
Commands.ModDescription=[[RED]]- \u0e2d\u0e48\u0e32\u0e19\u0e04\u0e33\u0e2d\u0e18\u0e34\u0e1a\u0e32\u0e22
Commands.NoConsole=\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07\u0e19\u0e35\u0e49\u0e08\u0e30\u0e44\u0e21\u0e48\u0e2a\u0e19\u0e31\u0e1a\u0e2a\u0e19\u0e38\u0e19\u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49\u0e04\u0e2d\u0e19\u0e42\u0e0b\u0e25.
Commands.Notifications.Off=\u0e01\u0e32\u0e23\u0e41\u0e08\u0e49\u0e07\u0e40\u0e15\u0e37\u0e2d\u0e19\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e43\u0e19\u0e01\u0e32\u0e23\u0e2a\u0e25\u0e31\u0e1a [[RED]]\u0e16\u0e39\u0e01\u0e1b\u0e34\u0e14
Commands.Notifications.On=\u0e01\u0e32\u0e23\u0e41\u0e08\u0e49\u0e07\u0e40\u0e15\u0e37\u0e2d\u0e19\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e43\u0e19\u0e01\u0e32\u0e23\u0e2a\u0e25\u0e31\u0e1a [[RED]]\u0e16\u0e39\u0e01\u0e40\u0e1b\u0e34\u0e14
Commands.Offline=[[RED]]\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07\u0e19\u0e35\u0e49\u0e08\u0e30\u0e44\u0e21\u0e48\u0e17\u0e33\u0e07\u0e32\u0e19\u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a\u0e1c\u0e39\u0e49\u0e40\u0e25\u0e48\u0e19 Offline.
Commands.Other=[[GREEN]]--\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07\u0e2d\u0e37\u0e48\u0e19\u0e46--
Commands.Party.Header=[[RED]]-----[][[GREEN]]PARTY[[RED]][]-----
Commands.Party.Status=[[DARK_GRAY]]\u0e0a\u0e37\u0e48\u0e2d: [[WHITE]]{0} {1}
Commands.Party.ShareMode=[[DARK_GRAY]]\u0e42\u0e2b\u0e21\u0e14\u0e41\u0e1a\u0e48\u0e07\u0e1b\u0e31\u0e19:
Commands.Party.ItemShare=[[GRAY]]\u0e2a\u0e34\u0e48\u0e07\u0e02\u0e2d\u0e07 [[DARK_AQUA]]({0})
Commands.Party.ExpShare=[[GRAY]]EXP [[DARK_AQUA]]({0})
Commands.Party.ItemShareCategories=[[DARK_GRAY]]\u0e41\u0e1a\u0e48\u0e07\u0e1b\u0e31\u0e19\u0e2a\u0e34\u0e48\u0e07\u0e02\u0e2d\u0e07: [[GRAY]][[ITALIC]]{0}
Commands.Party.MembersNear=[[DARK_GRAY]]\u0e17\u0e35\u0e48\u0e2d\u0e22\u0e39\u0e48\u0e43\u0e01\u0e25\u0e49\u0e04\u0e38\u0e13 [[DARK_AQUA]]{0}[[DARK_GRAY]]/[[DARK_AQUA]]{1}
Commands.Party.Accept=[[RED]]- \u0e22\u0e34\u0e19\u0e22\u0e2d\u0e21\u0e04\u0e33\u0e40\u0e0a\u0e34\u0e0d
Commands.Party.Chat.Off=Party Chat [[RED]]\u0e16\u0e39\u0e01\u0e1b\u0e34\u0e14
Commands.Party.Chat.On=Party Chat [[GREEN]]\u0e40\u0e1b\u0e34\u0e14
Commands.Party.Chat.Prefix=[[GREEN]]([[WHITE]]{0}[[GREEN]])
Commands.Party.Commands=[[GREEN]]--\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07 PARTY--
Commands.Party.Invite.0=[[RED]]ALERT: [[GREEN]]\u0e04\u0e38\u0e13\u0e16\u0e39\u0e01\u0e40\u0e0a\u0e34\u0e0d\u0e40\u0e02\u0e49\u0e32 party {0} \u0e08\u0e32\u0e01 {1}
Commands.Party.Invite.1=[[YELLOW]]\u0e43\u0e0a\u0e49 [[GREEN]]/party accept[[YELLOW]] \u0e40\u0e1e\u0e34\u0e48\u0e2d\u0e22\u0e2d\u0e21\u0e23\u0e31\u0e1a\u0e01\u0e32\u0e23\u0e23\u0e31\u0e1a\u0e40\u0e0a\u0e34\u0e0d
Commands.Party.Invite=[[RED]]- \u0e2a\u0e48\u0e07\u0e04\u0e33\u0e40\u0e0a\u0e34\u0e0d Party
Commands.Party.Join=[[GRAY]]\u0e44\u0e14\u0e49\u0e40\u0e02\u0e49\u0e32\u0e23\u0e48\u0e27\u0e21 Party: {0}
Commands.Party.Create=[[GRAY]]\u0e2a\u0e23\u0e49\u0e32\u0e07 Party: {0}
Commands.Party.Rename=[[GRAY]]\u0e0a\u0e37\u0e48\u0e2d Party \u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e40\u0e1b\u0e47\u0e19: [[WHITE]]{0}
Commands.Party.SetSharing=[[GRAY]]Party {0} \u0e41\u0e1a\u0e48\u0e07\u0e1b\u0e31\u0e19\u0e16\u0e39\u0e01\u0e15\u0e31\u0e49\u0e07\u0e40\u0e1b\u0e47\u0e19: [[DARK_AQUA]]{1}
Commands.Party.ToggleShareCategory=[[GRAY]]Party \u0e41\u0e1a\u0e48\u0e07\u0e1b\u0e31\u0e19\u0e2a\u0e34\u0e48\u0e07\u0e02\u0e2d\u0e07\u0e43\u0e2b\u0e49 [[GOLD]]{0} [[GRAY]]\u0e44\u0e14\u0e49\u0e23\u0e31\u0e1a [[DARK_AQUA]]{1}
Commands.Party.AlreadyExists=[[DARK_RED]]Party {0} \u0e21\u0e35\u0e2d\u0e22\u0e39\u0e48\u0e41\u0e25\u0e49\u0e27!
Commands.Party.Kick=[[RED]]\u0e04\u0e38\u0e13\u0e16\u0e39\u0e01\u0e19\u0e33\u0e2d\u0e2d\u0e01\u0e08\u0e32\u0e01 party{0}!
Commands.Party.Leave=[[RED]]\u0e04\u0e38\u0e13\u0e44\u0e14\u0e49\u0e2d\u0e2d\u0e01\u0e08\u0e32\u0e01 party
Commands.Party.Members.Header=[[RED]]-----[][[GREEN]]\u0e2a\u0e21\u0e32\u0e0a\u0e34\u0e01[[RED]][]-----
Commands.Party.None=[[RED]]\u0e04\u0e38\u0e13\u0e44\u0e21\u0e48\u0e44\u0e14\u0e49\u0e2d\u0e22\u0e39\u0e48\u0e43\u0e19 party.
Commands.Party.Quit=[[RED]]- \u0e2d\u0e2d\u0e01\u0e08\u0e32\u0e01\u0e07\u0e32\u0e19 party \u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13\u0e43\u0e19\u0e1b\u0e31\u0e08\u0e08\u0e38\u0e1a\u0e31\u0e19
Commands.Party.Teleport=<player> [[RED]]- Teleport to \u0e44\u0e1b\u0e2b\u0e32\u0e2a\u0e21\u0e32\u0e0a\u0e34\u0e01 party
Commands.Party.Toggle=[[RED]]- \u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e42\u0e2b\u0e21\u0e14 Party Chat
Commands.Party1=[[RED]]- \u0e2a\u0e23\u0e49\u0e32\u0e07 Party \u0e43\u0e2b\u0e21\u0e48
Commands.Party2=[[RED]]- \u0e40\u0e02\u0e49\u0e32\u0e23\u0e48\u0e27\u0e21 Party \u0e02\u0e2d\u0e07\u0e1c\u0e39\u0e49\u0e40\u0e25\u0e48\u0e19
Commands.ptp.Enabled=Party teleporting [[GREEN]]\u0e16\u0e39\u0e01\u0e40\u0e1b\u0e34\u0e14
Commands.ptp.Disabled=Party teleporting [[RED]]\u0e16\u0e39\u0e01\u0e1b\u0e34\u0e14
Commands.ptp.NoRequests=[[RED]]\u0e04\u0e38\u0e13\u0e22\u0e31\u0e07\u0e44\u0e21\u0e48\u0e21\u0e35\u0e01\u0e32\u0e23\u0e23\u0e49\u0e2d\u0e07\u0e02\u0e2d teleport \u0e43\u0e19\u0e40\u0e27\u0e25\u0e32\u0e19\u0e35\u0e49
Commands.ptp.NoWorldPermissions=[[RED]][mcMMO] \u0e04\u0e38\u0e13\u0e44\u0e21\u0e48\u0e44\u0e14\u0e49\u0e23\u0e31\u0e1a\u0e2d\u0e19\u0e38\u0e0d\u0e32\u0e15\u0e43\u0e2b\u0e49 teleport \u0e43\u0e19\u0e42\u0e25\u0e01\u0e19\u0e35\u0e49 {0}.
Commands.ptp.Request1=[[YELLOW]]{0} [[GREEN]]\u0e15\u0e49\u0e2d\u0e07\u0e01\u0e32\u0e23 teleport \u0e21\u0e32\u0e2b\u0e32\u0e04\u0e38\u0e13.
Commands.ptp.Request2=[[GREEN]]\u0e40\u0e1e\u0e37\u0e48\u0e2d teleport \u0e43\u0e0a\u0e49 [[YELLOW]]/ptp accept. [[GREEN]]\u0e20\u0e32\u0e22\u0e43\u0e19 [[RED]]{0} [[GREEN]]\u0e27\u0e34\u0e19\u0e32\u0e17\u0e35.
Commands.ptp.AcceptAny.Enabled=Party teleport [[GREEN]]\u0e16\u0e39\u0e01\u0e40\u0e1b\u0e34\u0e14
Commands.ptp.AcceptAny.Disabled=Party teleport [[RED]]\u0e16\u0e39\u0e01\u0e1b\u0e34\u0e14
Commands.ptp.RequestExpired=[[RED]]Party teleport \u0e2b\u0e21\u0e14\u0e40\u0e27\u0e25\u0e32\u0e41\u0e25\u0e49\u0e27!
Commands.PowerLevel.Leaderboard=[[YELLOW]]--mcMMO[[BLUE]] \u0e23\u0e30\u0e14\u0e31\u0e1a\u0e1e\u0e25\u0e31\u0e07 [[YELLOW]]Leaderboard--
Commands.PowerLevel.Capped=[[DARK_RED]]\u0e23\u0e30\u0e14\u0e31\u0e1a\u0e1e\u0e25\u0e31\u0e07: [[GREEN]]{0} [[DARK_RED]]\u0e23\u0e30\u0e14\u0e31\u0e1a\u0e40\u0e15\u0e47\u0e21: [[YELLOW]]{1}
Commands.PowerLevel=[[DARK_RED]]\u0e23\u0e30\u0e14\u0e31\u0e1a\u0e1e\u0e25\u0e31\u0e07: [[GREEN]]{0}
Commands.Reset.All=[[GREEN]]\u0e17\u0e31\u0e01\u0e29\u0e30\u0e17\u0e38\u0e01\u0e17\u0e31\u0e01\u0e29\u0e30\u0e16\u0e39\u0e01\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32\u0e43\u0e2b\u0e21\u0e48.
Commands.Reset.Single=[[GREEN]]\u0e17\u0e31\u0e01\u0e29\u0e30 {0} \u0e23\u0e30\u0e14\u0e31\u0e1a\u0e17\u0e31\u0e01\u0e29\u0e30\u0e44\u0e14\u0e49\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32\u0e43\u0e2b\u0e21\u0e48\u0e40\u0e23\u0e35\u0e22\u0e1a\u0e23\u0e49\u0e2d\u0e22\u0e41\u0e25\u0e49\u0e27.
Commands.Reset=[[RED]]\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32\u0e17\u0e31\u0e01\u0e29\u0e30\u0e43\u0e2b\u0e21\u0e48\u0e43\u0e2b\u0e49\u0e40\u0e1b\u0e47\u0e19 0
Commands.Skill.Invalid=[[RED]]\u0e44\u0e21\u0e48\u0e21\u0e35\u0e0a\u0e37\u0e48\u0e2d\u0e17\u0e31\u0e01\u0e29\u0e30\u0e19\u0e35\u0e49!
Commands.Skill.Leaderboard=[[YELLOW]]--mcMMO [[BLUE]]{0}[[YELLOW]] Leaderboard--
Commands.SkillInfo=/<skill> [[RED]]- \u0e14\u0e39\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e23\u0e32\u0e22\u0e25\u0e30\u0e40\u0e2d\u0e35\u0e22\u0e14\u0e40\u0e01\u0e35\u0e48\u0e22\u0e27\u0e01\u0e31\u0e1a\u0e17\u0e31\u0e01\u0e29\u0e30
Commands.Stats.Self=\u0e2a\u0e16\u0e34\u0e15\u0e34\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13
Commands.Stats=[[RED]]- \u0e14\u0e39\u0e2a\u0e16\u0e34\u0e15\u0e34 mcMMO \u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13
Commands.ToggleAbility=[[RED]]- \u0e40\u0e1b\u0e34\u0e14\u0e43\u0e0a\u0e49\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e42\u0e14\u0e22\u0e01\u0e32\u0e23\u0e04\u0e25\u0e34\u0e01\u0e02\u0e27\u0e32
Commands.Usage.0=[[RED]]\u0e04\u0e27\u0e23\u0e43\u0e0a\u0e49 /{0}
Commands.Usage.1=[[RED]]\u0e04\u0e27\u0e23\u0e43\u0e0a\u0e49 /{0} {1}
Commands.Usage.2=[[RED]]\u0e04\u0e27\u0e23\u0e43\u0e0a\u0e49 /{0} {1} {2}
Commands.Usage.3=[[RED]]\u0e04\u0e27\u0e23\u0e43\u0e0a\u0e49 /{0} {1} {2} {3}
Commands.Usage.Level=\u0e23\u0e30\u0e14\u0e31\u0e1a
Commands.Usage.Message=\u0e02\u0e49\u0e2d\u0e04\u0e27\u0e32\u0e21
Commands.Usage.Page=\u0e2b\u0e19\u0e49\u0e32
Commands.Usage.PartyName=\u0e0a\u0e37\u0e48\u0e2d
Commands.Usage.Password=\u0e23\u0e2b\u0e31\u0e2a\u0e1c\u0e48\u0e32\u0e19
Commands.Usage.Player=\u0e1c\u0e39\u0e49\u0e40\u0e25\u0e48\u0e19
Commands.Usage.Rate=\u0e2d\u0e31\u0e15\u0e23\u0e32
Commands.Usage.Skill=\u0e17\u0e31\u0e01\u0e29\u0e30
Commands.Usage.XP=Exp
mcMMO.NoInvites=[[RED]]\u0e04\u0e38\u0e13\u0e22\u0e31\u0e07\u0e44\u0e21\u0e48\u0e44\u0e14\u0e49\u0e16\u0e39\u0e01\u0e40\u0e0a\u0e34\u0e0d\u0e15\u0e2d\u0e19\u0e19\u0e35\u0e49
mcMMO.NoPermission=[[DARK_RED]]\u0e2a\u0e34\u0e17\u0e18\u0e34\u0e4c\u0e44\u0e21\u0e48\u0e40\u0e1e\u0e35\u0e22\u0e07\u0e1e\u0e2d.
mcMMO.NoSkillNote=[[DARK_GRAY]]\u0e2b\u0e32\u0e01\u0e04\u0e38\u0e13\u0e44\u0e21\u0e48\u0e44\u0e14\u0e49\u0e21\u0e35\u0e01\u0e32\u0e23\u0e40\u0e02\u0e49\u0e32\u0e16\u0e36\u0e07\u0e17\u0e31\u0e01\u0e29\u0e30\u0e21\u0e31\u0e19\u0e08\u0e30\u0e44\u0e21\u0e48\u0e16\u0e39\u0e01\u0e41\u0e2a\u0e14\u0e07\u0e17\u0e35\u0e48\u0e19\u0e35\u0e48
Party.Forbidden=[mcMMO] \u0e04\u0e38\u0e13\u0e44\u0e21\u0e48\u0e44\u0e14\u0e49\u0e23\u0e31\u0e1a\u0e2d\u0e19\u0e38\u0e0d\u0e32\u0e15\u0e1a\u0e19\u0e42\u0e25\u0e01\u0e19\u0e35\u0e49 (\u0e14\u0e39 Permissions)
Party.Help.0=[[RED]]\u0e04\u0e27\u0e23\u0e43\u0e0a\u0e49 [[DARK_AQUA]]{0} <player> [password].
Party.Help.1=[[RED]]\u0e2a\u0e23\u0e49\u0e32\u0e07 Party \u0e43\u0e2b\u0e21\u0e48\u0e43\u0e0a\u0e49 [[DARK_AQUA]]{0} <name> [password].
Party.Help.2=[[RED]]\u0e1b\u0e23\u0e36\u0e01\u0e29\u0e32 [[DARK_AQUA]]{0} [[RED]]\u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e40\u0e15\u0e34\u0e21
Party.Help.3=[[RED]]\u0e43\u0e0a\u0e49 [[DARK_AQUA]]{0} <player> [password] [[RED]]\u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e40\u0e02\u0e49\u0e32 [[DARK_AQUA]]{1} [[RED]]\u0e2b\u0e23\u0e37\u0e2d\u0e2d\u0e2d\u0e01
Party.Help.4=[[RED]]\u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e25\u0e47\u0e2d\u0e04\u0e2b\u0e23\u0e37\u0e2d\u0e1b\u0e25\u0e14\u0e25\u0e47\u0e2d\u0e04 Party \u0e43\u0e0a\u0e49 [[DARK_AQUA]]{0}
Party.Help.5=[[RED]]\u0e23\u0e2b\u0e31\u0e2a\u0e1c\u0e48\u0e32\u0e19\u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e1b\u0e49\u0e2d\u0e07\u0e01\u0e31\u0e19 Party \u0e43\u0e0a\u0e49 [[DARK_AQUA]]{0} <password>
Party.Help.6=[[RED]]\u0e40\u0e15\u0e30\u0e1c\u0e39\u0e49\u0e40\u0e25\u0e48\u0e19\u0e08\u0e32\u0e01 Party \u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13\u0e43\u0e0a\u0e49 [[DARK_AQUA]]{0} <player>
Party.Help.7=[[RED]]\u0e43\u0e19\u0e01\u0e32\u0e23\u0e42\u0e2d\u0e19\u0e2b\u0e31\u0e27\u0e2b\u0e19\u0e49\u0e32\u0e02\u0e2d\u0e07 Party \u0e43\u0e0a\u0e49 [[DARK_AQUA]]{0} <player>
Party.Help.8=[[RED]]\u0e22\u0e01\u0e40\u0e25\u0e34\u0e01 Party \u0e43\u0e0a\u0e49 [[DARK_AQUA]]{0}
Party.InformedOnJoin={0} [[GREEN]]\u0e44\u0e14\u0e49\u0e40\u0e02\u0e49\u0e32\u0e23\u0e48\u0e27\u0e21 Party \u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13
Party.InformedOnQuit={0} [[GREEN]]\u0e44\u0e14\u0e49\u0e2d\u0e2d\u0e01\u0e08\u0e32\u0e01 Party \u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13
Party.InformedOnNameChange=[[GOLD]]{0} [[GREEN]]\u0e44\u0e14\u0e49\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e0a\u0e37\u0e48\u0e2d Party \u0e40\u0e1b\u0e47\u0e19 [[WHITE]]{1}
Party.InvalidName=[[DARK_RED]]\u0e44\u0e21\u0e48\u0e1e\u0e1a\u0e0a\u0e37\u0e48\u0e2d party \u0e19\u0e35\u0e49.
Party.Invite.Self=[[RED]]\u0e04\u0e38\u0e13\u0e44\u0e21\u0e48\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e40\u0e0a\u0e34\u0e0d\u0e15\u0e31\u0e27\u0e40\u0e2d\u0e07\u0e44\u0e14\u0e49!
Party.IsLocked=[[RED]]Party \u0e16\u0e39\u0e01\u0e1b\u0e25\u0e14\u0e25\u0e47\u0e2d\u0e01\u0e2d\u0e22\u0e39\u0e48\u0e41\u0e25\u0e49\u0e27!
Party.IsntLocked=[[RED]]party \u0e22\u0e31\u0e07\u0e44\u0e21\u0e48\u0e1b\u0e25\u0e14\u0e25\u0e47\u0e2d\u0e01!
Party.Locked=[[RED]]Party \u0e16\u0e39\u0e01\u0e25\u0e47\u0e2d\u0e01\u0e44\u0e27\u0e49 \u0e15\u0e49\u0e2d\u0e07\u0e43\u0e2b\u0e49\u0e2b\u0e31\u0e27\u0e2b\u0e19\u0e49\u0e32 Party \u0e40\u0e0a\u0e34\u0e0d\u0e40\u0e17\u0e48\u0e32\u0e19\u0e31\u0e49\u0e19.
Party.NotInYourParty=[[DARK_RED]]{0} \u0e44\u0e21\u0e48\u0e44\u0e14\u0e49\u0e2d\u0e22\u0e39\u0e48\u0e43\u0e19 party \u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13
Party.NotOwner=[[DARK_RED]]\u0e04\u0e38\u0e13\u0e44\u0e21\u0e48\u0e44\u0e14\u0e49\u0e40\u0e1b\u0e47\u0e19\u0e2b\u0e31\u0e27\u0e2b\u0e19\u0e49\u0e32 Party.
Party.Owner.New=[[GREEN]]{0} \u0e44\u0e14\u0e49\u0e40\u0e1b\u0e47\u0e19\u0e2b\u0e31\u0e27\u0e2b\u0e19\u0e49\u0e32 Party \u0e43\u0e2b\u0e21\u0e48.
Party.Owner.NotLeader=[[DARK_RED]]\u0e04\u0e38\u0e13\u0e08\u0e30\u0e44\u0e21\u0e48\u0e44\u0e14\u0e49\u0e40\u0e1b\u0e47\u0e19\u0e2b\u0e31\u0e27\u0e2b\u0e19\u0e49\u0e32 Party.
Party.Owner.Player=[[DARK_RED]]\u0e04\u0e38\u0e13\u0e44\u0e14\u0e49\u0e40\u0e1b\u0e47\u0e19\u0e2b\u0e31\u0e27\u0e2b\u0e19\u0e49\u0e32 Party.
Party.Password.None=[[RED]]Party \u0e19\u0e35\u0e49\u0e21\u0e35\u0e23\u0e2b\u0e31\u0e2a\u0e1c\u0e48\u0e32\u0e19\u0e1b\u0e49\u0e2d\u0e07\u0e01\u0e31\u0e19 \u0e42\u0e1b\u0e23\u0e14\u0e23\u0e30\u0e1a\u0e38\u0e23\u0e2b\u0e31\u0e2a\u0e1c\u0e48\u0e32\u0e19\u0e17\u0e35\u0e48\u0e08\u0e30\u0e40\u0e02\u0e49\u0e32\u0e23\u0e48\u0e27\u0e21.
Party.Password.Incorrect=[[RED]]\u0e23\u0e2b\u0e31\u0e2a\u0e1c\u0e48\u0e32\u0e19 Party \u0e44\u0e21\u0e48\u0e16\u0e39\u0e01\u0e15\u0e49\u0e2d\u0e07.
Party.Password.Set=[[GREEN]]\u0e23\u0e2b\u0e31\u0e2a\u0e1c\u0e48\u0e32\u0e19 Party \u0e16\u0e39\u0e01\u0e15\u0e31\u0e49\u0e07\u0e40\u0e1b\u0e47\u0e19 {0}
Party.Password.Removed=[[GREEN]]\u0e23\u0e2b\u0e31\u0e2a\u0e1c\u0e48\u0e32\u0e19 Party \u0e16\u0e39\u0e01\u0e25\u0e49\u0e32\u0e07\u0e2d\u0e2d\u0e01.
Party.Player.Invalid=[[RED]]\u0e0a\u0e37\u0e48\u0e2d\u0e1c\u0e39\u0e49\u0e40\u0e25\u0e48\u0e19\u0e1c\u0e34\u0e14\u0e1e\u0e25\u0e32\u0e14.
Party.NotOnline=[[DARK_RED]]{0} \u0e44\u0e21\u0e48\u0e44\u0e14\u0e49 Online!
Party.Player.InSameParty=[[RED]]{0} \u0e44\u0e14\u0e49\u0e2d\u0e22\u0e39\u0e48\u0e43\u0e19 Party \u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13\u0e41\u0e25\u0e49\u0e27!
Party.PlayerNotInParty=[[DARK_RED]]{0} \u0e44\u0e21\u0e48\u0e44\u0e14\u0e49\u0e2d\u0e22\u0e39\u0e48\u0e43\u0e19 Party
Party.Specify=[[RED]]\u0e04\u0e38\u0e13\u0e15\u0e49\u0e2d\u0e07\u0e23\u0e30\u0e1a\u0e38 Party.
Party.Teleport.Dead=[[RED]]\u0e04\u0e39\u0e13\u0e44\u0e21\u0e48\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16 teleport \u0e44\u0e1b\u0e2b\u0e32\u0e1c\u0e39\u0e40\u0e25\u0e48\u0e19\u0e19\u0e35\u0e49\u0e44\u0e14\u0e49.
Party.Teleport.Hurt=[[RED]]\u0e04\u0e38\u0e13\u0e44\u0e14\u0e49\u0e23\u0e31\u0e1a\u0e1a\u0e32\u0e14\u0e40\u0e08\u0e47\u0e1a\u0e43\u0e19\u0e0a\u0e48\u0e27\u0e07 {0} \u0e27\u0e34\u0e19\u0e32\u0e17\u0e35\u0e41\u0e25\u0e30\u0e44\u0e21\u0e48\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16 teleport.
Party.Teleport.Player=[[GREEN]]\u0e04\u0e38\u0e13\u0e44\u0e14\u0e49 teleport \u0e44\u0e1b\u0e2b\u0e32 {0}.
Party.Teleport.Self=[[RED]]\u0e04\u0e38\u0e13\u0e44\u0e21\u0e48\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16 teleport \u0e44\u0e1b\u0e2b\u0e32\u0e04\u0e38\u0e13\u0e40\u0e2d\u0e07\u0e44\u0e14\u0e49
Party.Teleport.Target=[[GREEN]]{0} \u0e44\u0e14\u0e49\u0e17\u0e33\u0e01\u0e32\u0e23 teleport \u0e21\u0e32\u0e2b\u0e32\u0e04\u0e38\u0e13.
Party.Teleport.Disabled=[[RED]]{0} \u0e44\u0e21\u0e48\u0e2d\u0e19\u0e38\u0e0d\u0e32\u0e15\u0e43\u0e2b\u0e49\u0e1a\u0e38\u0e04\u0e04\u0e25 teleport.
Party.Rename.Same=[[RED]]\u0e0a\u0e37\u0e48\u0e2d\u0e19\u0e35\u0e49\u0e21\u0e35\u0e43\u0e19 Party \u0e41\u0e25\u0e49\u0e27!
Party.Join.Self=[[RED]]\u0e04\u0e38\u0e13\u0e44\u0e21\u0e48\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e40\u0e02\u0e49\u0e32\u0e23\u0e48\u0e27\u0e21\u0e14\u0e49\u0e27\u0e22\u0e15\u0e31\u0e27\u0e04\u0e38\u0e13\u0e40\u0e2d\u0e07!
Party.Unlocked=[[GRAY]]Party \u0e16\u0e39\u0e01\u0e1b\u0e25\u0e14\u0e25\u0e47\u0e2d\u0e01
Party.Disband=[[GRAY]]Party \u0e16\u0e39\u0e01\u0e1b\u0e34\u0e14\u0e44\u0e27\u0e49
Party.Status.Locked=[[DARK_RED]](\u0e40\u0e0a\u0e34\u0e0d\u0e2d\u0e22\u0e48\u0e32\u0e07\u0e40\u0e14\u0e35\u0e22\u0e27)
Party.Status.Unlocked=[[DARK_GREEN]](\u0e40\u0e1b\u0e34\u0e14)
Party.ShareType.Exp=EXP
Party.ShareType.Item=\u0e2a\u0e34\u0e48\u0e07\u0e02\u0e2d\u0e07
Party.ShareMode.None=NONE
Party.ShareMode.Equal=\u0e40\u0e17\u0e48\u0e32\u0e01\u0e31\u0e19
Party.ShareMode.Random=\u0e2a\u0e38\u0e48\u0e21
Party.ExpShare.Disabled=[[RED]]Party \u0e41\u0e1a\u0e48\u0e07\u0e1b\u0e31\u0e19\u0e1b\u0e23\u0e30\u0e2a\u0e1a\u0e01\u0e32\u0e23\u0e13\u0e4c\u0e16\u0e39\u0e01\u0e1b\u0e34\u0e14.
Party.ItemShare.Disabled=[[RED]]Party \u0e41\u0e1a\u0e48\u0e07\u0e1b\u0e31\u0e19\u0e2a\u0e34\u0e48\u0e07\u0e02\u0e2d\u0e07\u0e16\u0e39\u0e01\u0e1b\u0e34\u0e14.
Commands.XPGain.Acrobatics=Falling
Commands.XPGain.Archery=\u0e17\u0e33\u0e01\u0e32\u0e23\u0e42\u0e08\u0e21\u0e15\u0e35 Monster
Commands.XPGain.Axes=\u0e17\u0e33\u0e01\u0e32\u0e23\u0e42\u0e08\u0e21\u0e15\u0e35 Monster
Commands.XPGain.Child=\u0e23\u0e30\u0e14\u0e31\u0e1a\u0e23\u0e32\u0e07\u0e27\u0e31\u0e25\u0e08\u0e32\u0e01\u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30
Commands.XPGain.Excavation=\u0e02\u0e38\u0e14\u0e41\u0e25\u0e30\u0e2b\u0e32\u0e2a\u0e21\u0e1a\u0e31\u0e15\u0e34
Commands.XPGain.Fishing=Fishing!
Commands.XPGain.Herbalism=Harvesting Herbs
Commands.XPGain.Mining=\u0e01\u0e32\u0e23\u0e17\u0e33\u0e40\u0e2b\u0e21\u0e37\u0e2d\u0e07\u0e41\u0e23\u0e48\u0e2b\u0e34\u0e19\u0e41\u0e25\u0e30\u0e41\u0e23\u0e48
Commands.XPGain.Repair=Repairing
Commands.XPGain.Swords=\u0e17\u0e33\u0e01\u0e32\u0e23\u0e42\u0e08\u0e21\u0e15\u0e35 Monster
Commands.XPGain.Taming=\u0e2a\u0e31\u0e15\u0e27\u0e4c\u0e40\u0e25\u0e35\u0e49\u0e22\u0e07\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13\u0e01\u0e33\u0e25\u0e31\u0e07\u0e1d\u0e36\u0e01\u0e1d\u0e19\u0e01\u0e32\u0e23\u0e15\u0e48\u0e2d\u0e2a\u0e39\u0e49
Commands.XPGain.Unarmed=\u0e17\u0e33\u0e01\u0e32\u0e23\u0e42\u0e08\u0e21\u0e15\u0e35 Monster
Commands.XPGain.Woodcutting=\u0e2a\u0e31\u0e1a\u0e15\u0e49\u0e19\u0e44\u0e21\u0e49\u0e25\u0e49\u0e21\u0e25\u0e07
Commands.XPGain=[[DARK_GRAY]]EXP \u0e17\u0e35\u0e48\u0e44\u0e14\u0e49\u0e23\u0e31\u0e1a: [[WHITE]]{0}
Commands.xplock.locked=[[GOLD]]BAR EXP \u0e16\u0e39\u0e01\u0e1b\u0e14\u0e25\u0e47\u0e2d\u0e01 {0}!
Commands.xplock.unlocked=[[GOLD]]EXP BAR \u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13\u0e44\u0e14\u0e49\u0e16\u0e39\u0e01 [[GREEN]]\u0e1b\u0e25\u0e14\u0e25\u0e47\u0e2d\u0e01[[GOLD]]!
Commands.xprate.modified=[[RED]]\u0e2d\u0e31\u0e04\u0e23\u0e32 EXP \u0e16\u0e39\u0e01\u0e41\u0e01\u0e49\u0e44\u0e02\u0e40\u0e1b\u0e47\u0e19 {0}
Commands.xprate.over=[[RED]]mcMMO \u0e2d\u0e31\u0e15\u0e23\u0e32EXP \u0e15\u0e2d\u0e19\u0e19\u0e35\u0e49\u0e21\u0e32\u0e01\u0e02\u0e36\u0e49\u0e19!!
Commands.xprate.proper.0=[[RED]]\u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49\u0e07\u0e32\u0e19\u0e17\u0e35\u0e48\u0e40\u0e2b\u0e21\u0e32\u0e30\u0e2a\u0e21\u0e43\u0e19\u0e01\u0e32\u0e23\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e2d\u0e31\u0e15\u0e23\u0e32 EXP \u0e40\u0e1b\u0e47\u0e19 /xprate <integer> <true/false>
Commands.xprate.proper.1=[[RED]]\u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49\u0e07\u0e32\u0e19\u0e17\u0e35\u0e48\u0e40\u0e2b\u0e21\u0e32\u0e30\u0e2a\u0e21\u0e43\u0e19\u0e01\u0e32\u0e23\u0e40\u0e23\u0e35\u0e22\u0e01\u0e04\u0e37\u0e19\u0e2d\u0e31\u0e15\u0e23\u0e32 EXP \u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e40\u0e23\u0e34\u0e48\u0e21\u0e15\u0e49\u0e19\u0e16\u0e39\u0e01\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32\u0e43\u0e2b\u0e21\u0e48 xprate /
Commands.xprate.proper.2=[[RED]]\u0e42\u0e1b\u0e23\u0e14\u0e23\u0e30\u0e1a\u0e38\u0e08\u0e23\u0e34\u0e07\u0e2b\u0e23\u0e37\u0e2d\u0e40\u0e17\u0e47\u0e08\u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e41\u0e2a\u0e14\u0e07\u0e27\u0e48\u0e32\u0e19\u0e35\u0e49\u0e40\u0e1b\u0e47\u0e19\u0e40\u0e2b\u0e15\u0e38\u0e01\u0e32\u0e23\u0e13\u0e4c EXP \u0e2b\u0e23\u0e37\u0e2d\u0e44\u0e21\u0e48
Commands.xprate.started.0=[[GOLD]]\u0e40\u0e2b\u0e15\u0e38\u0e01\u0e32\u0e23\u0e13\u0e4c EXP \u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a mcMMO \u0e44\u0e14\u0e49\u0e40\u0e23\u0e34\u0e48\u0e21\u0e15\u0e49\u0e19!
Commands.xprate.started.1=[[GOLD]]mcMMO \u0e2d\u0e31\u0e15\u0e23\u0e32 EXP \u0e15\u0e2d\u0e19\u0e19\u0e35\u0e49 {0}x!
XPRate.Event=[[GOLD]]mcMMO \u0e02\u0e13\u0e30\u0e19\u0e35\u0e49\u0e2d\u0e22\u0e39\u0e48\u0e43\u0e19\u0e40\u0e2b\u0e15\u0e38\u0e01\u0e32\u0e23\u0e13\u0e4c\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e2d\u0e31\u0e15\u0e23\u0e32\u0e1b\u0e23\u0e30\u0e2a\u0e1a\u0e01\u0e32\u0e23\u0e13\u0e4c! \u0e2d\u0e31\u0e15\u0e23\u0e32\u0e1b\u0e23\u0e30\u0e2a\u0e1a\u0e01\u0e32\u0e23\u0e13\u0e4c \u0e40\u0e1b\u0e47\u0e19 {0} \u0e40\u0e17\u0e48\u0e32!
Effects.Effects=EFFECTS
Effects.Child=[[DARK_GRAY]]\u0e23\u0e30\u0e14\u0e31\u0e1a: [[GREEN]]{0}
Effects.Level=[[DARK_GRAY]]\u0e23\u0e30\u0e14\u0e31\u0e1a: [[GREEN]]{0} [[DARK_AQUA]]EXP[[YELLOW]]([[GOLD]]{1}[[YELLOW]]/[[GOLD]]{2}[[YELLOW]])
Effects.Parent=[[GOLD]]{0} -
Effects.Template=[[DARK_AQUA]]{0}: [[GREEN]]{1}
Guides.Acrobatics=[[DARK_AQUA]]About Acrobatics:\n[[YELLOW]]Acrobatics is the art of moving gracefully in mcMMO.\n[[YELLOW]]It provides combat bonuses and environment damage bonuses.\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]To gain XP in this skill you need to perform a dodge\n[[YELLOW]]in combat or survive falls from heights that damage you.\n[[DARK_AQUA]]How does Rolling work?\n[[YELLOW]]You have a passive chance when you take fall damage\n[[YELLOW]]to negate the damage done. You can hold the sneak button to\n[[YELLOW]]double your chances during the fall.\n[[YELLOW]]This triggers a Graceful Roll instead of a standard one.\n[[YELLOW]]Graceful Rolls are like regular rolls but are twice as likely to\n[[YELLOW]]occur and provide more damage safety than regular rolls.\n[[YELLOW]]Rolling chance is tied to your skill level\n[[DARK_AQUA]]How does Dodge work?\n[[YELLOW]]Dodge is a passive chance when you are\n[[YELLOW]]injured in combat to halve the damage taken.\n[[YELLOW]]It is tied to your skill level.
Guides.Archery=[[DARK_AQUA]]About Archery:\n[[YELLOW]]Archery is about shooting with your bow and arrow.\n[[YELLOW]]It provides various combat bonuses, such as a damage boost\n[[YELLOW]]that scales with your level and the ability to daze your\n[[YELLOW]]opponents in PvP. In addition to this, you can retrieve\n[[YELLOW]]some of your spent arrows from the corpses of your foes.\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]To gain XP in this skill you need to shoot mobs or\n[[YELLOW]]other players.\n[[DARK_AQUA]]How does Skill Shot work?\n[[YELLOW]]Skill Shot provides additional damage to your shots.\n[[YELLOW]]The bonus damage from Skill Shot increases as you\n[[YELLOW]]level in Archery.\n[[YELLOW]]With the default settings, your archery damage increases 10%\n[[YELLOW]]every 50 levels, to a maximum of 200% bonus damage.\n[[DARK_AQUA]]How does Daze work?\n[[YELLOW]]You have a passive chance to daze other players when\n[[YELLOW]]you shoot them. When Daze triggers it forces your opponents\n[[YELLOW]]to look straight up for a short duration.\n[[YELLOW]]A Daze shot also deals an additional 4 damage (2 hearts).\n[[DARK_AQUA]]How does Arrow Retrieval work?\n[[YELLOW]]You have a passive chance to retrieve some of your arrows\n[[YELLOW]]when you kill a mob with your bow.\n[[YELLOW]]This chance increases as you level in Archery.\n[[YELLOW]]By default, this ability increases by 0.1% per level, up to 100%\n[[YELLOW]]at level 1000.
Guides.Axes=[[DARK_AQUA]]About Axes:\n[[YELLOW]]With the Axes skill you can use your axe for much more then\n[[YELLOW]]just deforesting! You can hack and chop away at mobs\n[[YELLOW]]and players to gain XP, hitting mobs with the effect of\n[[YELLOW]]knockback and inflicting DEADLY criticals on mobs and players.\n[[YELLOW]]Your axe also becomes a hand-held woodchipper,\n[[YELLOW]]breaking down the enemy\'s armor with ease as your level\n[[YELLOW]]increases.\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]To gain XP in this skill you need hit other mobs or players\n[[YELLOW]]with an Axe.\n[[DARK_AQUA]]How does Skull Splitter work?\n[[YELLOW]]This ability allows you to deal an AoE (Area of Effect) hit.\n[[YELLOW]]This AoE hit will deal half as much damage as you did to the\n[[YELLOW]]main target, so it\'s great for clearing out large piles of mobs.\n[[DARK_AQUA]]How does Critical Strikes work?\n[[YELLOW]]Critical Strikes is a passive ability which gives players a\n[[YELLOW]]chance to deal additional damage.\n[[YELLOW]]With the default settings, every 2 skill levels in Axes awards a\n[[YELLOW]]0.1% chance to deal a Critical Strike, causing 2.0 times damage\n[[YELLOW]]to mobs or 1.5 times damage against other players.\n[[DARK_AQUA]]How does Axe Mastery work?\n[[YELLOW]]Axe Mastery is a passive ability that will add additional damage\n[[YELLOW]]to your hits when using Axes.\n[[YELLOW]]By default, the bonus damage increases by 1 every 50 levels,\n[[YELLOW]]up to a cap of 4 extra damage at level 200.\n[[DARK_AQUA]]How does Armor Impact work?\n[[YELLOW]]Strike with enough force to shatter armor!\n[[YELLOW]]Armor Impact has a passive chance to damage your\n[[YELLOW]]opponent\'s armor. This damage increases as you level in Axes.\n[[DARK_AQUA]]How does Greater Impact work?\n[[YELLOW]]You have a passive chance to achieve a greater impact when\n[[YELLOW]]hitting mobs or players with your axe.\n[[YELLOW]]By default this chance is 25%. This passive ability has an\n[[YELLOW]]extreme knockback effect, similar to the Knockback II\n[[YELLOW]]enchantment. In addition, it deals bonus damage to the target.
Guides.Available=[[DARK_AQUA]]\u0e41\u0e19\u0e30\u0e19\u0e33 {0} \u0e04\u0e27\u0e23\u0e43\u0e0a\u0e49 - \u0e0a\u0e19\u0e34\u0e14 /{1} ? [\u0e2b\u0e19\u0e49\u0e32]
Guides.Excavation=[[DARK_AQUA]]About Excavation:\n[[YELLOW]]Excavation is the act of digging up dirt to find treasures.\n[[YELLOW]]By excavating the land you will find treasures.\n[[YELLOW]]The more you do this the more treasures you can find.\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]To gain XP in this skill you must dig with a shovel in hand.\n[[YELLOW]]Only certain materials can be dug up for treasures and XP.\n[[DARK_AQUA]]Compatible Materials:\n[[YELLOW]]Grass, Dirt, Sand, Clay, Gravel, Mycelium, Soul Sand\n[[DARK_AQUA]]How to use Giga Drill Breaker:\n[[YELLOW]]With a shovel in hand right click to ready your tool.\n[[YELLOW]]Once in this state you have about 4 seconds to make\n[[YELLOW]]contact with Excavation compatible materials this will\n[[YELLOW]]activate Giga Drill Breaker.\n[[DARK_AQUA]]What is Giga Drill Breaker?\n[[YELLOW]]Giga Drill Breaker is an ability with a cooldown\n[[YELLOW]]tied to Excavation skill. It triples your chance\n[[YELLOW]]of finding treasures and enables instant break\n[[YELLOW]]on Excavation materials.\n[[DARK_AQUA]]How does Treasure Hunter work?\n[[YELLOW]]Every possible treasure for Excavation has its own\n[[YELLOW]]skill level requirement for it to drop, as a result it\'s\n[[YELLOW]]difficult to say how much it is helping you.\n[[YELLOW]]Just keep in mind that the higher your Excavation skill\n[[YELLOW]]is, the more treasures that can be found.\n[[YELLOW]]And also keep in mind that each type of Excavation\n[[YELLOW]]compatible material has its own unique list of treasures.\n[[YELLOW]]In other words you will find different treasures in Dirt\n[[YELLOW]]than you would in Gravel.\n[[DARK_AQUA]]Notes about Excavation:\n[[YELLOW]]Excavation drops are completely customizeable\n[[YELLOW]]So results vary server to server.
Guides.Fishing=[[DARK_AQUA]]About Fishing:\n[[YELLOW]]With the Fishing skill, Fishing is exciting again!\n[[YELLOW]]Find hidden treasures, and shake items off mobs.\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]Catch fish.\n[[DARK_AQUA]]How does Treasure Hunter work?\n[[YELLOW]]This ability allows you to find treasure from fishing \n[[YELLOW]]with a small chance of the items being enchanted.\n[[YELLOW]]Every possible treasure for Fishing has its own\n[[YELLOW]]skill level requirement for it to drop.\n[[YELLOW]]The higher your Fishing skill is, the more\n[[YELLOW]]treasures that can be found.\n[[DARK_AQUA]]How does Shake work?\n[[YELLOW]]This active ability allows you to shake items loose from mobs\n[[YELLOW]]by hooking them with the fishing rod. \n[[YELLOW]]Mobs will drop items they would normally drop on death.\n[[YELLOW]]It is also possible to acquire mob skulls, which are normally \n[[YELLOW]]unobtainable in survival mode.\n[[DARK_AQUA]]How does Fisherman\'s Diet work?\n[[YELLOW]]This passive skill increases the amount of hunger restored \n[[YELLOW]]from eating fish.\n[[DARK_AQUA]]Notes about Fishing:\n[[YELLOW]]Fishing drops are completely customizable,\n[[YELLOW]]so results vary server to server.\n
Guides.Header=[[GOLD]]-=[[GREEN]]{0} \u0e41\u0e19\u0e30\u0e19\u0e33[[GOLD]]=-
Guides.Herbalism=[[DARK_AQUA]]About Herbalism:\n[[YELLOW]]Herbalism is about collecting herbs and plants.\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]Collect plants and herbs.\n[[DARK_AQUA]]Compatible Blocks\n[[YELLOW]]Wheat, Potatoes, Carrots, Melons, \n[[YELLOW]]Pumpkins, Sugar Canes, Cocoa Beans, Flowers, Cacti, Mushrooms,\n[[YELLOW]]Nether Wart, Lily Pads, and Vines.\n[[DARK_AQUA]]How does Green Terra work?\n[[YELLOW]]Green Terra is an active ability, you can right-click\n[[YELLOW]]while holding a hoe to activate Green Terra.\n[[YELLOW]]Green Terra grants players a chance to get 3x drops from\n[[YELLOW]]harvesting plants. It also gives players the ability to\n[[YELLOW]]spread life into blocks and transform them using seeds\n[[YELLOW]]from your inventory.\n[[DARK_AQUA]]How does Green Thumb (Crops) work?\n[[YELLOW]]This passive ability will automatically replant crops when\n[[YELLOW]]harvesting.\n[[YELLOW]]Your chance of success depends on your Herbalism skill.\n[[DARK_AQUA]]How does Green Thumb (Cobble/Stone Brick/Dirt) work?\n[[YELLOW]]This active ability allows you to turn blocks into their\n[[YELLOW]]\"plant-related\" counterparts. You can do this by right-clicking\n[[YELLOW]]a block, while holding seeds. This will consume 1 seed.\n[[DARK_AQUA]]How does Farmer\'s Diet work?\n[[YELLOW]]This passive skill increases the amount of hunger restored \n[[YELLOW]]when eating Bread, Cookies, Melons, Mushroom Soup, Carrots,\n[[YELLOW]]and Potatoes.\n[[DARK_AQUA]]How does Hylian Luck work?\n[[YELLOW]]This passive ability gives you a chance to find rare items\n[[YELLOW]]when certain blocks are broken with a sword.\n[[DARK_AQUA]]How do Double Drops work?\n[[YELLOW]]This passive ability gives players more yield from their\n[[YELLOW]]harvests.
Guides.Mining=[[DARK_AQUA]]About Mining:\n[[YELLOW]]Mining consists of mining stone and ores. It provides bonuses\n[[YELLOW]]to the amount of materials dropped while mining.\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]To gain XP in this skill, you must mine with a pickaxe in hand.\n[[YELLOW]]Only certain blocks award XP.\n[[DARK_AQUA]]Compatible Materials:\n[[YELLOW]]Stone, Coal Ore, Iron Ore, Gold Ore, Diamond Ore, Redstone Ore,\n[[YELLOW]]Lapis Ore, Obsidian, Mossy Cobblestone, Ender Stone,\n[[YELLOW]]Glowstone, and Netherrack.\n[[DARK_AQUA]]How to use Super Breaker:\n[[YELLOW]]With a pickaxe in your hand, right click to ready your tool.\n[[YELLOW]]Once in this state, you have about 4 seconds to make contact\n[[YELLOW]]with Mining compatible materials, which will activate Super\n[[YELLOW]]Breaker.\n[[DARK_AQUA]]What is Super Breaker?\n[[YELLOW]]Super Breaker is an ability with a cooldown tied to the Mining\n[[YELLOW]]skill. It triples your chance of extra items dropping and\n[[YELLOW]]enables instant break on Mining materials.\n[[DARK_AQUA]]How to use Blast Mining:\n[[YELLOW]]With a detonator in hand, which is a flint & steel by default,\n[[YELLOW]]crouch and right-click on TNT from a distance. This will cause the TNT\n[[YELLOW]]to instantly explode.\n[[DARK_AQUA]]How does Blast Mining work?\n[[YELLOW]]Blast Mining is an ability with a cooldown tied to the Mining\n[[YELLOW]]skill. It gives bonuses when mining with TNT and allows you\n[[YELLOW]]to remote detonate TNT. There are three parts to Blast Mining.\n[[YELLOW]]The first part is Bigger Bombs, which increases blast radius.\n[[YELLOW]]The second is Demolitions Expert, which decreases damage\n[[YELLOW]]from TNT explosions. The third part simply increases the\n[[YELLOW]]amount of ores dropped from TNT and decreases the\n[[YELLOW]]debris dropped.
Guides.Page.Invalid=\u0e44\u0e21\u0e48\u0e43\u0e0a\u0e48\u0e15\u0e31\u0e27\u0e40\u0e25\u0e02\u0e17\u0e35\u0e48\u0e16\u0e39\u0e01\u0e15\u0e49\u0e2d\u0e07!
Guides.Page.OutOfRange=\u0e44\u0e21\u0e48\u0e21\u0e35\u0e2b\u0e19\u0e49\u0e32\u0e19\u0e35\u0e2d\u0e22\u0e39\u0e48 \u0e21\u0e35\u0e40\u0e1e\u0e35\u0e22\u0e07 {0} \u0e2b\u0e19\u0e49\u0e32.
Guides.Repair=[[DARK_AQUA]]About Repair:\n[[YELLOW]]Repair allows you to use an iron block to repair armor and\n[[YELLOW]]tools, or a gold block to salvage armor and tools.\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]Repair tools or armor using the mcMMO Anvil. This is an\n[[YELLOW]]iron block by default and should not be confused with\n[[YELLOW]]the Vanilla Minecraft Anvil.\n[[DARK_AQUA]]How can I use Repair?\n[[YELLOW]]Place down a mcMMO Anvil and right-click to repair the item \n[[YELLOW]]you\'re currently holding. This consumes 1 item on every use.\n[[DARK_AQUA]]How does Repair Mastery work?\n[[YELLOW]]Repair Mastery increases the repair amount. The extra amount\n[[YELLOW]]repaired is influenced by your Repair skill level.\n[[DARK_AQUA]]How does Super Repair work?\n[[YELLOW]]Super Repair is a passive ability. When repairing an item,\n[[YELLOW]]it grants players a chance to repair an item with\n[[YELLOW]]double effectiveness.\n[[DARK_AQUA]]How does Arcane Forging work?\n[[YELLOW]]This passive ability allows you to repair items with a certain\n[[YELLOW]]chance of maintaining its enchantments. The enchants may be\n[[YELLOW]]kept at their existing levels, downgraded to a lower level,\n[[YELLOW]]or lost entirely.\n[[DARK_AQUA]]How does Salvage work?\n[[YELLOW]]Place down a mcMMO Salvage Anvil and right-click to salvage\n[[YELLOW]]the item you\'re currently holding.\n[[YELLOW]]This will break the item apart en give back the used ingots.\n[[YELLOW]]Note: You can only salvage fully repaired tools or armor.
Guides.Swords=[[DARK_AQUA]]About Swords:\n[[YELLOW]]This skill awards combat bonuses to anyone fighting with a\n[[YELLOW]]sword.\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]XP is gained based on the amount of damage dealt to mobs or \n[[YELLOW]]other players when wielding a sword.\n[[DARK_AQUA]]How does Serrated Strikes work?\n[[YELLOW]]Serrated Strikes is an active ability, you can activate it by\n[[YELLOW]]right-clicking with a sword. This ability allows you to deal \n[[YELLOW]]an AoE (Area of Effect) hit. This AoE will do a bonus 25%\n[[YELLOW]]damage and will inflict a bleed effect that lasts for 5 ticks.\n[[DARK_AQUA]]How does Counter Attack work?\n[[YELLOW]]Counter Attack is a passive ability. When taking hits from mobs,\n[[YELLOW]]you will have a chance to reflect 50% of the damage that was \n[[YELLOW]]taken.\n[[DARK_AQUA]]How does Bleed work?\n[[YELLOW]]Bleed causes enemies to take damage every two seconds. The \n[[YELLOW]]target will bleed until the effect wears off, or death, \n[[YELLOW]]whichever comes first.\n[[YELLOW]]The duration of the bleed is increased by your sword skill.
Guides.Smelting=\u0e40\u0e23\u0e47\u0e27\u0e46\u0e19\u0e35\u0e49...
Guides.Taming=[[DARK_AQUA]]About Taming:\n[[YELLOW]]Taming will give players various combat bonuses when using\n[[YELLOW]]tamed wolves.\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]To gain XP in this skill, you need to tame wolves/ocelots or\n[[YELLOW]]get into combat with your wolves.\n[[DARK_AQUA]]How does Call of the Wild work?\n[[YELLOW]]Call of the Wild is an active ability that will allow you to summon\n[[YELLOW]]a wolf or an ocelot by your side. You can do this by\n[[YELLOW]]left-clicking while holding bones or fish.\n[[DARK_AQUA]]How does Beast Lore work?\n[[YELLOW]]Beast Lore allows players to inspect pets and to check the\n[[YELLOW]]stats of wolves and ocelots. Left-click a wolf or ocelot to use\n[[YELLOW]]Beast Lore.\n[[DARK_AQUA]]How does Gore work?\n[[YELLOW]]Gore is a passive ability that has a chance of inflicting a\n[[YELLOW]]bleeding effect on your wolves\' targets.\n[[DARK_AQUA]]How does Sharpened Claws work?\n[[YELLOW]]Sharpened Claws provides a damage bonus to damage dealt\n[[YELLOW]]by wolves. The damage bonus depends on your Taming level.\n[[DARK_AQUA]]How does Environmentally Aware work?\n[[YELLOW]]This passive ability will allow wolves to teleport to you when\n[[YELLOW]]they get near hazards, such as Cacti/Lava. It will also give\n[[YELLOW]]wolves fall damage immunity.\n[[DARK_AQUA]]How does Thick Fur work?\n[[YELLOW]]This passive ability will reduce damage and make wolves\n[[YELLOW]]fire resistant.\n[[DARK_AQUA]]How does Shock Proof work?\n[[YELLOW]]This passive ability reduces damage done to wolves\n[[YELLOW]]from explosions.\n[[DARK_AQUA]]How does Fast Food Service work?\n[[YELLOW]]This passive ability gives wolves a chance to heal whenever\n[[YELLOW]]they perform an attack.
Guides.Unarmed=[[DARK_AQUA]]About Unarmed:\n[[YELLOW]]Unarmed will give players various combat bonuses when using\n[[YELLOW]]your fists as a weapon. \n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]XP is gained based on the amount of damage dealt to mobs \n[[YELLOW]]or other players when unarmed.\n[[DARK_AQUA]]How does Berserk work?\n[[YELLOW]]Beserk is an active ability that is activated by\n[[YELLOW]]right-clicking. While in Beserk mode, you deal 50% more\n[[YELLOW]]damage and you can break weak materials instantly, such as\n[[YELLOW]]Dirt and Grass.\n[[DARK_AQUA]]How does Iron Arm work?\n[[YELLOW]]Iron Arm increases the damage dealt when hitting mobs or\n[[YELLOW]]players with your fists.\n[[DARK_AQUA]]How does Arrow Deflect work?\n[[YELLOW]]Arrow Deflect is a passive ability that gives you a chance\n[[YELLOW]]to deflect arrows shot by Skeletons or other players.\n[[YELLOW]]The arrow will fall harmlessly to the ground.\n[[DARK_AQUA]]How does Iron Grip work?\n[[YELLOW]]Iron Grip is a passive ability that counters disarm. As your\n[[YELLOW]]unarmed level increases, the chance of preventing a disarm increases.\n[[DARK_AQUA]]How does Disarm work?\n[[YELLOW]]This passive ability allows players to disarm other players,\n[[YELLOW]]causing the target\'s equipped item to fall to the ground.
Guides.Usage=[[RED]] \u0e43\u0e0a\u0e49 /{0} ? [\u0e2b\u0e19\u0e49\u0e32]
Guides.Woodcutting=[[DARK_AQUA]]About Woodcutting:\n[[YELLOW]]Woodcutting is all about chopping down trees.\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]XP is gained whenever you break log blocks.\n[[DARK_AQUA]]How does Tree Feller work?\n[[YELLOW]]Tree Feller is an active ability, you can right-click\n[[YELLOW]]while holding an ax to activate Tree Feller. This will\n[[YELLOW]]cause the entire tree to break instantly, dropping all\n[[YELLOW]]of its logs at once.\n[[DARK_AQUA]]How does Leaf Blower work?\n[[YELLOW]]Leaf Blower is a passive ability that will cause leaf\n[[YELLOW]]blocks to break instantly when hit with an axe. By default,\n[[YELLOW]]this ability unlocks at level 100.\n[[DARK_AQUA]]How do Double Drops work?\n[[YELLOW]]This passive ability gives you a chance to obtain an extra\n[[YELLOW]]block for every log you chop.
Inspect.Offline=[[RED]]\u0e04\u0e38\u0e13\u0e44\u0e21\u0e48\u0e44\u0e14\u0e49\u0e23\u0e31\u0e1a\u0e2a\u0e34\u0e17\u0e18\u0e34\u0e4c\u0e43\u0e19\u0e01\u0e32\u0e23\u0e15\u0e23\u0e27\u0e08\u0e2a\u0e2d\u0e1a\u0e1c\u0e39\u0e49\u0e40\u0e25\u0e48\u0e19 Offline!
Inspect.OfflineStats=mcMMO \u0e2a\u0e16\u0e34\u0e15\u0e34\u0e1c\u0e39\u0e49\u0e40\u0e25\u0e48\u0e19 Offline [[YELLOW]]{0}
Inspect.Stats=[[GREEN]]mcMMO \u0e2a\u0e16\u0e34\u0e15\u0e34\u0e02\u0e2d\u0e07 [[YELLOW]]{0}
Inspect.TooFar=[[RED]]\u0e04\u0e38\u0e13\u0e2d\u0e22\u0e39\u0e48\u0e44\u0e01\u0e25\u0e40\u0e01\u0e34\u0e19\u0e44\u0e1b\u0e17\u0e35\u0e48\u0e08\u0e30\u0e15\u0e23\u0e27\u0e08\u0e2a\u0e2d\u0e1a\u0e1c\u0e39\u0e49\u0e40\u0e25\u0e48\u0e19\u0e17\u0e35\u0e48!
Item.ChimaeraWing.Fail=**\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 CHIMAERA WING \u0e25\u0e49\u0e21\u0e40\u0e2b\u0e25\u0e27!**
Item.ChimaeraWing.Pass=**\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 CHIMAERA WING**
Item.Injured.Wait=\u0e04\u0e39\u0e13\u0e44\u0e14\u0e49\u0e23\u0e31\u0e1a\u0e04\u0e27\u0e32\u0e21\u0e40\u0e2a\u0e35\u0e22\u0e2b\u0e32\u0e22\u0e15\u0e48\u0e2d\u0e40\u0e19\u0e37\u0e48\u0e2d\u0e07\u0e15\u0e49\u0e2d\u0e07\u0e23\u0e2d. [[YELLOW]]({0} \u0e27\u0e34\u0e19\u0e32\u0e17\u0e35)
Skills.Child=[[GOLD]](\u0e17\u0e31\u0e01\u0e29\u0e30 CHILD)
Skills.Disarmed=[[DARK_RED]]\u0e04\u0e38\u0e13\u0e44\u0e14\u0e49\u0e1b\u0e25\u0e14\u0e25\u0e47\u0e2d\u0e01!
Skills.Header=[[RED]]-----[][[GREEN]]{0}[[RED]][]-----
Skills.NeedMore=[[DARK_RED]]\u0e04\u0e38\u0e13\u0e15\u0e49\u0e2d\u0e07\u0e01\u0e32\u0e23\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e40\u0e15\u0e34\u0e21 [[GRAY]]{0}
Skills.Parents=PARENTS
Skills.Stats=[[YELLOW]]{0}[[GREEN]]{1}[[DARK_AQUA]] EXP([[GRAY]]{2}[[DARK_AQUA]]/[[GRAY]]{3}[[DARK_AQUA]])
Skills.TooTired=[[RED]]\u0e04\u0e38\u0e13\u0e40\u0e2b\u0e19\u0e37\u0e48\u0e2d\u0e22\u0e40\u0e01\u0e34\u0e19\u0e44\u0e1b\u0e17\u0e35\u0e48\u0e08\u0e30\u0e43\u0e0a\u0e49\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e19\u0e31\u0e49\u0e19\u0e2d\u0e35\u0e01\u0e04\u0e23\u0e31\u0e49\u0e07. [[YELLOW]]({0}s)
Stats.Header.Combat=[[GOLD]]-=\u0e17\u0e31\u0e01\u0e29\u0e30\u0e01\u0e32\u0e23\u0e15\u0e48\u0e2d\u0e2a\u0e39\u0e49=-
Stats.Header.Gathering=[[GOLD]]-=\u0e17\u0e31\u0e01\u0e29\u0e30 GATHERING=-
Stats.Header.Misc=[[GOLD]]-=\u0e17\u0e31\u0e01\u0e29\u0e30 MISC=-
Stats.Own.Stats=[[GREEN]][mcMMO] \u0e2a\u0e16\u0e34\u0e15\u0e34
Perks.xp.name=\u0e1b\u0e23\u0e30\u0e2a\u0e1a\u0e01\u0e32\u0e23\u0e13\u0e4c
Perks.xp.desc=\u0e44\u0e14\u0e49\u0e23\u0e31\u0e1a {0}x EXP.
Perks.lucky.name=\u0e42\u0e0a\u0e04
Perks.lucky.desc=\u0e43\u0e2b\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 {0} \u0e41\u0e25\u0e30\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e21\u0e35\u0e42\u0e2d\u0e01\u0e32\u0e2a 33.3% \u0e14\u0e35\u0e01\u0e27\u0e48\u0e32\u0e17\u0e35\u0e48\u0e08\u0e30\u0e40\u0e1b\u0e34\u0e14\u0e43\u0e0a\u0e49\u0e07\u0e32\u0e19
Perks.lucky.bonus=[[GOLD]] ({0} \u0e14\u0e49\u0e27\u0e22 Lucky Perk)
Perks.cooldowns.name=Fast Recovery
Perks.cooldowns.desc=\u0e25\u0e14\u0e23\u0e30\u0e22\u0e30\u0e40\u0e27\u0e25\u0e32\u0e04\u0e39\u0e25\u0e14\u0e32\u0e27\u0e19\u0e4c {0}.
Perks.activationtime.name=\u0e04\u0e27\u0e32\u0e21\u0e2d\u0e14\u0e17\u0e19
Perks.activationtime.desc=\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e40\u0e27\u0e25\u0e32\u0e01\u0e32\u0e23\u0e40\u0e1b\u0e34\u0e14\u0e43\u0e0a\u0e49\u0e07\u0e32\u0e19\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16 {0} \u0e27\u0e34\u0e19\u0e32\u0e17\u0e35.
Perks.activationtime.bonus=[[GOLD]] ({0}\u0e27\u0e34\u0e19\u0e32\u0e17\u0e35 \u0e14\u0e49\u0e27\u0e22 Endurance Perk)
Hardcore.Player.Loss=[[GOLD]][mcMMO] [[DARK_RED]]\u0e04\u0e38\u0e13\u0e40\u0e2a\u0e35\u0e22\u0e23\u0e30\u0e14\u0e31\u0e1a\u0e17\u0e31\u0e01\u0e29\u0e30 [[BLUE]]{0}[[DARK_RED]] \u0e08\u0e32\u0e01\u0e01\u0e32\u0e23\u0e15\u0e32\u0e22.
Vampirism.Killer.Failure=[[GOLD]][mcMMO] [[YELLOW]]{0}[[GRAY]] \u0e40\u0e1b\u0e47\u0e19\u0e17\u0e31\u0e01\u0e29\u0e30\u0e17\u0e35\u0e48\u0e44\u0e21\u0e48\u0e0a\u0e33\u0e19\u0e32\u0e0d.
Vampirism.Killer.Success=[[GOLD]][mcMMO] [[DARK_AQUA]]\u0e04\u0e38\u0e13\u0e44\u0e14\u0e49\u0e02\u0e42\u0e21\u0e22 [[BLUE]]{0}[[DARK_AQUA]] \u0e23\u0e30\u0e14\u0e31\u0e1a\u0e08\u0e32\u0e01 [[YELLOW]]{1}.
Vampirism.Victim.Failure=[[GOLD]][mcMMO] [[YELLOW]]{0}[[GRAY]] \u0e44\u0e21\u0e48\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e17\u0e35\u0e48\u0e08\u0e30\u0e02\u0e42\u0e21\u0e22\u0e04\u0e27\u0e32\u0e21\u0e23\u0e39\u0e49\u0e08\u0e32\u0e01\u0e04\u0e38\u0e13!
Vampirism.Victim.Success=[[GOLD]][mcMMO] [[YELLOW]]{0}[[DARK_RED]] \u0e44\u0e14\u0e49\u0e16\u0e39\u0e01\u0e02\u0e42\u0e21\u0e22 [[BLUE]]{1}[[DARK_RED]] \u0e23\u0e30\u0e14\u0e31\u0e1a\u0e08\u0e32\u0e01\u0e04\u0e38\u0e13!
Hardcore.Disabled=[[GOLD]][mcMMO] Hardcore mode \u0e16\u0e39\u0e01\u0e1b\u0e34\u0e14.
Hardcore.Enabled=[[GOLD]][mcMMO] Hardcore mode \u0e16\u0e39\u0e01\u0e40\u0e1b\u0e34\u0e14.
Hardcore.PercentageChanged=[[GOLD]][mcMMO] \u0e23\u0e49\u0e2d\u0e22\u0e25\u0e30\u0e01\u0e32\u0e23\u0e2a\u0e39\u0e0d\u0e40\u0e2a\u0e35\u0e22 stat \u0e01\u0e47\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e44\u0e1b {0}.
Vampirism.Disabled=[[GOLD]][mcMMO] Vampirism mode \u0e16\u0e39\u0e01\u0e1b\u0e34\u0e14.
Vampirism.Enabled=[[GOLD]][mcMMO] Vampirism mode \u0e16\u0e39\u0e01\u0e40\u0e1b\u0e34\u0e14.
Vampirism.PercentageChanged=[[GOLD]][mcMMO] \u0e23\u0e49\u0e2d\u0e22\u0e25\u0e30 stat \u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e44\u0e1b {0}.
Spout.Donate=[[YELLOW]][mcMMO] \u0e1a\u0e23\u0e34\u0e08\u0e32\u0e04!
Spout.LevelUp.1=[[GREEN]]\u0e23\u0e30\u0e14\u0e31\u0e1a\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e02\u0e36\u0e49\u0e19!
Spout.LevelUp.2=[[YELLOW]]{0}[[DARK_AQUA]] ([[GREEN]]{1}[[DARK_AQUA]])
Spout.Menu.Exit=[[GRAY]]\u0e01\u0e23\u0e38\u0e13\u0e32\u0e01\u0e14 ESCAPE \u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e2d\u0e2d\u0e01!
Spout.Menu.ExitButton=EXIT
Spout.Menu.HudButton.1=HUD \u0e0a\u0e19\u0e34\u0e14: {0}
Spout.Menu.HudButton.2=\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e23\u0e39\u0e1b\u0e41\u0e1a\u0e1a\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13!
Spout.Menu.Title=[[GOLD]]~mcMMO Menu~
Spout.Title={0}\n[[YELLOW]]P[[GOLD]]lvl[[WHITE]].[[GREEN]]{1}
MOTD.Donate=[[DARK_AQUA]]\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25 Donation:
MOTD.Hardcore.VampireOff=[[GOLD]][mcMMO] [[DARK_RED]]Hardcore & Vampirism \u0e16\u0e39\u0e01\u0e40\u0e1b\u0e34\u0e14.
MOTD.Hardcore.Stats=[[GOLD]][mcMMO] [[DARK_AQUA]]\u0e17\u0e31\u0e01\u0e29\u0e30 Death Penalty: [[DARK_RED]]{0}%
MOTD.Hardcore.VampireOn=[[GOLD]][mcMMO] [[DARK_RED]]Hardcore \u0e16\u0e39\u0e01\u0e40\u0e1b\u0e34\u0e14.
MOTD.PerksPrefix=[[RED]][mcMMO Perks]
MOTD.Vampire.Stats=[[GOLD]][mcMMO] [[DARK_AQUA]]\u0e16\u0e39\u0e01\u0e02\u0e42\u0e21\u0e22\u0e2a\u0e16\u0e34\u0e15\u0e34: [[DARK_RED]]{0}%
MOTD.Version=[[GOLD]][mcMMO] \u0e43\u0e0a\u0e49 version [[DARK_AQUA]]{0}
MOTD.Website=[[GOLD]][mcMMO] [[GREEN]]{0}[[YELLOW]] - mcMMO Website
Smelting.Ability.FluxMining=[[RED]]Flux Mining \u0e42\u0e2d\u0e01\u0e32\u0e2a: [[YELLOW]]{0}
Smelting.Ability.FuelEfficiency=[[RED]]Fuel Efficiency \u0e40\u0e1e\u0e34\u0e48\u0e21\u0e02\u0e36\u0e49\u0e19: [[YELLOW]]{0}x
Smelting.Ability.Locked.0=\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e1b\u0e25\u0e14\u0e25\u0e47\u0e2d\u0e01\u0e44\u0e14\u0e49\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e23\u0e30\u0e14\u0e31\u0e1a {0}+ (VANILLA XP BOOST)
Smelting.Ability.Locked.1=\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e1b\u0e25\u0e14\u0e25\u0e47\u0e2d\u0e01\u0e44\u0e14\u0e49\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e23\u0e30\u0e14\u0e31\u0e1a {0}+ (FLUX MINING)
Smelting.Ability.SecondSmelt=[[RED]]Second Smelt \u0e42\u0e2d\u0e01\u0e32\u0e2a: [[YELLOW]]{0}
Smelting.Ability.VanillaXPBoost=[[RED]]Vanilla EXP \u0e40\u0e1e\u0e34\u0e48\u0e21\u0e02\u0e36\u0e49\u0e19: [[YELLOW]]{0}x
Smelting.Effect.0=Fuel Efficiency
Smelting.Effect.1=\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e40\u0e27\u0e25\u0e32\u0e01\u0e32\u0e23\u0e40\u0e1c\u0e32\u0e44\u0e2b\u0e21\u0e49\u0e02\u0e2d\u0e07\u0e40\u0e0a\u0e37\u0e49\u0e2d\u0e40\u0e1e\u0e25\u0e34\u0e07\u0e17\u0e35\u0e48\u0e43\u0e0a\u0e49\u0e43\u0e19\u0e40\u0e15\u0e32\u0e2b\u0e25\u0e2d\u0e21\u0e16\u0e25\u0e38\u0e07
Smelting.Effect.2=Second Smelt
Smelting.Effect.3=\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e17\u0e23\u0e31\u0e1e\u0e22\u0e32\u0e01\u0e23\u0e17\u0e35\u0e48\u0e44\u0e14\u0e49\u0e08\u0e32\u0e01\u0e01\u0e32\u0e23\u0e16\u0e25\u0e38\u0e07
Smelting.Effect.4=Vanilla EXP \u0e40\u0e1e\u0e34\u0e48\u0e21\u0e02\u0e36\u0e49\u0e19
Smelting.Effect.5=\u0e40\u0e1e\u0e34\u0e48\u0e21 Vanilla EXP \u0e44\u0e14\u0e49\u0e23\u0e31\u0e1a\u0e43\u0e19\u0e02\u0e13\u0e30\u0e17\u0e35\u0e48\u0e16\u0e25\u0e38\u0e07
Smelting.Effect.6=Flux Mining
Smelting.Effect.7=\u0e42\u0e2d\u0e01\u0e32\u0e2a\u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a\u0e41\u0e23\u0e48\u0e17\u0e35\u0e48\u0e08\u0e30\u0e16\u0e25\u0e38\u0e07\u0e17\u0e31\u0e19\u0e17\u0e35\u0e43\u0e19\u0e02\u0e13\u0e30\u0e17\u0e35\u0e48\u0e01\u0e32\u0e23\u0e17\u0e33\u0e40\u0e2b\u0e21\u0e37\u0e2d\u0e07\u0e41\u0e23\u0e48
Smelting.FluxMining.Success=[[GREEN]]\u0e41\u0e23\u0e48\u0e16\u0e39\u0e01\u0e16\u0e25\u0e38\u0e07!
Smelting.Listener=\u0e17\u0e31\u0e01\u0e29\u0e30 Smelting:
Smelting.SkillName=SMELTING
Commands.Description.addlevels=\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e23\u0e30\u0e14\u0e31\u0e1a\u0e43\u0e2b\u0e49\u0e01\u0e31\u0e1a\u0e1c\u0e39\u0e49\u0e43\u0e0a\u0e49 mcMMO
Commands.Description.adminchat=\u0e2a\u0e25\u0e31\u0e1a mcMMO \u0e1c\u0e39\u0e49\u0e14\u0e39\u0e41\u0e25\u0e23\u0e30\u0e1a\u0e1a\u0e41\u0e0a\u0e17\u0e1a\u0e19 on/off \u0e2b\u0e23\u0e37\u0e2d\u0e2a\u0e48\u0e07\u0e02\u0e49\u0e2d\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e19\u0e17\u0e19\u0e32\u0e1c\u0e39\u0e49\u0e14\u0e39\u0e41\u0e25\u0e23\u0e30\u0e1a\u0e1a
Commands.Description.addxp=\u0e40\u0e1e\u0e34\u0e48\u0e21 mcMMO EXP \u0e43\u0e2b\u0e49\u0e01\u0e31\u0e1a\u0e1c\u0e39\u0e49\u0e43\u0e0a\u0e49
Commands.Description.hardcore=\u0e41\u0e01\u0e49\u0e44\u0e02\u0e23\u0e49\u0e2d\u0e22\u0e25\u0e30 Hardcore mcMMO \u0e2b\u0e23\u0e37\u0e2d\u0e42\u0e2b\u0e21\u0e14 Hardcore \u0e2a\u0e25\u0e31\u0e1a on/off
Commands.Description.inspect=\u0e14\u0e39\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e23\u0e32\u0e22\u0e25\u0e30\u0e40\u0e2d\u0e35\u0e22\u0e14\u0e40\u0e01\u0e35\u0e48\u0e22\u0e27\u0e01\u0e31\u0e1a mcMMO \u0e1c\u0e39\u0e49\u0e40\u0e25\u0e48\u0e19\u0e04\u0e19\u0e2d\u0e37\u0e48\u0e19
Commands.Description.mcability=\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e43\u0e19\u0e01\u0e32\u0e23\u0e2a\u0e25\u0e31\u0e1a mcMMO \u0e01\u0e32\u0e23\u0e40\u0e15\u0e23\u0e35\u0e22\u0e21\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e04\u0e25\u0e34\u0e01\u0e02\u0e27\u0e32 on/off
Commands.Description.mcgod=\u0e2a\u0e25\u0e31\u0e1a mcMMO GodMode on/off
Commands.Description.mchud=\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e2a\u0e44\u0e15\u0e25\u0e4c\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13 mcMMO HUD
Commands.Description.mcmmo=\u0e41\u0e2a\u0e14\u0e07\u0e04\u0e33\u0e2d\u0e18\u0e34\u0e1a\u0e32\u0e22\u0e2a\u0e31\u0e49\u0e19\u0e40\u0e01\u0e35\u0e48\u0e22\u0e27\u0e01\u0e31\u0e1a mcMMO
Commands.Description.mcnotify=\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e43\u0e19\u0e01\u0e32\u0e23\u0e2a\u0e25\u0e31\u0e1a mcMMO \u0e2a\u0e19\u0e17\u0e19\u0e32\u0e01\u0e32\u0e23\u0e41\u0e08\u0e49\u0e07\u0e40\u0e15\u0e37\u0e2d\u0e19\u0e01\u0e32\u0e23\u0e41\u0e2a\u0e14\u0e07\u0e1c\u0e25 on/off
Commands.Description.mcpurge=\u0e1c\u0e39\u0e49\u0e43\u0e0a\u0e49\u0e17\u0e35\u0e48\u0e44\u0e21\u0e48\u0e21\u0e35\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e30\u0e2d\u0e32\u0e14\u0e23\u0e30\u0e14\u0e31\u0e1a mcMMO \u0e41\u0e25\u0e30\u0e1c\u0e39\u0e49\u0e43\u0e0a\u0e49\u0e17\u0e35\u0e48\u0e22\u0e31\u0e07\u0e44\u0e21\u0e48\u0e44\u0e14\u0e49\u0e40\u0e0a\u0e37\u0e48\u0e2d\u0e21\u0e15\u0e48\u0e2d\u0e43\u0e19\u0e0a\u0e48\u0e27\u0e07\u0e2b\u0e25\u0e32\u0e22\u0e40\u0e14\u0e37\u0e2d\u0e19\u0e17\u0e35\u0e48 {0} \u0e08\u0e32\u0e01\u0e10\u0e32\u0e19\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25 mcMMO
Commands.Description.mcrank=\u0e41\u0e2a\u0e14\u0e07\u0e01\u0e32\u0e23\u0e08\u0e31\u0e14\u0e2d\u0e31\u0e19\u0e14\u0e31\u0e1a mcMMO \u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a\u0e1c\u0e39\u0e49\u0e40\u0e25\u0e48\u0e19
Commands.Description.mcrefresh=\u0e23\u0e35\u0e40\u0e1f\u0e23\u0e0a\u0e04\u0e39\u0e25\u0e14\u0e32\u0e27\u0e19\u0e4c\u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14\u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a mcMMO
Commands.Description.mcremove=\u0e25\u0e1a\u0e1c\u0e39\u0e49\u0e43\u0e0a\u0e49\u0e08\u0e32\u0e01\u0e10\u0e32\u0e19\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25 mcMMO
Commands.Description.mcstats=\u0e41\u0e2a\u0e14\u0e07\u0e23\u0e30\u0e14\u0e31\u0e1a mcMMO \u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13\u0e41\u0e25\u0e30 EXP
Commands.Description.mctop=\u0e41\u0e2a\u0e14\u0e07\u0e01\u0e23\u0e30\u0e14\u0e32\u0e19\u0e1c\u0e39\u0e49\u0e19\u0e33 mcMMO
Commands.Description.mmoedit=\u0e41\u0e01\u0e49\u0e44\u0e02\u0e23\u0e30\u0e14\u0e31\u0e1a mcMMO \u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a\u0e1c\u0e39\u0e49\u0e43\u0e0a\u0e49
Commands.Description.mmoupdate=\u0e01\u0e32\u0e23\u0e41\u0e1b\u0e25\u0e07\u0e10\u0e32\u0e19\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e08\u0e32\u0e01 mcMMO Flatfile \u0e44\u0e1b\u0e22\u0e31\u0e07 MySQL
Commands.Description.party=\u0e04\u0e27\u0e1a\u0e04\u0e38\u0e21\u0e01\u0e32\u0e23\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32\u0e15\u0e48\u0e32\u0e07\u0e46 Party
Commands.Description.partychat=\u0e2a\u0e25\u0e31\u0e1a mcMMO Party \u0e01\u0e32\u0e23\u0e41\u0e0a\u0e17\u0e2b\u0e23\u0e37\u0e2d\u0e2a\u0e48\u0e07\u0e02\u0e49\u0e2d\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e19\u0e17\u0e19\u0e32\u0e02\u0e2d\u0e07\u0e1a\u0e38\u0e04\u0e04\u0e25
Commands.Description.ptp=Teleport \u0e44\u0e1b\u0e2b\u0e32\u0e2a\u0e21\u0e32\u0e0a\u0e34\u0e01 Party
Commands.Description.Skill=\u0e41\u0e2a\u0e14\u0e07\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e23\u0e32\u0e22\u0e25\u0e30\u0e40\u0e2d\u0e35\u0e22\u0e14\u0e17\u0e31\u0e01\u0e29\u0e30 mcMMO {0}
Commands.Description.skillreset=\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32\u0e23\u0e30\u0e14\u0e31\u0e1a mcMMO \u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a\u0e1c\u0e39\u0e49\u0e43\u0e0a\u0e49
Commands.Description.vampirism=\u0e41\u0e01\u0e49\u0e44\u0e02\u0e23\u0e49\u0e2d\u0e22\u0e25\u0e30 vampirism mcMMO \u0e2b\u0e23\u0e37\u0e2d\u0e42\u0e2b\u0e21\u0e14\u0e2a\u0e25\u0e31\u0e1a vampirism on/off
Commands.Description.xplock=\u0e25\u0e47\u0e2d\u0e04 mcMMO \u0e1a\u0e32\u0e23\u0e4c\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13 EXP \u0e17\u0e31\u0e01\u0e29\u0e30 mcMMO \u0e40\u0e09\u0e1e\u0e32\u0e30
Commands.Description.xprate=\u0e41\u0e01\u0e49\u0e44\u0e02\u0e2d\u0e31\u0e15\u0e23\u0e32 mcMMO EXP \u0e2b\u0e23\u0e37\u0e2d\u0e40\u0e23\u0e34\u0e48\u0e21\u0e15\u0e49\u0e19\u0e40\u0e2b\u0e15\u0e38\u0e01\u0e32\u0e23\u0e13\u0e4c mcMMO EXP
UpdateChecker.outdated=You are using an outdated version of mcMMO!
UpdateChecker.newavailable=There is a new version available on BukkitDev.
Salvage.Listener=\u0e17\u0e31\u0e01\u0e29\u0e30 Salvage:
Salvage.SkillName=SALVAGE

View File

@@ -1,5 +1,5 @@
Acrobatics.Ability.Proc=[[GREEN]]**\u5b8c\u7f8e\u8457\u9678**
Acrobatics.Combat.Proc=[[GREEN]\u9583\u907f
Acrobatics.Combat.Proc=[[GREEN]]**\u9583\u907f**
Acrobatics.DodgeChance=[[RED]]\u8ff4\u907f\u6a5f\u7387: [[YELLOW]]{0}
Acrobatics.Effect.0=\u7ffb\u6efe
Acrobatics.Effect.1=\u6e1b\u5c11\u6216\u53d6\u6d88\u6389\u843d\u50b7\u5bb3
@@ -124,7 +124,7 @@ Mining.Ability.Locked.0=\u9396\u5b9a \u76f4\u5230 {0}+ \u6280\u80fd (\u6316\u792
Mining.Ability.Locked.1=\u9396\u5b9a \u76f4\u5230 {0}+ \u6280\u80fd (\u66f4\u5927\u7684\u70b8\u5f48)
Mining.Ability.Locked.2=\u9396\u5b9a \u76f4\u5230 {0}+ \u6280\u80fd (\u7206\u7834\u5c08\u5bb6)
Mining.Ability.Lower=[[GRAY]]**\u4f60\u653e\u4e0b\u4e86\u4f60\u7684\u7a3f\u5b50**
Mining.Ability.Ready=[GREEN]**\u4f60\u63e1\u7dca\u4e86\u4f60\u7684\u93ac\u5b50**\\\n\\\n
Mining.Ability.Ready=[[GREEN]]**\u4f60\u63e1\u7dca\u4e86\u4f60\u7684\u7a3f\u5b50**
Mining.Effect.0=\u8d85\u7d1a\u5de5\u4eba (\u4e3b\u52d5\u6280\u80fd)
Mining.Effect.1=\u901f\u5ea6+, 3\u500d\u6389\u843d\u7387
Mining.Effect.2=\u96d9\u500d\u6389\u843d
@@ -224,6 +224,7 @@ Swords.SS.Length=[[RED]]\u6c23\u7d55\u528d\u6301\u7e8c\u6642\u9593: [[YELLOW]]{0
Taming.Ability.Bonus.0=\u8fc5\u9748\u654f\u6377
Taming.Ability.Bonus.1=\u72fc\u6703\u907f\u958b\u5371\u96aa
Taming.Ability.Bonus.2=\u539a\u5be6\u7684\u76ae\u6bdb
Taming.Ability.Bonus.3=1/{0} \u50b7\u5bb3/\u706b\u7130\u50b7\u5bb3
Taming.Ability.Bonus.4=\u885d\u64ca\u683c\u64cb
Taming.Ability.Bonus.6=\u5229\u722a
Taming.Ability.Bonus.7=+{0} \u50b7\u5bb3
@@ -395,6 +396,7 @@ Commands.ptp.Disabled=\u968a\u4f0d\u50b3\u9001 [[RED]]\u4e0d\u5141\u8a31
Commands.ptp.NoRequests=[[RED]]\u4f60\u73fe\u5728\u4e0d\u53ef\u4ee5\u50b3\u9001
Commands.ptp.NoWorldPermissions=[[RED]] [mcMMO]\u60a8\u6c92\u6709\u6b0a\u9650\u50b3\u9001\u5230\u6b64\u4e16\u754c{0}\u3002
Commands.ptp.Request1=[[YELLOW]]{0} [[GREEN]]\u5df2\u50b3\u9001\u81f3\u4f60\u65c1\u908a.
Commands.ptp.Request2=[[GREEN]]\u4f60\u50b3\u9001\u7684\u8a71\u8acb\u8f38\u5165[[YELLOW]]/ptp accept. [[GREEN]]\u5728[[RED]]{0} [[GREEN]]\u79d2\u5167\u5fc5\u9808\u5b8c\u6210
Commands.ptp.RequestExpired=[[RED]]\u968a\u4f0d\u50b3\u9001\u5df2\u6210\u529f!
Commands.PowerLevel.Leaderboard=[[YELLOW]]--mcMMO[[BLUE]] \u80fd\u529b\u7b49\u7d1a [[YELLOW]]\u6392\u884c\u699c--
Commands.PowerLevel.Capped=[[DARK_RED]]\u80fd\u529b\u7b49\u7d1a: [[GREEN]]{0} [[DARK_RED]]\u6700\u9ad8\u7b49\u7d1a: [[YELLOW]]{1}
@@ -426,6 +428,7 @@ mcMMO.NoSkillNote=[[DARK_GRAY]]\u5982\u679c\u4f60\u7121\u6cd5\u4f7f\u7528\u90a3\
Party.Forbidden=[mcMMO] \u968a\u4f0d\u529f\u80fd\u4e0d\u5141\u8a31\u5728\u9019\u4e16\u754c\u958b\u555f (\u8acb\u89c0\u770b\u6b0a\u9650\u8a2d\u5b9a)
Party.Help.0=[RED]]\u6b63\u78ba\u4f7f\u7528[DARK_AQUA] {0} <player> [\u5bc6\u78bc]\u3002
Party.Help.1=[RED]]\u8981\u5275\u5efa\u4e00\u500b\u968a\u4f0d\uff0c\u8acb\u4f7f\u7528[DARK_AQUA] {0} <\u540d\u7a31> [\u5bc6\u78bc]\u3002
Party.Help.3=[[RED]]\u4f7f\u7528 [[DARK_AQUA]]{0} <player> [password] [[RED]]\u4f86\u52a0\u5165\u6216\u4f7f\u7528 [[DARK_AQUA]]{1} [[RED]]\u4f86\u96e2\u958b
Party.Help.4=[RED]]\u8981\u9396\u5b9a\u6216\u89e3\u9396\u4f60\u7684\u968a\u4f0d\uff0c\u4f7f\u7528[DARK_AQUA]] {0}
Party.Help.5=[[RED]]\u4f7f\u7528\u5bc6\u78bc\u4fdd\u8b77\u4f60\u7684\u968a\u4f0d\uff0c\u8acb\u4f7f\u7528[DARK_AQUA] {0}<\u5bc6\u78bc>
Party.Help.6=[[RED]]\u8981\u8e22\u7684\u7403\u54e1\u5f9e\u968a\u4f0d\u4e2d\uff0c\u4f7f\u7528[DARK_AQUA] {0} <player>
@@ -493,8 +496,12 @@ Commands.xprate.started.0=[[GOLD]] mcMMO \u7d93\u9a57\u52a0\u500d\u6642\u6bb5\u9
Commands.xprate.started.1=[[GOLD]]mcMMO \u7d93\u9a57\u503c\u73fe\u5728\u52a0\u500d {0}x!
XPRate.Event=[[GOLD]]mcMMO\u73fe\u6b63\u8655\u65bc\u7d93\u9a57\u503c\u52a0\u500d\u968e\u6bb5!\u7d93\u9a57\u503c\u500d\u6578\u70ba{0}\u500d!
Effects.Effects=\u6548\u679c
Effects.Child=[[DARK_GRAY]]\u7b49\u7d1a: [[GREEN]]{0}
Effects.Level=[[DARK_GRAY]]\u7b49\u7d1a: [[GREEN]]{0} [[DARK_AQUA]]\u7d93\u9a57\u503c[[YELLOW]]([[GOLD]]{1}[[YELLOW]]/[[GOLD]]{2}[[YELLOW]])
Effects.Parent=[[GOLD]]{0} -
Effects.Template=[[DARK_AQUA]]{0}: [[GREEN]]{1}
Guides.Excavation=[[DARK_AQUA]]About Excavation:\n[[YELLOW]]Excavation is the act of digging up dirt to find treasures.\n[[YELLOW]]By excavating the land you will find treasures.\n[[YELLOW]]The more you do this the more treasures you can find.\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]To gain XP in this skill you must dig with a shovel in hand.\n[[YELLOW]]Only certain materials can be dug up for treasures and XP.\n[[DARK_AQUA]]Compatible Materials:\n[[YELLOW]]Grass, Dirt, Sand, Clay, Gravel, Mycelium, Soul Sand\n[[DARK_AQUA]]How to use Giga Drill Breaker:\n[[YELLOW]]With a shovel in hand right click to ready your tool.\n[[YELLOW]]Once in this state you have about 4 seconds to make\n[[YELLOW]]contact with Excavation compatible materials this will\n[[YELLOW]]activate Giga Drill Breaker.\n[[DARK_AQUA]]What is Giga Drill Breaker?\n[[YELLOW]]Giga Drill Breaker is an ability with a cooldown\n[[YELLOW]]tied to Excavation skill. It triples your chance\n[[YELLOW]]of finding treasures and enables instant break\n[[YELLOW]]on Excavation materials.\n[[DARK_AQUA]]How does Treasure Hunter work?\n[[YELLOW]]Every possible treasure for Excavation has its own\n[[YELLOW]]skill level requirement for it to drop, as a result it\'s\n[[YELLOW]]difficult to say how much it is helping you.\n[[YELLOW]]Just keep in mind that the higher your Excavation skill\n[[YELLOW]]is, the more treasures that can be found.\n[[YELLOW]]And also keep in mind that each type of Excavation\n[[YELLOW]]compatible material has its own unique list of treasures.\n[[YELLOW]]In other words you will find different treasures in Dirt\n[[YELLOW]]than you would in Gravel.\n[[DARK_AQUA]]Notes about Excavation:\n[[YELLOW]]Excavation drops are completely customizeable\n[[YELLOW]]So results vary server to server.
Guides.Header=[[GOLD]]-=[[GREEN]]{0} \u6307\u5357[[GOLD]]=-
Guides.Page.Invalid=\u4e0d\u5b58\u5728\u7684\u9801\u6578
Guides.Page.OutOfRange=\u9019\u9801\u78bc\u4e0d\u5b58\u5728,\u7e3d\u5171\u53ea\u6709{0} \u9801.
Guides.Smelting=\u4e0b\u6b21\u9084\u6709...
@@ -506,9 +513,11 @@ Inspect.TooFar=[[RED]]\u56e0\u8ddd\u96e2\u592a\u9060\u7121\u6cd5\u67e5\u770b\u90
Item.ChimaeraWing.Fail=**\u5947\u7f8e\u62c9\u4e4b\u7ffc\u4f7f\u7528\u5931\u6557\u4e86!**
Item.ChimaeraWing.Pass=**\u5947\u7f8e\u62c9\u4e4b\u7ffc**
Item.Injured.Wait=\u4f60\u904e\u5ea6\u75b2\u52de\u5fc5\u9808\u7b49\u5f85\u4e00\u6bb5\u6642\u9593\u5f8c\u624d\u53ef\u4f7f\u7528. [[YELLOW]]({0}s)
Skills.Child=[[GOLD]](\u5c0f\u5b69\u6280\u80fd)
Skills.Disarmed=[[DARK_RED]]\u4f60\u7684\u6b66\u5668\u88ab\u63a0\u596a\u4e86!
Skills.Header=[[RED]]-----[][[GREEN]]{0}[[RED]][]-----
Skills.NeedMore=[[DARK_RED]]\u4f60\u9700\u8981\u66f4\u591a[[GRAY]]{0}
Skills.Parents=\u7236\u6bcd
Skills.Stats=[[YELLOW]]{0}[[GREEN]]{1}[[DARK_AQUA]] XP([[GRAY]]{2}[[DARK_AQUA]]/[[GRAY]]{3}[[DARK_AQUA]])
Skills.TooTired=[[RED]]\u6b64\u6280\u80fd\u6b63\u8655\u65bc\u51b7\u537b\u6642\u9593. [[YELLOW]]({0}s)
Stats.Header.Combat=[[GOLD]]-=\u683c\u9b25\u6280\u80fd=-
@@ -542,15 +551,23 @@ MOTD.Version=[[GOLD]][mcMMO] \u6b63\u904b\u4f5c\u7684\u7248\u672c [[DARK_AQUA]]{
MOTD.Website=[[GOLD]][mcMMO] [[GREEN]]{0}[[YELLOW]] - mcMMO \u9996\u9801
Smelting.Ability.Locked.0=\u9396\u5b9a\u72c0\u614b\uff0c\u76f4\u5230{0} +\u6280\u80fd\uff08VANILLA XP BOOST\uff09
Smelting.Ability.Locked.1=\u9396\u5b9a\u72c0\u614b\uff0c\u76f4\u5230{0} +\u6280\u80fd\uff08FLUX\u7926\u696d\uff09
Smelting.Effect.6=Flux \u6316\u7926
Commands.Description.addlevels=\u7d66\u4e88\u73a9\u5bb6McMMO\u7b49\u7d1a
Commands.Description.adminchat=<FONT> <font class=\"\">\u5207\u63dbmcMMO\u7ba1\u7406\u804a\u5929\u958b/\u95dc\u6216\u767c\u9001\u7d66\u7ba1\u7406\u54e1\u7684\u804a\u5929\u6d88\u606f</ FONT> </ FONT>
Commands.Description.addxp=\u7d66\u4e88\u73a9\u5bb6McMMO\u7d93\u9a57\u503c
Commands.Description.mcgod=\u5207\u63db\u795e\u4e4b\u6a21\u5f0f on/off
Commands.Description.mchud=\u66f4\u63db\u4f60\u7684McMMO HUD\u985e\u578b!
Commands.Description.mcmmo=\u986f\u793a\u4e00\u500bmcMMO\u7684\u7c21\u55ae\u63cf\u8ff0
Commands.Description.mcnotify=\u5207\u63dbmcMMO\u7684\u804a\u5929\u986f\u793a\u901a\u77e5 \u958b/\u95dc
Commands.Description.mcrank=\u986f\u793a\u6240\u6709mcMMO\u7684\u6392\u540d
Commands.Description.mcrefresh=\u5237\u65b0\u6240\u6709McMMO\u6280\u80fd\u51b7\u537b\u6642\u9593
Commands.Description.mcremove=<font><font class=\"\">\u5f9emcMMO\u6578\u64da\u5eab\u4e2d\u522a\u9664\u7528\u6236</font></font>
Commands.Description.mctop=<font><font>\u986f\u793amcMMO\u6392\u884c\u699c</font></font>
Commands.Description.mmoedit=\u65b0\u589e\u73a9\u5bb6McMMO\u7b49\u7d1a
Commands.Description.party=<FONT> <FONT>\u63a7\u5236\u5404\u7a2emcMMO\u968a\u4f0d\u7684\u8a2d\u7f6e</ FONT> </ FONT>
Commands.Description.partychat=\u5207\u63dbmcMMO\u958b/\u95dc\u968a\u4f0d\u7684\u804a\u5929\u6216\u767c\u9001\u65b9\u7684\u804a\u5929\u4fe1\u606f
Commands.Description.ptp=\u50b3\u9001\u5230\u4e00\u500bmcMMO\u968a\u4f0d\u6210\u54e1\u65c1
Commands.Description.Skill=\u986f\u793a\u7684\u8a73\u7d30mcMMO\u6280\u80fd\u4fe1\u606f{0}
Commands.Description.skillreset=\u91cd\u7f6e\u73a9\u5bb6McMMO\u7b49\u7d1a
UpdateChecker.outdated=\u60a8\u4f7f\u7528\u7684\u662f\u904e\u6642\u7684\u7248\u672cmcMMO\uff01
UpdateChecker.newavailable=\u6709\u65b0\u7684\u7248\u672cBukkitDev\u3002

View File

@@ -104,6 +104,9 @@ commands:
mcnotify:
aliases: [notify]
description: Toggle mcMMO abilities chat display notifications on/off
mobhealth:
aliases: [mcmobhealth]
description: Change the style of the mob healthbar
permissions:
mcmmo.*:
default: false
@@ -251,6 +254,7 @@ permissions:
children:
mcmmo.ability.fishing.fishermansdiet: true
mcmmo.ability.fishing.magic: true
mcmmo.ability.fishing.masterangler: true
mcmmo.ability.fishing.shakemob: true
mcmmo.ability.fishing.treasures: true
mcmmo.ability.fishing.vanillaxpboost: true
@@ -258,6 +262,8 @@ permissions:
description: Allows access to the Fishermans's Diet ability
mcmmo.ability.fishing.magic:
description: Allows enchanted drops from Fishing
mcmmo.ability.fishing.masterangler:
description: Allows access to the Master Angler ability
mcmmo.ability.fishing.shakemob:
description: Allows access to the Shake Mob ability
mcmmo.ability.fishing.treasures:
@@ -659,6 +665,7 @@ permissions:
mcmmo.commands.mcstats: true
mcmmo.commands.mctop.all: true
mcmmo.commands.mining: true
mcmmo.commands.mobhealth: true
mcmmo.commands.party.all: true
mcmmo.commands.ptp: true
mcmmo.commands.ptp.accept: true
@@ -875,6 +882,9 @@ permissions:
mcmmo.commands.mmoupdate:
default: false
description: Allows access to the mmoupdate command
mcmmo.commands.mobhealth:
default: true
description: Allows access to the mobhealth command
mcmmo.commands.party.*:
default: false
description: Implies access to all mcmmo.commands.party permissions.
@@ -954,12 +964,15 @@ permissions:
description: Implies access to all mcmmo.commands.ptp permissions.
children:
mcmmo.commands.ptp: true
mcmmo.commands.ptp.send: true
mcmmo.commands.ptp.accept: true
mcmmo.commands.ptp.acceptall: true
mcmmo.commands.ptp.toggle: true
mcmmo.commands.ptp.world.all: true
mcmmo.commands.ptp:
description: Allows access to the ptp command
mcmmo.commands.ptp.send:
description: Allows access to the ptp <player> command
mcmmo.commands.ptp.accept:
description: Allows access to the ptp accept command
mcmmo.commands.ptp.acceptall:
@@ -1176,6 +1189,7 @@ permissions:
children:
mcmmo.chat.partychat: true
mcmmo.commands.defaults: true
mcmmo.mobhealthdisplay: true
mcmmo.motd: true
mcmmo.skills.all: true
mcmmo.defaultsop:
@@ -1197,6 +1211,8 @@ permissions:
mcmmo.item.chimaerawing: true
mcmmo.item.chimaerawing:
description: Allows use of Chimaera Wing item
mcmmo.mobhealthdisplay:
description: Allows viewing of mob health display during combat
mcmmo.motd:
description: Allows access to the motd
mcmmo.party.*:

View File

@@ -100,6 +100,62 @@ Hylian_Luck:
- Diamond_Gem
- Gold_Nuggets
#
# Settings for Shake
###
Shake:
Treasure:
- Blaze_Blaze_Rod
- Cave_Spider_Cobweb
- Cave_Spider_Potion
- Cave_Spider_Spider_Eye
- Cave_Spider_String
- Spider_Spider_Eye
- Spider_String
- Chicken_Feather
- Chicken_Raw_Chicken
- Chicken_Egg
- Cow_Milk_Bucket
- Cow_Leather
- Cow_Raw_Beef
- Creeper_Skull
- Creeper_Sulphur
- Enderman_Ender_Pearl
- Ghast_Sulphur
- Ghast_Ghast_Tear
- Iron_Golem_Pumpkin
- Iron_Golem_Iron_Ingot
- Iron_Golem_Red_Rose
- Magma_Cube_Magma_Cream
- Mushroom_Cow_Milk_Bucket
- Mushroom_Cow_Mushroom_Soup
- Mushroom_Cow_Leather
- Mushroom_Cow_Raw_Beef
- Mushroom_Cow_Red_Mushroom
- Pig_Pork
- Pig_Zombie_Rotten_Flesh
- Pig_Zombie_Gold_Nugget
- Sheep_Wool
- Skeleton_Skull
- Skeleton_Bone
- Skeleton_Arrow
- Slime_Slime_Ball
- Snowman_Pumpkin
- Snowman_Snowball
- Squid_Ink_Sack
- Witch_Heal_Potion
- Witch_Fire_Potion
- Witch_Speed_Potion
- Witch_Glass_Bottle
- Witch_Glowstone_Dust
- Witch_Sulphur
- Witch_Redstone
- Witch_Spider_Eye
- Witch_Stick
- Witch_Sugar
- Witch_Potion
- Zombie_Skull
- Zombie_Rotten_Flesh
#
# Configuration to define Treasures
###
Treasures:
@@ -968,4 +1024,518 @@ Treasures:
Drop_Chance: 100.0
Drop_Level: 0
Drops_From:
Pots: true
Pots: true
Blaze_Blaze_Rod:
ID: 369
Mob: BLAZE
Data: 0
Amount: 1
XP: 0
Drop_Chance: 100.0
Drop_Level: 0
Drops_From:
Shake: true
Cave_Spider_Spider_Eye:
ID: 375
Mob: CAVE_SPIDER
Data: 0
Amount: 1
XP: 0
Drop_Chance: 49.0
Drop_Level: 0
Drops_From:
Shake: true
Cave_Spider_String:
ID: 287
Mob: CAVE_SPIDER
Data: 0
Amount: 1
XP: 0
Drop_Chance: 49.0
Drop_Level: 0
Drops_From:
Shake: true
Cave_Spider_Cobweb:
ID: 30
Mob: CAVE_SPIDER
Data: 0
Amount: 1
XP: 0
Drop_Chance: 1.0
Drop_Level: 0
Drops_From:
Shake: true
Cave_Spider_Potion:
ID: 373
Mob: CAVE_SPIDER
Potion_Type: POISON
Data: 0
Amount: 1
XP: 0
Drop_Chance: 1.0
Drop_Level: 0
Drops_From:
Shake: true
Spider_Spider_Eye:
ID: 375
Mob: SPIDER
Data: 0
Amount: 1
XP: 0
Drop_Chance: 50.0
Drop_Level: 0
Drops_From:
Shake: true
Spider_String:
ID: 287
Mob: SPIDER
Data: 0
Amount: 1
XP: 0
Drop_Chance: 50.0
Drop_Level: 0
Drops_From:
Shake: true
Chicken_Feather:
ID: 288
Mob: CHICKEN
Data: 0
Amount: 1
XP: 0
Drop_Chance: 33.3
Drop_Level: 0
Drops_From:
Shake: true
Chicken_Raw_Chicken:
ID: 365
Mob: CHICKEN
Data: 0
Amount: 1
XP: 0
Drop_Chance: 33.3
Drop_Level: 0
Drops_From:
Shake: true
Chicken_Egg:
ID: 344
Mob: CHICKEN
Data: 0
Amount: 1
XP: 0
Drop_Chance: 33.3
Drop_Level: 0
Drops_From:
Shake: true
Cow_Milk_Bucket:
ID: 335
Mob: COW
Data: 0
Amount: 1
XP: 0
Drop_Chance: 2.0
Drop_Level: 0
Drops_From:
Shake: true
Cow_Leather:
ID: 334
Mob: COW
Data: 0
Amount: 1
XP: 0
Drop_Chance: 49.0
Drop_Level: 0
Drops_From:
Shake: true
Cow_Raw_Beef:
ID: 363
Mob: COW
Data: 0
Amount: 1
XP: 0
Drop_Chance: 49.0
Drop_Level: 0
Drops_From:
Shake: true
Creeper_Skull:
ID: 397
Mob: CREEPER
Data: 4
Amount: 1
XP: 0
Drop_Chance: 1.0
Drop_Level: 0
Drops_From:
Shake: true
Creeper_Sulphur:
ID: 289
Mob: CREEPER
Data: 0
Amount: 1
XP: 0
Drop_Chance: 99.0
Drop_Level: 0
Drops_From:
Shake: true
Enderman_Ender_Pearl:
ID: 368
Mob: ENDERMAN
Data: 0
Amount: 1
XP: 0
Drop_Chance: 100.0
Drop_Level: 0
Drops_From:
Shake: true
Ghast_Sulphur:
ID: 289
Mob: GHAST
Data: 0
Amount: 1
XP: 0
Drop_Chance: 50.0
Drop_Level: 0
Drops_From:
Shake: true
Ghast_Ghast_Tear:
ID: 370
Mob: GHAST
Data: 0
Amount: 1
XP: 0
Drop_Chance: 50.0
Drop_Level: 0
Drops_From:
Shake: true
Iron_Golem_Pumpkin:
ID: 86
Mob: IRON_GOLEM
Data: 0
Amount: 1
XP: 0
Drop_Chance: 3.0
Drop_Level: 0
Drops_From:
Shake: true
Iron_Golem_Iron_Ingot:
ID: 265
Mob: IRON_GOLEM
Data: 0
Amount: 1
XP: 0
Drop_Chance: 12.0
Drop_Level: 0
Drops_From:
Shake: true
Iron_Golem_Red_Rose:
ID: 38
Mob: IRON_GOLEM
Data: 0
Amount: 1
XP: 0
Drop_Chance: 85.0
Drop_Level: 0
Drops_From:
Shake: true
Magma_Cube_Magma_Cream:
ID: 378
Mob: MAGMA_CUBE
Data: 0
Amount: 1
XP: 0
Drop_Chance: 100.0
Drop_Level: 0
Drops_From:
Shake: true
Mushroom_Cow_Milk_Bucket:
ID: 335
Mob: MUSHROOM_COW
Data: 0
Amount: 1
XP: 0
Drop_Chance: 5.0
Drop_Level: 0
Drops_From:
Shake: true
Mushroom_Cow_Mushroom_Soup:
ID: 282
Mob: MUSHROOM_COW
Data: 0
Amount: 1
XP: 0
Drop_Chance: 5.0
Drop_Level: 0
Drops_From:
Shake: true
Mushroom_Cow_Leather:
ID: 334
Mob: MUSHROOM_COW
Data: 0
Amount: 1
XP: 0
Drop_Chance: 30.0
Drop_Level: 0
Drops_From:
Shake: true
Mushroom_Cow_Raw_Beef:
ID: 363
Mob: MUSHROOM_COW
Data: 0
Amount: 1
XP: 0
Drop_Chance: 30.0
Drop_Level: 0
Drops_From:
Shake: true
Mushroom_Cow_Red_Mushroom:
ID: 40
Mob: MUSHROOM_COW
Data: 0
Amount: 2
XP: 0
Drop_Chance: 30.0
Drop_Level: 0
Drops_From:
Shake: true
Pig_Pork:
ID: 319
Mob: PIG
Data: 0
Amount: 1
XP: 0
Drop_Chance: 100.0
Drop_Level: 0
Drops_From:
Shake: true
Pig_Zombie_Rotten_Flesh:
ID: 367
Mob: PIG_ZOMBIE
Data: 0
Amount: 1
XP: 0
Drop_Chance: 50.0
Drop_Level: 0
Drops_From:
Shake: true
Pig_Zombie_Gold_Nugget:
ID: 371
Mob: PIG_ZOMBIE
Data: 0
Amount: 1
XP: 0
Drop_Chance: 50.0
Drop_Level: 0
Drops_From:
Shake: true
Sheep_Wool:
ID: 35
Mob: SHEEP
Data: 0
Amount: 3
XP: 0
Drop_Chance: 100.0
Drop_Level: 0
Drops_From:
Shake: true
Skeleton_Skull:
ID: 397
Mob: SKELETON
Data: 0
Amount: 1
XP: 0
Drop_Chance: 2.0
Drop_Level: 0
Drops_From:
Shake: true
Skeleton_Bone:
ID: 352
Mob: SKELETON
Data: 0
Amount: 1
XP: 0
Drop_Chance: 49.0
Drop_Level: 0
Drops_From:
Shake: true
Skeleton_Arrow:
ID: 262
Mob: SKELETON
Data: 0
Amount: 2
XP: 0
Drop_Chance: 49.0
Drop_Level: 0
Drops_From:
Shake: true
Slime_Slime_Ball:
ID: 341
Mob: SLIME
Data: 0
Amount: 1
XP: 0
Drop_Chance: 100.0
Drop_Level: 0
Drops_From:
Shake: true
Snowman_Pumpkin:
ID: 86
Mob: SNOWMAN
Data: 0
Amount: 1
XP: 0
Drop_Chance: 3.0
Drop_Level: 0
Drops_From:
Shake: true
Snowman_Snowball:
ID: 341
Mob: SNOWMAN
Data: 0
Amount: 2
XP: 0
Drop_Chance: 97.0
Drop_Level: 0
Drops_From:
Shake: true
Squid_Ink_Sack:
ID: 351
Mob: SQUID
Data: 0
Amount: 1
XP: 0
Drop_Chance: 100.0
Drop_Level: 0
Drops_From:
Shake: true
Witch_Heal_Potion:
ID: 373
Mob: WITCH
Potion_Type: INSTANT_HEAL
Data: 0
Amount: 1
XP: 0
Drop_Chance: 1.0
Drop_Level: 0
Drops_From:
Shake: true
Witch_Fire_Potion:
ID: 373
Mob: WITCH
Potion_Type: FIRE_RESISTANCE
Data: 0
Amount: 1
XP: 0
Drop_Chance: 1.0
Drop_Level: 0
Drops_From:
Shake: true
Witch_Speed_Potion:
ID: 373
Mob: WITCH
Potion_Type: SPEED
Data: 0
Amount: 1
XP: 0
Drop_Chance: 1.0
Drop_Level: 0
Drops_From:
Shake: true
Witch_Glass_Bottle:
ID: 374
Mob: WITCH
Data: 0
Amount: 1
XP: 0
Drop_Chance: 9.0
Drop_Level: 0
Drops_From:
Shake: true
Witch_Glowstone_Dust:
ID: 348
Mob: WITCH
Data: 0
Amount: 1
XP: 0
Drop_Chance: 13.0
Drop_Level: 0
Drops_From:
Shake: true
Witch_Sulphur:
ID: 289
Mob: WITCH
Data: 0
Amount: 1
XP: 0
Drop_Chance: 12.0
Drop_Level: 0
Drops_From:
Shake: true
Witch_Redstone:
ID: 331
Mob: WITCH
Data: 0
Amount: 1
XP: 0
Drop_Chance: 13.0
Drop_Level: 0
Drops_From:
Shake: true
Witch_Spider_Eye:
ID: 375
Mob: WITCH
Data: 0
Amount: 1
XP: 0
Drop_Chance: 12.0
Drop_Level: 0
Drops_From:
Shake: true
Witch_Stick:
ID: 380
Mob: WITCH
Data: 0
Amount: 1
XP: 0
Drop_Chance: 13.0
Drop_Level: 0
Drops_From:
Shake: true
Witch_Sugar:
ID: 353
Mob: WITCH
Data: 0
Amount: 1
XP: 0
Drop_Chance: 12.0
Drop_Level: 0
Drops_From:
Shake: true
Witch_Potion:
ID: 373
Mob: WITCH
Data: 0
Amount: 1
XP: 0
Drop_Chance: 13.0
Drop_Level: 0
Drops_From:
Shake: true
Zombie_Skull:
ID: 397
Mob: ZOMBIE
Data: 2
Amount: 1
XP: 0
Drop_Chance: 2.0
Drop_Level: 0
Drops_From:
Shake: true
Zombie_Rotten_Flesh:
ID: 367
Mob: ZOMBIE
Data: 0
Amount: 1
XP: 0
Drop_Chance: 98.0
Drop_Level: 0
Drops_From:
Shake: true