Объясните, как одновременно выбрать только юнитов определённого типа у определённого игрока в обределенной области?
Я делаю так:
Отряд выбрать юнитов типа() принадлежащих игроку 6 и делать множество действий.
Отряд выбрать юнитов в области() и делать то, но у меня выбираются все юниты в этой области. Что делать? Как это исправить?

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

function groupCondition takes nothing returns boolean
    return true == true //Здесь пишешь условия используя and или or и сюда передается юнит GetFilterUnit()
endfunction

//Эти действия вставляешь в любую нужную тебе функцию
    local group    g  = CreateGroup()
    local boolexpr bE = Condition( function groupCondition )
    local unit     u
    //Где x и y - это координаты
    //Где r - это радиус
    call GroupEnumUnitsInRange( g, x, y, r, bE )
    call DestroyBoolExpr( bE )
    loop
    set u = FirstOfGroup( g )
    exitwhen u == null
        //Действия над группой
        call BJDebugMsg( GetUnitName( u ) )
        //Конец
        call GroupRemoveUnit( g, u )
        set u = null
    endloop
    call GroupClear( g )
    call DestroyGroup( g )
    
    set g  = null
    set bE = null
    set u  = null
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
19
6 лет назад
0
Похожие вопросы:

ответ
  • Выбираешь всех целевых юнитов в группу.
  • Создаёшь дамми.
  • Используя ForGroup и GetEnumUnit, применить на каждого юнита в группе заклинание.
  • Очищаешь групппу.
  • Удаляешь группу.
  • Удаляешь дамми.

У дамми-юнита должны стоять настройки анимации, позволяющие применять способности без задержек, у способности не должно быть кулдауна.
ответ
~8gabriel8:
bOrissko, у тебя вроде как ссылалось всегда на Паладина, так как он Hero [1], будь-то владелец юнита, либо реплика от юнита. Точно уже запамятовал, так как шустро всё переделал. У меня нет желания тратить время на проверку триггера, когда указан Tiggering unit/Переключающий юнит, потому стараюсь всегда указывать точно к ситуации, в данном случае переделал так, что диалог срабатывает при приближении героя на расстояние не более 256 к капитану. Указал везде Entering unit/Не знаю как будет в русских триггерах, наверное, Вошедший или Входящий юнит. Вместо паузы для героя поставил приказ Стоп, хотя это, наверное, неправильно я сделал, так как он погонится во время диалога за приблизившимися врагами. Пожалуй, лучше верни герою паузу вместо Стоп, а также добавь неуязвимость до распаузы.
По поводу диалогов, мне рассказал автор кампании Эфирия, в создании которой участвую, что оптимальной длительностью диалогов является 5 секунд на строчку, если строка не полная, то прикидываешь, на сколько из 5 секунд она тянет. В самой первой фразе в диалоге лучше прибавлять секунду, так как мозг не сразу переключается с игры на диалог, и его начальная реплика зачастую кажется быстрой. Например, у тебя первая фраза "Привет!", это одна секунда, но так как она первая, то я поставил две. Следующая фраза тянет на 4 секунды, так и поставил.
Чтобы прикинуть расстояние до юнита, необходимо пользоваться сеткой:
Сетка в редакторе (кнопка G):
большой квадрат = 512х512
средний квадрат = 128х128
малый квадрат = 32х32
Считается расстояние от центра юнита, а не крайних точек модели. У тебя было 150, но мне показалось, что это мало, ведь подходить надо очень близко, потому поставил 256.
ответ
XGM Bot:
Похожие вопросы:

ответ
Частично не понял, тоесть нужно что бы в кинематике был несуществующий юнит?
Допустим в окне кинематики паладин с каким либо именем что то говорит, но на карте его нет. Если да то это Спецэффекты - Transmission From Unit-Type
ответ
А касательно остальной части, если UnitUserData нигде не используется, создаешь массив юнитов и отрядов. Массив юнитов забиваешь своими капитанами. В UnitUserData капитана пихаешь его порядковый номер в массиве. Создаешь группу юнитов для этого капитана.
  1. Добавление через каст способности.
Я бы делал через 2 разные абилки с одной и той же позицией в интерфейсе. Пока нужный тебе юнит не является частью отряда - у него таргетная абилка при касте которой на капитана он добавляется в группу соответствующего капитана и получает 2ю абилку взамен первой.
Касательно выделения этих пехотинцев - можно намутить что-то с передачей контроля или создать триггер, который будет снимать выделение с юнитов у которых есть 2я абилка. Если ты хочешь чтобы по одиночке можно было выделять пехотинцев - можешь создать переменную для каждого игрока с капитанами, куда будет просто записываться последний выбранный юнит. При снятии выделения - проверять не выбран ли этот же юнит, в случае чего не снимать выделение. Правда не уверен будет ли корректно работать :> В крайнем случае - будет работать в три клика вместо двух. Если я не ошибаюсь.
Касательно поведения этих пехотинцев - что-то реально стоящее сделать сложно. Возможно, но мне не с руки все расписывать :> Простейший вариант - приказывать пехотинцам после добавления в группу следовать за капитаном.
  1. Добавление через атаку капитана
