/* * Copyright (C) 2004-2013 L2J DataPack * * This file is part of L2J DataPack. * * L2J DataPack 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 3 of the License, or * (at your option) any later version. * * L2J DataPack 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, see . */ package handlers.skillhandlers; import java.util.List; import com.l2jserver.gameserver.datatables.SkillTable; import com.l2jserver.gameserver.enums.ShotType; import com.l2jserver.gameserver.handler.ISkillHandler; import com.l2jserver.gameserver.instancemanager.DuelManager; import com.l2jserver.gameserver.model.L2Object; import com.l2jserver.gameserver.model.actor.L2Character; import com.l2jserver.gameserver.model.actor.L2Summon; import com.l2jserver.gameserver.model.actor.instance.L2ClanHallManagerInstance; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.effects.L2Effect; import com.l2jserver.gameserver.model.skills.L2Skill; import com.l2jserver.gameserver.model.skills.L2SkillType; import com.l2jserver.gameserver.model.stats.Env; import com.l2jserver.gameserver.model.stats.Formulas; import com.l2jserver.gameserver.network.SystemMessageId; public class Continuous implements ISkillHandler { private static final L2SkillType[] SKILL_IDS = { L2SkillType.BUFF, L2SkillType.DEBUFF, L2SkillType.CONT, L2SkillType.FUSION }; @Override public void useSkill(L2Character activeChar, L2Skill skill, L2Object[] targets) { boolean acted = true; L2PcInstance player = null; if (activeChar.isPlayer()) { player = activeChar.getActingPlayer(); } if (skill.getEffectId() != 0) { L2Skill sk = SkillTable.getInstance().getInfo(skill.getEffectId(), skill.getEffectLvl() == 0 ? 1 : skill.getEffectLvl()); if (sk != null) { skill = sk; } } boolean ss = skill.useSoulShot() && activeChar.isChargedShot(ShotType.SOULSHOTS); boolean sps = skill.useSpiritShot() && activeChar.isChargedShot(ShotType.SPIRITSHOTS); boolean bss = skill.useSpiritShot() && activeChar.isChargedShot(ShotType.BLESSED_SPIRITSHOTS); for (L2Character target : (L2Character[]) targets) { byte shld = 0; if (Formulas.calcBuffDebuffReflection(target, skill)) { target = activeChar; } // Player holding a cursed weapon can't be buffed and can't buff if ((skill.getSkillType() == L2SkillType.BUFF) && !(activeChar instanceof L2ClanHallManagerInstance)) { if (target != activeChar) { if (target.isPlayer()) { L2PcInstance trg = target.getActingPlayer(); if (trg.isCursedWeaponEquipped()) { continue; } else if (trg.getBlockCheckerArena() != -1) { continue; } } else if ((player != null) && player.isCursedWeaponEquipped()) { continue; } } } if (skill.isBad()) { shld = Formulas.calcShldUse(activeChar, target, skill); acted = Formulas.calcSkillSuccess(activeChar, target, skill, shld, ss, sps, bss); } if (acted) { if (skill.isToggle()) { List effects = target.getAllEffects(); if (effects != null) { for (L2Effect e : effects) { if (e != null) { if (e.getSkill().getId() == skill.getId()) { e.exit(); return; } } } } } // if this is a debuff let the duel manager know about it // so the debuff can be removed after the duel // (player & target must be in the same duel) if (target.isPlayer() && target.getActingPlayer().isInDuel() && ((skill.getSkillType() == L2SkillType.DEBUFF) || (skill.getSkillType() == L2SkillType.BUFF)) && (player != null) && (player.getDuelId() == target.getActingPlayer().getDuelId())) { DuelManager dm = DuelManager.getInstance(); for (L2Effect buff : skill.getEffects(activeChar, target, new Env(shld, ss, sps, bss))) { if (buff != null) { dm.onBuff(target.getActingPlayer(), buff); } } } else { List effects = skill.getEffects(activeChar, target, new Env(shld, ss, sps, bss)); L2Summon summon = target.getSummon(); if ((summon != null) && (summon != activeChar) && summon.isServitor() && !effects.isEmpty()) { if (effects.get(0).canBeStolen() || skill.isHeroSkill() || skill.isStatic()) { skill.getEffects(activeChar, target.getSummon(), new Env(shld, ss, sps, bss)); } } } } else { activeChar.sendPacket(SystemMessageId.ATTACK_FAILED); } } // self Effect :] if (skill.hasSelfEffects()) { final L2Effect effect = activeChar.getFirstEffect(skill.getId()); if ((effect != null) && effect.isSelfEffect()) { // Replace old effect with new one. effect.exit(); } skill.getEffectsSelf(activeChar); } activeChar.setChargedShot(bss ? ShotType.BLESSED_SPIRITSHOTS : ShotType.SPIRITSHOTS, false); } @Override public L2SkillType[] getSkillIds() { return SKILL_IDS; } }