Здраствуйте. С помощью предыдущих трех вопросов смог разобраться с принципом утечек и избавиться фаталов на карте (Огромное спасибо отвечающим). Но встал вопрос уже производительности, о чем я всяких статей почитал и пошел делать на практике. Пару тригов так сделал(все нормально), а вот третий никак не могу сделать. Он приводит к фаталу. Прикладываю ГУИ триггер, его код, затем переделанный мною (типо оптимизированный), который ведет к фаталу при первом использовании. Кому не сложно, гляньте, я вроде его до небольшого размера сделал. Ну и если разберемся, буду благодарен за советы как сделать триггер еще более производительным.
ГУИ (1)
ГУИ (2)
ГУИ в код
function Trig_Disincome_O_Copy_Func001Func004002001 takes nothing returns boolean
    return ( IsUnitType(GetFilterUnit(), UNIT_TYPE_STRUCTURE) == false )
endfunction

function Trig_Disincome_O_Copy_Func001Func004002002001 takes nothing returns boolean
    return ( IsUnitAliveBJ(GetFilterUnit()) == true )
endfunction

function Trig_Disincome_O_Copy_Func001Func004002002002 takes nothing returns boolean
    return ( GetOwningPlayer(GetFilterUnit()) == GetEnumPlayer() )
endfunction

function Trig_Disincome_O_Copy_Func001Func004002002 takes nothing returns boolean
    return GetBooleanAnd( Trig_Disincome_O_Copy_Func001Func004002002001(), Trig_Disincome_O_Copy_Func001Func004002002002() )
endfunction

function Trig_Disincome_O_Copy_Func001Func004002 takes nothing returns boolean
    return GetBooleanAnd( Trig_Disincome_O_Copy_Func001Func004002001(), Trig_Disincome_O_Copy_Func001Func004002002() )
endfunction

function Trig_Disincome_O_Copy_Func001Func006Func002Func006C takes nothing returns boolean
    if ( not ( GetUnitAbilityLevelSwapped('A0A5', GetEnumUnit()) != 0 ) ) then
        return false
    endif
    return true
endfunction

function Trig_Disincome_O_Copy_Func001Func006Func002C takes nothing returns boolean
    if ( not ( IsUnitType(GetEnumUnit(), UNIT_TYPE_HERO) == true ) ) then
        return false
    endif
    return true
endfunction

function Trig_Disincome_O_Copy_Func001Func006A takes nothing returns nothing
    set udg_Kol_voUnitod = ( udg_Kol_voUnitod + 1 )
    if ( Trig_Disincome_O_Copy_Func001Func006Func002C() ) then
        set udg_GoldCost = ( udg_GoldCost + 100.00 )
    else
        set udg_Price = GetUnitGoldCost(GetUnitTypeId(GetEnumUnit()))
        set udg_GoldCost = ( udg_GoldCost + ( udg_Price * 0.10 ) )
        // ---------------------------Особые условия-----------------------------          +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        // ---------------------------Топливо гоблинов-----------------------------
        if ( Trig_Disincome_O_Copy_Func001Func006Func002Func006C() ) then
            set udg_GoldCost = ( udg_GoldCost + ( ( udg_Price * 0.10 ) * ( 1.60 - ( 0.10 * I2R(GetUnitAbilityLevelSwapped('A0A5', GetEnumUnit())) ) ) ) )
        else
        endif
        // ---------------------------Топливо гоблинов закончилось-----------------------------
    endif
endfunction

function Trig_Disincome_O_Copy_Func001Func022C takes nothing returns boolean
    if ( not ( GetPlayerTechCountSimple('R04O', GetEnumPlayer()) > 1 ) ) then
        return false
    endif
    return true
endfunction

function Trig_Disincome_O_Copy_Func001A takes nothing returns nothing
    set udg_GoldCost = 0.00
    set udg_Kol_voUnitod = 0
    set udg_LocalInteger = 0
    set udg_Boolexpr = Condition(function Trig_Disincome_O_Copy_Func001Func004002)
    call GroupEnumUnitsInRect( udg_LocalOtrad2, bj_mapInitialPlayableArea, udg_Boolexpr )
    call ForGroupBJ( udg_LocalOtrad2, function Trig_Disincome_O_Copy_Func001Func006A )
    call GroupClear( udg_LocalOtrad2 )
    call AdjustPlayerStateBJ( ( R2I(udg_GoldCost) * -1 ), GetEnumPlayer(), PLAYER_STATE_RESOURCE_GOLD )
    set udg_LocalText2 = ( "|cffff0000Расходы:|r " + I2S(R2I(udg_GoldCost)) )
    call DisplayTextToPlayer( GetEnumPlayer( ), 0, 0, udg_LocalText2 )
    // -------
    // ---------------------------Система сверхпотребления-----------------------------
    set udg_LocalInteger = R2I(( I2R(udg_Kol_voUnitod) / 50.00 ))
    call AdjustPlayerStateBJ( ( udg_LocalInteger * -500 ), GetEnumPlayer(), PLAYER_STATE_RESOURCE_GOLD )
    set udg_LocalText2 = ( "|cffff0000Логистика:|r " + ( I2S(( udg_LocalInteger * 500 )) + ( "(" + ( I2S(udg_LocalInteger) + "x)" ) ) ) )
    call DisplayTextToPlayer( GetEnumPlayer( ), 0, 0, udg_LocalText2 )
    set udg_Kol_voUnitod = 0
    set udg_LocalInteger = 0
    // ---------------------------Система сверхпотребления-----------------------------
    // -------
    // ---------------------------Система коррупции-----------------------------
    if ( Trig_Disincome_O_Copy_Func001Func022C() ) then
        set udg_GoldCost = ( udg_GoldCost * ( I2R(GetPlayerTechCountSimple('R04O', GetEnumPlayer())) * 0.15 ) )
        call AdjustPlayerStateBJ( ( R2I(udg_GoldCost) * 1 ), GetEnumPlayer(), PLAYER_STATE_RESOURCE_GOLD )
        set udg_LocalText2 = ( "|cff800000Наворовано бюджета: |r" + R2S(udg_GoldCost) )
        call DisplayTextToPlayer( GetEnumPlayer( ), 0, 0, udg_LocalText2 )
    else
    endif
    // ---------------------------Система коррупции конец-----------------------------
    // -------
    // -------
    set udg_GoldCost = 0.00
