Перейти к содержанию
Авторизация  
Wollandessa

Респ Фонтанов Тиады

Рекомендуемые сообщения

Всем привет парни , натолкните пожалуйста. При проверке инстансы Тиады оказалось что фонтаны тут же респаются в течение секунд 10 , мобов с них очень много вылазиет и все они этим полчищем валят игроков. Нашел id этих фонтанов - 18696 - но почему то в базе нигде нет их  данных в плане редактирования их респа. Тыкните пожалуйста куда копать, в spawnlist нет, в npc - только сами статы. Сборка Дениса, Open-Team.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Скорее всего через AI той же Тиат спавн идет. Ищи в скриптах по ид, где эти фонтаны упоминаются и дальше уже разбирайся что и как.

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Gaikotsu, спасибо большое,нашел в АИ  айди этого моба со следующим кодом. 

private static final int TIAT_TRANSFORMATION_SKILL_ID = 5974;
    private static final L2Skill TIAT_TRANSFORMATION_SKILL = SkillTable.getInstance().getInfo(TIAT_TRANSFORMATION_SKILL_ID, 1);
    private boolean _notUsedTransform = true;
    private static final int TRAPS_COUNT = 4;
    private static final Location[] TRAP_LOCS =
    {
        new Location(-248776, 206872, -11968),
        new Location(-252024, 206872, -11968),
        new Location(-251544, 209592, -11968),
        new Location(-249256, 209592, -11968)
    };
    private ArrayList<L2MonsterInstance> _traps = new ArrayList<L2MonsterInstance>(TRAPS_COUNT);
    private ScheduledFuture<?> _trapsSpawnTask;
    private ScheduledFuture<?> _DeadMovieTask;
    private static final long TRAPS_SPAWN_INTERVAL = 3 * 60 * 1000; // 3 РјРёРЅ
    private static final long COLLAPSE_BY_INACTIVITY_INTERVAL = 10 * 60 * 1000; // 10 РјРёРЅ
    private long _lastAttackTime = 0;
    private static final int TRAP_NPC_ID = 18696;
    private static final int TIAT_MINION_ID = 29162;
    private long _lastFactionNotifyTime = 0;


Подскажите где что поменять чтобы респ  фонтанов стал минуты 2 хотя бы а не 30 секунд.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Там же в коде нужно смотреть как сделан спаун этих фонтанов, вероятно там явно указано время, а не переменная TRAPS_SPAWN_INTERVAL, что то вроде этого:

actor.getReflection().addSpawnWithRespawn(TRAP_NPC_ID, TRAP_LOCS, 0, тут время);

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Весь лог АИ Тиады ! Так и не нашел респа - тыкните пожалуйста носом)

  

package ai;

import java.util.ArrayList;
import java.util.concurrent.ScheduledFuture;

import l2open.common.*;
import l2open.config.ConfigValue;
import l2open.gameserver.ai.CtrlEvent;
import l2open.gameserver.ai.Fighter;
import l2open.gameserver.idfactory.IdFactory;
import l2open.gameserver.instancemanager.ServerVariables;
import l2open.gameserver.model.L2Character;
import l2open.gameserver.model.L2Player;
import l2open.gameserver.model.L2Skill;
import l2open.gameserver.model.Reflection;
import l2open.gameserver.model.instances.L2MonsterInstance;
import l2open.gameserver.model.instances.L2NpcInstance;
import l2open.gameserver.serverpackets.ExShowScreenMessage;
import l2open.gameserver.serverpackets.ExStartScenePlayer;
import l2open.gameserver.serverpackets.ExShowScreenMessage.ScreenMessageAlign;
import l2open.gameserver.tables.NpcTable;
import l2open.gameserver.tables.SkillTable;
import l2open.util.Location;
import l2open.util.Log;

/**
 * AI Р±РѕСЃР° Tiat (ID: 29163).
 *
 * @author SYS
 */
