Ну можно ещё записать функцию в события триггера (такие функции называются действиями триггера), тогда при срабатывании события триггер вызовет записанные в него функции
Тогда можно уточнить? События триггера это вообще что? Именно на джассе, а не на конструкторе триггеров. То есть, это просто перечисление выполняемых функций, которые подробно расписаны в действиях?
ну так в первом триггере нужная информация записывается в хеш-таблицу по идентификатору юнита
Да, всё понятно. Вчера уже по хэндлу вопросы задавал здесь))) Щас просто не заметил, что всё сохраняется и в первом триггере через этого юнита. Для меня со вчера немного в диковинку эти хендлы да хеши)))
Всем спасибо! Вопрос закрыт)))
АААААААА, ясно. То есть, чтоб сработала функция, её нужно вызвать где-нибудь. По дефолту это происходит в событиях. А если есть таймер, то функция, зависящая от параметров таймера, должна быть вызвана только из таймера, а не откуда-то ещё. Правильно я понял? Clamp:
А вот таймер создает свой поток, в котором уже нету той информации от события триггера, поэтому нужно сохранять эту информацию по идентефикатору таймера
Т.е функция CheckTimer уже будет выполняться в другом потоке
Да, я так и подумал, что надо было из таймера по хэндлу таймера сохранять.
Но откуда на 3скрине(во втором триггере) загружается всё по хэндлу юнита(из первого триггера) - для меня пока загадка...это уже не про таймеры вопрос((
У меня всё работает и по вашему коду. Но посмотрите на мой ответ Hodor'у. На скринах я не сохраняю по хэндлу юнита(на первых двух). А на третьем я загружаю все данные по хэндлу этого атакованного юнита. Это тот же, что и в первом триггере.
Ну то есть, когда юнит жмёт определённую способность, то на секунду(благодаря этому таймеру) второй триггер становится ТРУ, и этот второй триггер сработает при условии, что юнита бьют. И я не понимаю, почему работает, если я раньше сравнивал кастера из первого триггера с атакованным( GetTroggerUnit() ) из второго. И я сохранял всё по хэндлу кастера из первого триггера, а загружал по хэндлу ТриггерЮнита во втором триггере. И типо так как это один и тот же юнит, то всё работало, кроме запуска таймера.
Просто посмотрите на мой ответ Hodor'у и скажите, почему во втором триггере(3 скрин) функции понимают, что этот GetTriggerUnit() - это юнит из первого триггера...
Если что: первые два скрина - один тригер, а третий - другой триггер.
Как вы вообще так шарите, не пойму:DDD Hodor:
DopaMine, теперь точка записывается по идентификатору юнита (чтобы можно было использовать на 3 скрине)
Спасибо. Пока разбираюсь, как это работает... Hodor:
и зачем на втором скриншоте в действиях триггера записаны обе функции: Attack и CheckTimer?
Да, вы правильно поняли. У меня всё заработало благодаря вашему коду.
Поясните плз, для чего нам точка-цель применения способности.
У меня был сохранён кастер-юнит в handl и по нему загружались данные в другом триггере. Щас у меня в другом триггере загружаются данные по тому же юниту. Но теперь в триггере с таймером его нету... Почему это так работает?
Вот код, что у меня. На 3-м скрине мой второй триггер, который загружает всё по хэндлу, в том числе boolean из первого триггера...
Не до конца понял, но тогда опишу и покажу триггеры, на которых это сделано.
Способность сделана по аниме Наруто(заезженная тема...)) и называется "Техника обмена". Если не знаете, что это такое, то вот логика: если юнита бьют, он может нажать кнопку и заменит себя на бревно, исчезнет(hide), появится бревно, эффекты и звук, и через 1.5 секунды появится(unhide) в точке, которая указана, как цель заклинания. А если не бьют, то ничего не произоидёт. Так же эффект работает всего 1 секунду(то есть применять типо надо прям перед ударом), а не весь кулдаун.
У способности "Техника обмена" кулдаун 5 секунд. Направленная на точку.
Есть два триггера, "CastOfObmen" включается и выключается в "Attacked".
Attacked:
Когда юнит юзает способность "Техника обмена", записываются в глобалы(а надо в хеш, видимо), а потом в локалки: кастер, точка-цель заклинания.
Включается "CastOfObmen", ждём секунду, выключается "CastOfObmen".
CastOfObmen:
Если кастер(из глобала, а надо из хеша, видимо) атакован, то:
записываются в переменные: атакованныи юнит, звук и эффекты, которые сработают, точка-позиция атакованного юнита, точка-цель заклинания из первого триггера.
Соответственно, дальше прячу юнита, создаю эффекты в его местоположении, жду 1.5 секунды(в целом, они разбиты на несколько отрезков для постепенного появления эффектов), перемещаю нашего шиноби в точку-цель заклинания и перестаю прятать его.
По логике я понимаю, что все эти данные, которые у меня в глобальных переменных - мне нужно в хеш сохранять. Хочу понять, как это сделать. И желательно переписать с триггеров на Jass, а я не особо шарю, позавчера начал делать.
На скрине1- Первыи триггер, на скринах2-3 - Второи триггер. На втором я выделил строку, чтоб было ясно, откуда читать 3 скрин.
Чтоб было понятнее, я выше описывал, в чём суть. Но там ещё на гуи, а щас ещё и на джассе есть варинт Hate:
вы полностью покажите код, скринами или скопируйте с соответствующим форматированием, а не думайте что "это неважно"
ну так Кастер - юнит, и тот кто атакован - юнит! в чем ваша проблема??
В том, что они в разных триггерах и это один и тот же юнит. И себя через себя он не может вызвать.
Он кастует в первом триггере, а во втором не кастует.
Какая команда сработает сразу в двух триггерах? Вот пример щас напишу
local unit caster = GetSpellAbilityUnit()
local location point = GetSpellTargetLoc()
local integer h = GetHandleId(caster)
call SaveUnitHandle(udg_hash,h,StringHash("caster"),caster)
call SaveLocationHandle(udg_hash,h,StringHash("point"),point)
Это был триггер номер 1
А это второи:
Мне нужно зафиксировать того же юнита. Пробую так:
local unit u = LoadUnitHandle(udg_hash,h,StringHash("caster"))
вам написали про юнита, вы продолжаете долбиться в таймер
у каждого объекта на карте есть свой хэндл, это уникальный номер, будь то таймер, юнит, или разрушаемая декорация, разница на кого сохранять нулевая
Понимаю. Ну вот представьте: в первом триггере вы жмёте абилку. Во втором триггере она срабатывает при условии, что вы атакованы. Через что вы юнита запишите таким образом, чтобы второи триггер понял, по какому ключу загружать? Для того, чтоб когда 100 человек юзали одновременно абилку, она срабатывала у каждого правильно. Hate:
Так как я в первом триггере и сохраняю, и загружаю все данные. Может, не обязательно все мне нужны в первом триггере. Но сути не меняет. Я просто не понимаю, как мне во втором триггере объявить хоть что-то из первого, что является неизменным
Doc, тогда выходит так:
В первом триггере сохраняю через кастера
local unit caster = GetSpellAbilityUnit()
local location point = GetSpellTargetLoc()
local timer t = CreateTimer()
local integer h = GetHandleId(caster)
Во втором мне нужно этого же кастера загрузить:
local unit caster = LoadUnitHandle(udg_hash,h,StringHash("caster"))
local integer h = GetHandleId(caster)
local unit caster = LoadUnitHandle(udg_hash,h,StringHash("caster"))
local location point = LoadLocationHandle(udg_hash,h,StringHash("point"))
Мне в итоге неоткуда брать этот h - ключ, по которому я всё записал...
И выскакивает ошибка в первом триггере о том, что он не понимает, что это за кастер
ну вы подумайте как передать нужные данные куда вам нужно. без скринов или кода другим людям остается гадать на кофейной гуще как вы сделали и что у вас не выходит
Для чего вы это пишите?) Чтоб я посчитал себя глупым?:D
Даже здесь есть тролли, чтолли? Hate:
ну вы подумайте как передать нужные данные куда вам нужно. без скринов или кода другим людям остается гадать на кофейной гуще как вы сделали и что у вас не выходит
Я ж говорю, что думал и пока до конца не понял. А вы рофлите(-: Hate:
ну вы подумайте как передать нужные данные куда вам нужно. без скринов или кода другим людям остается гадать на кофейной гуще как вы сделали и что у вас не выходит
Мне их надо не передать, а обратиться к ним в другом триггере так, чтоб кастеров могло быть 100000, и чтоб каждыи получил свои данные из предыдущего триггера.
Как сохранить и загрузить - ясно. А что использовать в качестве ключа, которыи есть в обоих триггерах - непонятно
Вот собственно код. На первом - первыи триггер. Там я по аналогии с уроком по хэш решил проверить, будет ли у меня работать, если я тоже хэндл старого таимера запишу. На втором - другои триггер, в нём я пытаюсь(явно неправильно) обратиться ко всем хэндлам.
никак это не работает, сами подумать не можете вообще?
Спасибо! Я думаю уже 12 часов, знаете ли. Просто непонятно, как устроено. В примере из статьи про хэш таблицы парень записывает в таблицу хэндл таимера
local timer t = CreateTimer()
local integer h = GetHandleId(t)
А в другои функции он обращается к истёкшему таимеру. А у меня, к примеру таимер истёк ещё в предыдущем триггере и я не могу его никак вызвать в новом триггере...
Я только не понимаю: 0 - это значение, с которым мы сохраняем кастера? А если кастеров много, они все будут записываться в значение 0?
parentKey - родительский ключ childKey - младший ключ
ты похоже не понимаешь как работает. хэндл у объектов разный, это просто счетчик объектов. например, создается первый футман ему перечисляют номер 1000 (1000-это условно, просто handle большие значения), спавнится второй футман он имеет номер 1001, создается третий футман 1002, создается стрелок 1003, декор 1004 итд. короче у разных кастеров не мб конфликта тк хэндлы разные
конфликты могут быть в коде, если старший и младший ключи совпадают. например 2 разных триггера, короче 2 абилки. Но имеют одинаковые ключи (первый: handle,0 второй: handle,0. Может произойти так что в одном триггере сохранишь, а в каком-нибудь втором из них перезапишешь данные. надо во втором триггере изменить младший ключ. изменить во втором во так: handle,1 - будет совсем другая ячейка)
А как это именно внутри функции с условием написать?
На гуи есть готовое решение. В разделе Boolean => HaveSavedHandle
И что такое число A?
Ну можно числа загружать из хэша
LoadInteger(Hash,id,0)>0 в разделе integer
LoadReal(Hash,id,0)>0 в разделе real
Кстати есть вот такая готовая функция BJ, не знал что есть
функция
function HaveSavedValue takes integer key, integer valueType, integer missionKey, hashtable table returns boolean
if (valueType == bj_HASHTABLE_BOOLEAN) then
return HaveSavedBoolean(table, missionKey, key)
elseif (valueType == bj_HASHTABLE_INTEGER) then
return HaveSavedInteger(table, missionKey, key)
elseif (valueType == bj_HASHTABLE_REAL) then
return HaveSavedReal(table, missionKey, key)
elseif (valueType == bj_HASHTABLE_STRING) then
return HaveSavedString(table, missionKey, key)
elseif (valueType == bj_HASHTABLE_HANDLE) then
return HaveSavedHandle(table, missionKey, key)
else
// Unrecognized value type - ignore the request.
return false
endif
endfunction
Спасибо за помощь, буду обдумывать, я всё ближе и ближе к окончательному пониманию)) Steal nerves:
((цитата
Кстати есть вот такая готовая функция BJ, в разделе boolean. не знал что есть
» функция
Я так понял, она проверяет, есть ли хоть какое-то значение в таблице? И если его нет, то дальше не будет работать Doc:
Нет дефолтного "глобального" хеша, сначала создаем глобальную переменную типа hashtable (например назовем ее mytable), делаем InitHashtable, затем SaveUnitHandle(mytable, GetHandleId(caster), 0, target), затем, чтобы по caster достать target - LoadUnitHandle(mytable, GetHandleId(caster), 0)
Соответственно твой второй триггер на событие атаки должен быть всегда включен и должен проверять, что хештаблица что-либо содержит (вместо условия что есть сейчас). + нужно делать RemoveSavedHandle для очистки в самом конце.
Первыи триггер готов. Теперь поподробнее: откуда второи триггер знает, что такое "caster", когда я пишу к примеру во втором триггере:
local unit newcaster = LoadUnitHandle(mytable,GetHandleId(caster),0)
??? Как это работает? caster - это же локальная переменная...
Да, все так. Второй ключ нужен на случай конфликта первичных ключей, т.е. когда хочется хранить больше данных по одному хендлу.
Я тут соглашусь, что с кастом скриптом будет сложновато, т.к. уже пойдут условия и т.д. и лучше попробовать все это уже чистым текстом выразить.
Хорошо, спасибо! А вы писАли, что нужно проверять, есть ли что-то в хэш таблице, это надо запрашивать пару? Не знаю, как логически это будет,
function ProverkaHesha takes nothing returns boolean
return GetВТаблицеСодержитсяЧто-то() == "mytable, GetHandleId(caster), 0, target"
endfinction
Так по логике? И что тогда за Get должен быть? Или я вообще не понял:DDD
Я только не понимаю: 0 - это значение, с которым мы сохраняем кастера? А если кастеров много, они все будут записываться в значение 0?
Конфликтовать не будут, так как мы сохраняем пары id конкретного кастера + значение - 0. И когда мы достаём кастера из значения 0, как таблица понимает, какои id у этого кастера? Если все кастеры будут со значением 0... Clamp:
И желательно переписать с триггеров на Jass, а я не особо шарю, позавчера начал делать.
Учитывая обилие custom script в триггерах, тебе будет проще работать с твоим кодом, если ты его конвертируешь в Jass напрямую.
Вообще пользоваться GUI и не переходить на нормальное представление кода есть смысл только если ты вообще не знаешь ничего о программировании и не планируешь узнавать, например, если ты чисто моделлер или ландшафтер.
Я немного представляю. Поэтому и понимаю логику локальных переменных, и понимаю, почему у меня не работает для нескольких кастеров. Но с хэш-таблицами пока не понял, как это: значение кастера всегда 0, но когда мы загружаем кастера по значению 0, таблица понимает, какого кастера я загружаю. Как это? Ключ одинаков для всех кастеров, получается. Я прав? DopaMine:
Я немного представляю. Поэтому и понимаю логику локальных переменных, и понимаю, почему у меня не работает для нескольких кастеров. Но с хэш-таблицами пока не понял, как это: значение кастера всегда 0, но когда мы загружаем кастера по значению 0, таблица понимает, какого кастера я загружаю. Как это? Ключ одинаков для всех кастеров, получается. Я прав?
А, мы загружаем тоже по паре ключиков, ясно. СПАСИБО ВСЕМ!
Нет дефолтного "глобального" хеша, сначала создаем глобальную переменную типа hashtable (например назовем ее mytable), делаем InitHashtable, затем SaveUnitHandle(mytable, GetHandleId(caster), 0, target), затем, чтобы по caster достать target - LoadUnitHandle(mytable, GetHandleId(caster), 0)
Спасибо, буду разбираться тогда. Сложновато чё-то.
DopaMine, что вы хотите сделать? просто зачем вам хэш?
есть статья
просто для начала нужна ссылка на объект хэндл, чтобы получить GetHandleId(<object>). Или как-то записать или как-то по логике вызывается. Я просто напишу примеры для понимания как это работает. Хэндл этот просто помогает хранить/доставать данные, короче работать с ячейками
пример магазина, также можно сделать склад
как пример на jass
триггер 1 - продаем в магазин
событие - юнит закладывает в лавку (у нас 3 вар переменные: продавец и покупатель, предмет item, который продают в магазин)
допустим мы можем сохранить item в хэш-таблицу по ключам GetHandleId(<покупатель>)
также в хэш можно записать разные данные вроде тип, заряды, номер слота и пр
триггер 2 - выкупаем из магазина (аналогично 3 вар переменные, только роли продавца и покупателя меняются местами)
событие - юнит закладывает из лавки
допустим предмет удаляется из магазина, нам нужно из таблицы в данных магазина удалить этот предмет. с помощью хэндла магазина GetHandleId(продавец). С помощью вар переменной item можно достать тип и др данные хранящие в хэндле GetHandleId(продавец)
ваш случай
А триггера два, так как когда юнит жмёт способность, она сработает только если этот юнит атакован, в противном случае - просто идёт кулдаун. Как это сделать в одном триггере - хз.
Не знаю что хотите сделать. Но примерно догадываюсь, но это можно подкорректировать. Можно в атакующем юните хранить boolean b (да/нет), по хэндлу атакующего сохранять. Этот флаг будет говорить находится ли в кулдауне или нет.
Триггер 1 - при атаке загружаем boolean b по хэндлу атакующего и проверяем. Если boolean b вернет истину, то ваши действия.
Триггер 2 - при активации абилки запускаем таймер. Сохраняем в хэше boolean b = true (истина). Таймер длится столько сколько в кулдауне указано. По истечению таймера boolean b = false (ложь). Можно просто очистить хэш.
Не до конца понял, но тогда опишу и покажу триггеры, на которых это сделано.
Способность сделана по аниме Наруто(заезженная тема...)) и называется "Техника обмена". Если не знаете, что это такое, то вот логика: если юнита бьют, он может нажать кнопку и заменит себя на бревно, исчезнет(hide), появится бревно, эффекты и звук, и через 1.5 секунды появится(unhide) в точке, которая указана, как цель заклинания. А если не бьют, то ничего не произоидёт. Так же эффект работает всего 1 секунду(то есть применять типо надо прям перед ударом), а не весь кулдаун.
У способности "Техника обмена" кулдаун 5 секунд. Направленная на точку.
Есть два триггера, "CastOfObmen" включается и выключается в "Attacked".
Attacked:
Когда юнит юзает способность "Техника обмена", записываются в глобалы(а надо в хеш, видимо), а потом в локалки: кастер, точка-цель заклинания.
Включается "CastOfObmen", ждём секунду, выключается "CastOfObmen".
CastOfObmen:
Если кастер(из глобала, а надо из хеша, видимо) атакован, то:
записываются в переменные: атакованныи юнит, звук и эффекты, которые сработают, точка-позиция атакованного юнита, точка-цель заклинания из первого триггера.
Соответственно, дальше прячу юнита, создаю эффекты в его местоположении, жду 1.5 секунды(в целом, они разбиты на несколько отрезков для постепенного появления эффектов), перемещаю нашего шиноби в точку-цель заклинания и перестаю прятать его.
По логике я понимаю, что все эти данные, которые у меня в глобальных переменных - мне нужно в хеш сохранять. Хочу понять, как это сделать. И желательно переписать с триггеров на Jass, а я не особо шарю, позавчера начал делать.
На скрине1- Первыи триггер, на скринах2-3 - Второи триггер. На втором я выделил строку, чтоб было ясно, откуда читать 3 скрин.
» WarCraft 3 / CreateTimer
» WarCraft 3 / CreateTimer
Всем спасибо! Вопрос закрыт)))
» WarCraft 3 / CreateTimer
Clamp:
» WarCraft 3 / CreateTimer
Но откуда на 3скрине(во втором триггере) загружается всё по хэндлу юнита(из первого триггера) - для меня пока загадка...это уже не про таймеры вопрос((
Ред. DopaMine
» WarCraft 3 / CreateTimer
Ну то есть, когда юнит жмёт определённую способность, то на секунду(благодаря этому таймеру) второй триггер становится ТРУ, и этот второй триггер сработает при условии, что юнита бьют. И я не понимаю, почему работает, если я раньше сравнивал кастера из первого триггера с атакованным( GetTroggerUnit() ) из второго. И я сохранял всё по хэндлу кастера из первого триггера, а загружал по хэндлу ТриггерЮнита во втором триггере. И типо так как это один и тот же юнит, то всё работало, кроме запуска таймера.
Просто посмотрите на мой ответ Hodor'у и скажите, почему во втором триггере(3 скрин) функции понимают, что этот GetTriggerUnit() - это юнит из первого триггера...
Как вы вообще так шарите, не пойму:DDD
Hodor:
Hodor:
» WarCraft 3 / CreateTimer
Поясните плз, для чего нам точка-цель применения способности.
У меня был сохранён кастер-юнит в handl и по нему загружались данные в другом триггере. Щас у меня в другом триггере загружаются данные по тому же юниту. Но теперь в триггере с таймером его нету... Почему это так работает?
Вот код, что у меня. На 3-м скрине мой второй триггер, который загружает всё по хэндлу, в том числе boolean из первого триггера...
Steal nerves:
» WarCraft 3 / Как на Jass'е вернуть уникальное ID юнита и записать в локалку?
» WarCraft 3 / Как на Jass'е вернуть уникальное ID юнита и записать в локалку?
Ред. PT153
» WarCraft 3 / Как на Jass'е вернуть уникальное ID юнита и записать в локалку?
Hate:
» WarCraft 3 / Как на Jass'е вернуть уникальное ID юнита и записать в локалку?
Hate: Второи именно триггер. Срабатывает, когда после нажатия абилки(в первом триггере) кастер атакован.
» WarCraft 3 / Как на Jass'е вернуть уникальное ID юнита и записать в локалку?
» WarCraft 3 / Как на Jass'е вернуть уникальное ID юнита и записать в локалку?
Какая команда сработает сразу в двух триггерах? Вот пример щас напишу
local unit caster = GetSpellAbilityUnit()
local location point = GetSpellTargetLoc()
local integer h = GetHandleId(caster)
call SaveUnitHandle(udg_hash,h,StringHash("caster"),caster)
call SaveLocationHandle(udg_hash,h,StringHash("point"),point)
А это второи:
» WarCraft 3 / Как на Jass'е вернуть уникальное ID юнита и записать в локалку?
А юнита с какого ключа достать тогда?
» WarCraft 3 / Как на Jass'е вернуть уникальное ID юнита и записать в локалку?
Hate: Во втором есть спецэффекты. Которых нет в первом
» WarCraft 3 / Как на Jass'е вернуть уникальное ID юнита и записать в локалку?
Ред. PT153
» WarCraft 3 / Как на Jass'е вернуть уникальное ID юнита и записать в локалку?
В первом триггере сохраняю через кастера
local unit caster = GetSpellAbilityUnit()
local location point = GetSpellTargetLoc()
local timer t = CreateTimer()
local integer h = GetHandleId(caster)
local unit caster = LoadUnitHandle(udg_hash,h,StringHash("caster"))
local integer h = GetHandleId(caster)
local unit caster = LoadUnitHandle(udg_hash,h,StringHash("caster"))
local location point = LoadLocationHandle(udg_hash,h,StringHash("point"))
Ред. PT153
» WarCraft 3 / Как на Jass'е вернуть уникальное ID юнита и записать в локалку?
Даже здесь есть тролли, чтолли?
Hate: Я ж говорю, что думал и пока до конца не понял. А вы рофлите(-:
Hate: Мне их надо не передать, а обратиться к ним в другом триггере так, чтоб кастеров могло быть 100000, и чтоб каждыи получил свои данные из предыдущего триггера.
Как сохранить и загрузить - ясно. А что использовать в качестве ключа, которыи есть в обоих триггерах - непонятно
Вот собственно код. На первом - первыи триггер. Там я по аналогии с уроком по хэш решил проверить, будет ли у меня работать, если я тоже хэндл старого таимера запишу. На втором - другои триггер, в нём я пытаюсь(явно неправильно) обратиться ко всем хэндлам.
» WarCraft 3 / Как на Jass'е вернуть уникальное ID юнита и записать в локалку?
local timer t = CreateTimer()
local integer h = GetHandleId(t)
А в другои функции он обращается к истёкшему таимеру. А у меня, к примеру таимер истёк ещё в предыдущем триггере и я не могу его никак вызвать в новом триггере...
» WarCraft 3 / Как на Jass'е вернуть уникальное ID юнита и записать в локалку?
Steal nerves:
» функция
Я так понял, она проверяет, есть ли хоть какое-то значение в таблице? И если его нет, то дальше не будет работать
Doc: Первыи триггер готов. Теперь поподробнее: откуда второи триггер знает, что такое "caster", когда я пишу к примеру во втором триггере:
local unit newcaster = LoadUnitHandle(mytable,GetHandleId(caster),0)
??? Как это работает? caster - это же локальная переменная...
» WarCraft 3 / Как на Jass'е вернуть уникальное ID юнита и записать в локалку?
написать? И что такое число A?
» WarCraft 3 / Как на Jass'е вернуть уникальное ID юнита и записать в локалку?
function ProverkaHesha takes nothing returns boolean
return GetВТаблицеСодержитсяЧто-то() == "mytable, GetHandleId(caster), 0, target"
endfinction
Так по логике? И что тогда за Get должен быть? Или я вообще не понял:DDD
Ред. PT153
» WarCraft 3 / Как на Jass'е вернуть уникальное ID юнита и записать в локалку?
Конфликтовать не будут, так как мы сохраняем пары id конкретного кастера + значение - 0. И когда мы достаём кастера из значения 0, как таблица понимает, какои id у этого кастера? Если все кастеры будут со значением 0...
Clamp: Я немного представляю. Поэтому и понимаю логику локальных переменных, и понимаю, почему у меня не работает для нескольких кастеров. Но с хэш-таблицами пока не понял, как это: значение кастера всегда 0, но когда мы загружаем кастера по значению 0, таблица понимает, какого кастера я загружаю. Как это? Ключ одинаков для всех кастеров, получается. Я прав?
DopaMine: А, мы загружаем тоже по паре ключиков, ясно. СПАСИБО ВСЕМ!
» WarCraft 3 / Как на Jass'е вернуть уникальное ID юнита и записать в локалку?
» WarCraft 3 / Как на Jass'е вернуть уникальное ID юнита и записать в локалку?
Способность сделана по аниме Наруто(заезженная тема...)) и называется "Техника обмена". Если не знаете, что это такое, то вот логика: если юнита бьют, он может нажать кнопку и заменит себя на бревно, исчезнет(hide), появится бревно, эффекты и звук, и через 1.5 секунды появится(unhide) в точке, которая указана, как цель заклинания. А если не бьют, то ничего не произоидёт. Так же эффект работает всего 1 секунду(то есть применять типо надо прям перед ударом), а не весь кулдаун.
Есть два триггера, "CastOfObmen" включается и выключается в "Attacked".
Attacked:
Когда юнит юзает способность "Техника обмена", записываются в глобалы(а надо в хеш, видимо), а потом в локалки: кастер, точка-цель заклинания.
Включается "CastOfObmen", ждём секунду, выключается "CastOfObmen".
CastOfObmen:
Если кастер(из глобала, а надо из хеша, видимо) атакован, то:
записываются в переменные: атакованныи юнит, звук и эффекты, которые сработают, точка-позиция атакованного юнита, точка-цель заклинания из первого триггера.
Соответственно, дальше прячу юнита, создаю эффекты в его местоположении, жду 1.5 секунды(в целом, они разбиты на несколько отрезков для постепенного появления эффектов), перемещаю нашего шиноби в точку-цель заклинания и перестаю прятать его.
По логике я понимаю, что все эти данные, которые у меня в глобальных переменных - мне нужно в хеш сохранять. Хочу понять, как это сделать. И желательно переписать с триггеров на Jass, а я не особо шарю, позавчера начал делать.
На скрине1- Первыи триггер, на скринах2-3 - Второи триггер. На втором я выделил строку, чтоб было ясно, откуда читать 3 скрин.
» WarCraft 3 / Как на Jass'е вернуть уникальное ID юнита и записать в локалку?