Триггер, проверяющий что капитан получил урон или атакован, как угодно. Далее любым способом проверяешь есть ли в группе этого капитана юниты. Если нет - выбираешь всех пехотинцев N радиусе, добавляешь в отряд, заменяешь абилку/либо просто приказываешь кастануть в капитана первую абилку.
ответ
Ну только триггерные системы отрядов, была такая...
Вот пример ссылочка
Были и другие, поиск в помощь.
Вот еще ссылка
ответ
запомнить всех выбранных, затем очистить эту группу, добавить сначала твоего героя, а затем всех остальных
ответ
  • Выбираешь всех целевых юнитов в группу.
  • Создаёшь дамми.
  • Используя ForGroup и GetEnumUnit, применить на каждого юнита в группе заклинание.
  • Очищаешь групппу.
  • Удаляешь группу.
  • Удаляешь дамми.

У дамми-юнита должны стоять настройки анимации, позволяющие применять способности без задержек, у способности не должно быть кулдауна.

ответ
на каждый снаряд делаешь группу, в нее заносишь всех кто был поражен
done

0
18
6 лет назад
Отредактирован Hodor
0
function groupCondition takes nothing returns boolean
    return true == true //Здесь пишешь условия используя and или or и сюда передается юнит GetFilterUnit()
endfunction

//Эти действия вставляешь в любую нужную тебе функцию
    local group    g  = CreateGroup()
    local boolexpr bE = Condition( function groupCondition )
    local unit     u
    //Где x и y - это координаты
    //Где r - это радиус
    call GroupEnumUnitsInRange( g, x, y, r, bE )
    call DestroyBoolExpr( bE )
    loop
    set u = FirstOfGroup( g )
    exitwhen u == null
        //Действия над группой
        call BJDebugMsg( GetUnitName( u ) )
        //Конец
        call GroupRemoveUnit( g, u )
        set u = null
    endloop
    call GroupClear( g )
    call DestroyGroup( g )
    
    set g  = null
    set bE = null
    set u  = null
Принятый ответ
0
12
6 лет назад
0
UrsaBoss:
function groupCondition takes nothing returns boolean
    return true == true //Здесь пишешь условия используя and или or и сюда передается юнит GetFilterUnit()
endfunction

//Эти действия вставляешь в любую нужную тебе функцию
    local group    g  = CreateGroup()
    local boolexpr bE = Condition( function groupCondition )
    local unit     u
    //Где x и y - это координаты
    //Где r - это радиус
    call GroupEnumUnitsInRange( g, x, y, r, bE )
    call DestroyBoolExpr( bE )
    loop
    set u = FirstOfGroup( g )
    exitwhen u == null
        //Действия над группой
        call BJDebugMsg( GetUnitName( u ) )
        //Конец
        call GroupRemoveUnit( g, u )
        set u = null
    endloop
    call GroupClear( g )
    call DestroyGroup( g )
    
    set g  = null
    set bE = null
    set u  = null
Т.е. я создаю функцию, потом вставляю эти действия и после выполнения условий только с выбранными существами будет происходить действие?
0
18
6 лет назад
0
Стас Орлов
Да, функцию groupCondition всегда ставь над той функцией где будешь вставлять действия.
И в том же groupCondition можешь фильтровать юнитов, юнит который туда идет на проверку - это GetFilterUnit()
Стас Орлов
и ещё важное забыл, те три local переменные всегда ставь в самый верх действий функции.
0
12
6 лет назад
0
Спасибо, а если мне допустим нужно в области, которая центрировано вокруг юнита на током радиусе?
0
37
6 лет назад
0
Стас Орлов, берёшь у юнита координаты и помещаешь в x, y
Если надо относительно юнита, смести их на угол полярными координаами
0
23
6 лет назад
0
UrsaBoss, зачем ты обнуляещ boolexp омг его нет нужды обнулять
0
32
6 лет назад
0
pro100master, от глупости, болекспры не утекают никуда, как и геймкешь и кондишены триггеров, каждый новый вызов Condition( function name) будет возвращать один и тот же обьект.
0
23
6 лет назад
0
quq_CCCP, верно я бы его перенес в инициализация и спокойно проверять
0
18
6 лет назад
0
quq_CCCP
я не находил статьи которая объясняла бы что нужно и что не нужно обнулять
quq_CCCP
хотя пришлось порыться, вроде нашел
0
26
6 лет назад
0
true == true
Просто без комментариев
0
32
6 лет назад
0
Объясните, как одновременно выбрать только юнитов определённого типа у определённого игрока в обределенной области?
Это же банально на гуе делается через matching condition. Элементарно я бы даже сказал.
0
26
6 лет назад
Отредактирован Hanabishi
0
Я бы вот так посоветовал сделать:
function UnitFilter takes nothing returns boolean
    //здесь условия фильтрации
    return (GetUnitTypeId(GetFilterUnit())=='hpea' and GetOwningPlayer(GetFilterUnit())==Player(5))
endfunction

function UnitActions takes nothing returns nothing
    //здесь действия с выбранными юнитами
    call KillUnit(GetEnumUnit())
endfunction

function GetUnitsAroundOfUnit takes unit u, real range returns nothing
    local group g = CreateGroup()
    call GroupEnumUnitsInRange(g, GetUnitX(u), GetUnitY(u), range, Condition(function UnitFilter))
    call ForGroup(g, function UnitActions)
    call GroupClear(g)
    call DestroyGroup(g)
    set g = null
endfunction
И можно еще оптимальнее сделать через vJass.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.