public class Tiat extends Fighter
{
    private static final int TIAT_TRANSFORMATION_SKILL_ID = 5974;
    private static final L2Skill TIAT_TRANSFORMATION_SKILL = SkillTable.getInstance().getInfo(TIAT_TRANSFORMATION_SKILL_ID, 1);
    private boolean _notUsedTransform = true;
    private static final int TRAPS_COUNT = 4;
    private static final Location[] TRAP_LOCS =
    {
        new Location(-248776, 206872, -11968),
        new Location(-252024, 206872, -11968),
        new Location(-251544, 209592, -11968),
        new Location(-249256, 209592, -11968)
    };
    private ArrayList<L2MonsterInstance> _traps = new ArrayList<L2MonsterInstance>(TRAPS_COUNT);
    private ScheduledFuture<?> _trapsSpawnTask;
    private ScheduledFuture<?> _DeadMovieTask;
    private static final long TRAPS_SPAWN_INTERVAL = 3 * 60 * 1000; // 3 РјРёРЅ
    private static final long COLLAPSE_BY_INACTIVITY_INTERVAL = 10 * 60 * 1000; // 10 РјРёРЅ
    private long _lastAttackTime = 0;
    private static final int TRAP_NPC_ID = 18696;
    private static final int TIAT_MINION_ID = 29162;
    private long _lastFactionNotifyTime = 0;

    public Tiat(L2Character actor)
    {
        super(actor);
    }

    @Override
    public boolean isGlobalAI()
    {
        return true;
    }

    @Override
    protected void onEvtSpawn()
    {
        L2NpcInstance actor = getActor();
        if(actor == null)
            return;

        actor.p_block_move(true, null);
    }

    @Override
    protected void ATTACKED(L2Character attacker, int damage, L2Skill skill)
    {
        L2NpcInstance actor = getActor();
        if(actor == null)
            return;

        _lastAttackTime = System.currentTimeMillis();

        if(_notUsedTransform && actor.getCurrentHpPercents() < 50)
        {
            actor.p_block_move(false, null);
            _notUsedTransform = false;

            // Если РІРґСЂСѓРі запущен таск, останавливаем его 
            if(_trapsSpawnTask != null)
            {
                System.out.println("WARNING! Tiat AI: _trapsSpawnTask already running!");
                _trapsSpawnTask.cancel(true);
                _trapsSpawnTask = null;
            }
            _trapsSpawnTask = ThreadPoolManager.getInstance().scheduleAtFixedRate(new TrapsSpawnTask(), 1, TRAPS_SPAWN_INTERVAL);

            clearTasks();
            addTaskBuff(actor, TIAT_TRANSFORMATION_SKILL);
        }

        if(System.currentTimeMillis() - _lastFactionNotifyTime > actor.minFactionNotifyInterval)
        {
            for(L2NpcInstance npc : actor.getAroundNpc(10000, 500))
                if(npc.getNpcId() == TIAT_MINION_ID)
                    npc.getAI().notifyEvent(CtrlEvent.EVT_AGGRESSION, new Object[] { attacker, 1 });

            _lastFactionNotifyTime = System.currentTimeMillis();
        }

        super.ATTACKED(attacker, damage, skill);
    }

    @Override
    protected boolean thinkActive()
    {
        L2NpcInstance actor = getActor();
        if(actor == null || actor.isDead())
            return true;

        // Коллапсируем инстанс, если Тиата РЅРµ били более 10 РјРёРЅ
        if(_lastAttackTime != 0 && _lastAttackTime + COLLAPSE_BY_INACTIVITY_INTERVAL < System.currentTimeMillis())
        {
            final Reflection r = actor.getReflection();

            // Очищаем инстанс, запускаем 5 РјРёРЅ коллапс
            r.clearReflection(5, true);

            // Показываем финальный ролик РїСЂРё фейле серез секунду после очистки инстанса
            ThreadPoolManager.getInstance().schedule(new RunnableImpl(){
                @Override
                public void runImpl()
                {
                    for(L2Player pl : r.getPlayers())
                        if(pl != null)
                            pl.showQuestMovie(ExStartScenePlayer.SCENE_TIAT_FAIL);
                }
            }, 1000);

            return true;
        }

        return super.thinkActive();
    }

    @Override
    protected void MY_DYING(L2Character killer)
    {
        _notUsedTransform = true;
        _lastAttackTime = 0;
        _lastFactionNotifyTime = 0;
        if(_trapsSpawnTask != null)
        {
            _trapsSpawnTask.cancel(true);
            _trapsSpawnTask = null;
        }

        L2NpcInstance actor = getActor();
        if(actor == null)
            return;

        // Переключаем SoD РІ режим СЃР±РѕСЂР° атрибут камней
        if(actor.getTemplate().killscount >= ConfigValue.SeedofDestructionOpenKillFirst && actor.getTemplate().killscount % ConfigValue.SeedofDestructionOpenKill == 0)
            if(ServerVariables.getLong("SoD_opened", 0) * 1000L + ConfigValue.SeedofDestructionOpenTime * 60 * 60 * 1000L < System.currentTimeMillis())
                ServerVariables.set("SoD_opened", System.currentTimeMillis() / 1000L);

        final Reflection r = actor.getReflection();
        r.setReenterTime();
        for(L2NpcInstance npc : r.getNpcs())
            if(npc != null)
                npc.deleteMe();

        // Очищаем инстанс, запускаем 5 РјРёРЅ коллапс
        r.clearReflection(5, true);

        // Показываем финальный ролик серез секунду после очистки инстанса
        if(_DeadMovieTask == null)
            _DeadMovieTask = ThreadPoolManager.getInstance().schedule(new MovieTask(r), 1000);
    }
    
