Помощ с условием
Я делаю способность пасивку, когда с врагом рядом нет союзников то владельцу пасивки должен доваться баф на урон и скорость атаки. Я в принципе понимаю как сделать это , но не знаю какое нужно условие. Если рядом с врагом нет союзников то? Или как-то по другому, подскажите.

Лучший ответ:
В гуи есть такая замечательная команда в разделе целочисленной - кол-во юнитов группе. Единственное, что в ней нельзя отфильтровать не нужных. На jass это сделать проще.
Как работает эта команда - кол-о юнитов группе? там счетчик есть, записан в глобалку. он сначала обнуляется. А потом запускаем цикл, берет каждого юнита и циклом прибавляет. Если не можете юзать jass, то сделайте свой на гуи. Сначала пикаете вокруг героя с фильтром в группу g. Потом используете эту команду "кол-во юнитов в группе g"
по идее, тут не нужен нам счетчик. Есть команда "первый юнит в группе g" (FirstOfGroup), если она пуста, значит и юнитов в ней нет

можно через CustomScript ввести несколько строчек


Просмотров: 74

XGM Bot #1 - 2 недели назад 0
Голосов: +0 / -0
Похожие вопросы:

» ответ
Объясню, почему я удалил код: после проведённого за кодом времени, я понял, что сильно погорячился, задав такой глупый вопрос. Стоило отдохнуть, проветрить голову, и решение нашлось. Тем, кто столкнулся с хоть самую малость, но похожей проблемой, дам совет: всегда проверяйте соответствия заклинаний, написанных в коде jass (CTRL + D, если кто не знает, как узнать id заклинания) и ,конечно, сам синтаксис. Также посоветую не утраивать "свалку" в коде, как это сделал я. В общем, если кому интересно, как я решил проблему, пишите - расскажу или даже помогу если у вас она схожая.(Всё дело во внимательности)...
Сброшу код триггера таким, каким я его хотел видеть изначально:
function MU_Check_lvl_four takes nothing returns boolean
    if ( not ( GetUnitAbilityLevelSwapped('A011', udg_Akame_Killer) == 4 ) ) then
        return false
    endif
    return true
endfunction

function MU_Check_lvl_three takes nothing returns boolean
    if ( not ( GetUnitAbilityLevelSwapped('A011', udg_Akame_Killer) == 3 ) ) then
        return false
    endif
    return true
endfunction

function MU_Check_lvl_two takes nothing returns boolean
    if ( not ( GetUnitAbilityLevelSwapped('A011', udg_Akame_Killer) == 2 ) ) then
        return false
    endif
    return true
endfunction

function MU_Check_lvl_one takes nothing returns boolean
    if ( not ( GetUnitAbilityLevelSwapped('A011', udg_Akame_Killer) == 1 ) ) then
        return false
    endif
    return true
endfunction

function MU_Second_Conditions takes nothing returns boolean
    if ( not ( UnitHasBuffBJ(GetEventDamageSource(), 'B008') == true ) ) then
        return false
    endif
    if ( not ( GetEventDamageSource() == udg_Akame_Killer ) ) then
        return false
    endif
    return true
endfunction

function MU_Start_Conditions takes nothing returns boolean
    if ( not ( UnitHasBuffBJ(GetAttacker(), 'B008') == true ) ) then
        return false
    endif
    if ( not ( GetAttacker() == udg_Akame_Killer ) ) then
        return false
    endif
    return true
endfunction

function Trig_MU_Conditions takes nothing returns boolean
    if ( not MU_Start_Conditions() ) then
        return false
    endif
    return true
endfunction

function MU_Venum_Check takes nothing returns boolean
    if ( not ( udg_MU_Venum_counter == 2 ) ) then
        return false
    endif
    return true
endfunction

function MU_del takes nothing returns nothing 
    if ( MU_Check_lvl_one() ) then
        call SetPlayerAbilityAvailableBJ( true, 'A00X', GetOwningPlayer(GetEventDamageSource()) )
        call UnitRemoveAbilityBJ( 'A00X', GetEventDamageSource() )
    else
        if ( MU_Check_lvl_two() ) then
            call SetPlayerAbilityAvailableBJ( true, 'A00U', GetOwningPlayer(GetEventDamageSource()) )
            call UnitRemoveAbilityBJ( 'A00U', GetEventDamageSource() )
        else
            if ( MU_Check_lvl_three() ) then
                call SetPlayerAbilityAvailableBJ( true, 'A00Y', GetOwningPlayer(GetEventDamageSource()) )
                call UnitRemoveAbilityBJ( 'A00Y', GetEventDamageSource() )
            else
                if ( MU_Check_lvl_four() ) then
                    call SetPlayerAbilityAvailableBJ( true, 'A013', GetOwningPlayer(GetEventDamageSource()) )
                    call UnitRemoveAbilityBJ( 'A013', GetEventDamageSource() )
                else
                    call DoNothing(  )
                endif
            endif
        endif
    endif
