Сейчас 12:24:34 Суббота, 23 июня, 2012 год
Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я

Меню сайта

Категории

Наш опрос
Какой тип карт вам нравится больше всего?
Проголосовало: 123555

Сейчас на сайте
На сайте всего: 53
Гостей: 39
Пользователей: 14

Реклама

Главная » Статьи по WarCraft 3 » Создание карт » Jass
Автокаст-спеллы и код
Вступление.

Для тех, кто не очень понимает, что такое автокаст, я объясню: это способность, похожая на "Ледяные стрелы" у наги, где вы можете щёлкнуть правой кнопкой мыши для того, чтобы заставить способность применяться автоматически (постоянно пускать ледяные стрелы) или же щёлкнуть левой кнопкой мыши и указать цель, чтобы применить способность один раз. Эти два события немного непросто отловить. Здесь я покажу, как можно это легко сделать.

Предназначение этой статьи - научить картостроителей создавать триггерные автокаст-спеллы на JASS.

Прежде, чем изучать эту статью, рекомендуется ознакомиться с основами JASS и основами спеллмейкерства, т.к. эта статья НЕ является введением в JASS. Так что если вы не очень знакомы с JASS, прочитайте вводные статьи и вернитесь к этому материалу тогда, когда вы уже более-менее освоитесь с JASS.

Итак, всё, что вам понадобится для понимания статьи - это World Editor, базовые знания в JASS, JassCraft и система СScache, которую можно скачать у Vexorian'a. В этой статье мы создадим свою подобную систему, однако некоторые мучаться не хотят.

Даже подумав, что код может быть восстановлен, не рекомендую использовать в World Editor спеллы, базированные на коде, так как достаточно всего лишь одной маленькой ошибки, чтобы игра выдала ошибку. Согласитесь, это будет весьма неприятно для играющих.
Итак, начнём.

Создание способности.

Итак, давайте создадим триггер. Назовём его "Auto Attack". Сконвертируем его в код и удалим всё, что там будет. Должен получиться абсолютно чистый триггер. Следующим шагом нужно создать инициализацию триггера и добавить наши события.


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

Можете называть свои функции как хотите, единственным исключением является функция инициализации триггера. Она должна иметь имя в формате "InitTrig_{НАЗВАНИЕ}", где {НАЗВАНИЕ} - имя функции.
В условиях нам надо будет отловить, есть ли у атакующего способность-автокаст или уточнить, что применяемая способность - наш автокаст.
Давайте создадим нашу функцию-условие над функцией инициализации, т.к. функция, которая вызывает другую функцию, должна быть ниже, чем вызываемая.

P.S.: Условия напишите в одну строку, я перенёс часть условия на другую строку, чтобы не порвать страницу.

Итак, у нас два события, которые должны отлавливаться, поэтому нужно проверить оба. Если у нас есть событие, что боевая единица атакована, нужно также проверить, есть ли у атакующего героя нужная способность (я использовал 'A000'). Если она имеется, то возвратить true и запустить наши действия. В случае, если условия не встретились, мы проверяем, был ли эффект от той способности, которая нам нужна (нужно проверить, является ли событием применение способности, после чего elseif запустит условие, которое проверит, атакован ли юнит и нет ли у атакующего нужной способности) и убедиться в том, что применяемая способность - это та, которую мы хотим. Если условия верны, то запустятся действия триггера, если же нет, тогда возвратится false, а триггер не запустит действия.
Следующая функция - наши действия.


Здесь всё не очень уж и трудно. Нам нужен триггер действий после того, как цель была повреждена, поэтому мы создаём его, также нам нужно действие триггера, которое потом обнулим, и ещё нам понадобится боевая единица, которая была целью.
В первую очередь нужно проверить, какое это было событие. Если событием было "Применяет способность", тогда цель будет обозначаться через GetSpellTargetUnit(), если же нет, то должен быть атакованный воин, которого обозначаем через GetTriggerUnit(). Теперь, чтобы проверить, действительно ли получил воин урон, создадим новое событие с указанием на воина. Укажем действия после получения повреждения. Затем ждём.
Зачем нужно ждать? Нам нужно уничтожить триггер сразу. Почему же не сделать это сразу в этой функции? Лично я использую время ожидания 2 секунды, т.к. этого времени достаточно для получения урона, также оно очень удобно для блокировки повторного использования способности, поэтому дважды функция не запустится.
После ожидания мы удаляем triggeraction и уничтожаем триггер, не забывая обнулять локальные переменные, типы которых наследуются от handle, чтобы избежать утечек памяти.
Нам осталось написать функцию действий после получения урона от атаки.

P.S.: Условия напишите в одну строку, я перенёс часть условия на другую строку, чтобы не порвать страницу.

