Очень желательно на GUI, либо чёткий JASS.
Есть необходимость сделать автокаст восстановления маны. Кастует фея. Поигрался сначала с колодцами Ночных Эльфов и статуей Нежити, но сразу бросил, когда способности срабатывали при клике раненных по фее, а не клике феи по раненным. Решил сделать триггерный автокаст на основе Духовного пламени, но столкнулся с такими проблемами:
  • Если выбрать всех фей, а потом вокруг каждой в радиусе 700 союзных юнитов с неполной маной и видимых владельцу феи, то как потом лучше выбрать эту фею, вокруг которой юниты выбирались? Заносить сначала её в переменную (массив), в хеш-таблицу, в цикл, ещё как-то?
  • Как именно отсеять из выбранных юнитов того, кто ближе всего к фее или имеет меньше всего маны?
  • Если способность приведена в действие/началось её применение, то нужно ли отслеживать через 0,01 секунды на цели способности бафф, либо она уже точно сработает на союзнике?

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

8gabriel8:
Это тот же принцип для второго пункта, мне казалось, что могут быть способы изящнее. Лучше по другим пунктам подскажите.
первый вопрос так и не понял, насчет третьего вопроса:
там весь прикол в ивентах, есть начало когда наводишь на цель, тогда даже анимация не проигрывается и мана не забирается.
Приводит в действие это уже когда ману сняло и проигралась анимация.
Где то был текст на всё это, но я не могу найти.
Ну а далее чекаешь уровень бафа у цели, если он больше 0 - значит хиляешь и удаляешь баф
Хотя возможно это я неправильно понял, можно просто отловить начало каста абилки и восстанавливать ману триггерно.
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
19
6 лет назад
0
Похожие вопросы:

ответ
речь об активных орб-эффектах, я так понимаю? Потому что "нормальные" заклинания ловятся всегда.
Типа копья козы или аркан-орба дестра ты делаешь?
Danil30:
событие - применяет способность
юзай "приводит способность в действие"
ответ
Пассивки в книге заклинаний работают, даже если запретить доступность самой книги для игрока.Так что да.
ответ
8gabriel8, стандартные порталы как раз включаются триггером, так же триггерно им можно назначать области телепорта, так же они не ломают карту путей.
Насчет упираются в здание, карту путей ставь от портала, физ размер в 0.

0
18
6 лет назад
0
Это будет пассивка или активная способность?
0
26
6 лет назад
0
Как любой автокаст, хочешь, применяй автоматом, хочешь, целенаправленно.
0
18
6 лет назад
Отредактирован Hodor
0
8gabriel8 т.е просто нужен хил целителей только вместо хп чтобы по мане работал?
0
26
6 лет назад
0
Да.
0
18
6 лет назад
Отредактирован Hodor
0
8gabriel8 восстановление маны у обсидиановой статуи
0
21
6 лет назад
0
UrsaBoss, он же написал, что уже пользовался им и почему не подошло!
0
18
6 лет назад
Отредактирован Hodor
0
а понял
там не наводится на цель
0
26
6 лет назад
0
Не только, ещё срабатывает при клике лишённых маны по статуе, а не только при клике статуей по лишённым маны.
0
18
6 лет назад
Отредактирован Hodor
0
8gabriel8:
Не только, ещё срабатывает при клике лишённых маны по статуе, а не только при клике статуей по лишённым маны.
нашел одну способность
Это "Восстановить ману" её равкод Amb2
Ошибся, у неё минус - это то что она передает всю свою ману тому кому нужно восстановить ману
0
26
6 лет назад
0
UrsaBoss, лучше по вопросам сообрази) Ответы на них мне ещё пригодятся.
0
18
6 лет назад
0
8gabriel8:
UrsaBoss, лучше по вопросам сообрази) Ответы на них мне ещё пригодятся.
все эти вопросы автоматически решаются если написать наработку
0
26
6 лет назад
0
Как, например, отсев произвести?
0
18
6 лет назад
0
8gabriel8:
Как, например, отсев произвести?
Вот на jass из ChargeOfDarkness
    private function FindFilter takes nothing returns boolean
        //Условия
        if (IsUnitEnemy( global_caster, GetOwningPlayer(GetFilterUnit()) ) and (GetUnitAbilityLevel( GetFilterUnit(), Marker ) == 0 and IsUnitType( GetFilterUnit(), UNIT_TYPE_STRUCTURE ) == false and IfUnitExist( GetFilterUnit() ) == false) and (IsUnitType( GetFilterUnit(), UNIT_TYPE_ANCIENT ) == false or Ancient_Exception(GetFilterUnit()) ) ) and IsUnitVisible( GetFilterUnit(), GetOwningPlayer(darkness_caster) ) == true then
            if DistanceBetweenUnits( darkness_target, GetFilterUnit() ) < find_distance then
                set find_distance = DistanceBetweenUnits( darkness_target, GetFilterUnit() )
                set foundUnit = GetFilterUnit()
            endif
        endif
        
        return false
    endfunction

    private function Find takes unit caster, unit target returns unit
        //Поиск ближайшей цели
        local group g = GetGroup()
        
        set global_caster   = caster
        set darkness_caster = caster
        set foundUnit       = null
        set find_distance   = 999999
        set darkness_target = target
        call GroupEnumUnitsInRange( g, GetUnitX(target), GetUnitY(target), 4000, Condition(function FindFilter) )
        call RecycleGroup( g )
        
        set g = null
        
        return foundUnit
    endfunction
