Анонс спауна определенных мобов (npcId)

amkey

Величайший
Проверенный
Сообщения
306
Розыгрыши
0
Репутация
761
Реакции
526
Баллы
1 513
Что-то никак мой мозг не придет к ответу на вопрос, каким образом реализовать анонс спауна монстра (npcid) за определенное время.
Интересует как всё это сделать скриптом.
Я так понимаю, надо каким-то образом при onKill() или onAdvDead().

Направьте на путь истинный, пожалуйста :)
 
Что-то никак мой мозг не придет к ответу на вопрос, каким образом реализовать анонс спауна монстра (npcid) за определенное время.
Интересует как всё это сделать скриптом.
Я так понимаю, надо каким-то образом при onKill() или onAdvDead().

Направьте на путь истинный, пожалуйста :)
образом onSpawn
 
На сколько понимаю onSpawn - это как только он заспавнился, то есть за 20 минут мы не сможем дать анонс. Правильно я понимаю?
можем, только просто за сколько времени до onSpawn писать анонсы
 
Забомбить листенер на спавн нпсов.
В самом методе спавна. Передовать нпсид
И уже в самом листенере

If (npc == 100500) {send.anonce ();
}
 
ну если надо до спавна анонс сделать, то это придется лезть к примеру в спавнер и там в методе задающем следующий спавн запускать задачу на анонс в нужное время
так же можно навесить глобальный листенер на смерть мобов и в нем запускать задачу на анонс после определенного времени смерти - само собой подойдет только для случаев когда респ фиксирован.
 
Удивительно, но таки смог найти для старой модели спауна а-ля lucera, правда только для боссов.
Код:
  private class ScheduledSpawnEvent implements IBossSpawnOnScheduled {
     @Override
     public void onScheduledSpawnBoss(L2Spawn spawn, int bossId, long spawnTime) {
       for(BossSpawnModel model : models) {
         if(model.getId() != bossId)
           continue;
         
         long t = spawnTime - model.getTime();
         if(t < 0)
           continue;
         
         ThreadPoolManager.getInstance().scheduleGeneral(new AnnounceTask(model, spawnTime - t), t);
       }
     }
   }

Где-то в дебрях BossSpawnManager::addNewSpawn
Код:
....
if (respawnTime == 0L || (time > respawnTime)) {
    ...
} else {
    ...
    getListeners().onScheduledSpawnBoss(_spawns.get(bossId), bossId, spawnTime);
    ...
}
....

BossSpawnManager::updateStatus
Код:
...
if (!_schedules.containsKey(boss.getNpcId())) {
    ...
    getListeners().onScheduledSpawnBoss(_spawns.get(bossId), bossId, respawnTime);
    ...
}
...


Для обычного спауна все работает так же, но вызовы будут в L2Spawn. Чето типа этого:
Код:
  @Override
   protected void onDeath(L2Character actor) {
     getSpawned().remove(actor);
     
     if(isDisabled() || getStaticRespawn() < 1) {
       return;
     }
     
     long delay = getStaticRespawn() + (Rnd.get(getRandomRespawn()) * 1_000l);
     ThreadPoolManager.getInstance().scheduleGeneral(this::onRespawn, delay);
     
     getListeners().onScheduledSpawn(getTemplate().getNpcId(), delay);
   }
 
Удивительно, но таки смог найти для старой модели спауна а-ля lucera, правда только для боссов.
Код:
  private class ScheduledSpawnEvent implements IBossSpawnOnScheduled {
     @Override
     public void onScheduledSpawnBoss(L2Spawn spawn, int bossId, long spawnTime) {
       for(BossSpawnModel model : models) {
         if(model.getId() != bossId)
           continue;
       
         long t = spawnTime - model.getTime();
         if(t < 0)
           continue;
       
         ThreadPoolManager.getInstance().scheduleGeneral(new AnnounceTask(model, spawnTime - t), t);
       }
     }
   }

Где-то в дебрях BossSpawnManager::addNewSpawn
Код:
....
if (respawnTime == 0L || (time > respawnTime)) {
    ...
} else {
    ...
    getListeners().onScheduledSpawnBoss(_spawns.get(bossId), bossId, spawnTime);
    ...
}
....

BossSpawnManager::updateStatus
Код:
...
if (!_schedules.containsKey(boss.getNpcId())) {
    ...
    getListeners().onScheduledSpawnBoss(_spawns.get(bossId), bossId, respawnTime);
    ...
}
...


Для обычного спауна все работает так же, но вызовы будут в L2Spawn. Чето типа этого:
Код:
  @Override
   protected void onDeath(L2Character actor) {
     getSpawned().remove(actor);
   
     if(isDisabled() || getStaticRespawn() < 1) {
       return;
     }
   
     long delay = getStaticRespawn() + (Rnd.get(getRandomRespawn()) * 1_000l);
     ThreadPoolManager.getInstance().scheduleGeneral(this::onRespawn, delay);
   
     getListeners().onScheduledSpawn(getTemplate().getNpcId(), delay);
   }
Как раз таки начал чекать сурсы люси и, почему-то, пропустил это)
Но опять же, это нужны сурсы для реализации. А хочется скриптом)

