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 );
}
}
Здравствуйте всем!
Прошу консультации в части понимания как работает таймер после смерти РБ. Суть какая, послу убийства РБ в рифте, комната меняется через 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 );
}
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]Логика отвечающая за действия после смерти здесь, а что оно там(SendMakerScriptEvent) делает понятия не имею ,но решить можно следующим образом:Код:EventHandler MY_DYING( maker0 ) { maker0 = myself.GetMyMaker( ); SendMakerScriptEvent( maker0, 3, 0, 0 ); }
Код: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 ); } }
+ решения из chatgpt не подходят. Потому что компилятор не понимает что за команда timer_id == 2004Логика отвечающая за действия после смерти здесь, а что оно там(SendMakerScriptEvent) делает понятия не имею ,но решить можно следующим образом:Код:EventHandler MY_DYING( maker0 ) { maker0 = myself.GetMyMaker( ); SendMakerScriptEvent( maker0, 3, 0, 0 ); }
Код: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 ); } }
Попробуйте тогда с TIMER_FIREDERROR(40) : Duplicated Event Handler [TIMER_FIRED_EX] in Class [raid_boss_for_teleport_dungeon]
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> }
=) Какие нафиг chatgpt ? Вы ничего не перепутали ? Там это решение парой строк кода достаточно, почему в MY_DYING не дает отдельно таймер запустить и считает его дубликатом это уже другой вопрос, timer_id там замечательно понимает.+ решения из chatgpt не подходят. Потому что компилятор не понимает что за команда timer_id == 2004
Не в коем случае не хотел вас как-то зацепить. Я пользовался chatgpt и он мне выдал вот что:=) Какие нафиг chatgpt ? Вы ничего не перепутали ? Там это решение парой строк кода достаточно, почему в MY_DYING не дает отдельно таймер запустить и считает его дубликатом это уже другой вопрос, timer_id там замечательно понимает.
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( понятия не имею ввиду чего)Не в коем случае не хотел вас как-то зацепить. Я пользовался 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; }
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 файле нет настройки этой?Здравствуйте всем!
Прошу консультации в части понимания как работает таймер после смерти РБ. Суть какая, послу убийства РБ в рифте, комната меняется через 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 ); } }
О каком файле идет речь ?А разве в самом .xml файле нет настройки этой?
в приватках может и есть а тут хз что за сборкаА разве в самом .xml файле нет настройки этой?
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;
}
// *---------------------------------------------------------------------------------------------------------------* //
// 차원의 틈새
// *---------------------------------------------------------------------------------------------------------------* //
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();
}
}
}
}
}
SendMakerScriptEvent( maker0, 3, 0, 0 );
(SendMakerScriptEvent( maker0, 4, 0, 0 );
// *---------------------------------------------------------------------------------------------------------------* //
// 차원의 틈새
// *---------------------------------------------------------------------------------------------------------------* //
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();
}
}
}
}
}
Он писал, что это AdvExt ILGFв приватках может и есть а тут хз что за сборка
Это ПТСкаА разве в самом .xml файле нет настройки этой?
Ну чего ты хочешь от человека, который вместо того чтобы попытаться разобраться в достаточно простом коде, сразу же бежит спрашивать "что делать" у чатгпт....Что за тупизм , не можете код добавить( c AddTimer(...) и TIMER_FIRED(...) и проверить на работу ?
Огромное спасибо за подробный ответЗачем ковырять ИИ моба, когда нужно ковырять ИИ мейкера? Можно случайно поставить времени больше его таймаута удаления и все сломать. Если вы поставите минуту туда ожидания, то труп моба задеспавнится раньше, чем он отработает этот таймер. А когда вы в мейкер эвент отправили, уже можно спать спокойно, потому что инстовые мейкеры не задеструктятся еще полчаса после закрытия инзоны.
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на 4Код:SendMakerScriptEvent( maker0, 3, 0, 0 );
Код:(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(script_event_arg1, 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(); } } } } }
прикольно работает =)def0.SendScriptEvent(script_event_arg1, 0, 0);
Спасибо, поправил) Скопипастил со свича кусок, не заметил что там аргумент)прикольно работает =)
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?