package org.reunionemu.jreunion.game.skills.human; import java.util.List; import java.util.Vector; 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.GunWeapon; import org.reunionemu.jreunion.game.skills.Modifier; import org.reunionemu.jreunion.server.PacketFactory.Type; import org.reunionemu.jreunion.server.SkillManager; import org.reunionemu.jreunion.server.Tools; public class SemiAutomatic extends Skill implements Modifier{ public SemiAutomatic(SkillManager skillManager,int id) { super(skillManager,id); } @Override public int getMaxLevel() { return 25; } @Override public int getLevelRequirement(int skillLevel) { return 4+skillLevel; } @Override public int getAffectedTargets() { return 1; } public Class<?> getWeaponType() { return GunWeapon.class; } public boolean getCondition(LivingObject owner){ if(owner instanceof Player){ Player player = (Player)owner; if(player.getSkillLevel(this)==0) return false; Item<?> weapon= player.getEquipment().getMainHand(); return weapon!=null && weapon.getType().getClass().equals(getWeaponType()); } return false; } public float getSuccessRateModifier(Player player){ float modifier = 1; float successRate = 0; Item<?> weapon = player.getEquipment().getMainHand(); if(weapon!=null && weapon.getType().getClass().equals(getWeaponType())){ int level = player.getSkillLevel(this); if(level>0){ successRate += (0.05+((level-1)*getSuccessRateModifier())); if(Tools.successRateCalc(successRate)){//success rate of multi_shot //here we test if the success rate is above 50%. //if true, then player fires 3 shots, if not the player fire2 only 2 shots. modifier = (successRate > 0.5 && Tools.successRateCalc(0.5f)) ? 2 : 3; player.getClient().sendPacket(Type.MULTI_SHOT, "me", (int)modifier); } } } return modifier; } public float getSuccessRateModifier(){ /* * lvl 1 = 5% * lvl 2 = % * * * lvl 25 = 95% */ return 0.9f/(getMaxLevel()-1); } @Override public ValueType getValueType() { return Modifier.ValueType.DAMAGE; } @Override public ModifierType getModifierType() { return Modifier.ModifierType.MULTIPLICATIVE; } private int [] affectedSkillIds = {0}; private List<Skill> affectedSkills = null ; @Override public List<Skill> getAffectedSkills() { synchronized(affectedSkillIds){ if (affectedSkills==null){ affectedSkills = new Vector<Skill>(); for(int skillId:affectedSkillIds){ SkillManager skillManager = getSkillManager(); affectedSkills.add(skillManager.getSkill(skillId)); } } } return affectedSkills; } @Override public float getModifier(LivingObject livingObject) { return getSuccessRateModifier((Player)livingObject); } }