Проблема с атакой по NPC

database

Пляшущий с бубном
Участник
Сообщения
66
Розыгрыши
0
Решения
1
Репутация
0
Реакции
9
Баллы
210
Хроники
  1. Interlude
Исходники
Присутствуют
Сборка
l2js
Всех приветствую!

На старых исходниках есть проблема с уроном по NPC: урон составляет 0 (damage). Уже третий день пытаюсь разобраться, как это исправить. Тестировал на других рабочих исходниках — там урон по NPC наносится нормально, и состояние игрока clientStartAutoAttack срабатывает корректно. У меня же, как я писал ранее, при атаке по L2Npc урон равен 0, и clientStartAutoAttack на игроке при уроне по NPC не срабатывает.

Нашёл класс, отвечающий за состояние атаки, — AttackStanceTaskManager, а также класс AbstractAI, который реализует механику состояния комбата и атаки игрока, но это оказалось не то. Случайно обнаружил в конструкторе L2Character, где есть следующий код:

Java:
if (!(this instanceof L2PcInstance) && !(this instanceof L2MonsterInstance) &&
!(this instanceof L2GuardInstance) && !(this instanceof L2SiegeGuardInstance) &&
!(this instanceof L2ControlTowerInstance) && !(this instanceof L2DoorInstance) &&
!(this instanceof L2TrapInstance) && !(this instanceof L2FriendlyMobInstance) &&
!(this instanceof L2DecoyInstance) && !(this instanceof L2SiegeSummonInstance) &&
!(this instanceof L2PetInstance) && !(this instanceof L2SummonInstance) &&
!(this instanceof L2SiegeFlagInstance) && !(this instanceof L2EffectPointInstance) &&
!(this instanceof L2CommanderInstance))
setIsInvul(true);

Этот блок отвечает за установку неуязвимости для объектов, которые не принадлежат ни одному из перечисленных классов. Если я добавлю -
Java:
&&
!(this instanceof L2InstanceInstance

Проблема решается частично, урон наносится по NPC, но он умирает. Самое парадоксальное, на других исходниках это работает нормально, но найти где, я не смог.

Временно решил применить в L2NpcInstance такой вариант:
Java:
    @Override
    public void reduceCurrentHp(double damage, L2Character attacker, boolean awake) {

        if (this instanceof L2NpcInstance && !(this instanceof L2MonsterInstance)) {
            double currentHp = getCurrentHp();
            double newHp = currentHp - damage;

            if (newHp < 1) {
                setCurrentHp(1);
            } else {
                super.reduceCurrentHp(damage, attacker, awake);
            }

            if (attacker instanceof L2PcInstance) {
                ((L2PcInstance) attacker).sendMessage("Я нанес урон NPC.  Он не может умереть.");
            }
        } else {
            super.reduceCurrentHp(damage, attacker, awake);
        }
    }

Скажем так временная заглушка с проверкой, устанавливаем HP в 1, если он опустится ниже, дальше вызываем стандартное поведение. Это работает! Но я не знаю, на сколько это правильно ли работает? В других исходниках к примеру l2j просто нет этого блока:
Java:
if (!(this instanceof L2PcInstance) && !(this instanceof L2MonsterInstance) &&
!(this instanceof L2GuardInstance) && !(this instanceof L2SiegeGuardInstance) &&
!(this instanceof L2ControlTowerInstance) && !(this instanceof L2DoorInstance) &&
!(this instanceof L2TrapInstance) && !(this instanceof L2FriendlyMobInstance) &&
!(this instanceof L2DecoyInstance) && !(this instanceof L2SiegeSummonInstance) &&
!(this instanceof L2PetInstance) && !(this instanceof L2SummonInstance) &&
!(this instanceof L2SiegeFlagInstance) && !(this instanceof L2EffectPointInstance) &&
!(this instanceof L2CommanderInstance))
setIsInvul(true);
 
Оставить как есть, поставив нпсу большое количество хп и добавить скилл сильного регена?
 
Как вариант ввести свойство, условно назовем его к примеру "бессмертие" и вешать его нужным типам вместо неуязвимости.
Ну а свойство это просто не должно давать падать значению хп ниже 1, т.е. нпс будет получать урон, его хп будет падать, но никогда не упадет ниже 1 и значит он не помрет.
 
Значит так и оставлю, главное, чтобы это было логично и правильно.
 
Данный сайт использует cookie. Вы должны принять их для продолжения использования. Узнать больше…