Итак, в первую очередь зададим локальные переменные. dam отлавливает полученные повреждения, target - это боевая единица, которая получила повреждение, а cast - это тот, кто нанёс урон. Отдельная переменная используется для создания всплывающего текста, который часто используется в способностях, подобный этой, а ещё одна переменная - это реальная, которая потом тоже будет задействована.
Так как наша цель может получить повреждения от многих других факторов, нужно сразу это исключить, проверив цель на наличие эффекта от ледяных стрел (я использовал 'B000')(подразумевается, что способность будет базирована на ледяных стрелах, я считаю их лучшим шаблоном). Эффект может быть поставлен на время не ниже 0.01 секунды, поэтому вы никогда не увидите его, а это полезно для того, что мы делаем. Также у заклинаний \ эффектов всего 1 уровень, поэтому их наличие у цели можно проверить условием, которое будет говорить, что уровень заклинания \ эффекта у цели больше нуля.
После того, как в цель попала стрела, у неё будет заклинание \ эффект, действующий 0.01 секунду, значит, можно проверить его наличие на цели. Также лучше проверить наличие способности у наносящего урон героя, так будет безопаснее. Если эти условия правдивы, то можно создавать наши эффекты.
Первым делом я всегда отключаю триггер. Это означает, что триггер больше не запустится, даже если воин получит ещё больше повреждений. Уничтожать триггер не надо, т.к. уничтожается он в другой функции.


Это используется для того, чтобы задать количество урона, который будет наноситься цели дополнительно. По моему примеру, дополнительно нанесётся 25% от нормального урона способности.
Несколько строк ниже - это всплывающий текст. Вместо использования BJ я вытащил из неё все native-функции в целях оптимизации. Конечно, не очень здесь это и важно, однако мне больше нравится делать так. Затем я приказываю атакующему повредить цель на количество здоровья, указанного в реальной, которую я назначил ранее, это дополнительное повреждение от способности.
И, наконец, уничтожим всплывающий текст и выставим его переменной значение null (обнулим её). Я обнулял и уничтожал всплывающий текст в блоке if\endif, т.к. вне этого блока нет всплывающего текста для уничтожения, я создавал этот текст внутри этого блока. Напоследок обнулим оставшиеся переменные, чтобы не провоцировать утечки.
Итак, посмотрим на наш триггер-результат.

Завершая статью, хочу поделиться с вами фактом про уничтожение триггеров. Было обнаружено, что прямое уничтожение триггеров может спровоцировать ужасные последствия в карте. Ниже я даю вам функцию, которая позволяет уничтожить триггер, избегая ошибки.

Она просто берёт ваш триггер и перед его уничтожением ждёт 15 секунд. Я не вижу в ней никакого смысла, но она позволяет избежать ошибки. Может быть использована вместо сall DestroyTrigger() в функции Auto_Attack_Detect_Actions.
Вот и всё, у нас получилась автокаст-способность, которую можно использовать в вашей карте. Я надеюсь, что вы узнали что-то новое. Удачного картостроения и оригинальных карт!
Просмотров: 3142 Добавил: [DUОS] Добавлено: 04 Декабрь 2009 в 22:40:50
Комментариев: 11 |

Всего комментариев: 111 2 »
09 Апрель 2011
11. shift (shift2501)
Круто xD

26 Октябрь 2010
10. Алексей (DarkVader)
Норм статья, ток пока не со всем разобрался=((( Зато поглядел на код и подчерпнул немного новой инфы для себя=)))

10 Февраль 2010
9. --- (0x00)
судя по коду автор - идиот, и обучался программированию в индии

10 Январь 2010
8. Antoha (Kartoha)
Ты вообще о чем?!

09 Январь 2010
7. Антон (OraCool)
я стаью раз 10 прочитал, и только на 11 раз понел что как О_О

02 Январь 2010
6. Antoha (Kartoha)
Предпоследний скрин->строка 62-> после первой запятой в скобках указанна буква "u" - я так понял, что это локальная переменная, но она в этой функции не где не объявляется, эта функция не рабочая. [DUOS], если весь этот код с точностью вставить в какой-нибудь триггер он не будет даже включатся. Может я что-то недопонимаю, объясни.

22 Декабрь 2009
5. Roman ([SOAD]Damager)
автор, извините меня, но это до попы... для ознакомления с Джасс сгодиться... благодоря этому я вник в джасс, но оно не будет работать корректно.
Ответ: Правда? У меня всё работает, не пори чушь. Вначале опробуй, потом и говори, что статья "до попы".

22 Декабрь 2009
4. Roman ([SOAD]Damager)
на второй картинке второй call с подвохом

11 Декабрь 2009
3. Никита (Быбулька)
блин круто.Обезательно использую
спс :)

05 Декабрь 2009
2. R.G.O. ([DUОS])
Всегда рад помочь. :)

1-10 11-11
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]

Форма входа
Логин:
Пароль:

Поиск

Случайная картинка

Случайный файл
[19 Июль 2010]
Бандит -
Автор:Nikikin
Название:Бандит
Описание:Сталкер с группировки бандит.

Новые карты

5 лучших по кол-ву добавленных статей
[ [DUОS] ] [ 56 ]
[ Messenger ] [ 52 ]
[ Pand@ ] [ 36 ]
[ OrcRider ] [ 32 ]
[ РеКсАр ] [ 27 ]

Наша кнопка
Warcraft3FT.info - Всё для Warcraft 3 и DotA

Другие варианты

Статистика

Материалы:
Новости: 918
Файлы: 6438
Статьи: 742
Обои: 3825
Форум: 25860/991045
Комментарии: 56264
Copyright © 2006 - 2012 Warcraft3FT.info При копировании материалов c сайта ставьте, пожалуйста, активную обратную ссылку на нас • Design by gReeB04ki ©