Когти + индексация Всё, что тут сложного? Хочешь что бы бафф отображался - даёшь ещё ауру на самого себя Готово. И эту абилку ничем не задиспелить (если не сделать триггер отдельный).
Поясню. Способки даются герою рандомно и мне нужно их систематизировать, то есть игрок будет получать способности в рандомном порядке и мне нужно понять какая из них получена только что чтобы управлять ими в дальнейшем
Звучит так, как-будто у тебя там имеется массив из абилок и ты выбираешь одну конкретную по номеру. Например
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 не помогает, т.к. срабатывает мгновенно, т.е. слишком быстро.
но если вейты так глючны, то почему бы просто не сделать отчет на локалках или глобалках?
Ответ на твой вопрос - таймер.
Хочешь записывай его в локалку, а потом ищи что и с кем делать (на это надо записать).
Хочешь записывай его в глобалку, а потом ... точно так же ищи что и с кем делать.
Не может. У всего происходящего есть своя последовательность. Затереть юнита инициировавшего ивент не так уж и просто, но способы есть. В основном все проблемы с потерей такого юнита сводятся к тому что сам вэйт ни при чём, а всему виной каша идущая до/после.
По поводу вэйта - если уж не нравится стандартный, то как вариант, сварганить и юзать что-то на подобии этого:
function WAIT_EX takes real s returns nothing
local timer t = CreateTimer()
call TimerStart(t,s,false,null)
loop
call TriggerSleepAction(s)
exitwhen TimerGetRemaining(t) == 0.
endloop
call DestroyTimer(t)
set t = null
endfunction
Ты вот ссылаешься на "конструктед структур", а ты знаешь какой именно это юнит? выведи на экран его имя.
Ты отдаёшь конкретному юниту приказ тренить юнита, а он там вообще есть? тоже надо проверять
Если у тебя что-то не срабатывает - ищешь конкретно то место где происходит ступор, расставляешь вывод текстов с именами юнитов и прочего. И тут же видишь что и где идёт не правильно.
Надо раскрыть функцию спавна андедов и посмотреть каким именно образом там меняется здание (рудник) и что делается попутно. А так вообще думаю тебе хватит простой замены юнита, через реплейс (есть такая функция - замена юнита с сохранением параметров хп/мп)
ну я и посчитал, точнее excel за меня разложил всё
Мб ты тоже попробуешь посчитать прежде ? )
Поэтому базовую скорость и множитель замедления надо подкручивать
и как ты собрался подкручивать множитель?
Подкручивая базовую скорость с такой формулой ты никогда не добьёшься желаемого
Ну вот я поставил s9. - этого мало, число уходит в 0 гораздо раньше нужного.
Подкрутил до s12. - лучше, но всё ещё мало.
Подкрутил до s18. - ещё лучше, но движение менее плавное стало.
Подкрутил множитель до .94 - стало нормально.
При скорости 2.064 дистанция падает на 0.339 а потом до 0 = таймер паузится.
Вот я и не добился желаемого подкручивая множители... вообще ни разу.
Ред. 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 / Как изменить позицию полей в РО
Ред. Extremator
» WarCraft 3 / Таймер вместо вейт
Ред. Extremator
» WarCraft 3 / Не работает простой Триггер (рефоржет)
» WarCraft 3 / Описание героя/боевой единицы больше стандтартного
» WarCraft 3 / Описание героя/боевой единицы больше стандтартного
» WarCraft 3 / Как сделать упровление как в клешь рояле
» WarCraft 3 / Рудник рядом с зданием
» WarCraft 3 / Формула плавного замедления через дистанцию
» WarCraft 3 / Формула плавного замедления через дистанцию
Подкрутил до s12. - лучше, но всё ещё мало.
Подкрутил до s18. - ещё лучше, но движение менее плавное стало.
Подкрутил множитель до .94 - стало нормально.
При скорости 2.064 дистанция падает на 0.339 а потом до 0 = таймер паузится.
» WarCraft 3 / Формула плавного замедления через дистанцию
Это ж не формула от и до, это топорный вариант.