Если вы хотели бы использовать в своей карте нестандартное, оригинальное заклинание или наработку, но у вас не хватает знаний для реализации, то эта тема специально для вас. В данной теме вы можете, в определённом правилами формате, оставить заявку на создание необходимого вам заклинания или системы.
Если вы считаете, что у вас есть возможность выполнить какую-либо из имеющихся заявок, то вы можете оставить сообщение в определённом правилами формате, в котором указать какую из заявок собираетесь исполнить.

Правила темы

  • Запрещается дублирование заявок.
  • Любая заявка, написанная непонятным языком (обилие орфографических ошибок, орфоарт, отсутствие знаков препинания, использование рядов восклицательных и вопросительных знаков) будет удалена.
  • Обсуждение технических нюансов исполнения спелла или багов просьба вести через систему личных сообщений.
  • Для составления заявок используйте формы.
Заявки, не удовлетворяющие правилам, будут удалены !

Как составить заявку

Необходимо, используя форму составить сообщение в данной теме, где указать:
  • Желаемое название заказа
  • Желаемый метод исполнения (GUI/Jass/cJass/vJass)
  • Требуется ли возможность использовать спелл несколькими юнитами одновременно (MUI)
  • Цель применения способности
  • Количество уровней
  • Описание (Смысловое, а не художественное)
  • Технические характеристики (кол-во маны, параметры урона, перезарядки, время действия и т.п.) для каждого из уровней
Форма для составления заявки
# Заказ
**Название:** Название способности (или системы)
**Метод:** GUI/Jass/cJass/vJass/lua/angelscript
**MUI:** Обязательно/Не обязательно
**Цели:** Другой юнит / Сам юнит / Точка/ Область/Нет цели/Прочее (указать что именно)
**Количество уровней:** Целое число
**Описание:** Ваше описание. Можно слить со следующим.
**Технические характеристики:** Ваше описание. Можно слить с предыдущим.

Как принимать заказ

Необходимо, используя форму составить сообщение в данной теме, где указать:
  • Никнейм заказчика
  • Название выбранного вами заказа
  • Примерные сроки исполнения (конечно, их соблюдение не критично, но желательно)
Форма для принятия заявки
# Заказ принят
**Заказчик:** Никнейм заказчика
**Заказ:** Название способности/алгоритма
((центр
**Спелл будет завершен к [дата в формате дд.мм.гггг. без скобок]**
))
[ дата принятия заявки в формате дд.мм.гггг / дата, к которой спелл предположительно будет готов в формате дд.мм.гггг ]

Как сообщить о не/выполнении заказа

Необходимо, используя форму составить сообщение в данной теме, где указать:
  • Никнейм заказчика
  • Название выбранного вами заказа
  • Выполнен ли заказ
  • В случае, если заказ невыполним/не выполнен полностью, рекомендуется описать, что именно вам удалось/не удалось сделать.

  • Предоставить карту
Форма для не/выполненного заказа
Заклинание готово! [Если заказ выполнен успешно] / Не удалось выполнить заклинание [Если по каким-либо причинам вы не способны его выполнить] (1 из 2)
=
Заказчик: Никнейм заказчика
Заказ: Название способности
Выполнено: Да/Нет
-
[Сюда добавить инструкцию по импорту, или описать что у вас не/получилось, если не удалось выполнить заказ]
За качественно выполненный заказ вы получите дополнительно 200 единиц опыта.

Дополнительно: как приобрести спелл, не прибегая к этой теме

0. Пройдитесь по базе способностей xgm.guru/p/wc3/tag/ability или алгоритмов xgm.guru/p/wc3/tag/algorithm
A. Для начала загляните в Архив готовых спеллов. Возможно, спелл, аналогичный вашему, уже был сделан.
B. Проверьте, нет-ли нужного спелла в Библиотеке заклинаний. Проверенные спелл-мейкеры изготавливали заклинания специально для общественного использования.
C. Поищите общедоступные для открытия карты - там тоже бывают полезные вещи.
D. Если ничего не помогает, пройдитесь поиском по Академии - вероятно, что такие спеллы уже пытались делать и спрашивали как.
E. Если поиски не помогли, попробуй сделать его сам:
  • Осваиваем триггеры в Базе статей, F.A.Q., если не имеем понятия о них.
  • Существуют специальные статьи по созданию спеллов и баффов: 1, 2, 3, 4, 5
  • Поскольку ваши спеллы будут неоптимизированы, и более того, с кучей утечек - настоятельно рекомендуется читать статьи\темы про JASS. Тяжело читать? Легко делать!
  • Если ну никак не выходит сделать то что требуется, заходим в Академию и используем ее по основному назначению - задаем вопросы.

Разумные поиски и тщательное изучение помогут вам добиться результата.
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Этот комментарий удален
28
Выполнение заказа

Заклинание готово!

Заказчик: Agren
Способность: Массовый контроль разума
Выполнено: Да

инструкция по импорту
карта на гуи + кастомскриптах, мне пришлось юзануть хэштаблицу для возвращения контроля

скопировать папку Initialization и вставить в свою карту
в триггере Untitled Trigger 001 можно настроить радиус захвата ближайших юнитов и их количество за каст, там же находятся и все нужные проверки, добавишь свою защиту от пси излучения и если у тебя 2+ юнита разных игроков могут захватывать контроль, то желательно дать проверку, что юнит уже не находится под контролем, иначе может забаговаться, поскольку они находятся в группе контроля у другого юнита, и их оттуда нужно удалять, а тут нужно дополнительно нагромождать систему, что мне лень было сделать, т.е. в захваченных юнитов сохранить кто их захватил, потом доставать оттуда захватчика, удалять оттуда юнитов и давать новому захватчику, кроме этого нужно решать вопрос касательно кому же тогда возвращать юнитов которых 2+ раза подряд захватили - предыдущему захватчику или кому они изначально принадлежали, если захватчики принадлежат одному и тому же игроку, то всё будет окей, поскольку есть проверка, что юниты принадлежат врагу. Но не выйдет так, что 2 захватчика одного и того же игрока смогут захватить одного и того же юнита, и чтобы при убийстве одного захватчика, юнит всё ещё оставался под контролем, пока не убьют обоих захватчиков. В общем-то, ни один из перечисленных аспектов описан не был, поэтому ни над чем не пришлось париться. В этом же триггере находится выдача абилки пустышки на основе ауры торнадо для отображения дебаффа, думаю там сам уже разберёшься, поскольку это редактор объектов уже. Спецэффекты можно удалять
В триггере Untitled Trigger 002 возвращается контроль над убитым захватчиком или юнитом, которого захватили (в случае, если его воскресят, но если это не нужно было, то придётся отслеживать момент разложения юнита, что так же нагромождает систему и что мне так же было лень делать), а так же удаляется дебафф, спецэффекты можно убрать
Загруженные файлы
Ответы (5)
29
rsfghd, большое спасибо за выполненный заказ!
Я проверил карту, всё работает. Но, есть одна проблема - способность можно "абузить" - если использовать её снова и снова, юнит захватывает контроль над новой парой юнитов, в добавок к уже двум захваченным ранее...
Пожалуйста, rsfghd, можете как-то сделать так, чтобы у юнита, повторно применяющего способность "Массовый контроль разума", если он уже контролирует двух (\определённое количество) юнитов, сбрасывался контроль над предыдущими двумя?
Конечно, я виноват, что не додумался в заказе указать этот пункт про анти-абуз способности....
28
Agren, я бы не назвал это абьюзом, но да, можно переделать. Если не сделаю на днях, то на выходных, поскольку у меня другие дела уже запланированы на этот вечер
29
rsfghd, спасибо большое! Конечно, когда сможете - сделайте, я вас не тороплю.
1
Здраствуйте я новичок скажите пож, а заклинания на заказ платные? за них надо платить?
Ответы (3)
8
powertroll 333, нет, за них не платят, по крайней мере в этом топике.
1
ReiGyl, Спасибо!!! то есть я могу придумать любое заклинание ,и мне его сделают?
8
powertroll 333, по большей части тут сидят экспериментаторы, которым нечего делать в Warcraft III, поэтому может и сделают, если у них найдется время, желание, и заинтересует концепция.
28
Если вы хотели бы использовать в своей карте нестандартное, оригинальное заклинание, но у вас не хватает знаний для его реализации, то эта тема специально для вас. В данной теме вы можете, в определённом правилами формате, оставить заявку на создание необходимого вам заклинания или системы.
Заплатить за проделанную работу является исключительно твоей инициативой. Есть другие приватные темы, где за заказ нужно платить, тут исключительно на энтузиазме спеллмейкеров
Ответы (3)
1
rsfghd, Вы занимаетесь созданием модов? например мне нужно создать героя с со своими способностями? и что бы этим героем можно было играть например за альянс с ботами?или в карте дота алстар? просто чтобы знать?
26
powertroll 333, можно взять какую либо из версий доты-аллстарс и модифицировать её внедрив своего героя. Но это будет уже другая карта, отличная от оригинала... т.е. вероятность того что народ будет играть на икапе или еще где именно в эту версию - нулевая. Проще найти какой-то иной проект и попробовать свою задумку там, может что да выйдет.
1
Заказ на работу

