Есть карта.
Есть код.
Код в карте на джассе.
Кода в карте очень много.
Постоянно возникает проблема: при добавлении нового кода отключаются некоторые имеющиеся триггеры - просто перестают действовать. Достаточно удалить часть любых триггеров, чтобы те, что отключились, снова стали действовать, так что дело именно в количестве триггеров и, в меньшей степени - в объеме кода.
Сперва пришлось просто перестать добавлять новые, систематизировать старые на похожие события и вписывать все в них с соответствующими ифзенэлсами.
Но даже так постоянно просто от увеличения объема кода те или иные триггеры отключаются, решается дальнейшим объединением.
Короче, чем меньше триггеров получается, тем больше кода в них суммарно может быть, но с увеличением количества кода все больше и больше триггеров отключается и все дальше идет объединение.
Что делать?
И есть ли вероятность, что в итоге останется единственный триггер и он тоже отключится (кошмарный сон :D)?
Хотя офк до такого еще очень далеко (триггеров еще значительно больше сотни осталось).
Может, имеет смысл вообще все или почти все сразу в кастом коде писать?
Как помню, может еще помочь ExecuteFunc xgm.guru/forum/showthread.php?t=30152 но можно поподробнее, как ее юзать. Вот, допустим, есть некий триггер, конвертнутый в JASS. Как использовать именно ExecuteFunc для его инициализации, ятп, надо именно для инициализации?
*************************************
Добавлено:
Ну это не идеальный мб джасс, но и не конвертнутый гуи уже явно.
Это вообще мне сложно сказать, что такое, за такое мб вообще в поликлинику сдают, для опытов (с).
Уже, наверное, ответвление, как геометрия Лобачевского.
Прикол в том, что придумывать идеи в разы тяжелее, чем кодить их, поэтому стараюсь в коде прописать кучу подсказок, чтобы голова не болела при его создании, просмотре и обработке. А вообще уже понимаю, что это решается оптимизацией частей кода в отдельные функции и дальнейшим вызовом этих функций, но приписываю себе подсказки, чтобы JASS хоть немного на русский язык получался похож.
Вот, короче, пример того, что у меня в отдельной карте 1-м триггером для отдельного героя (регистрируются триггеры на касты заклинаний только при их изучении и иногда только для этого героя, система замудренная). А потом это всё поглощается еще бОльшим триггером для нескольких уже героев сразу.
Триггер реагирует на изучение любым героем любого заклинания, далее проверяется, любое ли это из 4-х заклинаний этого героя и далее идет все остальное.
Кто что-то поймет, тому пряник.
По крайней мере самостоятельно относительно комфортно кодить именно так. Потом все уже будет и дальше оптимизироваться в отдельные функции, но всегда снабжаться подсказками.
За ответ на вопрос спасибо.
код
**********

//ПЕРВАЯ ГЕРОЙСКАЯ СПОСОБНОСТЬ - РАВКОД ДОЛЖЕН ВЕЗДЕ СОВПАДАТЬ
function Trig_HellkiteAll_Func002Func001C takes nothing returns boolean
if ( not ( GetLearnedSkillBJ() == 'A26F' ) ) then
return false
endif
if ( not ( GetUnitAbilityLevelSwapped('A26F', GetTriggerUnit()) == 1 ) ) then
return false
endif
return true
endfunction
//ПЕРВАЯ ГЕРОЙСКАЯ СПОСОБНОСТЬ - РАВКОД ДОЛЖЕН ВЕЗДЕ СОВПАДАТЬ - ЗАКРЫТО

//ВТОРАЯ ГЕРОЙСКАЯ СПОСОБНОСТЬ - РАВКОД ДОЛЖЕН ВЕЗДЕ СОВПАДАТЬ
function Trig_HellkiteAll_Func002Func002C takes nothing returns boolean
if ( not ( GetLearnedSkillBJ() == 'A26G' ) ) then
return false
endif
if ( not ( GetUnitAbilityLevelSwapped('A26G', GetTriggerUnit()) == 1 ) ) then
return false
endif
return true
endfunction
//ВТОРАЯ ГЕРОЙСКАЯ СПОСОБНОСТЬ - РАВКОД ДОЛЖЕН ВЕЗДЕ СОВПАДАТЬ - ЗАКРЫТО

//ТРЕТЬЯ ГЕРОЙСКАЯ СПОСОБНОСТЬ - РАВКОД ДОЛЖЕН ВЕЗДЕ СОВПАДАТЬ
function Trig_HellkiteAll_Func002Func003C takes nothing returns boolean
if ( not ( GetLearnedSkillBJ() == 'A26H' ) ) then
return false
endif
if ( not ( GetUnitAbilityLevelSwapped('A26H', GetTriggerUnit()) == 1 ) ) then
return false
endif
return true
endfunction
//ТРЕТЬЯ ГЕРОЙСКАЯ СПОСОБНОСТЬ - РАВКОД ДОЛЖЕН ВЕЗДЕ СОВПАДАТЬ - ЗАКРЫТО

