В каждой карте, когда создаётся объект, ей даётся свой ID, который на 1 больше предыдущего ID. Так вот, если коротко, то там создаётся объект и его ID вычитается от наименьшей возможной ID ( 0x100000 ), то есть если ID нового объекта - 0x100512, то разница будет равна 0x512. Значит на карте примерно 0x512 объектов. Вот таким нехитрым образом и работает данный счётчик.
Понятно, но почему он тогда в -100 ушёл?
Вот скрин, тут не -100, но меньше нуля.
А ещё мне кажется, что цикл создания локаций может никогда не закончится, потому что мы зануляем next, если index != previndex + 1.
Ещё по поводу объектов: image и player имеют ID куда меньше 0x100000, но тоже объекты. Extremator:
А ещё иногда при нажатии на ESC счётчик на некоторое время увеличивается на несколько сотен, а потом вновь возвращается назад. Странно всё это, лучше лича об этом спросить.
Ни разу не сталкивался, пример есть? С условием, что атакующий какой-то один герой
Так это событие будет срабатывать на замах любого юнита, отсеять ненужных можно в фильтре или событии. Факт в том, что срабатывать будет.
У меня лагало, но атакующих юнитов было много. Также в этом триггере была сложная функция. Решил проблему отключения выполнения сложной функции на некоторое время для каждого определённого юнита.
В частности, quq_CCCP меня ругал за то, что я в своей карте использую это событие.
В любом случае, оба способа не гарантируют, что юнит-таки получит урон, но первый способ проще. 8gabriel8:
человек жаловался в своё время, что через минут 10-30 интенсивного спавна с этим добавлением события начинало сильнейше лагать.
Помню-помню такое, но в это слабо верится, потому что кто-то более разбирающийся говорил, что как только юнит удаляется, а все ссылки на его хендл обнулены, то и все зарегистрированные события для него удаляются. Лаги может вызывать много чего, если неразумно использовать.
А вообще тут опять ушли от вопроса и начали холивар об оптимизации)
указал в скобках +фильтр, тебе не кажется, что это что-то должно значить?
В фильтре можно только прочекать GetFilterUnit(), а для события получения урона GetFilterUnit() возвращает наносителя.
Да и как ты проверишь, что для этого юнита уже зарегистрировано событие без создания доп. костылей?
Само событие UNIT_ATTACKED сильно нагружает игру, потому что срабатывает каждый раз при замахе. У меня из-за частого срабатывания этого события сильно глючила игра. А событие на вход во всю карту срабатывает 1 раз за игру.
Решение Extremator требует сохранения boolean, которое будет отвечать за регистрацию такого события и будет уникально для каждого юнита. И оно также может вызывать лаги. Потому с точки зрения оптимизации и с точки зрения простоты способ ниже самый лучший, если получить урон может любой юнит. Если не любой, то просто в условии или в фильтре отсеиваем ненужных.
Событие. Юнит - Юнит входит в область Вся карта.
Действие. Триггер - Добавить событие такому-то триггеру Вошедший юнит Получает урон.
И каждый раз, когда юнит будет атакован юнитом со способностью X, будет добавляться событие, из-за чего триггер будет срабатывать кучу раз для атакованного юнита. PT153:
UNIT АТАКУЕТ
Его просто сделать, если добавить фильтр в событие UNIT_ATTACKED. Фильт отлавливает только того, кто атакует, как ни странно.
constant native IsUnitEnemy takes unit whichUnit, player whichPlayer returns boolean
Используй её.
А куда условие добавил? В той формуле не передаются юниты или игроки.
В boolexpr точно работает GetFilterUnit(), насчёт остальных таких нативок сказать не могу, но они точно не работают в boolexpr у событий.
А стенка - здание?
При попадании можно стенку сразу удалять RemoveUnit, а для проигрывания анимации нужно в позиции стенки создавать и сразу удалять эффект, который использует модель стенки. Atesla:
у меня из-за двух условий булэкспр "сдувался"
Что это значит? Распиши поподробнее, можешь код кинуть.
Есть для определённого юнита. Если есть юниты на карте, регистрируем для них. Для юнитов, что создаются во время игры, надо сделать такой триггер.
Событие. Юнит - Юнит входит в область Вся карта.
Действие. Триггер - Добавить событие такому-то триггеру Вошедший юнит Получает урон.
То есть если нет таймера, то он создаст его, а если таймер есть, то он увеличит уровень способности? (я немного запутался просто)
Да, ведь так должен спел работать? Я из описания вопроса так понял.
И такой способ для события Получает урон?
Событие "Юнит атакован" срабатывает во время замаха. Это можно абузить. Для каждого юнита на карте нужно зарегистрировать событие по получению урона. Для каждого, потому что общей такой функции нет.
Потеря очереди приказов (у юнита) из-за такого стана не играет для вас вообще никакой роли?!
Это к кому обращение? У меня не играет, потому что. PT153:
у меня это делается на юнитов, которых никто не контролирует
Да и у способа UrsaBoss не должно быть прерываний текущей очереди приказов.
Делается очень просто.
На каждого юнита приходится 1 число. Как только он получается стан, это число увеличивается на 1. Как только какой-то стан истекает, число уменьшается на 1. По истечению стана проверяем, чему равно число. Если 0, то снимаем бафф. Если больше 0, то ничего не делаем.
Чтобы было всё нативно, используем такое наложение стана. UrsaBoss:
Один дамми молот бурь с 0 времени стана (или -1)
Далее хештаблица и таймер, сохраняешь юнита по хендлу таймера и запускаешь его на нужное время
Всё. Кастомная система баффов готова.
Но в таком случае придётся отказаться от других станящих способностей.
крутил-крутил-вертел код, сделал так, вроде, работает, но мне кажется, что можно лучше
У тебя всё равно плодятся таймеры при каждом замахе. Через несколько минут игры будут лаги. Лучше глянь сообщение над своим.
Они бы не плодились, если бы была проверка на наличие способности, которую добавляешь (если уровень способности больше нуля, ничего не делаем). Но такой проверки нет.
Ред. PT153
» WarCraft 3 / Способность: повышение атаки при каждом ударе
Вот скрин, тут не -100, но меньше нуля.
Ещё по поводу объектов: image и player имеют ID куда меньше 0x100000, но тоже объекты.
Extremator:
ClotPh:
Ред. PT153
» WarCraft 3 / Способность: повышение атаки при каждом ударе
Ред. PT153
» WarCraft 3 / Способность: повышение атаки при каждом ударе
А почему этот счётчик верен?
Крутой счётчик, в -100 ушёл.
Ред. PT153
» WarCraft 3 / Способность: повышение атаки при каждом ударе
У меня лагало, но атакующих юнитов было много. Также в этом триггере была сложная функция. Решил проблему отключения выполнения сложной функции на некоторое время для каждого определённого юнита.
В частности, quq_CCCP меня ругал за то, что я в своей карте использую это событие.
В любом случае, оба способа не гарантируют, что юнит-таки получит урон, но первый способ проще.
8gabriel8:
» WarCraft 3 / Дамми
» WarCraft 3 / Способность: повышение атаки при каждом ударе
Плюсы.
- Простой
- Не нагружает игру
Минусы.Способ Extremator.
Плюсы.
- Регистрирует не всех юнитов.
Минусы.8gabriel8:
» WarCraft 3 / Способность: повышение атаки при каждом ударе
Ред. PT153
» WarCraft 3 / Способность: повышение атаки при каждом ударе
Само событие UNIT_ATTACKED сильно нагружает игру, потому что срабатывает каждый раз при замахе. У меня из-за частого срабатывания этого события сильно глючила игра. А событие на вход во всю карту срабатывает 1 раз за игру.
Решение Extremator требует сохранения boolean, которое будет отвечать за регистрацию такого события и будет уникально для каждого юнита. И оно также может вызывать лаги. Потому с точки зрения оптимизации и с точки зрения простоты способ ниже самый лучший, если получить урон может любой юнит. Если не любой, то просто в условии или в фильтре отсеиваем ненужных.
» WarCraft 3 / Дамми
» WarCraft 3 / Дамми
Ред. PT153
» WarCraft 3 / Способность: повышение атаки при каждом ударе
Extremator:
PT153:
» WarCraft 3 / Дамми
А куда условие добавил? В той формуле не передаются юниты или игроки.
В boolexpr точно работает GetFilterUnit(), насчёт остальных таких нативок сказать не могу, но они точно не работают в boolexpr у событий.
» WarCraft 3 / Дамми
При попадании можно стенку сразу удалять RemoveUnit, а для проигрывания анимации нужно в позиции стенки создавать и сразу удалять эффект, который использует модель стенки.
Atesla:
» WarCraft 3 / Как скрыть характеристики врагов ?
» WarCraft 3 / Дамми
Стенка же юнит? Во время смерти убери поставь в SetUnitPathing на false.
» WarCraft 3 / Какую версию jasshelper лучше использовать?
» WarCraft 3 / Как копировать данные ландшфат?
» WarCraft 3 / Система стана
Ред. PT153
» WarCraft 3 / Система стана
PT153:
Ред. PT153
» WarCraft 3 / Способность: повышение атаки при каждом ударе
Событие. Юнит - Юнит входит в область Вся карта.
Действие. Триггер - Добавить событие такому-то триггеру Вошедший юнит Получает урон.
» WarCraft 3 / Способность: повышение атаки при каждом ударе
Ред. PT153
» WarCraft 3 / Система стана
PT153:
На каждого юнита приходится 1 число. Как только он получается стан, это число увеличивается на 1. Как только какой-то стан истекает, число уменьшается на 1. По истечению стана проверяем, чему равно число. Если 0, то снимаем бафф. Если больше 0, то ничего не делаем.
Чтобы было всё нативно, используем такое наложение стана.
UrsaBoss:
» WarCraft 3 / Почему нельзя вызвать через code переменная?
» WarCraft 3 / Копирование триггеров в war3map.j
Ред. PT153
» WarCraft 3 / Способность: повышение атаки при каждом ударе
Они бы не плодились, если бы была проверка на наличие способности, которую добавляешь (если уровень способности больше нуля, ничего не делаем). Но такой проверки нет.