package org.reunionemu.jreunion.game.skills;
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.Weapon;
import org.reunionemu.jreunion.server.Client;
import org.reunionemu.jreunion.server.LocalMap;
import org.reunionemu.jreunion.server.PacketFactory.Type;
import org.reunionemu.jreunion.server.SkillManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class BasicAttack extends Skill implements Castable, Effectable{
public BasicAttack(SkillManager skillManager,int id) {
super(skillManager,id);
}
private static Logger logger = LoggerFactory.getLogger(BasicAttack.class);
@Override
public void handle(Player player, String[] arguments) {
Client client = player.getClient();
int entityId = Integer.parseInt(arguments[2]);
LivingObject target = (LivingObject) player.getPosition().getLocalMap().getEntity(entityId);
if(arguments[1].equals("npc")||arguments[1].equals("n")){
}else if(arguments[1].equals("char")||arguments[1].equals("c")){
client.sendPacket(Type.SAY, "No PVP implemented yet!");
}else{
logger.error("invalid attack arguments");
}
//List<LivingObject> victims = Collections.singletonList(target);
if(this.cast(player, target, arguments)){
this.effect(player, target, arguments);
}
}
@Override
public boolean cast(LivingObject attacker, LivingObject victim, String[] arguments) {
float damage = 0;
if (attacker instanceof Player){
Player player = (Player)attacker;
Item<?> item = player.getEquipment().getMainHand();
Weapon weapon = null;
float baseDamage = player.getBaseDamage();
float weaponDamage = 0;
float criticalMultiplier = 0;
if(item!=null){ // confirm if player is wearing a weapon
weapon = (Weapon) item.getType();
weaponDamage += weapon.getDamage(item);
criticalMultiplier = weapon.getCritical();
if(!weapon.use(player)){
return false;
}
}
damage = baseDamage + weaponDamage;
for(Skill skill: ((Player)attacker).getSkills().keySet()){
if (Modifier.class.isInstance(skill)){
Modifier modifier = (Modifier)skill;
if(modifier.getAffectedSkills().contains(this)){
if(modifier.getCondition(attacker)){
if(modifier.getValueType()==Modifier.ValueType.DAMAGE){
switch(modifier.getModifierType()){
case MULTIPLICATIVE:
damage *= modifier.getModifier(attacker);
break;
case ADDITIVE:
damage += modifier.getModifier(attacker);
break;
}
}
}
}
}
}
damage += (long)(damage*criticalMultiplier);
player.setDmgType(criticalMultiplier > 0 ? 1 : 0);
synchronized(victim){
victim.getsAttacked(player, (int)damage, true);
player.getClient().sendPacket(Type.ATTACK, player,victim,player.getDmgType());
return true;
}
}
return false;
}
@Override
public void effect(LivingObject source, LivingObject target, String[] arguments){
source.getInterested().sendPacket(Type.ATTACK, source, target, source.getDmgType());
}
@Override
public int getMaxLevel() {
return 0;
}
@Override
public int getLevelRequirement(int skillLevel) {
return 0;
}
@Override
public int getAffectedTargets() {
return 1;
}
@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;
}
}