- edited description
Edit in config the chance of passing dagger skills
Issue #332
resolved
Tell me how to rewrite this functionality for L2J Server.
character.properties
FrontSuccessChance=30
SideSuccessChance=60
BehindSuccessChance=90
java\net\sf\l2j\Config.java
public static int FRONT_CHANCE;
public static int SIDE_CHANCE;
public static int BEHIND_CHANCE;
FRONT_CHANCE = Integer.parseInt(physicsSettings.getProperty("FrontSuccessChance", "15"));
SIDE_CHANCE = Integer.parseInt(physicsSettings.getProperty("SideSuccessChance", "45"));
BEHIND_CHANCE = Integer.parseInt(physicsSettings.getProperty("BehindSuccessChance", "85"));
java\net\sf\l2j\gameserver\handler\skillhandlers\Blow.java
package net.sf.l2j.gameserver.handler.skillhandlers;
import net.sf.l2j.Config;
import net.sf.l2j.gameserver.handler.ISkillHandler;
import net.sf.l2j.gameserver.model.L2Character;
import net.sf.l2j.gameserver.model.L2Effect;
import net.sf.l2j.gameserver.model.L2ItemInstance;
import net.sf.l2j.gameserver.model.L2Object;
import net.sf.l2j.gameserver.model.L2Skill;
import net.sf.l2j.gameserver.model.L2Skill.SkillType;
import net.sf.l2j.gameserver.model.actor.instance.L2DoorInstance;
import net.sf.l2j.gameserver.model.actor.instance.L2NpcInstance;
import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
import net.sf.l2j.gameserver.network.SystemMessageId;
import net.sf.l2j.gameserver.serverpackets.SystemMessage;
import net.sf.l2j.gameserver.skills.Env;
import net.sf.l2j.gameserver.skills.Formulas;
import net.sf.l2j.gameserver.skills.funcs.Func;
import net.sf.l2j.gameserver.templates.L2WeaponType;
import net.sf.l2j.util.Rnd;
public class Blow implements ISkillHandler
{
private static final SkillType[] SKILL_IDS = {SkillType.BLOW};
private int _successChance;
public final static int FRONT = Config.FRONT_CHANCE;
public final static int SIDE = Config.SIDE_CHANCE;
public final static int BEHIND = Config.BEHIND_CHANCE;
public void useSkill(L2Character activeChar, L2Skill skill, L2Object[] targets){
if(activeChar.isAlikeDead())
return;
for(int index = 0;index < targets.length;index++)
{
L2Character target = (L2Character)targets[index];
if(target.isAlikeDead())
continue;
if(activeChar.isBehindTarget())
_successChance = BEHIND;
else if(activeChar.isFrontTarget())
_successChance = FRONT;
else
_successChance = SIDE;
if(((skill.getCondition() & L2Skill.COND_BEHIND) != 0) && _successChance == BEHIND || ((skill.getCondition() & L2Skill.COND_CRIT) != 0) && Formulas.getInstance().calcBlow(activeChar, target, _successChance))
{
if (skill.hasEffects())
{
if (target.reflectSkill(skill))
{
activeChar.stopSkillEffects(skill.getId());
skill.getEffects((L2Character)null, activeChar);
SystemMessage sm = new SystemMessage(SystemMessageId.YOU_FEEL_S1_EFFECT);
sm.addSkillName(skill.getId());
activeChar.sendPacket(sm);
}
}
L2ItemInstance weapon = activeChar.getActiveWeaponInstance();
boolean soul = (weapon != null && weapon.getChargedSoulshot() == L2ItemInstance.CHARGED_SOULSHOT && weapon.getItemType() == L2WeaponType.DAGGER);
boolean shld = Formulas.getInstance().calcShldUse(activeChar, target);
// Crit rate base crit rate for skill, modified with STR bonus
boolean crit = false;
if(Formulas.getInstance().calcCrit(skill.getBaseCritRate()*10*Formulas.getInstance().getSTRBonus(activeChar)))
crit = true;
double damage = (int)Formulas.getInstance().calcBlowDamage(activeChar, target, skill, shld, soul);
if (crit)
{
damage *= 2;
}
if (soul && weapon != null)
weapon.setChargedSoulshot(L2ItemInstance.CHARGED_NONE);
// Added by eXtrem L2DDT
int RevengeDmg = 0;
int reflectDmg = 0;
int twodamage = Rnd.get(100);
int randomiz = Rnd.get(100);
// CounterAttack
if (target.reflectDamageSkill(skill))
{
reflectDmg += damage;
reflectDmg *= randomiz;
reflectDmg *= 0.01;
}
// Shield of Revenge
if (target.reflectRevengeSkill(skill))
{
RevengeDmg += damage;
}
if(skill.getDmgDirectlyToHP() && target instanceof L2PcInstance)
{
L2PcInstance player = (L2PcInstance)target;
if (!player.isInvul())
{
if (damage >= player.getCurrentHp())
{
if(player.isInDuel()) player.setCurrentHp(1);
else
{
player.setCurrentHp(0);
if (player.isInOlympiadMode())
{
player.abortAttack();
player.abortCast();
player.getStatus().stopHpMpRegeneration();
}
else
player.doDie(activeChar);
}
}
else
activeChar.reduceCurrentHp(RevengeDmg, activeChar);
activeChar.reduceCurrentHp(reflectDmg, activeChar);
if(twodamage<80)activeChar.reduceCurrentHp(reflectDmg, activeChar);
player.setCurrentHp(player.getCurrentHp() - damage);
}
SystemMessage smsg = new SystemMessage(SystemMessageId.S1_GAVE_YOU_S2_DMG);
smsg.addString(activeChar.getName());
smsg.addNumber((int)damage);
player.sendPacket(smsg);
}
else
{
activeChar.reduceCurrentHp(RevengeDmg, target);
activeChar.reduceCurrentHp(reflectDmg, target);
if(twodamage<80) activeChar.reduceCurrentHp(reflectDmg, target);
target.reduceCurrentHp(damage, activeChar);
}
if(activeChar instanceof L2PcInstance)
activeChar.sendPacket(new SystemMessage(SystemMessageId.CRITICAL_HIT));
SystemMessage sm = new SystemMessage(SystemMessageId.YOU_DID_S1_DMG);
sm.addNumber((int)damage);
activeChar.sendPacket(sm);
}
//Possibility of a lethal strike
if(!target.isRaid()
&& !(target instanceof L2DoorInstance)
&& !(target instanceof L2NpcInstance && ((L2NpcInstance)target).getNpcId() == 35062))
{
int chance = Rnd.get(100);
//2nd lethal effect activate (cp,hp to 1 or if target is npc then hp to 1)
if(skill.getLethalChance2() > 0 && chance < Formulas.getInstance().calcLethal(activeChar, target, skill.getLethalChance2()))
{
if (target instanceof L2NpcInstance)
target.reduceCurrentHp(target.getCurrentHp()-1, activeChar);
else if (target instanceof L2PcInstance) // If is a active player set his HP and CP to 1
{
L2PcInstance player = (L2PcInstance)target;
if (!player.isInvul()){
player.setCurrentHp(1);
player.setCurrentCp(1);
}
}
activeChar.sendPacket(new SystemMessage(SystemMessageId.LETHAL_STRIKE));
}
else if(skill.getLethalChance1() > 0 && chance < Formulas.getInstance().calcLethal(activeChar, target, skill.getLethalChance1())){
if (target instanceof L2PcInstance)
{
L2PcInstance player = (L2PcInstance)target;
if (!player.isInvul())
player.setCurrentCp(1); // Set CP to 1
}
else if (target instanceof L2NpcInstance) // If is a monster remove first damage and after 50% of current hp
target.reduceCurrentHp(target.getCurrentHp()/2, activeChar);
activeChar.sendPacket(new SystemMessage(SystemMessageId.LETHAL_STRIKE));
}
}
L2Effect effect = activeChar.getFirstEffect(skill.getId());
//Self Effect
if (effect != null && effect.isSelfEffect())
effect.exit();
skill.getEffectsSelf(activeChar);
}
}
public SkillType[] getSkillIds()
{
return SKILL_IDS;
}
}
Comments (3)
-
Account Deactivated reporter -
- changed status to resolved
Use this for report bugs, not for request custom features.
-
Account Deactivated reporter Type: proposal
- Log in to comment