Ломаю голову: хочу сделать так, чтоб в зону входил юнит, и выводился на экран в типе string, к примеру, ID этого юнита(не ID типа юнита, а ID юнита!). Не знаю, как к нему обратиться. И я не понял, в каком типе данных оно хранится. Как я понял - integer. На скринах просто показано, как по дефолту работает отображение уровня юнита при входе в зону. Думаю, должно быть похоже чем-то. Если тема заезженная, подскажите, где искать плз.
screen0 - на триггерах(с конвертированием to string).
screen1 - просто конвертировал в текст на jass. Утечки не устранял.
screen0 - на триггерах(с конвертированием to string).
screen1 - просто конвертировал в текст на jass. Утечки не устранял.
Принятый ответ
Мне в итоге неоткуда брать этот h - ключ, по которому я всё записал...
Это будет юнит, которого атаковали т.е. GetTriggerUnit(). Вся задача шаринга между несколькими триггерами в том, чтобы определить какие данные между этими триггерами у нас уже есть общие и отталкиваясь от них записать другие данные в хеш. В данном случае мы вешаем данные на GetSpellAbilityUnit() и загружаем по GetTriggerUnit(). Самого кастера, как я понимаю, здесь записывать никуда не нужно.
А некоторым комментаторам советую постыдиться, редкий случай, когда человек сам что-то пытается понять и пробует что-то делать, а вам лишь бы эго потешить.
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Способность сделана по аниме Наруто(заезженная тема...)) и называется "Техника обмена". Если не знаете, что это такое, то вот логика: если юнита бьют, он может нажать кнопку и заменит себя на бревно, исчезнет(hide), появится бревно, эффекты и звук, и через 1.5 секунды появится(unhide) в точке, которая указана, как цель заклинания. А если не бьют, то ничего не произоидёт. Так же эффект работает всего 1 секунду(то есть применять типо надо прям перед ударом), а не весь кулдаун.
Есть два триггера, "CastOfObmen" включается и выключается в "Attacked".
Attacked:
Когда юнит юзает способность "Техника обмена", записываются в глобалы(а надо в хеш, видимо), а потом в локалки: кастер, точка-цель заклинания.
Включается "CastOfObmen", ждём секунду, выключается "CastOfObmen".
CastOfObmen:
Если кастер(из глобала, а надо из хеша, видимо) атакован, то:
записываются в переменные: атакованныи юнит, звук и эффекты, которые сработают, точка-позиция атакованного юнита, точка-цель заклинания из первого триггера.
Соответственно, дальше прячу юнита, создаю эффекты в его местоположении, жду 1.5 секунды(в целом, они разбиты на несколько отрезков для постепенного появления эффектов), перемещаю нашего шиноби в точку-цель заклинания и перестаю прятать его.
По логике я понимаю, что все эти данные, которые у меня в глобальных переменных - мне нужно в хеш сохранять. Хочу понять, как это сделать. И желательно переписать с триггеров на Jass, а я не особо шарю, позавчера начал делать.
На скрине1- Первыи триггер, на скринах2-3 - Второи триггер. На втором я выделил строку, чтоб было ясно, откуда читать 3 скрин.
Отредактирован Doc
Соответственно твой второй триггер на событие атаки должен быть всегда включен и должен проверять, что хештаблица что-либо содержит (вместо условия что есть сейчас). + нужно делать RemoveSavedHandle для очистки в самом конце.
Отредактирован PT153
Конфликтовать не будут, так как мы сохраняем пары id конкретного кастера + значение - 0. И когда мы достаём кастера из значения 0, как таблица понимает, какои id у этого кастера? Если все кастеры будут со значением 0...
Clamp: Я немного представляю. Поэтому и понимаю логику локальных переменных, и понимаю, почему у меня не работает для нескольких кастеров. Но с хэш-таблицами пока не понял, как это: значение кастера всегда 0, но когда мы загружаем кастера по значению 0, таблица понимает, какого кастера я загружаю. Как это? Ключ одинаков для всех кастеров, получается. Я прав?
DopaMine: А, мы загружаем тоже по паре ключиков, ясно. СПАСИБО ВСЕМ!
Отредактирован Doc
function ProverkaHesha takes nothing returns boolean
return GetВТаблицеСодержитсяЧто-то() == "mytable, GetHandleId(caster), 0, target"
endfinction
Так по логике? И что тогда за Get должен быть? Или я вообще не понял:DDD
проверка хэндла
обычно изначально в ячейках если ничего не записано, то вернет 0 или null
написать? И что такое число A?
Отредактирован MpW
childKey - младший ключ
ты похоже не понимаешь как работает. хэндл у объектов разный, это просто счетчик объектов. например, создается первый футман ему перечисляют номер 1000 (1000-это условно, просто handle берет большие значения), спавнится второй футман он имеет номер 1001, создается третий футман 1002, создается стрелок 1003, декор 1004 итд. короче у разных кастеров не мб конфликта тк хэндлы разные
конфликты могут быть в коде, если старший и младший ключи совпадают. например 2 разных триггера, короче 2 абилки. Но имеют одинаковые ключи (первый: handle,0 второй: handle,0. Может произойти так что в одном триггере сохранишь, а в каком-нибудь втором из них перезапишешь данные. надо во втором триггере изменить младший ключ. изменить во втором во так: handle,1 - будет совсем другая ячейка) На гуи есть готовое решение. В разделе Boolean => HaveSavedHandle Ну можно числа загружать из хэша
Steal nerves:
» функция
Я так понял, она проверяет, есть ли хоть какое-то значение в таблице? И если его нет, то дальше не будет работать
Doc: Первыи триггер готов. Теперь поподробнее: откуда второи триггер знает, что такое "caster", когда я пишу к примеру во втором триггере:
local unit newcaster = LoadUnitHandle(mytable,GetHandleId(caster),0)
??? Как это работает? caster - это же локальная переменная...