    public class MovieTask extends l2open.common.RunnableImpl
    {
        private Reflection _r;
        
        public MovieTask(Reflection r)
        {
            _r = r;
        }
        
        public void runImpl()
        {
            for(L2Player pl : _r.getPlayers())
                if(pl != null)
                    pl.showQuestMovie(ExStartScenePlayer.SCENE_TIAT_SUCCESS);
        }
    }

    @Override
    protected boolean randomWalk()
    {
        return false;
    }

    public class TrapsSpawnTask extends l2open.common.RunnableImpl
    {
        public void runImpl()
        {
            L2NpcInstance actor = getActor();
            if(actor == null || actor.isDead())
                return;
            actor.broadcastPacket(new ExShowScreenMessage("Воины защитите свою Королеву.", 3000, ScreenMessageAlign.MIDDLE_CENTER, false));
            Reflection r = actor.getReflection();
            for(int index = 0; index < TRAPS_COUNT; index++)
            {
                // РќРµ спауним ловушки, если РѕРЅРё уже есть РІ том месте
                L2MonsterInstance oldTrap = null;
                if(index < _traps.size())
                    oldTrap = _traps.get(index);
                if(oldTrap != null && !oldTrap.isDead())
                    continue;

                L2MonsterInstance trap = new L2MonsterInstance(IdFactory.getInstance().getNextId(), NpcTable.getTemplate(TRAP_NPC_ID));
                trap.setSpawnedLoc(TRAP_LOCS[index]);
                trap.setReflection(r);
                trap.onSpawn();
                trap.spawnMe(trap.getSpawnedLoc());
                r.addSpawn(trap.getSpawn());
                Log.add("TrapsSpawnTask["+trap+"]["+r+"]: "+trap.getLoc(), "debug_tiat_spawn");
                if(index < _traps.size())
                    _traps.remove(index);
                _traps.add(index, trap);
            }
        }
    }

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нашел именно АИ этого НПСа. Но респа все равно не вижу 

package ai;

import java.util.concurrent.ScheduledFuture;

import l2open.common.ThreadPoolManager;
import l2open.gameserver.ai.CtrlEvent;
import l2open.gameserver.ai.DefaultAI;
import l2open.gameserver.idfactory.IdFactory;
import l2open.gameserver.model.L2Character;
import l2open.gameserver.model.L2ObjectsStorage;
import l2open.gameserver.model.Reflection;
import l2open.gameserver.model.instances.L2MonsterInstance;
import l2open.gameserver.model.instances.L2NpcInstance;
import l2open.gameserver.serverpackets.ExShowScreenMessage;
import l2open.gameserver.serverpackets.ExShowScreenMessage.ScreenMessageAlign;
import l2open.gameserver.tables.NpcTable;
import l2open.util.Location;
import l2open.util.Rnd;
import l2open.util.reference.*;

/**
 * AI Dimension Moving Device РІ Seed of Destruction:
 *
 * Р�Р· ловушки спаунятся РјРѕР±С‹ СЃ задержкой РІ 3 сек через 5 сек после спауна РІ следующей последовательности:
 * Dragon Steed Troop Commander
 * White Dragon Leader
 * Dragon Steed Troop Healer (not off-like)
 * Dragon Steed Troop Magic Leader
 * Dragon Steed Troop Javelin Thrower
 *
 * @author SYS
 */
public class DimensionMovingDevice extends DefaultAI
{
    private static final int TIAT_NPC_ID = 29163;
    private static final int INIT_DELAY = 5 * 1000; // 5 сек
    private static final int MOBS_DELAY = 3 * 1000; // 3 сек
    private static final int MOBS_WAVE_DELAY = 90 * 1000; // 1.5 РјРёРЅ между волнами РјРѕР±РѕРІ

