2011-11-28 14:17:01 +01:00
package com.gmail.nossr50.skills ;
2012-03-13 08:00:49 +01:00
import java.util.ArrayList ;
2012-02-21 19:10:51 +01:00
import java.util.List ;
2012-03-14 16:43:18 +01:00
import java.util.Map ;
2012-03-26 17:04:17 +02:00
import java.util.Random ;
2012-02-21 19:10:51 +01:00
2012-01-29 08:51:59 +01:00
import org.bukkit.Location ;
2011-11-28 14:17:01 +01:00
import org.bukkit.Material ;
2011-12-01 18:46:46 +01:00
import org.bukkit.enchantments.Enchantment ;
2012-03-13 08:00:49 +01:00
import org.bukkit.entity.EntityType ;
import org.bukkit.entity.Item ;
import org.bukkit.entity.LivingEntity ;
import org.bukkit.entity.Player ;
import org.bukkit.entity.Sheep ;
2011-11-28 14:17:01 +01:00
import org.bukkit.event.player.PlayerFishEvent ;
import org.bukkit.inventory.ItemStack ;
2011-12-01 18:46:46 +01:00
import org.bukkit.material.Wool ;
2011-11-28 14:17:01 +01:00
2012-01-28 07:24:29 +01:00
import com.gmail.nossr50.Combat ;
2012-03-15 08:10:40 +01:00
import com.gmail.nossr50.ItemChecks ;
2011-11-28 14:17:01 +01:00
import com.gmail.nossr50.Users ;
2012-01-29 08:51:59 +01:00
import com.gmail.nossr50.m ;
2011-12-03 11:49:10 +01:00
import com.gmail.nossr50.config.LoadProperties ;
2012-02-29 05:28:14 +01:00
import com.gmail.nossr50.config.LoadTreasures ;
2011-11-28 14:17:01 +01:00
import com.gmail.nossr50.datatypes.PlayerProfile ;
import com.gmail.nossr50.datatypes.SkillType ;
2012-02-21 08:53:34 +01:00
import com.gmail.nossr50.datatypes.treasure.FishingTreasure ;
2011-12-01 18:46:46 +01:00
import com.gmail.nossr50.locale.mcLocale ;
2011-11-28 14:17:01 +01:00
public class Fishing {
2012-01-19 20:29:03 +01:00
2012-03-26 17:04:17 +02:00
private static Random random = new Random ( ) ;
2012-03-13 08:00:49 +01:00
/ * *
* Get the player ' s current fishing loot tier .
*
* @param PP The profile of the player
* @return the player ' s current fishing rank
* /
public static int getFishingLootTier ( PlayerProfile PP ) {
int level = PP . getSkillLevel ( SkillType . FISHING ) ;
int fishingTier ;
if ( level > = LoadProperties . fishingTier5 ) {
fishingTier = 5 ;
}
else if ( level > = LoadProperties . fishingTier4 ) {
fishingTier = 4 ;
}
else if ( level > = LoadProperties . fishingTier3 ) {
fishingTier = 3 ;
}
else if ( level > = LoadProperties . fishingTier2 ) {
fishingTier = 2 ;
}
else {
fishingTier = 1 ;
}
return fishingTier ;
}
/ * *
* Get item results from Fishing .
*
* @param player The player that was fishing
* @param event The event to modify
* /
private static void getFishingResults ( Player player , PlayerFishEvent event ) {
PlayerProfile PP = Users . getProfile ( player ) ;
List < FishingTreasure > rewards = new ArrayList < FishingTreasure > ( ) ;
Item theCatch = ( Item ) event . getCaught ( ) ;
switch ( getFishingLootTier ( PP ) ) {
case 1 :
rewards = LoadTreasures . fishingRewardsTier1 ;
break ;
case 2 :
rewards = LoadTreasures . fishingRewardsTier2 ;
break ;
case 3 :
rewards = LoadTreasures . fishingRewardsTier3 ;
break ;
case 4 :
rewards = LoadTreasures . fishingRewardsTier4 ;
break ;
case 5 :
rewards = LoadTreasures . fishingRewardsTier5 ;
break ;
default :
break ;
}
if ( LoadProperties . fishingDrops ) {
2012-03-26 17:04:17 +02:00
FishingTreasure treasure = rewards . get ( random . nextInt ( rewards . size ( ) ) ) ;
2012-03-13 08:00:49 +01:00
2012-03-26 17:04:17 +02:00
if ( random . nextInt ( 100 ) < = treasure . getDropChance ( ) ) {
2012-03-13 08:00:49 +01:00
Users . getProfile ( player ) . addXP ( SkillType . FISHING , treasure . getXp ( ) , player ) ;
theCatch . setItemStack ( treasure . getDrop ( ) ) ;
}
}
else {
theCatch . setItemStack ( new ItemStack ( Material . RAW_FISH ) ) ;
}
2012-03-26 17:04:17 +02:00
theCatch . getItemStack ( ) . setDurability ( ( short ) ( random . nextInt ( theCatch . getItemStack ( ) . getType ( ) . getMaxDurability ( ) ) ) ) ; //Change durability to random value
2012-03-13 08:00:49 +01:00
m . mcDropItem ( player . getLocation ( ) , new ItemStack ( Material . RAW_FISH ) ) ; //Always drop a fish
PP . addXP ( SkillType . FISHING , LoadProperties . mfishing , player ) ;
Skills . XpCheckSkill ( SkillType . FISHING , player ) ;
}
/ * *
* Process results from Fishing .
*
* @param event The event to modify
* /
public static void processResults ( PlayerFishEvent event ) {
Player player = event . getPlayer ( ) ;
PlayerProfile PP = Users . getProfile ( player ) ;
getFishingResults ( player , event ) ;
Item theCatch = ( Item ) event . getCaught ( ) ;
if ( theCatch . getItemStack ( ) . getType ( ) ! = Material . RAW_FISH ) {
final int ENCHANTMENT_CHANCE = 10 ;
boolean enchanted = false ;
ItemStack fishingResults = theCatch . getItemStack ( ) ;
2012-03-14 18:33:00 +01:00
2012-03-13 08:00:49 +01:00
player . sendMessage ( mcLocale . getString ( " Fishing.ItemFound " ) ) ;
2012-03-15 08:10:40 +01:00
if ( ItemChecks . isArmor ( fishingResults ) | | ItemChecks . isTool ( fishingResults ) ) {
2012-03-26 17:04:17 +02:00
if ( random . nextInt ( 100 ) < = ENCHANTMENT_CHANCE ) {
2012-03-14 16:43:18 +01:00
for ( Enchantment newEnchant : Enchantment . values ( ) ) {
if ( newEnchant . canEnchantItem ( fishingResults ) ) {
Map < Enchantment , Integer > resultEnchantments = fishingResults . getEnchantments ( ) ;
2012-03-13 08:00:49 +01:00
2012-03-14 16:43:18 +01:00
for ( Enchantment oldEnchant : resultEnchantments . keySet ( ) ) {
if ( oldEnchant . conflictsWith ( newEnchant ) ) {
return ;
}
2012-03-13 08:00:49 +01:00
}
2012-03-14 16:43:18 +01:00
/* Actual chance to have an enchantment is related to your fishing skill */
2012-03-26 17:04:17 +02:00
if ( random . nextInt ( 15 ) < Fishing . getFishingLootTier ( PP ) ) {
2012-03-14 16:43:18 +01:00
enchanted = true ;
2012-03-26 17:04:17 +02:00
int randomEnchantLevel = random . nextInt ( newEnchant . getMaxLevel ( ) ) + 1 ;
2012-03-13 08:00:49 +01:00
2012-03-14 18:33:00 +01:00
if ( randomEnchantLevel < newEnchant . getStartLevel ( ) ) {
randomEnchantLevel = newEnchant . getStartLevel ( ) ;
2012-03-13 08:00:49 +01:00
}
2012-03-14 16:43:18 +01:00
fishingResults . addEnchantment ( newEnchant , randomEnchantLevel ) ;
2012-03-13 08:00:49 +01:00
}
}
}
}
}
if ( enchanted ) {
player . sendMessage ( mcLocale . getString ( " Fishing.MagicFound " ) ) ;
}
}
}
/ * *
* Shake a mob , have them drop an item .
*
* @param event The event to modify
* /
public static void shakeMob ( PlayerFishEvent event ) {
2012-03-26 17:04:17 +02:00
final int DROP_NUMBER = random . nextInt ( 100 ) ;
2012-03-13 08:00:49 +01:00
LivingEntity le = ( LivingEntity ) event . getCaught ( ) ;
EntityType type = le . getType ( ) ;
Location loc = le . getLocation ( ) ;
switch ( type ) {
case BLAZE :
2012-03-16 18:45:30 +01:00
m . mcDropItem ( loc , new ItemStack ( Material . BLAZE_ROD ) ) ;
2012-03-13 08:00:49 +01:00
break ;
case CAVE_SPIDER :
if ( DROP_NUMBER > 50 ) {
2012-03-16 18:45:30 +01:00
m . mcDropItem ( loc , new ItemStack ( Material . SPIDER_EYE ) ) ;
2012-03-13 08:00:49 +01:00
}
else {
2012-03-16 18:45:30 +01:00
m . mcDropItem ( loc , new ItemStack ( Material . STRING ) ) ;
2012-03-13 08:00:49 +01:00
}
break ;
case CHICKEN :
if ( DROP_NUMBER > 66 ) {
2012-03-16 18:45:30 +01:00
m . mcDropItem ( loc , new ItemStack ( Material . FEATHER ) ) ;
2012-03-13 08:00:49 +01:00
}
else if ( DROP_NUMBER > 33 ) {
2012-03-16 18:45:30 +01:00
m . mcDropItem ( loc , new ItemStack ( Material . RAW_CHICKEN ) ) ;
2012-03-13 08:00:49 +01:00
}
else {
2012-03-16 18:45:30 +01:00
m . mcDropItem ( loc , new ItemStack ( Material . EGG ) ) ;
2012-03-13 08:00:49 +01:00
}
break ;
case COW :
if ( DROP_NUMBER > 99 ) {
2012-03-16 18:45:30 +01:00
m . mcDropItem ( loc , new ItemStack ( Material . MILK_BUCKET ) ) ;
2012-03-13 08:00:49 +01:00
}
else if ( DROP_NUMBER > 50 ) {
2012-03-16 18:45:30 +01:00
m . mcDropItem ( loc , new ItemStack ( Material . LEATHER ) ) ;
2012-03-13 08:00:49 +01:00
}
else {
2012-03-16 18:45:30 +01:00
m . mcDropItem ( loc , new ItemStack ( Material . RAW_BEEF ) ) ;
2012-03-13 08:00:49 +01:00
}
break ;
case CREEPER :
2012-03-16 18:45:30 +01:00
m . mcDropItem ( loc , new ItemStack ( Material . SULPHUR ) ) ;
2012-03-13 08:00:49 +01:00
break ;
case ENDERMAN :
2012-03-16 18:45:30 +01:00
m . mcDropItem ( loc , new ItemStack ( Material . ENDER_PEARL ) ) ;
2012-03-13 08:00:49 +01:00
break ;
case GHAST :
if ( DROP_NUMBER > 50 ) {
2012-03-16 18:45:30 +01:00
m . mcDropItem ( loc , new ItemStack ( Material . SULPHUR ) ) ;
2012-03-13 08:00:49 +01:00
}
else {
2012-03-16 18:45:30 +01:00
m . mcDropItem ( loc , new ItemStack ( Material . GHAST_TEAR ) ) ;
2012-03-13 08:00:49 +01:00
}
break ;
case MAGMA_CUBE :
2012-03-16 18:45:30 +01:00
m . mcDropItem ( loc , new ItemStack ( Material . MAGMA_CREAM ) ) ;
2012-03-13 08:00:49 +01:00
break ;
case MUSHROOM_COW :
if ( DROP_NUMBER > 99 ) {
2012-03-16 18:45:30 +01:00
m . mcDropItem ( loc , new ItemStack ( Material . MILK_BUCKET ) ) ;
2012-03-13 08:00:49 +01:00
}
else if ( DROP_NUMBER > 98 ) {
2012-03-16 18:45:30 +01:00
m . mcDropItem ( loc , new ItemStack ( Material . MUSHROOM_SOUP ) ) ;
2012-03-13 08:00:49 +01:00
}
else if ( DROP_NUMBER > 66 ) {
2012-03-16 18:45:30 +01:00
m . mcDropItem ( loc , new ItemStack ( Material . LEATHER ) ) ;
2012-03-13 08:00:49 +01:00
}
else if ( DROP_NUMBER > 33 ) {
2012-03-16 18:45:30 +01:00
m . mcDropItem ( loc , new ItemStack ( Material . RAW_BEEF ) ) ;
2012-03-13 08:00:49 +01:00
}
else {
2012-03-16 18:45:30 +01:00
m . mcDropItems ( loc , new ItemStack ( Material . RED_MUSHROOM ) , 3 ) ;
2012-03-13 08:00:49 +01:00
}
break ;
case PIG :
2012-03-16 18:45:30 +01:00
m . mcDropItem ( loc , new ItemStack ( Material . PORK ) ) ;
2012-03-13 08:00:49 +01:00
break ;
case PIG_ZOMBIE :
if ( DROP_NUMBER > 50 ) {
2012-03-16 18:45:30 +01:00
m . mcDropItem ( loc , new ItemStack ( Material . ROTTEN_FLESH ) ) ;
2012-03-13 08:00:49 +01:00
}
else {
2012-03-16 18:45:30 +01:00
m . mcDropItem ( loc , new ItemStack ( Material . GOLD_NUGGET ) ) ;
2012-03-13 08:00:49 +01:00
}
break ;
case SHEEP :
Sheep sheep = ( Sheep ) le ;
if ( ! sheep . isSheared ( ) ) {
Wool wool = new Wool ( ) ;
wool . setColor ( sheep . getColor ( ) ) ;
ItemStack theWool = wool . toItemStack ( ) ;
2012-03-26 17:04:17 +02:00
theWool . setAmount ( 1 + random . nextInt ( 6 ) ) ;
2012-03-13 08:00:49 +01:00
m . mcDropItem ( loc , theWool ) ;
sheep . setSheared ( true ) ;
}
break ;
case SKELETON :
if ( DROP_NUMBER > 50 ) {
2012-03-16 18:45:30 +01:00
m . mcDropItem ( loc , new ItemStack ( Material . BONE ) ) ;
2012-03-13 08:00:49 +01:00
}
else {
2012-03-16 18:45:30 +01:00
m . mcDropItems ( loc , new ItemStack ( Material . ARROW ) , 3 ) ;
2012-03-13 08:00:49 +01:00
}
break ;
case SLIME :
2012-03-16 18:45:30 +01:00
m . mcDropItem ( loc , new ItemStack ( Material . SLIME_BALL ) ) ;
2012-03-13 08:00:49 +01:00
break ;
case SNOWMAN :
if ( DROP_NUMBER > 99 ) {
2012-03-16 18:45:30 +01:00
m . mcDropItem ( loc , new ItemStack ( Material . PUMPKIN ) ) ;
2012-03-13 08:00:49 +01:00
}
else {
2012-03-16 18:45:30 +01:00
m . mcDropItems ( loc , new ItemStack ( Material . SNOW_BALL ) , 5 ) ;
2012-03-13 08:00:49 +01:00
}
break ;
case SPIDER :
if ( DROP_NUMBER > 50 ) {
2012-03-16 18:45:30 +01:00
m . mcDropItem ( loc , new ItemStack ( Material . SPIDER_EYE ) ) ;
2012-03-13 08:00:49 +01:00
}
else {
2012-03-16 18:45:30 +01:00
m . mcDropItem ( loc , new ItemStack ( Material . STRING ) ) ;
2012-03-13 08:00:49 +01:00
}
break ;
case SQUID :
2012-03-24 03:30:56 +01:00
m . mcDropItem ( loc , new ItemStack ( Material . INK_SACK , 1 , ( short ) 0 , ( byte ) 0x0 ) ) ;
2012-03-13 08:00:49 +01:00
break ;
case ZOMBIE :
2012-03-16 18:45:30 +01:00
m . mcDropItem ( loc , new ItemStack ( Material . ROTTEN_FLESH ) ) ;
2012-03-13 08:00:49 +01:00
break ;
default :
break ;
}
Combat . dealDamage ( le , 1 ) ;
}
2011-11-28 14:17:01 +01:00
}