mirror of
https://github.com/mcMMO-Dev/mcMMO.git
synced 2026-02-18 09:43:00 +01:00
Compare commits
81 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
23719ace47 | ||
|
|
33882983e9 | ||
|
|
5aecedc074 | ||
|
|
69bf17a619 | ||
|
|
0292d3eefb | ||
|
|
0cd3e4ed84 | ||
|
|
3a26194a71 | ||
|
|
1313e3fe4b | ||
|
|
b2f400f61a | ||
|
|
9aa676cee1 | ||
|
|
eabf0f7f82 | ||
|
|
d0171809ec | ||
|
|
410c946faf | ||
|
|
3a7d88db4f | ||
|
|
9eba2c683b | ||
|
|
8059636b62 | ||
|
|
d78a1efbf6 | ||
|
|
c0b4a33346 | ||
|
|
2cef6700c7 | ||
|
|
df67bd6720 | ||
|
|
655dcb1c9b | ||
|
|
ce32792668 | ||
|
|
4b384abc51 | ||
|
|
82bccd357b | ||
|
|
12709bcd7f | ||
|
|
0b53f8266a | ||
|
|
a07f14e326 | ||
|
|
3349e9cb05 | ||
|
|
0e2746622d | ||
|
|
d9bd0ace9a | ||
|
|
e31b7d5c48 | ||
|
|
4bddbbf56e | ||
|
|
0654f27599 | ||
|
|
3f71dab0b1 | ||
|
|
bd45fff1b4 | ||
|
|
9618e45a11 | ||
|
|
3839373f5a | ||
|
|
1633617006 | ||
|
|
57e33bbf39 | ||
|
|
cddcf36016 | ||
|
|
dff03109a3 | ||
|
|
c0986a1f89 | ||
|
|
cd4c328320 | ||
|
|
03d0ecd450 | ||
|
|
3a809dab32 | ||
|
|
ade9e20cdd | ||
|
|
29520dc95c | ||
|
|
d40d89f29a | ||
|
|
9377de930f | ||
|
|
3219674678 | ||
|
|
a9438ed52b | ||
|
|
09169bd019 | ||
|
|
c30fdef615 | ||
|
|
109e9725a9 | ||
|
|
44ede5c3f8 | ||
|
|
c1161da6de | ||
|
|
80927417f2 | ||
|
|
91d8cd5da8 | ||
|
|
869d731b81 | ||
|
|
f6a18ef777 | ||
|
|
3e084b3b5d | ||
|
|
2c7f931c4d | ||
|
|
6b18cec7fb | ||
|
|
08960a2dbc | ||
|
|
5f4e269efa | ||
|
|
e5f6da01ec | ||
|
|
ae741a1b99 | ||
|
|
78a3ea4765 | ||
|
|
1a66ff7659 | ||
|
|
df53e2fd4f | ||
|
|
4210920c5f | ||
|
|
3440833af8 | ||
|
|
1e738263bc | ||
|
|
9cf322ca0b | ||
|
|
0c027ca697 | ||
|
|
27ed5f7c38 | ||
|
|
2f83e559a4 | ||
|
|
8b55744447 | ||
|
|
2f491b24e2 | ||
|
|
d2cb55befa | ||
|
|
e3e4cf9884 |
2
.gitattributes
vendored
2
.gitattributes
vendored
@@ -1,4 +1,4 @@
|
||||
* text
|
||||
* text=auto
|
||||
|
||||
*.png binary
|
||||
*.wav binary
|
||||
|
||||
82
.gitignore
vendored
82
.gitignore
vendored
@@ -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
|
||||
|
||||
@@ -7,7 +7,45 @@ Key:
|
||||
! Change
|
||||
- Removal
|
||||
|
||||
Version 1.4.01-dev
|
||||
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
|
||||
= 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
|
||||
@@ -18,6 +56,7 @@ Version 1.4.01-dev
|
||||
= 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!
|
||||
|
||||
2
pom.xml
2
pom.xml
@@ -2,7 +2,7 @@
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>com.gmail.nossr50.mcMMO</groupId>
|
||||
<artifactId>mcMMO</artifactId>
|
||||
<version>1.4.01-dev1</version>
|
||||
<version>1.4.03</version>
|
||||
<name>mcMMO</name>
|
||||
<url>https://github.com/mcMMO-Dev/mcMMO</url>
|
||||
<issueManagement>
|
||||
|
||||
@@ -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>
|
||||
@@ -3,46 +3,45 @@ package com.gmail.nossr50.api;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
|
||||
import com.gmail.nossr50.datatypes.skills.SkillType;
|
||||
import com.gmail.nossr50.skills.SkillManager;
|
||||
import com.gmail.nossr50.datatypes.skills.AbilityType;
|
||||
import com.gmail.nossr50.util.player.UserManager;
|
||||
|
||||
public final class AbilityAPI {
|
||||
private AbilityAPI() {}
|
||||
|
||||
public static boolean berserkEnabled(Player player) {
|
||||
return UserManager.getPlayer(player).getSkillManager(SkillType.UNARMED).getAbility().getMode();
|
||||
return UserManager.getPlayer(player).getAbilityMode(AbilityType.BERSERK);
|
||||
}
|
||||
|
||||
public static boolean gigaDrillBreakerEnabled(Player player) {
|
||||
return UserManager.getPlayer(player).getSkillManager(SkillType.EXCAVATION).getAbility().getMode();
|
||||
return UserManager.getPlayer(player).getAbilityMode(AbilityType.GIGA_DRILL_BREAKER);
|
||||
}
|
||||
|
||||
public static boolean greenTerraEnabled(Player player) {
|
||||
return UserManager.getPlayer(player).getSkillManager(SkillType.HERBALISM).getAbility().getMode();
|
||||
return UserManager.getPlayer(player).getAbilityMode(AbilityType.GREEN_TERRA);
|
||||
}
|
||||
|
||||
public static boolean serratedStrikesEnabled(Player player) {
|
||||
return UserManager.getPlayer(player).getSkillManager(SkillType.SWORDS).getAbility().getMode();
|
||||
return UserManager.getPlayer(player).getAbilityMode(AbilityType.SERRATED_STRIKES);
|
||||
}
|
||||
|
||||
public static boolean skullSplitterEnabled(Player player) {
|
||||
return UserManager.getPlayer(player).getSkillManager(SkillType.AXES).getAbility().getMode();
|
||||
return UserManager.getPlayer(player).getAbilityMode(AbilityType.SKULL_SPLITTER);
|
||||
}
|
||||
|
||||
public static boolean superBreakerEnabled(Player player) {
|
||||
return UserManager.getPlayer(player).getSkillManager(SkillType.MINING).getAbility().getMode();
|
||||
return UserManager.getPlayer(player).getAbilityMode(AbilityType.SUPER_BREAKER);
|
||||
}
|
||||
|
||||
public static boolean treeFellerEnabled(Player player) {
|
||||
return UserManager.getPlayer(player).getSkillManager(SkillType.WOODCUTTING).getAbility().getMode();
|
||||
return UserManager.getPlayer(player).getAbilityMode(AbilityType.TREE_FELLER);
|
||||
}
|
||||
|
||||
public static boolean isAnyAbilityEnabled(Player player) {
|
||||
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
|
||||
|
||||
for (SkillManager skillManager : mcMMOPlayer.getSkillManagers().values()) {
|
||||
if (skillManager.getAbility().getMode()) {
|
||||
for (AbilityType ability : AbilityType.values()) {
|
||||
if (mcMMOPlayer.getAbilityMode(ability)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -237,6 +237,29 @@ 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>
|
||||
|
||||
@@ -7,6 +7,8 @@ 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 {
|
||||
@@ -21,8 +23,8 @@ public abstract class ChatCommand 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 (CommandUtils.noConsoleUsage(sender)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
mcMMOPlayer = UserManager.getPlayer((Player) sender);
|
||||
@@ -38,19 +40,23 @@ public abstract class ChatCommand implements CommandExecutor {
|
||||
|
||||
case 1:
|
||||
if (args[0].equalsIgnoreCase("on")) {
|
||||
if (!(sender instanceof Player)) {
|
||||
return false;
|
||||
if (CommandUtils.noConsoleUsage(sender)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
mcMMOPlayer = UserManager.getPlayer((Player) sender);
|
||||
|
||||
enableChatMode(sender);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (args[0].equalsIgnoreCase("off")) {
|
||||
if (!(sender instanceof Player)) {
|
||||
return false;
|
||||
if (CommandUtils.noConsoleUsage(sender)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
mcMMOPlayer = UserManager.getPlayer((Player) sender);
|
||||
|
||||
disableChatMode(sender);
|
||||
return true;
|
||||
}
|
||||
@@ -78,11 +84,21 @@ 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());
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@ import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import com.gmail.nossr50.commands.chat.PartyChatCommand;
|
||||
import com.gmail.nossr50.mcMMO;
|
||||
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 = new PtpCommand();
|
||||
private CommandExecutor partyChatCommand = new PartyChatCommand();
|
||||
private CommandExecutor partyTeleportCommand = mcMMO.p.getCommand("ptp").getExecutor();
|
||||
private CommandExecutor partyChatCommand = mcMMO.p.getCommand("partychat").getExecutor();
|
||||
|
||||
@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().equals(player.getName())) {
|
||||
if (!mcMMOPlayer.getParty().getLeader().equalsIgnoreCase(player.getName())) {
|
||||
sender.sendMessage(LocaleLoader.getString("Party.NotOwner"));
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -35,7 +35,7 @@ public class PartyInfoCommand implements CommandExecutor {
|
||||
StringBuilder memberList = new StringBuilder();
|
||||
|
||||
for (OfflinePlayer member : playerParty.getMembers()) {
|
||||
if (playerParty.getLeader().equals(member.getName())) {
|
||||
if (playerParty.getLeader().equalsIgnoreCase(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(LocaleLoader.getString("Commands.Party.Members", createMembersList()));
|
||||
player.sendMessage(createMembersList());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -40,7 +40,7 @@ public class PartyRenameCommand implements CommandExecutor {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!member.getName().equals(leaderName)) {
|
||||
if (!member.getName().equalsIgnoreCase(leaderName)) {
|
||||
member.sendMessage(LocaleLoader.getString("Party.InformedOnNameChange", leaderName, newPartyName));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,6 +32,9 @@ 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());
|
||||
@@ -50,11 +53,10 @@ public class PtpCommand implements CommandExecutor {
|
||||
return acceptAnyTeleportRequest();
|
||||
}
|
||||
|
||||
player = (Player) sender;
|
||||
int ptpCooldown = Config.getInstance().getPTPCommandCooldown();
|
||||
long recentlyHurt = UserManager.getPlayer(player).getRecentlyHurt() * Misc.TIME_CONVERSION_FACTOR;
|
||||
long recentlyHurt = UserManager.getPlayer(player).getRecentlyHurt();
|
||||
|
||||
if (System.currentTimeMillis() - recentlyHurt >= (ptpCooldown * Misc.TIME_CONVERSION_FACTOR)) {
|
||||
if ((recentlyHurt * Misc.TIME_CONVERSION_FACTOR + ptpCooldown * Misc.TIME_CONVERSION_FACTOR) > System.currentTimeMillis()) {
|
||||
player.sendMessage(LocaleLoader.getString("Party.Teleport.Hurt", ptpCooldown));
|
||||
return true;
|
||||
}
|
||||
@@ -110,9 +112,9 @@ public class PtpCommand implements CommandExecutor {
|
||||
}
|
||||
|
||||
target = mcMMOPlayer.getPtpRequest();
|
||||
mcMMOPlayer.removePtpRequest();
|
||||
|
||||
if (!canTeleport(target.getName())) {
|
||||
mcMMOPlayer.removePtpRequest();
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
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;
|
||||
@@ -24,15 +23,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());
|
||||
}
|
||||
@@ -95,7 +94,7 @@ public class McrankCommand implements CommandExecutor {
|
||||
for (SkillType skillType : SkillType.values()) {
|
||||
int[] rankInts = LeaderboardManager.getPlayerRank(playerName, skillType);
|
||||
|
||||
if (skillType.isChildSkill()) {
|
||||
if ((sender instanceof Player && !Permissions.skillEnabled(sender, skillType)) || skillType.isChildSkill()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -119,6 +118,6 @@ public class McrankCommand implements CommandExecutor {
|
||||
}
|
||||
|
||||
private void sqlDisplay(CommandSender sender, String playerName) {
|
||||
Bukkit.getScheduler().runTaskAsynchronously(mcMMO.p, new McrankCommandAsyncTask(playerName, sender));
|
||||
mcMMO.p.getServer().getScheduler().runTaskAsynchronously(mcMMO.p, new McrankCommandAsyncTask(playerName, sender));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
package com.gmail.nossr50.commands.player;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
@@ -73,25 +72,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);
|
||||
@@ -123,7 +122,7 @@ public class MctopCommand implements CommandExecutor {
|
||||
sender.sendMessage(LocaleLoader.getString("Commands.mctop.Tip"));
|
||||
}
|
||||
|
||||
private void sqlDisplay(int page, String query, CommandSender sender, Command command) {
|
||||
Bukkit.getScheduler().runTaskAsynchronously(mcMMO.p, new MctopCommandAsyncTask(page, query, sender, command));
|
||||
private void sqlDisplay(int page, String query, CommandSender sender) {
|
||||
mcMMO.p.getServer().getScheduler().runTaskAsynchronously(mcMMO.p, new MctopCommandAsyncTask(page, query, sender));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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.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());
|
||||
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());
|
||||
|
||||
// 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 = Repair.getArcaneForgingRank(profile);
|
||||
arcaneForgingRank = UserManager.getPlayer(player).getRepairManager().getArcaneForgingRank();
|
||||
}
|
||||
|
||||
@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 && Salvage.salvageUnlockLevel > 0) {
|
||||
player.sendMessage(LocaleLoader.getString("Effects.Template", LocaleLoader.getString("Repair.Effect.16", Salvage.salvageUnlockLevel), LocaleLoader.getString("Repair.Effect.17")));
|
||||
if (canSalvage && Repair.salvageUnlockLevel > 0) {
|
||||
player.sendMessage(LocaleLoader.getString("Effects.Template", LocaleLoader.getString("Repair.Effect.16", Repair.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 : Repair.getEnchantChance(arcaneForgingRank))));
|
||||
player.sendMessage(LocaleLoader.getString("Repair.Arcane.Chance.Success", (arcaneBypass ? 100 : UserManager.getPlayer(player).getRepairManager().getKeepEnchantChance())));
|
||||
}
|
||||
|
||||
if (Repair.arcaneForgingDowngrades) {
|
||||
player.sendMessage(LocaleLoader.getString("Repair.Arcane.Chance.Downgrade", (arcaneBypass ? 0 : Repair.getDowngradeChance(arcaneForgingRank))));
|
||||
player.sendMessage(LocaleLoader.getString("Repair.Arcane.Chance.Downgrade", (arcaneBypass ? 0 : UserManager.getPlayer(player).getRepairManager().getDowngradeEnchantChance())));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package com.gmail.nossr50.commands.skills;
|
||||
|
||||
import java.text.DecimalFormat;
|
||||
import java.util.Set;
|
||||
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
@@ -11,6 +12,7 @@ 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;
|
||||
@@ -57,12 +59,23 @@ 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")));
|
||||
@@ -125,7 +138,7 @@ public abstract class SkillCommand implements CommandExecutor {
|
||||
}
|
||||
|
||||
protected String[] calculateLengthDisplayValues() {
|
||||
int maxLength = skill.getAbilityType().getMaxTicks();
|
||||
int maxLength = skill.getAbility().getMaxTicks();
|
||||
int length = 2 + (int) (skillValue / AdvancedConfig.getInstance().getAbilityLength());
|
||||
int enduranceLength = PerksUtils.handleActivationPerks(player, length, maxLength);
|
||||
|
||||
|
||||
@@ -20,6 +20,7 @@ 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); }
|
||||
@@ -178,6 +179,7 @@ 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); }
|
||||
|
||||
@@ -101,9 +101,12 @@ public class Config extends AutoUpdateConfigLoader {
|
||||
public boolean getEntityModsEnabled() { return config.getBoolean("Mods.Entity_Mods_Enabled", false); }
|
||||
|
||||
/* Items */
|
||||
public int getChimaeraCost() { return config.getInt("Items.Chimaera_Wing.Feather_Cost", 10); }
|
||||
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 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); }
|
||||
@@ -183,9 +186,7 @@ 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); }
|
||||
|
||||
@@ -199,8 +200,6 @@ 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); }
|
||||
|
||||
@@ -52,6 +52,11 @@ 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) {
|
||||
@@ -211,14 +216,14 @@ public class TreasureConfig extends ConfigLoader {
|
||||
Treasure treasure = nextEntry.getValue();
|
||||
|
||||
if (treasure instanceof FishingTreasure) {
|
||||
if (!fishingTreasures.contains(treasureKey)) {
|
||||
if (fishingTreasures == null || !fishingTreasures.contains(treasureKey)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
fishingRewards.add((FishingTreasure) treasure);
|
||||
}
|
||||
else if (treasure instanceof HylianTreasure) {
|
||||
if (!hylianTreasures.contains(treasureKey)) {
|
||||
if (hylianTreasures == null || !hylianTreasures.contains(treasureKey)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -237,7 +242,7 @@ public class TreasureConfig extends ConfigLoader {
|
||||
}
|
||||
}
|
||||
else if (treasure instanceof ExcavationTreasure) {
|
||||
if (!excavationTreasures.contains(treasureKey)) {
|
||||
if (excavationTreasures == null || !excavationTreasures.contains(treasureKey)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
@@ -60,79 +60,79 @@ public final class LeaderboardManager {
|
||||
ArrayList<String> players = new ArrayList<String>();
|
||||
|
||||
while ((line = in.readLine()) != null) {
|
||||
String[] character = line.split(":");
|
||||
String[] data = line.split(":");
|
||||
|
||||
String p = character[0];
|
||||
String playerName = data[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(p)) {
|
||||
if (players.contains(playerName)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
players.add(p);
|
||||
players.add(playerName);
|
||||
|
||||
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 > 1 && StringUtils.isInt(data[1])) {
|
||||
mining.add(new PlayerStat(playerName, Integer.parseInt(data[1])));
|
||||
powerLevel += Integer.parseInt(data[1]);
|
||||
}
|
||||
|
||||
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 > 5 && StringUtils.isInt(data[5])) {
|
||||
woodcutting.add(new PlayerStat(playerName, Integer.parseInt(data[5])));
|
||||
powerLevel += Integer.parseInt(data[5]);
|
||||
}
|
||||
|
||||
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 > 7 && StringUtils.isInt(data[7])) {
|
||||
repair.add(new PlayerStat(playerName, Integer.parseInt(data[7])));
|
||||
powerLevel += Integer.parseInt(data[7]);
|
||||
}
|
||||
|
||||
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 > 8 && StringUtils.isInt(data[8])) {
|
||||
unarmed.add(new PlayerStat(playerName, Integer.parseInt(data[8])));
|
||||
powerLevel += Integer.parseInt(data[8]);
|
||||
}
|
||||
|
||||
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 > 9 && StringUtils.isInt(data[9])) {
|
||||
herbalism.add(new PlayerStat(playerName, Integer.parseInt(data[9])));
|
||||
powerLevel += Integer.parseInt(data[9]);
|
||||
}
|
||||
|
||||
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 > 10 && StringUtils.isInt(data[10])) {
|
||||
excavation.add(new PlayerStat(playerName, Integer.parseInt(data[10])));
|
||||
powerLevel += Integer.parseInt(data[10]);
|
||||
}
|
||||
|
||||
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 > 11 && StringUtils.isInt(data[11])) {
|
||||
archery.add(new PlayerStat(playerName, Integer.parseInt(data[11])));
|
||||
powerLevel += Integer.parseInt(data[11]);
|
||||
}
|
||||
|
||||
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 > 12 && StringUtils.isInt(data[12])) {
|
||||
swords.add(new PlayerStat(playerName, Integer.parseInt(data[12])));
|
||||
powerLevel += Integer.parseInt(data[12]);
|
||||
}
|
||||
|
||||
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 > 13 && StringUtils.isInt(data[13])) {
|
||||
axes.add(new PlayerStat(playerName, Integer.parseInt(data[13])));
|
||||
powerLevel += Integer.parseInt(data[13]);
|
||||
}
|
||||
|
||||
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 > 14 && StringUtils.isInt(data[14])) {
|
||||
acrobatics.add(new PlayerStat(playerName, Integer.parseInt(data[14])));
|
||||
powerLevel += Integer.parseInt(data[14]);
|
||||
}
|
||||
|
||||
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 > 24 && StringUtils.isInt(data[24])) {
|
||||
taming.add(new PlayerStat(playerName, Integer.parseInt(data[24])));
|
||||
powerLevel += Integer.parseInt(data[24]);
|
||||
}
|
||||
|
||||
if (character.length > 34 && StringUtils.isInt(character[34])) {
|
||||
fishing.add(new PlayerStat(p, Integer.parseInt(character[34])));
|
||||
powerLevel += Integer.parseInt(character[34]);
|
||||
if (data.length > 34 && StringUtils.isInt(data[34])) {
|
||||
fishing.add(new PlayerStat(playerName, Integer.parseInt(data[34])));
|
||||
powerLevel += Integer.parseInt(data[34]);
|
||||
}
|
||||
|
||||
powerLevels.add(new PlayerStat(p, powerLevel));
|
||||
powerLevels.add(new PlayerStat(playerName, powerLevel));
|
||||
}
|
||||
in.close();
|
||||
}
|
||||
@@ -188,72 +188,22 @@ public final class LeaderboardManager {
|
||||
statsList = playerStatHash.get(SkillType.getSkill(skillType));
|
||||
}
|
||||
|
||||
int destination;
|
||||
int destination = (pageNumber - 1) * 10;
|
||||
|
||||
// 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++;
|
||||
for (int i = 0; i < 10; i++) {
|
||||
PlayerStat ps = statsList.get(destination + i);
|
||||
info[i] = ps.name + ":" + ps.statVal;
|
||||
}
|
||||
|
||||
return info;
|
||||
}
|
||||
|
||||
public static int[] getPlayerRank(String playerName) {
|
||||
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};
|
||||
return getPlayerRank(playerName, powerLevels);
|
||||
}
|
||||
|
||||
public static int[] getPlayerRank(String playerName, SkillType 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};
|
||||
return getPlayerRank(playerName, playerStatHash.get(skillType));
|
||||
}
|
||||
|
||||
public static boolean removeFlatFileUser(String playerName) {
|
||||
@@ -315,8 +265,9 @@ public final class LeaderboardManager {
|
||||
mcMMO.p.getLogger().info("Purging powerless users...");
|
||||
|
||||
int purgedUsers = 0;
|
||||
|
||||
for (PlayerStat stat : powerLevels) {
|
||||
if (stat.statVal == 0 && removeFlatFileUser(stat.name) && !mcMMO.p.getServer().getOfflinePlayer(stat.name).isOnline()) {
|
||||
if (stat.statVal == 0 && !mcMMO.p.getServer().getOfflinePlayer(stat.name).isOnline() && removeFlatFileUser(stat.name)) {
|
||||
purgedUsers++;
|
||||
}
|
||||
}
|
||||
@@ -394,6 +345,24 @@ 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) {
|
||||
|
||||
@@ -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,10 +28,13 @@ 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;
|
||||
@@ -65,11 +68,18 @@ public class McMMOPlayer {
|
||||
private boolean displaySkillNotifications = true;
|
||||
|
||||
private boolean abilityUse = true;
|
||||
private boolean placedAnvil;
|
||||
private boolean placedRepairAnvil;
|
||||
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) {
|
||||
@@ -79,19 +89,6 @@ 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.
|
||||
@@ -99,21 +96,23 @@ public class McMMOPlayer {
|
||||
*/
|
||||
try {
|
||||
for (SkillType skillType : SkillType.values()) {
|
||||
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));
|
||||
}
|
||||
skillManagers.put(skillType, skillType.getManagerClass().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() {
|
||||
@@ -144,6 +143,10 @@ 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);
|
||||
}
|
||||
@@ -160,12 +163,8 @@ public class McMMOPlayer {
|
||||
return (UnarmedManager) skillManagers.get(SkillType.UNARMED);
|
||||
}
|
||||
|
||||
public SkillManager getSkillManager(SkillType skillType) {
|
||||
return skillManagers.get(skillType);
|
||||
}
|
||||
|
||||
public Map<SkillType, SkillManager> getSkillManagers() {
|
||||
return skillManagers;
|
||||
public WoodcuttingManager getWoodcuttingManager() {
|
||||
return (WoodcuttingManager) skillManagers.get(SkillType.WOODCUTTING);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -176,11 +175,61 @@ public class McMMOPlayer {
|
||||
* Reset the mode of all abilities.
|
||||
*/
|
||||
public void resetAbilityMode() {
|
||||
for (SkillManager skillManager : skillManagers.values()) {
|
||||
skillManager.getAbility().setMode(false);
|
||||
for (AbilityType ability : AbilityType.values()) {
|
||||
setAbilityMode(ability, 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;
|
||||
}
|
||||
@@ -197,11 +246,43 @@ public class McMMOPlayer {
|
||||
* Reset the prep modes of all tools.
|
||||
*/
|
||||
public void resetToolPrepMode() {
|
||||
for (SkillManager skillManager : skillManagers.values()) {
|
||||
skillManager.getTool().setPreparationMode(false);
|
||||
for (ToolType tool : ToolType.values()) {
|
||||
setToolPreparationMode(tool, 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
|
||||
*/
|
||||
@@ -218,6 +299,23 @@ 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
|
||||
*/
|
||||
@@ -234,24 +332,26 @@ public class McMMOPlayer {
|
||||
* Repair Anvil Placement
|
||||
*/
|
||||
|
||||
public void togglePlacedAnvil() {
|
||||
placedAnvil = !placedAnvil;
|
||||
public boolean getPlacedAnvil(int anvilId) {
|
||||
if (anvilId == Repair.repairAnvilId) {
|
||||
return placedRepairAnvil;
|
||||
}
|
||||
|
||||
if (anvilId == Repair.salvageAnvilId) {
|
||||
return placedSalvageAnvil;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public Boolean getPlacedAnvil() {
|
||||
return placedAnvil;
|
||||
}
|
||||
public void togglePlacedAnvil(int anvilId) {
|
||||
if (anvilId == Repair.repairAnvilId) {
|
||||
placedRepairAnvil = !placedRepairAnvil;
|
||||
}
|
||||
|
||||
/*
|
||||
* Salvage Anvil Placement
|
||||
*/
|
||||
|
||||
public void togglePlacedSalvageAnvil() {
|
||||
placedSalvageAnvil = !placedSalvageAnvil;
|
||||
}
|
||||
|
||||
public Boolean getPlacedSalvageAnvil() {
|
||||
return placedSalvageAnvil;
|
||||
if (anvilId == Repair.salvageAnvilId) {
|
||||
placedSalvageAnvil = !placedSalvageAnvil;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -92,7 +92,7 @@ public class PlayerProfile {
|
||||
}
|
||||
else {
|
||||
for (HudType type : HudType.values()) {
|
||||
if (type.toString().equals(huds.get(1).get(0))) {
|
||||
if (type.toString().equalsIgnoreCase(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].equals(playerName)) {
|
||||
if (!character[0].equalsIgnoreCase(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].equals(playerName)) {
|
||||
if (!line.split(":")[0].equalsIgnoreCase(playerName)) {
|
||||
writer.append(line).append("\r\n");
|
||||
}
|
||||
else {
|
||||
|
||||
@@ -1,22 +0,0 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
@@ -11,10 +11,12 @@ 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 {
|
||||
@@ -25,35 +27,35 @@ public enum SkillType {
|
||||
FISHING(FishingManager.class),
|
||||
HERBALISM(HerbalismManager.class, AbilityType.GREEN_TERRA, ToolType.HOE),
|
||||
MINING(MiningManager.class, AbilityType.SUPER_BREAKER, ToolType.PICKAXE),
|
||||
REPAIR(null), // TODO: Create a proper RepairManager class
|
||||
REPAIR(RepairManager.class),
|
||||
SMELTING(SmeltingManager.class),
|
||||
SWORDS(SwordsManager.class, AbilityType.SERRATED_STRIKES, ToolType.SWORD),
|
||||
TAMING(TamingManager.class),
|
||||
UNARMED(UnarmedManager.class, AbilityType.BERSERK, ToolType.FISTS),
|
||||
WOODCUTTING(null, AbilityType.TREE_FELLER, ToolType.AXE); // TODO: Create a proper WoodcuttingManager class
|
||||
WOODCUTTING(WoodcuttingManager.class, AbilityType.TREE_FELLER, ToolType.AXE);
|
||||
|
||||
private Class<? extends SkillManager> managerClass;
|
||||
private AbilityType abilityType;
|
||||
private ToolType toolType;
|
||||
private AbilityType ability;
|
||||
private ToolType tool;
|
||||
|
||||
private SkillType(Class<? extends SkillManager> managerClass) {
|
||||
this.managerClass = managerClass;
|
||||
abilityType = null;
|
||||
toolType = null;
|
||||
ability = null;
|
||||
tool = null;
|
||||
}
|
||||
|
||||
private SkillType(Class<? extends SkillManager> managerClass, AbilityType abilityType, ToolType toolType) {
|
||||
private SkillType(Class<? extends SkillManager> managerClass, AbilityType ability, ToolType tool) {
|
||||
this.managerClass = managerClass;
|
||||
this.abilityType = abilityType;
|
||||
this.toolType = toolType;
|
||||
this.ability = ability;
|
||||
this.tool = tool;
|
||||
}
|
||||
|
||||
public Class<? extends SkillManager> getManagerClass() {
|
||||
return managerClass;
|
||||
}
|
||||
|
||||
public AbilityType getAbilityType() {
|
||||
return abilityType;
|
||||
public AbilityType getAbility() {
|
||||
return ability;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -77,8 +79,8 @@ public enum SkillType {
|
||||
return Config.getInstance().getDoubleDropsDisabled(this);
|
||||
}
|
||||
|
||||
public ToolType getToolType() {
|
||||
return toolType;
|
||||
public ToolType getTool() {
|
||||
return tool;
|
||||
}
|
||||
|
||||
public double getXpModifier() {
|
||||
|
||||
@@ -1,26 +0,0 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
@@ -7,6 +7,7 @@ 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;
|
||||
@@ -19,12 +20,11 @@ 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,10 +33,9 @@ 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.Unarmed;
|
||||
import com.gmail.nossr50.skills.woodcutting.Woodcutting;
|
||||
import com.gmail.nossr50.skills.unarmed.UnarmedManager;
|
||||
import com.gmail.nossr50.skills.woodcutting.WoodcuttingManager;
|
||||
import com.gmail.nossr50.util.BlockUtils;
|
||||
import com.gmail.nossr50.util.ItemUtils;
|
||||
import com.gmail.nossr50.util.Misc;
|
||||
@@ -107,21 +106,15 @@ 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) {
|
||||
int blockID = blockState.getTypeId();
|
||||
|
||||
if (blockID == Repair.anvilID) {
|
||||
Repair.placedAnvilCheck(player, blockID);
|
||||
}
|
||||
else if (blockID == Salvage.anvilID) {
|
||||
Salvage.placedAnvilCheck(player, blockID);
|
||||
}
|
||||
if (Repair.anvilMessagesEnabled && (blockId == Repair.repairAnvilId || blockId == Repair.salvageAnvilId)) {
|
||||
UserManager.getPlayer(player).getRepairManager().placedAnvilCheck(blockId);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -144,12 +137,11 @@ 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 = UserManager.getPlayer(player).getHerbalismManager();
|
||||
HerbalismManager herbalismManager = mcMMOPlayer.getHerbalismManager();
|
||||
|
||||
/* Green Terra */
|
||||
if (herbalismManager.canActivateAbility()) {
|
||||
@@ -161,52 +153,34 @@ 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 = UserManager.getPlayer(player).getMiningManager();
|
||||
|
||||
MiningManager miningManager = mcMMOPlayer.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)) {
|
||||
if (mcMMOPlayer.getSkillManager(SkillType.WOODCUTTING).getAbility().getMode() && Permissions.treeFeller(player) && ItemUtils.isAxe(heldItem)) {
|
||||
Woodcutting.beginTreeFeller(blockState, player);
|
||||
WoodcuttingManager woodcuttingManager = mcMMOPlayer.getWoodcuttingManager();
|
||||
|
||||
if (woodcuttingManager.canUseTreeFeller(heldItem)) {
|
||||
woodcuttingManager.processTreeFeller(blockState);
|
||||
}
|
||||
else {
|
||||
if (Config.getInstance().getWoodcuttingRequiresTool()) {
|
||||
if (ItemUtils.isAxe(heldItem)) {
|
||||
Woodcutting.beginWoodcutting(player, blockState);
|
||||
}
|
||||
}
|
||||
else {
|
||||
Woodcutting.beginWoodcutting(player, blockState);
|
||||
}
|
||||
woodcuttingManager.woodcuttingBlockCheck(blockState);
|
||||
}
|
||||
}
|
||||
|
||||
/* EXCAVATION */
|
||||
else if (BlockUtils.affectedByGigaDrillBreaker(blockState) && ItemUtils.isShovel(heldItem) && Permissions.skillEnabled(player, SkillType.EXCAVATION) && !mcMMO.placeStore.isTrue(blockState)) {
|
||||
ExcavationManager excavationManager = UserManager.getPlayer(player).getExcavationManager();
|
||||
|
||||
ExcavationManager excavationManager = mcMMOPlayer.getExcavationManager();
|
||||
excavationManager.excavationBlockCheck(blockState);
|
||||
|
||||
if (excavationManager.getAbility().getMode()) {
|
||||
if (mcMMOPlayer.getAbilityMode(AbilityType.GIGA_DRILL_BREAKER)) {
|
||||
excavationManager.gigaDrillBreaker(blockState);
|
||||
}
|
||||
}
|
||||
@@ -235,20 +209,26 @@ public class BlockListener implements Listener {
|
||||
}
|
||||
|
||||
BlockState blockState = event.getBlock().getState();
|
||||
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
|
||||
HerbalismManager herbalismManager = mcMMOPlayer.getHerbalismManager();
|
||||
SmeltingManager smeltingManager = mcMMOPlayer.getSmeltingManager();
|
||||
ItemStack heldItem = player.getItemInHand();
|
||||
|
||||
if (herbalismManager.canUseHylianLuck()) {
|
||||
if (herbalismManager.processHylianLuck(blockState)) {
|
||||
blockState.update(true);
|
||||
event.setCancelled(true);
|
||||
if (ItemUtils.isSword(heldItem)) {
|
||||
HerbalismManager herbalismManager = UserManager.getPlayer(player).getHerbalismManager();
|
||||
|
||||
if (herbalismManager.canUseHylianLuck()) {
|
||||
if (herbalismManager.processHylianLuck(blockState)) {
|
||||
blockState.update(true);
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (smeltingManager.canUseFluxMining(blockState)) {
|
||||
if (smeltingManager.processFluxMining(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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -282,29 +262,29 @@ public class BlockListener implements Listener {
|
||||
ItemStack heldItem = player.getItemInHand();
|
||||
|
||||
if (HiddenConfig.getInstance().useEnchantmentBuffs()) {
|
||||
if ((ItemUtils.isPickaxe(heldItem) && !mcMMOPlayer.getSkillManager(SkillType.MINING).getAbility().getMode()) || (ItemUtils.isShovel(heldItem) && !mcMMOPlayer.getSkillManager(SkillType.EXCAVATION).getAbility().getMode())) {
|
||||
if ((ItemUtils.isPickaxe(heldItem) && !mcMMOPlayer.getAbilityMode(AbilityType.SUPER_BREAKER)) || (ItemUtils.isShovel(heldItem) && !mcMMOPlayer.getAbilityMode(AbilityType.GIGA_DRILL_BREAKER))) {
|
||||
SkillUtils.removeAbilityBuff(heldItem);
|
||||
}
|
||||
}
|
||||
else {
|
||||
if ((mcMMOPlayer.getSkillManager(SkillType.MINING).getAbility().getMode() && !BlockUtils.affectedBySuperBreaker(blockState)) || (mcMMOPlayer.getSkillManager(SkillType.EXCAVATION).getAbility().getMode() && !BlockUtils.affectedByGigaDrillBreaker(blockState))) {
|
||||
if ((mcMMOPlayer.getAbilityMode(AbilityType.SUPER_BREAKER) && !BlockUtils.affectedBySuperBreaker(blockState)) || (mcMMOPlayer.getAbilityMode(AbilityType.GIGA_DRILL_BREAKER) && !BlockUtils.affectedByGigaDrillBreaker(blockState))) {
|
||||
SkillUtils.handleAbilitySpeedDecrease(player);
|
||||
}
|
||||
}
|
||||
|
||||
if (mcMMOPlayer.getSkillManager(SkillType.HERBALISM).getTool().getPreparationMode() && ItemUtils.isHoe(heldItem) && (BlockUtils.affectedByGreenTerra(blockState) || BlockUtils.canMakeMossy(blockState)) && Permissions.greenTerra(player)) {
|
||||
if (mcMMOPlayer.getToolPreparationMode(ToolType.HOE) && ItemUtils.isHoe(heldItem) && (BlockUtils.affectedByGreenTerra(blockState) || BlockUtils.canMakeMossy(blockState)) && Permissions.greenTerra(player)) {
|
||||
SkillUtils.abilityCheck(mcMMOPlayer, SkillType.HERBALISM);
|
||||
}
|
||||
else if (mcMMOPlayer.getSkillManager(SkillType.WOODCUTTING).getTool().getPreparationMode() && ItemUtils.isAxe(heldItem) && BlockUtils.isLog(blockState) && Permissions.treeFeller(player)) {
|
||||
else if (mcMMOPlayer.getToolPreparationMode(ToolType.AXE) && ItemUtils.isAxe(heldItem) && BlockUtils.isLog(blockState) && Permissions.treeFeller(player)) {
|
||||
SkillUtils.abilityCheck(mcMMOPlayer, SkillType.WOODCUTTING);
|
||||
}
|
||||
else if (mcMMOPlayer.getSkillManager(SkillType.MINING).getTool().getPreparationMode() && ItemUtils.isPickaxe(heldItem) && BlockUtils.affectedBySuperBreaker(blockState) && Permissions.superBreaker(player)) {
|
||||
else if (mcMMOPlayer.getToolPreparationMode(ToolType.PICKAXE) && ItemUtils.isPickaxe(heldItem) && BlockUtils.affectedBySuperBreaker(blockState) && Permissions.superBreaker(player)) {
|
||||
SkillUtils.abilityCheck(mcMMOPlayer, SkillType.MINING);
|
||||
}
|
||||
else if (mcMMOPlayer.getSkillManager(SkillType.EXCAVATION).getTool().getPreparationMode() && ItemUtils.isShovel(heldItem) && BlockUtils.affectedByGigaDrillBreaker(blockState) && Permissions.gigaDrillBreaker(player)) {
|
||||
else if (mcMMOPlayer.getToolPreparationMode(ToolType.SHOVEL) && ItemUtils.isShovel(heldItem) && BlockUtils.affectedByGigaDrillBreaker(blockState) && Permissions.gigaDrillBreaker(player)) {
|
||||
SkillUtils.abilityCheck(mcMMOPlayer, SkillType.EXCAVATION);
|
||||
}
|
||||
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))) {
|
||||
else if (mcMMOPlayer.getToolPreparationMode(ToolType.FISTS) && heldItem.getType() == Material.AIR && (BlockUtils.affectedByGigaDrillBreaker(blockState) || blockState.getType() == Material.SNOW || BlockUtils.affectedByBlockCracker(blockState) && Permissions.berserk(player))) {
|
||||
SkillUtils.abilityCheck(mcMMOPlayer, SkillType.UNARMED);
|
||||
}
|
||||
}
|
||||
@@ -314,7 +294,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.getSkillManager(SkillType.WOODCUTTING).getTool().getPreparationMode() && BlockUtils.isLog(blockState)) {
|
||||
if (mcMMOPlayer.getAbilityMode(AbilityType.TREE_FELLER) && BlockUtils.isLog(blockState)) {
|
||||
player.playSound(blockState.getLocation(), Sound.FIZZ, Misc.FIZZ_VOLUME, Misc.FIZZ_PITCH);
|
||||
}
|
||||
}
|
||||
@@ -352,7 +332,7 @@ public class BlockListener implements Listener {
|
||||
blockState.update(true);
|
||||
}
|
||||
}
|
||||
else if (mcMMOPlayer.getSkillManager(SkillType.UNARMED).getTool().getPreparationMode()) {
|
||||
else if (mcMMOPlayer.getAbilityMode(AbilityType.BERSERK)) {
|
||||
if (SkillUtils.triggerCheck(player, block, AbilityType.BERSERK)) {
|
||||
if (heldItem.getType() == Material.AIR) {
|
||||
plugin.getServer().getPluginManager().callEvent(new FakePlayerAnimationEvent(player));
|
||||
@@ -362,24 +342,18 @@ public class BlockListener implements Listener {
|
||||
}
|
||||
}
|
||||
// Another perm check for the cracked blocks activation
|
||||
else if (BlockUtils.affectedByBlockCracker(blockState) && Permissions.blockCracker(player)) {
|
||||
if (Unarmed.blockCracker(player, blockState)) {
|
||||
else if (BlockUtils.affectedByBlockCracker(blockState)) {
|
||||
UnarmedManager unarmedManager = mcMMOPlayer.getUnarmedManager();
|
||||
|
||||
if (unarmedManager.canUseBlockCracker() && SkillUtils.blockBreakSimulate(block, player, false) && unarmedManager.blockCrackerCheck(blockState)) {
|
||||
blockState.update();
|
||||
}
|
||||
}
|
||||
}
|
||||
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);
|
||||
}
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -115,8 +115,8 @@ public class EntityListener implements Listener {
|
||||
Player defendingPlayer = (Player) defender;
|
||||
Player attackingPlayer = (Player) attacker;
|
||||
|
||||
// TODO: Why?
|
||||
if (defendingPlayer == attackingPlayer) {
|
||||
// We want to make sure we're not gaining XP or applying abilities when we hit ourselves
|
||||
if (defendingPlayer.equals(attackingPlayer)) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
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;
|
||||
@@ -16,6 +17,7 @@ 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;
|
||||
@@ -49,11 +51,12 @@ public class InventoryListener implements Listener {
|
||||
if (furnace == null) {
|
||||
return;
|
||||
}
|
||||
if (furnace.getBurnTime() == 0) {
|
||||
Block furnaceBlock = furnace.getBlock();
|
||||
|
||||
BlockState furnaceBlock = furnace.getBlock().getState();
|
||||
|
||||
if (furnace.getBurnTime() == 0 && !plugin.furnaceIsTracked(furnaceBlock)) {
|
||||
plugin.addToOpenFurnaceTracker(furnaceBlock, player.getName());
|
||||
if (!furnaceBlock.hasMetadata(mcMMO.furnaceMetadataKey)) {
|
||||
furnaceBlock.setMetadata(mcMMO.furnaceMetadataKey, new FixedMetadataValue(plugin, player.getName()));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -75,23 +78,27 @@ public class InventoryListener implements Listener {
|
||||
return;
|
||||
}
|
||||
|
||||
BlockState furnaceBlock = furnace.getBlock().getState();
|
||||
if (furnace.getBurnTime() == 0) {
|
||||
Block furnaceBlock = furnace.getBlock();
|
||||
|
||||
if (furnace.getBurnTime() == 0 && plugin.furnaceIsTracked(furnaceBlock)) {
|
||||
plugin.removeFromFurnaceTracker(furnaceBlock);
|
||||
if (furnaceBlock.hasMetadata(mcMMO.furnaceMetadataKey)) {
|
||||
furnaceBlock.removeMetadata(mcMMO.furnaceMetadataKey, plugin);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
||||
public void onFurnaceBurnEvent(FurnaceBurnEvent event) {
|
||||
BlockState furnaceBlock = event.getBlock().getState();
|
||||
Block furnaceBlock = event.getBlock();
|
||||
BlockState furnaceState = furnaceBlock.getState();
|
||||
|
||||
if (furnaceBlock instanceof Furnace) {
|
||||
ItemStack smelting = ((Furnace) furnaceBlock).getInventory().getSmelting();
|
||||
if (furnaceState instanceof Furnace) {
|
||||
ItemStack smelting = ((Furnace) furnaceState).getInventory().getSmelting();
|
||||
|
||||
if (plugin.furnaceIsTracked(furnaceBlock) && smelting != null && ItemUtils.isSmeltable(smelting)) {
|
||||
Player player = plugin.getFurnacePlayer(furnaceBlock);
|
||||
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 (Misc.isNPCEntity(player) || !Permissions.fuelEfficiency(player)) {
|
||||
return;
|
||||
@@ -104,13 +111,15 @@ public class InventoryListener implements Listener {
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
||||
public void onFurnaceSmeltEvent(FurnaceSmeltEvent event) {
|
||||
BlockState furnaceBlock = event.getBlock().getState();
|
||||
Block furnaceBlock = event.getBlock();
|
||||
BlockState furnaceState = furnaceBlock.getState();
|
||||
|
||||
if (furnaceBlock instanceof Furnace) {
|
||||
ItemStack smelting = ((Furnace) furnaceBlock).getInventory().getSmelting();
|
||||
if (furnaceState instanceof Furnace) {
|
||||
ItemStack smelting = ((Furnace) furnaceState).getInventory().getSmelting();
|
||||
|
||||
if (plugin.furnaceIsTracked(furnaceBlock) && smelting != null && ItemUtils.isSmeltable(smelting)) {
|
||||
Player player = plugin.getFurnacePlayer(furnaceBlock);
|
||||
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 (Misc.isNPCEntity(player) || !Permissions.skillEnabled(player, SkillType.SMELTING)) {
|
||||
return;
|
||||
@@ -123,13 +132,15 @@ public class InventoryListener implements Listener {
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
||||
public void onFurnaceExtractEvent(FurnaceExtractEvent event) {
|
||||
BlockState furnaceBlock = event.getBlock().getState();
|
||||
Block furnaceBlock = event.getBlock();
|
||||
BlockState furnaceState = furnaceBlock.getState();
|
||||
|
||||
if (furnaceBlock instanceof Furnace) {
|
||||
ItemStack result = ((Furnace) furnaceBlock).getInventory().getResult();
|
||||
if (furnaceState instanceof Furnace) {
|
||||
ItemStack result = ((Furnace) furnaceState).getInventory().getResult();
|
||||
|
||||
if (plugin.furnaceIsTracked(furnaceBlock) && result != null && ItemUtils.isSmelted(result)) {
|
||||
Player player = event.getPlayer();
|
||||
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());
|
||||
|
||||
SmeltingManager smeltingManager = UserManager.getPlayer(player).getSmeltingManager();
|
||||
|
||||
@@ -142,6 +153,8 @@ public class InventoryListener implements Listener {
|
||||
|
||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||
public void onInventoryClickEvent(InventoryClickEvent event) {
|
||||
SkillUtils.removeAbilityBuff(event.getCurrentItem());
|
||||
if (event.getSlot() >= 0) {
|
||||
SkillUtils.removeAbilityBuff(event.getCurrentItem());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -30,6 +30,7 @@ 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;
|
||||
@@ -38,7 +39,6 @@ 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.getSkillManager(SkillType.EXCAVATION).getAbility().getMode() || mcMMOPlayer.getSkillManager(SkillType.MINING).getAbility().getMode()) {
|
||||
if (mcMMOPlayer.getAbilityMode(AbilityType.GIGA_DRILL_BREAKER) || mcMMOPlayer.getAbilityMode(AbilityType.SUPER_BREAKER)) {
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
@@ -284,14 +284,14 @@ public class PlayerListener implements Listener {
|
||||
int blockID = block.getTypeId();
|
||||
|
||||
/* REPAIR CHECKS */
|
||||
if (blockID == Repair.anvilID && Permissions.skillEnabled(player, SkillType.REPAIR) && mcMMO.repairManager.isRepairable(heldItem)) {
|
||||
mcMMO.repairManager.handleRepair(mcMMOPlayer, heldItem);
|
||||
if (blockID == Repair.repairAnvilId && Permissions.skillEnabled(player, SkillType.REPAIR) && mcMMO.repairableManager.isRepairable(heldItem)) {
|
||||
UserManager.getPlayer(player).getRepairManager().handleRepair(heldItem);
|
||||
event.setCancelled(true);
|
||||
player.updateInventory();
|
||||
}
|
||||
/* SALVAGE CHECKS */
|
||||
else if (blockID == Salvage.anvilID && Permissions.salvage(player) && Salvage.isSalvageable(heldItem)) {
|
||||
Salvage.handleSalvage(player, block.getLocation(), heldItem);
|
||||
else if (blockID == Repair.salvageAnvilId && Permissions.salvage(player) && Repair.isSalvageable(heldItem)) {
|
||||
UserManager.getPlayer(player).getRepairManager().handleSalvage(block.getLocation(), heldItem);
|
||||
event.setCancelled(true);
|
||||
player.updateInventory();
|
||||
}
|
||||
|
||||
@@ -8,9 +8,7 @@ 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;
|
||||
@@ -45,10 +43,11 @@ 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;
|
||||
@@ -66,12 +65,11 @@ 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 RepairManager repairManager;
|
||||
public static RepairableManager repairableManager;
|
||||
|
||||
// Jar Stuff
|
||||
public static File mcmmo;
|
||||
@@ -95,6 +93,7 @@ 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.
|
||||
@@ -115,6 +114,7 @@ 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.");
|
||||
}
|
||||
|
||||
Bukkit.getPluginManager().disablePlugin(this);
|
||||
getServer().getPluginManager().disablePlugin(this);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -273,22 +273,6 @@ 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;
|
||||
}
|
||||
@@ -377,8 +361,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());
|
||||
repairManager = RepairManagerFactory.getRepairManager(repairables.size());
|
||||
repairManager.registerRepairables(repairables);
|
||||
repairableManager = RepairableManagerFactory.getRepairManager(repairables.size());
|
||||
repairableManager.registerRepairables(repairables);
|
||||
|
||||
// Check if Repair Anvil and Salvage Anvil have different itemID's
|
||||
if (configInstance.getSalvageAnvilId() == configInstance.getRepairAnvilId()) {
|
||||
@@ -450,6 +434,12 @@ 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();
|
||||
|
||||
|
||||
@@ -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().equals(member.getName()) && Misc.isNear(player.getLocation(), member.getLocation(), range)) {
|
||||
if (!player.getName().equalsIgnoreCase(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().equals(playerName)) {
|
||||
if (member.getName().equalsIgnoreCase(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().equals(player.getName())) {
|
||||
if (party.getLeader().equalsIgnoreCase(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().equals(playerName)) {
|
||||
if (member.getName().equalsIgnoreCase(playerName)) {
|
||||
member.sendMessage(LocaleLoader.getString("Party.Owner.Player"));
|
||||
}
|
||||
else if (member.getName().equals(leaderName)) {
|
||||
else if (member.getName().equalsIgnoreCase(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().equals(player.getName())) {
|
||||
if (party.isLocked() && !party.getLeader().equalsIgnoreCase(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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -2,13 +2,14 @@ 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 {
|
||||
@@ -24,14 +25,14 @@ public class McrankCommandAsyncTask implements Runnable {
|
||||
public void run() {
|
||||
final Map<String, Integer> skills = DatabaseManager.readSQLRank(playerName);
|
||||
|
||||
Bukkit.getScheduler().scheduleSyncDelayedTask(mcMMO.p, new Runnable() {
|
||||
mcMMO.p.getServer().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 (skillType.isChildSkill()) {
|
||||
if ((sender instanceof Player && !Permissions.skillEnabled(sender, skillType)) || skillType.isChildSkill()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
@@ -3,17 +3,13 @@ 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 {
|
||||
@@ -21,29 +17,21 @@ 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, Command command) {
|
||||
public MctopCommandAsyncTask(int page, String query, CommandSender sender) {
|
||||
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");
|
||||
Bukkit.getScheduler().scheduleSyncDelayedTask(mcMMO.p, new Runnable() {
|
||||
mcMMO.p.getServer().getScheduler().scheduleSyncDelayedTask(mcMMO.p, new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (query.equals("taming+mining+woodcutting+repair+unarmed+herbalism+excavation+archery+swords+axes+acrobatics+fishing")) {
|
||||
if (query.equalsIgnoreCase("taming+mining+woodcutting+repair+unarmed+herbalism+excavation+archery+swords+axes+acrobatics+fishing")) {
|
||||
sender.sendMessage(LocaleLoader.getString("Commands.PowerLevel.Leaderboard"));
|
||||
}
|
||||
else {
|
||||
|
||||
@@ -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.equals("null") || playerName.equals("#Storage place for user information")) {
|
||||
if (playerName == null || playerName.equalsIgnoreCase("null") || playerName.equalsIgnoreCase("#Storage place for user information")) {
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
@@ -1,11 +1,8 @@
|
||||
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;
|
||||
|
||||
@@ -14,27 +11,22 @@ public class SkillMonitorTask implements Runnable {
|
||||
public void run() {
|
||||
long curTime = System.currentTimeMillis();
|
||||
|
||||
for (Player player : mcMMO.p.getServer().getOnlinePlayers()) {
|
||||
if (Misc.isNPCEntity(player)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
|
||||
|
||||
for (McMMOPlayer mcMMOPlayer : UserManager.getPlayers().values()) {
|
||||
/*
|
||||
* MONITOR SKILLS & COOLDOWN
|
||||
* MONITOR SKILLS
|
||||
*/
|
||||
for (SkillType skill : SkillType.values()) {
|
||||
if (skill.getAbilityType() == null) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (skill.getToolType() != null) {
|
||||
if (skill.getTool() != null && skill.getAbility() != null) {
|
||||
SkillUtils.monitorSkill(mcMMOPlayer, curTime, skill);
|
||||
}
|
||||
}
|
||||
|
||||
if (skill.getAbilityType().getCooldown() > 0) {
|
||||
SkillUtils.watchCooldown(mcMMOPlayer, skill);
|
||||
/*
|
||||
* COOLDOWN MONITORING
|
||||
*/
|
||||
for (AbilityType ability : AbilityType.values()) {
|
||||
if (ability.getCooldown() > 0) {
|
||||
SkillUtils.watchCooldown(mcMMOPlayer, ability);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,46 +0,0 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,66 +0,0 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -4,17 +4,13 @@ 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;
|
||||
@@ -45,16 +41,4 @@ 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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,6 +11,7 @@ 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;
|
||||
|
||||
@@ -27,12 +28,11 @@ public class AcrobaticsManager extends SkillManager {
|
||||
|
||||
public boolean canDodge(Entity damager) {
|
||||
if (Permissions.dodge(getPlayer())) {
|
||||
if (damager instanceof Player && SkillType.ACROBATICS.getPVPEnabled()) {
|
||||
return true;
|
||||
}
|
||||
else if (!(damager instanceof Player) && SkillType.ACROBATICS.getPVEEnabled() && !(damager instanceof LightningStrike && Acrobatics.dodgeLightningDisabled)) {
|
||||
return true;
|
||||
if (damager instanceof LightningStrike && Acrobatics.dodgeLightningDisabled) {
|
||||
return false;
|
||||
}
|
||||
|
||||
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(player, skill, Acrobatics.dodgeMaxChance, Acrobatics.dodgeMaxBonusLevel)) {
|
||||
if (!isFatal(modifiedDamage) && SkillUtils.activationSuccessful(getSkillLevel(), getActivationChance(), Acrobatics.dodgeMaxChance, Acrobatics.dodgeMaxBonusLevel)) {
|
||||
ParticleEffectUtils.playDodgeEffect(player);
|
||||
|
||||
if (mcMMOPlayer.useChatNotifications()) {
|
||||
|
||||
@@ -26,9 +26,7 @@ public class ArcheryManager extends SkillManager {
|
||||
}
|
||||
|
||||
public boolean canSkillShot() {
|
||||
Player player = getPlayer();
|
||||
|
||||
return SkillUtils.unlockLevelReached(player, skill, Archery.skillShotIncreaseLevel) && Permissions.bonusDamage(player, skill);
|
||||
return getSkillLevel() >= Archery.skillShotIncreaseLevel && Permissions.bonusDamage(getPlayer(), skill);
|
||||
}
|
||||
|
||||
public boolean canTrackArrows() {
|
||||
@@ -47,7 +45,7 @@ public class ArcheryManager extends SkillManager {
|
||||
Location shooterLocation = player.getLocation();
|
||||
Location targetLocation = target.getLocation();
|
||||
|
||||
if (!shooterLocation.getWorld().equals(targetLocation.getWorld())) {
|
||||
if (shooterLocation.getWorld() != targetLocation.getWorld()) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -64,7 +62,7 @@ public class ArcheryManager extends SkillManager {
|
||||
* @param target The {@link LivingEntity} damaged by the arrow
|
||||
*/
|
||||
public void trackArrows(LivingEntity target) {
|
||||
if (SkillUtils.activationSuccessful(getPlayer(), skill, Archery.retrieveMaxChance, Archery.retrieveMaxBonusLevel)) {
|
||||
if (SkillUtils.activationSuccessful(getSkillLevel(), getActivationChance(), Archery.retrieveMaxChance, Archery.retrieveMaxBonusLevel)) {
|
||||
Archery.incrementTrackerValue(target);
|
||||
}
|
||||
}
|
||||
@@ -72,14 +70,12 @@ public class ArcheryManager extends SkillManager {
|
||||
/**
|
||||
* Handle the effects of the Daze ability
|
||||
*
|
||||
* @param defender The player being affected by the ability
|
||||
* @param defender The {@link 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) {
|
||||
Player attacker = getPlayer();
|
||||
|
||||
if (SkillUtils.activationSuccessful(attacker, skill, Archery.dazeMaxBonus, Archery.dazeMaxBonusLevel)) {
|
||||
if (SkillUtils.activationSuccessful(getSkillLevel(), getActivationChance(), Archery.dazeMaxBonus, Archery.dazeMaxBonusLevel)) {
|
||||
Location dazedLocation = defender.getLocation();
|
||||
dazedLocation.setPitch(90 - Misc.getRandom().nextInt(181));
|
||||
|
||||
@@ -91,7 +87,7 @@ public class ArcheryManager extends SkillManager {
|
||||
}
|
||||
|
||||
if (mcMMOPlayer.useChatNotifications()) {
|
||||
attacker.sendMessage(LocaleLoader.getString("Combat.TargetDazed"));
|
||||
getPlayer().sendMessage(LocaleLoader.getString("Combat.TargetDazed"));
|
||||
}
|
||||
|
||||
return damage + Archery.dazeModifier;
|
||||
|
||||
@@ -6,10 +6,13 @@ 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;
|
||||
@@ -39,11 +42,11 @@ public class AxesManager extends SkillManager {
|
||||
}
|
||||
|
||||
public boolean canUseSkullSplitter(LivingEntity target) {
|
||||
return target.isValid() && getAbility().getMode() && Permissions.skullSplitter(getPlayer());
|
||||
return target.isValid() && mcMMOPlayer.getAbilityMode(AbilityType.SKULL_SPLITTER) && Permissions.skullSplitter(getPlayer());
|
||||
}
|
||||
|
||||
public boolean canActivateAbility() {
|
||||
return tool.getPreparationMode() && Permissions.skullSplitter(getPlayer());
|
||||
return mcMMOPlayer.getToolPreparationMode(ToolType.AXE) && Permissions.skullSplitter(getPlayer());
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -66,10 +69,8 @@ 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) {
|
||||
Player player = getPlayer();
|
||||
|
||||
if (SkillUtils.activationSuccessful(player, skill, Axes.criticalHitMaxChance, Axes.criticalHitMaxBonusLevel)) {
|
||||
player.sendMessage(LocaleLoader.getString("Axes.Combat.CriticalHit"));
|
||||
if (SkillUtils.activationSuccessful(getSkillLevel(), getActivationChance(), Axes.criticalHitMaxChance, Axes.criticalHitMaxBonusLevel)) {
|
||||
getPlayer().sendMessage(LocaleLoader.getString("Axes.Combat.CriticalHit"));
|
||||
|
||||
if (target instanceof Player) {
|
||||
((Player) target).sendMessage(LocaleLoader.getString("Axes.Combat.CritStruck"));
|
||||
@@ -92,10 +93,11 @@ public class AxesManager extends SkillManager {
|
||||
int durabilityDamage = 1 + (getSkillLevel() / Axes.impactIncreaseLevel);
|
||||
|
||||
for (ItemStack armor : target.getEquipment().getArmorContents()) {
|
||||
if (ItemUtils.isArmor(armor) && SkillUtils.activationSuccessful(getPlayer(), skill, Axes.impactChance)) {
|
||||
if (ItemUtils.isArmor(armor) && Axes.impactChance > Misc.getRandom().nextInt(getActivationChance())) {
|
||||
double durabilityModifier = 1 / (armor.getEnchantmentLevel(Enchantment.DURABILITY) + 1); // Modifier to simulate the durability enchantment behavior
|
||||
double modifiedDurabilityDamage = durabilityDamage * durabilityModifier;
|
||||
double maxDurabilityDamage = (ModUtils.isCustomArmor(armor) ? ModUtils.getArmorFromItemStack(armor).getDurability() : armor.getType().getMaxDurability()) * Axes.impactMaxDurabilityModifier;
|
||||
short maxDurability = ModUtils.isCustomArmor(armor) ? ModUtils.getArmorFromItemStack(armor).getDurability() : armor.getType().getMaxDurability();
|
||||
double maxDurabilityDamage = maxDurability * Axes.impactMaxDurabilityModifier;
|
||||
|
||||
armor.setDurability((short) (Math.min(modifiedDurabilityDamage, maxDurabilityDamage) + armor.getDurability()));
|
||||
}
|
||||
@@ -110,9 +112,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) {
|
||||
Player player = getPlayer();
|
||||
if (Axes.greaterImpactChance > Misc.getRandom().nextInt(getActivationChance())) {
|
||||
Player player = getPlayer();
|
||||
|
||||
if (SkillUtils.activationSuccessful(player, skill, Axes.greaterImpactChance)) {
|
||||
ParticleEffectUtils.playGreaterImpactEffect(target);
|
||||
target.setVelocity(player.getLocation().getDirection().normalize().multiply(Axes.greaterImpactKnockbackMultiplier));
|
||||
|
||||
|
||||
@@ -38,9 +38,7 @@ public class FishingManager extends SkillManager {
|
||||
}
|
||||
|
||||
public boolean canShake(Entity target) {
|
||||
Player player = getPlayer();
|
||||
|
||||
return target instanceof LivingEntity && SkillUtils.unlockLevelReached(player, skill, AdvancedConfig.getInstance().getShakeUnlockLevel()) && Permissions.shake(player);
|
||||
return target instanceof LivingEntity && getSkillLevel() >= AdvancedConfig.getInstance().getShakeUnlockLevel() && Permissions.shake(getPlayer());
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -136,7 +134,7 @@ public class FishingManager extends SkillManager {
|
||||
* @param mob The {@link LivingEntity} affected by the ability
|
||||
*/
|
||||
public void shakeCheck(LivingEntity target) {
|
||||
if (SkillUtils.activationSuccessful(getPlayer(), skill, getShakeProbability())) {
|
||||
if (getShakeProbability() > Misc.getRandom().nextInt(getActivationChance())) {
|
||||
Map<ItemStack, Integer> possibleDrops = new HashMap<ItemStack, Integer>();
|
||||
|
||||
Fishing.findPossibleDrops(target, possibleDrops);
|
||||
@@ -219,7 +217,7 @@ public class FishingManager extends SkillManager {
|
||||
FishingTreasure treasure = rewards.get(Misc.getRandom().nextInt(rewards.size()));
|
||||
ItemStack treasureDrop = treasure.getDrop();
|
||||
|
||||
if (!SkillUtils.treasureDropSuccessful(treasure.getDropChance(), skillLevel)) {
|
||||
if (!SkillUtils.treasureDropSuccessful(treasure.getDropChance(), activationChance)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
@@ -63,24 +63,20 @@ public class Herbalism {
|
||||
protected static int calculateCatciAndSugarDrops(BlockState blockState) {
|
||||
Block block = blockState.getBlock();
|
||||
Material blockType = blockState.getType();
|
||||
int dropAmount = 0;
|
||||
|
||||
// Handle the original block
|
||||
if (!mcMMO.placeStore.isTrue(blockState)) {
|
||||
dropAmount++;
|
||||
}
|
||||
int dropAmount = mcMMO.placeStore.isTrue(block) ? 0 : 1;
|
||||
|
||||
// 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 the first one is air, so is the next one
|
||||
if (relativeBlockType == Material.AIR) {
|
||||
if (relativeBlock.getType() != blockType) {
|
||||
break;
|
||||
}
|
||||
|
||||
if (relativeBlockType == blockType && !mcMMO.placeStore.isTrue(relativeBlock)) {
|
||||
if (mcMMO.placeStore.isTrue(relativeBlock)) {
|
||||
mcMMO.placeStore.setFalse(relativeBlock);
|
||||
}
|
||||
else {
|
||||
dropAmount++;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,26 +3,28 @@ package com.gmail.nossr50.skills.herbalism;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.CropState;
|
||||
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.herbalism.GreenTerraTimerTask;
|
||||
import com.gmail.nossr50.runnables.skills.herbalism.GreenThumbTimerTask;
|
||||
import com.gmail.nossr50.runnables.skills.HerbalismBlockUpdaterTask;
|
||||
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;
|
||||
@@ -52,21 +54,19 @@ public class HerbalismManager extends SkillManager {
|
||||
}
|
||||
|
||||
public boolean canUseHylianLuck() {
|
||||
Player player = getPlayer();
|
||||
|
||||
return ItemUtils.isSword(player.getItemInHand()) && Permissions.hylianLuck(player);
|
||||
return Permissions.hylianLuck(getPlayer());
|
||||
}
|
||||
|
||||
public boolean canGreenTerraBlock(BlockState blockState) {
|
||||
return getAbility().getMode() && BlockUtils.canMakeMossy(blockState);
|
||||
return mcMMOPlayer.getAbilityMode(AbilityType.GREEN_TERRA) && BlockUtils.canMakeMossy(blockState);
|
||||
}
|
||||
|
||||
public boolean canActivateAbility() {
|
||||
return tool.getPreparationMode() && Permissions.greenTerra(getPlayer());
|
||||
return mcMMOPlayer.getToolPreparationMode(ToolType.HOE) && Permissions.greenTerra(getPlayer());
|
||||
}
|
||||
|
||||
public boolean canGreenTerraPlant() {
|
||||
return getAbility().getMode();
|
||||
return mcMMOPlayer.getAbilityMode(AbilityType.GREEN_TERRA);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -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(), SkillType.HERBALISM, eventFoodLevel, Herbalism.farmersDietRankLevel1, Herbalism.farmersDietMaxLevel, rankChange);
|
||||
return SkillUtils.handleFoodSkills(getPlayer(), skill, eventFoodLevel, Herbalism.farmersDietRankLevel1, Herbalism.farmersDietMaxLevel, rankChange);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -108,65 +108,63 @@ 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) {
|
||||
Player player = getPlayer();
|
||||
Material blockType = blockState.getType();
|
||||
Material material = blockState.getType();
|
||||
boolean oneBlockPlant = (material == Material.CACTUS || material == Material.SUGAR_CANE_BLOCK) ? false : true;
|
||||
|
||||
HerbalismBlock herbalismBlock = HerbalismBlock.getHerbalismBlock(blockType);
|
||||
CustomBlock customBlock = null;
|
||||
if (oneBlockPlant && mcMMO.placeStore.isTrue(blockState)) {
|
||||
return;
|
||||
}
|
||||
|
||||
HerbalismBlock herbalismBlock = HerbalismBlock.getHerbalismBlock(material);
|
||||
ItemStack drop = null;
|
||||
int amount = 1;
|
||||
int xp = 0;
|
||||
int dropAmount = 1;
|
||||
ItemStack dropItem = null;
|
||||
boolean greenTerra = mcMMOPlayer.getAbilityMode(skill.getAbility());
|
||||
|
||||
if (herbalismBlock != null) {
|
||||
if (blockType == Material.CACTUS || blockType == Material.SUGAR_CANE_BLOCK) {
|
||||
dropItem = herbalismBlock.getDropItem();
|
||||
dropAmount = Herbalism.calculateCatciAndSugarDrops(blockState);
|
||||
xp = herbalismBlock.getXpGain() * dropAmount;
|
||||
if (herbalismBlock.hasGreenThumbPermission(getPlayer())) {
|
||||
processGreenThumbPlants(blockState, greenTerra);
|
||||
}
|
||||
else if (herbalismBlock.hasGreenThumbPermission(player)) {
|
||||
dropItem = herbalismBlock.getDropItem();
|
||||
xp = herbalismBlock.getXpGain();
|
||||
processGreenThumbPlants(blockState);
|
||||
|
||||
xp = herbalismBlock.getXpGain();
|
||||
|
||||
if (herbalismBlock.canDoubleDrop() && Permissions.doubleDrops(getPlayer(), skill)) {
|
||||
drop = herbalismBlock.getDropItem();
|
||||
}
|
||||
else {
|
||||
if (!mcMMO.placeStore.isTrue(blockState)) {
|
||||
dropItem = herbalismBlock.getDropItem();
|
||||
xp = herbalismBlock.getXpGain();
|
||||
}
|
||||
|
||||
if (!oneBlockPlant) {
|
||||
amount = Herbalism.calculateCatciAndSugarDrops(blockState);
|
||||
xp *= amount;
|
||||
}
|
||||
}
|
||||
else {
|
||||
customBlock = ModUtils.getCustomBlock(blockState);
|
||||
dropItem = customBlock.getItemDrop();
|
||||
CustomBlock customBlock = ModUtils.getCustomBlock(blockState);
|
||||
xp = customBlock.getXpGain();
|
||||
}
|
||||
|
||||
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) {
|
||||
if (Permissions.doubleDrops(getPlayer(), skill)) {
|
||||
int minimumDropAmount = customBlock.getMinimumDropAmount();
|
||||
int maximumDropAmount = customBlock.getMaximumDropAmount();
|
||||
|
||||
if (minimumDropAmount != maximumDropAmount) {
|
||||
Misc.randomDropItems(location, dropItem, maximumDropAmount - minimumDropAmount);
|
||||
}
|
||||
|
||||
Misc.dropItems(location, dropItem, minimumDropAmount);
|
||||
drop = customBlock.getItemDrop();
|
||||
amount = Misc.getRandom().nextInt(maximumDropAmount - minimumDropAmount + 1) + 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -176,10 +174,8 @@ public class HerbalismManager extends SkillManager {
|
||||
* @return true if the ability was successful, false otherwise
|
||||
*/
|
||||
public boolean processGreenThumbBlocks(BlockState blockState) {
|
||||
Player player = getPlayer();
|
||||
|
||||
if (!SkillUtils.activationSuccessful(player, skill, Herbalism.greenThumbMaxChance, Herbalism.greenThumbMaxLevel)) {
|
||||
player.sendMessage(LocaleLoader.getString("Herbalism.Ability.GTh.Fail"));
|
||||
if (!SkillUtils.activationSuccessful(getSkillLevel(), getActivationChance(), Herbalism.greenThumbMaxChance, Herbalism.greenThumbMaxLevel)) {
|
||||
getPlayer().sendMessage(LocaleLoader.getString("Herbalism.Ability.GTh.Fail"));
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -193,9 +189,7 @@ public class HerbalismManager extends SkillManager {
|
||||
* @return true if the ability was successful, false otherwise
|
||||
*/
|
||||
public boolean processHylianLuck(BlockState blockState) {
|
||||
Player player = getPlayer();
|
||||
|
||||
if (!SkillUtils.activationSuccessful(player, skill, Herbalism.hylianLuckMaxChance, Herbalism.hylianLuckMaxLevel)) {
|
||||
if (!SkillUtils.activationSuccessful(getSkillLevel(), getActivationChance(), Herbalism.hylianLuckMaxChance, Herbalism.hylianLuckMaxLevel)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -234,7 +228,7 @@ public class HerbalismManager extends SkillManager {
|
||||
blockState.setType(Material.AIR);
|
||||
|
||||
Misc.dropItem(blockState.getLocation(), treasures.get(Misc.getRandom().nextInt(treasures.size())).getDrop());
|
||||
player.sendMessage(LocaleLoader.getString("Herbalism.HylianLuck"));
|
||||
getPlayer().sendMessage(LocaleLoader.getString("Herbalism.HylianLuck"));
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -262,7 +256,7 @@ public class HerbalismManager extends SkillManager {
|
||||
playerInventory.removeItem(new ItemStack(Material.RED_MUSHROOM));
|
||||
player.updateInventory();
|
||||
|
||||
if (!SkillUtils.activationSuccessful(player, skill, Herbalism.shroomThumbMaxChance, Herbalism.shroomThumbMaxLevel)) {
|
||||
if (!SkillUtils.activationSuccessful(getSkillLevel(), getActivationChance(), Herbalism.shroomThumbMaxChance, Herbalism.shroomThumbMaxLevel)) {
|
||||
player.sendMessage(LocaleLoader.getString("Herbalism.Ability.ShroomThumb.Fail"));
|
||||
return false;
|
||||
}
|
||||
@@ -274,29 +268,82 @@ 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) {
|
||||
private void processGreenThumbPlants(BlockState blockState, boolean greenTerra) {
|
||||
Player player = getPlayer();
|
||||
PlayerInventory playerInventory = player.getInventory();
|
||||
ItemStack seed = HerbalismBlock.getHerbalismBlock(blockState.getType()).getDropItem();
|
||||
ItemStack seed = (blockState.getType() == Material.CROPS) ? new ItemStack(Material.SEEDS) : HerbalismBlock.getHerbalismBlock(blockState.getType()).getDropItem();
|
||||
|
||||
if (!playerInventory.containsAtLeast(seed, 1)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (getAbility().getMode()) {
|
||||
playerInventory.removeItem(seed);
|
||||
player.updateInventory(); // Needed until replacement available
|
||||
|
||||
mcMMO.p.getServer().getScheduler().scheduleSyncDelayedTask(mcMMO.p, new GreenTerraTimerTask(blockState), 0);
|
||||
if (!greenTerra && !SkillUtils.activationSuccessful(getSkillLevel(), getActivationChance(), Herbalism.greenThumbMaxChance, Herbalism.greenThumbMaxLevel)) {
|
||||
return;
|
||||
}
|
||||
else if (SkillUtils.activationSuccessful(player, skill, Herbalism.greenThumbMaxChance, Herbalism.greenThumbMaxLevel)) {
|
||||
playerInventory.removeItem(seed);
|
||||
player.updateInventory(); // Needed until replacement available
|
||||
|
||||
mcMMO.p.getServer().getScheduler().scheduleSyncDelayedTask(mcMMO.p, new GreenThumbTimerTask(blockState, getSkillLevel()), 0);
|
||||
if (!handleBlockState(blockState, greenTerra)) {
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -43,10 +43,6 @@ 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:
|
||||
@@ -76,7 +72,7 @@ public class Mining {
|
||||
|
||||
default:
|
||||
if (ModUtils.isCustomMiningBlock(blockState)) {
|
||||
Misc.dropItem(blockState.getLocation(), blockState.getData().toItemStack());
|
||||
Misc.dropItem(blockState.getLocation(), blockState.getData().toItemStack(1));
|
||||
}
|
||||
return;
|
||||
}
|
||||
@@ -89,13 +85,7 @@ 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:
|
||||
@@ -130,7 +120,7 @@ public class Mining {
|
||||
int minimumDropAmount = customBlock.getMinimumDropAmount();
|
||||
int maximumDropAmount = customBlock.getMaximumDropAmount();
|
||||
|
||||
dropItem = customBlock.getItemDrop();
|
||||
ItemStack dropItem = customBlock.getItemDrop();
|
||||
|
||||
if (minimumDropAmount != maximumDropAmount) {
|
||||
Misc.dropItems(location, dropItem, minimumDropAmount);
|
||||
|
||||
@@ -12,6 +12,7 @@ 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;
|
||||
@@ -30,47 +31,55 @@ public class MiningManager extends SkillManager{
|
||||
}
|
||||
|
||||
public boolean canUseDemolitionsExpertise() {
|
||||
Player player = getPlayer();
|
||||
|
||||
return SkillUtils.unlockLevelReached(player, skill, BlastMining.Tier.FOUR.getLevel()) && Permissions.demolitionsExpertise(player);
|
||||
return getSkillLevel() >= BlastMining.Tier.FOUR.getLevel() && Permissions.demolitionsExpertise(getPlayer());
|
||||
}
|
||||
|
||||
public boolean canDetonate() {
|
||||
Player player = getPlayer();
|
||||
|
||||
return player.isSneaking() && player.getItemInHand().getTypeId() == BlastMining.detonatorID && Permissions.remoteDetonation(player) && SkillUtils.unlockLevelReached(player, skill, BlastMining.Tier.ONE.getLevel());
|
||||
return canUseBlastMining() && player.isSneaking() && player.getItemInHand().getTypeId() == BlastMining.detonatorID && Permissions.remoteDetonation(player);
|
||||
}
|
||||
|
||||
public boolean canUseBlastMining() {
|
||||
return SkillUtils.unlockLevelReached(getPlayer(), skill, BlastMining.Tier.ONE.getLevel());
|
||||
return getSkillLevel() >= BlastMining.Tier.ONE.getLevel();
|
||||
}
|
||||
|
||||
public boolean canUseBiggerBombs() {
|
||||
Player player = getPlayer();
|
||||
|
||||
return Permissions.biggerBombs(player) && SkillUtils.unlockLevelReached(getPlayer(), skill, BlastMining.Tier.TWO.getLevel());
|
||||
return getSkillLevel() >= BlastMining.Tier.TWO.getLevel() && Permissions.biggerBombs(getPlayer());
|
||||
}
|
||||
|
||||
/**
|
||||
* 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);
|
||||
|
||||
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(Mining.getBlockXp(blockState));
|
||||
|
||||
if (Permissions.doubleDrops(player, skill)) {
|
||||
return;
|
||||
}
|
||||
|
||||
applyXpGain(xp);
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -97,7 +106,7 @@ public class MiningManager extends SkillManager{
|
||||
targetBlock.setType(Material.AIR);
|
||||
|
||||
getProfile().setSkillDATS(AbilityType.BLAST_MINING, System.currentTimeMillis());
|
||||
getAbility().setInformed(false);
|
||||
mcMMOPlayer.setAbilityInformed(AbilityType.BLAST_MINING, false);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -133,11 +142,10 @@ public class MiningManager extends SkillManager{
|
||||
xp += Mining.getBlockXp(blockState);
|
||||
}
|
||||
|
||||
Misc.dropItem(blockState.getLocation(), blockState.getData().toItemStack()); // Initial block that would have been dropped
|
||||
Misc.dropItem(blockState.getLocation(), blockState.getData().toItemStack(1)); // 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
|
||||
}
|
||||
}
|
||||
@@ -147,7 +155,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());
|
||||
Misc.dropItem(blockState.getLocation(), blockState.getData().toItemStack(1));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -165,7 +173,7 @@ public class MiningManager extends SkillManager{
|
||||
}
|
||||
|
||||
public int processDemolitionsExpertise(int damage) {
|
||||
return (int) (damage * (100.0 - getBlastDamageModifier()));
|
||||
return (int) (damage * ((100.0D - getBlastDamageModifier()) / 100.0D));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1,29 +1,49 @@
|
||||
package com.gmail.nossr50.skills.repair;
|
||||
|
||||
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 org.bukkit.inventory.PlayerInventory;
|
||||
|
||||
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.Misc;
|
||||
import com.gmail.nossr50.util.Permissions;
|
||||
import com.gmail.nossr50.util.player.UserManager;
|
||||
import com.gmail.nossr50.util.skills.PerksUtils;
|
||||
import com.gmail.nossr50.util.ItemUtils;
|
||||
|
||||
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();
|
||||
|
||||
@@ -33,248 +53,164 @@ public class Repair {
|
||||
public static boolean arcaneForgingDowngrades = AdvancedConfig.getInstance().getArcaneForgingDowngradeEnabled();
|
||||
public static boolean arcaneForgingEnchantLoss = AdvancedConfig.getInstance().getArcaneForgingEnchantLossEnabled();
|
||||
|
||||
public static int anvilID = Config.getInstance().getRepairAnvilId();
|
||||
public static int salvageUnlockLevel = AdvancedConfig.getInstance().getSalvageUnlockLevel();
|
||||
|
||||
public static int salvageAnvilId = Config.getInstance().getSalvageAnvilId();
|
||||
public static int repairAnvilId = Config.getInstance().getRepairAnvilId();
|
||||
public static boolean anvilMessagesEnabled = Config.getInstance().getRepairAnvilMessagesEnabled();
|
||||
|
||||
/**
|
||||
* Get current Arcane Forging rank.
|
||||
* Checks if the item is salvageable.
|
||||
*
|
||||
* @param profile The PlayerProfile of the player to get the rank for
|
||||
* @return The player's current Arcane Forging rank
|
||||
* @param item Item to check
|
||||
* @return true if the item is salvageable, false otherwise
|
||||
*/
|
||||
public static int getArcaneForgingRank(PlayerProfile profile) {
|
||||
int skillLevel = profile.getSkillLevel(SkillType.REPAIR);
|
||||
|
||||
if (skillLevel >= AdvancedConfig.getInstance().getArcaneForgingRankLevels4()) {
|
||||
return 4;
|
||||
public static boolean isSalvageable(ItemStack item) {
|
||||
if (Config.getInstance().getSalvageTools() && (ItemUtils.isMinecraftTool(item) || ItemUtils.isStringTool(item) || item.getType() == Material.BUCKET)) {
|
||||
return true;
|
||||
}
|
||||
else if (skillLevel >= AdvancedConfig.getInstance().getArcaneForgingRankLevels3()) {
|
||||
|
||||
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) {
|
||||
return 3;
|
||||
}
|
||||
else if (skillLevel >= AdvancedConfig.getInstance().getArcaneForgingRankLevels2()) {
|
||||
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 (skillLevel >= AdvancedConfig.getInstance().getArcaneForgingRankLevels1()) {
|
||||
return 1;
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,55 +1,350 @@
|
||||
package com.gmail.nossr50.skills.repair;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
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 interface RepairManager {
|
||||
/**
|
||||
* Register a repairable with the RepairManager
|
||||
*
|
||||
* @param repairable Repairable to register
|
||||
*/
|
||||
public void registerRepairable(Repairable repairable);
|
||||
public class RepairManager extends SkillManager {
|
||||
public RepairManager(McMMOPlayer mcMMOPlayer) {
|
||||
super(mcMMOPlayer, SkillType.REPAIR);
|
||||
}
|
||||
|
||||
/**
|
||||
* Register a list of repairables with the RepairManager
|
||||
* Handles notifications for placing an anvil.
|
||||
*
|
||||
* @param repairables List<Repairable> to register
|
||||
* @param anvilID The item ID of the anvil block
|
||||
*/
|
||||
public void registerRepairables(List<Repairable> repairables);
|
||||
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"));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if an item is repairable
|
||||
* Gets the Arcane Forging rank
|
||||
*
|
||||
* @param itemId id to check if repairable
|
||||
* @return true if repairable, false if not
|
||||
* @return the current Arcane Forging rank
|
||||
*/
|
||||
public boolean isRepairable(int itemId);
|
||||
public int getArcaneForgingRank() {
|
||||
int skillLevel = getSkillLevel();
|
||||
|
||||
for (Tier tier : Tier.values()) {
|
||||
if (skillLevel >= tier.getLevel()) {
|
||||
return tier.toNumerical();
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if an item is repairable
|
||||
* Gets chance of keeping enchantment during repair.
|
||||
*
|
||||
* @param itemStack Item to check if repairable
|
||||
* @return true if repairable, false if not
|
||||
* @return The chance of keeping the enchantment
|
||||
*/
|
||||
public boolean isRepairable(ItemStack itemStack);
|
||||
public int getKeepEnchantChance() {
|
||||
int skillLevel = getSkillLevel();
|
||||
|
||||
for (Tier tier : Tier.values()) {
|
||||
if (skillLevel >= tier.getLevel()) {
|
||||
return tier.getKeepEnchantChance();
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the repairable with this id
|
||||
* Gets chance of enchantment being downgraded during repair.
|
||||
*
|
||||
* @param id Id of the repairable to look for
|
||||
* @return the repairable, can be null
|
||||
* @return The chance of the enchantment being downgraded
|
||||
*/
|
||||
public Repairable getRepairable(int id);
|
||||
public int getDowngradeEnchantChance() {
|
||||
int skillLevel = getSkillLevel();
|
||||
|
||||
for (Tier tier : Tier.values()) {
|
||||
if (skillLevel >= tier.getLevel()) {
|
||||
return tier.getDowngradeEnchantChance();
|
||||
}
|
||||
}
|
||||
|
||||
return 100;
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle the repairing of this object
|
||||
* Computes repair bonuses.
|
||||
*
|
||||
* @param mcMMOPlayer Player that is repairing an item
|
||||
* @param item ItemStack that is being repaired
|
||||
* @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
|
||||
*/
|
||||
public void handleRepair(McMMOPlayer mcMMOPlayer, ItemStack item);
|
||||
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"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,13 +0,0 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
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);
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
@@ -1,152 +0,0 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,214 +0,0 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
@@ -3,7 +3,6 @@ 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;
|
||||
@@ -16,7 +15,6 @@ 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;
|
||||
@@ -27,16 +25,11 @@ public class SmeltingManager extends SkillManager {
|
||||
}
|
||||
|
||||
public boolean canUseFluxMining(BlockState 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);
|
||||
return getSkillLevel() >= Smelting.fluxMiningUnlockLevel && BlockUtils.affectedByFluxMining(blockState) && Permissions.fluxMining(getPlayer()) && !mcMMO.placeStore.isTrue(blockState);
|
||||
}
|
||||
|
||||
public boolean canUseVanillaXpBoost() {
|
||||
Player player = getPlayer();
|
||||
|
||||
return SkillUtils.unlockLevelReached(player, skill, Smelting.Tier.ONE.getLevel()) && Permissions.vanillaXpBoost(player, skill);
|
||||
return getSkillLevel() >= Smelting.Tier.ONE.getLevel() && Permissions.vanillaXpBoost(getPlayer(), skill);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -48,7 +41,7 @@ public class SmeltingManager extends SkillManager {
|
||||
public boolean processFluxMining(BlockState blockState) {
|
||||
Player player = getPlayer();
|
||||
|
||||
if (SkillUtils.unlockLevelReached(player, skill, Smelting.fluxMiningUnlockLevel) && SkillUtils.activationSuccessful(player, skill, Smelting.fluxMiningChance)) {
|
||||
if (Smelting.fluxMiningChance > Misc.getRandom().nextInt(getActivationChance())) {
|
||||
ItemStack item = null;
|
||||
|
||||
switch (blockState.getType()) {
|
||||
@@ -72,7 +65,7 @@ public class SmeltingManager extends SkillManager {
|
||||
|
||||
Misc.dropItem(location, item);
|
||||
|
||||
if (Permissions.doubleDrops(player, skill) && SkillUtils.activationSuccessful(player, skill, Mining.doubleDropsMaxChance, Mining.doubleDropsMaxLevel)) {
|
||||
if (Permissions.doubleDrops(player, skill) && SkillUtils.activationSuccessful(getSkillLevel(), getActivationChance(), Mining.doubleDropsMaxChance, Mining.doubleDropsMaxLevel)) {
|
||||
Misc.dropItem(location, item);
|
||||
}
|
||||
|
||||
@@ -101,7 +94,7 @@ public class SmeltingManager extends SkillManager {
|
||||
|
||||
applyXpGain(Smelting.getResourceXp(resourceType));
|
||||
|
||||
if (Permissions.doubleDrops(player, skill) && SkillUtils.activationSuccessful(player, skill, Smelting.secondSmeltMaxChance, Smelting.secondSmeltMaxLevel)) {
|
||||
if (Permissions.doubleDrops(player, skill) && SkillUtils.activationSuccessful(getSkillLevel(), getActivationChance(), Smelting.secondSmeltMaxChance, Smelting.secondSmeltMaxLevel)) {
|
||||
ItemStack newResult = new ItemStack(result.getType(), result.getAmount() + 1);
|
||||
return newResult;
|
||||
}
|
||||
|
||||
@@ -1,10 +1,13 @@
|
||||
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;
|
||||
@@ -19,15 +22,19 @@ public class SwordsManager extends SkillManager {
|
||||
}
|
||||
|
||||
public boolean canActivateAbility() {
|
||||
return tool.getPreparationMode() && Permissions.serratedStrikes(getPlayer());
|
||||
return mcMMOPlayer.getToolPreparationMode(ToolType.SWORD) && 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 getAbility().getMode() && Permissions.serratedStrikes(getPlayer());
|
||||
return mcMMOPlayer.getAbilityMode(AbilityType.SERRATED_STRIKES) && Permissions.serratedStrikes(getPlayer());
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -36,9 +43,7 @@ public class SwordsManager extends SkillManager {
|
||||
* @param target The defending entity
|
||||
*/
|
||||
public void bleedCheck(LivingEntity target) {
|
||||
Player player = getPlayer();
|
||||
|
||||
if (SkillUtils.activationSuccessful(player, skill, Swords.bleedMaxChance, Swords.bleedMaxBonusLevel)) {
|
||||
if (SkillUtils.activationSuccessful(getSkillLevel(), getActivationChance(), Swords.bleedMaxChance, Swords.bleedMaxBonusLevel)) {
|
||||
|
||||
if (getSkillLevel() >= Swords.bleedMaxBonusLevel) {
|
||||
BleedTimerTask.add(target, Swords.bleedMaxTicks);
|
||||
@@ -48,7 +53,7 @@ public class SwordsManager extends SkillManager {
|
||||
}
|
||||
|
||||
if (mcMMOPlayer.useChatNotifications()) {
|
||||
player.sendMessage(LocaleLoader.getString("Swords.Combat.Bleeding"));
|
||||
getPlayer().sendMessage(LocaleLoader.getString("Swords.Combat.Bleeding"));
|
||||
}
|
||||
|
||||
if (target instanceof Player) {
|
||||
@@ -62,7 +67,7 @@ public class SwordsManager extends SkillManager {
|
||||
}
|
||||
|
||||
public void counterAttackChecks(LivingEntity attacker, int damage) {
|
||||
if (SkillUtils.activationSuccessful(getPlayer(), skill, Swords.counterAttackMaxChance, Swords.counterAttackMaxBonusLevel)) {
|
||||
if (SkillUtils.activationSuccessful(getSkillLevel(), getActivationChance(), Swords.counterAttackMaxChance, Swords.counterAttackMaxBonusLevel)) {
|
||||
CombatUtils.dealDamage(attacker, damage / Swords.counterAttackModifier);
|
||||
|
||||
getPlayer().sendMessage(LocaleLoader.getString("Swords.Combat.Countered"));
|
||||
|
||||
@@ -27,23 +27,35 @@ 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 canUseBeastLore(LivingEntity target) {
|
||||
return target instanceof Tameable && Permissions.beastLore(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());
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -73,7 +85,7 @@ public class TamingManager extends SkillManager {
|
||||
* @param damage The damage being absorbed by the wolf
|
||||
*/
|
||||
public void fastFoodService(Wolf wolf, int damage) {
|
||||
if (SkillUtils.activationSuccessful(getPlayer(), skill, Taming.fastFoodServiceActivationChance)) {
|
||||
if (Taming.fastFoodServiceActivationChance > Misc.getRandom().nextInt(getActivationChance())) {
|
||||
|
||||
int health = wolf.getHealth();
|
||||
int maxHealth = wolf.getMaxHealth();
|
||||
@@ -91,16 +103,14 @@ public class TamingManager extends SkillManager {
|
||||
* @param event The event to modify
|
||||
*/
|
||||
public int gore(LivingEntity target, int damage) {
|
||||
Player owner = getPlayer();
|
||||
|
||||
if (SkillUtils.activationSuccessful(owner, skill, Taming.goreMaxChance, Taming.goreMaxBonusLevel)) {
|
||||
if (SkillUtils.activationSuccessful(getSkillLevel(), getActivationChance(), Taming.goreMaxChance, Taming.goreMaxBonusLevel)) {
|
||||
BleedTimerTask.add(target, Taming.goreBleedTicks);
|
||||
|
||||
if (target instanceof Player) {
|
||||
((Player) target).sendMessage(LocaleLoader.getString("Combat.StruckByGore"));
|
||||
}
|
||||
|
||||
owner.sendMessage(LocaleLoader.getString("Combat.Gore"));
|
||||
getPlayer().sendMessage(LocaleLoader.getString("Combat.Gore"));
|
||||
return damage * Taming.goreModifier;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,12 +1,7 @@
|
||||
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();
|
||||
@@ -24,23 +19,4 @@ 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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,13 +1,16 @@
|
||||
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;
|
||||
@@ -21,7 +24,7 @@ public class UnarmedManager extends SkillManager {
|
||||
}
|
||||
|
||||
public boolean canActivateAbility() {
|
||||
return tool.getPreparationMode() && Permissions.berserk(getPlayer());
|
||||
return mcMMOPlayer.getToolPreparationMode(ToolType.FISTS) && Permissions.berserk(getPlayer());
|
||||
}
|
||||
|
||||
public boolean canUseIronArm() {
|
||||
@@ -29,20 +32,45 @@ public class UnarmedManager extends SkillManager {
|
||||
}
|
||||
|
||||
public boolean canUseBerserk() {
|
||||
return getAbility().getMode() && Permissions.berserk(getPlayer());
|
||||
return mcMMOPlayer.getAbilityMode(AbilityType.BERSERK) && 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(getPlayer(), skill, Unarmed.disarmMaxChance, Unarmed.disarmMaxBonusLevel) && !hasIronGrip(defender)) {
|
||||
if (SkillUtils.activationSuccessful(getSkillLevel(), getActivationChance(), Unarmed.disarmMaxChance, Unarmed.disarmMaxBonusLevel) && !hasIronGrip(defender)) {
|
||||
McMMOPlayerDisarmEvent disarmEvent = new McMMOPlayerDisarmEvent(defender);
|
||||
mcMMO.p.getServer().getPluginManager().callEvent(disarmEvent);
|
||||
|
||||
@@ -59,10 +87,8 @@ public class UnarmedManager extends SkillManager {
|
||||
* Check for arrow deflection.
|
||||
*/
|
||||
public boolean deflectCheck() {
|
||||
Player player = getPlayer();
|
||||
|
||||
if (SkillUtils.activationSuccessful(player, skill, Unarmed.deflectMaxChance, Unarmed.deflectMaxBonusLevel)) {
|
||||
player.sendMessage(LocaleLoader.getString("Combat.ArrowDeflect"));
|
||||
if (SkillUtils.activationSuccessful(getSkillLevel(), getActivationChance(), Unarmed.deflectMaxChance, Unarmed.deflectMaxBonusLevel)) {
|
||||
getPlayer().sendMessage(LocaleLoader.getString("Combat.ArrowDeflect"));
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,276 +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.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);
|
||||
}
|
||||
}
|
||||
@@ -1,10 +1,12 @@
|
||||
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.entity.Player;
|
||||
import org.bukkit.enchantments.Enchantment;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.material.Tree;
|
||||
|
||||
@@ -12,18 +14,17 @@ 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.datatypes.skills.SkillType;
|
||||
import com.gmail.nossr50.events.fake.FakePlayerAnimationEvent;
|
||||
import com.gmail.nossr50.util.BlockUtils;
|
||||
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,
|
||||
@@ -31,47 +32,6 @@ 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
|
||||
*
|
||||
@@ -126,11 +86,7 @@ public final class Woodcutting {
|
||||
* @param mcMMOPlayer Player breaking the block
|
||||
* @param blockState Block being broken
|
||||
*/
|
||||
protected static void checkForDoubleDrop(Player player, BlockState blockState) {
|
||||
if (!SkillUtils.activationSuccessful(player, SkillType.WOODCUTTING, doubleDropsMaxChance, doubleDropsMaxLevel)) {
|
||||
return;
|
||||
}
|
||||
|
||||
protected static void checkForDoubleDrop(BlockState blockState) {
|
||||
if (ModUtils.isCustomLogBlock(blockState)) {
|
||||
CustomBlock customBlock = ModUtils.getCustomBlock(blockState);
|
||||
int minimumDropAmount = customBlock.getMinimumDropAmount();
|
||||
@@ -179,4 +135,130 @@ 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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,192 @@
|
||||
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);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,14 +1,23 @@
|
||||
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.block.Block;
|
||||
import org.bukkit.Sound;
|
||||
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 {
|
||||
@@ -22,42 +31,85 @@ public final class ChimaeraWing {
|
||||
public static void activationCheck(Player player) {
|
||||
ItemStack inHand = player.getItemInHand();
|
||||
|
||||
if (!Config.getInstance().getChimaeraEnabled() || inHand.getTypeId() != Config.getInstance().getChimaeraItemId()) {
|
||||
if (!Config.getInstance().getChimaeraEnabled() || !ItemUtils.isChimaeraWing(inHand)) {
|
||||
return;
|
||||
}
|
||||
|
||||
Block block = player.getLocation().getBlock();
|
||||
Location location = player.getLocation();
|
||||
int amount = inHand.getAmount();
|
||||
long recentlyHurt = UserManager.getPlayer(player).getRecentlyHurt() * Misc.TIME_CONVERSION_FACTOR;
|
||||
long recentlyHurt = UserManager.getPlayer(player).getRecentlyHurt();
|
||||
long lastChimaeraWing = (UserManager.getPlayer(player).getLastChimaeraTeleport());
|
||||
|
||||
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 (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;
|
||||
}
|
||||
|
||||
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 (!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;
|
||||
}
|
||||
}
|
||||
|
||||
if (player.getBedSpawnLocation() != null) {
|
||||
player.teleport(player.getBedSpawnLocation());
|
||||
if (player.getBedSpawnLocation() != null) {
|
||||
player.teleport(player.getBedSpawnLocation());
|
||||
}
|
||||
else {
|
||||
Location spawnLocation = player.getWorld().getSpawnLocation();
|
||||
if (spawnLocation.getBlock().getType() == Material.AIR) {
|
||||
player.teleport(spawnLocation);
|
||||
}
|
||||
else {
|
||||
player.teleport(player.getWorld().getSpawnLocation());
|
||||
player.teleport(player.getWorld().getHighestBlockAt(spawnLocation).getLocation());
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,7 +12,6 @@ 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;
|
||||
@@ -98,7 +97,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;
|
||||
Bukkit.getScheduler().scheduleSyncDelayedTask(mcMMO.p, new Runnable() {
|
||||
mcMMO.p.getServer().getScheduler().scheduleSyncDelayedTask(mcMMO.p, new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
spawnFireworks((Player) sender);
|
||||
|
||||
@@ -1,8 +1,12 @@
|
||||
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;
|
||||
@@ -264,7 +268,7 @@ public class ItemUtils {
|
||||
* @return true if the item is armor, false otherwise
|
||||
*/
|
||||
public static boolean isMinecraftArmor(ItemStack is) {
|
||||
return isDiamondArmor(is) || isGoldArmor(is) || isIronArmor(is) || isDiamondArmor(is);
|
||||
return isLeatherArmor(is) || isGoldArmor(is) || isIronArmor(is) || isDiamondArmor(is);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -644,4 +648,32 @@ 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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,6 +26,8 @@ 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() {};
|
||||
|
||||
@@ -77,7 +79,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().equals(second.getWorld())) {
|
||||
if (first.getWorld() != second.getWorld()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@@ -52,7 +52,7 @@ public final class ModUtils {
|
||||
*/
|
||||
public static CustomBlock getCustomBlock(BlockState blockState) {
|
||||
if (customBlocksEnabled) {
|
||||
ItemStack item = blockState.getData().toItemStack();
|
||||
ItemStack item = blockState.getData().toItemStack(1);
|
||||
|
||||
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();
|
||||
ItemStack item = blockState.getData().toItemStack(1);
|
||||
|
||||
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();
|
||||
ItemStack item = blockState.getData().toItemStack(1);
|
||||
|
||||
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();
|
||||
ItemStack item = blockState.getData().toItemStack(1);
|
||||
|
||||
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();
|
||||
ItemStack item = blockState.getData().toItemStack(1);
|
||||
|
||||
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();
|
||||
ItemStack item = blockState.getData().toItemStack(1);
|
||||
|
||||
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();
|
||||
ItemStack item = blockState.getData().toItemStack(1);
|
||||
|
||||
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();
|
||||
ItemStack item = blockState.getData().toItemStack(1);
|
||||
|
||||
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();
|
||||
ItemStack item = blockState.getData().toItemStack(1);
|
||||
|
||||
if (CustomBlockConfig.getInstance().customOres.contains(item)) {
|
||||
for (CustomBlock block : CustomBlockConfig.getInstance().customBlocks) {
|
||||
|
||||
@@ -231,8 +231,6 @@ 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) {
|
||||
|
||||
@@ -43,12 +43,18 @@ 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 = Integer.parseInt(oldTokens[i]);
|
||||
Integer oldVer;
|
||||
try {
|
||||
oldVer = Integer.parseInt(oldTokens[i]);
|
||||
}
|
||||
catch (NumberFormatException e) {
|
||||
oldVer = 0;
|
||||
}
|
||||
if (oldVer < newVer) {
|
||||
isr.close();
|
||||
return true;
|
||||
|
||||
@@ -11,10 +11,11 @@ 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>();
|
||||
|
||||
@@ -168,7 +169,7 @@ public class HashChunkletManager implements ChunkletManager {
|
||||
|
||||
@Override
|
||||
public void saveAll() {
|
||||
for (World world : Bukkit.getWorlds()) {
|
||||
for (World world : mcMMO.p.getServer().getWorlds()) {
|
||||
saveWorld(world);
|
||||
}
|
||||
}
|
||||
@@ -176,7 +177,7 @@ public class HashChunkletManager implements ChunkletManager {
|
||||
@Override
|
||||
public void unloadAll() {
|
||||
saveAll();
|
||||
for (World world : Bukkit.getWorlds()) {
|
||||
for (World world : mcMMO.p.getServer().getWorlds()) {
|
||||
unloadWorld(world);
|
||||
}
|
||||
}
|
||||
@@ -276,7 +277,7 @@ public class HashChunkletManager implements ChunkletManager {
|
||||
for (String key : store.keySet()) {
|
||||
if (store.get(key).isEmpty()) {
|
||||
String[] info = key.split(",");
|
||||
File dataDir = new File(Bukkit.getWorld(info[0]).getWorldFolder(), "mcmmo_data");
|
||||
File dataDir = new File(mcMMO.p.getServer().getWorld(info[0]).getWorldFolder(), "mcmmo_data");
|
||||
|
||||
File cxDir = new File(dataDir, "" + info[1]);
|
||||
if (!cxDir.exists()) {
|
||||
|
||||
@@ -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 : Bukkit.getWorlds()) {
|
||||
for (World world : mcMMO.p.getServer().getWorlds()) {
|
||||
saveWorld(world);
|
||||
}
|
||||
}
|
||||
@@ -292,7 +292,7 @@ public class HashChunkManager implements ChunkManager {
|
||||
public synchronized void unloadAll() {
|
||||
closeAll();
|
||||
|
||||
for (World world : Bukkit.getWorlds()) {
|
||||
for (World world : mcMMO.p.getServer().getWorlds()) {
|
||||
unloadWorld(world);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -55,21 +55,26 @@ 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 && Permissions.beastLore(player)) {
|
||||
mcMMOPlayer.getTamingManager().beastLore(target);
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
if (heldItem.getType() == Material.BONE) {
|
||||
TamingManager tamingManager = mcMMOPlayer.getTamingManager();
|
||||
|
||||
if (tamingManager.canUseBeastLore()) {
|
||||
tamingManager.beastLore(target);
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
}
|
||||
else if (isFriendlyPet(player, (Tameable) target)) {
|
||||
|
||||
if (isFriendlyPet(player, (Tameable) target)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -94,7 +99,7 @@ public final class CombatUtils {
|
||||
swordsManager.serratedStrikes(target, event.getDamage());
|
||||
}
|
||||
|
||||
startGainXp(swordsManager.getMcMMOPlayer(), target, SkillType.SWORDS);
|
||||
startGainXp(mcMMOPlayer, target, SkillType.SWORDS);
|
||||
}
|
||||
}
|
||||
else if (ItemUtils.isAxe(heldItem)) {
|
||||
@@ -128,7 +133,7 @@ public final class CombatUtils {
|
||||
axesManager.skullSplitterCheck(target, event.getDamage());
|
||||
}
|
||||
|
||||
startGainXp(axesManager.getMcMMOPlayer(), target, SkillType.AXES);
|
||||
startGainXp(mcMMOPlayer, target, SkillType.AXES);
|
||||
}
|
||||
}
|
||||
else if (heldItem.getType() == Material.AIR) {
|
||||
@@ -155,14 +160,7 @@ public final class CombatUtils {
|
||||
unarmedManager.disarmCheck((Player) target);
|
||||
}
|
||||
|
||||
startGainXp(unarmedManager.getMcMMOPlayer(), target, SkillType.UNARMED);
|
||||
}
|
||||
}
|
||||
else if (heldItem.getType() == Material.BONE) {
|
||||
TamingManager tamingManager = mcMMOPlayer.getTamingManager();
|
||||
|
||||
if (tamingManager.canUseBeastLore(target)) {
|
||||
tamingManager.beastLore(target);
|
||||
startGainXp(mcMMOPlayer, target, SkillType.UNARMED);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -185,17 +183,16 @@ public final class CombatUtils {
|
||||
if (Permissions.skillEnabled(master, SkillType.TAMING)) {
|
||||
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(master);
|
||||
TamingManager tamingManager = mcMMOPlayer.getTamingManager();
|
||||
int skillLevel = tamingManager.getSkillLevel();
|
||||
|
||||
if (skillLevel >= Taming.fastFoodServiceUnlockLevel && Permissions.fastFoodService(master)) {
|
||||
if (tamingManager.canUseFastFoodService()) {
|
||||
tamingManager.fastFoodService(wolf, event.getDamage());
|
||||
}
|
||||
|
||||
if (skillLevel >= Taming.sharpenedClawsUnlockLevel && Permissions.sharpenedClaws(master)) {
|
||||
if (tamingManager.canUseSharpenedClaws()) {
|
||||
event.setDamage(Taming.sharpenedClaws(event.getDamage()));
|
||||
}
|
||||
|
||||
if (Permissions.gore(master)) {
|
||||
if (tamingManager.canUseGore()) {
|
||||
event.setDamage(tamingManager.gore(target, event.getDamage()));
|
||||
}
|
||||
|
||||
@@ -214,10 +211,47 @@ public final class CombatUtils {
|
||||
}
|
||||
|
||||
if (!shouldProcessSkill(target, SkillType.ARCHERY)) {
|
||||
return;
|
||||
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);
|
||||
}
|
||||
|
||||
archeryCheck((Player) shooter, target, event);
|
||||
break;
|
||||
|
||||
default:
|
||||
@@ -238,59 +272,17 @@ public final class CombatUtils {
|
||||
event.setDamage(acrobaticsManager.dodgeCheck(event.getDamage()));
|
||||
}
|
||||
|
||||
ItemStack heldItem = player.getItemInHand();
|
||||
|
||||
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()) {
|
||||
if (ItemUtils.isSword(player.getItemInHand())) {
|
||||
if (!shouldProcessSkill(target, SkillType.SWORDS)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (archeryManager.canDaze(target)) {
|
||||
event.setDamage(archeryManager.dazeCheck((Player) target, event.getDamage()));
|
||||
}
|
||||
SwordsManager swordsManager = mcMMOPlayer.getSwordsManager();
|
||||
|
||||
if (archeryManager.canTrackArrows()) {
|
||||
archeryManager.trackArrows(target);
|
||||
if (swordsManager.canUseCounterAttack(damager)) {
|
||||
swordsManager.counterAttackChecks((LivingEntity) damager, event.getDamage());
|
||||
}
|
||||
}
|
||||
|
||||
archeryManager.distanceXpBonus(target);
|
||||
startGainXp(UserManager.getPlayer(shooter), target, SkillType.ARCHERY);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -582,7 +574,7 @@ public final class CombatUtils {
|
||||
return false;
|
||||
}
|
||||
|
||||
private static boolean shouldProcessSkill(LivingEntity target, SkillType skill) {
|
||||
public static boolean shouldProcessSkill(Entity target, SkillType skill) {
|
||||
boolean process;
|
||||
|
||||
if (target instanceof Player || (target instanceof Tameable && ((Tameable) target).isTamed())) {
|
||||
|
||||
@@ -23,17 +23,14 @@ 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;
|
||||
@@ -43,6 +40,8 @@ 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);
|
||||
|
||||
@@ -92,20 +91,14 @@ public class SkillUtils {
|
||||
* Sends a message to the player when the cooldown expires.
|
||||
*
|
||||
* @param mcMMOPlayer The player to send a message to
|
||||
* @param skill The skill type to watch cooldowns for
|
||||
* @param ability The ability to watch cooldowns for
|
||||
*/
|
||||
public static void watchCooldown(McMMOPlayer mcMMOPlayer, SkillType skill) {
|
||||
if (mcMMOPlayer == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
public static void watchCooldown(McMMOPlayer mcMMOPlayer, AbilityType ability) {
|
||||
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());
|
||||
if (!mcMMOPlayer.getAbilityInformed(ability) && cooldownOver(mcMMOPlayer.getProfile().getSkillDATS(ability) * Misc.TIME_CONVERSION_FACTOR, ability.getCooldown(), player)) {
|
||||
mcMMOPlayer.setAbilityInformed(ability, true);
|
||||
player.sendMessage(ability.getAbilityRefresh());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -120,48 +113,45 @@ 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 (SkillManager skillManager : mcMMOPlayer.getSkillManagers().values()) {
|
||||
if (skillManager.getAbility().getMode()) {
|
||||
for (AbilityType abilityType : AbilityType.values()) {
|
||||
if (mcMMOPlayer.getAbilityMode(abilityType)) {
|
||||
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 (abilityType.getPermissions(player) && toolType.inHand(inHand) && !tool.getPreparationMode()) {
|
||||
if (ability.getPermissions(player) && tool.inHand(inHand) && !mcMMOPlayer.getToolPreparationMode(tool)) {
|
||||
if (skill != SkillType.WOODCUTTING && skill != SkillType.AXES) {
|
||||
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)));
|
||||
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)));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (Config.getInstance().getAbilityMessagesEnabled()) {
|
||||
player.sendMessage(toolType.getRaiseTool());
|
||||
player.sendMessage(tool.getRaiseTool());
|
||||
}
|
||||
|
||||
tool.setPreparationATS(System.currentTimeMillis());
|
||||
tool.setPreparationMode(true);
|
||||
mcMMOPlayer.setToolPreparationATS(tool, System.currentTimeMillis());
|
||||
mcMMOPlayer.setToolPreparationMode(tool, true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -175,40 +165,38 @@ public class SkillUtils {
|
||||
*/
|
||||
public static void monitorSkill(McMMOPlayer mcMMOPlayer, long curTime, SkillType skill) {
|
||||
final int FOUR_SECONDS = 4000;
|
||||
SkillManager skillManager = mcMMOPlayer.getSkillManager(skill);
|
||||
Tool tool = skillManager.getTool();
|
||||
ToolType tool = skill.getTool();
|
||||
|
||||
if (tool.getPreparationMode() && curTime - (tool.getPreparationATS() * Misc.TIME_CONVERSION_FACTOR) >= FOUR_SECONDS) {
|
||||
tool.setPreparationMode(false);
|
||||
if (mcMMOPlayer.getToolPreparationMode(tool) && curTime - (mcMMOPlayer.getToolPreparationATS(tool) * Misc.TIME_CONVERSION_FACTOR) >= FOUR_SECONDS) {
|
||||
mcMMOPlayer.setToolPreparationMode(tool, false);
|
||||
|
||||
if (Config.getInstance().getAbilityMessagesEnabled()) {
|
||||
mcMMOPlayer.getPlayer().sendMessage(skill.getToolType().getLowerTool());
|
||||
mcMMOPlayer.getPlayer().sendMessage(tool.getLowerTool());
|
||||
}
|
||||
}
|
||||
|
||||
Ability ability = skillManager.getAbility();
|
||||
AbilityType abilityType = skill.getAbilityType();
|
||||
AbilityType ability = skill.getAbility();
|
||||
Player player = mcMMOPlayer.getPlayer();
|
||||
|
||||
if (abilityType.getPermissions(player)) {
|
||||
if (ability.getMode() && (mcMMOPlayer.getProfile().getSkillDATS(abilityType) * Misc.TIME_CONVERSION_FACTOR) <= curTime) {
|
||||
if (abilityType == AbilityType.BERSERK) {
|
||||
if (ability.getPermissions(player)) {
|
||||
if (mcMMOPlayer.getAbilityMode(ability) && (mcMMOPlayer.getProfile().getSkillDATS(ability) * Misc.TIME_CONVERSION_FACTOR) <= curTime) {
|
||||
if (ability == AbilityType.BERSERK) {
|
||||
player.setCanPickupItems(true);
|
||||
}
|
||||
else if (abilityType == AbilityType.SUPER_BREAKER || abilityType == AbilityType.GIGA_DRILL_BREAKER) {
|
||||
else if (ability == AbilityType.SUPER_BREAKER || ability == AbilityType.GIGA_DRILL_BREAKER) {
|
||||
handleAbilitySpeedDecrease(player);
|
||||
}
|
||||
|
||||
ability.setMode(false);
|
||||
ability.setInformed(false);
|
||||
mcMMOPlayer.setAbilityMode(ability, false);
|
||||
mcMMOPlayer.setAbilityInformed(ability, false);
|
||||
|
||||
ParticleEffectUtils.playAbilityDisabledEffect(player);
|
||||
|
||||
if (mcMMOPlayer.useChatNotifications()) {
|
||||
player.sendMessage(abilityType.getAbilityOff());
|
||||
player.sendMessage(ability.getAbilityOff());
|
||||
}
|
||||
|
||||
sendSkillMessage(player, abilityType.getAbilityPlayerOff(player));
|
||||
sendSkillMessage(player, ability.getAbilityPlayerOff(player));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -225,9 +213,10 @@ 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() >= UserManager.getPlayer(player).getPowerLevel() + 1)) {
|
||||
if ((skillType.getMaxLevel() >= profile.getSkillLevel(skillType) + 1) && (Config.getInstance().getPowerLevelCap() >= mcMMOPlayer.getPowerLevel() + 1)) {
|
||||
int xp = profile.getXpToLevel(skillType);
|
||||
xpRemoved += xp;
|
||||
|
||||
@@ -375,46 +364,46 @@ public class SkillUtils {
|
||||
* Check to see if an ability can be activated.
|
||||
*
|
||||
* @param mcMMOPlayer The player activating the ability
|
||||
* @param skill The skill the ability is based on
|
||||
* @param type The skill the ability is based on
|
||||
*/
|
||||
public static void abilityCheck(McMMOPlayer mcMMOPlayer, SkillType skill) {
|
||||
SkillManager skillManager = mcMMOPlayer.getSkillManager(skill);
|
||||
Ability ability = skillManager.getAbility();
|
||||
AbilityType abilityType = skill.getAbilityType();
|
||||
public static void abilityCheck(McMMOPlayer mcMMOPlayer, SkillType type) {
|
||||
ToolType tool = type.getTool();
|
||||
AbilityType ability = type.getAbility();
|
||||
|
||||
mcMMOPlayer.setToolPreparationMode(tool, false);
|
||||
|
||||
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 (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)));
|
||||
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)));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (!ability.getMode() && cooldownOver(playerProfile.getSkillDATS(abilityType), abilityType.getCooldown(), player)) {
|
||||
int ticks = PerksUtils.handleActivationPerks(player, 2 + (playerProfile.getSkillLevel(skill) / AdvancedConfig.getInstance().getAbilityLength()), abilityType.getMaxTicks());
|
||||
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());
|
||||
|
||||
ParticleEffectUtils.playAbilityEnabledEffect(player);
|
||||
|
||||
if (mcMMOPlayer.useChatNotifications()) {
|
||||
player.sendMessage(abilityType.getAbilityOn());
|
||||
player.sendMessage(ability.getAbilityOn());
|
||||
}
|
||||
|
||||
SkillUtils.sendSkillMessage(player, abilityType.getAbilityPlayer(player));
|
||||
SkillUtils.sendSkillMessage(player, ability.getAbilityPlayer(player));
|
||||
|
||||
playerProfile.setSkillDATS(abilityType, System.currentTimeMillis() + (ticks * Misc.TIME_CONVERSION_FACTOR));
|
||||
ability.setMode(true);
|
||||
playerProfile.setSkillDATS(ability, System.currentTimeMillis() + (ticks * Misc.TIME_CONVERSION_FACTOR));
|
||||
mcMMOPlayer.setAbilityMode(ability, true);
|
||||
|
||||
if (abilityType == AbilityType.BERSERK) {
|
||||
if (ability == AbilityType.BERSERK) {
|
||||
player.setCanPickupItems(false);
|
||||
}
|
||||
else if (abilityType == AbilityType.SUPER_BREAKER || abilityType == AbilityType.GIGA_DRILL_BREAKER) {
|
||||
else if (ability == AbilityType.SUPER_BREAKER || ability == AbilityType.GIGA_DRILL_BREAKER) {
|
||||
handleAbilitySpeedIncrease(player);
|
||||
}
|
||||
}
|
||||
@@ -470,22 +459,6 @@ 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();
|
||||
@@ -503,7 +476,7 @@ public class SkillUtils {
|
||||
}
|
||||
|
||||
itemLore.add("mcMMO Ability Tool");
|
||||
itemMeta.addEnchant(Enchantment.DIG_SPEED, efficiencyLevel + 5, true);
|
||||
itemMeta.addEnchant(Enchantment.DIG_SPEED, efficiencyLevel + enchantBuff, true);
|
||||
|
||||
itemMeta.setLore(itemLore);
|
||||
heldItem.setItemMeta(itemMeta);
|
||||
@@ -525,10 +498,10 @@ public class SkillUtils {
|
||||
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
|
||||
int ticks = 0;
|
||||
|
||||
if (mcMMOPlayer.getSkillManager(SkillType.MINING).getAbility().getMode()) {
|
||||
if (mcMMOPlayer.getAbilityMode(AbilityType.SUPER_BREAKER)) {
|
||||
ticks = ((int) (mcMMOPlayer.getProfile().getSkillDATS(AbilityType.SUPER_BREAKER) - System.currentTimeMillis())) / Misc.TIME_CONVERSION_FACTOR;
|
||||
}
|
||||
else if (mcMMOPlayer.getSkillManager(SkillType.EXCAVATION).getAbility().getMode()) {
|
||||
else if (mcMMOPlayer.getAbilityMode(AbilityType.GIGA_DRILL_BREAKER)) {
|
||||
ticks = ((int) (mcMMOPlayer.getProfile().getSkillDATS(AbilityType.GIGA_DRILL_BREAKER) - System.currentTimeMillis())) / Misc.TIME_CONVERSION_FACTOR;
|
||||
}
|
||||
|
||||
@@ -569,11 +542,11 @@ public class SkillUtils {
|
||||
if (itemLore.remove("mcMMO Ability Tool")) {
|
||||
int efficiencyLevel = item.getEnchantmentLevel(Enchantment.DIG_SPEED);
|
||||
|
||||
if (efficiencyLevel <= 5) {
|
||||
if (efficiencyLevel <= enchantBuff) {
|
||||
itemMeta.removeEnchant(Enchantment.DIG_SPEED);
|
||||
}
|
||||
else {
|
||||
itemMeta.addEnchant(Enchantment.DIG_SPEED, efficiencyLevel - 5, true);
|
||||
itemMeta.addEnchant(Enchantment.DIG_SPEED, efficiencyLevel - enchantBuff, true);
|
||||
}
|
||||
|
||||
itemMeta.setLore(itemLore);
|
||||
@@ -622,12 +595,8 @@ public class SkillUtils {
|
||||
return chance > 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 activationSuccessful(int skillLevel, int activationChance, double maxChance, int maxLevel) {
|
||||
return ((maxChance / maxLevel) * Math.min(skillLevel, maxLevel)) > Misc.getRandom().nextInt(activationChance);
|
||||
}
|
||||
|
||||
public static boolean treasureDropSuccessful(double dropChance, int activationChance) {
|
||||
|
||||
@@ -16,6 +16,8 @@ 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
|
||||
###
|
||||
@@ -247,6 +249,9 @@ 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:
|
||||
|
||||
@@ -72,7 +72,10 @@ Mods:
|
||||
Items:
|
||||
Chimaera_Wing:
|
||||
Enabled: true
|
||||
Feather_Cost: 10
|
||||
Cooldown: 240
|
||||
Prevent_Use_Underground: true
|
||||
Use_Cost: 1
|
||||
Recipe_Cost: 5
|
||||
Item_ID: 288
|
||||
|
||||
#
|
||||
@@ -160,9 +163,7 @@ 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:
|
||||
@@ -186,7 +187,6 @@ Skills:
|
||||
SmoothBrick_To_CrackedBrick: true
|
||||
Woodcutting:
|
||||
Level_Cap: 0
|
||||
Requires_Axe: true
|
||||
|
||||
#
|
||||
# Settings for Double Drops
|
||||
@@ -360,8 +360,11 @@ 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
|
||||
|
||||
@@ -1,3 +1,13 @@
|
||||
#
|
||||
# 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
|
||||
|
||||
@@ -32,7 +32,6 @@ 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!
|
||||
@@ -73,13 +72,16 @@ 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:
|
||||
@@ -96,6 +98,7 @@ 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
|
||||
@@ -115,7 +118,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=Dvojnasobne zisky
|
||||
Mining.Effect.2=Dvojn\u00e1sobn\u00fd zisk
|
||||
Mining.Effect.3=Zdvojnasobi normalni zisk
|
||||
Mining.Effect.4=Tezeni vybuchem
|
||||
Mining.Effect.5=Bonusy za tezeni s TNT
|
||||
@@ -134,14 +137,6 @@ 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!
|
||||
@@ -179,7 +174,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]]Mira uspesnosti AF: [[YELLOW]]{0}%
|
||||
Repair.Arcane.Chance.Success=[[GRAY]]Pravd\u011bpodobnost \u00fasp\u011bchu 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.
|
||||
@@ -217,6 +212,7 @@ 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
|
||||
@@ -293,9 +289,7 @@ 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.
|
||||
@@ -314,6 +308,9 @@ 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.
|
||||
@@ -321,8 +318,10 @@ 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.
|
||||
@@ -332,12 +331,17 @@ 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.
|
||||
@@ -349,9 +353,12 @@ 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
|
||||
@@ -380,8 +387,10 @@ 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}
|
||||
@@ -401,3 +410,13 @@ 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
|
||||
|
||||
@@ -32,7 +32,6 @@ 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!
|
||||
@@ -146,14 +145,6 @@ 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!
|
||||
@@ -321,9 +312,7 @@ 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.
|
||||
@@ -416,7 +405,6 @@ 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.
|
||||
|
||||
@@ -32,7 +32,6 @@ 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!
|
||||
@@ -146,14 +145,6 @@ 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!
|
||||
@@ -320,9 +311,7 @@ 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.
|
||||
@@ -417,7 +406,6 @@ 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.
|
||||
|
||||
@@ -32,7 +32,6 @@ 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!
|
||||
@@ -151,14 +150,6 @@ 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!
|
||||
@@ -329,9 +320,7 @@ 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.
|
||||
@@ -426,7 +415,6 @@ 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.
|
||||
|
||||
@@ -464,7 +464,6 @@ 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
|
||||
@@ -543,7 +542,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've been hurt in the last {0} seconds and cannnot teleport.
|
||||
Party.Teleport.Hurt=[[RED]]You have been hurt in the last {0} seconds and cannot teleport.
|
||||
Party.Teleport.Player=[[GREEN]]You have teleported to {0}.
|
||||
Party.Teleport.Self=[[RED]]You can't teleport to yourself!
|
||||
Party.Teleport.Target=[[GREEN]]{0} has teleported to you.
|
||||
@@ -566,6 +565,7 @@ 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,7 +590,9 @@ 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
|
||||
@@ -625,9 +627,11 @@ 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)
|
||||
|
||||
|
||||
@@ -32,7 +32,6 @@ 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!
|
||||
@@ -134,14 +133,6 @@ 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!
|
||||
@@ -290,9 +281,7 @@ 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.
|
||||
@@ -346,7 +335,6 @@ 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
|
||||
|
||||
@@ -13,9 +13,7 @@ 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.
|
||||
|
||||
@@ -32,7 +32,6 @@ 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 !
|
||||
@@ -133,14 +132,6 @@ 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 !
|
||||
@@ -282,9 +273,7 @@ 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.
|
||||
@@ -338,7 +327,6 @@ 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.
|
||||
|
||||
@@ -1,19 +1,39 @@
|
||||
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}
|
||||
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.
|
||||
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!
|
||||
Stats.Header.Combat=[[GOLD]]-=HARCI K\u00c9PZETTS\u00c9GEK=-
|
||||
Stats.Header.Gathering=[[GOLD]]-= GY\u0170JT\u00d6GET\u0150 K\u00c9PESS\u00c9GEK=-
|
||||
|
||||
@@ -33,7 +33,6 @@ 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!
|
||||
@@ -104,6 +103,8 @@ 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)
|
||||
@@ -116,6 +117,8 @@ 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
|
||||
@@ -152,14 +155,6 @@ 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!
|
||||
@@ -249,6 +244,7 @@ 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)
|
||||
@@ -265,6 +261,7 @@ 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
|
||||
@@ -336,13 +333,11 @@ 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 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,
|
||||
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,
|
||||
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}!
|
||||
@@ -385,6 +380,8 @@ 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]][]-----
|
||||
@@ -405,6 +402,7 @@ 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
|
||||
@@ -419,6 +417,7 @@ 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
|
||||
@@ -484,7 +483,6 @@ 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.
|
||||
@@ -608,6 +606,7 @@ 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
|
||||
@@ -624,3 +623,5 @@ 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.
|
||||
|
||||
@@ -14,10 +14,12 @@ 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!
|
||||
@@ -26,6 +28,8 @@ 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
|
||||
@@ -45,6 +49,7 @@ 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**
|
||||
@@ -68,6 +73,7 @@ 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
|
||||
|
||||
@@ -1,23 +1,56 @@
|
||||
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:
|
||||
@@ -27,12 +60,19 @@ 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**
|
||||
@@ -40,6 +80,19 @@ 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:
|
||||
@@ -51,9 +104,10 @@ 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}
|
||||
@@ -62,18 +116,21 @@ 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
|
||||
@@ -81,22 +138,30 @@ 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!
|
||||
@@ -109,24 +174,37 @@ 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...
|
||||
@@ -135,8 +213,12 @@ 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
|
||||
|
||||
@@ -79,9 +79,7 @@ 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.
|
||||
@@ -134,7 +132,6 @@ 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
|
||||
|
||||
@@ -10,9 +10,7 @@ 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.
|
||||
|
||||
@@ -33,7 +33,6 @@ 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!
|
||||
@@ -122,7 +121,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=[[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.Off=[[GREEN]] \u0423\u043c\u0435\u043d\u0438\u0435 \"[[RED]]\u041e\u0437\u0435\u043b\u0435\u043d\u0435\u043d\u0438\u0435[[GREEN]] \" \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u043b\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0443 [[YELLOW]]{0}
|
||||
Herbalism.Skills.GTe.Other.On=[[GREEN]]{0}[[DARK_GREEN]] \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0443\u043c\u0435\u043d\u0438\u0435 [[RED]] \"\u041e\u0437\u0435\u043b\u0435\u043d\u0435\u043d\u0438\u0435\"!
|
||||
Herbalism.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.
|
||||
@@ -152,14 +151,6 @@ 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\"!
|
||||
@@ -235,7 +226,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=[[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.Off=[[GREEN]]\u0423\u043c\u0435\u043d\u0438\u0435 \"[[RED]]\u0420\u0435\u0436\u0443\u0449\u0438\u0439 \u0443\u0434\u0430\u0440[[GREEN]]\" \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u043b\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0443 [[YELLOW]]{0}
|
||||
Swords.Skills.SS.Other.On=[[GREEN]]{0}[[DARK_GREEN]] \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0443\u043c\u0435\u043d\u0438\u0435 [[RED]]\"\u0420\u0435\u0436\u0443\u0449\u0438\u0439 \u0423\u0434\u0430\u0440\"!
|
||||
Swords.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.
|
||||
@@ -249,6 +240,7 @@ 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)
|
||||
@@ -265,6 +257,8 @@ 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
|
||||
@@ -278,7 +272,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, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u0437\u0432\u0430\u0442\u044c \u0435\u0449\u0435.
|
||||
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.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\"
|
||||
@@ -304,7 +298,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=[[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.Off=[[GREEN]]\u0423\u043c\u0435\u043d\u0438\u0435 \"[[RED]]\u0411\u0435\u0440\u0441\u0435\u0440\u043a[[GREEN]]\" \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u043b\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0443 [[YELLOW]]{0}
|
||||
Unarmed.Skills.Berserk.Other.On=[[GREEN]]{0}[[DARK_GREEN]] \u0432\u043a\u043b\u044e\u0447\u0438\u043b [[RED]]\u0443\u043c\u0435\u043d\u0438\u0435 \"\u0411\u0435\u0440\u0441\u0435\u0440\u043a\"!
|
||||
Unarmed.Skills.Berserk.Refresh=[[GREEN]]\u0412\u0430\u0448\u0435 \u0443\u043c\u0435\u043d\u0438\u0435 [[YELLOW]]\"\u0411\u0435\u0440\u0441\u0435\u0440\u043a\" [[GREEN]]\u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e!
|
||||
Unarmed.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})
|
||||
@@ -324,7 +318,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=[[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.Off=[[GREEN]]\u0423\u043c\u0435\u043d\u0438\u0435 \"[[RED]]\u041b\u0435\u0441\u043e\u0440\u0443\u0431[[GREEN]]\" \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u043b\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0443 [[YELLOW]]{0}
|
||||
Woodcutting.Skills.TreeFeller.Other.On=[[GREEN]]{0}[[DARK_GREEN]] \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0443\u043c\u0435\u043d\u0438\u0435 [[RED]]\"\u041b\u0435\u0441\u043e\u0440\u0443\u0431\"!
|
||||
Woodcutting.Skills.TreeFeller.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!
|
||||
@@ -336,9 +330,7 @@ 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.
|
||||
@@ -357,15 +349,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 \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.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.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. \u0420\u0435\u0436\u0438\u043c \u0411\u043e\u0433\u0430
|
||||
Commands.mcgod=[[RED]]- \u0412\u043a\u043b./\u043e\u0442\u043a\u043b. \u0440\u0435\u0436\u0438\u043c-\u0431\u043e\u0433\u0430 mcMMO
|
||||
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=-
|
||||
@@ -377,12 +369,15 @@ 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}
|
||||
@@ -433,24 +428,29 @@ 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 \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.
|
||||
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.
|
||||
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,18 +466,20 @@ 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
|
||||
@@ -554,6 +556,7 @@ 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]])
|
||||
@@ -588,3 +591,23 @@ 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.
|
||||
|
||||
@@ -32,7 +32,6 @@ 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!
|
||||
@@ -142,14 +141,6 @@ 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!
|
||||
@@ -310,9 +301,7 @@ 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
|
||||
@@ -388,7 +377,6 @@ 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.
|
||||
@@ -449,3 +437,6 @@ 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.
|
||||
|
||||
@@ -32,7 +32,6 @@ 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!
|
||||
@@ -125,7 +124,7 @@ Mining.Ability.Locked.0=\u9396\u5b9a \u76f4\u5230 {0}+ \u6280\u80fd (\u6316\u792
|
||||
Mining.Ability.Locked.1=\u9396\u5b9a \u76f4\u5230 {0}+ \u6280\u80fd (\u66f4\u5927\u7684\u70b8\u5f48)
|
||||
Mining.Ability.Locked.2=\u9396\u5b9a \u76f4\u5230 {0}+ \u6280\u80fd (\u7206\u7834\u5c08\u5bb6)
|
||||
Mining.Ability.Lower=[[GRAY]]**\u4f60\u653e\u4e0b\u4e86\u4f60\u7684\u7a3f\u5b50**
|
||||
Mining.Ability.Ready=[GREEN]**\u4f60\u63e1\u7dca\u4e86\u4f60\u7684\u7a3f\u5b50**\n\n
|
||||
Mining.Ability.Ready=[GREEN]**\u4f60\u63e1\u7dca\u4e86\u4f60\u7684\u93ac\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
|
||||
@@ -147,14 +146,6 @@ 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!
|
||||
@@ -238,6 +229,7 @@ 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)
|
||||
@@ -284,6 +276,7 @@ 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**
|
||||
@@ -320,9 +313,7 @@ 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...
|
||||
@@ -360,18 +351,23 @@ 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
|
||||
@@ -387,6 +383,7 @@ 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
|
||||
@@ -397,6 +394,7 @@ 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--
|
||||
@@ -411,12 +409,14 @@ 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,10 +425,18 @@ 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!
|
||||
@@ -437,6 +445,7 @@ 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.
|
||||
@@ -444,18 +453,23 @@ 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
|
||||
@@ -467,6 +481,7 @@ 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]]!
|
||||
@@ -489,6 +504,8 @@ 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]][]-----
|
||||
@@ -512,6 +529,7 @@ 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
|
||||
@@ -523,3 +541,17 @@ 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
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user