28

» WarCraft 3 / Можно ли реализовать подобное без орб эффектов?

Буквально вчера такое же разбирал у себя. Краш лечится предусловием. Перед нанесением урона сохранить в Custom Value (UserData) боевой единицы какое-то число, которое бы говорило о нанесении урона, после нанесения урона - убираете. Для триггера, ловящего урон поставить условие, что юниты с таким установленным числом не проходят по событию детекта урона (чтобы триггерный урон не ловился и не получалась рекурсия).
Custom Value может использоваться.
Вот нормальное решение.
call DisableTrigger(GetTriggeringTrigger())
call UnitDamageTargetBJ( GetEventDamageSource() , GetTriggerUnit(), GetEventDamage()*5, ATTACK_TYPE_HERO, DAMAGE_TYPE_NORMAL )
call EnableTrigger(GetTriggeringTrigger())
28

» WarCraft 3 / GetRealId( )

Попробовал return bug, возвращает уникальные значения у real'ов, имеющих 31 символа после запятой, после 32 символа начинает возвращать 0:
31 символ после запятой? JASS неадекватно обрабатывает числа с более 9-ти знаками после запятой, и даже в некоторых числах, у которых знаков после запятой меньше 9, совершает ошибки.
Вот статья.
также, что удивительно, одинаковые числа, но имеющие разное кол-во введённых символов выдают разные числа:
Причина этому дана выше.
28

» WarCraft 3 / GetRealId( )

Тогда каждый экземпляр структуры будет обладать уникальным целочисленным значением в диапазоне от 1 до 8190 (или больше, если в патче 1.28+), эдакая ссылочная обертка для примитивного типа.
Вот кстати да, можно же сделать структуру! Но the return-loop hack лучше, потому что ограничений нет, в отличие от структур.
28

» WarCraft 3 / GetRealId( )

The return-loop hack в помощь.
В математике R не ограничено, но наш мир ограничен, потому число действительных чисел ограничено в программировании. Каждому целому числу сопоставлено число с плавающей точкой.
Не используй R2S, это R2SW с точностью 3. Лучше используй R2SW с точностью -1.
function R2SX takes real r returns string
    return R2SW(r, 0, -1)
endfunction
28

» WarCraft 3 / Скилл под лупу (Утечки)

Вот только DracoL1ch наоборот говорил, что лучше куча таймеров, чем 1 таймер с if-ами внутри его функции.
В цитате говорится, что периодический таймер лучше, чем периодический триггер, но не говорится, что периодический таймер хуже, чем непериодический.

Из всех проблем с периодическими таймерами я знаю только баг с ResumeTimer(). А ещё вроде бы периодический таймер будет точнее, чем перезапуск непериодического.
28

» WarCraft 3 / Скилл под лупу (Утечки)

Я сам не верил, пока лично не столкнулся.
А что с периодическим таймером не так?
Кроме бага с ResumeTimer().
28

» WarCraft 3 / Что я сделал не так?

AserJes:
Поставь своему даммику Abilities - Cast Point и Abilities - Backswing Point на 0.
28

» WarCraft 3 / Что я сделал не так?

нет.
Ну вообще-то да. В настройках юнита ставишь время каста на ноль (Cast Point и Cast Backswing), и все абилки кастуются мгновенно. Проверял кучу раз.
28

» WarCraft 3 / Что я сделал не так?

Fakov:
0.02 секунды вейт слишком короткий, каст ножа не успевает произойти - даммик удаляется раньше.
Надо даммику время каста поставить на 0, и увеличить немного вейт. А лучше вместо вейта триггер с событием "Юнит закончил применять способность".
28

» WarCraft 3 / Кель из Heroes of the Storm

IsUnitType(u, UNIT_TYPE_DEAD) вернет false, если u == null. То есть функция скажет, что несуществующий юнит еще живой.
Я об этом и написал в комментарии. Такое поведение логично, нужно отдельно проверять, если юнита нет.
DracoL1ch:
есть четкая нативка UnitAlive
Я почему-то думал, что это функция берёт integer как аргумент.
28

» WarCraft 3 / Кель из Heroes of the Storm