Заказ

Название: Soul Rend
Метод: GUI/Jass (1.26)
MUI: Обязательно
Цель: Другой юнит
Количество уровней: 1 (для предмета)
Описание: при использовании предмета указанный противник получает сайленс, а любой получаемый им урон увеличивался (длительность 10 сек., доп. урон 60%)
Желательно, чтобы параметры длительности и доп. урона были легко настраиваемыми.
16

Заказ

Название: Escape Leap
Метод: См.комментарий
MUI: Да
Цель: сам юнит
Количество уровней: См.комментарий
Описание: www.hiveworkshop.com/threads/escape-leap-v0-02.225863
Большая просьба изменить спелл: в нынешнем виде он не учитывает проходимость (например, лес, граница карты или возвышенность), из-за чего юнит вполне может застрять или потеряться. Препятствия должны корректно ограничивать точку приземления юнита.
Ответы (4)
28
Галендор Крэйл, так юнит должен приземляться сразу в ближайшую проходимую точку или телепортироваться в неё после приземления? В чём проблема взять за основу спелл* на основе вардов*, чтобы запрещать игроку каст спелла в непроходимую точку?
16
rsfghd, заклинание не даёт выбрать точку приземления (впрочем, это не проблема - если ты играл в ВоВ за охотника, то знаешь способность Отрыв). При применении юнит отпрыгивает назад на определённую дистанцию. В текущем исполнении если позади него лес, он может приземлиться среди деревьев. Если возвышенность - оказаться на ней или перелететь через неё. И т.д.
Должно быть так: если на пути прыжка находится непроходимый участок, прыжок заканчивается у его границы (перед лесом, на берегу реки, у границы карты).
28
Галендор Крэйл, и всё же ты не дал мне толкового ответа на мой вопрос, видимо сам особо спеллмейкерством не занимаешься, рассказываю возможные варианты прекращения прыжка:
  1. резкое установление 0 полета и остановление движения при столкновении с препятствием
  2. отлавливать точку приземления перед кастом, спавнить там предмет для обнаружения ближайшей проходимой точки, перенаправлять точку приземления в позицию предмета
  3. циклом пройти расстояние от точки каста до точки падения для обнаружения непроходимой местности, при наличии препятствия - переустановить точку падения
  4. перестать двигаться при наличии препятствия до полного приземления
  5. и так далее))
28
Галендор Крэйл, а, оно вообще гуишное и немного говённое, не учитывается высота ландшафта, из-за чего герой будет как треморный дергаться на кривом ланде во время полёта
28
Выполнение заказа

Заклинание готово!

Заказчик: Галендор Крэйл
Способность: Escape Leap
Выполнено: Да

