Здраствуйте. С помощью предыдущих трех вопросов смог разобраться с принципом утечек и избавиться фаталов на карте (Огромное спасибо отвечающим). Но встал вопрос уже производительности, о чем я всяких статей почитал и пошел делать на практике. Пару тригов так сделал(все нормально), а вот третий никак не могу сделать. Он приводит к фаталу. Прикладываю ГУИ триггер, его код, затем переделанный мною (типо оптимизированный), который ведет к фаталу при первом использовании. Кому не сложно, гляньте, я вроде его до небольшого размера сделал. Ну и если разберемся, буду благодарен за советы как сделать триггер еще более производительным.
ГУИ (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
2 года назад
0
"меня именно if not IsUnitType( GetEnumUnit( ), UNIT_TYPE_HERO ) then смущает
мне кажется not нужно убрать" Попробую
2
27
2 года назад
2
у тебя если юнит герой то происходят проверки с той функцией, а если наоборот, то +100 голды
0
14
2 года назад
0
rsfghd:
у тебя если юнит герой то происходят проверки с той функцией, а если наоборот, то +100 голды
Да, должно быть за гера 100 голды, а за юнита высчитывать.
2
8
2 года назад
Отредактирован goodlyhero
2
По классике для анализа крита пиши в прелоад: В начале игры написал PreloadGenStart()
Далее при каждом действии Preload("Сообщение для дебага"), PreloadGenEnd("Файл для дебага")
В начале работы триггера пиши что триггер начал работу, в конце - кончил, после каждого действия - что сделано. Так, ты без проблем определишь точное место крита, сообщения прервутся, когда игра кританет, если крит конечно в триггере.
2
14
2 года назад
Отредактирован VinerX
2
rsfghd, ты нашел решение. Огромное спасибо. Уж если карта дойдет до релиза, все секретки\уникалки тебе будут доступны. Огромное спасибо.
4
27
2 года назад
Отредактирован rsfghd
4
Да, должно быть за гера 100 голды, а за юнита высчитывать.
ну здрасьте, а тут наоборот)

rsfghd, ты нашел решение.
не я, а PT153 с quq_CCCP

значит ничерта не пофиксили в рефе
2
14
2 года назад
2
goodlyhero:
По классике для анализа крита пиши в прелоад: В начале игры написал PreloadGenStart()
Далее при каждом действии Preload("Сообщение для дебага"), PreloadGenEnd("Файл для дебага")
В начале работы триггера пиши что триггер начал работу, в конце - кончил, после каждого действия - что сделано. Так, ты без проблем определишь точное место крита, сообщения прервутся, когда игра кританет, если крит конечно в триггере.
Понял, учту.
4
27
2 года назад
Отредактирован rsfghd
4
мне не нужны секреты, кредиты и прочее, у меня даже рефа нет)
напишешь в карте спасибо xgm и всё
Чтобы оставить комментарий, пожалуйста, войдите на сайт.