package org.reunionemu.jreunion.game.skills.bulkan; import java.util.List; import java.util.Vector; 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.Player; import org.reunionemu.jreunion.game.Skill; import org.reunionemu.jreunion.game.items.equipment.DemolitionWeapon; import org.reunionemu.jreunion.game.items.equipment.SlayerWeapon; import org.reunionemu.jreunion.server.PacketFactory.Type; import org.reunionemu.jreunion.server.LocalMap; import org.reunionemu.jreunion.server.SkillManager; public class BurningCrash extends Skill implements Castable, Effectable{ public BurningCrash(SkillManager skillManager,int id) { super(skillManager,id); } @Override public int getMaxLevel() { return 30; } @Override public int getLevelRequirement(int skillLevel) { return 275; } @Override public int getAffectedTargets() { return 1; } public long getLimeModifier(){ /* * lvl 1 = 40000 * lvl 2 = 50000 * lvl 3 = 60000 * lvl 4 = 70000 * * lvl 30 = 330000 */ return (long)290000/(getMaxLevel()-1); } public float getDamageModifier(){ /* * lvl 1 = 250% * lvl 2 = 276% * lvl 3 = 308% * lvl 4 = 346 * * lvl 30 = 3438% */ return 22.50f/(getMaxLevel()-1); } public float getStaminaModifier(){ /* stamina spent: * level 1 = 1 * level 2 = 3 * level 3 = 5 * level 4 = 7 * ... * level 30 = 65 */ return 30f/(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 = (2.5f+((level-1)*getDamageModifier())); } return modifier; } public boolean cast(LivingObject caster, LivingObject victim, String[] arguments){ int castStep = Integer.parseInt(arguments[4]); if(castStep == 255) return true; Player player = null; if(caster instanceof Player){ player = (Player)caster; } Item<?> shoulderMount = player.getEquipment().getShoulderMount(); if(!shoulderMount.use(caster, -1, 0)){ return false; } SlayerWeapon slayerWeapon = null; if(shoulderMount.getType() instanceof SlayerWeapon) slayerWeapon = (SlayerWeapon) shoulderMount.getType(); long bestAttack = player.getBestAttack(); long slayerDmg = slayerWeapon.getDamage(); float slayerMemoryDmg = slayerWeapon.getMemoryDmg(); float skillDmg = getDamageModifier(player); float slayerDemolitionDmg = slayerWeapon.getDemolition(); float criticalMultiplier = slayerWeapon.getCritical(); long damage = bestAttack + slayerDmg + (long)(bestAttack*slayerMemoryDmg); damage = damage + (long)(damage*criticalMultiplier); //add critical damage damage = damage + (long)(damage*skillDmg); //add skill damage increase damage = damage + (long)(damage*slayerDemolitionDmg); //add slayer demolition damage player.setDmgType(slayerWeapon instanceof DemolitionWeapon ? 2 : (criticalMultiplier > 0 ? 1 : 0)); synchronized (victim) { victim.getsAttacked(player, damage, false); int unknown = victim.getHp() <= 0 ? -1 : castStep == 1 ? 1 : 0; player.getClient().sendPacket(Type.SAV, null, -1, -1, shoulderMount.getExtraStats(), 3); if (unknown != 0) { player.getClient().sendPacket(Type.EFFECT, player, victim, this, 0, unknown, 30); } player.getClient().sendPacket(Type.AV, victim, player.getDmgType()); if (victim.getHp() <= 0) { player.clearAttackQueue(); } } return true; } public void effect(LivingObject source, LivingObject target, String[] arguments){ if(source == null || arguments == null) return; int castStep = Integer.parseInt(arguments[4]); if(castStep == 255) return; int unknown = target.getHp() <= 0 ? -1 : 1; if(Integer.parseInt(arguments[4])==1 || target.getHp()==0){ source.getInterested().sendPacket(Type.EFFECT, source, target , this, 0, unknown, 30); } } @Override public int getEffectModifier() { 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; } }