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

Квестовый НПЦ спавнится и сразу пропадает.

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

Приветствую. Снова нужна ваша помощь. 

Есть квест, в конце которого вызывается РБ с охраной.  Юзаем строчку вызвать РБ, он появляется на мгновение и сразу исчезает но охрана остаётся, спустя время и она исчезает. 

Но при этом запись в БД ушла о том, что у него будет респавн через N времени. т.е. он заспавнился и сразу умер.
Пыталась заспавнить с админки - не получилось. Присумонить - тоже нет  - ТП сделать, сообщение (not found).

Полезла в скрипты (в спойлере), нашла строчку о записи для БД , т.е. идет выполнение записи - потом сам спавн.
Я не сильно шарю в скриптах, но может ли быть проблема в этом?
 

ServerVariables.set("HekatonPrimeRespawn", System.currentTimeMillis() + HekatonPrimeRespawn);
                NpcInstance boss = st.addSpawn(HekatonPrime, HekatonPrimeLoc.x, HekatonPrimeLoc.y, HekatonPrimeLoc.z,
                        HekatonPrimeLoc.h, 0, 0);
                boss.getMinionList().spawnMinions();

 

Спойлер

package quests;

import l2p.gameserver.instancemanager.ServerVariables;
import l2p.gameserver.model.instances.NpcInstance;
import l2p.gameserver.model.quest.Quest;
import l2p.gameserver.model.quest.QuestState;
import l2p.gameserver.serverpackets.RadarControl;
import l2p.gameserver.scripts.ScriptFile;
import l2p.gameserver.utils.Location;

/**
 * @author: pchayka
 * @date: 17.02.2011
 */
public class _307_ControlDeviceoftheGiants extends Quest implements ScriptFile {

    private static final int Droph = 32711;
    private static final int HekatonPrime = 25687;
    private static final int DrophsSupportItems = 14850;
    private static final int CaveExplorationText1Sheet = 14851;
    private static final int CaveExplorationText2Sheet = 14852;
    private static final int CaveExplorationText3Sheet = 14853;
    private static final long HekatonPrimeRespawn = 12 * 3600 * 1000L;
    private static final Location GorgolosLoc = new Location(186096, 61501, -4075, 0);
    private static final Location LastTitanUtenusLoc = new Location(186730, 56456, -4555, 0);
    private static final Location GiantMarpanakLoc = new Location(194057, 53722, -4259, 0);
    private static final Location HekatonPrimeLoc = new Location(192328, 56120, -7651, 0);

    public _307_ControlDeviceoftheGiants() {
        super(true);
        addStartNpc(Droph);
        addTalkId(Droph);
        addKillId(HekatonPrime);
    }

    @Override
    public String onEvent(String event, QuestState st, NpcInstance npc) {
        String htmltext = event;
        if (event.equalsIgnoreCase("droph_q307_2.htm")) {
            st.setCond(1);
            st.setState(STARTED);
        } else if (event.equalsIgnoreCase("loc1")) {
            htmltext = "droph_q307_2a_1.htm";
            RadarControl rc = new RadarControl(0, 1, GorgolosLoc);
            st.getPlayer().sendPacket(rc);
        } else if (event.equalsIgnoreCase("loc2")) {
            htmltext = "droph_q307_2a_2.htm";
            RadarControl rc = new RadarControl(0, 1, LastTitanUtenusLoc);
            st.getPlayer().sendPacket(rc);
        } else if (event.equalsIgnoreCase("loc3")) {
            htmltext = "droph_q307_2a_3.htm";
            RadarControl rc = new RadarControl(0, 1, GiantMarpanakLoc);
            st.getPlayer().sendPacket(rc);
        } else if (event.equalsIgnoreCase("summon_rb")) {
            if (ServerVariables.getLong("HekatonPrimeRespawn", 0) < System.currentTimeMillis()
                    && st.getQuestItemsCount(CaveExplorationText1Sheet) >= 1
                    && st.getQuestItemsCount(CaveExplorationText2Sheet) >= 1
                    && st.getQuestItemsCount(CaveExplorationText3Sheet) >= 1) {
                st.takeItems(CaveExplorationText1Sheet, 1);
                st.takeItems(CaveExplorationText2Sheet, 1);
                st.takeItems(CaveExplorationText3Sheet, 1);
                ServerVariables.set("HekatonPrimeRespawn", System.currentTimeMillis() + HekatonPrimeRespawn);
                NpcInstance boss = st.addSpawn(HekatonPrime, HekatonPrimeLoc.x, HekatonPrimeLoc.y, HekatonPrimeLoc.z,
                        HekatonPrimeLoc.h, 0, 0);
                boss.getMinionList().spawnMinions();
                htmltext = "droph_q307_3a.htm";
            } else {
                htmltext = "droph_q307_2b.htm";
            }
        }
        return htmltext;
    }

    @Override
    public String onTalk(NpcInstance npc, QuestState st) {
        String htmltext = "noquest";
        int npcId = npc.getNpcId();
        int cond = st.getCond();

        if (npcId == Droph) {
            if (cond == 0) {
                if (st.getPlayer().getLevel() >= 79) {
                    htmltext = "droph_q307_1.htm";
                } else {
                    htmltext = "droph_q307_0.htm";
                    st.exitCurrentQuest(true);
                }
            } else if (cond == 1) {
                if (st.getQuestItemsCount(CaveExplorationText1Sheet) >= 1
                        && st.getQuestItemsCount(CaveExplorationText2Sheet) >= 1
                        && st.getQuestItemsCount(CaveExplorationText3Sheet) >= 1) {
                    if (ServerVariables.getLong("HekatonPrimeRespawn", 0) < System.currentTimeMillis()) {
                        htmltext = "droph_q307_3.htm";
                    } else {
                        htmltext = "droph_q307_4.htm";
                    }
                } else {
                    htmltext = "droph_q307_2a.htm";
                }
            } else if (cond == 2) {
                htmltext = "droph_q307_5.htm";
                st.giveItems(DrophsSupportItems, 1);
                st.playSound(SOUND_FINISH);
                st.exitCurrentQuest(true);
            }
        }
        return htmltext;
    }

