Здраствуйте. С помощью предыдущих трех вопросов смог разобраться с принципом утечек и избавиться фаталов на карте (Огромное спасибо отвечающим). Но встал вопрос уже производительности, о чем я всяких статей почитал и пошел делать на практике. Пару тригов так сделал(все нормально), а вот третий никак не могу сделать. Он приводит к фаталу. Прикладываю ГУИ триггер, его код, затем переделанный мною (типо оптимизированный), который ведет к фаталу при первом использовании. Кому не сложно, гляньте, я вроде его до небольшого размера сделал. Ну и если разберемся, буду благодарен за советы как сделать триггер еще более производительным.
ГУИ (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

Answer

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

GetUnitGoldCost, GetUnitWoodCost и GetUnitBuildTime критуют, если передать равкод, содержащий буквы верхнего регистра.

Shown only a small set of comments around the pointed one. Go to actual.
3
Голосов: 3
rsfghd - 1 year ago
Edited by
3
Голосов: 3
Фаталит код или гуи? чтоб знать куда внимание обращать
1
Голосов: 1
goodlyhero - 1 year ago
1
Голосов: 1
Возможно, если бы был лог с критом, было бы понятнее (мне), так ничего в глаза не бросается, все слишком непонятно.
0
Голосов: 0
VinerX - 1 year ago
Edited by
0
Голосов: 0
rsfghd:
Фаталит код или гуи? чтоб знать куда внимание обращать
Код, который третий. Гуи норм работает, переведенный в код гуи(без обработки) тоже.
goodlyhero:
Возможно, если бы был лог с критом, было бы понятнее (мне), так ничего в глаза не бросается, все слишком непонятно.
Сейчас займусь.

Вот лог. Я его посмотрел, но чет кроме проблем с моделями не понял ничего. Но это точно не то, дело в триге.
Uploaded files
1
Голосов: 1
Borodach - 1 year ago
1
Голосов: 1
Проверь переменную перед делением, не равна ли 0
3
Голосов: 3
rsfghd - 1 year ago
3
Голосов: 3
Borodach, вроде ноль можно делить, но на ноль нельзя
1
Голосов: 1
Borodach - 1 year ago
1
Голосов: 1
А, ну да, тупость сказал
2
Голосов: 2
rsfghd - 1 year ago
Edited by
2
Голосов: 2
попробуй этот код, я хз
expand
//Условие

function Trig_Disincome_OV_Func001Func004002 takes nothing returns boolean
    return GetWidgetLife( GetFilterUnit( ) ) >= 0.405 and GetOwningPlayer( GetFilterUnit( ) ) == bj_groupEnumOwningPlayer and not IsUnitType( GetFilterUnit( ), UNIT_TYPE_STRUCTURE )
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 ) 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( 'A0A5', GetEnumUnit( ) ) > 0 then
            set udg_GoldCost = udg_GoldCost + udg_Price * 0.10 * ( 1.60 - GetUnitAbilityLevel( 'A0A5', GetEnumUnit( ) ) * 0.10 )
        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 )
    
    set bj_groupEnumOwningPlayer = GetEnumPlayer( )
    call GroupEnumUnitsInRect( udg_LocalOtrad2, bj_mapInitialPlayableArea, udg_Boolexpr )
    call ForGroup( udg_LocalOtrad2, function Trig_Disincome_OV_Func001Func006A )
    call GroupClear( udg_LocalOtrad2 )
    call SetPlayerState( bj_groupEnumOwningPlayer, PLAYER_STATE_RESOURCE_GOLD, GetPlayerState( bj_groupEnumOwningPlayer, PLAYER_STATE_RESOURCE_GOLD ) - R2I( udg_GoldCost ) )
    set udg_LocalText2 = "|cffff0000Расходы:|r " + I2S( R2I( udg_GoldCost ) )
    call DisplayTextToPlayer( bj_groupEnumOwningPlayer, 0.00, 0.00, udg_LocalText2 )
    // -------
    // ---------------------------Система сверхпотребления-----------------------------
    set udg_LocalInteger = R2I( udg_Kol_voUnitod / 50.00 )
    call SetPlayerState( bj_groupEnumOwningPlayer, PLAYER_STATE_RESOURCE_GOLD, GetPlayerState( bj_groupEnumOwningPlayer, PLAYER_STATE_RESOURCE_GOLD ) + udg_LocalInteger * -500 )
    set udg_LocalText2 = "|cffff0000Логистика:|r " + I2S( udg_LocalInteger * 500 ) + "(" + I2S( udg_LocalInteger ) + "x)"
    call DisplayTextToPlayer( bj_groupEnumOwningPlayer, 0.00, 0.00, udg_LocalText2 )
    set udg_Kol_voUnitod = 0
    set udg_LocalInteger = 0
    // ---------------------------Система сверхпотребления конец-----------------------------
    // -------
    // ---------------------------Система коррупции-----------------------------
    if GetPlayerTechCount( bj_groupEnumOwningPlayer, 'R04O', true ) > 0 then
        set udg_GoldCost = udg_GoldCost * GetPlayerTechCount( bj_groupEnumOwningPlayer, 'R04O', true ) * 0.15
        call SetPlayerState( bj_groupEnumOwningPlayer, PLAYER_STATE_RESOURCE_GOLD, GetPlayerState( bj_groupEnumOwningPlayer, PLAYER_STATE_RESOURCE_GOLD ) + R2I( udg_GoldCost ) )
        set udg_LocalText2 = "|cff800000Наворовано бюджета: |r" + R2S( udg_GoldCost )
        call DisplayTextToPlayer( bj_groupEnumOwningPlayer, 0.00, 0.00, udg_LocalText2 )
    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
вряд ли поможет, к тому же я компилятором не прошёлся, мб ошибки есть
0
Голосов: 0
VinerX - 1 year ago
0
Голосов: 0
Я все же на всякий пожарный проверил единственное деление в триггере, но отключение блока с ним не помогло.

rsfghd,
Хорошо, сейчас тестану.
2
Голосов: 2
rsfghd - 1 year ago
2
Голосов: 2
а, ещё одно, я слышал что GetUnitGoldCost может вызвать краш, мб на рефе пофиксили, но на 1.26 вроде нет

GetUnitGoldCost, GetUnitWoodCost и GetUnitBuildTime критуют, если передать равкод, содержащий буквы верхнего регистра.
Shown only a small set of comments around the pointed one. Go to actual.
To leave a comment please sign in to the site.