У меня на уме говнокод (а я тот ещё говнокодер, главное чтобы работало), вида:
Что_то_типа_sleep();
super.onSpawn();
:)
 
Как раз таки начал чекать сурсы люси и, почему-то, пропустил это)
Но опять же, это нужны сурсы для реализации.

У меня на уме говнокод (а я тот ещё говнокодер, главное чтобы работало), вида:
Что_то_типа_sleep();
super.onSpawn();
:)
Пропустили, потому-что этого нет в публичных исходниках :D
Делать sleep работая в трид пуле, тем более пакетном? А я смотрю, Вы рисковый парень. *сарказм*
Вам нужны события, как я описал выше. От них уже планировать время выполнения аннонса.
 
Пропустили, потому-что этого нет в публичных исходниках :D
Делать sleep работая в трид пуле, тем более пакетном? А я смотрю, Вы рисковый парень. *сарказм*
Вам нужны события, как я описал выше. От них уже планировать время выполнения аннонса.
Ахах) Такой эдакий рисковый говнокодер :D
 
бить ссаными тряпками надо тех кто использует вещи типа Thread.sleep() для того чтобы выполнять что-то с определенной задержкой.
для кого блин сделана возможность запускать задачи с заданной задержкой то?
 
Ммм, я на овере делал анонс спауна мобов, правда без задержки, и делал это тупо в SimpleSpawner, вроде.
 
бить ссаными тряпками надо тех кто использует вещи типа Thread.sleep() для того чтобы выполнять что-то с определенной задержкой.
для кого блин сделана возможность запускать задачи с заданной задержкой то?
Само собой) Просто это первое, что пришло на ум (помню ещё скрипты на питоне с подобным слипом). Задача с задержкой - это ведь использование ThreadPool, я правильно понял? :)
 
Именно так, потому-что у вас исполняющий поток работает в трид пуле и если слипать его, то этим мы отнимаем один из потоков трид пула на все время слипа, тобишь понижаем пропускную способность всего пула. А если такой код выполняется постоянно, то потоков может вообще не остаться.
 
ну а на что в принципе его заменишь?
можно конечно механизмы спавна основательно переписать, но чаще всего приходится руководствоваться принципом "работает? не трогай".
да и я лично проблем от Spawner'а и его наследников в виде SimpleSpawner и HardSpawner вроде не видел.

хотя нет, у оригинального Spawner'а есть проблема с тем что при респавне теряются ai params, переданные неписю через спавн, но это лечится буквально за несколько минут.
если кто не понял о каких я параметрах веду речь, то это к примеру вот такое:
Код:
    <spawn count="1" respawn="0" group="giran03_2321_36_eventm1">
        <npc id="18970">    <!-- Magma Drake Hatchling / Детеныш Дрейка из Магмы -->
            <set name="route" value="dragonvalley_2321_03_02event" />
            <set name="delay" value="105" />
        </npc>
        <point x="108053" y="117402" z="-3040" h="8560" />
    </spawn>
ну и вобщем при первом спавне непись об этих параметрах знает, а если его убить, то при следующем респе этих данных у него уже не будет - небольшая вот недоработочка в механизме спавна.
 
Последнее редактирование:
ну а на что в принципе его заменишь?
можно конечно механизмы спавна основательно переписать, но чаще всего приходится руководствоваться принципом "работает? не трогай".
Многие ругались, что из-за него память ликается, в каких-то ситуациях. К сожалению, никак не могу, как подтвердить, так и опровергнуть, т.к. почти не работал с исходниками в основе overlord/lostworld (ну и к слову phoenix/jb, хоть в них и нет висталловского спауна).
 
ну я если честно тоже вроде никаких утечек памяти не видел, по крайней мере таких чтобы прям в глаза бросилось.
 
Обратите внимание, что данный пользователь заблокирован! Не совершайте с ним никаких сделок! Перейдите в его профиль, чтобы узнать причину блокировки.
ну а на что в принципе его заменишь?
можно конечно механизмы спавна основательно переписать, но чаще всего приходится руководствоваться принципом "работает? не трогай".
да и я лично проблем от Spawner'а и его наследников в виде SimpleSpawner и HardSpawner вроде не видел.

хотя нет, у оригинального Spawner'а есть проблема с тем что при респавне теряются ai params, переданные неписю через спавн, но это лечится буквально за несколько минут.
если кто не понял о каких я параметрах веду речь, то это к примеру вот такое:
Код:
    <spawn count="1" respawn="0" group="giran03_2321_36_eventm1">
        <npc id="18970">    <!-- Magma Drake Hatchling / Детеныш Дрейка из Магмы -->
            <set name="route" value="dragonvalley_2321_03_02event" />
            <set name="delay" value="105" />
        </npc>
        <point x="108053" y="117402" z="-3040" h="8560" />
    </spawn>
ну и вобщем при первом спавне непись об этих параметрах знает, а если его убить, то при следующем респе этих данных у него уже не будет - небольшая вот недоработочка в механизме спавна.

that is for new Dragon Valley? in God?
 
Назад
Сверху Снизу