Наверное всем будет интересно почитать. Теперь можно будет всех новичков сюда посылать
Авторы: PitzerMike, alexkill Перевод: alexkill
Раздел 1. Вопросы о способностях 1. Как сделать нелетающего воина летающим?
Amrf (Превратиться в ворона) Добавление этой способности позволяет изменять высоту полета наземной боевой единицы (со всеми вытекающими из этого неприятными последствиями, связанными с пафингом). [tt]call UnitAddAbility(un, 'Amrf') call UnitRemoveAbility(un, 'Amrf')[/tt] После добавления и удаления способности вы можете корректировать высоту полета боевой единицы 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
Это решение имеет и побочные эффекты: Полоса жизни над боевой единицей, как и имя игрока при наведении мышью на боевую единицу, больше не будут видны никогда. Это своеобразная уловка, если Вам необходимо сокрыть эти данные. Пропадет возможность указать боевую единицу в качестве цели заклинания (проблема решается триггерно). Выбирать боевую единицу станет возможно только рамкой.
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 для добавления способности второго уровня вашей боевой единице (спеллбук создавать не нужно!). Затем немедленно удалите способность, используя функцию UnitRemoveAbility. Таким образом, вы измените максимальное значение жизни/маны без сохранения каких-либо способностей. я не проверял это с другими предметными способностями, но у кого много свободного времени – может поэкспериментировать. Также я хотел бы обратить внимание на поле “Без промаха” предметной способности “Смертельный удар” (оно же есть и у обычной способности героя). Установив значение “Да”, воин-стрелок (маг и т.п.) сможет без промаха поражать врагов, даже если те будут находится на возвышенностях.
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
7. Как создать свой магазин с возможность добавления/удаления предмета или воина?
Apit, Aneu, Aall, Asid (Лавка: купить предмет, Выбрать героя, Общие магазины, Продажа предметов) Вместе эти способности составляют магазин, который продает предметы исключительно для своего владельца. Замечу, что функция AddItemToStock также сработает. Функция RemoveItemFromStock срабатывает только для предметов, добавленных с использованием триггеров, поэтому Вам необходимо удалить все продаваемые и сделанные предметы в соответствующих полях магазина, а вместо этого добавить их триггерно при инициализации карты. Замените способность ‘Asid’ способностью ‘Asud’ (Продажа войск), если хотите получить магазин, продающих войска и работающий с функциями AddUnitToStock и RemoveUnitFromStock, позволяющими добавлять и удалять воинов из магазина. Удалите способность ‘Aall’, чтобы сделать магазин нейтральным. Побочным эффектом способности ‘Aneu’ (Выбрать героя) является доступ к другим заклинаниям боевой единицы. Даже вражеский воин может использовать способности обладателя ‘Aneu’.
8. Как сделать, чтобы боевая единица могла атаковать и при этом оставалась невидимой?
Apiv, Agho, Aeth (Постоянная невидимость, Дух, Дух(видимый)) Эти способности делают боевую единицу невидимой для врагов без триггерной установки невидимости. Зачастую это лучший вариант нежели остановка боевой единицы (PauseUnit) и добавление способности “Москиты”. Воины с постоянной невидимостью теряют ее при атаке. Поэтому способность полезна при создании боевых единиц типа Духа Волка третьего уровня. Воины, у которых одновременно присутствуют способности “Постоянная невидимость” и “Дух”, остаются невидимыми даже когда атакуют. Кстати, способность ‘Aeye’ (Невидимый страж) автоматически добавляет вызванной боевой единице постоянную невидимость. вспомните, как извращались когда-либо Вы, пытаясь сделать юнита невидимым 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
Весьма нужная функция при создании движения на стрелках для определения преград
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 (Темный) Добавление воину способности “Темный” превращает его в боевую единицу типа, определенного в соответствующем поле способности. Это может использоваться для изменения какого-либо параметра, например, имени модели боевой единицы в процессе игры либо просто для выполнения трансформирующих способностей в сочетании с “Каналом”. Не забудьте очистить поле “Технологии – Требования” в настройках способности “Темный”. Единственная проблема этой способности состоит в том, что она добавляет текущее значение бонусов защиты, урона, здоровья и маны, полученных от предметов, ауры и показатели силы, ловкости и разума превращаемой боевой единицы результирующей боевой единице. Это означает, что идею трансформировать героев, нельзя назвать хорошей. Обычная же боевая единица не подвергается влиянию предметов и показателей силы, ловкости и разума, поэтому камнем преткновения являются баффы, полученные от аур. Эти баффы могут быть легко удалены перед превращением, а затем автоматически добавлены, поэтому это не проблема.
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 (Сделать способность боевой единицы постоянной)
Эта функция позволяет сохранить способности у воина, который подвергся какого-либо роду трансформации (способности морфа). Если Вы не хотите потерять способности в спеллбуке (‘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 для создания задержки, для этих целей идеально подойдут таймеры. К тому же нельзя обнулять значение базовой скорости боевой единицы в редакторе объектов, иначе будет передвигаться лишь ее тень.