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-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
|
|
|
|
|
|
|
player.setItemInHand(new ItemStack(heldItem.getType(), heldItemAmount - summonAmount));
|
|
|
|
player.sendMessage(LocaleLoader.getString("Taming.Summon.Complete"));
|
2013-03-01 06:52:01 +01:00
|
|
|
}
|
|
|
|
}
|