package org.reunionemu.jreunion.game.skills.bulkan; 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.game.items.equipment.Axe; import org.reunionemu.jreunion.game.items.equipment.DemolitionWeapon; import org.reunionemu.jreunion.game.items.equipment.SlayerWeapon; import org.reunionemu.jreunion.game.npc.Mob; import org.reunionemu.jreunion.server.PacketFactory.Type; import org.reunionemu.jreunion.server.LocalMap; import org.reunionemu.jreunion.server.SkillManager; import org.reunionemu.jreunion.server.Tools; public class SecondAttack extends Skill implements Castable, Effectable{ public SecondAttack(SkillManager skillManager,int id) { super(skillManager,id); } @Override public int getMaxLevel() { return 25; } @Override public int getLevelRequirement(int skillLevel) { return 149+skillLevel; } @Override public int getAffectedTargets() { return 1; } public float getDamageModifier(){ /* * lvl 1 = 20% * lvl 2 = 40% * lvl 3 = 60% * * lvl 25 = 500% */ return 4.8f/(getMaxLevel()-1); } public float getDamageModifier(Player player){ float modifier = 1; //Item<?> weapon = player.getEquipment().getMainHand(); //if(weapon!=null&&getWeaponType().isInstance(weapon)){ int level = player.getSkillLevel(this); if(level>0){ modifier += (0.2+((level-1)*getDamageModifier())); } //} return modifier; } @Override public boolean cast(LivingObject caster, LivingObject victim, String[] arguments){ Player player = null; if(caster instanceof Player){ player = (Player)caster; } Item<?> shoulderMount = player.getEquipment().getShoulderMount(); shoulderMount.use(caster, -1, 0); SlayerWeapon slayerWeapon = null; if(shoulderMount!=null && shoulderMount.getType() instanceof SlayerWeapon) slayerWeapon = (SlayerWeapon) shoulderMount.getType(); long bestAttack = player.getBestAttack(); long slayerDmg = slayerWeapon.getDamage(); float slayerMemoryDmg = slayerWeapon.getMemoryDmg(); float skillDmg = getDamageModifier(); float slayerDemolitionDmg = slayerWeapon.getDemolitionDmg(); float criticalMultiplier = slayerWeapon.getCritical(); long damage = bestAttack + slayerDmg + (long)(bestAttack*slayerMemoryDmg*skillDmg); damage += (long)(damage*criticalMultiplier); damage += (long)(damage*slayerDemolitionDmg); player.setDmgType(slayerWeapon instanceof DemolitionWeapon ? 2 : (criticalMultiplier > 0 ? 1 : 0)); synchronized(victim){ victim.getsAttacked(player, damage, false); player.getClient().sendPacket(Type.SAV, victim, player.getDmgType(), 0, shoulderMount.getExtraStats(), 3); } player.clearAttackQueue(); return true; } @Override public void effect(LivingObject source, LivingObject target, String[] arguments){ source.getInterested().sendPacket(Type.SECONDATTACK, source, target, getId()); } @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; } @Override public int getEffectModifier() { // TODO Auto-generated method stub return 0; } }