Здраствуйте. Начну с кода:
function Trig_Income_and_Disincome_Copy_O_Func002Func001002001001002 takes nothing returns boolean
    return GetBooleanAnd( GetUnitFoodMade(GetFilterUnit()) == 30, IsUnitInGroup(GetFilterUnit(), udg_GroupEnded) == true )
endfunction

function Trig_Income_and_Disincome_Copy_O_Func002Func002002001003001001002 takes nothing returns boolean
    return GetBooleanAnd( GetUnitFoodMade(GetFilterUnit()) == 35, IsUnitInGroup(GetFilterUnit(), udg_GroupEnded) == true )
endfunction

function Trig_Income_and_Disincome_Copy_O_Func002Func003002001003001001002 takes nothing returns boolean
    return GetBooleanAnd( GetUnitFoodMade(GetFilterUnit()) == 40, IsUnitInGroup(GetFilterUnit(), udg_GroupEnded) == true )
endfunction

function Trig_Income_and_Disincome_Copy_O_Func002Func004002001003001001002 takes nothing returns boolean
    return GetBooleanAnd( GetUnitFoodMade(GetFilterUnit()) == 50, IsUnitInGroup(GetFilterUnit(), udg_GroupEnded) == true )
endfunction

function Trig_Income_and_Disincome_Copy_O_Func002Func005002001003001001002 takes nothing returns boolean
    return GetUnitFoodMade(GetFilterUnit()) == 150
endfunction

function Trig_Income_and_Disincome_Copy_O_Func002Func006002001003001001002 takes nothing returns boolean
    return GetUnitFoodMade(GetFilterUnit()) == 75
endfunction

function Trig_Income_and_Disincome_Copy_O_Func002A takes nothing returns nothing
    set udg_Boolexpr = Condition(function Trig_Income_and_Disincome_Copy_O_Func002Func001002001001002)
    set udg_LocalOtrad = GetUnitsOfPlayerMatching(GetEnumPlayer(), udg_Boolexpr)
    set udg_Inc = ( CountUnitsInGroup(udg_LocalOtrad) * 30 )
    call GroupClear( udg_LocalOtrad )
    set udg_Boolexpr = Condition(function Trig_Income_and_Disincome_Copy_O_Func002Func002002001003001001002)
    set udg_LocalOtrad = GetUnitsOfPlayerMatching(GetEnumPlayer(), udg_Boolexpr)
    set udg_Inc = ( ( udg_Inc + ( CountUnitsInGroup(udg_LocalOtrad)) * 35 ) ) 
    call GroupClear( udg_LocalOtrad )
    set udg_Boolexpr = Condition(function Trig_Income_and_Disincome_Copy_O_Func002Func003002001003001001002)
    set udg_LocalOtrad = GetUnitsOfPlayerMatching(GetEnumPlayer(), udg_Boolexpr)
    set udg_Inc = ( ( udg_Inc + ( CountUnitsInGroup(udg_LocalOtrad)) * 40 ) ) 
    call GroupClear( udg_LocalOtrad )
    set udg_Boolexpr = Condition(function Trig_Income_and_Disincome_Copy_O_Func002Func004002001003001001002)
    set udg_LocalOtrad = GetUnitsOfPlayerMatching(GetEnumPlayer(), udg_Boolexpr)
    set udg_Inc = ( ( udg_Inc + ( CountUnitsInGroup(udg_LocalOtrad)) * 50 ) )  
    call GroupClear( udg_LocalOtrad )
    set udg_Boolexpr = Condition(function Trig_Income_and_Disincome_Copy_O_Func002Func005002001003001001002)
    set udg_LocalOtrad = GetUnitsOfPlayerMatching(GetEnumPlayer(), udg_Boolexpr)
    set udg_Inc = ( ( udg_Inc + ( CountUnitsInGroup(udg_LocalOtrad)) * 150 ) )  
    call GroupClear( udg_LocalOtrad )
    set udg_Boolexpr = Condition(function Trig_Income_and_Disincome_Copy_O_Func002Func006002001003001001002)
    set udg_LocalOtrad = GetUnitsOfPlayerMatching(GetEnumPlayer(), udg_Boolexpr)
    set udg_Inc = ( ( udg_Inc + ( CountUnitsInGroup(udg_LocalOtrad)) * 75 ) ) 
    call GroupClear( udg_LocalOtrad )
    
    call DisplayTimedTextToForce( GetForceOfPlayer(GetEnumPlayer()), 5.00, ( "|cffffcc00Доход золота (каждые 15 секунд): |cff00ff00" + I2S(udg_Inc) ) )
    set udg_Inc = ( ( udg_Inc + ( GetPlayerTechCountSimple('R004', GetEnumPlayer()) * 75 ) ) * 1 )
    call DisplayTimedTextToForce( GetForceOfPlayer(GetEnumPlayer()), 5.00, ( "|cffffcc00Дополнительный доход (от улучшений): |cff00ff00" + I2S(( GetPlayerTechCountSimple('R004', GetEnumPlayer()) * 75 )) ) )
    set udg_Inc = ( ( udg_Inc - ( GetPlayerUnitCount(GetEnumPlayer(), false) * 25 ) ) * 1 )
    call DisplayTimedTextToForce( GetForceOfPlayer(GetEnumPlayer()), 5.00, ( "|cffffcc00Потребление на войска: |c00FF0303" + I2S(( 25 * GetPlayerUnitCount(GetEnumPlayer(), false) )) ) )
    if udg_Inc > 0 then
        call DisplayTimedTextToForce( GetForceOfPlayer(GetEnumPlayer()), 5.00, ( "|cffffcc00Итого баланс: |r" + ( "|cff00ff00" + I2S(udg_Inc) + " (Профицит)|r" ) ) )
    else
        if udg_Inc == 0 then
            call DisplayTimedTextToForce( GetForceOfPlayer(GetEnumPlayer()), 5.00, ( "|cffffcc00Итого баланс: |r" + ( "|cffffff00" + I2S(udg_Inc) + " (Нулевой бюджет)|r" ) ) )
        else
            call DisplayTimedTextToForce( GetForceOfPlayer(GetEnumPlayer()), 5.00, ( "|cffffcc00Итого баланс: |r" + ( "|cffff0000" + I2S(( udg_Inc * -1 )) + " (Дефицит)|r" ) ) )
        endif
    endif
    call AdjustPlayerStateBJ( udg_Inc, GetEnumPlayer(), PLAYER_STATE_RESOURCE_GOLD )
    set udg_Inc = 0
