Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
На персонаже не работает reflectDam
#1
Сборка L2Open, Ситуация:
Все скиллы использующие параметр:
Код:
<add order="0x40" stat="reflectDam" val="N" />
На мобах работают, на персонажах нет. Т.е. если на мобе (РБ) скилл ID:4214 и его бьет персонаж - то возвращается 20% нанесенного урона обратно персонажу.
Если же на персонаже скилл или ДС с возвратом урона - когда бьют мобы этого персонажа, им урон не возвращается.
L2Character.java не трогал, там все как было еще с фениксов:
Код:
        if(skill != null && skill.isMagic())
            value = target.calcStat(Stats.REFLECT_MSKILL_DAMAGE_PERCENT, 0, this, skill);
        else if(skill != null && skill.getCastRange() <= 200)
            value = target.calcStat(Stats.REFLECT_PSKILL_DAMAGE_PERCENT, 0, this, skill);
        else if(skill == null && !bow)
            value = target.calcStat(Stats.REFLECT_DAMAGE_PERCENT, 0, this, null);

        if(value > 0)
            applyReflectDamage(target, damage, value);

        if(skill != null || bow)
            return false;

    public void applyReflectDamage(L2Character target, double damage, double reflect)
    {
        double rdmg = damage * reflect / 100.;
        rdmg = Math.min(rdmg, target.getCurrentHp());
        if(isPlayable() && !target.isNpc())
            reduceCurrentHp(rdmg, this, null, true, true, false, false);
        else
            reduceCurrentHp(rdmg, target, null, true, true, false, false);
        if(target.isPlayer() && rdmg >= 1.)
            target.sendPacket(new SystemMessage(SystemMessage.C1_HAS_GIVEN_C2_DAMAGE_OF_S3).addName(target).addName(this).addNumber((long) rdmg));
    }