в конце полёта просто заспавнил итем, переустановил точку, удалил итем и телепортировал туда кастера, импорт такой же как и в оригинале
Загруженные файлы
Ответы (6)
16
rsfghd, большое спасибо!
Ты прав, я в спеллмейкинге разбираюсь на примитивно-базовом уровне (если - то), поэтому мог не донести мысль корректно.
Проверил способность, она всё так же не считает лес препятствием, из-за чего юнит может приземлиться среди деревьев и не выбраться оттуда. Можно ли сделать так, чтобы на деревья была такая же "реакция", как и на водоёмы?
28
Галендор Крэйл, странно, я всегда думал что предмет не может заспавниться в декоре, проверю
28
Галендор Крэйл, я проверил, с деревьями такая же реакция как и с водоёмами, телепорт в ближайшую проходимую точку, спасибо за дезинфу и моё потраченное время
16
rsfghd, я не претендую на абсолютную истину, но... как тогда объяснить это? Для протокола: я просто заспавнил деревья на карте.
28
Галендор Крэйл, это говорит о твоей криворукости. Я же ясно сказал - телепорт в ближайшую проходимую точку. Открой вкладку обзора и поставь галочку на видимость проходимых путей: земля. И ты увидишь, что между твоими деревьями присутствуют пространства, которых в моём случае не было. Если ты и на воде сделаешь проходимую маленькую точку - будь уверен, он там окажется таким же образом
16
rsfghd, ах, вот оно что! Да, ты прав, всё так. Спасибо, тогда вопросов нет.
1
Заказ на работу
Можно ведь заказать сразу 3 скилла на героя (Лича)?
1.
Название: Цепной Мороз
Метод: GUI/Jass
MUI: Обязательно
Цель: Другой юнит
Количество уровней: 3
Описание: Создаёт ледяной шар, который отскакивает от противников до 10 раз, замедляя их и нанося им урон, увеличивающийся с каждым отскоком. (если у героя имеется определённый предмет (Скипетр Аганима), то количество отскоков не ограничено). Да, это ульт из доты.
Характеристики: 1 уровень: урон - 250 ед., увеличение урона - 15 ед., радиус отскока - 600, требует маны - 180 ед., перезарядка - 100 сек. 2 уровень: урон - 400 ед., увеличение урона - 20 ед., радиус отскока - 600, требует маны - 300 ед., перезарядка - 80 сек. 3 уровень: урон - 550 ед., увеличение урона - 25 ед., радиус отскока - 600, требует маны - 420 ед., перезарядка - 60 сек. Длительность замедления как у ледяной звезды на 1, 2, 3 уровнях.
Искал готовые наработки, но там дамми юнит (ледяной шар, модель атаки ледяного змея) летит к месту, где был вражеский юнит на момент применения заклинания (враг отошёл, и шар взорвался на большом расстоянии от него, но продолжил скакать как ни в чём ни бывало), не было увеличения урона с отскоком, ну и был только 1 уровень, из-за чего в редакторе объектов не мог менять урон в зависимости от уровня, ибо это всё на триггерах.
2.
Название: Ледяной Щит
Метод: GUI/Jass
MUI: Обязательно
Цель: Другой юнит, сам юнит, здания
Количество уровней: 4
Описание: Накладывает на цель щит, который уменьшает урон от атак по ней. Пока щит действует, он раз в 1 сек наносит урон вражеским юнитам вокруг и замедляет их. (модель щита такая же, как у ледяной брони) (по возможности, сделать эффекты волн от щита, просто чтобы визуально было видно область, в которой враги замедляются и получают урон).
Характеристики: 1 уровень: уменьшение урона - 30%, урон - 18 ед., длительность - 5 сек. 2 уровень: уменьшение урона - 40%, урон - 32 ед., длительность - 6 сек. 3 уровень: уменьшение урона - 50%, урон - 46 ед., длительность - 7 сек. 4 уровень: уменьшение урона - 60%, урон - 60 ед., длительность - 8 сек. Длительность замедления везде 0,5 сек. Везде требует 100 ед. маны, дальность применения как у ледяной брони, радиус области замедления и урона - 600.
3.
Название: Зловещий Взор
Метод: GUI/Jass
MUI: Обязательно
Цель: область
Количество уровней: 1, способность не относится к герою (ну как у юнитов обычных)
Описание: оглушает вражеское существо и крадёт ману и здоровье в процентном соотношении 10% в секунду. Длительность - 3 сек. Перезарядка - 24 сек.
Ответы (2)
28
ALEX 101 НЕ, если никто не преуспеет, то сделаю на следующих выходных, может раньше, хз
28
Выполнение заказа

Заклинание готово!

Заказчик: ALEX 101 НЕ
Способность: Цепной Мороз
Выполнено: Да (GUI)

