Jump to content
  • 0

[Help]Backstab


Question

Recommended Posts

  • 0
Posted

gameserver\handler\skillhandlers\Blow.java

 

/* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*
* http://www.gnu.org/copyleft/gpl.html
*/
package com.l2naran.gameserver.handler.skillhandlers;

import com.l2naran.Config;
import com.l2naran.gameserver.handler.ISkillHandler;
import com.l2naran.gameserver.model.L2Character;
import com.l2naran.gameserver.model.L2Effect;
import com.l2naran.gameserver.model.L2Object;
import com.l2naran.gameserver.model.L2Skill;
import com.l2naran.gameserver.model.L2Summon;
import com.l2naran.gameserver.model.L2Skill.SkillType;
import com.l2naran.gameserver.model.actor.instance.L2ItemInstance;
import com.l2naran.gameserver.model.actor.instance.L2PcInstance;
import com.l2naran.gameserver.model.actor.instance.L2SummonInstance;
import com.l2naran.gameserver.network.SystemMessageId;
import com.l2naran.gameserver.network.serverpackets.SystemMessage;
import com.l2naran.gameserver.skills.Env;
import com.l2naran.gameserver.skills.Formulas;
import com.l2naran.gameserver.skills.Stats;
import com.l2naran.gameserver.skills.funcs.Func;
import com.l2naran.gameserver.templates.L2WeaponType;
import com.l2naran.gameserver.util.Util;

public class Blow implements ISkillHandler
{
private static final SkillType[] SKILL_IDS = { SkillType.BLOW };

private int _successChance;

/*
public final static int FRONT = 50;
public final static int SIDE = 60;
public final static int BEHIND = 70;
*/

public void useSkill(L2Character activeChar, L2Skill skill, L2Object[] targets)
{
	if(activeChar.isAlikeDead())
		return;

	for(L2Object target2 : targets)
	{
		L2Character target = (L2Character) target2;
		if(target.isAlikeDead())
			continue;

		// Calculate skill evasion
		Formulas.getInstance();
		if(Formulas.calcPhysicalSkillEvasion(target, skill))
		{
			activeChar.sendPacket(new SystemMessage(SystemMessageId.ATTACK_FAILED));
			continue;
		}
		// Calculate vengeance
		if(target.vengeanceSkill(skill))
		{
			target = activeChar;
		}

		if(activeChar.isBehindTarget())
			_successChance = Config.BLOW_ATTACK_BEHIND;
		else if(activeChar.isFrontTarget())
			_successChance = Config.BLOW_ATTACK_FRONT;
		else
			_successChance = Config.BLOW_ATTACK_SIDE;

		//If skill requires Crit or skill requires behind,
		//calculate chance based on DEX, Position and on self BUFF
		if(((skill.getCondition() & L2Skill.COND_BEHIND) != 0) && _successChance == Config.BLOW_ATTACK_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(null, activeChar);
					SystemMessage sm = new SystemMessage(SystemMessageId.YOU_FEEL_S1_EFFECT);
					sm.addSkillName(skill.getId());
					activeChar.sendPacket(sm);
					sm = null;
				}
			}
			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;
				// Vicious Stance is special after C5, and only for BLOW skills
				// Adds directly to damage
				L2Effect vicious = activeChar.getFirstEffect(312);
				if(vicious != null && damage > 1)
				{
					for(Func func : vicious.getStatFuncs())
					{
						Env env = new Env();
						env.player = activeChar;
						env.target = target;
						env.skill = skill;
						env.value = damage;
						func.calc(env);
						damage = (int) env.value;

						env = null;
					}
				}
			}

			if(soul && weapon != null)
				weapon.setChargedSoulshot(L2ItemInstance.CHARGED_NONE);

			weapon = null;

			if(skill.getDmgDirectlyToHP() && target instanceof L2PcInstance)
			{
				L2PcInstance player = (L2PcInstance) target;
				if(!player.isInvul())
				{
					// Check and calculate transfered damage 
					L2Summon summon = player.getPet();
					if(summon != null && summon instanceof L2SummonInstance && Util.checkIfInRange(900, player, summon, true))
					{
						int tDmg = (int) damage * (int) player.getStat().calcStat(Stats.TRANSFER_DAMAGE_PERCENT, 0, null, null) / 100;

						// Only transfer dmg up to current HP, it should not be killed 
						if(summon.getCurrentHp() < tDmg)
							tDmg = (int) summon.getCurrentHp() - 1;
						if(tDmg > 0)
						{
							summon.reduceCurrentHp(tDmg, activeChar);
							damage -= tDmg;
						}
						summon = null;
					}
					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
						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);
				smsg = null;

				player = null;
			}
			else
				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);
			sm = null;
		}
		//Possibility of a lethal strike
		Formulas.getInstance().calcLethalHit(activeChar, target, skill);

		L2Effect effect = activeChar.getFirstEffect(skill.getId());
		//Self Effect
		if(effect != null && effect.isSelfEffect())
			effect.exit();
		skill.getEffectsSelf(activeChar);

		effect = null;
	}
}

public SkillType[] getSkillIds()
{
	return SKILL_IDS;
}
}

 

Change imports.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


  • Posts

    • 🏰 Clan Donations System – Power Through Unity This system allows clan members to support their clan directly through donations, turning contribution into strength.   How it works: Every donation made by a clan member is automatically listed in the clan donation panel. Each donation is permanently linked to the clan — no loss, no reset. The Clan Leader manages rewards manually for full transparency.   🎁 Clan Donation Rewards For every donation: The clan receives 5% Real Money or 10% Donate Coins (Leader chooses how the reward is given)   📌 After the reward is delivered, the donation is marked as PAID in the system. 🧾 Full Transparency Player name Donation amount Reward value (Real / Donate Coins) Date & status (Pending / Paid)   Everything is visible. Everything is tracked. Nothing is forgotten.   ⚔️ Support your clan. Strengthen your alliance. Power is built — not given.   https://www.l2dead.com/ https://discord.gg/TGnATuZmdt
    • up  corrected some retail crashes and hooked some new memory adresses that were missing  fix some missing retail behaviors on some recipes , you can also get the server as c4 with fixed scripts fully retail  what has been done to the c4  ( client is already configured) totally fixed npcposes  totally fixed raidbosses and minions bugged quests are fixed (known) a lot of recipes that were wrong  wrong values in several stats and corrected hero weapons behaviors/atk range
    • ποιο ειναι αρχαιο ακριβως? εκανες τον κοπο να ανοιξεις τα λινκς που εστειλα? 
    • Rates: xp45x / sp50x / adena50x (all adena is divided by 100/all shops prices too) Server: Full Official interlude server  with custom modifications Gameplay: l2Gold weapons - jewels, Buffs 1 hour, rebirth, No class change quests, increased movement speed on all classes   Download patch here: https://mega.nz/file/oZdG2KTa#1uTYSyEkNQV9U0Zxj-KLDE88mLj4pzQJZSYs2k3tpzo   Our server is waiting for all Lineage 2 fans who want to relive the good old days. This server is non-profit and fully dedicated to the community. There is no corruption, no pay-to-win, and no hidden agendas—just pure classic L2 fun.
  • Topics

×
×
  • Create New...

Important Information

This community uses essential cookies to function properly. Non-essential cookies and third-party services are used only with your consent. Read our Privacy Policy and We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue..