Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
Механизм возвращения мобов на место спавна
#1
Всем доброго времени суток!
В общем, суть изложена в сабже, но на всякий постараюсь уточнить: нужно вставить в сборку (сорсы имеются) механизм, чтобы при оттягивании мобов далеко от своего места спавна - они бежали обратно и были неуязвимы в этот момент. Буду крайне признателен примерам реализации и всяческой помощи с вашей стороны.
Ответ
#2
К сожалению не разбирался с таким вот действием но точно знаю что на фенексе это сделано...
[Изображение: guru.gif] Сижу на zone-game, помогаю и напрягаю других.
Ответ
#3
Это не вставить в борку - это просто нужно дописать для АИ мобов в базовом классе.
Ответ
#4
зачем напрягать сервер ходьбой мобов назад ?
просто телепай их xD
Ответ
#5
Ну я это тоже имел ввиду (тп назад, и еще для красоты поставить юз скила тп), топать назад - не всегда получится через геодату.
Ответ
#6
Visor Написал:Ну я это тоже имел ввиду (тп назад, и еще для красоты поставить юз скила тп), топать назад - не всегда получится через геодату.
а это уже проблемы сервера, а не геодаты
Ответ
#7
Что значить проблема сервера, а не геодаты? глупость какая) это все вопрос сервера, а не геодаты - геодата сама по себе ничего не делает - это набор массивов.
Ответ
#8
Мужик не гони, я же тебе сказал поищи в фенексе...

вот я на скорую руку за 30 сек нашол класс хз не розберался но почему т опоказалось именно то что тебе нужно....
Код:
package l2p.gameserver.ai;

import l2p.gameserver.geodata.GeoEngine;
import l2p.gameserver.model.L2Character;
import l2p.gameserver.model.instances.L2NpcInstance;

public class Ranger extends DefaultAI
{
    public Ranger(L2Character actor)
    {
        super(actor);
    }

    @Override
    protected boolean thinkActive()
    {
        return super.thinkActive() || defaultThinkBuff(10);
    }

    @Override
    protected void onEvtAttacked(L2Character attacker, int damage)
    {
        super.onEvtAttacked(attacker, damage);
        L2NpcInstance actor = getActor();
        if(actor == null || actor.isDead() || attacker == null || actor.getDistance(attacker) > 200)
        {
            return;
        }
        for(Task task : _task_list)
        {
            if(task != null && task.type == TaskType.MOVE)
            {
                return;
            }
        }
        int posX = actor.getX();
        int posY = actor.getY();
        int posZ = actor.getZ();
        int old_posX = posX;
        int old_posY = posY;
        int old_posZ = posZ;
        int signx = posX < attacker.getX() ? -1 : 1;
        int signy = posY < attacker.getY() ? -1 : 1;
        // int range = (int) ((actor.calculateAttackSpeed()  /1000 * actor.getWalkSpeed() )* 0.71); // was "actor.getPhysicalAttackRange()"    0.71 = sqrt(2) / 2
        int range = (int) (0.71 * actor.calculateAttackDelay() / 1000 * actor.getMoveSpeed());
        posX += signx * range;
        posY += signy * range;
        posZ = GeoEngine.getHeight(posX, posY, posZ, actor.getReflection().getGeoIndex());
        if(GeoEngine.canMoveToCoord(old_posX, old_posY, old_posZ, posX, posY, posZ, actor.getReflection().getGeoIndex()))
        {
            addTaskMove(posX, posY, posZ, false);
            addTaskAttack(attacker);
        }
    }

    @Override
    protected boolean createNewTask()
    {
        return defaultFightTask();
    }

    @Override
    public int getRatePHYS()
    {
        return 25;
    }

    @Override
    public int getRateDOT()
    {
        return 40;
    }

    @Override
    public int getRateDEBUFF()
    {
        return 25;
    }

    @Override
    public int getRateDAM()
    {
        return 50;
    }

    @Override
    public int getRateSTUN()
    {
        return 50;
    }

    @Override
    public int getRateBUFF()
    {
        return 5;
    }

    @Override
    public int getRateHEAL()
    {
        return 50;
    }
}
[Изображение: guru.gif] Сижу на zone-game, помогаю и напрягаю других.
Ответ
#9
Visor Написал:Что значить проблема сервера, а не геодаты? глупость какая) это все вопрос сервера, а не геодаты - геодата сама по себе ничего не делает - это набор массивов.
вот именно, как ее обрабатывать и тд написано в сервере:redlol:
если обьект не может дойти куда нужно, то это уже проблемы геодвижка
Ответ
#10
Astend Написал:Мужик не гони, я же тебе сказал поищи в фенексе...

