Везде видел, что данные в функцию, которая используется в функциях ForGroup(...), GroupEnumUnits...(...) передаются через глобальные переменные. Но недавно, когда мне отвечали на вопросы, увидел вот что:
quq_CCCP:
kano, Какая такая в доте логика? Где? Крутнулся раз, нанес урон и все.
function UJ3 takes nothing returns nothing
    call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Other\\Stampede\\StampedeMissileDeath.mdl", GetEnumUnit(), "origin"))
    call TDI(GetTriggerUnit(), GetEnumUnit(), 2, GetUnitAbilityLevel(GetTriggerUnit(), 'A0C6') * 35 + 65)
endfunction

//Calls:
//    M2I
//    UWI
//    MWI
//    MOI
//Functions as argument:
//    AD1
//    UJ3
function UK3 takes nothing returns nothing
    local group g = M2I()
    local unit MJI = GetTriggerUnit()

    call GroupEnumUnitsInRange(g, GetUnitX(MJI), GetUnitY(MJI), 300, Condition(function AD1))
    call ForGroup(g, function UJ3)
    call SetUnitAnimation(MJI, "spin")
    call UWI(MJI, 0.6)
    call MWI(MJI, 4267, 0.5 - 0.05 * GetUnitAbilityLevel(GetTriggerUnit(), 'A0C6'))
    call MOI(g)
    set g = null
    set MJI = null
endfunction

//Calls:
//    UK3
function UL3 takes nothing returns boolean
    if GetUnitAbilityLevel(GetTriggerUnit(), 'B03P') > 0 and IsUnitType(GetAttacker(), UNIT_TYPE_STRUCTURE) == false and IsUnitType(GetAttacker(), UNIT_TYPE_MECHANICAL) == false and GetUnitAbilityLevel(GetAttacker(), 'A04R') == 0 and IsUnitAlly(GetAttacker(), GetOwningPlayer(GetTriggerUnit())) == false and GetRandomReal(0, 100) < 17 and (LoadInteger(XY, GetHandleId(GetTriggerUnit()), 4267) == 1) == false then
        call UK3()
    endif
    return false
endfunction

//Calls:
//    Q0I
//Functions as argument:
//    UL3
function Y01 takes nothing returns nothing
    local trigger t = CreateTrigger()

    call Q0I(t, EVENT_PLAYER_UNIT_ATTACKED)
    call TriggerAddCondition(t, Condition(function UL3))
    set t = null
endfunction
Вот вам пассивка акса, че то не вижу ничего того что вы описываете?
Функция UWU это функция создает триггер, который ждет указанное время или когда юнит сдохнет и влепляет ему станд анимацию. (фрог не дружит с головой и юзает триггер там где можно обойтись таймером)
MWI такой же таймер, записывает на акса бульку чтобы он не смог крутнутся дважды, кулдаун пассивки так сказать...
Здесь, в функции UJ3(..) используется GetTriggerUnit(), то есть, данные передаются не через глобальные переменные. Почему это не использовалось в наработках, которые я ранее видел? У этого способа есть какие-то проблемы? Разумеется, имеется ввиду, когда это используется в триггерах, где функции GetTriggerUnit() могут что-то вернуть.

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

дочерние потоки наследуют свойства основных
то же касается и екзекута

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
1
27
7 лет назад
Отредактирован MpW
1
Ну это мгновенное действие. Так тоже можно. В гуи ты тоже устанавливаешь варкрафтовские переменные, там как раз действия и условия в отдельные функции записано, и работают. Не вижу ничего такого. Просто я на джазе 'свои' глобалки для надежности и удобства юзаю (не помню, был ли когда нибудь баг, не знаю есть ли такие узкие места где GetTriggerUnit не работает, никогда не встречал такое. МБ я был глуп, и мне стоит пересмотреть это, хотя мне это не мешает, я не юзаю тысячи переменные на каждый триггер. У меня несколько темповых глобалок на все). Понимаешь, была бы какая-нибудь задержка, и в отрывке времени сработало бы другое событие, твой GetTriggerUnit может быть другого юнита давал бы.
0
21
7 лет назад
0
Понимаешь, была бы какая-нибудь задержка, и в отрывке времени сработало бы другое событие, твой GetTriggerUnit может быть другого юнита давал бы.
Мне кажется как раз переменные могут перезаписаться, если будет задержка. А GetTriggerUnit() привязан к потоку и перезаписаться не может, если я правильно всё понял.
1
27
7 лет назад
Отредактирован MpW
1
ScopteRectuS, не вижу в коде того, что может перезаписать. Раз работает в доте, значит норм. Потоки не могут быть параллельными, только последовательно идут (мне надоело это говорить) А в тех наработках что ты видел, это наверное для удобства. Вот на работе чертежи разбираю ищу ошибки и составляют тех. процесс, а я все время подправляю чертежи конструктора, просто для красоты, для читабельности и прочее
3
16
7 лет назад
3
Далеко не все GetTrigger() имеют нормальный стек. GetSpellTargetUnit ломается нахер, если кастануть во время срабатывания другой спелл. Но в данном примере всё работает норм, ибо действие мгновенное
1
28
7 лет назад
1
дочерние потоки наследуют свойства основных
то же касается и екзекута
Принятый ответ
0
16
7 лет назад
0
nvc123, то есть, GetSpellAbilityUnit(), GetTriggerUnit() итд можно вызывать из функций, вызванных через call ?
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.