Если бы с самого фундамента сделал одну абилку с 9999 лвлами на защиту, то можно было бы просто отлавливать её уровень. Естественно придётся уменьшать/увеличивать лвл абилки при получении итемов, баффов и другой ерунды
Берёшь флейту, смотришь какая в ней абилка, ищешь эту абилку.
Ставишь этой абилке 2 уровня, или 6, как в примере выше (если надо 6 стаков).
И на каждом уровне выставляешь свой бонус.
Делаешь триггер на подбор предмета, проверки добавляешь, считаешь сколько в инвентаре флейт, и если их больше 1 - выставляешь уровень абилки-ауры у юнита на число равно количеству флейт.
При потере предмета делаешь то же самое, но с задержкой (можно 1 сек).
Самому юниту ничего давать не нужно, можно переключать уровни абилок в предметах напрямую по ссылке на юнита.
У них есть анимация когда они встают на выпрямленные ноги.
Тут либо замедлить анимацию, либо заморозить, но надо выловить момент. Но у них нет анимаций на прямых ногах.
Есть такая штука как тэг анимации (Animation Tag).
Её можно добавлять юнитам для того что бы они использовали другие сеты анимаций.
Есть функция "дабавить/отнять тэг анимации юниту", там указывается кому, какую (строкой), и дать или отнять.
Таким образом можно триггерно переключать модельки друидов, горного короля, берсерков, охотника на демонов, и т.д. (alternate)
Так же можно заставить рабочих отображать на себе мешок золота или вязанку дров, т.к. она тоже является альтернативной анимацией (gold, lumber).
Так же есть возможность добавить анимацию плавания (если она есть у модели).
Ещё можно заставить юнита пребывать в анимации ready (стойка во время атаки).
Обращение к группе игроков происходит через заранее созданную группу потому что число игроков не меняется в течение игры. Это значит что всех их можно сразу загрузить в одну группу игроков (force). А вот отряд юнитов (group) не может работать так же, потому что юниты постоянно создаются и уничтожаются в ходе игры. Для этого добрый дядя предоставил GUI-функцию, которая позволяет отлавливать (группировать) юнитов в указанном месте (в области, в радиусе от точки, у игрока, по типу и т.д.). Он оказался не глуп и, зная что группы будут создаваться снова и снова, добавил механизм который будет эти группы удалять автоматически. Но это оказалось нужным не всегда, и был прикручен механизм, который по умолчанию не удаляет группы и его можно при необходимости заставить это делать (удалять).
Ну по идеи оно должно добавлять исполнение экшена после текущего (экшера или функции). Но я никогда этим не пользовался, и буквально на днях опять обратил на это внимание. Хотя возможно это очередная функция которая попросту не работает, или работает не так. Надо протестировать...
Проблема не в вейте, а в том что у тебя небыло проверки на бафф в должном месте (наличие бонуса сета), и поэтому его выдавало несколько раз.
А вообще - в момент срабатывания события "юнит теряет предмет" фактически предмет всё ещё находится в инвентаре юнита, поэтому и добавляется вэйт в таких триггерах.
Я тоже, но получше чем термодинамику.
Или тебе поэтапно рассказать как нужно давать юниту абилку, записывать его в переменную, записывать время в переменную, запускать таймер и ловить момент когда время закончится?
Когти + индексация Всё, что тут сложного? Хочешь что бы бафф отображался - даёшь ещё ауру на самого себя Готово. И эту абилку ничем не задиспелить (если не сделать триггер отдельный).
Поясню. Способки даются герою рандомно и мне нужно их систематизировать, то есть игрок будет получать способности в рандомном порядке и мне нужно понять какая из них получена только что чтобы управлять ими в дальнейшем
Звучит так, как-будто у тебя там имеется массив из абилок и ты выбираешь одну конкретную по номеру. Например
set passAbility[1] = Доспехи Веры set passAbility[2] = Аура Смерти set passAbility[3] = Змеиная Ловкость
а дальше ты получаешь число N, например - 2, и с ним работаешь
Действие - Выдать юниту абилку passAbility[N]
Т.е. ты тут можешь сразу работать с числом N что б получить саму абилку
Либо отдельно сделать запись "последняя выданная абилка" (отдельная переменная)
Действие - Выдать юниту абилку passAbility[N] set lastAddAbility = passAbility[N]
Я бы тогда вообще сделал отдельную функцию выдачи абилки, если она часто используется в таком виде и/или где-то ещё.
function UnitAddAbilityToLast takes unit u, integer i returns
call UnitAddAbility(u,i) // native func.
set bj_LastAddAbility = i // global val.
endfunction
Действие - call UnitAddAbilityToLast( твой_юнит, passAbility[N] )
Короче я нашел ужасное упущение варика. Странно, что все на свете можно записать в переменную, но только не только что приобретенную способность.
Есть такой объект как Абилка, но действий с ним либо нет, либо их всего несколько, т.к. все действия с абилками происходят через обращение к её равкоду. Работает это примерно как с предметами в инвентаре героя:
Ты ссылаешься на удаление предмета определённого типа (число) у юнита, при это запускается цикл который проверяет все слоты инвентаря у указанного юнита, и каждый предмет (объект) в каждом слоте проверяет по его ID (как число), и как только он совпадает с искомым - тебе возвращается ссылка на этот предмет (как объект). После чего происходит удаление конкретного предмета, если ты его пытался получить по ID (число). А вот если ты будешь ссылаться на "предмет которым манипулировали", тогда ты получишь конкретно сам предмет (объект).
Вот с абилками, примерно, так же и получается.
Ты посылаешь в функцию ID абилки, и дальше игра сама ищет эту абилку у юнита (какой там механизм - хз, но результат схожий). Функция "использованная абилка" для события каста, так же возвращает тебе всего лишь ID абилки (число), а не её саму как объект.
Мб это и правильнее, т.к. для удаления конкретной абилки (объекта) у юнита тогда бы пришлось иметь в записи саму абилку (объект). А это довольно сильно усложнило бы на первых этапах понимание сути вещей в среде редактора (повышение уровня вхождения).
Вот обычно когда идёт триггерная проверка на то какой скилл был использован - проверяется его ID (число), т.е. используется первая фунция и возвращается номер, с которым ты сравниваешь свой номер (эти номера имеют вид 'A002').
Нативки
native GetUnitAbilityLevel takes unit whichUnit, integer abilcode returns integer
native DecUnitAbilityLevel takes unit whichUnit, integer abilcode returns integer
native IncUnitAbilityLevel takes unit whichUnit, integer abilcode returns integer
native SetUnitAbilityLevel takes unit whichUnit, integer abilcode, integer level returns integer
native UnitAddAbility takes unit whichUnit, integer abilityId returns boolean
native UnitRemoveAbility takes unit whichUnit, integer abilityId returns boolean
native UnitMakeAbilityPermanent takes unit whichUnit, boolean permanent, integer abilityId returns boolean
native SetPlayerAbilityAvailable takes player whichPlayer, integer abilid, boolean avail returns nothing
Каждая из этих функций использует, как сам видишь, именно ID абилок (число).
Хотя для записи/выгрузки абилки из хэш таблицы используется ссылка как раз на саму абилку (объект)
По дефолту это улучшение.
Герой игрока качает абилку - триггерно это отлавливается и повышается уровень улучшения для этого игрока. А само улучшение это аналог длинноствольных мушкетов. Оно должно быть у твоего героя в разделе улучшений, что бы оно на него работало.
Событие - Боевая единица повышает уровень способности
Условие - сравнение способностей героев - изученная способность = твоя_абилка
Действия - Игрок - Установить уровень улучшения (мушкеты) для игрока (владелец юнита-инициатора) на уровень (уровень изученной способности).
В момент прокачки этой абилки на 1й уровень выдай герою абилку-пустышку с аттачем (прикреплённым спецэффектом). Да, триггерно.
Триггеры начинаются с малого. Сегодня ты просто даёшь ещё одну абилку при прокачке другой. А завтра уже пытаешься уйти от какой-то базовой механики игры...
SсRealm, ты меня не понял. Я прошу тебя сформулировать конкретную ситуацию, когда тебе нужна такая 20-ти секундная отсрочка. Тот вэйт что я тебе дал, точно так же косячит как и обычный, просто в другом месте. У него погрешность от 0.075 до 0.125 (чаще всего всё же выдаёт 0.100), которую надо либо вычитать из стартового времени, либо допускать как побочную (т.е. внутри можно сделать set s = s - .1 , но это всё равно не поможет если время меньше 0.1 сек).
Лучше всего - юзать таймеры. Как их юзать - тут надо уже понимать чуть больше, чем просто то как из запускать и реагировать на них.
Он же тебе пишет, что функция с этим названием не объявлена.
Т.е. ты не занёс её в шапку или в другое место, где она должна объявляться раньше чем упоминается.
а вэйт в 0.00 сек заметно дольше кажется 1 сек ушла у него.
Данная информация совершенно не соответсвует действительности.
У меня бывают момент когда мне надо заставить триггер прождать МГНОВЕНИЕ, что бы не сбить что-то, и вот вэйт в 0.00 не помогает, т.к. срабатывает мгновенно, т.е. слишком быстро.
но если вейты так глючны, то почему бы просто не сделать отчет на локалках или глобалках?
Ответ на твой вопрос - таймер.
Хочешь записывай его в локалку, а потом ищи что и с кем делать (на это надо записать).
Хочешь записывай его в глобалку, а потом ... точно так же ищи что и с кем делать.
» WarCraft 3 / Извлечь защиту юнита с бонусами
» WarCraft 3 / Стаки аур
Ставишь этой абилке 2 уровня, или 6, как в примере выше (если надо 6 стаков).
И на каждом уровне выставляешь свой бонус.
» WarCraft 3 / поза лучниц
Тут либо замедлить анимацию, либо заморозить, но надо выловить момент.
Но у них нет анимаций на прямых ногах.
Ред. Extremator
» WarCraft 3 / Разрушитель чар
Её можно добавлять юнитам для того что бы они использовали другие сеты анимаций.
Есть функция "дабавить/отнять тэг анимации юниту", там указывается кому, какую (строкой), и дать или отнять.
» WarCraft 3 / Модификатор видимости
» WarCraft 3 / Количество триггеров в очереди
Но я никогда этим не пользовался, и буквально на днях опять обратил на это внимание.
Хотя возможно это очередная функция которая попросту не работает, или работает не так.
Надо протестировать...
» WarCraft 3 / Переменная не хочет нормально устанавливаться 1 раз
» WarCraft 3 / Как сделать систему поломки предметов?
» WarCraft 3 / Как сделать систему поломки предметов?
Или тебе поэтапно рассказать как нужно давать юниту абилку, записывать его в переменную, записывать время в переменную, запускать таймер и ловить момент когда время закончится?
Ред. Extremator
» WarCraft 3 / Как сделать систему поломки предметов?
Всё, что тут сложного?
Хочешь что бы бафф отображался - даёшь ещё ауру на самого себя
Готово. И эту абилку ничем не задиспелить (если не сделать триггер отдельный).
» WarCraft 3 / Загруз по по поводу переменной
Либо отдельно сделать запись "последняя выданная абилка" (отдельная переменная) Я бы тогда вообще сделал отдельную функцию выдачи абилки, если она часто используется в таком виде и/или где-то ещё.
Ты ссылаешься на удаление предмета определённого типа (число) у юнита, при это запускается цикл который проверяет все слоты инвентаря у указанного юнита, и каждый предмет (объект) в каждом слоте проверяет по его ID (как число), и как только он совпадает с искомым - тебе возвращается ссылка на этот предмет (как объект). После чего происходит удаление конкретного предмета, если ты его пытался получить по ID (число). А вот если ты будешь ссылаться на "предмет которым манипулировали", тогда ты получишь конкретно сам предмет (объект).
Ты посылаешь в функцию ID абилки, и дальше игра сама ищет эту абилку у юнита (какой там механизм - хз, но результат схожий). Функция "использованная абилка" для события каста, так же возвращает тебе всего лишь ID абилки (число), а не её саму как объект.
Хотя для записи/выгрузки абилки из хэш таблицы используется ссылка как раз на саму абилку (объект)
» WarCraft 3 / Загруз по по поводу переменной
» WarCraft 3 / Иконки на заказ
Чем-то смахивает на твою модельку ))
Так что всё есть в одном комплекте, надо просто проверять ))
» WarCraft 3 / Как забыть улучшение
Временно создаёшь его игроку, для разблокировки.
Так что я хз что они тебе тут залечивают.
» WarCraft 3 / Увеличение дистанции атаки
Герой игрока качает абилку - триггерно это отлавливается и повышается уровень улучшения для этого игрока. А само улучшение это аналог длинноствольных мушкетов. Оно должно быть у твоего героя в разделе улучшений, что бы оно на него работало.
Условие - сравнение способностей героев - изученная способность = твоя_абилка
Действия - Игрок - Установить уровень улучшения (мушкеты) для игрока (владелец юнита-инициатора) на уровень (уровень изученной способности).
Ред. Extremator
» WarCraft 3 / Спец.эффект на "Демоническую силу"
Сегодня ты просто даёшь ещё одну абилку при прокачке другой.
А завтра уже пытаешься уйти от какой-то базовой механики игры...
» WarCraft 3 / Таймер вместо вейт
» WarCraft 3 / Таймер вместо вейт
» WarCraft 3 / Таймер вместо вейт
- Это красный?
- У него цвет как у красного.
- Ну так это красный?
» WarCraft 3 / Таймер вместо вейт
Ред. Extremator
» WarCraft 3 / Таймер вместо вейт
Т.е. ты не занёс её в шапку или в другое место, где она должна объявляться раньше чем упоминается.
» WarCraft 3 / Таймер вместо вейт
К тому моменту когда ты найдёшь в чём реальный косяк такого вэйта, тебе уже не нужен будет вэйт.
» WarCraft 3 / Таймер вместо вейт
У меня бывают момент когда мне надо заставить триггер прождать МГНОВЕНИЕ, что бы не сбить что-то, и вот вэйт в 0.00 не помогает, т.к. срабатывает мгновенно, т.е. слишком быстро.
Мб я по памяти не совсем правильно что-то написал, надо проверить самому.
Ред. Extremator
» WarCraft 3 / Таймер вместо вейт
Если ты хотя бы немного понимаешь как работает Jass, то просто используй это вместо вэйта.
Хочешь записывай его в локалку, а потом ищи что и с кем делать (на это надо записать).
Хочешь записывай его в глобалку, а потом ... точно так же ищи что и с кем делать.
» WarCraft 3 / Как изменить позицию полей в РО