2012-01-09 20:00:13 +01:00
|
|
|
package com.gmail.nossr50.skills;
|
|
|
|
|
2012-01-28 08:00:18 +01:00
|
|
|
import org.bukkit.Bukkit;
|
2012-01-09 20:00:13 +01:00
|
|
|
import org.bukkit.ChatColor;
|
2012-03-09 07:23:32 +01:00
|
|
|
import org.bukkit.block.Block;
|
2012-03-04 09:54:26 +01:00
|
|
|
import org.bukkit.enchantments.Enchantment;
|
2012-01-09 20:00:13 +01:00
|
|
|
import org.bukkit.entity.Player;
|
2012-03-04 09:54:26 +01:00
|
|
|
import org.bukkit.inventory.ItemStack;
|
2012-01-09 20:00:13 +01:00
|
|
|
import org.getspout.spoutapi.SpoutManager;
|
|
|
|
import org.getspout.spoutapi.player.SpoutPlayer;
|
|
|
|
|
|
|
|
import com.gmail.nossr50.Leaderboard;
|
|
|
|
import com.gmail.nossr50.Users;
|
|
|
|
import com.gmail.nossr50.m;
|
|
|
|
import com.gmail.nossr50.mcPermissions;
|
|
|
|
import com.gmail.nossr50.config.LoadProperties;
|
|
|
|
import com.gmail.nossr50.spout.SpoutStuff;
|
2012-02-09 20:10:39 +01:00
|
|
|
import com.gmail.nossr50.datatypes.AbilityType;
|
2012-01-09 20:00:13 +01:00
|
|
|
import com.gmail.nossr50.datatypes.PlayerProfile;
|
|
|
|
import com.gmail.nossr50.datatypes.PlayerStat;
|
|
|
|
import com.gmail.nossr50.datatypes.SkillType;
|
2012-02-27 23:28:32 +01:00
|
|
|
import com.gmail.nossr50.datatypes.ToolType;
|
2012-01-28 08:00:18 +01:00
|
|
|
import com.gmail.nossr50.events.McMMOPlayerLevelUpEvent;
|
2012-01-09 20:00:13 +01:00
|
|
|
import com.gmail.nossr50.locale.mcLocale;
|
|
|
|
|
|
|
|
public class Skills
|
|
|
|
{
|
|
|
|
public static boolean cooldownOver(Player player, long oldTime, int cooldown){
|
|
|
|
long currentTime = System.currentTimeMillis();
|
2012-02-27 23:28:32 +01:00
|
|
|
if(currentTime - oldTime >= (cooldown * 1000))
|
2012-01-09 20:00:13 +01:00
|
|
|
return true;
|
2012-02-27 23:28:32 +01:00
|
|
|
else
|
2012-01-09 20:00:13 +01:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
public static int calculateTimeLeft(Player player, long deactivatedTimeStamp, int cooldown)
|
|
|
|
{
|
|
|
|
return (int) (((deactivatedTimeStamp + (cooldown * 1000)) - System.currentTimeMillis())/1000);
|
|
|
|
}
|
|
|
|
|
2012-03-01 22:01:41 +01:00
|
|
|
public static void watchCooldown(Player player, PlayerProfile PP, long curTime, AbilityType ability)
|
2012-02-27 23:28:32 +01:00
|
|
|
{
|
|
|
|
if(!ability.getInformed(PP) && curTime - (PP.getSkillDATS(ability) * 1000) >= (ability.getCooldown() * 1000))
|
|
|
|
{
|
|
|
|
ability.setInformed(PP, true);
|
|
|
|
player.sendMessage(ability.getAbilityRefresh());
|
2012-01-09 20:00:13 +01:00
|
|
|
}
|
|
|
|
}
|
2012-02-27 23:28:32 +01:00
|
|
|
|
|
|
|
public static void activationCheck(Player player, SkillType skill)
|
2012-01-09 20:00:13 +01:00
|
|
|
{
|
|
|
|
if(LoadProperties.enableOnlyActivateWhenSneaking && !player.isSneaking())
|
|
|
|
return;
|
|
|
|
|
|
|
|
PlayerProfile PP = Users.getProfile(player);
|
2012-02-27 23:28:32 +01:00
|
|
|
AbilityType ability = skill.getAbility();
|
|
|
|
ToolType tool = skill.getTool();
|
|
|
|
|
|
|
|
if(!PP.getAbilityUse() || PP.getSuperBreakerMode() || PP.getSerratedStrikesMode() || PP.getTreeFellerMode() || PP.getGreenTerraMode() || PP.getBerserkMode() || PP.getGigaDrillBreakerMode())
|
|
|
|
return;
|
|
|
|
|
2012-03-02 00:52:21 +01:00
|
|
|
//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(skill == SkillType.WOODCUTTING || skill == SkillType.AXES)
|
|
|
|
{
|
|
|
|
if(tool.inHand(player.getItemInHand()) && !tool.getToolMode(PP))
|
|
|
|
{
|
|
|
|
if(LoadProperties.enableAbilityMessages)
|
|
|
|
player.sendMessage(tool.getRaiseTool());
|
|
|
|
|
|
|
|
tool.setToolATS(PP, System.currentTimeMillis());
|
|
|
|
tool.setToolMode(PP, true);
|
|
|
|
}
|
|
|
|
} else if(ability.getPermissions(player) && tool.inHand(player.getItemInHand()) && !tool.getToolMode(PP))
|
2012-02-27 23:28:32 +01:00
|
|
|
{
|
2012-02-28 02:40:25 +01:00
|
|
|
if(!ability.getMode(PP) && !cooldownOver(player, (PP.getSkillDATS(ability) * 1000), ability.getCooldown()))
|
|
|
|
{
|
|
|
|
player.sendMessage(mcLocale.getString("Skills.TooTired") + ChatColor.YELLOW + " (" + calculateTimeLeft(player, (PP.getSkillDATS(ability) * 1000), ability.getCooldown()) + "s)");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(LoadProperties.enableAbilityMessages)
|
|
|
|
player.sendMessage(tool.getRaiseTool());
|
|
|
|
|
|
|
|
tool.setToolATS(PP, System.currentTimeMillis());
|
|
|
|
tool.setToolMode(PP, true);
|
2012-01-09 20:00:13 +01:00
|
|
|
}
|
|
|
|
}
|
2012-02-10 18:44:17 +01:00
|
|
|
|
2012-02-28 05:38:33 +01:00
|
|
|
public static void monitorSkill(Player player, PlayerProfile PP, long curTime, SkillType skill)
|
|
|
|
{
|
2012-02-27 23:28:32 +01:00
|
|
|
ToolType tool = skill.getTool();
|
|
|
|
AbilityType ability = skill.getAbility();
|
|
|
|
if(tool.getToolMode(PP) && curTime - (tool.getToolATS(PP) * 1000) >= 4000)
|
2012-01-09 20:00:13 +01:00
|
|
|
{
|
2012-02-27 23:28:32 +01:00
|
|
|
tool.setToolMode(PP, false);
|
|
|
|
player.sendMessage(tool.getLowerTool());
|
2012-01-09 20:00:13 +01:00
|
|
|
}
|
2012-02-27 23:28:32 +01:00
|
|
|
|
|
|
|
if(ability.getPermissions(player))
|
|
|
|
{
|
|
|
|
if(ability.getMode(PP) && (PP.getSkillDATS(ability) * 1000) <= curTime)
|
|
|
|
{
|
|
|
|
ability.setMode(PP, false);
|
|
|
|
ability.setInformed(PP, false);
|
|
|
|
player.sendMessage(ability.getAbilityOff());
|
2012-03-01 01:04:31 +01:00
|
|
|
|
|
|
|
for(Player y : player.getWorld().getPlayers())
|
|
|
|
{
|
|
|
|
if(y != player && m.isNear(player.getLocation(), y.getLocation(), 10))
|
|
|
|
y.sendMessage(ability.getAbilityPlayerOff(player));
|
|
|
|
}
|
2012-02-27 23:28:32 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2012-01-09 20:00:13 +01:00
|
|
|
|
|
|
|
public static void ProcessLeaderboardUpdate(SkillType skillType, Player player)
|
|
|
|
{
|
|
|
|
PlayerProfile PP = Users.getProfile(player);
|
|
|
|
|
|
|
|
PlayerStat ps = new PlayerStat();
|
|
|
|
if(skillType != SkillType.ALL)
|
|
|
|
ps.statVal = PP.getSkillLevel(skillType);
|
|
|
|
else
|
2012-03-07 22:38:48 +01:00
|
|
|
ps.statVal = m.getPowerLevel(player, PP);
|
2012-01-09 20:00:13 +01:00
|
|
|
ps.name = player.getName();
|
|
|
|
Leaderboard.updateLeaderboard(ps, skillType);
|
|
|
|
}
|
|
|
|
|
|
|
|
public static void XpCheckSkill(SkillType skillType, Player player)
|
|
|
|
{
|
|
|
|
PlayerProfile PP = Users.getProfile(player);
|
|
|
|
|
|
|
|
if(PP.getSkillXpLevel(skillType) >= PP.getXpToLevel(skillType))
|
|
|
|
{
|
|
|
|
int skillups = 0;
|
|
|
|
|
|
|
|
while(PP.getSkillXpLevel(skillType) >= PP.getXpToLevel(skillType))
|
|
|
|
{
|
2012-02-27 23:28:32 +01:00
|
|
|
if(skillType.getMaxLevel() >= PP.getSkillLevel(skillType) + 1)
|
2012-02-14 21:09:02 +01:00
|
|
|
{
|
2012-02-02 06:24:07 +01:00
|
|
|
skillups++;
|
2012-02-14 21:09:02 +01:00
|
|
|
PP.removeXP(skillType, PP.getXpToLevel(skillType));
|
2012-02-02 06:24:07 +01:00
|
|
|
PP.skillUp(skillType, 1);
|
|
|
|
|
|
|
|
McMMOPlayerLevelUpEvent eventToFire = new McMMOPlayerLevelUpEvent(player, skillType);
|
|
|
|
Bukkit.getPluginManager().callEvent(eventToFire);
|
2012-02-19 20:53:07 +01:00
|
|
|
} else
|
|
|
|
{
|
|
|
|
PP.removeXP(skillType, PP.getXpToLevel(skillType));
|
2012-02-02 06:24:07 +01:00
|
|
|
}
|
2012-01-09 20:00:13 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
if(!LoadProperties.useMySQL)
|
|
|
|
{
|
|
|
|
ProcessLeaderboardUpdate(skillType, player);
|
|
|
|
ProcessLeaderboardUpdate(SkillType.ALL, player);
|
|
|
|
}
|
|
|
|
|
|
|
|
String capitalized = m.getCapitalized(skillType.toString());
|
|
|
|
|
|
|
|
//Contrib stuff
|
|
|
|
|
|
|
|
if(LoadProperties.spoutEnabled && player instanceof SpoutPlayer)
|
|
|
|
{
|
|
|
|
SpoutPlayer sPlayer = SpoutManager.getPlayer(player);
|
|
|
|
if(sPlayer.isSpoutCraftEnabled())
|
|
|
|
{
|
|
|
|
SpoutStuff.levelUpNotification(skillType, sPlayer);
|
|
|
|
} else
|
|
|
|
{
|
|
|
|
player.sendMessage(mcLocale.getString("Skills."+capitalized+"Up", new Object[] {String.valueOf(skillups), PP.getSkillLevel(skillType)}));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
player.sendMessage(mcLocale.getString("Skills."+capitalized+"Up", new Object[] {String.valueOf(skillups), PP.getSkillLevel(skillType)}));
|
|
|
|
}
|
|
|
|
if(LoadProperties.xpbar && LoadProperties.spoutEnabled)
|
|
|
|
{
|
|
|
|
SpoutPlayer sPlayer = SpoutManager.getPlayer(player);
|
|
|
|
if(sPlayer.isSpoutCraftEnabled())
|
|
|
|
{
|
|
|
|
SpoutStuff.updateXpBar(sPlayer);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public static void XpCheckAll(Player player)
|
|
|
|
{
|
|
|
|
for(SkillType x : SkillType.values())
|
|
|
|
{
|
|
|
|
//Don't want to do anything with this one
|
|
|
|
if(x == SkillType.ALL)
|
|
|
|
continue;
|
|
|
|
|
|
|
|
XpCheckSkill(x, player);
|
|
|
|
}
|
|
|
|
}
|
2012-02-27 23:28:32 +01:00
|
|
|
|
2012-01-09 20:00:13 +01:00
|
|
|
public static SkillType getSkillType(String skillName)
|
|
|
|
{
|
|
|
|
for(SkillType x : SkillType.values())
|
|
|
|
{
|
|
|
|
if(x.toString().equals(skillName.toUpperCase()))
|
|
|
|
return x;
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
}
|
2012-02-27 23:28:32 +01:00
|
|
|
|
2012-01-09 20:00:13 +01:00
|
|
|
public static boolean isSkill(String skillname){
|
|
|
|
skillname = skillname.toUpperCase();
|
|
|
|
for(SkillType x : SkillType.values())
|
|
|
|
{
|
|
|
|
if(x.toString().equals(skillname))
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
2012-02-27 23:28:32 +01:00
|
|
|
|
|
|
|
//We should probably rework this - it's a fairly ugly way to do this, compared to our other command formatting.
|
2012-01-09 20:00:13 +01:00
|
|
|
public static String getSkillStats(String skillname, Integer level, Integer XP, Integer XPToLevel)
|
|
|
|
{
|
|
|
|
ChatColor parColor = ChatColor.DARK_AQUA;
|
|
|
|
ChatColor xpColor = ChatColor.GRAY;
|
|
|
|
ChatColor LvlColor = ChatColor.GREEN;
|
|
|
|
ChatColor skillColor = ChatColor.YELLOW;
|
|
|
|
|
|
|
|
return skillColor+skillname+LvlColor+level+parColor+" XP"+"("+xpColor+XP+parColor+"/"+xpColor+XPToLevel+parColor+")";
|
|
|
|
}
|
2012-02-27 23:28:32 +01:00
|
|
|
|
2012-01-09 20:00:13 +01:00
|
|
|
public static boolean hasCombatSkills(Player player)
|
|
|
|
{
|
|
|
|
if(mcPermissions.getInstance().axes(player) || mcPermissions.getInstance().archery(player) || mcPermissions.getInstance().swords(player) || mcPermissions.getInstance().taming(player) || mcPermissions.getInstance().unarmed(player))
|
|
|
|
return true;
|
|
|
|
else
|
|
|
|
return false;
|
|
|
|
}
|
2012-02-27 23:28:32 +01:00
|
|
|
|
2012-01-09 20:00:13 +01:00
|
|
|
public static boolean hasGatheringSkills(Player player)
|
|
|
|
{
|
2012-02-27 23:28:32 +01:00
|
|
|
if(mcPermissions.getInstance().excavation(player) || mcPermissions.getInstance().fishing(player) || mcPermissions.getInstance().herbalism(player) || mcPermissions.getInstance().mining(player) || mcPermissions.getInstance().woodcutting(player))
|
2012-01-09 20:00:13 +01:00
|
|
|
return true;
|
|
|
|
else
|
|
|
|
return false;
|
|
|
|
}
|
2012-02-27 23:28:32 +01:00
|
|
|
|
2012-01-09 20:00:13 +01:00
|
|
|
public static boolean hasMiscSkills(Player player)
|
|
|
|
{
|
|
|
|
if(mcPermissions.getInstance().acrobatics(player) || mcPermissions.getInstance().repair(player))
|
|
|
|
return true;
|
|
|
|
else
|
|
|
|
return false;
|
|
|
|
}
|
2012-02-27 23:28:32 +01:00
|
|
|
|
2012-03-04 21:21:24 +01:00
|
|
|
public static void abilityDurabilityLoss(ItemStack inhand, int durabilityLoss)
|
2012-03-04 09:54:26 +01:00
|
|
|
{
|
|
|
|
if(LoadProperties.toolsLoseDurabilityFromAbilities)
|
|
|
|
{
|
|
|
|
if(!inhand.containsEnchantment(Enchantment.DURABILITY))
|
|
|
|
{
|
2012-03-04 21:21:24 +01:00
|
|
|
inhand.setDurability((short)(inhand.getDurability()+durabilityLoss));
|
2012-03-04 09:54:26 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-02-27 23:28:32 +01:00
|
|
|
/**
|
|
|
|
* Check to see if an ability can be activated.
|
|
|
|
*
|
|
|
|
* @param player The player activating the ability
|
|
|
|
* @param type The skill the ability is based on
|
|
|
|
*/
|
|
|
|
public static void abilityCheck(Player player, SkillType type)
|
|
|
|
{
|
|
|
|
PlayerProfile PP = Users.getProfile(player);
|
|
|
|
AbilityType ability = type.getAbility();
|
|
|
|
if(type.getTool().inHand(player.getItemInHand()))
|
|
|
|
{
|
|
|
|
if(type.getTool().getToolMode(PP))
|
|
|
|
type.getTool().setToolMode(PP, false);
|
|
|
|
|
2012-03-02 00:52:21 +01:00
|
|
|
//Axes and Woodcutting are odd because they share the same tool so we show them the too tired message when they take action
|
|
|
|
if(type == SkillType.WOODCUTTING || type == SkillType.AXES)
|
|
|
|
{
|
|
|
|
if(!ability.getMode(PP) && !cooldownOver(player, (PP.getSkillDATS(ability) * 1000), ability.getCooldown()))
|
|
|
|
{
|
|
|
|
player.sendMessage(mcLocale.getString("Skills.TooTired") + ChatColor.YELLOW + " (" + calculateTimeLeft(player, (PP.getSkillDATS(ability) * 1000), ability.getCooldown()) + "s)");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-02-27 23:28:32 +01:00
|
|
|
int ticks = 2 + (PP.getSkillLevel(type) / 50);
|
|
|
|
if(!ability.getMode(PP) && cooldownOver(player, PP.getSkillDATS(ability), ability.getCooldown()))
|
|
|
|
{
|
|
|
|
player.sendMessage(ability.getAbilityOn());
|
|
|
|
for(Player y : player.getWorld().getPlayers())
|
|
|
|
{
|
2012-02-29 03:26:19 +01:00
|
|
|
if(y != player && m.isNear(player.getLocation(), y.getLocation(), 10))
|
2012-02-27 23:28:32 +01:00
|
|
|
y.sendMessage(ability.getAbilityPlayer(player));
|
|
|
|
}
|
|
|
|
PP.setSkillDATS(ability, System.currentTimeMillis()+(ticks*1000));
|
|
|
|
ability.setMode(PP, true);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2012-03-09 07:23:32 +01:00
|
|
|
|
|
|
|
public static boolean triggerCheck(Player player, Block block, AbilityType ability) {
|
|
|
|
boolean activate = true;
|
|
|
|
|
|
|
|
if (!ability.getPermissions(player)) {
|
|
|
|
activate = false;
|
|
|
|
return activate;
|
|
|
|
}
|
|
|
|
|
|
|
|
switch (ability) {
|
|
|
|
case BERSERK:
|
|
|
|
case GIGA_DRILL_BREAKER:
|
|
|
|
case SUPER_BREAKER:
|
|
|
|
case LEAF_BLOWER:
|
2012-03-10 01:28:33 +01:00
|
|
|
if (!m.blockBreakSimulate(block, player, true)) {
|
|
|
|
activate = false;
|
|
|
|
break;
|
|
|
|
}
|
2012-03-10 19:03:31 +01:00
|
|
|
|
|
|
|
case GREEN_TERRA:
|
2012-03-12 22:57:44 +01:00
|
|
|
if (!ability.blockCheck(block.getType())) {
|
2012-03-09 07:23:32 +01:00
|
|
|
activate = false;
|
|
|
|
break;
|
|
|
|
}
|
2012-03-10 00:27:03 +01:00
|
|
|
break;
|
|
|
|
|
2012-03-09 07:23:32 +01:00
|
|
|
default:
|
2012-03-10 00:27:03 +01:00
|
|
|
activate = false;
|
2012-03-09 07:23:32 +01:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
return activate;
|
|
|
|
}
|
2012-01-09 20:00:13 +01:00
|
|
|
}
|