endfunction


function Trig_MU_Actions takes nothing returns nothing
    call DestroyTrigger(udg_MU_trig)
    set udg_MU_Venum_counter = GetRandomInt(1, 5)
    set udg_MU_TG = GetAttackedUnitBJ()
    if ( MU_Venum_Check() ) then
        if ( MU_Check_lvl_one() ) then
        call UnitAddAbilityBJ( 'A00X', udg_Akame_Killer )
        call SetPlayerAbilityAvailableBJ( false, 'A00X', GetOwningPlayer(udg_Akame_Killer) )
    else
        if ( MU_Check_lvl_two() ) then
            call UnitAddAbilityBJ( 'A00U', udg_Akame_Killer )
            call SetPlayerAbilityAvailableBJ( false, 'A00U', GetOwningPlayer(udg_Akame_Killer) )
        else
            if ( MU_Check_lvl_three() ) then
                call UnitAddAbilityBJ( 'A00Y', udg_Akame_Killer )
                call SetPlayerAbilityAvailableBJ( false, 'A00Y', GetOwningPlayer(udg_Akame_Killer) )
            else
                if ( MU_Check_lvl_four() ) then
                    call UnitAddAbilityBJ( 'A013', udg_Akame_Killer )
                    call SetPlayerAbilityAvailableBJ( false, 'A013', GetOwningPlayer(udg_Akame_Killer) )
                else
                    call DoNothing(  )
                endif
            endif
        endif
    endif
    set udg_MU_trig = CreateTrigger()
    call TriggerRegisterUnitEvent( udg_MU_trig, udg_MU_TG, EVENT_UNIT_DAMAGED )
    call TriggerAddCondition( udg_MU_trig, Condition( function MU_Second_Conditions ) )
    call TriggerAddAction( udg_MU_trig, function MU_del )
    else
        call DoNothing(  )
    endif
endfunction

//===========================================================================
function InitTrig_MU takes nothing returns nothing
    set gg_trg_MU = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_MU, EVENT_PLAYER_UNIT_ATTACKED )
    call TriggerAddCondition( gg_trg_MU, Condition( function Trig_MU_Conditions ) )
    call TriggerAddAction( gg_trg_MU, function Trig_MU_Actions )
endfunction
Суть триггера:
Имеется способность с четырьмя уровнями. На каждом уровне урон способности разный, а шанс срабатывания всегда 25%. При атаке герой, имеющий такую способность имеет шанс (25%) на отравление противника.
Переменная udg_Akame_killer равносильна GetEventDamageSource()
P.S. Возможно кому-то даже пригодится этот код... Сделан полнейшим неумехой в плане jass, так что не судите строго!
» ответ
Нет такой функции запустить
вы классный
причем это недалеко от включения. либо вы очень невнимательны, либо очень ленивы
» ответ
~8gabriel8:
Пока нет желания разбираться, что у тебя так, а что не так. Но вижу, что переменная Window не назначена окну, а ещё как бы создаются в цикле одновременно 10 окон, которые потом все одновременно ждут 50 секунд. Вот скрин действий триггера вместо двух твоих, секунда ожидания поставлена для того, чтобы увидеть пропадание окна таймера.
» ответ
~8gabriel8:
Довольно тяжело в этом разобраться, ты думаешь о том, что тебе нужно, но не всё договариваешь, а залезть в твою голову не могу. Во-первых, нумерация массива начинается с 0, то есть размерность переменной 1 представляет два массива - переменная[0] и переменная[1], но у тебя переменная[0] вроде не задействована. Во-вторых, на первом скрине у тебя цикл по А от 2 до 10, а в пояснении пишешь, что стандартные резолюции с 1 по 8, но в таком случае обработка идёт с 1 по 9 для А-1. Ошибка ли это, либо дальше 9 иначе обрабатывается, непонятно, скрин обрезан. В-третьих, хотя не уверен, что проблема в этом, но может быть обработку остальных действий вызывает очистка диалога, попробуй переместить If/Then/Else первой кнопки в самый низ, чтобы очистка диалога срабатывала последней. В-четвёртых, создание юнита создаёт утечку группы, надо после этого действия удалять последнюю созданную группу.
Вроде такой custom script: call DestroyGroup(Last Created Unit Group).

