Плохо разбираюсь в Jass.
Посоветуйте, как правильно оптимизировать код, потому что вот эта колбаса вначале даже по моим скромным меркам никуда не годится, а если подобная из условий if идет то уже на 25 варианте редактор говорит " не братан, я такое не обработаю" То на двадцатом как то еще обработать может, но в моменты, когда в игре идет обращение к этому триггеру игра ощутимо подвисает и словно пробуксовывает, пытаясь это прожевать.
<отрывок кода>
.........function Trig_Wawe_Func001Func001Func001Func001Func001Func001Func001Func001Func001Func001Func001Func001Func001Func001Func001Func001Func001Func001Func005Func001Func001Func001Func001Func001Func001Func005Func006C takes nothing returns boolean
if ( not ( udg_Glob_Wawe >= 26 ) ) then
return false
endif
return true
endfunction..............
Код полностью

SсRealm, а вопрос советую закрыть ибо ток суицидниц будет в этом всём разбираться
`
ОЖИДАНИЕ РЕКЛАМЫ...
23
Похожие вопросы:

ответ
SetUnitPosition довольно тяжелая операци, юзайте SetUnitX\Y в конце полета юзай SetUnitPosition для того чтобы юнит не залетел в непроходимое место.
Фильтр просто ужас, ну кто так фильтры делает?
Проверка на 'Aloc', я в ужасе на кой черт проверять на дамми если GropEnumUnitsInRange\Rect не выделяет москитов, тока EnumOfPlayer может пикнуть москитов, остальное не пикает их, на то они и москиты...
Вот как выглядит нормальный фильтр без локалок и прочего
function EnemyFilter takes nothing returns boolean
    set bj_lastFilterUnit = GetFilterUnit( )
    return GetUnitState( bj_lastFilterUnit, UNIT_STATE_LIFE ) > 0.405 and IsUnitEnemy( bj_lastFilterUnit, bj_groupEnumOwningPlayer ) and not( IsUnitType( bj_lastFilterUnit, UNIT_TYPE_MAGIC_IMMUNE ) or IsUnitType( bj_lastFilterUnit, UNIT_TYPE_MECHANICAL ) or IsUnitInvulnerable( bj_lastFilterUnit ) )
endfunction
UnitDamageTargetEx - красиво но нафиг ненужно обводить в отдельную функцию с тучей аргументов + жутко неудобно, 100500 аргументов у функции и фиг знает за что какой от вечает, прямо так UnitDamageTarget, без отдельной функции.
Туча констант, тоже хорошо тока длят наработок, на деле ставь конкретные значения или юзай Difine vjass'a.
ответ
globals
    constant integer Order_attack = 851983
endglobals

function CreateCreepByTypeIdAndSend takes p player, integer id, real x, real y, real dx, real dy returns nothing
   local unit u = CreateUnit(p, id, x, y, 0.)
   call IssuePointOrderById(u, Order_attack, dx, dy) // Можно упростить и сделать как у ScopteRectuS
   set u = null
endfunction

function Trig_CreepsCenter1_Actions takes nothing returns nothing
    call CreateCreepByTypeIdAndSend(Player(0), 'o000', 0., 5300., 0., -5300.)
    call CreateCreepByTypeIdAndSend(Player(0), 'o001', 0., 5300., 0., -5300.)

    call CreateCreepByTypeIdAndSend(Player(1), 'h000', -5300., 0., 5300., 0.)
    call CreateCreepByTypeIdAndSend(Player(1), 'h001', -5300., 0., 5300., 0.)
	
    call CreateCreepByTypeIdAndSend(Player(3), 'n000', 0., -5300., 0., 5300.)
    call CreateCreepByTypeIdAndSend(Player(3), 'n001', 0., -5300., 0., 5300.)
	
    call CreateCreepByTypeIdAndSend(Player(6), 'u000', 5300., 0., -5300., 0.)
    call CreateCreepByTypeIdAndSend(Player(6), 'u001', 5300., 0., -5300., 0.)
endfunction

function InitTrig_CreepsCenter1 takes nothing returns nothing
    set gg_trg_CreepsCenter1 = CreateTrigger(  )
    call TriggerRegisterTimerEventPeriodic( gg_trg_CreepsCenter1, 1.00 )
    call TriggerAddAction( gg_trg_CreepsCenter1, function Trig_CreepsCenter1_Actions )
endfunction

Нужно 40 одинаковых юнитов - циклы и массивы в помощь.
ответ
а, ещё одно, я слышал что GetUnitGoldCost может вызвать краш, мб на рефе пофиксили, но на 1.26 вроде нет

GetUnitGoldCost, GetUnitWoodCost и GetUnitBuildTime критуют, если передать равкод, содержащий буквы верхнего регистра.
ответ
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
ответ
создать DAMI юнита
dummy* - дамми

вот пример выбора юнитов в темповую группу без утечек с использованием точек

есть несколько функций для выбора юнитов
native GroupEnumUnitsInRange takes group whichGroup, real x, real y, real radius, boolexpr filter returns nothing
native GroupEnumUnitsInRangeOfLoc takes group whichGroup, location whichLocation, real radius, boolexpr filter returns nothing
native GroupEnumUnitsInRect takes group whichGroup, rect r, boolexpr filter returns nothing
native GroupEnumUnitsOfPlayer takes group whichGroup, player whichPlayer, boolexpr filter returns nothing
native GroupEnumUnitsOfType takes group whichGroup, string unitname, boolexpr filter returns nothing
native GroupEnumUnitsSelected takes group whichGroup, player whichPlayer, boolexpr filter returns nothing
у некоторых есть аналоги с потолком выбора (кол-ва юнитов)

DestroyGroup( ... ) нужно использовать только если ты постоянно создаёшь группу до этого (в основном это требуется, если ты должен сделать действия с теми же юнитами спустя какое-то время, например выбрать кого-то там в области, наложить эффект, подождать 2 секунды и продамажить), но для темповых действий лучше иметь одну группу и просто очищать её

30
Можно начать с того, чтоб писать код руками, а не конвертировать с гуймуй.
1
для начало скажи что тебе надо сделать этим триггером ибо в твоей каляке баляке(без обид) из гуи никто ничего не поймёт, потом уже можно будет понять что делать

SсRealm, бля честно если честно то легче занаво написать. Если хочешь чтобы обьяснил напиши в лс тут я вспотею это писать
Ответы (8)
21
Musya_Nub, Как минимум объясните, как лучше исправить шапку. Мне в вопросе про виджет EugeAl показал же, как можно подобные штуки написать, но я хренова разбираюсь, когда идет инициализация и входные аргументы. С присвоением это дураку понятно, но хотя бы правильно избавиться от ....Trig_Wawe_Func001Func001Func001Func001Func001Func001Func001Func001Func001Func001Func001Func001Func001Func001Func001Func001Func001Func001Func005Func001Func001Func001Func001Func001Func001Func005Func006C takes nothing returns boolean....
То есть в триггере оно работает но варик уже просто пердит от корявости. И если я не исправлю ЭТО то мне либо делтить на десяток маленьких триггов, либо лучше упорядочить это.
Мне не нужно разбирать все условия if это же волна крипов. Но хотябы условие с парой волн, чтобы я уже дальше сам переделал?
1
SсRealm, ну чтож для начала переименую вот это безобразие на англиский(это триг)gg_rct________________030
1
и лучше бы тебе перейти с гуи на jass
ибо у тебя там просто ужас, у тебя команды будут по пол века работать с таким чудом
+ на гуи много утечек памяти(те штуки что фпс могут сажать и краши вызывать)
1
SсRealm, а вопрос советую закрыть ибо ток суицидниц будет в этом всём разбираться
Принятый ответ
21
Musya_Nub, код простейший. Это вариант из 20 волн. Мне не нужно разбирать все. Хотя бы 2- три волны, дальше уже буду разбираться сам.
Ладно, дальше будем ждать суицидника
23
SсRealm, тебе надо снести все гуи условия нафиг и написать действие через if elseif endif )
И да, сохранение карты на гуи с большим количеством писанины длится чуть ли не минуту, пока идёт запись триггеров, с голым кодом же сохранение кода происходит за 0,1 секунд примерно ) даже если там 5к строк )
30
SсRealm, написать нормальную систему волн, а не копипастить одно и тоже 100500 раз религия не позволяет?
18
Примерно, как я понял, тебе нужно все области, групи юнитов, занести в переменные массив, далее логика примерно такова.
Условие - количество юнитов в отряд[ текущий индекс ] <=0
запустить триггер старт
Триггер старт
текущий индекс = текущий индекс + 1
Вибрать отряд[ текущий индекс ] приказать атаковать область[ текущий индекс ]
Чтобы оставить комментарий, пожалуйста, войдите на сайт.