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