//ЧЕТВЁРТАЯ ГЕРОЙСКАЯ СПОСОБНОСТЬ - РАВКОД ДОЛЖЕН ВЕЗДЕ СОВПАДАТЬ
function Trig_HellkiteAll_Func002Func004C takes nothing returns boolean
if ( not ( GetLearnedSkillBJ() == 'A26I' ) ) then
return false
endif
if ( not ( GetUnitAbilityLevelSwapped('A26I', GetTriggerUnit()) == 1 ) ) then
return false
endif
return true
endfunction
//ЧЕТВЁРТАЯ ГЕРОЙСКАЯ СПОСОБНОСТЬ - РАВКОД ДОЛЖЕН ВЕЗДЕ СОВПАДАТЬ - ЗАКРЫТО

function Trig_HellkiteAll_Func002C takes nothing returns boolean
if ( Trig_HellkiteAll_Func002Func001C() ) then
return true
endif
if ( Trig_HellkiteAll_Func002Func002C() ) then
return true
endif
if ( Trig_HellkiteAll_Func002Func003C() ) then
return true
endif
if ( Trig_HellkiteAll_Func002Func004C() ) then
return true
endif
return false
endfunction

function Trig_HellkiteAll_Conditions takes nothing returns boolean
if ( not ( IsUnitIllusionBJ(GetTriggerUnit()) == false ) ) then
return false
endif
if ( not Trig_HellkiteAll_Func002C() ) then
return false
endif
return true
endfunction


function HellkiteSounds2 takes nothing returns nothing
local timer t = GetExpiredTimer()
local trigger sounds = LoadTriggerHandle(udg_Hash,GetHandleId(t),10)
call EnableTrigger(sounds)
call PauseTimer(t)
call DestroyTimer(t)
call FlushChildHashtable(udg_Hash,GetHandleId(t))
set sounds = null
set t = null
endfunction

function HellkiteSounds takes nothing returns nothing
local timer t = CreateTimer()
local trigger sounds = GetTriggeringTrigger()

//Много звуков - лучше так - ПЯТИДЕСЯТИБЛОКАМИ И ДАЖЕ ЧЕРЕЗ ГЛОБАЛКУ В РЕДКОМ СЛУЧАЕ
if ( GetPlayerController(GetOwningPlayer(GetTriggerUnit())) == MAP_CONTROL_USER ) then
set udg_integer = GetRandomInt (1, 57)


//ОТКРЫТО