    private static final int[] MOBS = { 22538, // Dragon Steed Troop Commander
            22540, // White Dragon Leader
            22547, // Dragon Steed Troop Healer
            22542, // Dragon Steed Troop Magic Leader
            22548 // Dragon Steed Troop Javelin Thrower
    };

    private static final Location TIATROOM_LOC = new Location(-250408, 208568, -11968);
    private ScheduledFuture<?> _mobssSpawnTask;
    private long _search_timeout = 0;
    private static long _spawnTime = 0; // static для всех ловушек
    private HardReference<? extends L2NpcInstance> _tiat_ref = HardReferences.emptyRef();

    public DimensionMovingDevice(L2Character actor)
    {
        super(actor);
    }

    @Override
    public boolean isGlobalAI()
    {
        return true;
    }

    @Override
    protected void onEvtSpawn()
    {
        L2NpcInstance actor = getActor();
        if(actor == null)
            return;

        _spawnTime = System.currentTimeMillis();

        if(_mobssSpawnTask == null)
            _mobssSpawnTask = ThreadPoolManager.getInstance().scheduleAtFixedRate(new MobssSpawnTask(), INIT_DELAY, MOBS_WAVE_DELAY);
    }

    @Override
    protected void MY_DYING(L2Character killer)
    {
        if(_mobssSpawnTask != null)
        {
            _mobssSpawnTask.cancel(true);
            _mobssSpawnTask = null;
        }

        _spawnTime = 0;

        L2NpcInstance actor = getActor();
        if(actor == null)
            return;

        if(checkAllDestroyed(actor.getNpcId(), actor.getReflection().getId()))
        {
            L2NpcInstance tiat = findTiat(actor.getReflection().getId());
            if(tiat != null && !tiat.isDead())
                tiat.broadcastPacket(new ExShowScreenMessage("You'll regret challenging me!!!!", 3000, ScreenMessageAlign.MIDDLE_CENTER, false));
        }

        super.MY_DYING(killer);
    }

    /**
     * Возвращает L2NpcInstance Р±РѕСЃР° Tiat РІ отражении actor-Р°.
     * Если РЅРµ найден, возвращает null.
     */
    private L2NpcInstance findTiat(long refId)
    {
        L2NpcInstance _tiat = _tiat_ref.get();
        if(_tiat != null)
            return _tiat;

        // Р�щем Тиата РЅРµ чаще, чем раз РІ 10 секунд, если РїРѕ каким-то причинам его нету
        if(System.currentTimeMillis() > _search_timeout)
        {
            _search_timeout = System.currentTimeMillis() + 10000;
            for(L2NpcInstance npc : L2ObjectsStorage.getAllByNpcId(TIAT_NPC_ID, true))
                if(npc.getReflection().getId() == refId)
                {
                    _tiat_ref = npc.getRef();
                    return npc;
                }
        }
        return null;
    }

    /**
     * Проверяет, уничтожены ли РІСЃРµ Dimension Moving Device РІ текущем измерении
     * @return true если РІСЃРµ уничтожены
     */
    private static boolean checkAllDestroyed(int mobId, long refId)
    {
        for(L2NpcInstance npc : L2ObjectsStorage.getAllByNpcId(mobId, true))
            if(npc.getReflection().getId() == refId)
                return false;
        return true;
    }

    @Override
    protected boolean randomWalk()
    {
        return false;
    }

    /**
     * Таск запускает волну спауна РјРѕР±РѕРІ
     */
    public class MobssSpawnTask extends l2open.common.RunnableImpl
    {
        public void runImpl()
        {
            L2NpcInstance actor = getActor();
            if(actor == null || actor.isDead())
                return;

            // РќРµ кричим РїСЂРё первой волне РјРѕР±РѕРІ
            L2NpcInstance tiat = findTiat(actor.getReflection().getId());
            if(tiat != null && !tiat.isDead() && _spawnTime + MOBS_WAVE_DELAY < System.currentTimeMillis())
                tiat.broadcastPacket(new ExShowScreenMessage("Уничтожить незванцев !!!", 3000, ScreenMessageAlign.MIDDLE_CENTER, false));

            long delay = 0;
            for(int mobId : MOBS)
            {
                ThreadPoolManager.getInstance().schedule(new SpawnerTask(mobId), delay);
                delay += MOBS_DELAY;
            }
        }
    }

    /**
     * Таск спаунит РјРѕР±РѕРІ РІ волне
     */
    public class SpawnerTask extends l2open.common.RunnableImpl
    {
        private int _mobId;