И где то был скрин как это делается на GUI, ща найду
0
26
6 лет назад
0
Да не надо. Тут понятно, что юнитов собирают в группу, а в ней действием Если/То/Иначе идёт перебор расстояний, если расстояние меньше того, что в переменной, то его заносят в переменную, как и юнита, до которого расстояние считалось, после перебора в переменной остаётся юнит с наименьшим расстоянием.
Прямо говоря, ожидал чего-то более оригинального)
0
18
6 лет назад
Отредактирован Hodor
0
8gabriel8
ну на всякий случай) Я тут нашел свою карту столетней давности (когда я писал на GUI), вот скрин оттуда
Загруженные файлы
0
26
6 лет назад
0
Эмм))) А как же остальные два пункта?
0
16
6 лет назад
Отредактирован Патиссончик
0
UrsaBoss:
8gabriel8:
Не только, ещё срабатывает при клике лишённых маны по статуе, а не только при клике статуей по лишённым маны.
нашел одну способность
Это "Восстановить ману" её равкод Amb2
Ошибся, у неё минус - это то что она передает всю свою ману тому кому нужно восстановить ману
А почему нельзя отследить ее применение и установить ману кастеру и цели на необходимое количество единиц?
  1. По этому не понял зачем. Это уже для каких-то последующих наработок? Или это для применения "автокаста"?
  2. Самый очевидный способ нахождения расстояния — знать Х.У координаты юнитов. Получаем 2 катета в прямоугольном треугольнике — считаем гипотенузу, записываем ее, если она меньше, чем у предыдущего юнита. Уверен, есть и попроще пути, но этот самый простой в понимании. АХ, да, ну или просто проверить дистанцию между ними))).
С маной намного проще. Проверить ее количество (в процентах или фактическом кол-ве) у всех юнитов, перезаписывая в переменную того, у кого ее меньше, чем у предыдущего.
Но с этим не увлекайся. И не забудь сделать фею имунной к магии. Иначе 2 таких юнита могут до скончания веков друг друга "хилять", если этот спел стоит маны.
А проблема Духовного пламени в том, что оно не кастуется автокастно вне боя. Лучше замени на восполнить ману, отслеживай ее и устанавливай свои значения.
  1. Тут проще проверить самому, чтобы запомнить.
0
28
6 лет назад
Отредактирован PT153
0
По второму пункту.
globals
    real Mana = 0.
    unit BadUnit = null
    real Range = 700.
    group CastGroup = CreateGroup()
