Prechádzať zdrojové kódy

Fishing Treasure Hunter overhaul

TfT_02 11 rokov pred
rodič
commit
82f8c4ce36
32 zmenil súbory, kde vykonal 650 pridanie a 356 odobranie
  1. 1 0
      Changelog.txt
  2. 52 34
      src/main/java/com/gmail/nossr50/commands/skills/FishingCommand.java
  3. 0 6
      src/main/java/com/gmail/nossr50/config/AdvancedConfig.java
  4. 54 11
      src/main/java/com/gmail/nossr50/config/treasure/TreasureConfig.java
  5. 29 0
      src/main/java/com/gmail/nossr50/datatypes/treasure/EnchantmentTreasure.java
  6. 2 12
      src/main/java/com/gmail/nossr50/datatypes/treasure/FishingTreasure.java
  7. 20 0
      src/main/java/com/gmail/nossr50/datatypes/treasure/Rarity.java
  8. 94 28
      src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java
  9. 50 0
      src/main/java/com/gmail/nossr50/util/EnchantmentUtils.java
  10. 0 4
      src/main/resources/advanced.yml
  11. 2 2
      src/main/resources/locale/locale_cs_CZ.properties
  12. 2 2
      src/main/resources/locale/locale_cy.properties
  13. 3 3
      src/main/resources/locale/locale_da.properties
  14. 3 3
      src/main/resources/locale/locale_de.properties
  15. 12 7
      src/main/resources/locale/locale_en_US.properties
  16. 2 2
      src/main/resources/locale/locale_es.properties
  17. 1 1
      src/main/resources/locale/locale_et_EE.properties
  18. 2 2
      src/main/resources/locale/locale_fi.properties
  19. 3 3
      src/main/resources/locale/locale_fr.properties
  20. 1 1
      src/main/resources/locale/locale_hu_HU.properties
  21. 2 2
      src/main/resources/locale/locale_it.properties
  22. 2 2
      src/main/resources/locale/locale_ko.properties
  23. 2 2
      src/main/resources/locale/locale_nl.properties
  24. 2 2
      src/main/resources/locale/locale_pl.properties
  25. 2 2
      src/main/resources/locale/locale_pt_BR.properties
  26. 2 2
      src/main/resources/locale/locale_ru.properties
  27. 1 1
      src/main/resources/locale/locale_sv.properties
  28. 2 2
      src/main/resources/locale/locale_th_TH.properties
  29. 1 1
      src/main/resources/locale/locale_tr_TR.properties
  30. 2 2
      src/main/resources/locale/locale_zh_CN.properties
  31. 2 2
      src/main/resources/locale/locale_zh_TW.properties
  32. 297 215
      src/main/resources/treasures.yml

+ 1 - 0
Changelog.txt

@@ -45,6 +45,7 @@ Version 1.4.07-dev
  = Fixed a bug where wrong feedback messages were being send when using a command on an offline player
  = Fixed a bug where players were able to gain Herbalism XP in mine carts, even though Prevent_AFK_Leveling was enabled
  = Fixed a bug where players would get hit by fireworks if they leveled up while in a boat
+ ! Changed Fishing "Treasure Hunter" and "Magic Hunter" drop percentages
  ! Changed format of mod config files. (blocks.yml, tools.yml, armor.yml and entities.yml) **YOU WILL NEED TO UPDATE YOUR FILE TO THE NEW FORMAT**
  ! Changed format of treasures.yml. **YOU WILL NEED TO UPDATE YOUR FILE TO THE NEW FORMAT**
  ! Changed format of repair.vanilla.yml. **YOU WILL NEED TO UPDATE YOUR FILE TO THE NEW FORMAT**

+ 52 - 34
src/main/java/com/gmail/nossr50/commands/skills/FishingCommand.java

@@ -4,7 +4,9 @@ import org.bukkit.block.Biome;
 import org.bukkit.entity.EntityType;
 
 import com.gmail.nossr50.config.AdvancedConfig;
+import com.gmail.nossr50.config.treasure.TreasureConfig;
 import com.gmail.nossr50.datatypes.skills.SkillType;
+import com.gmail.nossr50.datatypes.treasure.Rarity;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.skills.fishing.Fishing;
 import com.gmail.nossr50.skills.fishing.Fishing.Tier;
