Как на Jass'е вернуть уникальное ID юнита и записать в локалку?
Ломаю голову: хочу сделать так, чтоб в зону входил юнит, и выводился на экран в типе string, к примеру, ID этого юнита(не ID типа юнита, а ID юнита!). Не знаю, как к нему обратиться. И я не понял, в каком типе данных оно хранится. Как я понял - integer. На скринах просто показано, как по дефолту работает отображение уровня юнита при входе в зону. Думаю, должно быть похоже чем-то. Если тема заезженная, подскажите, где искать плз.
screen0 - на триггерах(с конвертированием to string).
screen1 - просто конвертировал в текст на jass. Утечки не устранял.

Лучший ответ:
Мне в итоге неоткуда брать этот h - ключ, по которому я всё записал...
Это будет юнит, которого атаковали т.е. GetTriggerUnit(). Вся задача шаринга между несколькими триггерами в том, чтобы определить какие данные между этими триггерами у нас уже есть общие и отталкиваясь от них записать другие данные в хеш. В данном случае мы вешаем данные на GetSpellAbilityUnit() и загружаем по GetTriggerUnit(). Самого кастера, как я понимаю, здесь записывать никуда не нужно.
А некоторым комментаторам советую постыдиться, редкий случай, когда человек сам что-то пытается понять и пробует что-то делать, а вам лишь бы эго потешить.



Просмотров: 248

» Лучшие комментарии


Steal nerves #1 - 2 недели назад (отредактировано ) 1
еще один чувак, который не умеет выражать свои мысли и что ему надо. Не совсем понятно, что вам нужно.

Если вы хотите знать кто зашел, то можно строкой выводить на экран. Выводите имя юнита. GetUnitName(<unit>) точнее вам будет название типа юнита, как в редакторе назвали юнита так и будет. Например, пехотинец, лучник итд
ID этого юнита(не ID типа юнита, а ID юнита!)
Если вам нужен не ID типа юнит, то что это за ID юнит? мб handle юнита? handle - номер объекта, у разных объектов разные номера. Но счетчики там большие. Есть нативка определения хэндла
GetHandleId(<unit>), которое возвращает целое число integer. короче номер объекта. не только юнита, можно любой наследник-объект хэндла (итем, декор, юниты, группа, олния и пр)
чтобы вывести строку на экран, нужно конвентировать число в строку I2S(<integer>)
на jass функция GetUnitTypeId(<unit>) возвращает id-тип, короче число. К примеру 'hfoo' - равкод футмана. мне лень просто объяснять вот
еще одна функция
GetObjectName(<id-object>) - в эту функцию вписываешь номер, целочисленное число. Короче тип объекта id-object. Это мб ид-юнит, ид-предмет, ид-декор, ид-абилы и др
DopaMine #2 - 2 недели назад (отредактировано ) 0
Steal nerves:
еще один чувак, который не умеет выражать свои мысли и что ему надо. Не совсем понятно, что вам нужно.

