Move fishing treasues to new file fishing_treasures.yml, replace Records rarity with Mythic, and allow for Enchanted_Book in the treasures list with new optional whitelist/blacklist parameters

read the changelog for information about this
This commit is contained in:
nossr50
2020-12-28 16:42:00 -08:00
parent 31134b38de
commit 652a9519c1
26 changed files with 1512 additions and 936 deletions

View File

@ -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;
// }
// }
//}

View File

@ -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;

View File

@ -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<Rarity, List<FishingTreasure>> fishingRewards = new HashMap<>();
public @NotNull HashMap<Rarity, List<EnchantmentTreasure>> fishingEnchantments = new HashMap<>();
public @NotNull HashMap<EntityType, List<ShakeTreasure>> 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<String> 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<String> 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<String> 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<String> allowedEnchantsList = config.getStringList(type + "." + treasureName + ".Enchantments_Whitelist");
List<String> disallowedEnchantsList = config.getStringList(type + "." + treasureName + ".Enchantments_Blacklist");
Set<Enchantment> blackListedEnchants = new HashSet<>();
Set<Enchantment> 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<String> 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<String> enchantListStr, Set<Enchantment> 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());
}
}

View File

@ -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<String, List<ExcavationTreasure>> excavationMap = new HashMap<>();
public HashMap<EntityType, List<ShakeTreasure>> shakeMap = new HashMap<>();
public HashMap<String, List<HylianTreasure>> hylianMap = new HashMap<>();
public HashMap<Rarity, List<FishingTreasure>> fishingRewards = new HashMap<>();
public HashMap<Rarity, List<EnchantmentTreasure>> 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<String> 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<String> 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<String> 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");
}

View File

@ -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;

View File

@ -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);
}
}

View File

@ -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<Enchantment> blackListedEnchantments;
private final @Nullable Set<Enchantment> whiteListedEnchantments;
private final @NotNull List<EnchantmentWrapper> legalEnchantments; //TODO: Make immutable
public FishingTreasureBook(@NotNull ItemStack enchantedBook, int xp, @Nullable Set<Enchantment> blackListedEnchantments, @Nullable Set<Enchantment> 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<EnchantmentWrapper> getLegalEnchantments() {
return legalEnchantments;
}
private @Nullable Set<Enchantment> getBlacklistedEnchantments() {
return blackListedEnchantments;
}
private @Nullable Set<Enchantment> 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;
}
}
}

View File

@ -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);
}

View File

@ -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();

View File

@ -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<ShakeTreasure> 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;
}

View File

@ -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<Enchantment, Integer> 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<Enchantment, Integer> 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<EnchantmentWrapper> 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<FishingTreasure> fishingTreasures = TreasureConfig.getInstance().fishingRewards.get(rarity);
List<FishingTreasure> 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<Enchantment, Integer> handleMagicHunter(ItemStack treasureDrop) {
private Map<Enchantment, Integer> processMagicHunter(@NotNull ItemStack treasureDrop) {
Map<Enchantment, Integer> enchants = new HashMap<>();
List<EnchantmentTreasure> 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;
}

View File

@ -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;

View File

@ -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"));

View File

@ -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

View File

@ -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.

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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]