endfunction

function Trig_Income_and_Disincome_Copy_O_Actions takes nothing returns nothing
    call ForForce( GetPlayersAll(), function Trig_Income_and_Disincome_Copy_O_Func002A )
endfunction

//===========================================================================
function InitTrig_Income_and_Disincome_Copy_O takes nothing returns nothing
    set gg_trg_Income_and_Disincome_Copy_O = CreateTrigger(  )
    call DisableTrigger( gg_trg_Income_and_Disincome_Copy_O )
    call TriggerRegisterTimerExpireEventBJ( gg_trg_Income_and_Disincome_Copy_O, udg_Compteur1 )
    call TriggerAddAction( gg_trg_Income_and_Disincome_Copy_O, function Trig_Income_and_Disincome_Copy_O_Actions )
endfunction
Суть дела. Более менее нравится текущая система доходов расходов, но когда юнитов на карте становится много (тысячи неизбежны при кол-ве игроков 12+ уж точно), кроме обычных подлагиваний по причине попросту нереально огромного числа юнитов, есть именно короткое зависание при срабатывании вот этого кода. Что можно еще улучшить, изменить, чтобы на производительность в момент тика таймера (старт трига) провисание было минимальным (а лучше и не было).
Понимаю, копаться в чужом коде то еще дело, так что если надо что-то расписать или пояснить, говорите. Можете просто назвать идеи, куда копать. Спасибо за понимание.

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

VinerX, вджасс на рефе работает, но лучше тогда бы на луа тебе сделали)
если сомневаешься то сделаю на джассе тогда уж

вот, я без понятия работает ли, потому что лень создавать юнитов под эти условия, да и может накосячил случайно где-то и работает не так как задумано, поможет или нет не знаю, но попробуй что-ли(?)
код
function Trig_Income_Cond takes nothing returns boolean
    local integer i
    set udg_lastFilterUnit = GetFilterUnit( )
    
    set i = GetUnitFoodMade( udg_lastFilterUnit )
    if IsUnitInGroup( udg_lastFilterUnit, udg_GroupEnded ) or ( i == 150 or i == 75 ) then
        set udg_Inc = udg_Inc + i
    endif
    
    return false
endfunction

