Есть триггер в Jass
function Trig_fire_Actions takes nothing returns nothing
    local unit BET
    local unit BEC
    set BET = GetSpellTargetUnit()
    set BEC = GetSpellAbilityUnit()
    call TriggerSleepAction( ( DistanceBetweenPoints(GetUnitLoc(BEC), GetUnitLoc(BET)) / 1000.00 ) )
    call SetUnitMoveSpeed( BET, 500.00 )
    set bj_forLoopAIndex = 1
    set bj_forLoopAIndexEnd = 20
    loop
        exitwhen bj_forLoopAIndex > bj_forLoopAIndexEnd
        call IssuePointOrderLocBJ( BET, "move", GetRandomLocInRect(RectFromCenterSizeBJ(GetUnitLoc(BET), 500.00, 500.00)) )
        call UnitDamageTargetBJ( BEC, BET, 5, ATTACK_TYPE_CHAOS, DAMAGE_TYPE_NORMAL )
        call TriggerSleepAction( 0.50 )
        set bj_forLoopAIndex = bj_forLoopAIndex + 1
    endloop
    call SetUnitMoveSpeed( BET, GetUnitDefaultMoveSpeed(BET) )
    call IssueImmediateOrderBJ( BET, "stop" )
endfunction
На пустой карте любых размеров работает корректно, даже при выборе области всей карты, а не только вокруг юнита, количество войск на карте не влияет, рельеф карты не пробовал. Принадлежность цели не важна, хоть игрок, хоть комп, хоть нейтрал.
При использовании в точно таком же виде на основной карте вызывает дикие тормоза, вплоть до зависания игы на все время действия триггера, потом отлагивает, чем меньше периодичность - тем сильнее лаги (при >2 cек периода лагает заметно слабее, чем при 0.3).
В чем может быть проблема? Конфликт с другими триггерами (выключать по одному и тестить долго и нудно, больше 50 триггеров в основной карте)? Сложности в вычислении пути по рельефу (пробовал пересчитать пути, не помогло)?

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

Не юзай TriggerSleepAction и будет тебе счастье. Особенно когда юзаешь глобальные переменные, вполне вероятно, что конфликт
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
29
9 лет назад
0
pusha1999, кажется ты слегка перегнул палку со своей самоуверенностью
кст, там же и ответ на вопрос
0
5
9 лет назад
0
alexprey, причем тут что когда обрабатывается? я вообще про другое. я про то что варик не обрабатывает одновременно все триггеры, а делает это последовательно. потомучто если бы он обрабатывал все триггеры одновременно, то в одно и тоже время например глобалка могла бы иметь не одно значение, а значит были бы баги. и я про то что пока варик не выполнит функцию, он не перескакивает к другой
2
29
9 лет назад
2
pusha1999, триггеры выполняются в разных потоках, но при этом изменение внешних данных происходит синхронно
в одно и тоже время например глобалка могла бы иметь не одно значение, а значит были бы баги.
Да, баги будут и есть
0
5
9 лет назад
0
alexprey, смотря как глобалка реализована...например если ты запустишь 2 периодических триггера одновременно с одинаковым интервалом и там будут в гуи для каждого числа А делать то то и тото, то те глобалки которые для цикла используются bj_loopindexA и т.д. не будут иметь разные значения одновременно, и бага не будет. ну короче я надеюсь ты понял о чем я, а если ты используешь глобалку для спелла или еще чегото, которая будет для разных игроков одна, то баги будут, но баги будут изза неправильной реализации только того кто пишет а не изза того что триггер выполняется одновременно с другим как вы утверждаете тут)) хотя это не так всетаки. я это тестил и не говорю на пустом месте. если нужен прув всетаки. я могу скинуть мапу с этим тестом и сам убедишься)
0
25
9 лет назад
0
Человек совершенно не рзбирается, а все равно талдычит свое...
0
5
9 лет назад
Отредактирован Uber
0
куда уж мне до тебя...ты хоть одну мапу сделал от начала до конца со сложными алгоритмами? я принял участие не в одном проекте как автор скриптов и помог профиксить многим их мапы а ты только херню пишешь. ты ответь на вопрос автора по существу лучше, чем комментить даже сам не зная что и о чем. отмороженая жаюа не одного гера украла у меня с хайва в свою вонючую доту. а ты покажи свои работы, я могу выложить свои и посмотрим кто разбирается а кто нет. и кто как что реализовывает, а то херню писать то все могут, а на деле 0
1 пункт от Uber: 1.1 (ненормативная лексика) Завуалированный мат
0
20
9 лет назад
0
pusha1999, на хайве у тебя только несколько тех же пафосных сообщений, какой у тебя ник тогда был?
0
28
9 лет назад
0
смотри карту и не неси бред
2 триггера выполняются одновременно
из за этого предмет исчезает но его эффект остаётся
перед тем как писать что либо хотя бы посмотри как в вар3 реализованы триггеры
Загруженные файлы
Этот комментарий удален
0
11
9 лет назад
Отредактирован Impertus
0
Ну вы и наваяли холивара :)
По сути, переделал на таймеры, только вот с ними еще не работал, а гайдов по работе с таймерами нет вообще
function New takes nothing returns nothing
    local unit BET = GetSpellTargetUnit()
    local unit BEC = GetSpellAbilityUnit()
    local integer BECount = 1
    local timer t = CreateTimer()
    call SetUnitMoveSpeed( BET, 500.00 )
    call TimerStart(t, 0.5, true, function New )
    loop
        exitwhen BECount > 20
        call TimerGetElapsed ( t )
        call IssuePointOrderLocBJ( BET, "move", GetRandomLocInRect(GetPlayableMapRect()) )
        call UnitDamageTargetBJ( BEC, BET, 5, ATTACK_TYPE_CHAOS, DAMAGE_TYPE_NORMAL )
        set BECount = BECount + 1
    endloop
    call SetUnitMoveSpeed( BET, GetUnitDefaultMoveSpeed(BET) )
    call IssueImmediateOrderBJ( BET, "stop" )
    set BET = null
    set BEC = null
    set BECount = 0
    call DestroyTimer ( t )
endfunction
Сейчас вот в таком виде, но не работает) Наносит весь урон сразу, и завершается тоже сразу. Как поправить? Каждый раз стартовать таймер (засунуть его в цикл) не помогает
0
37
9 лет назад
0
Я тут даже рисунок рисовал, как это происходит) xgm.guru/p/wc3/code-flow-and-data-access-thread
Impertus:
гайдов по работе с таймерами нет вообще
У нас 30% форума - гайды по работе с таймерами =\
И статьи есть xgm.guru/p/wc3/w3_special_programming
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.