Создаю юнита, который умеет угонять вражескую технику. Алгоритм действий его в чём: Способность направляется на вражеского юнита (паровой танк, например). Когда я нажимаю ЛКМ, угонщик проигрывает, стоя на месте, определённую анимацию подготовки длительностью в 5 секунд, стоя на том месте, где получил приказ. Только после анимации он уже бежит за вражеским паровым танком. И, при попадании в его сферу радиусом 100-150, угонщик удаляется. А условный паровой танк становится нашим. Естественно, и во время подготовки, и во время бега за танком способность можно отменить.
Первый вариант: просто на основе Одержимости нежити это всё устроить.
Событие: Юнит начинает применять способность
Условия: Применяющий юнит = Угонщик
И
Применяемая способность = Угон
Действия: Дать юниту приказ "оставить"
Уже после этого действия угоняемый паровой танк перестаёт быть целью применяемой способности, что делает выполнение триггера невозможным - угонщик просто за ним не бежит после анимации. Тогда мне в голову пришёл другой вариант:
Действия: Удалить Применяющему юниту способность "Угон"
Ждать 0,01 сек.
Добавить Применяющему юниту способность "Угон"
Это тоже не работает, потому что угонщик перестаёт быть Применяющим. Я изменил "Применяющий юнит" на "Юнит триггера", и это..... почему-то тоже не работает! После проигрывания анимации подготовки угонщик либо просто вселяется в танк с расстояния, блин, в километр, а триггер не выполняется.
Либо после анимации подготовки тупо ничего не происходит.
Значит, нужна именно СПОСОБНОСТЬ с настройками так, что подготовка происходит прям на месте получения приказа, а область самого действия способности = радиус в 100-150 у.е. от цели способности.
Я полез в способность "Канал".
И......... помогите, пожалуйста.
Кроме того, что ничего не работает, проблема ещё и в том, что я не могу понять, как назначить анимацией ПОДГОТОВКИ именно анимацию ПОДГОТОВКИ, а не просто применения любой другой способности.
`
ОЖИДАНИЕ РЕКЛАМЫ...
1
24
1 месяц назад
1
Ну если брать твое техническое задание - даже не пытайся решить вопрос одной способкой, затриггерить уж придется. И при этом еще и 3 стадии:
  1. Каст в анимации (после направления способности на цель)
  2. Бег до танка (пока не попадет в радиус 100-150)
  3. Садится в танк (юнит прячется/удаляется а танк меняет владельца)
Думаю если ты будешь решать эти задачи по отдельности и контролировать триггерно - то проблем не возникнет. Направление способки - это можно хоть через канал сделать, если получится в нем-же реализовать анимацию подготовки - отлично, не получается - делай отдельно, раздели 1 пункт на 2 части, каст на цель и проигрывание анимации. Решаешь по отдельности эти задачи и соединяешь в одну систему триггерно.
0
19
1 месяц назад
0
я не могу понять, как назначить анимацией ПОДГОТОВКИ именно анимацию ПОДГОТОВКИ
Нужно обозвать анимацию правильно в модели, например stand work или stand victory
А в поле анимации Канала прописать stand,victory 2мя строками stand и victory, тогда абилка будет кастоваться с этой анимацией.
Что же касается самой абилки и её алгоритма, то 1) после ожидания юнит триггера и тд не будут работать (поток сбивается), поэтому их нужно сохранять в переменные. 2) для радиуса поможет jass функция IsUnitInRange, она проверяет расстояние между юнитами и "даёт добро" или не даёт на дальнейшие действия, но я не помню, есть ли она в гуи, скорее всего нет, так что только custom script делать.
Ответы (17)
0
29
1 месяц назад
0
для радиуса поможет jass функция IsUnitInRange, она проверяет расстояние между юнитами
Стоит уточнить, что она проверяет расстояние с учётом коллизии, а не тупо между координатами.
constant native IsUnitInRange takes unit whichUnit, unit otherUnit, real distance returns boolean
0
19
1 месяц назад
Отредактирован EugeAl
0
nazarpunk, О, а про это я не знал, спасибо за уточнение)
А какой коллизии? Которая в модели настроена как "форма" или которая как физический размер в настройках юнита или обоих?
1
29
1 месяц назад
Отредактирован nazarpunk
1
EugeAl, та, которая физический размер. Обе функции его учитывают:
constant native IsUnitInRange takes unit whichUnit, unit otherUnit, real distance returns boolean
constant native IsUnitInRangeXY takes unit whichUnit, real x, real y, real distance returns boolean
Напрямую в ваниле его не получить, так что это единственный способ сделать нормальный зацеп.
Я например её юзаю в свободных от осей прямоугольниках и в AOE, чтоб цеплять ровно в круг:

Тупая проверка расстояния

IsUnitInrangeXY

0
19
1 месяц назад
0
nazarpunk, таки да, работает точно! Ок, я понял. А радиус "толщины юнита" по его физ размеру как вычислять? Допустим, у него физ размер 144. А какой будет радиус, чтобы его плюсануть к расстоянию и вбить общее число в функцию?
0
29
1 месяц назад
Отредактирован nazarpunk
0
EugeAl, видать назревает непонимание в терминологии. Физический размер это диаметр окружности, которая используеется при расчёте проходимости. Возможно радиус, я точно не помню. Для дальнейших рассуждений возьмём диаметр.
Дальше проще всего показать на рисунках.

IsUnitInRange

Смотри, есть юниты A и C, половина физ размера для юнита A это радиус AB. Для юнита C это отрезок CD.
Ну и дальге нужно понять, что возврашает функция:
native IsUnitInRange takes unit whichUnit, unit otherUnit, real distance returns boolean
И здесь всё просто:
  • Еcли окружности пересекаются, то она вернёт true
  • Если нет, то real distance >= BD.
Загруженные файлы
0
19
1 месяц назад
0
nazarpunk, я просто думал, что физ размер, это какая то другая единица измерения, которую нужно как-то переводить в радиус.
А так всё ещё проще оказалось. Всё понял, спасибо огромное )
1
29
1 месяц назад
1
А так всё ещё проще оказалось.
Проще то проще, только вот почему-то нормального круга каста в тригорных заклинаниях можно по пальцам пересчитать. Хотя что может быть проще при добавлении юнитов в группу добавить радиуса с запасом, а потом отфильтровать через:
constant native IsUnitInRangeXY takes unit whichUnit, real x, real y, real distance returns boolean
Притом тот же реф или UjAPI позволяют получать размер круга и его не нужно хардкодить в спеле.
0
19
1 месяц назад
Отредактирован EugeAl
0
nazarpunk, Не доводилось сталкиваться с кривым радиусом каста в чужих картах. Но верю, что такое есть. Конечно , такого не должно быть, радиус круга выбора в абилке и радиус каста должны совпадать обязательно. Оптимальнее всего делать радиус с запасом, согласен, ведь у юнитов разные физ размеры, а у зданий тем более, и тут проблемно будет "средний физ размер" высчитать, мягко говоря. А так, если зацепит кого лишнего, при касте, не так критично. Хуже, если не зацепит, хотя должно было. Думаю, и без доп фильтров сойдёт. (Ну, это если не выйдет подогнать радиус к кругу)
1
29
1 месяц назад
1
Не доводилось сталкиваться с кривым радиусом каста в чужих картах.
А ты попробуй целенаправлено цеплять краешком круга, тебя ждёт много интересных открытий.
и тут проблемно будет "средний физ размер" высчитать, мягко говоря
Не вижу сложностей. Заводишь себе константу, ложишь туда 200 и на большинство случаев должно хватить. Если не хватит, то добавляешь сколько нужно.
Хуже, если не зацепит, хотя должно было.
Так в том и проблема, что если не заморачиваться, то и не цепляет.
0
19
1 месяц назад
0
nazarpunk, понимаю, с кривым кастом на краю круга не зацепит, хотя должно.
Да, 200 хватит. У себя столько и ставил примерно.
Если не зацепит, хотя должно было, это баг. А если наоборот сделать, и в описании абилки добавить "Способность имеет разброс, который может задеть больше юнитов", это фича ))
0
29
1 месяц назад
0
А если наоборот сделать, и в описании абилки добавить "Способность имеет разброс, который может задеть больше юнитов", это фича ))
Я вижу идею ты не уловил. Посмотри как в благодатях сделано. Там каст идёт точно в круг без всяких костыльных разбросов.
0
27
1 месяц назад
0
Проще то проще, только вот почему-то нормального круга каста в тригорных заклинаниях можно по пальцам пересчитать
Я слишком поздно об этой функции узнал и о такой возможности в целом, наверное это проблема большинства неопытных спеллмейкеров
0
19
1 месяц назад
Отредактирован EugeAl
0
nazarpunk, да можно, конечно, сделать хорошо и супер точно, и писать много кода. Просто это долго и надо нехилую усидчивость, у меня её точно нет, потому мне проще костыль запилить и перейти к следующей механике. Которая стала мне интересна. Чтобы просто не выгореть нафиг) А править мб потом. Как другие делают - не знаю.
вот такой я говнокодер, да)
0
29
1 месяц назад
0
сделать хорошо и супер точно, и писать много кода.
Ох как ты утрудишься, чтоб дополнительно написать две строчки для проверки.
наверное это проблема большинства неопытных спеллмейкеров
Я такое и у опытных не раз встречал.
мне проще костыль запилить и перейти к следующей механике. Которая стала мне интересна.
... а потом взглянуть на свой велосипед из костылей и окончательно выгореть. Выгорание происходит, когда в свой код ты боишься палочкой тыкнуть, не то что дописывать. Откладывание проблемы в долгий ящик отсрочит неизбежное, но не нужно питать ложных иллюзий.
0
27
1 месяц назад
0
Откладывание проблемы в долгий ящик отсрочит неизбежное, но не нужно питать ложных иллюзий.
Если его метод работает, то пусть делает, мы индивидуальны и каждому удобен свой подход. А касательно опытности, это скорее субъективная призма
0
19
1 месяц назад
0
nazarpunk, Если бы две... две то ладно, а вот 32 или больше, или ещё запиливать под проверку какой нибудь отдельный скрипт - ну нафиг.
Ну пока не дошло, просто если вижу, допустим, какой нибудь старый кусок кода и понимаю что это адское нагромождение костылей - сношу начинку функции и пишу уже относительно нормально. И стараюсь следовать советам из книги "Совершенный код" (за исключением конечно костылей из за отсутствия нативок).
И ещё нюансы в том, что я код не под конкретную карту делаю, а для bj, чтобы везде работало, в любой карте. Из за этого хочешь не хочешь, а приходится упираться в голый жасс, иначе, думаю, давно бы перешёл на луа или южапи или ангел скрипт. Просто их в bj не запихнёшь, а других способов, как запихнуть код в mpq, чтобы игра его по дефолту находила и запускала, я не знаю.
0
19
1 месяц назад
0
rsfghd, Спасибо. Работает, но есть костыли)
Чтобы оставить комментарий, пожалуйста, войдите на сайт.