Если вы хотите знать кто зашел, то можно строкой выводить на экран. Выводите имя юнита. GetUnitName(<unit>)
ID этого юнита(не ID типа юнита, а ID юнита!)
Если вам нужен не ID типа юнит, то что это за ID юнит? мб handle юнита? handle - номер объекта, у разных объектов разные номера. Есть нативка определения хэндла
GetHandleId(<unit>), которое возвращает целое число integer. короче номер объекта
чтобы вывести строку на экран, нужно конвентировать число в строку I2S(<integer>)
Да, это то, что мне нужно. Я хз, как это правильно назвать:D спасибо. А как сохранить этот ID объекта в хэш и из другого триггера обратиться к нему?
Я просто сделал сложную способность на обычных командах(в редакторе триггеров, а не на jasse). Она работает для одного юнита. Но для нескольких юнитов, которые юзают одновременно, не работает, так как в способности участвуют два триггера и для обращения к значению из первого триггера я использовал глобальную переменную и обратился к неи во втором триггере. Как я понял, мне нужно в первом триггере сохранить юзающего юнита в хэш-таблицу и во втором триггере обратиться к этому значению. Так можно сделать? Я пока не понимаю, как без глобальных переменных обращаться к другому триггеру.
А триггера два, так как когда юнит жмёт способность, она сработает только если этот юнит атакован, в противном случае - просто идёт кулдаун. Как это сделать в одном триггере - хз.
Как это всё гуглить - не понял( Помогите, чем можете плз)
Doc #3 - 2 недели назад 1
Собственно GetHandleId возвращает integer, по нему и сохраняй то, что нужно в хеш-таблицу, а затем доставай.
DopaMine #4 - 2 недели назад (отредактировано ) 0
Doc:
Собственно GetHandleId возвращает integer, по нему и сохраняй то, что нужно в хеш-таблицу, а затем доставай.
Поясните команды: 1)с помощью которых я глобально занесу в хэш id объекта
2)Которая во втором триггере обратится к хэшу и вернёт id объекта из предыдущего триггера. Как таблице понять, ID какого именно объекта я хочу достать?
На скрине реализован вызов ID и вывод на экран.
Вот скрин
прикреплены файлы
8gabriel8 #5 - 2 недели назад 1
Нет скринов, указывай ссылки на них, когда загрузишь.
DopaMine #6 - 2 недели назад 0
8gabriel8:
Нет скринов, указывай ссылки на них, когда загрузишь.
прикреплены файлы
Steal nerves #7 - 2 недели назад (отредактировано ) 1
DopaMine, что вы хотите сделать? просто зачем вам хэш?
есть статья
просто для начала нужна ссылка на объект хэндл, чтобы получить GetHandleId(<object>). Или как-то записать или как-то по логике вызывается. Я просто напишу примеры для понимания как это работает. Хэндл этот просто помогает хранить/доставать данные, короче работать с ячейками
» пример магазина, также можно сделать склад
как пример на jass
триггер 1 - продаем в магазин
событие - юнит закладывает в лавку (у нас 3 вар переменные: продавец и покупатель, предмет item, который продают в магазин. Эти 3 переменные-константы вызываемые при событии)
допустим мы можем сохранить item в хэш-таблицу по ключам. Это нужно для того, чтобы знать что есть в магазине. Какие предметы хранятся в магазине, в каком слоте, сколько зарядов. Просто нет никаких доп нативок для узнавания, поэтому мы импровизируем, создаем свою базу данных. Этот хэндл сыграл существенную роль
GetHandleId(<покупатель>)
также в хэш можно записать разные данные вроде тип, заряды, номер слота и пр
триггер 2 - выкупаем из магазина (аналогично 3 вар переменные, только роли продавца и покупателя меняются местами)
событие - юнит закладывает из лавки
допустим предмет удаляется из магазина, нам нужно из таблицы в данных магазина удалить этот предмет. с помощью хэндла магазина GetHandleId(продавец). С помощью вар переменной item можно достать тип и др данные хранящие в хэндле GetHandleId(продавец)
» ваш случай
А триггера два, так как когда юнит жмёт способность, она сработает только если этот юнит атакован, в противном случае - просто идёт кулдаун. Как это сделать в одном триггере - хз.
Не знаю что хотите сделать. Но примерно догадываюсь, но это можно подкорректировать. Можно в атакующем юните хранить boolean b (да/нет), по хэндлу атакующего сохранять. Этот флаг будет говорить находится ли в кулдауне или нет.
Триггер 1 - при атаке загружаем boolean b по хэндлу атакующего и проверяем. Если boolean b вернет истину, то ваши действия.
Триггер 2 - при активации абилки запускаем таймер. Сохраняем в хэше boolean b = true (истина). Таймер длится столько сколько в кулдауне указано. По истечению таймера boolean b = false (ложь). Можно просто очистить хэш.
DopaMine #8 - 2 недели назад 0
Steal nerves:
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 скрин.
прикреплены файлы
Doc #9 - 2 недели назад (отредактировано ) 1
Нет дефолтного "глобального" хеша, сначала создаем глобальную переменную типа hashtable (например назовем ее mytable), делаем InitHashtable, затем SaveUnitHandle(mytable, GetHandleId(caster), 0, target), затем, чтобы по caster достать target - LoadUnitHandle(mytable, GetHandleId(caster), 0)
Соответственно твой второй триггер на событие атаки должен быть всегда включен и должен проверять, что хештаблица что-либо содержит (вместо условия что есть сейчас). + нужно делать RemoveSavedHandle для очистки в самом конце.
DopaMine #10 - 2 недели назад 0
Doc:
Нет дефолтного "глобального" хеша, сначала создаем глобальную переменную типа hashtable (например назовем ее mytable), делаем InitHashtable, затем SaveUnitHandle(mytable, GetHandleId(caster), 0, target), затем, чтобы по caster достать target - LoadUnitHandle(mytable, GetHandleId(caster), 0)
Спасибо, буду разбираться тогда. Сложновато чё-то.
Clamp #11 - 2 недели назад 1
И желательно переписать с триггеров на Jass, а я не особо шарю, позавчера начал делать.
Учитывая обилие custom script в триггерах, тебе будет проще работать с твоим кодом, если ты его конвертируешь в Jass напрямую.

