From aee71789f2b4acb4f6176224a67e53bcf451fb1d Mon Sep 17 00:00:00 2001 From: gmcferrin Date: Thu, 19 Jan 2012 14:29:03 -0500 Subject: [PATCH] Changed durability calculation to use Bukkit API function. Fixed bug where it was impossible to get the last possible loot item in each tier. Fixed bug where it was possible to get conflicting enchantments. Fixed bug where enchantments couldn't be any higher than level 1. --- .../com/gmail/nossr50/skills/Fishing.java | 201 ++++++------------ 1 file changed, 62 insertions(+), 139 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/skills/Fishing.java b/src/main/java/com/gmail/nossr50/skills/Fishing.java index 10e21fd03..722ab7431 100644 --- a/src/main/java/com/gmail/nossr50/skills/Fishing.java +++ b/src/main/java/com/gmail/nossr50/skills/Fishing.java @@ -24,12 +24,12 @@ import com.gmail.nossr50.datatypes.SkillType; import com.gmail.nossr50.locale.mcLocale; public class Fishing { - + //Return the fishing tier for the player public static int getFishingLootTier(PlayerProfile PP) { int lvl = PP.getSkillLevel(SkillType.FISHING); - + if(lvl < 100) { return 1; @@ -47,106 +47,7 @@ public class Fishing { return 5; } } - - public static short getItemMaxDurability(Material mat) - { - switch(mat) - { - case LEATHER_BOOTS: - return (short) 40; - case LEATHER_LEGGINGS: - return (short) 46; - case LEATHER_HELMET: - return (short) 34; - case LEATHER_CHESTPLATE: - return (short) 49; - case CHAINMAIL_BOOTS: - return (short) 79; - case CHAINMAIL_LEGGINGS: - return (short) 92; - case CHAINMAIL_HELMET: - return (short) 67; - case CHAINMAIL_CHESTPLATE: - return (short) 96; - case GOLD_BOOTS: - return (short) 80; - case GOLD_LEGGINGS: - return (short) 92; - case GOLD_HELMET: - return (short) 68; - case GOLD_CHESTPLATE: - return (short) 96; - case IRON_BOOTS: - return (short) 160; - case IRON_LEGGINGS: - return (short) 184; - case IRON_HELMET: - return (short) 136; - case IRON_CHESTPLATE: - return (short) 192; - case DIAMOND_BOOTS: - return (short) 320; - case DIAMOND_LEGGINGS: - return (short) 368; - case DIAMOND_HELMET: - return (short) 272; - case DIAMOND_CHESTPLATE: - return (short) 384; - case GOLD_AXE: - return (short) 33; - case GOLD_SWORD: - return (short) 33; - case GOLD_HOE: - return (short) 33; - case GOLD_SPADE: - return (short) 33; - case GOLD_PICKAXE: - return (short) 33; - case WOOD_AXE: - return (short) 60; - case WOOD_SWORD: - return (short) 60; - case WOOD_HOE: - return (short) 60; - case WOOD_SPADE: - return (short) 60; - case WOOD_PICKAXE: - return (short) 60; - case STONE_AXE: - return (short) 132; - case STONE_SWORD: - return (short) 132; - case STONE_HOE: - return (short) 132; - case STONE_SPADE: - return (short) 132; - case STONE_PICKAXE: - return (short) 132; - case IRON_AXE: - return (short) 251; - case IRON_SWORD: - return (short) 251; - case IRON_HOE: - return (short) 251; - case IRON_SPADE: - return (short) 251; - case IRON_PICKAXE: - return (short) 251; - case DIAMOND_AXE: - return (short) 1562; - case DIAMOND_SWORD: - return (short) 1562; - case DIAMOND_HOE: - return (short) 1562; - case DIAMOND_SPADE: - return (short) 1562; - case DIAMOND_PICKAXE: - return (short) 1562; - default: - return (short) 0; - } - } - + public static void getFishingResults(Player player, PlayerFishEvent event) { switch(getFishingLootTier(Users.getProfile(player))) @@ -171,12 +72,12 @@ public class Fishing { Users.getProfile(player).addXP(SkillType.FISHING, LoadProperties.mfishing, player); Skills.XpCheckSkill(SkillType.FISHING, player); } - + private static void getFishingResultsTier1(Player player, PlayerFishEvent event) { - int randomNum = (int)(Math.random() * 14); + int randomNum = (int)(Math.random() * 15); CraftItem theCatch = (CraftItem)event.getCaught(); - + if(Math.random() * 100 < 20) { switch(randomNum) @@ -229,15 +130,15 @@ public class Fishing { theCatch.setItemStack(new ItemStack(Material.RAW_FISH)); } //Change durability to random value - theCatch.getItemStack().setDurability((short) (Math.random() * Fishing.getItemMaxDurability(theCatch.getItemStack().getType()))); //Change the damage value + theCatch.getItemStack().setDurability((short) (Math.random() * theCatch.getItemStack().getType().getMaxDurability())); //Change the damage value } private static void getFishingResultsTier2(Player player, PlayerFishEvent event) { - int randomNum = (int)(Math.random() * 19); + int randomNum = (int)(Math.random() * 20); CraftItem theCatch = (CraftItem)event.getCaught(); - + if(Math.random() * 100 < 25) { switch(randomNum) @@ -304,16 +205,16 @@ public class Fishing { { theCatch.setItemStack(new ItemStack(Material.RAW_FISH, 1)); } - + //Change durability to random value - theCatch.getItemStack().setDurability((short) (Math.random() * Fishing.getItemMaxDurability(theCatch.getItemStack().getType()))); + theCatch.getItemStack().setDurability((short) (Math.random() * theCatch.getItemStack().getType().getMaxDurability())); //Change the damage value } - + private static void getFishingResultsTier3(Player player, PlayerFishEvent event) { - int randomNum = (int)(Math.random() * 23); + int randomNum = (int)(Math.random() * 24); CraftItem theCatch = (CraftItem)event.getCaught(); - + if(Math.random() * 100 < 30) { switch(randomNum) @@ -394,14 +295,14 @@ public class Fishing { theCatch.setItemStack(new ItemStack(Material.RAW_FISH, 1)); } //Change durability to random value - theCatch.getItemStack().setDurability((short) (Math.random() * Fishing.getItemMaxDurability(theCatch.getItemStack().getType()))); + theCatch.getItemStack().setDurability((short) (Math.random() * theCatch.getItemStack().getType().getMaxDurability())); //Change the damage value } - + private static void getFishingResultsTier4(Player player, PlayerFishEvent event) { - int randomNum = (int)(Math.random() * 40); + int randomNum = (int)(Math.random() * 41); CraftItem theCatch = (CraftItem)event.getCaught(); - + if(Math.random() * 100 < 35) { switch(randomNum) @@ -532,14 +433,14 @@ public class Fishing { theCatch.setItemStack(new ItemStack(Material.RAW_FISH, 1)); } //Change durability to random value - theCatch.getItemStack().setDurability((short) (Math.random() * Fishing.getItemMaxDurability(theCatch.getItemStack().getType()))); + theCatch.getItemStack().setDurability((short) (Math.random() * theCatch.getItemStack().getType().getMaxDurability())); //Change the damage value } - + private static void getFishingResultsTier5(Player player, PlayerFishEvent event) { - int randomNum = (int)(Math.random() * 49); + int randomNum = (int)(Math.random() * 50); CraftItem theCatch = (CraftItem)event.getCaught(); - + if(Math.random() * 100 < 40) { switch(randomNum) @@ -696,24 +597,24 @@ public class Fishing { theCatch.setItemStack(new ItemStack(Material.RAW_FISH, 1)); } //Change durability to random value - theCatch.getItemStack().setDurability((short) (Math.random() * Fishing.getItemMaxDurability(theCatch.getItemStack().getType()))); + theCatch.getItemStack().setDurability((short) (Math.random() * theCatch.getItemStack().getType().getMaxDurability())); //Change the damage value } public static void processResults(PlayerFishEvent event) { Player player = event.getPlayer(); PlayerProfile PP = Users.getProfile(player); - + Fishing.getFishingResults(player, event); CraftItem theCatch = (CraftItem)event.getCaught(); - + if(theCatch.getItemStack().getType() != Material.RAW_FISH) { //Inform the player they retrieved a treasure... player.sendMessage(mcLocale.getString("Fishing.ItemFound")); - + //Keep track of whether or not the treasure is enchanted boolean enchanted = false; - + ItemStack fishingResults = theCatch.getItemStack(); if(Repair.isArmor(fishingResults) || Repair.isTools(fishingResults)) { @@ -724,23 +625,45 @@ public class Fishing { { if(x.canEnchantItem(fishingResults)) { - //Actual chance to have an enchantment is related to your fishing skill - if(Math.random() * 15 < Fishing.getFishingLootTier(PP)) - { - enchanted = true; - int randomEnchantLevel = (int) Math.random() * x.getMaxLevel(); - - if(randomEnchantLevel == 0) - randomEnchantLevel = 1; - if(randomEnchantLevel > x.getMaxLevel()) - randomEnchantLevel = x.getMaxLevel(); - - fishingResults.addEnchantment(x, randomEnchantLevel); + //Prevent impossible enchantment combinations + if((fishingResults.containsEnchantment(PROTECTION_ENVIRONMENTAL) || fishingResults.containsEnchantment(PROTECTION_EXPLOSIONS) || + fishingResults.containsEnchantment(PROTECTION_FIRE) || fishingResults.containsEnchantment(PROTECTION_PROJECTILE)) && + (x.equals(PROTECTION_EXPLOSIONS) || x.equals(PROTECTION_PROJECTILE) || x.equals(PROTECTION_FIRE) || x.equals(PROTECTION_ENVIRONMENTAL))){ + return; + } + + //More impossible enchantment combinations + else if((fishingResults.containsEnchantment(DAMAGE_ALL) || fishingResults.containsEnchantment(DAMAGE_ARTHROPODS) || fishingResults.containsEnchantment(DAMAGE_UNDEAD)) && + (x.equals(DAMAGE_ALL) || x.equals(DAMAGE_ARTHROPODS) || x.equals(DAMAGE_UNDEAD))){ + return; + } + + //Even more impossible enchantment combinations + else if((fishingResults.containsEnchantment(SILK_TOUCH) || fishingResults.containsEnchantment(LOOT_BONUS_BLOCKS)) && + (x.equals(SILK_TOUCH) || x.equals(LOOT_BONUS_BLOCKS))){ + return; + } + + else{ + //Actual chance to have an enchantment is related to your fishing skill + if(Math.random() * 15 < Fishing.getFishingLootTier(PP)) + { + enchanted = true; + int randomEnchantLevel = (int)(Math.random() * x.getMaxLevel()); + + if(randomEnchantLevel == 0) + randomEnchantLevel = 1; + if(randomEnchantLevel > x.getMaxLevel()) + randomEnchantLevel = x.getMaxLevel(); + + fishingResults.addEnchantment(x, randomEnchantLevel); + } } } } } } + //Inform the player of magical properties if(enchanted) { @@ -755,7 +678,7 @@ public class Fishing { return; le.damage(1); World world = le.getWorld(); - + if(le instanceof Sheep) { Sheep sheep = (Sheep)le;