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

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

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);
}
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,30 +396,45 @@ 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;
/*
* Books get some special treatment
*/
if(treasure instanceof FishingTreasureBook) {
//Skip the magic hunter stuff
if(treasureDrop.getItemMeta() != null) {
enchants.putAll(treasureDrop.getItemMeta().getEnchants());
}
McMMOPlayerFishingTreasureEvent event = EventUtils.callFishingTreasureEvent(player, treasureDrop, treasure.getXp(), enchants);
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 {
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) {
fishingSucceeds = true;
boolean enchanted = false;
if (!enchants.isEmpty()) {
if(treasure instanceof FishingTreasureBook) {
enchanted = true;
} else if (!enchants.isEmpty()) {
treasureDrop.addUnsafeEnchantments(enchants);
enchanted = true;
}
@ -428,17 +443,45 @@ public class FishingManager extends SkillManager {
NotificationManager.sendPlayerInformation(player, NotificationType.SUBSKILL_MESSAGE, "Fishing.Ability.TH.MagicFound");
}
if (Config.getInstance().getFishingExtraFish()) {
Misc.spawnItem(player.getEyeLocation(), fishingCatch.getItemStack(), ItemSpawnReason.FISHING_EXTRA_FISH);
}
} else {
treasureDrop = null;
treasureXp = 0;
}
}
if(fishingSucceeds) {
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.
###
@ -631,334 +188,3 @@ Hylian_Luck:
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