AI в L2jFrozen

Статус
В этой теме нельзя размещать новые ответы.

Execution

Знаменитый
Пользователь
Сообщения
2
Розыгрыши
0
Репутация
0
Реакции
0
Баллы
1 223
Хроники
  1. Interlude
Исходники
Присутствуют
Сборка
L2jFrozen
Всем привет.

Собственно интересует такой вопрос:

Написал АИ для моба, добавил ему скилл чтобы он его юзал при определенных условиях,
Всё ок, юзает-то он его как ему указал, НО!

При сбивании ему каста, он начинает кастовать его по новой (обходя reuseDelay)
И вдобавок, долбит его бесконечно.

И вот интересно как сделать, что-бы он юзал его единоразово, до наступления следующего условия.

@Override
public String onAttack(final L2NpcInstance npc, final L2PcInstance attacker, final int damage, final boolean isPet)
{
if (npc.getNpcId() == TOMB_PREACHER && (npc.getCurrentHp() - damage) < (npc.getMaxHp() / 2))
{
{
npc.setTarget(attacker);
npc.doCast(SkillTable.getInstance().getInfo(4002, 8));
}
}
else if ((npc.getCurrentHp() - damage) < (npc.getMaxHp() / 3))
{
npc.setTarget(attacker);
npc.doCast(SkillTable.getInstance().getInfo(4002, 8));
}
return super.onAttack(npc, attacker, damage, isPet);
}
 
Решение
Всем привет.

Собственно интересует такой вопрос:

Написал АИ для моба, добавил ему скилл чтобы он его юзал при определенных условиях,
Всё ок, юзает-то он его как ему указал, НО!

При сбивании ему каста, он начинает кастовать его по новой (обходя reuseDelay)
И вдобавок, долбит его бесконечно.

И вот интересно как сделать, что-бы он юзал его единоразово, до наступления следующего условия.