    @Override
    public String onKill(NpcInstance npc, QuestState st) {
        int npcId = npc.getNpcId();
        int cond = st.getCond();
        if (cond == 1 && npcId == HekatonPrime) {
            st.setCond(2);
        }
        return null;
    }

    @Override
    public void onLoad() {
    }

    @Override
    public void onReload() {
    }

    @Override
    public void onShutdown() {
    }
}

 


Скрипт самого босса. В нём ничего не увидела. В ХМЛ на спавн есть, нпц есть. 
 

Спойлер

package ai;

import l2p.gameserver.ai.Fighter;
import l2p.gameserver.model.Creature;
import l2p.gameserver.model.instances.NpcInstance;

public class HekatonPrime extends Fighter {

    private long _lastTimeAttacked;

    public HekatonPrime(NpcInstance actor) {
        super(actor);
    }

    @Override
    protected void onEvtSpawn() {
        super.onEvtSpawn();
        _lastTimeAttacked = System.currentTimeMillis();
    }

    @Override
    protected boolean thinkActive() {
        if (_lastTimeAttacked + 600000 < System.currentTimeMillis()) {
            if (getActor().getMinionList().hasMinions()) {
                getActor().getMinionList().deleteMinions();
            }
            getActor().deleteMe();
            return true;
        }
        return false;
    }

    @Override
    protected void onEvtAttacked(Creature attacker, int damage) {
        _lastTimeAttacked = System.currentTimeMillis();
        super.onEvtAttacked(attacker, damage);
    }
}

 


 

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


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

мож аи глючит не правильно калькулирует время последней атаки?

if ((_lastTimeAttacked + 600000L) < System.currentTimeMillis())

 

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


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

мож аи глючит не правильно калькулирует время последней атаки?


if ((_lastTimeAttacked + 600000L) < System.currentTimeMillis())

 

Последняя запись о нём : 1562718032325 
т.е.  это среда, 10 июля 2019 г., 3:20:32.325
т.е. 8 часов назад, собстна когда я проверяла

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


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

мож аи глючит не правильно калькулирует время последней атаки?


if ((_lastTimeAttacked + 600000L) < System.currentTimeMillis())

 

Не помогло ( 

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


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

 

14 hours ago, KATEKATE said:

 В ХМЛ на спавн есть, нпц есть. 
 

В спавне(xml) его не должно быть.

  • Like 1

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


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

В спавне(xml) его не должно быть.

Я его закоментировала. Тоже не помогло. 

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


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

вырежи для начала AI закомпилься без него и тестани, сразу станет ясно копать в AI или в квесте или ядре. Чудес не бывает. Команда на удаление я вижу ток в AI. Может еще где-то есть??

  • Like 1

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


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

вырежи для начала AI закомпилься без него и тестани, сразу станет ясно копать в AI или в квесте или ядре. Чудес не бывает. Команда на удаление я вижу ток в AI. Может еще где-то есть??

Спасибо, что помогаете :) Я забыла отписаться, что пробовала так .

В ГС - [10.07.19 21:09:37:710] ERROR npc.NpcTemplate: Not found ai class for ai: HekatonPrime. NpcId: 25687
Призвать можно и он не удаляется.

Сорри, что сразу не уточнила, думаю это бы облегчило помощь :vava:
Не просто чудеса, это феерия! я не понимаю...

Изменено пользователем KATEKATE

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


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

Брейкпоинт на delete\unspawn и далее по стеку смотрите кто его деспавнит, а там уже можно будет разобраться почему

  • Like 1

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


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

Спасибо, что помогаете :) Я забыла отписаться, что пробовала так .

В ГС - [10.07.19 21:09:37:710] ERROR npc.NpcTemplate: Not found ai class for ai: HekatonPrime. NpcId: 25687
Призвать можно и он не удаляется.

Сорри, что сразу не уточнила, думаю это бы облегчило помощь :vava:
Не просто чудеса, это феерия! я не понимаю...

Раз проблема точно в АЙ значит видимо не успевает время за калькулировать и удаляется могу предложить попробовать немного подкорректировать:

    @Override
    protected void onEvtSpawn() {
        _lastTimeAttacked = System.currentTimeMillis();
        super.onEvtSpawn();
    }

Если не поможет то на крайняк можно ваще убрать функцию удаления босса удалив:

    @Override
    protected boolean thinkActive() {
        if (_lastTimeAttacked + 600000 < System.currentTimeMillis()) {
            if (getActor().getMinionList().hasMinions()) {
                getActor().getMinionList().deleteMinions();
            }
            getActor().deleteMe();
            return true;
        }
        return false;
    }

но это как говорится крайняя мера

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

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


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

Брейкпоинт на delete\unspawn и далее по стеку смотрите кто его деспавнит, а там уже можно будет разобраться почему

Я к сожалению не пользуюсь эклипсом :( Можно как то по другому это делать? Или стоит выучить прогу?
 

9 минут назад, LordWinter сказал:

Раз проблема точно в АЙ значит видимо не успевает время за калькулировать и удаляется могу предложить попробовать немного подкорректировать:


    @Override
    protected void onEvtSpawn() {
        _lastTimeAttacked = System.currentTimeMillis();
        super.onEvtSpawn();
    }

 

Это помогло. Спасибо Вам. Всё работает как часы. :angel:
 

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


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

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

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

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

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

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

Войти

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

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

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

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

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