package org.reunionemu.jreunion.game.skills.kailipton;
import java.util.List;
import java.util.Vector;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.reunionemu.jreunion.game.Castable;
import org.reunionemu.jreunion.game.Effectable;
import org.reunionemu.jreunion.game.Item;
import org.reunionemu.jreunion.game.LivingObject;
import org.reunionemu.jreunion.game.Npc;
import org.reunionemu.jreunion.game.Player;
import org.reunionemu.jreunion.game.Skill;
import org.reunionemu.jreunion.server.LocalMap;
import org.reunionemu.jreunion.server.PacketFactory.Type;
import org.reunionemu.jreunion.server.SkillManager;
import org.reunionemu.jreunion.server.Tools;
import org.reunionemu.jreunion.game.items.equipment.WandWeapon;
public class TransferMagicalPower extends Skill implements Castable, Effectable{
public TransferMagicalPower(SkillManager skillManager, int id) {
super(skillManager, id);
}
@Override
public int getMaxLevel() {
return 4;
}
@Override
public int getLevelRequirement(int skillLevel) {
return 159+skillLevel;
}
@Override
public int getAffectedTargets() {
return 1;
}
public float getDamageModifier() {
/*
* lvl 1 = 5% lvl
* lvl 2 =
* lvl 3 =
* lvl 4 = 200%
*/
return 1.95f / (getMaxLevel() - 1);
}
public float getDamageModifier(Player player) {
float modifier = 1;
int level = player.getSkillLevel(this);
if (level > 0) {
modifier += (0.05 + ((level - 1) * getDamageModifier()));
}
return modifier;
}
public boolean cast(LivingObject caster, LivingObject target, String[] arguments) {
Player player = null;
if (caster instanceof Player) {
player = (Player) caster;
}
Item<?> offHandEquipment = player.getEquipment().getOffHand();
if(offHandEquipment == null){
LoggerFactory.getLogger(TransferMagicalPower.class).error("It wasn't possible to get player OffHand equipment.");
return false;
}
offHandEquipment.use(caster, -1, 0);
WandWeapon wandWeapon = null;
if (offHandEquipment.getType() instanceof WandWeapon) {
wandWeapon = (WandWeapon) offHandEquipment.getType();
} else {
LoggerFactory.getLogger(TransferMagicalPower.class).error("It's not possible to cast. Not wearing a wand.");
return false;
}
long bestAttack = player.getBestAttack();
long wandDmg = wandWeapon.getDamage();
float accumulatedDmg = wandWeapon.getAccumulatedDmg();
float criticalMultiplier = wandWeapon.getCritical();
// not sure of this formula : damage wand = Attack + Wand dmg + Acumulated Damage
//long damage = bestAttack + wandDmg + (long) (accumulatedDmg);
long damage = (bestAttack + wandDmg) * (long)getDamageModifier(player);
if(damage > accumulatedDmg){
damage = (long)accumulatedDmg;
}
damage += (long)(damage * criticalMultiplier);
// now increasing accumulated damage (max should be 20 * original_accu_damage)
//if (accumulatedDmg < (20 * accumulatedDmg_original)) {
// float new_value = accumulatedDmg + accumulatedDmg_original;
// wandWeapon.setAccumulatedDmg(new_value);
//}
synchronized (target) {
//for (LivingObject target : targets) {
long newHp = Tools.between(target.getHp() - damage, 0l, target.getMaxHp());
if (newHp <= 0) {
LoggerFactory.getLogger(TransferMagicalPower.class).info("Player " + player + " killed npc " + target);
if (target instanceof Npc) {
((Npc<?>) target).kill(player);
}
} else {
target.setHp(newHp);
}
player.getClient().sendPacket(Type.SAV, target,
criticalMultiplier > 0 ? 1 : 0, Integer.parseInt(arguments[4]),
offHandEquipment.getGemNumber(), 10);
//}
}
player.clearAttackQueue();
return true;
}
@Override
public void effect(LivingObject source, LivingObject target, String[] arguments){
source.getInterested().sendPacket(Type.SECONDATTACK, source, target, getId());
}
@Override
public int getEffectModifier() {
// TODO Auto-generated method stub
return 0;
}
@Override
public List<LivingObject> getTargets(String[] arguments, LocalMap map){
List<LivingObject> targets = new Vector<LivingObject>();
targets.add(getSingleTarget(Integer.parseInt(arguments[3]), map));
return targets;
}
}