нужно понимать в каких областях ты юзаешь глобалки
Я про это же, куча нативок вызывают обработку разных событий и в них тоже может встретиться вызов какой-то твоей системы, которая использует твои глобалки, поэтому идея "одна глобальная группа на все" тем, что потенциально приведет к неприятной ошибке, которую вы вероятно не сразу заметите, а игрокам жизнь она будет портить, возможно, как в представленном примере, ощутимо, пусть это всего лишь демонстративный пример.
ну как в либе IceFog'а, либо лаунчер как у айкапа. Хотя можно взять левую ИИ нативку, взять её адресс и назначить ей твои дейсвия. К примеру Rmem.
Печально, но я недавно придумал Уууууу костыль, использовать мне его не очень нравится, но можно создать jass функцию с названием, совпадающим с названием нативки и подменить в функции её вызывающей вызов обычной функции на вызов нативки, которую мы предварительно зарегистрировали. Из плюсов - нативку не надо объявлять, из минусов - их добавления ужасно.
Ну тебе нужно задекларировать нативку и в своем коде сделать, заготовку,
При наличии такого объявления, варкрафт начинает злобно ругаться и валиться с примерно таким текстом:
unregistered native function on line 553 (war3map.j)
Получается, если я хочу использовать эти функции в war3map.j, я должен их каким-то образом загрузить заранее?
Можешь сделать эти переменные локальными - ничего не поменяется. Этот код всегда будет работать так, как ты его написал. Никаких зависимостей от внешних условий тут нет.
Вы карту даже не запускали, а я ведь её приложил. Там есть второй триггер, который не делает ничего, только меняет местами значения глобалок. И, в зависсимости от того включен он или нет, первый будет работать определенным образом, несмотря на то, что второй не делает ничего. rsfghd:
что этот код вообще должен делать непонятно, ведь юнит даже не сможет кастануть абилку, сразу удалившись
Для меня это стало новостью, но если поставить время каста способности и точку каста в ноль даммик успеет кастануть до удаления, посмотрите карту =(
Если быть достаточно неаккуратным - будет. Например вот такой вот код, при использовании глобалок сработает совсем не так, как ожидалось:
globals
unit u1
unit u2
unit u3
endglobals
function Trig_REVENGE_Actions takes nothing returns nothing
set u1 = GetTriggerUnit()
set u2 = GetEventDamageSource()
set u3 = CreateUnit(GetOwningPlayer(u1),'h000',GetUnitX(u2),GetUnitY(u2),0)
call UnitAddAbility(u3,'A000')
call IssueTargetOrder(u3,"thunderbolt",u2)
call RemoveUnit(u3)
endfunction
И все это, о ужас! будет зависить от внешних условий, так что использование глобалок - способ получить обидную и неприятную ошибку.
В переменную записать айди погодного эффекта с дождем для локального игрока, для остальных - без модельки. Создать погодный эффект из этой переменной. Десинкать не должно, так как погода в реальности себя проявляет незначительно, но это можно и протестировать.
не желательно оставлять в attacktype и damagetype нулевые значением
Насколько мне известно, это не важно, как минимум большая часть нативок вида Conert@Type в случае валидного числа вернут его же. ConvertDamageType - из их числа. Нулл - он точно тождественно ноль. Это может меняться в других патчах, но я о таких изменениях не слышал.
Что-то там для рефоржа, но в мемхаке аналогичные функции либо есть, либо их не сложно найти самому/поспрашивать, может кто знает.
Плюс что-то можно найти в исходниках render-edge:
Тут есть вариант манабара на ассемблере с небольшим добавлением си. Таким же образом можно сделать и щит. В целом, можно даже на мемхаке, ну или собрать кастомную dll и мемхаком подгрузить.
Без карты я конечно не смогу протестировать, но мана - флоат, поэтому возможно стоит считать условие выполненным, например, если у юнита кол-во маны меньше чем максимум минус 1, возможно проблема в этом.
Насколько я понимаю, GetUnitAbilityCastTime вернет время, в течении которого юнит будет стоять и ничего не делать, после чего начнет анимацию каста, а GetUnitAbilityCastPoint - вернет время, после начала анимации каста, через которое он абилку таки докастует.
Насколько я понимаю, игра точно считает количество созданных объектов. У меня даже табличка, выглядящая довольно правдоподобно, для 1.26 для cheat engine была.
то используй глобальные переменные чтобы не тратить время на выделение памяти.
Главное при использовании глобалок в ногу себе не выстрелить. Они могут быть перезаписаны в коллбеке триггера, вызванного тем или иным действием в коде. Поэтому желательно, как минимум, использовать разные глобалки в разных системах.
Для такой системы не жалко запускать по 1му самоуничтожающемуся таймеру для игрока (ну или делать то же самое с глобальным таймером, что чуть сложнее) .
Пока клик не произошел есть массив заполненный нулями.
Второй массив - для хранения юнитов, которые были последними, в которых кликнул игрок.
Соответственно, клик произошел, если в ячейке игрока ноль - запустить таймер., сложить в массив. Сложить юнита в массив. Если игрок кликнул до его истечения, то в соотв. ячейке массива не ноль. Уничтожить таймер. Дать героя. запретить игроку использовать систему. Если таймер закончился - в соответствующую ячейку массива положить ноль, а таймер уничтожить. Кликнутого юнита в массиве занулить.
Конечно, система чуть не оптимальна, но это мелочь, не заслуживающая нашего внимания. Вряд ли она будет использоваться хоть сколько-нибудь часто.
Из недостатков - молоток, работающий в данной системе без проблем убьёт юнита, спрятанного через ShowUnit(u,false), в отличии от стандартного молотка. Например, он бы убил панду, использующую три стихии, если бы она не была в момент работы этой способности неуязвимой.
При этом, если будет необходимость эту систему развивать, например накладывая бафы, двигая юнита или что-то еще, то из-за этого могут начаться чудеса.
Мне тут кажется несколько сомнительным момент, когда герой бегает во время сцен. Например в сцене с кучей скелетов его успевают скушать, если он до них добежит, что мне не нравится. Возможно стоит героя паузить+вручать неуязвимость во избежание казусов.
Еще одно сомнительное как по мне решение - невидимые сюжетные стены на карте, по-моему лучше уж по-старинке воротами... А так не очень понятно где просто стена а где стена, которая потом, когда ты сделаешь 10 квестов исчезнет.
Так же не уверен, что давать опыт за дерущихся в другом конце карты пехотинцев - правильно.
А так да, отлично, это тот самый очень старый-добрый варкрафт.
Ну и еще капитан, говорящий пойди и помоги в соборе, но только если хочешь, пожалуйста - несколько портит атмосферу.
Но конкретно тут, я вижу, что одному юниту мгновенно отдаются приказы кинуть молотки по всем юнитам в области.
Он не кидает молоток мгновенно, пока повернется, пока покурит, пока кастанет, конечно он ничего не успевает.
Для нанесения урона и стана можно использовать варстомп, его нужно кастануть ровно единожды.
Если хочется можно наносить урон триггерно а стомпом только станить.
» WarCraft 3 / Что быстрее ForGroup() или Loop?
» WarCraft 3 / Новые нативки для мемхака.
А по поводу ивентов я мало что понимаю, к несчастию.
» WarCraft 3 / Новые нативки для мемхака.
» WarCraft 3 / Новые нативки для мемхака.
unregistered native function on line 553 (war3map.j)
Получается, если я хочу использовать эти функции в war3map.j, я должен их каким-то образом загрузить заранее?
Ред. goodlyhero
» WarCraft 3 / Что быстрее ForGroup() или Loop?
rsfghd:
=(
Ред. goodlyhero
» WarCraft 3 / Что быстрее ForGroup() или Loop?
Ред. goodlyhero
» WarCraft 3 / Дождь для отдельного игрока
Ред. goodlyhero
» WarCraft 3 / Утечки в вызванной функции
» WarCraft 3 / Время каста
» WarCraft 3 / Положение индикаторов здоровья и маны и создание новых
https://www.xgm.guru/p/wc3/blz-get-origin-frame
https://www.xgm.guru/p/wc3/framechat
Плюс что-то можно найти в исходниках render-edge:
» WarCraft 3 / Положение индикаторов здоровья и маны и создание новых
» WarCraft 3 / Не могу найти причину
Ред. goodlyhero
» WarCraft 3 / Время каста
» WarCraft 3 / Время каста
» WarCraft 3 / Не запускается карта с мемхаком
Гуванч:
» WarCraft 3 / Не запускается карта с мемхаком
» WarCraft 3 / Обязательно ли обнулять локальные переменные?
Ред. goodlyhero
» WarCraft 3 / Обязательно ли обнулять локальные переменные?
» WarCraft 3 / Бафф на 1 секунду
Пока клик не произошел есть массив заполненный нулями.
Второй массив - для хранения юнитов, которые были последними, в которых кликнул игрок.
Соответственно, клик произошел, если в ячейке игрока ноль - запустить таймер., сложить в массив. Сложить юнита в массив. Если игрок кликнул до его истечения, то в соотв. ячейке массива не ноль. Уничтожить таймер. Дать героя. запретить игроку использовать систему. Если таймер закончился - в соответствующую ячейку массива положить ноль, а таймер уничтожить. Кликнутого юнита в массиве занулить.
Конечно, система чуть не оптимальна, но это мелочь, не заслуживающая нашего внимания. Вряд ли она будет использоваться хоть сколько-нибудь часто.
» WarCraft 3 / Система целевой способности
Ред. goodlyhero
» WarCraft 3 / Система целевой способности
При этом, если будет необходимость эту систему развивать, например накладывая бафы, двигая юнита или что-то еще, то из-за этого могут начаться чудеса.
Ред. goodlyhero
» WarCraft 3 / Становление героя: Исазам
Еще одно сомнительное как по мне решение - невидимые сюжетные стены на карте, по-моему лучше уж по-старинке воротами... А так не очень понятно где просто стена а где стена, которая потом, когда ты сделаешь 10 квестов исчезнет.
Так же не уверен, что давать опыт за дерущихся в другом конце карты пехотинцев - правильно.
А так да, отлично, это тот самый очень старый-добрый варкрафт.
Ред. goodlyhero
» WarCraft 3 / не станит дамми
Он не кидает молоток мгновенно, пока повернется, пока покурит, пока кастанет, конечно он ничего не успевает.
Для нанесения урона и стана можно использовать варстомп, его нужно кастануть ровно единожды.
Если хочется можно наносить урон триггерно а стомпом только станить.
» WarCraft 3 / не станит дамми
» WarCraft 3 / Что за объект или integer вызывает фатал на Варкрафт III?