@Override
public String onAttack(final L2NpcInstance npc, final L2PcInstance attacker, final int damage, final boolean isPet)
{
if (npc.getNpcId() == TOMB_PREACHER && (npc.getCurrentHp() - damage) < (npc.getMaxHp() / 2))
{
{
npc.setTarget(attacker)...
Обратите внимание, что данный пользователь заблокирован! Не совершайте с ним никаких сделок! Перейдите в его профиль, чтобы узнать причину блокировки.
Всем привет.

Собственно интересует такой вопрос:

Написал АИ для моба, добавил ему скилл чтобы он его юзал при определенных условиях,
Всё ок, юзает-то он его как ему указал, НО!

При сбивании ему каста, он начинает кастовать его по новой (обходя reuseDelay)
И вдобавок, долбит его бесконечно.

И вот интересно как сделать, что-бы он юзал его единоразово, до наступления следующего условия.

@Override
public String onAttack(final L2NpcInstance npc, final L2PcInstance attacker, final int damage, final boolean isPet)
{
if (npc.getNpcId() == TOMB_PREACHER && (npc.getCurrentHp() - damage) < (npc.getMaxHp() / 2))
{
{
npc.setTarget(attacker);
npc.doCast(SkillTable.getInstance().getInfo(4002, 8));
}
}
else if ((npc.getCurrentHp() - damage) < (npc.getMaxHp() / 3))
{
npc.setTarget(attacker);
npc.doCast(SkillTable.getInstance().getInfo(4002, 8));
}
return super.onAttack(npc, attacker, damage, isPet);
}
Java:
   private static long _attackDelay;
    @Override
    public String onAttack(final L2NpcInstance npc, final L2PcInstance attacker, final int damage, final boolean isPet)
    {
        _attackDelay = npc.getAttackEndTime();
        if (npc.getNpcId() == TOMB_PREACHER && (npc.getCurrentHp() - damage) < (npc.getMaxHp() / 2))
        {
            {
                npc.setTarget(attacker);
                npc.doCast(SkillTable.getInstance().getInfo(4002, 8));
            }
        }
        else if ((npc.getCurrentHp() - damage) < (npc.getMaxHp() / 3))
        {
            npc.setTarget(attacker);
        if (System.currentTimeMillis() > _attackDelay) {
                npc.doCast(SkillTable.getInstance().getInfo(4002, 8));
                _attackDelay = System.currentTimeMillis() + 15000L;
            }
        }
        return super.onAttack(npc, attacker, damage, isPet);
    }

на втором скиле пример

Всем привет.

Собственно интересует такой вопрос:

Написал АИ для моба, добавил ему скилл чтобы он его юзал при определенных условиях,
Всё ок, юзает-то он его как ему указал, НО!

При сбивании ему каста, он начинает кастовать его по новой (обходя reuseDelay)
И вдобавок, долбит его бесконечно.

И вот интересно как сделать, что-бы он юзал его единоразово, до наступления следующего условия.

@Override
public String onAttack(final L2NpcInstance npc, final L2PcInstance attacker, final int damage, final boolean isPet)
{
if (npc.getNpcId() == TOMB_PREACHER && (npc.getCurrentHp() - damage) < (npc.getMaxHp() / 2))
{
{
npc.setTarget(attacker);
npc.doCast(SkillTable.getInstance().getInfo(4002, 8));
}
}
else if ((npc.getCurrentHp() - damage) < (npc.getMaxHp() / 3))
{
npc.setTarget(attacker);
npc.doCast(SkillTable.getInstance().getInfo(4002, 8));
}
return super.onAttack(npc, attacker, damage, isPet);
}
или так

Java:
    private static long _attackDelay;
    @Override
    public String onAttack(final L2NpcInstance npc, final L2PcInstance attacker, final int damage, final boolean isPet) {
if (System.currentTimeMillis() > _attackDelay) {
    if (npc.getNpcId() == TOMB_PREACHER && (npc.getCurrentHp() - damage) < (npc.getMaxHp() / 2)) {
        {
            npc.setTarget(attacker);
            ThreadPoolManager.getInstance().executeAi(new useSkill(npc, 4002, 8));
            _attackDelay = System.currentTimeMillis() + 15000L;
        }
    } else if ((npc.getCurrentHp() - damage) < (npc.getMaxHp() / 3)) {
        npc.setTarget(attacker);
        ThreadPoolManager.getInstance().executeAi(new useSkill(npc, 4002, 8));
        _attackDelay = System.currentTimeMillis() + 15000L;

            }
        }
        return super.onAttack(npc, attacker, damage, isPet);
    }
   
    public static class useSkill implements Runnable {
        protected L2NpcInstance _npc;
        protected int _skillId;
        protected int _skillLvl;

        useSkill(L2NpcInstance npc, int skillId, int skillLvl) {
            _npc = npc;
            _skillId = skillId;
            _skillLvl = skillLvl;
        }

        public void run() {
            _npc.doCast(SkillTable.getInstance().getInfo(_skillId, _skillLvl));
        }
    }
 
Решение
Java:
   private static long _attackDelay;
    @Override
    public String onAttack(final L2NpcInstance npc, final L2PcInstance attacker, final int damage, final boolean isPet)
    {
        _attackDelay = npc.getAttackEndTime();
        if (npc.getNpcId() == TOMB_PREACHER && (npc.getCurrentHp() - damage) < (npc.getMaxHp() / 2))
        {
            {
                npc.setTarget(attacker);
                npc.doCast(SkillTable.getInstance().getInfo(4002, 8));
            }
        }
        else if ((npc.getCurrentHp() - damage) < (npc.getMaxHp() / 3))
        {
            npc.setTarget(attacker);
        if (System.currentTimeMillis() > _attackDelay) {
                npc.doCast(SkillTable.getInstance().getInfo(4002, 8));
                _attackDelay = System.currentTimeMillis() + 15000L;
            }
        }
        return super.onAttack(npc, attacker, damage, isPet);
    }

на втором скиле пример
спасибо. первый вариант подошёл тоже)
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху Снизу