Смерть РБ таймер

Stellar.

Интересующийся
Участник
Сообщения
35
Розыгрыши
0
Репутация
0
Реакции
7
Баллы
345
Здравствуйте всем!
Прошу консультации в части понимания как работает таймер после смерти РБ. Суть какая, послу убийства РБ в рифте, комната меняется через 12 сек. Периодом не успеваем поднять дроп с РБ, как комната сменилась. Не пойму, как поправить задержку после смерти? Спасибо!
Сам код:
C++:
class raid_boss_for_teleport_dungeon : raid_boss_type1
{
handler:
    EventHandler CREATED( maker0 )
    {
        myself.AddTimerEx( 2003, ( ( 60 * 1000 ) * 3 ) );
        maker0 = myself.GetMyMaker( );
        SendMakerScriptEvent( maker0, 2, 0, 0 );
        myself.i_ai0 = myself.GetCurrentTick( );
        super;
    }

    EventHandler ATTACKED( attacker )
    {
        myself.i_ai0 = myself.GetCurrentTick( );
        super;
    }

    EventHandler TIMER_FIRED_EX( timer_id, maker0 )
    {
        if ( timer_id == 2003 ) {
            maker0 = myself.GetMyMaker( );
            if ( ( myself.GetCurrentTick( ) - myself.i_ai0 ) > ( 60 * 4 ) ) {
                SendMakerScriptEvent( maker0, 3, 0, 0 );
            } else {
                SendMakerScriptEvent( maker0, 2, 0, 0 );
            }
            myself.AddTimerEx( 2003, 60000 );
        }
        super;
    }

    EventHandler MY_DYING( maker0 )
    {
        maker0 = myself.GetMyMaker( );
        SendMakerScriptEvent( maker0, 3, 0, 0 );
    }

}
 
Код:
  EventHandler MY_DYING( maker0 )
    {
        maker0 = myself.GetMyMaker( );
        SendMakerScriptEvent( maker0, 3, 0, 0 );
    }
Логика отвечающая за действия после смерти здесь, а что оно там(SendMakerScriptEvent) делает понятия не имею ,но решить можно следующим образом:
Код:
  EventHandler MY_DYING( maker0 )
    {
          myself.AddTimerEx( 2004, ( ( 60 * 1000 ) ) );
    
    }
 EventHandler TIMER_FIRED_EX( timer_id, maker0 )
    {
        if ( timer_id == 2004 )
       {
     
         maker0 = myself.GetMyMaker( );
        SendMakerScriptEvent( maker0, 3, 0, 0 );
       }
   }
 
ERROR(40) : Duplicated Event Handler [TIMER_FIRED_EX] in Class [raid_boss_for_teleport_dungeon]

+ решения из chatgpt не подходят. Потому что компилятор не понимает что за команда timer_id == 2004
 
ERROR(40) : Duplicated Event Handler [TIMER_FIRED_EX] in Class [raid_boss_for_teleport_dungeon]
Попробуйте тогда с TIMER_FIRED
Код:
EventHandler MY_DYING( maker0 )<br>    {<br>          myself.AddTimer( 2004, ( ( 60 * 1000 ) ) );<br>   <br>    }
 EventHandler TIMER_FIRED( timer_id, maker0 )<br>    {<br>        if ( timer_id == 2004 )<br>       {<br>    <br>         maker0 = myself.GetMyMaker( );<br>        SendMakerScriptEvent( maker0, 3, 0, 0 );<br>       }
Понятия не имею почему с ID 2004 AddTimerEx не работает и выдает дубликат, это надо вникать.

=) Какие нафиг chatgpt ? Вы ничего не перепутали ? Там это решение парой строк кода достаточно, почему в MY_DYING не дает отдельно таймер запустить и считает его дубликатом это уже другой вопрос, timer_id там замечательно понимает.
 
