PitzerMike,

WarCraft 3: Способности Warcraft III: проводник

» Раздел: Триггеры и объекты

Раздел 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’ (Громовая поступь), лишая их возможности двигаться и атаковать.

Просмотров: 34 602

» Лучшие комментарии


DimoN #1 - 8 лет назад 5
Много хороших букв!
Mihahail #2 - 8 лет назад 0
Многосправки))
Автор, за труд респект большой, нада будет включить в свой мануал)
VaL #3 - 8 лет назад 1
СПС !!! +100
SlipNLknot #4 - 8 лет назад 2
СПС!!!!)
Патиссончик #5 - 8 лет назад 1
Спс!!! =99.9%! Объясните тупому! я не могу понять у меня прикрепляется оружие только к правой руке если прописываю hand left или hand right, а если left hand, то объект слева аод ногами, а если right hand, то его (оружия) вообще нет! Хелп миии! А так большой СПАСАБА!
vitalundead #6 - 8 лет назад 2
Овощь, может стоит разделять запятыми, что пишешь.
Z.b.
hand, left
foot, right
Патиссончик #7 - 8 лет назад 1
Аааа спс
это в редакторе надо писать? О_о
Все равно не работает О_о
Ну допустим мне надо щит в левую руку, что мне писать?
TmaRT #8 - 8 лет назад 2
Ты проверь, на другой модели! у нектрыз не прикрепляется
bee #9 - 8 лет назад 2
хорошая статья
BioAleks #10 - 8 лет назад -7
Статья для нубоф, реально.
BumBa93 #11 - 8 лет назад 4
биоалекс как ты первый раз открыл WE ты тоже нубом был. все с чего-то должны начинать
Mr_ILYAS #12 - 7 лет назад 2
Да не зачет статья, BioAlex, ты прям такой про типа да, а сам на PlayGrounde глупые вопросы задаешь.
DIMENSIO #13 - 7 лет назад 2
а как определить, к какой модели приклепляется а к какой нет?
Lord Vampire #14 - 7 лет назад 2
1.Как сделать нелетающего воина летающим?
Способность "Сфинкс" справиться с этим на много лучше "превратиться в ворона".
  1. Как навсегда изменить размер боевой единицы?
А "Анимация - Unit size" некатит? Смысл парится с кровожадностью?о_О
alexkill #15 - 7 лет назад 3
Lord Vampire, насчет первого - они абсолютно одинаковые =) так что не спорь
теперь что касается второго - ты не прав, круг выбора юнита не будет увеличиваться в твоем случае (где-то я уже это доказывал)
MasterDum #16 - 7 лет назад 2
оч полезная информация.респект автору...
Bars_96 #17 - 7 лет назад 2
Куль статья! Спс!
Gelion #18 - 7 лет назад 0
о да,я в восторге столько нового узнал!:)
Jusper #19 - 5 лет назад 0
Супер, спасибо автору)
Reach #20 - 4 года назад 1
люди, подскажите плис, как сделать переходные локации, как в компании за орду ?
flyraidersky #21 - 4 года назад -1
хорошая статья вот узнать бы как убрать задержку после применения заклинания . . .
Buulichkaa #22 - 4 года назад 0
flyraidersky, это после какого заклинания у тебя "задержка"?
хочешь "ультрабыстрого" точечного каста - отслеживай отдачу приказа
flyraidersky #23 - 4 года назад -2
например когда герой использует заклинание волна силы и после применения он тупо стоит если ему не отдать приказ а если он тупо стоит и вокруг него крипы это плохо .Он их не бьёт не которое время .Вот как это исправить ?
Buulichkaa #24 - 4 года назад 0
как вариант отдавать приказ удерживать позицию, а вообще это бред, первый раз слышу про такое
nvc123 #25 - 4 года назад 0
flyraidersky, делать все скилы триггерными на основе канала, там такой фигни нету
lehanru #26 - 3 года назад 0
Благодарю ! Очень помог
EfReeZe #28 - 3 года назад 0
lehanru, не стоит комментировать останки динозавра. Пиши автору в лс.
Кет #29 - 3 года назад 4
Обнаружил, что работники могут отвечать на атаки других работников. Атаки же прочих юнитов они игнорируют. Может, кому понадобится =)
2 комментария удалено
GF RaiseD #32 - 10 месяцев назад (отредактировано ) 0
Если скорость передвижения юнита равна 0, не выйдет изменять его высоту вышеупомянутым способом. Добавьте в пункт 1.