2013-03-01 06:52:01 +01:00
package com.gmail.nossr50.skills.taming ;
2013-03-01 21:49:24 +01:00
import org.bukkit.entity.Entity ;
2013-03-01 06:52:01 +01:00
import org.bukkit.entity.EntityType ;
import org.bukkit.entity.LivingEntity ;
2013-03-01 21:49:24 +01:00
import org.bukkit.entity.Ocelot ;
import org.bukkit.entity.Player ;
import org.bukkit.entity.Tameable ;
2013-03-01 06:52:01 +01:00
import org.bukkit.entity.Wolf ;
import org.bukkit.inventory.ItemStack ;
2013-03-01 21:49:24 +01:00
import com.gmail.nossr50.mcMMO ;
2013-03-01 06:52:01 +01:00
import com.gmail.nossr50.config.Config ;
import com.gmail.nossr50.datatypes.player.McMMOPlayer ;
import com.gmail.nossr50.datatypes.skills.SkillType ;
2013-03-01 21:49:24 +01:00
import com.gmail.nossr50.locale.LocaleLoader ;
import com.gmail.nossr50.runnables.skills.BleedTimerTask ;
2013-03-01 06:52:01 +01:00
import com.gmail.nossr50.skills.SkillManager ;
import com.gmail.nossr50.util.Misc ;
import com.gmail.nossr50.util.Permissions ;
2013-03-01 21:49:24 +01:00
import com.gmail.nossr50.util.StringUtils ;
2013-03-01 06:52:01 +01:00
import com.gmail.nossr50.util.skills.SkillUtils ;
public class TamingManager extends SkillManager {
public TamingManager ( McMMOPlayer mcMMOPlayer ) {
super ( mcMMOPlayer , SkillType . TAMING ) ;
}
2013-03-01 21:49:24 +01:00
public boolean canUseThickFur ( ) {
2013-03-04 15:40:03 +01:00
return getSkillLevel ( ) > = Taming . thickFurUnlockLevel & & Permissions . thickFur ( getPlayer ( ) ) ;
2013-03-01 21:49:24 +01:00
}
public boolean canUseEnvironmentallyAware ( ) {
2013-03-04 15:40:03 +01:00
return getSkillLevel ( ) > = Taming . environmentallyAwareUnlockLevel & & Permissions . environmentallyAware ( getPlayer ( ) ) ;
2013-03-01 21:49:24 +01:00
}
public boolean canUseShockProof ( ) {
2013-03-04 15:40:03 +01:00
return getSkillLevel ( ) > = Taming . shockProofUnlockLevel & & Permissions . shockProof ( getPlayer ( ) ) ;
2013-03-01 21:49:24 +01:00
}
public boolean canUseHolyHound ( ) {
2013-03-04 15:40:03 +01:00
return getSkillLevel ( ) > = Taming . holyHoundUnlockLevel & & Permissions . holyHound ( getPlayer ( ) ) ;
2013-03-01 21:49:24 +01:00
}
2013-03-04 15:40:03 +01:00
public boolean canUseFastFoodService ( ) {
return getSkillLevel ( ) > = Taming . fastFoodServiceUnlockLevel & & Permissions . fastFoodService ( getPlayer ( ) ) ;
}
public boolean canUseSharpenedClaws ( ) {
return getSkillLevel ( ) > = Taming . sharpenedClawsUnlockLevel & & Permissions . sharpenedClaws ( getPlayer ( ) ) ;
}
public boolean canUseGore ( ) {
return Permissions . gore ( getPlayer ( ) ) ;
}
public boolean canUseBeastLore ( ) {
return Permissions . beastLore ( getPlayer ( ) ) ;
2013-03-03 07:31:14 +01:00
}
2013-03-01 06:52:01 +01:00
/ * *
* Award XP for taming .
*
* @param event The event to award XP for
* /
public void awardTamingXP ( LivingEntity entity ) {
switch ( entity . getType ( ) ) {
case WOLF :
applyXpGain ( Taming . wolfXp ) ;
return ;
case OCELOT :
applyXpGain ( Taming . ocelotXp ) ;
return ;
default :
return ;
}
}
/ * *
* Apply the Fast Food Service ability .
*
* @param wolf The wolf using the ability
* @param damage The damage being absorbed by the wolf
* /
public void fastFoodService ( Wolf wolf , int damage ) {
2013-03-05 04:45:37 +01:00
if ( Taming . fastFoodServiceActivationChance > Misc . getRandom ( ) . nextInt ( getActivationChance ( ) ) ) {
2013-03-01 06:52:01 +01:00
int health = wolf . getHealth ( ) ;
int maxHealth = wolf . getMaxHealth ( ) ;
if ( health < maxHealth ) {
int newHealth = health + damage ;
wolf . setHealth ( Math . min ( newHealth , maxHealth ) ) ;
}
}
}
/ * *
* Apply the Gore ability .
*
* @param event The event to modify
* /
2013-03-01 21:49:24 +01:00
public int gore ( LivingEntity target , int damage ) {
2013-03-04 15:40:03 +01:00
if ( SkillUtils . activationSuccessful ( getSkillLevel ( ) , getActivationChance ( ) , Taming . goreMaxChance , Taming . goreMaxBonusLevel ) ) {
2013-03-01 21:49:24 +01:00
BleedTimerTask . add ( target , Taming . goreBleedTicks ) ;
if ( target instanceof Player ) {
( ( Player ) target ) . sendMessage ( LocaleLoader . getString ( " Combat.StruckByGore " ) ) ;
}
2013-03-01 06:52:01 +01:00
2013-03-04 15:40:03 +01:00
getPlayer ( ) . sendMessage ( LocaleLoader . getString ( " Combat.Gore " ) ) ;
2013-03-01 21:49:24 +01:00
return damage * Taming . goreModifier ;
2013-03-01 06:52:01 +01:00
}
2013-03-01 21:49:24 +01:00
return damage ;
2013-03-01 06:52:01 +01:00
}
/ * *
* Summon an ocelot to your side .
* /
public void summonOcelot ( ) {
callOfTheWild ( EntityType . OCELOT , Config . getInstance ( ) . getTamingCOTWOcelotCost ( ) ) ;
}
/ * *
* Summon a wolf to your side .
* /
public void summonWolf ( ) {
callOfTheWild ( EntityType . WOLF , Config . getInstance ( ) . getTamingCOTWWolfCost ( ) ) ;
}
/ * *
* Handle the Beast Lore ability .
*
2013-03-01 21:49:24 +01:00
* @param target The entity to examine
2013-03-01 06:52:01 +01:00
* /
2013-03-01 21:49:24 +01:00
public void beastLore ( LivingEntity target ) {
Player player = getPlayer ( ) ;
Tameable beast = ( Tameable ) target ;
String message = LocaleLoader . getString ( " Combat.BeastLore " ) + " " ;
if ( beast . isTamed ( ) ) {
2013-03-03 21:22:40 +01:00
message = message . concat ( LocaleLoader . getString ( " Combat.BeastLoreOwner " , beast . getOwner ( ) . getName ( ) ) + " " ) ;
2013-03-01 21:49:24 +01:00
}
message = message . concat ( LocaleLoader . getString ( " Combat.BeastLoreHealth " , target . getHealth ( ) , target . getMaxHealth ( ) ) ) ;
player . sendMessage ( message ) ;
}
public void processEnvironmentallyAware ( Wolf wolf , int damage ) {
if ( damage > wolf . getHealth ( ) ) {
return ;
}
Player owner = getPlayer ( ) ;
wolf . teleport ( owner ) ;
owner . sendMessage ( LocaleLoader . getString ( " Taming.Listener.Wolf " ) ) ;
2013-03-01 06:52:01 +01:00
}
/ * *
* Handle the Call of the Wild ability .
*
* @param type The type of entity to summon .
* @param summonAmount The amount of material needed to summon the entity
* /
private void callOfTheWild ( EntityType type , int summonAmount ) {
2013-03-01 21:49:24 +01:00
Player player = getPlayer ( ) ;
ItemStack heldItem = player . getItemInHand ( ) ;
int heldItemAmount = heldItem . getAmount ( ) ;
if ( heldItemAmount < summonAmount ) {
player . sendMessage ( LocaleLoader . getString ( " Skills.NeedMore " , StringUtils . getPrettyItemString ( heldItem . getTypeId ( ) ) ) ) ;
2013-03-01 06:52:01 +01:00
return ;
}
2013-03-01 21:49:24 +01:00
for ( Entity entity : player . getNearbyEntities ( 40 , 40 , 40 ) ) {
if ( entity . getType ( ) = = type ) {
player . sendMessage ( Taming . getCallOfTheWildFailureMessage ( type ) ) ;
return ;
}
}
2013-03-01 06:52:01 +01:00
2013-03-01 21:49:24 +01:00
LivingEntity entity = ( LivingEntity ) player . getWorld ( ) . spawnEntity ( player . getLocation ( ) , type ) ;
2013-03-01 06:52:01 +01:00
2013-03-01 21:49:24 +01:00
entity . setMetadata ( mcMMO . entityMetadataKey , mcMMO . metadataValue ) ;
( ( Tameable ) entity ) . setOwner ( player ) ;
2013-03-01 06:52:01 +01:00
2013-03-01 21:49:24 +01:00
if ( type = = EntityType . OCELOT ) {
( ( Ocelot ) entity ) . setCatType ( Ocelot . Type . getType ( 1 + Misc . getRandom ( ) . nextInt ( 3 ) ) ) ;
2013-03-01 06:52:01 +01:00
}
else {
2013-04-05 22:17:59 +02:00
entity . setMaxHealth ( 20 ) ;
2013-03-01 21:49:24 +01:00
entity . setHealth ( entity . getMaxHealth ( ) ) ;
2013-03-01 06:52:01 +01:00
}
2013-03-01 21:49:24 +01:00
2013-04-18 23:04:27 +02:00
if ( Permissions . renamePets ( player ) ) {
entity . setCustomName ( player . getName ( ) + " \ 's " + StringUtils . getPrettyEntityTypeString ( entity . getType ( ) ) ) ; //TODO Localize, perhaps in a different language it makes more sense to switch this around
entity . setCustomNameVisible ( true ) ;
}
2013-03-01 21:49:24 +01:00
player . setItemInHand ( new ItemStack ( heldItem . getType ( ) , heldItemAmount - summonAmount ) ) ;
player . sendMessage ( LocaleLoader . getString ( " Taming.Summon.Complete " ) ) ;
2013-03-01 06:52:01 +01:00
}
}