Многие программисты говорят, что в загруженных картах эта функция (и именно цифра 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
28

» WarCraft 3 / Некорректные числа в таблицах после слк оптимизации

Есть же "Найти и заменить".
Открываем .slk Excel, жмём Ctrl+H, пишем что ищем и на что заменяем. Там также будет кнопка "Найти всё", "Заменить всё".
Можешь мне кинуть в ЛС, заменю, вышлю с заменёнными.
slk можно и блокнотом открыть.
28

» WarCraft 3 / Некорректные числа в таблицах после слк оптимизации

Есть же "Найти и заменить".
Открываем .slk Excel, жмём Ctrl+H, пишем что ищем и на что заменяем. Там также будет кнопка "Найти всё", "Заменить всё".
28

» WarCraft 3 / Приказ строить через способность здания

crusader556:
Extremator:
Топорно, но... суть думаю поймёшь
Годнота , как раз то что я хотел. Можно как то будет запилить способность-спеллбук для здания , чтобы поместить туда все способности-приказы к строительству ? Достаточно будет переделать дефолт способность предмета ?
Да, достаточно. Про спеллбук прочитай тут.
28

» WarCraft 3 / Приказ строить через способность здания

В инкубаторе ничего не нанимается (кроме королев), там есть кнопка "Выбрать личинок".

Нужен 1 триггер на использование способности. Юнит использует такую-то способность -> снять выделение и выделить того-то.
28

» WarCraft 3 / Награда за юнитов противника

Fly123:
quq_CCCP, это надо в константах искать или в редакторе объектов?
В редакторе триггеров при инициализации.
28

» WarCraft 3 / Как прикрепить оружие и броню на юнита

Ползуй флаг альянса
Вот только визуального эффекта знамёна не дают.

Вот карта, где показано, что абилки флага визуального эффекта не дают.
Тестировали бы сначала, перед тем как советы давать.
UPD: способности флага чисто предметные способности, в предметах работают как надо. Если же дать способности юниту, то они не работают.
Загруженные файлы
28

» WarCraft 3 / vjass структуры, проблема наследования

Прошёл день, а кода в ЛС я не увидел, проблема решена?

Ты делаешь каст integerа в Tracker, потому вызывается метод, описанный в Tracker.
А вот это неправда, и в этом случае вызывается так, как я описал в комментарии 7.
То есть даже код из вопроса работает, как нужно.
Небольшой совет: определение метода нужно писать над кодом, в котором этот метод передаётся как code, иначе на самом деле будет передана функция, что вызывает триггер, в котором уже вызывается указанный метод.

Карта, в которой есть подтверждения моих слов.
Загруженные файлы
28

» WarCraft 3 / vjass структуры, проблема наследования

у меня есть привычка проверять сначала, если не уверен) так что да, тестировал, не работает, getTrack, который принадлежит Tracker, его и возвращает.
Попробуй так.
    static method defaultTrack takes nothing returns nothing
        local thistype h = getTrack(GetHandleId(GetTriggeringTrackable()))
        call h.OnTrack()
    endmethod
Если и это не сработает, то правьте руки кинь свой код Tracker и его детей в мне в ЛС. Я уж гляну, что к чему.
28

» WarCraft 3 / vjass структуры, проблема наследования

Принятый ответ
да вот только thistype возвращает структуру из которой он вызван, а не структуру инстанса идентификатора, т.е. getTrack будет всегда возвращать тип Tracker. Вопрос в том, как по идентификатору определить конкретный тип структуры и к нему привести.
Этот код тестировал? Он должен работать.

Структуры в vJass - массивы. Объект структуры - integer.
У каждой структуры есть массив, куда записывается тип каждого объекта структуры. Пусть у Trackle айди 1, а у Button 2. При создании объекта структуры будет сделано следующее: set массив_куда_записывается_тип[объект_структуры] = айди_структуры. При создании объекта Button и в массив типа структуры Button, и в массив структуры Trackle будет записано 2.

Перезаписываемые методы - массив триггеров, у которых в качестве условия записано тело метода.
Вызов такого метода - call TriggerEvaluate(массив_триггеров[массив_куда_записывается_тип[объект_структуры]]).
В нашем случае это будет выглядеть call TriggerEvaluate(массив_триггеров_OnTrack[массив_куда_записывается_тип[getTrack(h)]]).

Потому должно работать.
28

» WarCraft 3 / vjass структуры, проблема наследования

вот только беда в том, что при регистрации TriggerAddAction(trk.t_track,function Tracker.defaultTrack) я должен указать именно статичную функцию, а вот с нее уже вызвать наследованную.
Так должно работать как нужно.
struct Tracker
    static method getTrack takes integer h returns thistype
        return LoadInteger(hash, h, 1)
    endmethod

    stub method OnTrack takes nothing returns nothing
        call echo("track1")
    endmethod

    static method defaultTrack takes nothing returns nothing
        local integer h = GetHandleId(GetTriggeringTrackable())
        call getTrack(h).OnTrack()
    endmethod
endstruct

struct Button extends Tracker
    stub method OnTrack takes nothing returns nothing
        call echo("track2")
    endmethod
endstruct
интерфейсы юзай
Ему же нужно создавать объект типа Tracker.