        public SpawnerTask(int mobId)
        {
            _mobId = mobId;
        }

        public void runImpl()
        {
            L2NpcInstance actor = getActor();
            if(actor == null || actor.isDead())
                return;

            Reflection r = actor.getReflection();
            L2MonsterInstance mob = new L2MonsterInstance(IdFactory.getInstance().getNextId(), NpcTable.getTemplate(_mobId));
            mob.setSpawnedLoc(actor.getLoc());
            mob.setReflection(r);
            mob.onSpawn();
            mob.spawnMe(mob.getSpawnedLoc());

            mob.setRunning();
            mob.getAI().setMaxPursueRange(20000);
            mob.getAI().setGlobalAggro(0);

            // После спауна РјРѕР±С‹ бегут Рє тиату или РІ фортресс, если тиата еще нету
            L2NpcInstance tiat = findTiat(r.getId());
            Location homeLoc;
            if(tiat != null && !tiat.isDead())
            {
                homeLoc = Rnd.coordsRandomize(tiat.getLoc(), 200, 500);
                mob.setSpawnedLoc(homeLoc);
                mob.getAI().notifyEvent(CtrlEvent.EVT_AGGRESSION, tiat.getRandomHated(), 1);
                mob.getAI().addTaskMove(homeLoc, true);
            }
            else
            {
                homeLoc = Rnd.coordsRandomize(TIATROOM_LOC, 200, 500);
                mob.setSpawnedLoc(homeLoc);
                mob.getAI().addTaskMove(homeLoc, true);
            }
        }
    }

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
2 часа назад, Wollandessa сказал:

Нашел именно АИ этого НПСа. Но респа все равно не вижу 

Spawn.java или L2Spawn.java аи то тут причем.

Изменено пользователем Saltfire
  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
41 минуту назад, Saltfire сказал:

Spawn.java или L2Spawn.java аи то тут причем.

Там точно нет, уперся в это 

Спойлер

* AI Dimension Moving Device РІ Seed of Destruction:
 *
 * Р�Р· ловушки спаунятся РјРѕР±С‹ СЃ задержкой РІ 3 сек через 5 сек после спауна РІ следующей последовательности:
 * Dragon Steed Troop Commander
 * White Dragon Leader
 * Dragon Steed Troop Healer (not off-like)
 * Dragon Steed Troop Magic Leader
 * Dragon Steed Troop Javelin Thrower
 *
 * @author SYS
 */
public class DimensionMovingDevice extends DefaultAI
{
    private static final int TIAT_NPC_ID = 29163;
    private static final int INIT_DELAY = 5 * 1000; // 5 сек
    private static final int MOBS_DELAY = 3 * 1000; // 3 сек
    private static final int MOBS_WAVE_DELAY = 90 * 1000; // 1.5 РјРёРЅ между волнами РјРѕР±РѕРІ

    private static final int[] MOBS = { 22538, // Dragon Steed Troop Commander
            22540, // White Dragon Leader
            22547, // Dragon Steed Troop Healer
            22542, // Dragon Steed Troop Magic Leader
            22548 // Dragon Steed Troop Javelin Thrower
    };

    private static final Location TIATROOM_LOC = new Location(-250408, 208568, -11968);
    private ScheduledFuture<?> _mobssSpawnTask;
    private long _search_timeout = 0;
    private static long _spawnTime = 0; // static для всех ловушек
    private HardReference<? extends L2NpcInstance> _tiat_ref = HardReferences.emptyRef();

    public DimensionMovingDevice(L2Character actor)
    {
        super(actor);
    }

    @Override
    public boolean isGlobalAI()
    {
        return true;
    }

    @Override
    protected void onEvtSpawn()
    {
        L2NpcInstance actor = getActor();
        if(actor == null)
            return;

        _spawnTime = System.currentTimeMillis();

        if(_mobssSpawnTask == null)
            _mobssSpawnTask = ThreadPoolManager.getInstance().scheduleAtFixedRate(new MobssSpawnTask(), INIT_DELAY, MOBS_WAVE_DELAY);
    }

    @Override
    protected void MY_DYING(L2Character killer)
    {
        if(_mobssSpawnTask != null)
        {
            _mobssSpawnTask.cancel(true);
            _mobssSpawnTask = null;
        }

        _spawnTime = 0;

        L2NpcInstance actor = getActor();
        if(actor == null)
            return;

        if(checkAllDestroyed(actor.getNpcId(), actor.getReflection().getId()))
        {
            L2NpcInstance tiat = findTiat(actor.getReflection().getId());
            if(tiat != null && !tiat.isDead())
                tiat.broadcastPacket(new ExShowScreenMessage("You'll regret challenging me!!!!", 3000, ScreenMessageAlign.MIDDLE_CENTER, false));
        }

        super.MY_DYING(killer);
    }

