Ну либо вариант описанный выше prog,, либо сделать 2 способности, с одиаковым описанием но вторая не активна (что то требует) и менять их местами с помощью кода, удалять одну и вручать другую. Чтобы сохранялся кулдаун и прочие параметры - можно использовать способность "Aneg' - техника, меняя её уровни свапать ей 2 абилки, но работает она лишь у героев (у не героев фаталит при вручении).
Стас Орлов, мда, Тебе бы как следует статьи почитать на эту тему, ниче ты не понимаешь, даже как твоя способность должна работать.
Для начала нужен триггер с событием - юнит приводит способность в действие, ну и условие как ты правильно заметил что это нужная способность.
Далее в действиях этого триггера уже и нужно делать то, что тебя нужно от спелла.
У одного триггера может быть бесчисленное количество разных событий, условий и действий.
Ты хочешь щит на блок урона, это считай кастомный бафф. (все баффы способностей и есть внутри игровые триггеры, но описаны внутри движка), т.к ни одна из стандартных способностей тебя не устраивает - твоя задача на языке JASS описать кастомный бафф который тебя устроит.
Что нам нужно, ну во первых нам нужно узнать когда юнит получил урон, верно? создаем новый триггер и записываем на него через хт юнита, вешаем на триггер событие что юнит получил урон, далее нам нужно узнать что способность.
Так же не мешает узнать случаи альтернативного завершения способности, яркий пример - юнит умер, щит рассеили.
Ну и соответствующие действия.
Тут много тонкостей по которые лучше почитать в статьях.
У твоего триггера события нету, у тебя же нет отдельной ситсмы как у меня в карте которая следит за всеми юнитами на карте и когда они кастуют спеллы ищет в бд фунцию спелла и вызвает её. Так что все ручками, дебаг сообщения так же не мешает сделать.
У тебя ошибка, фукнкцию которую ты хочешь вызвать должна находится выше места вызова.
Unholy_Shield_End должна быть описана выше чем Sosdanie_Shita_Act1
Ну и вовсе, тебе нужен не хендл ид юнита а таймера,ибо сохранять ты данные должен на таймер а не на юнита, когда таймер истечет и вызовет функцию, внутри этой функции у тебя будет работать функция GetExpiredTimer() - которая вернет тот таймер, который запустил эту функцию, это единственный обьект связывающий твой триггер и функцию Unholy_Shield_End, и разумеется GetTriggerUnit() - не будет работать в потоке таймера, т.к это функция реакция на событие триггера. Ты походу копипастишь код совершенно не вникая в принципы его работы.
Структуры куда ведется запись данных чтобы передавать их между потоками таймера \ триггеров.
Ну пока не морочь голову конкретными функциями и стилистикой написания кода, твоя задача понять базовый алгоритм.
Что сперва ты ждешь пока юнит применит скилл, ты записываешь в хештаблицу этого юнита, все нужные данные, а так же создаешь для него отдельный триггер, которому ставишь события, что юнит умер, юнит получает урон, время вышло, ну добавляешь триггеру условия, действия, где производишь манипуляции с юнитом в зависмости от события, на которое сработал триггер.
При уроне выше 0 и от нужных тебе юнитов, вручаешь юниту способность на 100500 хп (в моем случае я сделал способность с ро кодом 'Amhp' на 150000 хп), записываешь в хештаблицу кол-во здоровья перед ударом, и запускаешь таймер на 0.00 секунд, как он кончится, удаляешь способность и разумеется устанавливаешь хп - сколько было.
В коде это хорошо видно. На всякие там фишечки и визуалки не обращай внимания тебе еще рано.
Возможны и другие реализации когда один триггер обслуживает сразу множество юнитов, к примеру отвечает за каку-нибудь пассивку на атаку вроде крита или баша (кастомного), у крипов коих десятки. Да такие варианты лучше, но они гораздо сложнее, и я не советую начинающим рассматривать их.
Стас Орлов, это нативная функция игры, она возвращает кол-во полученного урона только в пределах потока триггера, который сработал на получение урона.
Если не дошло
local trigger trg = CreateTrigger() // создадим некий триггер
call TriggerRegisterUnitEvent( trg, unit, EVENT_UNIT_DAMAGED ) // повесим на триггер новое событие, юнит который уже создан и стоит на карте получает урон, важно события вешаются на существующие обьекты а не переменные, и схитрить тут нельзя.
call TriggerAddAction( trg, function OnDamage ) // добавляем триггеру действие, это указатель на функцию.. для читабельности функцию опишу ниже.
function OnDamage takes nothing returns nothing
local real damage = GetEventDamage() // записываем в локальную переменную кол-во полученного урона.
Так вот, если триггер сработает не на событие урона, а на атаку или смерть юнита - эта функция вернет 0, тоже самое если ты её вызовешь вне функции которая указана в TriggerAddAction.
Функции этого типа -это реакция на события!
endfuction
Стас Орлов, Причем тут урон?
constant - в JASS флаг, указывающий что данный обьект можно только читать, а не записывать, если тебе так проще. Других функций у него нет.
Было довольно много информации по теме урона, вот один пример ссылка
Суть - Событие - Юнит получает урон, далеко не всегда удобно создавать 1 триггер на всех юнитов, и их создают динамически, по 1 для одного или нескольких юнитов, а затем удаляют.
Константа - постоянная, переменная которая не меняется в процессе игры.
Технически переменная которая не меняется, из за флага.
constant integer SPELL_ID = 'A000' // для переменной
constant function GetSpellId takes nothing returns integer // для функции
return 'A000'
endfunction
Это мало что дает, обычно юзают для выделения переменных или функций которые нужны для настроек кода, очень широко применяется во всяких "заклинаниях на заказ" где целая туча параметров.
Никакой скорости и прочего бреда это недает, все тоже самое что и простые переменные \ функции.
Ещё раз, это когда ты создал объект и не удалил, то утечка - CreateItemLoc(Location(0,0),I000), создаст утечку, ибо кроме предмета была создана точка, новый игровой объект, который по идеи надо сначала записать в переменную, потом использовать, а после удалить, и обнулить переменную, чтобы игра не считала ссылку на предмет занятой.
Но code - это указатель на функцию, весь код твоей карты состоит из этих указателей к которым и обращается игра, их генерирует движок игры из скрипта, при загрузке карты, и сколько их было, столько и осталось, они не создаются динамически, да и удалить ты их не можешь, поэтому помещать их в переменные и обнулять незачем.
Ельнур, ты пожалуйста честно скажи мне, ты наркоман? Что такое утечки то хоть представляешь?
Тип code даже формально не хендл, и даже не отдельный тип, т.к в jass у тебя по идеи нет возможности чето сделать с указателем на код, т.к типы указаны строго. Code нужен лишь чтобы интерпретатор понял что ты передал в качестве аргумента указатель на функцию.
Удалять code как и плодить ты тоже не можешь стандартными средствами языка, даже boolexpr'ы не плохят указатели, условно все прибито гвоздями и функций в коде ровно столько, сколько ты описал, они не создаются динамически (если не рассматривать мемхак).
Насчет ваших 1.31+ и луа, там да может быть всякая чушь, но такое. В луа я там слышал что есть нечто отдаленно похожое и вовсе луа, такая же надстройка над виртуальной JASM машиной, но пока пруфов на русском (или инглише) нет, и я ничего не пишу по этому поводу, и вам слушать что попало тоже не советую.
Чето ваще не понятно причем тут удаление пассивок и таймеры?
Да и вовсе существует событие смети.
Ну и писанина вроде local unitstate life ...
Ну не ужели ты не понимаешь что нахрен ненужно, пишется сразу GetWidgetLife( unit, ) < 0.405 и корочее и нет никаких нахрен ненужных переменных, тоже самое с code, нет никакой надобности заносить в переменные, ибо указатель на функцию ты и так передаешь через function name.
Steal nerves, Ну если кто то сделал конверт руками - флаг в руки, пока публичной инфы про это нет, только разобрали новый формат, если кто то шарит как конвертнуть в блокноте, флаг им в руки, вам то это как поможет? Ждите софта.
с помощью кода включить нужную анимацию у юнита, разумеется анимация должна быть у модели, у старых варовских моделей анимация разговора была лишь на портрете, это отдельная модель, кроме всяких крипов с мордами в 3 полигона.
Достать то можно - что толку, они имеют иной формат, с ними ниче сделать низя, публичного софта для редактирования и изучения нет, поэтому рефорджевские модели никому и ненужны - ты с ними ниче и не сделаешь.
На таких картах, земя как бы выдавлена из воды, с помощью инструмента которым ты холмы делаешь на ровной поверхности.
На карте которая полностью состоит из воды поднимаешь холмы...
.
У пугны одинаковый бонус урона от заклинаний 1.66х по юнитам в астрале, что минус стандартные 25% резиста героев, выходит как раз те самые 40%, про которые написано у пугны. При касте на союзника или себя, пугне выдают другой левел абилки, у абилки к примеру 5 левелов а выучиваешь ты канал, при касте в себя всегда замедло слабое, на врагов сильное. Стандартные изгания в астрал переделать нельзя никак, нужно делать кастомный аналог с помощью кода чтобы союзникам урон от магии уменьашался а врагам увеличивался.
Ну там как раз разницы немного, если и не запустится - адаптировать дело нескольких часов, если речь про ретурнбаг и особенности работы старых оптимизаторов. А та что там сделали, убрали ретурнбаг абы как, да сделали хештаблицу, всё. Остальное все пахало и пашет стабильно и исправно.
тут вовсе одни ошибки, эмм как на счет не копипастить бездумно, а потихоньку пробовать делать самому, если у вас хватило "таланта" использовать жасс, то осталось совсем немного, выучить базовые приемы написания кастомных способностей для варкравта и все у вас получится без копипастов и попрошайничества.
» WarCraft 3 / Запрет на использование способности при условии
» WarCraft 3 / таймер
Для начала нужен триггер с событием - юнит приводит способность в действие, ну и условие как ты правильно заметил что это нужная способность.
Далее в действиях этого триггера уже и нужно делать то, что тебя нужно от спелла.
У одного триггера может быть бесчисленное количество разных событий, условий и действий.
Ты хочешь щит на блок урона, это считай кастомный бафф. (все баффы способностей и есть внутри игровые триггеры, но описаны внутри движка), т.к ни одна из стандартных способностей тебя не устраивает - твоя задача на языке JASS описать кастомный бафф который тебя устроит.
Что нам нужно, ну во первых нам нужно узнать когда юнит получил урон, верно? создаем новый триггер и записываем на него через хт юнита, вешаем на триггер событие что юнит получил урон, далее нам нужно узнать что способность.
Ну и соответствующие действия.
Тут много тонкостей по которые лучше почитать в статьях.
» WarCraft 3 / таймер
» WarCraft 3 / таймер
Unholy_Shield_End должна быть описана выше чем Sosdanie_Shita_Act1
» WarCraft 3 / команда на входящий урон
Что сперва ты ждешь пока юнит применит скилл, ты записываешь в хештаблицу этого юнита, все нужные данные, а так же создаешь для него отдельный триггер, которому ставишь события, что юнит умер, юнит получает урон, время вышло, ну добавляешь триггеру условия, действия, где производишь манипуляции с юнитом в зависмости от события, на которое сработал триггер.
При уроне выше 0 и от нужных тебе юнитов, вручаешь юниту способность на 100500 хп (в моем случае я сделал способность с ро кодом 'Amhp' на 150000 хп), записываешь в хештаблицу кол-во здоровья перед ударом, и запускаешь таймер на 0.00 секунд, как он кончится, удаляешь способность и разумеется устанавливаешь хп - сколько было.
Возможны и другие реализации когда один триггер обслуживает сразу множество юнитов, к примеру отвечает за каку-нибудь пассивку на атаку вроде крита или баша (кастомного), у крипов коих десятки. Да такие варианты лучше, но они гораздо сложнее, и я не советую начинающим рассматривать их.
» WarCraft 3 / команда на входящий урон
» WarCraft 3 / Константы в jass
Ред. quq_CCCP
» WarCraft 3 / команда на входящий урон
Потом конверты гуи не юзай.
» WarCraft 3 / Константы в jass
constant - в JASS флаг, указывающий что данный обьект можно только читать, а не записывать, если тебе так проще. Других функций у него нет.
» WarCraft 3 / команда на входящий урон
Суть - Событие - Юнит получает урон, далеко не всегда удобно создавать 1 триггер на всех юнитов, и их создают динамически, по 1 для одного или нескольких юнитов, а затем удаляют.
» WarCraft 3 / Останови пандемию!
Ред. quq_CCCP
» WarCraft 3 / Константы в jass
Технически переменная которая не меняется, из за флага.
» WarCraft 3 / написал свою функцию, будет работать или нет?
Но code - это указатель на функцию, весь код твоей карты состоит из этих указателей к которым и обращается игра, их генерирует движок игры из скрипта, при загрузке карты, и сколько их было, столько и осталось, они не создаются динамически, да и удалить ты их не можешь, поэтому помещать их в переменные и обнулять незачем.
» WarCraft 3 / Оптимизация размера карты
» WarCraft 3 / написал свою функцию, будет работать или нет?
Тип code даже формально не хендл, и даже не отдельный тип, т.к в jass у тебя по идеи нет возможности чето сделать с указателем на код, т.к типы указаны строго. Code нужен лишь чтобы интерпретатор понял что ты передал в качестве аргумента указатель на функцию.
Удалять code как и плодить ты тоже не можешь стандартными средствами языка, даже boolexpr'ы не плохят указатели, условно все прибито гвоздями и функций в коде ровно столько, сколько ты описал, они не создаются динамически (если не рассматривать мемхак).
Насчет ваших 1.31+ и луа, там да может быть всякая чушь, но такое. В луа я там слышал что есть нечто отдаленно похожое и вовсе луа, такая же надстройка над виртуальной JASM машиной, но пока пруфов на русском (или инглише) нет, и я ничего не пишу по этому поводу, и вам слушать что попало тоже не советую.
» WarCraft 3 / написал свою функцию, будет работать или нет?
Да и вовсе существует событие смети.
Ну и писанина вроде local unitstate life ...
Ну не ужели ты не понимаешь что нахрен ненужно, пишется сразу GetWidgetLife( unit, ) < 0.405 и корочее и нет никаких нахрен ненужных переменных, тоже самое с code, нет никакой надобности заносить в переменные, ибо указатель на функцию ты и так передаешь через function name.
» WarCraft 3 / Анимация лица и модели рефорджа
» WarCraft 3 / Подскажите карты для 1 человека.
» WarCraft 3 / Я хочу чтоб при использовании способности на него вешался дебаф
» WarCraft 3 / Анимация лица и модели рефорджа
» WarCraft 3 / Как сделать так, чтобы вода переходила на сушу
На карте которая полностью состоит из воды поднимаешь холмы...
.
» WarCraft 3 / Я хочу чтоб при использовании способности на него вешался дебаф
» WarCraft 3 / Пойдет ли карта с 1.24 или 1.25 на 1.26
» WarCraft 3 / Выдает Missing return мб я слепой и не вижу но вроде все правиль
» WarCraft 3 / здраствуйте ставлю скиллу духовное пламя или фейзы