инструкция по импорту
удалить из папки Initialization триггер отделённый комментарием (он нужен для показа урона) и скопировать папку в свою карту
половина настроек в гуи, другая половина в редакторе объектов, я думаю ты разберёшься, добавишь нужное кол-во уровней замедления для даммикаста и для основной абилки, ману, кд иконки, описание и так далее устанавливай сам
в триггере Untitled Trigger 001 есть булекспр, где ты должен указать кого отлавливать в качестве следующей цели для нанесения урона, на данный момент там условие что юнит жив, что враг и что не равен предыдущей цели, там же можешь настроить радиус соприкосновения с целью, если тебе не нужны дополнительные эффекты, можешь удалить переменные Dummy1 и Dummy2, а вместе с ними все функции, где они были использованы (они станут красными после удаления), будет вылетать только один даммик
если нужна дополнительная помощь по импорту - спрашивай
Загруженные файлы
Ответы (2)
1
rsfghd, работа супер, но у меня возник вопрос по поводу того, как сделать у способности 3 уровня с изменением урона, ведь в триггере урон постоянно 250 и добавочный урон 15 (всегда 1 уровня). А всё остальное получается, манакост, кд, иконки, разобрался, где кол-во отскоков. А возможно ли сделать так, что если у юнита в предметах к примеру Сфера Льда, то отскоков бесконечное кол-во при любом уровне способности?
28
ALEX 101 НЕ, чел.. там в гуи настройки урона. Добавь ветку если тогда иначе, если уровень абилки у кастера 1, то выставить урон 250, если второй уровень, то 999 и так далее
28
Выполнение заказа

Заклинание готово!

Заказчик: ALEX 101 НЕ
Способность: Ледяной щит
Выполнено: Да

инструкция по импорту
скопировать папку Initialization в свою карту
в триггере Melee Initialization подобрать равкоды в коде под редактор объектов, там же находится и радиус выбора юнитов для урона и урон по ним, отмечено комментариями
в триггере NegateDamage подобрать равкоды под редактор объектов

если нужна дополнительная помощь по импорту - пиши
так же советую сделать прелоад эффектов

а, сор, в триггере NegateDamage 35 строка
call NegateDamage( GetTriggerUnit( ), GetEventDamage( ) * ( 0.80 - 0.10 * GetUnitAbilityLevel( GetTriggerUnit( ), 'A002' ) ) )
формула блокирования урона, т.е. 0.80 - 0.10 * лвл (30% первый лвл, 40% второй и т.д.)
Загруженные файлы
Ответы (4)
38
rsfghd, а можно писать это в ответах на комментарий? Тогда список не будет так захламлен и можно будет сразу видеть заказы.
Возможно, в будущем у заказов с ответами-выполнениями будем делать какую-то особую пометку
28
ScorpioT1000, ниможна
замечание от tysch_tysch: 3.1 Обсуждение действий модераторов (ОДМ) по предотвращению нарушений правил.
28
ScorpioT1000, и вообще где мои +200 опыта за выполнение заказов лебовски
15
Заказ на работу
Всем привет! Нужно заклинание, по своей сути ничего сверхестественного, однако моих знаний не хватает, чтобы учесть все моменты и реализовать это не криво.
Заказ
Название: Яростный рывок
Метод: Jass
MUI: Не нужно
Цель: Другой юнит / Точка
Количество уровней: 3
Описание: Герой прыгает в толпу врагов(Прыгает как прыгуны в длину, а не в высоту, то есть прыжок высокий не нужен, а лишь слегка над землей, потому что герой очень массивный - вождь минотавров). Враги, оказавшиеся на пути, получают 175/275/375 единиц урона и расталкиваются в стороны, от вектора прыжка. Те враги, которые стояли напротив вектора, отталкиваются назад. При этом, если за врагами стоят их союзники и враги налетают на них, то соответственно отталкивают так же и союзников.
По возможности, сделать так, чтобы враги, отлетевшие в декорацию или стену, получили 50/70/100 единиц урона.
Технические характеристики: Тут нужно учитывать преграды, чтобы герой не перепрыгнул через декорации или стены и чтобы враги отлетели так же до стен/декораций, но не сквозь них.
Ответы (5)
28
Meddin, если никто не преуспеет, то сделаю на выходных, может раньше
28
Выполнение заказа
Meddin, всё что нужно изменить при импорте в коде помечено комментариями, достаточно скопировать папку Initialization и вставить в свою карту
если что-то не понятно или нужно переделать - пиши
код
function GetDirection takes real alpha, real gamma returns integer
    if ( alpha < bj_PI and not( gamma > alpha and gamma < alpha + bj_PI ) ) or ( alpha > bj_PI and gamma > alpha - bj_PI and gamma < alpha ) then
        return 2
    else
        return 1
    endif
