Буквально вчера такое же разбирал у себя. Краш лечится предусловием. Перед нанесением урона сохранить в Custom Value (UserData) боевой единицы какое-то число, которое бы говорило о нанесении урона, после нанесения урона - убираете. Для триггера, ловящего урон поставить условие, что юниты с таким установленным числом не проходят по событию детекта урона (чтобы триггерный урон не ловился и не получалась рекурсия).
Custom Value может использоваться.
Вот нормальное решение.
Попробовал return bug, возвращает уникальные значения у real'ов, имеющих 31 символа после запятой, после 32 символа начинает возвращать 0:
31 символ после запятой? JASS неадекватно обрабатывает числа с более 9-ти знаками после запятой, и даже в некоторых числах, у которых знаков после запятой меньше 9, совершает ошибки. Вот статья.
также, что удивительно, одинаковые числа, но имеющие разное кол-во введённых символов выдают разные числа:
Тогда каждый экземпляр структуры будет обладать уникальным целочисленным значением в диапазоне от 1 до 8190 (или больше, если в патче 1.28+), эдакая ссылочная обертка для примитивного типа.
Вот кстати да, можно же сделать структуру! Но the return-loop hack лучше, потому что ограничений нет, в отличие от структур.
The return-loop hack в помощь.
В математике R не ограничено, но наш мир ограничен, потому число действительных чисел ограничено в программировании. Каждому целому числу сопоставлено число с плавающей точкой. Не используй R2S, это R2SW с точностью 3. Лучше используй R2SW с точностью -1.
function R2SX takes real r returns string
return R2SW(r, 0, -1)
endfunction
Вот только DracoL1ch наоборот говорил, что лучше куча таймеров, чем 1 таймер с if-ами внутри его функции.
В цитате говорится, что периодический таймер лучше, чем периодический триггер, но не говорится, что периодический таймер хуже, чем непериодический.
Из всех проблем с периодическими таймерами я знаю только баг с ResumeTimer(). А ещё вроде бы периодический таймер будет точнее, чем перезапуск непериодического.
Многие программисты говорят, что в загруженных картах эта функция (и именно цифра 0.405) лучше и надежнее.
Лучше и надёжнее использовать эти функции.
function UnitIsAlive takes unit u returns boolean
return not IsUnitType(u, UNIT_TYPE_DEAD)
endfunction
function UnitIsDead takes unit u returns boolean
return IsUnitType(u, UNIT_TYPE_DEAD) // returns false, if unit does not exist.
endfunction
Годнота , как раз то что я хотел. Можно как то будет запилить способность-спеллбук для здания , чтобы поместить туда все способности-приказы к строительству ? Достаточно будет переделать дефолт способность предмета ?
Вот карта, где показано, что абилки флага визуального эффекта не дают.
Тестировали бы сначала, перед тем как советы давать.
UPD: способности флага чисто предметные способности, в предметах работают как надо. Если же дать способности юниту, то они не работают.
Ты делаешь каст integerа в Tracker, потому вызывается метод, описанный в Tracker.
А вот это неправда, и в этом случае вызывается так, как я описал в комментарии 7.
То есть даже код из вопроса работает, как нужно. Небольшой совет: определение метода нужно писать над кодом, в котором этот метод передаётся как code, иначе на самом деле будет передана функция, что вызывает триггер, в котором уже вызывается указанный метод.
да вот только thistype возвращает структуру из которой он вызван, а не структуру инстанса идентификатора, т.е. getTrack будет всегда возвращать тип Tracker. Вопрос в том, как по идентификатору определить конкретный тип структуры и к нему привести.
Этот код тестировал? Он должен работать.
Структуры в vJass - массивы. Объект структуры - integer.
У каждой структуры есть массив, куда записывается тип каждого объекта структуры. Пусть у Trackle айди 1, а у Button 2. При создании объекта структуры будет сделано следующее: set массив_куда_записывается_тип[объект_структуры] = айди_структуры. При создании объекта Button и в массив типа структуры Button, и в массив структуры Trackle будет записано 2.
Перезаписываемые методы - массив триггеров, у которых в качестве условия записано тело метода.
Вызов такого метода - call TriggerEvaluate(массив_триггеров[массив_куда_записывается_тип[объект_структуры]]).
В нашем случае это будет выглядеть call TriggerEvaluate(массив_триггеров_OnTrack[массив_куда_записывается_тип[getTrack(h)]]).
вот только беда в том, что при регистрации TriggerAddAction(trk.t_track,function Tracker.defaultTrack) я должен указать именно статичную функцию, а вот с нее уже вызвать наследованную.
Ред. PT153
» WarCraft 3 / Можно ли реализовать подобное без орб эффектов?
Вот нормальное решение.
Ред. PT153
» WarCraft 3 / GetRealId( )
Вот статья.
» WarCraft 3 / GetRealId( )
Ред. PT153
» WarCraft 3 / GetRealId( )
В математике R не ограничено, но наш мир ограничен, потому число действительных чисел ограничено в программировании. Каждому целому числу сопоставлено число с плавающей точкой.
Не используй R2S, это R2SW с точностью 3. Лучше используй R2SW с точностью -1.
» WarCraft 3 / Скилл под лупу (Утечки)
Ред. PT153
» WarCraft 3 / Скилл под лупу (Утечки)
В цитате говорится, что периодический таймер лучше, чем периодический триггер, но не говорится, что периодический таймер хуже, чем непериодический.
Из всех проблем с периодическими таймерами я знаю только баг с ResumeTimer(). А ещё вроде бы периодический таймер будет точнее, чем перезапуск непериодического.
Ред. PT153
» WarCraft 3 / Скилл под лупу (Утечки)
Кроме бага с ResumeTimer().
Ред. PT153
» WarCraft 3 / Что я сделал не так?
Поставь своему даммику Abilities - Cast Point и Abilities - Backswing Point на 0.
Ред. PT153
» WarCraft 3 / Что я сделал не так?
» WarCraft 3 / Что я сделал не так?
Ред. PT153
» WarCraft 3 / Кель из Heroes of the Storm
DracoL1ch:
» WarCraft 3 / Кель из Heroes of the Storm
» WarCraft 3 / Некорректные числа в таблицах после слк оптимизации
Ред. PT153
» WarCraft 3 / Некорректные числа в таблицах после слк оптимизации
Открываем .slk Excel, жмём Ctrl+H, пишем что ищем и на что заменяем. Там также будет кнопка "Найти всё", "Заменить всё".
» WarCraft 3 / IsUnitInRegion
» WarCraft 3 / Как правильно реализовать?
» WarCraft 3 / Приказ строить через способность здания
Ред. PT153
» WarCraft 3 / Приказ строить через способность здания
Ред. PT153
» WarCraft 3 / Награда за юнитов противника
» WarCraft 3 / Награда за юнитов противника
» WarCraft 3 / Как прикрепить оружие и броню на юнита
pro100master:
Тестировали бы сначала, перед тем как советы давать.
UPD: способности флага чисто предметные способности, в предметах работают как надо. Если же дать способности юниту, то они не работают.
Ред. PT153
» WarCraft 3 / vjass структуры, проблема наследования
То есть даже код из вопроса работает, как нужно.
Небольшой совет: определение метода нужно писать над кодом, в котором этот метод передаётся как code, иначе на самом деле будет передана функция, что вызывает триггер, в котором уже вызывается указанный метод.
Ред. PT153
» WarCraft 3 / vjass структуры, проблема наследования
правьте рукикинь свой код Tracker и его детей в мне в ЛС. Я уж гляну, что к чему.Ред. PT153
» WarCraft 3 / vjass структуры, проблема наследования
У каждой структуры есть массив, куда записывается тип каждого объекта структуры. Пусть у Trackle айди 1, а у Button 2. При создании объекта структуры будет сделано следующее: set массив_куда_записывается_тип[объект_структуры] = айди_структуры. При создании объекта Button и в массив типа структуры Button, и в массив структуры Trackle будет записано 2.
Перезаписываемые методы - массив триггеров, у которых в качестве условия записано тело метода.
Вызов такого метода - call TriggerEvaluate(массив_триггеров[массив_куда_записывается_тип[объект_структуры]]).
В нашем случае это будет выглядеть call TriggerEvaluate(массив_триггеров_OnTrack[массив_куда_записывается_тип[getTrack(h)]]).
Ред. PT153
» WarCraft 3 / vjass структуры, проблема наследования