if (udg_integer == 1) then
call PlaySoundOnUnitBJ( gg_snd_Hellkite1, 100, GetTriggerUnit() )
else
if (udg_integer == 2) then
call PlaySoundOnUnitBJ( gg_snd_Hellkite2, 100, GetTriggerUnit() )
else
if (udg_integer == 3) then
call PlaySoundOnUnitBJ( gg_snd_Hellkite3, 100, GetTriggerUnit() )
else
if (udg_integer == 4) then
call PlaySoundOnUnitBJ( gg_snd_Hellkite4, 100, GetTriggerUnit() )
else
if (udg_integer == 5) then
call PlaySoundOnUnitBJ( gg_snd_Hellkite5, 100, GetTriggerUnit() )
else
if (udg_integer == 6) then
call PlaySoundOnUnitBJ( gg_snd_Hellkite6, 100, GetTriggerUnit() )
else
if (udg_integer == 7) then
call PlaySoundOnUnitBJ( gg_snd_Hellkite7, 100, GetTriggerUnit() )
else
if (udg_integer == 8) then
call PlaySoundOnUnitBJ( gg_snd_Hellkite8, 100, GetTriggerUnit() )
else
if (udg_integer == 9) then
call PlaySoundOnUnitBJ( gg_snd_Hellkite9, 100, GetTriggerUnit() )
else
if (udg_integer == 10) then
call PlaySoundOnUnitBJ( gg_snd_Hellkite10, 100, GetTriggerUnit() )
else
if (udg_integer == 11) then
call PlaySoundOnUnitBJ( gg_snd_Hellkite11, 100, GetTriggerUnit() )
else
if (udg_integer == 12) then
call PlaySoundOnUnitBJ( gg_snd_Hellkite12, 100, GetTriggerUnit() )
else
if (udg_integer == 13) then
call PlaySoundOnUnitBJ( gg_snd_Hellkite13, 100, GetTriggerUnit() )
else
if (udg_integer == 14) then
call PlaySoundOnUnitBJ( gg_snd_Hellkite14, 100, GetTriggerUnit() )
else
if (udg_integer == 15) then
call PlaySoundOnUnitBJ( gg_snd_Hellkite15, 100, GetTriggerUnit() )
else
if (udg_integer == 16) then
call PlaySoundOnUnitBJ( gg_snd_Hellkite16, 100, GetTriggerUnit() )
else
if (udg_integer == 17) then
call PlaySoundOnUnitBJ( gg_snd_Hellkite17, 100, GetTriggerUnit() )
else
if (udg_integer == 18) then
call PlaySoundOnUnitBJ( gg_snd_Hellkite18, 100, GetTriggerUnit() )
else
if (udg_integer == 19) then
call PlaySoundOnUnitBJ( gg_snd_Hellkite19, 100, GetTriggerUnit() )
else
if (udg_integer == 20) then
call PlaySoundOnUnitBJ( gg_snd_Hellkite20, 100, GetTriggerUnit() )
else
if (udg_integer == 21) then
call PlaySoundOnUnitBJ( gg_snd_Hellkite21, 100, GetTriggerUnit() )
else
if (udg_integer == 22) then
call PlaySoundOnUnitBJ( gg_snd_Hellkite22, 100, GetTriggerUnit() )
else
if (udg_integer == 23) then
call PlaySoundOnUnitBJ( gg_snd_Hellkite23, 100, GetTriggerUnit() )
else
if (udg_integer == 24) then
call PlaySoundOnUnitBJ( gg_snd_Hellkite24, 100, GetTriggerUnit() )
else
if (udg_integer == 25) then
call PlaySoundOnUnitBJ( gg_snd_Hellkite25, 100, GetTriggerUnit() )
else
if (udg_integer == 26) then
call PlaySoundOnUnitBJ( gg_snd_Hellkite26, 100, GetTriggerUnit() )
else
if (udg_integer == 27) then
call PlaySoundOnUnitBJ( gg_snd_Hellkite27, 100, GetTriggerUnit() )
else
if (udg_integer == 28) then
call PlaySoundOnUnitBJ( gg_snd_Hellkite28, 100, GetTriggerUnit() )
else
if (udg_integer == 29) then
call PlaySoundOnUnitBJ( gg_snd_Hellkite29, 100, GetTriggerUnit() )
else
if (udg_integer == 30) then
call PlaySoundOnUnitBJ( gg_snd_Hellkite30, 100, GetTriggerUnit() )
else
if (udg_integer == 31) then
call PlaySoundOnUnitBJ( gg_snd_Hellkite31, 100, GetTriggerUnit() )
else
if (udg_integer == 32) then
call PlaySoundOnUnitBJ( gg_snd_Hellkite32, 100, GetTriggerUnit() )
else
if (udg_integer == 33) then
call PlaySoundOnUnitBJ( gg_snd_Hellkite33, 100, GetTriggerUnit() )
else
if (udg_integer == 34) then
call PlaySoundOnUnitBJ( gg_snd_Hellkite34, 100, GetTriggerUnit() )
else
if (udg_integer == 35) then
call PlaySoundOnUnitBJ( gg_snd_Hellkite35, 100, GetTriggerUnit() )
else
if (udg_integer == 36) then
call PlaySoundOnUnitBJ( gg_snd_Hellkite36, 100, GetTriggerUnit() )
else
if (udg_integer == 37) then
call PlaySoundOnUnitBJ( gg_snd_Hellkite37, 100, GetTriggerUnit() )
else
if (udg_integer == 38) then
call PlaySoundOnUnitBJ( gg_snd_Hellkite38, 100, GetTriggerUnit() )
else
if (udg_integer == 39) then
call PlaySoundOnUnitBJ( gg_snd_Hellkite39, 100, GetTriggerUnit() )
else
if (udg_integer == 40) then
call PlaySoundOnUnitBJ( gg_snd_Hellkite40, 100, GetTriggerUnit() )
else
if (udg_integer == 41) then
call PlaySoundOnUnitBJ( gg_snd_Hellkite41, 100, GetTriggerUnit() )
else
if (udg_integer == 42) then
call PlaySoundOnUnitBJ( gg_snd_Hellkite42, 100, GetTriggerUnit() )
else
if (udg_integer == 43) then
call PlaySoundOnUnitBJ( gg_snd_Hellkite43, 100, GetTriggerUnit() )
else
if (udg_integer == 44) then
call PlaySoundOnUnitBJ( gg_snd_Hellkite44, 100, GetTriggerUnit() )
else
if (udg_integer == 45) then
call PlaySoundOnUnitBJ( gg_snd_Hellkite45, 100, GetTriggerUnit() )
else
if (udg_integer == 46) then
call PlaySoundOnUnitBJ( gg_snd_Hellkite46, 100, GetTriggerUnit() )
else
if (udg_integer == 47) then
call PlaySoundOnUnitBJ( gg_snd_Hellkite47, 100, GetTriggerUnit() )
else
if (udg_integer == 48) then
call PlaySoundOnUnitBJ( gg_snd_Hellkite48, 100, GetTriggerUnit() )
else
if (udg_integer == 49) then
call PlaySoundOnUnitBJ( gg_snd_Hellkite49, 100, GetTriggerUnit() )
else
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
if (udg_integer == 50) then
call PlaySoundOnUnitBJ( gg_snd_Hellkite50, 100, GetTriggerUnit() )
else
endif

//ЗАКРЫТО


//ОТКРЫТО

if (udg_integer == 51) then
call PlaySoundOnUnitBJ( gg_snd_Hellkite51, 100, GetTriggerUnit() )
else
if (udg_integer == 52) then
call PlaySoundOnUnitBJ( gg_snd_Hellkite52, 100, GetTriggerUnit() )
else
if (udg_integer == 53) then
call PlaySoundOnUnitBJ( gg_snd_Hellkite53, 100, GetTriggerUnit() )
else
if (udg_integer == 54) then
call PlaySoundOnUnitBJ( gg_snd_Hellkite54, 100, GetTriggerUnit() )
else
if (udg_integer == 55) then
call PlaySoundOnUnitBJ( gg_snd_Hellkite55, 100, GetTriggerUnit() )
else
if (udg_integer == 56) then
call PlaySoundOnUnitBJ( gg_snd_Hellkite56, 100, GetTriggerUnit() )
else
endif
endif
endif
endif
endif
endif
if (udg_integer == 57) then
call PlaySoundOnUnitBJ( gg_snd_Hellkite57, 100, GetTriggerUnit() )
else
endif