Extremator #2 - 2 недели назад 0
Голосов: +0 / -0
Тебе тут скорее всего нужен будет таймер.
Каждую секунду (это самое оптимальное) проверять юнитов вокруг героя.
Если в результате отфильтровки таких юнитов будет больше 0 - то снимаешь бафф, иначе - даёшь его (так же можно добавить момент когда юниты есть, но бафф уже имеется - тогда действия никакие не нужны).
Qulore #3 - 2 недели назад 0
Голосов: +0 / -0
Extremator:
Тебе тут скорее всего нужен будет таймер.
Каждую секунду (это самое оптимальное) проверять юнитов вокруг героя.
Если в результате отфильтровки таких юнитов будет больше 0 - то снимаешь бафф, иначе - даёшь его (так же можно добавить момент когда юниты есть, но бафф уже имеется - тогда действия никакие не нужны).
А как юнитов проверять вокруг врага?
Extremator #4 - 2 недели назад 0
Голосов: +0 / -0
Qulore, ну вообще - просто выбор юнитов вокруг точки.
Новое действие - Отряд - Действие с юнитами в (все юниты в радиусе 500 от точки А)
Точкой А будет "позиция юнита" через переменную и всеми вытекающими от обращения
Внутри поставить если/тогда/иначе, в нём список условий (друг/живой/и т.п.) и действие на добавление "выбранного юнита" в отдельную группу.
Дальше, если в этой группе больше 0 юнитов - чистишь группу. Отнимаешь бонусы.
Иначе (если в ней нет юнитов) - даёшь бафф и бонус (но только если бонуса у юнита ещё нет).
Как-то так... у меня где-то был пример с абилкой-пассивкой, которая даёт атаку за каждого врага рядом... Я его лет 10 назал делал, могу скинуть чисто ради ознакомления.
Esea #5 - 2 недели назад 0
Голосов: +0 / -0
Extremator:
Qulore, ну вообще - просто выбор юнитов вокруг точки.
Новое действие - Отряд - Действие с юнитами в (все юниты в радиусе 500 от точки А)
Точкой А будет "позиция юнита" через переменную и всеми вытекающими от обращения
Внутри поставить если/тогда/иначе, в нём список условий (друг/живой/и т.п.) и действие на добавление "выбранного юнита" в отдельную группу.
Дальше, если в этой группе больше 0 юнитов - чистишь группу. Отнимаешь бонусы.
Иначе (если в ней нет юнитов) - даёшь бафф и бонус (но только если бонуса у юнита ещё нет).
Как-то так... у меня где-то был пример с абилкой-пассивкой, которая даёт атаку за каждого врага рядом... Я его лет 10 назал делал, могу скинуть чисто ради ознакомления.
Больше 1 юнитов*. Самого юнита вокруг которого будет проверка занесет в группу.
Extremator #6 - 2 недели назад 0
Голосов: +0 / -0
Esea:
Больше 1 юнитов*. Самого юнита вокруг которого будет проверка занесет в группу.
Ну по идеи сам юнит не должен проходить фильтрацию... не?
world_editor #7 - 2 недели назад 0
Голосов: +0 / -0
Просто дай союзникам любую ауру и проверяй её эффект, через условия логического сравнения . Если союзников рядом нет, то и ауры тоже, а значит давать баф можно.

Можно даже ещё проще, дать союзникам ауру дебафа (усилив при это героя) и когда рядом союзники, герой возвращается к обычным параметрам ( компенсируя усилением).
Extremator #8 - 2 недели назад 0
Голосов: +0 / -0
world_editor, что-то вообще не просто, какой-то гемор ему советуешь.
Qulore #9 - 2 недели назад 0
Голосов: +0 / -0
Я попробую сделать пару из приведенных примеров. Если что я напишу.