Не в коем случае не хотел вас как-то зацепить. Я пользовался chatgpt и он мне выдал вот что:
C++:
EventHandler MY_DYING( maker0 )
    {
        maker0 = myself.GetMyMaker( );
        myself.AddTimerEx( 2004, (60 * 1000) * 2 ); // Установить таймер на 2 минуты
        super;
    }

    EventHandler TIMER_FIRED_EX( timer_id, maker0 )
    {
        if (timer_id == 2004) {
            maker0 = myself.GetMyMaker( );
            SendMakerScriptEvent( maker0, 3, 0, 0 ); // Отправить событие после истечения таймера
        }
        super;
    }
 
Ну и выдал он тоже самое что я вам написал , толку то ? Если у вас ошибка 40( понятия не имею ввиду чего)
Пробуйте то что я сказал, все .
 
Смотри, пробуй.
А почему в самом инстансе не посмотреть?
C++:
class raid_boss_for_teleport_dungeon : raid_boss_type1
{
parameter:
    int CreviceOfDiminsion = 0;

handler:
   EventHandler CREATED(maker0)
   {
      AddTimerEx(2003, 60 * 1000 * 3);
      maker0 = GetMyMaker();
      SendMakerScriptEvent(maker0, @TELEPORT_DUNGEON_ACTIVIE_RAID, 0, 0);
      myself.i_ai0 = GetCurrentTick();
      super;
   }

    EventHandler ATTACKED(attacker)
    {
        if (InMyTerritory(myself.sm) == 0)
        {
            InstantRandomTeleportInMyTerritory();
            return;
        }

        myself.i_ai0 = GetCurrentTick();
        super;
    }

   EventHandler TIMER_FIRED_EX(timer_id, maker0)
   {
      if(timer_id == 2003)
      {
         maker0 = GetMyMaker();
         if(GetCurrentTick() - myself.i_ai0 > 60*3)
         {
            SendMakerScriptEvent(maker0, @TELEPORT_DUNGEON_INACTIVIE_RAID, 0, 0);
         }
         else
         {
            SendMakerScriptEvent(maker0, @TELEPORT_DUNGEON_ACTIVIE_RAID, 0, 0);
         }
         AddTimerEx(2003, 60000);
      }
      super;
   }

   EventHandler MY_DYING(maker0)
   {
      maker0 = GetMyMaker();
      SendMakerScriptEvent(maker0, @TELEPORT_DUNGEON_INACTIVIE_RAID, 0, 0);
   }
}
 
А разве в самом .xml файле нет настройки этой?
 