//ЗАКРЫТО

endif
call DisableTrigger(GetTriggeringTrigger())
call SaveTriggerHandle(udg_Hash, GetHandleId(t),10,sounds)
call TimerStart (t, 1.7, false, function HellkiteSounds2)
//Много звуков - лучше так - закрыто.
set sounds = null
set t = null
endfunction

function RainOfDestruction2 takes nothing returns nothing
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5, u6, enemies
local timer t = GetExpiredTimer()
local unit u5 = LoadUnitHandle(udg_Hash,GetHandleId(t),2)
local unit u6
local group enemies = GetUnitsInRectAll(GetPlayableMapRect())
local real damage = GetUnitState(u5, UNIT_STATE_MANA)
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
local integer i = LoadInteger (udg_Hash,GetHandleId(t),3)

set i  = i + 1
call SaveInteger (udg_Hash, GetHandleId(t),3,i)

if (i>7) and (i<9) then
//ДАМАЖИТ С ОТДЕЛЬНЫМ СПЕЦЭФФЕКТОМ, ЧИСЛО ОК
loop
set u6=FirstOfGroup(enemies)
exitwhen u6==null
call GroupRemoveUnit(enemies,u6)
call UnitDamageTargetBJ(u5,u6,damage,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_MAGIC)  
call DestroyEffect(AddSpecialEffectTarget("Hellkite42.mdx",u6,"chest")) 
endloop
//ДАМАЖИТ С ОТДЕЛЬНЫМ СПЕЦЭФФЕКТОМ, ЧИСЛО ОК - ЗАКРЫТО
//ОБНУЛЯЕМ МАНУ, ВРЕМЕННО УБИРАЕМ МАРКЕР
call SetUnitManaBJ( u5, 0 )
call UnitRemoveAbilityBJ( 'A26J', u5 )
//ОБНУЛЯЕМ МАНУ, ВРЕМЕННО УБИРАЕМ МАРКЕР - ЗАКРЫТО.
else
endif

//СПЕЦЭФФЕКТ - ГОТОВЬТЕСЬ ЗАЩИЩАТЬСЯ ОТ УРОНА
loop
set u6=FirstOfGroup(enemies)
exitwhen u6==null
call GroupRemoveUnit(enemies,u6)
//ГЕРОИ МОГУТ ПРИКРЫТЬСЯ АНТИМАГИЕЙ
    if (i == 6) and (GetRandomInt(1,2) == 1) and (GetUnitState(u6,UNIT_STATE_LIFE) > 0) and IsUnitType(u6, UNIT_TYPE_HERO) == true and ( GetPlayerController(GetOwningPlayer(u6)) != MAP_CONTROL_USER ) then
    call UnitAddItemByIdSwapped( 'I015', u6 )
    call UnitUseItem( u6, GetItemOfTypeFromUnitBJ(u6, 'I015') )
    endif
//ГЕРОИ МОГУТ ПРИКРЫТЬСЯ АНТИМАГИЕЙ - ЗАКРЫТО.
call DestroyEffect(AddSpecialEffectTarget("Hellkite41.mdx",u6,"chest"))
endloop
//СПЕЦЭФФЕКТ - ГОТОВЬТЕСЬ ЗАЩИЩАТЬСЯ ОТ УРОНА - ЗАКРЫТО

if (i>8) then
//ВОЗВРАЩАЕМ МАРКЕР НЕИЗМЕННОСТИ МАНЫ
    call UnitAddAbilityBJ( 'A26J', u5 )
    call UnitMakeAbilityPermanent (u5, true, 'A26J')
//ВОЗВРАЩАЕМ МАРКЕР НЕИЗМЕННОСТИ МАНЫ - ЗАКРЫТО
call PauseTimer(t)
call DestroyTimer(t)
call FlushChildHashtable(udg_Hash, GetHandleId(t))
else
endif

call DestroyGroup (enemies)

//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5, u6, enemies
set t = null
set u5 = null
set u6 = null
set enemies = null
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction


function RainOfDestruction takes nothing returns nothing
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5
local timer t = CreateTimer()
local unit u5 = GetTriggerUnit()
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
local integer i = 0

if ( GetSpellAbilityId() == 'A26I' ) then
call PlaySoundOnUnitBJ( gg_snd_HellkiteRainofDestruction, 100, u5 )
call SaveUnitHandle(udg_Hash, GetHandleId(t),2,u5)
call SaveInteger (udg_Hash, GetHandleId(t),3,i)
call TimerStart(t,0.5,true,function RainOfDestruction2)
else
call PauseTimer(t)
call DestroyTimer(t)
call FlushChildHashtable(udg_Hash, GetHandleId(t))
endif

//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5
set t = null
set u5 = null
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction

function ManaInsideCastAnySpell2 takes nothing returns nothing
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5
local timer t = GetExpiredTimer()
local unit u5 = LoadUnitHandle(udg_Hash, GetHandleId(t),2)
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО

//ВОЗВРАЩАЕМ МАРКЕР НЕИЗМЕННОСТИ МАНЫ
    call UnitAddAbilityBJ( 'A26J', u5 )
    call UnitMakeAbilityPermanent (u5, true, 'A26J')
//ВОЗВРАЩАЕМ МАРКЕР НЕИЗМЕННОСТИ МАНЫ - ЗАКРЫТО

call PauseTimer(t)
call DestroyTimer(t)
call FlushChildHashtable(udg_Hash,GetHandleId(t))

//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5
set t = null
set u5 = null
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction

function ManaInsideCastAnySpell takes nothing returns nothing
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5
local timer t = CreateTimer()
local unit u5 = GetTriggerUnit()
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО

if ( GetUnitAbilityLevelSwapped(GetSpellAbilityId(), GetTriggerUnit()) >= 1 ) then

//ЕСЛИ ЭТО НАША АБИЛКА, ТО ВОСПОЛНЯЕМ МАНУ С ЭФФЕКТАМИ
if ( GetSpellAbilityId() == 'A26H' ) then
call SetUnitManaBJ( GetTriggerUnit(), ( GetUnitStateSwap(UNIT_STATE_MANA, GetTriggerUnit()) + 0.40 * GetUnitStateSwap(UNIT_STATE_MAX_MANA, GetTriggerUnit())))
    call AddSpecialEffectTargetUnitBJ( "chest", u5, "Hellkite3.mdl" )
    call ConditionalTriggerExecute( gg_trg_destroyspeceffect )
    call AddSpecialEffectTargetUnitBJ( "overhead", u5, "Hellkite3.mdl" )
    call ConditionalTriggerExecute( gg_trg_destroyspeceffect )
else
endif
//ЕСЛИ ЭТО НАША АБИЛКА, ТО ВОСПОЛНЯЕМ МАНУ С ЭФФЕКТАМИ - ЗАКРЫТО.

//УБИРАЕМ МАРКЕР НЕИЗМЕННОСТИ МАНЫ
call UnitRemoveAbilityBJ( 'A26J', u5 )
call SaveUnitHandle(udg_Hash, GetHandleId(t),2,u5)
call TimerStart(t,0.2,false,function ManaInsideCastAnySpell2)
//УБИРАЕМ МАРКЕР НЕИЗМЕННОСТИ МАНЫ - ЗАКРЫТО.

else
call PauseTimer(t)
call DestroyTimer(t)
call FlushChildHashtable(udg_Hash,GetHandleId(t))
endif

//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5
set t = null
set u5 = null
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction


function ManaInside takes nothing returns nothing
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t2, u5
local timer t2 = GetExpiredTimer()
local unit u5 = LoadUnitHandle(udg_Hash, GetHandleId(t2),2)
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
local real r = LoadReal(udg_Hash, GetHandleId(t2),7)

//Если героя нет, то разрушить таймер, чтобы не крутился и не жрал ресурсы.
if (u5 == null) then
call PauseTimer(t2)
call DestroyTimer(t2)
call FlushChildHashtable(udg_Hash,GetHandleId(t2))
else

//ПРИМОРОЗИТЬ ИЛИ ЗАПОМНИТЬ МАНУ
if (GetUnitAbilityLevelSwapped('A26J', u5) == 0) then
set r = GetUnitStateSwap(UNIT_STATE_MANA, u5)
call SaveReal(udg_Hash,GetHandleId(t2),7,r)
else
call SetUnitManaBJ( u5, r )
endif
//ПРИМОРОЗИТЬ ИЛИ ЗАПОМНИТЬ МАНУ - ЗАКРЫТО.
endif

//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t2, u5
set t2 = null
set u5 = null
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction


function BurningFel2 takes nothing returns nothing
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5, u6
local timer t = GetExpiredTimer()
local unit u5 = LoadUnitHandle(udg_Hash,GetHandleId(t),2)
local unit u6 = LoadUnitHandle(udg_Hash,GetHandleId(t),1)
local integer level = GetUnitAbilityLevelSwapped('A26F',u5)
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО

//УДАЛЕНИЕ МАРКЕРНОЙ АБИЛЫ, ЧТОБЫ ПРОХОДИЛИ ДАБЛКАСТЫ И МУЛЬТИКАСТЫ, НО С ИЗНАЧАЛЬНОГО КАСТЕРА ЭФФЕКТ БЫЛ ОДИН РАЗ
call UnitRemoveAbilityBJ( 'A26L', u5 )
//УДАЛЕНИЕ МАРКЕРНОЙ АБИЛЫ - ЗАКРЫТО.

//ЕСЛИ БОЛЬШЕ ПОЛОВИНЫ МАКС. МАНЫ - ЗАБЛОКАТЬ И РАЗБЛОКАТЬ АБИЛУ, СНЯТЬ ПОЛМАНЫ.
if ( GetUnitStateSwap(UNIT_STATE_MANA, u5) >= GetUnitStateSwap(UNIT_STATE_MAX_MANA, u5) / 2.00 ) then
    call UnitRemoveAbilityBJ('A26F',u5)
    call UnitAddAbilityBJ('A26F',u5)
    call SetUnitAbilityLevelSwapped('A26F',u5,level)
    call SetUnitManaBJ( u5, ( GetUnitStateSwap(UNIT_STATE_MANA, u5) / 2.00 ) )