endfunction

function ParabolaZ2 takes real y0, real y1, real h, real d, real x returns real
    return ( 2.00 * ( y0 + y1 - 2.00 * h ) * ( x / d - 1.00 ) + ( y1 - y0 ) ) * ( x / d ) + y0
endfunction

function GetLocZ takes real x, real y returns real
    call MoveLocation( udg_LFZ, x, y )
    return GetLocationZ( udg_LFZ )
endfunction

function IsUnitDead takes unit u returns boolean
    return IsUnitType( u, UNIT_TYPE_DEAD ) or GetUnitTypeId( u ) == 0
endfunction

function MoveCollision takes nothing returns nothing
    local timer t = GetExpiredTimer( )
    local timer t1
    local integer i = GetHandleId( t )
    local integer i1
    local unit target = LoadUnitHandle( udg_H, i, 0 )
    local unit caster = LoadUnitHandle( udg_H, i, 1 )
    local unit u
    local real a = LoadReal( udg_H, i, 2 )
    local real d = LoadReal( udg_H, i, 3 )
    local real s = LoadReal( udg_H, i, 5 )
    local real x
    local real y
    local real x1
    local real y1
    local group g = LoadGroupHandle( udg_H, i, 6 )
    local group g1
    local player p = GetOwningPlayer( caster )
    
    if s > d then
        set s = d
    endif
    
    set d = d - s
    
    set x = GetUnitX( target ) + s * Cos( a )
    set y = GetUnitY( target ) + s * Sin( a )
    
    call SetItemPosition( udg_TempItem, x, y )
    call SetItemVisible( udg_TempItem, false )
    
    set x1 = GetItemX( udg_TempItem )
    set y1 = GetItemY( udg_TempItem )
    
    if ( x + 1.00 < x1 or x - 1.00 > x1 ) or ( y + 1.00 < y1 or y - 1.00 > y1 ) then
        set x = x - s * Cos( a )
        set y = y - s * Sin( a )
        set d = 0.00
        
        call UnitDamageTarget( caster, target, 25.00, false, false, null, null, null )
        call DestroyEffect( AddSpecialEffectTarget( "Abilities\\Weapons\\AncientProtectorMissile\\AncientProtectorMissile.mdl", target, "chest" ) )
    endif
    
    call SetUnitX( target, x )
    call SetUnitY( target, y )
    
    call GroupEnumUnitsInRange( udg_TempGroup, x, y, 416.00, null )
    
    loop
        set u = FirstOfGroup( udg_TempGroup )
        exitwhen u == null
        call GroupRemoveUnit( udg_TempGroup, u )
        
        if not IsUnitDead( u ) and IsUnitEnemy( u, p ) and not IsUnitInGroup( u, g ) and IsUnitInRange( u, target, 16.00 ) then
            call GroupAddUnit( g, u )
            
            set t1 = CreateTimer( )
            set i1 = GetHandleId( t1 )
            set x1 = GetUnitX( u )
            set y1 = GetUnitY( u )
            
            call SaveUnitHandle( udg_H, i1, 0, u )
            call SaveUnitHandle( udg_H, i1, 1, caster )
            
            call SaveReal( udg_H, i1, 2, Atan2( y1 - y, x1 - x ) )
            call SaveReal( udg_H, i1, 3, LoadReal( udg_H, i, 4 ) * 0.50 )
            call SaveReal( udg_H, i1, 4, LoadReal( udg_H, i, 4 ) * 0.50 )
            call SaveReal( udg_H, i1, 5, LoadReal( udg_H, i, 5 ) * 0.50 )
            
            set g1 = CreateGroup( )
            set bj_groupAddGroupDest = g1
            call ForGroup( g, function GroupAddGroupEnum )
            
            call SaveGroupHandle( udg_H, i1, 6, g1 )
            
            call TimerStart( t1, 0.01, true, function MoveCollision )
            
            set g1 = null
            set t1 = null
        endif
    endloop
    
    if d <= 0.00 then
        call DestroyGroup( g )
        
        call PauseTimer( t )
        call DestroyTimer( t )
        call FlushChildHashtable( udg_H, i )
    else
        call SaveReal( udg_H, i, 3, d )
    endif
    
    set t = null
    set g = null
    set target = null
    set caster = null