Вообще пользоваться GUI и не переходить на нормальное представление кода есть смысл только если ты вообще не знаешь ничего о программировании и не планируешь узнавать, например, если ты чисто моделлер или ландшафтер.
DopaMine #12 - 2 недели назад (отредактировано ) 0
SaveUnitHandle(mytable, GetHandleId(caster), 0, target)
Я только не понимаю: 0 - это значение, с которым мы сохраняем кастера? А если кастеров много, они все будут записываться в значение 0?
Конфликтовать не будут, так как мы сохраняем пары id конкретного кастера + значение - 0. И когда мы достаём кастера из значения 0, как таблица понимает, какои id у этого кастера? Если все кастеры будут со значением 0...
Clamp:
И желательно переписать с триггеров на Jass, а я не особо шарю, позавчера начал делать.
Учитывая обилие custom script в триггерах, тебе будет проще работать с твоим кодом, если ты его конвертируешь в Jass напрямую.

Вообще пользоваться GUI и не переходить на нормальное представление кода есть смысл только если ты вообще не знаешь ничего о программировании и не планируешь узнавать, например, если ты чисто моделлер или ландшафтер.
Я немного представляю. Поэтому и понимаю логику локальных переменных, и понимаю, почему у меня не работает для нескольких кастеров. Но с хэш-таблицами пока не понял, как это: значение кастера всегда 0, но когда мы загружаем кастера по значению 0, таблица понимает, какого кастера я загружаю. Как это? Ключ одинаков для всех кастеров, получается. Я прав?
DopaMine:
Я немного представляю. Поэтому и понимаю логику локальных переменных, и понимаю, почему у меня не работает для нескольких кастеров. Но с хэш-таблицами пока не понял, как это: значение кастера всегда 0, но когда мы загружаем кастера по значению 0, таблица понимает, какого кастера я загружаю. Как это? Ключ одинаков для всех кастеров, получается. Я прав?
А, мы загружаем тоже по паре ключиков, ясно. СПАСИБО ВСЕМ!
Doc #13 - 2 недели назад (отредактировано ) 1
Да, все так. Второй ключ нужен на случай конфликта первичных ключей, т.е. когда хочется хранить больше данных по одному хендлу.
Я тут соглашусь, что с кастом скриптом будет сложновато, т.к. уже пойдут условия и т.д. и лучше попробовать все это уже чистым текстом выразить.
DopaMine #14 - 2 недели назад 0
Doc:
Да, все так. Второй ключ нужен на случай конфликта первичных ключей, т.е. когда хочется хранить больше данных по одному хендлу.
Я тут соглашусь, что с кастом скриптом будет сложновато, т.к. уже пойдут условия и т.д. и лучше попробовать все это уже чистым текстом выразить.
Хорошо, спасибо! А вы писАли, что нужно проверять, есть ли что-то в хэш таблице, это надо запрашивать пару? Не знаю, как логически это будет,
function ProverkaHesha takes nothing returns boolean
return GetВТаблицеСодержитсяЧто-то() == "mytable, GetHandleId(caster), 0, target"
endfinction
Так по логике? И что тогда за Get должен быть? Или я вообще не понял:DDD
Steal nerves #15 - 2 недели назад 1
вот проверка тема
проверка хэндла
native HaveSavedHandle takes hashtable table, integer parentKey, integer childKey returns boolean
проверка числа integer или real проверяем условием A>0
обычно изначально в ячейках если ничего не записано, то вернет 0 или null
DopaMine #16 - 2 недели назад 0
Steal nerves:
вот проверка тема
проверка хэндла
native HaveSavedHandle takes hashtable table, integer parentKey, integer childKey returns boolean
проверка числа integer или real проверяем условием A>0
обычно изначально в ячейках если ничего не записано, то вернет 0 или null
Хмм...( А как это именно внутри функции с условием
написать? И что такое число A?
Steal nerves #17 - 2 недели назад (отредактировано ) 0
Я только не понимаю: 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, в разделе boolean. не знал что есть
» функция
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
DopaMine #18 - 2 недели назад 0
Steal nerves:
Я только не понимаю: 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 - это же локальная переменная...
Hate #19 - 2 недели назад 0
никак это не работает, сами подумать не можете вообще?
DopaMine #20 - 2 недели назад 0
Hate:
никак это не работает, сами подумать не можете вообще?
Спасибо! Я думаю уже 12 часов, знаете ли. Просто непонятно, как устроено. В примере из статьи про хэш таблицы парень записывает в таблицу хэндл таимера
local timer t = CreateTimer()
local integer h = GetHandleId(t)
А в другои функции он обращается к истёкшему таимеру. А у меня, к примеру таимер истёк ещё в предыдущем триггере и я не могу его никак вызвать в новом триггере...
Hate #21 - 2 недели назад 0
ну вы подумайте как передать нужные данные куда вам нужно. без скринов или кода другим людям остается гадать на кофейной гуще как вы сделали и что у вас не выходит
DopaMine #22 - 2 недели назад (отредактировано ) 0
Hate:
ну вы подумайте как передать нужные данные куда вам нужно. без скринов или кода другим людям остается гадать на кофейной гуще как вы сделали и что у вас не выходит
Для чего вы это пишите?) Чтоб я посчитал себя глупым?:D
Даже здесь есть тролли, чтолли?
Hate:
ну вы подумайте как передать нужные данные куда вам нужно. без скринов или кода другим людям остается гадать на кофейной гуще как вы сделали и что у вас не выходит
Я ж говорю, что думал и пока до конца не понял. А вы рофлите(-:
Hate:
ну вы подумайте как передать нужные данные куда вам нужно. без скринов или кода другим людям остается гадать на кофейной гуще как вы сделали и что у вас не выходит
Мне их надо не передать, а обратиться к ним в другом триггере так, чтоб кастеров могло быть 100000, и чтоб каждыи получил свои данные из предыдущего триггера.
Как сохранить и загрузить - ясно. А что использовать в качестве ключа, которыи есть в обоих триггерах - непонятно
Вот собственно код. На первом - первыи триггер. Там я по аналогии с уроком по хэш решил проверить, будет ли у меня работать, если я тоже хэндл старого таимера запишу. На втором - другои триггер, в нём я пытаюсь(явно неправильно) обратиться ко всем хэндлам.
То, что ниже и не видно - не играет роли.
прикреплены файлы
Doc #23 - 2 недели назад (отредактировано ) 0
DopaMine, отталкиваться нужно от имеющихся данных, в Вашем случае сохранять данные в первом триггере нужно на юнита, которого атакуют во втором
DopaMine #24 - 2 недели назад (отредактировано ) 0
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 - ключ, по которому я всё записал...

И выскакивает ошибка в первом триггере о том, что он не понимает, что это за кастер
прикреплены файлы
Hate #25 - 2 недели назад 0
вам написали про юнита, вы продолжаете долбиться в таймер
у каждого объекта на карте есть свой хэндл, это уникальный номер, будь то таймер, юнит, или разрушаемая декорация, разница на кого сохранять нулевая
DopaMine #26 - 2 недели назад 0
Так как я в первом триггере и сохраняю, и загружаю все данные. Может, не обязательно все мне нужны в первом триггере. Но сути не меняет. Я просто не понимаю, как мне во втором триггере объявить хоть что-то из первого, что является неизменным
Hate #27 - 2 недели назад 0
что появляется во втором триггере? какие объекты?
DopaMine #28 - 2 недели назад 0
Hate:
вам написали про юнита, вы продолжаете долбиться в таймер
у каждого объекта на карте есть свой хэндл, это уникальный номер, будь то таймер, юнит, или разрушаемая декорация, разница на кого сохранять нулевая
Понимаю. Ну вот представьте: в первом триггере вы жмёте абилку. Во втором триггере она срабатывает при условии, что вы атакованы. Через что вы юнита запишите таким образом, чтобы второи триггер понял, по какому ключу загружать? Для того, чтоб когда 100 человек юзали одновременно абилку, она срабатывала у каждого правильно.
Hate:
что появляется во втором триггере? какие объекты?
Во втором есть спецэффекты. Которых нет в первом
Hate #29 - 2 недели назад 1
вы на ключ юнита пишете все данные, и достаете с его же ключа. что непонятного то, с таймера вы достаете, а юнит непреодолимая стена?
DopaMine #30 - 2 недели назад 0
И позиция кастера есть во втором триггере. А в первом только позиция точки-цели заклинания
А юнита с какого ключа достать тогда?
Hate #31 - 2 недели назад 1
а кастует значит не юнит, да? а кто же? мммм?)
Clamp #32 - 2 недели назад 0
DopaMine, можно выделять курсором (или пальцем) часть сообщения, тогда цитироваться будет только она. Невозможно же простыни эти читать!
DopaMine #33 - 2 недели назад 0
а кастует значит не юнит, да? а кто же? мммм?)
Он кастует в первом триггере, а во втором не кастует.
Какая команда сработает сразу в двух триггерах? Вот пример щас напишу
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"))
И варкрафт спрашивает: ЧТО ТАКОЕ h??
Hate #34 - 2 недели назад 1
потому что это локальная переменная. сами же написали это, и сами удивляетесь?
DopaMine #35 - 2 недели назад 0
local unit u = LoadUnitHandle(udg_hash,h,StringHash("caster"))
И варкрафт спрашивает: ЧТО ТАКОЕ h??
А чтоб мне указать, что такое h, мне нужно взять от того же юнита(уже из хэша), и его хэндлу присвоить h. Я не прав разве?
Hate #36 - 2 недели назад 0
от чего срабатывает второй триггер? или это функция? как бы это разные вещи
DopaMine #37 - 2 недели назад 0
Hate:
потому что это локальная переменная. сами же написали это, и сами удивляетесь?
Так я не понял, это я не понимаю, как сделать или сделать невозможно? Глобальная переменная отменит вариант с МУИ спеллом, нет разве?
Hate:
от чего срабатывает второй триггер? или это функция? как бы это разные вещи
Второи именно триггер. Срабатывает, когда после нажатия абилки(в первом триггере) кастер атакован.
Hate #38 - 2 недели назад (отредактировано ) 0
вы полностью покажите код, скринами или скопируйте с соответствующим форматированием, а не думайте что "это неважно"
DopaMine:
Так я не понял, это я не понимаю, как сделать или сделать невозможно? Глобальная переменная отменит вариант с МУИ спеллом, нет разве?
Второи именно триггер. Срабатывает, когда после нажатия абилки(в первом триггере) кастер атакован.
ну так Кастер - юнит, и тот кто атакован - юнит! в чем ваша проблема??
DopaMine #39 - 2 недели назад (отредактировано ) 0
» цитата
Не до конца понял, но тогда опишу и покажу триггеры, на которых это сделано.
Способность сделана по аниме Наруто(заезженная тема...)) и называется "Техника обмена". Если не знаете, что это такое, то вот логика: если юнита бьют, он может нажать кнопку и заменит себя на бревно, исчезнет(hide), появится бревно, эффекты и звук, и через 1.5 секунды появится(unhide) в точке, которая указана, как цель заклинания. А если не бьют, то ничего не произоидёт. Так же эффект работает всего 1 секунду(то есть применять типо надо прям перед ударом), а не весь кулдаун.
У способности "Техника обмена" кулдаун 5 секунд. Направленная на точку.
Есть два триггера, "CastOfObmen" включается и выключается в "Attacked".
Attacked:
Когда юнит юзает способность "Техника обмена", записываются в глобалы(а надо в хеш, видимо), а потом в локалки: кастер, точка-цель заклинания.
Включается "CastOfObmen", ждём секунду, выключается "CastOfObmen".
CastOfObmen:
Если кастер(из глобала, а надо из хеша, видимо) атакован, то:
записываются в переменные: атакованныи юнит, звук и эффекты, которые сработают, точка-позиция атакованного юнита, точка-цель заклинания из первого триггера.
Соответственно, дальше прячу юнита, создаю эффекты в его местоположении, жду 1.5 секунды(в целом, они разбиты на несколько отрезков для постепенного появления эффектов), перемещаю нашего шиноби в точку-цель заклинания и перестаю прятать его.
По логике я понимаю, что все эти данные, которые у меня в глобальных переменных - мне нужно в хеш сохранять. Хочу понять, как это сделать. И желательно переписать с триггеров на Jass, а я не особо шарю, позавчера начал делать.
На скрине1- Первыи триггер, на скринах2-3 - Второи триггер. На втором я выделил строку, чтоб было ясно, откуда читать 3 скрин.
Чтоб было понятнее, я выше описывал, в чём суть. Но там ещё на гуи, а щас ещё и на джассе есть варинт
Hate:
вы полностью покажите код, скринами или скопируйте с соответствующим форматированием, а не думайте что "это неважно"
ну так Кастер - юнит, и тот кто атакован - юнит! в чем ваша проблема??
В том, что они в разных триггерах и это один и тот же юнит. И себя через себя он не может вызвать.
Hate #40 - 2 недели назад 0
почему это он не может? я выше чем вписал что юнит объект и имеет номер как таймер. так что не может?
вам указывали писать данные на юнита, я вы вцепились в таймер.
DopaMine #41 - 2 недели назад 0
почему это он не может?
Щас код скину
Кет #42 - 2 недели назад (отредактировано ) -1
А чтоб мне указать, что такое h, мне нужно взять от того же юнита(уже из хэша), и его хэндлу присвоить h. Я не прав разве?
DopaMine, если второй триггер запускается событием «Юнит атакован», то h в первом триггере нужно записать на юнита, который будет атакован. Типа перекрёстную ссылку сделать.
В целом с логикой работы что-то не так.
DopaMine #43 - 2 недели назад 0
Я ВСЁ ПОНЯЛ, ВСЕМ СПАСИБО!
Doc #44 - 2 недели назад (отредактировано ) 1

Мне в итоге неоткуда брать этот h - ключ, по которому я всё записал...
Это будет юнит, которого атаковали т.е. GetTriggerUnit(). Вся задача шаринга между несколькими триггерами в том, чтобы определить какие данные между этими триггерами у нас уже есть общие и отталкиваясь от них записать другие данные в хеш. В данном случае мы вешаем данные на GetSpellAbilityUnit() и загружаем по GetTriggerUnit(). Самого кастера, как я понимаю, здесь записывать никуда не нужно.
А некоторым комментаторам советую постыдиться, редкий случай, когда человек сам что-то пытается понять и пробует что-то делать, а вам лишь бы эго потешить.
PT153 #45 - 2 недели назад 1
Clamp, убрал все простыни.