endif
//ЕСЛИ БОЛЬШЕ ПОЛОВИНЫ МАКС. МАНЫ - ЗАБЛОКАТЬ И РАЗБЛОКАТЬ АБИЛУ, СНЯТЬ ПОЛМАНЫ - ЗАКРЫТО.

call PauseTimer(t)
call DestroyTimer(t)
call FlushChildHashtable(udg_Hash,GetHandleId(t))

//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5, u6
set t = null
set u5 = null
set u6 = null
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction

function BurningFel takes nothing returns nothing
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5, u6, p, enemies
local timer t = CreateTimer()
local unit u5 = GetTriggerUnit()
local unit u6 = GetSpellTargetUnit()
local location p = GetUnitLoc(u6)
local group enemies = GetUnitsInRangeOfLocAll(375.00, p)
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
local integer i = 0
local real damage = 20 + 60 * GetUnitAbilityLevelSwapped ('A26F', u5)
if ( GetSpellAbilityId() == 'A26F' ) and (GetUnitAbilityLevelSwapped('A26L',u5) == 0) then

//ДОБАВКА МАРКЕРНОЙ АБИЛЫ, ЧТОБЫ ПРОХОДИЛИ ДАБЛКАСТЫ И МУЛЬТИКАСТЫ, НО С ИЗНАЧАЛЬНОГО КАСТЕРА ЭФФЕКТ БЫЛ ОДИН РАЗ
call UnitAddAbilityBJ( 'A26L', u5 )
//ДОБАВКА МАРКЕРНОЙ АБИЛЫ, ЧТОБЫ ПРОХОДИЛИ ДАБЛКАСТЫ И МУЛЬТИКАСТЫ, НО С ИЗНАЧАЛЬНОГО КАСТЕРА ЭФФЕКТ БЫЛ ОДИН РАЗ - ЗАКРЫТО.

//УРОН ПО ПРОТИВНИКАМ
loop
set u6=FirstOfGroup(enemies)
exitwhen u6==null
call GroupRemoveUnit(enemies,u6)
if ( ( IsUnitType((u6), UNIT_TYPE_ANCIENT) != true ) and ( IsUnitType((u6), UNIT_TYPE_STRUCTURE) != true ) and ( GetUnitAbilityLevelSwapped('Avul', u6) != 1 ) and (IsUnitAliveBJ(u6) == true )) and (IsUnitEnemy(u6,GetOwningPlayer(u5)) == true) then
call UnitDamageTargetBJ(u5,u6,damage,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_MAGIC)
endif    
endloop

//УРОН ПО ПРОТИВНИКАМ - ЗАКРЫТО.


call SaveUnitHandle(udg_Hash, GetHandleId(t),2,u5)
call SaveUnitHandle(udg_Hash, GetHandleId(t),1,u6)
call SaveInteger (udg_Hash, GetHandleId(t),3,i)
call TimerStart(t,0.15,false,function BurningFel2)
else
call PauseTimer(t)
call DestroyTimer(t)
call FlushChildHashtable(udg_Hash, GetHandleId(t))
endif
call RemoveLocation (p)
call DestroyGroup (enemies)
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5, u6, p, enemies
set t = null
set u5 = null
set u6 = null
set p = null
set enemies = null
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction


function InevitablePower takes nothing returns nothing
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5
local timer t=GetExpiredTimer()
local unit u5=LoadUnitHandle(udg_Hash,GetHandleId(t),2)
local real r = 0
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО



//Если героя нет, то разрушить таймер, чтобы не крутился и не жрал ресурсы.
if (u5 == null) then
call PauseTimer(t)
call DestroyTimer(t)
call FlushChildHashtable(udg_Hash,GetHandleId(t))
else

call DestroyEffect(AddSpecialEffectTarget("Hellkite2.mdx",u5,"origin"))

//ПОВЫШЕНИЕ МАКС. МАНЫ НА НУЖНОЕ ЧИСЛО
set r = GetUnitAbilityLevelSwapped ('A26G',u5) * 3
loop
exitwhen r < 1
call UnitAddAbilityBJ('A25P',u5)
call SetUnitAbilityLevelSwapped('A25P',u5,2)
call UnitRemoveAbilityBJ('A25P',u5)
set r = r - 1
endloop
//ПОВЫШЕНИЕ МАКС. МАНЫ НА НУЖНОЕ ЧИСЛО - ЗАКРЫТО.


endif

//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5
set t = null
set u5 = null
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction

function Trig_HellkiteAll_Actions takes nothing returns nothing
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, t2, u5, mynewhero, soundset
local timer t = CreateTimer()
local timer t2 = CreateTimer()
local unit u5 = GetTriggerUnit()
local trigger mynewhero = CreateTrigger()
local trigger soundset = CreateTrigger()
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
local real r = 0

 //Озвучка
    if (GetUnitAbilityLevelSwapped('A26K',GetTriggerUnit()) == 1 ) then
    call UnitRemoveAbilityBJ('A26K', GetTriggerUnit())
    call TriggerRegisterUnitEvent(soundset,GetTriggerUnit(), EVENT_UNIT_SELECTED)
    call TriggerAddAction(soundset,function HellkiteSounds)
    else
    call DestroyTrigger(soundset)
    endif
    //Всё, закрыто про озвучку

