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

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

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

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
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:
А вот для союзников восстановление маны может по каким-то причинам не произойти?
Если союзник имеет иммун к заклинаниям, то возможно.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.