123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311 |
- package com.gmail.nossr50.util.skills;
- import com.gmail.nossr50.config.AdvancedConfig;
- import com.gmail.nossr50.datatypes.experience.XPGainReason;
- import com.gmail.nossr50.datatypes.experience.XPGainSource;
- import com.gmail.nossr50.datatypes.interactions.NotificationType;
- import com.gmail.nossr50.datatypes.player.McMMOPlayer;
- import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
- import com.gmail.nossr50.datatypes.skills.SubSkillType;
- import com.gmail.nossr50.locale.LocaleLoader;
- import com.gmail.nossr50.mcMMO;
- import com.gmail.nossr50.util.ItemUtils;
- import com.gmail.nossr50.util.Misc;
- import com.gmail.nossr50.util.StringUtils;
- import com.gmail.nossr50.util.player.NotificationManager;
- import org.bukkit.Location;
- import org.bukkit.Material;
- import org.bukkit.enchantments.Enchantment;
- import org.bukkit.entity.Player;
- import org.bukkit.inventory.ItemStack;
- import org.bukkit.inventory.Recipe;
- import org.bukkit.inventory.ShapedRecipe;
- import org.bukkit.inventory.ShapelessRecipe;
- import org.bukkit.inventory.meta.ItemMeta;
- import java.util.ArrayList;
- import java.util.List;
- public class SkillUtils {
- public static void applyXpGain(McMMOPlayer mcMMOPlayer, PrimarySkillType skill, float xp, XPGainReason xpGainReason) {
- mcMMOPlayer.beginXpGain(skill, xp, xpGainReason, XPGainSource.SELF);
- }
- public static void applyXpGain(McMMOPlayer mcMMOPlayer, PrimarySkillType skill, float xp, XPGainReason xpGainReason, XPGainSource xpGainSource) {
- mcMMOPlayer.beginXpGain(skill, xp, xpGainReason, xpGainSource);
- }
- /*
- * Skill Stat Calculations
- */
- public static String[] calculateLengthDisplayValues(Player player, float skillValue, PrimarySkillType skill) {
- int maxLength = skill.getAbility().getMaxLength();
- int abilityLengthVar = AdvancedConfig.getInstance().getAbilityLength();
- int abilityLengthCap = AdvancedConfig.getInstance().getAbilityLengthCap();
- int length;
- if(abilityLengthCap > 0)
- {
- length = (int) Math.min(abilityLengthCap, 2 + (skillValue / abilityLengthVar));
- } else {
- length = 2 + (int) (skillValue / abilityLengthVar);
- }
- int enduranceLength = PerksUtils.handleActivationPerks(player, length, maxLength);
- if (maxLength != 0) {
- length = Math.min(length, maxLength);
- }
- return new String[] { String.valueOf(length), String.valueOf(enduranceLength) };
- }
- /*
- * Others
- */
- public static int handleFoodSkills(Player player, int eventFoodLevel, SubSkillType subSkillType) {
- int curRank = RankUtils.getRank(player, subSkillType);
- int currentFoodLevel = player.getFoodLevel();
- int foodChange = eventFoodLevel - currentFoodLevel;
- foodChange+=curRank;
- return currentFoodLevel + foodChange;
- }
- /**
- * Calculate the time remaining until the cooldown expires.
- *
- * @param deactivatedTimeStamp Time of deactivation
- * @param cooldown The length of the cooldown
- * @param player The Player to check for cooldown perks
- *
- * @return the number of seconds remaining before the cooldown expires
- */
- public static int calculateTimeLeft(long deactivatedTimeStamp, int cooldown, Player player) {
- return (int) (((deactivatedTimeStamp + (PerksUtils.handleCooldownPerks(player, cooldown) * Misc.TIME_CONVERSION_FACTOR)) - System.currentTimeMillis()) / Misc.TIME_CONVERSION_FACTOR);
- }
- /**
- * Check if the cooldown has expired.
- * This does NOT account for cooldown perks!
- *
- * @param deactivatedTimeStamp Time of deactivation in seconds
- * @param cooldown The length of the cooldown in seconds
- *
- * @return true if the cooldown is expired
- */
- public static boolean cooldownExpired(long deactivatedTimeStamp, int cooldown) {
- return System.currentTimeMillis() >= (deactivatedTimeStamp + cooldown) * Misc.TIME_CONVERSION_FACTOR;
- }
- /**
- * Checks if the given string represents a valid skill
- *
- * @param skillName The name of the skill to check
- * @return true if this is a valid skill, false otherwise
- */
- public static boolean isSkill(String skillName) {
- return mcMMO.getConfigManager().getConfigLanguage().getTargetLanguage().equalsIgnoreCase("en_US") ? PrimarySkillType.getSkill(skillName) != null : isLocalizedSkill(skillName);
- }
- public static void sendSkillMessage(Player player, NotificationType notificationType, String key) {
- Location location = player.getLocation();
- for (Player otherPlayer : player.getWorld().getPlayers()) {
- if (otherPlayer != player && Misc.isNear(location, otherPlayer.getLocation(), Misc.SKILL_MESSAGE_MAX_SENDING_DISTANCE)) {
- NotificationManager.sendNearbyPlayersInformation(player, notificationType, key, player.getName());
- }
- }
- }
- public static void handleAbilitySpeedIncrease(Player player) {
- ItemStack heldItem = player.getInventory().getItemInMainHand();
- if (heldItem == null || heldItem.getType() == Material.AIR) {
- return;
- }
- int efficiencyLevel = heldItem.getEnchantmentLevel(Enchantment.DIG_SPEED);
- ItemMeta itemMeta = heldItem.getItemMeta();
- List<String> itemLore = new ArrayList<String>();
- if (itemMeta.hasLore()) {
- itemLore = itemMeta.getLore();
- }
- itemLore.add("mcMMO Ability Tool");
- itemMeta.addEnchant(Enchantment.DIG_SPEED, efficiencyLevel + AdvancedConfig.getInstance().getEnchantBuff(), true);
- itemMeta.setLore(itemLore);
- heldItem.setItemMeta(itemMeta);
- /*else {
- int duration = 0;
- int amplifier = 0;
- if (player.hasPotionEffect(PotionEffectType.FAST_DIGGING)) {
- for (PotionEffect effect : player.getActivePotionEffects()) {
- if (effect.getType() == PotionEffectType.FAST_DIGGING) {
- duration = effect.getDuration();
- amplifier = effect.getAmplifier();
- break;
- }
- }
- }
- McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
- PrimarySkillType skill = mcMMOPlayer.getAbilityMode(SuperAbilityType.SUPER_BREAKER) ? PrimarySkillType.MINING : PrimarySkillType.EXCAVATION;
- int abilityLengthVar = AdvancedConfig.getInstance().getAbilityLength();
- int abilityLengthCap = AdvancedConfig.getInstance().getAbilityLengthCap();
- int ticks;
- if(abilityLengthCap > 0)
- {
- ticks = PerksUtils.handleActivationPerks(player, Math.min(abilityLengthCap, 2 + (mcMMOPlayer.getSkillLevel(skill) / abilityLengthVar)),
- skill.getAbility().getMaxLength()) * Misc.TICK_CONVERSION_FACTOR;
- } else {
- ticks = PerksUtils.handleActivationPerks(player, 2 + ((mcMMOPlayer.getSkillLevel(skill)) / abilityLengthVar),
- skill.getAbility().getMaxLength()) * Misc.TICK_CONVERSION_FACTOR;
- }
- PotionEffect abilityBuff = new PotionEffect(PotionEffectType.FAST_DIGGING, duration + ticks, amplifier + 10);
- player.addPotionEffect(abilityBuff, true);
- }*/
- }
- public static void handleAbilitySpeedDecrease(Player player) {
- for (ItemStack item : player.getInventory().getContents()) {
- removeAbilityBuff(item);
- }
- }
- public static void removeAbilityBuff(ItemStack item) {
- if (item == null || item.getType() == Material.AIR || (!ItemUtils.isPickaxe(item) && !ItemUtils.isShovel(item)) || !item.containsEnchantment(Enchantment.DIG_SPEED)) {
- return;
- }
- ItemMeta itemMeta = item.getItemMeta();
- if (itemMeta.hasLore()) {
- List<String> itemLore = itemMeta.getLore();
- if (itemLore.remove("mcMMO Ability Tool")) {
- int efficiencyLevel = item.getEnchantmentLevel(Enchantment.DIG_SPEED);
- if (efficiencyLevel <= AdvancedConfig.getInstance().getEnchantBuff()) {
- itemMeta.removeEnchant(Enchantment.DIG_SPEED);
- }
- else {
- itemMeta.addEnchant(Enchantment.DIG_SPEED, efficiencyLevel - AdvancedConfig.getInstance().getEnchantBuff(), true);
- }
- itemMeta.setLore(itemLore);
- item.setItemMeta(itemMeta);
- }
- }
- }
- public static void handleDurabilityChange(ItemStack itemStack, int durabilityModifier) {
- handleDurabilityChange(itemStack, durabilityModifier, 1.0);
- }
- /**
- * Modify the durability of an ItemStack.
- *
- * @param itemStack The ItemStack which durability should be modified
- * @param durabilityModifier the amount to modify the durability by
- * @param maxDamageModifier the amount to adjust the max damage by
- */
- public static void handleDurabilityChange(ItemStack itemStack, int durabilityModifier, double maxDamageModifier) {
- if (itemStack.hasItemMeta() && itemStack.getItemMeta().isUnbreakable()) {
- return;
- }
- Material type = itemStack.getType();
- short maxDurability = mcMMO.getRepairableManager().isRepairable(type) ? mcMMO.getRepairableManager().getRepairable(type).getMaximumDurability() : type.getMaxDurability();
- durabilityModifier = (int) Math.min(durabilityModifier / (itemStack.getEnchantmentLevel(Enchantment.DURABILITY) + 1), maxDurability * maxDamageModifier);
- itemStack.setDurability((short) Math.min(itemStack.getDurability() + durabilityModifier, maxDurability));
- }
- private static boolean isLocalizedSkill(String skillName) {
- for (PrimarySkillType skill : PrimarySkillType.values()) {
- if (skillName.equalsIgnoreCase(LocaleLoader.getString(StringUtils.getCapitalized(skill.toString()) + ".SkillName"))) {
- return true;
- }
- }
- return false;
- }
- protected static Material getRepairAndSalvageItem(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.OAK_WOOD;
- }
- else if (ItemUtils.isLeatherArmor(inHand)) {
- return Material.LEATHER;
- }
- else if (ItemUtils.isStringTool(inHand)) {
- return Material.STRING;
- }
- else {
- return null;
- }
- }
- public static int getRepairAndSalvageQuantities(ItemStack item) {
- return getRepairAndSalvageQuantities(item, getRepairAndSalvageItem(item), (byte) -1);
- }
- public static int getRepairAndSalvageQuantities(ItemStack item, Material repairMaterial, byte repairMetadata) {
- // Workaround for Bukkit bug where damaged items would not return any recipes
- item = item.clone();
- item.setDurability((short) 0);
- int quantity = 0;
- List<Recipe> recipes = mcMMO.p.getServer().getRecipesFor(item);
- if (recipes.isEmpty()) {
- return quantity;
- }
- Recipe recipe = recipes.get(0);
- if (recipe instanceof ShapelessRecipe) {
- for (ItemStack ingredient : ((ShapelessRecipe) recipe).getIngredientList()) {
- if (ingredient != null && (repairMaterial == null || ingredient.getType() == repairMaterial) && (repairMetadata == -1 || ingredient.getType().equals(repairMaterial))) {
- quantity += ingredient.getAmount();
- }
- }
- }
- else if (recipe instanceof ShapedRecipe) {
- for (ItemStack ingredient : ((ShapedRecipe) recipe).getIngredientMap().values()) {
- if (ingredient != null && (repairMaterial == null || ingredient.getType() == repairMaterial) && (repairMetadata == -1 || ingredient.getType().equals(repairMaterial))) {
- quantity += ingredient.getAmount();
- }
- }
- }
- return quantity;
- }
- }
|