endglobals

function Conditions takes nothing returns boolean
    local real mana = GetUnitState(GetFilterUnit(), UNIT_STATE_MANA)
    if inRange and mana > Mana then // Чтобы отсеять с наибольшей маной.
    // Чтобы отсеять с наименьшей, нужно написать mana < Mana и начальное значение Mana должно быть 999999.
    // Это значение также должно восстанавливаться после каста.
    // Аналогично и с расстоянием до феи.
        set Mana = mana
        set BadUnit = GetFilterUnit()
    endif
    return true
endfunction

function Trig_Cast_Actions takes nothing returns nothing
    local unit caster = GetSpellAbilityUnit()
    local real x = GetUnitX(caster)
    local real y = GetUnitY(caster)
    call GroupEnumUnitsInRange(CastGroup, x, y, Range, function Conditions)
    call GroupRemoveUnit(CastGroup, BadUnit)
    // Другие действия.
    call GroupClear(CastGroup)
    set caster = null
endfunction

// Функция для расстояния:
function GetDistancePoints takes real x1, real y1, real x2, real y2 returns real
    return SquareRoot((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2))
endfunction

function GetDistanceUnitPoint takes unit u, real x, real y returns real
    local real dx = GetUnitX(u) - x
    local real dy = GetUnitY(u) - y
    return SquareRoot(dx * dx + dy * dy)
endfunction

function GetDistanceUnits takes unit u1, unit u2 returns real
    local real dx = GetUnitX(u1) - GetUnitX(u2)
    local real dy = GetUnitY(u1) - GetUnitY(u2)
    return SquareRoot(dx * dx + dy * dy)
endfunction
0
26
6 лет назад
0
Это тот же принцип для второго пункта, мне казалось, что могут быть способы изящнее. Лучше по другим пунктам подскажите.
0
18
6 лет назад
Отредактирован Hodor
0
8gabriel8:
Это тот же принцип для второго пункта, мне казалось, что могут быть способы изящнее. Лучше по другим пунктам подскажите.
первый вопрос так и не понял, насчет третьего вопроса:
там весь прикол в ивентах, есть начало когда наводишь на цель, тогда даже анимация не проигрывается и мана не забирается.
Приводит в действие это уже когда ману сняло и проигралась анимация.
Где то был текст на всё это, но я не могу найти.
Ну а далее чекаешь уровень бафа у цели, если он больше 0 - значит хиляешь и удаляешь баф
Хотя возможно это я неправильно понял, можно просто отловить начало каста абилки и восстанавливать ману триггерно.
Принятый ответ
0
26
6 лет назад
0
UrsaBoss:
первый вопрос так и не понял
Это уже обсуждалось несколько раз, но так давно, что затрудняюсь найти. Более оптимальным вариантом при работе со способностями и вообще является сохранение в переменную (массив), в хэш-таблицу, во что-то ещё?
А в третьем вопросе смысл в том, что, например, атакующие способности могут не сработать, если у противника есть предмет, который блокирует заклинания, либо триггерно включается неуязвимость, либо противник стал неязвимым к магии. Часто это демонстрируют скилловые игроки, ловя молоток Горного Короля Божественным щитом, либо зельем нуязвимости, либо блинком тюремщицы Иллидана. Таким образом и мана на молоток потрачена, и кд на него пошёл, и урон не нанесён. А вот для союзников восстановление маны может по каким-то причинам не произойти? Происходит восстановление маны аналогично Лечению Целителя.
0
28
6 лет назад
0
Обращение в массив быстрее обращения в хеш, но юзай то, что больше нравится.
8gabriel8:
А вот для союзников восстановление маны может по каким-то причинам не произойти?
Если союзник имеет иммун к заклинаниям, то возможно.
0
26
6 лет назад
0
PT153:
Если союзник имеет иммун к заклинаниям, то возможно.
Ну это очевидно, что в таком случае просто изначально наложение не сработает.
Ладно, буду считать, что на союзников всегда можно делать срабатывание триггера.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.