Здраствуйте. С помощью предыдущих трех вопросов смог разобраться с принципом утечек и избавиться фаталов на карте (Огромное спасибо отвечающим). Но встал вопрос уже производительности, о чем я всяких статей почитал и пошел делать на практике. Пару тригов так сделал(все нормально), а вот третий никак не могу сделать. Он приводит к фаталу. Прикладываю ГУИ триггер, его код, затем переделанный мною (типо оптимизированный), который ведет к фаталу при первом использовании. Кому не сложно, гляньте, я вроде его до небольшого размера сделал. Ну и если разберемся, буду благодарен за советы как сделать триггер еще более производительным.
ГУИ (1)
ГУИ (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 критуют, если передать равкод, содержащий буквы верхнего регистра.
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
мне кажется not нужно убрать" Попробую
Отредактирован goodlyhero
Далее при каждом действии Preload("Сообщение для дебага"), PreloadGenEnd("Файл для дебага")
В начале работы триггера пиши что триггер начал работу, в конце - кончил, после каждого действия - что сделано. Так, ты без проблем определишь точное место крита, сообщения прервутся, когда игра кританет, если крит конечно в триггере.
Отредактирован VinerX
Отредактирован rsfghd
Отредактирован rsfghd
напишешь в карте спасибо xgm и всё