|
@@ -1,28 +1,9 @@
|
|
package com.gmail.nossr50.skills.fishing;
|
|
package com.gmail.nossr50.skills.fishing;
|
|
|
|
|
|
-import java.util.ArrayList;
|
|
|
|
-import java.util.Collections;
|
|
|
|
-import java.util.List;
|
|
|
|
-
|
|
|
|
-import org.bukkit.enchantments.Enchantment;
|
|
|
|
-import org.bukkit.entity.Item;
|
|
|
|
import org.bukkit.entity.LivingEntity;
|
|
import org.bukkit.entity.LivingEntity;
|
|
import org.bukkit.entity.Player;
|
|
import org.bukkit.entity.Player;
|
|
-import org.bukkit.event.player.PlayerFishEvent;
|
|
|
|
-import org.bukkit.inventory.ItemStack;
|
|
|
|
|
|
|
|
import com.gmail.nossr50.config.AdvancedConfig;
|
|
import com.gmail.nossr50.config.AdvancedConfig;
|
|
-import com.gmail.nossr50.config.Config;
|
|
|
|
-import com.gmail.nossr50.config.TreasuresConfig;
|
|
|
|
-import com.gmail.nossr50.datatypes.McMMOPlayer;
|
|
|
|
-import com.gmail.nossr50.datatypes.treasure.FishingTreasure;
|
|
|
|
-import com.gmail.nossr50.locale.LocaleLoader;
|
|
|
|
-import com.gmail.nossr50.skills.utilities.PerksUtils;
|
|
|
|
-import com.gmail.nossr50.skills.utilities.SkillTools;
|
|
|
|
-import com.gmail.nossr50.skills.utilities.SkillType;
|
|
|
|
-import com.gmail.nossr50.util.ItemChecks;
|
|
|
|
-import com.gmail.nossr50.util.Misc;
|
|
|
|
-import com.gmail.nossr50.util.Permissions;
|
|
|
|
|
|
|
|
public final class Fishing {
|
|
public final class Fishing {
|
|
// The order of the values is extremely important, a few methods depend on it to work properly
|
|
// The order of the values is extremely important, a few methods depend on it to work properly
|
|
@@ -67,20 +48,10 @@ public final class Fishing {
|
|
public static int fishermansDietRankLevel1 = AdvancedConfig.getInstance().getFishermanDietRankChange();
|
|
public static int fishermansDietRankLevel1 = AdvancedConfig.getInstance().getFishermanDietRankChange();
|
|
public static int fishermansDietRankLevel2 = fishermansDietRankLevel1 * 2;
|
|
public static int fishermansDietRankLevel2 = fishermansDietRankLevel1 * 2;
|
|
public static int fishermansDietMaxLevel = fishermansDietRankLevel1 * 5;
|
|
public static int fishermansDietMaxLevel = fishermansDietRankLevel1 * 5;
|
|
|
|
+ public static final double STORM_MODIFIER = 0.909;
|
|
|
|
|
|
private Fishing() {}
|
|
private Fishing() {}
|
|
|
|
|
|
- /**
|
|
|
|
- * Begins Fisherman's Diet ability
|
|
|
|
- *
|
|
|
|
- * @param player Player using the ability
|
|
|
|
- * @param rankChange ???
|
|
|
|
- * @param event Event to process
|
|
|
|
- */
|
|
|
|
- public static int beginFishermansDiet(Player player, int rankChange, int eventFoodLevel) {
|
|
|
|
- return SkillTools.handleFoodSkills(player, SkillType.FISHING, eventFoodLevel, fishermansDietRankLevel1, fishermansDietMaxLevel, rankChange);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
/**
|
|
/**
|
|
* Begins Shake Mob ability
|
|
* Begins Shake Mob ability
|
|
*
|
|
*
|
|
@@ -91,173 +62,4 @@ public final class Fishing {
|
|
public static void beginShakeMob(Player player, LivingEntity mob, int skillLevel) {
|
|
public static void beginShakeMob(Player player, LivingEntity mob, int skillLevel) {
|
|
ShakeMob.process(player, mob, skillLevel);
|
|
ShakeMob.process(player, mob, skillLevel);
|
|
}
|
|
}
|
|
-
|
|
|
|
- /**
|
|
|
|
- * Begins Fishing
|
|
|
|
- *
|
|
|
|
- * @param mcMMOPlayer Player fishing
|
|
|
|
- * @param skillLevel Fishing level of the player
|
|
|
|
- * @param event Event to process
|
|
|
|
- */
|
|
|
|
- public static void beginFishing(McMMOPlayer mcMMOPlayer, int skillLevel, PlayerFishEvent event) {
|
|
|
|
- int treasureXp = 0;
|
|
|
|
- Player player = mcMMOPlayer.getPlayer();
|
|
|
|
- FishingTreasure treasure = checkForTreasure(player, skillLevel);
|
|
|
|
-
|
|
|
|
- if (treasure != null) {
|
|
|
|
- player.sendMessage(LocaleLoader.getString("Fishing.ItemFound"));
|
|
|
|
-
|
|
|
|
- treasureXp = treasure.getXp();
|
|
|
|
- ItemStack treasureDrop = treasure.getDrop();
|
|
|
|
-
|
|
|
|
- if (Permissions.magicHunter(player) && beginMagicHunter(player, skillLevel, treasureDrop, player.getWorld().hasStorm())) {
|
|
|
|
- player.sendMessage(LocaleLoader.getString("Fishing.MagicFound"));
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- // Drop the original catch at the feet of the player and set the treasure as the real catch
|
|
|
|
- Item caught = (Item) event.getCaught();
|
|
|
|
- Misc.dropItem(player.getEyeLocation(), caught.getItemStack());
|
|
|
|
- caught.setItemStack(treasureDrop);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- mcMMOPlayer.beginXpGain(SkillType.FISHING, Config.getInstance().getFishingBaseXP() + treasureXp);
|
|
|
|
- if (Permissions.vanillaXpBoost(player, SkillType.FISHING)) {
|
|
|
|
- event.setExpToDrop(event.getExpToDrop() * getVanillaXpMultiplier(skillLevel));
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * Checks for treasure
|
|
|
|
- *
|
|
|
|
- * @param player Player fishing
|
|
|
|
- * @param skillLevel Fishing level of the player
|
|
|
|
- * @return Chosen treasure
|
|
|
|
- */
|
|
|
|
- private static FishingTreasure checkForTreasure(Player player, int skillLevel) {
|
|
|
|
- if (!Config.getInstance().getFishingDropsEnabled() || !Permissions.fishingTreasureHunter(player)) {
|
|
|
|
- return null;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- List<FishingTreasure> rewards = new ArrayList<FishingTreasure>();
|
|
|
|
-
|
|
|
|
- for (FishingTreasure treasure : TreasuresConfig.getInstance().fishingRewards) {
|
|
|
|
- int maxLevel = treasure.getMaxLevel();
|
|
|
|
-
|
|
|
|
- if (treasure.getDropLevel() <= skillLevel && (maxLevel >= skillLevel || maxLevel <= 0)) {
|
|
|
|
- rewards.add(treasure);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if (rewards.isEmpty()) {
|
|
|
|
- return null;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- FishingTreasure treasure = rewards.get(Misc.getRandom().nextInt(rewards.size()));
|
|
|
|
- ItemStack treasureDrop = treasure.getDrop();
|
|
|
|
- int activationChance = PerksUtils.handleLuckyPerks(player, SkillType.FISHING);
|
|
|
|
-
|
|
|
|
- if (Misc.getRandom().nextDouble() * activationChance > treasure.getDropChance()) {
|
|
|
|
- return null;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- short maxDurability = treasureDrop.getType().getMaxDurability();
|
|
|
|
-
|
|
|
|
- if (maxDurability > 0) {
|
|
|
|
- treasureDrop.setDurability((short) (Misc.getRandom().nextInt(maxDurability)));
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- return treasure;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * Processes for treasure
|
|
|
|
- *
|
|
|
|
- * @param player Player fishing
|
|
|
|
- * @param skillLevel Fishing level of the player
|
|
|
|
- * @param itemStack ItemStack to enchant
|
|
|
|
- * @param storm World's weather
|
|
|
|
- * @return True if the ItemStack has been enchanted
|
|
|
|
- */
|
|
|
|
- private static boolean beginMagicHunter(Player player, int skillLevel, ItemStack itemStack, boolean storm) {
|
|
|
|
- if (!ItemChecks.isEnchantable(itemStack)) {
|
|
|
|
- return false;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- int activationChance = PerksUtils.handleLuckyPerks(player, SkillType.FISHING);
|
|
|
|
-
|
|
|
|
- if (storm) {
|
|
|
|
- activationChance = (int) (activationChance * 0.909);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if (Misc.getRandom().nextInt(activationChance) > getLootTier(skillLevel) * AdvancedConfig.getInstance().getFishingMagicMultiplier()) {
|
|
|
|
- return false;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- List<Enchantment> possibleEnchantments = new ArrayList<Enchantment>();
|
|
|
|
-
|
|
|
|
- for (Enchantment enchantment : Enchantment.values()) {
|
|
|
|
- if (enchantment.canEnchantItem(itemStack)) {
|
|
|
|
- possibleEnchantments.add(enchantment);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- // This make sure that the order isn't always the same, for example previously Unbreaking had a lot more chance to be used than any other enchant
|
|
|
|
- Collections.shuffle(possibleEnchantments, Misc.getRandom());
|
|
|
|
-
|
|
|
|
- boolean enchanted = false;
|
|
|
|
- int specificChance = 1;
|
|
|
|
-
|
|
|
|
- for (Enchantment possibleEnchantment : possibleEnchantments) {
|
|
|
|
- boolean conflicts = false;
|
|
|
|
-
|
|
|
|
- for (Enchantment currentEnchantment : itemStack.getEnchantments().keySet()) {
|
|
|
|
- conflicts = currentEnchantment.conflictsWith(possibleEnchantment);
|
|
|
|
-
|
|
|
|
- if (conflicts) {
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if (!conflicts && Misc.getRandom().nextInt(specificChance) == 0) {
|
|
|
|
- itemStack.addEnchantment(possibleEnchantment, Misc.getRandom().nextInt(possibleEnchantment.getMaxLevel()) + 1);
|
|
|
|
-
|
|
|
|
- specificChance++;
|
|
|
|
- enchanted = true;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- return enchanted;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * Gets the loot tier for a given skill level
|
|
|
|
- *
|
|
|
|
- * @param skillLevel Fishing skill level
|
|
|
|
- * @return Loot tier
|
|
|
|
- */
|
|
|
|
- public static int getLootTier(int skillLevel) {
|
|
|
|
- for (Tier tier : Tier.values()) {
|
|
|
|
- if (skillLevel >= tier.getLevel()) {
|
|
|
|
- return tier.toNumerical();
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- return 0;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * Gets the vanilla xp multiplier for a given skill level
|
|
|
|
- *
|
|
|
|
- * @param skillLevel Fishing skill level
|
|
|
|
- * @return Shake Mob probability
|
|
|
|
- */
|
|
|
|
- public static int getVanillaXpMultiplier(int skillLevel) {
|
|
|
|
- for (Tier tier : Tier.values()) {
|
|
|
|
- if (skillLevel >= tier.getLevel()) {
|
|
|
|
- return tier.getVanillaXPBoostModifier();
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- return 0;
|
|
|
|
- }
|
|
|
|
}
|
|
}
|