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

Compare commits

..

3 Commits

Author SHA1 Message Date
bm01
e41adf769b Created an Ability class to be consistent with Tool 2013-03-04 00:18:23 +01:00
bm01
e80f60ccee Fixed Tool objects being shared by all players 2013-03-04 00:01:53 +01:00
bm01
12b548bf46 Moved ability and tool stuff from McMMOPlayer to SkillManager classes
Warning: Because Woodcutting and Repair don't have a "proper" manager
class, this doesn't work yet.
2013-03-03 23:27:51 +01:00
95 changed files with 2205 additions and 2351 deletions

2
.gitattributes vendored
View File

@@ -1,4 +1,4 @@
* text=auto
* text
*.png binary
*.wav binary

82
.gitignore vendored
View File

@@ -1,42 +1,42 @@
# Eclipse stuff
/.classpath
/.project
/.settings
# netbeans
/nbproject
# we use maven!
/build.xml
# maven
/target
# vim
.*.sw[a-p]
# various other potential build files
/build
/bin
/dist
/manifest.mf
/world
# Mac filesystem dust
*.DS_Store
# intellij
*.iml
*.ipr
*.iws
.idea/
# Project Stuff
/src/main/resources/mcMMO
# Other Libraries
*.jar
# Atlassian Stuff
# Eclipse stuff
/.classpath
/.project
/.settings
# netbeans
/nbproject
# we use maven!
/build.xml
# maven
/target
# vim
.*.sw[a-p]
# various other potential build files
/build
/bin
/dist
/manifest.mf
/world
# Mac filesystem dust
*.DS_Store
# intellij
*.iml
*.ipr
*.iws
.idea/
# Project Stuff
/src/main/resources/mcMMO
# Other Libraries
*.jar
# Atlassian Stuff
/atlassian-ide-plugin.xml

View File

@@ -7,45 +7,7 @@ Key:
! Change
- Removal
Version 1.4.03
+ Added option to advanced.yml to determine the # of enchant levels used when buffing Super Breaker & Giga Drill Breaker
+ Improved stats display for child skills
+ Added cooldown between using Chimaera Wings
= Fixed bug with '/party chat (on|off)' and '/partychat (on|off)' not working
= Fixed bug with Repair not decreasing enchanting levels properly
= Fixed bug with Smelting not properly tracking furnaces
= Fixed bug with Blast Mining not dropping blocks correctly
= Fixed bug with custom blocks not working
= Fixed bug with Blast Mining increasing TNT damage.
= Fixed bug where Blast Mining was awarding too much XP
= Fixed bug where triple drops would award twice the amount of experience in Herbalism and Mining
= Fixed bug where Green Thumb would consume wheat instead of seeds
= Fixed bug where Green Terra would consume twice the amount of seed when used on crops
= Fixed bug where experience would be awarded in Herbalism for some player-placed blocks
= Fixed bug where players were unable to salvage leather armor
= Fixed bug with repairing using materials with byte metadata
= Fixed bug where Fishing was becoming less successful at higher levels
= Fixed bug with using Salvage on stacked items.
= Fixed bug where the 'mcmmo.commands.ptp.world.all' was registered twice
= Fixed bug where Beast Lore wouldn't work on friendly pets
= Fixed bug where Deflect was calculated based on the attacker, not the defender. (We really did this time!)
= Fixed bug where Treefeller would not deal durability damage when the axe "splinters into dozens of pieces"
! Moved the Salvage unlock level from config.yml to advanced.yml
! Changed how Chimaera Wings are acquired, you need to craft them now. (By default, use 5 feathers in a shapeless recipe)
! Changed how Chimaera Wings teleport players to the spawnpoint, will now check if the location is safe
- Removed option to disable Salvage via the config file. This should be handled via permissions instead.
- Removed the option to use Woodcutting without an axe from the config file.
Version 1.4.02
+ Added API to get the skill and power level caps.
= Fixed bug where Deflect was calculated based on the attacker, not the defender
= Fixed bug where some skills weren't registering as unlocked until one level later
= Fixed bug where the PTP cooldown was being read improperly
= Fixed bug where /ptp <accept|toggle|acceptall> where broken
= Fixed ClassCastException relating to counter-attack with Swords
= Fixed issue with some skill activations not activating enough or activating too much
Version 1.4.01
Version 1.4.01-dev
= Fixed bug where trying to use /mctop or /xplock with the Smelting child skill caused NPEs
= Fixed bug where /mctop and /mcrank wouldn't show overall power levels for servers using Flatfile
= Fixed bug where Smelting would throw consistent errors due to offline players
@@ -56,7 +18,6 @@ Version 1.4.01
= Fixed bug where ptp permissions weren't being handled properly
= Fixed bug where Beast Lore wouldn't work
= Fixed bug where Chimaera Wing would always teleport to spawn, even when the player had a valid bed spawn location
= Updated locale files
Version 1.4.00
+ Added new Child Skill - Smelting!

View File

@@ -2,7 +2,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>com.gmail.nossr50.mcMMO</groupId>
<artifactId>mcMMO</artifactId>
<version>1.4.03</version>
<version>1.4.01-dev1</version>
<name>mcMMO</name>
<url>https://github.com/mcMMO-Dev/mcMMO</url>
<issueManagement>

View File

@@ -1,14 +1,14 @@
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
<id>bin</id>
<includeBaseDirectory>false</includeBaseDirectory>
<formats>
<format>zip</format>
</formats>
<files>
<file>
<source>${project.build.directory}/${artifactId}.jar</source>
<outputDirectory>/</outputDirectory>
<destName>mcMMO.jar</destName>
</file>
</files>
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
<id>bin</id>
<includeBaseDirectory>false</includeBaseDirectory>
<formats>
<format>zip</format>
</formats>
<files>
<file>
<source>${project.build.directory}/${artifactId}.jar</source>
<outputDirectory>/</outputDirectory>
<destName>mcMMO.jar</destName>
</file>
</files>
</assembly>

View File

@@ -3,45 +3,46 @@ package com.gmail.nossr50.api;
import org.bukkit.entity.Player;
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.datatypes.skills.AbilityType;
import com.gmail.nossr50.datatypes.skills.SkillType;
import com.gmail.nossr50.skills.SkillManager;
import com.gmail.nossr50.util.player.UserManager;
public final class AbilityAPI {
private AbilityAPI() {}
public static boolean berserkEnabled(Player player) {
return UserManager.getPlayer(player).getAbilityMode(AbilityType.BERSERK);
return UserManager.getPlayer(player).getSkillManager(SkillType.UNARMED).getAbility().getMode();
}
public static boolean gigaDrillBreakerEnabled(Player player) {
return UserManager.getPlayer(player).getAbilityMode(AbilityType.GIGA_DRILL_BREAKER);
return UserManager.getPlayer(player).getSkillManager(SkillType.EXCAVATION).getAbility().getMode();
}
public static boolean greenTerraEnabled(Player player) {
return UserManager.getPlayer(player).getAbilityMode(AbilityType.GREEN_TERRA);
return UserManager.getPlayer(player).getSkillManager(SkillType.HERBALISM).getAbility().getMode();
}
public static boolean serratedStrikesEnabled(Player player) {
return UserManager.getPlayer(player).getAbilityMode(AbilityType.SERRATED_STRIKES);
return UserManager.getPlayer(player).getSkillManager(SkillType.SWORDS).getAbility().getMode();
}
public static boolean skullSplitterEnabled(Player player) {
return UserManager.getPlayer(player).getAbilityMode(AbilityType.SKULL_SPLITTER);
return UserManager.getPlayer(player).getSkillManager(SkillType.AXES).getAbility().getMode();
}
public static boolean superBreakerEnabled(Player player) {
return UserManager.getPlayer(player).getAbilityMode(AbilityType.SUPER_BREAKER);
return UserManager.getPlayer(player).getSkillManager(SkillType.MINING).getAbility().getMode();
}
public static boolean treeFellerEnabled(Player player) {
return UserManager.getPlayer(player).getAbilityMode(AbilityType.TREE_FELLER);
return UserManager.getPlayer(player).getSkillManager(SkillType.WOODCUTTING).getAbility().getMode();
}
public static boolean isAnyAbilityEnabled(Player player) {
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
for (AbilityType ability : AbilityType.values()) {
if (mcMMOPlayer.getAbilityMode(ability)) {
for (SkillManager skillManager : mcMMOPlayer.getSkillManagers().values()) {
if (skillManager.getAbility().getMode()) {
return true;
}
}

View File

@@ -237,29 +237,6 @@ public final class ExperienceAPI {
return UserManager.getPlayer(player).getPowerLevel();
}
/**
* Get the level cap of a specific skill.
* </br>
* This function is designed for API usage.
*
* @param skillType The skill to get the level cap for
* @return the level cap of a given skill
*/
public static int getLevelCap(String skillType) {
return Config.getInstance().getLevelCap(SkillType.getSkill(skillType));
}
/**
* Get the power level cap.
* </br>
* This function is designed for API usage.
*
* @return the power level cap of a given skill
*/
public static int getPowerLevelCap() {
return Config.getInstance().getPowerLevelCap();
}
/**
* Sets the level of a player in a specific skill type.
* </br>

View File

@@ -7,8 +7,6 @@ import org.bukkit.entity.Player;
import com.gmail.nossr50.chat.ChatMode;
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
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 {
@@ -23,8 +21,8 @@ public abstract class ChatCommand implements CommandExecutor {
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
switch (args.length) {
case 0:
if (CommandUtils.noConsoleUsage(sender)) {
return true;
if (!(sender instanceof Player)) {
return false;
}
mcMMOPlayer = UserManager.getPlayer((Player) sender);
@@ -40,23 +38,19 @@ public abstract class ChatCommand implements CommandExecutor {
case 1:
if (args[0].equalsIgnoreCase("on")) {
if (CommandUtils.noConsoleUsage(sender)) {
return true;
if (!(sender instanceof Player)) {
return false;
}
mcMMOPlayer = UserManager.getPlayer((Player) sender);
enableChatMode(sender);
return true;
}
if (args[0].equalsIgnoreCase("off")) {
if (CommandUtils.noConsoleUsage(sender)) {
return true;
if (!(sender instanceof Player)) {
return false;
}
mcMMOPlayer = UserManager.getPlayer((Player) sender);
disableChatMode(sender);
return true;
}
@@ -84,21 +78,11 @@ public abstract class ChatCommand implements CommandExecutor {
protected abstract void handleChatSending(CommandSender sender, String[] args);
private void enableChatMode(CommandSender sender) {
if (chatMode == ChatMode.PARTY && mcMMOPlayer.getParty() == null) {
sender.sendMessage(LocaleLoader.getString("Commands.Party.None"));
return;
}
chatMode.enable(mcMMOPlayer);
sender.sendMessage(chatMode.getEnabledMessage());
}
private void disableChatMode(CommandSender sender) {
if (chatMode == ChatMode.PARTY && mcMMOPlayer.getParty() == null) {
sender.sendMessage(LocaleLoader.getString("Commands.Party.None"));
return;
}
chatMode.disable(mcMMOPlayer);
sender.sendMessage(chatMode.getDisabledMessage());
}

View File

@@ -5,7 +5,7 @@ import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.commands.chat.PartyChatCommand;
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.locale.LocaleLoader;
import com.gmail.nossr50.util.Permissions;
@@ -31,8 +31,8 @@ public class PartyCommand implements CommandExecutor {
private CommandExecutor partyRenameCommand = new PartyRenameCommand();
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 partyTeleportCommand = new PtpCommand();
private CommandExecutor partyChatCommand = new PartyChatCommand();
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
@@ -104,7 +104,7 @@ public class PartyCommand implements CommandExecutor {
}
// Party leader commands
if (!mcMMOPlayer.getParty().getLeader().equalsIgnoreCase(player.getName())) {
if (!mcMMOPlayer.getParty().getLeader().equals(player.getName())) {
sender.sendMessage(LocaleLoader.getString("Party.NotOwner"));
return true;
}

View File

@@ -35,7 +35,7 @@ public class PartyInfoCommand implements CommandExecutor {
StringBuilder memberList = new StringBuilder();
for (OfflinePlayer member : playerParty.getMembers()) {
if (playerParty.getLeader().equalsIgnoreCase(member.getName())) {
if (playerParty.getLeader().equals(member.getName())) {
memberList.append(ChatColor.GOLD).append(member.getName()).append(" ");
}
else if (member.isOnline()) {
@@ -97,6 +97,6 @@ public class PartyInfoCommand implements CommandExecutor {
player.sendMessage(LocaleLoader.getString("Commands.Party.Members.Header"));
player.sendMessage(LocaleLoader.getString("Commands.Party.MembersNear", membersNear, membersOnline));
player.sendMessage(createMembersList());
player.sendMessage(LocaleLoader.getString("Commands.Party.Members", createMembersList()));
}
}

View File

@@ -40,7 +40,7 @@ public class PartyRenameCommand implements CommandExecutor {
return true;
}
if (!member.getName().equalsIgnoreCase(leaderName)) {
if (!member.getName().equals(leaderName)) {
member.sendMessage(LocaleLoader.getString("Party.InformedOnNameChange", leaderName, newPartyName));
}
}

View File

@@ -32,9 +32,6 @@ public class PtpCommand implements CommandExecutor {
switch (args.length) {
case 1:
player = (Player) sender;
mcMMOPlayer = UserManager.getPlayer(player);
if (args[0].equalsIgnoreCase("toggle")) {
if (!Permissions.partyTeleportToggle(sender)) {
sender.sendMessage(command.getPermissionMessage());
@@ -53,10 +50,11 @@ public class PtpCommand implements CommandExecutor {
return acceptAnyTeleportRequest();
}
player = (Player) sender;
int ptpCooldown = Config.getInstance().getPTPCommandCooldown();
long recentlyHurt = UserManager.getPlayer(player).getRecentlyHurt();
long recentlyHurt = UserManager.getPlayer(player).getRecentlyHurt() * Misc.TIME_CONVERSION_FACTOR;
if ((recentlyHurt * Misc.TIME_CONVERSION_FACTOR + ptpCooldown * Misc.TIME_CONVERSION_FACTOR) > System.currentTimeMillis()) {
if (System.currentTimeMillis() - recentlyHurt >= (ptpCooldown * Misc.TIME_CONVERSION_FACTOR)) {
player.sendMessage(LocaleLoader.getString("Party.Teleport.Hurt", ptpCooldown));
return true;
}
@@ -112,9 +110,9 @@ public class PtpCommand implements CommandExecutor {
}
target = mcMMOPlayer.getPtpRequest();
mcMMOPlayer.removePtpRequest();
if (!canTeleport(target.getName())) {
mcMMOPlayer.removePtpRequest();
return true;
}

View File

@@ -1,5 +1,6 @@
package com.gmail.nossr50.commands.player;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
@@ -23,15 +24,15 @@ public class McrankCommand implements CommandExecutor {
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
switch (args.length) {
case 0:
if (!(sender instanceof Player)) {
return false;
}
if (!Permissions.mcrank(sender)) {
sender.sendMessage(command.getPermissionMessage());
return true;
}
if (!(sender instanceof Player)) {
return false;
}
if (Config.getInstance().getUseMySQL()) {
sqlDisplay(sender, sender.getName());
}
@@ -94,7 +95,7 @@ public class McrankCommand implements CommandExecutor {
for (SkillType skillType : SkillType.values()) {
int[] rankInts = LeaderboardManager.getPlayerRank(playerName, skillType);
if ((sender instanceof Player && !Permissions.skillEnabled(sender, skillType)) || skillType.isChildSkill()) {
if (skillType.isChildSkill()) {
continue;
}
@@ -118,6 +119,6 @@ public class McrankCommand implements CommandExecutor {
}
private void sqlDisplay(CommandSender sender, String playerName) {
mcMMO.p.getServer().getScheduler().runTaskAsynchronously(mcMMO.p, new McrankCommandAsyncTask(playerName, sender));
Bukkit.getScheduler().runTaskAsynchronously(mcMMO.p, new McrankCommandAsyncTask(playerName, sender));
}
}

View File

@@ -1,5 +1,6 @@
package com.gmail.nossr50.commands.player;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
@@ -72,25 +73,25 @@ public class MctopCommand implements CommandExecutor {
}
private void display(int page, String skill, CommandSender sender, boolean sql, Command command) {
if (sql) {
if (skill.equalsIgnoreCase("all")) {
sqlDisplay(page, "taming+mining+woodcutting+repair+unarmed+herbalism+excavation+archery+swords+axes+acrobatics+fishing", sender, command);
}
else {
sqlDisplay(page, skill, sender, command);
}
}
else {
flatfileDisplay(page, skill, sender, command);
}
}
private void flatfileDisplay(int page, String skill, CommandSender sender, Command command) {
if (!skill.equalsIgnoreCase("all") && !Permissions.mctop(sender, SkillType.getSkill(skill))) {
sender.sendMessage(command.getPermissionMessage());
return;
}
if (sql) {
if (skill.equalsIgnoreCase("all")) {
sqlDisplay(page, "taming+mining+woodcutting+repair+unarmed+herbalism+excavation+archery+swords+axes+acrobatics+fishing", sender);
}
else {
sqlDisplay(page, skill, sender);
}
}
else {
flatfileDisplay(page, skill, sender);
}
}
private void flatfileDisplay(int page, String skill, CommandSender sender) {
LeaderboardManager.updateLeaderboards(); // Make sure we have the latest information
String[] info = LeaderboardManager.retrieveInfo(skill, page);
@@ -122,7 +123,7 @@ public class MctopCommand implements CommandExecutor {
sender.sendMessage(LocaleLoader.getString("Commands.mctop.Tip"));
}
private void sqlDisplay(int page, String query, CommandSender sender) {
mcMMO.p.getServer().getScheduler().runTaskAsynchronously(mcMMO.p, new MctopCommandAsyncTask(page, query, sender));
private void sqlDisplay(int page, String query, CommandSender sender, Command command) {
Bukkit.getScheduler().runTaskAsynchronously(mcMMO.p, new MctopCommandAsyncTask(page, query, sender, command));
}
}

View File

@@ -7,8 +7,8 @@ import com.gmail.nossr50.datatypes.skills.SkillType;
import com.gmail.nossr50.locale.LocaleLoader;
import com.gmail.nossr50.skills.repair.Repair;
import com.gmail.nossr50.skills.repair.Repairable;
import com.gmail.nossr50.skills.repair.Salvage;
import com.gmail.nossr50.util.Permissions;
import com.gmail.nossr50.util.player.UserManager;
public class RepairCommand extends SkillCommand {
private int arcaneForgingRank;
@@ -41,10 +41,10 @@ public class RepairCommand extends SkillCommand {
@Override
protected void dataCalculations() {
// We're using pickaxes here, not the best but it works
Repairable diamondRepairable = mcMMO.repairableManager.getRepairable(Material.DIAMOND_PICKAXE.getId());
Repairable goldRepairable = mcMMO.repairableManager.getRepairable(Material.GOLD_PICKAXE.getId());
Repairable ironRepairable = mcMMO.repairableManager.getRepairable(Material.IRON_PICKAXE.getId());
Repairable stoneRepairable = mcMMO.repairableManager.getRepairable(Material.STONE_PICKAXE.getId());
Repairable diamondRepairable = mcMMO.repairManager.getRepairable(Material.DIAMOND_PICKAXE.getId());
Repairable goldRepairable = mcMMO.repairManager.getRepairable(Material.GOLD_PICKAXE.getId());
Repairable ironRepairable = mcMMO.repairManager.getRepairable(Material.IRON_PICKAXE.getId());
Repairable stoneRepairable = mcMMO.repairManager.getRepairable(Material.STONE_PICKAXE.getId());
// TODO: This isn't really accurate - if they don't have pickaxes loaded it doesn't always mean the repair level is 0
diamondLevel = (diamondRepairable == null) ? 0 : diamondRepairable.getMinimumLevel();
@@ -66,7 +66,7 @@ public class RepairCommand extends SkillCommand {
superRepairChanceLucky = superRepairStrings[1];
// ARCANE FORGING
arcaneForgingRank = UserManager.getPlayer(player).getRepairManager().getArcaneForgingRank();
arcaneForgingRank = Repair.getArcaneForgingRank(profile);
}
@Override
@@ -122,8 +122,8 @@ public class RepairCommand extends SkillCommand {
player.sendMessage(LocaleLoader.getString("Effects.Template", LocaleLoader.getString("Repair.Effect.6", diamondLevel), LocaleLoader.getString("Repair.Effect.7")));
}
if (canSalvage && Repair.salvageUnlockLevel > 0) {
player.sendMessage(LocaleLoader.getString("Effects.Template", LocaleLoader.getString("Repair.Effect.16", Repair.salvageUnlockLevel), LocaleLoader.getString("Repair.Effect.17")));
if (canSalvage && Salvage.salvageUnlockLevel > 0) {
player.sendMessage(LocaleLoader.getString("Effects.Template", LocaleLoader.getString("Repair.Effect.16", Salvage.salvageUnlockLevel), LocaleLoader.getString("Repair.Effect.17")));
}
if (canArcaneForge) {
@@ -155,11 +155,11 @@ public class RepairCommand extends SkillCommand {
player.sendMessage(LocaleLoader.getString("Repair.Arcane.Rank", arcaneForgingRank));
if (Repair.arcaneForgingEnchantLoss) {
player.sendMessage(LocaleLoader.getString("Repair.Arcane.Chance.Success", (arcaneBypass ? 100 : UserManager.getPlayer(player).getRepairManager().getKeepEnchantChance())));
player.sendMessage(LocaleLoader.getString("Repair.Arcane.Chance.Success", (arcaneBypass ? 100 : Repair.getEnchantChance(arcaneForgingRank))));
}
if (Repair.arcaneForgingDowngrades) {
player.sendMessage(LocaleLoader.getString("Repair.Arcane.Chance.Downgrade", (arcaneBypass ? 0 : UserManager.getPlayer(player).getRepairManager().getDowngradeEnchantChance())));
player.sendMessage(LocaleLoader.getString("Repair.Arcane.Chance.Downgrade", (arcaneBypass ? 0 : Repair.getDowngradeChance(arcaneForgingRank))));
}
}
}

View File

@@ -1,7 +1,6 @@
package com.gmail.nossr50.commands.skills;
import java.text.DecimalFormat;
import java.util.Set;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
@@ -12,7 +11,6 @@ import com.gmail.nossr50.config.AdvancedConfig;
import com.gmail.nossr50.datatypes.player.PlayerProfile;
import com.gmail.nossr50.datatypes.skills.SkillType;
import com.gmail.nossr50.locale.LocaleLoader;
import com.gmail.nossr50.skills.child.FamilyTree;
import com.gmail.nossr50.util.Permissions;
import com.gmail.nossr50.util.StringUtils;
import com.gmail.nossr50.util.commands.CommandUtils;
@@ -59,23 +57,12 @@ public abstract class SkillCommand implements CommandExecutor {
dataCalculations();
permissionsCheck();
player.sendMessage(LocaleLoader.getString("Skills.Header", LocaleLoader.getString(skillString + ".SkillName")));
if (!skill.isChildSkill()) {
player.sendMessage(LocaleLoader.getString("Skills.Header", SkillUtils.getSkillName(skill)));
player.sendMessage(LocaleLoader.getString("Commands.XPGain", LocaleLoader.getString("Commands.XPGain." + skillString)));
player.sendMessage(LocaleLoader.getString("Effects.Level", profile.getSkillLevel(skill), profile.getSkillXpLevel(skill), profile.getXpToLevel(skill)));
}
else {
player.sendMessage(LocaleLoader.getString("Skills.Header", SkillUtils.getSkillName(skill) + " " + LocaleLoader.getString("Skills.Child")));
player.sendMessage(LocaleLoader.getString("Commands.XPGain", LocaleLoader.getString("Commands.XPGain.Child")));
player.sendMessage(LocaleLoader.getString("Effects.Child", profile.getSkillLevel(skill)));
player.sendMessage(LocaleLoader.getString("Skills.Header", LocaleLoader.getString("Skills.Parents")));
Set<SkillType> parents = FamilyTree.getParents(skill);
for (SkillType parent : parents) {
player.sendMessage(SkillUtils.getSkillName(parent) + " - " + LocaleLoader.getString("Effects.Level", profile.getSkillLevel(parent), profile.getSkillXpLevel(parent), profile.getXpToLevel(parent)));
}
}
if (effectsHeaderPermissions()) {
player.sendMessage(LocaleLoader.getString("Skills.Header", LocaleLoader.getString("Effects.Effects")));
@@ -138,7 +125,7 @@ public abstract class SkillCommand implements CommandExecutor {
}
protected String[] calculateLengthDisplayValues() {
int maxLength = skill.getAbility().getMaxTicks();
int maxLength = skill.getAbilityType().getMaxTicks();
int length = 2 + (int) (skillValue / AdvancedConfig.getInstance().getAbilityLength());
int enduranceLength = PerksUtils.handleActivationPerks(player, length, maxLength);

View File

@@ -20,7 +20,6 @@ public class AdvancedConfig extends AutoUpdateConfigLoader {
/* GENERAL */
public int getAbilityLength() { return config.getInt("Skills.General.Ability_IncreaseLevel", 50); }
public int getEnchantBuff() { return config.getInt("Skills.General.Ability_EnchantBuff", 5); }
/* ACROBATICS */
public double getDodgeChanceMax() { return config.getDouble("Skills.Acrobatics.Dodge_ChanceMax", 20.0D); }
@@ -179,7 +178,6 @@ public class AdvancedConfig extends AutoUpdateConfigLoader {
public int getRepairMasteryMaxLevel() { return config.getInt("Skills.Repair.RepairMastery_MaxBonusLevel", 1000); }
public double getSuperRepairChanceMax() { return config.getDouble("Skills.Repair.SuperRepair_ChanceMax", 100.0D); }
public int getSuperRepairMaxLevel() { return config.getInt("Skills.Repair.SuperRepair_MaxBonusLevel", 1000); }
public int getSalvageUnlockLevel() { return config.getInt("Skills.Repair.Salvage_UnlockLevel", 600); }
/* Arcane Forging */
public boolean getArcaneForgingDowngradeEnabled() { return config.getBoolean("Skills.Repair.Arcane_Forging.Downgrades.Enabled", true); }

View File

@@ -101,12 +101,9 @@ public class Config extends AutoUpdateConfigLoader {
public boolean getEntityModsEnabled() { return config.getBoolean("Mods.Entity_Mods_Enabled", false); }
/* Items */
public int getChimaeraUseCost() { return config.getInt("Items.Chimaera_Wing.Use_Cost", 1); }
public int getChimaeraRecipeCost() { return config.getInt("Items.Chimaera_Wing.Recipe_Cost", 5); }
public int getChimaeraCost() { return config.getInt("Items.Chimaera_Wing.Feather_Cost", 10); }
public int getChimaeraItemId() { return config.getInt("Items.Chimaera_Wing.Item_ID", 288); }
public boolean getChimaeraEnabled() { return config.getBoolean("Items.Chimaera_Wing.Enabled", true); }
public boolean getChimaeraPreventUseUnderground() { return config.getBoolean("Items.Chimaera_Wing.Prevent_Use_Underground", true); }
public int getChimaeraCooldown() { return config.getInt("Items.Chimaera_Wing.Cooldown", 240); }
/* Particles */
public boolean getAbilityActivationEffectEnabled() { return config.getBoolean("Particles.Ability_Activation", true); }
@@ -186,7 +183,9 @@ public class Config extends AutoUpdateConfigLoader {
/* Repair */
public boolean getRepairAnvilMessagesEnabled() { return config.getBoolean("Skills.Repair.Anvil_Messages", true); }
public int getRepairAnvilId() { return config.getInt("Skills.Repair.Anvil_ID", 42); }
public boolean getSalvageEnabled() { return config.getBoolean("Skills.Repair.Salvage_enabled", true); }
public int getSalvageAnvilId() { return config.getInt("Skills.Repair.Salvage_Anvil_ID", 41); }
public int getSalvageUnlockLevel() { return config.getInt("Skills.Repair.Salvage_UnlockLevel", 600); }
public boolean getSalvageTools() { return config.getBoolean("Skills.Repair.Salvage_tools", true); }
public boolean getSalvageArmor() { return config.getBoolean("Skills.Repair.Salvage_armor", true); }
@@ -200,6 +199,8 @@ public class Config extends AutoUpdateConfigLoader {
public int getTamingCOTWOcelotCost() { return config.getInt("Skills.Taming.Call_Of_The_Wild.Fish_Required", 10); }
/* Woodcutting */
public boolean getWoodcuttingRequiresTool() { return config.getBoolean("Skills.Woodcutting.Requires_Axe", true); }
public int getWoodcuttingXPOak() { return config.getInt("Experience.Woodcutting.Oak", 70); }
public int getWoodcuttingXPBirch() { return config.getInt("Experience.Woodcutting.Birch", 90); }
public int getWoodcuttingXPSpruce() { return config.getInt("Experience.Woodcutting.Spruce", 80); }

View File

@@ -52,11 +52,6 @@ public class TreasureConfig extends ConfigLoader {
protected void loadKeys() {
Map<String, Treasure> treasures = new HashMap<String, Treasure>();
ConfigurationSection treasureSection = config.getConfigurationSection("Treasures");
if (treasureSection == null) {
return;
}
Set<String> treasureConfigSet = treasureSection.getKeys(false);
for (String treasureName : treasureConfigSet) {
@@ -216,14 +211,14 @@ public class TreasureConfig extends ConfigLoader {
Treasure treasure = nextEntry.getValue();
if (treasure instanceof FishingTreasure) {
if (fishingTreasures == null || !fishingTreasures.contains(treasureKey)) {
if (!fishingTreasures.contains(treasureKey)) {
continue;
}
fishingRewards.add((FishingTreasure) treasure);
}
else if (treasure instanceof HylianTreasure) {
if (hylianTreasures == null || !hylianTreasures.contains(treasureKey)) {
if (!hylianTreasures.contains(treasureKey)) {
continue;
}
@@ -242,7 +237,7 @@ public class TreasureConfig extends ConfigLoader {
}
}
else if (treasure instanceof ExcavationTreasure) {
if (excavationTreasures == null || !excavationTreasures.contains(treasureKey)) {
if (!excavationTreasures.contains(treasureKey)) {
continue;
}

View File

@@ -60,79 +60,79 @@ public final class LeaderboardManager {
ArrayList<String> players = new ArrayList<String>();
while ((line = in.readLine()) != null) {
String[] data = line.split(":");
String[] character = line.split(":");
String playerName = data[0];
String p = character[0];
int powerLevel = 0;
// Prevent the same player from being added multiple times (I'd like to note that this shouldn't happen...)
if (players.contains(playerName)) {
if (players.contains(p)) {
continue;
}
players.add(playerName);
players.add(p);
if (data.length > 1 && StringUtils.isInt(data[1])) {
mining.add(new PlayerStat(playerName, Integer.parseInt(data[1])));
powerLevel += Integer.parseInt(data[1]);
if (character.length > 1 && StringUtils.isInt(character[1])) {
mining.add(new PlayerStat(p, Integer.parseInt(character[1])));
powerLevel += Integer.parseInt(character[1]);
}
if (data.length > 5 && StringUtils.isInt(data[5])) {
woodcutting.add(new PlayerStat(playerName, Integer.parseInt(data[5])));
powerLevel += Integer.parseInt(data[5]);
if (character.length > 5 && StringUtils.isInt(character[5])) {
woodcutting.add(new PlayerStat(p, Integer.parseInt(character[5])));
powerLevel += Integer.parseInt(character[5]);
}
if (data.length > 7 && StringUtils.isInt(data[7])) {
repair.add(new PlayerStat(playerName, Integer.parseInt(data[7])));
powerLevel += Integer.parseInt(data[7]);
if (character.length > 7 && StringUtils.isInt(character[7])) {
repair.add(new PlayerStat(p, Integer.parseInt(character[7])));
powerLevel += Integer.parseInt(character[7]);
}
if (data.length > 8 && StringUtils.isInt(data[8])) {
unarmed.add(new PlayerStat(playerName, Integer.parseInt(data[8])));
powerLevel += Integer.parseInt(data[8]);
if (character.length > 8 && StringUtils.isInt(character[8])) {
unarmed.add(new PlayerStat(p, Integer.parseInt(character[8])));
powerLevel += Integer.parseInt(character[8]);
}
if (data.length > 9 && StringUtils.isInt(data[9])) {
herbalism.add(new PlayerStat(playerName, Integer.parseInt(data[9])));
powerLevel += Integer.parseInt(data[9]);
if (character.length > 9 && StringUtils.isInt(character[9])) {
herbalism.add(new PlayerStat(p, Integer.parseInt(character[9])));
powerLevel += Integer.parseInt(character[9]);
}
if (data.length > 10 && StringUtils.isInt(data[10])) {
excavation.add(new PlayerStat(playerName, Integer.parseInt(data[10])));
powerLevel += Integer.parseInt(data[10]);
if (character.length > 10 && StringUtils.isInt(character[10])) {
excavation.add(new PlayerStat(p, Integer.parseInt(character[10])));
powerLevel += Integer.parseInt(character[10]);
}
if (data.length > 11 && StringUtils.isInt(data[11])) {
archery.add(new PlayerStat(playerName, Integer.parseInt(data[11])));
powerLevel += Integer.parseInt(data[11]);
if (character.length > 11 && StringUtils.isInt(character[11])) {
archery.add(new PlayerStat(p, Integer.parseInt(character[11])));
powerLevel += Integer.parseInt(character[11]);
}
if (data.length > 12 && StringUtils.isInt(data[12])) {
swords.add(new PlayerStat(playerName, Integer.parseInt(data[12])));
powerLevel += Integer.parseInt(data[12]);
if (character.length > 12 && StringUtils.isInt(character[12])) {
swords.add(new PlayerStat(p, Integer.parseInt(character[12])));
powerLevel += Integer.parseInt(character[12]);
}
if (data.length > 13 && StringUtils.isInt(data[13])) {
axes.add(new PlayerStat(playerName, Integer.parseInt(data[13])));
powerLevel += Integer.parseInt(data[13]);
if (character.length > 13 && StringUtils.isInt(character[13])) {
axes.add(new PlayerStat(p, Integer.parseInt(character[13])));
powerLevel += Integer.parseInt(character[13]);
}
if (data.length > 14 && StringUtils.isInt(data[14])) {
acrobatics.add(new PlayerStat(playerName, Integer.parseInt(data[14])));
powerLevel += Integer.parseInt(data[14]);
if (character.length > 14 && StringUtils.isInt(character[14])) {
acrobatics.add(new PlayerStat(p, Integer.parseInt(character[14])));
powerLevel += Integer.parseInt(character[14]);
}
if (data.length > 24 && StringUtils.isInt(data[24])) {
taming.add(new PlayerStat(playerName, Integer.parseInt(data[24])));
powerLevel += Integer.parseInt(data[24]);
if (character.length > 24 && StringUtils.isInt(character[24])) {
taming.add(new PlayerStat(p, Integer.parseInt(character[24])));
powerLevel += Integer.parseInt(character[24]);
}
if (data.length > 34 && StringUtils.isInt(data[34])) {
fishing.add(new PlayerStat(playerName, Integer.parseInt(data[34])));
powerLevel += Integer.parseInt(data[34]);
if (character.length > 34 && StringUtils.isInt(character[34])) {
fishing.add(new PlayerStat(p, Integer.parseInt(character[34])));
powerLevel += Integer.parseInt(character[34]);
}
powerLevels.add(new PlayerStat(playerName, powerLevel));
powerLevels.add(new PlayerStat(p, powerLevel));
}
in.close();
}
@@ -188,22 +188,72 @@ public final class LeaderboardManager {
statsList = playerStatHash.get(SkillType.getSkill(skillType));
}
int destination = (pageNumber - 1) * 10;
int destination;
for (int i = 0; i < 10; i++) {
PlayerStat ps = statsList.get(destination + i);
info[i] = ps.name + ":" + ps.statVal;
// How many lines to skip through
if (pageNumber == 1) {
destination = 0;
}
else {
destination = (pageNumber * 10) - 9;
}
int currentPos = 0;
for (PlayerStat ps : statsList) {
if (currentPos == 10) {
break;
}
if (destination > 1) {
destination--;
continue;
}
info[currentPos] = ps.name + ":" + ps.statVal;
currentPos++;
}
return info;
}
public static int[] getPlayerRank(String playerName) {
return getPlayerRank(playerName, powerLevels);
int currentPos = 1;
if (powerLevels != null) {
for (PlayerStat stat : powerLevels) {
if (stat.name.equalsIgnoreCase(playerName)) {
return new int[] {currentPos, stat.statVal};
}
currentPos++;
continue;
}
return new int[] {0, 0};
}
return new int[] {0, 0};
}
public static int[] getPlayerRank(String playerName, SkillType skillType) {
return getPlayerRank(playerName, playerStatHash.get(skillType));
int currentPos = 1;
List<PlayerStat> statsList = playerStatHash.get(skillType);
if (statsList != null) {
for (PlayerStat stat : statsList) {
if (stat.name.equalsIgnoreCase(playerName)) {
return new int[] {currentPos, stat.statVal};
}
currentPos++;
continue;
}
return new int[] {0, 0};
}
return new int[] {0, 0};
}
public static boolean removeFlatFileUser(String playerName) {
@@ -265,9 +315,8 @@ public final class LeaderboardManager {
mcMMO.p.getLogger().info("Purging powerless users...");
int purgedUsers = 0;
for (PlayerStat stat : powerLevels) {
if (stat.statVal == 0 && !mcMMO.p.getServer().getOfflinePlayer(stat.name).isOnline() && removeFlatFileUser(stat.name)) {
if (stat.statVal == 0 && removeFlatFileUser(stat.name) && !mcMMO.p.getServer().getOfflinePlayer(stat.name).isOnline()) {
purgedUsers++;
}
}
@@ -345,24 +394,6 @@ public final class LeaderboardManager {
return removedPlayers;
}
private static int[] getPlayerRank(String playerName, List<PlayerStat> statsList) {
int currentPos = 1;
if (statsList == null) {
return new int[] {0, 0};
}
for (PlayerStat stat : statsList) {
if (stat.name.equalsIgnoreCase(playerName)) {
return new int[] {currentPos, stat.statVal};
}
currentPos++;
}
return new int[] {0, 0};
}
private static class SkillComparator implements Comparator<PlayerStat> {
@Override
public int compare(PlayerStat o1, PlayerStat o2) {

View File

@@ -12,8 +12,8 @@ import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.config.Config;
import com.gmail.nossr50.datatypes.mods.CustomTool;
import com.gmail.nossr50.datatypes.party.Party;
import com.gmail.nossr50.datatypes.skills.AbilityType;
import com.gmail.nossr50.datatypes.skills.SkillType;
import com.gmail.nossr50.datatypes.skills.Tool;
import com.gmail.nossr50.datatypes.skills.ToolType;
import com.gmail.nossr50.datatypes.spout.huds.McMMOHud;
import com.gmail.nossr50.events.experience.McMMOPlayerXpGainEvent;
@@ -28,13 +28,10 @@ import com.gmail.nossr50.skills.excavation.ExcavationManager;
import com.gmail.nossr50.skills.fishing.FishingManager;
import com.gmail.nossr50.skills.herbalism.HerbalismManager;
import com.gmail.nossr50.skills.mining.MiningManager;
import com.gmail.nossr50.skills.repair.Repair;
import com.gmail.nossr50.skills.repair.RepairManager;
import com.gmail.nossr50.skills.smelting.SmeltingManager;
import com.gmail.nossr50.skills.swords.SwordsManager;
import com.gmail.nossr50.skills.taming.TamingManager;
import com.gmail.nossr50.skills.unarmed.UnarmedManager;
import com.gmail.nossr50.skills.woodcutting.WoodcuttingManager;
import com.gmail.nossr50.util.Misc;
import com.gmail.nossr50.util.ModUtils;
import com.gmail.nossr50.util.Permissions;
@@ -68,18 +65,11 @@ public class McMMOPlayer {
private boolean displaySkillNotifications = true;
private boolean abilityUse = true;
private boolean placedRepairAnvil;
private boolean placedAnvil;
private boolean placedSalvageAnvil;
private boolean godMode;
private Map<AbilityType, Boolean> abilityMode = new HashMap<AbilityType, Boolean>();
private Map<AbilityType, Boolean> abilityInformed = new HashMap<AbilityType, Boolean>();
private Map<ToolType, Boolean> toolMode = new HashMap<ToolType, Boolean>();
private Map<ToolType, Integer> toolATS = new HashMap<ToolType, Integer>();
private int recentlyHurt;
private int chimaeraWing;
private int respawnATS;
public McMMOPlayer(Player player) {
@@ -89,6 +79,19 @@ public class McMMOPlayer {
profile = new PlayerProfile(playerName, true);
party = PartyManager.getPlayerParty(playerName);
Map<ToolType, Tool> tools = new HashMap<ToolType, Tool>();
// Build Tool objects for the current player, a tool can be used by multiple skills
for (SkillType skillType : SkillType.values()) {
ToolType toolType = skillType.getToolType();
if (tools.containsKey(toolType)) {
continue;
}
tools.put(toolType, new Tool());
}
/*
* I'm using this method because it makes code shorter and safer (we don't have to add all SkillTypes manually),
* but I actually have no idea about the performance impact, if there is any.
@@ -96,23 +99,21 @@ public class McMMOPlayer {
*/
try {
for (SkillType skillType : SkillType.values()) {
skillManagers.put(skillType, skillType.getManagerClass().getConstructor(McMMOPlayer.class).newInstance(this));
Class<? extends SkillManager> skillManagerClass = skillType.getManagerClass();
// TODO: The null check is needed only because currently some SkillType doesn't have a valid skillManagerClass
if (skillManagerClass != null) {
SkillManager skillManager = skillManagerClass.getConstructor(McMMOPlayer.class).newInstance(this);
skillManager.setTool(tools.get(skillType.getToolType()));
skillManagers.put(skillType, skillManagerClass.getConstructor(McMMOPlayer.class).newInstance(this));
}
}
}
catch (Exception e) {
e.printStackTrace();
mcMMO.p.getPluginLoader().disablePlugin(mcMMO.p);
}
for (AbilityType abilityType : AbilityType.values()) {
abilityMode.put(abilityType, false);
abilityInformed.put(abilityType, true); // This is intended
}
for (ToolType toolType : ToolType.values()) {
toolMode.put(toolType, false);
toolATS.put(toolType, 0);
}
}
public AcrobaticsManager getAcrobaticsManager() {
@@ -143,10 +144,6 @@ public class McMMOPlayer {
return (MiningManager) skillManagers.get(SkillType.MINING);
}
public RepairManager getRepairManager() {
return (RepairManager) skillManagers.get(SkillType.REPAIR);
}
public SmeltingManager getSmeltingManager() {
return (SmeltingManager) skillManagers.get(SkillType.SMELTING);
}
@@ -163,8 +160,12 @@ public class McMMOPlayer {
return (UnarmedManager) skillManagers.get(SkillType.UNARMED);
}
public WoodcuttingManager getWoodcuttingManager() {
return (WoodcuttingManager) skillManagers.get(SkillType.WOODCUTTING);
public SkillManager getSkillManager(SkillType skillType) {
return skillManagers.get(skillType);
}
public Map<SkillType, SkillManager> getSkillManagers() {
return skillManagers;
}
/*
@@ -175,61 +176,11 @@ public class McMMOPlayer {
* Reset the mode of all abilities.
*/
public void resetAbilityMode() {
for (AbilityType ability : AbilityType.values()) {
setAbilityMode(ability, false);
for (SkillManager skillManager : skillManagers.values()) {
skillManager.getAbility().setMode(false);
}
}
/**
* Get the mode of an ability.
*
* @param ability The ability to check
* @return true if the ability is enabled, false otherwise
*/
public boolean getAbilityMode(AbilityType ability) {
return abilityMode.get(ability);
}
/**
* Set the mode of an ability.
*
* @param ability The ability to check
* @param bool True if the ability is active, false otherwise
*/
public void setAbilityMode(AbilityType ability, boolean bool) {
abilityMode.put(ability, bool);
}
/**
* Get the informed state of an ability
*
* @param ability The ability to check
* @return true if the ability is informed, false otherwise
*/
public boolean getAbilityInformed(AbilityType ability) {
return abilityInformed.get(ability);
}
/**
* Set the informed state of an ability.
*
* @param ability The ability to check
* @param bool True if the ability is informed, false otherwise
*/
public void setAbilityInformed(AbilityType ability, boolean bool) {
abilityInformed.put(ability, bool);
}
/**
* Get the current prep mode of a tool.
*
* @param tool Tool to get the mode for
* @return true if the tool is prepped, false otherwise
*/
public boolean getToolPreparationMode(ToolType tool) {
return toolMode.get(tool);
}
public boolean getAbilityUse() {
return abilityUse;
}
@@ -246,43 +197,11 @@ public class McMMOPlayer {
* Reset the prep modes of all tools.
*/
public void resetToolPrepMode() {
for (ToolType tool : ToolType.values()) {
setToolPreparationMode(tool, false);
for (SkillManager skillManager : skillManagers.values()) {
skillManager.getTool().setPreparationMode(false);
}
}
/**
* Set the current prep mode of a tool.
*
* @param tool Tool to set the mode for
* @param bool true if the tool should be prepped, false otherwise
*/
public void setToolPreparationMode(ToolType tool, boolean bool) {
toolMode.put(tool, bool);
}
/**
* Get the current prep ATS of a tool.
*
* @param tool Tool to get the ATS for
* @return the ATS for the tool
*/
public long getToolPreparationATS(ToolType tool) {
return toolATS.get(tool);
}
/**
* Set the current prep ATS of a tool.
*
* @param tool Tool to set the ATS for
* @param ATS the ATS of the tool
*/
public void setToolPreparationATS(ToolType tool, long ATS) {
int startTime = (int) (ATS / Misc.TIME_CONVERSION_FACTOR);
toolATS.put(tool, startTime);
}
/*
* Recently Hurt
*/
@@ -299,23 +218,6 @@ public class McMMOPlayer {
recentlyHurt = (int) (System.currentTimeMillis() / Misc.TIME_CONVERSION_FACTOR);
}
/*
* Chimaera Wing
*/
public int getLastChimaeraTeleport() {
return chimaeraWing;
}
public void setLastChimaeraTeleport(int value) {
chimaeraWing = value;
}
public void actualizeLastChimaeraTeleport() {
chimaeraWing = (int) (System.currentTimeMillis() / Misc.TIME_CONVERSION_FACTOR);
}
/*
* Exploit Prevention
*/
@@ -332,26 +234,24 @@ public class McMMOPlayer {
* Repair Anvil Placement
*/
public boolean getPlacedAnvil(int anvilId) {
if (anvilId == Repair.repairAnvilId) {
return placedRepairAnvil;
}
if (anvilId == Repair.salvageAnvilId) {
return placedSalvageAnvil;
}
return true;
public void togglePlacedAnvil() {
placedAnvil = !placedAnvil;
}
public void togglePlacedAnvil(int anvilId) {
if (anvilId == Repair.repairAnvilId) {
placedRepairAnvil = !placedRepairAnvil;
}
public Boolean getPlacedAnvil() {
return placedAnvil;
}
if (anvilId == Repair.salvageAnvilId) {
placedSalvageAnvil = !placedSalvageAnvil;
}
/*
* Salvage Anvil Placement
*/
public void togglePlacedSalvageAnvil() {
placedSalvageAnvil = !placedSalvageAnvil;
}
public Boolean getPlacedSalvageAnvil() {
return placedSalvageAnvil;
}
/*

View File

@@ -92,7 +92,7 @@ public class PlayerProfile {
}
else {
for (HudType type : HudType.values()) {
if (type.toString().equalsIgnoreCase(huds.get(1).get(0))) {
if (type.toString().equals(huds.get(1).get(0))) {
hudType = type;
}
}
@@ -186,7 +186,7 @@ public class PlayerProfile {
// Find if the line contains the player we want.
String[] character = line.split(":");
if (!character[0].equalsIgnoreCase(playerName)) {
if (!character[0].equals(playerName)) {
continue;
}
@@ -400,7 +400,7 @@ public class PlayerProfile {
// While not at the end of the file
while ((line = in.readLine()) != null) {
// Read the line in and copy it to the output it's not the player we want to edit
if (!line.split(":")[0].equalsIgnoreCase(playerName)) {
if (!line.split(":")[0].equals(playerName)) {
writer.append(line).append("\r\n");
}
else {

View File

@@ -0,0 +1,22 @@
package com.gmail.nossr50.datatypes.skills;
public class Ability {
protected boolean mode;
protected boolean informed = true;
public boolean getMode() {
return mode;
}
public void setMode(boolean mode) {
this.mode = mode;
}
public boolean getInformed() {
return informed;
}
public void setInformed(boolean informed) {
this.informed = informed;
}
}

View File

@@ -11,12 +11,10 @@ import com.gmail.nossr50.skills.excavation.ExcavationManager;
import com.gmail.nossr50.skills.fishing.FishingManager;
import com.gmail.nossr50.skills.herbalism.HerbalismManager;
import com.gmail.nossr50.skills.mining.MiningManager;
import com.gmail.nossr50.skills.repair.RepairManager;
import com.gmail.nossr50.skills.smelting.SmeltingManager;
import com.gmail.nossr50.skills.swords.SwordsManager;
import com.gmail.nossr50.skills.taming.TamingManager;
import com.gmail.nossr50.skills.unarmed.UnarmedManager;
import com.gmail.nossr50.skills.woodcutting.WoodcuttingManager;
import com.gmail.nossr50.util.StringUtils;
public enum SkillType {
@@ -27,35 +25,35 @@ public enum SkillType {
FISHING(FishingManager.class),
HERBALISM(HerbalismManager.class, AbilityType.GREEN_TERRA, ToolType.HOE),
MINING(MiningManager.class, AbilityType.SUPER_BREAKER, ToolType.PICKAXE),
REPAIR(RepairManager.class),
REPAIR(null), // TODO: Create a proper RepairManager class
SMELTING(SmeltingManager.class),
SWORDS(SwordsManager.class, AbilityType.SERRATED_STRIKES, ToolType.SWORD),
TAMING(TamingManager.class),
UNARMED(UnarmedManager.class, AbilityType.BERSERK, ToolType.FISTS),
WOODCUTTING(WoodcuttingManager.class, AbilityType.TREE_FELLER, ToolType.AXE);
WOODCUTTING(null, AbilityType.TREE_FELLER, ToolType.AXE); // TODO: Create a proper WoodcuttingManager class
private Class<? extends SkillManager> managerClass;
private AbilityType ability;
private ToolType tool;
private AbilityType abilityType;
private ToolType toolType;
private SkillType(Class<? extends SkillManager> managerClass) {
this.managerClass = managerClass;
ability = null;
tool = null;
abilityType = null;
toolType = null;
}
private SkillType(Class<? extends SkillManager> managerClass, AbilityType ability, ToolType tool) {
private SkillType(Class<? extends SkillManager> managerClass, AbilityType abilityType, ToolType toolType) {
this.managerClass = managerClass;
this.ability = ability;
this.tool = tool;
this.abilityType = abilityType;
this.toolType = toolType;
}
public Class<? extends SkillManager> getManagerClass() {
return managerClass;
}
public AbilityType getAbility() {
return ability;
public AbilityType getAbilityType() {
return abilityType;
}
/**
@@ -79,8 +77,8 @@ public enum SkillType {
return Config.getInstance().getDoubleDropsDisabled(this);
}
public ToolType getTool() {
return tool;
public ToolType getToolType() {
return toolType;
}
public double getXpModifier() {

View File

@@ -0,0 +1,26 @@
package com.gmail.nossr50.datatypes.skills;
import com.gmail.nossr50.util.Misc;
public class Tool {
private boolean preparationMode = true;
private long preparationATS;
public boolean getPreparationMode() {
return preparationMode;
}
public void setPreparationMode(boolean preparationMode) {
this.preparationMode = preparationMode;
}
public long getPreparationATS() {
return preparationATS;
}
public void setPreparationATS(long toolPreparationATS) {
int startTime = (int) (toolPreparationATS / Misc.TIME_CONVERSION_FACTOR);
preparationATS = startTime;
}
}

View File

@@ -7,7 +7,6 @@ import org.bukkit.Sound;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.block.BlockState;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
@@ -20,11 +19,12 @@ import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.inventory.ItemStack;
import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.config.AdvancedConfig;
import com.gmail.nossr50.config.Config;
import com.gmail.nossr50.config.HiddenConfig;
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.datatypes.skills.AbilityType;
import com.gmail.nossr50.datatypes.skills.SkillType;
import com.gmail.nossr50.datatypes.skills.ToolType;
import com.gmail.nossr50.events.fake.FakeBlockBreakEvent;
import com.gmail.nossr50.events.fake.FakeBlockDamageEvent;
import com.gmail.nossr50.events.fake.FakePlayerAnimationEvent;
@@ -33,9 +33,10 @@ import com.gmail.nossr50.skills.excavation.ExcavationManager;
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.repair.Salvage;
import com.gmail.nossr50.skills.smelting.SmeltingManager;
import com.gmail.nossr50.skills.unarmed.UnarmedManager;
import com.gmail.nossr50.skills.woodcutting.WoodcuttingManager;
import com.gmail.nossr50.skills.unarmed.Unarmed;
import com.gmail.nossr50.skills.woodcutting.Woodcutting;
import com.gmail.nossr50.util.BlockUtils;
import com.gmail.nossr50.util.ItemUtils;
import com.gmail.nossr50.util.Misc;
@@ -106,15 +107,21 @@ public class BlockListener implements Listener {
}
BlockState blockState = event.getBlock().getState();
int blockId = blockState.getTypeId();
/* Check if the blocks placed should be monitored so they do not give out XP in the future */
if (BlockUtils.shouldBeWatched(blockState)) {
mcMMO.placeStore.setTrue(blockState);
}
if (Repair.anvilMessagesEnabled && (blockId == Repair.repairAnvilId || blockId == Repair.salvageAnvilId)) {
UserManager.getPlayer(player).getRepairManager().placedAnvilCheck(blockId);
if (Repair.anvilMessagesEnabled) {
int blockID = blockState.getTypeId();
if (blockID == Repair.anvilID) {
Repair.placedAnvilCheck(player, blockID);
}
else if (blockID == Salvage.anvilID) {
Salvage.placedAnvilCheck(player, blockID);
}
}
}
@@ -137,11 +144,12 @@ public class BlockListener implements Listener {
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
BlockState blockState = event.getBlock().getState();
ItemStack heldItem = player.getItemInHand();
/* HERBALISM */
if (BlockUtils.affectedByGreenTerra(blockState)) {
HerbalismManager herbalismManager = mcMMOPlayer.getHerbalismManager();
HerbalismManager herbalismManager = UserManager.getPlayer(player).getHerbalismManager();
/* Green Terra */
if (herbalismManager.canActivateAbility()) {
@@ -153,34 +161,52 @@ public class BlockListener implements Listener {
* Instead, we check it inside the drops handler.
*/
if (Permissions.skillEnabled(player, SkillType.HERBALISM)) {
// Double drops
herbalismManager.herbalismBlockCheck(blockState);
// Triple drops
if (herbalismManager.canGreenTerraPlant()) {
herbalismManager.herbalismBlockCheck(blockState);
}
}
}
/* MINING */
else if (BlockUtils.affectedBySuperBreaker(blockState) && ItemUtils.isPickaxe(heldItem) && Permissions.skillEnabled(player, SkillType.MINING) && !mcMMO.placeStore.isTrue(blockState)) {
MiningManager miningManager = mcMMOPlayer.getMiningManager();
MiningManager miningManager = UserManager.getPlayer(player).getMiningManager();
miningManager.miningBlockCheck(blockState);
if (miningManager.getAbility().getMode()) {
miningManager.miningBlockCheck(blockState);
}
}
/* WOOD CUTTING */
else if (BlockUtils.isLog(blockState) && Permissions.skillEnabled(player, SkillType.WOODCUTTING) && !mcMMO.placeStore.isTrue(blockState)) {
WoodcuttingManager woodcuttingManager = mcMMOPlayer.getWoodcuttingManager();
if (woodcuttingManager.canUseTreeFeller(heldItem)) {
woodcuttingManager.processTreeFeller(blockState);
if (mcMMOPlayer.getSkillManager(SkillType.WOODCUTTING).getAbility().getMode() && Permissions.treeFeller(player) && ItemUtils.isAxe(heldItem)) {
Woodcutting.beginTreeFeller(blockState, player);
}
else {
woodcuttingManager.woodcuttingBlockCheck(blockState);
if (Config.getInstance().getWoodcuttingRequiresTool()) {
if (ItemUtils.isAxe(heldItem)) {
Woodcutting.beginWoodcutting(player, blockState);
}
}
else {
Woodcutting.beginWoodcutting(player, blockState);
}
}
}
/* EXCAVATION */
else if (BlockUtils.affectedByGigaDrillBreaker(blockState) && ItemUtils.isShovel(heldItem) && Permissions.skillEnabled(player, SkillType.EXCAVATION) && !mcMMO.placeStore.isTrue(blockState)) {
ExcavationManager excavationManager = mcMMOPlayer.getExcavationManager();
ExcavationManager excavationManager = UserManager.getPlayer(player).getExcavationManager();
excavationManager.excavationBlockCheck(blockState);
if (mcMMOPlayer.getAbilityMode(AbilityType.GIGA_DRILL_BREAKER)) {
if (excavationManager.getAbility().getMode()) {
excavationManager.gigaDrillBreaker(blockState);
}
}
@@ -209,26 +235,20 @@ public class BlockListener implements Listener {
}
BlockState blockState = event.getBlock().getState();
ItemStack heldItem = player.getItemInHand();
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
HerbalismManager herbalismManager = mcMMOPlayer.getHerbalismManager();
SmeltingManager smeltingManager = mcMMOPlayer.getSmeltingManager();
if (ItemUtils.isSword(heldItem)) {
HerbalismManager herbalismManager = UserManager.getPlayer(player).getHerbalismManager();
if (herbalismManager.canUseHylianLuck()) {
if (herbalismManager.processHylianLuck(blockState)) {
blockState.update(true);
event.setCancelled(true);
}
if (herbalismManager.canUseHylianLuck()) {
if (herbalismManager.processHylianLuck(blockState)) {
blockState.update(true);
event.setCancelled(true);
}
}
else if (ItemUtils.isPickaxe(heldItem) && !heldItem.containsEnchantment(Enchantment.SILK_TOUCH)) {
SmeltingManager smeltingManager = UserManager.getPlayer(player).getSmeltingManager();
if (smeltingManager.canUseFluxMining(blockState)) {
if (smeltingManager.processFluxMining(blockState)) {
blockState.update(true);
event.setCancelled(true);
}
else if (smeltingManager.canUseFluxMining(blockState)) {
if (smeltingManager.processFluxMining(blockState)) {
blockState.update(true);
event.setCancelled(true);
}
}
}
@@ -262,29 +282,29 @@ public class BlockListener implements Listener {
ItemStack heldItem = player.getItemInHand();
if (HiddenConfig.getInstance().useEnchantmentBuffs()) {
if ((ItemUtils.isPickaxe(heldItem) && !mcMMOPlayer.getAbilityMode(AbilityType.SUPER_BREAKER)) || (ItemUtils.isShovel(heldItem) && !mcMMOPlayer.getAbilityMode(AbilityType.GIGA_DRILL_BREAKER))) {
if ((ItemUtils.isPickaxe(heldItem) && !mcMMOPlayer.getSkillManager(SkillType.MINING).getAbility().getMode()) || (ItemUtils.isShovel(heldItem) && !mcMMOPlayer.getSkillManager(SkillType.EXCAVATION).getAbility().getMode())) {
SkillUtils.removeAbilityBuff(heldItem);
}
}
else {
if ((mcMMOPlayer.getAbilityMode(AbilityType.SUPER_BREAKER) && !BlockUtils.affectedBySuperBreaker(blockState)) || (mcMMOPlayer.getAbilityMode(AbilityType.GIGA_DRILL_BREAKER) && !BlockUtils.affectedByGigaDrillBreaker(blockState))) {
if ((mcMMOPlayer.getSkillManager(SkillType.MINING).getAbility().getMode() && !BlockUtils.affectedBySuperBreaker(blockState)) || (mcMMOPlayer.getSkillManager(SkillType.EXCAVATION).getAbility().getMode() && !BlockUtils.affectedByGigaDrillBreaker(blockState))) {
SkillUtils.handleAbilitySpeedDecrease(player);
}
}
if (mcMMOPlayer.getToolPreparationMode(ToolType.HOE) && ItemUtils.isHoe(heldItem) && (BlockUtils.affectedByGreenTerra(blockState) || BlockUtils.canMakeMossy(blockState)) && Permissions.greenTerra(player)) {
if (mcMMOPlayer.getSkillManager(SkillType.HERBALISM).getTool().getPreparationMode() && ItemUtils.isHoe(heldItem) && (BlockUtils.affectedByGreenTerra(blockState) || BlockUtils.canMakeMossy(blockState)) && Permissions.greenTerra(player)) {
SkillUtils.abilityCheck(mcMMOPlayer, SkillType.HERBALISM);
}
else if (mcMMOPlayer.getToolPreparationMode(ToolType.AXE) && ItemUtils.isAxe(heldItem) && BlockUtils.isLog(blockState) && Permissions.treeFeller(player)) {
else if (mcMMOPlayer.getSkillManager(SkillType.WOODCUTTING).getTool().getPreparationMode() && ItemUtils.isAxe(heldItem) && BlockUtils.isLog(blockState) && Permissions.treeFeller(player)) {
SkillUtils.abilityCheck(mcMMOPlayer, SkillType.WOODCUTTING);
}
else if (mcMMOPlayer.getToolPreparationMode(ToolType.PICKAXE) && ItemUtils.isPickaxe(heldItem) && BlockUtils.affectedBySuperBreaker(blockState) && Permissions.superBreaker(player)) {
else if (mcMMOPlayer.getSkillManager(SkillType.MINING).getTool().getPreparationMode() && ItemUtils.isPickaxe(heldItem) && BlockUtils.affectedBySuperBreaker(blockState) && Permissions.superBreaker(player)) {
SkillUtils.abilityCheck(mcMMOPlayer, SkillType.MINING);
}
else if (mcMMOPlayer.getToolPreparationMode(ToolType.SHOVEL) && ItemUtils.isShovel(heldItem) && BlockUtils.affectedByGigaDrillBreaker(blockState) && Permissions.gigaDrillBreaker(player)) {
else if (mcMMOPlayer.getSkillManager(SkillType.EXCAVATION).getTool().getPreparationMode() && ItemUtils.isShovel(heldItem) && BlockUtils.affectedByGigaDrillBreaker(blockState) && Permissions.gigaDrillBreaker(player)) {
SkillUtils.abilityCheck(mcMMOPlayer, SkillType.EXCAVATION);
}
else if (mcMMOPlayer.getToolPreparationMode(ToolType.FISTS) && heldItem.getType() == Material.AIR && (BlockUtils.affectedByGigaDrillBreaker(blockState) || blockState.getType() == Material.SNOW || BlockUtils.affectedByBlockCracker(blockState) && Permissions.berserk(player))) {
else if (mcMMOPlayer.getSkillManager(SkillType.UNARMED).getTool().getPreparationMode() && heldItem.getType() == Material.AIR && (BlockUtils.affectedByGigaDrillBreaker(blockState) || blockState.getType() == Material.SNOW || BlockUtils.affectedByBlockCracker(blockState) && Permissions.berserk(player))) {
SkillUtils.abilityCheck(mcMMOPlayer, SkillType.UNARMED);
}
}
@@ -294,7 +314,7 @@ public class BlockListener implements Listener {
*
* We don't need to check permissions here because they've already been checked for the ability to even activate.
*/
if (mcMMOPlayer.getAbilityMode(AbilityType.TREE_FELLER) && BlockUtils.isLog(blockState)) {
if (mcMMOPlayer.getSkillManager(SkillType.WOODCUTTING).getTool().getPreparationMode() && BlockUtils.isLog(blockState)) {
player.playSound(blockState.getLocation(), Sound.FIZZ, Misc.FIZZ_VOLUME, Misc.FIZZ_PITCH);
}
}
@@ -332,7 +352,7 @@ public class BlockListener implements Listener {
blockState.update(true);
}
}
else if (mcMMOPlayer.getAbilityMode(AbilityType.BERSERK)) {
else if (mcMMOPlayer.getSkillManager(SkillType.UNARMED).getTool().getPreparationMode()) {
if (SkillUtils.triggerCheck(player, block, AbilityType.BERSERK)) {
if (heldItem.getType() == Material.AIR) {
plugin.getServer().getPluginManager().callEvent(new FakePlayerAnimationEvent(player));
@@ -342,18 +362,24 @@ public class BlockListener implements Listener {
}
}
// Another perm check for the cracked blocks activation
else if (BlockUtils.affectedByBlockCracker(blockState)) {
UnarmedManager unarmedManager = mcMMOPlayer.getUnarmedManager();
if (unarmedManager.canUseBlockCracker() && SkillUtils.blockBreakSimulate(block, player, false) && unarmedManager.blockCrackerCheck(blockState)) {
else if (BlockUtils.affectedByBlockCracker(blockState) && Permissions.blockCracker(player)) {
if (Unarmed.blockCracker(player, blockState)) {
blockState.update();
}
}
}
else if (BlockUtils.isLeaves(blockState)) {
if (mcMMOPlayer.getWoodcuttingManager().canUseLeafBlower(heldItem) && SkillUtils.blockBreakSimulate(block, player, true)) {
event.setInstaBreak(true);
player.playSound(blockState.getLocation(), Sound.ITEM_PICKUP, Misc.POP_VOLUME, Misc.POP_PITCH);
else if ((mcMMOPlayer.getProfile().getSkillLevel(SkillType.WOODCUTTING) >= AdvancedConfig.getInstance().getLeafBlowUnlockLevel()) && BlockUtils.isLeaves(blockState)) {
if (SkillUtils.triggerCheck(player, block, AbilityType.LEAF_BLOWER)) {
if (Config.getInstance().getWoodcuttingRequiresTool()) {
if (ItemUtils.isAxe(heldItem)) {
event.setInstaBreak(true);
Woodcutting.beginLeafBlower(player, blockState);
}
}
else if (!(heldItem.getType() == Material.SHEARS)) {
event.setInstaBreak(true);
Woodcutting.beginLeafBlower(player, blockState);
}
}
}
}

View File

@@ -115,8 +115,8 @@ public class EntityListener implements Listener {
Player defendingPlayer = (Player) defender;
Player attackingPlayer = (Player) attacker;
// We want to make sure we're not gaining XP or applying abilities when we hit ourselves
if (defendingPlayer.equals(attackingPlayer)) {
// TODO: Why?
if (defendingPlayer == attackingPlayer) {
return;
}

View File

@@ -1,6 +1,5 @@
package com.gmail.nossr50.listeners;
import org.bukkit.block.Block;
import org.bukkit.block.BlockState;
import org.bukkit.block.Furnace;
import org.bukkit.entity.HumanEntity;
@@ -17,7 +16,6 @@ import org.bukkit.event.inventory.InventoryOpenEvent;
import org.bukkit.inventory.FurnaceInventory;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.metadata.FixedMetadataValue;
import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.datatypes.skills.SkillType;
@@ -51,12 +49,11 @@ public class InventoryListener implements Listener {
if (furnace == null) {
return;
}
if (furnace.getBurnTime() == 0) {
Block furnaceBlock = furnace.getBlock();
if (!furnaceBlock.hasMetadata(mcMMO.furnaceMetadataKey)) {
furnaceBlock.setMetadata(mcMMO.furnaceMetadataKey, new FixedMetadataValue(plugin, player.getName()));
}
BlockState furnaceBlock = furnace.getBlock().getState();
if (furnace.getBurnTime() == 0 && !plugin.furnaceIsTracked(furnaceBlock)) {
plugin.addToOpenFurnaceTracker(furnaceBlock, player.getName());
}
}
}
@@ -78,27 +75,23 @@ public class InventoryListener implements Listener {
return;
}
if (furnace.getBurnTime() == 0) {
Block furnaceBlock = furnace.getBlock();
BlockState furnaceBlock = furnace.getBlock().getState();
if (furnaceBlock.hasMetadata(mcMMO.furnaceMetadataKey)) {
furnaceBlock.removeMetadata(mcMMO.furnaceMetadataKey, plugin);
}
if (furnace.getBurnTime() == 0 && plugin.furnaceIsTracked(furnaceBlock)) {
plugin.removeFromFurnaceTracker(furnaceBlock);
}
}
}
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onFurnaceBurnEvent(FurnaceBurnEvent event) {
Block furnaceBlock = event.getBlock();
BlockState furnaceState = furnaceBlock.getState();
BlockState furnaceBlock = event.getBlock().getState();
if (furnaceState instanceof Furnace) {
ItemStack smelting = ((Furnace) furnaceState).getInventory().getSmelting();
if (furnaceBlock instanceof Furnace) {
ItemStack smelting = ((Furnace) furnaceBlock).getInventory().getSmelting();
if (furnaceBlock.hasMetadata(mcMMO.furnaceMetadataKey) && smelting != null && ItemUtils.isSmeltable(smelting)) {
// We can make this assumption because we (should) be the only ones using this exact metadata
Player player = plugin.getServer().getPlayer(furnaceBlock.getMetadata(mcMMO.furnaceMetadataKey).get(0).asString());
if (plugin.furnaceIsTracked(furnaceBlock) && smelting != null && ItemUtils.isSmeltable(smelting)) {
Player player = plugin.getFurnacePlayer(furnaceBlock);
if (Misc.isNPCEntity(player) || !Permissions.fuelEfficiency(player)) {
return;
@@ -111,15 +104,13 @@ public class InventoryListener implements Listener {
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onFurnaceSmeltEvent(FurnaceSmeltEvent event) {
Block furnaceBlock = event.getBlock();
BlockState furnaceState = furnaceBlock.getState();
BlockState furnaceBlock = event.getBlock().getState();
if (furnaceState instanceof Furnace) {
ItemStack smelting = ((Furnace) furnaceState).getInventory().getSmelting();
if (furnaceBlock instanceof Furnace) {
ItemStack smelting = ((Furnace) furnaceBlock).getInventory().getSmelting();
if (furnaceBlock.hasMetadata(mcMMO.furnaceMetadataKey) && smelting != null && ItemUtils.isSmeltable(smelting)) {
// We can make this assumption because we (should) be the only ones using this exact metadata
Player player = plugin.getServer().getPlayer(furnaceBlock.getMetadata(mcMMO.furnaceMetadataKey).get(0).asString());
if (plugin.furnaceIsTracked(furnaceBlock) && smelting != null && ItemUtils.isSmeltable(smelting)) {
Player player = plugin.getFurnacePlayer(furnaceBlock);
if (Misc.isNPCEntity(player) || !Permissions.skillEnabled(player, SkillType.SMELTING)) {
return;
@@ -132,15 +123,13 @@ public class InventoryListener implements Listener {
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onFurnaceExtractEvent(FurnaceExtractEvent event) {
Block furnaceBlock = event.getBlock();
BlockState furnaceState = furnaceBlock.getState();
BlockState furnaceBlock = event.getBlock().getState();
if (furnaceState instanceof Furnace) {
ItemStack result = ((Furnace) furnaceState).getInventory().getResult();
if (furnaceBlock instanceof Furnace) {
ItemStack result = ((Furnace) furnaceBlock).getInventory().getResult();
if (furnaceBlock.hasMetadata(mcMMO.furnaceMetadataKey) && result != null && ItemUtils.isSmelted(result)) {
// We can make this assumption because we (should) be the only ones using this exact metadata
Player player = plugin.getServer().getPlayer(furnaceBlock.getMetadata(mcMMO.furnaceMetadataKey).get(0).asString());
if (plugin.furnaceIsTracked(furnaceBlock) && result != null && ItemUtils.isSmelted(result)) {
Player player = event.getPlayer();
SmeltingManager smeltingManager = UserManager.getPlayer(player).getSmeltingManager();
@@ -153,8 +142,6 @@ public class InventoryListener implements Listener {
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onInventoryClickEvent(InventoryClickEvent event) {
if (event.getSlot() >= 0) {
SkillUtils.removeAbilityBuff(event.getCurrentItem());
}
SkillUtils.removeAbilityBuff(event.getCurrentItem());
}
}

View File

@@ -30,7 +30,6 @@ import com.gmail.nossr50.chat.ChatManager;
import com.gmail.nossr50.config.Config;
import com.gmail.nossr50.datatypes.party.Party;
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.datatypes.skills.AbilityType;
import com.gmail.nossr50.datatypes.skills.SkillType;
import com.gmail.nossr50.locale.LocaleLoader;
import com.gmail.nossr50.party.ShareHandler;
@@ -39,6 +38,7 @@ import com.gmail.nossr50.skills.fishing.FishingManager;
import com.gmail.nossr50.skills.herbalism.HerbalismManager;
import com.gmail.nossr50.skills.mining.MiningManager;
import com.gmail.nossr50.skills.repair.Repair;
import com.gmail.nossr50.skills.repair.Salvage;
import com.gmail.nossr50.skills.taming.TamingManager;
import com.gmail.nossr50.util.BlockUtils;
import com.gmail.nossr50.util.ChimaeraWing;
@@ -139,7 +139,7 @@ public class PlayerListener implements Listener {
Player player = event.getPlayer();
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
if (mcMMOPlayer.getAbilityMode(AbilityType.GIGA_DRILL_BREAKER) || mcMMOPlayer.getAbilityMode(AbilityType.SUPER_BREAKER)) {
if (mcMMOPlayer.getSkillManager(SkillType.EXCAVATION).getAbility().getMode() || mcMMOPlayer.getSkillManager(SkillType.MINING).getAbility().getMode()) {
event.setCancelled(true);
return;
}
@@ -284,14 +284,14 @@ public class PlayerListener implements Listener {
int blockID = block.getTypeId();
/* REPAIR CHECKS */
if (blockID == Repair.repairAnvilId && Permissions.skillEnabled(player, SkillType.REPAIR) && mcMMO.repairableManager.isRepairable(heldItem)) {
UserManager.getPlayer(player).getRepairManager().handleRepair(heldItem);
if (blockID == Repair.anvilID && Permissions.skillEnabled(player, SkillType.REPAIR) && mcMMO.repairManager.isRepairable(heldItem)) {
mcMMO.repairManager.handleRepair(mcMMOPlayer, heldItem);
event.setCancelled(true);
player.updateInventory();
}
/* SALVAGE CHECKS */
else if (blockID == Repair.salvageAnvilId && Permissions.salvage(player) && Repair.isSalvageable(heldItem)) {
UserManager.getPlayer(player).getRepairManager().handleSalvage(block.getLocation(), heldItem);
else if (blockID == Salvage.anvilID && Permissions.salvage(player) && Salvage.isSalvageable(heldItem)) {
Salvage.handleSalvage(player, block.getLocation(), heldItem);
event.setCancelled(true);
player.updateInventory();
}

View File

@@ -8,7 +8,9 @@ import java.util.List;
import net.shatteredlands.shatt.backup.ZipLibrary;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.block.BlockState;
import org.bukkit.entity.Player;
import org.bukkit.event.HandlerList;
import org.bukkit.metadata.FixedMetadataValue;
@@ -43,11 +45,10 @@ 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;
import com.gmail.nossr50.skills.repair.RepairManager;
import com.gmail.nossr50.skills.repair.RepairManagerFactory;
import com.gmail.nossr50.skills.repair.Repairable;
import com.gmail.nossr50.skills.repair.RepairableManager;
import com.gmail.nossr50.skills.repair.RepairableManagerFactory;
import com.gmail.nossr50.skills.repair.config.RepairConfigManager;
import com.gmail.nossr50.util.ChimaeraWing;
import com.gmail.nossr50.util.LogFilter;
import com.gmail.nossr50.util.Permissions;
import com.gmail.nossr50.util.UpdateChecker;
@@ -65,11 +66,12 @@ public class mcMMO extends JavaPlugin {
private final WorldListener worldListener = new WorldListener();
private HashMap<Integer, String> tntTracker = new HashMap<Integer, String>();
private HashMap<BlockState, String> furnaceTracker = new HashMap<BlockState, String>();
public static mcMMO p;
public static ChunkManager placeStore;
public static RepairableManager repairableManager;
public static RepairManager repairManager;
// Jar Stuff
public static File mcmmo;
@@ -93,7 +95,6 @@ public class mcMMO extends JavaPlugin {
public static FixedMetadataValue metadataValue;
public final static String entityMetadataKey = "mcMMO: Spawned Entity";
public final static String blockMetadataKey = "mcMMO: Piston Tracking";
public final static String furnaceMetadataKey = "mcMMO: Tracked Furnace";
/**
* Things to be run when the plugin is enabled.
@@ -114,7 +115,6 @@ public class mcMMO extends JavaPlugin {
}
registerEvents();
registerCustomRecipes();
// Setup the leader boards
if (Config.getInstance().getUseMySQL()) {
@@ -155,7 +155,7 @@ public class mcMMO extends JavaPlugin {
getLogger().info("Please do not replace the mcMMO jar while the server is running.");
}
getServer().getPluginManager().disablePlugin(this);
Bukkit.getPluginManager().disablePlugin(this);
}
}
@@ -273,6 +273,22 @@ public class mcMMO extends JavaPlugin {
tntTracker.remove(tntID);
}
public void addToOpenFurnaceTracker(BlockState furnace, String playerName) {
furnaceTracker.put(furnace, playerName);
}
public boolean furnaceIsTracked(BlockState furnace) {
return furnaceTracker.containsKey(furnace);
}
public void removeFromFurnaceTracker(BlockState furnace) {
furnaceTracker.remove(furnace);
}
public Player getFurnacePlayer(BlockState furnace) {
return getServer().getPlayer(furnaceTracker.get(furnace));
}
public static String getMainDirectory() {
return mainDirectory;
}
@@ -361,8 +377,8 @@ public class mcMMO extends JavaPlugin {
// Load repair configs, make manager, and register them at this time
RepairConfigManager rManager = new RepairConfigManager(this);
repairables.addAll(rManager.getLoadedRepairables());
repairableManager = RepairableManagerFactory.getRepairManager(repairables.size());
repairableManager.registerRepairables(repairables);
repairManager = RepairManagerFactory.getRepairManager(repairables.size());
repairManager.registerRepairables(repairables);
// Check if Repair Anvil and Salvage Anvil have different itemID's
if (configInstance.getSalvageAnvilId() == configInstance.getRepairAnvilId()) {
@@ -434,12 +450,6 @@ public class mcMMO extends JavaPlugin {
CommandRegistrationManager.registerMchudCommand();
}
private void registerCustomRecipes() {
if (Config.getInstance().getChimaeraEnabled()) {
getServer().addRecipe(ChimaeraWing.getChimaeraWingRecipe());
}
}
private void scheduleTasks() {
BukkitScheduler scheduler = getServer().getScheduler();

View File

@@ -75,7 +75,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().equals(member.getName()) && Misc.isNear(player.getLocation(), member.getLocation(), range)) {
nearMembers.add(member);
}
}
@@ -150,7 +150,7 @@ public final class PartyManager {
public static Party getPlayerParty(String playerName) {
for (Party party : parties) {
for (OfflinePlayer member : party.getMembers()) {
if (member.getName().equalsIgnoreCase(playerName)) {
if (member.getName().equals(playerName)) {
return party;
}
}
@@ -184,7 +184,7 @@ public final class PartyManager {
}
else {
// If the leaving player was the party leader, appoint a new leader from the party members
if (party.getLeader().equalsIgnoreCase(player.getName())) {
if (party.getLeader().equals(player.getName())) {
String newLeader = members.get(0).getName();
party.setLeader(newLeader);
}
@@ -374,10 +374,10 @@ public final class PartyManager {
String leaderName = party.getLeader();
for (Player member : party.getOnlineMembers()) {
if (member.getName().equalsIgnoreCase(playerName)) {
if (member.getName().equals(playerName)) {
member.sendMessage(LocaleLoader.getString("Party.Owner.Player"));
}
else if (member.getName().equalsIgnoreCase(leaderName)) {
else if (member.getName().equals(leaderName)) {
member.sendMessage(LocaleLoader.getString("Party.Owner.NotLeader"));
}
else {
@@ -396,7 +396,7 @@ public final class PartyManager {
* @return true if the player can invite
*/
public static boolean canInvite(Player player, Party party) {
if (party.isLocked() && !party.getLeader().equalsIgnoreCase(player.getName())) {
if (party.isLocked() && !party.getLeader().equals(player.getName())) {
return false;
}
@@ -488,13 +488,13 @@ public final class PartyManager {
}
partiesFile.set(partyName + ".Members", memberNames);
}
try {
partiesFile.save(new File(partiesFilePath));
}
catch (Exception e) {
e.printStackTrace();
try {
partiesFile.save(new File(partiesFilePath));
}
catch (Exception e) {
e.printStackTrace();
}
}
}

View File

@@ -2,14 +2,13 @@ package com.gmail.nossr50.runnables.commands;
import java.util.Map;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.database.DatabaseManager;
import com.gmail.nossr50.datatypes.skills.SkillType;
import com.gmail.nossr50.locale.LocaleLoader;
import com.gmail.nossr50.util.Permissions;
import com.gmail.nossr50.util.skills.SkillUtils;
public class McrankCommandAsyncTask implements Runnable {
@@ -25,14 +24,14 @@ public class McrankCommandAsyncTask implements Runnable {
public void run() {
final Map<String, Integer> skills = DatabaseManager.readSQLRank(playerName);
mcMMO.p.getServer().getScheduler().scheduleSyncDelayedTask(mcMMO.p, new Runnable() {
Bukkit.getScheduler().scheduleSyncDelayedTask(mcMMO.p, new Runnable() {
@Override
public void run() {
sender.sendMessage(LocaleLoader.getString("Commands.mcrank.Heading"));
sender.sendMessage(LocaleLoader.getString("Commands.mcrank.Player", playerName));
for (SkillType skillType : SkillType.values()) {
if ((sender instanceof Player && !Permissions.skillEnabled(sender, skillType)) || skillType.isChildSkill()) {
if (skillType.isChildSkill()) {
continue;
}

View File

@@ -3,13 +3,17 @@ package com.gmail.nossr50.runnables.commands;
import java.util.ArrayList;
import java.util.HashMap;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.config.Config;
import com.gmail.nossr50.database.DatabaseManager;
import com.gmail.nossr50.datatypes.skills.SkillType;
import com.gmail.nossr50.locale.LocaleLoader;
import com.gmail.nossr50.util.Permissions;
import com.gmail.nossr50.util.StringUtils;
public class MctopCommandAsyncTask implements Runnable {
@@ -17,21 +21,29 @@ public class MctopCommandAsyncTask implements Runnable {
private CommandSender sender;
private String query;
private int page;
private Command command;
public MctopCommandAsyncTask(int page, String query, CommandSender sender) {
public MctopCommandAsyncTask(int page, String query, CommandSender sender, Command command) {
this.page = page;
this.query = query;
this.sender = sender;
this.command = command;
}
@Override
public void run() {
if (!query.equalsIgnoreCase("taming+mining+woodcutting+repair+unarmed+herbalism+excavation+archery+swords+axes+acrobatics+fishing")) {
if (!Permissions.mctop(sender, SkillType.getSkill(query))) {
sender.sendMessage(command.getPermissionMessage());
return;
}
}
String tablePrefix = Config.getInstance().getMySQLTablePrefix();
final HashMap<Integer, ArrayList<String>> userslist = DatabaseManager.read("SELECT " + query + ", user, NOW() FROM " + tablePrefix + "users JOIN " + tablePrefix + "skills ON (user_id = id) WHERE " + query + " > 0 ORDER BY " + query + " DESC, user LIMIT " + ((page * 10) - 10) + ",10");
mcMMO.p.getServer().getScheduler().scheduleSyncDelayedTask(mcMMO.p, new Runnable() {
Bukkit.getScheduler().scheduleSyncDelayedTask(mcMMO.p, new Runnable() {
@Override
public void run() {
if (query.equalsIgnoreCase("taming+mining+woodcutting+repair+unarmed+herbalism+excavation+archery+swords+axes+acrobatics+fishing")) {
if (query.equals("taming+mining+woodcutting+repair+unarmed+herbalism+excavation+archery+swords+axes+acrobatics+fishing")) {
sender.sendMessage(LocaleLoader.getString("Commands.PowerLevel.Leaderboard"));
}
else {

View File

@@ -55,7 +55,7 @@ public class SQLConversionTask implements Runnable {
playerName = character[0];
// Check for things we don't want put in the DB
if (playerName == null || playerName.equalsIgnoreCase("null") || playerName.equalsIgnoreCase("#Storage place for user information")) {
if (playerName == null || playerName.equals("null") || playerName.equals("#Storage place for user information")) {
continue;
}

View File

@@ -1,16 +0,0 @@
package com.gmail.nossr50.runnables.skills;
import org.bukkit.block.BlockState;
public class HerbalismBlockUpdaterTask implements Runnable {
private BlockState blockState;
public HerbalismBlockUpdaterTask(BlockState blockState) {
this.blockState = blockState;
}
@Override
public void run() {
blockState.update(true);
}
}

View File

@@ -1,8 +1,11 @@
package com.gmail.nossr50.runnables.skills;
import org.bukkit.entity.Player;
import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.datatypes.skills.AbilityType;
import com.gmail.nossr50.datatypes.skills.SkillType;
import com.gmail.nossr50.util.Misc;
import com.gmail.nossr50.util.player.UserManager;
import com.gmail.nossr50.util.skills.SkillUtils;
@@ -11,22 +14,27 @@ public class SkillMonitorTask implements Runnable {
public void run() {
long curTime = System.currentTimeMillis();
for (McMMOPlayer mcMMOPlayer : UserManager.getPlayers().values()) {
/*
* MONITOR SKILLS
*/
for (SkillType skill : SkillType.values()) {
if (skill.getTool() != null && skill.getAbility() != null) {
SkillUtils.monitorSkill(mcMMOPlayer, curTime, skill);
}
for (Player player : mcMMO.p.getServer().getOnlinePlayers()) {
if (Misc.isNPCEntity(player)) {
continue;
}
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
/*
* COOLDOWN MONITORING
* MONITOR SKILLS & COOLDOWN
*/
for (AbilityType ability : AbilityType.values()) {
if (ability.getCooldown() > 0) {
SkillUtils.watchCooldown(mcMMOPlayer, ability);
for (SkillType skill : SkillType.values()) {
if (skill.getAbilityType() == null) {
continue;
}
if (skill.getToolType() != null) {
SkillUtils.monitorSkill(mcMMOPlayer, curTime, skill);
}
if (skill.getAbilityType().getCooldown() > 0) {
SkillUtils.watchCooldown(mcMMOPlayer, skill);
}
}
}

View File

@@ -0,0 +1,46 @@
package com.gmail.nossr50.runnables.skills.herbalism;
import org.bukkit.CropState;
import org.bukkit.block.BlockState;
import org.bukkit.material.CocoaPlant;
import org.bukkit.material.CocoaPlant.CocoaPlantSize;
public class GreenTerraTimerTask implements Runnable {
private BlockState blockState;
/**
* Convert plants affected by the Green Terra ability.
*
* @param blockState The {@link BlockState} to check ability activation for
*/
public GreenTerraTimerTask(BlockState blockState) {
this.blockState = blockState;
}
@Override
public void run() {
switch (blockState.getType()) {
case CROPS:
case CARROT:
case POTATO:
blockState.setRawData(CropState.MEDIUM.getData());
blockState.update(true);
return;
case NETHER_WARTS:
blockState.setRawData((byte) 0x2);
blockState.update(true);
return;
case COCOA:
CocoaPlant plant = (CocoaPlant) blockState.getData();
plant.setSize(CocoaPlantSize.MEDIUM);
blockState.setData(plant);
blockState.update(true);
return;
default:
return;
}
}
}

View File

@@ -0,0 +1,66 @@
package com.gmail.nossr50.runnables.skills.herbalism;
import org.bukkit.block.BlockState;
import org.bukkit.material.CocoaPlant;
import org.bukkit.material.CocoaPlant.CocoaPlantSize;
import com.gmail.nossr50.skills.herbalism.Herbalism;
public class GreenThumbTimerTask implements Runnable {
private BlockState blockState;
private int skillLevel;
/**
* Convert plants affected by the Green Thumb ability.
*
* @param blockState The {@link BlockState} to check ability activation for
* @param skillLevel The player's Herbalism skill level
*/
public GreenThumbTimerTask(BlockState blockState, int skillLevel) {
this.blockState = blockState;
this.skillLevel = skillLevel;
}
@Override
public void run() {
int greenThumbStage = Math.min(Math.min(skillLevel, Herbalism.greenThumbStageMaxLevel) / Herbalism.greenThumbStageChangeLevel, 4);
switch (blockState.getType()) {
case CROPS:
case CARROT:
case POTATO:
blockState.setRawData((byte) greenThumbStage);
blockState.update(true);
return;
case NETHER_WARTS:
if (greenThumbStage > 2) {
blockState.setRawData((byte) 0x2);
}
else if (greenThumbStage == 2) {
blockState.setRawData((byte) 0x1);
}
else {
blockState.setRawData((byte) 0x0);
}
blockState.update(true);
return;
case COCOA:
CocoaPlant plant = (CocoaPlant) blockState.getData();
if (greenThumbStage > 1) {
plant.setSize(CocoaPlantSize.MEDIUM);
}
else {
plant.setSize(CocoaPlantSize.SMALL);
}
blockState.setData(plant);
blockState.update(true);
return;
default:
return;
}
}
}

View File

@@ -4,13 +4,17 @@ import org.bukkit.entity.Player;
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.datatypes.player.PlayerProfile;
import com.gmail.nossr50.datatypes.skills.Ability;
import com.gmail.nossr50.datatypes.skills.SkillType;
import com.gmail.nossr50.datatypes.skills.Tool;
import com.gmail.nossr50.util.skills.PerksUtils;
public abstract class SkillManager {
protected McMMOPlayer mcMMOPlayer;
protected int activationChance;
protected SkillType skill;
protected Ability ability = new Ability();
protected Tool tool; // Because tool can be shared, it's instanced in McMMOPlayer
public SkillManager(McMMOPlayer mcMMOPlayer, SkillType skill) {
this.mcMMOPlayer = mcMMOPlayer;
@@ -41,4 +45,16 @@ public abstract class SkillManager {
public void applyXpGain(int xp) {
mcMMOPlayer.beginXpGain(skill, xp);
}
public Ability getAbility() {
return ability;
}
public Tool getTool() {
return tool;
}
public void setTool(Tool tool) {
this.tool = tool;
}
}

View File

@@ -11,7 +11,6 @@ import com.gmail.nossr50.locale.LocaleLoader;
import com.gmail.nossr50.skills.SkillManager;
import com.gmail.nossr50.util.Misc;
import com.gmail.nossr50.util.Permissions;
import com.gmail.nossr50.util.skills.CombatUtils;
import com.gmail.nossr50.util.skills.ParticleEffectUtils;
import com.gmail.nossr50.util.skills.SkillUtils;
@@ -28,11 +27,12 @@ public class AcrobaticsManager extends SkillManager {
public boolean canDodge(Entity damager) {
if (Permissions.dodge(getPlayer())) {
if (damager instanceof LightningStrike && Acrobatics.dodgeLightningDisabled) {
return false;
if (damager instanceof Player && SkillType.ACROBATICS.getPVPEnabled()) {
return true;
}
else if (!(damager instanceof Player) && SkillType.ACROBATICS.getPVEEnabled() && !(damager instanceof LightningStrike && Acrobatics.dodgeLightningDisabled)) {
return true;
}
return CombatUtils.shouldProcessSkill(damager, skill);
}
return false;
@@ -48,7 +48,7 @@ public class AcrobaticsManager extends SkillManager {
int modifiedDamage = Acrobatics.calculateModifiedDodgeDamage(damage, Acrobatics.dodgeDamageModifier);
Player player = getPlayer();
if (!isFatal(modifiedDamage) && SkillUtils.activationSuccessful(getSkillLevel(), getActivationChance(), Acrobatics.dodgeMaxChance, Acrobatics.dodgeMaxBonusLevel)) {
if (!isFatal(modifiedDamage) && SkillUtils.activationSuccessful(player, skill, Acrobatics.dodgeMaxChance, Acrobatics.dodgeMaxBonusLevel)) {
ParticleEffectUtils.playDodgeEffect(player);
if (mcMMOPlayer.useChatNotifications()) {

View File

@@ -26,7 +26,9 @@ public class ArcheryManager extends SkillManager {
}
public boolean canSkillShot() {
return getSkillLevel() >= Archery.skillShotIncreaseLevel && Permissions.bonusDamage(getPlayer(), skill);
Player player = getPlayer();
return SkillUtils.unlockLevelReached(player, skill, Archery.skillShotIncreaseLevel) && Permissions.bonusDamage(player, skill);
}
public boolean canTrackArrows() {
@@ -45,7 +47,7 @@ public class ArcheryManager extends SkillManager {
Location shooterLocation = player.getLocation();
Location targetLocation = target.getLocation();
if (shooterLocation.getWorld() != targetLocation.getWorld()) {
if (!shooterLocation.getWorld().equals(targetLocation.getWorld())) {
return;
}
@@ -62,7 +64,7 @@ public class ArcheryManager extends SkillManager {
* @param target The {@link LivingEntity} damaged by the arrow
*/
public void trackArrows(LivingEntity target) {
if (SkillUtils.activationSuccessful(getSkillLevel(), getActivationChance(), Archery.retrieveMaxChance, Archery.retrieveMaxBonusLevel)) {
if (SkillUtils.activationSuccessful(getPlayer(), skill, Archery.retrieveMaxChance, Archery.retrieveMaxBonusLevel)) {
Archery.incrementTrackerValue(target);
}
}
@@ -70,12 +72,14 @@ public class ArcheryManager extends SkillManager {
/**
* Handle the effects of the Daze ability
*
* @param defender The {@link Player} being affected by the ability
* @param defender The player being affected by the ability
* @param damage The amount of damage initially dealt by the event
* @return the modified event damage if the ability was successful, the original event damage otherwise
*/
public int dazeCheck(Player defender, int damage) {
if (SkillUtils.activationSuccessful(getSkillLevel(), getActivationChance(), Archery.dazeMaxBonus, Archery.dazeMaxBonusLevel)) {
Player attacker = getPlayer();
if (SkillUtils.activationSuccessful(attacker, skill, Archery.dazeMaxBonus, Archery.dazeMaxBonusLevel)) {
Location dazedLocation = defender.getLocation();
dazedLocation.setPitch(90 - Misc.getRandom().nextInt(181));
@@ -87,7 +91,7 @@ public class ArcheryManager extends SkillManager {
}
if (mcMMOPlayer.useChatNotifications()) {
getPlayer().sendMessage(LocaleLoader.getString("Combat.TargetDazed"));
attacker.sendMessage(LocaleLoader.getString("Combat.TargetDazed"));
}
return damage + Archery.dazeModifier;

View File

@@ -6,13 +6,10 @@ import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.datatypes.skills.AbilityType;
import com.gmail.nossr50.datatypes.skills.SkillType;
import com.gmail.nossr50.datatypes.skills.ToolType;
import com.gmail.nossr50.locale.LocaleLoader;
import com.gmail.nossr50.skills.SkillManager;
import com.gmail.nossr50.util.ItemUtils;
import com.gmail.nossr50.util.Misc;
import com.gmail.nossr50.util.ModUtils;
import com.gmail.nossr50.util.Permissions;
import com.gmail.nossr50.util.player.UserManager;
@@ -42,11 +39,11 @@ public class AxesManager extends SkillManager {
}
public boolean canUseSkullSplitter(LivingEntity target) {
return target.isValid() && mcMMOPlayer.getAbilityMode(AbilityType.SKULL_SPLITTER) && Permissions.skullSplitter(getPlayer());
return target.isValid() && getAbility().getMode() && Permissions.skullSplitter(getPlayer());
}
public boolean canActivateAbility() {
return mcMMOPlayer.getToolPreparationMode(ToolType.AXE) && Permissions.skullSplitter(getPlayer());
return tool.getPreparationMode() && Permissions.skullSplitter(getPlayer());
}
/**
@@ -69,8 +66,10 @@ public class AxesManager extends SkillManager {
* @return the modified event damage if the ability was successful, the original event damage otherwise
*/
public int criticalHitCheck(LivingEntity target, int damage) {
if (SkillUtils.activationSuccessful(getSkillLevel(), getActivationChance(), Axes.criticalHitMaxChance, Axes.criticalHitMaxBonusLevel)) {
getPlayer().sendMessage(LocaleLoader.getString("Axes.Combat.CriticalHit"));
Player player = getPlayer();
if (SkillUtils.activationSuccessful(player, skill, Axes.criticalHitMaxChance, Axes.criticalHitMaxBonusLevel)) {
player.sendMessage(LocaleLoader.getString("Axes.Combat.CriticalHit"));
if (target instanceof Player) {
((Player) target).sendMessage(LocaleLoader.getString("Axes.Combat.CritStruck"));
@@ -93,11 +92,10 @@ public class AxesManager extends SkillManager {
int durabilityDamage = 1 + (getSkillLevel() / Axes.impactIncreaseLevel);
for (ItemStack armor : target.getEquipment().getArmorContents()) {
if (ItemUtils.isArmor(armor) && Axes.impactChance > Misc.getRandom().nextInt(getActivationChance())) {
if (ItemUtils.isArmor(armor) && SkillUtils.activationSuccessful(getPlayer(), skill, Axes.impactChance)) {
double durabilityModifier = 1 / (armor.getEnchantmentLevel(Enchantment.DURABILITY) + 1); // Modifier to simulate the durability enchantment behavior
double modifiedDurabilityDamage = durabilityDamage * durabilityModifier;
short maxDurability = ModUtils.isCustomArmor(armor) ? ModUtils.getArmorFromItemStack(armor).getDurability() : armor.getType().getMaxDurability();
double maxDurabilityDamage = maxDurability * Axes.impactMaxDurabilityModifier;
double maxDurabilityDamage = (ModUtils.isCustomArmor(armor) ? ModUtils.getArmorFromItemStack(armor).getDurability() : armor.getType().getMaxDurability()) * Axes.impactMaxDurabilityModifier;
armor.setDurability((short) (Math.min(modifiedDurabilityDamage, maxDurabilityDamage) + armor.getDurability()));
}
@@ -112,9 +110,9 @@ public class AxesManager extends SkillManager {
* @return the modified event damage if the ability was successful, the original event damage otherwise
*/
public int greaterImpactCheck(LivingEntity target, int damage) {
if (Axes.greaterImpactChance > Misc.getRandom().nextInt(getActivationChance())) {
Player player = getPlayer();
Player player = getPlayer();
if (SkillUtils.activationSuccessful(player, skill, Axes.greaterImpactChance)) {
ParticleEffectUtils.playGreaterImpactEffect(target);
target.setVelocity(player.getLocation().getDirection().normalize().multiply(Axes.greaterImpactKnockbackMultiplier));

View File

@@ -38,7 +38,9 @@ public class FishingManager extends SkillManager {
}
public boolean canShake(Entity target) {
return target instanceof LivingEntity && getSkillLevel() >= AdvancedConfig.getInstance().getShakeUnlockLevel() && Permissions.shake(getPlayer());
Player player = getPlayer();
return target instanceof LivingEntity && SkillUtils.unlockLevelReached(player, skill, AdvancedConfig.getInstance().getShakeUnlockLevel()) && Permissions.shake(player);
}
/**
@@ -134,7 +136,7 @@ public class FishingManager extends SkillManager {
* @param mob The {@link LivingEntity} affected by the ability
*/
public void shakeCheck(LivingEntity target) {
if (getShakeProbability() > Misc.getRandom().nextInt(getActivationChance())) {
if (SkillUtils.activationSuccessful(getPlayer(), skill, getShakeProbability())) {
Map<ItemStack, Integer> possibleDrops = new HashMap<ItemStack, Integer>();
Fishing.findPossibleDrops(target, possibleDrops);
@@ -217,7 +219,7 @@ public class FishingManager extends SkillManager {
FishingTreasure treasure = rewards.get(Misc.getRandom().nextInt(rewards.size()));
ItemStack treasureDrop = treasure.getDrop();
if (!SkillUtils.treasureDropSuccessful(treasure.getDropChance(), activationChance)) {
if (!SkillUtils.treasureDropSuccessful(treasure.getDropChance(), skillLevel)) {
return null;
}

View File

@@ -63,20 +63,24 @@ public class Herbalism {
protected static int calculateCatciAndSugarDrops(BlockState blockState) {
Block block = blockState.getBlock();
Material blockType = blockState.getType();
int dropAmount = mcMMO.placeStore.isTrue(block) ? 0 : 1;
int dropAmount = 0;
// Handle the original block
if (!mcMMO.placeStore.isTrue(blockState)) {
dropAmount++;
}
// Handle the two blocks above it - cacti & sugar cane can only grow 3 high naturally
for (int y = 1; y < 3; y++) {
Block relativeBlock = block.getRelative(BlockFace.UP, y);
Material relativeBlockType = relativeBlock.getType();
if (relativeBlock.getType() != blockType) {
// If the first one is air, so is the next one
if (relativeBlockType == Material.AIR) {
break;
}
if (mcMMO.placeStore.isTrue(relativeBlock)) {
mcMMO.placeStore.setFalse(relativeBlock);
}
else {
if (relativeBlockType == blockType && !mcMMO.placeStore.isTrue(relativeBlock)) {
dropAmount++;
}
}

View File

@@ -3,28 +3,26 @@ package com.gmail.nossr50.skills.herbalism;
import java.util.ArrayList;
import java.util.List;
import org.bukkit.CropState;
import org.bukkit.Location;
import org.bukkit.Material;
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 com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.config.Config;
import com.gmail.nossr50.config.treasure.TreasureConfig;
import com.gmail.nossr50.datatypes.mods.CustomBlock;
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.datatypes.skills.AbilityType;
import com.gmail.nossr50.datatypes.skills.SkillType;
import com.gmail.nossr50.datatypes.skills.ToolType;
import com.gmail.nossr50.datatypes.treasure.HylianTreasure;
import com.gmail.nossr50.locale.LocaleLoader;
import com.gmail.nossr50.runnables.skills.HerbalismBlockUpdaterTask;
import com.gmail.nossr50.runnables.skills.herbalism.GreenTerraTimerTask;
import com.gmail.nossr50.runnables.skills.herbalism.GreenThumbTimerTask;
import com.gmail.nossr50.skills.SkillManager;
import com.gmail.nossr50.util.BlockUtils;
import com.gmail.nossr50.util.ItemUtils;
import com.gmail.nossr50.util.Misc;
import com.gmail.nossr50.util.ModUtils;
import com.gmail.nossr50.util.Permissions;
@@ -54,19 +52,21 @@ public class HerbalismManager extends SkillManager {
}
public boolean canUseHylianLuck() {
return Permissions.hylianLuck(getPlayer());
Player player = getPlayer();
return ItemUtils.isSword(player.getItemInHand()) && Permissions.hylianLuck(player);
}
public boolean canGreenTerraBlock(BlockState blockState) {
return mcMMOPlayer.getAbilityMode(AbilityType.GREEN_TERRA) && BlockUtils.canMakeMossy(blockState);
return getAbility().getMode() && BlockUtils.canMakeMossy(blockState);
}
public boolean canActivateAbility() {
return mcMMOPlayer.getToolPreparationMode(ToolType.HOE) && Permissions.greenTerra(getPlayer());
return tool.getPreparationMode() && Permissions.greenTerra(getPlayer());
}
public boolean canGreenTerraPlant() {
return mcMMOPlayer.getAbilityMode(AbilityType.GREEN_TERRA);
return getAbility().getMode();
}
/**
@@ -77,7 +77,7 @@ public class HerbalismManager extends SkillManager {
* @return the modified change in hunger for the event
*/
public int farmersDiet(int rankChange, int eventFoodLevel) {
return SkillUtils.handleFoodSkills(getPlayer(), skill, eventFoodLevel, Herbalism.farmersDietRankLevel1, Herbalism.farmersDietMaxLevel, rankChange);
return SkillUtils.handleFoodSkills(getPlayer(), SkillType.HERBALISM, eventFoodLevel, Herbalism.farmersDietRankLevel1, Herbalism.farmersDietMaxLevel, rankChange);
}
/**
@@ -108,63 +108,65 @@ public class HerbalismManager extends SkillManager {
}
/**
*
* Process double drops & XP gain for Herbalism.
*
* @param blockState The {@link BlockState} to check ability activation for
* @return true if the ability was successful, false otherwise
*/
public void herbalismBlockCheck(BlockState blockState) {
Material material = blockState.getType();
boolean oneBlockPlant = (material == Material.CACTUS || material == Material.SUGAR_CANE_BLOCK) ? false : true;
Player player = getPlayer();
Material blockType = blockState.getType();
if (oneBlockPlant && mcMMO.placeStore.isTrue(blockState)) {
return;
}
HerbalismBlock herbalismBlock = HerbalismBlock.getHerbalismBlock(blockType);
CustomBlock customBlock = null;
HerbalismBlock herbalismBlock = HerbalismBlock.getHerbalismBlock(material);
ItemStack drop = null;
int amount = 1;
int xp = 0;
boolean greenTerra = mcMMOPlayer.getAbilityMode(skill.getAbility());
int dropAmount = 1;
ItemStack dropItem = null;
if (herbalismBlock != null) {
if (herbalismBlock.hasGreenThumbPermission(getPlayer())) {
processGreenThumbPlants(blockState, greenTerra);
if (blockType == Material.CACTUS || blockType == Material.SUGAR_CANE_BLOCK) {
dropItem = herbalismBlock.getDropItem();
dropAmount = Herbalism.calculateCatciAndSugarDrops(blockState);
xp = herbalismBlock.getXpGain() * dropAmount;
}
xp = herbalismBlock.getXpGain();
if (herbalismBlock.canDoubleDrop() && Permissions.doubleDrops(getPlayer(), skill)) {
drop = herbalismBlock.getDropItem();
else if (herbalismBlock.hasGreenThumbPermission(player)) {
dropItem = herbalismBlock.getDropItem();
xp = herbalismBlock.getXpGain();
processGreenThumbPlants(blockState);
}
if (!oneBlockPlant) {
amount = Herbalism.calculateCatciAndSugarDrops(blockState);
xp *= amount;
else {
if (!mcMMO.placeStore.isTrue(blockState)) {
dropItem = herbalismBlock.getDropItem();
xp = herbalismBlock.getXpGain();
}
}
}
else {
CustomBlock customBlock = ModUtils.getCustomBlock(blockState);
customBlock = ModUtils.getCustomBlock(blockState);
dropItem = customBlock.getItemDrop();
xp = customBlock.getXpGain();
}
if (Permissions.doubleDrops(getPlayer(), skill)) {
if (Permissions.doubleDrops(player, skill) && SkillUtils.activationSuccessful(player, skill, Herbalism.doubleDropsMaxChance, Herbalism.doubleDropsMaxLevel)) {
Location location = blockState.getLocation();
if (dropItem != null && herbalismBlock != null && herbalismBlock.canDoubleDrop()) {
Misc.dropItems(location, dropItem, dropAmount);
}
else if (customBlock != null) {
int minimumDropAmount = customBlock.getMinimumDropAmount();
int maximumDropAmount = customBlock.getMaximumDropAmount();
drop = customBlock.getItemDrop();
amount = Misc.getRandom().nextInt(maximumDropAmount - minimumDropAmount + 1) + minimumDropAmount;
if (minimumDropAmount != maximumDropAmount) {
Misc.randomDropItems(location, dropItem, maximumDropAmount - minimumDropAmount);
}
Misc.dropItems(location, dropItem, minimumDropAmount);
}
}
applyXpGain(xp);
if (drop == null) {
return;
}
for (int i = greenTerra ? 2 : 1; i != 0; i--) {
if (SkillUtils.activationSuccessful(getSkillLevel(), getActivationChance(), Herbalism.doubleDropsMaxChance, Herbalism.doubleDropsMaxLevel)) {
Misc.dropItems(blockState.getLocation(), drop, amount);
}
}
}
/**
@@ -174,8 +176,10 @@ public class HerbalismManager extends SkillManager {
* @return true if the ability was successful, false otherwise
*/
public boolean processGreenThumbBlocks(BlockState blockState) {
if (!SkillUtils.activationSuccessful(getSkillLevel(), getActivationChance(), Herbalism.greenThumbMaxChance, Herbalism.greenThumbMaxLevel)) {
getPlayer().sendMessage(LocaleLoader.getString("Herbalism.Ability.GTh.Fail"));
Player player = getPlayer();
if (!SkillUtils.activationSuccessful(player, skill, Herbalism.greenThumbMaxChance, Herbalism.greenThumbMaxLevel)) {
player.sendMessage(LocaleLoader.getString("Herbalism.Ability.GTh.Fail"));
return false;
}
@@ -189,7 +193,9 @@ public class HerbalismManager extends SkillManager {
* @return true if the ability was successful, false otherwise
*/
public boolean processHylianLuck(BlockState blockState) {
if (!SkillUtils.activationSuccessful(getSkillLevel(), getActivationChance(), Herbalism.hylianLuckMaxChance, Herbalism.hylianLuckMaxLevel)) {
Player player = getPlayer();
if (!SkillUtils.activationSuccessful(player, skill, Herbalism.hylianLuckMaxChance, Herbalism.hylianLuckMaxLevel)) {
return false;
}
@@ -228,7 +234,7 @@ public class HerbalismManager extends SkillManager {
blockState.setType(Material.AIR);
Misc.dropItem(blockState.getLocation(), treasures.get(Misc.getRandom().nextInt(treasures.size())).getDrop());
getPlayer().sendMessage(LocaleLoader.getString("Herbalism.HylianLuck"));
player.sendMessage(LocaleLoader.getString("Herbalism.HylianLuck"));
return true;
}
@@ -256,7 +262,7 @@ public class HerbalismManager extends SkillManager {
playerInventory.removeItem(new ItemStack(Material.RED_MUSHROOM));
player.updateInventory();
if (!SkillUtils.activationSuccessful(getSkillLevel(), getActivationChance(), Herbalism.shroomThumbMaxChance, Herbalism.shroomThumbMaxLevel)) {
if (!SkillUtils.activationSuccessful(player, skill, Herbalism.shroomThumbMaxChance, Herbalism.shroomThumbMaxLevel)) {
player.sendMessage(LocaleLoader.getString("Herbalism.Ability.ShroomThumb.Fail"));
return false;
}
@@ -268,82 +274,29 @@ public class HerbalismManager extends SkillManager {
* Process the Green Thumb ability for plants.
*
* @param blockState The {@link BlockState} to check ability activation for
* @param greenTerra
*/
private void processGreenThumbPlants(BlockState blockState, boolean greenTerra) {
private void processGreenThumbPlants(BlockState blockState) {
Player player = getPlayer();
PlayerInventory playerInventory = player.getInventory();
ItemStack seed = (blockState.getType() == Material.CROPS) ? new ItemStack(Material.SEEDS) : HerbalismBlock.getHerbalismBlock(blockState.getType()).getDropItem();
ItemStack seed = HerbalismBlock.getHerbalismBlock(blockState.getType()).getDropItem();
if (!playerInventory.containsAtLeast(seed, 1)) {
return;
}
if (!greenTerra && !SkillUtils.activationSuccessful(getSkillLevel(), getActivationChance(), Herbalism.greenThumbMaxChance, Herbalism.greenThumbMaxLevel)) {
if (getAbility().getMode()) {
playerInventory.removeItem(seed);
player.updateInventory(); // Needed until replacement available
mcMMO.p.getServer().getScheduler().scheduleSyncDelayedTask(mcMMO.p, new GreenTerraTimerTask(blockState), 0);
return;
}
else if (SkillUtils.activationSuccessful(player, skill, Herbalism.greenThumbMaxChance, Herbalism.greenThumbMaxLevel)) {
playerInventory.removeItem(seed);
player.updateInventory(); // Needed until replacement available
if (!handleBlockState(blockState, greenTerra)) {
mcMMO.p.getServer().getScheduler().scheduleSyncDelayedTask(mcMMO.p, new GreenThumbTimerTask(blockState, getSkillLevel()), 0);
return;
}
playerInventory.removeItem(seed);
player.updateInventory(); // Needed until replacement available
mcMMO.p.getServer().getScheduler().runTaskLater(mcMMO.p, new HerbalismBlockUpdaterTask(blockState), 0);
}
private boolean handleBlockState(BlockState blockState, boolean greenTerra) {
switch (blockState.getType()) {
case CROPS:
case CARROT:
case POTATO:
if (greenTerra) {
blockState.setRawData(CropState.MEDIUM.getData()); // 2
}
else {
blockState.setRawData(getGreenThumbStage());
}
return true;
case NETHER_WARTS:
if (greenTerra) {
blockState.setRawData((byte) 2);
}
else {
int greenThumbStage = getGreenThumbStage();
if (greenThumbStage > 2) {
blockState.setRawData((byte) 2);
}
else if (greenThumbStage == 2) {
blockState.setRawData((byte) 1);
}
else {
blockState.setRawData((byte) 0);
}
}
return true;
case COCOA:
CocoaPlant plant = (CocoaPlant) blockState.getData();
if (greenTerra || getGreenThumbStage() > 1) {
plant.setSize(CocoaPlantSize.MEDIUM);
}
else {
plant.setSize(CocoaPlantSize.SMALL);
}
return true;
default:
return false;
}
}
private byte getGreenThumbStage() {
return (byte) Math.min(Math.min(getProfile().getSkillLevel(skill), Herbalism.greenThumbStageMaxLevel) / Herbalism.greenThumbStageChangeLevel, 4);
}
}

View File

@@ -43,6 +43,10 @@ public class Mining {
protected static void handleSilkTouchDrops(BlockState blockState) {
Material blockType = blockState.getType();
if (blockType != Material.GLOWING_REDSTONE_ORE && !Config.getInstance().getDoubleDropsEnabled(SkillType.MINING, blockType)) {
return;
}
switch (blockType) {
case ENDER_STONE:
case GOLD_ORE:
@@ -72,7 +76,7 @@ public class Mining {
default:
if (ModUtils.isCustomMiningBlock(blockState)) {
Misc.dropItem(blockState.getLocation(), blockState.getData().toItemStack(1));
Misc.dropItem(blockState.getLocation(), blockState.getData().toItemStack());
}
return;
}
@@ -85,7 +89,13 @@ public class Mining {
*/
protected static void handleMiningDrops(BlockState blockState) {
Material blockType = blockState.getType();
if (blockType != Material.GLOWING_REDSTONE_ORE && !Config.getInstance().getDoubleDropsEnabled(SkillType.MINING, blockType)) {
return;
}
Location location = blockState.getLocation();
ItemStack dropItem;
switch (blockType) {
case COAL_ORE:
@@ -120,7 +130,7 @@ public class Mining {
int minimumDropAmount = customBlock.getMinimumDropAmount();
int maximumDropAmount = customBlock.getMaximumDropAmount();
ItemStack dropItem = customBlock.getItemDrop();
dropItem = customBlock.getItemDrop();
if (minimumDropAmount != maximumDropAmount) {
Misc.dropItems(location, dropItem, minimumDropAmount);

View File

@@ -12,7 +12,6 @@ import org.bukkit.entity.Player;
import org.bukkit.entity.TNTPrimed;
import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.config.Config;
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.datatypes.player.PlayerProfile;
import com.gmail.nossr50.datatypes.skills.AbilityType;
@@ -31,55 +30,47 @@ public class MiningManager extends SkillManager{
}
public boolean canUseDemolitionsExpertise() {
return getSkillLevel() >= BlastMining.Tier.FOUR.getLevel() && Permissions.demolitionsExpertise(getPlayer());
Player player = getPlayer();
return SkillUtils.unlockLevelReached(player, skill, BlastMining.Tier.FOUR.getLevel()) && Permissions.demolitionsExpertise(player);
}
public boolean canDetonate() {
Player player = getPlayer();
return canUseBlastMining() && player.isSneaking() && player.getItemInHand().getTypeId() == BlastMining.detonatorID && Permissions.remoteDetonation(player);
return player.isSneaking() && player.getItemInHand().getTypeId() == BlastMining.detonatorID && Permissions.remoteDetonation(player) && SkillUtils.unlockLevelReached(player, skill, BlastMining.Tier.ONE.getLevel());
}
public boolean canUseBlastMining() {
return getSkillLevel() >= BlastMining.Tier.ONE.getLevel();
return SkillUtils.unlockLevelReached(getPlayer(), skill, BlastMining.Tier.ONE.getLevel());
}
public boolean canUseBiggerBombs() {
return getSkillLevel() >= BlastMining.Tier.TWO.getLevel() && Permissions.biggerBombs(getPlayer());
Player player = getPlayer();
return Permissions.biggerBombs(player) && SkillUtils.unlockLevelReached(getPlayer(), skill, BlastMining.Tier.TWO.getLevel());
}
/**
* Process double drops & XP gain for Mining.
*
* @param blockState The {@link BlockState} to check ability activation for
* @param player The {@link Player} using this ability
*/
public void miningBlockCheck(BlockState blockState) {
Player player = getPlayer();
int xp = Mining.getBlockXp(blockState);
applyXpGain(Mining.getBlockXp(blockState));
if (Permissions.doubleDrops(player, skill)) {
return;
}
Material material = blockState.getType();
if (material != Material.GLOWING_REDSTONE_ORE && !Config.getInstance().getDoubleDropsEnabled(skill, material)) {
return;
}
boolean silkTouch = player.getItemInHand().containsEnchantment(Enchantment.SILK_TOUCH);
for (int i = mcMMOPlayer.getAbilityMode(skill.getAbility()) ? 2 : 1; i != 0; i--) {
if (SkillUtils.activationSuccessful(getSkillLevel(), getActivationChance(), Mining.doubleDropsMaxChance, Mining.doubleDropsMaxLevel)) {
if (silkTouch) {
Mining.handleSilkTouchDrops(blockState);
}
else {
Mining.handleMiningDrops(blockState);
}
if (Permissions.doubleDrops(player, skill) && SkillUtils.activationSuccessful(player, skill, Mining.doubleDropsMaxChance, Mining.doubleDropsMaxLevel)) {
if (player.getItemInHand().containsEnchantment(Enchantment.SILK_TOUCH)) {
Mining.handleSilkTouchDrops(blockState);
}
else {
Mining.handleMiningDrops(blockState);
}
}
applyXpGain(xp);
}
/**
@@ -106,7 +97,7 @@ public class MiningManager extends SkillManager{
targetBlock.setType(Material.AIR);
getProfile().setSkillDATS(AbilityType.BLAST_MINING, System.currentTimeMillis());
mcMMOPlayer.setAbilityInformed(AbilityType.BLAST_MINING, false);
getAbility().setInformed(false);
}
/**
@@ -142,10 +133,11 @@ public class MiningManager extends SkillManager{
xp += Mining.getBlockXp(blockState);
}
Misc.dropItem(blockState.getLocation(), blockState.getData().toItemStack(1)); // Initial block that would have been dropped
Misc.dropItem(blockState.getLocation(), blockState.getData().toItemStack()); // Initial block that would have been dropped
if (!mcMMO.placeStore.isTrue(blockState)) {
for (int i = 1; i < dropMultiplier; i++) {
xp += Mining.getBlockXp(blockState);
Mining.handleSilkTouchDrops(blockState); // Bonus drops - should drop the block & not the items
}
}
@@ -155,7 +147,7 @@ public class MiningManager extends SkillManager{
if (debrisYield > 0) {
for (BlockState blockState : debris) {
if (Misc.getRandom().nextFloat() < debrisYield) {
Misc.dropItem(blockState.getLocation(), blockState.getData().toItemStack(1));
Misc.dropItem(blockState.getLocation(), blockState.getData().toItemStack());
}
}
}
@@ -173,7 +165,7 @@ public class MiningManager extends SkillManager{
}
public int processDemolitionsExpertise(int damage) {
return (int) (damage * ((100.0D - getBlastDamageModifier()) / 100.0D));
return (int) (damage * (100.0 - getBlastDamageModifier()));
}
/**

View File

@@ -1,49 +1,29 @@
package com.gmail.nossr50.skills.repair;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.PlayerInventory;
import java.util.Map;
import java.util.Map.Entry;
import org.bukkit.Material;
import org.bukkit.Sound;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.getspout.spoutapi.SpoutManager;
import org.getspout.spoutapi.player.SpoutPlayer;
import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.config.AdvancedConfig;
import com.gmail.nossr50.config.Config;
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.datatypes.player.PlayerProfile;
import com.gmail.nossr50.datatypes.skills.SkillType;
import com.gmail.nossr50.locale.LocaleLoader;
import com.gmail.nossr50.util.ItemUtils;
import com.gmail.nossr50.util.Misc;
import com.gmail.nossr50.util.Permissions;
import com.gmail.nossr50.util.player.UserManager;
import com.gmail.nossr50.util.skills.PerksUtils;
public class Repair {
// The order of the values is extremely important, a few methods depend on it to work properly
protected enum Tier {
FOUR(4) {
@Override public int getLevel() { return AdvancedConfig.getInstance().getArcaneForgingRankLevels4(); }
@Override public int getKeepEnchantChance() { return AdvancedConfig.getInstance().getArcaneForgingKeepEnchantsChanceRank4(); }
@Override public int getDowngradeEnchantChance() { return AdvancedConfig.getInstance().getArcaneForgingDowngradeChanceRank4(); }},
THREE(3) {
@Override public int getLevel() { return AdvancedConfig.getInstance().getArcaneForgingRankLevels3(); }
@Override public int getKeepEnchantChance() { return AdvancedConfig.getInstance().getArcaneForgingKeepEnchantsChanceRank3(); }
@Override public int getDowngradeEnchantChance() { return AdvancedConfig.getInstance().getArcaneForgingDowngradeChanceRank3(); }},
TWO(2) {
@Override public int getLevel() { return AdvancedConfig.getInstance().getArcaneForgingRankLevels2(); }
@Override public int getKeepEnchantChance() { return AdvancedConfig.getInstance().getArcaneForgingKeepEnchantsChanceRank2(); }
@Override public int getDowngradeEnchantChance() { return AdvancedConfig.getInstance().getArcaneForgingDowngradeChanceRank2(); }},
ONE(1) {
@Override public int getLevel() { return AdvancedConfig.getInstance().getArcaneForgingRankLevels1(); }
@Override public int getKeepEnchantChance() { return AdvancedConfig.getInstance().getArcaneForgingKeepEnchantsChanceRank1(); }
@Override public int getDowngradeEnchantChance() { return AdvancedConfig.getInstance().getArcaneForgingDowngradeChanceRank1(); }};
int numerical;
private Tier(int numerical) {
this.numerical = numerical;
}
public int toNumerical() {
return numerical;
}
abstract protected int getLevel();
abstract protected int getKeepEnchantChance();
abstract protected int getDowngradeEnchantChance();
}
public static int repairMasteryMaxBonusLevel = AdvancedConfig.getInstance().getRepairMasteryMaxLevel();
public static double repairMasteryMaxBonus = AdvancedConfig.getInstance().getRepairMasteryMaxBonus();
@@ -53,164 +33,248 @@ public class Repair {
public static boolean arcaneForgingDowngrades = AdvancedConfig.getInstance().getArcaneForgingDowngradeEnabled();
public static boolean arcaneForgingEnchantLoss = AdvancedConfig.getInstance().getArcaneForgingEnchantLossEnabled();
public static int salvageUnlockLevel = AdvancedConfig.getInstance().getSalvageUnlockLevel();
public static int salvageAnvilId = Config.getInstance().getSalvageAnvilId();
public static int repairAnvilId = Config.getInstance().getRepairAnvilId();
public static int anvilID = Config.getInstance().getRepairAnvilId();
public static boolean anvilMessagesEnabled = Config.getInstance().getRepairAnvilMessagesEnabled();
/**
* Checks if the item is salvageable.
* Get current Arcane Forging rank.
*
* @param item Item to check
* @return true if the item is salvageable, false otherwise
* @param profile The PlayerProfile of the player to get the rank for
* @return The player's current Arcane Forging rank
*/
public static boolean isSalvageable(ItemStack item) {
if (Config.getInstance().getSalvageTools() && (ItemUtils.isMinecraftTool(item) || ItemUtils.isStringTool(item) || item.getType() == Material.BUCKET)) {
return true;
public static int getArcaneForgingRank(PlayerProfile profile) {
int skillLevel = profile.getSkillLevel(SkillType.REPAIR);
if (skillLevel >= AdvancedConfig.getInstance().getArcaneForgingRankLevels4()) {
return 4;
}
if (Config.getInstance().getSalvageArmor() && ItemUtils.isMinecraftArmor(item)) {
return true;
}
return false;
}
/**
* Search the inventory for an item and return the index.
*
* @param inventory PlayerInventory to scan
* @param itemId Item id to look for
* @return index location where the item was found, or -1 if not found
*/
protected static int findInInventory(PlayerInventory inventory, int itemId) {
int location = inventory.first(itemId);
// VALIDATE
if (inventory.getItem(location).getTypeId() == itemId) {
return location;
}
return -1;
}
/**
* Search the inventory for an item and return the index.
*
* @param inventory PlayerInventory to scan
* @param itemId Item id to look for
* @param metadata Metadata to look for
* @return index location where the item was found, or -1 if not found
*/
protected static int findInInventory(PlayerInventory inventory, int itemId, byte metadata) {
int location = -1;
ItemStack[] contents = inventory.getContents();
for (int i = 0; i < contents.length; i++) {
ItemStack item = contents[i];
if (item == null) {
continue;
}
if (item.getTypeId() == itemId && item.getData().getData() == metadata) {
return i;
}
}
return location;
}
/**
* Decrease the amount of items in this slot by one
*
* @param inventory PlayerInventory to work in
* @param index Item index to decrement
*/
protected static void removeOneFrom(PlayerInventory inventory, int index) {
ItemStack item = inventory.getItem(index).clone();
item.setAmount(1);
inventory.removeItem(item);
}
protected static String[] getSpoutAnvilMessages(int blockId) {
if (blockId == repairAnvilId) {
return new String[] {LocaleLoader.getString("Repair.AnvilPlaced.Spout1"), LocaleLoader.getString("Repair.AnvilPlaced.Spout2")};
}
if (blockId == salvageAnvilId) {
return new String[] {"[mcMMO] Anvil Placed", "Right click to salvage!"};
}
return new String[] {"", ""};
}
protected static String getAnvilMessage(int blockId) {
if (blockId == repairAnvilId) {
return LocaleLoader.getString("Repair.Listener.Anvil");
}
if (blockId == salvageAnvilId) {
return LocaleLoader.getString("Repair.Listener.Anvil2");
}
return "";
}
protected static Material getSalvagedItem(ItemStack inHand) {
if (ItemUtils.isDiamondTool(inHand) || ItemUtils.isDiamondArmor(inHand)) {
return Material.DIAMOND;
}
else if (ItemUtils.isGoldTool(inHand) || ItemUtils.isGoldArmor(inHand)) {
return Material.GOLD_INGOT;
}
else if (ItemUtils.isIronTool(inHand) || ItemUtils.isIronArmor(inHand)) {
return Material.IRON_INGOT;
}
else if (ItemUtils.isStoneTool(inHand)) {
return Material.COBBLESTONE;
}
else if (ItemUtils.isWoodTool(inHand)) {
return Material.WOOD;
}
else if (ItemUtils.isLeatherArmor(inHand)) {
return Material.LEATHER;
}
else if (ItemUtils.isStringTool(inHand)) {
return Material.STRING;
}
else {
return null;
}
}
protected static int getSalvagedAmount(ItemStack inHand) {
if (ItemUtils.isPickaxe(inHand) || ItemUtils.isAxe(inHand) || inHand.getType() == Material.BOW || inHand.getType() == Material.BUCKET) {
else if (skillLevel >= AdvancedConfig.getInstance().getArcaneForgingRankLevels3()) {
return 3;
}
else if (ItemUtils.isShovel(inHand) || inHand.getType() == Material.FLINT_AND_STEEL) {
return 1;
}
else if (ItemUtils.isSword(inHand) || ItemUtils.isHoe(inHand) || inHand.getType() == Material.CARROT_STICK || inHand.getType() == Material.FISHING_ROD || inHand.getType() == Material.SHEARS) {
else if (skillLevel >= AdvancedConfig.getInstance().getArcaneForgingRankLevels2()) {
return 2;
}
else if (ItemUtils.isHelmet(inHand)) {
return 5;
}
else if (ItemUtils.isChestplate(inHand)) {
return 8;
}
else if (ItemUtils.isLeggings(inHand)) {
return 7;
}
else if (ItemUtils.isBoots(inHand)) {
return 4;
else if (skillLevel >= AdvancedConfig.getInstance().getArcaneForgingRankLevels1()) {
return 1;
}
else {
return 0;
}
}
/**
* Handles removing & downgrading enchants.
*
* @param player Player repairing the item
* @param is Item being repaired
*/
protected static void addEnchants(Player player, ItemStack is) {
if (Permissions.arcaneBypass(player)) {
player.sendMessage(LocaleLoader.getString("Repair.Arcane.Perfect"));
return;
}
Map<Enchantment, Integer> enchants = is.getEnchantments();
if (enchants.size() == 0) {
return;
}
int rank = getArcaneForgingRank(UserManager.getPlayer(player).getProfile());
if (rank == 0 || !Permissions.arcaneForging(player)) {
for (Enchantment x : enchants.keySet()) {
is.removeEnchantment(x);
}
player.sendMessage(LocaleLoader.getString("Repair.Arcane.Lost"));
return;
}
boolean downgraded = false;
for (Entry<Enchantment, Integer> enchant : enchants.entrySet()) {
Enchantment enchantment = enchant.getKey();
int activationChance = PerksUtils.handleLuckyPerks(player, SkillType.REPAIR);
if (Misc.getRandom().nextInt(activationChance) <= getEnchantChance(rank)) {
int enchantLevel = enchant.getValue();
if (arcaneForgingDowngrades && enchantLevel > 1) {
if (Misc.getRandom().nextInt(activationChance) < getDowngradeChance(rank)) {
is.addEnchantment(enchantment, --enchantLevel);
downgraded = true;
}
}
}
else {
is.removeEnchantment(enchantment);
}
}
Map<Enchantment, Integer> newEnchants = is.getEnchantments();
if (newEnchants.isEmpty()) {
player.sendMessage(LocaleLoader.getString("Repair.Arcane.Fail"));
}
else if (downgraded || newEnchants.size() < enchants.size()) {
player.sendMessage(LocaleLoader.getString("Repair.Arcane.Downgrade"));
}
else {
player.sendMessage(LocaleLoader.getString("Repair.Arcane.Perfect"));
}
}
/**
* Gets chance of keeping enchantment during repair.
*
* @param rank Arcane Forging rank
* @return The chance of keeping the enchantment
*/
public static int getEnchantChance(int rank) {
switch (rank) {
case 4:
return AdvancedConfig.getInstance().getArcaneForgingKeepEnchantsChanceRank4();
case 3:
return AdvancedConfig.getInstance().getArcaneForgingKeepEnchantsChanceRank3();
case 2:
return AdvancedConfig.getInstance().getArcaneForgingKeepEnchantsChanceRank2();
case 1:
return AdvancedConfig.getInstance().getArcaneForgingKeepEnchantsChanceRank1();
default:
return 0;
}
}
/**
* Gets chance of enchantment being downgraded during repair.
*
* @param rank Arcane Forging rank
* @return The chance of the enchantment being downgraded
*/
public static int getDowngradeChance(int rank) {
switch (rank) {
case 4:
return AdvancedConfig.getInstance().getArcaneForgingDowngradeChanceRank4();
case 3:
return AdvancedConfig.getInstance().getArcaneForgingDowngradeChanceRank3();
case 2:
return AdvancedConfig.getInstance().getArcaneForgingDowngradeChanceRank2();
case 1:
return AdvancedConfig.getInstance().getArcaneForgingDowngradeChanceRank1();
default:
return 100;
}
}
/**
* Checks for Super Repair bonus.
*
* @param player The player repairing an item
* @return true if bonus granted, false otherwise
*/
public static boolean checkPlayerProcRepair(Player player) {
int skillLevel = UserManager.getPlayer(player).getProfile().getSkillLevel(SkillType.REPAIR);
int chance = (int) ((superRepairMaxChance / superRepairMaxBonusLevel) * skillLevel);
if (skillLevel >= superRepairMaxBonusLevel) {
chance = (int) superRepairMaxChance;
}
int activationChance = PerksUtils.handleLuckyPerks(player, SkillType.REPAIR);
if (chance > Misc.getRandom().nextInt(activationChance) && Permissions.superRepair(player)) {
player.sendMessage(LocaleLoader.getString("Repair.Skills.FeltEasy"));
return true;
}
return false;
}
/**
* Handles notifications for placing an anvil.
*
* @param player The player placing the anvil
* @param anvilID The item ID of the anvil block
*/
public static void placedAnvilCheck(Player player, int anvilID) {
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
if (!mcMMOPlayer.getPlacedAnvil()) {
if (mcMMO.spoutEnabled) {
SpoutPlayer spoutPlayer = SpoutManager.getPlayer(player);
if (spoutPlayer.isSpoutCraftEnabled()) {
spoutPlayer.sendNotification(LocaleLoader.getString("Repair.AnvilPlaced.Spout1"), LocaleLoader.getString("Repair.AnvilPlaced.Spout2"), Material.getMaterial(anvilID));
}
}
else {
player.sendMessage(LocaleLoader.getString("Repair.Listener.Anvil"));
}
player.playSound(player.getLocation(), Sound.ANVIL_LAND, Misc.ANVIL_USE_VOLUME, Misc.ANVIL_USE_PITCH);
mcMMOPlayer.togglePlacedAnvil();
}
}
/**
* Handle the Xp gain for repair events.
*
* @param mcMMOPlayer Player repairing the item
* @param durabilityBefore Durability of the item before repair
* @param modify Amount to modify the durability by
*/
protected static void xpHandler(McMMOPlayer mcMMOPlayer, short durabilityBefore, short durabilityAfter, double modify) {
short dif = (short) ((durabilityBefore - durabilityAfter) * modify);
Player player = mcMMOPlayer.getPlayer();
player.playSound(player.getLocation(), Sound.ANVIL_USE, Misc.ANVIL_USE_VOLUME, Misc.ANVIL_USE_PITCH);
mcMMOPlayer.beginXpGain(SkillType.REPAIR, dif * 10);
}
/**
* Computes repair bonuses.
*
* @param player The player repairing an item
* @param skillLevel the skillLevel of the player in Repair
* @param durability The durability of the item being repaired
* @param repairAmount The base amount of durability repaired to the item
* @return The final amount of durability repaired to the item
*/
protected static short repairCalculate(Player player, int skillLevel, short durability, int repairAmount) {
float bonus;
if (skillLevel >= repairMasteryMaxBonusLevel) {
bonus = (float) (repairMasteryMaxBonus / 100F);
}
else {
bonus = (((float) skillLevel) / ((float) repairMasteryMaxBonusLevel)) * (float) ((repairMasteryMaxBonus) / 100F);
}
if (Permissions.repairMastery(player)) {
bonus = repairAmount * bonus;
repairAmount += (int) bonus;
}
if (checkPlayerProcRepair(player)) {
repairAmount = (int) (repairAmount * 2D);
}
if (repairAmount <= 0 || repairAmount > 32767) {
repairAmount = 32767;
}
durability -= repairAmount;
if (durability < 0) {
durability = 0;
}
return durability;
}
}

View File

@@ -1,350 +1,55 @@
package com.gmail.nossr50.skills.repair;
import java.util.Map;
import java.util.Map.Entry;
import java.util.List;
import org.bukkit.GameMode;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.Sound;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.PlayerInventory;
import org.getspout.spoutapi.SpoutManager;
import org.getspout.spoutapi.player.SpoutPlayer;
import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.datatypes.skills.SkillType;
import com.gmail.nossr50.events.skills.repair.McMMOPlayerRepairCheckEvent;
import com.gmail.nossr50.locale.LocaleLoader;
import com.gmail.nossr50.skills.SkillManager;
import com.gmail.nossr50.skills.repair.Repair.Tier;
import com.gmail.nossr50.util.Misc;
import com.gmail.nossr50.util.Permissions;
import com.gmail.nossr50.util.StringUtils;
import com.gmail.nossr50.util.skills.SkillUtils;
public class RepairManager extends SkillManager {
public RepairManager(McMMOPlayer mcMMOPlayer) {
super(mcMMOPlayer, SkillType.REPAIR);
}
public interface RepairManager {
/**
* Register a repairable with the RepairManager
*
* @param repairable Repairable to register
*/
public void registerRepairable(Repairable repairable);
/**
* Handles notifications for placing an anvil.
* Register a list of repairables with the RepairManager
*
* @param anvilID The item ID of the anvil block
* @param repairables List<Repairable> to register
*/
public void placedAnvilCheck(int anvilId) {
Player player = getPlayer();
if (mcMMOPlayer.getPlacedAnvil(anvilId)) {
return;
}
if (mcMMO.spoutEnabled) {
SpoutPlayer spoutPlayer = SpoutManager.getPlayer(player);
if (spoutPlayer.isSpoutCraftEnabled()) {
String[] spoutMessages = Repair.getSpoutAnvilMessages(anvilId);
spoutPlayer.sendNotification(spoutMessages[0], spoutMessages[1], Material.getMaterial(anvilId));
}
else {
player.sendMessage(Repair.getAnvilMessage(anvilId));
}
}
else {
player.sendMessage(Repair.getAnvilMessage(anvilId));
}
player.playSound(player.getLocation(), Sound.ANVIL_LAND, Misc.ANVIL_USE_VOLUME, Misc.ANVIL_USE_PITCH);
mcMMOPlayer.togglePlacedAnvil(anvilId);
}
public void handleRepair(ItemStack item) {
Player player = getPlayer();
int itemId = item.getTypeId();
Repairable repairable = mcMMO.repairableManager.getRepairable(itemId);
// Permissions checks on material and item types
if (!repairable.getRepairItemType().getPermissions(player)) {
player.sendMessage(LocaleLoader.getString("mcMMO.NoPermission"));
return;
}
if (!repairable.getRepairMaterialType().getPermissions(player)) {
player.sendMessage(LocaleLoader.getString("mcMMO.NoPermission"));
return;
}
int skillLevel = getSkillLevel();
int minimumRepairableLevel = repairable.getMinimumLevel();
// Level check
if (skillLevel < minimumRepairableLevel) {
player.sendMessage(LocaleLoader.getString("Repair.Skills.Adept", minimumRepairableLevel, StringUtils.getPrettyItemString(itemId)));
return;
}
PlayerInventory inventory = player.getInventory();
int repairMaterialId = repairable.getRepairMaterialId();
byte repairMaterialMetadata = repairable.getRepairMaterialMetadata();
// Check if they have the proper material to repair with
if (!inventory.contains(repairMaterialId)) {
String message = LocaleLoader.getString("Skills.NeedMore", StringUtils.getPrettyItemString(repairMaterialId));
if (repairMaterialMetadata != (byte) -1) {
// TODO: Do something nicer than append the metadata as a :# ?
if (Repair.findInInventory(inventory, repairMaterialId, repairMaterialMetadata) == -1) {
message += ":" + repairMaterialMetadata;
}
}
player.sendMessage(message);
return;
}
short startDurability = item.getDurability();
// Do not repair if at full durability
if (startDurability <= 0) {
player.sendMessage(LocaleLoader.getString("Repair.Skills.FullDurability"));
return;
}
// Do not repair stacked items
if (item.getAmount() != 1) {
player.sendMessage(LocaleLoader.getString("Repair.Skills.StackedItems"));
return;
}
// Clear ability buffs before trying to repair.
SkillUtils.removeAbilityBuff(item);
// Lets get down to business,
// To defeat, the huns.
int baseRepairAmount = repairable.getBaseRepairDurability(); // Did they send me daughters?
short newDurability = repairCalculate(startDurability, baseRepairAmount); // When I asked for sons?
// We're going to hold onto our repair item location
int repairItemLocation;
if (repairable.getRepairMaterialMetadata() == (byte) -1) {
repairItemLocation = Repair.findInInventory(inventory, repairMaterialId);
}
else {
// Special case for when the repairable has metadata that must be addressed
repairItemLocation = Repair.findInInventory(inventory, repairMaterialId, repairMaterialMetadata);
}
// This should never happen, but if it does we need to complain loudly about it.
if (repairItemLocation == -1) {
player.sendMessage(LocaleLoader.getString("Repair.Error"));
return;
}
// Call event
McMMOPlayerRepairCheckEvent event = new McMMOPlayerRepairCheckEvent(player, (short) (startDurability - newDurability), inventory.getItem(repairItemLocation), item);
mcMMO.p.getServer().getPluginManager().callEvent(event);
if (event.isCancelled()) {
return;
}
// Handle the enchants
if (Repair.arcaneForgingEnchantLoss) {
addEnchants(item);
}
// Remove the item
Repair.removeOneFrom(inventory, repairItemLocation);
// Give out XP like candy
applyXpGain((int) ((startDurability - newDurability) * repairable.getXpMultiplier()) * 10);
// BWONG BWONG BWONG
player.playSound(player.getLocation(), Sound.ANVIL_USE, Misc.ANVIL_USE_VOLUME, Misc.ANVIL_USE_PITCH);
// Repair the item!
item.setDurability(newDurability);
}
public void handleSalvage(Location location, ItemStack item) {
Player player = getPlayer();
if (player.getGameMode() != GameMode.SURVIVAL) {
return;
}
if (getSkillLevel() < Repair.salvageUnlockLevel) {
player.sendMessage(LocaleLoader.getString("Repair.Skills.AdeptSalvage"));
return;
}
if (item.getDurability() == 0) {
player.setItemInHand(new ItemStack(Material.AIR));
location.setY(location.getY() + 1);
Misc.dropItems(location, new ItemStack(Repair.getSalvagedItem(item)), Repair.getSalvagedAmount(item) * item.getAmount());
player.playSound(player.getLocation(), Sound.ANVIL_USE, Misc.ANVIL_USE_VOLUME, Misc.ANVIL_USE_PITCH);
player.sendMessage(LocaleLoader.getString("Repair.Skills.SalvageSuccess"));
}
else {
player.sendMessage(LocaleLoader.getString("Repair.Skills.NotFullDurability"));
}
}
public void registerRepairables(List<Repairable> repairables);
/**
* Gets the Arcane Forging rank
* Checks if an item is repairable
*
* @return the current Arcane Forging rank
* @param itemId id to check if repairable
* @return true if repairable, false if not
*/
public int getArcaneForgingRank() {
int skillLevel = getSkillLevel();
for (Tier tier : Tier.values()) {
if (skillLevel >= tier.getLevel()) {
return tier.toNumerical();
}
}
return 0;
}
public boolean isRepairable(int itemId);
/**
* Gets chance of keeping enchantment during repair.
* Checks if an item is repairable
*
* @return The chance of keeping the enchantment
* @param itemStack Item to check if repairable
* @return true if repairable, false if not
*/
public int getKeepEnchantChance() {
int skillLevel = getSkillLevel();
for (Tier tier : Tier.values()) {
if (skillLevel >= tier.getLevel()) {
return tier.getKeepEnchantChance();
}
}
return 0;
}
public boolean isRepairable(ItemStack itemStack);
/**
* Gets chance of enchantment being downgraded during repair.
* Gets the repairable with this id
*
* @return The chance of the enchantment being downgraded
* @param id Id of the repairable to look for
* @return the repairable, can be null
*/
public int getDowngradeEnchantChance() {
int skillLevel = getSkillLevel();
for (Tier tier : Tier.values()) {
if (skillLevel >= tier.getLevel()) {
return tier.getDowngradeEnchantChance();
}
}
return 100;
}
public Repairable getRepairable(int id);
/**
* Computes repair bonuses.
* Handle the repairing of this object
*
* @param durability The durability of the item being repaired
* @param repairAmount The base amount of durability repaired to the item
* @return The final amount of durability repaired to the item
* @param mcMMOPlayer Player that is repairing an item
* @param item ItemStack that is being repaired
*/
private short repairCalculate(short durability, int repairAmount) {
Player player = getPlayer();
if (Permissions.repairMastery(player)) {
double bonus = repairAmount * Math.min((((Repair.repairMasteryMaxBonus / Repair.repairMasteryMaxBonusLevel) * getSkillLevel()) / 100.0D), Repair.repairMasteryMaxBonus / 100.0D);
repairAmount += bonus;
}
if (Permissions.superRepair(player) && checkPlayerProcRepair()) {
repairAmount *= 2.0D;
}
if (repairAmount <= 0 || repairAmount > Short.MAX_VALUE) {
repairAmount = Short.MAX_VALUE;
}
return (short) Math.max(durability - repairAmount, 0);
}
/**
* Checks for Super Repair bonus.
*
* @return true if bonus granted, false otherwise
*/
private boolean checkPlayerProcRepair() {
if (SkillUtils.activationSuccessful(getSkillLevel(), getActivationChance(), Repair.superRepairMaxChance, Repair.superRepairMaxBonusLevel)) {
getPlayer().sendMessage(LocaleLoader.getString("Repair.Skills.FeltEasy"));
return true;
}
return false;
}
/**
* Handles removing & downgrading enchants.
*
* @param item Item being repaired
*/
private void addEnchants(ItemStack item) {
Player player = getPlayer();
Map<Enchantment, Integer> enchants = item.getEnchantments();
if (enchants.isEmpty()) {
return;
}
if (Permissions.arcaneBypass(player)) {
player.sendMessage(LocaleLoader.getString("Repair.Arcane.Perfect"));
return;
}
if (getArcaneForgingRank() == 0 || !Permissions.arcaneForging(player)) {
for (Enchantment enchant : enchants.keySet()) {
item.removeEnchantment(enchant);
}
player.sendMessage(LocaleLoader.getString("Repair.Arcane.Lost"));
return;
}
boolean downgraded = false;
for (Entry<Enchantment, Integer> enchant : enchants.entrySet()) {
Enchantment enchantment = enchant.getKey();
if (getKeepEnchantChance() > Misc.getRandom().nextInt(activationChance)) {
int enchantLevel = enchant.getValue();
if (Repair.arcaneForgingDowngrades && enchantLevel > 1 && getDowngradeEnchantChance() > Misc.getRandom().nextInt(activationChance)) {
item.addEnchantment(enchantment, enchantLevel - 1);
downgraded = true;
}
}
else {
item.removeEnchantment(enchantment);
}
}
Map<Enchantment, Integer> newEnchants = item.getEnchantments();
if (newEnchants.isEmpty()) {
player.sendMessage(LocaleLoader.getString("Repair.Arcane.Fail"));
}
else if (downgraded || newEnchants.size() < enchants.size()) {
player.sendMessage(LocaleLoader.getString("Repair.Arcane.Downgrade"));
}
else {
player.sendMessage(LocaleLoader.getString("Repair.Arcane.Perfect"));
}
}
public void handleRepair(McMMOPlayer mcMMOPlayer, ItemStack item);
}

View File

@@ -0,0 +1,13 @@
package com.gmail.nossr50.skills.repair;
public class RepairManagerFactory {
public static RepairManager getRepairManager() {
// TODO: Add in loading from config what type of manager we want.
return new SimpleRepairManager();
}
public static RepairManager getRepairManager(int repairablesSize) {
// TODO: Add in loading from config what type of manager we want.
return new SimpleRepairManager(repairablesSize);
}
}

View File

@@ -1,45 +0,0 @@
package com.gmail.nossr50.skills.repair;
import java.util.List;
import org.bukkit.inventory.ItemStack;
public interface RepairableManager {
/**
* Register a repairable with the RepairManager
*
* @param repairable Repairable to register
*/
public void registerRepairable(Repairable repairable);
/**
* Register a list of repairables with the RepairManager
*
* @param repairables List<Repairable> to register
*/
public void registerRepairables(List<Repairable> repairables);
/**
* Checks if an item is repairable
*
* @param itemId id to check if repairable
* @return true if repairable, false if not
*/
public boolean isRepairable(int itemId);
/**
* Checks if an item is repairable
*
* @param itemStack Item to check if repairable
* @return true if repairable, false if not
*/
public boolean isRepairable(ItemStack itemStack);
/**
* Gets the repairable with this id
*
* @param id Id of the repairable to look for
* @return the repairable, can be null
*/
public Repairable getRepairable(int id);
}

View File

@@ -1,13 +0,0 @@
package com.gmail.nossr50.skills.repair;
public class RepairableManagerFactory {
public static RepairableManager getRepairManager() {
// TODO: Add in loading from config what type of manager we want.
return new SimpleRepairableManager();
}
public static RepairableManager getRepairManager(int repairablesSize) {
// TODO: Add in loading from config what type of manager we want.
return new SimpleRepairableManager(repairablesSize);
}
}

View File

@@ -0,0 +1,152 @@
package com.gmail.nossr50.skills.repair;
import org.bukkit.GameMode;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.Sound;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.getspout.spoutapi.SpoutManager;
import org.getspout.spoutapi.player.SpoutPlayer;
import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.config.Config;
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.datatypes.skills.SkillType;
import com.gmail.nossr50.locale.LocaleLoader;
import com.gmail.nossr50.util.ItemUtils;
import com.gmail.nossr50.util.Misc;
import com.gmail.nossr50.util.player.UserManager;
public class Salvage {
public static int salvageUnlockLevel = Config.getInstance().getSalvageUnlockLevel();
public static int anvilID = Config.getInstance().getSalvageAnvilId();
public static void handleSalvage(final Player player, final Location location, final ItemStack item) {
if (!Config.getInstance().getSalvageEnabled()) {
return;
}
if (player.getGameMode() == GameMode.SURVIVAL) {
final int skillLevel = UserManager.getPlayer(player).getProfile().getSkillLevel(SkillType.REPAIR);
if (skillLevel < salvageUnlockLevel) {
player.sendMessage(LocaleLoader.getString("Repair.Skills.AdeptSalvage"));
return;
}
final float currentDurability = item.getDurability();
if (currentDurability == 0) {
player.setItemInHand(new ItemStack(Material.AIR));
location.setY(location.getY() + 1);
Misc.dropItems(location, new ItemStack(getSalvagedItem(item)), getSalvagedAmount(item));
player.playSound(player.getLocation(), Sound.ANVIL_USE, Misc.ANVIL_USE_VOLUME, Misc.ANVIL_USE_PITCH);
player.sendMessage(LocaleLoader.getString("Repair.Skills.SalvageSuccess"));
}
else {
player.sendMessage(LocaleLoader.getString("Repair.Skills.NotFullDurability"));
}
}
}
/**
* Handles notifications for placing an anvil.
*
* @param player The player placing the anvil
* @param anvilID The item ID of the anvil block
*/
public static void placedAnvilCheck(final Player player, final int anvilID) {
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
if (!mcMMOPlayer.getPlacedSalvageAnvil()) {
if (mcMMO.spoutEnabled) {
final SpoutPlayer spoutPlayer = SpoutManager.getPlayer(player);
if (spoutPlayer.isSpoutCraftEnabled()) {
spoutPlayer.sendNotification("[mcMMO] Anvil Placed", "Right click to salvage!", Material.getMaterial(anvilID));
}
}
else {
player.sendMessage(LocaleLoader.getString("Repair.Listener.Anvil2"));
}
player.playSound(player.getLocation(), Sound.ANVIL_LAND, Misc.ANVIL_USE_VOLUME, Misc.ANVIL_USE_PITCH);
mcMMOPlayer.togglePlacedSalvageAnvil();
}
}
/**
* Checks if the item is salvageable.
*
* @param is Item to check
* @return true if the item is salvageable, false otherwise
*/
public static boolean isSalvageable(final ItemStack is) {
if (Config.getInstance().getSalvageTools() && (ItemUtils.isMinecraftTool(is) || ItemUtils.isStringTool(is) || is.getType() == Material.BUCKET)) {
return true;
}
if (Config.getInstance().getSalvageArmor() && ItemUtils.isMinecraftArmor(is)) {
return true;
}
return false;
}
private static Material getSalvagedItem(final ItemStack inHand) {
if (ItemUtils.isDiamondTool(inHand) || ItemUtils.isDiamondArmor(inHand)) {
return Material.DIAMOND;
}
else if (ItemUtils.isGoldTool(inHand) || ItemUtils.isGoldArmor(inHand)) {
return Material.GOLD_INGOT;
}
else if (ItemUtils.isIronTool(inHand) || ItemUtils.isIronArmor(inHand)) {
return Material.IRON_INGOT;
}
else if (ItemUtils.isStoneTool(inHand)) {
return Material.COBBLESTONE;
}
else if (ItemUtils.isWoodTool(inHand)) {
return Material.WOOD;
}
else if (ItemUtils.isLeatherArmor(inHand)) {
return Material.LEATHER;
}
else if (ItemUtils.isStringTool(inHand)) {
return Material.STRING;
}
else {
return null;
}
}
private static int getSalvagedAmount(final ItemStack inHand) {
if (ItemUtils.isPickaxe(inHand) || ItemUtils.isAxe(inHand) || inHand.getType() == Material.BOW || inHand.getType() == Material.BUCKET) {
return 3;
}
else if (ItemUtils.isShovel(inHand) || inHand.getType() == Material.FLINT_AND_STEEL) {
return 1;
}
else if (ItemUtils.isSword(inHand) || ItemUtils.isHoe(inHand) || inHand.getType() == Material.CARROT_STICK || inHand.getType() == Material.FISHING_ROD || inHand.getType() == Material.SHEARS) {
return 2;
}
else if (ItemUtils.isHelmet(inHand)) {
return 5;
}
else if (ItemUtils.isChestplate(inHand)) {
return 8;
}
else if (ItemUtils.isLeggings(inHand)) {
return 7;
}
else if (ItemUtils.isBoots(inHand)) {
return 4;
}
else {
return 0;
}
}
}

View File

@@ -0,0 +1,214 @@
package com.gmail.nossr50.skills.repair;
import java.util.HashMap;
import java.util.List;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.PlayerInventory;
import com.gmail.nossr50.config.AdvancedConfig;
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.datatypes.skills.SkillType;
import com.gmail.nossr50.events.skills.repair.McMMOPlayerRepairCheckEvent;
import com.gmail.nossr50.locale.LocaleLoader;
import com.gmail.nossr50.util.Permissions;
import com.gmail.nossr50.util.StringUtils;
import com.gmail.nossr50.util.skills.SkillUtils;
public class SimpleRepairManager implements RepairManager {
private HashMap<Integer, Repairable> repairables;
protected SimpleRepairManager() {
this(55);
}
protected SimpleRepairManager(int repairablesSize) {
this.repairables = new HashMap<Integer, Repairable>(repairablesSize);
}
@Override
public void registerRepairable(Repairable repairable) {
Integer itemId = repairable.getItemId();
repairables.put(itemId, repairable);
}
@Override
public void registerRepairables(List<Repairable> repairables) {
for (Repairable repairable : repairables) {
registerRepairable(repairable);
}
}
@Override
public boolean isRepairable(int itemId) {
return repairables.containsKey(itemId);
}
@Override
public boolean isRepairable(ItemStack itemStack) {
return isRepairable(itemStack.getTypeId());
}
@Override
public Repairable getRepairable(int id) {
return repairables.get(id);
}
@Override
public void handleRepair(McMMOPlayer mcMMOPlayer, ItemStack item) {
Player player = mcMMOPlayer.getPlayer();
Repairable repairable = repairables.get(item.getTypeId());
// Permissions checks on material and item types
if (!repairable.getRepairItemType().getPermissions(player)) {
player.sendMessage(LocaleLoader.getString("mcMMO.NoPermission"));
return;
}
if (!repairable.getRepairMaterialType().getPermissions(player)) {
player.sendMessage(LocaleLoader.getString("mcMMO.NoPermission"));
return;
}
int skillLevel = mcMMOPlayer.getProfile().getSkillLevel(SkillType.REPAIR);
// Level check
if (skillLevel < repairable.getMinimumLevel()) {
player.sendMessage(LocaleLoader.getString("Repair.Skills.Adept", repairable.getMinimumLevel(), StringUtils.getPrettyItemString(item.getTypeId())));
return;
}
PlayerInventory inventory = player.getInventory();
// Check if they have the proper material to repair with
if (!inventory.contains(repairable.getRepairMaterialId())) {
String message = LocaleLoader.getString("Skills.NeedMore", StringUtils.getPrettyItemString(repairable.getRepairMaterialId()));
if (repairable.getRepairMaterialMetadata() != (byte) -1) {
// TODO: Do something nicer than append the metadata as a :# ?
if (findInInventory(inventory, repairable.getRepairMaterialId(), repairable.getRepairMaterialMetadata()) == -1) {
message += ":" + repairable.getRepairMaterialMetadata();
}
}
player.sendMessage(message);
return;
}
short startDurability = item.getDurability();
// Do not repair if at full durability
if (startDurability <= 0) {
player.sendMessage(LocaleLoader.getString("Repair.Skills.FullDurability"));
return;
}
// Do not repair stacked items
if (item.getAmount() != 1) {
player.sendMessage(LocaleLoader.getString("Repair.Skills.StackedItems"));
return;
}
// Clear ability buffs before trying to repair.
SkillUtils.removeAbilityBuff(item);
// Lets get down to business,
// To defeat, the huns.
int baseRepairAmount = repairable.getBaseRepairDurability(); // Did they send me daughters?
short newDurability = Repair.repairCalculate(player, skillLevel, startDurability, baseRepairAmount); // When I asked for sons?
// We're going to hold onto our repair item location
int repairItemLocation;
if (repairable.getRepairMaterialMetadata() == (byte) -1) {
repairItemLocation = findInInventory(inventory, repairable.getRepairMaterialId());
}
else {
// Special case for when the repairable has metadata that must be addressed
repairItemLocation = findInInventory(inventory, repairable.getRepairMaterialId(), repairable.getRepairMaterialMetadata());
}
// This should never happen, but if it does we need to complain loudly about it.
if (repairItemLocation == -1) {
player.sendMessage(LocaleLoader.getString("Repair.Error"));
return;
}
// Call event
McMMOPlayerRepairCheckEvent event = new McMMOPlayerRepairCheckEvent(player, (short) (startDurability - newDurability), inventory.getItem(repairItemLocation), item);
Bukkit.getServer().getPluginManager().callEvent(event);
if (event.isCancelled()) {
return;
}
// Handle the enchants
if (AdvancedConfig.getInstance().getArcaneForgingEnchantLossEnabled() && !Permissions.arcaneBypass(player)) {
// Generalize away enchantment work
Repair.addEnchants(player, item);
}
// Remove the item
removeOneFrom(inventory, repairItemLocation);
// Give out XP like candy
Repair.xpHandler(mcMMOPlayer, startDurability, newDurability, repairable.getXpMultiplier());
// Repair the item!
item.setDurability(newDurability);
}
/**
* Decrease the amount of items in this slot by one
*
* @param inventory PlayerInventory to work in
* @param index Item index to decrement
*/
private void removeOneFrom(PlayerInventory inventory, int index) {
ItemStack item = inventory.getItem(index).clone();
item.setAmount(1);
inventory.removeItem(item);
}
/**
* Search the inventory for an item and return the index.
*
* @param inventory PlayerInventory to scan
* @param itemId Item id to look for
* @return index location where the item was found, or -1 if not found
*/
private int findInInventory(PlayerInventory inventory, int itemId) {
int location = inventory.first(itemId);
// VALIDATE
if (inventory.getItem(location).getTypeId() == itemId) {
return location;
}
return -1;
}
/**
* Search the inventory for an item and return the index.
*
* @param inventory PlayerInventory to scan
* @param itemId Item id to look for
* @param metadata Metadata to look for
* @return index location where the item was found, or -1 if not found
*/
private int findInInventory(PlayerInventory inventory, int itemId, byte metadata) {
int location = -1;
for (ItemStack item : inventory.getContents()) {
if (item == null) {
continue;
}
if (item.getTypeId() == itemId && item.getData().getData() == metadata) {
return location;
}
}
return location;
}
}

View File

@@ -1,46 +0,0 @@
package com.gmail.nossr50.skills.repair;
import java.util.HashMap;
import java.util.List;
import org.bukkit.inventory.ItemStack;
public class SimpleRepairableManager implements RepairableManager {
private HashMap<Integer, Repairable> repairables;
protected SimpleRepairableManager() {
this(55);
}
protected SimpleRepairableManager(int repairablesSize) {
this.repairables = new HashMap<Integer, Repairable>(repairablesSize);
}
@Override
public void registerRepairable(Repairable repairable) {
Integer itemId = repairable.getItemId();
repairables.put(itemId, repairable);
}
@Override
public void registerRepairables(List<Repairable> repairables) {
for (Repairable repairable : repairables) {
registerRepairable(repairable);
}
}
@Override
public boolean isRepairable(int itemId) {
return repairables.containsKey(itemId);
}
@Override
public boolean isRepairable(ItemStack itemStack) {
return isRepairable(itemStack.getTypeId());
}
@Override
public Repairable getRepairable(int id) {
return repairables.get(id);
}
}

View File

@@ -3,6 +3,7 @@ package com.gmail.nossr50.skills.smelting;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.BlockState;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Player;
import org.bukkit.event.inventory.FurnaceBurnEvent;
import org.bukkit.inventory.ItemStack;
@@ -15,6 +16,7 @@ import com.gmail.nossr50.skills.SkillManager;
import com.gmail.nossr50.skills.mining.Mining;
import com.gmail.nossr50.skills.smelting.Smelting.Tier;
import com.gmail.nossr50.util.BlockUtils;
import com.gmail.nossr50.util.ItemUtils;
import com.gmail.nossr50.util.Misc;
import com.gmail.nossr50.util.Permissions;
import com.gmail.nossr50.util.skills.SkillUtils;
@@ -25,11 +27,16 @@ public class SmeltingManager extends SkillManager {
}
public boolean canUseFluxMining(BlockState blockState) {
return getSkillLevel() >= Smelting.fluxMiningUnlockLevel && BlockUtils.affectedByFluxMining(blockState) && Permissions.fluxMining(getPlayer()) && !mcMMO.placeStore.isTrue(blockState);
Player player = getPlayer();
ItemStack heldItem = player.getItemInHand();
return BlockUtils.affectedByFluxMining(blockState) && ItemUtils.isPickaxe(heldItem) && !heldItem.containsEnchantment(Enchantment.SILK_TOUCH) && Permissions.fluxMining(player) && !mcMMO.placeStore.isTrue(blockState);
}
public boolean canUseVanillaXpBoost() {
return getSkillLevel() >= Smelting.Tier.ONE.getLevel() && Permissions.vanillaXpBoost(getPlayer(), skill);
Player player = getPlayer();
return SkillUtils.unlockLevelReached(player, skill, Smelting.Tier.ONE.getLevel()) && Permissions.vanillaXpBoost(player, skill);
}
/**
@@ -41,7 +48,7 @@ public class SmeltingManager extends SkillManager {
public boolean processFluxMining(BlockState blockState) {
Player player = getPlayer();
if (Smelting.fluxMiningChance > Misc.getRandom().nextInt(getActivationChance())) {
if (SkillUtils.unlockLevelReached(player, skill, Smelting.fluxMiningUnlockLevel) && SkillUtils.activationSuccessful(player, skill, Smelting.fluxMiningChance)) {
ItemStack item = null;
switch (blockState.getType()) {
@@ -65,7 +72,7 @@ public class SmeltingManager extends SkillManager {
Misc.dropItem(location, item);
if (Permissions.doubleDrops(player, skill) && SkillUtils.activationSuccessful(getSkillLevel(), getActivationChance(), Mining.doubleDropsMaxChance, Mining.doubleDropsMaxLevel)) {
if (Permissions.doubleDrops(player, skill) && SkillUtils.activationSuccessful(player, skill, Mining.doubleDropsMaxChance, Mining.doubleDropsMaxLevel)) {
Misc.dropItem(location, item);
}
@@ -94,7 +101,7 @@ public class SmeltingManager extends SkillManager {
applyXpGain(Smelting.getResourceXp(resourceType));
if (Permissions.doubleDrops(player, skill) && SkillUtils.activationSuccessful(getSkillLevel(), getActivationChance(), Smelting.secondSmeltMaxChance, Smelting.secondSmeltMaxLevel)) {
if (Permissions.doubleDrops(player, skill) && SkillUtils.activationSuccessful(player, skill, Smelting.secondSmeltMaxChance, Smelting.secondSmeltMaxLevel)) {
ItemStack newResult = new ItemStack(result.getType(), result.getAmount() + 1);
return newResult;
}

View File

@@ -1,13 +1,10 @@
package com.gmail.nossr50.skills.swords;
import org.bukkit.entity.Entity;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.datatypes.skills.AbilityType;
import com.gmail.nossr50.datatypes.skills.SkillType;
import com.gmail.nossr50.datatypes.skills.ToolType;
import com.gmail.nossr50.locale.LocaleLoader;
import com.gmail.nossr50.runnables.skills.BleedTimerTask;
import com.gmail.nossr50.skills.SkillManager;
@@ -22,19 +19,15 @@ public class SwordsManager extends SkillManager {
}
public boolean canActivateAbility() {
return mcMMOPlayer.getToolPreparationMode(ToolType.SWORD) && Permissions.serratedStrikes(getPlayer());
return tool.getPreparationMode() && Permissions.serratedStrikes(getPlayer());
}
public boolean canUseBleed() {
return Permissions.bleed(getPlayer());
}
public boolean canUseCounterAttack(Entity target) {
return target instanceof LivingEntity && Permissions.counterAttack(getPlayer());
}
public boolean canUseSerratedStrike() {
return mcMMOPlayer.getAbilityMode(AbilityType.SERRATED_STRIKES) && Permissions.serratedStrikes(getPlayer());
return getAbility().getMode() && Permissions.serratedStrikes(getPlayer());
}
/**
@@ -43,7 +36,9 @@ public class SwordsManager extends SkillManager {
* @param target The defending entity
*/
public void bleedCheck(LivingEntity target) {
if (SkillUtils.activationSuccessful(getSkillLevel(), getActivationChance(), Swords.bleedMaxChance, Swords.bleedMaxBonusLevel)) {
Player player = getPlayer();
if (SkillUtils.activationSuccessful(player, skill, Swords.bleedMaxChance, Swords.bleedMaxBonusLevel)) {
if (getSkillLevel() >= Swords.bleedMaxBonusLevel) {
BleedTimerTask.add(target, Swords.bleedMaxTicks);
@@ -53,7 +48,7 @@ public class SwordsManager extends SkillManager {
}
if (mcMMOPlayer.useChatNotifications()) {
getPlayer().sendMessage(LocaleLoader.getString("Swords.Combat.Bleeding"));
player.sendMessage(LocaleLoader.getString("Swords.Combat.Bleeding"));
}
if (target instanceof Player) {
@@ -67,7 +62,7 @@ public class SwordsManager extends SkillManager {
}
public void counterAttackChecks(LivingEntity attacker, int damage) {
if (SkillUtils.activationSuccessful(getSkillLevel(), getActivationChance(), Swords.counterAttackMaxChance, Swords.counterAttackMaxBonusLevel)) {
if (SkillUtils.activationSuccessful(getPlayer(), skill, Swords.counterAttackMaxChance, Swords.counterAttackMaxBonusLevel)) {
CombatUtils.dealDamage(attacker, damage / Swords.counterAttackModifier);
getPlayer().sendMessage(LocaleLoader.getString("Swords.Combat.Countered"));

View File

@@ -27,35 +27,23 @@ public class TamingManager extends SkillManager {
}
public boolean canUseThickFur() {
return getSkillLevel() >= Taming.thickFurUnlockLevel && Permissions.thickFur(getPlayer());
return getSkillLevel() > Taming.thickFurUnlockLevel && Permissions.thickFur(getPlayer());
}
public boolean canUseEnvironmentallyAware() {
return getSkillLevel() >= Taming.environmentallyAwareUnlockLevel && Permissions.environmentallyAware(getPlayer());
return getSkillLevel() > Taming.environmentallyAwareUnlockLevel && Permissions.environmentallyAware(getPlayer());
}
public boolean canUseShockProof() {
return getSkillLevel() >= Taming.shockProofUnlockLevel && Permissions.shockProof(getPlayer());
return getSkillLevel() > Taming.shockProofUnlockLevel && Permissions.shockProof(getPlayer());
}
public boolean canUseHolyHound() {
return getSkillLevel() >= Taming.holyHoundUnlockLevel && Permissions.holyHound(getPlayer());
return getSkillLevel() > Taming.holyHoundUnlockLevel && Permissions.holyHound(getPlayer());
}
public boolean canUseFastFoodService() {
return getSkillLevel() >= Taming.fastFoodServiceUnlockLevel && Permissions.fastFoodService(getPlayer());
}
public boolean canUseSharpenedClaws() {
return getSkillLevel() >= Taming.sharpenedClawsUnlockLevel && Permissions.sharpenedClaws(getPlayer());
}
public boolean canUseGore() {
return Permissions.gore(getPlayer());
}
public boolean canUseBeastLore() {
return Permissions.beastLore(getPlayer());
public boolean canUseBeastLore(LivingEntity target) {
return target instanceof Tameable && Permissions.beastLore(getPlayer());
}
/**
@@ -85,7 +73,7 @@ public class TamingManager extends SkillManager {
* @param damage The damage being absorbed by the wolf
*/
public void fastFoodService(Wolf wolf, int damage) {
if (Taming.fastFoodServiceActivationChance > Misc.getRandom().nextInt(getActivationChance())) {
if (SkillUtils.activationSuccessful(getPlayer(), skill, Taming.fastFoodServiceActivationChance)) {
int health = wolf.getHealth();
int maxHealth = wolf.getMaxHealth();
@@ -103,14 +91,16 @@ public class TamingManager extends SkillManager {
* @param event The event to modify
*/
public int gore(LivingEntity target, int damage) {
if (SkillUtils.activationSuccessful(getSkillLevel(), getActivationChance(), Taming.goreMaxChance, Taming.goreMaxBonusLevel)) {
Player owner = getPlayer();
if (SkillUtils.activationSuccessful(owner, skill, Taming.goreMaxChance, Taming.goreMaxBonusLevel)) {
BleedTimerTask.add(target, Taming.goreBleedTicks);
if (target instanceof Player) {
((Player) target).sendMessage(LocaleLoader.getString("Combat.StruckByGore"));
}
getPlayer().sendMessage(LocaleLoader.getString("Combat.Gore"));
owner.sendMessage(LocaleLoader.getString("Combat.Gore"));
return damage * Taming.goreModifier;
}

View File

@@ -1,7 +1,12 @@
package com.gmail.nossr50.skills.unarmed;
import org.bukkit.Material;
import org.bukkit.block.BlockState;
import org.bukkit.entity.Player;
import com.gmail.nossr50.config.AdvancedConfig;
import com.gmail.nossr50.config.Config;
import com.gmail.nossr50.util.skills.SkillUtils;
public class Unarmed {
public static int ironArmMaxBonusDamage = AdvancedConfig.getInstance().getIronArmMaxBonus();
@@ -19,4 +24,23 @@ public class Unarmed {
public static boolean blockCrackerSmoothBrick = Config.getInstance().getUnarmedBlockCrackerSmoothbrickToCracked();
public static double berserkDamageModifier = 1.5;
public static boolean blockCracker(Player player, BlockState blockState) {
if (SkillUtils.blockBreakSimulate(blockState.getBlock(), player, false)) {
Material type = blockState.getType();
switch (type) {
case SMOOTH_BRICK:
if (blockCrackerSmoothBrick && blockState.getRawData() == (byte) 0x0) {
blockState.setRawData((byte) 0x2);
}
return true;
default:
return false;
}
}
return false;
}
}

View File

@@ -1,16 +1,13 @@
package com.gmail.nossr50.skills.unarmed;
import org.bukkit.Material;
import org.bukkit.block.BlockState;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.datatypes.skills.AbilityType;
import com.gmail.nossr50.datatypes.skills.SkillType;
import com.gmail.nossr50.datatypes.skills.ToolType;
import com.gmail.nossr50.events.skills.unarmed.McMMOPlayerDisarmEvent;
import com.gmail.nossr50.locale.LocaleLoader;
import com.gmail.nossr50.skills.SkillManager;
@@ -24,7 +21,7 @@ public class UnarmedManager extends SkillManager {
}
public boolean canActivateAbility() {
return mcMMOPlayer.getToolPreparationMode(ToolType.FISTS) && Permissions.berserk(getPlayer());
return tool.getPreparationMode() && Permissions.berserk(getPlayer());
}
public boolean canUseIronArm() {
@@ -32,45 +29,20 @@ public class UnarmedManager extends SkillManager {
}
public boolean canUseBerserk() {
return mcMMOPlayer.getAbilityMode(AbilityType.BERSERK) && Permissions.berserk(getPlayer());
return getAbility().getMode() && Permissions.berserk(getPlayer());
}
public boolean canDisarm(LivingEntity target) {
return target instanceof Player && ((Player) target).getItemInHand().getType() != Material.AIR && Permissions.disarm(getPlayer());
}
public boolean canDeflect() {
Player player = getPlayer();
return player.getItemInHand().getType() == Material.AIR && Permissions.arrowDeflect(player);
}
public boolean canUseBlockCracker() {
return Permissions.blockCracker(getPlayer());
}
public boolean blockCrackerCheck(BlockState blockState) {
Material type = blockState.getType();
switch (type) {
case SMOOTH_BRICK:
if (Unarmed.blockCrackerSmoothBrick && blockState.getRawData() == (byte) 0x0) {
blockState.setRawData((byte) 0x2);
}
return true;
default:
return false;
}
}
/**
* Check for disarm.
*
* @param defender The defending player
*/
public void disarmCheck(Player defender) {
if (SkillUtils.activationSuccessful(getSkillLevel(), getActivationChance(), Unarmed.disarmMaxChance, Unarmed.disarmMaxBonusLevel) && !hasIronGrip(defender)) {
if (SkillUtils.activationSuccessful(getPlayer(), skill, Unarmed.disarmMaxChance, Unarmed.disarmMaxBonusLevel) && !hasIronGrip(defender)) {
McMMOPlayerDisarmEvent disarmEvent = new McMMOPlayerDisarmEvent(defender);
mcMMO.p.getServer().getPluginManager().callEvent(disarmEvent);
@@ -87,8 +59,10 @@ public class UnarmedManager extends SkillManager {
* Check for arrow deflection.
*/
public boolean deflectCheck() {
if (SkillUtils.activationSuccessful(getSkillLevel(), getActivationChance(), Unarmed.deflectMaxChance, Unarmed.deflectMaxBonusLevel)) {
getPlayer().sendMessage(LocaleLoader.getString("Combat.ArrowDeflect"));
Player player = getPlayer();
if (SkillUtils.activationSuccessful(player, skill, Unarmed.deflectMaxChance, Unarmed.deflectMaxBonusLevel)) {
player.sendMessage(LocaleLoader.getString("Combat.ArrowDeflect"));
return true;
}

View File

@@ -0,0 +1,276 @@
package com.gmail.nossr50.skills.woodcutting;
import java.util.ArrayList;
import java.util.List;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.block.BlockState;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.material.Tree;
import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.config.Config;
import com.gmail.nossr50.datatypes.mods.CustomBlock;
import com.gmail.nossr50.datatypes.skills.SkillType;
import com.gmail.nossr50.locale.LocaleLoader;
import com.gmail.nossr50.skills.woodcutting.Woodcutting.ExperienceGainMethod;
import com.gmail.nossr50.util.BlockUtils;
import com.gmail.nossr50.util.Misc;
import com.gmail.nossr50.util.ModUtils;
import com.gmail.nossr50.util.player.UserManager;
import com.gmail.nossr50.util.skills.CombatUtils;
import com.gmail.nossr50.util.skills.SkillUtils;
public final class TreeFeller {
private static boolean treeFellerReachedThreshold = false;
private TreeFeller() {}
/**
* Begins Tree Feller
*
* @param mcMMOPlayer Player using Tree Feller
* @param blockState Block being broken
*/
protected static void processTreeFeller(BlockState blockState, Player player) {
List<BlockState> treeFellerBlocks = new ArrayList<BlockState>();
if (blockState.getTypeId() == 17 || blockState.getTypeId() == 99) {
processRegularTrees(blockState, treeFellerBlocks);
}
else {
processRedMushroomTrees(blockState, treeFellerBlocks);
}
// If the player is trying to break too many blocks
if (treeFellerReachedThreshold) {
treeFellerReachedThreshold = false;
player.sendMessage(LocaleLoader.getString("Woodcutting.Skills.TreeFellerThreshold"));
return;
}
// If the tool can't sustain the durability loss
if (!handleDurabilityLoss(treeFellerBlocks, player.getItemInHand())) {
player.sendMessage(LocaleLoader.getString("Woodcutting.Skills.TreeFeller.Splinter"));
int health = player.getHealth();
if (health > 1) {
CombatUtils.dealDamage(player, Misc.getRandom().nextInt(health - 1));
}
return;
}
dropBlocks(treeFellerBlocks, player);
}
/**
* Processes Tree Feller for generic Trees
*
* @param blockState Block being checked
* @param treeFellerBlocks List of blocks to be removed
*/
private static void processRegularTrees(BlockState blockState, List<BlockState> treeFellerBlocks) {
if (!BlockUtils.isLog(blockState)) {
return;
}
List<BlockState> futureCenterBlocks = new ArrayList<BlockState>();
World world = blockState.getWorld();
// Handle the blocks around 'block'
for (int y = 0; y <= 1; y++) {
for (int x = -1; x <= 1; x++) {
for (int z = -1; z <= 1; z++) {
BlockState nextBlock = world.getBlockAt(blockState.getLocation().add(x, y, z)).getState();
handleBlock(nextBlock, futureCenterBlocks, treeFellerBlocks);
if (treeFellerReachedThreshold) {
return;
}
}
}
}
// Recursive call for each log found
for (BlockState futureCenterBlock : futureCenterBlocks) {
if (treeFellerReachedThreshold) {
return;
}
processRegularTrees(futureCenterBlock, treeFellerBlocks);
}
}
/**
* Processes Tree Feller for Red Mushrooms (Dome Shaped)
*
* @param blockState Block being checked
* @param treeFellerBlocks List of blocks to be removed
*/
private static void processRedMushroomTrees(BlockState blockState, List<BlockState> treeFellerBlocks) {
if (!BlockUtils.isLog(blockState)) {
return;
}
List<BlockState> futureCenterBlocks = new ArrayList<BlockState>();
World world = blockState.getWorld();
// Handle the blocks around 'block'
for (int y = 0; y <= 1; y++) {
for (int x = -1; x <= 1; x++) {
for (int z = -1; z <= 1; z++) {
BlockState nextBlock = world.getBlockAt(blockState.getLocation().add(x, y, z)).getState();
BlockState otherNextBlock = world.getBlockAt(blockState.getLocation().add(x, y - (y * 2), z)).getState();
handleBlock(nextBlock, futureCenterBlocks, treeFellerBlocks);
handleBlock(otherNextBlock, futureCenterBlocks, treeFellerBlocks);
if (treeFellerReachedThreshold) {
return;
}
}
}
}
// Recursive call for each log found
for (BlockState futureCenterBlock : futureCenterBlocks) {
if (treeFellerReachedThreshold) {
return;
}
processRedMushroomTrees(futureCenterBlock, treeFellerBlocks);
}
}
/**
* Handle a block addition to the list of blocks to be removed and to the list of blocks used for future recursive calls of 'processRecursively()'
*
* @param blockState Block to be added
* @param futureCenterBlocks List of blocks that will be used to call 'processRecursively()'
* @param treeFellerBlocks List of blocks to be removed
*/
private static void handleBlock(BlockState blockState, List<BlockState> futureCenterBlocks, List<BlockState> treeFellerBlocks) {
if (!BlockUtils.affectedByTreeFeller(blockState) || mcMMO.placeStore.isTrue(blockState) || treeFellerBlocks.contains(blockState)) {
return;
}
treeFellerBlocks.add(blockState);
if (treeFellerBlocks.size() > Config.getInstance().getTreeFellerThreshold()) {
treeFellerReachedThreshold = true;
return;
}
futureCenterBlocks.add(blockState);
}
/**
* Handles the durability loss
*
* @param treeFellerBlocks List of blocks to be removed
* @param inHand tool being used
* @return True if the tool can sustain the durability loss
*/
private static boolean handleDurabilityLoss(List<BlockState> treeFellerBlocks, ItemStack inHand) {
Material inHandMaterial = inHand.getType();
if (inHandMaterial != Material.AIR) {
short durabilityLoss = 0;
int unbreakingLevel = inHand.getEnchantmentLevel(Enchantment.DURABILITY);
for (BlockState blockState : treeFellerBlocks) {
if (BlockUtils.isLog(blockState) && Misc.getRandom().nextInt(unbreakingLevel + 1) == 0) {
durabilityLoss += Config.getInstance().getAbilityToolDamage();
}
}
short finalDurability = (short) (inHand.getDurability() + durabilityLoss);
short maxDurability = ModUtils.isCustomTool(inHand) ? ModUtils.getToolFromItemStack(inHand).getDurability() : inHandMaterial.getMaxDurability();
if (finalDurability >= maxDurability) {
inHand.setDurability(maxDurability);
return false;
}
inHand.setDurability(finalDurability);
}
return true;
}
/**
* Handles the dropping of blocks
*
* @param treeFellerBlocks List of blocks to be dropped
* @param player Player using the ability
*/
private static void dropBlocks(List<BlockState> treeFellerBlocks, Player player) {
int xp = 0;
for (BlockState blockState : treeFellerBlocks) {
if (!SkillUtils.blockBreakSimulate(blockState.getBlock(), player, true)) {
break; // TODO: Shouldn't we use continue instead?
}
Material material = blockState.getType();
if (material == Material.HUGE_MUSHROOM_1 || material == Material.HUGE_MUSHROOM_2) {
xp += Woodcutting.getExperienceFromLog(blockState, ExperienceGainMethod.TREE_FELLER);
for (ItemStack drop : blockState.getBlock().getDrops()) {
Misc.dropItem(blockState.getLocation(), drop);
}
}
else if (ModUtils.isCustomLogBlock(blockState)) {
Woodcutting.checkForDoubleDrop(player, blockState);
CustomBlock customBlock = ModUtils.getCustomBlock(blockState);
xp = customBlock.getXpGain();
int minimumDropAmount = customBlock.getMinimumDropAmount();
int maximumDropAmount = customBlock.getMaximumDropAmount();
Location location = blockState.getLocation();
ItemStack item = customBlock.getItemDrop();;
Misc.dropItems(location, item, minimumDropAmount);
if (minimumDropAmount < maximumDropAmount) {
Misc.randomDropItems(location, item, maximumDropAmount - minimumDropAmount);
}
}
else if (ModUtils.isCustomLeafBlock(blockState)) {
Misc.randomDropItem(blockState.getLocation(), ModUtils.getCustomBlock(blockState).getItemDrop(), 10);
}
else {
Tree tree = (Tree) blockState.getData();
switch (material) {
case LOG:
Woodcutting.checkForDoubleDrop(player, blockState);
xp += Woodcutting.getExperienceFromLog(blockState, ExperienceGainMethod.TREE_FELLER);
Misc.dropItem(blockState.getLocation(), new ItemStack(Material.LOG, 1, tree.getSpecies().getData()));
break;
case LEAVES:
Misc.randomDropItem(blockState.getLocation(), new ItemStack(Material.SAPLING, 1, tree.getSpecies().getData()), 10);
break;
default:
break;
}
}
blockState.setRawData((byte) 0x0);
blockState.setType(Material.AIR);
blockState.update(true);
}
UserManager.getPlayer(player).beginXpGain(SkillType.WOODCUTTING, xp);
}
}

View File

@@ -1,12 +1,10 @@
package com.gmail.nossr50.skills.woodcutting;
import java.util.ArrayList;
import java.util.List;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.Sound;
import org.bukkit.block.BlockState;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.material.Tree;
@@ -14,17 +12,18 @@ import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.config.AdvancedConfig;
import com.gmail.nossr50.config.Config;
import com.gmail.nossr50.datatypes.mods.CustomBlock;
import com.gmail.nossr50.util.BlockUtils;
import com.gmail.nossr50.datatypes.skills.SkillType;
import com.gmail.nossr50.events.fake.FakePlayerAnimationEvent;
import com.gmail.nossr50.util.Misc;
import com.gmail.nossr50.util.ModUtils;
import com.gmail.nossr50.util.Permissions;
import com.gmail.nossr50.util.player.UserManager;
import com.gmail.nossr50.util.skills.SkillUtils;
public final class Woodcutting {
public static int doubleDropsMaxLevel = AdvancedConfig.getInstance().getWoodcuttingDoubleDropMaxLevel();
public static double doubleDropsMaxChance = AdvancedConfig.getInstance().getWoodcuttingDoubleDropChance();
public static int leafBlowerUnlockLevel = AdvancedConfig.getInstance().getLeafBlowUnlockLevel();
public static int treeFellerThreshold = Config.getInstance().getTreeFellerThreshold();
protected enum ExperienceGainMethod {
DEFAULT,
TREE_FELLER,
@@ -32,6 +31,47 @@ public final class Woodcutting {
private Woodcutting() {}
/**
* Begins the Tree Feller ability
*
* @param mcMMOPlayer Player using the ability
* @param block Block being broken
*/
public static void beginTreeFeller(BlockState blockState, Player player) {
TreeFeller.processTreeFeller(blockState, player);
}
/**
* Begins the Leaf Blower ability
*
* @param player Player using the ability
* @param block Block being broken
*/
public static void beginLeafBlower(Player player, BlockState blockState) {
mcMMO.p.getServer().getPluginManager().callEvent(new FakePlayerAnimationEvent(player));
player.playSound(blockState.getLocation(), Sound.ITEM_PICKUP, Misc.POP_VOLUME, Misc.POP_PITCH);
}
/**
* Begins Woodcutting
*
* @param mcMMOPlayer Player breaking the block
* @param block Block being broken
*/
public static void beginWoodcutting(Player player, BlockState blockState) {
int xp = getExperienceFromLog(blockState, ExperienceGainMethod.DEFAULT);
if (Permissions.doubleDrops(player, SkillType.WOODCUTTING)) {
Material blockType = blockState.getType();
if (blockType != Material.HUGE_MUSHROOM_1 && blockType != Material.HUGE_MUSHROOM_2) {
checkForDoubleDrop(player, blockState);
}
}
UserManager.getPlayer(player).beginXpGain(SkillType.WOODCUTTING, xp);
}
/**
* Retrieves the experience reward from a log
*
@@ -86,7 +126,11 @@ public final class Woodcutting {
* @param mcMMOPlayer Player breaking the block
* @param blockState Block being broken
*/
protected static void checkForDoubleDrop(BlockState blockState) {
protected static void checkForDoubleDrop(Player player, BlockState blockState) {
if (!SkillUtils.activationSuccessful(player, SkillType.WOODCUTTING, doubleDropsMaxChance, doubleDropsMaxLevel)) {
return;
}
if (ModUtils.isCustomLogBlock(blockState)) {
CustomBlock customBlock = ModUtils.getCustomBlock(blockState);
int minimumDropAmount = customBlock.getMinimumDropAmount();
@@ -135,130 +179,4 @@ public final class Woodcutting {
}
}
}
/**
* Processes Tree Feller for generic Trees
*
* @param blockState Block being checked
* @param treeFellerBlocks List of blocks to be removed
*/
protected static void processRegularTrees(BlockState blockState, List<BlockState> treeFellerBlocks) {
List<BlockState> futureCenterBlocks = new ArrayList<BlockState>();
// Handle the blocks around 'block'
for (int y = 0; y <= 1; y++) {
for (int x = -1; x <= 1; x++) {
for (int z = -1; z <= 1; z++) {
BlockState nextBlock = blockState.getBlock().getRelative(x, y, z).getState();
handleBlock(nextBlock, futureCenterBlocks, treeFellerBlocks);
if (WoodcuttingManager.treeFellerReachedThreshold) {
return;
}
}
}
}
// Recursive call for each log found
for (BlockState futureCenterBlock : futureCenterBlocks) {
if (WoodcuttingManager.treeFellerReachedThreshold) {
return;
}
processRegularTrees(futureCenterBlock, treeFellerBlocks);
}
}
/**
* Processes Tree Feller for Red Mushrooms (Dome Shaped)
*
* @param blockState Block being checked
* @param treeFellerBlocks List of blocks to be removed
*/
protected static void processRedMushroomTrees(BlockState blockState, List<BlockState> treeFellerBlocks) {
List<BlockState> futureCenterBlocks = new ArrayList<BlockState>();
// Handle the blocks around 'block'
for (int y = 0; y <= 1; y++) {
for (int x = -1; x <= 1; x++) {
for (int z = -1; z <= 1; z++) {
BlockState nextBlock = blockState.getBlock().getRelative(x, y, z).getState();
BlockState otherNextBlock = blockState.getBlock().getRelative(x, y - (y * 2), z).getState();
handleBlock(nextBlock, futureCenterBlocks, treeFellerBlocks);
handleBlock(otherNextBlock, futureCenterBlocks, treeFellerBlocks);
if (WoodcuttingManager.treeFellerReachedThreshold) {
return;
}
}
}
}
// Recursive call for each log found
for (BlockState futureCenterBlock : futureCenterBlocks) {
if (WoodcuttingManager.treeFellerReachedThreshold) {
return;
}
processRedMushroomTrees(futureCenterBlock, treeFellerBlocks);
}
}
/**
* Handles the durability loss
*
* @param treeFellerBlocks List of blocks to be removed
* @param inHand tool being used
* @return True if the tool can sustain the durability loss
*/
protected static boolean handleDurabilityLoss(List<BlockState> treeFellerBlocks, ItemStack inHand) {
Material inHandMaterial = inHand.getType();
if (inHandMaterial == Material.AIR) {
return false;
}
short durabilityLoss = 0;
int unbreakingLevel = inHand.getEnchantmentLevel(Enchantment.DURABILITY);
for (BlockState blockState : treeFellerBlocks) {
if (BlockUtils.isLog(blockState) && Misc.getRandom().nextInt(unbreakingLevel + 1) == 0) {
durabilityLoss += Config.getInstance().getAbilityToolDamage();
}
}
short finalDurability = (short) (inHand.getDurability() + durabilityLoss);
short maxDurability = ModUtils.isCustomTool(inHand) ? ModUtils.getToolFromItemStack(inHand).getDurability() : inHandMaterial.getMaxDurability();
if (finalDurability >= maxDurability) {
inHand.setDurability(maxDurability);
return false;
}
inHand.setDurability(finalDurability);
return true;
}
/**
* Handle a block addition to the list of blocks to be removed and to the list of blocks used for future recursive calls of 'processRecursively()'
*
* @param blockState Block to be added
* @param futureCenterBlocks List of blocks that will be used to call 'processRecursively()'
* @param treeFellerBlocks List of blocks to be removed
*/
private static void handleBlock(BlockState blockState, List<BlockState> futureCenterBlocks, List<BlockState> treeFellerBlocks) {
if (!BlockUtils.affectedByTreeFeller(blockState) || mcMMO.placeStore.isTrue(blockState) || treeFellerBlocks.contains(blockState)) {
return;
}
treeFellerBlocks.add(blockState);
if (treeFellerBlocks.size() > treeFellerThreshold) {
WoodcuttingManager.treeFellerReachedThreshold = true;
return;
}
futureCenterBlocks.add(blockState);
}
}

View File

@@ -1,192 +0,0 @@
package com.gmail.nossr50.skills.woodcutting;
import java.util.ArrayList;
import java.util.List;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.BlockState;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.material.Tree;
import com.gmail.nossr50.datatypes.mods.CustomBlock;
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.datatypes.skills.AbilityType;
import com.gmail.nossr50.datatypes.skills.SkillType;
import com.gmail.nossr50.locale.LocaleLoader;
import com.gmail.nossr50.skills.SkillManager;
import com.gmail.nossr50.skills.woodcutting.Woodcutting.ExperienceGainMethod;
import com.gmail.nossr50.util.ItemUtils;
import com.gmail.nossr50.util.Misc;
import com.gmail.nossr50.util.ModUtils;
import com.gmail.nossr50.util.Permissions;
import com.gmail.nossr50.util.skills.CombatUtils;
import com.gmail.nossr50.util.skills.SkillUtils;
public class WoodcuttingManager extends SkillManager {
protected static boolean treeFellerReachedThreshold = false;
public WoodcuttingManager(McMMOPlayer mcMMOPlayer) {
super(mcMMOPlayer, SkillType.WOODCUTTING);
}
public boolean canUseLeafBlower(ItemStack heldItem) {
return getSkillLevel() >= Woodcutting.leafBlowerUnlockLevel && ItemUtils.isAxe(heldItem);
}
public boolean canUseTreeFeller(ItemStack heldItem) {
return mcMMOPlayer.getAbilityMode(AbilityType.TREE_FELLER) && Permissions.treeFeller(getPlayer()) && ItemUtils.isAxe(heldItem);
}
protected boolean canGetDoubleDrops() {
return Permissions.doubleDrops(getPlayer(), skill) && SkillUtils.activationSuccessful(getSkillLevel(), getActivationChance(), Woodcutting.doubleDropsMaxChance, Woodcutting.doubleDropsMaxLevel);
}
/**
* Begins Woodcutting
*
* @param blockState Block being broken
*/
public void woodcuttingBlockCheck(BlockState blockState) {
int xp = Woodcutting.getExperienceFromLog(blockState, ExperienceGainMethod.DEFAULT);
switch (blockState.getType()) {
case HUGE_MUSHROOM_1:
case HUGE_MUSHROOM_2:
break;
default:
if (canGetDoubleDrops()) {
Woodcutting.checkForDoubleDrop(blockState);
}
}
applyXpGain(xp);
}
/**
* Begins Tree Feller
*
* @param blockState Block being broken
*/
public void processTreeFeller(BlockState blockState) {
Player player = getPlayer();
List<BlockState> treeFellerBlocks = new ArrayList<BlockState>();
switch (blockState.getType()) {
case LOG:
case HUGE_MUSHROOM_1:
Woodcutting.processRegularTrees(blockState, treeFellerBlocks);
break;
case HUGE_MUSHROOM_2:
Woodcutting.processRedMushroomTrees(blockState, treeFellerBlocks);
break;
default:
if (ModUtils.isCustomLogBlock(blockState)) {
Woodcutting.processRegularTrees(blockState, treeFellerBlocks);
}
break;
}
// If the player is trying to break too many blocks
if (treeFellerReachedThreshold) {
treeFellerReachedThreshold = false;
player.sendMessage(LocaleLoader.getString("Woodcutting.Skills.TreeFellerThreshold"));
return;
}
// If the tool can't sustain the durability loss
if (!Woodcutting.handleDurabilityLoss(treeFellerBlocks, player.getItemInHand())) {
player.sendMessage(LocaleLoader.getString("Woodcutting.Skills.TreeFeller.Splinter"));
int health = player.getHealth();
if (health > 1) {
CombatUtils.dealDamage(player, Misc.getRandom().nextInt(health - 1));
}
return;
}
dropBlocks(treeFellerBlocks);
treeFellerReachedThreshold = false; // Reset the value after we're done with Tree Feller each time.
}
/**
* Handles the dropping of blocks
*
* @param treeFellerBlocks List of blocks to be dropped
* @param player Player using the ability
*/
private void dropBlocks(List<BlockState> treeFellerBlocks) {
Player player = getPlayer();
int xp = 0;
for (BlockState blockState : treeFellerBlocks) {
if (!SkillUtils.blockBreakSimulate(blockState.getBlock(), player, true)) {
break; // TODO: Shouldn't we use continue instead?
}
Material material = blockState.getType();
if (material == Material.HUGE_MUSHROOM_1 || material == Material.HUGE_MUSHROOM_2) {
xp += Woodcutting.getExperienceFromLog(blockState, ExperienceGainMethod.TREE_FELLER);
for (ItemStack drop : blockState.getBlock().getDrops()) {
Misc.dropItem(blockState.getLocation(), drop);
}
}
else if (ModUtils.isCustomLogBlock(blockState)) {
if (canGetDoubleDrops()) {
Woodcutting.checkForDoubleDrop(blockState);
}
CustomBlock customBlock = ModUtils.getCustomBlock(blockState);
xp = customBlock.getXpGain();
int minimumDropAmount = customBlock.getMinimumDropAmount();
int maximumDropAmount = customBlock.getMaximumDropAmount();
Location location = blockState.getLocation();
ItemStack item = customBlock.getItemDrop();;
Misc.dropItems(location, item, minimumDropAmount);
if (minimumDropAmount < maximumDropAmount) {
Misc.randomDropItems(location, item, maximumDropAmount - minimumDropAmount);
}
}
else if (ModUtils.isCustomLeafBlock(blockState)) {
Misc.randomDropItem(blockState.getLocation(), ModUtils.getCustomBlock(blockState).getItemDrop(), 10);
}
else {
Tree tree = (Tree) blockState.getData();
switch (material) {
case LOG:
if (canGetDoubleDrops()) {
Woodcutting.checkForDoubleDrop(blockState);
}
xp += Woodcutting.getExperienceFromLog(blockState, ExperienceGainMethod.TREE_FELLER);
Misc.dropItem(blockState.getLocation(), new ItemStack(Material.LOG, 1, tree.getSpecies().getData()));
break;
case LEAVES:
Misc.randomDropItem(blockState.getLocation(), new ItemStack(Material.SAPLING, 1, tree.getSpecies().getData()), 10);
break;
default:
break;
}
}
blockState.setRawData((byte) 0x0);
blockState.setType(Material.AIR);
blockState.update(true);
}
applyXpGain(xp);
}
}

View File

@@ -1,23 +1,14 @@
package com.gmail.nossr50.util;
import java.util.ArrayList;
import java.util.List;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.Sound;
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.ShapelessRecipe;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.util.Vector;
import com.gmail.nossr50.config.Config;
import com.gmail.nossr50.locale.LocaleLoader;
import com.gmail.nossr50.metrics.MetricsManager;
import com.gmail.nossr50.util.player.UserManager;
import com.gmail.nossr50.util.skills.CombatUtils;
import com.gmail.nossr50.util.skills.SkillUtils;
public final class ChimaeraWing {
@@ -31,85 +22,42 @@ public final class ChimaeraWing {
public static void activationCheck(Player player) {
ItemStack inHand = player.getItemInHand();
if (!Config.getInstance().getChimaeraEnabled() || !ItemUtils.isChimaeraWing(inHand)) {
if (!Config.getInstance().getChimaeraEnabled() || inHand.getTypeId() != Config.getInstance().getChimaeraItemId()) {
return;
}
Location location = player.getLocation();
Block block = player.getLocation().getBlock();
int amount = inHand.getAmount();
long recentlyHurt = UserManager.getPlayer(player).getRecentlyHurt();
long lastChimaeraWing = (UserManager.getPlayer(player).getLastChimaeraTeleport());
long recentlyHurt = UserManager.getPlayer(player).getRecentlyHurt() * Misc.TIME_CONVERSION_FACTOR;
if (Permissions.chimaeraWing(player) && ItemUtils.isChimaeraWing(inHand)) {
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!
return;
}
if (Permissions.chimaeraWing(player) && inHand.getTypeId() == Config.getInstance().getChimaeraItemId()) {
if (SkillUtils.cooldownOver(recentlyHurt, 60, player) && amount >= Config.getInstance().getChimaeraCost()) {
player.setItemInHand(new ItemStack(Config.getInstance().getChimaeraItemId(), amount - Config.getInstance().getChimaeraCost()));
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)));
return;
}
if (amount <= Config.getInstance().getChimaeraUseCost()) {
player.sendMessage(LocaleLoader.getString("Skills.NeedMore", "Chimaera Wings")); //TODO Locale!
return;
}
player.setItemInHand(new ItemStack(getChimaeraWing(amount - Config.getInstance().getChimaeraUseCost())));
if (Config.getInstance().getChimaeraPreventUseUnderground()) {
if (location.getY() < player.getWorld().getHighestBlockYAt(location)) {
player.sendMessage(LocaleLoader.getString("Item.ChimaeraWing.Fail"));
player.setVelocity(new Vector(0, 0.5D, 0));
CombatUtils.dealDamage(player, Misc.getRandom().nextInt(player.getHealth() - 10));
UserManager.getPlayer(player).actualizeLastChimaeraTeleport();
return;
for (int y = 1; block.getY() + y < player.getWorld().getMaxHeight(); y++) {
if (!(block.getRelative(0, y, 0).getType() == Material.AIR)) {
player.sendMessage(LocaleLoader.getString("Item.ChimaeraWing.Fail"));
player.teleport(block.getRelative(0, y - 1, 0).getLocation());
return;
}
}
}
if (player.getBedSpawnLocation() != null) {
player.teleport(player.getBedSpawnLocation());
}
else {
Location spawnLocation = player.getWorld().getSpawnLocation();
if (spawnLocation.getBlock().getType() == Material.AIR) {
player.teleport(spawnLocation);
if (player.getBedSpawnLocation() != null) {
player.teleport(player.getBedSpawnLocation());
}
else {
player.teleport(player.getWorld().getHighestBlockAt(spawnLocation).getLocation());
player.teleport(player.getWorld().getSpawnLocation());
}
MetricsManager.chimeraWingUsed();
player.sendMessage(LocaleLoader.getString("Item.ChimaeraWing.Pass"));
}
else if (!SkillUtils.cooldownOver(recentlyHurt, 60, player) && amount >= Config.getInstance().getChimaeraCost()) {
player.sendMessage(LocaleLoader.getString("Item.Injured.Wait", SkillUtils.calculateTimeLeft(recentlyHurt, 60, player)));
}
else if (amount <= Config.getInstance().getChimaeraCost()) {
player.sendMessage(LocaleLoader.getString("Skills.NeedMore", StringUtils.getPrettyItemString(Config.getInstance().getChimaeraItemId())));
}
UserManager.getPlayer(player).actualizeLastChimaeraTeleport();
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);
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;
}
public static ShapelessRecipe getChimaeraWingRecipe() {
Material ingredient = Material.getMaterial(Config.getInstance().getChimaeraItemId());
int amount = Config.getInstance().getChimaeraRecipeCost();
if (amount > 9) {
amount = 9;
}
ShapelessRecipe ChimaeraWing = new ShapelessRecipe(getChimaeraWing(1));
ChimaeraWing.addIngredient(amount, ingredient);
return ChimaeraWing;
}
}

View File

@@ -12,6 +12,7 @@ import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Color;
import org.bukkit.FireworkEffect;
@@ -97,7 +98,7 @@ public final class HolidayManager {
final int firework_amount = 10;
for (int i = 0; i < firework_amount; i++) {
int delay = (int) (Math.random() * 3) + 4;
mcMMO.p.getServer().getScheduler().scheduleSyncDelayedTask(mcMMO.p, new Runnable() {
Bukkit.getScheduler().scheduleSyncDelayedTask(mcMMO.p, new Runnable() {
@Override
public void run() {
spawnFireworks((Player) sender);

View File

@@ -1,12 +1,8 @@
package com.gmail.nossr50.util;
import java.util.List;
import org.bukkit.ChatColor;
import org.bukkit.DyeColor;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.api.SpoutToolsAPI;
@@ -268,7 +264,7 @@ public class ItemUtils {
* @return true if the item is armor, false otherwise
*/
public static boolean isMinecraftArmor(ItemStack is) {
return isLeatherArmor(is) || isGoldArmor(is) || isIronArmor(is) || isDiamondArmor(is);
return isDiamondArmor(is) || isGoldArmor(is) || isIronArmor(is) || isDiamondArmor(is);
}
/**
@@ -648,32 +644,4 @@ public class ItemUtils {
return false;
}
}
public static boolean isMcMMOItem(ItemStack is) {
if (!is.hasItemMeta()) {
return false;
}
ItemMeta itemMeta = is.getItemMeta();
if (itemMeta.hasLore()) {
List<String> itemLore = itemMeta.getLore();
if (itemLore.contains("mcMMO Item")) {
return true;
}
}
return false;
}
public static boolean isChimaeraWing(ItemStack is) {
if (!isMcMMOItem(is)) {
return false;
}
ItemMeta itemMeta = is.getItemMeta();
if (itemMeta.hasDisplayName() && itemMeta.getDisplayName().equals(ChatColor.GOLD + "Chimaera Wing")) { //TODO Get localized name
return true;
}
return false;
}
}

View File

@@ -26,8 +26,6 @@ public final class Misc {
public static final float FIZZ_VOLUME = 0.5F;
public static final float POP_PITCH = ((getRandom().nextFloat() - getRandom().nextFloat()) * 0.7F + 1.0F) * 2.0F;
public static final float POP_VOLUME = 0.2F;
public static final float BAT_VOLUME = 1.0F;
public static final float BAT_PITCH = 0.6F;
private Misc() {};
@@ -79,7 +77,7 @@ public final class Misc {
* @return true if the distance between <code>first</code> and <code>second</code> is less than <code>maxDistance</code>, false otherwise
*/
public static boolean isNear(Location first, Location second, double maxDistance) {
if (first.getWorld() != second.getWorld()) {
if (!first.getWorld().equals(second.getWorld())) {
return false;
}

View File

@@ -52,7 +52,7 @@ public final class ModUtils {
*/
public static CustomBlock getCustomBlock(BlockState blockState) {
if (customBlocksEnabled) {
ItemStack item = blockState.getData().toItemStack(1);
ItemStack item = blockState.getData().toItemStack();
if (CustomBlockConfig.getInstance().customItems.contains(item)) {
for (CustomBlock block : CustomBlockConfig.getInstance().customBlocks) {
@@ -88,7 +88,7 @@ public final class ModUtils {
*/
public static boolean isCustomWoodcuttingBlock(BlockState blockState) {
if (customBlocksEnabled) {
ItemStack item = blockState.getData().toItemStack(1);
ItemStack item = blockState.getData().toItemStack();
if (CustomBlockConfig.getInstance().customWoodcuttingBlocks.contains(item)) {
for (CustomBlock block : CustomBlockConfig.getInstance().customBlocks) {
@@ -110,7 +110,7 @@ public final class ModUtils {
*/
public static boolean isCustomAbilityBlock(BlockState blockState) {
if (customBlocksEnabled) {
ItemStack item = blockState.getData().toItemStack(1);
ItemStack item = blockState.getData().toItemStack();
if (CustomBlockConfig.getInstance().customAbilityBlocks.contains(item)) {
for (CustomBlock block : CustomBlockConfig.getInstance().customBlocks) {
@@ -132,7 +132,7 @@ public final class ModUtils {
*/
public static boolean isCustomMiningBlock(BlockState blockState) {
if (customBlocksEnabled) {
ItemStack item = blockState.getData().toItemStack(1);
ItemStack item = blockState.getData().toItemStack();
if (CustomBlockConfig.getInstance().customMiningBlocks.contains(item)) {
for (CustomBlock block : CustomBlockConfig.getInstance().customBlocks) {
@@ -154,7 +154,7 @@ public final class ModUtils {
*/
public static boolean isCustomExcavationBlock(BlockState blockState) {
if (customBlocksEnabled) {
ItemStack item = blockState.getData().toItemStack(1);
ItemStack item = blockState.getData().toItemStack();
if (CustomBlockConfig.getInstance().customExcavationBlocks.contains(item)) {
for (CustomBlock block : CustomBlockConfig.getInstance().customBlocks) {
@@ -176,7 +176,7 @@ public final class ModUtils {
*/
public static boolean isCustomHerbalismBlock(BlockState blockState) {
if (customBlocksEnabled) {
ItemStack item = blockState.getData().toItemStack(1);
ItemStack item = blockState.getData().toItemStack();
if (CustomBlockConfig.getInstance().customHerbalismBlocks.contains(item)) {
for (CustomBlock block : CustomBlockConfig.getInstance().customBlocks) {
@@ -198,7 +198,7 @@ public final class ModUtils {
*/
public static boolean isCustomLeafBlock(BlockState blockState) {
if (customBlocksEnabled) {
ItemStack item = blockState.getData().toItemStack(1);
ItemStack item = blockState.getData().toItemStack();
if (CustomBlockConfig.getInstance().customLeaves.contains(item)) {
for (CustomBlock block : CustomBlockConfig.getInstance().customBlocks) {
@@ -220,7 +220,7 @@ public final class ModUtils {
*/
public static boolean isCustomLogBlock(BlockState blockState) {
if (customBlocksEnabled) {
ItemStack item = blockState.getData().toItemStack(1);
ItemStack item = blockState.getData().toItemStack();
if (CustomBlockConfig.getInstance().customLogs.contains(item)) {
for (CustomBlock block : CustomBlockConfig.getInstance().customBlocks) {
@@ -242,7 +242,7 @@ public final class ModUtils {
*/
public static boolean isCustomOreBlock(BlockState blockState) {
if (customBlocksEnabled) {
ItemStack item = blockState.getData().toItemStack(1);
ItemStack item = blockState.getData().toItemStack();
if (CustomBlockConfig.getInstance().customOres.contains(item)) {
for (CustomBlock block : CustomBlockConfig.getInstance().customBlocks) {

View File

@@ -231,6 +231,8 @@ public final class Permissions {
for (World world : server.getWorlds()) {
addDynamicPermission("mcmmo.commands.ptp.world." + world.getName(), PermissionDefault.OP, pluginManager);
}
addDynamicPermission("mcmmo.commands.ptp.world.all", PermissionDefault.OP, pluginManager);
}
private static void addDynamicPermission(String permissionName, PermissionDefault permissionDefault, PluginManager pluginManager) {

View File

@@ -43,18 +43,12 @@ public class UpdateChecker {
jo = (JSONObject) jo.get("versions");
newVersion = (String) jo.get("version");
String[] oldTokens = version.replaceAll("(?i)(-)(.+?)(-)", "-").split("[.]|-b");
String[] newTokens = newVersion.replaceAll("(?i)(-)(.+?)(-)", "-").split("[.]|-b");
String[] oldTokens = version.replaceAll("(?i)(-)(.+?)(-)", "").split("[.]|[b]");
String[] newTokens = newVersion.replaceAll("(?i)(-)(.+?)(-)", "").split("[.]|[b]");
for (int i = 0; i < 4; i++) {
Integer newVer = Integer.parseInt(newTokens[i]);
Integer oldVer;
try {
oldVer = Integer.parseInt(oldTokens[i]);
}
catch (NumberFormatException e) {
oldVer = 0;
}
Integer oldVer = Integer.parseInt(oldTokens[i]);
if (oldVer < newVer) {
isr.close();
return true;

View File

@@ -11,11 +11,10 @@ import java.io.StreamCorruptedException;
import java.io.UTFDataFormatException;
import java.util.HashMap;
import org.bukkit.Bukkit;
import org.bukkit.World;
import org.bukkit.block.Block;
import com.gmail.nossr50.mcMMO;
public class HashChunkletManager implements ChunkletManager {
public HashMap<String, ChunkletStore> store = new HashMap<String, ChunkletStore>();
@@ -169,7 +168,7 @@ public class HashChunkletManager implements ChunkletManager {
@Override
public void saveAll() {
for (World world : mcMMO.p.getServer().getWorlds()) {
for (World world : Bukkit.getWorlds()) {
saveWorld(world);
}
}
@@ -177,7 +176,7 @@ public class HashChunkletManager implements ChunkletManager {
@Override
public void unloadAll() {
saveAll();
for (World world : mcMMO.p.getServer().getWorlds()) {
for (World world : Bukkit.getWorlds()) {
unloadWorld(world);
}
}
@@ -277,7 +276,7 @@ public class HashChunkletManager implements ChunkletManager {
for (String key : store.keySet()) {
if (store.get(key).isEmpty()) {
String[] info = key.split(",");
File dataDir = new File(mcMMO.p.getServer().getWorld(info[0]).getWorldFolder(), "mcmmo_data");
File dataDir = new File(Bukkit.getWorld(info[0]).getWorldFolder(), "mcmmo_data");
File cxDir = new File(dataDir, "" + info[1]);
if (!cxDir.exists()) {

View File

@@ -11,12 +11,12 @@ import java.util.Iterator;
import java.util.List;
import java.util.UUID;
import org.bukkit.Bukkit;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.block.BlockState;
import org.bukkit.entity.Entity;
import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.util.blockmeta.conversion.BlockStoreConversionZDirectory;
public class HashChunkManager implements ChunkManager {
@@ -283,7 +283,7 @@ public class HashChunkManager implements ChunkManager {
public synchronized void saveAll() {
closeAll();
for (World world : mcMMO.p.getServer().getWorlds()) {
for (World world : Bukkit.getWorlds()) {
saveWorld(world);
}
}
@@ -292,7 +292,7 @@ public class HashChunkManager implements ChunkManager {
public synchronized void unloadAll() {
closeAll();
for (World world : mcMMO.p.getServer().getWorlds()) {
for (World world : Bukkit.getWorlds()) {
unloadWorld(world);
}
}

View File

@@ -55,26 +55,21 @@ public final class CombatUtils {
if (attacker instanceof Player && damager.getType() == EntityType.PLAYER) {
Player player = (Player) attacker;
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
if (Misc.isNPCEntity(player)) {
return;
}
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
ItemStack heldItem = player.getItemInHand();
if (target instanceof Tameable) {
if (heldItem.getType() == Material.BONE) {
TamingManager tamingManager = mcMMOPlayer.getTamingManager();
if (tamingManager.canUseBeastLore()) {
tamingManager.beastLore(target);
event.setCancelled(true);
return;
}
if (heldItem.getType() == Material.BONE && Permissions.beastLore(player)) {
mcMMOPlayer.getTamingManager().beastLore(target);
event.setCancelled(true);
return;
}
if (isFriendlyPet(player, (Tameable) target)) {
else if (isFriendlyPet(player, (Tameable) target)) {
return;
}
}
@@ -99,7 +94,7 @@ public final class CombatUtils {
swordsManager.serratedStrikes(target, event.getDamage());
}
startGainXp(mcMMOPlayer, target, SkillType.SWORDS);
startGainXp(swordsManager.getMcMMOPlayer(), target, SkillType.SWORDS);
}
}
else if (ItemUtils.isAxe(heldItem)) {
@@ -133,7 +128,7 @@ public final class CombatUtils {
axesManager.skullSplitterCheck(target, event.getDamage());
}
startGainXp(mcMMOPlayer, target, SkillType.AXES);
startGainXp(axesManager.getMcMMOPlayer(), target, SkillType.AXES);
}
}
else if (heldItem.getType() == Material.AIR) {
@@ -160,7 +155,14 @@ public final class CombatUtils {
unarmedManager.disarmCheck((Player) target);
}
startGainXp(mcMMOPlayer, target, SkillType.UNARMED);
startGainXp(unarmedManager.getMcMMOPlayer(), target, SkillType.UNARMED);
}
}
else if (heldItem.getType() == Material.BONE) {
TamingManager tamingManager = mcMMOPlayer.getTamingManager();
if (tamingManager.canUseBeastLore(target)) {
tamingManager.beastLore(target);
}
}
}
@@ -183,16 +185,17 @@ public final class CombatUtils {
if (Permissions.skillEnabled(master, SkillType.TAMING)) {
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(master);
TamingManager tamingManager = mcMMOPlayer.getTamingManager();
int skillLevel = tamingManager.getSkillLevel();
if (tamingManager.canUseFastFoodService()) {
if (skillLevel >= Taming.fastFoodServiceUnlockLevel && Permissions.fastFoodService(master)) {
tamingManager.fastFoodService(wolf, event.getDamage());
}
if (tamingManager.canUseSharpenedClaws()) {
if (skillLevel >= Taming.sharpenedClawsUnlockLevel && Permissions.sharpenedClaws(master)) {
event.setDamage(Taming.sharpenedClaws(event.getDamage()));
}
if (tamingManager.canUseGore()) {
if (Permissions.gore(master)) {
event.setDamage(tamingManager.gore(target, event.getDamage()));
}
@@ -211,47 +214,10 @@ public final class CombatUtils {
}
if (!shouldProcessSkill(target, SkillType.ARCHERY)) {
break;
}
Player player = (Player) shooter;
if (Misc.isNPCEntity(player)) {
break;
}
if (Permissions.skillEnabled(player, SkillType.ARCHERY)) {
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
ArcheryManager archeryManager = mcMMOPlayer.getArcheryManager();
if (archeryManager.canSkillShot()) {
event.setDamage(archeryManager.skillShotCheck(event.getDamage()));
}
if (target instanceof Player && SkillType.UNARMED.getPVPEnabled()) {
UnarmedManager unarmedManager = UserManager.getPlayer((Player) target).getUnarmedManager();
if (unarmedManager.canDeflect()) {
event.setCancelled(unarmedManager.deflectCheck());
if (event.isCancelled()) {
return;
}
}
}
if (archeryManager.canDaze(target)) {
event.setDamage(archeryManager.dazeCheck((Player) target, event.getDamage()));
}
if (archeryManager.canTrackArrows()) {
archeryManager.trackArrows(target);
}
archeryManager.distanceXpBonus(target);
startGainXp(mcMMOPlayer, target, SkillType.ARCHERY);
return;
}
archeryCheck((Player) shooter, target, event);
break;
default:
@@ -272,17 +238,59 @@ public final class CombatUtils {
event.setDamage(acrobaticsManager.dodgeCheck(event.getDamage()));
}
if (ItemUtils.isSword(player.getItemInHand())) {
if (!shouldProcessSkill(target, SkillType.SWORDS)) {
return;
}
ItemStack heldItem = player.getItemInHand();
SwordsManager swordsManager = mcMMOPlayer.getSwordsManager();
if (swordsManager.canUseCounterAttack(damager)) {
swordsManager.counterAttackChecks((LivingEntity) damager, event.getDamage());
if (damager instanceof Player) {
if (SkillType.SWORDS.getPVPEnabled() && ItemUtils.isSword(heldItem) && Permissions.counterAttack(player)) {
mcMMOPlayer.getSwordsManager().counterAttackChecks((LivingEntity) damager, event.getDamage());
}
}
else {
if (SkillType.SWORDS.getPVEEnabled() && damager instanceof LivingEntity && ItemUtils.isSword(heldItem) && Permissions.counterAttack(player)) {
mcMMOPlayer.getSwordsManager().counterAttackChecks((LivingEntity) damager, event.getDamage());
}
}
}
}
/**
* Process archery abilities.
*
* @param shooter The player shooting
* @param target The defending entity
* @param event The event to run the archery checks on.
*/
private static void archeryCheck(Player shooter, LivingEntity target, EntityDamageByEntityEvent event) {
if (Misc.isNPCEntity(shooter)) {
return;
}
if (Permissions.skillEnabled(shooter, SkillType.ARCHERY)) {
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(shooter);
ArcheryManager archeryManager = mcMMOPlayer.getArcheryManager();
if (archeryManager.canSkillShot()) {
event.setDamage(archeryManager.skillShotCheck(event.getDamage()));
}
if (target instanceof Player && SkillType.UNARMED.getPVPEnabled() && ((Player) target).getItemInHand().getType() == Material.AIR && Permissions.arrowDeflect((Player) target)) {
event.setCancelled(mcMMOPlayer.getUnarmedManager().deflectCheck());
if (event.isCancelled()) {
return;
}
}
if (archeryManager.canDaze(target)) {
event.setDamage(archeryManager.dazeCheck((Player) target, event.getDamage()));
}
if (archeryManager.canTrackArrows()) {
archeryManager.trackArrows(target);
}
archeryManager.distanceXpBonus(target);
startGainXp(UserManager.getPlayer(shooter), target, SkillType.ARCHERY);
}
}
@@ -574,7 +582,7 @@ public final class CombatUtils {
return false;
}
public static boolean shouldProcessSkill(Entity target, SkillType skill) {
private static boolean shouldProcessSkill(LivingEntity target, SkillType skill) {
boolean process;
if (target instanceof Player || (target instanceof Tameable && ((Tameable) target).isTamed())) {

View File

@@ -23,14 +23,17 @@ import com.gmail.nossr50.config.HiddenConfig;
import com.gmail.nossr50.config.spout.SpoutConfig;
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.datatypes.player.PlayerProfile;
import com.gmail.nossr50.datatypes.skills.Ability;
import com.gmail.nossr50.datatypes.skills.AbilityType;
import com.gmail.nossr50.datatypes.skills.SkillType;
import com.gmail.nossr50.datatypes.skills.Tool;
import com.gmail.nossr50.datatypes.skills.ToolType;
import com.gmail.nossr50.events.experience.McMMOPlayerLevelUpEvent;
import com.gmail.nossr50.events.fake.FakeBlockBreakEvent;
import com.gmail.nossr50.events.fake.FakeBlockDamageEvent;
import com.gmail.nossr50.events.fake.FakePlayerAnimationEvent;
import com.gmail.nossr50.locale.LocaleLoader;
import com.gmail.nossr50.skills.SkillManager;
import com.gmail.nossr50.util.ItemUtils;
import com.gmail.nossr50.util.Misc;
import com.gmail.nossr50.util.ModUtils;
@@ -40,8 +43,6 @@ import com.gmail.nossr50.util.player.UserManager;
import com.gmail.nossr50.util.spout.SpoutUtils;
public class SkillUtils {
private static int enchantBuff = AdvancedConfig.getInstance().getEnchantBuff();
public static int handleFoodSkills(Player player, SkillType skill, int eventFoodLevel, int baseLevel, int maxLevel, int rankChange) {
int skillLevel = UserManager.getPlayer(player).getProfile().getSkillLevel(skill);
@@ -91,14 +92,20 @@ public class SkillUtils {
* Sends a message to the player when the cooldown expires.
*
* @param mcMMOPlayer The player to send a message to
* @param ability The ability to watch cooldowns for
* @param skill The skill type to watch cooldowns for
*/
public static void watchCooldown(McMMOPlayer mcMMOPlayer, AbilityType ability) {
Player player = mcMMOPlayer.getPlayer();
public static void watchCooldown(McMMOPlayer mcMMOPlayer, SkillType skill) {
if (mcMMOPlayer == null) {
return;
}
if (!mcMMOPlayer.getAbilityInformed(ability) && cooldownOver(mcMMOPlayer.getProfile().getSkillDATS(ability) * Misc.TIME_CONVERSION_FACTOR, ability.getCooldown(), player)) {
mcMMOPlayer.setAbilityInformed(ability, true);
player.sendMessage(ability.getAbilityRefresh());
Player player = mcMMOPlayer.getPlayer();
Ability ability = mcMMOPlayer.getSkillManager(skill).getAbility();
AbilityType abilityType = skill.getAbilityType();
if (!ability.getInformed() && cooldownOver(mcMMOPlayer.getProfile().getSkillDATS(abilityType) * Misc.TIME_CONVERSION_FACTOR, abilityType.getCooldown(), player)) {
ability.setInformed(true);
player.sendMessage(abilityType.getAbilityRefresh());
}
}
@@ -113,45 +120,48 @@ public class SkillUtils {
return;
}
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
AbilityType ability = skill.getAbility();
ToolType tool = skill.getTool();
ItemStack inHand = player.getItemInHand();
if (ModUtils.isCustomTool(inHand) && !ModUtils.getToolFromItemStack(inHand).isAbilityEnabled()) {
return;
}
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
if (!mcMMOPlayer.getAbilityUse()) {
return;
}
for (AbilityType abilityType : AbilityType.values()) {
if (mcMMOPlayer.getAbilityMode(abilityType)) {
for (SkillManager skillManager : mcMMOPlayer.getSkillManagers().values()) {
if (skillManager.getAbility().getMode()) {
return;
}
}
SkillManager skillManager = mcMMOPlayer.getSkillManager(skill);
Tool tool = skillManager.getTool();
ToolType toolType = skill.getToolType();
AbilityType abilityType = skill.getAbilityType();
PlayerProfile playerProfile = mcMMOPlayer.getProfile();
/*
* Woodcutting & Axes need to be treated differently.
* Basically the tool always needs to ready and we check to see if the cooldown is over when the user takes action
*/
if (ability.getPermissions(player) && tool.inHand(inHand) && !mcMMOPlayer.getToolPreparationMode(tool)) {
if (abilityType.getPermissions(player) && toolType.inHand(inHand) && !tool.getPreparationMode()) {
if (skill != SkillType.WOODCUTTING && skill != SkillType.AXES) {
if (!mcMMOPlayer.getAbilityMode(ability) && !cooldownOver(playerProfile.getSkillDATS(ability) * Misc.TIME_CONVERSION_FACTOR, ability.getCooldown(), player)) {
player.sendMessage(LocaleLoader.getString("Skills.TooTired", calculateTimeLeft(playerProfile.getSkillDATS(ability) * Misc.TIME_CONVERSION_FACTOR, ability.getCooldown(), player)));
if (!skillManager.getAbility().getMode() && !cooldownOver(playerProfile.getSkillDATS(abilityType) * Misc.TIME_CONVERSION_FACTOR, abilityType.getCooldown(), player)) {
player.sendMessage(LocaleLoader.getString("Skills.TooTired", calculateTimeLeft(playerProfile.getSkillDATS(abilityType) * Misc.TIME_CONVERSION_FACTOR, abilityType.getCooldown(), player)));
return;
}
}
if (Config.getInstance().getAbilityMessagesEnabled()) {
player.sendMessage(tool.getRaiseTool());
player.sendMessage(toolType.getRaiseTool());
}
mcMMOPlayer.setToolPreparationATS(tool, System.currentTimeMillis());
mcMMOPlayer.setToolPreparationMode(tool, true);
tool.setPreparationATS(System.currentTimeMillis());
tool.setPreparationMode(true);
}
}
@@ -165,38 +175,40 @@ public class SkillUtils {
*/
public static void monitorSkill(McMMOPlayer mcMMOPlayer, long curTime, SkillType skill) {
final int FOUR_SECONDS = 4000;
ToolType tool = skill.getTool();
SkillManager skillManager = mcMMOPlayer.getSkillManager(skill);
Tool tool = skillManager.getTool();
if (mcMMOPlayer.getToolPreparationMode(tool) && curTime - (mcMMOPlayer.getToolPreparationATS(tool) * Misc.TIME_CONVERSION_FACTOR) >= FOUR_SECONDS) {
mcMMOPlayer.setToolPreparationMode(tool, false);
if (tool.getPreparationMode() && curTime - (tool.getPreparationATS() * Misc.TIME_CONVERSION_FACTOR) >= FOUR_SECONDS) {
tool.setPreparationMode(false);
if (Config.getInstance().getAbilityMessagesEnabled()) {
mcMMOPlayer.getPlayer().sendMessage(tool.getLowerTool());
mcMMOPlayer.getPlayer().sendMessage(skill.getToolType().getLowerTool());
}
}
AbilityType ability = skill.getAbility();
Ability ability = skillManager.getAbility();
AbilityType abilityType = skill.getAbilityType();
Player player = mcMMOPlayer.getPlayer();
if (ability.getPermissions(player)) {
if (mcMMOPlayer.getAbilityMode(ability) && (mcMMOPlayer.getProfile().getSkillDATS(ability) * Misc.TIME_CONVERSION_FACTOR) <= curTime) {
if (ability == AbilityType.BERSERK) {
if (abilityType.getPermissions(player)) {
if (ability.getMode() && (mcMMOPlayer.getProfile().getSkillDATS(abilityType) * Misc.TIME_CONVERSION_FACTOR) <= curTime) {
if (abilityType == AbilityType.BERSERK) {
player.setCanPickupItems(true);
}
else if (ability == AbilityType.SUPER_BREAKER || ability == AbilityType.GIGA_DRILL_BREAKER) {
else if (abilityType == AbilityType.SUPER_BREAKER || abilityType == AbilityType.GIGA_DRILL_BREAKER) {
handleAbilitySpeedDecrease(player);
}
mcMMOPlayer.setAbilityMode(ability, false);
mcMMOPlayer.setAbilityInformed(ability, false);
ability.setMode(false);
ability.setInformed(false);
ParticleEffectUtils.playAbilityDisabledEffect(player);
if (mcMMOPlayer.useChatNotifications()) {
player.sendMessage(ability.getAbilityOff());
player.sendMessage(abilityType.getAbilityOff());
}
sendSkillMessage(player, ability.getAbilityPlayerOff(player));
sendSkillMessage(player, abilityType.getAbilityPlayerOff(player));
}
}
}
@@ -213,10 +225,9 @@ public class SkillUtils {
int xpRemoved = 0;
if (profile.getSkillXpLevel(skillType) >= profile.getXpToLevel(skillType)) {
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
while (profile.getSkillXpLevel(skillType) >= profile.getXpToLevel(skillType)) {
if ((skillType.getMaxLevel() >= profile.getSkillLevel(skillType) + 1) && (Config.getInstance().getPowerLevelCap() >= mcMMOPlayer.getPowerLevel() + 1)) {
if ((skillType.getMaxLevel() >= profile.getSkillLevel(skillType) + 1) && (Config.getInstance().getPowerLevelCap() >= UserManager.getPlayer(player).getPowerLevel() + 1)) {
int xp = profile.getXpToLevel(skillType);
xpRemoved += xp;
@@ -364,46 +375,46 @@ public class SkillUtils {
* Check to see if an ability can be activated.
*
* @param mcMMOPlayer The player activating the ability
* @param type The skill the ability is based on
* @param skill The skill the ability is based on
*/
public static void abilityCheck(McMMOPlayer mcMMOPlayer, SkillType type) {
ToolType tool = type.getTool();
AbilityType ability = type.getAbility();
mcMMOPlayer.setToolPreparationMode(tool, false);
public static void abilityCheck(McMMOPlayer mcMMOPlayer, SkillType skill) {
SkillManager skillManager = mcMMOPlayer.getSkillManager(skill);
Ability ability = skillManager.getAbility();
AbilityType abilityType = skill.getAbilityType();
Player player = mcMMOPlayer.getPlayer();
PlayerProfile playerProfile = mcMMOPlayer.getProfile();
skillManager.getTool().setPreparationMode(false);
/*
* Axes and Woodcutting are odd because they share the same tool.
* We show them the too tired message when they take action.
*/
if (type == SkillType.WOODCUTTING || type == SkillType.AXES) {
if (!mcMMOPlayer.getAbilityMode(ability) && !cooldownOver(playerProfile.getSkillDATS(ability) * Misc.TIME_CONVERSION_FACTOR, ability.getCooldown(), player)) {
player.sendMessage(LocaleLoader.getString("Skills.TooTired", calculateTimeLeft(playerProfile.getSkillDATS(ability) * Misc.TIME_CONVERSION_FACTOR, ability.getCooldown(), player)));
if (skill == SkillType.WOODCUTTING || skill == SkillType.AXES) {
if (!ability.getMode() && !cooldownOver(playerProfile.getSkillDATS(abilityType) * Misc.TIME_CONVERSION_FACTOR, abilityType.getCooldown(), player)) {
player.sendMessage(LocaleLoader.getString("Skills.TooTired", calculateTimeLeft(playerProfile.getSkillDATS(abilityType) * Misc.TIME_CONVERSION_FACTOR, abilityType.getCooldown(), player)));
return;
}
}
if (!mcMMOPlayer.getAbilityMode(ability) && cooldownOver(playerProfile.getSkillDATS(ability), ability.getCooldown(), player)) {
int ticks = PerksUtils.handleActivationPerks(player, 2 + (playerProfile.getSkillLevel(type) / AdvancedConfig.getInstance().getAbilityLength()), ability.getMaxTicks());
if (!ability.getMode() && cooldownOver(playerProfile.getSkillDATS(abilityType), abilityType.getCooldown(), player)) {
int ticks = PerksUtils.handleActivationPerks(player, 2 + (playerProfile.getSkillLevel(skill) / AdvancedConfig.getInstance().getAbilityLength()), abilityType.getMaxTicks());
ParticleEffectUtils.playAbilityEnabledEffect(player);
if (mcMMOPlayer.useChatNotifications()) {
player.sendMessage(ability.getAbilityOn());
player.sendMessage(abilityType.getAbilityOn());
}
SkillUtils.sendSkillMessage(player, ability.getAbilityPlayer(player));
SkillUtils.sendSkillMessage(player, abilityType.getAbilityPlayer(player));
playerProfile.setSkillDATS(ability, System.currentTimeMillis() + (ticks * Misc.TIME_CONVERSION_FACTOR));
mcMMOPlayer.setAbilityMode(ability, true);
playerProfile.setSkillDATS(abilityType, System.currentTimeMillis() + (ticks * Misc.TIME_CONVERSION_FACTOR));
ability.setMode(true);
if (ability == AbilityType.BERSERK) {
if (abilityType == AbilityType.BERSERK) {
player.setCanPickupItems(false);
}
else if (ability == AbilityType.SUPER_BREAKER || ability == AbilityType.GIGA_DRILL_BREAKER) {
else if (abilityType == AbilityType.SUPER_BREAKER || abilityType == AbilityType.GIGA_DRILL_BREAKER) {
handleAbilitySpeedIncrease(player);
}
}
@@ -459,6 +470,22 @@ public class SkillUtils {
}
}
/**
* Check if a skill level is higher than the max bonus level of the ability.
*
* @param skillLevel Skill level to check
* @param maxLevel Max level of the ability
* @return whichever value is lower
*/
public static int skillCheck(int skillLevel, int maxLevel) {
// TODO: Could we just use Math.min(skillLevel, maxLevel) here?
if (skillLevel > maxLevel) {
return maxLevel;
}
return skillLevel;
}
public static void handleAbilitySpeedIncrease(Player player) {
if (HiddenConfig.getInstance().useEnchantmentBuffs()) {
ItemStack heldItem = player.getItemInHand();
@@ -476,7 +503,7 @@ public class SkillUtils {
}
itemLore.add("mcMMO Ability Tool");
itemMeta.addEnchant(Enchantment.DIG_SPEED, efficiencyLevel + enchantBuff, true);
itemMeta.addEnchant(Enchantment.DIG_SPEED, efficiencyLevel + 5, true);
itemMeta.setLore(itemLore);
heldItem.setItemMeta(itemMeta);
@@ -498,10 +525,10 @@ public class SkillUtils {
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
int ticks = 0;
if (mcMMOPlayer.getAbilityMode(AbilityType.SUPER_BREAKER)) {
if (mcMMOPlayer.getSkillManager(SkillType.MINING).getAbility().getMode()) {
ticks = ((int) (mcMMOPlayer.getProfile().getSkillDATS(AbilityType.SUPER_BREAKER) - System.currentTimeMillis())) / Misc.TIME_CONVERSION_FACTOR;
}
else if (mcMMOPlayer.getAbilityMode(AbilityType.GIGA_DRILL_BREAKER)) {
else if (mcMMOPlayer.getSkillManager(SkillType.EXCAVATION).getAbility().getMode()) {
ticks = ((int) (mcMMOPlayer.getProfile().getSkillDATS(AbilityType.GIGA_DRILL_BREAKER) - System.currentTimeMillis())) / Misc.TIME_CONVERSION_FACTOR;
}
@@ -542,11 +569,11 @@ public class SkillUtils {
if (itemLore.remove("mcMMO Ability Tool")) {
int efficiencyLevel = item.getEnchantmentLevel(Enchantment.DIG_SPEED);
if (efficiencyLevel <= enchantBuff) {
if (efficiencyLevel <= 5) {
itemMeta.removeEnchant(Enchantment.DIG_SPEED);
}
else {
itemMeta.addEnchant(Enchantment.DIG_SPEED, efficiencyLevel - enchantBuff, true);
itemMeta.addEnchant(Enchantment.DIG_SPEED, efficiencyLevel - 5, true);
}
itemMeta.setLore(itemLore);
@@ -595,8 +622,12 @@ public class SkillUtils {
return chance > Misc.getRandom().nextInt(activationChance);
}
public static boolean activationSuccessful(int skillLevel, int activationChance, double maxChance, int maxLevel) {
return ((maxChance / maxLevel) * Math.min(skillLevel, maxLevel)) > Misc.getRandom().nextInt(activationChance);
public static boolean activationSuccessful(Player player, SkillType skill, double chance) {
return chance > Misc.getRandom().nextInt(PerksUtils.handleLuckyPerks(player, skill));
}
public static boolean unlockLevelReached(Player player, SkillType skill, int unlockLevel) {
return UserManager.getPlayer(player).getProfile().getSkillLevel(skill) > unlockLevel;
}
public static boolean treasureDropSuccessful(double dropChance, int activationChance) {

View File

@@ -16,8 +16,6 @@ Skills:
General:
# This setting will determine when the length of every ability gets longer with 1 second
Ability_IncreaseLevel: 50
# This setting determines how many enchant levels to use when buffing Super Breaker & Giga Drill Breaker
Ability_EnchantBuff: 5
#
# Settings for Acrobatics
###
@@ -249,9 +247,6 @@ Skills:
SuperRepair_ChanceMax: 100.0
SuperRepair_MaxBonusLevel: 1000
# Salvage_UnlockLevel: Level when Salvage become available
Salvage_UnlockLevel: 600
Arcane_Forging:
May_Lose_Enchants: true
Rank_Levels:

View File

@@ -72,10 +72,7 @@ Mods:
Items:
Chimaera_Wing:
Enabled: true
Cooldown: 240
Prevent_Use_Underground: true
Use_Cost: 1
Recipe_Cost: 5
Feather_Cost: 10
Item_ID: 288
#
@@ -163,7 +160,9 @@ Skills:
Level_Cap: 0
Anvil_Messages: true
Anvil_ID: 42
Salvage_enabled: true
Salvage_Anvil_ID: 41
Salvage_UnlockLevel: 600
Salvage_tools: true
Salvage_armor: true
Smelting:
@@ -187,6 +186,7 @@ Skills:
SmoothBrick_To_CrackedBrick: true
Woodcutting:
Level_Cap: 0
Requires_Axe: true
#
# Settings for Double Drops
@@ -360,11 +360,8 @@ Commands:
# Settings for particles
###
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

View File

@@ -1,13 +1,3 @@
#
# Item Weights configuration
#
# This file is used to determine the value of an item. This will only
# happen when users are sharing items in a party using the EQUAL item share mode.
#
# Rare items should have a higher value than common items. If an item is not listed
# here, the value from "Default" will be used instead.
#
#####
Item_Weights:
Default: 5
Emerald: 150

View File

@@ -32,6 +32,7 @@ Axes.Ability.Bonus.4=Vyssi ucinek
Axes.Ability.Bonus.5=Zpusobi bonusove zraneni o velkosi {0} vsem neozbrojenym nepratelum
Axes.Ability.Lower=[[GRAY]]**ODLOZIL JSI SVOU SEKERU**
Axes.Ability.Ready=[[GREEN]]**P\u0158IPRAVUJE\u0160 SI SVOJ\u00cd SEKERU!**
Axes.Combat.Cleave.Proc=[[DARK_RED]]Zas\u00e1hnut ROZ\u0160T\u00cdPNUT\u00cdM!
Axes.Combat.CritStruck=[[DARK_RED]]Byl jsi KRITICKY zasazen!
Axes.Combat.CritChance=[[RED]]Sance na kriticky uder: [[YELLOW]]{0}%
Axes.Combat.CriticalHit=[[RED]]KRITICK\u00dd Z\u00c1SAH!
@@ -72,16 +73,13 @@ Excavation.Skills.GigaDrillBreaker.Other.Off=[[RED]]Ni\u010ditel hl\u00edny[[GRE
Excavation.Skills.GigaDrillBreaker.Other.On=[[GREEN]]{0}[[DARK_GREEN]] pou\u017eil [[RED]]Giga Vrta\u010dku!
Excavation.Skillup=[[YELLOW]]Dovednost v kopani byla navysena o {0}. Celkem ({1})
Fishing.Ability.Info=[[RED]]Magick\u00fd lovec: [[GRAY]] **Zvy\u0161uje se s dovednost\u00ed Lovec poklad\u016f**
Fishing.Ability.Locked.0=Uzam\u010deno do {0}+ schopnosti (Prot\u0159ep\u00e1n\u00ed)
Fishing.Ability.Rank=[[RED]]Lovec Poklad\u016f Level: [[YELLOW]]{0}/5
Fishing.Ability.FD=[[RED]]Ryb\u00e1\u0159\u016fv apetit: [[YELLOW]]Rank {0}
Fishing.Effect.0=Lovec pokladu (pasivni)
Fishing.Effect.1=Fish up misc. objects
Fishing.Effect.2=Magicky Lovec
Fishing.Effect.3=Na\u0161el si o\u010darovanou v\u011bc
Fishing.Effect.4=Shake (vs. Entities)
Fishing.Effect.5=Vyklepni p\u0159edm\u011bty z p\u0159\u00ed\u0161er s prutem
Fishing.Effect.6=Ryb\u00e1\u0159\u016fv apetit
Fishing.Enchant.Chance=[[RED]]\u0160ance na magick\u00e9ho lovce: [[YELLOW]]{0}
Fishing.ItemFound=[[GRAY]]Nasel si poklad!
Fishing.Listener=Rybareni:
@@ -98,7 +96,6 @@ Herbalism.Ability.Ready=[[GREEN]]**PRIPRAVIL JSI SVOU MOTYKU**
Herbalism.Effect.0=Green Terra (SCHOPNOST)
Herbalism.Effect.1=\u0160\u00ed\u0159en\u00ed planety, 3x v\u00edce drop\u016f
Herbalism.Effect.2=Zahradnik (Wheat)
Herbalism.Effect.3=Automaticky sazi plodiny pri sklizeni
Herbalism.Effect.4=Zahradn\u00edk (Cobble/Stone Brick/Dirt)
Herbalism.Effect.5=Zar\u016fst cihly mechem, nebo nebo nechat vyr\u016fst tr\u00e1vu
Herbalism.Effect.6=Farm\u00e1\u0159\u016fv apetit
@@ -118,7 +115,7 @@ Mining.Ability.Lower=[[GRAY]]**SLOZIL SI SVUJ KRUMPAC**
Mining.Ability.Ready=[[GREEN]]**KRUMPAC PRIPRAVEN**
Mining.Effect.0=Super Breaker (SCHOPNOST)
Mining.Effect.1=Rychlost+, sance na trojnasobny zisk
Mining.Effect.2=Dvojn\u00e1sobn\u00fd zisk
Mining.Effect.2=Dvojnasobne zisky
Mining.Effect.3=Zdvojnasobi normalni zisk
Mining.Effect.4=Tezeni vybuchem
Mining.Effect.5=Bonusy za tezeni s TNT
@@ -137,6 +134,14 @@ Mining.Skills.SuperBreaker.Other.On=[[GREEN]]{0}[[DARK_GREEN]] has used [[RED]]M
Mining.Skills.SuperBreaker.Refresh=[[GREEN]]Schopnost [[YELLOW]]Super Breaker [[GREEN]]obnovena!
Mining.Skillup=[[YELLOW]]Dovednost v dolovani byla navysena o {0}. Celkem ({1})
Mining.Blast.Boom=[[GRAY]]**VYBUCH**
Mining.Blast.Effect.0=+35% rud
Mining.Blast.Effect.1=+40% rud
Mining.Blast.Effect.2=+45% rud, bez suti
Mining.Blast.Effect.3=+50% rud, bez suti
Mining.Blast.Effect.4=+55% rud, bez suti, dvojit\u00e9 dropy
Mining.Blast.Effect.5=+60% rud, bez suti, dvojit\u00e9 dropy
Mining.Blast.Effect.6=+65% rud, bez suti, trojit\u00e9 dropy
Mining.Blast.Effect.7=+70% rud, bez suti, trojit\u00e9 dropy
Mining.Blast.Radius.Increase=[[RED]]Navyseni radiusu vybuchu: [[YELLOW]]+{0}
Mining.Blast.Rank=[[RED]]V\u00fdbu\u0161n\u00e9 t\u011b\u017een\u00ed [[YELLOW]] Rank {0}/8 [[GRAY]]({1})
Mining.Blast.Other.On=[[GREEN]]{0}[[DARK_GREEN]] pou\u017eil [[RED]]V\u00fdbu\u0161n\u00e9 T\u011b\u017een\u00ed!
@@ -174,7 +179,7 @@ Repair.Skills.StackedItems=[[DARK_RED]]Nem\u016f\u017ee\u0161 opravovat nestacko
Repair.Skills.Super.Chance=[[RED]]\u0160ance na superopravov\u00e1n\u00ed: [[YELLOW]]{0}
Repair.Skillup=[[YELLOW]]Dovednost v opravovani byla navysena o {0}. Celkem ({1})
Repair.Arcane.Chance.Downgrade=[[GRAY]]Sance na degradovani magicke sily predmetu: [[YELLOW]]{0}%
Repair.Arcane.Chance.Success=[[GRAY]]Pravd\u011bpodobnost \u00fasp\u011bchu AF: [[YELLOW]]{0}%
Repair.Arcane.Chance.Success=[[GRAY]]Mira uspesnosti AF: [[YELLOW]]{0}%
Repair.Arcane.Downgrade=[[RED]]Magick\u00e1 s\u00edla tohoto p\u0159edm\u011btu zesl\u00e1bla.
Repair.Arcane.Fail=[[RED]]Predmet ztratil navzdy svou magickou silu.
Repair.Arcane.Lost=[[RED]]Nemel jsi dostatocnou dovednost pro zachovani ocarovani predmetu.
@@ -212,7 +217,6 @@ Taming.Ability.Bonus.2=Husta srst
Taming.Ability.Bonus.4=Otresuvzdorny
Taming.Ability.Bonus.6=Nabrousene drapy
Taming.Ability.Bonus.8=Rychl\u00e9 Ob\u010derstven\u00ed
Taming.Ability.Bonus.9={0} \u0161ance na vyl\u00e9\u010den\u00ed p\u0159i \u00fatoku
Taming.Combat.Chance.Gore=[[RED]]\u0160ance na nabodnut\u00ed: [[YELLOW]]{0}
Taming.Effect.0=Tradice \u0161elem
Taming.Effect.1=Na\u0159\u00edznut\u00ed kost\u00ed kontroluje vlky & oceloty
@@ -289,7 +293,9 @@ Combat.ArrowDeflect=[[WHITE]]**SIP VYCHYLEN**
Combat.BeastLore=[[GREEN]]**TRADICE SELEM**
Combat.BeastLoreHealth=[[DARK_AQUA]]Zivoty ([[GREEN]]{0}[[DARK_AQUA]]/{1})
Combat.BeastLoreOwner=[[DARK_AQUA]]Vlastn\u00edk ([[RED]]{0}[[DARK_AQUA]])
Combat.BurningArrowHit=[[DARK_RED]]Byl jsi zasazen horicim sipem!
Combat.Gore=[[GREEN]]**PRUNIK**
Combat.Ignition=[[RED]]**VZPLANUTI**
Combat.StruckByGore=[[RED]]**BYL JSI PROBODNUT**
Combat.TargetDazed=C\u00edl byl [[DARK_RED]]Omr\u00e1\u010den
Combat.TouchedFuzzy=[[DARK_RED]]Nejasne dotcen. Mas zavrat.
@@ -308,9 +314,6 @@ Commands.Invite.Accepted=[[GREEN]]Pozvanka prijata. Pridal jsi se k party {0}
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.mcrank.Heading=[[GOLD]]-=OSOBN\u00cd HODNOCEN\u00cd=-
Commands.mctop.Tip=[[GOLD]]Tip: Pro osobn\u00ed statistiky pou\u017eij [[RED]]/mcrank[[GOLD]]!
Commands.mmoedit=[player] <skill> <newvalue> [[RED]] - Modify target
Commands.ModDescription=[[RED]]- Precti si strucny popis pluginu
Commands.NoConsole=Tento prikaz nepodporuje pouziti z konzole.
@@ -318,10 +321,8 @@ Commands.Other=[[GREEN]]--OSTATNI PRIKAZY--
Commands.Party.Accept=[[RED]]- Potvrdit pozvanku do party
Commands.Party.Chat.Off=Chat jenom pro partu [[RED]]Vypnuty
Commands.Party.Chat.On=Party chat [[RED]]Off
Commands.Party.Chat.Prefix=[[GREEN]]([[WHITE]]{0}[[GREEN]])
Commands.Party.Commands=[[GREEN]]--P\u0158\u00cdKAZY PARTY--
Commands.Party.Invite.0=[[RED]]VAROVANI: [[GREEN]]Obdrzel jsi pozvanku do party {0} od {1}
Commands.Party.Rename=[[GRAY]]Jm\u00e9no party zm\u011bn\u011bno na: [[WHITE]]{0}
Commands.Party.Kick=[[RED]]Byl jsi vyhozen z party {0}!
Commands.Party.Leave=[[RED]]Opustil jsi party
Commands.Party.None=[RED]]Nejsi v zadne party.
@@ -331,17 +332,12 @@ 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.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
Commands.Stats.Self=Tvoje statistiky
Commands.Stats=[[RED]]- Shl\u00e9dnout svoje mcMMO statistiky
Commands.ToggleAbility=[[RED]]- Aktivace schopnosti prav\u00fdm tla\u010d\u00edtkem.
Commands.Usage.Message=zprava
Commands.Usage.Page=stranka
Commands.Usage.Password=heslo
Commands.Usage.Player=hrac
mcMMO.NoInvites=[[RED]]Momentalne nemas zadne pozvanky
mcMMO.NoPermission=[[DARK_RED]]Nedostatecna prava
mcMMO.NoSkillNote=[[DARK_GRAY]]Pokud nemas pristup k schopnosti, nebude zobrazena.
@@ -353,12 +349,9 @@ Party.Locked=[[RED]]Parta je zamnuta, pouze velitel party t\u011b m\u016f\u017ee
Party.NotInYourParty=[[DARK_RED]]{0} nen\u00ed ve tv\u00e9 part\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!
Party.Player.InSameParty=[[RED]]{0} u\u017e je na va\u0161\u00ed party!
Party.PlayerNotInParty=[[DARK_RED]]{0} nen\u00ed na party
Party.Teleport.Dead=[[RED]]Nemuzes se teleportovat k mrtvemu hraci.
Party.Teleport.Hurt=[[RED]]Byl jsi zasa\u017een p\u0159ed {0} sekundami a nem\u016f\u017ee\u0161 se teleportovat.
Party.Teleport.Player=[[GREEN]]Byl jsi teleportovan k {0}.
Party.Teleport.Self=[[RED]]Nem\u016f\u017ee\u0161 se teleportovat s\u00e1m na sebe!
Party.Teleport.Target=[[GREEN]]{0} se k tobe teleportoval.
Party.Unlocked=[[GRAY]]Party je odemknuta
Commands.XPGain.Acrobatics=Padani
@@ -387,10 +380,8 @@ Effects.Level=[[DARK_GRAY]]LVL: [[GREEN]]{0} [[DARK_AQUA]]XP[[YELLOW]]([[GOLD]]{
Effects.Template=[[DARK_AQUA]]{0}: [[GREEN]]{1}
Guides.Acrobatics=[[DARK_AQUA]]O akrobacii:\n[[YELLOW]]Akrobacie je um \u00fa\u017easn\u00e9ho pohybu v mcMMO.\n[[YELLOW]]D\u00e1v\u00e1 ti bonusy v boji a bonusy po\u0161kozen\u00ed v prost\u0159ed\u00ed.\n[[DARK_AQUA]]Zisk XP:\n[[YELLOW]]K z\u00edsk\u00e1n\u00ed XP v t\u00e9to dovednosti mus\u00ed\u0161 uhybat\n[[YELLOW]]p\u0159ed ranami nep\u0159\u00edtele, nebo p\u0159e\u017e\u00edvat p\u00e1dy.\n[[DARK_AQUA]]Jak fungujou kotrmelce?\n[[YELLOW]]M\u00e1\u0161 \u0161anci kdy\u017e pad\u00e1\u0161 zmen\u0161it \u0161kody, kter\u00e9\n[[YELLOW]]by ti zp\u016fsobily p\u00e1dy. Dr\u017e kl\u00e1vesu na skr\u010den\u00ed\n[[YELLOW]]p\u0159i p\u00e1du k v\u00fd\u0161en\u00ed \u0161ance na kotrmelec.\n[[YELLOW]]T\u00edm vznik\u00e1 P\u016fvabn\u00fd kotrmelec m\u00edsto standartn\u00edho.\n[[YELLOW]]P\u016fvabn\u00e9 kotrmelce jsou jako norm\u00e1ln\u00ed, ale m\u00e1\u0161 2x v\u011bt\u0161\u00ed \u0161anci\n[[YELLOW]]p\u0159e\u017e\u00edt p\u00e1d a jsou bezpe\u010dn\u011bj\u0161\u00ed ne\u017e norm\u00e1ln\u00ed\n[[YELLOW]]\u0160ance na kotrmelec jsou ovlivn\u011bny tv\u00fdmi dovednostmi\n[[DARK_AQUA]]Jak funguje \u00faskok?\n[[YELLOW]]\u00daskok je \u0161ance na rozp\u016flen\u00ed \u0161kod\n[[YELLOW]]kter\u00e9 by jsi z\u00edskal v boji.\n[[YELLOW]]Je ovlivn\u011bn tv\u00fdmi dovednostmi
Guides.Axes=Pruvodce jiz brzy...
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!
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}
@@ -410,13 +401,3 @@ Stats.Own.Stats=[[GREEN]][mcMMO] Statistiky
Perks.xp.name=Zku\u0161enost
Perks.xp.desc=Obdrzene {0}x Zkusenosti
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.
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.HudButton.1=Typ HUD: {0}
Spout.Menu.HudButton.2=Zm\u011b\u0148te si styl HUD!
MOTD.Version=[[GOLD]][mcMMO] - verze [[DARK_AQUA]]{0}
MOTD.Website=[[GOLD]][mcMMO] [[GREEN]]{0}[[YELLOW]] - Web mcMMO
Commands.Description.mcremove=Odstranit u\u017eivatele z datab\u00e1ze mcMMO

View File

@@ -32,6 +32,7 @@ Axes.Ability.Bonus.4=Greater Impact
Axes.Ability.Bonus.5=Deal {0} Bonus DMG to unarmored foes
Axes.Ability.Lower=[[GRAY]]**YOU LOWER YOUR AXE**
Axes.Ability.Ready=[[GREEN]]**YOU READY YOUR AXE**
Axes.Combat.Cleave.Proc=[[DARK_RED]]Struck by CLEAVE!
Axes.Combat.CritStruck=[[DARK_RED]]You were CRITICALLY hit!
Axes.Combat.CritChance=[[RED]]Chance to critically strike: [[YELLOW]]{0}
Axes.Combat.CriticalHit=[[RED]]CRITICAL HIT!
@@ -145,6 +146,14 @@ Mining.Skills.SuperBreaker.Other.On=[[GREEN]]{0}[[DARK_GREEN]] has used [[RED]]S
Mining.Skills.SuperBreaker.Refresh=[[GREEN]] Eich [[YELLOW]] Super Torri\'r [[GREEN]] gallu ei hadnewyddu!
Mining.Skillup=[[YELLOW]] sgiliau Mwyngloddio cynyddu {0}. Cyfanswm ({1})
Mining.Blast.Boom=[[GRAY]]**BOOM**
Mining.Blast.Effect.0=+35% ore yield
Mining.Blast.Effect.1=+40% ore yield
Mining.Blast.Effect.2=+45% ore yield, no debris
Mining.Blast.Effect.3=+50% ore yield, no debris
Mining.Blast.Effect.4=+55% ore yield, no debris, double drops
Mining.Blast.Effect.5=+60% ore yield, no debris, double drops
Mining.Blast.Effect.6=+65% ore yield, no debris, triple drops
Mining.Blast.Effect.7=+70% ore yield, no debris, triple drops
Mining.Blast.Radius.Increase=[[RED]] Chwyth Cynnydd Radiws [[YELLOW]] {0}
Mining.Blast.Rank=[[RED]]Blast Mining: [[YELLOW]] Rank {0}/8 [[GRAY]]({1})
Mining.Blast.Other.On=[[GREEN]]{0}[[DARK_GREEN]] has used [[RED]]Blast Mining!
@@ -312,7 +321,9 @@ Combat.ArrowDeflect=[[WHITE]]**ARROW DEFLECT**
Combat.BeastLore=[[GREEN]] ** bwystfil ll\u00ean **
Combat.BeastLoreHealth=[[DARK_AQUA]] Iechyd ([[GREEN]] {0} [[DARK_AQUA]] / {1})
Combat.BeastLoreOwner=[[DARK_AQUA]]Owner ([[RED]]{0}[[DARK_AQUA]])
Combat.BurningArrowHit=[[DARK_RED]]You were struck by a burning arrow!
Combat.Gore=[[GREEN]]**GORED**
Combat.Ignition=[[RED]]**IGNITION**
Combat.StruckByGore=[[RED]]**YOU HAVE BEEN GORED**
Combat.TargetDazed=Target was [[DARK_RED]]Dazed
Combat.TouchedFuzzy=[[DARK_RED]] cyffwrdd Fuzzy. Teimlo benysgafn.
@@ -405,6 +416,7 @@ Party.Password.Incorrect=[[RED]]Party password is incorrect.
Party.Password.Set=[[GREEN]] Blaid cyfrinair wedi ei osod i {0}
Party.Player.Invalid=[[RED]] Nid yw hynny\'n chwaraewr ddilys.
Party.Teleport.Dead=[[RED]] Ni allwch teleport y chwaraewr yn farw.
Party.Teleport.Hurt=[[RED]]You\'ve been hurt in the last {0} seconds and cannnot teleport.
Party.Teleport.Player=[[GREEN]]You have teleported to {0}.
Party.Teleport.Self=[[RED]]You can\'t teleport to yourself!
Party.Teleport.Target=[[GREEN]] {0} wedi teleported i chi.

View File

@@ -32,6 +32,7 @@ Axes.Ability.Bonus.4=St\u00f8rre Slag
Axes.Ability.Bonus.5=P\u00e5f\u00f8r {0} Bonus Skade til ubev\u00e6bnede fjender
Axes.Ability.Lower=[[GRAY]]**DU S\u00c6NKER DIN \u00d8KSE**
Axes.Ability.Ready=[[GREEN]]**DU G\u00d8R DIN \u00d8KSE KLAR**
Axes.Combat.Cleave.Proc=[[DARK_RED]]Du bliver hugget midt over!
Axes.Combat.CritStruck=[[DARK_RED]]Du er blevet KRITISK ramt!
Axes.Combat.CritChance=[[RED]]Chance for at ramme kritisk: [[YELLOW]]{0}
Axes.Combat.CriticalHit=[[RED]]KRITISK SLAG!
@@ -145,6 +146,14 @@ Mining.Skills.SuperBreaker.Other.On=[[GREEN]]{0}[[DARK_GREEN]] har brugt [[RED]]
Mining.Skills.SuperBreaker.Refresh=[[GREEN]]Din [[YELLOW]]Super Smadrer [[GREEN]]evne er genindl\u00e6st!
Mining.Skillup=[[YELLOW]]Minedriftsevne for\u00f8get med {0}. Total ({1})
Mining.Blast.Boom=[[GRAY]]**BOOM**
Mining.Blast.Effect.0=35% malm udbytte
Mining.Blast.Effect.1=40% malm udbytte
Mining.Blast.Effect.2=45% malm udbytte, ingen byggeaffald
Mining.Blast.Effect.3=50% malm udbytte, ingen byggeaffald
Mining.Blast.Effect.4=+55% malm udbytte, ingen byggeaffald, 2x udbytte
Mining.Blast.Effect.5=+60% malm udbytte, ingen byggeaffald, 2x udbytte
Mining.Blast.Effect.6=+65% malm udbytte, ingen byggeaffald, 3x udbytte
Mining.Blast.Effect.7=+70% malm udbytte, ingen byggeaffald, 3x udbytte
Mining.Blast.Radius.Increase=[[RED]]Eksplosions Radius For\u00f8gelse: [[YELLOW]]+{0}
Mining.Blast.Rank=[[RED]]Blast Mining: [[YELLOW]] Rank {0}/8 [[GRAY]]({1})
Mining.Blast.Other.On=[[GREEN]]{0}[[DARK_GREEN]] her brugt [[RED]]Blast Mining!
@@ -311,7 +320,9 @@ Combat.ArrowDeflect=[[WHITE]]**UNDVIGER PIL**
Combat.BeastLore=[[GREEN]]**TIGGENDE MONSTER**
Combat.BeastLoreHealth=[[DARK_AQUA]]Liv ([[GREEN]]{0}[[DARK_AQUA]]/{1})
Combat.BeastLoreOwner=[[DARK_AQUA]]Ejer ([[RED]]{0}[[DARK_AQUA]])
Combat.BurningArrowHit=[[DARK_RED]]Du er blevet ramt af en brandene pil!
Combat.Gore=[[GREEN]]**SPIDDET**
Combat.Ignition=[[RED]]**ANT\u00c6NDING**
Combat.StruckByGore=[[RED]]**DU ER BLEVET SPIDDET**
Combat.TargetDazed=M\u00e5let er nu [[DARK_RED]]Bed\u00f8vet
Combat.TouchedFuzzy=[[DARK_RED]]R\u00f8rte Plysse. F\u00f8lte mig svimmel.
@@ -406,6 +417,7 @@ Party.Password.Incorrect=[[RED]]Gruppe kodeord er forkert.
Party.Password.Set=[[GREEN]]Gruppe adgangskode sat til {0}
Party.Player.Invalid=[[RED]]Dette er ikke en rigtig spiller.
Party.Teleport.Dead=[[RED]]Du kan ikke teleportere til en d\u00f8d spiller.
Party.Teleport.Hurt=[[RED]]Du er blevet skadet infenfor de sidste {0} sekunder og kan ikke teleportere.
Party.Teleport.Player=[[GREEN]]Du har teleporteret til {0}.
Party.Teleport.Self=[[RED]]Du kan ikke teleportere dig selv!
Party.Teleport.Target=[[GREEN]]{0} har teleporteret til dig.

View File

@@ -32,6 +32,7 @@ Axes.Ability.Bonus.4=Wucht-Schlag
Axes.Ability.Bonus.5=Veraursacht {0} Zusatz-Schaden gegen ungepanzerte Feinde
Axes.Ability.Lower=[[GRAY]]**Du senkst deine Axt**
Axes.Ability.Ready=[[GREEN]]**Deine Axt ist bereit**
Axes.Combat.Cleave.Proc=[[DARK_RED]]AUSGESCHALTET durch SCHLITZER!
Axes.Combat.CritStruck=[[DARK_RED]]Du wurdest KRITISCH getroffen!
Axes.Combat.CritChance=[[RED]]Chance auf kritischen Treffer: [[YELLOW]]{0}
Axes.Combat.CriticalHit=[[RED]]KRITISCHER TREFFER!
@@ -150,6 +151,14 @@ Mining.Skills.SuperBreaker.Other.On=[[GREEN]]{0}[[DARK_GREEN]] benutzte [[RED]]S
Mining.Skills.SuperBreaker.Refresh=[[GREEN]]Dein [[YELLOW]]Super-Brecher [[GREEN]]ist wieder bereit!
Mining.Skillup=[[YELLOW]]Bergbau Fertigkeit ist um {0} gestiegen. Gesamt ({1})
Mining.Blast.Boom=[[GRAY]]**BOOM**
Mining.Blast.Effect.0=+35% Erz-Ausbeute
Mining.Blast.Effect.1=+40% Erz-Ausbeute
Mining.Blast.Effect.2=+45% Erz-Ausbeute, kein Schutt
Mining.Blast.Effect.3=+50% Erz-Ausbeute, kein Schutt
Mining.Blast.Effect.4=+55% Erz-Ausbeute, kein Schutt, Doppel-Drops
Mining.Blast.Effect.5=+60% Erz-Ausbeute, kein Schutt, Doppel-Drops
Mining.Blast.Effect.6=+65% Erz-Ausbeute, kein Schutt, Dreifach-Drops
Mining.Blast.Effect.7=+70% Erz-Ausbeute, kein Schutt, Dreifach-Drops
Mining.Blast.Radius.Increase=[[RED]]Z\u00fcndstoff Radius Erh\u00f6hung: [[YELLOW]]+{0}
Mining.Blast.Rank=[[RED]]Z\u00fcndstoff Rang:[[YELLOW]] {0}/8 [[GRAY]]({1})
Mining.Blast.Other.On=[[GREEN]]{0}[[DARK_GREEN]] benutzte [[RED]]Z\u00fcndstoff!
@@ -320,7 +329,9 @@ Combat.ArrowDeflect=[[WHITE]]**Pfeil ABGELENKT**
Combat.BeastLore=[[GREEN]]**BESTIENKUNDE**
Combat.BeastLoreHealth=[[DARK_AQUA]]Gesundheit ([[GREEN]]{0}[[DARK_AQUA]]/{1})
Combat.BeastLoreOwner=[[DARK_AQUA]]Besitzer ([[RED]]{0}[[DARK_AQUA]])
Combat.BurningArrowHit=[[DARK_RED]]Du wurdest von einem BRENNENDEM PFEIL getroffen!
Combat.Gore=[[GREEN]]**AUFGESCHLITZT**
Combat.Ignition=[[RED]]**ENTZ\u00dcNDUNG**
Combat.StruckByGore=[[RED]]**du wurdest AUFGESCHLITZT**
Combat.TargetDazed=Ziel wurde [[DARK_RED]]BET\u00c4UBT
Combat.TouchedFuzzy=[[DARK_RED]]Ungl\u00fccklich ber\u00fchrt. Schwindelgef\u00fchl.
@@ -415,6 +426,7 @@ Party.Password.Incorrect=[[RED]]Party password is incorrect.
Party.Password.Set=[[GREEN]]Gruppen-Password ge\u00e4ndert zu: {0}
Party.Player.Invalid=[[RED]]Dies ist kein g\u00fcltiger Spieler.
Party.Teleport.Dead=[[RED]]Du kannst dich nicht zu toten Spielern teleportieren
Party.Teleport.Hurt=[[RED]]Du wurdest in den letzten {0} Sekunden verletzt und kannst dich nicht teleportieren.
Party.Teleport.Player=[[GREEN]]Du wurdest zu {0} teleportiert.
Party.Teleport.Self=[[RED]]You can\'t teleport to yourself!
Party.Teleport.Target=[[GREEN]]{0} hat sich zu dir teleportiert.

View File

@@ -464,6 +464,7 @@ Commands.Party.AlreadyExists=[[DARK_RED]]Party {0} already exists!
Commands.Party.Kick=[[RED]]You were kicked from party {0}!
Commands.Party.Leave=[[RED]]You have left that party
Commands.Party.Members.Header=[[RED]]-----[][[GREEN]]MEMBERS[[RED]][]-----
Commands.Party.Members={0}
Commands.Party.None=[[RED]]You are not in a party.
Commands.Party.Quit=[[RED]]- Leave your current party
Commands.Party.Teleport=<player> [[RED]]- Teleport to party member
@@ -542,7 +543,7 @@ Party.Player.InSameParty=[[RED]]{0} already is in your party!
Party.PlayerNotInParty=[[DARK_RED]]{0} is not in a party
Party.Specify=[[RED]]You must specify a party.
Party.Teleport.Dead=[[RED]]You can't teleport to a dead player.
Party.Teleport.Hurt=[[RED]]You have been hurt in the last {0} seconds and cannot teleport.
Party.Teleport.Hurt=[[RED]]You've been hurt in the last {0} seconds and cannnot teleport.
Party.Teleport.Player=[[GREEN]]You have teleported to {0}.
Party.Teleport.Self=[[RED]]You can't teleport to yourself!
Party.Teleport.Target=[[GREEN]]{0} has teleported to you.
@@ -565,7 +566,6 @@ Party.ItemShare.Disabled=[[RED]]Party item sharing is disabled.
Commands.XPGain.Acrobatics=Falling
Commands.XPGain.Archery=Attacking Monsters
Commands.XPGain.Axes=Attacking Monsters
Commands.XPGain.Child=Gains levels from Parent Skills
Commands.XPGain.Excavation=Digging and finding treasures
Commands.XPGain.Fishing=Fishing (Go figure!)
Commands.XPGain.Herbalism=Harvesting Herbs
@@ -590,9 +590,7 @@ XPRate.Event= [[GOLD]]mcMMO is currently in an XP rate event! XP rate is {0}x!
#EFFECTS
##generic
Effects.Effects=EFFECTS
Effects.Child=[[DARK_GRAY]]LVL: [[GREEN]]{0}
Effects.Level=[[DARK_GRAY]]LVL: [[GREEN]]{0} [[DARK_AQUA]]XP[[YELLOW]]([[GOLD]]{1}[[YELLOW]]/[[GOLD]]{2}[[YELLOW]])
Effects.Parent = [[GOLD]]{0} -
Effects.Template=[[DARK_AQUA]]{0}: [[GREEN]]{1}
#GUIDES
@@ -627,11 +625,9 @@ Item.ChimaeraWing.Pass=**CHIMAERA WING**
Item.Injured.Wait=You were injured recently and must wait to use this. [[YELLOW]]({0}s)
#SKILLS
Skills.Child=[[GOLD]](CHILD SKILL)
Skills.Disarmed=[[DARK_RED]]You have been disarmed!
Skills.Header=[[RED]]-----[][[GREEN]]{0}[[RED]][]-----
Skills.NeedMore=[[DARK_RED]]You need more [[GRAY]]{0}
Skills.Parents = PARENTS
Skills.Stats=[[YELLOW]]{0}[[GREEN]]{1}[[DARK_AQUA]] XP([[GRAY]]{2}[[DARK_AQUA]]/[[GRAY]]{3}[[DARK_AQUA]])
Skills.TooTired=[[RED]]You are too tired to use that ability again. [[YELLOW]]({0}s)

View File

@@ -32,6 +32,7 @@ Axes.Ability.Bonus.4=Gran Impacto
Axes.Ability.Bonus.5=Hacer {0} de da\u00f1o bonus a los enemigos sin armadura
Axes.Ability.Lower=[[GRAY]]**BAJAS TU HACHA**
Axes.Ability.Ready=[[GREEN]]**PREPARAS TU HACHA**
Axes.Combat.Cleave.Proc=[[DARK_RED]]\u00a1Golpeado por PARTIR!
Axes.Combat.CritStruck=[[DARK_RED]]\u00a1Fuiste golpeado CR\u00cdTICAMENTE!
Axes.Combat.CritChance=[[RED]]Probabilidad de golpe cr\u00edtico: [[YELLOW]]{0}%
Axes.Combat.CriticalHit=[[RED]]\u00a1GOLPE CR\u00cdTICO!
@@ -133,6 +134,14 @@ Mining.Skills.SuperBreaker.Other.On=[[GREEN]]\u00a1{0}[[DARK_GREEN]] us\u00f3 [[
Mining.Skills.SuperBreaker.Refresh=[[GREEN]]\u00a1Tu habilidad de [[YELLOW]]S\u00faper Destructor [[GREEN]]est\u00e1 refrescada!
Mining.Skillup=[[YELLOW]]Habilidad de Miner\u00eda incrementada en {0}. Total ({1})
Mining.Blast.Boom=[[GRAY]]**BOOM**
Mining.Blast.Effect.0=+35% de producci\u00f3n minera
Mining.Blast.Effect.1=+40% de producci\u00f3n minera
Mining.Blast.Effect.2=+45% de producci\u00f3n minera, sin residuos
Mining.Blast.Effect.3=+50% de producci\u00f3n minera, sin residuos
Mining.Blast.Effect.4=+55% de producci\u00f3n minera, sin residuos, doble drops
Mining.Blast.Effect.5=+60% de producci\u00f3n minera, sin residuos, doble drops
Mining.Blast.Effect.6=+65% de producci\u00f3n minera, sin residuos y triple drops
Mining.Blast.Effect.7=+70% de producci\u00f3n minera, sin residuos, triple drops
Mining.Blast.Radius.Increase=[[RED]]Incrementado Radio de Explosi\u00f3n: [[YELLOW]]+{0}
Mining.Blast.Rank=[[RED]]Miner\u00eda Explosiva: [[YELLOW]] Rango {0}/8 [[GRAY]]({1})
Mining.Blast.Other.On=[[GREEN]]\u00a1{0}[[DARK_GREEN]] us\u00f3 [[RED]]Miner\u00eda Explosiva!
@@ -281,7 +290,9 @@ Combat.ArrowDeflect=[[WHITE]]**FLECHA DESVIADA**
Combat.BeastLore=[[GREEN]]**CONOCIMIENTO DE LA BESTIA**
Combat.BeastLoreHealth=[[DARK_AQUA]]Salud ([[GREEN]]{0}[[DARK_AQUA]]/{1})
Combat.BeastLoreOwner=[[DARK_AQUA]]Due\u00f1o ([[RED]]{0}[[DARK_AQUA]])
Combat.BurningArrowHit=[[DARK_RED]]Has sido golpeado por una flecha ardiendo\\!
Combat.Gore=[[GREEN]]**MORDISCO**
Combat.Ignition=[[RED]]**IGNICION**
Combat.StruckByGore=[[RED]]**FUISTE MORDISQUEADO**
Combat.TargetDazed=El objetivo fue [[DARK_RED]]aturdido
Combat.TouchedFuzzy=[[DARK_RED]]Est\u00e1s confuso. Te sientes mareado.
@@ -335,6 +346,7 @@ Party.NotInYourParty=[[DARK_RED]]{0} no esta en tu fiesta
Party.Password.Set=[[GREEN]]Contrase\u00f1a del grupo establecida: [[RED]]{0}
Party.Player.Invalid=[[RED]]Ese no es un jugador v\u00e1lido.
Party.Teleport.Dead=[[RED]]No te puedes teletransportar a un jugador muerto.
Party.Teleport.Hurt=[[RED]]Fuiste herido en los \u00faltimos {0} segundos y no te puedes teletransportar.
Party.Teleport.Player=[[GREEN]]Te teletransportaste a {0}.
Party.Teleport.Target=[[GREEN]]{0} se teletransport\u00f3 a ti.
Party.Unlocked=[[GRAY]]El grupo est\u00e1 desbloqueado

View File

@@ -13,7 +13,9 @@ Combat.ArrowDeflect=[[WHITE]]**NUOLI TORJUTTU**
Combat.BeastLore=[[GREEN]]**BEAST LORE**
Combat.BeastLoreHealth=[[DARK_AQUA]]Health ([[GREEN]]{0}[[DARK_AQUA]]/{1})
Combat.BeastLoreOwner=[[DARK_AQUA]]Owner ([[RED]]{0}[[DARK_AQUA]])
Combat.BurningArrowHit=[[DARK_RED]]Palava nuoli osui sinuun\\!
Combat.Gore=[[GREEN]]**PISTO**
Combat.Ignition=[[RED]]**SYTYTYS**
Combat.StruckByGore=[[RED]]**SINUA ON PISTETTY**
Combat.TargetDazed=Kohde [[DARK_RED]]tyrm\u00e4tty
Combat.TouchedFuzzy=[[DARK_RED]]T\u00f6kk\u00e4sit P\u00f6rr\u00f6\u00e4. Tunsit huimauksen.

View File

@@ -32,6 +32,7 @@ Axes.Ability.Bonus.4=Impact puissant
Axes.Ability.Bonus.5=Inflige {0} de d\u00e9g\u00e2ts en plus aux ennemis sans armure
Axes.Ability.Lower=[[GRAY]]**VOUS ABAISSEZ VOTRE HACHE**
Axes.Ability.Ready=[[GREEN]]**VOUS LEVEZ VOTRE HACHE**
Axes.Combat.Cleave.Proc=[[DARK_RED]]Frapp\u00e9 par Tranche-cr\u00e2ne !
Axes.Combat.CritStruck=[[DARK_RED]]Vous avez re\u00e7u un coup critique !
Axes.Combat.CritChance=[[RED]]Chance d\'infliger un coup critique : [[YELLOW]]{0}%
Axes.Combat.CriticalHit=[[RED]]COUP CRITIQUE !
@@ -132,6 +133,14 @@ Mining.Skills.SuperBreaker.Other.On=[[GREEN]]{0}[[DARK_GREEN]] a utilis\u00e9 [[
Mining.Skills.SuperBreaker.Refresh=[[GREEN]]Votre comp\u00e9tence [[YELLOW]]Broyeur [[GREEN]]est pr\u00eate !
Mining.Skillup=[[YELLOW]]Le talent Minage augmente de {0}. Total ({1})
Mining.Blast.Boom=[[GRAY]]**BOUM**
Mining.Blast.Effect.0=+35% de rendement
Mining.Blast.Effect.1=+40% de rendement
Mining.Blast.Effect.2=+45% de rendement, pas de d\u00e9bris
Mining.Blast.Effect.3=+50% de rendement, pas de d\u00e9bris
Mining.Blast.Effect.4=+55% de rendement, pas de d\u00e9bris, double drops
Mining.Blast.Effect.5=+60% de rendement, pas de d\u00e9bris, double drops
Mining.Blast.Effect.6=+65% de rendement, pas de d\u00e9bris, triple drops
Mining.Blast.Effect.7=+70% de rendement, pas de d\u00e9bris, triple drops
Mining.Blast.Radius.Increase=[[RED]]Rayon d\'explosion : [[YELLOW]]+{0}
Mining.Blast.Rank=[[RED]]Minage explosif : [[YELLOW]]Rang {0}/8 [[GRAY]]({1})
Mining.Blast.Other.On=[[GREEN]]{0}[[DARK_GREEN]] a utilis\u00e9 [[RED]]Minage explosif !
@@ -273,7 +282,9 @@ Combat.ArrowDeflect=[[WHITE]]**FL\u00c8CHE DEVI\u00c9E**
Combat.BeastLore=[[GREEN]]**CONNAISSANCE DES B\u00caTES**
Combat.BeastLoreHealth=[[DARK_AQUA]]Vie ([[GREEN]]{0}[[DARK_AQUA]]/{1})
Combat.BeastLoreOwner=[[DARK_AQUA]]Propri\u00e9taire ([[RED]]{0}[[DARK_AQUA]])
Combat.BurningArrowHit=[[DARK_RED]]Vous avez \u00e9t\u00e9 frapp\u00e9 par une fl\u00e8che br\u00fblante\\!
Combat.Gore=[[GREEN]]**SANG**
Combat.Ignition=[[RED]]**ALLUMAGE**
Combat.StruckByGore=[[RED]]**FRAPP\u00c9 JUSQU\'AU SANG**
Combat.TargetDazed=La cible a \u00e9t\u00e9 [[DARK_RED]]\u00c9tourdi
Combat.TouchedFuzzy=[[DARK_RED]]Vous \u00eates \u00e9tourdi.
@@ -327,6 +338,7 @@ Party.NotInYourParty=[[DARK_RED]]{0} is not in your party
Party.Password.Set=[[GREEN]]Mot de passe d\u00e9fini : {0}
Party.Player.Invalid=[[RED]]Ce joueur n\'existe pas.
Party.Teleport.Dead=[[RED]]Vous ne pouvez pas vous t\u00e9l\u00e9porter sur un joueur mort.
Party.Teleport.Hurt=[[RED]]Vous avez \u00e9t\u00e9 bless\u00e9 durant les {0} derni\u00e8res secondes et ne pouvez pas vous t\u00e9l\u00e9porter.
Party.Teleport.Player=[[GREEN]]Vous vous \u00eates t\u00e9l\u00e9port\u00e9 sur {0}.
Party.Teleport.Target=[[GREEN]]{0} s\'est t\u00e9l\u00e9port\u00e9 sur vous.
Party.Unlocked=[[GRAY]]Le groupe est d\u00e9verrouill\u00e9.

View File

@@ -1,39 +1,19 @@
Acrobatics.Combat.Proc=[[GREEN]]**Elker\u00fclve**
Acrobatics.SkillName=AKROBATIKA
Acrobatics.Skillup=[[YELLOW]]Akrobatika fejl\u0151d\u00f6tt {0} szinttel. \u00d6sszesen: ({1})
Archery.Skillup=[[YELLOW]]\u00cdj\u00e1szat fejl\u0151d\u00f6tt {0} szinttel. \u00d6sszesen: ({1})
Axes.Combat.GI.Struck=[[RED]]**HATALMAS EREJ\u0170 \u00dcT\u00c9S**
Axes.Skills.SS.Other.On=[[GREEN]]{0}[[DARK_GREEN]] haszn\u00e1lta a [[RED]]Koponya T\u00f6r\u0151t!
Excavation.SkillName=\u00c1S\u00c1S
Herbalism.Listener=Gy\u00f3gyn\u00f6v\u00e9nytan:
Mining.Ability.Ready=[[GREEN]]**CS\u00c1K\u00c1NYOD K\u00c9SZEN \u00c1LL**
Mining.Skills.SuperBreaker.Refresh=[[GREEN]]A [[YELLOW]] Szuper Z\u00faz\u00f3 [[GREEN]]k\u00e9pess\u00e9ged \u00fajra haszn\u00e1lhat\u00f3!
Mining.Skillup=[[YELLOW]]B\u00e1ny\u00e1szat fejl\u0151d\u00f6tt {0} szinttel. \u00d6sszesen: ({1})
Mining.Blast.Refresh=[[GREEN]]A [[YELLOW]]Robban\u00f3 B\u00e1ny\u00e1szat [[GREEN]]k\u00e9pess\u00e9ged \u00fajra el\u00e9rhet\u0151!
Repair.Skills.AdeptGold=[[DARK_RED]]Nem vagy el\u00e9g k\u00e9pzett ahhoz, hogy arany t\u00e1rgyakat jav\u00edts.
Repair.Arcane.Fail=[[RED]]A t\u00e1rgyon l\u00e9v\u0151 var\u00e1zslat szertefoszlott.
Swords.Combat.Bleeding.Stopped=[[GRAY]]A v\u00e9rz\u00e9s [[GREEN]]elm\u00falt[[GRAY]]!
Swords.Combat.Bleeding=[[GREEN]]**ELLENS\u00c9G V\u00c9RZIK**
Swords.Skills.SS.On=[[GREEN]]**F\u0170R\u00c9SZES CSAP\u00c1S AKTIV\u00c1LVA**
Unarmed.Skills.Berserk.Off=[[RED]]**Tombol\u00e1sod befejez\u0151d\u00f6tt**
Unarmed.Skills.Berserk.Other.On=[[GREEN]]{0}[[DARK_GREEN]] haszn\u00e1lta a [[RED]]Tombol\u00e1st!
Woodcutting.Ability.0=Lev\u00e9l F\u00faj\u00f3
Woodcutting.Ability.1=Elf\u00fajja a leveleket.
Woodcutting.SkillName=FAV\u00c1G\u00c1S
Ability.Generic.Template=[[RED]]{0}: [[YELLOW]]{1}
Combat.TouchedFuzzy=[[DARK_RED]]Bolyhosat \u00e9rintettem. Elsz\u00e9d\u00fcltem.
Commands.AdminChat.Off=Admin Chat [[RED]]kikapcsolva
Commands.mmoedit=[player] <skill> <newvalue> [[RED]] - M\u00f3dos\u00edtva
Commands.Party.Kick=[[RED]]Kidobtak a csoportb\u00f3l {0}!
Commands.PowerLevel=[[DARK_RED]]POWER LEVEL: [[GREEN]]{0}
Party.Unlocked=[[GRAY]]Csoport nyitva
Commands.XPGain.Excavation=\u00c1sni \u00e9s kincset tal\u00e1lni.
Commands.XPGain.Herbalism=N\u00f6v\u00e9nyek betakar\u00edt\u00e1sa
Commands.XPGain.Mining=K\u0151 \u00e9s \u00e9rcek kib\u00e1ny\u00e1sz\u00e1sa
Commands.XPGain.Taming=\u00c1llatok idom\u00edt\u00e1sa vagy harc a farkasoddal
Commands.XPGain=[[DARK_GRAY]]KAPOTT TP: [[WHITE]]{0}
XPRate.Event=[[GOLD]]mcMMO-ban most TP r\u00e1ta n\u00f6vel\u0151 esem\u00e9ny van! TP r\u00e1ta {0}x!
Guides.Excavation=[[DARK_AQUA]]\u00c1s\u00e1sr\u00f3l:\n\n[[YELLOW]]\u00c1s\u00e1s a kincskeres\u00e9s egyik fajt\u00e1ja..\n\n[[YELLOW]]\u00c1s\u00e1s sor\u00e1n ez\u00e9rt kincseket kaphatsz.\n\n[[YELLOW]]Min\u00e9l t\u00f6bbet \u00e1sol, ann\u00e1l t\u00f6bb kincset tal\u00e1lhatsz.\n\n\n\n[[DARK_AQUA]]Tapasztalat Pont (TP) szerz\u00e9s:\n\n[[YELLOW]]Ahhoz, hogy TP-t szerezhess, \u00e1s\u00f3val a kezedben kell \u00e1snod.\n\n[[YELLOW]]Csak meghat\u00e1rozott t\u00edpus\u00fa blokkokban tal\u00e1lhatsz kincseket.\n\n[[DARK_AQUA]]Meghat\u00e1rozott blokkok:\n\n[[YELLOW]]F\u0171, f\u00f6ld, homok, agyag, s\u00f3der, gomb\u00e1s f\u00f6ld, l\u00e9lekhomok\n\n\n\n[[DARK_AQUA]]Hogyan haszn\u00e1ld a Hatalmas F\u00far\u00f3t:\n\n[[YELLOW]]Kezedben az \u00e1s\u00f3val kattints a jobb eg\u00e9r gombbak.\n\n[[YELLOW]]Ezut\u00e1n 4 m\u00e1sodperced van, hogy\n\n[[YELLOW]]elkezdj \u00e1sni egy megfelel\u0151 anyagon. Ez \n\n[[YELLOW]]aktiv\u00e1lni fogja a Hatalmas F\u00far\u00f3t.\n\n[[DARK_AQUA]]Mi az a Hatalmas F\u00far\u00f3?\n\n[[YELLOW]]Hatalmas f\u00far\u00f3 egy k\u00e9pess\u00e9g, amely az \u00c1s\u00e1s\n\n[[YELLOW]]j\u00e1rtass\u00e1godhoz k\u00f6t\u0151dik. Megh\u00e1romszorozza\n\n[[YELLOW]]a kincs es\u00e9s\u00e9nek es\u00e9ly\u00e9t \u00e9s azonnal sz\u00e9tt\u00f6ri\n\n[[YELLOW]]az \u00e1s\u00e1shoz kapcsol\u00f3d\u00f3 blokkokat.\n\n\n\n[[DARK_AQUA]]Hogyan m\u0171k\u00f6dik a kincskeres\u00e9s?\n\n[[YELLOW]]Minden kincsnek megvan a maga \n\n[[YELLOW]]szintbeli k\u00f6vetelm\u00e9nye, amely ut\u00e1n eshet, ennek k\u00f6vetkezt\u00e9ben \n\n[[YELLOW]]neh\u00e9z megmondani, hogy mennyire hasznos.\n\n[[YELLOW]]Csak tartsd \u00e9szben, hogy min\u00e9l nagyobb az \u00c1s\u00e1sbeli j\u00e1rtass\u00e1god,\n\n[[YELLOW]]ann\u00e1l t\u00f6bb kincset kaphatsz.\n\n[[YELLOW]]Ezen fel\u00fcl azt se felejtsd el, hogy minden \u00c1sat\u00e1shoz k\u00f6t\u0151d\u0151\n\n[[YELLOW]]anyagnak megvan a saj\u00e1t list\u00e1ja, arra, hogy milyen kincset tartalmazhat.\n\n[[YELLOW]]M\u00e1s szavakkal, m\u00e1s kincset tal\u00e1lhatsz egy f\u00f6ld blokkban\n\n[[YELLOW]]mint egy homok blokkban.\n\n[[DARK_AQUA]]Megjegyz\u00e9s az \u00c1s\u00e1shoz:\n\n[[YELLOW]]A kincsek teljesen szem\u00e9lyre szabhat\u00f3ak.\n\n[[YELLOW]]\u00cdgy szerverenk\u00e9nt elt\u00e9rhetnek egym\u00e1st\u00f3l.
Skills.Disarmed=[[DARK_RED]]Lefegyvereztek!
Guides.Excavation=[[DARK_AQUA]]\u00c1s\u00e1sr\u00f3l:\n[[YELLOW]]\u00c1s\u00e1s a kincskeres\u00e9s egyik fajt\u00e1ja..\n[[YELLOW]]\u00c1s\u00e1s sor\u00e1n ez\u00e9rt kincseket kaphatsz.\n[[YELLOW]]Min\u00e9l t\u00f6bbet \u00e1sol, ann\u00e1l t\u00f6bb kincset tal\u00e1lhatsz.\n\n[[DARK_AQUA]]Tapasztalat Pont (TP) szerz\u00e9s:\n[[YELLOW]]Ahhoz, hogy TP-t szerezhess, \u00e1s\u00f3val a kezedben kell \u00e1snod.\n[[YELLOW]]Csak meghat\u00e1rozott t\u00edpus\u00fa blokkokban tal\u00e1lhatsz kincseket.\n[[DARK_AQUA]]Meghat\u00e1rozott blokkok:\n[[YELLOW]]F\u0171, f\u00f6ld, homok, agyag, s\u00f3der, gomb\u00e1s f\u00f6ld, l\u00e9lekhomok\n\n[[DARK_AQUA]]Hogyan haszn\u00e1ld a Hatalmas F\u00far\u00f3t:\n[[YELLOW]]Kezedben az \u00e1s\u00f3val kattonts a jobb eg\u00e9r gombbak.\n[[YELLOW]]Ezut\u00e1n 4 m\u00e1sodperced van, hogy\n[[YELLOW]]elkezdj \u00e1sni egy megfelel\u0151 anyagon. Ez \n[[YELLOW]]aktiv\u00e1lni fogja a Hatalmas F\u00far\u00f3t.\n[[DARK_AQUA]]Mi az a Hatalmas F\u00far\u00f3?\n[[YELLOW]]Hatalmas f\u00far\u00f3 egy k\u00e9pess\u00e9g, amely az \u00c1s\u00e1s\n[[YELLOW]]j\u00e1rtass\u00e1godhoz k\u00f6t\u0151dik. Megh\u00e1romszorozza\n[[YELLOW]]a kincs es\u00e9s\u00e9nek es\u00e9ly\u00e9t \u00e9s azonnal sz\u00e9tt\u00f6ri\n[[YELLOW]]az \u00e1s\u00e1shoz kapcsol\u00f3d\u00f3 blokkokat.\n\n[[DARK_AQUA]]HHogyan m\u0171k\u00f6dik a kincskeres\u00e9s?\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.
Stats.Header.Combat=[[GOLD]]-=HARCI K\u00c9PZETTS\u00c9GEK=-
Stats.Header.Gathering=[[GOLD]]-= GY\u0170JT\u00d6GET\u0150 K\u00c9PESS\u00c9GEK=-

View File

@@ -33,6 +33,7 @@ Axes.Ability.Bonus.4=Impatto Maggiore
Axes.Ability.Bonus.5=Infliggi {0} danni bonus ai nemici senza armatura
Axes.Ability.Lower=[[GRAY]]**ABBASSI L\'ASCIA**
Axes.Ability.Ready=[[GREEN]]**PREPARI L\'ASCIA**
Axes.Combat.Cleave.Proc=[[DARK_RED]]Colpito da SFONDAMENTO!
Axes.Combat.CritStruck=[[DARK_RED]]Hai subito un colpo CRITICO!
Axes.Combat.CritChance=[[RED]]Probabilit\u00e0 di un colpo critico: [[YELLOW]]{0}%
Axes.Combat.CriticalHit=[[RED]]COLPO CRITICO!
@@ -103,8 +104,6 @@ Herbalism.Ability.GTh=[[GREEN]]**POLLICE VERDE**
Herbalism.Ability.HylianLuck=[[RED]]Probabilit\u00e0 di Fotruna Hylian: [[YELLOW]]{0}
Herbalism.Ability.Lower=[[GRAY]]**ABBASSI LA ZAPPA**
Herbalism.Ability.Ready=[[GREEN]]**PREPARI LA ZAPPA**
Herbalism.Ability.ShroomThumb.Chance=[[RED]]Possibilit\u00e0 di Pollice Fungo: [[YELLOW]]{0}
Herbalism.Ability.ShroomThumb.Fail=[[RED]]**POLLICE FUNGO FALLITO**
Herbalism.Effect.0=TERRA VERDE (CAPACIT\u00c0)
Herbalism.Effect.1=Diffonde il Verde, Drop x3
Herbalism.Effect.2=Pollice Verde (Grano)
@@ -117,8 +116,6 @@ Herbalism.Effect.8=Doppi Drop (Ogni Pianta)
Herbalism.Effect.9=Raddoppia il normale drop
Herbalism.Effect.10=Fortuna Hylian
Herbalism.Effect.11=D\u00e0 una modesta possibilit\u00e0 di trovare oggetti rari
Herbalism.Effect.12=Pollice Fungo
Herbalism.Effect.13=Diffonde il micelio su terra & erba
Herbalism.HylianLuck=[[GREEN]]Oggi la fortuna di Hyrule \u00e8 con te!
Herbalism.Listener=Erboristeria:
Herbalism.SkillName=ERBORISTERIA
@@ -155,6 +152,14 @@ Mining.Skills.SuperBreaker.Other.On=[[GREEN]]{0}[[DARK_GREEN]] ha usato [[RED]]S
Mining.Skills.SuperBreaker.Refresh=[[GREEN]]La tua capacit\u00e0 [[YELLOW]]Super Demolitore [[GREEN]]si \u00e8 rigenerata!
Mining.Skillup=[[YELLOW]]L\'abilit\u00e0 Estrazione \u00e8 aumentata di {0}. Totale ({1})
Mining.Blast.Boom=[[GRAY]]**BOOM**
Mining.Blast.Effect.0=+35% minerali estratti
Mining.Blast.Effect.1=+40% minerali estratti
Mining.Blast.Effect.2=+45% minerali estratti, niente macerie
Mining.Blast.Effect.3=+50% minerali estratti, niente macerie
Mining.Blast.Effect.4=+55% minerali estratti, niente macerie, doppi drop.
Mining.Blast.Effect.5=+60% minerali estratti, niente macerie, doppi drop.
Mining.Blast.Effect.6=+65% minerali estratti, niente macerie, tripli drop.
Mining.Blast.Effect.7=+70% minerali estratti, niente macerie, tripli drop.
Mining.Blast.Radius.Increase=[[RED]]Incremento del Raggio di Esplosione: [[YELLOW]]+{0}
Mining.Blast.Rank=[[RED]]Estrazione Esplosiva: [[YELLOW]] Grado {0}/8 [[GRAY]]({1})
Mining.Blast.Other.On=[[GREEN]]{0}[[DARK_GREEN]] ha usato [[RED]]Estrazione Esplosiva!
@@ -244,7 +249,6 @@ Taming.Ability.Bonus.6=Artigli Affilati
Taming.Ability.Bonus.7=+{0} al Danno
Taming.Ability.Bonus.8=Servizio Fast Food
Taming.Ability.Bonus.9={0}% Probabilit\u00e0 di guarire quando si attacca
Taming.Ability.Bonus.11=Recupera salute quando viene danneggiato da magia o veleno
Taming.Ability.Locked.0=BLOCCATO FINO AD ABILIT\u00c0 {0}+ (SICUREZZA AMBIENTALE)
Taming.Ability.Locked.1=BLOCCATO FINO AD ABILIT\u00c0 {0}+ (PELLICCIA FOLTA)
Taming.Ability.Locked.2=BLOCCATO FINO AD ABILIT\u00c0 {0}+ (A PROVA D\'URTO)
@@ -261,7 +265,6 @@ Taming.Effect.14=[[GRAY]]RDN (Ocelot): Chinati e clicca col sinistro con {0} Pes
Taming.Effect.15=[[GRAY]]RDN (Lupo): Chinati e clicca col sinistro con {0} Ossi in mano
Taming.Effect.16=Servizio Fast Food
Taming.Effect.17=Probabilit\u00e0 che i lupi di guarire quando attaccano
Taming.Effect.19=Guarito da Magia & Veleno
Taming.Effect.2=Sbranare
Taming.Effect.3=Colpo Critico che applica Emorragia
Taming.Effect.4=Artigli Affilati
@@ -333,11 +336,13 @@ Combat.ArrowDeflect=[[WHITE]]**FRECCIA DEVIATA**
Combat.BeastLore=[[GREEN]]**CONOSCENZA DELLE BESTIE**
Combat.BeastLoreHealth=[[DARK_AQUA]]Salute ([[GREEN]]{0}[[DARK_AQUA]]/{1})
Combat.BeastLoreOwner=[[DARK_AQUA]]Proprietario ([[RED]]{0}[[DARK_AQUA]])
Combat.BurningArrowHit=[[DARK_RED]]Sei stato colpito da una freccia infuocata!
Combat.Gore=[[GREEN]]**SBRANATO**
Combat.Ignition=[[RED]]**ACCENSIONE**
Combat.StruckByGore=[[RED]]**SEI STATO SBRANATO**
Combat.TargetDazed=Il bersaglio \u00e8 rimasto [[DARK_RED]]Stordito
Combat.TouchedFuzzy=[[DARK_RED]]Toccato sfocato. Feltro vertiginoso.
mcMMO.Description=[[DARK_AQUA]]Riguardo il [[DARK_AQUA]]Progetto [[YELLOW]]mcMMO:,[[GOLD]]mcMMO \u00e8 una mod GdR [[RED]]open source[[GOLD]] creata nel Febbraio 2011,[[GOLD]]da [[BLUE]]nossr50[[GOLD]]. L\'obiettivo \u00e8 quello di fornire un\'esperienza GdR di qualit\u00e0.,[[DARK_AQUA]]Suggerimenti:,[[GOLD]] - [[GREEN]]Usa [[RED]]/mcmmo help[[GREEN]] per vedere i comandi,[[GOLD]] - [[GREEN]]Digita [[RED]]/NOMEABILIT\u00c0[[GREEN]] per vedere informazioni dettagliate su un\'abilit\u00e0,[[DARK_AQUA]]Sviluppatori:,[[GOLD]] - [[GREEN]]nossr50 [[BLUE]](Fondatore),[[GOLD]] - [[GREEN]]GJ [[BLUE]](Capo Progetto),[[GOLD]] - [[GREEN]]NuclearW [[BLUE]](Sviluppatore),[[GOLD]] - [[GREEN]]bm01 [[BLUE]](Sviluppatore),[[GOLD]] - [[GREEN]]TfT_02 [[BLUE]](Sviluppatore),[[GOLD]] - [[GREEN]]Glitchfinder [[BLUE]](Sviluppatore),[[GOLD]] - [[GREEN]]t00thpick1 [[BLUE]](Sviluppatore),[[DARK_AQUA]]Link Utili:,[[GOLD]] - [[GREEN]]https://github.com/mcMMO-Dev/mcMMO/issues[[GOLD]] Segnalazione Bug,[[GOLD]] - [[GREEN]]#mcmmo @ irc.esper.net[[GOLD]] IRC Chat,
mcMMO.Description=[[DARK_AQUA]]Riguardo il progetto [[YELLOW]]mcMMO[[DARK_AQUA]]:,[[GOLD]]mcMMO \u00e8 una mod GdR [[RED]]open source[[GOLD]] creata nel Febbraio 2011,[[GOLD]]da [[BLUE]]nossr50[[GOLD]]. L\'obiettivo \u00e8 di fornire un\'esperienza GdR di qualit\u00e0.,[[DARK_AQUA]]Suggerimenti:,[[GOLD]] - [[GREEN]]Usa [[RED]]/mcmmo help[[GREEN]] per vedere i comandi,[[GOLD]] - [[GREEN]]Digita [[RED]]/NOMEABILIT\u00c0[[GREEN]] per vedere informazioni dettagliate sull\'abilit\u00e0,[[DARK_AQUA]]Sviluppatori:,[[GOLD]] - [[GREEN]]nossr50 [[BLUE]](Fondatore),[[GOLD]] - [[GREEN]]GJ [[BLUE]](Capo Progetto),[[GOLD]] - [[GREEN]]NuclearW [[BLUE]](Sviluppatore),[[GOLD]] - [[GREEN]]bm01 [[BLUE]](Sviluppatore),[[GOLD]] - [[GREEN]]TfT_02 [[BLUE]](Sviluppatore),[[GOLD]] - [[GREEN]]Glitchfinder [[BLUE]](Sviluppatore),[[GOLD]] - [[GREEN]]t00thpick1 [[BLUE]](Sviluppatore),[[DARK_AQUA]]Link Utili:,[[GOLD]] - [[GREEN]]https://github.com/mcMMO-Dev/mcMMO/issues[[GOLD]] Segnalazioni Bug,[[GOLD]] - [[GREEN]]#mcmmo @ irc.esper.net[[GOLD]] IRC Chat,
Commands.addlevels.AwardAll.1=[[GREEN]]Ti sono stati aggiudicati {0} livelli in tutte le abilit\u00e0!
Commands.addlevels.AwardAll.2=[[RED]]Tutte le abilit\u00e0 sono state modificate per {0}.
Commands.addlevels.AwardSkill.1=[[GREEN]]Ti sono stati aggiudicati {0} livelli in {1}!
@@ -380,8 +385,6 @@ Commands.mmoupdate.Start=[[GRAY]]Inizio conversione...
Commands.mmoupdate.Finish=[[GREEN]]Conversione terminata!
Commands.ModDescription=[[RED]]- Leggi una breve descrizione della mod
Commands.NoConsole=Questo comando non supporta l\'uso da console.
Commands.Notifications.Off=Notifiche delle capacit\u00e0 [[RED]]disattivate
Commands.Notifications.On=Notifiche delle capacit\u00e0 [[GREEN]]attivate
Commands.Offline=[[RED]]Questo comando non funziona per i giocatori offline.
Commands.Other=[[GREEN]]--ALTRI COMANDI--
Commands.Party.Header=[[RED]]-----[][[GREEN]]COMPAGNIA[[RED]][]-----
@@ -402,7 +405,6 @@ Commands.Party.Join=[[GRAY]]Ti sei unito alla compagnia: {0}
Commands.Party.Create=[[GRAY]]Creata la Compagnia: {0}
Commands.Party.Rename=[[GRAY]]Nome della compagnia cambiato in: [[WHITE]]{0}
Commands.Party.SetSharing=[[GRAY]]Modalit\u00e0 spartizione della compagnia {0} impostata come: [[DARK_AQUA]]{1}
Commands.Party.ToggleShareCategory=[[GRAY]]La condivisione oggetti di compagnia di [[GOLD]]{0} [[GRAY]]\u00e8 stata [[DARK_AQUA]]{1}
Commands.Party.AlreadyExists=[[DARK_RED]]La Compagnia {0} esiste gi\u00e0!
Commands.Party.Kick=[[RED]]Sei stato sospeso dalla tua compagnia {0}!
Commands.Party.Leave=[[RED]]Hai abbandonato quella compagnia
@@ -417,7 +419,6 @@ Commands.Party2=[[RED]]- entra in una compagnia di giocatori
Commands.ptp.Enabled=Teletrasporto di compagnia [[GREEN]]abilitato
Commands.ptp.Disabled=Teletrasporto di compagnia [[GREEN]]disabilitato
Commands.ptp.NoRequests=[[RED]]Non hai richieste di teletrasporto in questo momento
Commands.ptp.NoWorldPermissions=[[RED]][mcMMO] Non hai il permesso di teletrasportarti verso il mondo {0}.
Commands.ptp.Request1=[[YELLOW]]{0} [[GREEN]]ha richiesto di teletrasportarsi da te.
Commands.ptp.Request2=[[GREEN]]Per teletrasportarti, digita [[YELLOW]]/ptp accept. [[GREEN]]La richiesta scadr\u00e0 fra [[RED]]{0} [[GREEN]]secondi.
Commands.ptp.AcceptAny.Enabled=Conferma delle richieste di teletrasporto di compagnia [[GREEN]]abilitata
@@ -483,6 +484,7 @@ Party.Player.InSameParty=[[RED]]{0} \u00e8 gi\u00e0 nella tua compagnia!
Party.PlayerNotInParty=[[DARK_RED]]{0} non \u00e8 in una compagnia
Party.Specify=[[RED]]Devi specificare una compagnia.
Party.Teleport.Dead=[[RED]]Non puoi teletrasportarti verso un giocatore morto.
Party.Teleport.Hurt=[[RED]]Sei stato ferito negli ultimi {0} secondi e non puoi teletrasportarti.
Party.Teleport.Player=[[GREEN]]Ti sei teletrasportato da {0}.
Party.Teleport.Self=[[RED]]Non puoi teletrasportarti verso te stesso!
Party.Teleport.Target=[[GREEN]]{0} ti ha teletrasportato.
@@ -606,7 +608,6 @@ Commands.Description.mcability=Attiva o disattiva il fatto che le capacit\u00e0
Commands.Description.mcgod=Attiva o Disattiva la modalit\u00e0 dio mcMMO
Commands.Description.mchud=Cambia il tuo stile di HUD di mcMMO
Commands.Description.mcmmo=Mostra una breve descrizione di mcMMO
Commands.Description.mcnotify=Attiva o disattiva le notifiche delle capacit\u00e0 di mcMMO nel display di chat
Commands.Description.mcpurge=Elimina dal database mcMMO gli utenti senza livelli mcMMO e quelli che non si sono connessi negli ultimi {0} mesi.
Commands.Description.mcrank=Mostra la graduatoria mcMMO di un giocatore
Commands.Description.mcrefresh=Rigenera tutti i raffreddamenti di mcMMO
@@ -623,5 +624,3 @@ Commands.Description.skillreset=Azzera i livelli mcMMO di un utente
Commands.Description.vampirism=Modifica la percentuale di vampirismo mcMMO o attiva/disattiva la modalit\u00e0 vampirismo
Commands.Description.xplock=Blocca la tua barra XP di mcMMO su una specifica abilit\u00e0 di mcMMO
Commands.Description.xprate=Modifica il tasso XP di mcMMO o d\u00e0 inizio a un evento XP mcMMO.
UpdateChecker.outdated=Stai usando una versione sorpassata di mcMMO!
UpdateChecker.newavailable=\u00c8 disponibile una nuova versione su BukkitDev.

View File

@@ -14,12 +14,10 @@ Axes.Skills.SS.Other.On=[[\ub179\uc0c9]] {0} [[\uc5b4\ub450\uc6b4 \ub179\uc0c9]]
Axes.Skillup=[[YELLOW]]\ub3c4\ub07c \uae30\uc220\uc774 {0} \uc99d\uac00\ud588\uc2b5\ub2c8\ub2e4. \ucd1d ({1})
Excavation.SkillName=\ubc1c\uad74
Fishing.ItemFound=[[GRAY]]\ubcf4\ubb3c\uc744 \ubc1c\uacac\ud588\uc2b5\ub2c8\ub2e4!
Herbalism.Ability.GTh=[[GREEN]]**\ucc98\uc138\uc220**
Herbalism.Listener=\uc57d\ucd08\ud559 :
Herbalism.Skills.GTe.Refresh=[[\ub179\uc0c9]] \ub2f9\uc2e0\uc758 [[\ub178\ub780\uc0c9]] \uadf8\ub9b0 \ud14c\ub77c [[\ub179\uc0c9]] \ub2a5\ub825\uc774 \uc0c8\ub85c \uace0\uccd0\uc9d1\ub2c8\ub2e4!
Herbalism.Skills.GTe.Other.Off=[[\ub808\ub4dc]] \uadf8\ub9b0 \ud14c\ub77c [[\ub179\uc0c9]]\uc5d0 \ub300\ud55c \ud6a8\ub825\uc774 [[\ub178\ub780\uc0c9]] {0}
Mining.Ability.Length=[[\ub808\ub4dc]] \uc288\ud37c \ucc28\ub2e8\uae30 \uae38\uc774 : [[\ub178\ub780\uc0c9]] {0} \ucd08
Mining.Ability.Lower=[[GRAY]]**\ub2f9\uc2e0\uc758 \uace1\uad2d\uc774\uac00 \ub108\ubb34 \ubb34\uac81\uc2b5\ub2c8\ub2e4.**
Mining.Ability.Ready=[[GREEN]]**\uace1\uad2d\uc774\ub97c \uc900\ube44\ud558\uc138\uc694.**
Mining.Listener=\uad11\uc5c5:
Mining.Skills.SuperBreaker.Refresh=[[GREEN]]\ub2f9\uc2e0\uc758 [[YELLOW]]\uc288\ud37c \ube0c\ub808\uc774\ucee4[[GREEN]] \ub2a5\ub825\uc774 \uc6d0\uc0c1\ubcf5\uadc0 \ub418\uc5c8\uc2b5\ub2c8\ub2e4!
@@ -28,8 +26,6 @@ Mining.Blast.Radius.Increase=[[RED]]\ud3ed\ubc1c \ubc94\uc704 \uc99d\uac00\ub7c9
Mining.Blast.Refresh=[[GREEN]]\ub2f9\uc2e0\uc758 [[YELLOW]]\ubc1c\ud30c [[GREEN]]\ub2a5\ub825\uc774 \uc6d0\uc0c1\ubcf5\uadc0 \ub418\uc5c8\uc2b5\ub2c8\ub2e4!
Repair.Effect.0=\uc218\ub9ac
Repair.Effect.2=\uc218\ub9ac \ub9c8\uc2a4\ud130\ub9ac
Repair.Effect.5=\uc911\ubcf5 \ud6a8\uacfc
Repair.Effect.7=\ub2e4\uc774\uc544\ubaac\ub4dc \uc7a5\ube44 \uc218\ub9ac
Repair.Effect.9=\ub9c8\ubc95 \ud56d\ubaa9\uc744 \ubcf5\uad6c
Repair.Listener=\ubcf5\uad6c :
Repair.SkillName=REPAIR
@@ -49,7 +45,6 @@ Swords.Skills.SS.Other.Off=[[\ub808\ub4dc]] \ud1b1\ub2c8 \ubaa8\uc591\uc758 \uac
Swords.Skills.SS.Other.On=[[\ub179\uc0c9]] {0} [[\uc5b4\ub450\uc6b4 \ub179\uc0c9]] \uc0ac\uc6a9\ud55c [[\ub808\ub4dc]] \ud1b1\ub2c8 \ubaa8\uc591\uc758 \uacbd\uace0!
Taming.Ability.Bonus.2=\ub450\uaebc\uc6b4 \ubaa8\ud53c
Taming.Listener.Wolf=[[\uc5b4\ub450\uc6b4 \ud68c\uc0c9]] \ub2e4\uc2dc\uc5d0 \ub300\ud55c \uadc0\ud558\uc758 \ub291\ub300 scurries ...
Taming.Skillup=[[YELLOW]]\uae38\ub4e4\uc774\uae30 \uae30\uc220 {0} \uc99d\uac00\ud588\uc2b5\ub2c8\ub2e4. \ucd1d ({1})
Unarmed.Listener=\ubb34\uae30 :
Unarmed.SkillName=\ube44\ubb34\uc7a5
Unarmed.Skills.Berserk.Off=[[RED]]**\ubc84\uc11c\ud06c \ud574\uc81c**
@@ -73,7 +68,6 @@ Commands.DoesNotExist=[[RED]]\uc0ac\uc6a9\uc790\uac00 DB\uc5d0 \uc874\uc7ac\ud55
Commands.GodMode.Disabled=[[YELLOW]]mcMMO Godmode \ube44\ud65c\uc131\ud654
Commands.Invite.Accepted=[[\ub179\uc0c9]] \uc811\uc218 \ucd08\ub300\ud569\ub2c8\ub2e4. \ub2f9\uc2e0\uc740 \ud30c\ud2f0\uc5d0 \uc744 (\ub97c) \uac00\uc785 {0}
Commands.mmoedit=[\ud50c\ub808\uc774\uc5b4] <skill> <newvalue> [[RED]] - \ubaa9\ud45c\ub97c \uc218\uc815
Commands.Party.Accept=[[RED]]- \ud30c\ud2f0 \ucd08\ub300 \uc218\ub77d
Commands.Party.Invite.0=[[\uc801\uc0c9]] \uacbd\uace0 : [[\ub179\uc0c9]] \ub2f9\uc2e0\uc740 \ub098\uc5d0\uac8c \ud30c\ud2f0 \ucd08\ub300\ub97c\ubc1b\uc740 {0}\uc5d0\uc11c {1}
Commands.Party.Kick=[[\ub808\ub4dc]] \ub2f9\uc2e0\uc740 \uc790 {0}\uc5d0\uc11c \ucad3\uaca8\ub418\uc5c8\uc2b5\ub2c8\ub2e4!
Commands.Party.Leave=[[\ub808\ub4dc]] \ub2f9\uc2e0\uc774 \ub0a8\uaca8 \ub450\uc5c8\ub358 \uadf8 \ub2f9\uc0ac\uc790

View File

@@ -1,56 +1,23 @@
Acrobatics.Combat.Proc=[[GREEN]]**Ontweken**
Acrobatics.Effect.0=Rollen
Acrobatics.Effect.4=Ontwijken
Acrobatics.Listener=Acrobatiek
Acrobatics.SkillName=ACROBATIEK
Acrobatics.Skillup=[[YELLOW]]Acrobatiek toegenomen met {0}. Totaal ({1})
Archery.Effect.0=Ervaringsschot
Archery.Effect.1=Neemt de schade van bogen toe
Archery.Effect.2=Verdoven (Spelers)
Archery.Effect.5=Kans om pijlen te krijgen van lijken
Archery.Listener=Boogschieten:
Archery.SkillName=BOOGSCHIETEN
Archery.Skillup=[[YELLOW]] Boogschieten ervaring toegenomen met {0}. Totaal ({1})
Axes.Ability.Bonus.0=Bijl Meesterschap
Axes.Combat.CritStruck=[[DARK_RED]]Je bent KRITISCH geraakt
Axes.Combat.GI.Struck=[[RED]]**GETROFFEN MET MEER SCHADE**
Axes.Combat.SS.Length=[[RED]]Schedel Splijter Lengte: [[YELLOW]]{0}s
Axes.Effect.3=Verdubbelde Schade
Axes.Effect.5=Voegt DMG bonus toe
Axes.SkillName=BIJLEN
Axes.Skills.SS.On=[[GREEN]]**SCHEDEL SPLIJTER GEACTIVEERD**
Axes.Skills.SS.Refresh=[[GREEN]]Jou [[YELLOW]]Schedel Splijten [[GREEN]]kracht is hersteld!
Axes.Skills.SS.Other.On=[[GREEN]]{0}[[DARK_GREEN]] heeft [[RED]]Schedel Splijter[[DARK_GREEN]]gebruikt!
Axes.Skillup=[[YELLOW]]Bijl ervaring toegenomen met {0}. Totaal ({1})
Excavation.Effect.2=Schatten Jager
Excavation.Listener=Uitgraving:
Excavation.SkillName=Uitgraving
Excavation.Skills.GigaDrillBreaker.On=[[GREEN]]**GIGA DRILL BREKER GEACTIVEERD**
Excavation.Skillup=[[YELLOW]]Uitgravings ervaring toegenomen met {0}. Totaal ({1})
Fishing.Chance.Raining=[[BLUE]] Regen Bonus
Fishing.ItemFound=[[GRAY]]Schat gevonden!
Fishing.Listener=Vissen:
Fishing.MagicFound=[[GRAY]]Jij voelt een vleugje magie met deze vangst...
Herbalism.Ability.GTh=[[GREEN]]**GROEN DUIMPJE**
Herbalism.Listener=Kruidenkunde:
Herbalism.Skills.GTe.Refresh=[[GREEN]]Jou [[YELLOW]]groene Vingers [[GREEN]]kracht is hersteld!
Herbalism.Skills.GTe.Other.Off=[[RED]]Groene vingers[[GREEN]] is uitgewerkt voor [[YELLOW]]{0}
Herbalism.Skills.GTe.Other.On=[[GREEN]]{0}[[DARK_GREEN]]heeft[[RED]]Groene Aarde[[DARK_GREEN]]gebruikt!
Mining.Ability.Length=[[RED]]Super BrekerLengte: [[YELLOW]]{0}s
Mining.Ability.Ready=[[GREEN]]**JE HOUDT JE PIKHOUWEEL GEREED**
Mining.Listener=Mijnbouw:
Mining.Skills.SuperBreaker.Other.Off=[[RED]] Super Breker[[GREEN]] is uitgewerkt voor [[YELLOW]]{0}
Mining.Skills.SuperBreaker.Refresh=[[GREEN]]Jou[[YELLOW]]Super Breek[[GREEN]]kracht is hersteld!
Mining.Skillup=[[YELLOW]]Mijn ervaring toegenomen met {0}. Totaal: ({1})
Mining.Blast.Refresh=[[GREEN]]Jou[[YELLOW]]explosie mijn [[GREEN]]kracht is hersteld!
Repair.Effect.0=Repareren
Repair.Effect.2=Reparatie Meesterschap
Repair.Effect.3=Toegenomen reparatie aantal
Repair.Effect.4=Super Reparatie
Repair.Effect.5=Verdubbelde effectiefheid
Repair.Effect.6=Diamanten Reparatie ({0}+ SKILL)
Repair.Effect.7=Repareer Diamanten Gereedschap & Wapenuitrusting
Repair.Effect.8=Arcane Smeden
Repair.Effect.9=Magische voorwerpen repareren
Repair.Listener.Anvil=[[DARK.RED]]Je hebt een aambeeld geplaatst, met een aambeeld kun je je gereedschappen en pantser mee repareren
Repair.Listener=Repareer:
@@ -60,19 +27,12 @@ Repair.Skills.AdeptGold=[[DARK_RED]]Je bent niet goed genoeg om goud te reparere
Repair.Skills.AdeptStone=[[DARK_RED]]Je bent nog niet sterk genoeg om steen te repareren.
Repair.Skills.FeltEasy=[[GRAY]]Dat voelde makkelijk.
Repair.Skillup=[[YELLOW]]Repareer ervaring toegenomen met {0}. Totaal: ({1})
Repair.Arcane.Chance.Downgrade=[[GRAY]]AF Downgrade Kans: [[YELLOW]]{0}%
Repair.Arcane.Chance.Success=[[GRAY]] Mystiek Smeden Succes Percentage: [[YELLOW]]{0}%
Repair.Arcane.Fail=[[RED]]Mysterieuze kracht heeft het voorwerp voorgoed verlaten.
Repair.Arcane.Lost=[[RED]]Je hebt niet genoeg ervaring om de betoveringen te behouden
Swords.Ability.Ready=[[GREEN]]**JIJ HOUD JOU WAPEN GEREED**
Swords.Combat.Bleeding.Stopped=[[GRAY]]Het bloeden is [[GREEN]]Gestopt[[GRAY]]!
Swords.Combat.Bleeding=[[GREEN]]**VIJAND BLOED**
Swords.Combat.Counter.Hit=[[DARK_RED]]Geraakt door een tegenaanval
Swords.Combat.Countered=[[GREEN]]**TEGEN-AANVAL**
Swords.Combat.SS.Struck=[[DARK_RED]]Geraakt door GEKARTELDE SLAG!
Swords.Effect.2=Gekartelde Slag (Vermogen)
Swords.Effect.4=Gekartelde Slag Bloed+
Swords.Effect.6=Bloeden
Swords.Listener=Zwaarden:
Swords.SkillName=ZWAARDEN
Swords.Skills.SS.On=[[GREEN]]**GEKARTELDE SLAG GEACTIVEERD**
@@ -80,19 +40,6 @@ Swords.Skills.SS.Other.Off=[[RED]]Gekartelde Slag[[GREEN]] is uitgewerkt voor [[
Swords.Skills.SS.Other.On=[[GREEN]]{0}[[DARK_GREEN]] heeft [[RED]]Gekartelde Slag[[DARK_GREEN]]gebruikt!
Swords.Skillup=[[YELLOW]]Zwaarden ervaring toegenomen met {0}. Totaal: ({1})
Taming.Ability.Bonus.2=Dikke Vacht
Taming.Ability.Bonus.7=+{0} Schade
Taming.Effect.10=Schokbestendig
Taming.Effect.11=Explosieve Schade Verkleining
Taming.Effect.12=Roep van het WIld
Taming.Effect.13=Roep een dier aan je zijde op
Taming.Effect.14=[[GRAY]]COTW (Ocelot): Buk en linkermuisknop met {0} Vis in je hand
Taming.Effect.15=[[GRAY]]COTW (Wolf): Buk en linkermuisknop met {0} Botten in je hand
Taming.Effect.16=Fast Food Service
Taming.Effect.17=Kans voor wolven na een aanval te regeneren
Taming.Listener.Wolf=[[DARK_GRAY]]Jouw wolf dribbelt terug naar je...
Taming.Listener=Temming:
Taming.Skillup=[[YELLOW]]Temmings ervaring toegenomen met {0}. Totaal ({1})
Taming.Summon.Complete=[[GREEN]]Oproepen voltooid
Unarmed.Ability.Berserk.Length=[[RED]]Razernij Lengte: [[YELLOW]]{0}s
Unarmed.Effect.0=Razernij (KRACHT)
Unarmed.Listener=Ongewapend:
@@ -104,10 +51,9 @@ Unarmed.Skills.Berserk.Refresh=[[GREEN]]Jou[[YELLOW]]Razernij [[GREEN]]kracht is
Woodcutting.Ability.0=Bladblazer
Woodcutting.Ability.1=Bladeren wegblazen
Woodcutting.Effect.2=Bladblazer
Woodcutting.Listener=Houthakken:
Woodcutting.Listener=Houthakken
Woodcutting.SkillName=Houthakken
Woodcutting.Skills.TreeFeller.Other.Off=[[RED]]Boom Veller[[GREEN]] is uitgewerkt voor [[YELLOW]]{0}
Woodcutting.Skills.TreeFeller.Other.On=[[GREEN]]{0}[[DARK)GREEN]]heeft[[RED]]Tree Feller[[DARK_GREEN]]gebruikt!
Woodcutting.Skills.TreeFeller.Splinter=[[RED]]JOU BIJL SPLINTERT IN DUIZENDEN STUKJES!
Woodcutting.Skillup=[[YELLOW]]Houthakken toegenomen met {0}. Totaal ({1})
Ability.Generic.Template.Lock=[[GRAY]]{0}
@@ -116,21 +62,18 @@ Combat.ArrowDeflect=[[WHITE]]**PIJL AFWIJKING**
Combat.BeastLore=[[GREEN]]**WOLFINSPECTIE**
Combat.BeastLoreHealth=[[DARK_AQUA]]Levens ([[GREEN]]{0}[[DARK_AQUA]]/{1})
Combat.BeastLoreOwner=[[DARK_AQUA]]Eigenaar ([[RED]]{0}[[DARK_AQUA]])
Combat.BurningArrowHit=[[DARK_RED]]Je bent geraakt door een brandende pijl\\!
Combat.Gore=[[GREEN]]**GESTOLD BLOED**
Combat.Ignition=[[RED]]**ONTSTEKING**
Combat.StruckByGore=[[RED]]**VAST DOOR GESTOLD BLOED**
Combat.TargetDazed=Doelwit was [[DARK_RED]]versuft
Combat.TouchedFuzzy=[[DARK_RED]]Je raakte Fuzzy aan. Je voelt je duizelig.
Commands.AdminChat.Off=Alleen Admin gesprek[[RED]]Uit
Commands.AdminToggle=[[RED]]- Zet Admin Chat aan/uit
Commands.Disabled=[[RED]]Deze opdracht is gedeactiveerd.
Commands.DoesNotExist=[[RED]]Speler bestaat niet in de database!
Commands.GodMode.Disabled=[[YELLOW]]mcMMO GodModus Uitgeschakeld
Commands.Invite.Accepted=[[GREEN]]Uitnodiging geacepteerd. Jij hebt de groep {0} betreden
Commands.mcgod=[[RED]]- GodModus Schakelen
Commands.mcrank.Player=[[RED]]DOELWIT: [[WHITE]]{0}
Commands.mmoedit=[player] <Kracht> <Nieuwe waarde> [[RED]] - Pas doel aan
Commands.mmoupdate.Start=[[GRAY]]Beginnen met converteren...
Commands.ModDescription=[[RED]]- Lees instructie mod beschrijving
Commands.NoConsole=Deze commando wordt niet ondersteund vanuit de console.
Commands.Party.ShareMode=[[DARK_GRAY]]DEEL MODUS:
Commands.Party.Accept=[[RED]]- Accepteer groep uitnodiging
@@ -138,30 +81,22 @@ Commands.Party.Chat.Off=Groep\'s Chat [[RED]]Uit
Commands.Party.Chat.On=Groep\'s Chat [[GREEN]]Aan
Commands.Party.Commands=[[GREEN]]--GROEP COMMANDOS--
Commands.Party.Invite.0=[[RED]]ALERT: [[GREEN]]Jij hebt een groep uitnodiging ontvangen voor {0} van {1}
Commands.Party.Invite=[[RED]]- Verstuur groepsuitnodiging
Commands.Party.Create=[[GRAY]]Groep aangemaakt: {0}
Commands.Party.Rename=[[GRAY]]Groep\'s naan veranderd naar: [[WHITE]]{0}
Commands.Party.AlreadyExists=[[DARK_RED]]Groep {0} bestaat al!
Commands.Party.Kick=[[RED]]Je bent verwijderd uit de groep {0}!
Commands.Party.Leave=[[RED]]Je hebt de groep verlaten
Commands.Party.Members.Header=[[RED]]-----[][[GREEN]]LEDEN[[RED]][]-----
Commands.Party.Members={0}
Commands.Party.None=[[RED]]Je bent niet in een groep.
Commands.Party.Quit=[[RED]]- Verlaat je huidige groep
Commands.Party.Teleport=<player> [[RED]]- Teleport naar een groepslid
Commands.Party.Toggle=[[RED]]- Zet Party Chat aan/uit
Commands.Party1=[[RED]]- Maak een nieuwe groep
Commands.ptp.RequestExpired=[[RED]]Groep\'s teleport verzoek is verlopen!
Commands.PowerLevel.Leaderboard=[[YELLOW]]--mcMMO[[BLUE]] Kracht Level [[YELLOW]]Leiderbord--
Commands.PowerLevel=[[DARK_RED]]KRACHT LEVEL: [[GREEN]]{0}
Commands.Usage.Level=niveau
Commands.Usage.Message=bericht
Commands.Usage.PartyName=naam
Commands.Usage.Password=wachtwoord
Commands.Usage.XP=xp
mcMMO.NoSkillNote=[[DARK_GRAY]]als je geen toegang hebt tot een vermogen, wordt die hier niet getoont
Party.Forbidden=[mcMMO] Groepen niet toegestaan op deze wereld (zie Machtigingen)
Party.InformedOnQuit={0} [[GREEN]]heeft de groep verlaten
Party.InvalidName=[[DARK_RED]]Dat is geen geldige groep\'s naam.
Party.IsLocked=[[RED]]Deze groep is al gesloten!
Party.IsntLocked=[[RED]]Deze groep is niet gesloten!
@@ -174,37 +109,24 @@ Party.Owner.Player=[[GREEN]]Jij bent nu de groep eigenaar.
Party.Password.None=[[RED]]Deze groep is vergrendeld met een wachtwoord. Voer het wachtwoord in om in deze groep te komen.
Party.Password.Incorrect=[[RED]]Groeps- wachtwoord is incorrect.
Party.Password.Set=[[GREEN]]Groep wachtwoord veranderd in {0}
Party.Password.Removed=[[GREEN]]Groepswachtwoord is verwijderd.
Party.Player.Invalid=[[RED]]Dat is geen geldige speler.
Party.NotOnline=[[DARK_RED]]{0} is niet online!
Party.Player.InSameParty=[[RED]]{0} zit al in uw groep!
Party.PlayerNotInParty=[[DARK_RED]]{0} zit niet in een groep
Party.Specify=[[RED]]Je moet een groep invullen.
Party.Teleport.Dead=[RED]Je kan niet naar een dode speler teleporteren.
Party.Teleport.Target=[[GREEN]]{0} is naar jou toe gedeporteerd.
Party.Teleport.Disabled=[[RED]]{0} staat groeps-teleportaties niet toe.
Party.Join.Self=[[RED]]Je kan niet meedoen met jezelf!
Party.Unlocked=[[GRAY]]Groep is ontgrendeld
Party.Status.Unlocked=[[DARK_GREEN]](OPEN)
Party.ShareMode.None=NIKS
Party.ShareMode.Equal=GELIJK
Party.ShareMode.Random=WILLEKEURIG
Party.ExpShare.Disabled=[[RED]]Groep experience delen in uitgeschakeld.
Party.ItemShare.Disabled=[[RED]]Groeps item delen is uitgezet.
Commands.XPGain.Acrobatics=Vallen
Commands.XPGain.Axes=Monsters aanvallen
Commands.XPGain.Excavation=Graven en schatten vinden
Commands.XPGain.Fishing=Vissen (Wat denk je zelf?)
Commands.XPGain.Herbalism=Kruiden Verzamelen
Commands.XPGain.Mining=Het Mijnen van Steen & Erts
Commands.XPGain.Repair=Repareren
Commands.XPGain.Swords=Monsters aanvallen
Commands.XPGain.Taming=Dieren Temmen, of vechten met je wolven
Commands.XPGain=[[DARK_GRAY]]XP GEWONNEN: [[WHITE]]{0}
Commands.xplock.locked=[[GOLD]]Jou XP BALK is nu bevroren op {0}!
Commands.xplock.unlocked=[[GOLD]]Jou XP BALK is nu[[GREEN]]ONTGRENDELD[[GOLD]]!
Commands.xprate.over=[[RED]]mcMMO XP Verdubbeling Evenement is VOORBIJ!!
Commands.xprate.proper.0=[[RED]]Juiste gebruiking om de XP snelheid te veranderen is /xprate <integer> <true/false>
XPRate.Event=[[GOLD]]mcMMO is momenteel in een XP verdubbeling evenement! XP verdubbeling is {0}x!
Effects.Effects=EFFECTEN
Guides.Axes=Guide coming soon...
@@ -213,12 +135,8 @@ Guides.Mining=[[DARK_AQUA]]About Mining:\n[[YELLOW]]Mining consists of mining st
Inspect.OfflineStats=mcMMO statistieken voor offline-speler [[YELLOW]]{0}
Inspect.Stats=[[GREEN]]mcMMO Statistieken voor [[YELLOW]]{0}
Inspect.TooFar=[[RED]]Jij bent te ver weg om deze speler te inspecteren!
Item.ChimaeraWing.Pass=**CHIMAERA VLEUGEL**
Item.Injured.Wait=Je bent recent gewond geraakt en je moet wachter om dit te gebruiken. [[YELLOW]]({0}s)
Skills.Disarmed=[[DARK_RED]]Je bent ontwapend!
Skills.NeedMore=[[DARK_RED]]Jij hebt te weinig [[GRAY]]{0}
Skills.TooTired=[[RED]]Jij bent te moe om die kracht opnieuw te gebruiken. [[YELLOW]]({0}s)
Stats.Header.Combat=[[GOLD]]-=Strijd Ervaring=-
Stats.Header.Gathering=[[GOLD]]-=VERZAMELAAR VAARDIGHEDEN=-
Stats.Header.Misc=[[GOLD]]-=MISC ERVARING=-
Stats.Own.Stats=[[GREEN]][mcMMO] Stats

View File

@@ -79,7 +79,9 @@ Combat.ArrowDeflect=[[WHITE]]**ODBICIE STRZALY**
Combat.BeastLore=[[GREEN]]**WIEDZA O ZWIERZETACH**
Combat.BeastLoreHealth=[[DARK_AQUA]]Zycie ([[GREEN]]{0}[[DARK_AQUA]]/{1})
Combat.BeastLoreOwner=[[DARK_AQUA]]Wlasciciel ([[RED]]{0}[[DARK_AQUA]])
Combat.BurningArrowHit=[[DARK_RED]]Zostales trafiony plonaca strzala\\!
Combat.Gore=[[GREEN]]**KRWOTOK**
Combat.Ignition=[[RED]]**PODPALENIE**
Combat.StruckByGore=[[RED]]**WYKRWAWIENIE**
Combat.TargetDazed=Cel zostal [[DARK_RED]]oszolomiony.
Combat.TouchedFuzzy=[[DARK_RED]]Zostales oszolomiony.
@@ -132,6 +134,7 @@ Guides.Smelting=Wkrotce...
Inspect.OfflineStats=mcMMO Stats for Offline Player [[YELLOW]]{0}
Inspect.Stats=[[GREEN]]mcMMO Stats for [[YELLOW]]{0}
Inspect.TooFar=[[RED]]You are too far away to inspect that player!
Item.ChimaeraWing.Fail=**CHIMAERA WING FAILED!**
Item.ChimaeraWing.Pass=**SKRZYD\u0141O CHIMERY**
Skills.Disarmed=[[DARK_RED]]Zostales rozbrojony!
Skills.NeedMore=[[DARK_RED]]Potrzebujesz wiecej

View File

@@ -10,7 +10,9 @@ Combat.ArrowDeflect=[[WHITE]]*DESVIOU A FLECHA*
Combat.BeastLore=[[GREEN]]*CONHECIMENTO DE FERAS*
Combat.BeastLoreHealth=[[DARK_AQUA]]Health ([[GREEN]]{0}[[DARK_AQUA]]/{1})
Combat.BeastLoreOwner=[[DARK_AQUA]]Dono ([[RED]]{0}[[DARK_AQUA]])
Combat.BurningArrowHit=[[DARK_RED]]Voc\u00ea foi atingido por uma flecha flamejante\\!
Combat.Gore=[[GREEN]]*MORDIDA*
Combat.Ignition=[[RED]]*IGNI\u00c7AO*
Combat.StruckByGore=[[RED]]*ATINGIDO POR MORDIDA*
Combat.TargetDazed=Alvo foi [[DARK_RED]]Atordoado
Combat.TouchedFuzzy=[[DARK_RED]]Visao turva. Sente Tonturas.

View File

@@ -33,6 +33,7 @@ Axes.Ability.Bonus.4=\u0412\u0435\u043b\u0438\u043a\u0438\u0439 \u0423\u0434\u04
Axes.Ability.Bonus.5=\u041d\u0430\u043d\u043e\u0441\u0438\u0442 {0} \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0423\u0440\u043e\u043d\u0430 \u0431\u0435\u0437\u043e\u0440\u0443\u0436\u043d\u044b\u043c \u0432\u0440\u0430\u0433\u0430\u043c
Axes.Ability.Lower=[[GREEN]]**\u0422\u041e\u041f\u041e\u0420 \u0412 \u041e\u0411\u042b\u0427\u041d\u041e\u041c \u0421\u041e\u0421\u0422\u041e\u042f\u041d\u0418\u0418**
Axes.Ability.Ready=[[GREEN]]**\u0422\u041e\u041f\u041e\u0420 \u0412 \u0421\u041e\u0421\u0422\u041e\u042f\u041d\u0418\u0418 \u0413\u041e\u0422\u041e\u0412\u041d\u041e\u0421\u0422\u0418**
Axes.Combat.Cleave.Proc=[[DARK_RED]]\u041f\u043e\u0440\u0430\u0436\u0435\u043d \u0421\u041f\u041b\u042d\u0428 \u0423\u0414\u0410\u0420\u041e\u041c!
Axes.Combat.CritStruck=[[DARK_RED]]\u0412\u0430\u043c \u043d\u0430\u043d\u0435\u0441\u0435\u043d\u043e \u041a\u0420\u0418\u0422\u0418\u0427\u0415\u0421\u041a\u041e\u0415 \u043f\u043e\u0432\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435!
Axes.Combat.CritChance=[[RED]]\u0428\u0430\u043d\u0441 \u043d\u0430\u043d\u0435\u0441\u0442\u0438 \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0443\u0434\u0430\u0440: [[YELLOW]]{0}%
Axes.Combat.CriticalHit=[[RED]]\u041a\u0420\u0418\u0422\u0418\u0427\u0415\u0421\u041a\u0418\u0419 \u0423\u0414\u0410\u0420!
@@ -121,7 +122,7 @@ Herbalism.SkillName=\u0422\u0420\u0410\u0412\u041d\u0418\u0427\u0415\u0421\u0422
Herbalism.Skills.GTe.Off=[[RED]]**\u0423\u043c\u0435\u043d\u0438\u0435 \"\u041e\u0437\u0435\u043b\u0435\u043d\u0435\u043d\u0438\u0435\" \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u043b\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435**
Herbalism.Skills.GTe.On=[[GREEN]]**\u0423\u043c\u0435\u043d\u0438\u0435 \"\u041e\u0437\u0435\u043b\u0435\u043d\u0435\u043d\u0438\u0435\" \u0410\u041a\u0422\u0418\u0412\u0418\u0420\u041e\u0412\u0410\u041d\u041e**
Herbalism.Skills.GTe.Refresh=[[GREEN]]\u0412\u0430\u0448\u0435 \u0443\u043c\u0435\u043d\u0438\u0435 [[YELLOW]]\"\u041e\u0437\u0435\u043b\u0435\u043d\u0435\u043d\u0438\u0435\" [[GREEN]]\u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e!
Herbalism.Skills.GTe.Other.Off=[[GREEN]] \u0423\u043c\u0435\u043d\u0438\u0435 \"[[RED]]\u041e\u0437\u0435\u043b\u0435\u043d\u0435\u043d\u0438\u0435[[GREEN]] \" \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u043b\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0443 [[YELLOW]]{0}
Herbalism.Skills.GTe.Other.Off=[[RED]]\u0423\u043c\u0435\u043d\u0438\u0435 \"\u041e\u0437\u0435\u043b\u0435\u043d\u0435\u043d\u0438\u0435\"[[GREEN]] \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u043b\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0443 [[YELLOW]]{0}
Herbalism.Skills.GTe.Other.On=[[GREEN]]{0}[[DARK_GREEN]] \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0443\u043c\u0435\u043d\u0438\u0435 [[RED]] \"\u041e\u0437\u0435\u043b\u0435\u043d\u0435\u043d\u0438\u0435\"!
Herbalism.Skillup=[[YELLOW]]\u0423\u0440\u043e\u0432\u0435\u043d\u044c \u043d\u0430\u0432\u044b\u043a\u0430 \"\u0422\u0440\u0430\u0432\u043d\u0438\u0447\u0435\u0441\u0442\u0432\u043e\" \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d \u043d\u0430 {0}. \u0412\u0441\u0435\u0433\u043e ({1})
Mining.Ability.Length=[[RED]]\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0443\u043c\u0435\u043d\u0438\u044f \"\u0421\u0443\u043f\u0435\u0440 \u0414\u0440\u043e\u0431\u0438\u043b\u043a\u0430\": [[YELLOW]]{0}\u0441.
@@ -151,6 +152,14 @@ Mining.Skills.SuperBreaker.Other.On=[[GREEN]]{0}[[DARK_GREEN]] \u0438\u0441\u043
Mining.Skills.SuperBreaker.Refresh=[[GREEN]]\u0412\u0430\u0448\u0430 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c [[YELLOW]]\u041a\u043e\u043f\u0430\u0442\u0435\u043b\u044c [[GREEN]]\u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0430!
Mining.Skillup=[[YELLOW]]\u0423\u0440\u043e\u0432\u0435\u043d\u044c \u043d\u0430\u0432\u044b\u043a\u0430 \"\u0428\u0430\u0445\u0442\u0451\u0440\u0441\u0442\u0432\u043e\" \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d \u043d\u0430 {0}. \u0412\u0441\u0435\u0433\u043e ({1})
Mining.Blast.Boom=[[GRAY]]**\u0411\u0423\u041c**
Mining.Blast.Effect.0=+35% \u0434\u043e\u0445\u043e\u0434 \u043e\u0442 \u0440\u0443\u0434
Mining.Blast.Effect.1=+40% \u0434\u043e\u0445\u043e\u0434 \u043e\u0442 \u0440\u0443\u0434
Mining.Blast.Effect.2=+45% \u0434\u043e\u0445\u043e\u0434 \u043e\u0442 \u0440\u0443\u0434, \u0431\u0435\u0437 \u043c\u0443\u0441\u043e\u0440\u0430
Mining.Blast.Effect.3=+50% \u0434\u043e\u0445\u043e\u0434 \u043e\u0442 \u0440\u0443\u0434, \u0431\u0435\u0437 \u043c\u0443\u0441\u043e\u0440\u0430
Mining.Blast.Effect.4=+55% \u0434\u043e\u0445\u043e\u0434 \u043e\u0442 \u0440\u0443\u0434, \u0431\u0435\u0437 \u043c\u0443\u0441\u043e\u0440\u0430, \u0434\u0432\u043e\u0439\u043d\u043e\u0439 \u0434\u0440\u043e\u043f
Mining.Blast.Effect.5=+60% \u0434\u043e\u0445\u043e\u0434 \u043e\u0442 \u0440\u0443\u0434, \u0431\u0435\u0437 \u043c\u0443\u0441\u043e\u0440\u0430, \u0434\u0432\u043e\u0439\u043d\u043e\u0439 \u0434\u0440\u043e\u043f
Mining.Blast.Effect.6=+65% \u0434\u043e\u0445\u043e\u0434 \u043e\u0442 \u0440\u0443\u0434, \u0431\u0435\u0437 \u043c\u0443\u0441\u043e\u0440\u0430, \u0442\u0440\u043e\u0439\u043d\u043e\u0439 \u0434\u0440\u043e\u043f
Mining.Blast.Effect.7=+70% \u0434\u043e\u0445\u043e\u0434 \u043e\u0442 \u0440\u0443\u0434, \u0431\u0435\u0437 \u043c\u0443\u0441\u043e\u0440\u0430, \u0442\u0440\u043e\u0439\u043d\u043e\u0439 \u0434\u0440\u043e\u043f
Mining.Blast.Radius.Increase=[[RED]]\u0420\u0430\u0434\u0438\u0443\u0441 \u0412\u0437\u0440\u044b\u0432\u0430 \u0423\u0432\u0435\u043b\u0438\u0447\u0435\u043d: [[YELLOW]]+{0}
Mining.Blast.Rank=[[RED]]\u041f\u043e\u0434\u0440\u044b\u0432\u043d\u0430\u044f \u0414\u043e\u0431\u044b\u0447\u0430: [[YELLOW]] \u0420\u0430\u043d\u0433 {0}/8 [[GRAY]]({1})
Mining.Blast.Other.On=[[GREEN]]{0}[[DARK_GREEN]] \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0443\u043c\u0435\u043d\u0438\u0435 [[RED]]\"\u041f\u043e\u0434\u0440\u044b\u0432\u043d\u0430\u044f \u0414\u043e\u0431\u044b\u0447\u0430\"!
@@ -226,7 +235,7 @@ Swords.SkillName=\u0412\u043b\u0430\u0434\u0435\u043d\u0438\u0435 \u041c\u0435\u
Swords.Skills.SS.Off=[[RED]]**\u0423\u043c\u0435\u043d\u0438\u0435 \"\u0420\u0435\u0436\u0443\u0449\u0438\u0439 \u0443\u0434\u0430\u0440\" \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u043b\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435**
Swords.Skills.SS.On=[[GREEN]]**\u0423\u043c\u0435\u043d\u0438\u0435 \"\u0420\u0435\u0436\u0443\u0449\u0438\u0439 \u0443\u0434\u0430\u0440\" \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043e**
Swords.Skills.SS.Refresh=[[GREEN]]\u0412\u0430\u0448\u0435 \u0443\u043c\u0435\u043d\u0438\u0435 [[YELLOW]]\"\u0420\u0435\u0436\u0443\u0449\u0438\u0439 \u0423\u0434\u0430\u0440\" [[GREEN]]\u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e!
Swords.Skills.SS.Other.Off=[[GREEN]]\u0423\u043c\u0435\u043d\u0438\u0435 \"[[RED]]\u0420\u0435\u0436\u0443\u0449\u0438\u0439 \u0443\u0434\u0430\u0440[[GREEN]]\" \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u043b\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0443 [[YELLOW]]{0}
Swords.Skills.SS.Other.Off=[[RED]]\u0423\u043c\u0435\u043d\u0438\u0435 \"\u0420\u0435\u0436\u0443\u0449\u0438\u0439 \u0443\u0434\u0430\u0440\"[[GREEN]] \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u043b\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0443 [[YELLOW]]{0}
Swords.Skills.SS.Other.On=[[GREEN]]{0}[[DARK_GREEN]] \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0443\u043c\u0435\u043d\u0438\u0435 [[RED]]\"\u0420\u0435\u0436\u0443\u0449\u0438\u0439 \u0423\u0434\u0430\u0440\"!
Swords.Skillup=[[YELLOW]]\u0423\u0440\u043e\u0432\u0435\u043d\u044c \u043d\u0430\u0432\u044b\u043a\u0430 \"\u0412\u043b\u0430\u0434\u0435\u043d\u0438\u0435 \u041c\u0435\u0447\u0435\u043c\" \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d \u043d\u0430 {0}. \u0412\u0441\u0435\u0433\u043e ({1})
Swords.SS.Length=[[RED]]\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0443\u043c\u0435\u043d\u0438\u044f \"\u0420\u0435\u0436\u0443\u0449\u0438\u0439 \u0423\u0434\u0430\u0440\": [[YELLOW]]{0}\u0441.
@@ -240,7 +249,6 @@ Taming.Ability.Bonus.6=\u041e\u0441\u0442\u0440\u044b\u0435 \u041a\u043e\u0433\u
Taming.Ability.Bonus.7=+{0} \u0423\u0440\u043e\u043d\u0430
Taming.Ability.Bonus.8=\u0411\u044b\u0441\u0442\u0440\u043e\u0435 \u041f\u0438\u0442\u0430\u043d\u0438\u0435
Taming.Ability.Bonus.9={0}% \u0428\u0430\u043d\u0441 \u0432\u044b\u043b\u0435\u0447\u0438\u0442\u044c\u0441\u044f \u043f\u0440\u0438 \u0430\u0442\u0430\u043a\u0435
Taming.Ability.Bonus.10=\u0421\u0432\u044f\u0442\u043e\u0439 \u041f\u0435\u0441
Taming.Ability.Locked.0=\u0417\u0410\u0411\u041b\u041e\u041a\u0418\u0420\u041e\u0412\u0410\u041d\u041e \u0414\u041e \u0414\u041e\u0421\u0422\u0418\u0416\u0415\u041d\u0418\u042f {0}+ \u0423\u0420\u041e\u0412\u041d\u042f \u041d\u0410\u0412\u042b\u041a\u0410 (\u042d\u041a\u041e\u041b\u041e\u0413\u0418\u0427\u0415\u0421\u041a\u041e\u0415 \u0421\u041e\u0417\u041d\u0410\u041d\u0418\u0415)
Taming.Ability.Locked.1=\u0417\u0410\u0411\u041b\u041e\u041a\u0418\u0420\u041e\u0412\u0410\u041d\u041e \u0414\u041e \u0414\u041e\u0421\u0422\u0418\u0416\u0415\u041d\u0418\u042f {0}+ \u0423\u0420\u041e\u0412\u041d\u042f \u041d\u0410\u0412\u042b\u041a\u0410 (\u0413\u0423\u0421\u0422\u041e\u0419 \u041c\u0415\u0425)
Taming.Ability.Locked.2=\u0417\u0410\u0411\u041b\u041e\u041a\u0418\u0420\u041e\u0412\u0410\u041d\u041e \u0414\u041e \u0414\u041e\u0421\u0422\u0418\u0416\u0415\u041d\u0418\u042f {0}+ \u0423\u0420\u041e\u0412\u041d\u042f \u041d\u0410\u0412\u042b\u041a\u0410 (\u0417\u0410\u0429\u0418\u0422\u0410 \u041e\u0422 \u0428\u041e\u041a\u0410)
@@ -257,8 +265,6 @@ Taming.Effect.14=[[GRAY]]COTW (\u041e\u0446\u0435\u043b\u043e\u0442): \u041f\u04
Taming.Effect.15=[[GRAY]]COTW (\u0412\u043e\u043b\u043a): \u041f\u0440\u0438\u0441\u044f\u0434\u044c\u0442\u0435 \u0438 \u043a\u043b\u0438\u043a\u043d\u0438\u0442\u0435 \u043b\u0435\u0432\u043e\u0439 \u043a\u043d\u043e\u043f\u043a\u043e\u0439 \u043c\u044b\u0448\u0438 \u0441 {0} \u041a\u043e\u0441\u0442\u044c\u044e \u0432 \u0440\u0443\u043a\u0435
Taming.Effect.16=\u0411\u044b\u0441\u0442\u0440\u043e\u0435 \u041f\u0438\u0442\u0430\u043d\u0438\u0435
Taming.Effect.17=\u0423 \u0432\u043e\u043b\u043a\u043e\u0432 \u0435\u0441\u0442\u044c \u0448\u0430\u043d\u0441 \u0432\u044b\u043b\u0435\u0447\u0438\u0442\u044c\u0441\u044f \u043f\u0440\u0438 \u0430\u0442\u0430\u043a\u0435
Taming.Effect.18=\u0421\u0432\u044f\u0442\u043e\u0439 \u041f\u0435\u0441
Taming.Effect.19=\u0418\u0437\u043b\u0435\u0447\u0435\u043d\u043d\u044b\u0439 \u0432\u043e\u043b\u0448\u0435\u0431\u0441\u0442\u0432\u043e\u043c & \u044f\u0434\u043e\u043c
Taming.Effect.2=\u041f\u0440\u043e\u043d\u0437\u0430\u043d\u0438\u0435 \u041a\u043b\u044b\u043a\u0430\u043c\u0438
Taming.Effect.3=\u041a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0423\u0434\u0430\u0440, \u0438\u0437-\u0437\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u041a\u0440\u043e\u0432\u043e\u0442\u0435\u0447\u0435\u043d\u0438\u0435
Taming.Effect.4=\u041e\u0441\u0442\u0440\u044b\u0435 \u041a\u043e\u0433\u0442\u0438
@@ -272,7 +278,7 @@ Taming.Listener=\u0423\u043a\u0440\u043e\u0449\u0435\u043d\u0438\u0435:
Taming.SkillName=\u0423\u041a\u0420\u041e\u0429\u0415\u041d\u0418\u0415
Taming.Skillup=[[YELLOW]]\u0423\u0440\u043e\u0432\u0435\u043d\u044c \u043d\u0430\u0432\u044b\u043a\u0430 \"\u0423\u043a\u0440\u043e\u0449\u0435\u043d\u0438\u0435\" \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d \u043d\u0430 {0}. \u0412\u0441\u0435\u0433\u043e ({1})
Taming.Summon.Complete=[[GREEN]]\u0412\u044b\u0437\u043e\u0432 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d
Taming.Summon.Fail.Ocelot=[[RED]]\u0412\u043e\u043a\u0440\u0443\u0433 \u0412\u0430\u0441 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u043e\u0446\u0435\u043b\u043e\u0442\u043e\u0432.
Taming.Summon.Fail.Ocelot=[[RED]]\u0412\u043e\u043a\u0440\u0443\u0433 \u0412\u0430\u0441 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u043e\u0446\u0435\u043b\u043e\u0442\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u0437\u0432\u0430\u0442\u044c \u0435\u0449\u0435.
Taming.Summon.Fail.Wolf=[[RED]]\u0412\u043e\u043a\u0440\u0443\u0433 \u0412\u0430\u0441 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u0432\u043e\u043b\u043a\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u0437\u0432\u0430\u0442\u044c \u0435\u0449\u0435.
Unarmed.Ability.Berserk.Length=[[RED]]\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0443\u043c\u0435\u043d\u0438\u044f \"\u0411\u0435\u0440\u0441\u0435\u0440\u043a\": [[YELLOW]]{0}\u0441.
Unarmed.Ability.Bonus.0=\u0421\u0442\u0438\u043b\u044c \"\u0416\u0435\u043b\u0435\u0437\u043d\u044b\u0439 \u041a\u0443\u043b\u0430\u043a\"
@@ -298,7 +304,7 @@ Unarmed.Listener=\u0411\u0435\u0437\u043e\u0440\u0443\u0436\u043d\u044b\u0439:
Unarmed.SkillName=\u0411\u0415\u0417\u041e\u0420\u0423\u0416\u041d\u042b\u0419
Unarmed.Skills.Berserk.Off=[[RED]]**\u0423\u043c\u0435\u043d\u0438\u0435 \"\u0411\u0435\u0440\u0441\u0435\u0440\u043a\" \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u043b\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435**
Unarmed.Skills.Berserk.On=[[GREEN]]**\u0423\u043c\u0435\u043d\u0438\u0435 \"\u0411\u0435\u0440\u0441\u0435\u0440\u043a\" \u0410\u041a\u0422\u0418\u0412\u0418\u0420\u041e\u0412\u0410\u041d\u041e**
Unarmed.Skills.Berserk.Other.Off=[[GREEN]]\u0423\u043c\u0435\u043d\u0438\u0435 \"[[RED]]\u0411\u0435\u0440\u0441\u0435\u0440\u043a[[GREEN]]\" \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u043b\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0443 [[YELLOW]]{0}
Unarmed.Skills.Berserk.Other.Off=[[RED]]\u0423\u043c\u0435\u043d\u0438\u0435 \"\u0411\u0435\u0440\u0441\u0435\u0440\u043a\"[[GREEN]] \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u043b\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0443 [[YELLOW]]{0}
Unarmed.Skills.Berserk.Other.On=[[GREEN]]{0}[[DARK_GREEN]] \u0432\u043a\u043b\u044e\u0447\u0438\u043b [[RED]]\u0443\u043c\u0435\u043d\u0438\u0435 \"\u0411\u0435\u0440\u0441\u0435\u0440\u043a\"!
Unarmed.Skills.Berserk.Refresh=[[GREEN]]\u0412\u0430\u0448\u0435 \u0443\u043c\u0435\u043d\u0438\u0435 [[YELLOW]]\"\u0411\u0435\u0440\u0441\u0435\u0440\u043a\" [[GREEN]]\u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e!
Unarmed.Skillup=[[YELLOW]]\u0423\u0440\u043e\u0432\u0435\u043d\u044c \u043d\u0430\u0432\u044b\u043a\u0430 \"\u0411\u0435\u0437\u043e\u0440\u0443\u0436\u043d\u044b\u0439\" \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d \u043d\u0430 {0}. \u0412\u0441\u0435\u0433\u043e ({1})
@@ -318,7 +324,7 @@ Woodcutting.SkillName=\u041b\u0415\u0421\u041e\u0420\u0423\u0411\u0421\u0422\u04
Woodcutting.Skills.TreeFeller.Off=[RED]]**\u0423\u043c\u0435\u043d\u0438\u0435 \"\u041b\u0435\u0441\u043e\u0440\u0443\u0431\" \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u043b\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435**
Woodcutting.Skills.TreeFeller.On=[[GREEN]]**\u0423\u043c\u0435\u043d\u0438\u0435 \"\u041b\u0435\u0441\u043e\u0440\u0443\u0431\" \u0410\u041a\u0422\u0418\u0412\u0418\u0420\u041e\u0412\u0410\u041d\u041e**
Woodcutting.Skills.TreeFeller.Refresh=[[GREEN]]\u0412\u0430\u0448\u0435 \u0443\u043c\u0435\u043d\u0438\u0435 [[YELLOW]]\"\u041b\u0435\u0441\u043e\u0440\u0443\u0431\" [[GREEN]]\u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e!
Woodcutting.Skills.TreeFeller.Other.Off=[[GREEN]]\u0423\u043c\u0435\u043d\u0438\u0435 \"[[RED]]\u041b\u0435\u0441\u043e\u0440\u0443\u0431[[GREEN]]\" \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u043b\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0443 [[YELLOW]]{0}
Woodcutting.Skills.TreeFeller.Other.Off=[[RED]]\u0423\u043c\u0435\u043d\u0438\u0435 \"\u041b\u0435\u0441\u043e\u0440\u0443\u0431\"[[GREEN]] \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u043b\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0443 [[YELLOW]]{0}
Woodcutting.Skills.TreeFeller.Other.On=[[GREEN]]{0}[[DARK_GREEN]] \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0443\u043c\u0435\u043d\u0438\u0435 [[RED]]\"\u041b\u0435\u0441\u043e\u0440\u0443\u0431\"!
Woodcutting.Skills.TreeFeller.Splinter=[[RED]]\u0412\u0410\u0428 \u0422\u041e\u041f\u041e\u0420 \u0420\u0410\u0421\u041a\u041e\u041b\u041e\u041b\u0421\u042f \u041d\u0410 \u0414\u0415\u0421\u042f\u0422\u041a\u0418 \u041a\u0423\u0421\u041a\u041e\u0412!
Woodcutting.Skills.TreeFellerThreshold=[[RED]]\u042d\u0442\u043e \u0434\u0435\u0440\u0435\u0432\u043e \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0434\u043b\u0438\u043d\u043d\u043e\u0435!
@@ -330,7 +336,9 @@ Combat.ArrowDeflect=[[WHITE]]**\u0421\u0422\u0420\u0415\u041b\u0410 \u041e\u0422
Combat.BeastLore=[[GREEN]]**\u0423\u043c\u0435\u043d\u0438\u0435 \"\u0423\u0434\u0430\u0440 \u0432\u043e\u043b\u043a\u0430\" \u0410\u041a\u0422\u0418\u0412\u0418\u0420\u041e\u0412\u0410\u041d\u041e**
Combat.BeastLoreHealth=[[DARK_AQUA]]\u0417\u0434\u043e\u0440\u043e\u0432\u044c\u0435 ([[GREEN]]{0}[[DARK_AQUA]]/{1})
Combat.BeastLoreOwner=[[DARK_AQUA]]\u0412\u043b\u0430\u0434\u0435\u043b\u0435\u0446 ([[RED]]{0}[[DARK_AQUA]])
Combat.BurningArrowHit=[[DARK_RED]]\u0412\u044b \u0431\u044b\u043b\u0438 \u043f\u043e\u0440\u0430\u0436\u0435\u043d\u044b \u0433\u043e\u0440\u044f\u0449\u0435\u0439 \u0441\u0442\u0440\u0435\u043b\u043e\u0439!
Combat.Gore=[[GREEN]]**\u041f\u0420\u041e\u041d\u0417\u0410\u041d\u0418\u0415 \u041a\u041b\u042b\u041a\u0410\u041c\u0418**
Combat.Ignition=[[RED]]**\u0412\u041e\u0421\u041f\u041b\u0410\u041c\u0415\u041d\u0415\u041d\u0418\u0415**
Combat.StruckByGore=[[RED]]**\u0412\u0410\u0421 \u041f\u0420\u041e\u041d\u0417\u0418\u041b\u0418 \u041a\u041b\u042b\u041a\u0410\u041c\u0418**
Combat.TargetDazed=\u0412\u0430\u0448\u0430 \u0446\u0435\u043b\u044c [[DARK_RED]]\u0428\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0430
Combat.TouchedFuzzy=[[DARK_RED]]\u0412\u044b \u0438\u0441\u0442\u0435\u043a\u0430\u0435\u0442\u0435 \u043a\u0440\u043e\u0432\u044c\u044e. \u041a\u0440\u0443\u0436\u0438\u0442\u0441\u044f \u0433\u043e\u043b\u043e\u0432\u0430.
@@ -349,15 +357,15 @@ Commands.AdminToggle=[[RED]]- \u0412\u043a\u043b./\u043e\u0442\u043a\u043b. \u04
Commands.Chat.Console=*\u041a\u043e\u043d\u0441\u043e\u043b\u044c*
Commands.Disabled=[[RED]]\u042d\u0442\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0430.
Commands.DoesNotExist=[[RED]]\u0418\u0433\u0440\u043e\u043a\u0430 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445!
Commands.GodMode.Disabled=[[YELLOW]]\u0420\u0435\u0436\u0438\u043c-\u0431\u043e\u0433\u0430 mcMMO \u041e\u0442\u043a\u043b\u044e\u0447\u0435\u043d
Commands.GodMode.Enabled=[[YELLOW]]\u0420\u0435\u0436\u0438\u043c-\u0431\u043e\u0433\u0430 mcMMO \u0412\u043a\u043b\u044e\u0447\u0435\u043d
Commands.GodMode.Disabled=[[YELLOW]]\u0420\u0435\u0436\u0438\u043c \u0411\u043e\u0433\u0430 mcMMO \u041e\u0442\u043a\u043b\u044e\u0447\u0435\u043d
Commands.GodMode.Enabled=[[YELLOW]]\u0420\u0435\u0436\u0438\u043c \u0411\u043e\u0433\u0430 mcMMO \u0412\u043a\u043b\u044e\u0447\u0435\u043d
Commands.GodMode.Forbidden=[mcMMO] \u0420\u0435\u0436\u0438\u043c \u0411\u043e\u0433\u0430 \u043d\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d \u0432 \u044d\u0442\u043e\u043c \u043c\u0438\u0440\u0435 (\u0421\u043c\u043e\u0442\u0440\u0438 Permissions)
Commands.Inspect=<player> [[RED]]- \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0438\u0433\u0440\u043e\u043a\u0435
Commands.Invite.Accepted=[[GREEN]]\u041f\u0440\u0438\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u043d\u044f\u0442\u043e. \u0412\u044b \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0435\u043d\u0438\u043b\u0438\u0441\u044c \u043a \u0433\u0440\u0443\u043f\u0435 {0}
Commands.Invite.Success=[[GREEN]]\u041f\u0440\u0438\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e.
Commands.Leaderboards=<skill> <page> [[RED]]- \u0421\u043f\u0438\u0441\u043a\u0438 \u041b\u0438\u0434\u0435\u0440\u043e\u0432
Commands.mcc.Header=[[RED]]---[][[YELLOW]]\u041a\u043e\u043c\u0430\u043d\u0434\u044b mcMMO[[RED]][]---
Commands.mcgod=[[RED]]- \u0412\u043a\u043b./\u043e\u0442\u043a\u043b. \u0440\u0435\u0436\u0438\u043c-\u0431\u043e\u0433\u0430 mcMMO
Commands.mcgod=[[RED]]- \u0412\u043a\u043b./\u043e\u0442\u043a\u043b. \u0420\u0435\u0436\u0438\u043c \u0411\u043e\u0433\u0430
Commands.mchud.Invalid=[[RED]]\u042d\u0442\u043e \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u0442\u0438\u043f \u041f\u0430\u043d\u0435\u043b\u0438 \u0412\u0430\u0436\u043d\u043e\u0439 \u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438.
Commands.mcpurge.Success=[[GREEN]]\u0411\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0431\u044b\u043b\u0430 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0430!
Commands.mcrank.Heading=[[GOLD]]-=\u041f\u0415\u0420\u0421\u041e\u041d\u0410\u041b\u042c\u041d\u042b\u0415 \u0420\u0410\u041d\u0413\u0418=-
@@ -369,15 +377,12 @@ Commands.mcrefresh.Success=[[RED]]{0} \u043e\u0447\u043a\u043e\u0432 \u0443\u043
Commands.mcremove.Success=[[GREEN]]{0} \u0431\u044b\u043b \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0443\u0434\u0430\u043b\u0435\u043d \u0438\u0437 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445!
Commands.mctop.Tip=[[GOLD]]\u041f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430: \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 [[RED]]/mcrank[[GOLD]] \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432\u0441\u0435 \u0432\u0430\u0448\u0438 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0440\u0430\u043d\u0433\u0438!
Commands.mmoedit=[player] <skill> <newvalue> [[RED]] - \u041c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0438 \u0446\u0435\u043b\u0438
Commands.mmoedit.AllSkills.1=[[GREEN]]\u0412\u0430\u0448 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0432\u043e \u0432\u0441\u0435\u0445 \u043d\u0430\u0432\u044b\u043a\u0430\u0445 \u0431\u044b\u043b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u043d\u0430 {0}!
Commands.mmoedit.Modified.1=[[GREEN]]\u0412\u0430\u0448 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0432 {0} \u0431\u044b\u043b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u043d\u0430 {1}!
Commands.mmoedit.Modified.2=[[RED]]{0} \u0431\u044b\u043b\u043e \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u0434\u043b\u044f {1}.
Commands.mmoupdate.Start=[[GRAY]]\u041d\u0430\u0447\u0430\u043b\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f...
Commands.mmoupdate.Finish=[[GREEN]]\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043e!
Commands.ModDescription=[[RED]]- \u041f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043a\u0440\u0430\u0442\u043a\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043c\u043e\u0434\u0430
Commands.NoConsole=\u042d\u0442\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0441 \u043a\u043e\u043d\u0441\u043e\u043b\u0438
Commands.Notifications.On=\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u043e [[GREEN]] \u043d\u0430
Commands.Offline=[RED]] \u042d\u0442\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u0430\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 \u0438\u0433\u0440\u043e\u043a\u043e\u0432.
Commands.Other=[[GREEN]]--\u0414\u0420\u0423\u0413\u0418\u0415 \u041a\u041e\u041c\u0410\u041d\u0414\u042b--
Commands.Party.Header=[[RED]]-----[][[GREEN]]\u0413\u0420\u0423\u041f\u041f\u0410[[RED]][]-----
Commands.Party.Status=[[DARK_GRAY]]\u041d\u0410\u0417\u0412\u0410\u041d\u0418\u0415: [[WHITE]]{0} {1}
@@ -428,29 +433,24 @@ Commands.SkillInfo=/<skill> [[RED]]- \u041f\u043e\u0441\u043c\u043e\u0442\u0440\
Commands.Stats.Self=\u0412\u0410\u0428\u0410 \u0421\u0422\u0410\u0422\u0418\u0421\u0422\u0418\u041a\u0410
Commands.Stats=[[RED]]- \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0412\u0430\u0448\u0443 mcMMO \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0443
Commands.ToggleAbility=[[RED]]- \u0412\u043a\u043b./\u043e\u0442\u043a\u043b. \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0443\u043c\u0435\u043d\u0438\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0440\u0430\u0432\u043e\u0439 \u043a\u043d\u043e\u043f\u043a\u0438 \u043c\u044b\u0448\u0438
Commands.Usage.0=[[RED]]\u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 /{0}
Commands.Usage.1=[[RED]]\u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 /{0} {1}
Commands.Usage.2=[[RED]]\u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 /{0} {1} {2}
Commands.Usage.3=[[RED]]\u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 /{0} {1} {2} {3}
Commands.Usage.Level=level
Commands.Usage.Message=message
Commands.Usage.Page=page
Commands.Usage.PartyName=\u0438\u043c\u044f
Commands.Usage.Password=password
Commands.Usage.Player=player
Commands.Usage.Rate=rate
Commands.Usage.Skill=skill
Commands.Usage.XP=xp
mcMMO.NoInvites=[[RED]]\u0421\u0435\u0439\u0447\u0430\u0441 \u0443 \u0412\u0430\u0441 \u043d\u0435\u0442 \u043f\u0440\u0438\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u0439
mcMMO.NoPermission=[[DARK_RED]]\u041d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u0430\u0432.
mcMMO.NoSkillNote=[[DARK_GRAY]]\u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u043d\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043d\u0430\u0432\u044b\u043a\u0443, \u0442\u043e \u043e\u043d \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0437\u0434\u0435\u0441\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0451\u043d.
mcMMO.NoSkillNote=[[DARK_GRAY]]\u0415\u0441\u043b\u0438 \u0443 \u0412\u0430\u0441 \u043d\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043d\u0430\u0432\u044b\u043a\u0443, \u0442\u043e \u043e\u043d \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u0434\u0435\u0441\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f.
Party.Forbidden=[mcMMO] \u0413\u0440\u0443\u043f\u043f\u044b \u043d\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u044b \u0432 \u044d\u0442\u043e\u043c \u043c\u0438\u0440\u0435 (\u0421\u043c\u043e\u0442\u0440\u0438 Permissions)
Party.Help.6=[[RED]] \u0427\u0442\u043e\u0431\u044b \u0432\u044b\u0433\u043d\u0430\u0442\u044c \u0438\u0433\u0440\u043e\u043a\u0430 \u0438\u0437 \u0432\u0430\u0448\u0435\u0439 \u043f\u0430\u0442\u0438, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 [[DARK_AQUA]] {0} <player>
Party.InformedOnJoin={0} [[GREEN]]\u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0435\u043d\u0438\u043b\u0441\u044f \u043a \u0432\u0430\u0448\u0435\u0439 \u0433\u0440\u0443\u043f\u043f\u0435
Party.InformedOnQuit={0} [[GREEN]]\u043f\u043e\u043a\u0438\u043d\u0443\u043b \u0432\u0430\u0448\u0443 \u0433\u0440\u0443\u043f\u043f\u0443
Party.InformedOnNameChange=[[GOLD]]{0} [[GREEN]]\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0433\u0440\u0443\u043f\u043f\u044b \u043d\u0430 [[WHITE]]{1}
Party.InvalidName=[[DARK_RED]]\u041d\u0435\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0433\u0440\u0443\u043f\u043f\u044b.
Party.Invite.Self=[[RED]]\u0412\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u0438\u0433\u043b\u0430\u0441\u0438\u0442\u044c \u0441\u0435\u0431\u044f!
Party.IsLocked=[[RED]]\u042d\u0442\u0430 \u0433\u0440\u0443\u043f\u043f\u0430 \u0443\u0436\u0435 \u0437\u0430\u043a\u0440\u044b\u0442\u0430!
Party.IsntLocked=[[RED]]\u042d\u0442\u0430 \u0433\u0440\u0443\u043f\u043f\u0430 \u043d\u0435 \u0437\u0430\u043a\u0440\u044b\u0442\u0430!
Party.Locked=[[RED]]\u0413\u0440\u0443\u043f\u043f\u0430 \u0437\u0430\u043f\u0430\u0440\u043e\u043b\u0435\u043d\u0430, \u0442\u043e\u043b\u044c\u043a\u043e \u043b\u0438\u0434\u0435\u0440 \u0433\u0440\u0443\u043f\u043f\u044b \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0433\u043b\u0430\u0448\u0430\u0442\u044c.
@@ -466,20 +466,18 @@ Party.Player.Invalid=[[RED]]\u042d\u0442\u043e \u043d\u0435\u0434\u0435\u0439\u0
Party.NotOnline=[[DARK_RED]]{0} \u043d\u0435 \u0432 \u043e\u043d\u043b\u0430\u0439\u043d\u0435!
Party.Player.InSameParty=[[RED]]{0} \u0443\u0436\u0435 \u0432 \u0432\u0430\u0448\u0435\u0439 \u0433\u0440\u0443\u043f\u043f\u0435!
Party.PlayerNotInParty=[[DARK_RED]]{0} \u043d\u0435 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432 \u0433\u0440\u0443\u043f\u043f\u0435
Party.Specify=[[RED]]\u0412\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0433\u0440\u0443\u043f\u043f\u0443.
Party.Teleport.Dead=[[RED]]\u0412\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0442\u0435\u043b\u0435\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u0441\u044f \u043a \u043c\u0435\u0440\u0442\u0432\u043e\u043c\u0443 \u0438\u0433\u0440\u043e\u043a\u0443.
Party.Teleport.Hurt=[[RED]]\u0417\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 {0} \u0441\u0435\u043a\u0443\u043d\u0434 \u0412\u044b \u0431\u044b\u043b\u0438 \u0440\u0430\u043d\u0435\u043d\u044b \u0438 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0442\u0435\u043b\u0435\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f.
Party.Teleport.Player=[[GREEN]]\u0412\u044b \u0442\u0435\u043b\u0435\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u043a {0}.
Party.Teleport.Self=[[RED]]\u0412\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0442\u0435\u043b\u0435\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043a \u0441\u0430\u043c\u043e\u043c\u0443 \u0441\u0435\u0431\u0435!
Party.Teleport.Target=[[GREEN]]{0} \u0442\u0435\u043b\u0435\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f \u043a \u0412\u0430\u043c.
Party.Teleport.Disabled=[[RED]]\u0422\u0435\u043b\u0435\u043f\u043e\u0440\u0442\u0430\u0446\u0438\u044f \u043a \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0430\u043c \u0433\u0440\u0443\u043f\u043f\u044b {0} \u0437\u0430\u043f\u0440\u0435\u0449\u0435\u043d\u0430
Party.Join.Self=[[RED]]\u0412\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c\u0441\u044f \u043a \u0441\u0435\u0431\u0435!
Party.Unlocked=[[GRAY]]\u0413\u0440\u0443\u043f\u043f\u0430 \u0440\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0430
Party.Disband=[[GRAY]\u0413\u0440\u0443\u043f\u043f\u0430 \u0431\u044b\u043b\u0430 \u0440\u0430\u0441\u043f\u0443\u0449\u0435\u043d\u0430
Party.Status.Locked=[[DARK_RED]](\u0422\u041e\u041b\u042c\u041a\u041e \u041f\u041e \u041f\u0420\u0418\u0413\u041b\u0410\u0428\u0415\u041d\u0418\u042e)
Party.Status.Unlocked=[[DARK_GREEN]](\u041e\u0422\u041a\u0420\u042b\u0422\u041e)
Party.ShareType.Exp=\u041e\u041f\u042b\u0422
Party.ShareType.Item=\u041f\u0420\u0415\u0414\u041c\u0415\u0422
Party.ShareMode.None=\u041d\u0418\u0427\u0415\u0413\u041e
Party.ShareMode.Equal=\u0420\u0410\u0412\u041d\u042b\u0419
Party.ShareMode.Random=\u0421\u041b\u0423\u0427\u0410\u0419\u041d\u041e
Commands.XPGain.Acrobatics=\u041f\u0440\u044b\u0433\u0430\u0439\u0442\u0435 \u0441 \u0432\u044b\u0441\u043e\u0442\u044b
@@ -556,7 +554,6 @@ Vampirism.Killer.Failure=[[GOLD]][mcMMO] [[YELLOW]]{0}[[GRAY]] \u0431\u044b\u043
Vampirism.Killer.Success=[[GOLD]][mcMMO] [[DARK_AQUA]]\u0412\u044b \u0443\u043a\u0440\u0430\u043b\u0438 [[BLUE]]{0}[[DARK_AQUA]] \u0443\u0440\u043e\u0432\u043d\u0435\u0439 \u0443 [[YELLOW]]{1}
Vampirism.Victim.Failure=[[GOLD]][mcMMO] [[YELLOW]]{0}[[GRAY]] \u0431\u044b\u043b \u043d\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u0435\u043d \u0443\u043a\u0440\u0430\u0441\u0442\u044c \u0432\u0430\u0448\u0438 \u0437\u043d\u0430\u043d\u0438\u044f!
Vampirism.Victim.Success=[[GOLD]][mcMMO] [[YELLOW]]{0}[[DARK_RED]] \u0443\u043a\u0440\u0430\u043b [[BLUE]]{1}[[DARK_RED]] \u0443\u0440\u043e\u0432\u043d\u0435\u0439 \u0443 \u0432\u0430\u0441!
Hardcore.Enabled=[[GOLD]][mcMMO] \u0425\u0430\u0440\u0434\u043a\u043e\u0440 \u043c\u043e\u0434 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u043d.
Spout.Donate=[[YELLOW]][mcMMO] \u041f\u043e\u0436\u0435\u0440\u0442\u0432\u043e\u0432\u0430\u043d\u043e!
Spout.LevelUp.1=[[GREEN]\u0423\u0440\u043e\u0432\u0435\u043d\u044c \u043f\u043e\u0432\u044b\u0448\u0435\u043d!
Spout.LevelUp.2=[[YELLOW]]{0}[[DARK_AQUA]] ([[GREEN]]{1}[[DARK_AQUA]])
@@ -591,23 +588,3 @@ Smelting.Effect.7=\u0428\u0430\u043d\u0441 \u0447\u0442\u043e \u0440\u0443\u0434
Smelting.FluxMining.Success=[[GREEN]]\u042d\u0442\u0430 \u0440\u0443\u0434\u0430 \u043f\u0435\u0440\u0435\u043f\u043b\u0430\u0432\u0438\u043b\u0430\u0441\u044c \u0441\u0430\u043c\u0430 \u0441\u043e\u0431\u043e\u0439!
Smelting.Listener=\u0412\u044b\u043f\u043b\u0430\u0432\u043a\u0430:
Smelting.SkillName=\u0412\u042b\u041f\u041b\u0410\u0412\u041a\u0410
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.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
Commands.Description.mcpurge=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0431\u0435\u0437 \u0443\u0440\u043e\u0432\u043d\u0435\u0439 mcMMO \u0438 \u0442\u0435\u0445, \u043a\u0442\u043e \u043d\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u043b\u0438\u0441\u044c \u0431\u043e\u043b\u044c\u0448\u0435 {0} \u043c\u0435\u0441\u044f\u0446\u0435\u0432 \u0438\u0437 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 mcMMO.
Commands.Description.mcrank=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c mcMMO \u0440\u0435\u0439\u0442\u0438\u043d\u0433 \u0438\u0433\u0440\u043e\u043a\u0430
Commands.Description.mcrefresh=\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u0441\u0435 \u043a\u0443\u043b\u0434\u0430\u0443\u043d\u044b \u0434\u043b\u044f mcMMO
Commands.Description.mcremove=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438\u0437 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 mcMMO
Commands.Description.mcstats=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0432\u0430\u0448\u0438 mcMMO \u0443\u0440\u043e\u0432\u043d\u0438 \u0438 \u043e\u043f\u044b\u0442
Commands.Description.mctop=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u043b\u0438\u0434\u0435\u0440\u043e\u0432 mcMMO
Commands.Description.mmoedit=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c mcMMO \u0443\u0440\u043e\u0432\u043d\u044f \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439
Commands.Description.mmoupdate=\u041a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 mcMMO \u0438\u0437 Flatfile \u0432 MySQL
Commands.Description.party=\u0423\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438 \u043f\u0430\u0442\u0438 mcMMO
Commands.Description.Skill=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043d\u0430\u0432\u044b\u043a\u0430\u0445 mcMMO \u0434\u043b\u044f {0}
Commands.Description.skillreset=\u0421\u0431\u0440\u043e\u0441 mcMMO \u0443\u0440\u043e\u0432\u043d\u044f \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439
Commands.Description.vampirism=\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 mcMMO \u043a\u0440\u043e\u0432\u043e\u0436\u0430\u0434\u043d\u043e\u0441\u0442\u0438 \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u0435\u043b\u044f \u0440\u0435\u0436\u0438\u043c\u0430 \u043a\u0440\u043e\u0432\u043e\u0436\u0430\u0434\u043d\u043e\u0441\u0442\u0438 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c/\u0432\u044b\u043a\u043b\u044e\u0447\u0438\u0442\u044c
UpdateChecker.outdated=\u0412\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e mcMMO!
UpdateChecker.newavailable=\u0415\u0441\u0442\u044c \u043d\u043e\u0432\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430\u044f \u043d\u0430 BukkitDev.

View File

@@ -32,6 +32,7 @@ Axes.Ability.Bonus.4=\u5f3a\u70c8\u51b2\u51fb
Axes.Ability.Bonus.5=\u5bf9\u65e0\u62a4\u7532\u654c\u4eba\u9020\u6210 {0} \u70b9\u989d\u5916\u4f24\u5bb3
Axes.Ability.Lower=[[GRAY]]**\u4f60\u6536\u8d77\u4e86\u4f60\u7684\u65a7\u5934**
Axes.Ability.Ready=[[GREEN]]**\u4f60\u63e1\u7d27\u4e86\u4f60\u7684\u65a7\u5934**
Axes.Combat.Cleave.Proc=[[DARK_RED]]\u53d7\u5230\u5288\u88c2\u6253\u51fb!
Axes.Combat.CritStruck=[[DARK_RED]]\u4f60\u6253\u51fa\u4e86\u66b4\u51fb!
Axes.Combat.CritChance=[[RED]]\u66b4\u51fb\u51e0\u7387: [[YELLOW]]{0}%
Axes.Combat.CriticalHit=[[RED]]\u66b4\u51fb!
@@ -141,6 +142,14 @@ Mining.Skills.SuperBreaker.Other.On=[[GREEN]]{0}[[DARK_GREEN]] \u4f7f\u7528\u4e8
Mining.Skills.SuperBreaker.Refresh=[[GREEN]]\u4f60\u7684 [[YELLOW]]\u8d85\u7ea7\u77ff\u5de5 [[GREEN]]\u6280\u80fd\u5df2\u7ecf\u53ef\u4ee5\u518d\u6b21\u4f7f\u7528\u4e86\uff01
Mining.Skillup=[[YELLOW]]\u6316\u77ff\u6280\u80fd\u4e0a\u5347\u4e86 {0}. \u603b\u7b49\u7ea7 ({1})
Mining.Blast.Boom=[[GRAY]]**\u5623**
Mining.Blast.Effect.0=+35% \u77ff\u77f3\u4ea7\u91cf
Mining.Blast.Effect.1=+40% \u77ff\u77f3\u4ea7\u91cf
Mining.Blast.Effect.2=+45% \u77ff\u77f3\u4ea7\u91cf, \u65e0\u788e\u7247
Mining.Blast.Effect.3= +50% \u77ff\u7269\u4ea7\u7387, \u65e0\u788e\u7247
Mining.Blast.Effect.4=+55% \u77ff\u7269\u4ea7\u7387, \u65e0\u788e\u7247, \u4e09\u500d\u6389\u843d
Mining.Blast.Effect.5=+60% \u77ff\u7269\u4ea7\u7387, \u65e0\u788e\u7247, \u4e09\u500d\u6389\u843d
Mining.Blast.Effect.6=+65% \u77ff\u7269\u4ea7\u7387, \u65e0\u788e\u7247, \u4e09\u500d\u6389\u843d
Mining.Blast.Effect.7=+70% \u77ff\u77f3\u4ea7\u91cf,\u65e0\u788e\u7247,3\u500d\u6389\u843d
Mining.Blast.Radius.Increase=[[RED]]\u7206\u70b8\u534a\u5f84\u63d0\u5347: [[YELLOW]]+{0}
Mining.Blast.Rank=[[RED]]\u7206\u7834\u5f00\u91c7: [[YELLOW]] \u6392\u540d {0}/8 [[GRAY]]({1})
Mining.Blast.Other.On=Mining.Blast.Other.On=[[GREEN]]{0}[[DARK_GREEN]] \u4f7f\u7528\u4e86 [[RED]]\u7206\u7834\u5f00\u91c7!
@@ -301,7 +310,9 @@ Combat.ArrowDeflect=[[WHITE]]**\u7bad\u77e2\u504f\u5411**
Combat.BeastLore=[[GREEN]]**\u9a6f\u517d\u77e5\u8bc6**
Combat.BeastLoreHealth=[[DARK_AQUA]]\u751f\u547d\u503c ([[GREEN]]{0}[[DARK_AQUA]]/{1})
Combat.BeastLoreOwner=[[DARK_AQUA]]\u62e5\u6709\u8005 ([[RED]]{0}[[DARK_AQUA]])
Combat.BurningArrowHit=[[DARK_RED]]\u4f60\u88ab\u4e00\u652f\u706b\u7bad\u51fb\u4e2d\u4e86!
Combat.Gore=[[GREEN]]**\u6d41\u8840**
Combat.Ignition=[[RED]]**\u70b9\u71c3**
Combat.StruckByGore=[[RED]]**\u4f60\u5f00\u59cb\u6d41\u8840\u4e86**
Combat.TargetDazed=\u76ee\u6807\u88ab [[DARK_RED]]\u88ab\u51fb\u6655
Combat.TouchedFuzzy=[[DARK_RED]]\u5934\u6655\u76ee\u7729
@@ -377,6 +388,7 @@ Party.Owner.NotLeader=[[DARK_RED]]\u4f60\u5df2\u7ecf\u4e0d\u518d\u662f\u6d3e\u7c
Party.Password.Set=[[GREEN]]\u961f\u4f0d\u5bc6\u7801\u8bbe\u7f6e\u4e3a {0}
Party.Player.Invalid=[[RED]]\u8fd9\u4e0d\u662f\u4e00\u540d\u6709\u6548\u7684\u73a9\u5bb6
Party.Teleport.Dead=[[RED]]\u4f60\u4e0d\u80fd\u4f20\u9001\u5230\u6b7b\u4ea1\u7684\u73a9\u5bb6\u8eab\u8fb9
Party.Teleport.Hurt=[[RED]]\u4f60\u5df2\u7ecf\u5728 {0} \u79d2\u524d\u53d7\u4f24\u5e76\u4e14\u65e0\u6cd5\u4f20\u9001.
Party.Teleport.Player=[[GREEN]]\u4f60\u5df2\u7ecf\u4f20\u9001\u5230 {0}.
Party.Teleport.Self=[[RED]]\u4f60\u4e0d\u80fd\u4f20\u9001\u5230\u4f60\u81ea\u5df1\u90a3\u91cc!
Party.Teleport.Target=[[GREEN]]{0} \u5df2\u7ecf\u4f20\u9001\u5230\u4f60\u8eab\u8fb9.
@@ -437,6 +449,3 @@ Perks.cooldowns.name=\u5feb\u901f\u6062\u590d
Perks.cooldowns.desc=\u51cf\u5c11\u51b7\u5374\u65f6\u95f4 {0}.
Perks.activationtime.name=\u8010\u529b
Perks.activationtime.desc=\u63d0\u9ad8\u80fd\u529b\uff0c\u6fc0\u6d3b\u65f6\u95f4 {0} \u79d2.
Hardcore.Enabled=[[GOLD]][mcMMO] \u542f\u7528\u786c\u6838\u6a21\u5f0f
UpdateChecker.outdated=\u4f60\u6b63\u4f7f\u7528\u7740\u4e00\u4e2a\u8fc7\u65f6\u7248\u672c\u7684mcMMO!
UpdateChecker.newavailable=\u53d1\u73b0BukkitDev\u4e0a\u6709\u53ef\u7528\u65b0\u7248\u672c.

View File

@@ -32,6 +32,7 @@ Axes.Ability.Bonus.4=\u5f37\u529b\u5c04\u64ca
Axes.Ability.Bonus.5=\u5c0d\u7121\u88dd\u7532\u6575\u4eba\u984d\u5916\u9020\u6210 {0} \u50b7\u5bb3
Axes.Ability.Lower=[[GRAY]]**\u4f60\u653e\u4e0b\u4e86\u4f60\u7684\u65a7\u982d**
Axes.Ability.Ready=[[GREEN]]**\u4f60\u63e1\u7dca\u4e86\u4f60\u7684\u65a7\u982d**
Axes.Combat.Cleave.Proc=[[DARK_RED]]\u53d7\u5230\u5f37\u70c8\u6253\u64ca!
Axes.Combat.CritStruck=[[DARK_RED]]\u4f60\u6253\u51fa\u4e86\u6703\u5fc3\u4e00\u64ca!
Axes.Combat.CritChance=[[RED]]\u66b4\u64ca\u6a5f\u7387: [[YELLOW]]{0}%
Axes.Combat.CriticalHit=[[RED]]\u6703\u5fc3\u4e00\u64ca!
@@ -124,7 +125,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**\n\n
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
@@ -146,6 +147,14 @@ Mining.Skills.SuperBreaker.Other.On=[[GREEN]]{0}[[DARK_GREEN]] \u4f7f\u7528\u4e8
Mining.Skills.SuperBreaker.Refresh=[[GREEN]]\u4f60\u7684 [[YELLOW]]\u8d85\u7d1a\u5de5\u4eba [[GREEN]]\u6280\u80fd\u5df2\u7d93\u53ef\u4ee5\u518d\u6b21\u4f7f\u7528\u4e86\uff01
Mining.Skillup=[[YELLOW]]\u6316\u7926\u6280\u80fd\u4e0a\u5347\u4e86 {0}! \u7e3d\u7b49\u7d1a ({1})!
Mining.Blast.Boom=[[GRAY]]**BOOM!**
Mining.Blast.Effect.0=+35% \u7926\u7269\u7522\u91cf
Mining.Blast.Effect.1=+40% \u7926\u7269\u7522\u91cf
Mining.Blast.Effect.2=+45% \u7926\u7269\u7522\u91cf, \u7121\u788e\u7247
Mining.Blast.Effect.3=+50% \u7926\u7269\u7522\u91cf, \u7121\u788e\u7247
Mining.Blast.Effect.4=+55% \u7926\u7269\u7522\u91cf, \u7121\u788e\u7247,2\u500d\u6389\u843d
Mining.Blast.Effect.5=+60% \u7926\u7269\u7522\u91cf, \u7121\u788e\u7247,2\u500d\u6389\u843d
Mining.Blast.Effect.6=+65% \u7926\u7269\u7522\u91cf, \u7121\u788e\u7247,3\u500d\u6389\u843d
Mining.Blast.Effect.7=+70% \u7926\u7269\u7522\u91cf, \u7121\u788e\u7247,3\u500d\u6389\u843d
Mining.Blast.Radius.Increase=[[RED]]\u7206\u70b8\u534a\u5f91\u63d0\u5347: [[YELLOW]]+{0}
Mining.Blast.Rank=[[RED]]\u6316\u7926\u7206\u767c: [[YELLOW]] \u6392\u540d {0}/8 [[GRAY]]({1})
Mining.Blast.Other.On=[[GREEN]]{0}[[DARK_GREEN]] \u4f7f\u7528\u4e86 [[RED]]\u6316\u7926\u7206\u767c!
@@ -229,7 +238,6 @@ Taming.Ability.Bonus.6=\u5229\u722a
Taming.Ability.Bonus.7=+{0} \u50b7\u5bb3
Taming.Ability.Bonus.8=\u5feb\u9910\u670d\u52d9
Taming.Ability.Bonus.9={0} \u4e00\u5b9a\u6a5f\u7387\u5728\u653b\u64ca\u6642\u6062\u5fa9\u8840\u91cf
Taming.Ability.Bonus.11=\u88ab\u6709\u5bb3\u7684\u9b54\u6cd5\u50b7\u5bb3\u6216\u4e2d\u6bd2\u6642\uff0c\u6062\u5fa9\u5065\u5eb7
Taming.Ability.Locked.0=\u9396\u5b9a \u76f4\u5230 {0}+ \u6280\u80fd (\u8fc5\u9748\u654f\u6377)
Taming.Ability.Locked.1=\u9396\u5b9a \u76f4\u5230 {0}+ \u6280\u80fd (\u539a\u5be6\u7684\u76ae\u6bdb)
Taming.Ability.Locked.2=\u9396\u5b9a \u76f4\u5230 {0}+ \u6280\u80fd (\u885d\u64ca\u683c\u64cb)
@@ -276,7 +284,6 @@ Unarmed.Effect.4=\u9435\u8155\u5927\u5e2b
Unarmed.Effect.5=\u4f7f\u4f60\u7684\u88dd\u7532\u96a8\u6642\u9593\u589e\u52a0\u800c\u589e\u5f37
Unarmed.Effect.6=\u5f13\u7bad\u504f\u5411
Unarmed.Effect.7=\u8b93\u5f13\u7bad\u504f\u5411
Unarmed.Effect.9=\u9632\u6b62\u4f60\u88ab\u596a\u53d6\u6b66\u5668
Unarmed.Listener=\u5c1a\u672a\u88dd\u5099:
Unarmed.SkillName=\u5c1a\u672a\u88dd\u5099
Unarmed.Skills.Berserk.Off=[[RED]]**\u72c2\u66b4\u6280\u80fd\u5df2\u7ed3\u675f**
@@ -313,7 +320,9 @@ Combat.ArrowDeflect=[[WHITE]]**\u5f13\u7bad\u504f\u5411**
Combat.BeastLore=[[GREEN]]**\u8a13\u7378\u4e4b\u80fd**
Combat.BeastLoreHealth=[[DARK_AQUA]]\u751f\u547d\u503c ([[GREEN]]{0}[[DARK_AQUA]]/{1})
Combat.BeastLoreOwner=[[DARK_AQUA]]\u64c1\u6709\u8005 ([[RED]]{0}[[DARK_AQUA]])
Combat.BurningArrowHit=[[DARK_RED]]\u4f60\u88ab\u4e00\u652f\u706b\u7bad\u64ca\u4e2d\u4e86!
Combat.Gore=[[GREEN]]**\u6d41\u8840**
Combat.Ignition=[[RED]]**\u9ede\u71c3**
Combat.StruckByGore=[[RED]]**\u4f60\u958b\u59cb\u6d41\u8840\u4e86**
Combat.TargetDazed=\u76ee\u6a19\u5df2\u88ab [[DARK_RED]] \u64ca\u6688
Combat.TouchedFuzzy=[[DARK_RED]]\u982d\u6688\u76ee\u7729...
@@ -351,23 +360,18 @@ Commands.mcrank.Unranked=[[WHITE]]\u6392\u884c\u699c\u5916
Commands.mcrefresh.Success=[[RED]]{0} \u79d2\u5f8c\u51b7\u537b\u6642\u9593\u5b8c\u7562.
Commands.mcremove.Success=[[GREEN]]{0} \u5df2\u6210\u529f\u5f9e\u6578\u64da\u88e1\u79fb\u9664!
Commands.mmoedit=[player] <skill> <newvalue> [[RED]] - \u7de8\u8f2f\u76ee\u6a19
Commands.mmoedit.AllSkills.1=[\u7da0\u8272]\u60a8\u6240\u6709\u7684\u6280\u80fd\u7b49\u7d1a\u88ab\u8a2d\u5b9a\u70ba{0}\uff01
Commands.mmoedit.Modified.1=[[GREEN]]\u4f60\u7684 {0} \u7b49\u7d1a\u88ab\u8a2d\u5b9a\u70ba {1}!
Commands.mmoedit.Modified.2=[[RED]]{0} \u56e0\u70ba {1} \u800c\u4fee\u6539.
Commands.mmoupdate.Start=[[GRAY]]\u78ba\u8a8d\u7248\u672c\u4e2d...
Commands.mmoupdate.Finish=[[GREEN]]\u8b80\u53d6\u7248\u672c\u5b8c\u7562!
Commands.ModDescription=[[RED]]- \u8acb\u95b1\u8b80\u63d2\u4ef6\u63cf\u8ff0
Commands.NoConsole=\u9019\u500b\u6307\u4ee4\u4e0d\u53ef\u4f7f\u7528
Commands.Notifications.Off=<FONT> <FONT> [\u7da0\u8272]\u5207\u63db\u80fd\u529b\u7684\u901a\u77e5</ FONT> </ FONT>
Commands.Notifications.On=<FONT> <FONT> [\u7da0\u8272]\u5207\u63db\u80fd\u529b\u7684\u901a\u77e5</ FONT> </ FONT>
Commands.Offline=[RED]]\u6b64\u547d\u4ee4\u4e26\u4e0d\u9069\u7528\u65bc\u96e2\u7dda\u73a9\u5bb6\u3002
Commands.Other=[[GREEN]]--\u5176\u4ed6\u6307\u4ee4--
Commands.Party.Header=[[RED]]-----[][[GREEN]]\u968a\u4f0d[[RED]][]-----
Commands.Party.Status=[[DARK_GRAY]]\u540d\u5b57: [[WHITE]]{0} {1}
Commands.Party.ShareMode=[[DARK_GRAY]]\u5206\u4eab\u6a21\u5f0f:
Commands.Party.ItemShare=[[GRAY]]\u7269\u54c1 [[DARK_AQUA]]({0})
Commands.Party.ExpShare=[[GRAY]]\u7d93\u9a57\u503c [[DARK_AQUA]]({0})
Commands.Party.ItemShareCategories=[[DARK_GRAY]]\u5171\u4eab\u9805\u76ee: [[GRAY]][[ITALIC]]{0}
Commands.Party.MembersNear=[[DARK_GRAY]]\u63a5\u8fd1\u4f60 [[DARK_AQUA]]{0}[[DARK_GRAY]]/[[DARK_AQUA]]{1}
Commands.Party.Accept=[[RED]]- \u63a5\u53d7\u968a\u4f0d\u9080\u8acb
Commands.Party.Chat.Off=\u968a\u4f0d\u804a\u5929\u6a21\u5f0f[[RED]]\u53d6\u6d88
@@ -383,7 +387,6 @@ Commands.Party.Rename=[[GRAY]]\u968a\u4f0d\u540d\u7a31\u5df2\u66f4\u6539\u70ba:
Commands.Party.SetSharing=[[GRAY]]\u968a\u4f0d {0} \u5206\u4eab\u8a2d\u5b9a\u70ba: [[DARK_AQUA]]{1}
Commands.Party.Kick=[[RED]]\u4f60\u5df2\u88ab {0} \u8e22\u51fa!
Commands.Party.Leave=[[RED]]\u4f60\u96e2\u958b\u4e86\u9019\u652f\u968a\u4f0d
Commands.Party.Members.Header=[RED]] ----- [] [GREEN]\u6703\u54e1[RED] [] -----
Commands.Party.Members={0}
Commands.Party.None=[[RED]]\u4f60\u4e0d\u5728\u968a\u4f0d\u4e2d.
Commands.Party.Quit=[[RED]]- \u96e2\u958b\u4f60\u73fe\u5728\u7684\u968a\u4f0d
@@ -394,7 +397,6 @@ Commands.Party2=[[RED]]- \u52a0\u5165\u73a9\u5bb6\u7684\u968a\u4f0d\u88e1
Commands.ptp.Enabled=\u968a\u4f0d\u50b3\u9001 [[GREEN]]\u5141\u8a31
Commands.ptp.Disabled=\u968a\u4f0d\u50b3\u9001 [[RED]]\u4e0d\u5141\u8a31
Commands.ptp.NoRequests=[[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.RequestExpired=[[RED]]\u968a\u4f0d\u50b3\u9001\u5df2\u6210\u529f!
Commands.PowerLevel.Leaderboard=[[YELLOW]]--mcMMO[[BLUE]] \u80fd\u529b\u7b49\u7d1a [[YELLOW]]\u6392\u884c\u699c--
@@ -409,14 +411,12 @@ Commands.SkillInfo=/<skill> [[RED]]- \u67e5\u770b\u6280\u80fd\u7684\u8a73\u7ec6\
Commands.Stats.Self=\u4f60\u7684\u8a0a\u606f
Commands.Stats=[[RED]]- \u67e5\u770b\u4f60\u7684mcMMO\u7d71\u8a08\u8a0a\u606f
Commands.ToggleAbility=[[RED]]- \u7528\u6ed1\u9f20\u53f3\u9375\u5207\u63db\u6280\u80fd\u4f7f\u7528\u6a21\u5f0f
Commands.Usage.0=[RED]]\u6b63\u78ba\u4f7f\u7528/ {0}
Commands.Usage.1=[[RED]]\u8acb\u8f38\u5165 /{0} {1}
Commands.Usage.2=[[RED]]\u8acb\u8f38\u5165 /{0} {1} {2}
Commands.Usage.3=[[RED]]\u8acb\u8f38\u5165 /{0} {1} {2} {3}
Commands.Usage.Level=\u7b49\u7d1a
Commands.Usage.Message=\u8a0a\u606f
Commands.Usage.Page=\u9801\u6578
Commands.Usage.PartyName=<FONT> <FONT>\u540d\u7a31</ FONT> </ FONT>
Commands.Usage.Password=\u5bc6\u78bc
Commands.Usage.Player=\u73a9\u5bb6
Commands.Usage.Skill=\u6280\u80fd
@@ -425,18 +425,10 @@ mcMMO.NoInvites=[[RED]]\u4f60\u6c92\u6709\u6536\u5230\u4efb\u4f55\u968a\u4f0d\u9
mcMMO.NoPermission=[[DARK_RED]]\u6b0a\u9650\u4e0d\u8db3
mcMMO.NoSkillNote=[[DARK_GRAY]]\u5982\u679c\u4f60\u7121\u6cd5\u4f7f\u7528\u90a3\u4e9b\u6280\u80fd\u5c31\u4e0d\u6703\u51fa\u73fe\u5728\u9019\u88e1
Party.Forbidden=[mcMMO] \u968a\u4f0d\u529f\u80fd\u4e0d\u5141\u8a31\u5728\u9019\u4e16\u754c\u958b\u555f (\u8acb\u89c0\u770b\u6b0a\u9650\u8a2d\u5b9a)
Party.Help.0=[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.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>
Party.Help.7=[RED]]\u8981\u8cb4\u968a\u4f0d\u7684\u6240\u6709\u6b0a\u8f49\u79fb\uff0c\u4f7f\u7528[DARK_AQUA] {0} <player>
Party.Help.8=[RED]\u8981\u89e3\u6563\u968a\u4f0d\uff0c\u4f7f\u7528[DARK_AQUA] {0}
Party.InformedOnJoin={0} [[GREEN]]\u52a0\u5165\u4e86\u4f60\u7684\u968a\u4f0d
Party.InformedOnQuit={0} [[GREEN]]\u96e2\u958b\u4e86\u4f60\u7684\u968a\u4f0d
Party.InformedOnNameChange=[[GOLD]]{0} [[GREEN]]\u5c07\u968a\u4f0d\u540d\u7a31\u8a2d\u5b9a\u70ba [[WHITE]]{1}
Party.InvalidName=[[DARK_RED]]\u90a3\u4e0d\u662f\u4e00\u500b\u6709\u6548\u7684\u968a\u4f0d\u540d\u7a31.
Party.Invite.Self=[RED]\u4f60\u80fd\u4e0d\u80fd\u9080\u8acb\u81ea\u5df1\uff01
Party.IsLocked=[[RED]]\u9019\u500b\u968a\u4f0d\u5df2\u7d93\u9396\u5b9a\u4e86!
Party.IsntLocked=[[RED]]\u9019\u500b\u968a\u4f0d\u4e26\u6c92\u6709\u9396\u5b9a!
Party.Locked=[[RED]]\u9019\u500b\u968a\u4f0d\u5df2\u9396\u5b9a!\u53ea\u6709\u968a\u9577\u53ef\u4ee5\u9080\u8acb!
@@ -445,7 +437,6 @@ Party.NotOwner=[[DARK_RED]]\u4f60\u4e26\u975e\u968a\u9577.
Party.Owner.New=[[GREEN]]{0} \u6210\u70ba\u65b0\u968a\u9577.
Party.Owner.NotLeader=[[DARK_RED]]\u56e0\u9592\u7f6e\u904e\u4e45,\u968a\u9577\u81ea\u52d5\u8f49\u8b93.
Party.Owner.Player=[[GREEN]]\u4f60\u6210\u70ba\u4e86\u968a\u9577.
Party.Password.None=[RED]\u9019\u500b\u968a\u4f0d\u662f\u6709\u5bc6\u78bc\u4fdd\u8b77\u7684\u3002\u8acb\u63d0\u4f9b\u5bc6\u78bc\u624d\u80fd\u52a0\u5165\u3002
Party.Password.Incorrect=[[RED]]\u968a\u4f0d\u5bc6\u78bc\u932f\u8aa4.
Party.Password.Set=[[GREEN]]\u968a\u4f0d\u5bc6\u78bc\u8a2d\u5b9a\u70ba {0}
Party.Password.Removed=[[GREEN]]\u968a\u4f0d\u5bc6\u78bc\u5df2\u522a\u9664.
@@ -453,23 +444,18 @@ Party.Player.Invalid=[[RED]]\u6b64\u73a9\u5bb6\u4e0d\u5b58\u5728
Party.NotOnline=[[DARK_RED]]{0} \u4e26\u4e0d\u5728\u7dda\u4e0a!
Party.Player.InSameParty=[[RED]]{0} \u5df2\u7d93\u5728\u4f60\u968a\u4f0d\u88e1\u4e86!
Party.PlayerNotInParty=[[DARK_RED]]{0} \u5df2\u4e0d\u5728\u4f60\u7684\u5718\u968a
Party.Specify=[RED]\u60a8\u5fc5\u9808\u6307\u5b9a\u4e00\u500b\u968a\u4f0d\u3002
Party.Teleport.Dead=[[RED]]\u4f60\u4e0d\u80fd\u50b3\u9001\u81f3\u6b7b\u4ea1\u7684\u73a9\u5bb6\u65c1
Party.Teleport.Hurt=[[RED]]\u4f60\u5df2\u7d93\u5728 {0} \u79d2\u524d\u53d7\u50b7\u4e26\u4e14\u7121\u6cd5\u50b3\u9001.
Party.Teleport.Player=[[GREEN]]\u4f60\u5df2\u7d93\u50b3\u9001\u5230 {0}.
Party.Teleport.Self=[[RED]]\u4f60\u7121\u6cd5\u50b3\u9001\u5230\u4f60\u81ea\u5df1\u8eab\u65c1!
Party.Teleport.Target=[[GREEN]]{0} \u5df2\u7d93\u50b3\u9001\u5230\u4f60\u8eab\u908a
Party.Teleport.Disabled=[[RED]]{0} \u4e0d\u5141\u8a31\u968a\u4f0d\u50b3\u9001.
Party.Rename.Same=[RED]] {0}\u4f60\u5df2\u7d93\u5728\u968a\u4f0d\u88e1\u4e86\uff01
Party.Join.Self=[RED]\u4e0d\u80fd\u52a0\u5165\u4f60\u81ea\u5df1\uff01
Party.Unlocked=[[GRAY]]\u968a\u4f0d\u4ee5\u89e3\u9396!
Party.Disband=[[GRAY]]\u968a\u4f0d\u5df2\u89e3\u6563
Party.Status.Locked=[[DARK_RED]](\u53ea\u53ef\u9080\u8acb)
Party.Status.Unlocked=[[DARK_GREEN]](\u958b\u555f)
Party.ShareType.Exp=\u7d93\u9a57\u503c
Party.ShareType.Item=\u7269\u54c1
Party.ShareMode.None=\u7121
Party.ShareMode.Random=\u96a8\u6a5f
Party.ExpShare.Disabled=<FONT> <FONT> [RED]\u968a\u4f0d\u7684\u7d93\u9a57\u5171\u4eab\u88ab\u7981\u7528\u3002</ FONT> </ FONT>
Commands.XPGain.Acrobatics=\u6389\u843d
Commands.XPGain.Archery=\u653b\u64ca\u602a\u7269
Commands.XPGain.Axes=\u653b\u64ca\u602a\u7269
@@ -481,7 +467,6 @@ Commands.XPGain.Repair=\u4fee\u7406
Commands.XPGain.Swords=\u653b\u64ca\u602a\u7269
Commands.XPGain.Taming=\u99b4\u7378,\u548c\u4f60\u7684\u72fc\u4e00\u8d77\u6230\u9b25
Commands.XPGain.Unarmed=\u653b\u64ca\u602a\u7269
Commands.XPGain.Woodcutting=\u780d\u6a39
Commands.XPGain=[[DARK_GRAY]]\u7372\u5f97\u7d93\u9a57\u503c:[[WHITE]]{0}
Commands.xplock.locked=[[GOLD]]\u4f60\u7684\u7d93\u9a57\u503c\u9396\u5b9a\u5728 {0}!
Commands.xplock.unlocked=[[GOLD]]\u4f60\u7684\u7d93\u9a57\u503c\u73fe\u5728 [[GREEN]]\u89e3\u9664\u9396\u5b9a\u4e86[[GOLD]]!
@@ -504,8 +489,6 @@ Inspect.Offline=[[RED]]\u4f60\u6c92\u6709\u67e5\u8a62\u96e2\u7dda\u73a9\u5bb6\u8
Inspect.OfflineStats=\u96e2\u7dda\u73a9\u5bb6\u7684 [mcMMO] \u7d71\u8a08\u8a0a\u606f [[YELLOW]]{0}
Inspect.Stats=[[GREEN]][mcMMO] \u7684\u7d71\u8a08\u8a0a\u606f [[YELLOW]]{0}
Inspect.TooFar=[[RED]]\u56e0\u8ddd\u96e2\u592a\u9060\u7121\u6cd5\u67e5\u770b\u90a3\u4f4d\u73a9\u5bb6!
Item.ChimaeraWing.Fail=**\u5947\u7f8e\u62c9\u4e4b\u7ffc\u4f7f\u7528\u5931\u6557\u4e86!**
Item.ChimaeraWing.Pass=**\u5947\u7f8e\u62c9\u4e4b\u7ffc**
Item.Injured.Wait=\u4f60\u904e\u5ea6\u75b2\u52de\u5fc5\u9808\u7b49\u5f85\u4e00\u6bb5\u6642\u9593\u5f8c\u624d\u53ef\u4f7f\u7528. [[YELLOW]]({0}s)
Skills.Disarmed=[[DARK_RED]]\u4f60\u7684\u6b66\u5668\u88ab\u63a0\u596a\u4e86!
Skills.Header=[[RED]]-----[][[GREEN]]{0}[[RED]][]-----
@@ -529,7 +512,6 @@ Hardcore.Player.Loss=[[GOLD]][mcMMO] [[DARK_RED]]\u4f60\u5728\u6b7b\u4ea1\u4e2d\
Vampirism.Killer.Success=[[GOLD]][mcMMO] [[DARK_AQUA]]\u4f60\u5077\u4e86 [[BLUE]]{0}[[DARK_AQUA]] \u7b49\u4f86\u81ea\u65bc[[YELLOW]]{1}.
Vampirism.Victim.Failure=[[GOLD]][mcMMO] [[YELLOW]]{0}[[GRAY]] \u4e0d\u5141\u8a31\u5f9e\u4f60\u90a3\u596a\u53d6\u7d93\u9a57\u503c!
Vampirism.Victim.Success=[[GOLD]][mcMMO] [[YELLOW]]{0}[[DARK_RED]] \u596a\u8d70\u4e86\u4f60 [[BLUE]]{1}[[DARK_RED]] \u7b49!
Spout.Donate=[[YELLOW]] [mcMMO\u6350\u52a9\uff01
Spout.LevelUp.1=[[GREEN]]\u5347\u7d1a!
Spout.LevelUp.2=[[YELLOW]]{0}[[DARK_AQUA]] ([[GREEN]]{1}[[DARK_AQUA]])
Spout.Menu.Exit=[[GRAY]]\u8f38\u5165 ESCAPE \u4f86\u96e2\u958b
@@ -541,17 +523,3 @@ Spout.Title={0}\n[[YELLOW]]P[[GOLD]]\u7b49\u7d1a[[WHITE]].[[GREEN]]{1}
MOTD.Hardcore.VampireOn=[[GOLD]][mcMMO] [[DARK_RED]]\u6b63\u7248\u6a21\u5f0f\u958b\u555f.
MOTD.Version=[[GOLD]][mcMMO] \u6b63\u904b\u4f5c\u7684\u7248\u672c [[DARK_AQUA]]{0}
MOTD.Website=[[GOLD]][mcMMO] [[GREEN]]{0}[[YELLOW]] - mcMMO \u9996\u9801
Smelting.Ability.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
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.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.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.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}
UpdateChecker.outdated=\u60a8\u4f7f\u7528\u7684\u662f\u904e\u6642\u7684\u7248\u672cmcMMO\uff01
UpdateChecker.newavailable=\u6709\u65b0\u7684\u7248\u672cBukkitDev\u3002

View File

@@ -1190,11 +1190,11 @@ permissions:
default: false
description: Implies all mcmmo.item permissions
children:
mcmmo.item.all: true
mcmmo.item.all: true
mcmmo.item.all:
description: Implies all mcmmo.item permissions
children:
mcmmo.item.chimaerawing: true
mcmmo.item.chimaerawing: true
mcmmo.item.chimaerawing:
description: Allows use of Chimaera Wing item
mcmmo.motd: