XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Быстрый поиск на странице - Ctrl + F

Закрытая тема
 
alexkill

offline
Опыт: 19,072
Активность:
Проводник по способностям, хитростям и популярным вопросам
Авторы: PitzerMike, alexkill
Перевод: alexkill
На форуме существует много тем с вопросами о создании способностей/заклинаний, но обработать их и собрать воедино все разумные идеи почему-то никто доселе не решился. Нашел эту статью на известном буржуйском сайте, где автор рассказывает о некоторых хитростях редактора объектов и редактора триггеров Warcraft III, касающихся создания заклинаний. Это руководство будет полезно для новичков, однако пару интересных идей могут почерпнуть и опытные мапмэйкеры. Некоторые вопросы к тому же сопровождаются наглядными примерами.
Далее следует вольный перевод статьи с моими замечаниями по тому или иному поводу. Итак, начну по порядку - прим. alexkill

Раздел 1. Вопросы о способностях

» 1. Как сделать нелетающего воина летающим?
  • Amrf (Превратиться в ворона)
Добавление этой способности позволяет изменять высоту полета наземной боевой единицы (со всеми вытекающими из этого неприятными последствиями, связанными с пафингом – прим. alexkill).
call UnitAddAbility(un, 'Amrf')
call UnitRemoveAbility(un, 'Amrf')
После добавления и удаления способности вы можете корректировать высоту полета боевой единицы un, используя функцию SetUnitFlyHeight, даже если это наземная боевая единица.
» 2. Как сделать боевую единицу невыделяемой и неуязвимой?
  • Aloc (Москиты)
Боевая единица, которая обладает способностью “Москиты”, становится невыделяемой, ее нельзя указать в качестве цели и она игнорирует любые пределы пафинга *(pathing)*. Это означает, что контролировать и отдавать приказы этой боевой единице можно исключительно при помощи триггеров. Также не отображается полоса жизни игрового персонажа над его головой.
Скрипт
call UnitRemoveAbility(u, 'Aloc')
не сработает, если Вы захотите избавить боевую единицу от способности “Москиты”. Следовательно, нужно превратить боевую единицу в другую, временную, форму, а затем мгновенно превратить назад. Однако если боевая единица превратиться, используя способность “Темный” (о ней - чуть позже, - прим. alexkill), перед дальнейшим добавлением “Москитов”, она станет невыделяемой, но все еще останется целью для врагов, а также будет подчиняться правилам пафинга.
Другой способ отобрать “Москитов”:
  • спрятать боевую единицу;
  • удалить способность “Москиты”;
  • сделать боевую единицу снова видимой.
function UnitRemoveLocust takes unit u returns nothing
    local boolean backup = not IsUnitHidden(u)
    call ShowUnit(u, false)
    call UnitRemoveAbility(u, 'Aloc')
    call ShowUnit(u, backup)
endfunction
Это решение имеет и побочные эффекты:
  1. Полоса жизни над боевой единицей, как и имя игрока при наведении мышью на боевую единицу, больше не будут видны никогда. Это своеобразная уловка, если Вам необходимо сокрыть эти данные.
  2. Пропадет возможность указать боевую единицу в качестве цели заклинания (проблема решается триггерно).
  3. Выбирать боевую единицу станет возможно только рамкой.
» 3. Как сделать способность-пустышку, поменять ID способности и для чего нужен "Канал"?
  • ANcl (Канал)
”Канал” используется в качестве способности-пустышки *(dummy)*, не имеющей реального воздействия в игре. Она может быть использована для создания триггерного эффекта. Вы можете определить, является ли целью заклинания боевая единица, точка, область воздействия, либо цели нет вообще, показана ли иконка способности на карте команд. Также в параметрах способности настраивается:
  • время, в течении которого она длится;
  • отменяет ли применение способности другие способности воина;
  • является ли способность материальной, универсальной и т.п.
Благодаря возможности изменения базового ID способности на основе “Канала”, Вы можете без проблем использовать несколько способностей на основе “Канала” для одной боевой единицы. Безусловно, реальное воздействие способности нужно задавать триггерно.
function Channel_Conditions takes nothing returns boolean
  return GetSpellAbilityId() == <channel ability id>  // где channel ability id - равкод способности на основе "Канала"
endfunction

function Channel_Actions takes nothing returns nothing
endfunction

function Channel takes nothing returns nothing
  local trigger t = CreateTrigger()
  call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_SPELL_CAST)
  call TriggerAddCondition(t, Condition(function Channel_Conditions))
  call TriggerAddAction(t, function Channel_Actions)
endfunction
Начиная с патча 1.18 и выше “Канал” без проблем работает в спеллбуках и сочетается с улучшениями. Единственная проблема способностей на основе “Канала” – они могут быть отменены оглушающими способностями. Для предотвращения этого замените Ваши оглушающие способности способностями на основе ANab (Кислотная бомба).
» 4. Как увеличить запас здоровья и маны у героя, а также его защиту и скорость перемещения?]
  • AId1, AItg, AIlf, AImb, AIsi, Aamk, AIsr, AIdd, AIas, AIms, Arel, AIrm, AIcs (Повышение защиты, Повышение силы атаки, Увеличение запаса здоровья, Увеличение запасы маны, Увеличение поля зрения, Повышение характеристик, Уменьшение урона от магии, Defend Item, Attack Speed, Повышение скорости перемещения, Восстановление здоровья, Восстановление маны, Смертельный удар)
Эти предметные способности могут быть добавлены как способности боевой единицы для изменения показателей защиты, атаки, жизни, маны, поля зрения, силы, ловкости, разума, сопротивления магии, уменьшения и отражения урона, скорости атаки, скорости передвижения, смертельного удара, восстановления жизни и маны, боевой единицы. Все эти способности также будут работать и с отрицательными значениями, и Вы с их помощью сможете понизить показатели защиты, атаки и т.п. Однако, для увеличения поля зрения отрицательные значения можно использовать лишь в том случае, когда у боевой единицы отсутствуют способности, позволяющие обнаружить невидимых врагов.
Способность ‘AIdd’ имеет те же поля, что и ‘Aegr’ (Благословление Элуны), а именно: “Снижение магического урона”, “Вероятность отклонения”, ”Получено урона” и т.д. К сожалению, поля “Фактор скорости атаки” и “Фактор скорости перемещения” не работают.
Особенный баг, позволяющий Вам корректировать максимальные значения жизни и манны боевой единицы без добавления постоянной способности: просто создайте нестандартные способности на основе ‘AIlf’ (Увеличение запаса здоровья) или ‘Aimb’ (Увеличение запаса маны) с уровнем, большим 1. Далее установите бонус первого уровня - «0», а для второго – противоположный тому, что Вы хотите получить. Например, «-200», если Вы желаете добавить «200». Далее используйте функции UnitAddAbility и SetUnitAbilityLevel для добавления способности второго уровня вашей боевой единице (спеллбук создавать не нужно! – прим. alexkill). Затем немедленно удалите способность, используя функцию UnitRemoveAbility. Таким образом, вы измените максимальное значение жизни/маны без сохранения каких-либо способностей.
я не проверял это с другими предметными способностями, но у кого много свободного времени – может поэкспериментировать.
Также я хотел бы обратить внимание на поле “Без промаха” предметной способности “Смертельный удар” (оно же есть и у обычной способности героя). Установив значение “Да”, воин-стрелок (маг и т.п.) сможет без промаха поражать врагов, даже если те будут находится на возвышенностях. – прим. alexkill.
» 5. Как динамически создать декорацию?
  • ANvc (Вулкан)
Это единственная способность, которая может создать разрушаемый объект/декорацию, что в некоторых случаях может оказаться полезным.
» 6. Как триггерно переместить воинов через портал?
  • Awrp (Перемещение через портал)
Эта способность может быть добавлена в любой момент любой боевой единице. Затем при помощи функций WaygateSetDestination и WaygateActivate настраивается перемещение. Блокираторы пути могут использоваться для запрета перемещения летающих боевых единиц.
function SetupWaygate takes unit u, unit target returns nothing
   call UnitAddAbility(u, <waygate ability>)
   call UnitAddAbility(u, 'Aivs')
   call UnitAddAbility(u, 'Agho')
   call UnitAddAbility(u, 'Aloc')
   call WaygateSetDestination(u, GetUnitX(target), GetUnitY(target))
   call WaygateActivate(u, true)
endfunction

function ConnectRects takes rect left, rect right returns nothing
   local unit lu = CreateUnit(Player(15), 'ncop', GetRectCenterX(left), GetRectCenterY(left), 0)
   local unit ru = CreateUnit(Player(15), 'ncop', GetRectCenterX(right), GetRectCenterY(right), 0)
   call SetupWaygate(lu, ru)
   call SetupWaygate(ru, lu)
endfunction
немного подправил код: удалил утечки и оптимизировал – прим. alexkill
» 7. Как создать свой магазин с возможность добавления/удаления предмета или воина?
  • Apit, Aneu, Aall, Asid (Лавка: купить предмет, Выбрать героя, Общие магазины, Продажа предметов)
Вместе эти способности составляют магазин, который продает предметы исключительно для своего владельца. Замечу, что функция AddItemToStock также сработает. Функция RemoveItemFromStock срабатывает только для предметов, добавленных с использованием триггеров, поэтому Вам необходимо удалить все продаваемые и сделанные предметы в соответствующих полях магазина, а вместо этого добавить их триггерно при инициализации карты.
Замените способность ‘Asid’ способностью ‘Asud’ (Продажа войск), если хотите получить магазин, продающих войска и работающий с функциями AddUnitToStock и RemoveUnitFromStock, позволяющими добавлять и удалять воинов из магазина.
Удалите способность ‘Aall’, чтобы сделать магазин нейтральным.
Побочным эффектом способности ‘Aneu’ (Выбрать героя) является доступ к другим заклинаниям боевой единицы. Даже вражеский воин может использовать способности обладателя ‘Aneu’.
» 8. Как сделать, чтобы боевая единица могла атаковать и при этом оставалась невидимой?
  • Apiv, Agho, Aeth (Постоянная невидимость, Дух, Дух(видимый))
Эти способности делают боевую единицу невидимой для врагов без триггерной установки невидимости. Зачастую это лучший вариант нежели остановка боевой единицы (PauseUnit) и добавление способности “Москиты”. Воины с постоянной невидимостью теряют ее при атаке. Поэтому способность полезна при создании боевых единиц типа Духа Волка третьего уровня.
Воины, у которых одновременно присутствуют способности “Постоянная невидимость” и “Дух”, остаются невидимыми даже когда атакуют.
Кстати, способность ‘Aeye’ (Невидимый страж) автоматически добавляет вызванной боевой единице постоянную невидимость.
вспомните, как извращались когда-либо Вы, пытаясь сделать юнита невидимым – прим. alexkill
  • Abur, Abdt (Закопаться, Обнаружение закопавшихся)
Все закопавшиеся воины видны только своему владельцу.
» 9. Как определить рядом стоящее дерево?
  • Ahrl (Добывать ресурсы)
Может быть использована для определения, является ли разрушаемый объект деревом.
function IsDestructableTree takes destructable d returns boolean
  local boolean i = IsDestructableInvulnerable(d)
  local unit u = CreateUnit(Player(15), ‘ugho’,GetDestructableX(d), GetDestructableY(d), 0)
  local boolean result = false
  call UnitAddAbility(u, 'Aloc')
     if i then
       call SetDestructableInvulnerable(d, false)
     endif
  set result = IssueTargetOrder(u, "harvest", d)
  call RemoveUnit(u)
     if i then
       call SetDestructableInvulnerable(d, true)
     endif
  set u  = null
  return result
endfunction
весьма нужная функция при создании движения на стрелках для определения преград. Я немного модернизировал первоначальный код, ибо возникала утечка + удалил лишнюю операцию – прим. alexkill
» 10. Как отобрать у боевой единицы способность атаковать?
  • Abun(Склад)
Добавленная боевой единице способность лишает ее возможности атаковать других воинов. В этом случае даже удаляется иконка атаки на карте команд. Для того чтобы вернуть боевой единице возможность атаковать, просто удалите способность. “Склад” в сочетании со способностями сфер дают Вам полный контроль над индексом атаки.
» 11. Можно ли добавить бафф боевой единице?
  • Aasl (Аура замедления (торнадо))
Эта аура идеально подходит для добавления воину баффа, не имеющего никакого эффекта. Просто замените значения следующих полей в параметрах способности: “Данные – Фактор скорости перемещения” - “0.00” и “Характеристики – Разрешенные цели” - “Сам воин”. У способности нет иконки. Также Вы сможете добавлять боевой единице несколько способностей на основе ‘Aasl’, при этом различные иконки баффов будут сочетаться, а это, несомненно, плюс. Поскольку ‘Aasl’ является повреждающей аурой, то название баффа в игре всегда будет отображаться красным цветом, но Вы можете это изменить, используя в названии код цвета (поле “Текст – Подсказка” в параметрах баффа – прим. alexkill). Например, |cffff0000Повреждающий бафф|r или |cff00ff00Полезный бафф|r. Если же Вы когда-либо найдете предел для ‘Aasl’, то также сможете использовать другие ауры и затем скрывать их в неактивном спеллбуке.
» 12. Есть ли возможность без особых проблем прикрепить боевой единице модель оружия и т.п.?
  • ACnr (Аура восстановления здоровья)
Идеальная способность для прикрепления боевым единицам эффектов с сохранением цвета команды. Просто установите нулевое значение в поле “Данные – Объем восстановленного здоровья” и значение “Сам воин” в поле “Характеристики – Разрешенные цели”. Затем задайте модель, которую Вам нужно прикрепить (“Графика - Цель”), а в поле “Графика – Воздействие на цель 1” впишите названия соответствующих точек прикрепления.
Вот эти точки:
overhead – над головой
head – голова
chest – за спиной
origin – туловище
hand – рука
foot –нога
weapon – оружие (только для героев)
sprite – для зданий
medium – для зданий
large – для зданий
К точке прикрепления можно добавить модификаторы:
left – лево
right – право
mount – для обездвиженных боевых единиц
rear – для четвероногих
first – первый (для зданий)
second – второй (для зданий)
third – третий (для зданий)
fourth – четвертый (для зданий)
fifth – пятый (для зданий)
sixth – шестой (для зданий)
rallypoint – для зданий
Как пример: “foot left mount” – эффект будет прикреплен к левой ноге обездвиженной боевой единицы.
Заметьте также, что у некоторых моделей могут отсутствовать те или иные точки прикрепления.
Этим действием Вы привяжете модель к боевой единице со способностью ‘ACnr’, причем цвет команды модели будет соответствовать владельцу боевой единицы. Это также сработает в сочетании со способностями перевоплощения. Если случится, что у модели вдруг исчезнет цвет команды, следующий код исправит ситуацию:
call SetUnitColor(<unit>, GetPlayerColor(GetOwningPlayer(<unit>))) // где <unit> - модель прикрепленного эффекта
» 13. Как дать воину способность строить определенный тип зданий без изменения параметров этого воина в редакторе объектов?
  • AIbf (Игрушечная ферма)
Добавление этой способности позволяет боевым единицам возводить определенное здание, регулируя время его построения в параметрах способности.
» 14. Как дать воину дополнительную атаку?
  • Apxf (Пламя феникса)
Способность дает боевой единице дополнительную атаку, поражающую несколько целей, которая не зависит от обычной атаки этой единицы. У способности есть свое время перезарядки, дистанционная атака, возможность регулировать величину начального и последующего урона, а также она автоматически накладывается на каждого врага в определенной области. Поле способности “Характеристики - Длительность” определяет, насколько долго цель получает урон и сколько пройдет времени до следующей возможности атаковать ту же цель. Также существует возможность при помощи предметов добавить боевой единице несколько способностей на основе “Пламени феникса”, и все они будут срабатывать одновременно.
» 15. Как установить связь между способностями?
  • Acoa, Acoh, Adec (Посадить лучницу на спину, Расседлать, Оседлать гиппогрифа)
Особенно полезны, когда возникает необходимость объединить способности, а также для любых способностей, включающих две составляющие особого типа, поскольку Вы можете с легкостью отследить начало применения способности.
» 16. Как сделать способность, представляющую собой залп снарядов?
  • ANcs (Ракетный удар)
Если Вам нужна способность с несколькими последовательно вылетающими снарядами, особенно для создания AOE-заклинаний, используйте “Ракетный удар”. Просто установите количество выстрелов согласно количеству снарядов, которое Вам необходимо.
» 17. Как заманить воинов в определенную область?
  • AImo (Приманка)
Завлекает всех нейтрально-враждебных воинов в определенных пределах. Также Вы можете регулировать временной интервал, в течение которого приманиваются воины.
» 18. Какую способность лучше использовать в качестве основы для заклинания с целью – боевой единицей?
  • ANab, AEsh (Кислотная бомба, Отравленный нож)
Способность “Кислотная бомба” весьма многогранна и является лучшей основой для способностей с целью - боевой единицей. У нее много параметров, например, уменьшение скорости боя и перемещения, снижение защиты, основной урон, дополнительный урон, бафф, анимация дистанционной атаки. Все они при необходимости могут быть удалены. Также способность не оглушает и не имеет относящихся к цели ограничений.
У способности “Отравленный нож” похожие параметры, за исключением снижения защиты. К тому же, она отображает основной урон в виде зеленого исчезающего текста над головой воина-цели. Удалить эффект и звук можно, заменив баффом-пустышкой установленный по умолчанию бафф. Чтобы убрать всплывающий текст над головой жертвы, отображающий величину урона, установите нулевое значение поля "Данные - Начальный урон" в параметрах способности. Урон в этом случае должен наносится триггерно.
» 19. Как изменить имя персонажа в процессе игры и сменить его модель?
  • Sca1 (Темный)
Добавление воину способности “Темный” превращает его в боевую единицу типа, определенного в соответствующем поле способности. Это может использоваться для изменения какого-либо параметра, например, имени модели боевой единицы в процессе игры либо просто для выполнения трансформирующих способностей в сочетании с “Каналом”. Не забудьте очистить поле “Технологии – Требования” в настройках способности “Темный”. Единственная проблема этой способности состоит в том, что она добавляет текущее значение бонусов защиты, урона, здоровья и маны, полученных от предметов, ауры и показатели силы, ловкости и разума превращаемой боевой единицы результирующей боевой единице. Это означает, что идею трансформировать героев, нельзя назвать хорошей. Обычная же боевая единица не подвергается влиянию предметов и показателей силы, ловкости и разума, поэтому камнем преткновения являются баффы, полученные от аур. Эти баффы могут быть легко удалены перед превращением, а затем автоматически добавлены, поэтому это не проблема.
call UnitRemoveAbility(u, 'BHab')
call UnitRemoveAbility(u, 'BUau')
call UnitRemoveAbility(u, 'BUav')
call UnitRemoveAbility(u, 'BEah')
call UnitRemoveAbility(u, 'BHad')
call UnitRemoveAbility(u, 'BEar')
call UnitRemoveAbility(u, 'BOae')
call UnitRemoveAbility(u, 'BOac')
call UnitRemoveAbility(u, 'Bapl')
call UnitRemoveAbility(u, 'Bplg')
call UnitRemoveAbility(u, 'Boar')
call UnitRemoveAbility(u, 'Babr')
call UnitRemoveAbility(u, 'Bakb')
call UnitAddAbility(u, <chaos ability id>) // где <chaos ability id> - равкод способности на основе "Темный"
Этот скрипт удалит все баффы ауры перед применением способности "Темный". Если у Вас в карте имеются нестандартные баффы, необходимо удалить и их.
» 20. Какие способности не сбивают текущего приказа воина?
  • Absk, Adef, Amdf, ANms, AEim, AHds (Безумие, Укрыться за щитом, Магическая защита, Магический щит, Жар преисподней, Божественный щит)
Эти способности не сбивают текущего приказа мага, когда используются. Последние пять могут быть активированы и деактивированы (если это разрешено в игровых константах). Упомянутые способности могут с легкостью использоваться как пустышки посредством сброса всех эффектов на «0» и отслеживанием отдачи или отмены приказов строкового типа. Возможно, Вам нужно удалить бафф, используя native-функцию UnitRemoveAbility после получения приказа, если более не нужно показывать этот бафф на боевой единице.
Отрицательная сторона использования вышеупомянутых способностей состоит в том, что при их удалении отмена приказа выполняется дважды. Но можно написать несложный алгоритм, чтобы не отслеживать эти отмены приказа.
// Отслеживание деактивации:
function WasUnOrder takes nothing returns boolean
  return OrderId2String(GetIssuedOrderId()) == "undefend" or OrderId2String(GetIssuedOrderId()) == "magicundefend" or OrderId2String(GetIssuedOrderId()) == "unmanashield" or OrderId2String(GetIssuedOrderId()) == "unimmolation" or OrderId2String(GetIssuedOrderId()) == "undivineshield"
endfunction
// Отслеживание активации/деактивации способности "Укрыться за щитом"
function Defense_Condition takes nothing returns boolean
  return GetTriggerEventId() != EVENT_PLAYER_UNIT_ISSUED_ORDER or ((OrderId2String(GetIssuedOrderId()) == "defend" or OrderId2String(GetIssuedOrderId()) == "undefend") and GetUnitAbilityLevel(GetOrderedUnit(), 'Adef') > 0 and GetUnitState(GetOrderedUnit(), UNIT_STATE_LIFE) > 0)
endfunction

function TriggerRegisterDefenseEvent takes trigger t returns triggercondition
  call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_ISSUED_ORDER)
  return TriggerAddCondition(t, Condition(function Defense_Condition))
endfunction
// Отслеживание активации/деактивации способности "Магическая защита"
function MagicDefense_Condition takes nothing returns boolean
  return GetTriggerEventId() != EVENT_PLAYER_UNIT_ISSUED_ORDER or ((OrderId2String(GetIssuedOrderId()) == "magicdefend" or OrderId2String(GetIssuedOrderId()) == "magicundefend") and GetUnitAbilityLevel(GetOrderedUnit(), 'Amdf') > 0 and GetUnitState(GetOrderedUnit(), UNIT_STATE_LIFE) > 0)
endfunction

function TriggerRegisterMagicDefenseEvent takes trigger t returns triggercondition
  call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_ISSUED_ORDER)
  return TriggerAddCondition(t, Condition(function MagicDefense_Condition))
endfunction
// Отслеживание активации/деактивации способности "Магический щит"
function ManaShield_Condition takes nothing returns boolean
  return GetTriggerEventId() != EVENT_PLAYER_UNIT_ISSUED_ORDER or ((OrderId2String(GetIssuedOrderId()) == "manashield" or OrderId2String(GetIssuedOrderId()) == "unmanashield") and GetUnitAbilityLevel(GetOrderedUnit(), 'ANms') > 0 and GetUnitState(GetOrderedUnit(), UNIT_STATE_LIFE) > 0)
endfunction

function TriggerRegisterManaShieldEvent takes trigger t returns triggercondition
  call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_ISSUED_ORDER)
  return TriggerAddCondition(t, Condition(function ManaShield_Condition))
endfunction
// Отслеживание активации/деактивации способности "Жар преисподней"
function Immolation_Condition takes nothing returns boolean
  return GetTriggerEventId() != EVENT_PLAYER_UNIT_ISSUED_ORDER or ((OrderId2String(GetIssuedOrderId()) == "immolation" or OrderId2String(GetIssuedOrderId()) == "unimmolation") and GetUnitAbilityLevel(GetOrderedUnit(), 'AEim') > 0 and GetUnitState(GetOrderedUnit(), UNIT_STATE_LIFE) > 0)
endfunction

function TriggerRegisterImmolationEvent takes trigger t returns triggercondition
  call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_ISSUED_ORDER)
  return TriggerAddCondition(t, Condition(function Immolation_Condition))
endfunction
// Отслеживание активации/деактивации способности "Божественный щит"
function DivineShield_Condition takes nothing returns boolean
  return GetTriggerEventId() != EVENT_PLAYER_UNIT_ISSUED_ORDER or ((OrderId2String(GetIssuedOrderId()) == "divineshield" or OrderId2String(GetIssuedOrderId()) == "undivineshield") and GetUnitAbilityLevel(GetOrderedUnit(), 'AHds') > 0 and GetUnitState(GetOrderedUnit(), UNIT_STATE_LIFE) > 0)
endfunction

function TriggerRegisterDivineShieldEvent takes trigger t returns triggercondition
  call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_ISSUED_ORDER)
  return TriggerAddCondition(t, Condition(function DivineShield_Condition))
endfunction
Вышеуказанные события не совместимы с остальными событиями для приказа без указания цели потому как используется условие триггера. В случае, когда Вам необходимо различить отдачу и отмену приказа, существует функция WasUnOrder. Первая из описанных способностей, “Безумие”, не требует использования этого алгоритма, потому что не может быть активирована/деактивирована.
» 21. Как создать кнопку?
  • Arpl, Arpm, Arpb, Afzy, Apsh, Amel, Arai, AUcb (Власть порчи, Восстановление маны, Восстановить, Ярость, Бегство в астрал, Погрузить труп, Оживить мертвых, Трупоеды)
У этих способностей есть автокаст (autocast), но, когда нажимается левая клавиша, не требуется указание цели. Полезны для создания кнопок, выполняющих различные действия: когда нажата левая клавиша и когда нажата правая клавиша. Просто отследите приказ для определения нажатия левой клавиши и приказы использования/неиспользования способности для определения нажатой правой клавиши мыши. Последние три способности требуют наличия мертвых тел для активации. Для их создания вы просто можете дать тому же воину скрытый спеллбук со способностями 'Amtc' (Пассажир) и 'Agyd' (Создать труп).
» 22. Как навсегда изменить размер боевой единицы?
  • Ablo (Кровожадность)
Увеличивает размер боевой единицы, подвергшейся воздействию способности. Обычно для этих целей используются невидимые боевые единицы (dummy). Чтобы навсегда сохранить измененный размер модели, просто установите нулевое значение поля «Длительность воздействия». Путем триггерного удаления баффа "Кровожадность" (‘Bblo’), можно вернуть нормальный размер воина.
» 23. Как в процессе игры изменить величину урона воина?
  • AOcr (Смертельный удар)
Если точная величина урона боевой единицы не определена заранее, но Вам нужно обнулить весь ее урон, просто измените значение поля «Данные – Шанс на критический удар» - «100» и поля «Данные – Увеличение урона» - «-1». Ввиду того, что урон всегда будет равен нулю, он не будет отображаться красными цифрами над головой жертвы и желаемый эффект будет достигнут.
» 24. Для чего нужен спеллбук (книга заклинаний)?
  • Aspb (Книга заклинаний (спеллбук))
“Книга заклинаний” является вместилищем 11 других способностей. Она может содержать активные способности наравне с автокаст- и пассивными способностями, и даже способности героев.
Главная особенность способности заключается в том, что она сохраняет эффект пассивных способностей, находящихся в спеллбуке даже в том случае, когда 'Aspb' отключена для игрока. Спеллбук может использоваться для скрытия иконок любой пассивной способности и, таким образом, экономить ячейки на карте команд.
Второй особенностью является то, что Вы можете добавить и удалить способности в спеллбук в любой момент игры. Это осуществляется путем добавления боевой единице второго спеллбука со способностью, которую необходимо добавить, и отключением этого второго спеллбука. После выполнения этого действия способность отобразится в первом спеллбуке, в то время как второй будут невидим. Чтобы это подействовало, оба спеллбука должны иметь один и тот же базовый ID приказа. Для каждой способности, которую нужно добавить в процессе игры, Вам необходим такой дополнительный спеллбук.
Еще одна отличительная особенность: геройские способности в спеллбуках доступны для улучшения! Проблема лишь в том, что их начальный уровень – 1, а не нулевой (если они изначально находились в спеллбуке). Но это легко решается триггерно. Просто-напросто вначале добавьте эти способности герою (в редакторе объектов). Затем отлавливайте изучение героем способности, удаляйте эту способность и добавляйте ее в спеллбук.
function Learn_Actions takes nothing returns nothing
  if GetLearnedSkillLevel() == 1 and GetLearnedSkill() == 'AHwe' then // к примеру, изучим "Дух воды"
    call UnitRemoveAbility(GetTriggerUnit(), GetLearnedSkill()) 
    call UnitAddAbility(GetLearningUnit(), 'Aspb') // 'Aspb' - равкод спеллбука с заклинанием "Дух воды"
    call UnitMakeAbilityPermanent(u, 'Aspb') // сделаем способности постоянными
    call UnitMakeAbilityPermanent(u, 'AHwe')
  endif
endfunction

function Learn takes nothing returns nothing
  local trigger t = CreateTrigger() // создание динамического триггера
  call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_HERO_SKILL) // событие - боевая единица приобретает способность
  call TriggerAddAction(t, function Learn_Actions) // создание действия для динамического триггера
endfunction

Раздел 2. Вопросы о классификациях войск

» 1. Как убрать у воина все его способности и обездвижить?
  • Страж (ward)
Если классификация боевой единицы – Страж, исчезнет его карта команд и способности. Помимо этого, никаких изменений с воином не произойдет. Однако у боевой единицы все еще останется возможность выполнять приказ правой кнопкой мыши. Если же Вы хотите заблокировать и перемещение боевой единицы, используйте следующий код:
function Catch_Order_Actions takes nothing returns nothing
  if GetIssuedOrderId() == OrderId("smart") then
    call PauseUnit(GetOrderedUnit(), true)
    call IssueImmediateOrder(GetOrderedUnit(), "stop")
    call PauseUnit(GetOrderedUnit(), false)
  endif
endfunction

function Catch_Order takes nothing returns nothing
  local trigger t = CreateTrigger()
  call TriggerRegisterUnitEvent(t, gg_unit_hpea_0006, EVENT_UNIT_ISSUED_TARGET_ORDER)
  call TriggerRegisterUnitEvent(t, gg_unit_hpea_0006, EVENT_UNIT_ISSUED_POINT_ORDER)
  call TriggerAddAction(t, function Catch_Order_Actions)
endfunction
» 2. Как сделать, чтоб воин не убегал, когда его атакуют?
  • Работник (peon)
У классификации Работник есть главный недочет. Она отображает иконку незанятого работника, когда боевая единица стоит на месте. Если же классификация Работник была добавлена в процессе игры, то иконка не будет появляться. К тому же Вы создаете боевую единицу, игнорирующую врагов.
call UnitAddType(u, UNIT_TYPE_PEON)
Если Вы к тому же установите значение поля “Может бежать” – Нет в настройках соответствующей боевой единицы, то она не будет убегать даже когда ее атакуют.
Для создания боевой единицы, игнорирующей всех врагов, кроме тех, которые ее атакуют, Вы можете использовать способность ‘Apiv’ (Постоянная невидимость) с длительность, равной «-1» и значением поля “Автонахождение целей атаки” – Нет. Тогда воин будет видим, но не искать цели для атаки.
""
» 3. Как создать уникальный тип войск?
  • Самоубийца (sapper)
Воины со способностью ‘Asds’ (Взорвать), например, подрывная бригада, автоматически классифицируются самоубийцами – погибающими, атакуя врага. Во многих случаях Вам, возможно, не понадобится эта особенность, но можно злоупотребить данной классификацией, обозначив ею определенный тип войск. Затем можно проверить классификацию воина в поле “Разрешенные цели” характеристик Вашей способности. Это часто заменяет много триггерной работы.

Раздел 3. Вопросы о функциях

» 1. Как сделать, чтоб при морфе не исчезали способности, добавленные триггерно?
  • UnitMakeAbilityPermanent (Сделать способность боевой единицы постоянной)
native UnitMakeAbilityPermanent takes unit whichUnit, boolean permanent, integer abilityId returns boolean
Эта функция позволяет сохранить способности у воина, который подвергся какого-либо роду трансформации (способности морфа). Если Вы не хотите потерять способности в спеллбуке (‘Aspb’), то следует их также делать постоянными.
Пример использования: UnitMakeAbilityPermanent(<unit>,true,'A000') , где <unit> - воин, способность которого нужно сделать постоянной
» 2. Как триггерно сдвинуть воина с места?
  • SetUnitX, SetUnitY (Установить Х боевой единицы, Установить Y боевой единицы)
native SetUnitX takes unit whichUnit, real newX returns nothing
native SetUnitY takes unit whichUnit, real newY returns nothing
Эти две функции очень пригодятся, когда Вам необходимо создать отталкивающую способность либо просто передвигать периодически боевую единицу (всякого рода Moving Systems – прим. alexkill). Они работают намного быстрее функции SetUnitPosition, поскольку игнорируют большинство проверок на соответствие областей, куда должна переместится боевая единица. Соответственно, можно сделать движение более плавным. Отрицательная сторона функций заключается в том, что Вам необходимо проверять, не находится ли область, куда нужно передвинуть воина, за пределами карты. В противном же случае возникнет неисправимая ошибка игры. Еще совет: никогда не используйте внутри оператора цикла loop функцию TriggerSleepAction для создания задержки, для этих целей идеально подойдут таймеры.
К тому же нельзя обнулять значение базовой скорости боевой единицы в редакторе объектов, иначе будет передвигаться лишь ее тень.
» 3. Как определить проходимость точки?
  • IsTerrainPathable (Проходима ли местность)
native IsTerrainPathable takes real x, real y, pathingtype t returns boolean
Полезная функция, позволяющая определить, является ли местность (координаты Х и Y) проходимой и можно ли переместить боевую единицу в эту точку. Хочу заметить, что эта функция инверсная и возвратит false, если местность проходимая.
Поэтому скрипт
if not IsTerrainPathable(X,Y,PATHING_TYPE_WALKABILITY) then
...
endif
будет верным для определения проходимости точки.
Параметр t функции может принимать несколько значений:
PATHING_TYPE_AMPHIBIOUSPATHING - точка, в пределах которой передвигаются амфибии.
PATHING_TYPE_BLIGHTPATHING - точка, охваченная порчей.
PATHING_TYPE_BUILDABILITY - точка, где возможно возвести здание.
PATHING_TYPE_FLOATABILITY - точка, пригодная для плавания.
PATHING_TYPE_FLYABILITY - точка, через которую пролетает воздушная боевая единица.
PATHING_TYPE_PEONHARVESTPATHING - точка, в пределах которой могут передвигаться работники (добывая золото и дерево).
PATHING_TYPE_WALKABILITY - точка, в пределах которой могут передвигаться обыкновенные боевые единицы.
PATHING_TYPE_ANY - точка с любым типом проходимости.
» 4. Как спустя некоторое время совершить действия над воинами в группе?
  • ExecuteFunc (Выполнить функцию)
native ExecuteFunc takes string funcName returns nothing
Как известно, в callback-функции нельзя организовать задержку. Существует много способов для совершения этих действий. Например, создать таймер с последующим хэшированием, аттачить группу через кэш и т.п. Но все же лучшим вариантом, думаю, будет использование функции ExecuteFunc с обращением к выбранным заранее боевым единицам через функцию GetEnumUnit.
function D takes nothing returns nothing
   local unit g = GetEnumUnit() 
   call TriggerSleepAction(5.) // та самая задержка, после которой выполнится действие
   call KillUnit(g) // а это само действие
   set g = null 
endfunction

function C takes nothing returns nothing
   call ExecuteFunc("D")
endfunction

function B takes nothing returns nothing
   local group gr = CreateGroup()
   call GroupEnumUnitsOfType(gr,"footman",null) // к примеру, выберем всех пехотинцев на карте
   call ForGroup(gr, function C)
   call DestroyGroup(gr)
   set gr = null
endfunction
Если бы задержка (функция TriggerSleepAction) присутствовала в функции С, то никакого результата Вы бы не увидели. В этом же случае все сработает, как нужно.
Проблема ExecuteFunc заключается в том, что ее использование может вызвать крах игры, если в качестве аргумента указать имя несуществующей функции. То есть нужно внимательно следить за этим параметром.

Раздел 4.Скрытые идентификаторы приказов

  • 851971 (smart): Приказ (цель-точка или цель-объект), аналог правой клавиши мыши.
  • 852000 (skillmenu): Приказ (без указания цели), при выполнении которого открывается меню навыков героев. Если же триггерно заставить выполнить этот приказ обычную боевую единицу, то исчезнет ее карта команд, которая возвратится, если выбрать боевую единицу.
  • 851994 (buildmenu): Приказ (без указания цели), открывающий меню строительства воина, способного возводить здания.
  • 852002 to 852007 (moveslot): Эти приказы перемещают указанный предмет в соответствующий слот инвентаря героя, отдавшего приказ. Идентификатор 852002 переместит предмет в первый слот, идентификатор 852003 – во второй и т.д.
  • 852008 to 852013 (useslot): Заставляют героя, отдавшего приказ, использовать предмет, находящийся в соответствующем слоте инвентаря. Идентификатор 852008 использует предмет в первом слоте, идентификатор 852009 – во втором и т.д.
  • 851973 (stunned): Этот приказ отдается боевым единицам, подвергшимся оглушающим способностям, таким как ‘AOws’ (Громовая поступь), лишая их возможности двигаться и атаковать.

Отредактировано ScorpioT1000, 17.04.2013 в 13:53.
Старый 05.01.2009, 13:18
agentex

offline
Опыт: 34,534
Активность:

Раздел 5. Популярные вопросы

Оглавление подготовили: Артте, alexkill и MF
Эта тема является дополнением к FAQ, в котором, к сожалению, описать абсолютно все вопросы невозможно. Тут же содержатся ссылки на темы с обсуждением весьма актуальных, хотя и редко возникающих вопросов, не дающих покоя многим создателем карт.
  1. Если вы ищете ответ на конкретный вопрос, для начала воспользуйтесь поиском, просмотрите FAQ, заголовки тем данного оглавления, и только затем, не отыскав подходящего решения, создавайте тему с вопросом.
  1. Все темы разделены на условные разделы, будь то "Объекты", "Триггеры", "Ландшафт", тем не менее, при поиске ответа на свой вопрос, рекомендуется просматривать и схожие разделы (к примеру, Вы что-то хотите сделать триггерно, а это может элементарно решаться с помощью редактора объектов).
  1. Некоторые глобальные вопросы еще не решены или не имеют однозначно правильного решения, в таком случае перед ссылкой на тему будет поставлен символ *
  1. Вы всегда можете помочь нам в организации этого раздела, предложив добавить сюда тему, которую Вы считаете актуальной и интересной "картостроителям". Однако стоит помнить, что в ней должен быть четко сформулированный вопрос, а также решение или внятное объяснение, почему решить этот вопрос невозможно.

Триггеры и JASS

Создание квестов
Динамические триггеры
Устройство триггера в jass
Юнит получает урон. Вопрос к Джассерам
Generic Unit Event совместим с EVENT_UNIT_DAMAGED?
Плюсы и минусы кэша
Кэш или альтернатива кэшу?
Ассоциативные массивы или прогоним SCV
Оптимизация
Как изучить vJass?
Оптимизация JASS кода
Обнаружение утечек
Создание новых потоков
Уничтожение потока
Точка и типы путей
Проверка местности: проходимая или непроходимая
Создание ИИ в блокноте
Устройство AI-файлов
Отключить встроенный AI
Как проиграть анимации типа Stand 2, Spell-4
Проигрывание анимации задом наперед
Замедление юнита
Помогите с модом -ar (All Random)
Как отследить движение юнита?
Стоит ли юнит за спиной юнита?
Скольжение героя
Отображение оружия в руках боевой единицы
Динамическая смена модели
Динамическое изменение запаса маны
Как найти всех юнитов между 2-мя точками?
Движение снарядов
Мгновенный поворот боевой единицы
Блокировка/разблокирование инвентаря у боевой единицы
Определение положения юнита относительно другого
Как показать мультиборд конкретному игроку?
Границы карты
Переход с карты на карту
Десинхронизация и причины ее возникновения
Поразрядные логические операции в JASS
Как вызвать фатальную ошибку?
Советы по исправлению фатальных ошибок
Нестандартный курсор
Перевод из одной системы счисления в другую
От чего зависит скорость загрузки карты?
Как сделать к своей карте специальную подпись, как у Blizzard?
Как отключить читы? Как определить неуязвимость юнита? Как изменить период срабатывания триггера?
Ветвь реестра WarCraft
Подсчет триггеров
Герои в Таверне!
Как создать регион, область, рект определенной формы?
Баг с книгами или модельки на земле после использования итемов
Атака Ближнего и Дальнего Боя
Как включить получение золота за убийство НЕ нейтралов?
Разбивка строки
Прикрепление анимированного аттача
Запрет на перемещение камеры в определенную область
Текст над Юнитом (Видит только 1н Игрок)
Как осуществить отбивание единицы от декорации под углом
Посадка на животных
Как убрать тень у предметов?
Событие - юнит выбрасывает предмет
Создание водоема
Триггерное скрытие декорации
Прозрачные и многоэтажные здания: каков принцип работы?
Как дать возможность обьекту класа "Мост\Подъемник" принимать все ракурсы(вариации)?
Изменение цвета воды
Высота уклона
Динамическая смена текстуры
Как поменять текстуру земли?
Как скрыть полоску здоровья?
Ловим Мышь
Изменение панели войнов
Версии карт
Музыкальный список (MapMusic)
Как проигрывать импортированный звук, если его нет в списке?
Как убрать звук, проигрывающийся при появлении или исчезновении расходов?
Как полностью убрать освещение на карте?
Как создать героя с заранее заданным именем?
Как сделать квест только для одного игрока?
Какой функцией описать ломаную линию?
Как добавить иконки в описания юнитов?
Как повернуть юнита по 2-м осям?
Как узнать дату/время?
Преобразование предмета в строку

Функции

Типы переменных

Способности

Способности Warcraft III: проводник
Как триггерно приказать юниту использовать нестандартную способность?
Как включить авктокаст?
Для чего нужна способность "Канал"?
За что отвечает поле "Проверять зависимости" в редакторе объектов?
Эффекты и пассивки на иллюзиях
Превращение из одного юнита в другого
Все свойства - баг или фича?
Как спрятать иконки "стоп" "идти" и "патруль"?
Отображение снаряда у "Канала" и его DISBTN
Как сделать замедление времени?
Как устроить лесоповал?
Скачок во времени
Chaneling способности в предметах
Спелбуки внутри спелбука
Прыжок
Как одним кастом выбрать более чем одну цель?
Как сделать включаемую\выключаемую ауру?
Как убрать у юнита атаку?
Как сделать, чтоб через юнита со способностью "москиты"('Aloc') нельзя было проходить?
Есть ли предел увеличению скорости атаки?
Как убрать коллизию у юнита?
Как создать способность по принципу "Ожившего Огня"?

Вопросы общего характера


Отредактировано ScorpioT1000, 17.04.2013 в 13:55.
Старый 05.01.2009, 13:22
alexkill

offline
Опыт: 19,072
Активность:
Цитата:
и зачем это?? что в этом особенного не пойму?

эдакое пособие для чайников? =) к тому же многие интересуются, как создать динамический триггер
Цитата:
хм интересненько, 1 раз слышу. в варе че есть порталы? оО

я сам прозрел, когда проверил
Цитата:
Например, Блокировка атаки при добавлении 'Abun'

для того статья и создана, чтобы пополнять ее фичами, отысканными пользователями.
Старый 05.01.2009, 13:27
NETRAT

offline
Опыт: 83,762
Активность:
Цитата:
хм интересненько, 1 раз слышу. в варе че есть порталы
сразу видно отсутствие опыта игры в melee

коротенько о абилках
статью следует некоторым образом пришить к FAQ

NETRAT добавил:
Цитата:
Если же классификация Работник была добавлена в процессе игры, будет действовать. то иконка не будет появляться
а если создать юнита для левого игрока / скрытым, дать ему классификацию и потом передать правильному игроку - иконка появится?
Старый 05.01.2009, 13:52
Scorched

offline
Опыт: 7,912
Активность:
читал давно в оригинале автору и переводчику +1

Scorched добавил:
Цитата:
хм интересненько, 1 раз слышу. в варе че есть порталы? оО

всю дорогу были
Старый 05.01.2009, 13:54
alexkill

offline
Опыт: 19,072
Активность:
Цитата:
Сообщение от NETRAT
статью следует некоторым образом пришить к FAQ


NT, сделаешь? =)

alexkill добавил:
Цитата:
всю дорогу были


Scorched, то, что порталы были - думаю. многие знали. Но то, что можно из обычного юнита сделать портал - для меня, например, явилось новинкой.
Старый 05.01.2009, 13:57
NETRAT

offline
Опыт: 83,762
Активность:
Было бы неплохо выделить вопросы из академии, ответы на которые которые можно отнести к этой статье и составить какой-то мини-FAQ, который потом вставить в основной, я этого не сделаю.
Старый 05.01.2009, 14:03
PlayerDark
Coraline
offline
Опыт: 10,569
Активность:
Вобщем то любопытно, хотя большинство из этого я уже знал.
Старый 05.01.2009, 14:29
alexkill

offline
Опыт: 19,072
Активность:
исправил мелкие ошибки и добавил раздел о функциях.

Цитата:
Сообщение от NETRAT
Было бы неплохо выделить вопросы из академии, ответы на которые которые можно отнести к этой статье и составить какой-то мини-FAQ

ну что-то наподобие сделал
Старый 05.01.2009, 18:03
J
expert
offline
Опыт: 48,747
Активность:
Цитата:
. Как триггерно сдвинуть воина с места?
добавь что скорость юнита должна быть обязательно больше нуля и именно та которая ставится в РО ва не устанавилвается триггерно
Старый 05.01.2009, 18:03
zer0ne

offline
Опыт: 11,119
Активность:
Полезная статья. alexkill, переведи как будет время Hidden Order Ids, там немного, но очень полезно
Старый 05.01.2009, 18:58
alexkill

offline
Опыт: 19,072
Активность:
добавил главу о скрытых приказах

alexkill добавил:
Цитата:
Сообщение от NETRAT
а если создать юнита для левого игрока / скрытым, дать ему классификацию и потом передать правильному игроку - иконка появится?

проверил - появится

alexkill добавил:
Цитата:
Сообщение от J
добавь что скорость юнита должна быть обязательно больше нуля и именно та которая ставится в РО не устанавилвается триггерно

кстати, если установить в РО базовую скорость "0", то можно создать что-то наподобие астрального тела, способного передвигаться и т.д. в то время, как физ. тело останется неподвижным.

Отредактировано alexkill, 05.01.2009 в 20:53.
Старый 05.01.2009, 19:45
J
expert
offline
Опыт: 48,747
Активность:
ну я то вкурсе, но ты во вопросник это добавь
Старый 05.01.2009, 19:55
Lевик
Cat Crusade!
offline
Опыт: 1,800
Активность:
Класс, узнал несколько новых приемов) Допереведи остаток и в базу статей!
Старый 05.01.2009, 20:03
Hellfim
Новичок
offline
Опыт: 79,890
Активность:
Интересная статья, правда узнал только про классификацию работник =)
Старый 05.01.2009, 20:32
alexkill

offline
Опыт: 19,072
Активность:
Добавил пункт в раздел "Вопросы о способностях".

Отредактировано alexkill, 05.01.2009 в 21:53.
Старый 05.01.2009, 20:49
Hellfim
Новичок
offline
Опыт: 79,890
Активность:
alexkill, норм, примечай. Про ордеры баян =)
Старый 05.01.2009, 21:26
alexkill

offline
Опыт: 19,072
Активность:
Цитата:
Сообщение от Hellfim
Про ордеры баян =)

Ты просто не умеешь их готовить... )
Старый 05.01.2009, 21:30
ExArt

offline
Опыт: 13,734
Активность:
Отличная статья. Понравилась фишка с москитами для сокрытия хп бара.
Старый 05.01.2009, 21:59
J
expert
offline
Опыт: 48,747
Активность:
Цитата:
Это решение имеет и побочные эффекты. Полоса жизни над боевой единицей, как и имя игрока при наведении мышью на боевую единицу, больше не будут видны никогда. Это своеобразная уловка, если Вам необходимо сокрыть эти данные.
у меня неработает=/
Старый 06.01.2009, 00:41
Закрытая тема

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 14:29.