endfunction

function Move takes nothing returns nothing
    local timer t = GetExpiredTimer( )
    local timer t1
    local integer i = GetHandleId( t )
    local integer i1
    local unit caster = LoadUnitHandle( udg_H, i, 0 )
    local unit u
    local real a = LoadReal( udg_H, i, 1 )
    local real d = LoadReal( udg_H, i, 2 )
    local real s = LoadReal( udg_H, i, 4 )
    local real x
    local real y
    local real x1
    local real y1
    local player p = GetOwningPlayer( caster )
    local group g = LoadGroupHandle( udg_H, i, 8 )
    local group g1
    
    if s > d then
        set s = d
    endif
    
    set d = d - s
    
    set x = GetUnitX( caster ) + s * Cos( a )
    set y = GetUnitY( caster ) + s * Sin( a )
    
    call SetItemPosition( udg_TempItem, x, y )
    call SetItemVisible( udg_TempItem, false )
    
    set x1 = GetItemX( udg_TempItem )
    set y1 = GetItemY( udg_TempItem )
    
    // check pathing
    if ( x + 1.00 < x1 or x - 1.00 > x1 ) or ( y + 1.00 < y1 or y - 1.00 > y1 ) then
        set x = x - s * Cos( a )
        set y = y - s * Sin( a )
    endif
    
    call SetUnitX( caster, x )
    call SetUnitY( caster, y )
    call SetUnitFlyHeight( caster, ParabolaZ2( LoadReal( udg_H, i, 6 ), LoadReal( udg_H, i, 5 ), LoadReal( udg_H, i, 7 ), LoadReal( udg_H, i, 3 ), d ) - GetLocZ( x, y ), 0.00 )
    
    call GroupEnumUnitsInRange( udg_TempGroup, x, y, 464.00, null ) // radius with collision ( caster + target max collisions (200.00 + 200.00) )
    
    loop
        set u = FirstOfGroup( udg_TempGroup )
        exitwhen u == null
        call GroupRemoveUnit( udg_TempGroup, u )
        
        if not IsUnitDead( u ) and IsUnitEnemy( u, p ) and not IsUnitInGroup( u, g ) and IsUnitInRange( u, caster, 64.00 ) then // 64.00 - radius with unit collision
            call GroupAddUnit( g, u )
            
            call UnitDamageTarget( caster, u, LoadReal( udg_H, i, 9 ), false, false, null, null, null ) // damage
            call DestroyEffect( AddSpecialEffectTarget( "Abilities\\Weapons\\AncientProtectorMissile\\AncientProtectorMissile.mdl", u, "chest" ) )
            
            set t1 = CreateTimer( )
            set i1 = GetHandleId( t1 )
            set x1 = GetUnitX( u )
            set y1 = GetUnitY( u )
            
            call SaveUnitHandle( udg_H, i1, 0, u )
            call SaveUnitHandle( udg_H, i1, 1, caster )
            
            if GetDirection( a, Atan2( y1 - y, x1 - x ) ) == 1 then // left or right move
                call SaveReal( udg_H, i1, 2, a + bj_PI * 0.50 )
            else
                call SaveReal( udg_H, i1, 2, a - bj_PI * 0.50 )
            endif
            
            call SaveReal( udg_H, i1, 3, 416.00 ) // distance for discarding
            call SaveReal( udg_H, i1, 4, 416.00 )
            call SaveReal( udg_H, i1, 5, 7.00 ) // speed of discarding
            call SaveReal( udg_H, i1, 7, LoadReal( udg_H, i, 10 ) ) // wall damage
            
            // save group of all units thats already got damage from spell
            set g1 = CreateGroup( )
            set bj_groupAddGroupDest = g1
            call ForGroup( g, function GroupAddGroupEnum )
            
            call SaveGroupHandle( udg_H, i1, 6, g1 )
            
            call TimerStart( t1, 0.01, true, function MoveCollision )
            
            set g1 = null
            set t1 = null
        endif
    endloop
    
    if d <= 0.00 then
        call PauseUnit( caster, false )
        call DestroyEffect( AddSpecialEffect( "Abilities\\Spells\\Human\\ThunderClap\\ThunderClapCaster.mdl", x + 64.00 * Cos( a ), y + 64.00 * Sin( a ) ) )
        
        call DestroyGroup( g )
        
        call PauseTimer( t )
        call DestroyTimer( t )
        call FlushChildHashtable( udg_H, i )
    else
        call SaveReal( udg_H, i, 2, d )
    endif
    
    set t = null
    set g = null
    set caster = null