вот я на скорую руку за 30 сек нашол класс хз не розберался но почему т опоказалось именно то что тебе нужно....
Код:
package l2p.gameserver.ai;

import l2p.gameserver.geodata.GeoEngine;
import l2p.gameserver.model.L2Character;
import l2p.gameserver.model.instances.L2NpcInstance;

public class Ranger extends DefaultAI
{
    public Ranger(L2Character actor)
    {
        super(actor);
    }

    @Override
    protected boolean thinkActive()
    {
        return super.thinkActive() || defaultThinkBuff(10);
    }

    @Override
    protected void onEvtAttacked(L2Character attacker, int damage)
    {
        super.onEvtAttacked(attacker, damage);
        L2NpcInstance actor = getActor();
        if(actor == null || actor.isDead() || attacker == null || actor.getDistance(attacker) > 200)
        {
            return;
        }
        for(Task task : _task_list)
        {
            if(task != null && task.type == TaskType.MOVE)
            {
                return;
            }
        }
        int posX = actor.getX();
        int posY = actor.getY();
        int posZ = actor.getZ();
        int old_posX = posX;
        int old_posY = posY;
        int old_posZ = posZ;
        int signx = posX < attacker.getX() ? -1 : 1;
        int signy = posY < attacker.getY() ? -1 : 1;
        // int range = (int) ((actor.calculateAttackSpeed()  /1000 * actor.getWalkSpeed() )* 0.71); // was "actor.getPhysicalAttackRange()"    0.71 = sqrt(2) / 2
        int range = (int) (0.71 * actor.calculateAttackDelay() / 1000 * actor.getMoveSpeed());
        posX += signx * range;
        posY += signy * range;
        posZ = GeoEngine.getHeight(posX, posY, posZ, actor.getReflection().getGeoIndex());
        if(GeoEngine.canMoveToCoord(old_posX, old_posY, old_posZ, posX, posY, posZ, actor.getReflection().getGeoIndex()))
        {
            addTaskMove(posX, posY, posZ, false);
            addTaskAttack(attacker);
        }
    }

    @Override
    protected boolean createNewTask()
    {
        return defaultFightTask();
    }

    @Override
    public int getRatePHYS()
    {
        return 25;
    }

    @Override
    public int getRateDOT()
    {
        return 40;
    }

    @Override
    public int getRateDEBUFF()
    {
        return 25;
    }

    @Override
    public int getRateDAM()
    {
        return 50;
    }

    @Override
    public int getRateSTUN()
    {
        return 50;
    }

    @Override
    public int getRateBUFF()
    {
        return 5;
    }

    @Override
    public int getRateHEAL()
    {
        return 50;
    }
}

на сколько я понял, то, что вы скинули отвечает за подбегание к персонажу.
Ответ


Возможно похожие темы ...
Тема Автор Ответы Просмотры Последний пост
  Нет агра мобов при дебафе. pindossia 4 1,651 09-20-2015, 02:23 PM
Последний пост: Zeratyl
  АИ мобов kasper 4 2,091 05-08-2015, 09:00 AM
Последний пост: ExLite
  Знаки вопроса место русского титула Intelect 7 2,168 05-05-2014, 02:07 AM
Последний пост: pchayka
  дроп с мобов twist911 22 3,544 08-26-2013, 03:37 PM
Последний пост: L2scripts-Guard
  Нет передвижения мобов в сборке MuHek 0 1,148 07-31-2013, 10:59 PM
Последний пост: MuHek
  Scroll Buff с мобов [interlude] Tolkachev 2 1,691 04-10-2013, 12:35 AM
Последний пост: SunWar
  лвл мобов bybs 8 3,490 11-23-2012, 12:18 AM
Последний пост: bybs
  Место проведения эвента Deron 9 2,631 10-18-2011, 12:23 AM
Последний пост: sklerozua
  Карты мобов KyleshiK 5 2,354 09-15-2011, 11:46 PM
Последний пост: TorPark
  aggro у мобов Midnayt 1 1,700 05-20-2011, 12:14 AM
Последний пост: [STIGMATED]

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


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