endfunction

function Trig_Disincome_O_Copy_Actions takes nothing returns nothing
    call ForForce( udg_AllPlayers, function Trig_Disincome_O_Copy_Func001A )
endfunction

//===========================================================================
function InitTrig_Disincome_O_Copy takes nothing returns nothing
    set gg_trg_Disincome_O_Copy = CreateTrigger(  )
    call TriggerRegisterTimerExpireEventBJ( gg_trg_Disincome_O_Copy, udg_IncomeTimerSecond )
    call TriggerAddAction( gg_trg_Disincome_O_Copy, function Trig_Disincome_O_Copy_Actions )
endfunction
Отредаченный код:
//Условие

function Trig_Disincome_OV_Func001Func004002 takes nothing returns boolean
    return GetBooleanAnd( IsUnitType(GetFilterUnit(), UNIT_TYPE_STRUCTURE) == false, GetBooleanAnd( IsUnitAliveBJ(GetFilterUnit()) == true, GetOwningPlayer(GetFilterUnit()) == GetEnumPlayer() ) )
endfunction

// Каждый юнит

function Trig_Disincome_OV_Func001Func006A takes nothing returns nothing
    set udg_Kol_voUnitod = ( udg_Kol_voUnitod + 1 )
    if ( not ( IsUnitType(GetEnumUnit(), UNIT_TYPE_HERO) == true ) ) then
        set udg_GoldCost = ( udg_GoldCost + 100.00 )
    else
        set udg_Price = GetUnitGoldCost(GetUnitTypeId(GetEnumUnit()))
        set udg_GoldCost = ( udg_GoldCost + ( udg_Price * 0.10 ) )
        // ---------------------------Особые условия-----------------------------          +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        // ---------------------------Топливо гоблинов-----------------------------
        if ( GetUnitAbilityLevelSwapped('A0A5', GetEnumUnit()) != 0 ) then
            set udg_GoldCost = ( udg_GoldCost + ( ( udg_Price * 0.10 ) * ( 1.60 - ( 0.10 * I2R(GetUnitAbilityLevelSwapped('A0A5', GetEnumUnit())) ) ) ) )
        else
        endif
        // ---------------------------Топливо гоблинов закончилось-----------------------------
    endif
endfunction


//Каждый игрок

function Trig_Disincome_OV_Func001A takes nothing returns nothing
    set udg_GoldCost = 0.00
    set udg_Kol_voUnitod = 0
    set udg_LocalInteger = 0
    set udg_Boolexpr = Condition(function Trig_Disincome_OV_Func001Func004002)
    call GroupEnumUnitsInRect( udg_LocalOtrad2, bj_mapInitialPlayableArea, udg_Boolexpr )
    call ForGroupBJ( udg_LocalOtrad2, function Trig_Disincome_OV_Func001Func006A )
    call GroupClear( udg_LocalOtrad2 )
    call AdjustPlayerStateBJ( ( R2I(udg_GoldCost) * -1 ), GetEnumPlayer(), PLAYER_STATE_RESOURCE_GOLD )
    set udg_LocalText2 = ( "|cffff0000Расходы:|r " + I2S(R2I(udg_GoldCost)) )
    call DisplayTextToPlayer( GetEnumPlayer( ), 0, 0, udg_LocalText2 )
    // -------
    // ---------------------------Система сверхпотребления-----------------------------
    set udg_LocalInteger = R2I(( I2R(udg_Kol_voUnitod) / 50.00 ))
    call AdjustPlayerStateBJ( ( udg_LocalInteger * -500 ), GetEnumPlayer(), PLAYER_STATE_RESOURCE_GOLD )
    set udg_LocalText2 = ( "|cffff0000Логистика:|r " + ( I2S(( udg_LocalInteger * 500 )) + ( "(" + ( I2S(udg_LocalInteger) + "x)" ) ) ) )
    call DisplayTextToPlayer( GetEnumPlayer( ), 0, 0, udg_LocalText2 )
    set udg_Kol_voUnitod = 0
    set udg_LocalInteger = 0
    // ---------------------------Система сверхпотребления конец-----------------------------
    // -------
    // ---------------------------Система коррупции-----------------------------
    if ( GetPlayerTechCountSimple('R04O', GetEnumPlayer()) > 0 ) then
        set udg_GoldCost = ( udg_GoldCost * ( I2R(GetPlayerTechCountSimple('R04O', GetEnumPlayer())) * 0.15 ) )
        call AdjustPlayerStateBJ( ( R2I(udg_GoldCost) * 1 ), GetEnumPlayer(), PLAYER_STATE_RESOURCE_GOLD )
        set udg_LocalText2 = ( "|cff800000Наворовано бюджета: |r" + R2S(udg_GoldCost) )
        call DisplayTextToPlayer( GetEnumPlayer( ), 0, 0, udg_LocalText2 )
    else
    endif
    // ---------------------------Система коррупции конец-----------------------------
