diff --git a/Changelog.txt b/Changelog.txt index ff8d8429e..29d9eeb91 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,12 +1,26 @@ Version 2.1.164 - New exploit fix setting, when disabled it will allow combat interactions with "NPC" entities from plugins like Citizens + The Rarity known as Records has been renamed to Mythic + Fishing treasures have been moved from treasures.yml -> fishing_treasures.yml, you'll have to copy over your changes and be aware that Records rarity is now Mythic + Mythic rarity (formerly known as Records) now allows for Enchantments to be applied to drops (See Notes) + Added all Netherite gear to the Mythic tier in fishing_treasures.yml + Added Enchanted Books to fishing loot tables + New exploit fix setting 'PreventPluginNPCInteraction' which defaults to true, when disabled it will allow combat interactions with "NPC" entities from plugins like Citizens ExploitFix.PreventPluginNPCInteraction Added to experience.yml + Modified locale string 'Fishing.SubSkill.TreasureHunter.Stat.Extra' in existing locale files + You can now define a whitelist of enchants or a blacklist of enchants for an Enchanted_Book entry in fishing_treasures.yml, see notes for an example NOTES: + The rarity known as Records was odd to me, if you got the best possible drop it was always going to be a Records drop, and by default the Records tier had only music records. It was treated differently in the code as well, for example Records drops never had enchantments applied to them. So you could add say NETHERITE_ARMOR to them in your user config and it would never put enchantments on it, that seemed very odd to me. + As a response to this, I've renamed Records as Mythic, I've moved the records into varying tiers, you'll start getting them much earlier now. I've also added Netherite and Enchanted Books to the Mythic tier. + Enchanted Books have been added to Fishing loot, this is a basic hacky work around until the config update comes. Enchanted books can have any legal enchant. When talking about NPCs in the below notes, I am referring to "Fake" Players used in plugins such as Citizens, not Villagers from Vanilla Minecraft or anything labeled NPC in another plugin which does not constitute a "Fake Player" Historically mcMMO has checked an entity for being a Fake-Player-NPC and backed out of any interaction, this was originally done because of Fake-Player-NPCs that were meant to be invincible/etc and not give XP However nowadays what a Fake-Player-NPC is used for is pretty loose, mcMMO only has definitions for some NPCs (such as from Citizens) it doesn't know about most Fake-Player-NPCs in most plugins unless they identify themselves in a similar way to the predefined parameters Leave this new exploit fix setting on true unless you understand the implications + Here is an example of using the whitelist or blacklist for an Enchanted_Book entry in fishing_treasures.yml + https://gist.github.com/nossr50/4e15b8ba6915b5a5f516eccfba2d7169 + If you can't load this image, at the address of your treasure for example, at Fishing.Enchanted_Book.Enchantments_Blacklist: you define a list (which must follow yaml spec, google yaml linter) of enchants to disallow, likewise at Fishing.Enchanted_Book.Enchantments_Whitelist you can setup a whitelist, if neither is defined then the book can spawn with all possible enchants, if both are defined the whitelist is used instead of the blacklist + Version 2.1.163 Fixed the translate URL pointing to the wrong place (thanks chew) diff --git a/src/main/java/com/gmail/nossr50/commands/admin/DropTreasureCommand.java b/src/main/java/com/gmail/nossr50/commands/admin/DropTreasureCommand.java new file mode 100644 index 000000000..5a60d9bee --- /dev/null +++ b/src/main/java/com/gmail/nossr50/commands/admin/DropTreasureCommand.java @@ -0,0 +1,57 @@ +//package com.gmail.nossr50.commands.admin; +// +//import com.gmail.nossr50.config.treasure.FishingTreasureConfig; +//import com.gmail.nossr50.datatypes.player.McMMOPlayer; +//import com.gmail.nossr50.datatypes.treasure.FishingTreasure; +//import com.gmail.nossr50.datatypes.treasure.Rarity; +//import com.gmail.nossr50.mcMMO; +//import com.gmail.nossr50.skills.fishing.FishingManager; +//import com.gmail.nossr50.util.player.UserManager; +//import org.bukkit.Location; +//import org.bukkit.command.Command; +//import org.bukkit.command.CommandExecutor; +//import org.bukkit.command.CommandSender; +//import org.bukkit.entity.Player; +//import org.jetbrains.annotations.NotNull; +// +//public class DropTreasureCommand implements CommandExecutor { +// @Override +// public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { +// if(sender instanceof Player) { +// if(!sender.isOp()) { +// sender.sendMessage("This command is for Operators only"); +// return false; +// } +// +// Player player = (Player) sender; +// Location location = player.getLocation(); +// McMMOPlayer mmoPlayer = UserManager.getPlayer(player); +// +// if(mmoPlayer == null) { +// //TODO: Localize +// player.sendMessage("Your player data is not loaded yet"); +// return false; +// } +// +// if(args.length == 0) { +// mcMMO.p.getLogger().info(player.toString() +" is dropping all mcMMO treasures via admin command at location "+location.toString()); +// for(Rarity rarity : FishingTreasureConfig.getInstance().fishingRewards.keySet()) { +// for(FishingTreasure fishingTreasure : FishingTreasureConfig.getInstance().fishingRewards.get(rarity)) { +// FishingManager fishingManager = mmoPlayer.getFishingManager(); +// } +// } +// //TODO: impl +// } else { +// String targetTreasure = args[1]; +// +// //Drop all treasures matching the name +// //TODO: impl +// } +// +// return true; +// } else { +// sender.sendMessage("No console support for this command"); +// return false; +// } +// } +//} diff --git a/src/main/java/com/gmail/nossr50/commands/skills/FishingCommand.java b/src/main/java/com/gmail/nossr50/commands/skills/FishingCommand.java index 0f34e84b1..b6f1aef42 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/FishingCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/FishingCommand.java @@ -29,7 +29,7 @@ public class FishingCommand extends SkillCommand { private String rareTreasure; private String epicTreasure; private String legendaryTreasure; - private String recordTreasure; + private String mythicTreasure; private String magicChance; @@ -60,13 +60,13 @@ public class FishingCommand extends SkillCommand { rareTreasure = percent.format(TreasureConfig.getInstance().getItemDropRate(lootTier, Rarity.RARE) / 100.0); epicTreasure = percent.format(TreasureConfig.getInstance().getItemDropRate(lootTier, Rarity.EPIC) / 100.0); legendaryTreasure = percent.format(TreasureConfig.getInstance().getItemDropRate(lootTier, Rarity.LEGENDARY) / 100.0); - recordTreasure = percent.format(TreasureConfig.getInstance().getItemDropRate(lootTier, Rarity.RECORD) / 100.0); + mythicTreasure = percent.format(TreasureConfig.getInstance().getItemDropRate(lootTier, Rarity.MYTHIC) / 100.0); // Magic hunter drop rates double totalEnchantChance = 0; for (Rarity rarity : Rarity.values()) { - if (rarity != Rarity.RECORD) { + if (rarity != Rarity.MYTHIC) { totalEnchantChance += TreasureConfig.getInstance().getEnchantmentDropRate(lootTier, rarity); } } @@ -145,7 +145,7 @@ public class FishingCommand extends SkillCommand { String.valueOf(rareTreasure), String.valueOf(epicTreasure), String.valueOf(legendaryTreasure), - String.valueOf(recordTreasure))); + String.valueOf(mythicTreasure))); } return messages; diff --git a/src/main/java/com/gmail/nossr50/config/treasure/FishingTreasureConfig.java b/src/main/java/com/gmail/nossr50/config/treasure/FishingTreasureConfig.java new file mode 100755 index 000000000..f7f0a9ec2 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/config/treasure/FishingTreasureConfig.java @@ -0,0 +1,368 @@ +package com.gmail.nossr50.config.treasure; + +import com.gmail.nossr50.config.ConfigLoader; +import com.gmail.nossr50.datatypes.treasure.*; +import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.util.EnchantmentUtils; +import org.bukkit.ChatColor; +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; +import org.bukkit.inventory.meta.PotionMeta; +import org.bukkit.potion.PotionData; +import org.bukkit.potion.PotionType; +import org.jetbrains.annotations.NotNull; + +import java.util.*; + +public class FishingTreasureConfig extends ConfigLoader { + + public static final String FILENAME = "fishing_treasures.yml"; + private static FishingTreasureConfig instance; + + public @NotNull HashMap> fishingRewards = new HashMap<>(); + public @NotNull HashMap> fishingEnchantments = new HashMap<>(); + public @NotNull HashMap> shakeMap = new HashMap<>(); + + private FishingTreasureConfig() { + super(FILENAME); + loadKeys(); + validate(); + } + + public static FishingTreasureConfig getInstance() { + if (instance == null) { + instance = new FishingTreasureConfig(); + } + + return instance; + } + + @Override + protected boolean validateKeys() { + // Validate all the settings! + List reason = new ArrayList<>(); + for (String tier : config.getConfigurationSection("Enchantment_Drop_Rates").getKeys(false)) { + double totalEnchantDropRate = 0; + double totalItemDropRate = 0; + + for (Rarity rarity : Rarity.values()) { + double enchantDropRate = config.getDouble("Enchantment_Drop_Rates." + tier + "." + rarity.toString()); + double itemDropRate = config.getDouble("Item_Drop_Rates." + tier + "." + rarity.toString()); + + if ((enchantDropRate < 0.0 || enchantDropRate > 100.0)) { + reason.add("The enchant drop rate for " + tier + " items that are " + rarity.toString() + "should be between 0.0 and 100.0!"); + } + + if (itemDropRate < 0.0 || itemDropRate > 100.0) { + reason.add("The item drop rate for " + tier + " items that are " + rarity.toString() + "should be between 0.0 and 100.0!"); + } + + totalEnchantDropRate += enchantDropRate; + totalItemDropRate += itemDropRate; + } + + if (totalEnchantDropRate < 0 || totalEnchantDropRate > 100.0) { + reason.add("The total enchant drop rate for " + tier + " should be between 0.0 and 100.0!"); + } + + if (totalItemDropRate < 0 || totalItemDropRate > 100.0) { + reason.add("The total item drop rate for " + tier + " should be between 0.0 and 100.0!"); + } + } + + return noErrorsInConfig(reason); + } + + @Override + protected void loadKeys() { + if (config.getConfigurationSection("Treasures") != null) { + backup(); + return; + } + + loadTreasures("Fishing"); + loadEnchantments(); + + for (EntityType entity : EntityType.values()) { + if (entity.isAlive()) { + loadTreasures("Shake." + entity.toString()); + } + } + } + + private void loadTreasures(String type) { + boolean isFishing = type.equals("Fishing"); + boolean isShake = type.contains("Shake"); + + ConfigurationSection treasureSection = config.getConfigurationSection(type); + + if (treasureSection == null) { + return; + } + + // Initialize fishing HashMap + for (Rarity rarity : Rarity.values()) { + if (!fishingRewards.containsKey(rarity)) { + fishingRewards.put(rarity, (new ArrayList<>())); + } + } + + for (String treasureName : treasureSection.getKeys(false)) { + // Validate all the things! + List reason = new ArrayList<>(); + + String[] treasureInfo = treasureName.split("[|]"); + String materialName = treasureInfo[0]; + + /* + * Material, Amount, and Data + */ + Material material; + + if (materialName.contains("INVENTORY")) { + // Use magic material BEDROCK to know that we're grabbing something from the inventory and not a normal treasure + if (!shakeMap.containsKey(EntityType.PLAYER)) + shakeMap.put(EntityType.PLAYER, new ArrayList<>()); + shakeMap.get(EntityType.PLAYER).add(new ShakeTreasure(new ItemStack(Material.BEDROCK, 1, (byte) 0), 1, getInventoryStealDropChance(), getInventoryStealDropLevel())); + continue; + } else { + material = Material.matchMaterial(materialName); + } + + int amount = config.getInt(type + "." + treasureName + ".Amount"); + short data = (treasureInfo.length == 2) ? Short.parseShort(treasureInfo[1]) : (short) config.getInt(type + "." + treasureName + ".Data"); + + if (material == null) { + reason.add("Invalid material: " + materialName); + } + + if (amount <= 0) { + amount = 1; + } + + if (material != null && material.isBlock() && (data > 127 || data < -128)) { + reason.add("Data of " + treasureName + " is invalid! " + data); + } + + /* + * XP, Drop Chance, and Drop Level + */ + + int xp = config.getInt(type + "." + treasureName + ".XP"); + double dropChance = config.getDouble(type + "." + treasureName + ".Drop_Chance"); + int dropLevel = config.getInt(type + "." + treasureName + ".Drop_Level"); + + if (xp < 0) { + reason.add(treasureName + " has an invalid XP value: " + xp); + } + + if (dropChance < 0.0D) { + reason.add(treasureName + " has an invalid Drop_Chance: " + dropChance); + } + + if (dropLevel < 0) { + reason.add(treasureName + " has an invalid Drop_Level: " + dropLevel); + } + + /* + * Specific Types + */ + Rarity rarity = null; + + if (isFishing) { + rarity = Rarity.getRarity(config.getString(type + "." + treasureName + ".Rarity")); + + if (rarity == null) { + reason.add("Invalid Rarity for item: " + treasureName); + } + } + + /* + * Itemstack + */ + ItemStack item = null; + + + String customName = null; + + if(hasCustomName(type, treasureName)) { + customName = config.getString(type + "." + treasureName + ".Custom_Name"); + } + + if (materialName.contains("POTION")) { + Material mat = Material.matchMaterial(materialName); + if (mat == null) { + reason.add("Potion format for Treasures.yml has changed"); + } else { + item = new ItemStack(mat, amount, data); + PotionMeta itemMeta = (PotionMeta) item.getItemMeta(); + + PotionType potionType = null; + try { + potionType = PotionType.valueOf(config.getString(type + "." + treasureName + ".PotionData.PotionType", "WATER")); + } catch (IllegalArgumentException ex) { + reason.add("Invalid Potion_Type: " + config.getString(type + "." + treasureName + ".PotionData.PotionType", "WATER")); + } + boolean extended = config.getBoolean(type + "." + treasureName + ".PotionData.Extended", false); + boolean upgraded = config.getBoolean(type + "." + treasureName + ".PotionData.Upgraded", false); + itemMeta.setBasePotionData(new PotionData(potionType, extended, upgraded)); + + if (customName != null) { + itemMeta.setDisplayName(ChatColor.translateAlternateColorCodes('&', customName)); + } + + if (config.contains(type + "." + treasureName + ".Lore")) { + List lore = new ArrayList<>(); + for (String s : config.getStringList(type + "." + treasureName + ".Lore")) { + lore.add(ChatColor.translateAlternateColorCodes('&', s)); + } + itemMeta.setLore(lore); + } + item.setItemMeta(itemMeta); + } + } else if (material != null) { + if(material == Material.ENCHANTED_BOOK) { + //If any whitelisted enchants exist we use whitelist-based matching + item = new ItemStack(material, 1); + ItemMeta itemMeta = item.getItemMeta(); + + List allowedEnchantsList = config.getStringList(type + "." + treasureName + ".Enchantments_Whitelist"); + List disallowedEnchantsList = config.getStringList(type + "." + treasureName + ".Enchantments_Blacklist"); + + Set blackListedEnchants = new HashSet<>(); + Set whiteListedEnchants = new HashSet<>(); + + matchAndFillSet(disallowedEnchantsList, blackListedEnchants); + matchAndFillSet(allowedEnchantsList, whiteListedEnchants); + + if (customName != null && itemMeta != null) { + itemMeta.setDisplayName(ChatColor.translateAlternateColorCodes('&', customName)); + item.setItemMeta(itemMeta); + } + + FishingTreasureBook fishingTreasureBook = new FishingTreasureBook(item, xp, blackListedEnchants, whiteListedEnchants); + //TODO: Add book support for shake + continue; //The code in this whole file is a disaster, ignore this hacky solution :P + } else { + item = new ItemStack(material, amount, data); + + if (customName != null) { + ItemMeta itemMeta = item.getItemMeta(); + itemMeta.setDisplayName(ChatColor.translateAlternateColorCodes('&', customName)); + item.setItemMeta(itemMeta); + } + + if (config.contains(type + "." + treasureName + ".Lore")) { + ItemMeta itemMeta = item.getItemMeta(); + List lore = new ArrayList<>(); + for (String s : config.getStringList(type + "." + treasureName + ".Lore")) { + lore.add(ChatColor.translateAlternateColorCodes('&', s)); + } + itemMeta.setLore(lore); + item.setItemMeta(itemMeta); + } + } + + } + + + if (noErrorsInConfig(reason)) { + if (isFishing) { + fishingRewards.get(rarity).add(new FishingTreasure(item, xp)); + } else if (isShake) { + ShakeTreasure shakeTreasure = new ShakeTreasure(item, xp, dropChance, dropLevel); + + EntityType entityType = EntityType.valueOf(type.substring(6)); + if (!shakeMap.containsKey(entityType)) + shakeMap.put(entityType, new ArrayList<>()); + shakeMap.get(entityType).add(shakeTreasure); + } + } + } + } + + private boolean hasCustomName(@NotNull String type, @NotNull String treasureName) { + return config.contains(type + "." + treasureName + ".Custom_Name"); + } + + /** + * Matches enchantments on a list (user provided string) to known enchantments in the Spigot API + * Any matches are added to the passed set + * @param enchantListStr the users string list of enchantments + * @param permissiveList the permissive list of enchantments + */ + private void matchAndFillSet(List enchantListStr, Set permissiveList) { + if(enchantListStr.isEmpty()) { + return; + } + + for(String str : enchantListStr) { + boolean foundMatch = false; + for(Enchantment enchantment : Enchantment.values()) { + if(enchantment.getKey().getKey().equalsIgnoreCase(str)) { + permissiveList.add(enchantment); + foundMatch = true; + break; + } + } + + if(!foundMatch) { + mcMMO.p.getLogger().info("[Fishing Treasure Init] Could not find any enchantments which matched the user defined enchantment named: "+str); + } + } + } + + private void loadEnchantments() { + for (Rarity rarity : Rarity.values()) { + if (!fishingEnchantments.containsKey(rarity)) { + fishingEnchantments.put(rarity, (new ArrayList<>())); + } + + 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 " + FILENAME + ": " + enchantmentName); + continue; + } + + fishingEnchantments.get(rarity).add(new EnchantmentTreasure(enchantment, level)); + } + } + } + + public boolean getInventoryStealEnabled() { + return config.contains("Shake.PLAYER.INVENTORY"); + } + + public boolean getInventoryStealStacks() { + return config.getBoolean("Shake.PLAYER.INVENTORY.Whole_Stacks"); + } + + public double getInventoryStealDropChance() { + return config.getDouble("Shake.PLAYER.INVENTORY.Drop_Chance"); + } + + public int getInventoryStealDropLevel() { + return config.getInt("Shake.PLAYER.INVENTORY.Drop_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()); + } +} diff --git a/src/main/java/com/gmail/nossr50/config/treasure/TreasureConfig.java b/src/main/java/com/gmail/nossr50/config/treasure/TreasureConfig.java index be050d298..a91968acf 100755 --- a/src/main/java/com/gmail/nossr50/config/treasure/TreasureConfig.java +++ b/src/main/java/com/gmail/nossr50/config/treasure/TreasureConfig.java @@ -1,14 +1,14 @@ package com.gmail.nossr50.config.treasure; import com.gmail.nossr50.config.ConfigLoader; -import com.gmail.nossr50.datatypes.treasure.*; -import com.gmail.nossr50.util.EnchantmentUtils; +import com.gmail.nossr50.datatypes.treasure.ExcavationTreasure; +import com.gmail.nossr50.datatypes.treasure.HylianTreasure; +import com.gmail.nossr50.datatypes.treasure.Rarity; import com.gmail.nossr50.util.text.StringUtils; import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.Tag; 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; @@ -22,18 +22,14 @@ import java.util.List; public class TreasureConfig extends ConfigLoader { + public static final String FILENAME = "treasures.yml"; private static TreasureConfig instance; public HashMap> excavationMap = new HashMap<>(); - - public HashMap> shakeMap = new HashMap<>(); public HashMap> hylianMap = new HashMap<>(); - public HashMap> fishingRewards = new HashMap<>(); - public HashMap> fishingEnchantments = new HashMap<>(); - private TreasureConfig() { - super("treasures.yml"); + super(FILENAME); loadKeys(); validate(); } @@ -51,29 +47,18 @@ public class TreasureConfig extends ConfigLoader { // Validate all the settings! List reason = new ArrayList<>(); for (String tier : config.getConfigurationSection("Enchantment_Drop_Rates").getKeys(false)) { - double totalEnchantDropRate = 0; double totalItemDropRate = 0; for (Rarity rarity : Rarity.values()) { - double enchantDropRate = config.getDouble("Enchantment_Drop_Rates." + tier + "." + rarity.toString()); double itemDropRate = config.getDouble("Item_Drop_Rates." + tier + "." + rarity.toString()); - if ((enchantDropRate < 0.0 || enchantDropRate > 100.0) && rarity != Rarity.RECORD) { - reason.add("The enchant drop rate for " + tier + " items that are " + rarity.toString() + "should be between 0.0 and 100.0!"); - } - if (itemDropRate < 0.0 || itemDropRate > 100.0) { reason.add("The item drop rate for " + tier + " items that are " + rarity.toString() + "should be between 0.0 and 100.0!"); } - totalEnchantDropRate += enchantDropRate; totalItemDropRate += itemDropRate; } - if (totalEnchantDropRate < 0 || totalEnchantDropRate > 100.0) { - reason.add("The total enchant drop rate for " + tier + " should be between 0.0 and 100.0!"); - } - if (totalItemDropRate < 0 || totalItemDropRate > 100.0) { reason.add("The total item drop rate for " + tier + " should be between 0.0 and 100.0!"); } @@ -92,7 +77,6 @@ public class TreasureConfig extends ConfigLoader { loadTreasures("Fishing"); loadTreasures("Excavation"); loadTreasures("Hylian_Luck"); - loadEnchantments(); for (EntityType entity : EntityType.values()) { if (entity.isAlive()) { @@ -102,8 +86,6 @@ public class TreasureConfig extends ConfigLoader { } private void loadTreasures(String type) { - boolean isFishing = type.equals("Fishing"); - boolean isShake = type.contains("Shake"); boolean isExcavation = type.equals("Excavation"); boolean isHylian = type.equals("Hylian_Luck"); @@ -113,13 +95,6 @@ public class TreasureConfig extends ConfigLoader { return; } - // Initialize fishing HashMap - for (Rarity rarity : Rarity.values()) { - if (!fishingRewards.containsKey(rarity)) { - fishingRewards.put(rarity, (new ArrayList<>())); - } - } - for (String treasureName : treasureSection.getKeys(false)) { // Validate all the things! List reason = new ArrayList<>(); @@ -131,16 +106,7 @@ public class TreasureConfig extends ConfigLoader { * Material, Amount, and Data */ Material material; - - if (materialName.contains("INVENTORY")) { - // Use magic material BEDROCK to know that we're grabbing something from the inventory and not a normal treasure - if (!shakeMap.containsKey(EntityType.PLAYER)) - shakeMap.put(EntityType.PLAYER, new ArrayList<>()); - shakeMap.get(EntityType.PLAYER).add(new ShakeTreasure(new ItemStack(Material.BEDROCK, 1, (byte) 0), 1, getInventoryStealDropChance(), getInventoryStealDropLevel())); - continue; - } else { - material = Material.matchMaterial(materialName); - } + material = Material.matchMaterial(materialName); int amount = config.getInt(type + "." + treasureName + ".Amount"); short data = (treasureInfo.length == 2) ? Short.parseShort(treasureInfo[1]) : (short) config.getInt(type + "." + treasureName + ".Data"); @@ -177,19 +143,6 @@ public class TreasureConfig extends ConfigLoader { reason.add(treasureName + " has an invalid Drop_Level: " + dropLevel); } - /* - * Specific Types - */ - Rarity rarity = null; - - if (isFishing) { - rarity = Rarity.getRarity(config.getString(type + "." + treasureName + ".Rarity")); - - if (rarity == null) { - reason.add("Invalid Rarity for item: " + treasureName); - } - } - /* * Itemstack */ @@ -198,7 +151,7 @@ public class TreasureConfig extends ConfigLoader { if (materialName.contains("POTION")) { Material mat = Material.matchMaterial(materialName); if (mat == null) { - reason.add("Potion format for Treasures.yml has changed"); + reason.add("Potion format for " + FILENAME + " has changed"); } else { item = new ItemStack(mat, amount, data); PotionMeta itemMeta = (PotionMeta) item.getItemMeta(); @@ -247,16 +200,7 @@ public class TreasureConfig extends ConfigLoader { } if (noErrorsInConfig(reason)) { - if (isFishing) { - fishingRewards.get(rarity).add(new FishingTreasure(item, xp)); - } else if (isShake) { - ShakeTreasure shakeTreasure = new ShakeTreasure(item, xp, dropChance, dropLevel); - - EntityType entityType = EntityType.valueOf(type.substring(6)); - if (!shakeMap.containsKey(entityType)) - shakeMap.put(entityType, new ArrayList<>()); - shakeMap.get(entityType).add(shakeTreasure); - } else if (isExcavation) { + if (isExcavation) { ExcavationTreasure excavationTreasure = new ExcavationTreasure(item, xp, dropChance, dropLevel); List dropList = config.getStringList(type + "." + treasureName + ".Drops_From"); @@ -309,36 +253,6 @@ public class TreasureConfig extends ConfigLoader { hylianMap.get(dropper).add(treasure); } - private void loadEnchantments() { - for (Rarity rarity : Rarity.values()) { - if (rarity == Rarity.RECORD) { - continue; - } - - if (!fishingEnchantments.containsKey(rarity)) { - fishingEnchantments.put(rarity, (new ArrayList<>())); - } - - 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 boolean getInventoryStealEnabled() { return config.contains("Shake.PLAYER.INVENTORY"); } diff --git a/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java b/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java index 7ae9861a9..4d94f0d4b 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java +++ b/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java @@ -56,7 +56,6 @@ import com.gmail.nossr50.util.sounds.SoundManager; import com.gmail.nossr50.util.sounds.SoundType; import net.kyori.adventure.identity.Identified; import net.kyori.adventure.identity.Identity; -import org.apache.commons.lang.Validate; import org.bukkit.GameMode; import org.bukkit.Location; import org.bukkit.block.Block; diff --git a/src/main/java/com/gmail/nossr50/datatypes/treasure/EnchantmentWrapper.java b/src/main/java/com/gmail/nossr50/datatypes/treasure/EnchantmentWrapper.java new file mode 100644 index 000000000..c442b4179 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/datatypes/treasure/EnchantmentWrapper.java @@ -0,0 +1,44 @@ +package com.gmail.nossr50.datatypes.treasure; + +import com.google.common.base.Objects; +import org.bukkit.enchantments.Enchantment; +import org.jetbrains.annotations.NotNull; + +public class EnchantmentWrapper { + private final @NotNull Enchantment enchantment; + private final int enchantmentLevel; + + public EnchantmentWrapper(@NotNull Enchantment enchantment, int enchantmentLevel) { + this.enchantment = enchantment; + this.enchantmentLevel = enchantmentLevel; + } + + public @NotNull Enchantment getEnchantment() { + return enchantment; + } + + public int getEnchantmentLevel() { + return enchantmentLevel; + } + + @Override + public String toString() { + return "EnchantmentWrapper{" + + "enchantment=" + enchantment + + ", enchantmentLevel=" + enchantmentLevel + + '}'; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + EnchantmentWrapper that = (EnchantmentWrapper) o; + return enchantmentLevel == that.enchantmentLevel && Objects.equal(enchantment, that.enchantment); + } + + @Override + public int hashCode() { + return Objects.hashCode(enchantment, enchantmentLevel); + } +} diff --git a/src/main/java/com/gmail/nossr50/datatypes/treasure/FishingTreasureBook.java b/src/main/java/com/gmail/nossr50/datatypes/treasure/FishingTreasureBook.java new file mode 100644 index 000000000..4e65cd9c7 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/datatypes/treasure/FishingTreasureBook.java @@ -0,0 +1,76 @@ +package com.gmail.nossr50.datatypes.treasure; + +import com.gmail.nossr50.mcMMO; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +public class FishingTreasureBook extends FishingTreasure { + private final @Nullable Set blackListedEnchantments; + private final @Nullable Set whiteListedEnchantments; + private final @NotNull List legalEnchantments; //TODO: Make immutable + + public FishingTreasureBook(@NotNull ItemStack enchantedBook, int xp, @Nullable Set blackListedEnchantments, @Nullable Set whiteListedEnchantments) { + super(enchantedBook, xp); + + this.blackListedEnchantments = blackListedEnchantments; + this.whiteListedEnchantments = whiteListedEnchantments; + this.legalEnchantments = new ArrayList<>(); + + initLegalEnchantments(); + } + + private void initLegalEnchantments() { + mcMMO.p.getLogger().info("Registering enchantments for Fishing Book..."); + + for(Enchantment enchantment : Enchantment.values()) { + if(isEnchantAllowed(enchantment)) { + addAllLegalEnchants(enchantment); + } + } + } + + /** + * Get all the enchantments which can drop for this book + * This list can be empty, but should in practice never be empty... + * + * @return all the enchantments that can drop for this book + */ + public @NotNull List getLegalEnchantments() { + return legalEnchantments; + } + + private @Nullable Set getBlacklistedEnchantments() { + return blackListedEnchantments; + } + + private @Nullable Set getWhitelistedEnchantments() { + return whiteListedEnchantments; + } + + private void addAllLegalEnchants(@NotNull Enchantment enchantment) { + int legalEnchantCap = enchantment.getMaxLevel(); + + for(int i = 0; i < legalEnchantCap; i++) { + int enchantLevel = i+1; + EnchantmentWrapper enchantmentWrapper = new EnchantmentWrapper(enchantment, enchantLevel); + legalEnchantments.add(enchantmentWrapper); + mcMMO.p.getLogger().info("Fishing treasure book enchantment added: " + enchantmentWrapper); + } + } + + private boolean isEnchantAllowed(@NotNull Enchantment enchantment) { + if(whiteListedEnchantments != null && !whiteListedEnchantments.isEmpty()) { + return whiteListedEnchantments.contains(enchantment); + } else if(blackListedEnchantments != null && !blackListedEnchantments.isEmpty()) { + return !blackListedEnchantments.contains(enchantment); + } else { + return true; + } + } +} diff --git a/src/main/java/com/gmail/nossr50/datatypes/treasure/Rarity.java b/src/main/java/com/gmail/nossr50/datatypes/treasure/Rarity.java index 40cddb737..ff76b670d 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/treasure/Rarity.java +++ b/src/main/java/com/gmail/nossr50/datatypes/treasure/Rarity.java @@ -1,14 +1,16 @@ package com.gmail.nossr50.datatypes.treasure; +import org.jetbrains.annotations.NotNull; + public enum Rarity { - RECORD, + MYTHIC, LEGENDARY, EPIC, RARE, UNCOMMON, COMMON; - public static Rarity getRarity(String string) { + public static @NotNull Rarity getRarity(@NotNull String string) { try { return valueOf(string); } diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index 15314c693..b98ad9f9f 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -11,6 +11,7 @@ import com.gmail.nossr50.config.mods.ToolConfigManager; import com.gmail.nossr50.config.skills.alchemy.PotionConfig; import com.gmail.nossr50.config.skills.repair.RepairConfigManager; import com.gmail.nossr50.config.skills.salvage.SalvageConfigManager; +import com.gmail.nossr50.config.treasure.FishingTreasureConfig; import com.gmail.nossr50.config.treasure.TreasureConfig; import com.gmail.nossr50.database.DatabaseManager; import com.gmail.nossr50.database.DatabaseManagerFactory; @@ -517,6 +518,7 @@ public class mcMMO extends JavaPlugin { private void loadConfigFiles() { // Force the loading of config files TreasureConfig.getInstance(); + FishingTreasureConfig.getInstance(); HiddenConfig.getInstance(); AdvancedConfig.getInstance(); PotionConfig.getInstance(); diff --git a/src/main/java/com/gmail/nossr50/skills/fishing/Fishing.java b/src/main/java/com/gmail/nossr50/skills/fishing/Fishing.java index c5b7ef833..965b9c924 100644 --- a/src/main/java/com/gmail/nossr50/skills/fishing/Fishing.java +++ b/src/main/java/com/gmail/nossr50/skills/fishing/Fishing.java @@ -1,6 +1,6 @@ package com.gmail.nossr50.skills.fishing; -import com.gmail.nossr50.config.treasure.TreasureConfig; +import com.gmail.nossr50.config.treasure.FishingTreasureConfig; import com.gmail.nossr50.datatypes.treasure.ShakeTreasure; import com.gmail.nossr50.util.Misc; import com.gmail.nossr50.util.adapter.BiomeAdapter; @@ -31,8 +31,8 @@ public final class Fishing { * @return possibleDrops List of ItemStack that can be dropped */ protected static List findPossibleDrops(LivingEntity target) { - if (TreasureConfig.getInstance().shakeMap.containsKey(target.getType())) - return TreasureConfig.getInstance().shakeMap.get(target.getType()); + if (FishingTreasureConfig.getInstance().shakeMap.containsKey(target.getType())) + return FishingTreasureConfig.getInstance().shakeMap.get(target.getType()); return null; } diff --git a/src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java b/src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java index 9d76097b6..59789c29d 100644 --- a/src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java @@ -4,16 +4,14 @@ import com.gmail.nossr50.api.ItemSpawnReason; import com.gmail.nossr50.config.AdvancedConfig; import com.gmail.nossr50.config.Config; import com.gmail.nossr50.config.experience.ExperienceConfig; +import com.gmail.nossr50.config.treasure.FishingTreasureConfig; import com.gmail.nossr50.config.treasure.TreasureConfig; import com.gmail.nossr50.datatypes.experience.XPGainReason; 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.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.datatypes.treasure.*; import com.gmail.nossr50.events.skills.fishing.McMMOPlayerFishingTreasureEvent; import com.gmail.nossr50.events.skills.fishing.McMMOPlayerShakeEvent; import com.gmail.nossr50.locale.LocaleLoader; @@ -40,10 +38,12 @@ import org.bukkit.entity.*; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.PlayerInventory; +import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.SkullMeta; import org.bukkit.util.BoundingBox; import org.bukkit.util.Vector; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.*; @@ -370,9 +370,7 @@ public class FishingManager extends SkillManager { return AdvancedConfig.getInstance().getFishingBoatReductionMaxWaitTicks(); } - - public boolean isMagicHunterEnabled() - { + public boolean isMagicHunterEnabled() { return RankUtils.hasUnlockedSubskill(getPlayer(), SubSkillType.FISHING_MAGIC_HUNTER) && RankUtils.hasUnlockedSubskill(getPlayer(), SubSkillType.FISHING_TREASURE_HUNTER) && Permissions.isSubSkillEnabled(getPlayer(), SubSkillType.FISHING_TREASURE_HUNTER); @@ -383,12 +381,14 @@ public class FishingManager extends SkillManager { * * @param fishingCatch The {@link Item} initially caught */ - public void handleFishing(Item fishingCatch) { + public void handleFishing(@NotNull Item fishingCatch) { this.fishingCatch = fishingCatch; int fishXp = ExperienceConfig.getInstance().getXp(PrimarySkillType.FISHING, fishingCatch.getItemStack().getType()); int treasureXp = 0; + ItemStack treasureDrop = null; Player player = getPlayer(); FishingTreasure treasure = null; + boolean fishingSucceeds = false; if (Config.getInstance().getFishingDropsEnabled() && Permissions.isSubSkillEnabled(player, SubSkillType.FISHING_TREASURE_HUNTER)) { treasure = getFishingTreasure(); @@ -396,49 +396,92 @@ public class FishingManager extends SkillManager { } if (treasure != null) { - ItemStack treasureDrop = treasure.getDrop().clone(); // Not cloning is bad, m'kay? - Map enchants = new HashMap<>(); + if(treasure instanceof FishingTreasureBook) { + treasureDrop = createEnchantBook((FishingTreasureBook) treasure); + } else { + treasureDrop = treasure.getDrop().clone(); // Not cloning is bad, m'kay? - if (isMagicHunterEnabled() - && ItemUtils.isEnchantable(treasureDrop)) { - enchants = handleMagicHunter(treasureDrop); } + Map enchants = new HashMap<>(); + McMMOPlayerFishingTreasureEvent event; - McMMOPlayerFishingTreasureEvent event = EventUtils.callFishingTreasureEvent(player, treasureDrop, treasure.getXp(), enchants); + /* + * Books get some special treatment + */ + if(treasure instanceof FishingTreasureBook) { + //Skip the magic hunter stuff + if(treasureDrop.getItemMeta() != null) { + enchants.putAll(treasureDrop.getItemMeta().getEnchants()); + } + + event = EventUtils.callFishingTreasureEvent(player, treasureDrop, treasure.getXp(), enchants); + } else { + if (isMagicHunterEnabled() && ItemUtils.isEnchantable(treasureDrop)) { + enchants = processMagicHunter(treasureDrop); + } + + event = EventUtils.callFishingTreasureEvent(player, treasureDrop, treasure.getXp(), enchants); + } if (!event.isCancelled()) { treasureDrop = event.getTreasure(); treasureXp = event.getXp(); - } - else { + + // Drop the original catch at the feet of the player and set the treasure as the real catch + if (treasureDrop != null) { + fishingSucceeds = true; + boolean enchanted = false; + + if(treasure instanceof FishingTreasureBook) { + enchanted = true; + } else if (!enchants.isEmpty()) { + treasureDrop.addUnsafeEnchantments(enchants); + enchanted = true; + } + + if (enchanted) { + NotificationManager.sendPlayerInformation(player, NotificationType.SUBSKILL_MESSAGE, "Fishing.Ability.TH.MagicFound"); + } + + } + } else { treasureDrop = null; treasureXp = 0; } + } - // Drop the original catch at the feet of the player and set the treasure as the real catch - if (treasureDrop != null) { - boolean enchanted = false; + if(fishingSucceeds) { + fishingCatch.setItemStack(treasureDrop); - if (!enchants.isEmpty()) { - treasureDrop.addUnsafeEnchantments(enchants); - enchanted = true; - } - - if (enchanted) { - NotificationManager.sendPlayerInformation(player, NotificationType.SUBSKILL_MESSAGE, "Fishing.Ability.TH.MagicFound"); - } - - if (Config.getInstance().getFishingExtraFish()) { - Misc.spawnItem(player.getEyeLocation(), fishingCatch.getItemStack(), ItemSpawnReason.FISHING_EXTRA_FISH); - } - - fishingCatch.setItemStack(treasureDrop); + if (Config.getInstance().getFishingExtraFish()) { + Misc.spawnItem(player.getEyeLocation(), fishingCatch.getItemStack(), ItemSpawnReason.FISHING_EXTRA_FISH); } } applyXpGain(fishXp + treasureXp, XPGainReason.PVE); } + + private @NotNull ItemStack createEnchantBook(@NotNull FishingTreasureBook fishingTreasureBook) { + ItemStack itemStack = fishingTreasureBook.getDrop().clone(); + EnchantmentWrapper enchantmentWrapper = getRandomEnchantment(fishingTreasureBook.getLegalEnchantments()); + ItemMeta itemMeta = itemStack.getItemMeta(); + + if(itemMeta == null) + return itemStack; + + itemMeta.addEnchant(enchantmentWrapper.getEnchantment(), enchantmentWrapper.getEnchantmentLevel(), ExperienceConfig.getInstance().allowUnsafeEnchantments()); + itemStack.setItemMeta(itemMeta); + return itemStack; + } + + private @NotNull EnchantmentWrapper getRandomEnchantment(@NotNull List enchantmentWrappers) { + Collections.shuffle(enchantmentWrappers, Misc.getRandom()); + + int randomIndex = Misc.getRandom().nextInt(enchantmentWrappers.size()); + return enchantmentWrappers.get(randomIndex+1); + } + /** * Handle the vanilla XP boost for Fishing * @@ -548,7 +591,7 @@ public class FishingManager extends SkillManager { * * @return The {@link FishingTreasure} found, or null if no treasure was found. */ - private FishingTreasure getFishingTreasure() { + private @Nullable FishingTreasure getFishingTreasure() { double diceRoll = Misc.getRandom().nextDouble() * 100; int luck; @@ -569,12 +612,8 @@ public class FishingManager extends SkillManager { double dropRate = TreasureConfig.getInstance().getItemDropRate(getLootTier(), rarity); if (diceRoll <= dropRate) { - /*if (rarity == Rarity.TRAP) { - handleTraps(); - break; - }*/ - List fishingTreasures = TreasureConfig.getInstance().fishingRewards.get(rarity); + List fishingTreasures = FishingTreasureConfig.getInstance().fishingRewards.get(rarity); if (fishingTreasures.isEmpty()) { return null; @@ -612,19 +651,14 @@ public class FishingManager extends SkillManager { * Process the Magic Hunter ability * * @param treasureDrop The {@link ItemStack} to enchant - * - * @return true if the item has been enchanted */ - private Map handleMagicHunter(ItemStack treasureDrop) { + private Map processMagicHunter(@NotNull ItemStack treasureDrop) { Map enchants = new HashMap<>(); List fishingEnchantments = null; double diceRoll = Misc.getRandom().nextDouble() * 100; for (Rarity rarity : Rarity.values()) { - if (rarity == Rarity.RECORD) { - continue; - } double dropRate = TreasureConfig.getInstance().getEnchantmentDropRate(getLootTier(), rarity); @@ -634,7 +668,8 @@ public class FishingManager extends SkillManager { diceRoll = dropRate + 1; continue; } - fishingEnchantments = TreasureConfig.getInstance().fishingEnchantments.get(rarity); + + fishingEnchantments = FishingTreasureConfig.getInstance().fishingEnchantments.get(rarity); break; } diff --git a/src/main/java/com/gmail/nossr50/util/EventUtils.java b/src/main/java/com/gmail/nossr50/util/EventUtils.java index a290ab0dd..52a2f989e 100644 --- a/src/main/java/com/gmail/nossr50/util/EventUtils.java +++ b/src/main/java/com/gmail/nossr50/util/EventUtils.java @@ -1,7 +1,6 @@ package com.gmail.nossr50.util; import com.gmail.nossr50.config.Config; -import com.gmail.nossr50.config.experience.ExperienceConfig; import com.gmail.nossr50.datatypes.experience.XPGainReason; import com.gmail.nossr50.datatypes.experience.XPGainSource; import com.gmail.nossr50.datatypes.party.Party; diff --git a/src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java b/src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java index e6b50d469..215c160d8 100644 --- a/src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java +++ b/src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java @@ -142,6 +142,15 @@ public final class CommandRegistrationManager { command.setExecutor(new McgodCommand()); } +// private static void registerDropTreasureCommand() { +// PluginCommand command = mcMMO.p.getCommand("mmodroptreasures"); +// command.setDescription(LocaleLoader.getString("Commands.Description.droptreasures")); +// command.setPermission("mcmmo.commands.droptreasures"); +// command.setPermissionMessage(permissionsMessage); +// command.setUsage(LocaleLoader.getString("Commands.Usage.0", "mcgod")); +// command.setExecutor(new DropTreasureCommand()); +// } + private static void registerMmoInfoCommand() { PluginCommand command = mcMMO.p.getCommand("mmoinfo"); command.setDescription(LocaleLoader.getString("Commands.Description.mmoinfo")); diff --git a/src/main/resources/fishing_treasures.yml b/src/main/resources/fishing_treasures.yml new file mode 100644 index 000000000..36948f73b --- /dev/null +++ b/src/main/resources/fishing_treasures.yml @@ -0,0 +1,828 @@ +# +# Settings for Fishing Treasures / Shake Treasures +# Last updated on 12/28/2020 +### +Fishing: + LEATHER_BOOTS: + Amount: 1 + XP: 200 + Rarity: COMMON + LEATHER_HELMET: + Amount: 1 + XP: 200 + Rarity: COMMON + LEATHER_LEGGINGS: + Amount: 1 + XP: 200 + Rarity: COMMON + LEATHER_CHESTPLATE: + Amount: 1 + XP: 200 + Rarity: COMMON + WOODEN_SWORD: + Amount: 1 + XP: 200 + Rarity: COMMON + WOODEN_SHOVEL: + Amount: 1 + XP: 200 + Rarity: COMMON + WOODEN_PICKAXE: + Amount: 1 + XP: 200 + Rarity: COMMON + WOODEN_AXE: + Amount: 1 + XP: 200 + Rarity: COMMON + WOODEN_HOE: + Amount: 1 + XP: 200 + Rarity: COMMON + LAPIS_LAZULI: + Amount: 20 + XP: 200 + Rarity: COMMON + STONE_SWORD: + Amount: 1 + XP: 200 + Rarity: UNCOMMON + STONE_SHOVEL: + Amount: 1 + XP: 200 + Rarity: UNCOMMON + STONE_PICKAXE: + Amount: 1 + XP: 200 + Rarity: UNCOMMON + STONE_AXE: + Amount: 1 + XP: 200 + Rarity: UNCOMMON + STONE_HOE: + Amount: 1 + XP: 200 + Rarity: UNCOMMON + GOLDEN_SWORD: + Amount: 1 + XP: 200 + Rarity: UNCOMMON + GOLDEN_SHOVEL: + Amount: 1 + XP: 200 + Rarity: UNCOMMON + GOLDEN_PICKAXE: + Amount: 1 + XP: 200 + Rarity: UNCOMMON + GOLDEN_AXE: + Amount: 1 + XP: 200 + Rarity: UNCOMMON + GOLDEN_HOE: + Amount: 1 + XP: 200 + Rarity: UNCOMMON + GOLDEN_BOOTS: + Amount: 1 + XP: 200 + Rarity: UNCOMMON + GOLDEN_HELMET: + Amount: 1 + XP: 200 + Rarity: UNCOMMON + GOLDEN_LEGGINGS: + Amount: 1 + XP: 200 + Rarity: UNCOMMON + GOLDEN_CHESTPLATE: + Amount: 1 + XP: 200 + Rarity: UNCOMMON + IRON_INGOT: + Amount: 5 + XP: 200 + Rarity: UNCOMMON + GOLD_INGOT: + Amount: 5 + XP: 200 + Rarity: UNCOMMON + IRON_SWORD: + Amount: 1 + XP: 200 + Rarity: RARE + IRON_SHOVEL: + Amount: 1 + XP: 200 + Rarity: RARE + IRON_PICKAXE: + Amount: 1 + XP: 200 + Rarity: RARE + IRON_AXE: + Amount: 1 + XP: 200 + Rarity: RARE + IRON_HOE: + Amount: 1 + XP: 200 + Rarity: RARE + BOW: + Amount: 1 + XP: 200 + Rarity: RARE + ENDER_PEARL: + Amount: 1 + XP: 200 + Rarity: RARE + BLAZE_ROD: + Amount: 1 + XP: 200 + Rarity: RARE + IRON_BOOTS: + Amount: 1 + XP: 200 + Rarity: EPIC + IRON_HELMET: + Amount: 1 + XP: 200 + Rarity: EPIC + IRON_LEGGINGS: + Amount: 1 + XP: 200 + Rarity: EPIC + IRON_CHESTPLATE: + Amount: 1 + XP: 200 + Rarity: EPIC + GHAST_TEAR: + Amount: 1 + XP: 200 + Rarity: EPIC + DIAMOND: + Amount: 5 + XP: 200 + Rarity: EPIC + DIAMOND_SWORD: + Amount: 1 + XP: 200 + Rarity: LEGENDARY + DIAMOND_SHOVEL: + Amount: 1 + XP: 200 + Rarity: LEGENDARY + DIAMOND_PICKAXE: + Amount: 1 + XP: 200 + Rarity: LEGENDARY + DIAMOND_AXE: + Amount: 1 + XP: 200 + Rarity: LEGENDARY + DIAMOND_HOE: + Amount: 1 + XP: 200 + Rarity: LEGENDARY + DIAMOND_BOOTS: + Amount: 1 + XP: 200 + Rarity: LEGENDARY + DIAMOND_HELMET: + Amount: 1 + XP: 200 + Rarity: LEGENDARY + DIAMOND_LEGGINGS: + Amount: 1 + XP: 200 + Rarity: LEGENDARY + DIAMOND_CHESTPLATE: + Amount: 1 + XP: 200 + Rarity: LEGENDARY + MUSIC_DISC_BLOCKS: + Amount: 1 + XP: 200 + Rarity: UNCOMMON + MUSIC_DISC_CHIRP: + Amount: 1 + XP: 200 + Rarity: UNCOMMON + MUSIC_DISC_FAR: + Amount: 1 + XP: 200 + Rarity: RARE + MUSIC_DISC_MALL: + Amount: 1 + XP: 200 + Rarity: RARE + MUSIC_DISC_MELLOHI: + Amount: 1 + XP: 200 + Rarity: RARE + MUSIC_DISC_STAL: + Amount: 1 + XP: 200 + Rarity: EPIC + MUSIC_DISC_STRAD: + Amount: 1 + XP: 200 + Rarity: EPIC + MUSIC_DISC_WARD: + Amount: 1 + XP: 200 + Rarity: EPIC + MUSIC_DISC_11: + Amount: 1 + XP: 200 + Rarity: LEGENDARY + MUSIC_DISC_WAIT: + Amount: 1 + XP: 200 + Rarity: LEGENDARY + MUSIC_DISC_13: + Amount: 1 + XP: 200 + Rarity: MYTHIC + NETHERITE_SWORD: + Amount: 1 + XP: 200 + Rarity: MYTHIC + NETHERITE_SHOVEL: + Amount: 1 + XP: 200 + Rarity: MYTHIC + NETHERITE_PICKAXE: + Amount: 1 + XP: 200 + Rarity: MYTHIC + NETHERITE_AXE: + Amount: 1 + XP: 200 + Rarity: MYTHIC + NETHERITE_HOE: + Amount: 1 + XP: 200 + Rarity: MYTHIC + NETHERITE_BOOTS: + Amount: 1 + XP: 200 + Rarity: MYTHIC + NETHERITE_HELMET: + Amount: 1 + XP: 200 + Rarity: MYTHIC + NETHERITE_LEGGINGS: + Amount: 1 + XP: 200 + Rarity: MYTHIC + NETHERITE_CHESTPLATE: + Amount: 1 + XP: 200 + Rarity: MYTHIC + ENCHANTED_BOOK: + Amount: 1 + XP: 400 + Rarity: MYTHIC + Enchantments_Whitelist: + - Fortune + - Protection + NETHERITE_SCRAP: + Amount: 1 + XP: 400 + Rarity: MYTHIC +# +# 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 + MYTHIC: 0.01 + Tier_2: + TRAP: 2.50 + COMMON: 6.50 + UNCOMMON: 1.75 + RARE: 0.75 + EPIC: 0.50 + LEGENDARY: 0.05 + MYTHIC: 0.01 + Tier_3: + TRAP: 1.50 + COMMON: 3.50 + UNCOMMON: 2.75 + RARE: 1.25 + EPIC: 1.00 + LEGENDARY: 0.10 + MYTHIC: 0.01 + Tier_4: + TRAP: 1.00 + COMMON: 2.00 + UNCOMMON: 3.50 + RARE: 2.25 + EPIC: 1.50 + LEGENDARY: 1.00 + MYTHIC: 0.01 + Tier_5: + TRAP: 0.25 + COMMON: 1.50 + UNCOMMON: 3.75 + RARE: 2.50 + EPIC: 2.00 + LEGENDARY: 1.00 + MYTHIC: 0.01 + Tier_6: + TRAP: 0.10 + COMMON: 1.00 + UNCOMMON: 3.25 + RARE: 3.75 + EPIC: 2.50 + LEGENDARY: 1.50 + MYTHIC: 0.05 + Tier_7: + TRAP: 0.05 + COMMON: 0.25 + UNCOMMON: 2.75 + RARE: 4.00 + EPIC: 5.00 + LEGENDARY: 2.50 + MYTHIC: 0.10 + Tier_8: + TRAP: 0.01 + COMMON: 0.10 + UNCOMMON: 1.50 + RARE: 6.00 + EPIC: 7.50 + LEGENDARY: 5.00 + MYTHIC: 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: 1 + 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 + MYTHIC: 0.01 + Tier_2: + COMMON: 7.50 + UNCOMMON: 1.00 + RARE: 0.10 + EPIC: 0.01 + LEGENDARY: 0.01 + MYTHIC: 0.01 + Tier_3: + COMMON: 7.50 + UNCOMMON: 2.50 + RARE: 0.25 + EPIC: 0.10 + LEGENDARY: 0.01 + MYTHIC: 0.01 + Tier_4: + COMMON: 10.0 + UNCOMMON: 2.75 + RARE: 0.50 + EPIC: 0.10 + LEGENDARY: 0.05 + MYTHIC: 0.05 + Tier_5: + COMMON: 10.0 + UNCOMMON: 4.00 + RARE: 0.75 + EPIC: 0.25 + LEGENDARY: 0.10 + MYTHIC: 0.10 + Tier_6: + COMMON: 9.50 + UNCOMMON: 5.50 + RARE: 1.75 + EPIC: 0.50 + LEGENDARY: 0.25 + MYTHIC: 0.25 + Tier_7: + COMMON: 8.50 + UNCOMMON: 7.50 + RARE: 2.75 + EPIC: 0.75 + LEGENDARY: 0.50 + MYTHIC: 0.50 + Tier_8: + COMMON: 7.50 + UNCOMMON: 10.0 + RARE: 5.25 + EPIC: 1.50 + LEGENDARY: 0.75 + MYTHIC: 0.75 +# +# Settings for Shake +# If you are in retro mode, Drop_Level is multiplied by 10. +### +Shake: + BLAZE: + BLAZE_ROD: + Amount: 1 + XP: 0 + Drop_Chance: 100.0 + Drop_Level: 0 + CAVE_SPIDER: + SPIDER_EYE: + Amount: 1 + XP: 0 + Drop_Chance: 49.0 + Drop_Level: 0 + STRING: + Amount: 1 + XP: 0 + Drop_Chance: 49.0 + Drop_Level: 0 + COBWEB: + Amount: 1 + XP: 0 + Drop_Chance: 1.0 + Drop_Level: 0 + POTION|0|POISON: + PotionData: + PotionType: POISON + Amount: 1 + XP: 0 + Drop_Chance: 1.0 + Drop_Level: 0 + CHICKEN: + FEATHER: + Amount: 1 + XP: 0 + Drop_Chance: 33.3 + Drop_Level: 0 + CHICKEN: + Amount: 1 + XP: 0 + Drop_Chance: 33.3 + Drop_Level: 0 + EGG: + Amount: 1 + XP: 0 + Drop_Chance: 33.3 + Drop_Level: 0 + COW: + MILK_BUCKET: + Amount: 1 + XP: 0 + Drop_Chance: 2.0 + Drop_Level: 0 + LEATHER: + Amount: 1 + XP: 0 + Drop_Chance: 49.0 + Drop_Level: 0 + BEEF: + Amount: 1 + XP: 0 + Drop_Chance: 49.0 + Drop_Level: 0 + CREEPER: + CREEPER_HEAD: + Amount: 1 + XP: 0 + Drop_Chance: 1.0 + Drop_Level: 0 + GUNPOWDER: + Amount: 1 + XP: 0 + Drop_Chance: 99.0 + Drop_Level: 0 + ENDERMAN: + ENDER_PEARL: + Amount: 1 + XP: 0 + Drop_Chance: 100.0 + Drop_Level: 0 + GHAST: + GUNPOWDER: + Amount: 1 + XP: 0 + Drop_Chance: 50.0 + Drop_Level: 0 + GHAST_TEAR: + Amount: 1 + XP: 0 + Drop_Chance: 50.0 + Drop_Level: 0 + HORSE: + LEATHER: + Amount: 1 + XP: 0 + Drop_Chance: 99.0 + Drop_Level: 0 + SADDLE: + Amount: 1 + XP: 0 + Drop_Chance: 1.0 + Drop_Level: 0 + IRON_GOLEM: + PUMPKIN: + Amount: 1 + XP: 0 + Drop_Chance: 3.0 + Drop_Level: 0 + IRON_INGOT: + Amount: 1 + XP: 0 + Drop_Chance: 12.0 + Drop_Level: 0 + POPPY: + Amount: 1 + XP: 0 + Drop_Chance: 85.0 + Drop_Level: 0 + MAGMA_CUBE: + MAGMA_CREAM: + Amount: 1 + XP: 0 + Drop_Chance: 100.0 + Drop_Level: 0 + MUSHROOM_COW: + MILK_BUCKET: + Amount: 1 + XP: 0 + Drop_Chance: 5.0 + Drop_Level: 0 + MUSHROOM_STEW: + Amount: 1 + XP: 0 + Drop_Chance: 5.0 + Drop_Level: 0 + LEATHER: + Amount: 1 + XP: 0 + Drop_Chance: 30.0 + Drop_Level: 0 + BEEF: + Amount: 1 + XP: 0 + Drop_Chance: 30.0 + Drop_Level: 0 + RED_MUSHROOM: + Amount: 2 + XP: 0 + Drop_Chance: 30.0 + Drop_Level: 0 + PIG: + PORKCHOP: + Amount: 1 + XP: 0 + Drop_Chance: 100.0 + Drop_Level: 0 + PIG_ZOMBIE: + ROTTEN_FLESH: + Amount: 1 + XP: 0 + Drop_Chance: 50.0 + Drop_Level: 0 + GOLD_NUGGET: + Amount: 1 + XP: 0 + Drop_Chance: 50.0 + Drop_Level: 0 + PLAYER: + SKELETON_SKULL: + Amount: 1 + XP: 0 + Drop_Chance: 0.0 + Drop_Level: 0 + INVENTORY: + Whole_Stacks: false + Drop_Chance: 0.0 + Drop_Level: 0 + SHEEP: + WHITE_WOOL: + Amount: 3 + XP: 0 + Drop_Chance: 100.0 + Drop_Level: 0 + SHULKER: + SHULKER_SHELL: + Amount: 1 + XP: 0 + Drop_Chance: 25.0 + Drop_Level: 0 + PURPUR_BLOCK: + Amount: 1 + XP: 0 + Drop_Chance: 75.0 + Drop_Level: 0 + SKELETON: + SKELETON_SKULL: + Amount: 1 + XP: 0 + Drop_Chance: 2.0 + Drop_Level: 0 + BONE: + Amount: 1 + XP: 0 + Drop_Chance: 49.0 + Drop_Level: 0 + ARROW: + Amount: 2 + XP: 0 + Drop_Chance: 49.0 + Drop_Level: 0 + SLIME: + SLIME_BALL: + Amount: 1 + XP: 0 + Drop_Chance: 100.0 + Drop_Level: 0 + SPIDER: + SPIDER_EYE: + Amount: 1 + XP: 0 + Drop_Chance: 50.0 + Drop_Level: 0 + STRING: + Amount: 1 + XP: 0 + Drop_Chance: 50.0 + Drop_Level: 0 + SNOWMAN: + PUMPKIN: + Amount: 1 + XP: 0 + Drop_Chance: 3.0 + Drop_Level: 0 + SNOWBALL: + Amount: 2 + XP: 0 + Drop_Chance: 97.0 + Drop_Level: 0 + SQUID: + INK_SAC: + Amount: 1 + XP: 0 + Drop_Chance: 100.0 + Drop_Level: 0 + WITCH: + SPLASH_POTION|0|INSTANT_HEAL: + PotionData: + PotionType: INSTANT_HEAL + Amount: 1 + XP: 0 + Drop_Chance: 1.0 + Drop_Level: 0 + SPLASH_POTION|0|FIRE_RESISTANCE: + PotionData: + PotionType: FIRE_RESISTANCE + Amount: 1 + XP: 0 + Drop_Chance: 1.0 + Drop_Level: 0 + SPLASH_POTION|0|SPEED: + PotionData: + PotionType: SPEED + Amount: 1 + XP: 0 + Drop_Chance: 1.0 + Drop_Level: 0 + GLASS_BOTTLE: + Amount: 1 + XP: 0 + Drop_Chance: 7.0 + Drop_Level: 0 + GLOWSTONE_DUST: + Amount: 1 + XP: 0 + Drop_Chance: 15.0 + Drop_Level: 0 + GUNPOWDER: + Amount: 1 + XP: 0 + Drop_Chance: 15.0 + Drop_Level: 0 + REDSTONE: + Amount: 1 + XP: 0 + Drop_Chance: 15.0 + Drop_Level: 0 + SPIDER_EYE: + Amount: 1 + XP: 0 + Drop_Chance: 15.0 + Drop_Level: 0 + STICK: + Amount: 1 + XP: 0 + Drop_Chance: 15.0 + Drop_Level: 0 + SUGAR: + Amount: 1 + XP: 0 + Drop_Chance: 15.0 + Drop_Level: 0 + WITHER_SKELETON: + WITHER_SKELETON_SKULL: + Amount: 1 + XP: 0 + Drop_Chance: 2.0 + Drop_Level: 0 + BONE: + Amount: 1 + XP: 0 + Drop_Chance: 49.0 + Drop_Level: 0 + COAL: + Amount: 2 + XP: 0 + Drop_Chance: 49.0 + Drop_Level: 0 + ZOMBIE: + ZOMBIE_HEAD: + Amount: 1 + XP: 0 + Drop_Chance: 2.0 + Drop_Level: 0 + ROTTEN_FLESH: + Amount: 1 + XP: 0 + Drop_Chance: 98.0 + Drop_Level: 0 \ No newline at end of file diff --git a/src/main/resources/locale/locale_de.properties b/src/main/resources/locale/locale_de.properties index 23e9fba05..d6525a129 100644 --- a/src/main/resources/locale/locale_de.properties +++ b/src/main/resources/locale/locale_de.properties @@ -380,7 +380,7 @@ Fishing.SubSkill.Shake.Stat = Rei\u00DFen Chance Fishing.SubSkill.TreasureHunter.Description = Angle verschiedene Objekte Fishing.SubSkill.TreasureHunter.Name = Schatz J\u00E4ger Fishing.SubSkill.TreasureHunter.Stat = Schatz J\u00E4ger Rang: &a{0}&3/&a{1} -Fishing.SubSkill.TreasureHunter.Stat.Extra = Drop Rate: &7\u00DCblich: &e{0} &aUn\u00FCblich: &e{1}\r\n&9Selten: &e{2} &dEpisch: &e{3} &6Legend\u00E4r: &e{4} &bSchallplatte: &e{5} +Fishing.SubSkill.TreasureHunter.Stat.Extra = Drop Rate: &7\u00DCblich: &e{0} &aUn\u00FCblich: &e{1}\r\n&9Selten: &e{2} &dEpisch: &e{3} &6Legend\u00E4r: &e{4} &bMythic: &e{5} Guides.Acrobatics.Section.0 = &3\u00DCber Akrobatik:\n&eAkrobatik ist die Kunst sich anmutig fortzubewegen.\n&eFall- und Kampfschaden werden reduziert\n\n&3XP GAIN:\n&eErfahrung sammelst du indem du in K\u00E4mpfen\n&eausweichst oder St\u00FCrze aus gro\u00DFen H\u00F6hen \u00FCberlebst. Guides.Acrobatics.Section.1 = &3Wie funktioniert Abrollen?\n&eAb und zu rollst du beim Fallen ab und der Fallschaden wird\n&ereduziert. Wenn du den Schleichen Knopf w\u00E4hrend dem Fallen\n&eh\u00E4ltst, verdoppelt sich die Chance abzurollen.\n&eIn dem Fall rollst du anmutig ab.\n&eAnmutige Rollen sind wie normale Rollen, nur dass\n&esie \u00F6fter passieren und damit mehr Schutz vor St\u00FCrzen\n&eliefern. diff --git a/src/main/resources/locale/locale_en_US.properties b/src/main/resources/locale/locale_en_US.properties index 585d9a5f9..e60f89a86 100644 --- a/src/main/resources/locale/locale_en_US.properties +++ b/src/main/resources/locale/locale_en_US.properties @@ -241,7 +241,7 @@ Fishing.Ability.Locked.2=LOCKED UNTIL {0}+ SKILL (MASTER ANGLER) Fishing.SubSkill.TreasureHunter.Name=Treasure Hunter Fishing.SubSkill.TreasureHunter.Description=Fish up misc. objects Fishing.SubSkill.TreasureHunter.Stat=Treasure Hunter Rank: &a{0}&3/&a{1} -Fishing.SubSkill.TreasureHunter.Stat.Extra=Drop Rate: &7Common: &e{0} &aUncommon: &e{1}\n&9Rare: &e{2} &dEpic: &e{3} &6Legendary: &e{4} &bRecord: &e{5} +Fishing.SubSkill.TreasureHunter.Stat.Extra=Drop Rate: &7Common: &e{0} &aUncommon: &e{1}\n&9Rare: &e{2} &dEpic: &e{3} &6Legendary: &e{4} &bMythic: &e{5} Fishing.SubSkill.MagicHunter.Name=Magic Hunter Fishing.SubSkill.MagicHunter.Description=Find Enchanted Items Fishing.SubSkill.MagicHunter.Stat=Magic Hunter Chance diff --git a/src/main/resources/locale/locale_fr.properties b/src/main/resources/locale/locale_fr.properties index 3ef73beeb..c773ad65c 100644 --- a/src/main/resources/locale/locale_fr.properties +++ b/src/main/resources/locale/locale_fr.properties @@ -240,7 +240,7 @@ Fishing.Ability.Locked.2=Bloqu\u00e9 jusqu\'\u00e0 {0}+ niveau(x) (Ma\u00eetre P Fishing.SubSkill.TreasureHunter.Name=Chasseur de tr\u00e9sors Fishing.SubSkill.TreasureHunter.Description=Remonte des objets inhabituels Fishing.SubSkill.TreasureHunter.Stat=Grade de chasseur de tr\u00e9sor: &a{0}&3/&a{1} -Fishing.SubSkill.TreasureHunter.Stat.Extra=Ratio de drop: &7Commun: &e{0} &aNon-commun: &e{1}\n&9Rare: &e{2} &dEpique: &e{3} &6Legendaire: &e{4} &bRecord: &e{5} +Fishing.SubSkill.TreasureHunter.Stat.Extra=Ratio de drop: &7Commun: &e{0} &aNon-commun: &e{1}\n&9Rare: &e{2} &dEpique: &e{3} &6Legendaire: &e{4} &bMythic: &e{5} Fishing.SubSkill.MagicHunter.Name=P\u00eache magique Fishing.SubSkill.MagicHunter.Description=Remonte des objets magiques Fishing.SubSkill.MagicHunter.Stat=Chance du chasseur de tr\u00e9sor diff --git a/src/main/resources/locale/locale_hu_HU.properties b/src/main/resources/locale/locale_hu_HU.properties index f3d8148f2..71f11514c 100644 --- a/src/main/resources/locale/locale_hu_HU.properties +++ b/src/main/resources/locale/locale_hu_HU.properties @@ -240,7 +240,7 @@ Fishing.Ability.Locked.2=LEZ\u00C1RVA {0}+ K\u00C9PESS\u00C9G SZINTIG (MESTER HO Fishing.SubSkill.TreasureHunter.Name=Kincsvad\u00E1sz Fishing.SubSkill.TreasureHunter.Description=Furcsa t\u00E1rgyak kihal\u00E1sz\u00E1sa Fishing.SubSkill.TreasureHunter.Stat=Kincsvad\u00E1sz Szint: &a{0}&3/&a{1} -Fishing.SubSkill.TreasureHunter.Stat.Extra=T\u00E1rgy Es\u00E9si Es\u00E9ly: &7\u00C1tlagos: &e{0} &aRendk\u00EDv\u00FCli: &e{1}\n&9Ritka: &e{2} &dEpikus: &e{3} &6Legend\u00E1s: &e{4} &bRekord: &e{5} +Fishing.SubSkill.TreasureHunter.Stat.Extra=T\u00E1rgy Es\u00E9si Es\u00E9ly: &7\u00C1tlagos: &e{0} &aRendk\u00EDv\u00FCli: &e{1}\n&9Ritka: &e{2} &dEpikus: &e{3} &6Legend\u00E1s: &e{4} &bMythic: &e{5} Fishing.SubSkill.MagicHunter.Name=M\u00E1gikus Vad\u00E1sz Fishing.SubSkill.MagicHunter.Description=Elvar\u00E1zsolt T\u00E1rgyak Megtal\u00E1l\u00E1sa Fishing.SubSkill.MagicHunter.Stat=Es\u00E9ly M\u00E1gikus Vad\u00E1szra diff --git a/src/main/resources/locale/locale_it.properties b/src/main/resources/locale/locale_it.properties index 10b7d5a97..c5f293733 100644 --- a/src/main/resources/locale/locale_it.properties +++ b/src/main/resources/locale/locale_it.properties @@ -247,7 +247,7 @@ Fishing.Ability.Locked.2=BLOCCATO FINO AD ABILIT\u00E0 {0}+ (PESCATORE PROVETTO) Fishing.SubSkill.TreasureHunter.Name=Cacciatore di Tesori Fishing.SubSkill.TreasureHunter.Description=Pesca oggetti vari Fishing.SubSkill.TreasureHunter.Stat=Grado Cacciatore di Tesori: &a{0}&3/&a{1} -Fishing.SubSkill.TreasureHunter.Stat.Extra=Tasso di Drop: &7Comune: &e{0} &aNon comune: &e{1}\n&9Raro: &e{2} &dEpico: &e{3} &6Leggendario: &e{4} &bRecord: &e{5} +Fishing.SubSkill.TreasureHunter.Stat.Extra=Tasso di Drop: &7Comune: &e{0} &aNon comune: &e{1}\n&9Raro: &e{2} &dEpico: &e{3} &6Leggendario: &e{4} &bMythic: &e{5} Fishing.SubSkill.MagicHunter.Name=Cacciatore di Magia Fishing.SubSkill.MagicHunter.Description=Trova Oggetti Incantati Fishing.SubSkill.MagicHunter.Stat=Possibilit\u00E0 Cacciatore di Magia diff --git a/src/main/resources/locale/locale_ja_JP.properties b/src/main/resources/locale/locale_ja_JP.properties index b3da37ccb..1064c29ac 100644 --- a/src/main/resources/locale/locale_ja_JP.properties +++ b/src/main/resources/locale/locale_ja_JP.properties @@ -230,7 +230,7 @@ Fishing.Ability.Locked.2=\u30ed\u30c3\u30af\u3055\u308c\u308b\u307e\u3067 {0}+ \ Fishing.SubSkill.TreasureHunter.Name=\u30c8\u30ec\u30b8\u30e3\u30fc\u30cf\u30f3\u30bf\u30fc Fishing.SubSkill.TreasureHunter.Description=\u9b5a\u3084\u7269\u3092\u91e3\u308a\u4e0a\u3052\u308b\u3002 Fishing.SubSkill.TreasureHunter.Stat=\u30c8\u30ec\u30b8\u30e3\u30fc\u30cf\u30f3\u30bf\u30fc \u30e9\u30f3\u30af: &a{0}&3/&a{1} -Fishing.SubSkill.TreasureHunter.Stat.Extra=\u30c9\u30ed\u30c3\u30d7\u7387: &7\u30b3\u30e2\u30f3: &e{0} &a\u30a2\u30f3\u30b3\u30e2\u30f3: &e{1}\n&9\u30ec\u30a2: &e{2} &d\u30a8\u30d4\u30c3\u30af: &e{3} &6\u30ec\u30b8\u30a7\u30f3\u30c0\u30ea\u30fc: &e{4} &b\u30ec\u30b3\u30fc\u30c9: &e{5} +Fishing.SubSkill.TreasureHunter.Stat.Extra=\u30c9\u30ed\u30c3\u30d7\u7387: &7\u30b3\u30e2\u30f3: &e{0} &a\u30a2\u30f3\u30b3\u30e2\u30f3: &e{1}\n&9\u30ec\u30a2: &e{2} &d\u30a8\u30d4\u30c3\u30af: &e{3} &6\u30ec\u30b8\u30a7\u30f3\u30c0\u30ea\u30fc: &e{4} &bMythic: &e{5} Fishing.SubSkill.MagicHunter.Name=\u30de\u30b8\u30c3\u30af\u30cf\u30f3\u30bf\u30fc Fishing.SubSkill.MagicHunter.Description=\u30a8\u30f3\u30c1\u30e3\u30f3\u30c8\u3055\u308c\u305f\u30a2\u30a4\u30c6\u30e0\u3092\u898b\u3064\u3051\u308b\u3002 Fishing.SubSkill.MagicHunter.Stat=\u30de\u30b8\u30c3\u30af\u30cf\u30f3\u30bf\u30fc \u78ba\u7387 diff --git a/src/main/resources/locale/locale_lt_LT.properties b/src/main/resources/locale/locale_lt_LT.properties index e6eaef4fc..80e26d8e4 100644 --- a/src/main/resources/locale/locale_lt_LT.properties +++ b/src/main/resources/locale/locale_lt_LT.properties @@ -240,7 +240,7 @@ Fishing.Ability.Locked.2=LOCKED UNTIL {0}+ SKILL (MASTER ANGLER) Fishing.SubSkill.TreasureHunter.Name=Lobių ieškotojas Fishing.SubSkill.TreasureHunter.Description=Fish up misc. objects Fishing.SubSkill.TreasureHunter.Stat=Lobių ieškotojo rankas: &a{0}&3/&a{1} -Fishing.SubSkill.TreasureHunter.Stat.Extra=Drop Rate: &7Common: &e{0} &aUncommon: &e{1}\n&9Rare: &e{2} &dEpic: &e{3} &6Legendary: &e{4} &bRecord: &e{5} +Fishing.SubSkill.TreasureHunter.Stat.Extra=Drop Rate: &7Common: &e{0} &aUncommon: &e{1}\n&9Rare: &e{2} &dEpic: &e{3} &6Legendary: &e{4} &bMythic: &e{5} Fishing.SubSkill.MagicHunter.Name=Magiškas žvejys Fishing.SubSkill.MagicHunter.Description=Find Enchanted Items Fishing.SubSkill.MagicHunter.Stat=Magic Hunter Chance diff --git a/src/main/resources/locale/locale_ru.properties b/src/main/resources/locale/locale_ru.properties index be1e8680b..9d36e5e2d 100644 --- a/src/main/resources/locale/locale_ru.properties +++ b/src/main/resources/locale/locale_ru.properties @@ -188,7 +188,7 @@ Fishing.Ability.FD=\u0420\u044b\u0431\u0430\u0446\u043a\u0430\u044f \u0414\u0438 Fishing.SubSkill.TreasureHunter.Name=\u041e\u0445\u043e\u0442\u043d\u0438\u043a \u0437\u0430 \u0421\u043e\u043a\u0440\u043e\u0432\u0438\u0449\u0430\u043c\u0438 (\u041f\u0430\u0441\u0441\u0438\u0432\u043d\u043e\u0435) Fishing.SubSkill.TreasureHunter.Description=\u041b\u043e\u0432\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u0432 Fishing.SubSkill.TreasureHunter.Stat=\u0420\u0430\u043d\u0433 \u041e\u0445\u043e\u0442\u043d\u0438\u043a\u0430 \u0437\u0430 \u0421\u043e\u043a\u0440\u043e\u0432\u0438\u0449\u0430\u043c\u0438: &a{0}&3/&a{1} -Fishing.SubSkill.TreasureHunter.Stat.Extra=\u0428\u0430\u043d\u0441 \u0434\u0440\u043e\u043f\u0430: &7\u041e\u0431\u044b\u0447\u043d\u044b\u0439: &e{0} &a\u041d\u0435\u043e\u0431\u044b\u0447\u043d\u044b\u0439: &e{1}\n&9\u0420\u0435\u0434\u043a\u0438\u0439: &e{2} &d\u042d\u043f\u0438\u0447\u0435\u0441\u043a\u0438\u0439: &e{3} &6\u041b\u0435\u0433\u0435\u043d\u0434\u0430\u0440\u043d\u044b\u0439: &e{4} &b\u041f\u043b\u0430\u0441\u0442\u0438\u043d\u043a\u0430: &e{5} +Fishing.SubSkill.TreasureHunter.Stat.Extra=\u0428\u0430\u043d\u0441 \u0434\u0440\u043e\u043f\u0430: &7\u041e\u0431\u044b\u0447\u043d\u044b\u0439: &e{0} &a\u041d\u0435\u043e\u0431\u044b\u0447\u043d\u044b\u0439: &e{1}\n&9\u0420\u0435\u0434\u043a\u0438\u0439: &e{2} &d\u042d\u043f\u0438\u0447\u0435\u0441\u043a\u0438\u0439: &e{3} &6\u041b\u0435\u0433\u0435\u043d\u0434\u0430\u0440\u043d\u044b\u0439: &e{4} &bMythic: &e{5} Fishing.SubSkill.MagicHunter.Name=\u041e\u0445\u043e\u0442\u043d\u0438\u043a \u0417\u0430 \u041c\u0430\u0433\u0438\u0435\u0439 Fishing.SubSkill.MagicHunter.Description=\u041d\u0430\u0445\u043e\u0434\u043a\u0430 \u0417\u0430\u0447\u0430\u0440\u043e\u0432\u0430\u043d\u044b\u0445 \u041f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u0432 Fishing.SubSkill.MagicHunter.Stat=\u041e\u0445\u043e\u0442\u043d\u0438\u043a \u0417\u0430 \u041c\u0430\u0433\u0438\u0435\u0439 \u0428\u0430\u043d\u0441 diff --git a/src/main/resources/locale/locale_zh_CN.properties b/src/main/resources/locale/locale_zh_CN.properties index 5b2dcc042..7557b6cd3 100644 --- a/src/main/resources/locale/locale_zh_CN.properties +++ b/src/main/resources/locale/locale_zh_CN.properties @@ -240,7 +240,7 @@ Fishing.Ability.Locked.2=\u9501\u5b9a\u72b6\u6001,\u76f4\u5230 {0}+ \u6280\u80fd Fishing.SubSkill.TreasureHunter.Name=\u6dd8\u91d1\u8005 Fishing.SubSkill.TreasureHunter.Description=\u9493\u51fa\u5404\u79cd\u5404\u6837\u7684\u7269\u54c1 Fishing.SubSkill.TreasureHunter.Stat=\u6dd8\u91d1\u8005\u7b49\u7ea7: &a{0}&3/&a{1} -Fishing.SubSkill.TreasureHunter.Stat.Extra=\u6389\u843d\u7387: &7\u4e00\u822c: &e{0} &a\u666e\u901a: &e{1}\n&9\u7a00\u6709: &e{2} &d\u7f55\u89c1: &e{3} &6\u53f2\u8bd7: &e{4} &b\u4f20\u8bf4: &e{5} +Fishing.SubSkill.TreasureHunter.Stat.Extra=\u6389\u843d\u7387: &7\u4e00\u822c: &e{0} &a\u666e\u901a: &e{1}\n&9\u7a00\u6709: &e{2} &d\u7f55\u89c1: &e{3} &6\u53f2\u8bd7: &e{4} &bMythic: &e{5} Fishing.SubSkill.MagicHunter.Name=\u9b54\u6cd5\u730e\u4eba Fishing.SubSkill.MagicHunter.Description=\u627e\u5230\u9644\u9b54\u7269\u54c1 Fishing.SubSkill.MagicHunter.Stat=\u9b54\u6cd5\u730e\u4eba\u51e0\u7387 diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 9bbf76aa9..f3dcec5c1 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -19,6 +19,9 @@ load: POSTWORLD api-version: 1.13 commands: +# mmodroptreasures: +# description: An admin command used to spawn treasure drops +# permission: mcmmo.commands.droptreasures mmoxpbar: aliases: xpbarsettings description: Change XP bar settings diff --git a/src/main/resources/treasures.yml b/src/main/resources/treasures.yml index 077a628c8..24de2fb86 100755 --- a/src/main/resources/treasures.yml +++ b/src/main/resources/treasures.yml @@ -1,447 +1,4 @@ # -# Settings for Fishing -# Last updated on ${project.version}-b${BUILD_NUMBER} -### -Fishing: - LEATHER_BOOTS: - Amount: 1 - XP: 200 - Rarity: COMMON - LEATHER_HELMET: - Amount: 1 - XP: 200 - Rarity: COMMON - LEATHER_LEGGINGS: - Amount: 1 - XP: 200 - Rarity: COMMON - LEATHER_CHESTPLATE: - Amount: 1 - XP: 200 - Rarity: COMMON - WOODEN_SWORD: - Amount: 1 - XP: 200 - Rarity: COMMON - WOODEN_SHOVEL: - Amount: 1 - XP: 200 - Rarity: COMMON - WOODEN_PICKAXE: - Amount: 1 - XP: 200 - Rarity: COMMON - WOODEN_AXE: - Amount: 1 - XP: 200 - Rarity: COMMON - WOODEN_HOE: - Amount: 1 - XP: 200 - Rarity: COMMON - LAPIS_LAZULI: - Amount: 20 - XP: 200 - Rarity: COMMON - STONE_SWORD: - Amount: 1 - XP: 200 - Rarity: UNCOMMON - STONE_SHOVEL: - Amount: 1 - XP: 200 - Rarity: UNCOMMON - STONE_PICKAXE: - Amount: 1 - XP: 200 - Rarity: UNCOMMON - STONE_AXE: - Amount: 1 - XP: 200 - Rarity: UNCOMMON - STONE_HOE: - Amount: 1 - XP: 200 - Rarity: UNCOMMON - GOLDEN_SWORD: - Amount: 1 - XP: 200 - Rarity: UNCOMMON - GOLDEN_SHOVEL: - Amount: 1 - XP: 200 - Rarity: UNCOMMON - GOLDEN_PICKAXE: - Amount: 1 - XP: 200 - Rarity: UNCOMMON - GOLDEN_AXE: - Amount: 1 - XP: 200 - Rarity: UNCOMMON - GOLDEN_HOE: - Amount: 1 - XP: 200 - Rarity: UNCOMMON - GOLDEN_BOOTS: - Amount: 1 - XP: 200 - Rarity: UNCOMMON - GOLDEN_HELMET: - Amount: 1 - XP: 200 - Rarity: UNCOMMON - GOLDEN_LEGGINGS: - Amount: 1 - XP: 200 - Rarity: UNCOMMON - GOLDEN_CHESTPLATE: - Amount: 1 - XP: 200 - Rarity: UNCOMMON - IRON_INGOT: - Amount: 5 - XP: 200 - Rarity: UNCOMMON - GOLD_INGOT: - Amount: 5 - XP: 200 - Rarity: UNCOMMON - IRON_SWORD: - Amount: 1 - XP: 200 - Rarity: RARE - IRON_SHOVEL: - Amount: 1 - XP: 200 - Rarity: RARE - IRON_PICKAXE: - Amount: 1 - XP: 200 - Rarity: RARE - IRON_AXE: - Amount: 1 - XP: 200 - Rarity: RARE - IRON_HOE: - Amount: 1 - XP: 200 - Rarity: RARE - BOW: - Amount: 1 - XP: 200 - Rarity: RARE - ENDER_PEARL: - Amount: 1 - XP: 200 - Rarity: RARE - BLAZE_ROD: - Amount: 1 - XP: 200 - Rarity: RARE - IRON_BOOTS: - Amount: 1 - XP: 200 - Rarity: EPIC - IRON_HELMET: - Amount: 1 - XP: 200 - Rarity: EPIC - IRON_LEGGINGS: - Amount: 1 - XP: 200 - Rarity: EPIC - IRON_CHESTPLATE: - Amount: 1 - XP: 200 - Rarity: EPIC - GHAST_TEAR: - Amount: 1 - XP: 200 - Rarity: EPIC - DIAMOND: - Amount: 5 - XP: 200 - Rarity: EPIC - DIAMOND_SWORD: - Amount: 1 - XP: 200 - Rarity: LEGENDARY - DIAMOND_SHOVEL: - Amount: 1 - XP: 200 - Rarity: LEGENDARY - DIAMOND_PICKAXE: - Amount: 1 - XP: 200 - Rarity: LEGENDARY - DIAMOND_AXE: - Amount: 1 - XP: 200 - Rarity: LEGENDARY - DIAMOND_HOE: - Amount: 1 - XP: 200 - Rarity: LEGENDARY - DIAMOND_BOOTS: - Amount: 1 - XP: 200 - Rarity: LEGENDARY - DIAMOND_HELMET: - Amount: 1 - XP: 200 - Rarity: LEGENDARY - DIAMOND_LEGGINGS: - Amount: 1 - XP: 200 - Rarity: LEGENDARY - DIAMOND_CHESTPLATE: - Amount: 1 - XP: 200 - Rarity: LEGENDARY - MUSIC_DISC_BLOCKS: - Amount: 1 - XP: 200 - Rarity: RECORD - MUSIC_DISC_CHIRP: - Amount: 1 - XP: 200 - Rarity: RECORD - MUSIC_DISC_FAR: - Amount: 1 - XP: 200 - Rarity: RECORD - MUSIC_DISC_MALL: - Amount: 1 - XP: 200 - Rarity: RECORD - MUSIC_DISC_MELLOHI: - Amount: 1 - XP: 200 - Rarity: RECORD - MUSIC_DISC_STAL: - Amount: 1 - XP: 200 - Rarity: RECORD - MUSIC_DISC_STRAD: - Amount: 1 - XP: 200 - Rarity: RECORD - MUSIC_DISC_WARD: - Amount: 1 - XP: 200 - Rarity: RECORD - MUSIC_DISC_11: - Amount: 1 - XP: 200 - Rarity: RECORD - MUSIC_DISC_WAIT: - Amount: 1 - XP: 200 - Rarity: RECORD - MUSIC_DISC_13: - Amount: 1 - XP: 200 - 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: 1 - 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's Archaeology # If you are in retro mode, Drop_Level is multiplied by 10. ### @@ -630,335 +187,4 @@ Hylian_Luck: XP: 0 Drop_Chance: 100.0 Drop_Level: 0 - Drops_From: [Pots] -# -# Settings for Shake -# If you are in retro mode, Drop_Level is multiplied by 10. -### -Shake: - BLAZE: - BLAZE_ROD: - Amount: 1 - XP: 0 - Drop_Chance: 100.0 - Drop_Level: 0 - CAVE_SPIDER: - SPIDER_EYE: - Amount: 1 - XP: 0 - Drop_Chance: 49.0 - Drop_Level: 0 - STRING: - Amount: 1 - XP: 0 - Drop_Chance: 49.0 - Drop_Level: 0 - COBWEB: - Amount: 1 - XP: 0 - Drop_Chance: 1.0 - Drop_Level: 0 - POTION|0|POISON: - PotionData: - PotionType: POISON - Amount: 1 - XP: 0 - Drop_Chance: 1.0 - Drop_Level: 0 - CHICKEN: - FEATHER: - Amount: 1 - XP: 0 - Drop_Chance: 33.3 - Drop_Level: 0 - CHICKEN: - Amount: 1 - XP: 0 - Drop_Chance: 33.3 - Drop_Level: 0 - EGG: - Amount: 1 - XP: 0 - Drop_Chance: 33.3 - Drop_Level: 0 - COW: - MILK_BUCKET: - Amount: 1 - XP: 0 - Drop_Chance: 2.0 - Drop_Level: 0 - LEATHER: - Amount: 1 - XP: 0 - Drop_Chance: 49.0 - Drop_Level: 0 - BEEF: - Amount: 1 - XP: 0 - Drop_Chance: 49.0 - Drop_Level: 0 - CREEPER: - CREEPER_HEAD: - Amount: 1 - XP: 0 - Drop_Chance: 1.0 - Drop_Level: 0 - GUNPOWDER: - Amount: 1 - XP: 0 - Drop_Chance: 99.0 - Drop_Level: 0 - ENDERMAN: - ENDER_PEARL: - Amount: 1 - XP: 0 - Drop_Chance: 100.0 - Drop_Level: 0 - GHAST: - GUNPOWDER: - Amount: 1 - XP: 0 - Drop_Chance: 50.0 - Drop_Level: 0 - GHAST_TEAR: - Amount: 1 - XP: 0 - Drop_Chance: 50.0 - Drop_Level: 0 - HORSE: - LEATHER: - Amount: 1 - XP: 0 - Drop_Chance: 99.0 - Drop_Level: 0 - SADDLE: - Amount: 1 - XP: 0 - Drop_Chance: 1.0 - Drop_Level: 0 - IRON_GOLEM: - PUMPKIN: - Amount: 1 - XP: 0 - Drop_Chance: 3.0 - Drop_Level: 0 - IRON_INGOT: - Amount: 1 - XP: 0 - Drop_Chance: 12.0 - Drop_Level: 0 - POPPY: - Amount: 1 - XP: 0 - Drop_Chance: 85.0 - Drop_Level: 0 - MAGMA_CUBE: - MAGMA_CREAM: - Amount: 1 - XP: 0 - Drop_Chance: 100.0 - Drop_Level: 0 - MUSHROOM_COW: - MILK_BUCKET: - Amount: 1 - XP: 0 - Drop_Chance: 5.0 - Drop_Level: 0 - MUSHROOM_STEW: - Amount: 1 - XP: 0 - Drop_Chance: 5.0 - Drop_Level: 0 - LEATHER: - Amount: 1 - XP: 0 - Drop_Chance: 30.0 - Drop_Level: 0 - BEEF: - Amount: 1 - XP: 0 - Drop_Chance: 30.0 - Drop_Level: 0 - RED_MUSHROOM: - Amount: 2 - XP: 0 - Drop_Chance: 30.0 - Drop_Level: 0 - PIG: - PORKCHOP: - Amount: 1 - XP: 0 - Drop_Chance: 100.0 - Drop_Level: 0 - PIG_ZOMBIE: - ROTTEN_FLESH: - Amount: 1 - XP: 0 - Drop_Chance: 50.0 - Drop_Level: 0 - GOLD_NUGGET: - Amount: 1 - XP: 0 - Drop_Chance: 50.0 - Drop_Level: 0 - PLAYER: - SKELETON_SKULL: - Amount: 1 - XP: 0 - Drop_Chance: 0.0 - Drop_Level: 0 - INVENTORY: - Whole_Stacks: false - Drop_Chance: 0.0 - Drop_Level: 0 - SHEEP: - WHITE_WOOL: - Amount: 3 - XP: 0 - Drop_Chance: 100.0 - Drop_Level: 0 - SHULKER: - SHULKER_SHELL: - Amount: 1 - XP: 0 - Drop_Chance: 25.0 - Drop_Level: 0 - PURPUR_BLOCK: - Amount: 1 - XP: 0 - Drop_Chance: 75.0 - Drop_Level: 0 - SKELETON: - SKELETON_SKULL: - Amount: 1 - XP: 0 - Drop_Chance: 2.0 - Drop_Level: 0 - BONE: - Amount: 1 - XP: 0 - Drop_Chance: 49.0 - Drop_Level: 0 - ARROW: - Amount: 2 - XP: 0 - Drop_Chance: 49.0 - Drop_Level: 0 - SLIME: - SLIME_BALL: - Amount: 1 - XP: 0 - Drop_Chance: 100.0 - Drop_Level: 0 - SPIDER: - SPIDER_EYE: - Amount: 1 - XP: 0 - Drop_Chance: 50.0 - Drop_Level: 0 - STRING: - Amount: 1 - XP: 0 - Drop_Chance: 50.0 - Drop_Level: 0 - SNOWMAN: - PUMPKIN: - Amount: 1 - XP: 0 - Drop_Chance: 3.0 - Drop_Level: 0 - SNOWBALL: - Amount: 2 - XP: 0 - Drop_Chance: 97.0 - Drop_Level: 0 - SQUID: - INK_SAC: - Amount: 1 - XP: 0 - Drop_Chance: 100.0 - Drop_Level: 0 - WITCH: - SPLASH_POTION|0|INSTANT_HEAL: - PotionData: - PotionType: INSTANT_HEAL - Amount: 1 - XP: 0 - Drop_Chance: 1.0 - Drop_Level: 0 - SPLASH_POTION|0|FIRE_RESISTANCE: - PotionData: - PotionType: FIRE_RESISTANCE - Amount: 1 - XP: 0 - Drop_Chance: 1.0 - Drop_Level: 0 - SPLASH_POTION|0|SPEED: - PotionData: - PotionType: SPEED - Amount: 1 - XP: 0 - Drop_Chance: 1.0 - Drop_Level: 0 - GLASS_BOTTLE: - Amount: 1 - XP: 0 - Drop_Chance: 7.0 - Drop_Level: 0 - GLOWSTONE_DUST: - Amount: 1 - XP: 0 - Drop_Chance: 15.0 - Drop_Level: 0 - GUNPOWDER: - Amount: 1 - XP: 0 - Drop_Chance: 15.0 - Drop_Level: 0 - REDSTONE: - Amount: 1 - XP: 0 - Drop_Chance: 15.0 - Drop_Level: 0 - SPIDER_EYE: - Amount: 1 - XP: 0 - Drop_Chance: 15.0 - Drop_Level: 0 - STICK: - Amount: 1 - XP: 0 - Drop_Chance: 15.0 - Drop_Level: 0 - SUGAR: - Amount: 1 - XP: 0 - Drop_Chance: 15.0 - Drop_Level: 0 - WITHER_SKELETON: - WITHER_SKELETON_SKULL: - Amount: 1 - XP: 0 - Drop_Chance: 2.0 - Drop_Level: 0 - BONE: - Amount: 1 - XP: 0 - Drop_Chance: 49.0 - Drop_Level: 0 - COAL: - Amount: 2 - XP: 0 - Drop_Chance: 49.0 - Drop_Level: 0 - ZOMBIE: - ZOMBIE_HEAD: - Amount: 1 - XP: 0 - Drop_Chance: 2.0 - Drop_Level: 0 - ROTTEN_FLESH: - Amount: 1 - XP: 0 - Drop_Chance: 98.0 - Drop_Level: 0 + Drops_From: [Pots] \ No newline at end of file