//Если первый спелл, то заносим функцию для него
if ( GetLearnedSkillBJ() == 'A26F' ) then
call TriggerRegisterAnyUnitEventBJ(mynewhero, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddAction(mynewhero,function BurningFel)
endif

    //Если второй спелл, то триггер рушим, а если не второй, то рушим таймер t
    if ( GetLearnedSkillBJ() == 'A26G' ) then
    call DestroyTrigger(mynewhero)
    call SaveUnitHandle(udg_Hash,GetHandleId(t),2,u5)
    call TimerStart(t,4,true, function InevitablePower)
    else
    call PauseTimer(t)
    call DestroyTimer(t)
    call FlushChildHashtable(udg_Hash,GetHandleId(t))
    endif
    
    
//Если третий спелл, то заносим функцию для него и запускаем таймер, а если не третий, то рушим таймер t2
if ( GetLearnedSkillBJ() == 'A26H' ) then
call IssueImmediateOrderBJ( u5, "replenishlifeon" )
call TriggerRegisterUnitEvent(mynewhero, u5, EVENT_UNIT_SPELL_EFFECT)
call TriggerAddAction(mynewhero,function ManaInsideCastAnySpell)
set r = GetUnitStateSwap(UNIT_STATE_MANA, u5)
call SetUnitManaBJ( u5, r )
call UnitAddAbilityBJ( 'A26J', u5 )
call UnitMakeAbilityPermanent (u5, true, 'A26J')
call SaveUnitHandle (udg_Hash,GetHandleId(t2),2,u5)
call SaveReal(udg_Hash,GetHandleId(t2),7,r)
call TimerStart (t2, 0.01, true, function ManaInside)
else
call PauseTimer(t2)
call DestroyTimer(t2)
call FlushChildHashtable(udg_Hash,GetHandleId(t2))
endif

//Если четвертый спелл, то заносим функцию для него
if ( GetLearnedSkillBJ() == 'A26I' ) then
call TriggerRegisterUnitEvent(mynewhero, u5, EVENT_UNIT_SPELL_EFFECT)
call TriggerAddAction(mynewhero,function RainOfDestruction)
endif


//В любом случае переменную триггера офк потом обнуляем, а триггер, если остался, оставляем.
//И обнуляем все прочие переменные.
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, t2, u5, mynewhero, soundset
set t = null
set t2 = null
set u5 = null
set mynewhero = null
set soundset = null
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction

function InitTrig_HellkiteAll takes nothing returns nothing
//РЕГИСТРАЦИЯ СОБЫТИЙ, УСЛОВИЙ И ДЕЙСТВИЙ ТРИГГЕРА НА ИЗУЧЕНИЕ ГЕРОЙСКИХ СПОСОБНОСТЕЙ
set gg_trg_HellkiteAll = CreateTrigger(  )
call TriggerRegisterAnyUnitEventBJ( gg_trg_HellkiteAll, EVENT_PLAYER_HERO_SKILL )
call TriggerAddCondition( gg_trg_HellkiteAll, Condition( function Trig_HellkiteAll_Conditions ) )
call TriggerAddAction( gg_trg_HellkiteAll, function Trig_HellkiteAll_Actions )
//РЕГИСТРАЦИЯ СОБЫТИЙ, УСЛОВИЙ И ДЕЙСТВИЙ ТРИГГЕРА НА ИЗУЧЕНИЕ ГЕРОЙСКИХ СПОСОБНОСТЕЙ - ЗАКРЫТО
endfunction

Лимит операций, обычно это беда настигает заядлых гуишников.
На jass обычно нету таких проблем.
Создайте таймер с периодом .00 сек и запускайте им функции инициализации триггеров.
функция типа InitTrig_Имя триггера - это функция инициализации триггера, она вызывается из функции InitCustomTriggers, но если этих вызовов очень много то функция упирается в лимит операций и поток завершается так и не создав все триггеры.
`
ОЖИДАНИЕ РЕКЛАМЫ...
32
Лимит операций, обычно это беда настигает заядлых гуишников.
На jass обычно нету таких проблем.
Создайте таймер с периодом .00 сек и запускайте им функции инициализации триггеров.
функция типа InitTrig_Имя триггера - это функция инициализации триггера, она вызывается из функции InitCustomTriggers, но если этих вызовов очень много то функция упирается в лимит операций и поток завершается так и не создав все триггеры.
Принятый ответ
28
quq_CCCP, ну так автор и есть заядлый гуишник который конвертирует триггеры в код и думает что теперь карта на джасс
а вообще эта проблема вызвана не столько гуи сколько кривым кодом
если нормально строить архитектуру то более чем 15 триггеров там не будет и без всякий ифов
27
ClotPh, что такой длинный код скинул? тебе лучше скачать jngp, там есть все функции, подсветка. Научись раскрывать их, не трать время на гуи. Ты уже перерос, надо идти дальше.
давай поговорим про оптимизации кода
вот пример
function Trig_HellkiteAll_Func002Func001C takes nothing returns boolean
if ( not ( GetLearnedSkillBJ() == 'A26F' ) ) then
return false
endif
if ( not ( GetUnitAbilityLevelSwapped('A26F', GetTriggerUnit()) == 1 ) ) then
return false
endif
return true
endfunction
переделываем на
function  Trig_HellkiteAll_Func002Func001C takes nothing returns boolean
return( GetLearnedSkillBJ() == 'A26F' ) and ( GetUnitAbilityLevelSwapped('A26F', GetTriggerUnit()) == 1 )) 
endfunction
затем раскрываем гуишные функции, и меняем некрасивое название функции Trig_HellkiteAll_Func002Func001C например на T_HellkiteAll_C только не забудь поменять внизу где эта функции вызывается. А то будет считаться несуществующей, и вызовет фатал
function T_HellkiteAll_C takes nothing returns boolean
return( GetLearnedSkill() == 'A26F' ) and ( GetUnitAbilityLevel(GetTriggerUnit(), 'A26F') == 1 ) 
endfunction
вот эта функция Trig_HellkiteAll_Func002C не должно существовать, раскрываем ее.
function Trig_HellkiteAll_Func002C takes nothing returns boolean
if ( Trig_HellkiteAll_Func002Func001C() ) then
return true
endif
if ( Trig_HellkiteAll_Func002Func002C() ) then
return true
endif
if ( Trig_HellkiteAll_Func002Func003C() ) then
return true
endif
if ( Trig_HellkiteAll_Func002Func004C() ) then
return true
endif
return false
endfunction
заменяем на
function T_HellkiteAll_C takes nothing returns boolean
local integer id=GetLearnedSkill()
return(id == 'A26F' or id='A26G' or id='A26H' or 'A26I') and ( GetUnitAbilityLevel(GetTriggerUnit(), id) == 1 ) 
endfunction
объяснил как работает, еще один пример IsUnitIllusionBJ(GetTriggerUnit()) == false можно заменить на
not IsUnitIllusion(GetTriggerUnit())
еще можно здесь GetOwningPlayer(GetTriggerUnit()) заменить на GetTriggerPlayer()
теперь следующее, взял три условия
if (udg_integer == 1) then
call PlaySoundOnUnitBJ( gg_snd_Hellkite1, 100, GetTriggerUnit() )
else
if (udg_integer == 2) then
call PlaySoundOnUnitBJ( gg_snd_Hellkite2, 100, GetTriggerUnit() )
else
if (udg_integer == 3) then
call PlaySoundOnUnitBJ( gg_snd_Hellkite3, 100, GetTriggerUnit() )
else
endif
endif
endif
можно заменить на
if (udg_integer == 1) then
call PlaySoundOnUnitBJ( gg_snd_Hellkite1, 100, GetTriggerUnit() )
elseif (udg_integer == 2) then
call PlaySoundOnUnitBJ( gg_snd_Hellkite2, 100, GetTriggerUnit() )
elseif (udg_integer == 3) then
call PlaySoundOnUnitBJ( gg_snd_Hellkite3, 100, GetTriggerUnit() )
endif
еще внизу, когда много вызовов одной и той же функции, можно заменить на переменную
local timer t = GetExpiredTimer()
local unit u5 = LoadUnitHandle(udg_Hash,GetHandleId(t),2)
local unit u6 = LoadUnitHandle(udg_Hash,GetHandleId(t),1)
меняем на
local timer t = GetExpiredTimer()
local integer id=GetHandleId(t)
local unit u5 = LoadUnitHandle(udg_Hash,id,2)
local unit u6 = LoadUnitHandle(udg_Hash,id,1)
вот есть общее событие, которое создает для всех игроков TriggerRegisterAnyUnitEventBJ, его можно раскрыть. Зачем всем игрокам давать, лучше создавать определенным игрокам,которые существуют в игре. Например, при инициализации проверить и дать тем кто существует или если это определенный трииггерный скилл дай его только игроку, у который изучит скилл.
Еще можно все события на одно событие попробовать заюзать. Есть основное условие, добавленное через TriggerAddCondition, оно отсеивает не нужных. Короче надо строить конструкции так чтобы не делало лишнюю работу.
Еще хочу сказать, что не стоить юзать кучу таймеров. Есть конечно два варианта вызвать что-то либо таймером либо рычагом. Рычаг - событие триггера.
Кодить в начале тяжело, потом привыкнешь.
в некоторых случаях используют глобалку на всю игру, чтобы лишний раз не создавай объект или не вызывать лишний рах одни и те же функции.
нагрузки возникает если например в одну секунду обрабатывает кучу инфы, наскоолько например длинный код или много ифов пересмотрит игра, процессор как вот работает: проверит одно условие (подходит, не подходит), если подходит выполняем, если нет идем дальше проверять следующее условие. Можно было было бы как-то урезать или вставить фильтр. а так вас не должно беспокоить то, что все хранится на одном триггере. Надо смотреть то насколько часто вызывается и какой объем инфы будет перерабатывать.
ищем на тему лимит операции на сайте и форуме, много инфы, скинул лишь 3 ссылки
28
вы оба юзайте каты
а то листать эти стены текста довольно долго
по поводу кода автора
это чистый конверт с гуи
вот статьи
там целая куча статей в которых сказано как правильно писать код
Чтобы оставить комментарий, пожалуйста, войдите на сайт.