endfunction

// Основа
function Trig_Disincome_OV_Actions takes nothing returns nothing
    call ForForce( udg_AllPlayers, function Trig_Disincome_OV_Func001A )
endfunction

//===========================================================================
function InitTrig_Disincome_OV takes nothing returns nothing
    set gg_trg_Disincome_OV = CreateTrigger(  )
    call TriggerRegisterTimerExpireEventBJ( gg_trg_Disincome_OV, udg_IncomeTimerSecond )
    call TriggerAddAction( gg_trg_Disincome_OV, function Trig_Disincome_OV_Actions )
endfunction

Принятый ответ

а, ещё одно, я слышал что GetUnitGoldCost может вызвать краш, мб на рефе пофиксили, но на 1.26 вроде нет

GetUnitGoldCost, GetUnitWoodCost и GetUnitBuildTime критуют, если передать равкод, содержащий буквы верхнего регистра.
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
14
3 года назад
0
Ну, походу придется с нуля оптимизировать, каждый шаг проверяя даже не валидатором, а запуском карты...
3
27
3 года назад
3
закомментить то бишь
0
14
3 года назад
0
rsfghd, ща попробую

Закомментил чисто форгруп "попробуй отключить форгруп". Код сейчас скинутый тобой(+ починеный)
call ForGroup( udg_LocalOtrad2, function Trig_Disincome_OV_Func001Func006A )

Да, оно не фаталит!
2
27
3 года назад
Отредактирован rsfghd
2
VinerX, тогда включи обратно форгруп и закомменти всё что после GroupClear идёт, до комментария с коррупцией конец
0
14
3 года назад
Отредактирован VinerX
0
Значит тут где-то проблема? фор груп функция
function Trig_Disincome_OV_Func001Func006A takes nothing returns nothing
    set udg_Kol_voUnitod = udg_Kol_voUnitod + 1
    
    if not IsUnitType( GetEnumUnit(), UNIT_TYPE_HERO ) then
        set udg_GoldCost = udg_GoldCost + 100.00
    else
        set udg_Price = GetUnitGoldCost( GetUnitTypeId( GetEnumUnit( ) ) )
        set udg_GoldCost = udg_GoldCost + udg_Price * 0.10
        // ---------------------------Особые условия-----------------------------          +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        // ---------------------------Топливо гоблинов-----------------------------
        if GetUnitAbilityLevel( GetEnumUnit( ), 'A0A5' ) > 0 then
            set udg_GoldCost = udg_GoldCost + udg_Price * 0.10 * ( 1.60 - GetUnitAbilityLevel( GetEnumUnit( ), 'A0A5') * 0.10 )
        endif
        // ---------------------------Топливо гоблинов закончилось-----------------------------
    endif
endfunction

rsfghd:
VinerX, тогда включи обратно форгруп и закомменти всё что после GroupClear идёт, до комментария с коррупцией
ок
2
27
3 года назад
2
может проблема быть с тем, что возвращает форгруп и где оно юзается потом, там же переменные перезаписываются

если краш произойдёт, значит и вправду в форгрупе дело, и всё равно взгляд падает на GetUnitGoldCost

меня именно if not IsUnitType( GetEnumUnit( ), UNIT_TYPE_HERO ) then смущает
мне кажется not нужно убрать
0
14
3 года назад
0
Краш произошел
3
27
3 года назад
3
VinerX, у героев верхний регистр идёт в равкоде
0
14
3 года назад
0
"меня именно if not IsUnitType( GetEnumUnit( ), UNIT_TYPE_HERO ) then смущает
мне кажется not нужно убрать" Попробую
2
27
3 года назад
2
у тебя если юнит герой то происходят проверки с той функцией, а если наоборот, то +100 голды
0
14
3 года назад
0
rsfghd:
у тебя если юнит герой то происходят проверки с той функцией, а если наоборот, то +100 голды
Да, должно быть за гера 100 голды, а за юнита высчитывать.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.