@Override public boolean onActionTime() { if (getCount() == getTotalCount() - 1) return true; // do nothing first time L2PcInstance caster = (L2PcInstance) getEffector(); for (L2Character target : _actor.getKnownList().getKnownCharactersInRadius(getSkill().getSkillRadius())) { if (target == null || target == caster) continue; if (caster.canAttackCharacter(target)) { L2Effect[] effects = target.getAllEffects(); if (effects != null) { for (L2Effect effect : effects) { if (effect.getSkill().isDance()) effect.exit(); } } } } return true; }
@Override public void useSkill(L2Character activeChar, L2Object[] targets) { if (activeChar.isAlikeDead()) { return; } boolean ss = useSoulShot() && activeChar.isChargedShot(ShotType.SOULSHOTS); boolean sps = useSpiritShot() && activeChar.isChargedShot(ShotType.SPIRITSHOTS); boolean bss = useSpiritShot() && activeChar.isChargedShot(ShotType.BLESSED_SPIRITSHOTS); for (L2Character target : (L2Character[]) targets) { if (target.isAlikeDead() && (getTargetType() != L2TargetType.CORPSE_MOB)) { continue; } if ((activeChar != target) && target.isInvul()) { continue; // No effect on invulnerable chars unless they cast it themselves. } boolean mcrit = Formulas.calcMCrit(activeChar.getMCriticalHit(target, this)); byte shld = Formulas.calcShldUse(activeChar, target, this); int damage = isStaticDamage() ? (int) getPower() : (int) Formulas.calcMagicDam(activeChar, target, this, shld, sps, bss, mcrit); int _drain = 0; int _cp = (int) target.getCurrentCp(); int _hp = (int) target.getCurrentHp(); if (_cp > 0) { if (damage < _cp) { _drain = 0; } else { _drain = damage - _cp; } } else if (damage > _hp) { _drain = _hp; } else { _drain = damage; } double hpAdd = _absorbAbs + (_absorbPart * _drain); double hp = ((activeChar.getCurrentHp() + hpAdd) > activeChar.getMaxHp() ? activeChar.getMaxHp() : (activeChar.getCurrentHp() + hpAdd)); activeChar.setCurrentHp(hp); StatusUpdate suhp = new StatusUpdate(activeChar); suhp.addAttribute(StatusUpdate.CUR_HP, (int) hp); activeChar.sendPacket(suhp); // Check to see if we should damage the target if ((damage > 0) && (!target.isDead() || (getTargetType() != L2TargetType.CORPSE_MOB))) { // Manage attack or cast break of the target (calculating rate, sending message...) if (!target.isRaid() && Formulas.calcAtkBreak(target, damage)) { target.breakAttack(); target.breakCast(); } activeChar.sendDamageMessage(target, damage, mcrit, false, false); if (Config.LOG_GAME_DAMAGE && activeChar.isPlayable() && (damage > Config.LOG_GAME_DAMAGE_THRESHOLD)) { LogRecord record = new LogRecord(Level.INFO, ""); record.setParameters( new Object[] {activeChar, " did damage ", damage, this, " to ", target}); record.setLoggerName("mdam"); _logDamage.log(record); } if (hasEffects() && (getTargetType() != L2TargetType.CORPSE_MOB)) { // ignoring vengance-like reflections if ((Formulas.calcSkillReflect(target, this) & Formulas.SKILL_REFLECT_SUCCEED) > 0) { activeChar.stopSkillEffects(getId()); getEffects(target, activeChar); SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.YOU_FEEL_S1_EFFECT); sm.addSkillName(getId()); activeChar.sendPacket(sm); } else { // activate attacked effects, if any target.stopSkillEffects(getId()); if (Formulas.calcSkillSuccess(activeChar, target, this, shld, ss, sps, bss)) { getEffects(activeChar, target); } else { SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.C1_RESISTED_YOUR_S2); sm.addCharName(target); sm.addSkillName(this); activeChar.sendPacket(sm); } } } target.reduceCurrentHp(damage, activeChar, this); } // Check to see if we should do the decay right after the cast if (target.isDead() && (getTargetType() == L2TargetType.CORPSE_MOB) && target.isNpc()) { ((L2Npc) target).endDecayTask(); } } // effect self :] L2Effect effect = activeChar.getFirstEffect(getId()); if ((effect != null) && effect.isSelfEffect()) { // Replace old effect with new one. effect.exit(); } // cast self effect if any getEffectsSelf(activeChar); // Consume shot activeChar.setChargedShot(bss ? ShotType.BLESSED_SPIRITSHOTS : ShotType.SPIRITSHOTS, false); }
@Override public void onExit() { getEffected().stopAbnormalEffect(AbnormalEffect.HOLD_2); getEffected().stopParalyze(false); super.onExit(); }
public ConfirmDlg addSkillName(L2Effect effect) { return addSkillName(effect.getSkill()); }