Подскажите где копать? Может я где-то в датапаке косякнул?
Ответ
#2
if(isPlayable() && !target.isNpc())
и
reduceCurrentHp
можно разобрать? Или на уровне проверки не выполняется, или не тот обьект в ф-цию отправляется.
Ответ
#3
Опять повторюсь, я L2Character.java не трогал, там все так, как было и как работало. И в принципе этот парамерт скилла работает, но только на мобах, а на персонажах нет. Для чистоты эксперимента я даже кидал на себя скилл 4214.
Код:
    public void reduceCurrentHp(double i, L2Character attacker, L2Skill skill, boolean awake, boolean standUp, boolean directHp, boolean canReflect)
    {
        fireMethodInvoked(MethodCollection.ReduceCurrentHp, new Object[] { i, attacker, skill, awake, standUp, directHp, });

        if(attacker == null || isDead() || attacker.isDead())
            return;

        if(isInvul() && attacker != this)
        {
            attacker.sendPacket(Msg.THE_ATTACK_HAS_BEEN_BLOCKED);
            return;
        }

        // 5182 = Blessing of protection, работает если разница уровней больше 10 и не в зоне осады
        if(attacker.isPlayer() && Math.abs(attacker.getLevel() - getLevel()) > 10)
        {
            // ПК не может нанести урон чару с блессингом
            if(attacker.getKarma() > 0 && getEffectList().getEffectsBySkillId(5182) != null && !isInZone(ZoneType.Siege))
                return;
            // чар с блессингом не может нанести урон ПК
            if(getKarma() > 0 && attacker.getEffectList().getEffectsBySkillId(5182) != null && !attacker.isInZone(ZoneType.Siege))
                return;
        }

        if(awake && isSleeping())
            getEffectList().stopEffects(EffectType.Sleep);

        if(isMeditated() && attacker != this)
        {
            L2Effect effect = getEffectList().getEffectByType(EffectType.Meditation);
            if(effect != null)
            {
                GArray<L2Effect> effects = getEffectList().getEffectsBySkill(effect.getSkill());
                if(effects != null)
                    for(L2Effect ef : effects)
                        if(ef.getEffectType() != EffectType.Debuff)
                            ef.exit();
            }
        }

        if(standUp && isPlayer())
        {
            standUp();
            if(isFakeDeath())
            {
                L2Effect fakeDeath = getEffectList().getEffectByType(EffectType.FakeDeath);
                if(fakeDeath == null)
                    stopFakeDeath();
                else if(fakeDeath.getTime() > 2000)
                    getEffectList().stopEffects(EffectType.FakeDeath);
            }
        }

        if(attacker != this)
        {
            startAttackStanceTask();
            if(isInvisible() && getEffectList().getEffectByType(EffectType.Invisible) != null)
                getEffectList().stopEffects(EffectType.Invisible);
        }

        if(canReflect && attacker.absorbAndReflect(this, skill, i))
            return;

        if(attacker.isPlayable())
        {
            L2Playable pAttacker = (L2Playable) attacker;

            // Flag the attacker if it's a L2Player outside a PvP area
            if(!isDead() && pAttacker.checkPvP(this, null))
                pAttacker.startPvPFlag(this);

            if(isMonster() && skill != null && skill.isOverhit())
            {
                // Calculate the over-hit damage
                // Ex: mob had 10 HP left, over-hit skill did 50 damage total, over-hit damage is 40
                double overhitDmg = (_currentHp - i) * -1;
                if(overhitDmg <= 0)
                {
                    setOverhitDamage(0);
                    setOverhitAttacker(null);
                }
                else
                {
                    setOverhitDamage(overhitDmg);
                    setOverhitAttacker(attacker);
                }
            }

            double ii;
            if(!directHp && _currentCp > 0)
            {
                i = _currentCp - i;
                ii = i;

                if(ii < 0)
                    ii *= -1;

                if(i < 0)
                    i = 0;

                setCurrentCp(i);
            }
            else
                ii = i;

            if(_currentCp == 0 || directHp)
            {
                ii = _currentHp - ii;

                if(ii < 0)
                    ii = 0;

                if(isNpc())
                    pAttacker.addDamage((L2NpcInstance) this, (int) (_currentHp - ii));

                if(!onDieTrigger && ii < 0.5 && _skillsOnAction != null)
                {
                    onDieTrigger = true;
                    ConcurrentLinkedQueue<L2Skill> SkillsOnDie = _skillsOnAction.get(TriggerActionType.DIE);
                    if(SkillsOnDie != null)
                        for(L2Skill sk : SkillsOnDie)
                            if(Rnd.chance(sk.getChanceForAction(TriggerActionType.DIE)))
                                useActionSkill(sk, this, attacker);
                    onDieTrigger = false;
                }

                setCurrentHp(ii, false);
            }
        }
        else
        {
            if(_currentHp - i < 0.5)
                useActionSkill(null, this, this, TriggerActionType.DIE);

            setCurrentHp(Math.max(_currentHp - i, 0), false);
        }

        if(isDead())
            doDie(attacker);
    }
Ответ
#4
ntking Написал:Опять повторюсь, я L2Character.java не трогал
давно уже пора потрогать Big Grin поставь пару брекпоинтов и решишь проблему
Ответ
#5
i_am_kisly Написал:давно уже пора потрогать Big Grin поставь пару брекпоинтов и решишь проблему
Спасибо за совет, но я не настолько знаю язык, чтобы поставить брики в то место, где они нужны((
Меня, как PHP программера смущает условие:
Код:
if(isPlayable() && !target.isNpc())
            reduceCurrentHp(rdmg, this, null, true, true, false, false);
Возможно оно тупо не выполняется и из-за этого дамаг от игрока не возвращается, а вот игроку как раз возвращается, т.к. срабатывает else .
Возможно в !target.isNpc()) лишний восклицательный знак. Т.е. условие срабатывает только на других игроках, а на NPC - нет. Попробую в PVP, возвращается ли урон от игрока игроку.
Ответ
#6
Знач пошагово вообще)))
Ответ
#7
Глянул код у лыж, там вообще никаких условий нет, кто кого дамажет:
Код:
// Reduce HP of the target and calculate reflection damage to reduce HP of attacker if necessary
                    double reflectPercent = target.getStat().calcStat(Stats.REFLECT_DAMAGE_PERCENT, 0, null, null);
                    
                    if (reflectPercent > 0)
                    {
                        reflectedDamage = (int) ((reflectPercent / 100.) * damage);
                        
                        if (reflectedDamage > target.getMaxHp())
                        {
                            reflectedDamage = target.getMaxHp();
                        }
                    }
                }
            }
            
            // reduce targets HP
            target.reduceCurrentHp(damage, this, null);
            target.notifyDamageReceived(damage, this, null, crit, false);
            
            if (reflectedDamage > 0)
            {
                reduceCurrentHp(reflectedDamage, target, true, false, null);
                notifyDamageReceived(reflectedDamage, target, null, crit, false);
            }