    /**
     * Возвращает L2NpcInstance Р±РѕСЃР° Tiat РІ отражении actor-Р°.
     * Если РЅРµ найден, возвращает null.
     */
    private L2NpcInstance findTiat(long refId)
    {
        L2NpcInstance _tiat = _tiat_ref.get();
        if(_tiat != null)
            return _tiat;

        // Р�щем Тиата РЅРµ чаще, чем раз РІ 10 секунд, если РїРѕ каким-то причинам его нету
        if(System.currentTimeMillis() > _search_timeout)
        {
            _search_timeout = System.currentTimeMillis() + 10000;
            for(L2NpcInstance npc : L2ObjectsStorage.getAllByNpcId(TIAT_NPC_ID, true))
                if(npc.getReflection().getId() == refId)
                {
                    _tiat_ref = npc.getRef();
                    return npc;
                }
        }
        return null;
    }

    /**
     * Проверяет, уничтожены ли РІСЃРµ Dimension Moving Device РІ текущем измерении
     * @return true если РІСЃРµ уничтожены
     */
    private static boolean checkAllDestroyed(int mobId, long refId)
    {
        for(L2NpcInstance npc : L2ObjectsStorage.getAllByNpcId(mobId, true))
            if(npc.getReflection().getId() == refId)
                return false;
        return true;
    }

    @Override
    protected boolean randomWalk()
    {
        return false;
    }

    /**
     * Таск запускает волну спауна РјРѕР±РѕРІ
     */
    public class MobssSpawnTask extends l2open.common.RunnableImpl
    {
        public void runImpl()
        {
            L2NpcInstance actor = getActor();
            if(actor == null || actor.isDead())
                return;

            // РќРµ кричим РїСЂРё первой волне РјРѕР±РѕРІ
            L2NpcInstance tiat = findTiat(actor.getReflection().getId());
            if(tiat != null && !tiat.isDead() && _spawnTime + MOBS_WAVE_DELAY < System.currentTimeMillis())
                tiat.broadcastPacket(new ExShowScreenMessage("Whoaaaaaa!!!!", 3000, ScreenMessageAlign.MIDDLE_CENTER, false));

            long delay = 0;
            for(int mobId : MOBS)
            {
                ThreadPoolManager.getInstance().schedule(new SpawnerTask(mobId), delay);
                delay += MOBS_DELAY;
            }
        }
    }

    /**
     * Таск спаунит РјРѕР±РѕРІ РІ волне
     */
    public class SpawnerTask extends l2open.common.RunnableImpl
    {
        private int _mobId;

        public SpawnerTask(int mobId)
        {
            _mobId = mobId;
        }

        public void runImpl()
        {
            L2NpcInstance actor = getActor();
            if(actor == null || actor.isDead())
                return;

            Reflection r = actor.getReflection();
            L2MonsterInstance mob = new L2MonsterInstance(IdFactory.getInstance().getNextId(), NpcTable.getTemplate(_mobId));
            mob.setSpawnedLoc(actor.getLoc());
            mob.setReflection(r);
            mob.onSpawn();
            mob.spawnMe(mob.getSpawnedLoc());

            mob.setRunning();
            mob.getAI().setMaxPursueRange(20000);
            mob.getAI().setGlobalAggro(0);

            // После спауна РјРѕР±С‹ бегут Рє тиату или РІ фортресс, если тиата еще нету
            L2NpcInstance tiat = findTiat(r.getId());
            Location homeLoc;
            if(tiat != null && !tiat.isDead())
            {
                homeLoc = Rnd.coordsRandomize(tiat.getLoc(), 200, 500);
                mob.setSpawnedLoc(homeLoc);
                mob.getAI().notifyEvent(CtrlEvent.EVT_AGGRESSION, tiat.getRandomHated(), 1);
                mob.getAI().addTaskMove(homeLoc, true);
            }
            else
            {
                homeLoc = Rnd.coordsRandomize(TIATROOM_LOC, 200, 500);
                mob.setSpawnedLoc(homeLoc);
                mob.getAI().addTaskMove(homeLoc, true);
            }
        }
    }
 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация  

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...