endfunction

function SetAnim takes nothing returns nothing
    local timer t = GetExpiredTimer( )
    local unit caster = LoadUnitHandle( udg_H, GetHandleId( t ), 0 )
    
    call PauseUnit( caster, true )
    call SetUnitAnimation( caster, "attack slam" )
    call QueueUnitAnimation( caster, "stand" )
    
    call TimerStart( t, 0.01, true, function Move )
    
    set t = null
    set caster = null
endfunction

function Trig_Spell_Actions takes nothing returns nothing
    local timer t = CreateTimer( )
    local integer i = GetHandleId( t )
    local integer lvl
    local unit caster = GetTriggerUnit( )
    local real x = GetUnitX( caster )
    local real y = GetUnitY( caster )
    local real x1 = GetSpellTargetX( )
    local real y1 = GetSpellTargetY( )
    local real d
    
    if UnitAddAbility( caster, 'Arav' ) then
        call UnitRemoveAbility( caster, 'Arav' )
    endif
    
    call SaveReal( udg_H, i, 5, GetLocZ( x, y ) ) // start height
    call SaveReal( udg_H, i, 6, GetLocZ( x1, y1 ) ) // end height
    
    set x = x1 - x
    set y = y1 - y
    set d = SquareRoot( x * x + y * y )
    
    call SaveUnitHandle( udg_H, i, 0, caster )
    call SaveReal( udg_H, i, 1, Atan2( y, x ) ) // angle
    call SaveReal( udg_H, i, 2, d ) // distance
    call SaveReal( udg_H, i, 3, d ) // distance max
    call SaveReal( udg_H, i, 4, d * 0.018 ) // speed
    call SaveReal( udg_H, i, 7, 75.00 + ( 750.00 - d ) * 0.15 ) // parabola height
    call SaveGroupHandle( udg_H, i, 8, CreateGroup( ) )
    
    set lvl = GetUnitAbilityLevel( caster, GetSpellAbilityId( ) )
    if lvl == 1 then // ability level
        call SaveReal( udg_H, i, 9, 175.00 ) // start damage
        call SaveReal( udg_H, i, 10, 50.00 ) // wall damage
    elseif lvl == 2 then
        call SaveReal( udg_H, i, 9, 275.00 )
        call SaveReal( udg_H, i, 10, 70.00 )
    else
        call SaveReal( udg_H, i, 9, 375.00 )
        call SaveReal( udg_H, i, 10, 100.00 )
    endif
    
    call TimerStart( t, 0.00, false, function SetAnim )
    
    set t = null
    set caster = null
endfunction

//===========================================================================
function Trig_Spell_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == 'A000'
endfunction

function InitTrig_Spell takes nothing returns nothing
    set gg_trg_Spell = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Spell, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_Spell, Condition( function Trig_Spell_Conditions ) )
    call TriggerAddAction( gg_trg_Spell, function Trig_Spell_Actions )
endfunction

Загруженные файлы
28
Meddin, сор что долго, у меня проблемы со светом и жизнью в целом, лучше бы сдох
15
rsfghd, прими мою благодарность! Как раз на выходных займусь переносом, если что отпишусь.
17
сор что долго, у меня проблемы со светом и жизнью в целом, лучше бы сдох
Мне очень жаль это слышать. Желаю, чтобы у тебя всё наладилось. Простите за оффтоп.
PS способность шикарная
38
Последние новости!
Ресурс переименован в "Способности и алгоритмы на заказ"
Заказывайте заклинания, алгоритмы и целые наработки. В дальнейшем мы планируем развивать систему поощрения за исполнение заказов!
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.