Глянул исходники L2Emu - там рефлект закомментирован :eek:
Жесть какая-то))) Жаль, Diagod'a нет, он то свой код знает... хотя, код это фениксов, но всеравно, он же с ним работал.
Ответ
#8
Нужен код вот этого:
Цитата: else if(skill == null && !bow)
value = target.calcStat(Stats.REFLECT_DAMAGE_PERCENT, 0, this, null);
Скорее всего там return 0; из-за чего и не рефлектит. Вообще автор пишите в скайп Zubastic32. Вечером глянем.
[Изображение: 4e38c909fcd08c5fcdf363b54a62.png]
Ответ
#9
Zubastic Написал:Нужен код вот этого:

Скорее всего там return 0; из-за чего и не рефлектит. Вообще автор пишите в скайп Zubastic32. Вечером глянем.
Нее, тут то как раз все нормально, словами:
если не скилл и не лук, то высчитываем рефлект, взяв из статов.
Если бы это условие не работало, то от мобов не рефлектило бы.
Ответ
#10
PHP код:
<?php 
if(isPlayable() && !target.isNpc())
reduceCurrentHp(rdmg, this, null, true, true, false, false);
else
reduceCurrentHp(rdmg, target, null, true, true, false, false);
Ну условие должно смущать

вместо всего блога оставьте только это
reduceCurrentHp(rdmg, target, null, true, true, false, false);

хотя....

посмотрите, что в методе attacker.absorbAndReflect

PHP код:
<?php 
if(canReflect && attacker.absorbAndReflect(this, skill, i))
return;

я думаю там, нас ждет подсказка, в интересном приключении, l2j core
Ответ


Возможно похожие темы ...
Тема Автор Ответы Просмотры Последний пост
  Не работает пати на 530 протоколе Magican 0 943 01-19-2021, 07:47 PM
Последний пост: Magican
  Не работает Заточка в сборке Essence Lord_Gothic 8 2,888 12-05-2018, 08:34 PM
Последний пост: Lord_Gothic
  не работает colspan Rovskoi 8 2,935 06-28-2018, 11:59 AM
Последний пост: Main
  Не работает Amidamaru 7 2,253 04-29-2016, 09:12 AM
Последний пост: Amidamaru
  Lucera1-2 не работает респ эпиков Dr.Who 19 3,802 01-28-2016, 06:46 AM
Последний пост: Deazer
  Как работает пакет RequestBBSwrite? Johnson 2 1,296 02-01-2015, 09:34 PM
Последний пост: Johnson
  Не работает осада замка luckyPerson 5 1,658 06-13-2014, 07:54 PM
Последний пост: Donatte
  Не работает бафф меню в комунити sullen.nv 6 2,330 01-19-2014, 07:07 PM
Последний пост: sullen.nv
  Не работает автозагрузка сервера vokforever 3 1,375 10-26-2013, 07:37 PM
Последний пост: xolseg
  Не работает логин сервер betty 3 2,787 08-08-2013, 02:04 PM
Последний пост: linliss

Перейти к форуму:


Пользователи, просматривающие эту тему: 1 Гость(ей)