Что за тупизм , не можете код добавить( c AddTimer(...) и TIMER_FIRED(...) и проверить на работу ?

Вот другой вариант
Код:
 EventHandler CREATED( maker0 )
    {
        myself.AddTimerEx( 2003, ( ( 60 * 1000 ) * 3 ) );
        maker0 = myself.GetMyMaker( );
        SendMakerScriptEvent( maker0, 2, 0, 0 );
        myself.i_ai0 = myself.GetCurrentTick( );
        myself.i_ai3 = 0;
        super;
    }

 EventHandler TIMER_FIRED_EX( timer_id, maker0 )
    {
        if ( timer_id == 2003 ) {
            maker0 = myself.GetMyMaker( );
        if(myself.i_ai3)
            {
         SendMakerScriptEvent( maker0, 3, 0, 0 );
                 myself.i_ai3=0;
        }
       else
      {
            if ( ( myself.GetCurrentTick( ) - myself.i_ai0 ) > ( 60 * 4 ) ) {
                SendMakerScriptEvent( maker0, 3, 0, 0 );
            } else {
                SendMakerScriptEvent( maker0, 2, 0, 0 );
            }
            myself.AddTimerEx( 2003, 60000 );
        }
      }
        super;
    }
EventHandler MY_DYING( maker0 )
    {
      
     
        myself.i_ai3 = 1;
    }
 
Зачем ковырять ИИ моба, когда нужно ковырять ИИ мейкера? Можно случайно поставить времени больше его таймаута удаления и все сломать. Если вы поставите минуту туда ожидания, то труп моба задеспавнится раньше, чем он отработает этот таймер. А когда вы в мейкер эвент отправили, уже можно спать спокойно, потому что инстовые мейкеры не задеструктятся еще полчаса после закрытия инзоны.

C++:
// *---------------------------------------------------------------------------------------------------------------* //
// 차원의 틈새
// *---------------------------------------------------------------------------------------------------------------* //

class manage_teleport_dungeon : default_maker
{
parameter:
    int      hunting_level_index = -1;
    int      room_index = -1;
    string   manager_npc_name = "KIN";
handler:
    EventHandler ON_START(i0, def0, i2)
    {
        if(manager_npc_name == "KIN")
        {
//            Announce("Error!! 차원의 틈새에서 관리자 NPC 지정이 되지 않았습니다.");
        }

        // manager_npc 만을 스폰한다.
        def0 = myself.GetSpawnDefineByNick(manager_npc_name);
        if(IsNull(def0) == 0)
        {
            i2 = def0.total - def0.npc_count;
            if (i2 > 0)
            {
                if(AtomicIncreaseTotal(def0, i2, 1))
                {
                    def0.Spawn2(i2, 0, 0);
                }
            }
        }
        else
        {
//            Announce("Error!! 차원의 틈새에서 관리자 NPC를 찾을 수 없습니다.");
        }

        myself.i_ai0 = @TELEPORT_DUNGEON_NOT_ACTIVITY;
    }

    EventHandler ON_TIMER(timer_id)
    {
        if (timer_id == 5001)
        {
            if (myself.i_ai0 == @TELEPORT_DUNGEON_ACTIVITY)
            {
                DoRespawn();
                AddTimerEx(5001, 1000);
            }
        }

    }
    EventHandler ON_SCRIPT_EVENT(script_event_arg1, script_event_arg2, script_event_arg3, def0, i0, i1, i2)
    {

        select(script_event_arg1)
        {
            // 한 방에서 관리자 NPC를 제외한 모든 NPC를 디스폰
            case @TELEPORT_DUNGEON_NOT_ACTIVITY:
                myself.i_ai0 = @TELEPORT_DUNGEON_NOT_ACTIVITY;
                ResetRespawn();
                for(i0=0; i0<myself.def_count; ++i0)
                {
                    // spawn define의 개수만큼 루프
                    def0 = myself.GetSpawnDefine(i0);
                    if(IsNull(def0) == 0 )
                    {
                        if(IsSameString(def0.name, manager_npc_name) == 0)
                        {
                            def0.Despawn();
                        }
                    }
                }
                break;

            // 한 방에서 관리자 NPC를 제외한 모든 NPC를 스폰
            case @TELEPORT_DUNGEON_ACTIVITY:
                if(myself.i_ai0 == @TELEPORT_DUNGEON_NOT_ACTIVITY)
                {
                    myself.i_ai0 = @TELEPORT_DUNGEON_ACTIVITY;
                    ResetRespawn();
                    for(i0=0; i0<myself.def_count; ++i0)
                    {
                        // spawn define의 개수만큼 루프
                        def0 = myself.GetSpawnDefine(i0);
                        if( IsNull(def0) == 0 )
                        {
                            if(IsSameString(def0.name, manager_npc_name) == 0)
                            {
                                if(AtomicIncreaseTotal(def0, def0.total, 1))
                                {
                                    def0.Spawn2(def0.total, 0, 0);
                                }
                            }
                        }
                    }
                    AddTimerEx(5001, 1000);
                }
            break;

            case @TELEPORT_DUNGEON_INACTIVIE_RAID:
                for(i0=0; i0<myself.def_count; ++i0)
                {
                    // spawn define의 개수만큼 루프
                    def0 = myself.GetSpawnDefine(i0);
                    if( IsNull(def0) == 0 )
                    {
                        if(IsSameString(def0.name, manager_npc_name))
                            def0.SendScriptEvent(script_event_arg1, 0, 0);
                        else
                        {
                            def0.Despawn();
                        }
                    }
                }
                break;

            case @TELEPORT_DUNGEON_ACTIVIE_RAID:
                for(i0=0; i0<myself.def_count; ++i0)
                {
                    // spawn define의 개수만큼 루프
                    def0 = myself.GetSpawnDefine(i0);
                    if( IsNull(def0) == 0 )
                    {
                        if(IsSameString(def0.name, manager_npc_name))
                            def0.SendScriptEvent(script_event_arg1, 0, 0);
                    }
                }
                break;
        }
    }

    EventHandler ON_NPC_DELETED(deleted_def, i0, i1, maker0,reply)
    {
        //~ AtomicDecreaseTotal(deleted_def, 1);

        // 리스폰
        if(myself.i_ai0 == @TELEPORT_DUNGEON_ACTIVITY && deleted_def.respawn_time != 0)
        {
            RegisterRespawn(deleted_def.respawn_time, 1, deleted_def);
        }
    }

    EventHandler ON_NPC_CREATED(created_def, created_npc, maker0)
    {
        if(myself.i_ai0 == @TELEPORT_DUNGEON_NOT_ACTIVITY)
        {
            if(IsSameString(created_def.name, manager_npc_name) == 0)
            {
                if(IsNull(created_npc) == 0)
                {
                    created_npc.Despawn();
                }
            }
        }
    }
}

Вам нужна ветка свитча @TELEPORT_DUNGEON_INACTIVIE_RAID, это 3

Объявите там переменную despawn_delay, которую будете менять через спавнер. Не забудьте добавить в manual_pch.txt константу для 4 ветки. И в ИИ моба поменять аргумент с 3
Код:
SendMakerScriptEvent( maker0, 3, 0, 0 );
на 4
Код:
(SendMakerScriptEvent( maker0, 4, 0, 0 );

// 차원의 틈새
[TIMER_ID_GATHERING] = 3100
[TELEPORT_DUNGEON_NOT_ACTIVITY] = 0
[TELEPORT_DUNGEON_ACTIVITY] = 1
[TELEPORT_DUNGEON_ACTIVIE_RAID] = 2
[TELEPORT_DUNGEON_INACTIVIE_RAID] = 3
[TELEPORT_DUNGEON_INACTIVIE_RAID_DELAYED] = 4

C++:
// *---------------------------------------------------------------------------------------------------------------* //
// 차원의 틈새
// *---------------------------------------------------------------------------------------------------------------* //

class manage_teleport_dungeon : default_maker
{
parameter:
    int      hunting_level_index = -1;
    int      room_index = -1;
    string   manager_npc_name = "KIN";
    int         despawn_delay = 60000;
handler:
    EventHandler ON_START(i0, def0, i2)
    {
        if(manager_npc_name == "KIN")
        {
//            Announce("Error!! 차원의 틈새에서 관리자 NPC 지정이 되지 않았습니다.");
        }

        // manager_npc 만을 스폰한다.
        def0 = myself.GetSpawnDefineByNick(manager_npc_name);
        if(IsNull(def0) == 0)
        {
            i2 = def0.total - def0.npc_count;
            if (i2 > 0)
            {
                if(AtomicIncreaseTotal(def0, i2, 1))
                {
                    def0.Spawn2(i2, 0, 0);
                }
            }
        }
        else
        {
//            Announce("Error!! 차원의 틈새에서 관리자 NPC를 찾을 수 없습니다.");
        }

        myself.i_ai0 = @TELEPORT_DUNGEON_NOT_ACTIVITY;
    }

    EventHandler ON_TIMER(timer_id)
    {
        if (timer_id == 5001)
        {
            if (myself.i_ai0 == @TELEPORT_DUNGEON_ACTIVITY)
            {
                DoRespawn();
                AddTimerEx(5001, 1000);
            }
        }
        else if (timer_id == 9999999) {
            for(i0=0; i0<myself.def_count; ++i0)
            {
                // spawn define의 개수만큼 루프
                def0 = myself.GetSpawnDefine(i0);
                if( IsNull(def0) == 0 )
                {
                    if(IsSameString(def0.name, manager_npc_name))
                        def0.SendScriptEvent(@TELEPORT_DUNGEON_INACTIVIE_RAID, 0, 0);
                    else
                    {
                        def0.Despawn();
                    }
                }
            }
        }

    }
    EventHandler ON_SCRIPT_EVENT(script_event_arg1, script_event_arg2, script_event_arg3, def0, i0, i1, i2)
    {

        select(script_event_arg1)
        {
            // 한 방에서 관리자 NPC를 제외한 모든 NPC를 디스폰
            case @TELEPORT_DUNGEON_NOT_ACTIVITY:
                myself.i_ai0 = @TELEPORT_DUNGEON_NOT_ACTIVITY;
                ResetRespawn();
                for(i0=0; i0<myself.def_count; ++i0)
                {
                    // spawn define의 개수만큼 루프
                    def0 = myself.GetSpawnDefine(i0);
                    if(IsNull(def0) == 0 )
                    {
                        if(IsSameString(def0.name, manager_npc_name) == 0)
                        {
                            def0.Despawn();
                        }
                    }
                }
                break;

            // 한 방에서 관리자 NPC를 제외한 모든 NPC를 스폰
            case @TELEPORT_DUNGEON_ACTIVITY:
                if(myself.i_ai0 == @TELEPORT_DUNGEON_NOT_ACTIVITY)
                {
                    myself.i_ai0 = @TELEPORT_DUNGEON_ACTIVITY;
                    ResetRespawn();
                    for(i0=0; i0<myself.def_count; ++i0)
                    {
                        // spawn define의 개수만큼 루프
                        def0 = myself.GetSpawnDefine(i0);
                        if( IsNull(def0) == 0 )
                        {
                            if(IsSameString(def0.name, manager_npc_name) == 0)
                            {
                                if(AtomicIncreaseTotal(def0, def0.total, 1))
                                {
                                    def0.Spawn2(def0.total, 0, 0);
                                }
                            }
                        }
                    }
                    AddTimerEx(5001, 1000);
                }
            break;

            case @TELEPORT_DUNGEON_INACTIVIE_RAID:
                for(i0=0; i0<myself.def_count; ++i0)
                {
                    // spawn define의 개수만큼 루프
                    def0 = myself.GetSpawnDefine(i0);
                    if( IsNull(def0) == 0 )
                    {
                        if(IsSameString(def0.name, manager_npc_name))
                            def0.SendScriptEvent(script_event_arg1, 0, 0);
                        else
                        {
                            def0.Despawn();
                        }
                    }
                }
                break;

            case @TELEPORT_DUNGEON_ACTIVIE_RAID:
                for(i0=0; i0<myself.def_count; ++i0)
                {
                    // spawn define의 개수만큼 루프
                    def0 = myself.GetSpawnDefine(i0);
                    if( IsNull(def0) == 0 )
                    {
                        if(IsSameString(def0.name, manager_npc_name))
                            def0.SendScriptEvent(script_event_arg1, 0, 0);
                    }
                }
                break;
         
            case @TELEPORT_DUNGEON_INACTIVIE_RAID_DELAYED:
                AddTimerEx(9999999, despawn_delay);
                break;
        }
    }

    EventHandler ON_NPC_DELETED(deleted_def, i0, i1, maker0,reply)
    {
        //~ AtomicDecreaseTotal(deleted_def, 1);

        // 리스폰
        if(myself.i_ai0 == @TELEPORT_DUNGEON_ACTIVITY && deleted_def.respawn_time != 0)
        {
            RegisterRespawn(deleted_def.respawn_time, 1, deleted_def);
        }
    }

    EventHandler ON_NPC_CREATED(created_def, created_npc, maker0)
    {
        if(myself.i_ai0 == @TELEPORT_DUNGEON_NOT_ACTIVITY)
        {
            if(IsSameString(created_def.name, manager_npc_name) == 0)
            {
                if(IsNull(created_npc) == 0)
                {
                    created_npc.Despawn();
                }
            }
        }
    }
}
 
Последнее редактирование:
Что за тупизм , не можете код добавить( c AddTimer(...) и TIMER_FIRED(...) и проверить на работу ?
Ну чего ты хочешь от человека, который вместо того чтобы попытаться разобраться в достаточно простом коде, сразу же бежит спрашивать "что делать" у чатгпт....
Вот и растет блин новое поколение "прогроммистов", которое без ИИ ничего не сможет делать...
 
Реакции: kick
Огромное спасибо за подробный ответ
 
Данный сайт использует cookie. Вы должны принять их для продолжения использования. Узнать больше…