function Trig_Income_and_Disincome_Copy_Enum_Func takes nothing returns nothing
    local integer i
    set udg_TempPlayer = GetEnumPlayer( )
    
    set udg_Inc = 0
    call GroupEnumUnitsOfPlayer( udg_LocalOtrad, udg_TempPlayer, udg_IncomeCondition )
    
    call DisplayTimedTextToPlayer( udg_TempPlayer, 0.00, 0.00, 5.00, "|cffffcc00Доход золота (каждые 15 секунд):|r |cff00ff00" + I2S( udg_Inc ) + "|r" )
    
    set i = GetPlayerTechCount( udg_TempPlayer, 'R004', true ) * 75
    set udg_Inc = udg_Inc + i
    
    call DisplayTimedTextToPlayer( udg_TempPlayer, 0.00, 0.00, 5.00, "|cffffcc00Дополнительный доход (от улучшений):|r |cff00ff00" + I2S( i ) + "|r" )
    
    set i = GetPlayerUnitCount( udg_TempPlayer, false ) * 25
    set udg_Inc = udg_Inc - i
    
    call DisplayTimedTextToPlayer( udg_TempPlayer, 0.00, 0.00, 5.00,  "|cffffcc00Потребление на войска:|r |c00FF0303" + I2S( i ) + "|r" )
    
    if udg_Inc > 0 then
        call DisplayTimedTextToPlayer( udg_TempPlayer, 0.00, 0.00, 5.00,  "|cffffcc00Итого баланс:|r |cff00ff00" + I2S( udg_Inc ) + " (Профицит)|r" )
    elseif udg_Inc == 0 then
        call DisplayTimedTextToPlayer( udg_TempPlayer, 0.00, 0.00, 5.00,  "|cffffcc00Итого баланс:|r |cffffff000 (Нулевой бюджет)|r" )
    else
        call DisplayTimedTextToPlayer( udg_TempPlayer, 0.00, 0.00, 5.00,  "|cffffcc00Итого баланс:|r |cffff0000" + I2S( -udg_Inc ) + " (Дефицит)|r" )
    endif
    
    call SetPlayerState( udg_TempPlayer, PLAYER_STATE_GOLD_GATHERED, GetPlayerState( udg_TempPlayer, PLAYER_STATE_GOLD_GATHERED ) + udg_Inc )
    set udg_Inc = 0
endfunction

function Trig_Income_and_Disincome_Copy_O_Actions takes nothing returns nothing
    call ForForce( bj_FORCE_ALL_PLAYERS, function Trig_Income_and_Disincome_Copy_Enum_Func )
endfunction

//===========================================================================
function InitTrig_Income_and_Disincome_Copy_O takes nothing returns nothing
    set gg_trg_Income_and_Disincome_Copy_O = CreateTrigger(  )
    call DisableTrigger( gg_trg_Income_and_Disincome_Copy_O )
    call TriggerRegisterTimerExpireEvent( gg_trg_Income_and_Disincome_Copy_O, udg_Compteur1 )
    call TriggerAddAction( gg_trg_Income_and_Disincome_Copy_O, function Trig_Income_and_Disincome_Copy_O_Actions )
    
    set udg_IncomeCondition = Condition( function Trig_Income_Cond )