Extremator:
Qulore, ну вообще - просто выбор юнитов вокруг точки.
Новое действие - Отряд - Действие с юнитами в (все юниты в радиусе 500 от точки А)
Точкой А будет "позиция юнита" через переменную и всеми вытекающими от обращения
Внутри поставить если/тогда/иначе, в нём список условий (друг/живой/и т.п.) и действие на добавление "выбранного юнита" в отдельную группу.
Дальше, если в этой группе больше 0 юнитов - чистишь группу. Отнимаешь бонусы.
Иначе (если в ней нет юнитов) - даёшь бафф и бонус (но только если бонуса у юнита ещё нет).
Как-то так... у меня где-то был пример с абилкой-пассивкой, которая даёт атаку за каждого врага рядом... Я его лет 10 назал делал, могу скинуть чисто ради ознакомления.
Я не имею опыта с "Отрядами", и у меня возникло пару вопросов
  1. После того как я добавил действия если/тогда/иначе, то я не понимаю какое нужно условие типо если юниты в отряде твои союзники то... если юниты в отряде нейтральные крипы то... наверное как-то так, но я не знаю таких условий(наверное оно там есть, но я не знал ничего с отрядами)
  2. "и действие на добавление "выбранного юнита" в отдельную группу." Это нужно юнита у которого будет пасивка на доп урон запихать в другой отряд, как(по переменным наверное), зачем?
  3. "Иначе (если в ней нет юнитов) - даёшь бафф и бонус (но только если бонуса у юнита ещё нет)." Тут не понял. Если в группе юнитов нету юнитов то давать баф, но юнит же будет 1 тот, который 1(без союзников).
Прикрепленные файлы
Qulore #10 - 2 недели назад 0
Голосов: +0 / -0
Qulore:
Я попробую сделать пару из приведенных примеров. Если что я напишу.

Extremator:
Qulore, ну вообще - просто выбор юнитов вокруг точки.
Новое действие - Отряд - Действие с юнитами в (все юниты в радиусе 500 от точки А)
Точкой А будет "позиция юнита" через переменную и всеми вытекающими от обращения
Внутри поставить если/тогда/иначе, в нём список условий (друг/живой/и т.п.) и действие на добавление "выбранного юнита" в отдельную группу.
Дальше, если в этой группе больше 0 юнитов - чистишь группу. Отнимаешь бонусы.
Иначе (если в ней нет юнитов) - даёшь бафф и бонус (но только если бонуса у юнита ещё нет).
Как-то так... у меня где-то был пример с абилкой-пассивкой, которая даёт атаку за каждого врага рядом... Я его лет 10 назал делал, могу скинуть чисто ради ознакомления.
Я не имею опыта с "Отрядами", и у меня возникло пару вопросов
  1. После того как я добавил действия если/тогда/иначе, то я не понимаю какое нужно условие типо если юниты в отряде твои союзники то... если юниты в отряде нейтральные крипы то... наверное как-то так, но я не знаю таких условий(наверное оно там есть, но я не знал ничего с отрядами)
  2. "и действие на добавление "выбранного юнита" в отдельную группу." Это нужно юнита у которого будет пасивка на доп урон запихать в другой отряд, как(по переменным наверное), зачем?
  3. "Иначе (если в ней нет юнитов) - даёшь бафф и бонус (но только если бонуса у юнита ещё нет)." Тут не понял. Если в группе юнитов нету юнитов то давать баф, но юнит же будет 1 тот, который 1(без союзников).
Я правда не знаю
МрачныйВорон #11 - 1 неделю назад (изм. ) 1
Голосов: +1 / -0

В гуи есть такая замечательная команда в разделе целочисленной - кол-во юнитов группе. Единственное, что в ней нельзя отфильтровать не нужных. На jass это сделать проще.
Как работает эта команда - кол-о юнитов группе? там счетчик есть, записан в глобалку. он сначала обнуляется. А потом запускаем цикл, берет каждого юнита и циклом прибавляет. Если не можете юзать jass, то сделайте свой на гуи. Сначала пикаете вокруг героя с фильтром в группу g. Потом используете эту команду "кол-во юнитов в группе g"
по идее, тут не нужен нам счетчик. Есть команда "первый юнит в группе g" (FirstOfGroup), если она пуста, значит и юнитов в ней нет

можно через CustomScript ввести несколько строчек
Esea #12 - 1 неделю назад (изм. ) 0
Голосов: +0 / -0
Extremator:
Esea:
Больше 1 юнитов*. Самого юнита вокруг которого будет проверка занесет в группу.
Ну по идеи сам юнит не должен проходить фильтрацию... не?