@@ -13,14 +15,21 @@ import com.gmail.nossr50.util.player.UserManager;
 
 public class FishingCommand extends SkillCommand {
     private int lootTier;
-    private String magicChance;
-    private String magicChanceLucky;
-    private String chanceRaining = "";
     private String shakeChance;
     private String shakeChanceLucky;
     private int fishermansDietRank;
     private String biteChance;
 
+    private String trapTreasure;
+    private String commonTreasure;
+    private String uncommonTreasure;
+    private String rareTreasure;
+    private String epicTreasure;
+    private String legendaryTreasure;
+    private String recordTreasure;
+
+    private String magicChance;
+
     private boolean canTreasureHunt;
     private boolean canMagicHunt;
     private boolean canShake;
@@ -39,16 +48,24 @@ public class FishingCommand extends SkillCommand {
         // TREASURE HUNTER
         if (canTreasureHunt) {
             lootTier = mcMMOPlayer.getFishingManager().getLootTier();
-            double enchantChance = lootTier * AdvancedConfig.getInstance().getFishingMagicMultiplier();
 
-            if (isStorming) {
-                chanceRaining = LocaleLoader.getString("Fishing.Chance.Raining");
-                enchantChance *= 1.1D;
-            }
+            // Item drop rates
+            trapTreasure = calculateAbilityDisplayValues(TreasureConfig.getInstance().getItemDropRate(lootTier, Rarity.TRAP))[0];
+            commonTreasure = calculateAbilityDisplayValues(TreasureConfig.getInstance().getItemDropRate(lootTier, Rarity.COMMON))[0];
+            uncommonTreasure = calculateAbilityDisplayValues(TreasureConfig.getInstance().getItemDropRate(lootTier, Rarity.UNCOMMON))[0];
+            rareTreasure = calculateAbilityDisplayValues(TreasureConfig.getInstance().getItemDropRate(lootTier, Rarity.RARE))[0];
+            epicTreasure = calculateAbilityDisplayValues(TreasureConfig.getInstance().getItemDropRate(lootTier, Rarity.EPIC))[0];
+            legendaryTreasure = calculateAbilityDisplayValues(TreasureConfig.getInstance().getItemDropRate(lootTier, Rarity.LEGENDARY))[0];
+            recordTreasure = calculateAbilityDisplayValues(TreasureConfig.getInstance().getItemDropRate(lootTier, Rarity.RECORD))[0];
+
+            // Magic hunter drop rates
+            double commonEnchantment = TreasureConfig.getInstance().getEnchantmentDropRate(lootTier, Rarity.COMMON);
+            double uncommonEnchantment = TreasureConfig.getInstance().getEnchantmentDropRate(lootTier, Rarity.UNCOMMON);
+            double rareEnchantment = TreasureConfig.getInstance().getEnchantmentDropRate(lootTier, Rarity.RARE);
+            double epicEnchantment = TreasureConfig.getInstance().getEnchantmentDropRate(lootTier, Rarity.EPIC);
+            double legendaryEnchantment = TreasureConfig.getInstance().getEnchantmentDropRate(lootTier, Rarity.LEGENDARY);
 
-            String[] treasureHunterStrings = calculateAbilityDisplayValues(enchantChance);
-            magicChance = treasureHunterStrings[0];
-            magicChanceLucky = treasureHunterStrings[1];
+            magicChance = calculateAbilityDisplayValues(commonEnchantment + uncommonEnchantment + rareEnchantment + epicEnchantment + legendaryEnchantment)[0];
         }
 
         // SHAKE
@@ -107,20 +124,20 @@ public class FishingCommand extends SkillCommand {
             player.sendMessage(LocaleLoader.getString("Effects.Template", LocaleLoader.getString("Fishing.Effect.2"), LocaleLoader.getString("Fishing.Effect.3")));
         }
 
-        if (canShake) {
-            player.sendMessage(LocaleLoader.getString("Effects.Template", LocaleLoader.getString("Fishing.Effect.4"), LocaleLoader.getString("Fishing.Effect.5")));
-        }
-
-        if (canFishermansDiet) {
-            player.sendMessage(LocaleLoader.getString("Effects.Template", LocaleLoader.getString("Fishing.Effect.6"), LocaleLoader.getString("Fishing.Effect.7")));
+        if (canIceFish) {
+            player.sendMessage(LocaleLoader.getString("Effects.Template", LocaleLoader.getString("Fishing.Effect.10"), LocaleLoader.getString("Fishing.Effect.11")));
         }
 
         if (canMasterAngler) {
             player.sendMessage(LocaleLoader.getString("Effects.Template", LocaleLoader.getString("Fishing.Effect.8"), LocaleLoader.getString("Fishing.Effect.9")));
         }
 
-        if (canIceFish) {
-            player.sendMessage(LocaleLoader.getString("Effects.Template", LocaleLoader.getString("Fishing.Effect.10"), LocaleLoader.getString("Fishing.Effect.11")));
+        if (canShake) {
+            player.sendMessage(LocaleLoader.getString("Effects.Template", LocaleLoader.getString("Fishing.Effect.4"), LocaleLoader.getString("Fishing.Effect.5")));
+        }
+
+        if (canFishermansDiet) {
+            player.sendMessage(LocaleLoader.getString("Effects.Template", LocaleLoader.getString("Fishing.Effect.6"), LocaleLoader.getString("Fishing.Effect.7")));
         }
     }
 
@@ -131,42 +148,43 @@ public class FishingCommand extends SkillCommand {
 
     @Override
     protected void statsDisplay() {
-        if (canMasterAngler) {
-            player.sendMessage(LocaleLoader.getString("Fishing.Ability.Chance", biteChance));
-        }
-
         if (canTreasureHunt) {
             player.sendMessage(LocaleLoader.getString("Fishing.Ability.Rank", lootTier, Tier.EIGHT.toNumerical()));
+            player.sendMessage(LocaleLoader.getString("Fishing.Ability.TH.DropRate", trapTreasure, commonTreasure, uncommonTreasure, rareTreasure, epicTreasure, legendaryTreasure, recordTreasure));
         }
 
         if (canMagicHunt) {
-            player.sendMessage(LocaleLoader.getString("Fishing.Enchant.Chance", magicChance) + chanceRaining + (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", magicChanceLucky) : ""));
+            player.sendMessage(LocaleLoader.getString("Fishing.Ability.TH.MagicRate", magicChance));
         }
 
-        if (canShake) {
-            int unlockLevel = AdvancedConfig.getInstance().getFishingTierLevel(Tier.ONE);
+        if (canIceFish) {
+            int unlockLevel = AdvancedConfig.getInstance().getIceFishingUnlockLevel();
 
             if (skillValue < unlockLevel) {
-                player.sendMessage(LocaleLoader.getString("Ability.Generic.Template.Lock", LocaleLoader.getString("Fishing.Ability.Locked.0", unlockLevel)));
+                player.sendMessage(LocaleLoader.getString("Ability.Generic.Template.Lock", LocaleLoader.getString("Fishing.Ability.Locked.1", unlockLevel)));
             }
             else {
-                player.sendMessage(LocaleLoader.getString("Fishing.Ability.Shake", shakeChance) + (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", shakeChanceLucky) : ""));
+                player.sendMessage(LocaleLoader.getString("Fishing.Ability.IceFishing"));
             }
         }
 
-        if (canFishermansDiet) {
-            player.sendMessage(LocaleLoader.getString("Fishing.Ability.FD", fishermansDietRank));
+        if (canMasterAngler) {
+            player.sendMessage(LocaleLoader.getString("Fishing.Ability.Chance", biteChance));
         }
 
-        if (canIceFish) {
-            int unlockLevel = AdvancedConfig.getInstance().getIceFishingUnlockLevel();
+        if (canShake) {
+            int unlockLevel = AdvancedConfig.getInstance().getFishingTierLevel(Tier.ONE);
 
             if (skillValue < unlockLevel) {
-                player.sendMessage(LocaleLoader.getString("Ability.Generic.Template.Lock", LocaleLoader.getString("Fishing.Ability.Locked.1", unlockLevel)));
+                player.sendMessage(LocaleLoader.getString("Ability.Generic.Template.Lock", LocaleLoader.getString("Fishing.Ability.Locked.0", unlockLevel)));
             }
             else {
-                player.sendMessage(LocaleLoader.getString("Fishing.Ability.IceFishing"));
+                player.sendMessage(LocaleLoader.getString("Fishing.Ability.Shake", shakeChance) + (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", shakeChanceLucky) : ""));
             }
         }
+
+        if (canFishermansDiet) {
+            player.sendMessage(LocaleLoader.getString("Fishing.Ability.FD", fishermansDietRank));
+        }
     }
 }

+ 0 - 6
src/main/java/com/gmail/nossr50/config/AdvancedConfig.java

@@ -199,10 +199,6 @@ public class AdvancedConfig extends AutoUpdateConfigLoader {
             }
         }
 
-        if (getFishingMagicMultiplier() <= 0) {
-            reason.add("Skills.Fishing.MagicHunter.Multiplier should be greater than 0!");
-        }
-
         if (getFishermanDietRankChange() < 1) {
             reason.add("Skills.Fishing.FishermansDiet.RankChange should be at least 1!");
         }
@@ -655,8 +651,6 @@ public class AdvancedConfig extends AutoUpdateConfigLoader {
     public double getShakeChance(Fishing.Tier tier) { return config.getDouble("Skills.Fishing.Shake_Chance.Rank_" + tier.toNumerical()); }
     public int getFishingVanillaXPModifier(Fishing.Tier tier) { return config.getInt("Skills.Fishing.VanillaXPMultiplier.Rank_" + tier.toNumerical()); }
 
-    public double getFishingMagicMultiplier() { return config.getDouble("Skills.Fishing.MagicHunter.Multiplier", 2.5D); }
-
     public int getFishermanDietRankChange() { return config.getInt("Skills.Fishing.FishermansDiet.RankChange", 200); }
 
     public int getIceFishingUnlockLevel() { return config.getInt("Skills.Fishing.IceFishing.UnlockLevel", 50); }

+ 54 - 11
src/main/java/com/gmail/nossr50/config/treasure/TreasureConfig.java

@@ -1,11 +1,13 @@
 package com.gmail.nossr50.config.treasure;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 
 import org.bukkit.DyeColor;
 import org.bukkit.Material;
 import org.bukkit.configuration.ConfigurationSection;
+import org.bukkit.enchantments.Enchantment;
 import org.bukkit.entity.EntityType;
 import org.bukkit.inventory.ItemStack;
 import org.bukkit.inventory.meta.ItemMeta;
@@ -14,10 +16,13 @@ import org.bukkit.potion.Potion;
 import org.bukkit.potion.PotionType;
 
 import com.gmail.nossr50.config.ConfigLoader;
+import com.gmail.nossr50.datatypes.treasure.EnchantmentTreasure;
 import com.gmail.nossr50.datatypes.treasure.ExcavationTreasure;
 import com.gmail.nossr50.datatypes.treasure.FishingTreasure;
 import com.gmail.nossr50.datatypes.treasure.HylianTreasure;
+import com.gmail.nossr50.datatypes.treasure.Rarity;
 import com.gmail.nossr50.datatypes.treasure.ShakeTreasure;
+import com.gmail.nossr50.util.EnchantmentUtils;
 
 public class TreasureConfig extends ConfigLoader {
     private static TreasureConfig instance;
@@ -57,7 +62,8 @@ public class TreasureConfig extends ConfigLoader {
     public List<ShakeTreasure> shakeFromWitch       = new ArrayList<ShakeTreasure>();
     public List<ShakeTreasure> shakeFromZombie      = new ArrayList<ShakeTreasure>();
 
-    public List<FishingTreasure> fishingRewards = new ArrayList<FishingTreasure>();
+    public HashMap<Rarity, List<FishingTreasure>> fishingRewards = new HashMap<Rarity, List<FishingTreasure>>();
+    public HashMap<Rarity, List<EnchantmentTreasure>> fishingEnchantments = new HashMap<Rarity, List<EnchantmentTreasure>>();
 
     private TreasureConfig() {
         super("treasures.yml");
@@ -82,6 +88,7 @@ public class TreasureConfig extends ConfigLoader {
         loadTreaures("Fishing");
         loadTreaures("Excavation");
         loadTreaures("Hylian_Luck");
+        loadEnchantments();
 
         for (EntityType entity : EntityType.values()) {
             if (entity.isAlive()) {
@@ -102,6 +109,13 @@ public class TreasureConfig extends ConfigLoader {
             return;
         }
 
+        // Initialize fishing HashMap
+        for (Rarity rarity : Rarity.values()) {
+            if (!fishingRewards.containsKey(rarity)) {
+                fishingRewards.put(rarity, (new ArrayList<FishingTreasure>()));
+            }
+        }
+
         for (String treasureName : treasureSection.getKeys(false)) {
             // Validate all the things!
             List<String> reason = new ArrayList<String>();
@@ -159,17 +173,13 @@ public class TreasureConfig extends ConfigLoader {
             /*
              * Specific Types
              */
-            int maxLevel = 0;
+            Rarity rarity = null;
 
             if (isFishing) {
-                maxLevel = config.getInt(type + "." + treasureName + ".Max_Level");
-
-                if (maxLevel < -1) {
-                    reason.add(treasureName + " has an invalid Max_Level: " + maxLevel);
-                }
+                rarity = Rarity.getRarity(config.getString(type + "." + treasureName + ".Rarity"));
 
-                if (maxLevel != -1 && maxLevel < dropLevel) {
-                    reason.add(treasureName + " Max_Level must be -1 or greater than Drop_Level!");
+                if (rarity == null) {
+                    reason.add("Invalid Rarity for item: " + treasureName);
                 }
             }
 
@@ -219,7 +229,7 @@ public class TreasureConfig extends ConfigLoader {
 
             if (noErrorsInConfig(reason)) {
                 if (isFishing) {
-                    fishingRewards.add(new FishingTreasure(item, xp, dropChance, dropLevel, maxLevel));
+                    fishingRewards.get(rarity).add(new FishingTreasure(item, xp));
                 }
                 else if (isShake) {
                     ShakeTreasure shakeTreasure = new ShakeTreasure(item, xp, dropChance, dropLevel);
@@ -343,4 +353,37 @@ public class TreasureConfig extends ConfigLoader {
             }
         }
     }
-}
+
+    private void loadEnchantments() {
+        for (Rarity rarity : Rarity.values()) {
+            if (rarity == Rarity.TRAP || rarity == Rarity.RECORD) {
+                continue;
+            }
+
+            if (!fishingEnchantments.containsKey(rarity)) {
+                fishingEnchantments.put(rarity, (new ArrayList<EnchantmentTreasure>()));
+            }
+
+            ConfigurationSection enchantmentSection = config.getConfigurationSection("Enchantments_Rarity." + rarity.toString());
+
+            if (enchantmentSection == null) {
+                return;
+            }
+
+            for (String enchantmentName : enchantmentSection.getKeys(false)) {
+                int level = config.getInt("Enchantments_Rarity." + rarity.toString() + "." + enchantmentName);
+                Enchantment enchantment = EnchantmentUtils.getByName(enchantmentName);
+
+                if (enchantment == null) {
+                    plugin.getLogger().warning("Skipping invalid enchantment in treasures.yml: " + enchantmentName);
+                    continue;
+                }
+
+                fishingEnchantments.get(rarity).add(new EnchantmentTreasure(enchantment, level));
+            }
+        }
+    }
+
+    public double getItemDropRate(int tier, Rarity rarity) { return config.getDouble("Item_Drop_Rates.Tier_" + tier + "." + rarity.toString()); }
+    public double getEnchantmentDropRate(int tier, Rarity rarity) { return config.getDouble("Enchantment_Drop_Rates.Tier_" + tier + "." + rarity.toString()); }
+}

+ 29 - 0
src/main/java/com/gmail/nossr50/datatypes/treasure/EnchantmentTreasure.java

@@ -0,0 +1,29 @@
+package com.gmail.nossr50.datatypes.treasure;
+
+import org.bukkit.enchantments.Enchantment;
+
+public class EnchantmentTreasure {
+    private Enchantment enchantment;
+    private int level;
+
+    public EnchantmentTreasure(Enchantment enchantment, int level) {
+        this.setEnchantment(enchantment);
+        this.setLevel(level);
+    }
+
+    public Enchantment getEnchantment() {
+        return enchantment;
+    }
+
+    public void setEnchantment(Enchantment enchantment) {
+        this.enchantment = enchantment;
+    }
+
+    public int getLevel() {
+        return level;
+    }
+
+    public void setLevel(int level) {
+        this.level = level;
+    }
+}

+ 2 - 12
src/main/java/com/gmail/nossr50/datatypes/treasure/FishingTreasure.java

@@ -3,18 +3,8 @@ package com.gmail.nossr50.datatypes.treasure;
 import org.bukkit.inventory.ItemStack;
 
 public class FishingTreasure extends Treasure {
-    private int maxLevel;
 
-    public FishingTreasure(ItemStack drop, int xp, Double dropChance, int dropLevel, int maxLevel) {
-        super(drop, xp, dropChance, dropLevel);
-        this.setMaxLevel(maxLevel);
-    }
-
-    public int getMaxLevel() {
-        return maxLevel;
-    }
-
-    public void setMaxLevel(int maxLevel) {
-        this.maxLevel = maxLevel;
+    public FishingTreasure(ItemStack drop, int xp) {
+        super(drop, xp, 0, 0);
     }
 }

+ 20 - 0
src/main/java/com/gmail/nossr50/datatypes/treasure/Rarity.java

@@ -0,0 +1,20 @@
+package com.gmail.nossr50.datatypes.treasure;
+
+public enum Rarity {
+    RECORD,
+    LEGENDARY,
+    EPIC,
+    RARE,
+    UNCOMMON,
+    COMMON,
+    TRAP;
+
+    public static Rarity getRarity(String string) {
+        try {
+            return valueOf(string);
+        }
+        catch (IllegalArgumentException ex) {
+            return COMMON;
+        }
+    }
+};

+ 94 - 28
src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java

@@ -26,10 +26,15 @@ import org.bukkit.entity.Player;
 import org.bukkit.entity.Sheep;
 import org.bukkit.entity.Skeleton;
 import org.bukkit.entity.Skeleton.SkeletonType;
+import org.bukkit.entity.TNTPrimed;
+import org.bukkit.entity.ThrownPotion;
 import org.bukkit.event.player.PlayerFishEvent;
 import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause;
 import org.bukkit.inventory.ItemStack;
 import org.bukkit.material.Wool;
+import org.bukkit.potion.Potion;
+import org.bukkit.potion.PotionType;
+import org.bukkit.util.Vector;
 
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.config.AdvancedConfig;
@@ -38,7 +43,9 @@ import com.gmail.nossr50.config.experience.ExperienceConfig;
 import com.gmail.nossr50.config.treasure.TreasureConfig;
 import com.gmail.nossr50.datatypes.player.McMMOPlayer;
 import com.gmail.nossr50.datatypes.skills.SkillType;
+import com.gmail.nossr50.datatypes.treasure.EnchantmentTreasure;
 import com.gmail.nossr50.datatypes.treasure.FishingTreasure;
+import com.gmail.nossr50.datatypes.treasure.Rarity;
 import com.gmail.nossr50.datatypes.treasure.ShakeTreasure;
 import com.gmail.nossr50.events.fake.FakeBlockBreakEvent;
 import com.gmail.nossr50.events.fake.FakePlayerFishEvent;
@@ -62,6 +69,7 @@ public class FishingManager extends SkillManager {
     private int fishingTries = 0;
     private long fishingTimestamp = 0L;
     private Location fishingTarget;
+    private Item fishingCatch;
 
     public FishingManager(McMMOPlayer mcMMOPlayer) {
         super(mcMMOPlayer, SkillType.FISHING);
@@ -246,8 +254,9 @@ public class FishingManager extends SkillManager {
     /**
      * Handle the Fisherman's Diet ability
      *
-     * @param rankChange The # of levels to change rank for the food
+     * @param rankChange     The # of levels to change rank for the food
      * @param eventFoodLevel The initial change in hunger from the event
+     *
      * @return the modified change in hunger for the event
      */
     public int handleFishermanDiet(int rankChange, int eventFoodLevel) {
@@ -294,16 +303,18 @@ public class FishingManager extends SkillManager {
      * @param fishingCatch The {@link Item} initially caught
      */
     public void handleFishing(Item fishingCatch) {
+        this.fishingCatch = fishingCatch;
         int treasureXp = 0;
         Player player = getPlayer();
         FishingTreasure treasure = null;
 
         if (Config.getInstance().getFishingDropsEnabled() && Permissions.fishingTreasureHunter(player)) {
             treasure = getFishingTreasure();
+            this.fishingCatch = null;
         }
 
         if (treasure != null) {
-            player.sendMessage(LocaleLoader.getString("Fishing.ItemFound"));
+            player.sendMessage(LocaleLoader.getString("Fishing.Ability.TH.ItemFound"));
 
             treasureXp = treasure.getXp();
             ItemStack treasureDrop = treasure.getDrop().clone(); // Not cloning is bad, m'kay?
@@ -339,10 +350,10 @@ public class FishingManager extends SkillManager {
                 }
 
                 if (enchanted) {
-                    player.sendMessage(LocaleLoader.getString("Fishing.MagicFound"));
+                    player.sendMessage(LocaleLoader.getString("Fishing.Ability.TH.MagicFound"));
                 }
 
-                Misc.dropItem(player.getEyeLocation(), fishingCatch.getItemStack());
+//                Misc.dropItem(player.getEyeLocation(), fishingCatch.getItemStack());
                 fishingCatch.setItemStack(treasureDrop);
             }
         }
@@ -354,6 +365,7 @@ public class FishingManager extends SkillManager {
      * Handle the vanilla XP boost for Fishing
      *
      * @param experience The amount of experience initially awarded by the event
+     *
      * @return the modified event damage
      */
     public int handleVanillaXpBoost(int experience) {
@@ -439,28 +451,32 @@ public class FishingManager extends SkillManager {
      * @return The {@link FishingTreasure} found, or null if no treasure was found.
      */
     private FishingTreasure getFishingTreasure() {
-        List<FishingTreasure> rewards = new ArrayList<FishingTreasure>();
-        int skillLevel = getSkillLevel();
+        double diceRoll = Misc.getRandom().nextDouble() * 100;
+        FishingTreasure treasure = null;
 
-        for (FishingTreasure treasure : TreasureConfig.getInstance().fishingRewards) {
-            int maxLevel = treasure.getMaxLevel();
+        for (Rarity rarity : Rarity.values()) {
+            double dropRate = TreasureConfig.getInstance().getItemDropRate(getLootTier(), rarity);
 
-            if (treasure.getDropLevel() <= skillLevel && (maxLevel >= skillLevel || maxLevel <= 0)) {
-                rewards.add(treasure);
+            if (diceRoll <= dropRate) {
+                if (rarity == Rarity.TRAP) {
+                    handleTraps();
+                    break;
+                }
+
+                List<FishingTreasure> fishingTreasures = TreasureConfig.getInstance().fishingRewards.get(rarity);
+                treasure = fishingTreasures.get(Misc.getRandom().nextInt(fishingTreasures.size()));
+                break;
             }
+
+            diceRoll -= dropRate;
         }
 
-        if (rewards.isEmpty()) {
+        if (treasure == null) {
             return null;
         }
 
-        FishingTreasure treasure = rewards.get(Misc.getRandom().nextInt(rewards.size()));
         ItemStack treasureDrop = treasure.getDrop();
 
-        if (!SkillUtils.treasureDropSuccessful(treasure.getDropChance(), activationChance)) {
-            return null;
-        }
-
         short maxDurability = treasureDrop.getType().getMaxDurability();
 
         if (maxDurability > 0) {
@@ -470,41 +486,91 @@ public class FishingManager extends SkillManager {
         return treasure;
     }
 
+    private void handleTraps() {
+        Player player = getPlayer();
+
+        if (Misc.getRandom().nextBoolean()) {
+            player.sendMessage(LocaleLoader.getString("Fishing.Ability.TH.Boom"));
+
+            TNTPrimed tnt = (TNTPrimed) player.getWorld().spawnEntity(fishingCatch.getLocation(), EntityType.PRIMED_TNT);
+            fishingCatch.setPassenger(tnt);
+
+            Vector velocity = fishingCatch.getVelocity();
+            double magnitude = velocity.length();
+            fishingCatch.setVelocity(velocity.multiply((magnitude + 1) / magnitude));
+
+            tnt.setFuseTicks(3 * Misc.TICK_CONVERSION_FACTOR);
+        }
+        else {
+            player.sendMessage(LocaleLoader.getString("Fishing.Ability.TH.Poison"));
+
+            ThrownPotion thrownPotion = player.getWorld().spawn(fishingCatch.getLocation(), ThrownPotion.class);
+            thrownPotion.setItem(new Potion(PotionType.POISON).splash().toItemStack(1));
+
+            fishingCatch.setPassenger(thrownPotion);
+        }
+    }
+
     /**
      * Process the Magic Hunter ability
      *
      * @param treasureDrop The {@link ItemStack} to enchant
+     *
      * @return true if the item has been enchanted
      */
     private Map<Enchantment, Integer> handleMagicHunter(ItemStack treasureDrop) {
-        Player player = getPlayer();
-        int activationChance = this.activationChance;
+        Map<Enchantment, Integer> enchants = new HashMap<Enchantment, Integer>();
+        List<EnchantmentTreasure> fishingEnchantments = null;
 
-        if (player.getWorld().hasStorm()) {
-            activationChance *= Fishing.STORM_MODIFIER;
-        }
+        double diceRoll = Misc.getRandom().nextDouble() * 100;
 
-        Map<Enchantment, Integer> enchants = new HashMap<Enchantment, Integer>();
+        for (Rarity rarity : Rarity.values()) {
+            if (rarity == Rarity.TRAP || rarity == Rarity.RECORD) {
+                continue;
+            }
 
-        if (Misc.getRandom().nextInt(activationChance) > getLootTier() * AdvancedConfig.getInstance().getFishingMagicMultiplier()) {
+            double dropRate = TreasureConfig.getInstance().getEnchantmentDropRate(getLootTier(), rarity);
+
+            if (diceRoll <= dropRate) {
+                fishingEnchantments = TreasureConfig.getInstance().fishingEnchantments.get(rarity);
+                break;
+            }
+
+            diceRoll -= dropRate;
+        }
+
+        if (fishingEnchantments == null) {
             return enchants;
         }
 
-        List<Enchantment> possibleEnchantments = getPossibleEnchantments(treasureDrop);
+        List<Enchantment> validEnchantments = getPossibleEnchantments(treasureDrop);
+        List<EnchantmentTreasure> possibleEnchants = new ArrayList<EnchantmentTreasure>();
+
+        for (EnchantmentTreasure enchantmentTreasure : fishingEnchantments) {
+            if (validEnchantments.contains(enchantmentTreasure.getEnchantment())) {
+                possibleEnchants.add(enchantmentTreasure);
+            }
+        }
+
+        if (possibleEnchants.isEmpty()) {
+            return enchants;
+        }
 
         // 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());
+        Collections.shuffle(possibleEnchants, Misc.getRandom());
 
         int specificChance = 1;
 
-        for (Enchantment possibleEnchantment : possibleEnchantments) {
+        for (EnchantmentTreasure enchantmentTreasure : possibleEnchants) {
+            Enchantment possibleEnchantment = enchantmentTreasure.getEnchantment();
+
             if (treasureDrop.getItemMeta().hasConflictingEnchant(possibleEnchantment) || Misc.getRandom().nextInt(specificChance) != 0) {
                 continue;
             }
 
-            enchants.put(possibleEnchantment, Math.max(Misc.getRandom().nextInt(possibleEnchantment.getMaxLevel()) + 1, possibleEnchantment.getStartLevel()));
+            enchants.put(possibleEnchantment, enchantmentTreasure.getLevel());
 
-            specificChance++;
+            specificChance *= 2;
         }
 
         return enchants;

+ 50 - 0
src/main/java/com/gmail/nossr50/util/EnchantmentUtils.java

@@ -0,0 +1,50 @@
+package com.gmail.nossr50.util;
+
+import java.util.HashMap;
+
+import org.bukkit.enchantments.Enchantment;
+
+public class EnchantmentUtils {
+
+    private static final HashMap<String, Enchantment> enchants = new HashMap<String, Enchantment>();
+
+    static {
+        enchants.put("SHARPNESS", Enchantment.DAMAGE_ALL);
+        enchants.put("POWER", Enchantment.ARROW_DAMAGE);
+        enchants.put("FIRE_PROTECTION", Enchantment.PROTECTION_FIRE);
+        enchants.put("FEATHER_FALLING", Enchantment.PROTECTION_FALL);
+        enchants.put("PROTECTION", Enchantment.PROTECTION_ENVIRONMENTAL);
+        enchants.put("BLAST_PROTECTION", Enchantment.PROTECTION_EXPLOSIONS);
+        enchants.put("PROJECTILE_PROTECTION", Enchantment.PROTECTION_PROJECTILE);
+        enchants.put("RESPIRATION", Enchantment.OXYGEN);
+        enchants.put("INFINITY", Enchantment.ARROW_INFINITE);
+        enchants.put("AQUA_AFFINITY", Enchantment.WATER_WORKER);
+        enchants.put("UNBREAKING", Enchantment.DURABILITY);
+        enchants.put("SMITE", Enchantment.DAMAGE_UNDEAD);
+        enchants.put("BANE_OF_ARTHROPODS", Enchantment.DAMAGE_ARTHROPODS);
+        enchants.put("EFFICIENCY", Enchantment.DIG_SPEED);
+        enchants.put("FIRE_ASPECT", Enchantment.FIRE_ASPECT);
+        enchants.put("SILK_TOUCH", Enchantment.SILK_TOUCH);
+        enchants.put("FORTUNE", Enchantment.LOOT_BONUS_BLOCKS);
+        enchants.put("LOOTING", Enchantment.LOOT_BONUS_MOBS);
+        enchants.put("PUNCH", Enchantment.ARROW_KNOCKBACK);
+        enchants.put("FLAME", Enchantment.ARROW_FIRE);
+        enchants.put("KNOCKBACK", Enchantment.KNOCKBACK);
+        enchants.put("THORNS", Enchantment.THORNS);
+    }
+
+    /**
+     * Method to get an {@link Enchantment} using it's Vanilla Minecraft name or Bukkit enum name
+     *
+     * @param enchantmentName Vanilla or Bukkit name of enchantment
+     *
+     * @return Enchantment or null if no enchantment was found
+     */
+    public static Enchantment getByName(String enchantmentName) {
+        if (enchants.containsKey(enchantmentName)) {
+            return enchants.get(enchantmentName);
+        }
+
+        return null;
+    }
+}

+ 0 - 4
src/main/resources/advanced.yml

@@ -152,10 +152,6 @@ Skills:
             Rank_7: 5
             Rank_8: 5
 
-        MagicHunter:
-            # Multiplier: Determines the chance of fishing enchanted items. The chance is calculated by getting the fishing TreasureHunt tier and multiplying it with <Multiplier>
-            Multiplier: 2.5
-
         FishermansDiet:
             # This determines when Fisherman's Diet adds extra hunger recovery to food
             RankChange: 200

+ 2 - 2
src/main/resources/locale/locale_cs_CZ.properties

@@ -94,9 +94,9 @@ Fishing.Effect.10=Ryba\u0159en\u00ed v ledu
 Fishing.Effect.11=Umo\u017e\u0148uje v\u00e1m ryba\u0159it v ledov\u00fdch prost\u0159ed\u00edch
 Fishing.Enchant.Chance=[[RED]]\u0160ance na magick\u00e9ho lovce: [[YELLOW]]{0}
 Fishing.Chance.Raining=[[BLUE]] De\u0161\u0165ov\u00fd bonus
-Fishing.ItemFound=[[GRAY]]Nasel si poklad!
+Fishing.Ability.TH.ItemFound=[[GRAY]]Nasel si poklad!
 Fishing.Listener=Rybareni:
-Fishing.MagicFound=[[GRAY]]C\u00edt\u00edte dotek magie s t\u00edmto \u00falovkem...
+Fishing.Ability.TH.MagicFound=[[GRAY]]C\u00edt\u00edte dotek magie s t\u00edmto \u00falovkem...
 Fishing.SkillName=RYBARENI
 Fishing.Skillup=[[YELLOW]]Dovednost v rybareni byla navysena o {0}. Celkem ({1})
 Herbalism.Ability.DoubleDropChance=[[RED]]\u0160ance na dvojn\u00e1sobn\u00fd zisk: [[YELLOW]]{0}

+ 2 - 2
src/main/resources/locale/locale_cy.properties

@@ -86,9 +86,9 @@ Fishing.Effect.6=Fisherman\'s Diet
 Fishing.Effect.7=Improves hunger restored from fished foods
 Fishing.Enchant.Chance=[[RED]]Magic Hunter Chance: [[YELLOW]]{0}
 Fishing.Chance.Raining=[[BLUE]] Rain Bonus
-Fishing.ItemFound=[[GRAY]]Treasure found!
+Fishing.Ability.TH.ItemFound=[[GRAY]]Treasure found!
 Fishing.Listener=Fishing:
-Fishing.MagicFound=[[GRAY]]You feel a touch of magic with this catch...
+Fishing.Ability.TH.MagicFound=[[GRAY]]You feel a touch of magic with this catch...
 Fishing.SkillName=FISHING
 Fishing.Skillup=[[YELLOW]]Fishing skill increased by {0}. Total ({1})
 Herbalism.Ability.DoubleDropChance=[[RED]]Double Drop Chance: [[YELLOW]]{0}

+ 3 - 3
src/main/resources/locale/locale_da.properties

@@ -86,9 +86,9 @@ Fishing.Effect.6=Fiskers Diet
 Fishing.Effect.7=Forbedrer Sult genoprettet af Fisked mad
 Fishing.Enchant.Chance=[[RED]]Magi J\u00e6ger Chance: [[YELLOW]]{0}
 Fishing.Chance.Raining=[[BLUE]] Regn Bonus
-Fishing.ItemFound=[[GRAY]Du har fundet en skat!
-Fishing.Listener=Fiskeri:
-Fishing.MagicFound=[[GRAY]]Du f\u00f8ler et strejf a magi med denne fangst...
+Fishing.Ability.TH.ItemFound=[[GRAY]Du har fundet en skat!
+Fishing.Listener=Fiskeri\: 
+Fishing.Ability.TH.MagicFound=[[GRAY]]Du f\u00f8ler et strejf a magi med denne fangst...
 Fishing.SkillName=FISKER
 Fishing.Skillup=[[YELLOW]]Fisker evne for\u00f8get med {0}. Total ({1})
 Herbalism.Ability.DoubleDropChance=[[RED]]2x Tabs Chance: [[YELLOW]]{0}

+ 3 - 3
src/main/resources/locale/locale_de.properties

@@ -86,9 +86,9 @@ Fishing.Effect.6=Fischer-Mahlzeit
 Fishing.Effect.7=Verbessert Effizienz von geangelter Nahrung
 Fishing.Enchant.Chance=[[RED]]Zauber-J\u00e4ger Chance: [[YELLOW]]{0}
 Fishing.Chance.Raining=[[BLUE]] Rain Bonus
-Fishing.ItemFound=[[AQUA]]Du hast einen Schatz gefunden!
-Fishing.Listener=Angeln:
-Fishing.MagicFound=[[AQUA]]Dich ber\u00fchrt ein leichter Zauber bei diesem Fang...
+Fishing.Ability.TH.ItemFound=[[AQUA]]Du hast einen Schatz gefunden!
+Fishing.Listener=Angeln\: 
+Fishing.Ability.TH.MagicFound=[[AQUA]]Dich ber\u00fchrt ein leichter Zauber bei diesem Fang...
 Fishing.SkillName=ANGELN
 Fishing.Skillup=[[YELLOW]]Angel Skill um {0} gestiegen. Gesamt ({1})
 Herbalism.Ability.DoubleDropChance=[[RED]]Chance auf Doppel-Drops: [[YELLOW]]{0}

+ 12 - 7
src/main/resources/locale/locale_en_US.properties

@@ -104,6 +104,8 @@ Fishing.Ability.Info=[[RED]]Magic Hunter: [[GRAY]] **Improves With Treasure Hunt
 Fishing.Ability.Locked.0=LOCKED UNTIL {0}+ SKILL (SHAKE)
 Fishing.Ability.Locked.1=LOCKED UNTIL {0}+ SKILL (ICE FISHING)
 Fishing.Ability.Rank=[[RED]]Treasure Hunter Rank: [[YELLOW]]{0}/{1}
+Fishing.Ability.TH.DropRate=[[RED]] Drop Rate: [[DARK_RED]]Trap: [[YELLOW]]{0} [[GRAY]]Common: [[YELLOW]]{1} [[GREEN]]Uncommon: [[YELLOW]]{2}\n[[BLUE]]Rare: [[YELLOW]]{3} [[LIGHT_PURPLE]]Epic: [[YELLOW]]{4} [[GOLD]]Legendary: [[YELLOW]]{5} [[AQUA]]Record: [[YELLOW]]{6}
+Fishing.Ability.TH.MagicRate=[[RED]]Magic Hunter Chance: [[YELLOW]]{0}
 Fishing.Ability.Shake=[[RED]]Shake Chance: [[YELLOW]]{0}
 Fishing.Ability.IceFishing=[[RED]]Ice Fishing: Go fishing in ice
 Fishing.Ability.FD=[[RED]]Fisherman''s Diet: [[YELLOW]]Rank {0}
@@ -119,11 +121,12 @@ Fishing.Effect.8=Master Angler
 Fishing.Effect.9=Improves chance of getting a bite while fishing
 Fishing.Effect.10=Ice Fishing
 Fishing.Effect.11=Allows you to fish in icy biomes
-Fishing.Enchant.Chance=[[RED]]Magic Hunter Chance: [[YELLOW]]{0}
 Fishing.Chance.Raining=[[BLUE]] Rain Bonus
-Fishing.ItemFound=[[GRAY]]Treasure found!
 Fishing.Listener=Fishing: 
-Fishing.MagicFound=[[GRAY]]You feel a touch of magic with this catch...
+Fishing.Ability.TH.ItemFound=[[GRAY]]Treasure found!
+Fishing.Ability.TH.MagicFound=[[GRAY]]You feel a touch of magic with this catch...
+Fishing.Ability.TH.Boom=[[GRAY]]BOOM TIME!!!
+Fishing.Ability.TH.Poison=[[GRAY]]Something doesn't smell quite right...
 Fishing.SkillName=FISHING
 Fishing.Skillup=[[YELLOW]]Fishing skill increased by {0}. Total ({1})
 
@@ -655,10 +658,12 @@ Guides.Excavation.Section.5=[[DARK_AQUA]]Notes about Excavation:\n[[YELLOW]]Exca
 
 ##Fishing
 Guides.Fishing.Section.0=[[DARK_AQUA]]About Fishing:\n[[YELLOW]]With the Fishing skill, Fishing is exciting again!\n[[YELLOW]]Find hidden treasures, and shake items off mobs.\n\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]Catch fish.
-Guides.Fishing.Section.1=[[DARK_AQUA]]How does Treasure Hunter work?\n[[YELLOW]]This ability allows you to find treasure from fishing \n[[YELLOW]]with a small chance of the items being enchanted.\n[[YELLOW]]Every possible treasure for Fishing has its own\n[[YELLOW]]skill level requirement for it to drop.\n\n[[YELLOW]]The higher your Fishing skill is, the more\n[[YELLOW]]treasures that can be found.
-Guides.Fishing.Section.2=[[DARK_AQUA]]How does Shake work?\n[[YELLOW]]This active ability allows you to shake items loose from mobs\n[[YELLOW]]by hooking them with the fishing rod. \n[[YELLOW]]Mobs will drop items they would normally drop on death.\n[[YELLOW]]It is also possible to acquire mob skulls, which are normally \n[[YELLOW]]unobtainable in survival mode.
-Guides.Fishing.Section.3=[[DARK_AQUA]]How does Fisherman's Diet work?\n[[YELLOW]]This passive skill increases the amount of hunger restored \n[[YELLOW]]from eating fish.
-Guides.Fishing.Section.4=[[DARK_AQUA]]Notes about Fishing:\n[[YELLOW]]Fishing drops are completely customizable,\n[[YELLOW]]so results vary server to server.
+Guides.Fishing.Section.1=[[DARK_AQUA]]How does Treasure Hunter work?\n[[YELLOW]]This ability allows you to find treasure from fishing \n[[YELLOW]]with a small chance of the items being enchanted.\n[[YELLOW]]Every possible treasure for Fishing has a chance\n[[YELLOW]]to drop on any level. It depends however\n[[YELLOW]]what the rarity of the item is how often it will drop.\n[[YELLOW]]The higher your Fishing skill is, the better\n[[YELLOW]]your chances are to find better treasures.
+Guides.Fishing.Section.2=[[DARK_AQUA]]How does Ice Fishing work?\n[[YELLOW]]This passive skill allows you to fish in ice lakes!\n[[YELLOW]]Cast your fishing rod in an ice lake and the ability will\n[[YELLOW]]create a small hole in the ice to fish in.
+Guides.Fishing.Section.3=[[DARK_AQUA]]How does Master Angler work?\n[[YELLOW]]This passive skill increases the bite chance while fishing.\n[[YELLOW]]When you've unlocked this ability, fishing while in\n[[YELLOW]]a boat or an ocean biome will double the bite chance.
+Guides.Fishing.Section.4=[[DARK_AQUA]]How does Shake work?\n[[YELLOW]]This active ability allows you to shake items loose from mobs\n[[YELLOW]]by hooking them with the fishing rod. \n[[YELLOW]]Mobs will drop items they would normally drop on death.\n[[YELLOW]]It is also possible to acquire mob skulls, which are normally \n[[YELLOW]]unobtainable in survival mode.
+Guides.Fishing.Section.5=[[DARK_AQUA]]How does Fisherman's Diet work?\n[[YELLOW]]This passive skill increases the amount of hunger restored \n[[YELLOW]]from eating fish.
+Guides.Fishing.Section.6=[[DARK_AQUA]]Notes about Fishing:\n[[YELLOW]]Fishing drops are completely customizable,\n[[YELLOW]]so results vary server to server.
 
 ##Herbalism
 Guides.Herbalism.Section.0=[[DARK_AQUA]]About Herbalism:\n[[YELLOW]]Herbalism is about collecting herbs and plants.\n\n\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]Collect plants and herbs.

+ 2 - 2
src/main/resources/locale/locale_es.properties

@@ -95,9 +95,9 @@ Fishing.Effect.10=Pesca de hielo
 Fishing.Effect.11=Te permite pescar en biomas de hielo
 Fishing.Enchant.Chance=[[RED]]Probabilidad de Cazador M\u00e1gico: [[YELLOW]]{0}
 Fishing.Chance.Raining=[[BLUE]] Lluvia de Bonus
-Fishing.ItemFound=[[GRAY]]\u00a1Tesoro encontrado!
+Fishing.Ability.TH.ItemFound=[[GRAY]]\u00a1Tesoro encontrado!
 Fishing.Listener=Pescador: 
-Fishing.MagicFound=[[GRAY]]Sientes un toque de magia con esta pesca...
+Fishing.Ability.TH.MagicFound=[[GRAY]]Sientes un toque de magia con esta pesca...
 Fishing.SkillName=PESCADOR
 Fishing.Skillup=[[YELLOW]]Habilidad de Pescador incrementada en {0}. Total ({1})
 Herbalism.Ability.DoubleDropChance=[[RED]]Probabilidad de Doble Drop: [[YELLOW]]{0}

+ 1 - 1
src/main/resources/locale/locale_et_EE.properties

@@ -2,7 +2,7 @@ Acrobatics.Listener=Akrobaatika:
 Acrobatics.SkillName=AKROBAATIKA
 Acrobatics.Skillup=[[YELLOW]]Akrobaatika oskus kasvanud {0} v\u00f5rra. Kokku ({1})
 Archery.Skillup=[[YELLOW]]Vibunduse oskus kasvanud {0} v\u00f5rra. Kokku ({1})
-Fishing.ItemFound=[[GRAY]]Varandus leitud!
+Fishing.Ability.TH.ItemFound=[[GRAY]]Varandus leitud!
 Mining.Ability.Lower=[[GRAY]]**TE LANGETASITE OMA KIRKA**
 Mining.Ability.Ready=[[GREEN]]**TE PANITE OMA KIRKA VALMIS**
 Mining.Listener=Kaevandamine:

+ 2 - 2
src/main/resources/locale/locale_fi.properties

@@ -15,8 +15,8 @@ Excavation.Listener=Kaivuu:
 Excavation.SkillName=KAIVANTO
 Excavation.Skills.GigaDrillBreaker.On=[[GREEN]]**TEHO PORA HAJOITUS AKTIVOITU**
 Excavation.Skillup=[[YELLOW]]Kaivuu taito nousi  {0} tasolla. Kokonaism\u00e4\u00e4r\u00e4 ({1})
-Fishing.ItemFound=[[GRAY]]Treasure found!
-Fishing.MagicFound=[[GRAY]]You feel a touch of magic with this catch...
+Fishing.Ability.TH.ItemFound=[[GRAY]]Treasure found!
+Fishing.Ability.TH.MagicFound=[[GRAY]]You feel a touch of magic with this catch...
 Herbalism.Ability.GTh=[[GREEN]]**VIHERPEUKALO**
 Herbalism.Listener=Yrttitietous:
 Herbalism.Skills.GTe.Refresh=[[GREEN]]Sinun [[YELLOW]]Viherpeukalo [[GREEN]]taito on latautunut!

+ 3 - 3
src/main/resources/locale/locale_fr.properties

@@ -80,9 +80,9 @@ Fishing.Effect.3=Remonte des objets magiques
 Fishing.Effect.4=Secousse (sur monstres)
 Fishing.Effect.5=Fait tomber des objets des monstres avec une canne \u00e0 p\u00eache
 Fishing.Enchant.Chance=[[RED]]Chasse magique: [[YELLOW]]{0}
-Fishing.ItemFound=[[GRAY]]Tr\u00e9sor d\u00e9couvert !
-Fishing.Listener=P\u00eache :
-Fishing.MagicFound=[[GRAY]]Vous ressentez quelque chose de magique dans cette prise...
+Fishing.Ability.TH.ItemFound=[[GRAY]]Tr\u00e9sor d\u00e9couvert !
+Fishing.Listener=P\u00EAche\: 
+Fishing.Ability.TH.MagicFound=[[GRAY]]Vous ressentez quelque chose de magique dans cette prise...
 Fishing.SkillName=P\u00caCHE
 Fishing.Skillup=[[YELLOW]]Le talent p\u00eache augmente de {0}. Total ({1})
 Herbalism.Ability.DoubleDropChance=[[RED]]Double Drop: [[YELLOW]]{0}

+ 1 - 1
src/main/resources/locale/locale_hu_HU.properties

@@ -24,7 +24,7 @@ Excavation.Skills.GigaDrillBreaker.Refresh=[[GREEN]]A TE [[YELLOW]]Giga B\u00e1n
 Excavation.Skills.GigaDrillBreaker.Other.On=[[GREEN]]{0}[[DARK_GREEN]] haszn\u00e1latban [[RED]]Giga B\u00e1ny\u00e1sz Cs\u00e1k\u00e1ny!
 Excavation.Skillup=[[YELLOW]]\u00c1s\u00e1s fejl\u0151d\u00f6tt {0} szinttel. \u00d6sszesen: ({1})
 Fishing.Effect.10=J\u00e9g Horg\u00e1szat
-Fishing.ItemFound=[[GRAY]]Kincs megtal\u00e1lva!
+Fishing.Ability.TH.ItemFound=[[GRAY]]Kincs megtal\u00e1lva!
 Fishing.Listener=Horg\u00e1szat:
 Fishing.SkillName=HORG\u00c1SZAT
 Herbalism.Ability.Lower=[[GRAY]]**LETETTED A KAP\u00c1DAT**

+ 2 - 2
src/main/resources/locale/locale_it.properties

@@ -95,9 +95,9 @@ Fishing.Effect.10=Pesca sul Ghiaccio
 Fishing.Effect.11=Ti permette di pescare nei biomi ghiacciati
 Fishing.Enchant.Chance=[[RED]]Possibilit\u00e0 di Cacciatore di Magia: [[YELLOW]]{0}
 Fishing.Chance.Raining=[[BLUE]] Bonus Pioggia
-Fishing.ItemFound=[[GRAY]]Hai trovato un tesoro!
+Fishing.Ability.TH.ItemFound=[[GRAY]]Hai trovato un tesoro!
 Fishing.Listener=Pesca:
-Fishing.MagicFound=[[GRAY]]Senti un tocco di magia in questa cattura...
+Fishing.Ability.TH.MagicFound=[[GRAY]]Senti un tocco di magia in questa cattura...
 Fishing.SkillName=PESCA
 Fishing.Skillup=[[YELLOW]]L''abilit\u00e0 Pesca \u00e8 aumentata di {0}. Totale ({1})
 Herbalism.Ability.DoubleDropChance=[[RED]]Possibilit\u00e0 di Doppio Drop: [[YELLOW]]{0}

+ 2 - 2
src/main/resources/locale/locale_ko.properties

@@ -95,9 +95,9 @@ Fishing.Effect.10=\uc5bc\uc74c \ub09a\uc2dc
 Fishing.Effect.11=\uc5bc\uc74c \uc9c0\ud615\uc5d0\uc11c \ub09a\uc2dc\ub97c \ud560 \uc218 \uc788\uac8c \ud574\uc90d\ub2c8\ub2e4.
 Fishing.Enchant.Chance=[[RED]]\ub9c8\ubc95 \ubcf4\ubb3c \uc0ac\ub0e5\uafbc \ud655\ub960: [[YELLOW]]{0}
 Fishing.Chance.Raining=[[BLUE]] \ube44 \ubcf4\ub108\uc2a4
-Fishing.ItemFound=[[GRAY]]\ubcf4\ubb3c\uc744 \ubc1c\uacac\ud588\uc2b5\ub2c8\ub2e4!
+Fishing.Ability.TH.ItemFound=[[GRAY]]\ubcf4\ubb3c\uc744 \ubc1c\uacac\ud588\uc2b5\ub2c8\ub2e4!
 Fishing.Listener=\ub09a\uc2dc:
-Fishing.MagicFound=[[GRAY]]\uc774\ubc88 \ub09a\uc2dc\uc5d0 \ub9c8\ubc95\uc758 \uc190\uae38\uc774 \ub290\uaef4\uc9d1\ub2c8\ub2e4.
+Fishing.Ability.TH.MagicFound=[[GRAY]]\uc774\ubc88 \ub09a\uc2dc\uc5d0 \ub9c8\ubc95\uc758 \uc190\uae38\uc774 \ub290\uaef4\uc9d1\ub2c8\ub2e4.
 Fishing.SkillName=\ub09a\uc2dc
 Fishing.Skillup=[[YELLOW]]\ub09a\uc2dc \uae30\uc220\uc774 {0} \uc99d\uac00\ud558\uc5ec {1}\ub808\ubca8\uc774 \ub418\uc5c8\uc2b5\ub2c8\ub2e4.
 Herbalism.Ability.DoubleDropChance=[[RED]]2\ubc30 \ub4dc\ub78d \ud655\ub960: [[YELLOW]]{0}

+ 2 - 2
src/main/resources/locale/locale_nl.properties

@@ -30,9 +30,9 @@ Excavation.Skills.GigaDrillBreaker.On=[[GREEN]]**GIGA DRILL BREKER GEACTIVEERD**
 Excavation.Skillup=[[YELLOW]]Uitgravings ervaring toegenomen met {0}. Totaal ({1})
 Fishing.Effect.8=Meester Hengelaar
 Fishing.Chance.Raining=[[BLUE]] Regen Bonus
-Fishing.ItemFound=[[GRAY]]Schat gevonden!
+Fishing.Ability.TH.ItemFound=[[GRAY]]Schat gevonden!
 Fishing.Listener=Vissen:
-Fishing.MagicFound=[[GRAY]]Jij voelt een vleugje magie met deze vangst...
+Fishing.Ability.TH.MagicFound=[[GRAY]]Jij voelt een vleugje magie met deze vangst...
 Herbalism.Ability.GTh=[[GREEN]]**GROEN DUIMPJE**
 Herbalism.Effect.10=Hylian Geluk
 Herbalism.Effect.11=Geeft een kleine kans om zeldzame voorwerpen te vinden

+ 2 - 2
src/main/resources/locale/locale_pl.properties

@@ -93,9 +93,9 @@ Fishing.Effect.10=Lodowe lowienie ryb
 Fishing.Effect.11=Pozwala na lowienie ryb w zimowych biomach
 Fishing.Enchant.Chance=[[RED]]Szanse na Magicznego \u0141owc\u0119: [[YELLOW]]{0}
 Fishing.Chance.Raining=[[BLUE]] Bonus od Deszczu
-Fishing.ItemFound=[[GRAY]]Znaleziono skarb!
+Fishing.Ability.TH.ItemFound=[[GRAY]]Znaleziono skarb!
 Fishing.Listener=Rybactwo
-Fishing.MagicFound=[[GRAY]]Wyczuwasz w pobli\u017cu \u017ar\u00f3d\u0142o magii...
+Fishing.Ability.TH.MagicFound=[[GRAY]]Wyczuwasz w pobli\u017cu \u017ar\u00f3d\u0142o magii...
 Fishing.SkillName=RYBACTWO
 Fishing.Skillup=[[YELLOW]]Umiej\u0119tno\u015b\u0107 \u0142owienia wzros\u0142a o {0}. Razem ({1})
 Herbalism.Ability.DoubleDropChance=[[RED]]Szansa na Podw\u00f3jny Drop: [[YELLOW]]{0}

+ 2 - 2
src/main/resources/locale/locale_pt_BR.properties

@@ -29,8 +29,8 @@ Excavation.Effect.3=Habilidade de cavar tesouros
 Excavation.Listener=Escava\u00e7\u00e3o:
 Excavation.SkillName=Escava\u00e7\u00e3o
 Excavation.Skillup=[[AMARELO]]Habilidade Escava\u00e7\u00e3o aumentada em {0}. Total ({1})
-Fishing.ItemFound=[[GRAY]]Tesouro encontrado!
-Fishing.MagicFound=[[GRAY]]You feel a touch of magic with this catch...
+Fishing.Ability.TH.ItemFound=[[GRAY]]Tesouro encontrado!
+Fishing.Ability.TH.MagicFound=[[GRAY]]You feel a touch of magic with this catch...
 Fishing.SkillName=PESCARIA
 Herbalism.Ability.GTh=[[GREEN]]**DED\u00c3O VERDE**
 Herbalism.Ability.Lower=[[GRAY]]**VOC\u00ca ABAIXA SUA ENXADA**

+ 2 - 2
src/main/resources/locale/locale_ru.properties

@@ -95,9 +95,9 @@ Fishing.Effect.10=\u041f\u043e\u0434\u043b\u0435\u0434\u043d\u0430\u044f \u0420\
 Fishing.Effect.11=\u041f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u0430\u043c \u0440\u044b\u0431\u0430\u0447\u0438\u0442\u044c \u0432 \u0441\u043d\u0435\u0436\u043d\u044b\u0445 \u0431\u0438\u043e\u043c\u0430\u0445
 Fishing.Enchant.Chance=[[RED]]\u0428\u0430\u043d\u0441 \u041e\u0445\u043e\u0442\u043d\u0438\u043a\u0430 \u0417\u0430 \u041c\u0430\u0433\u0438\u0435\u0439: [[YELLOW]]{0}
 Fishing.Chance.Raining=[[BLUE]] \u0411\u043e\u043d\u0443\u0441 \u0414\u043e\u0436\u0434\u044f
-Fishing.ItemFound=[[GRAY]]\u041d\u0430\u0439\u0434\u0435\u043d\u043e \u0441\u043e\u043a\u0440\u043e\u0432\u0438\u0449\u0435!
+Fishing.Ability.TH.ItemFound=[[GRAY]]\u041d\u0430\u0439\u0434\u0435\u043d\u043e \u0441\u043e\u043a\u0440\u043e\u0432\u0438\u0449\u0435!
 Fishing.Listener=\u0420\u044b\u0431\u043e\u043b\u043e\u0432\u0441\u0442\u0432\u043e:
-Fishing.MagicFound=[[GRAY]]\u0412\u044b \u043f\u043e\u0447\u0443\u0432\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u0438 \u043c\u0430\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u0438\u043a\u043e\u0441\u043d\u043e\u0432\u0435\u043d\u0438\u0435 \u0441 \u044d\u0442\u0438\u043c \u0443\u043b\u043e\u0432\u043e\u043c...
+Fishing.Ability.TH.MagicFound=[[GRAY]]\u0412\u044b \u043f\u043e\u0447\u0443\u0432\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u0438 \u043c\u0430\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u0438\u043a\u043e\u0441\u043d\u043e\u0432\u0435\u043d\u0438\u0435 \u0441 \u044d\u0442\u0438\u043c \u0443\u043b\u043e\u0432\u043e\u043c...
 Fishing.SkillName=\u0420\u042b\u0411\u041e\u041b\u041e\u0412\u0421\u0422\u0412\u041e
 Fishing.Skillup=[[YELLOW]]\u0423\u0440\u043e\u0432\u0435\u043d\u044c \u043d\u0430\u0432\u044b\u043a\u0430 \"\u0420\u044b\u0431\u043e\u043b\u043e\u0432\u0441\u0442\u0432\u043e\" \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d \u043d\u0430 {0}. \u0412\u0441\u0435\u0433\u043e ({1})
 Herbalism.Ability.DoubleDropChance=[[RED]]\u0428\u0430\u043d\u0441 \u0414\u0432\u043e\u0439\u043d\u043e\u0433\u043e \u0414\u0440\u043e\u043f\u0430: [[YELLOW]]{0} %

+ 1 - 1
src/main/resources/locale/locale_sv.properties

@@ -15,7 +15,7 @@ Excavation.Listener=Gr\u00e4vning:
 Excavation.SkillName=Gr\u00e4vning
 Excavation.Skills.GigaDrillBreaker.On=[[GREEN]]**GIGA BORR KROSSAREN AKTIVERAD**
 Excavation.Skillup=[[YELLOW]]Gr\u00e4vningsf\u00e4rdigheten har \u00f6kat med {0}. Totalt ({1})
-Fishing.ItemFound=[[GRAY]]Skatt hittad!
+Fishing.Ability.TH.ItemFound=[[GRAY]]Skatt hittad!
 Herbalism.Ability.GTh=[[GREEN]]**GR\u00d6NA FINGRAR**
 Herbalism.Listener=V\u00e4xtk\u00e4nnedom:
 Herbalism.Skills.GTe.Refresh=[[GREEN]]Dina[[YELLOW]]Gr\u00f6na fingrar  [[GREEN]]f\u00f6rm\u00e5ga \u00e4r vederkvickad!

+ 2 - 2
src/main/resources/locale/locale_th_TH.properties

@@ -94,9 +94,9 @@ Fishing.Effect.10=Ice Fishing
 Fishing.Effect.11=\u0e2d\u0e19\u0e38\u0e0d\u0e32\u0e15\u0e34\u0e43\u0e2b\u0e49\u0e15\u0e01\u0e1b\u0e25\u0e32\u0e43\u0e19\u0e19\u0e49\u0e33\u0e41\u0e02\u0e47\u0e07
 Fishing.Enchant.Chance=[[RED]]Magic Hunter \u0e42\u0e2d\u0e01\u0e32\u0e2a: [[YELLOW]]{0}
 Fishing.Chance.Raining=[[BLUE]] Rain Bonus
-Fishing.ItemFound=[[GRAY]]\u0e44\u0e14\u0e49\u0e1e\u0e1a\u0e2a\u0e21\u0e1a\u0e31\u0e15\u0e34!
+Fishing.Ability.TH.ItemFound=[[GRAY]]\u0e44\u0e14\u0e49\u0e1e\u0e1a\u0e2a\u0e21\u0e1a\u0e31\u0e15\u0e34!
 Fishing.Listener=\u0e17\u0e31\u0e01\u0e29\u0e30 Fishing:
-Fishing.MagicFound=[[GRAY]]\u0e04\u0e38\u0e13\u0e23\u0e39\u0e49\u0e2a\u0e36\u0e01\u0e44\u0e14\u0e49\u0e16\u0e36\u0e07\u0e2a\u0e31\u0e21\u0e1c\u0e31\u0e2a\u0e02\u0e2d\u0e07\u0e40\u0e27\u0e17\u0e21\u0e19\u0e15\u0e23\u0e4c\u0e14\u0e49\u0e27\u0e22\u0e01\u0e32\u0e23\u0e08\u0e31\u0e1a\u0e2a\u0e34\u0e48\u0e07\u0e19\u0e35\u0e49 ...
+Fishing.Ability.TH.MagicFound=[[GRAY]]\u0e04\u0e38\u0e13\u0e23\u0e39\u0e49\u0e2a\u0e36\u0e01\u0e44\u0e14\u0e49\u0e16\u0e36\u0e07\u0e2a\u0e31\u0e21\u0e1c\u0e31\u0e2a\u0e02\u0e2d\u0e07\u0e40\u0e27\u0e17\u0e21\u0e19\u0e15\u0e23\u0e4c\u0e14\u0e49\u0e27\u0e22\u0e01\u0e32\u0e23\u0e08\u0e31\u0e1a\u0e2a\u0e34\u0e48\u0e07\u0e19\u0e35\u0e49 ...
 Fishing.SkillName=FISHING
 Fishing.Skillup=[[YELLOW]]\u0e17\u0e31\u0e01\u0e29\u0e30 Fishing \u0e40\u0e1e\u0e34\u0e48\u0e21\u0e02\u0e36\u0e49\u0e19 {0}. \u0e21\u0e35\u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14 ({1})
 Herbalism.Ability.DoubleDropChance=[[RED]]Double Drop \u0e42\u0e2d\u0e01\u0e32\u0e2a: [[YELLOW]]{0}

+ 1 - 1
src/main/resources/locale/locale_tr_TR.properties

@@ -10,7 +10,7 @@ Axes.Effect.2=Kritik Vuruslar
 Axes.SkillName=BALTALAR
 Excavation.Ability.Lower=[[GRAY]]**K\u00dcREGINI INDIRIYORSUN**
 Excavation.SkillName=KAZMA
-Fishing.ItemFound=[[GRAY]]Hazine bulundu!
+Fishing.Ability.TH.ItemFound=[[GRAY]]Hazine bulundu!
 Fishing.SkillName=BALIK TUTMA
 Herbalism.Ability.Lower=[[GRAY]]**\u00c7APANI INDIRIYORSUN**
 Herbalism.Ability.Ready=[[GREEN]]**\u00c7APANI HAZIRLIYORSUN**

+ 2 - 2
src/main/resources/locale/locale_zh_CN.properties

@@ -95,9 +95,9 @@ Fishing.Effect.10=\u51b0\u6e14
 Fishing.Effect.11=\u5141\u8bb8\u4f60\u5728\u51b0\u51b7\u7684\u73af\u5883\u4e0b\u9493\u9c7c
 Fishing.Enchant.Chance=[[RED]]\u9b54\u6cd5\u730e\u4eba\u51e0\u7387: [[YELLOW]]{0}
 Fishing.Chance.Raining=[[BLUE]] \u5927\u91cf\u5956\u52b1
-Fishing.ItemFound=[[GRAY]]\u53d1\u73b0\u5b9d\u7269\u4e86\uff01
+Fishing.Ability.TH.ItemFound=[[GRAY]]\u53d1\u73b0\u5b9d\u7269\u4e86\uff01
 Fishing.Listener=\u9493\u9c7c(Fishing):
-Fishing.MagicFound=[[GRAY]]\u4f60\u611f\u5230\u4e00\u80a1\u9b54\u529b\u7684\u6ce2\u52a8...
+Fishing.Ability.TH.MagicFound=[[GRAY]]\u4f60\u611f\u5230\u4e00\u80a1\u9b54\u529b\u7684\u6ce2\u52a8...
 Fishing.SkillName=\u9493\u9c7c
 Fishing.Skillup=[[YELLOW]]\u9493\u9c7c\u6280\u80fd\u63d0\u5347\u4e86 {0}. \u603b\u5171 ({1})
 Herbalism.Ability.DoubleDropChance=[[RED]]\u53cc\u500d\u6389\u843d\u51e0\u7387: [[YELLOW]]{0}

+ 2 - 2
src/main/resources/locale/locale_zh_TW.properties

@@ -95,9 +95,9 @@ Fishing.Effect.10=\u51b0\u91e3
 Fishing.Effect.11=\u5141\u8a31\u4f60\u5728\u51b0\u5929\u96ea\u5730\u88e1\u91e3\u9b5a
 Fishing.Enchant.Chance=[[RED]]\u9b54\u6cd5\u7375\u4eba\u6a5f\u7387: [[YELLOW]]{0}
 Fishing.Chance.Raining=[[BLUE]] \u5927\u91cf\u734e\u52f5
-Fishing.ItemFound=[[GRAY]]\u767c\u73fe\u5bf6\u7269\u4e86\uff01
+Fishing.Ability.TH.ItemFound=[[GRAY]]\u767c\u73fe\u5bf6\u7269\u4e86\uff01
 Fishing.Listener=\u91e3\u9b5a:
-Fishing.MagicFound=[[GRAY]]\u4f60\u611f\u53d7\u5230\u9b54\u529b\u7684\u6ce2\u52d5...
+Fishing.Ability.TH.MagicFound=[[GRAY]]\u4f60\u611f\u53d7\u5230\u9b54\u529b\u7684\u6ce2\u52d5...
 Fishing.SkillName=\u91e3\u9b5a
 Fishing.Skillup=[[YELLOW]]\u91e3\u9b5a\u6280\u80fd\u4e0a\u5347\u4e86 {0}! \u7e3d\u7b49\u7d1a ({1})!
 Herbalism.Ability.DoubleDropChance=[[RED]]\u96d9\u500d\u6389\u843d\u6a5f\u7387: [[YELLOW]]{0}

+ 297 - 215
src/main/resources/treasures.yml

@@ -6,351 +6,433 @@ Fishing:
     LEATHER_BOOTS:
         Amount: 1
         XP: 200
-        Drop_Chance: 20.0
-        Drop_Level: 0
-        Max_Level: 400
+        Rarity: COMMON
     LEATHER_HELMET:
         Amount: 1
         XP: 200
-        Drop_Chance: 20.0
-        Drop_Level: 0
-        Max_Level: 400
+        Rarity: COMMON
     LEATHER_LEGGINGS:
         Amount: 1
         XP: 200
-        Drop_Chance: 20.0
-        Drop_Level: 0
-        Max_Level: 400
+        Rarity: COMMON
     LEATHER_CHESTPLATE:
         Amount: 1
         XP: 200
-        Drop_Chance: 20.0
-        Drop_Level: 0
-        Max_Level: 400
+        Rarity: COMMON
     WOOD_SWORD:
         Amount: 1
         XP: 200
-        Drop_Chance: 20.0
-        Drop_Level: 0
-        Max_Level: 200
+        Rarity: COMMON
     WOOD_SPADE:
         Amount: 1
         XP: 200
-        Drop_Chance: 20.0
-        Drop_Level: 0
-        Max_Level: 200
+        Rarity: COMMON
     WOOD_PICKAXE:
         Amount: 1
         XP: 200
-        Drop_Chance: 20.0
-        Drop_Level: 0
-        Max_Level: 200
+        Rarity: COMMON
     WOOD_AXE:
         Amount: 1
         XP: 200
-        Drop_Chance: 20.0
-        Drop_Level: 0
-        Max_Level: 200
+        Rarity: COMMON
     WOOD_HOE:
         Amount: 1
         XP: 200
-        Drop_Chance: 20.0
-        Drop_Level: 0
-        Max_Level: 200
+        Rarity: COMMON
+    INK_SACK_BLUE:
+        Amount: 20
+        XP: 200
+        Rarity: COMMON
     STONE_SWORD:
         Amount: 1
         XP: 200
-        Drop_Chance: 20.0
-        Drop_Level: 0
-        Max_Level: 400
+        Rarity: UNCOMMON
     STONE_SPADE:
         Amount: 1
         XP: 200
-        Drop_Chance: 20.0
-        Drop_Level: 0
-        Max_Level: 400
+        Rarity: UNCOMMON
     STONE_PICKAXE:
         Amount: 1
         XP: 200
-        Drop_Chance: 20.0
-        Drop_Level: 0
-        Max_Level: 400
+        Rarity: UNCOMMON
     STONE_AXE:
         Amount: 1
         XP: 200
-        Drop_Chance: 20.0
-        Drop_Level: 0
-        Max_Level: 400
+        Rarity: UNCOMMON
     STONE_HOE:
         Amount: 1
         XP: 200
-        Drop_Chance: 20.0
-        Drop_Level: 0
-        Max_Level: 400
-    IRON_SWORD:
+        Rarity: UNCOMMON
+    GOLD_SWORD:
         Amount: 1
         XP: 200
-        Drop_Chance: 25.0
-        Drop_Level: 200
-        Max_Level: -1
-    IRON_SPADE:
+        Rarity: UNCOMMON
+    GOLD_SPADE:
         Amount: 1
         XP: 200
-        Drop_Chance: 25.0
-        Drop_Level: 200
-        Max_Level: -1
-    IRON_PICKAXE:
+        Rarity: UNCOMMON
+    GOLD_PICKAXE:
         Amount: 1
         XP: 200
-        Drop_Chance: 25.0
-        Drop_Level: 200
-        Max_Level: -1
-    IRON_AXE:
+        Rarity: UNCOMMON
+    GOLD_AXE:
         Amount: 1
         XP: 200
-        Drop_Chance: 25.0
-        Drop_Level: 200
-        Max_Level: -1
-    IRON_HOE:
+        Rarity: UNCOMMON
+    GOLD_HOE:
         Amount: 1
         XP: 200
-        Drop_Chance: 25.0
-        Drop_Level: 200
-        Max_Level: -1
-    IRON_BOOTS:
+        Rarity: UNCOMMON
+    GOLD_BOOTS:
         Amount: 1
         XP: 200
-        Drop_Chance: 25.0
-        Drop_Level: 200
-        Max_Level: -1
-    IRON_HELMET:
+        Rarity: UNCOMMON
+    GOLD_HELMET:
         Amount: 1
         XP: 200
-        Drop_Chance: 25.0
-        Drop_Level: 200
-        Max_Level: -1
-    IRON_LEGGINGS:
+        Rarity: UNCOMMON
+    GOLD_LEGGINGS:
         Amount: 1
         XP: 200
-        Drop_Chance: 25.0
-        Drop_Level: 200
-        Max_Level: -1
-    IRON_CHESTPLATE:
+        Rarity: UNCOMMON
+    GOLD_CHESTPLATE:
         Amount: 1
         XP: 200
-        Drop_Chance: 25.0
-        Drop_Level: 200
-        Max_Level: -1
-    ENDER_PEARL:
-        Amount: 1
+        Rarity: UNCOMMON
+    IRON_INGOT:
+        Amount: 5
         XP: 200
-        Drop_Chance: 25.0
-        Drop_Level: 200
-        Max_Level: -1
-    GOLD_SWORD:
-        Amount: 1
+        Rarity: UNCOMMON
+    GOLD_INGOT:
+        Amount: 5
         XP: 200
-        Drop_Chance: 30.0
-        Drop_Level: 400
-        Max_Level: -1
-    GOLD_SPADE:
+        Rarity: UNCOMMON
+    IRON_SWORD:
         Amount: 1
         XP: 200
-        Drop_Chance: 30.0
-        Drop_Level: 400
-        Max_Level: -1
-    GOLD_PICKAXE:
+        Rarity: RARE
+    IRON_SPADE:
         Amount: 1
         XP: 200
-        Drop_Chance: 30.0
-        Drop_Level: 400
-        Max_Level: -1
-    GOLD_AXE:
+        Rarity: RARE
+    IRON_PICKAXE:
         Amount: 1
         XP: 200
-        Drop_Chance: 30.0
-        Drop_Level: 400
-        Max_Level: -1
-    GOLD_HOE:
+        Rarity: RARE
+    IRON_AXE:
         Amount: 1
         XP: 200
-        Drop_Chance: 30.0
-        Drop_Level: 400
-        Max_Level: -1
-    GOLD_BOOTS:
+        Rarity: RARE
+    IRON_HOE:
         Amount: 1
         XP: 200
-        Drop_Chance: 30.0
-        Drop_Level: 400
-        Max_Level: -1
-    GOLD_HELMET:
+        Rarity: RARE
+    ENDER_PEARL:
         Amount: 1
         XP: 200
-        Drop_Chance: 30.0
-        Drop_Level: 400
-        Max_Level: -1
-    GOLD_LEGGINGS:
+        Rarity: RARE
+    BLAZE_ROD:
         Amount: 1
         XP: 200
-        Drop_Chance: 30.0
-        Drop_Level: 400
-        Max_Level: -1
-    GOLD_CHESTPLATE:
+        Rarity: RARE
+    IRON_BOOTS:
         Amount: 1
         XP: 200
-        Drop_Chance: 30.0
-        Drop_Level: 400
-        Max_Level: -1
-    BLAZE_ROD:
+        Rarity: EPIC
+    IRON_HELMET:
         Amount: 1
         XP: 200
-        Drop_Chance: 30.0
-        Drop_Level: 400
-        Max_Level: -1
-    RECORD_3:
+        Rarity: EPIC
+    IRON_LEGGINGS:
         Amount: 1
         XP: 200
-        Drop_Chance: 30.0
-        Drop_Level: 400
-        Max_Level: -1
-    RECORD_4:
+        Rarity: EPIC
+    IRON_CHESTPLATE:
         Amount: 1
         XP: 200
-        Drop_Chance: 30.0
-        Drop_Level: 400
-        Max_Level: -1
-    RECORD_5:
+        Rarity: EPIC
+    GHAST_TEAR:
         Amount: 1
         XP: 200
-        Drop_Chance: 30.0
-        Drop_Level: 400
-        Max_Level: -1
+        Rarity: EPIC
+    DIAMOND:
+        Amount: 5
+        XP: 200
+        Rarity: EPIC
     DIAMOND_SWORD:
         Amount: 1
         XP: 200
-        Drop_Chance: 35.0
-        Drop_Level: 600
-        Max_Level: -1
+        Rarity: LEGENDARY
     DIAMOND_SPADE:
         Amount: 1
         XP: 200
-        Drop_Chance: 35.0
-        Drop_Level: 600
-        Max_Level: -1
+        Rarity: LEGENDARY
     DIAMOND_PICKAXE:
         Amount: 1
         XP: 200
-        Drop_Chance: 35.0
-        Drop_Level: 600
-        Max_Level: -1
+        Rarity: LEGENDARY
     DIAMOND_AXE:
         Amount: 1
         XP: 200
-        Drop_Chance: 35.0
-        Drop_Level: 600
-        Max_Level: -1
+        Rarity: LEGENDARY
     DIAMOND_HOE:
         Amount: 1
         XP: 200
-        Drop_Chance: 35.0
-        Drop_Level: 600
-        Max_Level: -1
+        Rarity: LEGENDARY
     DIAMOND_BOOTS:
         Amount: 1
         XP: 200
-        Drop_Chance: 35.0
-        Drop_Level: 600
-        Max_Level: -1
+        Rarity: LEGENDARY
     DIAMOND_HELMET:
         Amount: 1
         XP: 200
-        Drop_Chance: 35.0
-        Drop_Level: 600
-        Max_Level: -1
+        Rarity: LEGENDARY
     DIAMOND_LEGGINGS:
         Amount: 1
         XP: 200
-        Drop_Chance: 35.0
-        Drop_Level: 600
-        Max_Level: -1
+        Rarity: LEGENDARY
     DIAMOND_CHESTPLATE:
         Amount: 1
         XP: 200
-        Drop_Chance: 35.0
-        Drop_Level: 600
-        Max_Level: -1
+        Rarity: LEGENDARY
+    RECORD_3:
+        Amount: 1
+        XP: 200
+        Rarity: RECORD
+    RECORD_4:
+        Amount: 1
+        XP: 200
+        Rarity: RECORD
+    RECORD_5:
+        Amount: 1
+        XP: 200
+        Rarity: RECORD
     RECORD_6:
         Amount: 1
         XP: 200
-        Drop_Chance: 35.0
-        Drop_Level: 600
-        Max_Level: -1
+        Rarity: RECORD
     RECORD_7:
         Amount: 1
         XP: 200
-        Drop_Chance: 35.0
-        Drop_Level: 600
-        Max_Level: -1
+        Rarity: RECORD
     RECORD_8:
         Amount: 1
         XP: 200
-        Drop_Chance: 35.0
-        Drop_Level: 600
-        Max_Level: -1
+        Rarity: RECORD
     RECORD_9:
         Amount: 1
         XP: 200
-        Drop_Chance: 35.0
-        Drop_Level: 600
-        Max_Level: -1
+        Rarity: RECORD
     RECORD_10:
         Amount: 1
         XP: 200
-        Drop_Chance: 35.0
-        Drop_Level: 600
-        Max_Level: -1
+        Rarity: RECORD
     RECORD_11:
         Amount: 1
         XP: 200
-        Drop_Chance: 35.0
-        Drop_Level: 600
-        Max_Level: -1
+        Rarity: RECORD
     RECORD_12:
         Amount: 1
         XP: 200
-        Drop_Chance: 35.0
-        Drop_Level: 600
-        Max_Level: -1
-    GHAST_TEAR:
-        Amount: 1
-        XP: 200
-        Drop_Chance: 35.0
-        Drop_Level: 600
-        Max_Level: -1
-    DIAMOND:
-        Amount: 5
-        XP: 200
-        Drop_Chance: 40.0
-        Drop_Level: 800
-        Max_Level: -1
-    IRON_INGOT:
-        Amount: 5
-        XP: 200
-        Drop_Chance: 40.0
-        Drop_Level: 800
-        Max_Level: -1
-    GOLD_INGOT:
-        Amount: 5
-        XP: 200
-        Drop_Chance: 40.0
-        Drop_Level: 800
-        Max_Level: -1
-    INK_SACK_BLUE:
-        Amount: 20
-        XP: 200
-        Drop_Chance: 40.0
-        Drop_Level: 800
-        Max_Level: -1
+        Rarity: RECORD
+#
+#	Fishing drop rates
+###
+Item_Drop_Rates:
+    Tier_1:
+        TRAP: 7.68
+        COMMON: 7.50
+        UNCOMMON: 1.25
+        RARE: 0.25
+        EPIC: 0.10
+        LEGENDARY: 0.01
+        RECORD: 0.01
+    Tier_2:
+        TRAP: 2.50
+        COMMON: 6.50
+        UNCOMMON: 1.75
+        RARE: 0.75
+        EPIC: 0.50
+        LEGENDARY: 0.05
+        RECORD: 0.01
+    Tier_3:
+        TRAP: 1.50
+        COMMON: 3.50
+        UNCOMMON: 2.75
+        RARE: 1.25
+        EPIC: 1.00
+        LEGENDARY: 0.10
+        RECORD: 0.01
+    Tier_4:
+        TRAP: 1.00
+        COMMON: 2.00
+        UNCOMMON: 3.50
+        RARE: 2.25
+        EPIC: 1.50
+        LEGENDARY: 1.00
+        RECORD: 0.01
+    Tier_5:
+        TRAP: 0.25
+        COMMON: 1.50
+        UNCOMMON: 3.75
+        RARE: 2.50
+        EPIC: 2.00
+        LEGENDARY: 1.00
+        RECORD: 0.01
+    Tier_6:
+        TRAP: 0.10
+        COMMON: 1.00
+        UNCOMMON: 3.25
+        RARE: 3.75
+        EPIC: 2.50
+        LEGENDARY: 1.50
+        RECORD: 0.05
+    Tier_7:
+        TRAP: 0.05
+        COMMON: 0.25
+        UNCOMMON: 2.75
+        RARE: 4.00
+        EPIC: 5.00
+        LEGENDARY: 2.50
+        RECORD: 0.10
+    Tier_8:
+        TRAP: 0.01
+        COMMON: 0.10
+        UNCOMMON: 1.50
+        RARE: 6.00
+        EPIC: 7.50
+        LEGENDARY: 5.00
+        RECORD: 0.25
+#
+#	Fishing enchantment drop rates
+###
+Enchantments_Rarity:
+    COMMON:
+        EFFICIENCY: 1
+        UNBREAKING: 1
+        FORTUNE: 1
+        PROTECTION: 1
+        FIRE_PROTECTION: 1
+        FEATHER_FALLING: 1
+        BLAST_PROTECTION: 1
+        PROJECTILE_PROTECTION: 1
+        RESPIRATION: 1
+        THORNS: 1
+        SHARPNESS: 1
+        SMITE: 1
+        BANE_OF_ARTHROPODS: 1
+        POWER: 1
+    UNCOMMON:
+        EFFICIENCY: 2
+        PROTECTION: 2
+        FIRE_PROTECTION: 2
+        FEATHER_FALLING: 2
+        BLAST_PROTECTION: 2
+        PROJECTILE_PROTECTION: 2
+        SHARPNESS: 2
+        SMITE: 2
+        BANE_OF_ARTHROPODS: 2
+        KNOCKBACK: 1
+        LOOTING: 1
+        POWER: 2
+        PUNCH: 1
+    RARE:
+        EFFICIENCY: 3
+        UNBREAKING: 2
+        PROTECTION: 3
+        FIRE_PROTECTION: 3
+        FEATHER_FALLING: 3
+        BLAST_PROTECTION: 3
+        PROJECTILE_PROTECTION: 3
+        RESPIRATION: 2
+        SHARPNESS: 3
+        SMITE: 3
+        BANE_OF_ARTHROPODS: 3
+        FIRE_ASPECT: 1
+        LOOTING: 2
+        POWER: 3
+    EPIC:
+        EFFICIENCY: 4
+        FORTUNE: 2
+        AQUA_AFFINITY: 1
+        THORNS: 2
+        SHARPNESS: 4
+        SMITE: 4
+        BANE_OF_ARTHROPODS: 4
+        POWER: 4
+        FLAME: 1
+    LEGENDARY:
+        EFFICIENCY: 5
+        UNBREAKING: 3
+        FORTUNE: 3
+        PROTECTION: 4
+        FIRE_PROTECTION: 4
+        FEATHER_FALLING: 4
+        BLAST_PROTECTION: 4
+        PROJECTILE_PROTECTION: 4
+        RESPIRATION: 3
+        AQUA_AFFINITY: 2
+        THORNS: 3
+        SHARPNESS: 5
+        SMITE: 5
+        BANE_OF_ARTHROPODS: 5
+        KNOCKBACK: 2
+        FIRE_ASPECT: 2
+        LOOTING: 3
+        SILK_TOUCH: 1
+        POWER: 5
+        PUNCH: 2
+        INFINITY: 1
+
+Enchantment_Drop_Rates:
+    Tier_1:
+        COMMON: 5.00
+        UNCOMMON: 1.00
+        RARE: 0.10
+        EPIC: 0.01
+        LEGENDARY: 0.01
+    Tier_2:
+        COMMON: 7.50
+        UNCOMMON: 1.00
+        RARE: 0.10
+        EPIC: 0.01
+        LEGENDARY: 0.01
+    Tier_3:
+        COMMON: 7.50
+        UNCOMMON: 2.50
+        RARE: 0.25
+        EPIC: 0.10
+        LEGENDARY: 0.01
+    Tier_4:
+        COMMON: 10.0
+        UNCOMMON: 2.75
+        RARE: 0.50
+        EPIC: 0.10
+        LEGENDARY: 0.05
+    Tier_5:
+        COMMON: 10.0
+        UNCOMMON: 4.00
+        RARE: 0.75
+        EPIC: 0.25
+        LEGENDARY: 0.10
+    Tier_6:
+        COMMON: 9.50
+        UNCOMMON: 5.50
+        RARE: 1.75
+        EPIC: 0.50
+        LEGENDARY: 0.25
+    Tier_7:
+        COMMON: 8.50
+        UNCOMMON: 7.50
+        RARE: 2.75
+        EPIC: 0.75
+        LEGENDARY: 0.50
+    Tier_8:
+        COMMON: 7.50
+        UNCOMMON: 10.0
+        RARE: 5.25
+        EPIC: 1.50
+        LEGENDARY: 0.75
 #
 #  Settings for Excavation
 ###
@@ -826,4 +908,4 @@ Shake:
             Amount: 1
             XP: 0
             Drop_Chance: 98.0
-            Drop_Level: 0
+            Drop_Level: 0