endfunction
Загруженные файлы
`
ОЖИДАНИЕ РЕКЛАМЫ...
2
27
2 года назад
2
бож лол, это ж просто конвернутое гуи)

сейчас попробую сделать получше, без понятия поможет ли
0
14
2 года назад
0
Нет, это конвернутое + некоторые функции я вписал в основной код.
1
27
2 года назад
1
вджасс юзаешь?

или чисто на джассе только?
0
14
2 года назад
0
Все на рефе, они там разве работают? Раз не знаю, значит не юзаю.
1
27
2 года назад
Отредактирован rsfghd
1
VinerX, вджасс на рефе работает, но лучше тогда бы на луа тебе сделали)
если сомневаешься то сделаю на джассе тогда уж

вот, я без понятия работает ли, потому что лень создавать юнитов под эти условия, да и может накосячил случайно где-то и работает не так как задумано, поможет или нет не знаю, но попробуй что-ли(?)
код
function Trig_Income_Cond takes nothing returns boolean
    local integer i
    set udg_lastFilterUnit = GetFilterUnit( )
    
    set i = GetUnitFoodMade( udg_lastFilterUnit )
    if IsUnitInGroup( udg_lastFilterUnit, udg_GroupEnded ) or ( i == 150 or i == 75 ) then
        set udg_Inc = udg_Inc + i
    endif
    
    return false
endfunction

function Trig_Income_and_Disincome_Copy_Enum_Func takes nothing returns nothing
    local integer i
    set udg_TempPlayer = GetEnumPlayer( )
    
    set udg_Inc = 0
    call GroupEnumUnitsOfPlayer( udg_LocalOtrad, udg_TempPlayer, udg_IncomeCondition )
    
    call DisplayTimedTextToPlayer( udg_TempPlayer, 0.00, 0.00, 5.00, "|cffffcc00Доход золота (каждые 15 секунд):|r |cff00ff00" + I2S( udg_Inc ) + "|r" )
    
    set i = GetPlayerTechCount( udg_TempPlayer, 'R004', true ) * 75
    set udg_Inc = udg_Inc + i
    
    call DisplayTimedTextToPlayer( udg_TempPlayer, 0.00, 0.00, 5.00, "|cffffcc00Дополнительный доход (от улучшений):|r |cff00ff00" + I2S( i ) + "|r" )
    
    set i = GetPlayerUnitCount( udg_TempPlayer, false ) * 25
    set udg_Inc = udg_Inc - i
    
    call DisplayTimedTextToPlayer( udg_TempPlayer, 0.00, 0.00, 5.00,  "|cffffcc00Потребление на войска:|r |c00FF0303" + I2S( i ) + "|r" )
    
    if udg_Inc > 0 then
        call DisplayTimedTextToPlayer( udg_TempPlayer, 0.00, 0.00, 5.00,  "|cffffcc00Итого баланс:|r |cff00ff00" + I2S( udg_Inc ) + " (Профицит)|r" )
    elseif udg_Inc == 0 then
        call DisplayTimedTextToPlayer( udg_TempPlayer, 0.00, 0.00, 5.00,  "|cffffcc00Итого баланс:|r |cffffff000 (Нулевой бюджет)|r" )
    else
        call DisplayTimedTextToPlayer( udg_TempPlayer, 0.00, 0.00, 5.00,  "|cffffcc00Итого баланс:|r |cffff0000" + I2S( -udg_Inc ) + " (Дефицит)|r" )
    endif
    
    call SetPlayerState( udg_TempPlayer, PLAYER_STATE_GOLD_GATHERED, GetPlayerState( udg_TempPlayer, PLAYER_STATE_GOLD_GATHERED ) + udg_Inc )
    set udg_Inc = 0
endfunction

function Trig_Income_and_Disincome_Copy_O_Actions takes nothing returns nothing
    call ForForce( bj_FORCE_ALL_PLAYERS, function Trig_Income_and_Disincome_Copy_Enum_Func )
endfunction

//===========================================================================
function InitTrig_Income_and_Disincome_Copy_O takes nothing returns nothing
    set gg_trg_Income_and_Disincome_Copy_O = CreateTrigger(  )
    call DisableTrigger( gg_trg_Income_and_Disincome_Copy_O )
    call TriggerRegisterTimerExpireEvent( gg_trg_Income_and_Disincome_Copy_O, udg_Compteur1 )
    call TriggerAddAction( gg_trg_Income_and_Disincome_Copy_O, function Trig_Income_and_Disincome_Copy_O_Actions )
    
    set udg_IncomeCondition = Condition( function Trig_Income_Cond )
endfunction
Загруженные файлы
Принятый ответ
2
14
2 года назад
2
Спасибо, как смогу, попробую.
2
14
2 года назад
2
Так, проверил в одиночке, работает. Теперь интересно насколько повлияет в мультиплеере. Огромное спасибо!
2
14
2 года назад
Отредактирован VinerX
2
Так, по сети обнаружилось, что доход не начисляется. Строки выводятся(доход, профицит, т.п.), но не нет начисления. А в одиночной я в итоге глядел триг до 10 минут который.
1
27
2 года назад
Отредактирован rsfghd
1
VinerX, я проверил, сорян, гуи дебильное, ненавижу, его фиг поймёшь)
замени PLAYER_STATE_GOLD_GATHERED на PLAYER_STATE_RESOURCE_GOLD
2
14
2 года назад
Отредактирован VinerX
2
Понял. Сам в коде кружил, по функциям, все не мог увидеть в чем ошибка. Спасибо!
1
27
2 года назад
1
VinerX, благодари только если сработает, потому что люди смотрят на это и думают будто я правда тебе тут чем-то помог
Чтобы оставить комментарий, пожалуйста, войдите на сайт.