- Хроники
- Interlude
- Исходники
- Присутствуют
- Сборка
- l2js
Всех приветствую!
На старых исходниках есть проблема с уроном по NPC: урон составляет 0 (damage). Уже третий день пытаюсь разобраться, как это исправить. Тестировал на других рабочих исходниках — там урон по NPC наносится нормально, и состояние игрока clientStartAutoAttack срабатывает корректно. У меня же, как я писал ранее, при атаке по L2Npc урон равен 0, и clientStartAutoAttack на игроке при уроне по NPC не срабатывает.
Нашёл класс, отвечающий за состояние атаки, — AttackStanceTaskManager, а также класс AbstractAI, который реализует механику состояния комбата и атаки игрока, но это оказалось не то. Случайно обнаружил в конструкторе L2Character, где есть следующий код:
Этот блок отвечает за установку неуязвимости для объектов, которые не принадлежат ни одному из перечисленных классов. Если я добавлю -
Проблема решается частично, урон наносится по NPC, но он умирает. Самое парадоксальное, на других исходниках это работает нормально, но найти где, я не смог.
Временно решил применить в L2NpcInstance такой вариант:
Скажем так временная заглушка с проверкой, устанавливаем HP в 1, если он опустится ниже, дальше вызываем стандартное поведение. Это работает! Но я не знаю, на сколько это правильно ли работает? В других исходниках к примеру l2j просто нет этого блока:
На старых исходниках есть проблема с уроном по 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);